Commit a9a0667904b467a054b5f7747bc16afba2612d7f
1 parent
126dd31c
Make JSONParser::getToken responsible for decoding strings
Showing
1 changed file
with
5 additions
and
8 deletions
libqpdf/JSON.cc
| ... | ... | @@ -1052,6 +1052,9 @@ JSONParser::getToken() |
| 1052 | 1052 | |
| 1053 | 1053 | case ls_string: |
| 1054 | 1054 | if (*p == '"') { |
| 1055 | + token += '"'; | |
| 1056 | + token = decode_string(token, token_start); | |
| 1057 | + action = ignore; | |
| 1055 | 1058 | ready = true; |
| 1056 | 1059 | } else if (*p == '\\') { |
| 1057 | 1060 | lex_state = ls_backslash; |
| ... | ... | @@ -1146,7 +1149,6 @@ JSONParser::handleToken() |
| 1146 | 1149 | ": material follows end of object: " + token); |
| 1147 | 1150 | } |
| 1148 | 1151 | |
| 1149 | - std::string s_value; | |
| 1150 | 1152 | std::shared_ptr<JSON> item; |
| 1151 | 1153 | auto tos = stack.empty() ? nullptr : stack.back().item; |
| 1152 | 1154 | auto ls = lex_state; |
| ... | ... | @@ -1245,19 +1247,14 @@ JSONParser::handleToken() |
| 1245 | 1247 | break; |
| 1246 | 1248 | |
| 1247 | 1249 | case ls_string: |
| 1248 | - // Token includes the quotation marks | |
| 1249 | - if (token.length() < 2) { | |
| 1250 | - throw std::logic_error("JSON string length < 2"); | |
| 1251 | - } | |
| 1252 | - s_value = decode_string(token, token_start); | |
| 1253 | 1250 | if (parser_state == ps_dict_begin || |
| 1254 | 1251 | parser_state == ps_dict_after_comma) { |
| 1255 | - dict_key = s_value; | |
| 1252 | + dict_key = token; | |
| 1256 | 1253 | dict_key_offset = token_start; |
| 1257 | 1254 | parser_state = ps_dict_after_key; |
| 1258 | 1255 | return; |
| 1259 | 1256 | } else { |
| 1260 | - item = std::make_shared<JSON>(JSON::makeString(s_value)); | |
| 1257 | + item = std::make_shared<JSON>(JSON::makeString(token)); | |
| 1261 | 1258 | } |
| 1262 | 1259 | break; |
| 1263 | 1260 | ... | ... |