2 * Copyright (c) 2009-2016 Petri Lehtinen <petri@digip.org>
3 * Copyright (c) 2011-2012 Graeme Smecher <graeme.smecher@mail.mcgill.ca>
5 * Jansson is free software; you can redistribute it and/or modify
6 * it under the terms of the MIT license. See LICENSE for details.
11 #include "jansson_private.h"
35 #define token(scanner) ((scanner)->token.token)
37 static const char *const type_names
[] = {
48 #define type_name(x) type_names[json_typeof(x)]
50 static const char unpack_value_starters
[] = "{[siIbfFOon";
52 static void scanner_init(scanner_t
*s
, json_error_t
*error
,
53 size_t flags
, const char *fmt
) {
56 s
->fmt
= s
->start
= fmt
;
57 memset(&s
->prev_token
, 0, sizeof(token_t
));
58 memset(&s
->token
, 0, sizeof(token_t
));
59 memset(&s
->next_token
, 0, sizeof(token_t
));
66 static void next_token(scanner_t
*s
) {
68 s
->prev_token
= s
->token
;
70 if (s
->next_token
.line
) {
71 s
->token
= s
->next_token
;
72 s
->next_token
.line
= 0;
76 if (!token(s
) && !*s
->fmt
)
83 /* skip space and ignored chars */
84 while (*t
== ' ' || *t
== '\t' || *t
== '\n' || *t
== ',' || *t
== ':') {
96 s
->token
.line
= s
->line
;
97 s
->token
.column
= s
->column
;
98 s
->token
.pos
= s
->pos
;
104 static void prev_token(scanner_t
*s
) {
105 s
->next_token
= s
->token
;
106 s
->token
= s
->prev_token
;
109 static void set_error(scanner_t
*s
, const char *source
, enum json_error_code code
,
110 const char *fmt
, ...) {
114 jsonp_error_vset(s
->error
, s
->token
.line
, s
->token
.column
, s
->token
.pos
,
117 jsonp_error_set_source(s
->error
, source
);
122 static json_t
*pack(scanner_t
*s
, va_list *ap
);
125 /* ours will be set to 1 if jsonp_free() must be called for the result
127 static char *read_string(scanner_t
*s
, va_list *ap
,
128 const char *purpose
, size_t *out_len
, int *ours
, int optional
) {
139 if (t
!= '#' && t
!= '%' && t
!= '+') {
140 /* Optimize the simple case */
141 str
= va_arg(*ap
, const char *);
145 set_error(s
, "<args>", json_error_null_value
, "NULL %s", purpose
);
151 length
= strlen(str
);
153 if (!utf8_check_string(str
, length
)) {
154 set_error(s
, "<args>", json_error_invalid_utf8
, "Invalid UTF-8 %s", purpose
);
161 } else if (optional
) {
162 set_error(s
, "<format>", json_error_invalid_format
, "Cannot use '%c' on optional strings", t
);
168 if (strbuffer_init(&strbuff
)) {
169 set_error(s
, "<internal>", json_error_out_of_memory
, "Out of memory");
174 str
= va_arg(*ap
, const char *);
176 set_error(s
, "<args>", json_error_null_value
, "NULL %s", purpose
);
182 if (token(s
) == '#') {
183 length
= va_arg(*ap
, int);
184 } else if (token(s
) == '%') {
185 length
= va_arg(*ap
, size_t);
188 length
= s
->has_error
== 1 ? 0 : strlen(str
);
191 if (!s
->has_error
&& strbuffer_append_bytes(&strbuff
, str
, length
) == -1) {
192 set_error(s
, "<internal>", json_error_out_of_memory
, "Out of memory");
197 if (token(s
) != '+') {
204 strbuffer_close(&strbuff
);
208 if (!utf8_check_string(strbuff
.value
, strbuff
.length
)) {
209 set_error(s
, "<args>", json_error_invalid_utf8
, "Invalid UTF-8 %s", purpose
);
210 strbuffer_close(&strbuff
);
215 *out_len
= strbuff
.length
;
217 return strbuffer_steal_value(&strbuff
);
220 static json_t
*pack_object(scanner_t
*s
, va_list *ap
) {
221 json_t
*object
= json_object();
224 while (token(s
) != '}') {
232 set_error(s
, "<format>", json_error_invalid_format
, "Unexpected end of format string");
236 if (token(s
) != 's') {
237 set_error(s
, "<format>", json_error_invalid_format
, "Expected format 's', got '%c'", token(s
));
241 key
= read_string(s
, ap
, "object key", &len
, &ours
, 0);
246 valueOptional
= token(s
);
254 if (valueOptional
!= '*') {
255 set_error(s
, "<args>", json_error_null_value
, "NULL object value");
266 if (!s
->has_error
&& json_object_set_new_nocheck(object
, key
, value
)) {
267 set_error(s
, "<internal>", json_error_out_of_memory
, "Unable to add key \"%s\"", key
);
285 static json_t
*pack_array(scanner_t
*s
, va_list *ap
) {
286 json_t
*array
= json_array();
289 while (token(s
) != ']') {
294 set_error(s
, "<format>", json_error_invalid_format
, "Unexpected end of format string");
295 /* Format string errors are unrecoverable. */
300 valueOptional
= token(s
);
305 if (valueOptional
!= '*') {
316 if (!s
->has_error
&& json_array_append_new(array
, value
)) {
317 set_error(s
, "<internal>", json_error_out_of_memory
, "Unable to append to array");
332 static json_t
*pack_string(scanner_t
*s
, va_list *ap
) {
341 optional
= t
== '?' || t
== '*';
345 str
= read_string(s
, ap
, "string", &len
, &ours
, optional
);
348 return t
== '?' && !s
->has_error
? json_null() : NULL
;
351 /* It's impossible to reach this point if ours != 0, do not free str. */
356 return jsonp_stringn_nocheck_own(str
, len
);
358 return json_stringn_nocheck(str
, len
);
361 static json_t
*pack_object_inter(scanner_t
*s
, va_list *ap
, int need_incref
) {
368 if (ntoken
!= '?' && ntoken
!= '*')
371 json
= va_arg(*ap
, json_t
*);
374 return need_incref
? json_incref(json
) : json
;
385 set_error(s
, "<args>", json_error_null_value
, "NULL object");
390 static json_t
*pack_integer(scanner_t
*s
, json_int_t value
) {
391 json_t
*json
= json_integer(value
);
394 set_error(s
, "<internal>", json_error_out_of_memory
, "Out of memory");
401 static json_t
*pack_real(scanner_t
*s
, double value
) {
402 /* Allocate without setting value so we can identify OOM error. */
403 json_t
*json
= json_real(0.0);
406 set_error(s
, "<internal>", json_error_out_of_memory
, "Out of memory");
412 if (json_real_set(json
, value
)) {
415 set_error(s
, "<args>", json_error_numeric_overflow
, "Invalid floating point value");
424 static json_t
*pack(scanner_t
*s
, va_list *ap
) {
427 return pack_object(s
, ap
);
430 return pack_array(s
, ap
);
432 case 's': /* string */
433 return pack_string(s
, ap
);
438 case 'b': /* boolean */
439 return va_arg(*ap
, int) ? json_true() : json_false();
441 case 'i': /* integer from int */
442 return pack_integer(s
, va_arg(*ap
, int));
444 case 'I': /* integer from json_int_t */
445 return pack_integer(s
, va_arg(*ap
, json_int_t
));
448 return pack_real(s
, va_arg(*ap
, double));
450 case 'O': /* a json_t object; increments refcount */
451 return pack_object_inter(s
, ap
, 1);
453 case 'o': /* a json_t object; doesn't increment refcount */
454 return pack_object_inter(s
, ap
, 0);
457 set_error(s
, "<format>", json_error_invalid_format
, "Unexpected format character '%c'",
464 static int unpack(scanner_t
*s
, json_t
*root
, va_list *ap
);
466 static int unpack_object(scanner_t
*s
, json_t
*root
, va_list *ap
) {
471 /* Use a set (emulated by a hashtable) to check that all object
472 keys are accessed. Checking that the correct number of keys
473 were accessed is not enough, as the same key can be unpacked
478 if (hashtable_init(&key_set
)) {
479 set_error(s
, "<internal>", json_error_out_of_memory
, "Out of memory");
484 if (root
&& !json_is_object(root
)) {
487 json_error_wrong_type
,
488 "Expected object, got %s",
489 (root
) ? type_name(root
) : "NULL"
495 while (token(s
) != '}') {
501 set_error(s
, "<format>", json_error_invalid_format
, "Expected '}' after '%c', got '%c'",
502 (strict
== 1 ? '!' : '*'), token(s
));
507 set_error(s
, "<format>", json_error_invalid_format
, "Unexpected end of format string");
511 if (token(s
) == '!' || token(s
) == '*') {
512 strict
= (token(s
) == '!' ? 1 : -1);
517 if (token(s
) != 's') {
518 set_error(s
, "<format>", json_error_invalid_format
, "Expected format 's', got '%c'", token(s
));
522 key
= va_arg(*ap
, const char *);
524 set_error(s
, "<args>", json_error_null_value
, "NULL object key");
530 if (token(s
) == '?') {
539 value
= json_object_get(root
, key
);
540 if (!value
&& !opt
) {
541 set_error(s
, "<validation>", json_error_item_not_found
, "Object item not found: %s", key
);
546 if (unpack(s
, value
, ap
))
549 hashtable_set(&key_set
, key
, json_null());
553 if (strict
== 0 && (s
->flags
& JSON_STRICT
))
556 if (root
&& strict
== 1) {
557 /* We need to check that all non optional items have been parsed */
559 /* keys_res is 1 for uninitialized, 0 for success, -1 for error. */
561 strbuffer_t unrecognized_keys
;
565 if (gotopt
|| json_object_size(root
) != key_set
.size
) {
566 json_object_foreach(root
, key
, value
) {
567 if (!hashtable_get(&key_set
, key
)) {
570 /* Save unrecognized keys for the error message */
572 keys_res
= strbuffer_init(&unrecognized_keys
);
573 } else if (!keys_res
) {
574 keys_res
= strbuffer_append_bytes(&unrecognized_keys
, ", ", 2);
578 keys_res
= strbuffer_append_bytes(&unrecognized_keys
, key
, strlen(key
));
583 set_error(s
, "<validation>", json_error_end_of_input_expected
,
584 "%li object item(s) left unpacked: %s",
586 keys_res
? "<unknown>" : strbuffer_value(&unrecognized_keys
));
587 strbuffer_close(&unrecognized_keys
);
595 hashtable_close(&key_set
);
599 static int unpack_array(scanner_t
*s
, json_t
*root
, va_list *ap
) {
603 if (root
&& !json_is_array(root
)) {
604 set_error(s
, "<validation>", json_error_wrong_type
, "Expected array, got %s", type_name(root
));
609 while (token(s
) != ']') {
613 set_error(s
, "<format>", json_error_invalid_format
, "Expected ']' after '%c', got '%c'",
614 (strict
== 1 ? '!' : '*'),
620 set_error(s
, "<format>", json_error_invalid_format
, "Unexpected end of format string");
624 if (token(s
) == '!' || token(s
) == '*') {
625 strict
= (token(s
) == '!' ? 1 : -1);
630 if (!strchr(unpack_value_starters
, token(s
))) {
631 set_error(s
, "<format>", json_error_invalid_format
, "Unexpected format character '%c'",
640 value
= json_array_get(root
, i
);
642 set_error(s
, "<validation>", json_error_index_out_of_range
, "Array index %lu out of range",
648 if (unpack(s
, value
, ap
))
655 if (strict
== 0 && (s
->flags
& JSON_STRICT
))
658 if (root
&& strict
== 1 && i
!= json_array_size(root
)) {
659 long diff
= (long)json_array_size(root
) - (long)i
;
660 set_error(s
, "<validation>", json_error_end_of_input_expected
, "%li array item(s) left unpacked", diff
);
667 static int unpack(scanner_t
*s
, json_t
*root
, va_list *ap
) {
670 return unpack_object(s
, root
, ap
);
673 return unpack_array(s
, root
, ap
);
676 if (root
&& !json_is_string(root
)) {
677 set_error(s
, "<validation>", json_error_wrong_type
, "Expected string, got %s",
682 if (!(s
->flags
& JSON_VALIDATE_ONLY
)) {
683 const char **str_target
;
684 size_t *len_target
= NULL
;
686 str_target
= va_arg(*ap
, const char **);
688 set_error(s
, "<args>", json_error_null_value
, "NULL string argument");
694 if (token(s
) == '%') {
695 len_target
= va_arg(*ap
, size_t *);
697 set_error(s
, "<args>", json_error_null_value
, "NULL string length argument");
704 *str_target
= json_string_value(root
);
706 *len_target
= json_string_length(root
);
712 if (root
&& !json_is_integer(root
)) {
713 set_error(s
, "<validation>", json_error_wrong_type
, "Expected integer, got %s",
718 if (!(s
->flags
& JSON_VALIDATE_ONLY
)) {
719 int *target
= va_arg(*ap
, int *);
721 *target
= (int)json_integer_value(root
);
727 if (root
&& !json_is_integer(root
)) {
728 set_error(s
, "<validation>", json_error_wrong_type
, "Expected integer, got %s",
733 if (!(s
->flags
& JSON_VALIDATE_ONLY
)) {
734 json_int_t
*target
= va_arg(*ap
, json_int_t
*);
736 *target
= json_integer_value(root
);
742 if (root
&& !json_is_boolean(root
)) {
745 json_error_wrong_type
,
746 "Expected true or false, got %s",
752 if (!(s
->flags
& JSON_VALIDATE_ONLY
)) {
753 int *target
= va_arg(*ap
, int *);
755 *target
= json_is_true(root
);
761 if (root
&& !json_is_real(root
)) {
762 set_error(s
, "<validation>", json_error_wrong_type
, "Expected real, got %s",
767 if (!(s
->flags
& JSON_VALIDATE_ONLY
)) {
768 double *target
= va_arg(*ap
, double *);
770 *target
= json_real_value(root
);
776 if (root
&& !json_is_number(root
)) {
777 set_error(s
, "<validation>", json_error_wrong_type
, "Expected real or integer, got %s",
782 if (!(s
->flags
& JSON_VALIDATE_ONLY
)) {
783 double *target
= va_arg(*ap
, double *);
785 *target
= json_number_value(root
);
791 if (root
&& !(s
->flags
& JSON_VALIDATE_ONLY
))
796 if (!(s
->flags
& JSON_VALIDATE_ONLY
)) {
797 json_t
**target
= va_arg(*ap
, json_t
**);
805 /* Never assign, just validate */
806 if (root
&& !json_is_null(root
)) {
807 set_error(s
, "<validation>", json_error_wrong_type
, "Expected null, got %s",
814 set_error(s
, "<format>", json_error_invalid_format
, "Unexpected format character '%c'",
820 json_t
*json_vpack_ex(json_error_t
*error
, size_t flags
,
821 const char *fmt
, va_list ap
) {
827 jsonp_error_init(error
, "<format>");
828 jsonp_error_set(error
, -1, -1, 0, json_error_invalid_argument
, "NULL or empty format string");
831 jsonp_error_init(error
, NULL
);
833 scanner_init(&s
, error
, flags
, fmt
);
836 va_copy(ap_copy
, ap
);
837 value
= pack(&s
, &ap_copy
);
840 /* This will cover all situations where s.has_error is true */
847 set_error(&s
, "<format>", json_error_invalid_format
, "Garbage after format string");
854 json_t
*json_pack_ex(json_error_t
*error
, size_t flags
, const char *fmt
, ...) {
859 value
= json_vpack_ex(error
, flags
, fmt
, ap
);
865 json_t
*json_pack(const char *fmt
, ...) {
870 value
= json_vpack_ex(NULL
, 0, fmt
, ap
);
876 int json_vunpack_ex(json_t
*root
, json_error_t
*error
, size_t flags
,
877 const char *fmt
, va_list ap
) {
882 jsonp_error_init(error
, "<root>");
883 jsonp_error_set(error
, -1, -1, 0, json_error_null_value
, "NULL root value");
888 jsonp_error_init(error
, "<format>");
889 jsonp_error_set(error
, -1, -1, 0, json_error_invalid_argument
, "NULL or empty format string");
892 jsonp_error_init(error
, NULL
);
894 scanner_init(&s
, error
, flags
, fmt
);
897 va_copy(ap_copy
, ap
);
898 if (unpack(&s
, root
, &ap_copy
)) {
906 set_error(&s
, "<format>", json_error_invalid_format
, "Garbage after format string");
913 int json_unpack_ex(json_t
*root
, json_error_t
*error
, size_t flags
, const char *fmt
, ...) {
918 ret
= json_vunpack_ex(root
, error
, flags
, fmt
, ap
);
924 int json_unpack(json_t
*root
, const char *fmt
, ...) {
929 ret
= json_vunpack_ex(root
, NULL
, 0, fmt
, ap
);