Skip to content

Commit 3266c00

Browse files
committed
Optimize code structure.
1 parent 11f2b50 commit 3266c00

File tree

1 file changed

+144
-147
lines changed

1 file changed

+144
-147
lines changed

json_parser.c

Lines changed: 144 additions & 147 deletions
Original file line numberDiff line numberDiff line change
@@ -52,28 +52,6 @@ struct __json_element
5252
typedef struct __json_member json_member_t;
5353
typedef 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-
7755
static 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+
451451
static int __parse_json_value(const char *cursor, const char **end,
452452
int depth, json_value_t *val);
453453

454454
static 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+
456555
static 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

459576
static 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-
736754
static 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-
775772
static void __move_json_value(json_value_t *src, json_value_t *dest)
776773
{
777774
switch (src->type)

0 commit comments

Comments
 (0)