diff options
Diffstat (limited to 'xs_json.h')
| -rw-r--r-- | xs_json.h | 54 |
1 files changed, 20 insertions, 34 deletions
| @@ -323,28 +323,24 @@ static xs_val *_xs_json_load_lexer(FILE *f, js_type *t) | |||
| 323 | } | 323 | } |
| 324 | 324 | ||
| 325 | 325 | ||
| 326 | static xs_list *_xs_json_load_array(FILE *f, js_type *t); | 326 | static xs_list *_xs_json_load_array(FILE *f); |
| 327 | static xs_dict *_xs_json_load_object(FILE *f, js_type *t); | 327 | static xs_dict *_xs_json_load_object(FILE *f); |
| 328 | 328 | ||
| 329 | static xs_list *_xs_json_load_array(FILE *f, js_type *t) | 329 | static 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 | ||
| 376 | static xs_dict *_xs_json_load_object(FILE *f, js_type *t) | 369 | static 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 | } |