diff options
author | Lamont Granquist <lamont@scriptkiddie.org> | 2013-12-08 23:36:50 -0800 |
---|---|---|
committer | Lamont Granquist <lamont@scriptkiddie.org> | 2013-12-08 23:36:50 -0800 |
commit | 0ce27f29202be406a41fce56d38d6da6c7715afd (patch) | |
tree | 2c5417be6e9858fbd53710f6f7c11bd5d95b2c53 /lib/ffi_yajl/ffi | |
parent | fadb3e607a15636c36c06db84b2e00559bc8bdff (diff) | |
download | ffi-yajl-0ce27f29202be406a41fce56d38d6da6c7715afd.tar.gz |
bignum parsing working
Diffstat (limited to 'lib/ffi_yajl/ffi')
-rw-r--r-- | lib/ffi_yajl/ffi/parser.rb | 14 |
1 files changed, 9 insertions, 5 deletions
diff --git a/lib/ffi_yajl/ffi/parser.rb b/lib/ffi_yajl/ffi/parser.rb index acfdafa..05fa11e 100644 --- a/lib/ffi_yajl/ffi/parser.rb +++ b/lib/ffi_yajl/ffi/parser.rb @@ -44,12 +44,16 @@ module FFI_Yajl ctx_mapping[ctx.get_ulong(0)].set_value(intval) 1 end - @double_callback = ::FFI::Function.new(:int, [:pointer, :double]) do |ctx, doubleval| - ctx_mapping[ctx.get_ulong(0)].set_value(doubleval) + @number_callback = ::FFI::Function.new(:int, [:pointer, :string, :size_t ]) do |ctx, stringval, stringlen| + s = stringval.slice(0,stringlen) + s.force_encoding('UTF-8') if defined? Encoding + # XXX: I can't think of a better way to do this right now. need to call to_f if and only if its a float. + v = ( s =~ /\./ ) ? s.to_f : s.to_i + ctx_mapping[ctx.get_ulong(0)].set_value(v) 1 end - @number_callback = ::FFI::Function.new(:int, [:pointer, :pointer, :size_t]) do |ctx, numberval, numberlen| - raise "NumberCallback: not implemented" + @double_callback = ::FFI::Function.new(:int, [:pointer, :double]) do |ctx, doubleval| + ctx_mapping[ctx.get_ulong(0)].set_value(doubleval) 1 end @string_callback = ::FFI::Function.new(:int, [:pointer, :string, :size_t]) do |ctx, stringval, stringlen| @@ -101,7 +105,7 @@ module FFI_Yajl callbacks[:yajl_boolean] = @boolean_callback callbacks[:yajl_integer] = @integer_callback callbacks[:yajl_double] = @double_callback - callbacks[:yajl_number] = nil #NumberCallback + callbacks[:yajl_number] = @number_callback callbacks[:yajl_string] = @string_callback callbacks[:yajl_start_map] = @start_map_callback callbacks[:yajl_map_key] = @map_key_callback |