summaryrefslogtreecommitdiff
path: root/src/json.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/json.c')
-rw-r--r--src/json.c67
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");