summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--xs_json.h171
-rw-r--r--xs_version.h2
2 files changed, 68 insertions, 105 deletions
diff --git a/xs_json.h b/xs_json.h
index 368e5d6..275b522 100644
--- a/xs_json.h
+++ b/xs_json.h
@@ -279,6 +279,9 @@ static xs_val *_xs_json_load_lexer(FILE *f, js_type *t)
279 v = xs_append_m(v, &cc, 1); 279 v = xs_append_m(v, &cc, 1);
280 } 280 }
281 } 281 }
282
283 if (c == EOF)
284 *t = JS_ERROR;
282 } 285 }
283 else 286 else
284 if (c == '-' || (c >= '0' && c <= '9') || c == '.') { 287 if (c == '-' || (c >= '0' && c <= '9') || c == '.') {
@@ -313,6 +316,9 @@ static xs_val *_xs_json_load_lexer(FILE *f, js_type *t)
313 } 316 }
314 } 317 }
315 318
319 if (*t == JS_ERROR)
320 v = xs_free(v);
321
316 return v; 322 return v;
317} 323}
318 324
@@ -320,71 +326,47 @@ static xs_val *_xs_json_load_lexer(FILE *f, js_type *t)
320static xs_list *_xs_json_load_array(FILE *f, js_type *t); 326static xs_list *_xs_json_load_array(FILE *f, js_type *t);
321static xs_dict *_xs_json_load_object(FILE *f, js_type *t); 327static xs_dict *_xs_json_load_object(FILE *f, js_type *t);
322 328
323static xs_val *_xs_json_load_value(FILE *f, js_type *t, xs_val *v)
324/* parses a JSON value */
325{
326 if (*t == JS_OBRACK)
327 v = _xs_json_load_array(f, t);
328 else
329 if (*t == JS_OCURLY)
330 v = _xs_json_load_object(f, t);
331
332 if (*t >= JS_VALUE)
333 *t = JS_VALUE;
334 else
335 *t = JS_ERROR;
336
337 return v;
338}
339
340
341static xs_list *_xs_json_load_array(FILE *f, js_type *t) 329static xs_list *_xs_json_load_array(FILE *f, js_type *t)
342/* parses a JSON array */ 330/* parses a JSON array */
343{ 331{
344 xs *v; 332 xs_list *l = xs_list_new();
345 xs_list *l; 333 int c = 0;
346 js_type tt;
347
348 l = xs_list_new();
349 334
350 *t = JS_INCOMPLETE; 335 *t = JS_INCOMPLETE;
351 336
352 v = _xs_json_load_lexer(f, &tt); 337 while (*t == JS_INCOMPLETE) {
338 js_type tt;
339 xs *v = _xs_json_load_lexer(f, &tt);
353 340
354 if (tt == JS_CBRACK) 341 if (tt == JS_ERROR)
355 *t = JS_ARRAY; 342 break;
356 else {
357 v = _xs_json_load_value(f, &tt, v);
358 343
359 if (tt == JS_VALUE) { 344 if (tt == JS_CBRACK) {
360 l = xs_list_append(l, v); 345 *t = JS_ARRAY;
346 break;
347 }
361 348
362 while (*t == JS_INCOMPLETE) { 349 if (c > 0) {
363 xs_free(_xs_json_load_lexer(f, &tt)); 350 if (tt == JS_COMMA)
351 v = _xs_json_load_lexer(f, &tt);
352 else
353 break;
354 }
364 355
365 if (tt == JS_CBRACK) 356 if (tt == JS_OBRACK)
366 *t = JS_ARRAY; 357 v = _xs_json_load_array(f, &tt);
367 else 358 else
368 if (tt == JS_COMMA) { 359 if (tt == JS_OCURLY)
369 xs *v2; 360 v = _xs_json_load_object(f, &tt);
370 361
371 v2 = _xs_json_load_lexer(f, &tt); 362 if (tt < JS_VALUE)
372 v2 = _xs_json_load_value(f, &tt, v2); 363 break;
373 364
374 if (tt == JS_VALUE) 365 l = xs_list_append(l, v);
375 l = xs_list_append(l, v2); 366 c++;
376 else
377 *t = JS_ERROR;
378 }
379 else
380 *t = JS_ERROR;
381 }
382 }
383 else
384 *t = JS_ERROR;
385 } 367 }
386 368
387 if (*t == JS_ERROR) 369 if (*t == JS_INCOMPLETE || *t == JS_ERROR)
388 l = xs_free(l); 370 l = xs_free(l);
389 371
390 return l; 372 return l;
@@ -394,74 +376,57 @@ static xs_list *_xs_json_load_array(FILE *f, js_type *t)
394static xs_dict *_xs_json_load_object(FILE *f, js_type *t) 376static xs_dict *_xs_json_load_object(FILE *f, js_type *t)
395/* parses a JSON object */ 377/* parses a JSON object */
396{ 378{
397 xs *k1; 379 xs_dict *d = xs_dict_new();
398 xs_dict *d; 380 int c = 0;
399 js_type tt;
400 381
401 d = xs_dict_new(); 382 d = xs_dict_new();
402 383
403 *t = JS_INCOMPLETE; 384 *t = JS_INCOMPLETE;
404 385
405 k1 = _xs_json_load_lexer(f, &tt); 386 while (*t == JS_INCOMPLETE) {
387 js_type tt;
388 xs *k = _xs_json_load_lexer(f, &tt);
389 xs *v = NULL;
406 390
407 if (tt == JS_CCURLY) 391 if (tt == JS_ERROR)
408 *t = JS_OBJECT; 392 break;
409 else
410 if (tt == JS_STRING) {
411 xs_free(_xs_json_load_lexer(f, &tt));
412 393
413 if (tt == JS_COLON) { 394 if (tt == JS_CCURLY) {
414 xs *v1; 395 *t = JS_OBJECT;
396 break;
397 }
415 398
416 v1 = _xs_json_load_lexer(f, &tt); 399 if (c > 0) {
417 v1 = _xs_json_load_value(f, &tt, v1); 400 if (tt == JS_COMMA)
401 k = _xs_json_load_lexer(f, &tt);
402 else
403 break;
404 }
418 405
419 if (tt == JS_VALUE) { 406 if (tt != JS_STRING)
420 d = xs_dict_append(d, k1, v1); 407 break;
421 408
422 while (*t == JS_INCOMPLETE) { 409 xs_free(_xs_json_load_lexer(f, &tt));
423 xs_free(_xs_json_load_lexer(f, &tt));
424 410
425 if (tt == JS_CCURLY) 411 if (tt != JS_COLON)
426 *t = JS_OBJECT; 412 break;
427 else
428 if (tt == JS_COMMA) {
429 xs *k = _xs_json_load_lexer(f, &tt);
430 413
431 if (tt == JS_STRING) { 414 v = _xs_json_load_lexer(f, &tt);
432 xs_free(_xs_json_load_lexer(f, &tt));
433 415
434 if (tt == JS_COLON) { 416 if (tt == JS_OBRACK)
435 xs *v; 417 v = _xs_json_load_array(f, &tt);
418 else
419 if (tt == JS_OCURLY)
420 v = _xs_json_load_object(f, &tt);
436 421
437 v = _xs_json_load_lexer(f, &tt); 422 if (tt < JS_VALUE)
438 v = _xs_json_load_value(f, &tt, v); 423 break;
439 424
440 if (tt == JS_VALUE) 425 d = xs_dict_append(d, k, v);
441 d = xs_dict_append(d, k, v); 426 c++;
442 else
443 *t = JS_ERROR;
444 }
445 else
446 *t = JS_ERROR;
447 }
448 else
449 *t = JS_ERROR;
450 }
451 else
452 *t = JS_ERROR;
453 }
454 }
455 else
456 *t = JS_ERROR;
457 }
458 else
459 *t = JS_ERROR;
460 } 427 }
461 else
462 *t = JS_ERROR;
463 428
464 if (*t == JS_ERROR) 429 if (*t == JS_INCOMPLETE || *t == JS_ERROR)
465 d = xs_free(d); 430 d = xs_free(d);
466 431
467 return d; 432 return d;
@@ -496,8 +461,6 @@ xs_val *xs_json_load(FILE *f)
496 else 461 else
497 if (t == JS_OCURLY) 462 if (t == JS_OCURLY)
498 v = _xs_json_load_object(f, &t); 463 v = _xs_json_load_object(f, &t);
499 else
500 t = JS_ERROR;
501 464
502 return v; 465 return v;
503} 466}
diff --git a/xs_version.h b/xs_version.h
index 1cc950c..1a7656a 100644
--- a/xs_version.h
+++ b/xs_version.h
@@ -1 +1 @@
/* 246a8bc9941850f68bf9034662a8a96bcd33926d */ /* 59b0a9da6a6b6258ab003ab71d790d2879cd2e31 */