1 /*
2 * Copyright (c) 2017 Intel Corporation
3 *
4 * SPDX-License-Identifier: Apache-2.0
5 */
6
7 #include <zephyr/sys/__assert.h>
8 #include <ctype.h>
9 #include <errno.h>
10 #include <limits.h>
11 #include <math.h>
12 #include <zephyr/sys/printk.h>
13 #include <zephyr/sys/util.h>
14 #include <stdbool.h>
15 #include <stdlib.h>
16 #include <string.h>
17 #include <zephyr/types.h>
18
19 #include <zephyr/data/json.h>
20
21 struct json_obj_key_value {
22 const char *key;
23 size_t key_len;
24 struct json_token value;
25 };
26
lexer_consume(struct json_lexer * lex,struct json_token * tok,enum json_tokens empty_token)27 static bool lexer_consume(struct json_lexer *lex, struct json_token *tok,
28 enum json_tokens empty_token)
29 {
30 if (lex->tok.type == empty_token) {
31 return false;
32 }
33
34 *tok = lex->tok;
35 lex->tok.type = empty_token;
36
37 return true;
38 }
39
lexer_next(struct json_lexer * lex,struct json_token * tok)40 static bool lexer_next(struct json_lexer *lex, struct json_token *tok)
41 {
42 while (lex->state) {
43 if (lexer_consume(lex, tok, JSON_TOK_NONE)) {
44 return true;
45 }
46
47 lex->state = lex->state(lex);
48 }
49
50 return lexer_consume(lex, tok, JSON_TOK_EOF);
51 }
52
53 static void *lexer_json(struct json_lexer *lex);
54
emit(struct json_lexer * lex,enum json_tokens token)55 static void emit(struct json_lexer *lex, enum json_tokens token)
56 {
57 lex->tok.type = token;
58 lex->tok.start = lex->start;
59 lex->tok.end = lex->pos;
60 lex->start = lex->pos;
61 }
62
next(struct json_lexer * lex)63 static int next(struct json_lexer *lex)
64 {
65 if (lex->pos >= lex->end) {
66 lex->pos = lex->end + 1;
67
68 return '\0';
69 }
70
71 return *lex->pos++;
72 }
73
ignore(struct json_lexer * lex)74 static void ignore(struct json_lexer *lex)
75 {
76 lex->start = lex->pos;
77 }
78
backup(struct json_lexer * lex)79 static void backup(struct json_lexer *lex)
80 {
81 lex->pos--;
82 }
83
peek(struct json_lexer * lex)84 static int peek(struct json_lexer *lex)
85 {
86 int chr = next(lex);
87
88 backup(lex);
89
90 return chr;
91 }
92
lexer_string(struct json_lexer * lex)93 static void *lexer_string(struct json_lexer *lex)
94 {
95 ignore(lex);
96
97 while (true) {
98 int chr = next(lex);
99
100 if (chr == '\0') {
101 emit(lex, JSON_TOK_ERROR);
102 return NULL;
103 }
104
105 if (chr == '\\') {
106 switch (next(lex)) {
107 case '"':
108 case '\\':
109 case '/':
110 case 'b':
111 case 'f':
112 case 'n':
113 case 'r':
114 case 't':
115 continue;
116 case 'u':
117 if (isxdigit(next(lex)) == 0) {
118 goto error;
119 }
120
121 if (isxdigit(next(lex)) == 0) {
122 goto error;
123 }
124
125 if (isxdigit(next(lex)) == 0) {
126 goto error;
127 }
128
129 if (isxdigit(next(lex)) == 0) {
130 goto error;
131 }
132
133 break;
134 default:
135 goto error;
136 }
137 }
138
139 if (chr == '"') {
140 backup(lex);
141 emit(lex, JSON_TOK_STRING);
142
143 next(lex);
144 ignore(lex);
145
146 return lexer_json;
147 }
148 }
149
150 error:
151 emit(lex, JSON_TOK_ERROR);
152 return NULL;
153 }
154
accept_run(struct json_lexer * lex,const char * run)155 static int accept_run(struct json_lexer *lex, const char *run)
156 {
157 for (; *run; run++) {
158 if (next(lex) != *run) {
159 return -EINVAL;
160 }
161 }
162
163 return 0;
164 }
165
lexer_boolean(struct json_lexer * lex)166 static void *lexer_boolean(struct json_lexer *lex)
167 {
168 backup(lex);
169
170 switch (next(lex)) {
171 case 't':
172 if (!accept_run(lex, "rue")) {
173 emit(lex, JSON_TOK_TRUE);
174 return lexer_json;
175 }
176 break;
177 case 'f':
178 if (!accept_run(lex, "alse")) {
179 emit(lex, JSON_TOK_FALSE);
180 return lexer_json;
181 }
182 break;
183 }
184
185 emit(lex, JSON_TOK_ERROR);
186 return NULL;
187 }
188
lexer_null(struct json_lexer * lex)189 static void *lexer_null(struct json_lexer *lex)
190 {
191 if (accept_run(lex, "ull") < 0) {
192 emit(lex, JSON_TOK_ERROR);
193 return NULL;
194 }
195
196 emit(lex, JSON_TOK_NULL);
197 return lexer_json;
198 }
199
lexer_number(struct json_lexer * lex)200 static void *lexer_number(struct json_lexer *lex)
201 {
202 while (true) {
203 int chr = next(lex);
204
205 if (isdigit(chr) != 0 || chr == '.' || chr == 'e' || chr == '+' || chr == '-') {
206 continue;
207 }
208
209 backup(lex);
210 emit(lex, JSON_TOK_NUMBER);
211
212 return lexer_json;
213 }
214 }
215
lexer_number_nan(struct json_lexer * lex)216 static void *lexer_number_nan(struct json_lexer *lex)
217 {
218 #ifdef CONFIG_JSON_LIBRARY_FP_SUPPORT
219 backup(lex);
220
221 switch (peek(lex)) {
222 case 'N':
223 if (!accept_run(lex, "NaN")) {
224 emit(lex, JSON_TOK_NUMBER);
225 return lexer_json;
226 }
227 break;
228 case 'I':
229 if (!accept_run(lex, "Infinity")) {
230 emit(lex, JSON_TOK_NUMBER);
231 return lexer_json;
232 }
233 break;
234 case '-':
235 if (!accept_run(lex, "-Infinity")) {
236 emit(lex, JSON_TOK_NUMBER);
237 return lexer_json;
238 }
239 break;
240 }
241
242 #endif
243 emit(lex, JSON_TOK_ERROR);
244 return NULL;
245 }
246
lexer_json(struct json_lexer * lex)247 static void *lexer_json(struct json_lexer *lex)
248 {
249 while (true) {
250 int chr = next(lex);
251
252 switch (chr) {
253 case '\0':
254 emit(lex, JSON_TOK_EOF);
255 return NULL;
256 case '}':
257 case '{':
258 case '[':
259 case ']':
260 case ',':
261 case ':':
262 emit(lex, (enum json_tokens)chr);
263 return lexer_json;
264 case '"':
265 return lexer_string;
266 case 'n':
267 return lexer_null;
268 case 't':
269 case 'f':
270 return lexer_boolean;
271 case 'N':
272 case 'I':
273 return lexer_number_nan;
274 case '-':
275 if (isdigit(peek(lex)) != 0) {
276 return lexer_number;
277 }
278 if (peek(lex) == 'I') {
279 return lexer_number_nan;
280 }
281
282 __fallthrough;
283 default:
284 if (isspace(chr) != 0) {
285 ignore(lex);
286 continue;
287 }
288
289 if (isdigit(chr) != 0) {
290 return lexer_number;
291 }
292
293 emit(lex, JSON_TOK_ERROR);
294 return NULL;
295 }
296 }
297 }
298
lexer_init(struct json_lexer * lex,char * data,size_t len)299 static void lexer_init(struct json_lexer *lex, char *data, size_t len)
300 {
301 lex->state = lexer_json;
302 lex->start = data;
303 lex->pos = data;
304 lex->end = data + len;
305 lex->tok.type = JSON_TOK_NONE;
306 }
307
obj_init(struct json_obj * json,char * data,size_t len)308 static int obj_init(struct json_obj *json, char *data, size_t len)
309 {
310 struct json_token tok;
311
312 lexer_init(&json->lex, data, len);
313
314 if (!lexer_next(&json->lex, &tok)) {
315 return -EINVAL;
316 }
317
318 if (tok.type != JSON_TOK_OBJECT_START) {
319 return -EINVAL;
320 }
321
322 return 0;
323 }
324
arr_init(struct json_obj * json,char * data,size_t len)325 static int arr_init(struct json_obj *json, char *data, size_t len)
326 {
327 struct json_token tok;
328
329 lexer_init(&json->lex, data, len);
330
331 if (!lexer_next(&json->lex, &tok)) {
332 return -EINVAL;
333 }
334
335 if (tok.type != JSON_TOK_ARRAY_START) {
336 return -EINVAL;
337 }
338
339 return 0;
340 }
341
element_token(enum json_tokens token)342 static int element_token(enum json_tokens token)
343 {
344 switch (token) {
345 case JSON_TOK_OBJECT_START:
346 case JSON_TOK_ARRAY_START:
347 case JSON_TOK_STRING:
348 case JSON_TOK_STRING_BUF:
349 case JSON_TOK_NUMBER:
350 case JSON_TOK_INT:
351 case JSON_TOK_UINT:
352 case JSON_TOK_INT64:
353 case JSON_TOK_UINT64:
354 case JSON_TOK_FLOAT:
355 case JSON_TOK_FLOAT_FP:
356 case JSON_TOK_DOUBLE_FP:
357 case JSON_TOK_OPAQUE:
358 case JSON_TOK_OBJ_ARRAY:
359 case JSON_TOK_TRUE:
360 case JSON_TOK_FALSE:
361 return 0;
362 default:
363 return -EINVAL;
364 }
365 }
366
obj_next(struct json_obj * json,struct json_obj_key_value * kv)367 static int obj_next(struct json_obj *json,
368 struct json_obj_key_value *kv)
369 {
370 struct json_token tok;
371
372 if (!lexer_next(&json->lex, &tok)) {
373 return -EINVAL;
374 }
375
376 /* Match end of object or next key */
377 switch (tok.type) {
378 case JSON_TOK_OBJECT_END:
379 kv->key = NULL;
380 kv->key_len = 0;
381 kv->value = tok;
382
383 return 0;
384 case JSON_TOK_COMMA:
385 if (!lexer_next(&json->lex, &tok)) {
386 return -EINVAL;
387 }
388
389 if (tok.type != JSON_TOK_STRING) {
390 return -EINVAL;
391 }
392
393 __fallthrough;
394 case JSON_TOK_STRING:
395 kv->key = tok.start;
396 kv->key_len = (size_t)(tok.end - tok.start);
397 break;
398 default:
399 return -EINVAL;
400 }
401
402 /* Match : after key */
403 if (!lexer_next(&json->lex, &tok)) {
404 return -EINVAL;
405 }
406
407 if (tok.type != JSON_TOK_COLON) {
408 return -EINVAL;
409 }
410
411 /* Match value */
412 if (!lexer_next(&json->lex, &kv->value)) {
413 return -EINVAL;
414 }
415
416 return element_token(kv->value.type);
417 }
418
arr_next(struct json_obj * json,struct json_token * value)419 static int arr_next(struct json_obj *json, struct json_token *value)
420 {
421 if (!lexer_next(&json->lex, value)) {
422 return -EINVAL;
423 }
424
425 if (value->type == JSON_TOK_ARRAY_END) {
426 return 0;
427 }
428
429 if (value->type == JSON_TOK_COMMA) {
430 if (!lexer_next(&json->lex, value)) {
431 return -EINVAL;
432 }
433 }
434
435 return element_token(value->type);
436 }
437
skip_field(struct json_obj * obj,struct json_obj_key_value * kv)438 static int skip_field(struct json_obj *obj, struct json_obj_key_value *kv)
439 {
440 int field_count = 1;
441
442 if (kv->value.type == JSON_TOK_OBJECT_START ||
443 kv->value.type == JSON_TOK_ARRAY_START) {
444 while (field_count > 0 && lexer_next(&obj->lex, &kv->value)) {
445 switch (kv->value.type) {
446 case JSON_TOK_OBJECT_START:
447 case JSON_TOK_ARRAY_START:
448 field_count++;
449 break;
450 case JSON_TOK_OBJECT_END:
451 case JSON_TOK_ARRAY_END:
452 field_count--;
453 break;
454 case JSON_TOK_ERROR:
455 return -EINVAL;
456 default:
457 break;
458 }
459 }
460 }
461
462 return 0;
463 }
464
465 /**
466 * @brief Unescape a JSON string, can work in-place if src == dst
467 * @param src Source string with escape sequences
468 * @param dst Destination buffer for unescaped string (can be same as src)
469 * @param src_len Length of source string
470 * @param dst_size Size of destination buffer
471 * @return int Number of bytes written to destination, or -EINVAL on error
472 */
json_unescape_string(const char * src,char * dst,size_t src_len,size_t dst_size)473 static int json_unescape_string(const char *src, char *dst, size_t src_len, size_t dst_size)
474 {
475 const char *src_end = src + src_len;
476 char *dst_start = dst;
477 char *dst_end = dst_start + dst_size - 1; /* Point to last available byte (for null) */
478
479 while (src < src_end && dst < dst_end) {
480 if (*src == '\\') {
481 src++;
482 if (src >= src_end) {
483 return -EINVAL;
484 }
485
486 switch (*src) {
487 case '"':
488 *dst++ = '"';
489 break;
490 case '\\':
491 *dst++ = '\\';
492 break;
493 case '/':
494 *dst++ = '/';
495 break;
496 case 'b':
497 *dst++ = '\b';
498 break;
499 case 'f':
500 *dst++ = '\f';
501 break;
502 case 'n':
503 *dst++ = '\n';
504 break;
505 case 'r':
506 *dst++ = '\r';
507 break;
508 case 't':
509 *dst++ = '\t';
510 break;
511 default:
512 /* Unknown escape sequence, copy as-is */
513 *dst++ = '\\';
514 *dst++ = *src;
515 break;
516 }
517 src++;
518 } else {
519 *dst++ = *src++;
520 }
521 }
522
523 *dst = '\0';
524 return dst - dst_start;
525 }
526
decode_string_buf(const struct json_token * token,char * str,size_t size)527 static int decode_string_buf(const struct json_token *token, char *str, size_t size)
528 {
529 size_t escaped_len = token->end - token->start;
530 int ret;
531
532 /* Safe approach: never copy more than (size - 1) bytes to leave room for null */
533 size_t safe_len = (escaped_len < size) ? escaped_len : (size - 1);
534
535 ret = json_unescape_string(token->start, str, safe_len, size);
536 if (ret < 0) {
537 return -EINVAL;
538 }
539
540 /* Check if we had to truncate due to the original escaped string being too long */
541 if (escaped_len >= size) {
542 return -EINVAL;
543 }
544
545 return 0;
546 }
547
decode_int32(const struct json_token * token,int32_t * num)548 static int decode_int32(const struct json_token *token, int32_t *num)
549 {
550 /* FIXME: strtod() is not available in newlib/minimal libc,
551 * so using strtol() here.
552 */
553 char *endptr;
554 char prev_end;
555
556 prev_end = *token->end;
557 *token->end = '\0';
558
559 errno = 0;
560 *num = strtol(token->start, &endptr, 10);
561
562 *token->end = prev_end;
563
564 if (errno != 0) {
565 return -errno;
566 }
567
568 if (endptr != token->end) {
569 return -EINVAL;
570 }
571
572 return 0;
573 }
574
decode_uint32(const struct json_token * token,uint32_t * num)575 static int decode_uint32(const struct json_token *token, uint32_t *num)
576 {
577 char *endptr;
578 char prev_end;
579
580 prev_end = *token->end;
581 *token->end = '\0';
582
583 errno = 0;
584 *num = strtoul(token->start, &endptr, 10);
585
586 *token->end = prev_end;
587
588 if (errno != 0) {
589 return -errno;
590 }
591
592 if (endptr != token->end) {
593 return -EINVAL;
594 }
595
596 return 0;
597 }
598
decode_int64(const struct json_token * token,int64_t * num)599 static int decode_int64(const struct json_token *token, int64_t *num)
600 {
601 char *endptr;
602 char prev_end;
603
604 prev_end = *token->end;
605 *token->end = '\0';
606
607 errno = 0;
608 *num = strtoll(token->start, &endptr, 10);
609
610 *token->end = prev_end;
611
612 if (errno != 0) {
613 return -errno;
614 }
615
616 if (endptr != token->end) {
617 return -EINVAL;
618 }
619
620 return 0;
621 }
622
decode_uint64(const struct json_token * token,uint64_t * num)623 static int decode_uint64(const struct json_token *token, uint64_t *num)
624 {
625 char *endptr;
626 char prev_end;
627
628 prev_end = *token->end;
629 *token->end = '\0';
630
631 errno = 0;
632 *num = strtoull(token->start, &endptr, 10);
633
634 *token->end = prev_end;
635
636 if (errno != 0) {
637 return -errno;
638 }
639
640 if (endptr != token->end) {
641 return -EINVAL;
642 }
643
644 return 0;
645 }
646
decode_float(const struct json_token * token,float * num)647 static int decode_float(const struct json_token *token, float *num)
648 {
649 #ifdef CONFIG_JSON_LIBRARY_FP_SUPPORT
650 char *endptr;
651 char prev_end;
652
653 prev_end = *token->end;
654 *token->end = '\0';
655
656 errno = 0;
657 *num = strtof(token->start, &endptr);
658
659 *token->end = prev_end;
660
661 if (errno != 0) {
662 return -errno;
663 }
664
665 if (endptr != token->end) {
666 return -EINVAL;
667 }
668
669 return 0;
670
671 #else
672 ARG_UNUSED(token);
673 ARG_UNUSED(num);
674 return -EINVAL;
675 #endif
676 }
677
decode_double(const struct json_token * token,double * num)678 static int decode_double(const struct json_token *token, double *num)
679 {
680 #ifdef CONFIG_JSON_LIBRARY_FP_SUPPORT
681 char *endptr;
682 char prev_end;
683
684 prev_end = *token->end;
685 *token->end = '\0';
686
687 errno = 0;
688 *num = strtod(token->start, &endptr);
689
690 *token->end = prev_end;
691
692 if (errno != 0) {
693 return -errno;
694 }
695
696 if (endptr != token->end) {
697 return -EINVAL;
698 }
699
700 return 0;
701
702 #else
703 ARG_UNUSED(token);
704 ARG_UNUSED(num);
705 return -EINVAL;
706 #endif
707 }
708
decode_int8(const struct json_token * token,int8_t * num)709 static int decode_int8(const struct json_token *token, int8_t *num)
710 {
711 int32_t num_i32;
712 int res;
713
714 res = decode_int32(token, &num_i32);
715
716 if (res != 0) {
717 return res;
718 }
719
720 if (num_i32 < INT8_MIN || num_i32 > INT8_MAX) {
721 return -EINVAL;
722 }
723
724 *num = num_i32;
725
726 return 0;
727 }
728
decode_uint8(const struct json_token * token,uint8_t * num)729 static int decode_uint8(const struct json_token *token, uint8_t *num)
730 {
731 uint32_t num_u32;
732 int res;
733
734 res = decode_uint32(token, &num_u32);
735
736 if (res != 0) {
737 return res;
738 }
739
740 if (num_u32 > UINT8_MAX) {
741 return -EINVAL;
742 }
743
744 *num = num_u32;
745
746 return 0;
747 }
748
decode_int16(const struct json_token * token,int16_t * num)749 static int decode_int16(const struct json_token *token, int16_t *num)
750 {
751 int32_t num_i32;
752 int res;
753
754 res = decode_int32(token, &num_i32);
755
756 if (res != 0) {
757 return res;
758 }
759
760 if (num_i32 < INT16_MIN || num_i32 > INT16_MAX) {
761 return -EINVAL;
762 }
763
764 *num = num_i32;
765
766 return 0;
767 }
768
decode_uint16(const struct json_token * token,uint16_t * num)769 static int decode_uint16(const struct json_token *token, uint16_t *num)
770 {
771 uint32_t num_u32;
772 int res;
773
774 res = decode_uint32(token, &num_u32);
775
776 if (res != 0) {
777 return res;
778 }
779
780 if (num_u32 > UINT16_MAX) {
781 return -EINVAL;
782 }
783
784 *num = num_u32;
785
786 return 0;
787 }
788
decode_int(const struct json_token * token,void * field,size_t size)789 static int decode_int(const struct json_token *token, void *field, size_t size)
790 {
791 switch (size) {
792 case 1: {
793 int8_t *num = field;
794
795 return decode_int8(token, num);
796 }
797 case 2: {
798 int16_t *num = field;
799
800 return decode_int16(token, num);
801 }
802 case 4: {
803 int32_t *num = field;
804
805 return decode_int32(token, num);
806 }
807 case 8: {
808 int64_t *num = field;
809
810 return decode_int64(token, num);
811 }
812 default:
813 return -EINVAL;
814 }
815 }
816
decode_uint(const struct json_token * token,void * field,size_t size)817 static int decode_uint(const struct json_token *token, void *field, size_t size)
818 {
819 switch (size) {
820 case 1: {
821 uint8_t *num = field;
822
823 return decode_uint8(token, num);
824 }
825 case 2: {
826 uint16_t *num = field;
827
828 return decode_uint16(token, num);
829 }
830 case 4: {
831 uint32_t *num = field;
832
833 return decode_uint32(token, num);
834 }
835 case 8: {
836 uint64_t *num = field;
837
838 return decode_uint64(token, num);
839 }
840 default:
841 return -EINVAL;
842 }
843 }
844
equivalent_types(enum json_tokens type1,enum json_tokens type2)845 static bool equivalent_types(enum json_tokens type1, enum json_tokens type2)
846 {
847 if (type1 == JSON_TOK_TRUE || type1 == JSON_TOK_FALSE) {
848 return type2 == JSON_TOK_TRUE || type2 == JSON_TOK_FALSE;
849 }
850
851 if (type1 == JSON_TOK_ARRAY_START && type2 == JSON_TOK_MIXED_ARRAY) {
852 return true;
853 }
854
855 if (type1 == JSON_TOK_NUMBER && type2 == JSON_TOK_FLOAT) {
856 return true;
857 }
858
859 if (type1 == JSON_TOK_NUMBER && type2 == JSON_TOK_FLOAT_FP) {
860 return true;
861 }
862
863 if (type1 == JSON_TOK_NUMBER && type2 == JSON_TOK_DOUBLE_FP) {
864 return true;
865 }
866
867 if (type1 == JSON_TOK_NUMBER && type2 == JSON_TOK_INT) {
868 return true;
869 }
870
871 if (type1 == JSON_TOK_NUMBER && type2 == JSON_TOK_UINT) {
872 return true;
873 }
874
875 if (type1 == JSON_TOK_NUMBER && type2 == JSON_TOK_INT64) {
876 return true;
877 }
878
879 if (type1 == JSON_TOK_NUMBER && type2 == JSON_TOK_UINT64) {
880 return true;
881 }
882
883 if (type1 == JSON_TOK_STRING && type2 == JSON_TOK_OPAQUE) {
884 return true;
885 }
886
887 if (type1 == JSON_TOK_STRING && type2 == JSON_TOK_STRING_BUF) {
888 return true;
889 }
890
891 if (type2 == JSON_TOK_ENCODED_OBJ) {
892 return (type1 == JSON_TOK_OBJECT_START ||
893 type1 == JSON_TOK_ARRAY_START ||
894 type1 == JSON_TOK_STRING);
895 }
896
897 if (type1 == JSON_TOK_ARRAY_START && type2 == JSON_TOK_OBJ_ARRAY) {
898 return true;
899 }
900
901 return type1 == type2;
902 }
903
904 static int64_t obj_parse(struct json_obj *obj,
905 const struct json_obj_descr *descr, size_t descr_len,
906 void *val);
907 static int arr_parse(struct json_obj *obj,
908 const struct json_obj_descr *elem_descr,
909 size_t max_elements, void *field, void *val);
910
911 static int arr_data_parse(struct json_obj *obj, struct json_obj_token *val);
912
decode_value(struct json_obj * obj,const struct json_obj_descr * descr,struct json_token * value,void * field,void * val)913 static int64_t decode_value(struct json_obj *obj,
914 const struct json_obj_descr *descr,
915 struct json_token *value, void *field, void *val)
916 {
917
918 if (!equivalent_types(value->type, descr->type)) {
919 return -EINVAL;
920 }
921
922 switch (descr->type) {
923 case JSON_TOK_OBJECT_START:
924 return obj_parse(obj, descr->object.sub_descr,
925 descr->object.sub_descr_len,
926 field);
927 case JSON_TOK_ARRAY_START:
928 return arr_parse(obj, descr->array.element_descr,
929 descr->array.n_elements, field, val);
930 case JSON_TOK_OBJ_ARRAY: {
931 struct json_obj_token *obj_token = field;
932
933 obj_token->start = value->start;
934 return arr_data_parse(obj, obj_token);
935 }
936
937 case JSON_TOK_FALSE:
938 case JSON_TOK_TRUE: {
939 bool *v = field;
940
941 *v = value->type == JSON_TOK_TRUE;
942
943 return 0;
944 }
945 case JSON_TOK_NUMBER: {
946 int32_t *num = field;
947
948 return decode_int32(value, num);
949 }
950 case JSON_TOK_INT: {
951 return decode_int(value, field, descr->field.size);
952 }
953 case JSON_TOK_UINT: {
954 return decode_uint(value, field, descr->field.size);
955 }
956 case JSON_TOK_INT64: {
957 int64_t *num = field;
958
959 return decode_int64(value, num);
960 }
961 case JSON_TOK_UINT64: {
962 uint64_t *num = field;
963
964 return decode_uint64(value, num);
965 }
966 case JSON_TOK_FLOAT_FP: {
967 float *num = field;
968
969 return decode_float(value, num);
970 }
971 case JSON_TOK_DOUBLE_FP: {
972 double *num = field;
973
974 return decode_double(value, num);
975 }
976 case JSON_TOK_OPAQUE:
977 case JSON_TOK_FLOAT: {
978 struct json_obj_token *obj_token = field;
979
980 obj_token->start = value->start;
981 obj_token->length = value->end - value->start;
982 return 0;
983 }
984 case JSON_TOK_STRING: {
985 char **str = field;
986
987 *value->end = '\0';
988 *str = value->start;
989
990 return 0;
991 }
992 case JSON_TOK_STRING_BUF: {
993 char *str = field;
994
995 return decode_string_buf(value, str, descr->field.size);
996 }
997 default:
998 return -EINVAL;
999 }
1000 }
1001
get_elem_size(const struct json_obj_descr * descr)1002 static ptrdiff_t get_elem_size(const struct json_obj_descr *descr)
1003 {
1004 switch (descr->type) {
1005 case JSON_TOK_NUMBER:
1006 return sizeof(int32_t);
1007 case JSON_TOK_INT64:
1008 return sizeof(int64_t);
1009 case JSON_TOK_UINT64:
1010 return sizeof(uint64_t);
1011 case JSON_TOK_FLOAT_FP:
1012 return sizeof(float);
1013 case JSON_TOK_DOUBLE_FP:
1014 return sizeof(double);
1015 case JSON_TOK_OPAQUE:
1016 case JSON_TOK_FLOAT:
1017 case JSON_TOK_OBJ_ARRAY:
1018 return sizeof(struct json_obj_token);
1019 case JSON_TOK_STRING:
1020 case JSON_TOK_ENCODED_OBJ:
1021 return sizeof(char *);
1022 case JSON_TOK_INT:
1023 case JSON_TOK_UINT:
1024 case JSON_TOK_STRING_BUF:
1025 return descr->field.size;
1026 case JSON_TOK_TRUE:
1027 case JSON_TOK_FALSE:
1028 return sizeof(bool);
1029 case JSON_TOK_ARRAY_START: {
1030 ptrdiff_t size;
1031
1032 size = descr->array.n_elements * get_elem_size(descr->array.element_descr);
1033 /* Consider additional item count field for array objects */
1034 if (descr->field_name_len > 0) {
1035 size = size + sizeof(size_t);
1036 }
1037
1038 return size;
1039 }
1040 case JSON_TOK_OBJECT_START: {
1041 ptrdiff_t total = 0;
1042 uint32_t align_shift = 0;
1043 size_t i;
1044
1045 for (i = 0; i < descr->object.sub_descr_len; i++) {
1046 if (descr->object.sub_descr[i].align_shift > align_shift) {
1047 align_shift = descr->object.sub_descr[i].align_shift;
1048 }
1049 }
1050
1051 i = descr->object.sub_descr_len;
1052 if (i > 0) {
1053 total = descr->object.sub_descr[i - 1].offset +
1054 get_elem_size(&descr->object.sub_descr[i - 1]);
1055 }
1056
1057 return ROUND_UP(total, 1 << align_shift);
1058 }
1059 default:
1060 return -EINVAL;
1061 }
1062 }
1063
arr_parse(struct json_obj * obj,const struct json_obj_descr * elem_descr,size_t max_elements,void * field,void * val)1064 static int arr_parse(struct json_obj *obj,
1065 const struct json_obj_descr *elem_descr,
1066 size_t max_elements, void *field, void *val)
1067 {
1068 void *value = val;
1069 size_t *elements = (size_t *)((char *)value + elem_descr->offset);
1070 ptrdiff_t elem_size;
1071 void *last_elem;
1072 struct json_token tok;
1073
1074 /* For nested arrays, skip parent descriptor to get elements */
1075 if (elem_descr->type == JSON_TOK_ARRAY_START) {
1076 elem_descr = elem_descr->array.element_descr;
1077 }
1078
1079 *elements = 0;
1080 elem_size = get_elem_size(elem_descr);
1081 last_elem = (char *)field + elem_size * max_elements;
1082
1083 __ASSERT_NO_MSG(elem_size > 0);
1084
1085 while (!arr_next(obj, &tok)) {
1086 if (tok.type == JSON_TOK_ARRAY_END) {
1087 return 0;
1088 }
1089
1090 if (field == last_elem) {
1091 return -ENOSPC;
1092 }
1093
1094 /* For nested arrays, update value to current field,
1095 * so it matches descriptor's offset to length field
1096 */
1097 if (elem_descr->type == JSON_TOK_ARRAY_START) {
1098 value = field;
1099 }
1100
1101 if (decode_value(obj, elem_descr, &tok, field, value) < 0) {
1102 return -EINVAL;
1103 }
1104
1105 (*elements)++;
1106 field = (char *)field + elem_size;
1107 }
1108
1109 return -EINVAL;
1110 }
1111
arr_data_parse(struct json_obj * obj,struct json_obj_token * val)1112 static int arr_data_parse(struct json_obj *obj, struct json_obj_token *val)
1113 {
1114 bool string_state = false;
1115 int array_in_array = 1;
1116
1117 /* Init length to zero */
1118 val->length = 0;
1119
1120 while (obj->lex.pos != obj->lex.end) {
1121 if (string_state) {
1122 if (*obj->lex.pos == JSON_TOK_STRING) {
1123 string_state = false;
1124 }
1125 } else {
1126 if (*obj->lex.pos == JSON_TOK_ARRAY_END) {
1127 array_in_array--;
1128 if (array_in_array == 0) {
1129 /* Set array data length + 1 object end */
1130 val->length = obj->lex.pos - val->start + 1;
1131 /* Init Lexer that Object Parse can be finished properly */
1132 obj->lex.state = lexer_json;
1133 /* Move position to before array end */
1134 obj->lex.pos--;
1135 obj->lex.tok.end = obj->lex.pos;
1136 obj->lex.tok.start = val->start;
1137 obj->lex.tok.type = JSON_TOK_NONE;
1138 return 0;
1139 }
1140 } else if (*obj->lex.pos == JSON_TOK_STRING) {
1141 string_state = true;
1142 } else if (*obj->lex.pos == JSON_TOK_ARRAY_START) {
1143 /* array in array update structure count */
1144 array_in_array++;
1145 }
1146 }
1147 obj->lex.pos++;
1148 }
1149
1150 return -EINVAL;
1151 }
1152
obj_parse(struct json_obj * obj,const struct json_obj_descr * descr,size_t descr_len,void * val)1153 static int64_t obj_parse(struct json_obj *obj, const struct json_obj_descr *descr,
1154 size_t descr_len, void *val)
1155 {
1156 struct json_obj_key_value kv;
1157 int64_t decoded_fields = 0;
1158 size_t i;
1159 int ret;
1160
1161 while (!obj_next(obj, &kv)) {
1162 if (kv.value.type == JSON_TOK_OBJECT_END) {
1163 return decoded_fields;
1164 }
1165
1166 for (i = 0; i < descr_len; i++) {
1167 void *decode_field = (char *)val + descr[i].offset;
1168
1169 /* Field has been decoded already, skip */
1170 if (decoded_fields & ((int64_t)1 << i)) {
1171 continue;
1172 }
1173
1174 /* Check if it's the i-th field */
1175 if (kv.key_len != descr[i].field_name_len) {
1176 continue;
1177 }
1178
1179 if (memcmp(kv.key, descr[i].field_name,
1180 descr[i].field_name_len)) {
1181 continue;
1182 }
1183
1184 /* Store the decoded value */
1185 ret = decode_value(obj, &descr[i], &kv.value,
1186 decode_field, val);
1187 if (ret < 0) {
1188 return ret;
1189 }
1190
1191 decoded_fields |= (int64_t)1<<i;
1192 break;
1193 }
1194
1195 /* Skip field, if no descriptor was found */
1196 if (i >= descr_len) {
1197 ret = skip_field(obj, &kv);
1198 if (ret < 0) {
1199 return ret;
1200 }
1201 }
1202 }
1203
1204 return -EINVAL;
1205 }
1206
json_obj_parse(char * payload,size_t len,const struct json_obj_descr * descr,size_t descr_len,void * val)1207 int64_t json_obj_parse(char *payload, size_t len,
1208 const struct json_obj_descr *descr, size_t descr_len,
1209 void *val)
1210 {
1211 struct json_obj obj;
1212 int64_t ret;
1213
1214 __ASSERT_NO_MSG(descr_len < (sizeof(ret) * CHAR_BIT - 1));
1215
1216 ret = obj_init(&obj, payload, len);
1217 if (ret < 0) {
1218 return ret;
1219 }
1220
1221 return obj_parse(&obj, descr, descr_len, val);
1222 }
1223
json_arr_parse(char * payload,size_t len,const struct json_obj_descr * descr,void * val)1224 int json_arr_parse(char *payload, size_t len,
1225 const struct json_obj_descr *descr, void *val)
1226 {
1227 struct json_obj arr;
1228 int ret;
1229
1230 ret = arr_init(&arr, payload, len);
1231 if (ret < 0) {
1232 return ret;
1233 }
1234
1235 void *ptr = (char *)val + descr->offset;
1236
1237 return arr_parse(&arr, descr->array.element_descr,
1238 descr->array.n_elements, ptr, val);
1239 }
1240
1241
json_arr_separate_object_parse_init(struct json_obj * json,char * payload,size_t len)1242 int json_arr_separate_object_parse_init(struct json_obj *json, char *payload, size_t len)
1243 {
1244 return arr_init(json, payload, len);
1245 }
1246
json_arr_separate_parse_object(struct json_obj * json,const struct json_obj_descr * descr,size_t descr_len,void * val)1247 int json_arr_separate_parse_object(struct json_obj *json, const struct json_obj_descr *descr,
1248 size_t descr_len, void *val)
1249 {
1250 struct json_token tok;
1251
1252 if (!lexer_next(&json->lex, &tok)) {
1253 return -EINVAL;
1254 }
1255
1256 if (tok.type == JSON_TOK_ARRAY_END) {
1257 return 0;
1258 } else if (tok.type == JSON_TOK_COMMA) {
1259 if (!lexer_next(&json->lex, &tok)) {
1260 return -EINVAL;
1261 }
1262 }
1263
1264 if (tok.type != JSON_TOK_OBJECT_START) {
1265 return -EINVAL;
1266 }
1267
1268 return obj_parse(json, descr, descr_len, val);
1269 }
1270
escape_as(char chr)1271 static char escape_as(char chr)
1272 {
1273 switch (chr) {
1274 case '"':
1275 return '"';
1276 case '\\':
1277 return '\\';
1278 case '\b':
1279 return 'b';
1280 case '\f':
1281 return 'f';
1282 case '\n':
1283 return 'n';
1284 case '\r':
1285 return 'r';
1286 case '\t':
1287 return 't';
1288 }
1289
1290 return 0;
1291 }
1292
json_escape_internal(const char * str,json_append_bytes_t append_bytes,void * data)1293 static int json_escape_internal(const char *str,
1294 json_append_bytes_t append_bytes,
1295 void *data)
1296 {
1297 const char *cur;
1298 int ret = 0;
1299
1300 if (str == NULL) {
1301 return ret;
1302 }
1303
1304 for (cur = str; ret == 0 && *cur; cur++) {
1305 char escaped = escape_as(*cur);
1306
1307 if (escaped) {
1308 char bytes[2] = { '\\', escaped };
1309
1310 ret = append_bytes(bytes, 2, data);
1311 } else {
1312 ret = append_bytes(cur, 1, data);
1313 }
1314 }
1315
1316 return ret;
1317 }
1318
json_calc_escaped_len(const char * str,size_t len)1319 size_t json_calc_escaped_len(const char *str, size_t len)
1320 {
1321 size_t escaped_len = len;
1322 size_t pos;
1323
1324 for (pos = 0; pos < len; pos++) {
1325 if (escape_as(str[pos])) {
1326 escaped_len++;
1327 }
1328 }
1329
1330 return escaped_len;
1331 }
1332
json_escape(char * str,size_t * len,size_t buf_size)1333 ssize_t json_escape(char *str, size_t *len, size_t buf_size)
1334 {
1335 char *next; /* Points after next character to escape. */
1336 char *dest; /* Points after next place to write escaped character. */
1337 size_t escaped_len = json_calc_escaped_len(str, *len);
1338
1339 if (escaped_len == *len) {
1340 /*
1341 * If no escape is necessary, there is nothing to do.
1342 */
1343 return 0;
1344 }
1345
1346 if (escaped_len >= buf_size) {
1347 return -ENOMEM;
1348 }
1349
1350 /*
1351 * By walking backwards in the buffer from the end positions
1352 * of both the original and escaped strings, we avoid using
1353 * extra space. Characters in the original string are
1354 * overwritten only after they have already been escaped.
1355 */
1356 str[escaped_len] = '\0';
1357 for (next = &str[*len], dest = &str[escaped_len]; next != str;) {
1358 char next_c = *(--next);
1359 char escape = escape_as(next_c);
1360
1361 if (escape) {
1362 *(--dest) = escape;
1363 *(--dest) = '\\';
1364 } else {
1365 *(--dest) = next_c;
1366 }
1367 }
1368 *len = escaped_len;
1369
1370 return 0;
1371 }
1372
1373 static int encode(const struct json_obj_descr *descr, const void *val,
1374 json_append_bytes_t append_bytes, void *data);
1375
arr_encode(const struct json_obj_descr * elem_descr,const void * field,const void * val,json_append_bytes_t append_bytes,void * data)1376 static int arr_encode(const struct json_obj_descr *elem_descr,
1377 const void *field, const void *val,
1378 json_append_bytes_t append_bytes, void *data)
1379 {
1380 ptrdiff_t elem_size;
1381 /*
1382 * NOTE: Since an element descriptor's offset isn't meaningful
1383 * (array elements occur at multiple offsets in `val'), we use
1384 * its space in elem_descr to store the offset to the field
1385 * containing the number of elements.
1386 */
1387 size_t n_elem = *(size_t *)((char *)val + elem_descr->offset);
1388 size_t i;
1389 int ret;
1390
1391 ret = append_bytes("[", 1, data);
1392 if (ret < 0) {
1393 return ret;
1394 }
1395
1396 /* For nested arrays, skip parent descriptor to get elements */
1397 if (elem_descr->type == JSON_TOK_ARRAY_START) {
1398 elem_descr = elem_descr->array.element_descr;
1399 }
1400
1401 elem_size = get_elem_size(elem_descr);
1402
1403 for (i = 0; i < n_elem; i++) {
1404 /*
1405 * Though "field" points at the next element in the
1406 * array which we need to encode, the value in
1407 * elem_descr->offset is actually the offset of the
1408 * length field in the "parent" struct containing the
1409 * array.
1410 *
1411 * To patch things up, we lie to encode() about where
1412 * the field is by exactly the amount it will offset
1413 * it. This is a size optimization for struct
1414 * json_obj_descr: the alternative is to keep a
1415 * separate field next to element_descr which is an
1416 * offset to the length field in the parent struct,
1417 * but that would add a size_t to every descriptor.
1418 */
1419 ret = encode(elem_descr, (char *)field - elem_descr->offset,
1420 append_bytes, data);
1421 if (ret < 0) {
1422 return ret;
1423 }
1424
1425 if (i < n_elem - 1) {
1426 ret = append_bytes(",", 1, data);
1427 if (ret < 0) {
1428 return ret;
1429 }
1430 }
1431
1432 field = (char *)field + elem_size;
1433 }
1434
1435 return append_bytes("]", 1, data);
1436 }
1437
str_encode(const char * str,json_append_bytes_t append_bytes,void * data)1438 static int str_encode(const char *str, json_append_bytes_t append_bytes,
1439 void *data)
1440 {
1441 int ret;
1442
1443 ret = append_bytes("\"", 1, data);
1444 if (ret < 0) {
1445 return ret;
1446 }
1447
1448 ret = json_escape_internal(str, append_bytes, data);
1449 if (!ret) {
1450 return append_bytes("\"", 1, data);
1451 }
1452
1453 return ret;
1454 }
1455
int32_encode(const int32_t * num,json_append_bytes_t append_bytes,void * data)1456 static int int32_encode(const int32_t *num, json_append_bytes_t append_bytes,
1457 void *data)
1458 {
1459 char buf[3 * sizeof(int32_t)];
1460 int ret;
1461
1462 ret = snprintk(buf, sizeof(buf), "%d", *num);
1463 if (ret < 0) {
1464 return ret;
1465 }
1466 if (ret >= (int)sizeof(buf)) {
1467 return -ENOMEM;
1468 }
1469
1470 return append_bytes(buf, (size_t)ret, data);
1471 }
1472
uint32_encode(const uint32_t * num,json_append_bytes_t append_bytes,void * data)1473 static int uint32_encode(const uint32_t *num, json_append_bytes_t append_bytes,
1474 void *data)
1475 {
1476 char buf[3 * sizeof(uint32_t)];
1477 int ret;
1478
1479 ret = snprintk(buf, sizeof(buf), "%u", *num);
1480 if (ret < 0) {
1481 return ret;
1482 }
1483 if (ret >= (int)sizeof(buf)) {
1484 return -ENOMEM;
1485 }
1486
1487 return append_bytes(buf, (size_t)ret, data);
1488 }
1489
int64_encode(const int64_t * num,json_append_bytes_t append_bytes,void * data)1490 static int int64_encode(const int64_t *num, json_append_bytes_t append_bytes,
1491 void *data)
1492 {
1493 char buf[sizeof("-9223372036854775808")];
1494 int ret;
1495
1496 ret = snprintk(buf, sizeof(buf), "%" PRId64, *num);
1497 if (ret < 0) {
1498 return ret;
1499 }
1500 if (ret >= (int)sizeof(buf)) {
1501 return -ENOMEM;
1502 }
1503
1504 return append_bytes(buf, (size_t)ret, data);
1505 }
1506
uint64_encode(const uint64_t * num,json_append_bytes_t append_bytes,void * data)1507 static int uint64_encode(const uint64_t *num, json_append_bytes_t append_bytes,
1508 void *data)
1509 {
1510 char buf[sizeof("18446744073709551610")];
1511 int ret;
1512
1513 ret = snprintk(buf, sizeof(buf), "%" PRIu64, *num);
1514 if (ret < 0) {
1515 return ret;
1516 }
1517 if (ret >= (int)sizeof(buf)) {
1518 return -ENOMEM;
1519 }
1520
1521 return append_bytes(buf, (size_t)ret, data);
1522 }
1523
print_double(char * str,size_t size,const char * fmt,double num)1524 static int print_double(char *str, size_t size, const char *fmt, double num)
1525 {
1526 #ifdef CONFIG_JSON_LIBRARY_FP_SUPPORT
1527 if (isnan(num)) {
1528 return snprintk(str, size, "NaN");
1529 }
1530
1531 if (isinf(num)) {
1532 if (num < 0) {
1533 return snprintk(str, size, "-Infinity");
1534 }
1535 return snprintk(str, size, "Infinity");
1536 }
1537
1538 return snprintk(str, size, fmt, num);
1539
1540 #else
1541 str[0] = '\0';
1542 ARG_UNUSED(size);
1543 ARG_UNUSED(fmt);
1544 ARG_UNUSED(num);
1545 return -EINVAL;
1546 #endif
1547 }
1548
float_encode(const float * num,json_append_bytes_t append_bytes,void * data)1549 static int float_encode(const float *num, json_append_bytes_t append_bytes, void *data)
1550 {
1551 char buf[sizeof("-3.40282347e+38")];
1552 int ret;
1553
1554 ret = print_double(buf, sizeof(buf), "%.9g", (double)*num);
1555
1556 if (ret < 0) {
1557 return ret;
1558 }
1559 if (ret >= (int)sizeof(buf)) {
1560 return -ENOMEM;
1561 }
1562
1563 return append_bytes(buf, (size_t)ret, data);
1564 }
1565
double_encode(const double * num,json_append_bytes_t append_bytes,void * data)1566 static int double_encode(const double *num, json_append_bytes_t append_bytes, void *data)
1567 {
1568 char buf[sizeof("-1.797693134862316e+308")];
1569 int ret;
1570
1571 ret = print_double(buf, sizeof(buf), "%.16g", *num);
1572
1573 if (ret < 0) {
1574 return ret;
1575 }
1576 if (ret >= (int)sizeof(buf)) {
1577 return -ENOMEM;
1578 }
1579
1580 return append_bytes(buf, (size_t)ret, data);
1581 }
1582
int_encode(const void * ptr,size_t size,json_append_bytes_t append_bytes,void * data)1583 static int int_encode(const void *ptr, size_t size, json_append_bytes_t append_bytes,
1584 void *data)
1585 {
1586 switch (size) {
1587 case 1: {
1588 const int8_t *num_8 = ptr;
1589 int32_t num = *num_8;
1590
1591 return int32_encode(&num, append_bytes, data);
1592 }
1593 case 2: {
1594 const int16_t *num_16 = ptr;
1595 int32_t num = *num_16;
1596
1597 return int32_encode(&num, append_bytes, data);
1598 }
1599 case 4: {
1600 const int32_t *num_32 = ptr;
1601 int32_t num = *num_32;
1602
1603 return int32_encode(&num, append_bytes, data);
1604 }
1605 case 8: {
1606 const int64_t *num_64 = ptr;
1607 int64_t num = *num_64;
1608
1609 return int64_encode(&num, append_bytes, data);
1610 }
1611 default:
1612 return -EINVAL;
1613 }
1614 }
1615
uint_encode(const void * ptr,size_t size,json_append_bytes_t append_bytes,void * data)1616 static int uint_encode(const void *ptr, size_t size, json_append_bytes_t append_bytes,
1617 void *data)
1618 {
1619 switch (size) {
1620 case 1: {
1621 const uint8_t *num_8 = ptr;
1622 uint32_t num = *num_8;
1623
1624 return uint32_encode(&num, append_bytes, data);
1625 }
1626 case 2: {
1627 const uint16_t *num_16 = ptr;
1628 uint32_t num = *num_16;
1629
1630 return uint32_encode(&num, append_bytes, data);
1631 }
1632 case 4: {
1633 const uint32_t *num_32 = ptr;
1634 uint32_t num = *num_32;
1635
1636 return uint32_encode(&num, append_bytes, data);
1637 }
1638 case 8: {
1639 const uint64_t *num_64 = ptr;
1640 uint64_t num = *num_64;
1641
1642 return uint64_encode(&num, append_bytes, data);
1643 }
1644 default:
1645 return -EINVAL;
1646 }
1647 }
1648
float_ascii_encode(struct json_obj_token * num,json_append_bytes_t append_bytes,void * data)1649 static int float_ascii_encode(struct json_obj_token *num, json_append_bytes_t append_bytes,
1650 void *data)
1651 {
1652
1653 return append_bytes(num->start, num->length, data);
1654 }
1655
opaque_string_encode(struct json_obj_token * opaque,json_append_bytes_t append_bytes,void * data)1656 static int opaque_string_encode(struct json_obj_token *opaque, json_append_bytes_t append_bytes,
1657 void *data)
1658 {
1659 int ret;
1660
1661 ret = append_bytes("\"", 1, data);
1662 if (ret < 0) {
1663 return ret;
1664 }
1665
1666 ret = append_bytes(opaque->start, opaque->length, data);
1667 if (ret < 0) {
1668 return ret;
1669 }
1670
1671 return append_bytes("\"", 1, data);
1672 }
1673
encoded_obj_encode(const char ** str,json_append_bytes_t append_bytes,void * data)1674 static int encoded_obj_encode(const char **str, json_append_bytes_t append_bytes, void *data)
1675 {
1676 size_t len = strlen(*str);
1677
1678 return append_bytes(*str, len, data);
1679 }
1680
bool_encode(const bool * value,json_append_bytes_t append_bytes,void * data)1681 static int bool_encode(const bool *value, json_append_bytes_t append_bytes,
1682 void *data)
1683 {
1684 if (*value) {
1685 return append_bytes("true", 4, data);
1686 }
1687
1688 return append_bytes("false", 5, data);
1689 }
1690
encode(const struct json_obj_descr * descr,const void * val,json_append_bytes_t append_bytes,void * data)1691 static int encode(const struct json_obj_descr *descr, const void *val,
1692 json_append_bytes_t append_bytes, void *data)
1693 {
1694 void *ptr = (char *)val + descr->offset;
1695
1696 switch (descr->type) {
1697 case JSON_TOK_FALSE:
1698 case JSON_TOK_TRUE:
1699 return bool_encode(ptr, append_bytes, data);
1700 case JSON_TOK_STRING: {
1701 const char **str = ptr;
1702
1703 return str_encode(*str, append_bytes, data);
1704 }
1705 case JSON_TOK_STRING_BUF:
1706 return str_encode(ptr, append_bytes, data);
1707 case JSON_TOK_ARRAY_START:
1708 return arr_encode(descr->array.element_descr, ptr,
1709 val, append_bytes, data);
1710 case JSON_TOK_OBJECT_START:
1711 return json_obj_encode(descr->object.sub_descr,
1712 descr->object.sub_descr_len,
1713 ptr, append_bytes, data);
1714 case JSON_TOK_NUMBER:
1715 return int32_encode(ptr, append_bytes, data);
1716 case JSON_TOK_INT:
1717 return int_encode(ptr, descr->field.size, append_bytes, data);
1718 case JSON_TOK_UINT:
1719 return uint_encode(ptr, descr->field.size, append_bytes, data);
1720 case JSON_TOK_INT64:
1721 return int64_encode(ptr, append_bytes, data);
1722 case JSON_TOK_UINT64:
1723 return uint64_encode(ptr, append_bytes, data);
1724 case JSON_TOK_FLOAT_FP:
1725 return float_encode(ptr, append_bytes, data);
1726 case JSON_TOK_DOUBLE_FP:
1727 return double_encode(ptr, append_bytes, data);
1728 case JSON_TOK_FLOAT:
1729 return float_ascii_encode(ptr, append_bytes, data);
1730 case JSON_TOK_OPAQUE:
1731 return opaque_string_encode(ptr, append_bytes, data);
1732 case JSON_TOK_ENCODED_OBJ:
1733 return encoded_obj_encode(ptr, append_bytes, data);
1734 default:
1735 return -EINVAL;
1736 }
1737 }
1738
json_obj_encode(const struct json_obj_descr * descr,size_t descr_len,const void * val,json_append_bytes_t append_bytes,void * data)1739 int json_obj_encode(const struct json_obj_descr *descr, size_t descr_len,
1740 const void *val, json_append_bytes_t append_bytes,
1741 void *data)
1742 {
1743 size_t i;
1744 int ret;
1745
1746 ret = append_bytes("{", 1, data);
1747 if (ret < 0) {
1748 return ret;
1749 }
1750
1751 for (i = 0; i < descr_len; i++) {
1752 ret = str_encode(descr[i].field_name, append_bytes, data);
1753 if (ret < 0) {
1754 return ret;
1755 }
1756
1757 ret = append_bytes(":", 1, data);
1758 if (ret < 0) {
1759 return ret;
1760 }
1761
1762 ret = encode(&descr[i], val, append_bytes, data);
1763 if (ret < 0) {
1764 return ret;
1765 }
1766
1767 if (i < descr_len - 1) {
1768 ret = append_bytes(",", 1, data);
1769 if (ret < 0) {
1770 return ret;
1771 }
1772 }
1773 }
1774
1775 return append_bytes("}", 1, data);
1776 }
1777
json_arr_encode(const struct json_obj_descr * descr,const void * val,json_append_bytes_t append_bytes,void * data)1778 int json_arr_encode(const struct json_obj_descr *descr, const void *val,
1779 json_append_bytes_t append_bytes, void *data)
1780 {
1781 void *ptr = (char *)val + descr->offset;
1782
1783 return arr_encode(descr->array.element_descr, ptr, val, append_bytes,
1784 data);
1785 }
1786
1787 struct appender {
1788 char *buffer;
1789 size_t used;
1790 size_t size;
1791 };
1792
append_bytes_to_buf(const char * bytes,size_t len,void * data)1793 static int append_bytes_to_buf(const char *bytes, size_t len, void *data)
1794 {
1795 struct appender *appender = data;
1796
1797 if (len >= appender->size - appender->used) {
1798 return -ENOMEM;
1799 }
1800
1801 memcpy(appender->buffer + appender->used, bytes, len);
1802 appender->used += len;
1803 appender->buffer[appender->used] = '\0';
1804
1805 return 0;
1806 }
1807
json_obj_encode_buf(const struct json_obj_descr * descr,size_t descr_len,const void * val,char * buffer,size_t buf_size)1808 int json_obj_encode_buf(const struct json_obj_descr *descr, size_t descr_len,
1809 const void *val, char *buffer, size_t buf_size)
1810 {
1811 struct appender appender = { .buffer = buffer, .size = buf_size };
1812
1813 return json_obj_encode(descr, descr_len, val, append_bytes_to_buf,
1814 &appender);
1815 }
1816
json_arr_encode_buf(const struct json_obj_descr * descr,const void * val,char * buffer,size_t buf_size)1817 int json_arr_encode_buf(const struct json_obj_descr *descr, const void *val,
1818 char *buffer, size_t buf_size)
1819 {
1820 struct appender appender = { .buffer = buffer, .size = buf_size };
1821
1822 return json_arr_encode(descr, val, append_bytes_to_buf, &appender);
1823 }
1824
measure_bytes(const char * bytes,size_t len,void * data)1825 static int measure_bytes(const char *bytes, size_t len, void *data)
1826 {
1827 ssize_t *total = data;
1828
1829 *total += (ssize_t)len;
1830
1831 ARG_UNUSED(bytes);
1832
1833 return 0;
1834 }
1835
json_calc_encoded_len(const struct json_obj_descr * descr,size_t descr_len,const void * val)1836 ssize_t json_calc_encoded_len(const struct json_obj_descr *descr,
1837 size_t descr_len, const void *val)
1838 {
1839 ssize_t total = 0;
1840 int ret;
1841
1842 ret = json_obj_encode(descr, descr_len, val, measure_bytes, &total);
1843 if (ret < 0) {
1844 return ret;
1845 }
1846
1847 return total;
1848 }
1849
json_calc_encoded_arr_len(const struct json_obj_descr * descr,const void * val)1850 ssize_t json_calc_encoded_arr_len(const struct json_obj_descr *descr,
1851 const void *val)
1852 {
1853 ssize_t total = 0;
1854 int ret;
1855
1856 ret = json_arr_encode(descr, val, measure_bytes, &total);
1857 if (ret < 0) {
1858 return ret;
1859 }
1860
1861 return total;
1862 }
1863
1864
1865 static int mixed_arr_parse(struct json_obj *arr,
1866 const struct json_mixed_arr_descr *descr,
1867 size_t descr_len, void *val);
1868 int json_mixed_arr_encode(const struct json_mixed_arr_descr *descr,
1869 size_t descr_len, void *val,
1870 json_append_bytes_t append_bytes,
1871 void *data);
1872
extract_raw_json_data(struct json_obj * obj,struct json_token * value,char ** field_ptr)1873 static int extract_raw_json_data(struct json_obj *obj, struct json_token *value,
1874 char **field_ptr)
1875 {
1876 char *start_pos = value->start;
1877
1878 switch (value->type) {
1879 case JSON_TOK_OBJECT_START:
1880 case JSON_TOK_ARRAY_START: {
1881 struct json_obj_key_value kv = {
1882 .key = NULL,
1883 .key_len = 0,
1884 .value = *value
1885 };
1886
1887 int ret = skip_field(obj, &kv);
1888
1889 if (ret < 0) {
1890 return ret;
1891 }
1892
1893 char *end_pos = obj->lex.pos;
1894 *end_pos = '\0';
1895 *field_ptr = start_pos;
1896
1897 return 0;
1898 }
1899
1900 case JSON_TOK_STRING:
1901 *value->end = '\0';
1902 *field_ptr = start_pos;
1903 return 0;
1904
1905 default:
1906 return -EINVAL;
1907 }
1908 }
1909
decode_mixed_value(struct json_obj * obj,const struct json_mixed_arr_descr * elem,struct json_token * value,void * field,void * val)1910 static int64_t decode_mixed_value(struct json_obj *obj,
1911 const struct json_mixed_arr_descr *elem,
1912 struct json_token *value,
1913 void *field, void *val)
1914 {
1915 if (!equivalent_types(value->type, elem->type)) {
1916 return -EINVAL;
1917 }
1918
1919 switch (elem->type) {
1920 case JSON_TOK_OBJECT_START: {
1921 return obj_parse(obj, elem->object.sub_descr,
1922 elem->object.sub_descr_len, field);
1923 }
1924 case JSON_TOK_ARRAY_START: {
1925 const struct json_obj_descr *actual_elem_descr = elem->array.element_descr;
1926 size_t actual_n_elements = elem->array.n_elements;
1927
1928 if (actual_elem_descr->type == JSON_TOK_ARRAY_START) {
1929 actual_elem_descr = actual_elem_descr->array.element_descr;
1930 }
1931 return arr_parse(obj, actual_elem_descr, actual_n_elements, field, val);
1932 }
1933 case JSON_TOK_MIXED_ARRAY: {
1934 return mixed_arr_parse(obj, elem->mixed_array.sub_descr,
1935 elem->mixed_array.sub_descr_len,
1936 field);
1937 }
1938 case JSON_TOK_FALSE:
1939 case JSON_TOK_TRUE: {
1940 bool *v = field;
1941
1942 *v = (value->type == JSON_TOK_TRUE);
1943 return 0;
1944 }
1945 case JSON_TOK_NUMBER: {
1946 int32_t *num32 = field;
1947
1948 return decode_int32(value, num32);
1949 }
1950 case JSON_TOK_INT: {
1951 return decode_int(value, field, elem->primitive.size);
1952 }
1953 case JSON_TOK_UINT: {
1954 return decode_uint(value, field, elem->primitive.size);
1955 }
1956 case JSON_TOK_INT64: {
1957 int64_t *num64 = field;
1958
1959 return decode_int64(value, num64);
1960 }
1961 case JSON_TOK_UINT64: {
1962 uint64_t *unum64 = field;
1963
1964 return decode_uint64(value, unum64);
1965 }
1966 case JSON_TOK_FLOAT_FP: {
1967 float *f_num = field;
1968
1969 return decode_float(value, f_num);
1970 }
1971 case JSON_TOK_DOUBLE_FP: {
1972 double *d_num = field;
1973
1974 return decode_double(value, d_num);
1975 }
1976 case JSON_TOK_STRING: {
1977 char **str_ptr = field;
1978
1979 *value->end = '\0';
1980 *str_ptr = value->start;
1981 return 0;
1982 }
1983 case JSON_TOK_STRING_BUF: {
1984 char *str_buf = field;
1985
1986 return decode_string_buf(value, str_buf, elem->primitive.size);
1987 }
1988 case JSON_TOK_OBJ_ARRAY: {
1989 struct json_obj_token *obj_token = field;
1990
1991 obj_token->start = value->start;
1992 return arr_data_parse(obj, obj_token);
1993 }
1994 case JSON_TOK_OPAQUE:
1995 case JSON_TOK_FLOAT: {
1996 struct json_obj_token *obj_token = field;
1997
1998 obj_token->start = value->start;
1999 obj_token->length = value->end - value->start;
2000 return 0;
2001 }
2002 case JSON_TOK_ENCODED_OBJ: {
2003 char **str_ptr = field;
2004
2005 return extract_raw_json_data(obj, value, str_ptr);
2006 }
2007 case JSON_TOK_NULL: {
2008 memset(field, 0, elem->primitive.size);
2009 return 0;
2010 }
2011 default:
2012 return -EINVAL;
2013 }
2014 }
2015
encode_mixed_value(const struct json_mixed_arr_descr * elem,void * field,void * val,json_append_bytes_t append_bytes,void * data)2016 static int encode_mixed_value(const struct json_mixed_arr_descr *elem,
2017 void *field, void *val,
2018 json_append_bytes_t append_bytes, void *data)
2019 {
2020
2021 switch (elem->type) {
2022 case JSON_TOK_OBJECT_START: {
2023 return json_obj_encode(elem->object.sub_descr,
2024 elem->object.sub_descr_len,
2025 field, append_bytes, data);
2026 }
2027 case JSON_TOK_ARRAY_START: {
2028 const struct json_obj_descr *actual_elem_descr = elem->array.element_descr;
2029
2030 if (actual_elem_descr->type == JSON_TOK_ARRAY_START) {
2031 actual_elem_descr = actual_elem_descr->array.element_descr;
2032 }
2033 return arr_encode(actual_elem_descr, field, val, append_bytes, data);
2034 }
2035 case JSON_TOK_MIXED_ARRAY: {
2036 return json_mixed_arr_encode(elem->mixed_array.sub_descr,
2037 elem->mixed_array.sub_descr_len,
2038 field, append_bytes, data);
2039 }
2040 case JSON_TOK_FALSE:
2041 case JSON_TOK_TRUE: {
2042 return bool_encode(field, append_bytes, data);
2043 }
2044 case JSON_TOK_STRING: {
2045 return str_encode(*((char **)field), append_bytes, data);
2046 }
2047 case JSON_TOK_STRING_BUF: {
2048 return str_encode(field, append_bytes, data);
2049 }
2050 case JSON_TOK_NUMBER: {
2051 return int32_encode(field, append_bytes, data);
2052 }
2053 case JSON_TOK_INT: {
2054 return int_encode(field, elem->primitive.size, append_bytes, data);
2055 }
2056 case JSON_TOK_UINT: {
2057 return uint_encode(field, elem->primitive.size, append_bytes, data);
2058 }
2059 case JSON_TOK_INT64: {
2060 return int64_encode(field, append_bytes, data);
2061 }
2062 case JSON_TOK_UINT64: {
2063 return uint64_encode(field, append_bytes, data);
2064 }
2065 case JSON_TOK_FLOAT_FP: {
2066 return float_encode(field, append_bytes, data);
2067 }
2068 case JSON_TOK_DOUBLE_FP: {
2069 return double_encode(field, append_bytes, data);
2070 }
2071 case JSON_TOK_FLOAT: {
2072 return float_ascii_encode(field, append_bytes, data);
2073 }
2074 case JSON_TOK_OPAQUE: {
2075 return opaque_string_encode(field, append_bytes, data);
2076 }
2077 case JSON_TOK_ENCODED_OBJ: {
2078 return encoded_obj_encode((const char **)field, append_bytes, data);
2079 }
2080 default:
2081 return -EINVAL;
2082 }
2083 }
2084
mixed_arr_parse(struct json_obj * arr,const struct json_mixed_arr_descr * descr,size_t descr_len,void * val)2085 static int mixed_arr_parse(struct json_obj *arr,
2086 const struct json_mixed_arr_descr *descr,
2087 size_t descr_len, void *val)
2088 {
2089 struct json_token tok;
2090 size_t elem_idx = 0;
2091 void *field_ptr;
2092 int ret;
2093
2094 if (descr_len == 0) {
2095 if (!arr_next(arr, &tok) && tok.type == JSON_TOK_ARRAY_END) {
2096 return 0;
2097 }
2098 return -EINVAL;
2099 }
2100
2101 while (!arr_next(arr, &tok)) {
2102 if (tok.type == JSON_TOK_ARRAY_END) {
2103 return elem_idx;
2104 }
2105
2106 if (elem_idx >= descr_len) {
2107 return -ENOSPC;
2108 }
2109
2110 switch (descr[elem_idx].type) {
2111 case JSON_TOK_OBJECT_START:
2112 field_ptr = (char *)val + descr[elem_idx].object.offset;
2113 break;
2114 case JSON_TOK_ARRAY_START:
2115 field_ptr = (char *)val + descr[elem_idx].array.offset;
2116 break;
2117 case JSON_TOK_MIXED_ARRAY:
2118 field_ptr = (char *)val + descr[elem_idx].mixed_array.offset;
2119 break;
2120 default:
2121 field_ptr = (char *)val + descr[elem_idx].primitive.offset;
2122 break;
2123 }
2124
2125 ret = decode_mixed_value(arr, &descr[elem_idx], &tok, field_ptr, val);
2126 if (ret < 0) {
2127 return ret;
2128 }
2129
2130 elem_idx++;
2131 }
2132
2133 return elem_idx;
2134 }
2135
json_mixed_arr_parse(char * json,size_t len,const struct json_mixed_arr_descr * descr,size_t descr_len,void * val)2136 int json_mixed_arr_parse(char *json, size_t len,
2137 const struct json_mixed_arr_descr *descr,
2138 size_t descr_len, void *val)
2139 {
2140 struct json_obj arr;
2141 int ret;
2142
2143 ret = arr_init(&arr, json, len);
2144 if (ret < 0) {
2145 return ret;
2146 }
2147
2148 return mixed_arr_parse(&arr, descr, descr_len, val);
2149 }
2150
json_mixed_arr_encode(const struct json_mixed_arr_descr * descr,size_t descr_len,void * val,json_append_bytes_t append_bytes,void * data)2151 int json_mixed_arr_encode(const struct json_mixed_arr_descr *descr,
2152 size_t descr_len, void *val,
2153 json_append_bytes_t append_bytes,
2154 void *data)
2155 {
2156 size_t *element_count;
2157 size_t i;
2158 int ret;
2159 void *field_ptr;
2160
2161 if (descr_len == 0) {
2162 return append_bytes("[]", 2, data);
2163 }
2164
2165 element_count = (size_t *)((char *)val + descr[0].count_offset);
2166
2167 ret = append_bytes("[", 1, data);
2168 if (ret < 0) {
2169 return ret;
2170 }
2171
2172 for (i = 0; i < *element_count && i < descr_len; i++) {
2173 switch (descr[i].type) {
2174 case JSON_TOK_OBJECT_START:
2175 field_ptr = (char *)val + descr[i].object.offset;
2176 break;
2177 case JSON_TOK_ARRAY_START:
2178 field_ptr = (char *)val + descr[i].array.offset;
2179 break;
2180 case JSON_TOK_MIXED_ARRAY:
2181 field_ptr = (char *)val + descr[i].mixed_array.offset;
2182 break;
2183 default:
2184 field_ptr = (char *)val + descr[i].primitive.offset;
2185 break;
2186 }
2187
2188 ret = encode_mixed_value(&descr[i], field_ptr, val, append_bytes, data);
2189 if (ret < 0) {
2190 return ret;
2191 }
2192
2193 if (i < *element_count - 1) {
2194 ret = append_bytes(",", 1, data);
2195 if (ret < 0) {
2196 return ret;
2197 }
2198 }
2199 }
2200
2201 return append_bytes("]", 1, data);
2202 }
2203
json_mixed_arr_encode_buf(const struct json_mixed_arr_descr * descr,size_t descr_len,void * val,char * buffer,size_t buf_size)2204 int json_mixed_arr_encode_buf(const struct json_mixed_arr_descr *descr,
2205 size_t descr_len, void *val,
2206 char *buffer, size_t buf_size)
2207 {
2208 struct appender appender = { .buffer = buffer, .size = buf_size };
2209
2210 return json_mixed_arr_encode(descr, descr_len, val, append_bytes_to_buf, &appender);
2211 }
2212
json_calc_mixed_arr_len(const struct json_mixed_arr_descr * descr,size_t descr_len,void * val)2213 ssize_t json_calc_mixed_arr_len(const struct json_mixed_arr_descr *descr,
2214 size_t descr_len, void *val)
2215 {
2216 ssize_t total = 0;
2217 int ret;
2218
2219 ret = json_mixed_arr_encode(descr, descr_len, val, measure_bytes, &total);
2220 if (ret < 0) {
2221 return ret;
2222 }
2223
2224 return total;
2225 }
2226