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 */