diff options
| -rw-r--r-- | xs_json.h | 171 | ||||
| -rw-r--r-- | xs_version.h | 2 |
2 files changed, 68 insertions, 105 deletions
| @@ -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) | |||
| 320 | static xs_list *_xs_json_load_array(FILE *f, js_type *t); | 326 | static xs_list *_xs_json_load_array(FILE *f, js_type *t); |
| 321 | static xs_dict *_xs_json_load_object(FILE *f, js_type *t); | 327 | static xs_dict *_xs_json_load_object(FILE *f, js_type *t); |
| 322 | 328 | ||
| 323 | static 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 | |||
| 341 | static xs_list *_xs_json_load_array(FILE *f, js_type *t) | 329 | static 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) | |||
| 394 | static xs_dict *_xs_json_load_object(FILE *f, js_type *t) | 376 | static 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 */ | ||