Module: JsonScanner
- Defined in:
- lib/json_scanner.rb,
lib/json_scanner/version.rb,
ext/json_scanner/json_scanner.c
Defined Under Namespace
Classes: Error, ParseError
Constant Summary collapse
- VERSION =
"0.2.0"
- ANY_INDEX =
rb_range_new(INT2FIX(0), INT2FIX(-1), false)
Class Method Summary collapse
-
.scan(*args) ⇒ Object
allow_comments, dont_validate_strings, allow_trailing_garbage, allow_multiple_values, allow_partial_values.
Class Method Details
.scan(*args) ⇒ Object
allow_comments, dont_validate_strings, allow_trailing_garbage, allow_multiple_values, allow_partial_values
492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 |
# File 'ext/json_scanner/json_scanner.c', line 492
VALUE scan(int argc, VALUE *argv, VALUE self)
{
VALUE json_str, path_ary, with_path_flag, kwargs;
VALUE kwargs_values[7];
int with_path = false, verbose_error = false;
char *json_text;
size_t json_text_len;
yajl_handle handle;
yajl_status stat;
scan_ctx *ctx;
VALUE err = Qnil, result;
// Turned out callbacks can't raise exceptions
// VALUE callback_err;
#if RUBY_API_VERSION_MAJOR > 2 || (RUBY_API_VERSION_MAJOR == 2 && RUBY_API_VERSION_MINOR >= 7)
rb_scan_args_kw(RB_SCAN_ARGS_LAST_HASH_KEYWORDS, argc, argv, "21:", &json_str, &path_ary, &with_path_flag, &kwargs);
#else
rb_scan_args(argc, argv, "21:", &json_str, &path_ary, &with_path_flag, &kwargs);
#endif
// rb_io_write(rb_stderr, rb_sprintf("with_path_flag: %" PRIsVALUE " \n", with_path_flag));
with_path = RTEST(with_path_flag);
if (kwargs != Qnil)
{
rb_get_kwargs(kwargs, scan_kwargs_table, 0, 7, kwargs_values);
if (kwargs_values[0] != Qundef)
with_path = RTEST(kwargs_values[0]);
if (kwargs_values[1] != Qundef)
verbose_error = RTEST(kwargs_values[1]);
}
rb_check_type(json_str, T_STRING);
json_text = RSTRING_PTR(json_str);
#if LONG_MAX > SIZE_MAX
json_text_len = RSTRING_LENINT(json_str);
#else
json_text_len = RSTRING_LEN(json_str);
#endif
ctx = scan_ctx_init(path_ary, with_path);
handle = yajl_alloc(&scan_callbacks, NULL, (void *)ctx);
if (kwargs != Qnil) // it's safe to read kwargs_values only if rb_get_kwargs was called
{
if (kwargs_values[2] != Qundef)
yajl_config(handle, yajl_allow_comments, RTEST(kwargs_values[2]));
if (kwargs_values[3] != Qundef)
yajl_config(handle, yajl_dont_validate_strings, RTEST(kwargs_values[3]));
if (kwargs_values[4] != Qundef)
yajl_config(handle, yajl_allow_trailing_garbage, RTEST(kwargs_values[4]));
if (kwargs_values[5] != Qundef)
yajl_config(handle, yajl_allow_multiple_values, RTEST(kwargs_values[5]));
if (kwargs_values[6] != Qundef)
yajl_config(handle, yajl_allow_partial_values, RTEST(kwargs_values[6]));
}
ctx->handle = handle;
stat = yajl_parse(handle, (unsigned char *)json_text, json_text_len);
if (stat == yajl_status_ok)
stat = yajl_complete_parse(handle);
if (stat != yajl_status_ok)
{
char *str = (char *)yajl_get_error(handle, verbose_error, (unsigned char *)json_text, json_text_len);
err = rb_utf8_str_new_cstr(str);
yajl_free_error(handle, (unsigned char *)str);
}
// callback_err = ctx->rb_err;
result = ctx->points_list;
scan_ctx_free(ctx);
yajl_free(handle);
if (err != Qnil)
rb_exc_raise(rb_exc_new_str(rb_eJsonScannerParseError, err));
// if (callback_err != Qnil)
// rb_exc_raise(callback_err);
// TODO: report yajl_get_bytes_consumed(handle)
return result;
}
|