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,6 +1052,9 @@ JSONParser::getToken() | ||
| 1052 | 1052 | ||
| 1053 | case ls_string: | 1053 | case ls_string: |
| 1054 | if (*p == '"') { | 1054 | if (*p == '"') { |
| 1055 | + token += '"'; | ||
| 1056 | + token = decode_string(token, token_start); | ||
| 1057 | + action = ignore; | ||
| 1055 | ready = true; | 1058 | ready = true; |
| 1056 | } else if (*p == '\\') { | 1059 | } else if (*p == '\\') { |
| 1057 | lex_state = ls_backslash; | 1060 | lex_state = ls_backslash; |
| @@ -1146,7 +1149,6 @@ JSONParser::handleToken() | @@ -1146,7 +1149,6 @@ JSONParser::handleToken() | ||
| 1146 | ": material follows end of object: " + token); | 1149 | ": material follows end of object: " + token); |
| 1147 | } | 1150 | } |
| 1148 | 1151 | ||
| 1149 | - std::string s_value; | ||
| 1150 | std::shared_ptr<JSON> item; | 1152 | std::shared_ptr<JSON> item; |
| 1151 | auto tos = stack.empty() ? nullptr : stack.back().item; | 1153 | auto tos = stack.empty() ? nullptr : stack.back().item; |
| 1152 | auto ls = lex_state; | 1154 | auto ls = lex_state; |
| @@ -1245,19 +1247,14 @@ JSONParser::handleToken() | @@ -1245,19 +1247,14 @@ JSONParser::handleToken() | ||
| 1245 | break; | 1247 | break; |
| 1246 | 1248 | ||
| 1247 | case ls_string: | 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 | if (parser_state == ps_dict_begin || | 1250 | if (parser_state == ps_dict_begin || |
| 1254 | parser_state == ps_dict_after_comma) { | 1251 | parser_state == ps_dict_after_comma) { |
| 1255 | - dict_key = s_value; | 1252 | + dict_key = token; |
| 1256 | dict_key_offset = token_start; | 1253 | dict_key_offset = token_start; |
| 1257 | parser_state = ps_dict_after_key; | 1254 | parser_state = ps_dict_after_key; |
| 1258 | return; | 1255 | return; |
| 1259 | } else { | 1256 | } else { |
| 1260 | - item = std::make_shared<JSON>(JSON::makeString(s_value)); | 1257 | + item = std::make_shared<JSON>(JSON::makeString(token)); |
| 1261 | } | 1258 | } |
| 1262 | break; | 1259 | break; |
| 1263 | 1260 |