@@ -52,28 +52,6 @@ struct __json_element
5252typedef struct __json_member json_member_t ;
5353typedef struct __json_element json_element_t ;
5454
55- static void __insert_json_member (json_member_t * memb , struct list_head * pos ,
56- json_object_t * obj )
57- {
58- struct rb_node * * p = & obj -> root .rb_node ;
59- struct rb_node * parent = NULL ;
60- json_member_t * entry ;
61-
62- while (* p )
63- {
64- parent = * p ;
65- entry = rb_entry (* p , json_member_t , rb );
66- if (strcmp (memb -> name , entry -> name ) < 0 )
67- p = & (* p )-> rb_left ;
68- else
69- p = & (* p )-> rb_right ;
70- }
71-
72- rb_link_node (& memb -> rb , parent , p );
73- rb_insert_color (& memb -> rb , & obj -> root );
74- list_add (& memb -> list , pos );
75- }
76-
7755static int __json_string_length (const char * cursor )
7856{
7957 int len = 0 ;
@@ -122,7 +100,7 @@ static int __parse_json_hex4(const char *cursor, const char **end,
122100
123101 * code = (* code << 4 ) + hex ;
124102 cursor ++ ;
125- }
103+ }
126104
127105 * end = cursor ;
128106 return 0 ;
@@ -157,7 +135,7 @@ static int __parse_json_unicode(const char *cursor, const char **end,
157135 if (ret < 0 )
158136 return ret ;
159137
160- if (next < 0xdc00 || next > 0xdfff )
138+ if (next < 0xdc00 || next > 0xdfff )
161139 return -2 ;
162140
163141 code = (((code & 0x3ff ) << 10 ) | (next & 0x3ff )) + 0x10000 ;
@@ -174,9 +152,9 @@ static int __parse_json_unicode(const char *cursor, const char **end,
174152 utf8 [1 ] = 0x80 | (code & 0x3f );
175153 return 2 ;
176154 }
177- else if (code <= 0xffff )
155+ else if (code <= 0xffff )
178156 {
179- utf8 [0 ] = 0xe0 | (code >> 12 );
157+ utf8 [0 ] = 0xe0 | (code >> 12 );
180158 utf8 [1 ] = 0x80 | ((code >> 6 ) & 0x3f );
181159 utf8 [2 ] = 0x80 | (code & 0x3f );
182160 return 3 ;
@@ -448,13 +426,152 @@ static int __parse_json_number(const char *cursor, const char **end,
448426 return 0 ;
449427}
450428
429+ static void __insert_json_member (json_member_t * memb , struct list_head * pos ,
430+ json_object_t * obj )
431+ {
432+ struct rb_node * * p = & obj -> root .rb_node ;
433+ struct rb_node * parent = NULL ;
434+ json_member_t * entry ;
435+
436+ while (* p )
437+ {
438+ parent = * p ;
439+ entry = rb_entry (* p , json_member_t , rb );
440+ if (strcmp (memb -> name , entry -> name ) < 0 )
441+ p = & (* p )-> rb_left ;
442+ else
443+ p = & (* p )-> rb_right ;
444+ }
445+
446+ rb_link_node (& memb -> rb , parent , p );
447+ rb_insert_color (& memb -> rb , & obj -> root );
448+ list_add (& memb -> list , pos );
449+ }
450+
451451static int __parse_json_value (const char * cursor , const char * * end ,
452452 int depth , json_value_t * val );
453453
454454static void __destroy_json_value (json_value_t * val );
455455
456+ static int __parse_json_member (const char * cursor , const char * * end ,
457+ int depth , json_member_t * memb )
458+ {
459+ int ret ;
460+
461+ ret = __parse_json_string (cursor , & cursor , memb -> name );
462+ if (ret < 0 )
463+ return ret ;
464+
465+ while (isspace (* cursor ))
466+ cursor ++ ;
467+
468+ if (* cursor != ':' )
469+ return -2 ;
470+
471+ cursor ++ ;
472+ while (isspace (* cursor ))
473+ cursor ++ ;
474+
475+ ret = __parse_json_value (cursor , & cursor , depth , & memb -> value );
476+ if (ret < 0 )
477+ return ret ;
478+
479+ * end = cursor ;
480+ return 0 ;
481+ }
482+
483+ static int __parse_json_members (const char * cursor , const char * * end ,
484+ int depth , json_object_t * obj )
485+ {
486+ json_member_t * memb ;
487+ int cnt = 0 ;
488+ int ret ;
489+
490+ while (isspace (* cursor ))
491+ cursor ++ ;
492+
493+ if (* cursor == '}' )
494+ {
495+ * end = cursor + 1 ;
496+ return 0 ;
497+ }
498+
499+ while (1 )
500+ {
501+ if (* cursor != '\"' )
502+ return -2 ;
503+
504+ cursor ++ ;
505+ ret = __json_string_length (cursor );
506+ if (ret < 0 )
507+ return ret ;
508+
509+ memb = (json_member_t * )malloc (offsetof(json_member_t , name ) + ret + 1 );
510+ if (!memb )
511+ return -1 ;
512+
513+ ret = __parse_json_member (cursor , & cursor , depth , memb );
514+ if (ret < 0 )
515+ {
516+ free (memb );
517+ return ret ;
518+ }
519+
520+ __insert_json_member (memb , obj -> head .prev , obj );
521+ cnt ++ ;
522+
523+ while (isspace (* cursor ))
524+ cursor ++ ;
525+
526+ if (* cursor == ',' )
527+ {
528+ cursor ++ ;
529+ while (isspace (* cursor ))
530+ cursor ++ ;
531+ }
532+ else if (* cursor == '}' )
533+ break ;
534+ else
535+ return -2 ;
536+ }
537+
538+ * end = cursor + 1 ;
539+ return cnt ;
540+ }
541+
542+ static void __destroy_json_members (json_object_t * obj )
543+ {
544+ struct list_head * pos , * tmp ;
545+ json_member_t * memb ;
546+
547+ list_for_each_safe (pos , tmp , & obj -> head )
548+ {
549+ memb = list_entry (pos , json_member_t , list );
550+ __destroy_json_value (& memb -> value );
551+ free (memb );
552+ }
553+ }
554+
456555static int __parse_json_object (const char * cursor , const char * * end ,
457- int depth , json_object_t * obj );
556+ int depth , json_object_t * obj )
557+ {
558+ int ret ;
559+
560+ if (depth == JSON_DEPTH_LIMIT )
561+ return -3 ;
562+
563+ INIT_LIST_HEAD (& obj -> head );
564+ obj -> root .rb_node = NULL ;
565+ ret = __parse_json_members (cursor , end , depth + 1 , obj );
566+ if (ret < 0 )
567+ {
568+ __destroy_json_members (obj );
569+ return ret ;
570+ }
571+
572+ obj -> size = ret ;
573+ return 0 ;
574+ }
458575
459576static int __parse_json_elements (const char * cursor , const char * * end ,
460577 int depth , json_array_t * arr )
@@ -634,105 +751,6 @@ static int __parse_json_value(const char *cursor, const char **end,
634751 return 0 ;
635752}
636753
637- static int __parse_json_member (const char * cursor , const char * * end ,
638- int depth , json_member_t * memb )
639- {
640- int ret ;
641-
642- ret = __parse_json_string (cursor , & cursor , memb -> name );
643- if (ret < 0 )
644- return ret ;
645-
646- while (isspace (* cursor ))
647- cursor ++ ;
648-
649- if (* cursor != ':' )
650- return -2 ;
651-
652- cursor ++ ;
653- while (isspace (* cursor ))
654- cursor ++ ;
655-
656- ret = __parse_json_value (cursor , & cursor , depth , & memb -> value );
657- if (ret < 0 )
658- return ret ;
659-
660- * end = cursor ;
661- return 0 ;
662- }
663-
664- static int __parse_json_members (const char * cursor , const char * * end ,
665- int depth , json_object_t * obj )
666- {
667- json_member_t * memb ;
668- int cnt = 0 ;
669- int ret ;
670-
671- while (isspace (* cursor ))
672- cursor ++ ;
673-
674- if (* cursor == '}' )
675- {
676- * end = cursor + 1 ;
677- return 0 ;
678- }
679-
680- while (1 )
681- {
682- if (* cursor != '\"' )
683- return -2 ;
684-
685- cursor ++ ;
686- ret = __json_string_length (cursor );
687- if (ret < 0 )
688- return ret ;
689-
690- memb = (json_member_t * )malloc (offsetof(json_member_t , name ) + ret + 1 );
691- if (!memb )
692- return -1 ;
693-
694- ret = __parse_json_member (cursor , & cursor , depth , memb );
695- if (ret < 0 )
696- {
697- free (memb );
698- return ret ;
699- }
700-
701- __insert_json_member (memb , obj -> head .prev , obj );
702- cnt ++ ;
703-
704- while (isspace (* cursor ))
705- cursor ++ ;
706-
707- if (* cursor == ',' )
708- {
709- cursor ++ ;
710- while (isspace (* cursor ))
711- cursor ++ ;
712- }
713- else if (* cursor == '}' )
714- break ;
715- else
716- return -2 ;
717- }
718-
719- * end = cursor + 1 ;
720- return cnt ;
721- }
722-
723- static void __destroy_json_members (json_object_t * obj )
724- {
725- struct list_head * pos , * tmp ;
726- json_member_t * memb ;
727-
728- list_for_each_safe (pos , tmp , & obj -> head )
729- {
730- memb = list_entry (pos , json_member_t , list );
731- __destroy_json_value (& memb -> value );
732- free (memb );
733- }
734- }
735-
736754static void __destroy_json_value (json_value_t * val )
737755{
738756 switch (val -> type )
@@ -751,27 +769,6 @@ static void __destroy_json_value(json_value_t *val)
751769 }
752770}
753771
754- static int __parse_json_object (const char * cursor , const char * * end ,
755- int depth , json_object_t * obj )
756- {
757- int ret ;
758-
759- if (depth == JSON_DEPTH_LIMIT )
760- return -3 ;
761-
762- INIT_LIST_HEAD (& obj -> head );
763- obj -> root .rb_node = NULL ;
764- ret = __parse_json_members (cursor , end , depth + 1 , obj );
765- if (ret < 0 )
766- {
767- __destroy_json_members (obj );
768- return ret ;
769- }
770-
771- obj -> size = ret ;
772- return 0 ;
773- }
774-
775772static void __move_json_value (json_value_t * src , json_value_t * dest )
776773{
777774 switch (src -> type )
0 commit comments