Lines Matching refs:lex

80 static void error_set(json_error_t *error, const lex_t *lex,  in error_set()  argument
99 if(lex) in error_set()
101 const char *saved_text = strbuffer_value(&lex->saved_text); in error_set()
103 line = lex->stream.line; in error_set()
104 col = lex->stream.column; in error_set()
105 pos = lex->stream.position; in error_set()
109 if(lex->saved_text.length <= 20) { in error_set()
118 if(lex->stream.state == STREAM_STATE_ERROR) { in error_set()
233 static int lex_get(lex_t *lex, json_error_t *error) in lex_get() argument
235 return stream_get(&lex->stream, error); in lex_get()
238 static void lex_save(lex_t *lex, int c) in lex_save() argument
240 strbuffer_append_byte(&lex->saved_text, c); in lex_save()
243 static int lex_get_save(lex_t *lex, json_error_t *error) in lex_get_save() argument
245 int c = stream_get(&lex->stream, error); in lex_get_save()
247 lex_save(lex, c); in lex_get_save()
251 static void lex_unget(lex_t *lex, int c) in lex_unget() argument
253 stream_unget(&lex->stream, c); in lex_unget()
256 static void lex_unget_unsave(lex_t *lex, int c) in lex_unget_unsave() argument
266 stream_unget(&lex->stream, c); in lex_unget_unsave()
270 strbuffer_pop(&lex->saved_text); in lex_unget_unsave()
275 static void lex_save_cached(lex_t *lex) in lex_save_cached() argument
277 while(lex->stream.buffer[lex->stream.buffer_pos] != '\0') in lex_save_cached()
279 lex_save(lex, lex->stream.buffer[lex->stream.buffer_pos]); in lex_save_cached()
280 lex->stream.buffer_pos++; in lex_save_cached()
281 lex->stream.position++; in lex_save_cached()
285 static void lex_free_string(lex_t *lex) in lex_free_string() argument
287 jsonp_free(lex->value.string.val); in lex_free_string()
288 lex->value.string.val = NULL; in lex_free_string()
289 lex->value.string.len = 0; in lex_free_string()
316 static void lex_scan_string(lex_t *lex, json_error_t *error) in lex_scan_string() argument
323 lex->value.string.val = NULL; in lex_scan_string()
324 lex->token = TOKEN_INVALID; in lex_scan_string()
326 c = lex_get_save(lex, error); in lex_scan_string()
333 error_set(error, lex, "premature end of input"); in lex_scan_string()
339 lex_unget_unsave(lex, c); in lex_scan_string()
341 error_set(error, lex, "unexpected newline", c); in lex_scan_string()
343 error_set(error, lex, "control character 0x%x", c); in lex_scan_string()
348 c = lex_get_save(lex, error); in lex_scan_string()
350 c = lex_get_save(lex, error); in lex_scan_string()
353 error_set(error, lex, "invalid escape"); in lex_scan_string()
356 c = lex_get_save(lex, error); in lex_scan_string()
361 c = lex_get_save(lex, error); in lex_scan_string()
363 error_set(error, lex, "invalid escape"); in lex_scan_string()
368 c = lex_get_save(lex, error); in lex_scan_string()
378 t = jsonp_malloc(lex->saved_text.length + 1); in lex_scan_string()
383 lex->value.string.val = t; in lex_scan_string()
386 p = strbuffer_value(&lex->saved_text) + 1; in lex_scan_string()
397 error_set(error, lex, "invalid Unicode escape '%.6s'", p - 1); in lex_scan_string()
407 error_set(error, lex, "invalid Unicode escape '%.6s'", p - 1); in lex_scan_string()
421 error_set(error, lex, in lex_scan_string()
429 error_set(error, lex, "invalid Unicode '\\u%04X'", in lex_scan_string()
435 error_set(error, lex, "invalid Unicode '\\u%04X'", value); in lex_scan_string()
462 lex->value.string.len = t - lex->value.string.val; in lex_scan_string()
463 lex->token = TOKEN_STRING; in lex_scan_string()
467 lex_free_string(lex); in lex_scan_string()
482 static int lex_scan_number(lex_t *lex, int c, json_error_t *error) in lex_scan_number() argument
488 lex->token = TOKEN_INVALID; in lex_scan_number()
491 c = lex_get_save(lex, error); in lex_scan_number()
494 c = lex_get_save(lex, error); in lex_scan_number()
496 lex_unget_unsave(lex, c); in lex_scan_number()
501 c = lex_get_save(lex, error); in lex_scan_number()
503 c = lex_get_save(lex, error); in lex_scan_number()
506 lex_unget_unsave(lex, c); in lex_scan_number()
513 lex_unget_unsave(lex, c); in lex_scan_number()
515 saved_text = strbuffer_value(&lex->saved_text); in lex_scan_number()
521 error_set(error, lex, "too big negative integer"); in lex_scan_number()
523 error_set(error, lex, "too big integer"); in lex_scan_number()
527 assert(end == saved_text + lex->saved_text.length); in lex_scan_number()
529 lex->token = TOKEN_INTEGER; in lex_scan_number()
530 lex->value.integer = intval; in lex_scan_number()
535 c = lex_get(lex, error); in lex_scan_number()
537 lex_unget(lex, c); in lex_scan_number()
540 lex_save(lex, c); in lex_scan_number()
542 c = lex_get_save(lex, error); in lex_scan_number()
544 c = lex_get_save(lex, error); in lex_scan_number()
548 c = lex_get_save(lex, error); in lex_scan_number()
550 c = lex_get_save(lex, error); in lex_scan_number()
553 lex_unget_unsave(lex, c); in lex_scan_number()
557 c = lex_get_save(lex, error); in lex_scan_number()
559 c = lex_get_save(lex, error); in lex_scan_number()
562 lex_unget_unsave(lex, c); in lex_scan_number()
564 if(jsonp_strtod(&lex->saved_text, &doubleval)) { in lex_scan_number()
565 error_set(error, lex, "real number overflow"); in lex_scan_number()
569 lex->token = TOKEN_REAL; in lex_scan_number()
570 lex->value.real = doubleval; in lex_scan_number()
577 static int lex_scan(lex_t *lex, json_error_t *error) in lex_scan() argument
581 strbuffer_clear(&lex->saved_text); in lex_scan()
583 if(lex->token == TOKEN_STRING) in lex_scan()
584 lex_free_string(lex); in lex_scan()
586 c = lex_get(lex, error); in lex_scan()
588 c = lex_get(lex, error); in lex_scan()
591 lex->token = TOKEN_EOF; in lex_scan()
596 lex->token = TOKEN_INVALID; in lex_scan()
600 lex_save(lex, c); in lex_scan()
603 lex->token = c; in lex_scan()
606 lex_scan_string(lex, error); in lex_scan()
609 if(lex_scan_number(lex, c, error)) in lex_scan()
617 c = lex_get_save(lex, error); in lex_scan()
619 c = lex_get_save(lex, error); in lex_scan()
620 lex_unget_unsave(lex, c); in lex_scan()
622 saved_text = strbuffer_value(&lex->saved_text); in lex_scan()
625 lex->token = TOKEN_TRUE; in lex_scan()
627 lex->token = TOKEN_FALSE; in lex_scan()
629 lex->token = TOKEN_NULL; in lex_scan()
631 lex->token = TOKEN_INVALID; in lex_scan()
637 lex_save_cached(lex); in lex_scan()
638 lex->token = TOKEN_INVALID; in lex_scan()
642 return lex->token; in lex_scan()
645 static char *lex_steal_string(lex_t *lex, size_t *out_len) in lex_steal_string() argument
648 if(lex->token == TOKEN_STRING) { in lex_steal_string()
649 result = lex->value.string.val; in lex_steal_string()
650 *out_len = lex->value.string.len; in lex_steal_string()
651 lex->value.string.val = NULL; in lex_steal_string()
652 lex->value.string.len = 0; in lex_steal_string()
657 static int lex_init(lex_t *lex, get_func get, void *data) in lex_init() argument
659 stream_init(&lex->stream, get, data); in lex_init()
660 if(strbuffer_init(&lex->saved_text)) in lex_init()
663 lex->token = TOKEN_INVALID; in lex_init()
667 static void lex_close(lex_t *lex) in lex_close() argument
669 if(lex->token == TOKEN_STRING) in lex_close()
670 lex_free_string(lex); in lex_close()
671 strbuffer_close(&lex->saved_text); in lex_close()
677 static json_t *parse_value(lex_t *lex, size_t flags, json_error_t *error);
679 static json_t *parse_object(lex_t *lex, size_t flags, json_error_t *error) in parse_object() argument
685 lex_scan(lex, error); in parse_object()
686 if(lex->token == '}') in parse_object()
694 if(lex->token != TOKEN_STRING) { in parse_object()
695 error_set(error, lex, "string or '}' expected"); in parse_object()
699 key = lex_steal_string(lex, &len); in parse_object()
704 error_set(error, lex, "NUL byte in object key not supported"); in parse_object()
711 error_set(error, lex, "duplicate object key"); in parse_object()
716 lex_scan(lex, error); in parse_object()
717 if(lex->token != ':') { in parse_object()
719 error_set(error, lex, "':' expected"); in parse_object()
723 lex_scan(lex, error); in parse_object()
724 value = parse_value(lex, flags, error); in parse_object()
739 lex_scan(lex, error); in parse_object()
740 if(lex->token != ',') in parse_object()
743 lex_scan(lex, error); in parse_object()
746 if(lex->token != '}') { in parse_object()
747 error_set(error, lex, "'}' expected"); in parse_object()
758 static json_t *parse_array(lex_t *lex, size_t flags, json_error_t *error) in parse_array() argument
764 lex_scan(lex, error); in parse_array()
765 if(lex->token == ']') in parse_array()
768 while(lex->token) { in parse_array()
769 json_t *elem = parse_value(lex, flags, error); in parse_array()
779 lex_scan(lex, error); in parse_array()
780 if(lex->token != ',') in parse_array()
783 lex_scan(lex, error); in parse_array()
786 if(lex->token != ']') { in parse_array()
787 error_set(error, lex, "']' expected"); in parse_array()
798 static json_t *parse_value(lex_t *lex, size_t flags, json_error_t *error) in parse_value() argument
803 switch(lex->token) { in parse_value()
805 const char *value = lex->value.string.val; in parse_value()
806 size_t len = lex->value.string.len; in parse_value()
810 error_set(error, lex, "\\u0000 is not allowed without JSON_ALLOW_NUL"); in parse_value()
817 lex->value.string.val = NULL; in parse_value()
818 lex->value.string.len = 0; in parse_value()
825 if(jsonp_strtod(&lex->saved_text, &value)) { in parse_value()
826 error_set(error, lex, "real number overflow"); in parse_value()
831 json = json_integer(lex->value.integer); in parse_value()
837 json = json_real(lex->value.real); in parse_value()
854 json = parse_object(lex, flags, error); in parse_value()
858 json = parse_array(lex, flags, error); in parse_value()
862 error_set(error, lex, "invalid token"); in parse_value()
866 error_set(error, lex, "unexpected token"); in parse_value()
876 static json_t *parse_json(lex_t *lex, size_t flags, json_error_t *error) in parse_json() argument
880 lex_scan(lex, error); in parse_json()
882 if(lex->token != '[' && lex->token != '{') { in parse_json()
883 error_set(error, lex, "'[' or '{' expected"); in parse_json()
888 result = parse_value(lex, flags, error); in parse_json()
893 lex_scan(lex, error); in parse_json()
894 if(lex->token != TOKEN_EOF) { in parse_json()
895 error_set(error, lex, "end of file expected"); in parse_json()
903 error->position = lex->stream.position; in parse_json()
931 lex_t lex; in json_loads() local
945 if(lex_init(&lex, string_get, (void *)&stream_data)) in json_loads()
948 result = parse_json(&lex, flags, error); in json_loads()
950 lex_close(&lex); in json_loads()
975 lex_t lex; in json_loadb() local
990 if(lex_init(&lex, buffer_get, (void *)&stream_data)) in json_loadb()
993 result = parse_json(&lex, flags, error); in json_loadb()
995 lex_close(&lex); in json_loadb()
1001 lex_t lex; in json_loadf() local
1017 if(lex_init(&lex, (get_func)fgetc, input)) in json_loadf()
1020 result = parse_json(&lex, flags, error); in json_loadf()
1022 lex_close(&lex); in json_loadf()
1082 lex_t lex; in json_load_callback() local
1098 if(lex_init(&lex, (get_func)callback_get, &stream_data)) in json_load_callback()
1101 result = parse_json(&lex, flags, error); in json_load_callback()
1103 lex_close(&lex); in json_load_callback()