diff options
Diffstat (limited to 'src/json.c')
-rw-r--r-- | src/json.c | 67 |
1 files changed, 17 insertions, 50 deletions
diff --git a/src/json.c b/src/json.c index 2d3daee7836..4e156658ef7 100644 --- a/src/json.c +++ b/src/json.c @@ -1658,43 +1658,10 @@ json_parse_value (struct json_parser *parser, int c) } } -enum ParseEndBehavior - { - PARSEENDBEHAVIOR_CheckForGarbage, - PARSEENDBEHAVIOR_MovePoint - }; - static Lisp_Object -json_parse (struct json_parser *parser, - enum ParseEndBehavior parse_end_behavior) +json_parse (struct json_parser *parser) { - int c = json_skip_whitespace (parser); - - Lisp_Object result = json_parse_value (parser, c); - - switch (parse_end_behavior) - { - case PARSEENDBEHAVIOR_CheckForGarbage: - c = json_skip_whitespace_if_possible (parser); - if (c >= 0) - json_signal_error (parser, Qjson_trailing_content); - break; - case PARSEENDBEHAVIOR_MovePoint: - { - ptrdiff_t byte = (PT_BYTE + parser->input_current - parser->input_begin - + parser->additional_bytes_count); - ptrdiff_t position; - if (NILP (BVAR (current_buffer, enable_multibyte_characters))) - position = byte; - else - position = PT + parser->point_of_current_line + parser->current_column; - - SET_PT_BOTH (position, byte); - break; - } - } - - return result; + return json_parse_value (parser, json_skip_whitespace (parser)); } DEFUN ("json-parse-string", Fjson_parse_string, Sjson_parse_string, 1, MANY, @@ -1738,10 +1705,12 @@ usage: (json-parse-string STRING &rest ARGS) */) const unsigned char *begin = SDATA (string); json_parser_init (&p, conf, begin, begin + SBYTES (string), NULL, NULL); record_unwind_protect_ptr (json_parser_done, &p); + Lisp_Object result = json_parse (&p); - return unbind_to (count, - json_parse (&p, - PARSEENDBEHAVIOR_CheckForGarbage)); + if (json_skip_whitespace_if_possible (&p) >= 0) + json_signal_error (&p, Qjson_trailing_content); + + return unbind_to (count, result); } DEFUN ("json-parse-buffer", Fjson_parse_buffer, Sjson_parse_buffer, @@ -1799,9 +1768,17 @@ usage: (json-parse-buffer &rest args) */) json_parser_init (&p, conf, begin, end, secondary_begin, secondary_end); record_unwind_protect_ptr (json_parser_done, &p); + Lisp_Object result = json_parse (&p); + + ptrdiff_t byte = (PT_BYTE + p.input_current - p.input_begin + + p.additional_bytes_count); + ptrdiff_t position = (NILP (BVAR (current_buffer, + enable_multibyte_characters)) + ? byte + : PT + p.point_of_current_line + p.current_column); + SET_PT_BOTH (position, byte); - return unbind_to (count, - json_parse (&p, PARSEENDBEHAVIOR_MovePoint)); + return unbind_to (count, result); } void @@ -1841,16 +1818,6 @@ syms_of_json (void) define_error (Qjson_escape_sequence_error, "invalid escape sequence", Qjson_parse_error); - DEFSYM (Qpure, "pure"); - DEFSYM (Qside_effect_free, "side-effect-free"); - - DEFSYM (Qjson_serialize, "json-serialize"); - DEFSYM (Qjson_parse_string, "json-parse-string"); - Fput (Qjson_serialize, Qpure, Qt); - Fput (Qjson_serialize, Qside_effect_free, Qt); - Fput (Qjson_parse_string, Qpure, Qt); - Fput (Qjson_parse_string, Qside_effect_free, Qt); - DEFSYM (QCobject_type, ":object-type"); DEFSYM (QCarray_type, ":array-type"); DEFSYM (QCnull_object, ":null-object"); |