summaryrefslogtreecommitdiff
path: root/xs_json.h
diff options
context:
space:
mode:
authorGravatar default2023-08-21 09:32:05 +0200
committerGravatar default2023-08-21 09:32:05 +0200
commit3495c69b35d8d5ab49290cd26ffad20ac7c21dd2 (patch)
treeb176913e555cc78e421f83e7d94066dbedacc054 /xs_json.h
parentmastoapi: some tweaks for posts from lemmy. (diff)
downloadpenes-snac2-3495c69b35d8d5ab49290cd26ffad20ac7c21dd2.tar.gz
penes-snac2-3495c69b35d8d5ab49290cd26ffad20ac7c21dd2.tar.xz
penes-snac2-3495c69b35d8d5ab49290cd26ffad20ac7c21dd2.zip
Backport from xs.
Diffstat (limited to '')
-rw-r--r--xs_json.h54
1 files changed, 20 insertions, 34 deletions
diff --git a/xs_json.h b/xs_json.h
index 275b522..3df5d53 100644
--- a/xs_json.h
+++ b/xs_json.h
@@ -323,28 +323,24 @@ static xs_val *_xs_json_load_lexer(FILE *f, js_type *t)
323} 323}
324 324
325 325
326static xs_list *_xs_json_load_array(FILE *f, js_type *t); 326static xs_list *_xs_json_load_array(FILE *f);
327static xs_dict *_xs_json_load_object(FILE *f, js_type *t); 327static xs_dict *_xs_json_load_object(FILE *f);
328 328
329static xs_list *_xs_json_load_array(FILE *f, js_type *t) 329static xs_list *_xs_json_load_array(FILE *f)
330/* parses a JSON array */ 330/* parses a JSON array */
331{ 331{
332 xs_list *l = xs_list_new(); 332 xs_list *l = xs_list_new();
333 int c = 0; 333 int c = 0;
334 334
335 *t = JS_INCOMPLETE; 335 for (;;) {
336
337 while (*t == JS_INCOMPLETE) {
338 js_type tt; 336 js_type tt;
339 xs *v = _xs_json_load_lexer(f, &tt); 337 xs *v = _xs_json_load_lexer(f, &tt);
340 338
341 if (tt == JS_ERROR) 339 if (tt == JS_ERROR)
342 break; 340 break;
343 341
344 if (tt == JS_CBRACK) { 342 if (tt == JS_CBRACK)
345 *t = JS_ARRAY; 343 return l;
346 break;
347 }
348 344
349 if (c > 0) { 345 if (c > 0) {
350 if (tt == JS_COMMA) 346 if (tt == JS_COMMA)
@@ -354,26 +350,23 @@ static xs_list *_xs_json_load_array(FILE *f, js_type *t)
354 } 350 }
355 351
356 if (tt == JS_OBRACK) 352 if (tt == JS_OBRACK)
357 v = _xs_json_load_array(f, &tt); 353 v = _xs_json_load_array(f);
358 else 354 else
359 if (tt == JS_OCURLY) 355 if (tt == JS_OCURLY)
360 v = _xs_json_load_object(f, &tt); 356 v = _xs_json_load_object(f);
361 357
362 if (tt < JS_VALUE) 358 if (v == NULL)
363 break; 359 break;
364 360
365 l = xs_list_append(l, v); 361 l = xs_list_append(l, v);
366 c++; 362 c++;
367 } 363 }
368 364
369 if (*t == JS_INCOMPLETE || *t == JS_ERROR) 365 return xs_free(l);
370 l = xs_free(l);
371
372 return l;
373} 366}
374 367
375 368
376static xs_dict *_xs_json_load_object(FILE *f, js_type *t) 369static xs_dict *_xs_json_load_object(FILE *f)
377/* parses a JSON object */ 370/* parses a JSON object */
378{ 371{
379 xs_dict *d = xs_dict_new(); 372 xs_dict *d = xs_dict_new();
@@ -381,9 +374,7 @@ static xs_dict *_xs_json_load_object(FILE *f, js_type *t)
381 374
382 d = xs_dict_new(); 375 d = xs_dict_new();
383 376
384 *t = JS_INCOMPLETE; 377 for (;;) {
385
386 while (*t == JS_INCOMPLETE) {
387 js_type tt; 378 js_type tt;
388 xs *k = _xs_json_load_lexer(f, &tt); 379 xs *k = _xs_json_load_lexer(f, &tt);
389 xs *v = NULL; 380 xs *v = NULL;
@@ -391,10 +382,8 @@ static xs_dict *_xs_json_load_object(FILE *f, js_type *t)
391 if (tt == JS_ERROR) 382 if (tt == JS_ERROR)
392 break; 383 break;
393 384
394 if (tt == JS_CCURLY) { 385 if (tt == JS_CCURLY)
395 *t = JS_OBJECT; 386 return d;
396 break;
397 }
398 387
399 if (c > 0) { 388 if (c > 0) {
400 if (tt == JS_COMMA) 389 if (tt == JS_COMMA)
@@ -414,22 +403,19 @@ static xs_dict *_xs_json_load_object(FILE *f, js_type *t)
414 v = _xs_json_load_lexer(f, &tt); 403 v = _xs_json_load_lexer(f, &tt);
415 404
416 if (tt == JS_OBRACK) 405 if (tt == JS_OBRACK)
417 v = _xs_json_load_array(f, &tt); 406 v = _xs_json_load_array(f);
418 else 407 else
419 if (tt == JS_OCURLY) 408 if (tt == JS_OCURLY)
420 v = _xs_json_load_object(f, &tt); 409 v = _xs_json_load_object(f);
421 410
422 if (tt < JS_VALUE) 411 if (v == NULL)
423 break; 412 break;
424 413
425 d = xs_dict_append(d, k, v); 414 d = xs_dict_append(d, k, v);
426 c++; 415 c++;
427 } 416 }
428 417
429 if (*t == JS_INCOMPLETE || *t == JS_ERROR) 418 return xs_free(d);
430 d = xs_free(d);
431
432 return d;
433} 419}
434 420
435 421
@@ -457,10 +443,10 @@ xs_val *xs_json_load(FILE *f)
457 xs_free(_xs_json_load_lexer(f, &t)); 443 xs_free(_xs_json_load_lexer(f, &t));
458 444
459 if (t == JS_OBRACK) 445 if (t == JS_OBRACK)
460 v = _xs_json_load_array(f, &t); 446 v = _xs_json_load_array(f);
461 else 447 else
462 if (t == JS_OCURLY) 448 if (t == JS_OCURLY)
463 v = _xs_json_load_object(f, &t); 449 v = _xs_json_load_object(f);
464 450
465 return v; 451 return v;
466} 452}