commit b5cab5b
default
·
2023-08-12 06:37:31 +0000 UTC
parent 70b0146
Backport from xs.
2 files changed,
+68,
-105
+67,
-104
1@@ -279,6 +279,9 @@ static xs_val *_xs_json_load_lexer(FILE *f, js_type *t)
2 v = xs_append_m(v, &cc, 1);
3 }
4 }
5+
6+ if (c == EOF)
7+ *t = JS_ERROR;
8 }
9 else
10 if (c == '-' || (c >= '0' && c <= '9') || c == '.') {
11@@ -313,6 +316,9 @@ static xs_val *_xs_json_load_lexer(FILE *f, js_type *t)
12 }
13 }
14
15+ if (*t == JS_ERROR)
16+ v = xs_free(v);
17+
18 return v;
19 }
20
21@@ -320,71 +326,47 @@ static xs_val *_xs_json_load_lexer(FILE *f, js_type *t)
22 static xs_list *_xs_json_load_array(FILE *f, js_type *t);
23 static xs_dict *_xs_json_load_object(FILE *f, js_type *t);
24
25-static xs_val *_xs_json_load_value(FILE *f, js_type *t, xs_val *v)
26-/* parses a JSON value */
27-{
28- if (*t == JS_OBRACK)
29- v = _xs_json_load_array(f, t);
30- else
31- if (*t == JS_OCURLY)
32- v = _xs_json_load_object(f, t);
33-
34- if (*t >= JS_VALUE)
35- *t = JS_VALUE;
36- else
37- *t = JS_ERROR;
38-
39- return v;
40-}
41-
42-
43 static xs_list *_xs_json_load_array(FILE *f, js_type *t)
44 /* parses a JSON array */
45 {
46- xs *v;
47- xs_list *l;
48- js_type tt;
49-
50- l = xs_list_new();
51+ xs_list *l = xs_list_new();
52+ int c = 0;
53
54 *t = JS_INCOMPLETE;
55
56- v = _xs_json_load_lexer(f, &tt);
57+ while (*t == JS_INCOMPLETE) {
58+ js_type tt;
59+ xs *v = _xs_json_load_lexer(f, &tt);
60
61- if (tt == JS_CBRACK)
62- *t = JS_ARRAY;
63- else {
64- v = _xs_json_load_value(f, &tt, v);
65+ if (tt == JS_ERROR)
66+ break;
67
68- if (tt == JS_VALUE) {
69- l = xs_list_append(l, v);
70+ if (tt == JS_CBRACK) {
71+ *t = JS_ARRAY;
72+ break;
73+ }
74
75- while (*t == JS_INCOMPLETE) {
76- xs_free(_xs_json_load_lexer(f, &tt));
77+ if (c > 0) {
78+ if (tt == JS_COMMA)
79+ v = _xs_json_load_lexer(f, &tt);
80+ else
81+ break;
82+ }
83
84- if (tt == JS_CBRACK)
85- *t = JS_ARRAY;
86- else
87- if (tt == JS_COMMA) {
88- xs *v2;
89+ if (tt == JS_OBRACK)
90+ v = _xs_json_load_array(f, &tt);
91+ else
92+ if (tt == JS_OCURLY)
93+ v = _xs_json_load_object(f, &tt);
94
95- v2 = _xs_json_load_lexer(f, &tt);
96- v2 = _xs_json_load_value(f, &tt, v2);
97+ if (tt < JS_VALUE)
98+ break;
99
100- if (tt == JS_VALUE)
101- l = xs_list_append(l, v2);
102- else
103- *t = JS_ERROR;
104- }
105- else
106- *t = JS_ERROR;
107- }
108- }
109- else
110- *t = JS_ERROR;
111+ l = xs_list_append(l, v);
112+ c++;
113 }
114
115- if (*t == JS_ERROR)
116+ if (*t == JS_INCOMPLETE || *t == JS_ERROR)
117 l = xs_free(l);
118
119 return l;
120@@ -394,74 +376,57 @@ static xs_list *_xs_json_load_array(FILE *f, js_type *t)
121 static xs_dict *_xs_json_load_object(FILE *f, js_type *t)
122 /* parses a JSON object */
123 {
124- xs *k1;
125- xs_dict *d;
126- js_type tt;
127+ xs_dict *d = xs_dict_new();
128+ int c = 0;
129
130 d = xs_dict_new();
131
132 *t = JS_INCOMPLETE;
133
134- k1 = _xs_json_load_lexer(f, &tt);
135+ while (*t == JS_INCOMPLETE) {
136+ js_type tt;
137+ xs *k = _xs_json_load_lexer(f, &tt);
138+ xs *v = NULL;
139
140- if (tt == JS_CCURLY)
141- *t = JS_OBJECT;
142- else
143- if (tt == JS_STRING) {
144- xs_free(_xs_json_load_lexer(f, &tt));
145+ if (tt == JS_ERROR)
146+ break;
147
148- if (tt == JS_COLON) {
149- xs *v1;
150+ if (tt == JS_CCURLY) {
151+ *t = JS_OBJECT;
152+ break;
153+ }
154
155- v1 = _xs_json_load_lexer(f, &tt);
156- v1 = _xs_json_load_value(f, &tt, v1);
157+ if (c > 0) {
158+ if (tt == JS_COMMA)
159+ k = _xs_json_load_lexer(f, &tt);
160+ else
161+ break;
162+ }
163
164- if (tt == JS_VALUE) {
165- d = xs_dict_append(d, k1, v1);
166+ if (tt != JS_STRING)
167+ break;
168
169- while (*t == JS_INCOMPLETE) {
170- xs_free(_xs_json_load_lexer(f, &tt));
171+ xs_free(_xs_json_load_lexer(f, &tt));
172
173- if (tt == JS_CCURLY)
174- *t = JS_OBJECT;
175- else
176- if (tt == JS_COMMA) {
177- xs *k = _xs_json_load_lexer(f, &tt);
178+ if (tt != JS_COLON)
179+ break;
180
181- if (tt == JS_STRING) {
182- xs_free(_xs_json_load_lexer(f, &tt));
183+ v = _xs_json_load_lexer(f, &tt);
184
185- if (tt == JS_COLON) {
186- xs *v;
187+ if (tt == JS_OBRACK)
188+ v = _xs_json_load_array(f, &tt);
189+ else
190+ if (tt == JS_OCURLY)
191+ v = _xs_json_load_object(f, &tt);
192
193- v = _xs_json_load_lexer(f, &tt);
194- v = _xs_json_load_value(f, &tt, v);
195+ if (tt < JS_VALUE)
196+ break;
197
198- if (tt == JS_VALUE)
199- d = xs_dict_append(d, k, v);
200- else
201- *t = JS_ERROR;
202- }
203- else
204- *t = JS_ERROR;
205- }
206- else
207- *t = JS_ERROR;
208- }
209- else
210- *t = JS_ERROR;
211- }
212- }
213- else
214- *t = JS_ERROR;
215- }
216- else
217- *t = JS_ERROR;
218+ d = xs_dict_append(d, k, v);
219+ c++;
220 }
221- else
222- *t = JS_ERROR;
223
224- if (*t == JS_ERROR)
225+ if (*t == JS_INCOMPLETE || *t == JS_ERROR)
226 d = xs_free(d);
227
228 return d;
229@@ -496,8 +461,6 @@ xs_val *xs_json_load(FILE *f)
230 else
231 if (t == JS_OCURLY)
232 v = _xs_json_load_object(f, &t);
233- else
234- t = JS_ERROR;
235
236 return v;
237 }
+1,
-1
1@@ -1 +1 @@
2-/* 246a8bc9941850f68bf9034662a8a96bcd33926d */
3+/* 59b0a9da6a6b6258ab003ab71d790d2879cd2e31 */