diff options
author | Lamont Granquist <lamont@scriptkiddie.org> | 2013-12-16 16:14:56 -0800 |
---|---|---|
committer | Lamont Granquist <lamont@scriptkiddie.org> | 2013-12-16 16:14:56 -0800 |
commit | 6aa65ed7c16f9dc43835916cdabebae2085f0e62 (patch) | |
tree | 38e0faffcb3f2492b7992ab6cf6f5374c9323909 /lib | |
parent | 47037d045b5fd5c09992e07d66e8bb8d71d9c150 (diff) | |
download | ffi-yajl-6aa65ed7c16f9dc43835916cdabebae2085f0e62.tar.gz |
code rearrangement
Diffstat (limited to 'lib')
-rw-r--r-- | lib/ffi_yajl.rb | 113 | ||||
-rw-r--r-- | lib/ffi_yajl/encoder.rb | 12 | ||||
-rw-r--r-- | lib/ffi_yajl/ext.rb | 3 | ||||
-rw-r--r-- | lib/ffi_yajl/ffi.rb | 119 | ||||
-rw-r--r-- | lib/ffi_yajl/ffi/encoder.rb | 3 | ||||
-rw-r--r-- | lib/ffi_yajl/parser.rb | 11 |
6 files changed, 133 insertions, 128 deletions
diff --git a/lib/ffi_yajl.rb b/lib/ffi_yajl.rb index d5827bc..0f906b6 100644 --- a/lib/ffi_yajl.rb +++ b/lib/ffi_yajl.rb @@ -1,5 +1,4 @@ require 'rubygems' -require 'ffi' require 'ffi_yajl/encoder' require 'ffi_yajl/parser' @@ -9,115 +8,3 @@ module FFI_Yajl class EncodeError < StandardError; end end -module FFI_Yajl - extend ::FFI::Library - - libname = ::FFI.map_library_name("yajl") - libpath = File.join(File.dirname(__FILE__), libname) - - if File.file?(libpath) - # use our vendored version of libyajl2 if we find it installed - ffi_lib libpath - else - ffi_lib 'yajl' - end - - class YajlCallbacks < ::FFI::Struct - layout :yajl_null, :pointer, - :yajl_boolean, :pointer, - :yajl_integer, :pointer, - :yajl_double, :pointer, - :yajl_number, :pointer, - :yajl_string, :pointer, - :yajl_start_map, :pointer, - :yajl_map_key, :pointer, - :yajl_end_map, :pointer, - :yajl_start_array, :pointer, - :yajl_end_array, :pointer - end - - enum :yajl_status, [ - :yajl_status_ok, - :yajl_status_client_canceled, - :yajl_status_insufficient_data, - :yajl_status_error, - ] - -# FFI::Enums are slow, should remove the rest -# enum :yajl_gen_status, [ -# :yajl_gen_status_ok, -# :yajl_gen_keys_must_be_strings, -# :yajl_max_depth_exceeded, -# :yajl_gen_in_error_state, -# :yajl_gen_generation_complete, -# :yajl_gen_invalid_number, -# :yajl_gen_no_buf, -# ] - - enum :yajl_option, [ - :yajl_allow_comments, 0x01, - :yajl_dont_validate_strings, 0x02, - :yajl_allow_trailing_garbage, 0x04, - :yajl_allow_multiple_values, 0x08, - :yajl_allow_partial_values, 0x10, - ] - - enum :yajl_gen_option, [ - :yajl_gen_beautify, 0x01, - :yajl_gen_indent_string, 0x02, - :yajl_gen_print_callback, 0x04, - :yajl_gen_validate_utf8, 0x08, - ] - - typedef :pointer, :yajl_handle - typedef :pointer, :yajl_gen - - # yajl uses unsinged char *'s consistently - typedef :pointer, :ustring_pointer - typedef :string, :ustring - - # const char *yajl_status_to_string (yajl_status code) - attach_function :yajl_status_to_string, [ :yajl_status ], :string - # yajl_handle yajl_alloc(const yajl_callbacks * callbacks, yajl_alloc_funcs * afs, void * ctx) - attach_function :yajl_alloc, [:pointer, :pointer, :pointer], :yajl_handle - # void yajl_free (yajl_handle handle) - attach_function :yajl_free, [:yajl_handle], :void - # yajl_status yajl_parse (yajl_handle hand, const unsigned char *jsonText, unsigned int jsonTextLength) - attach_function :yajl_parse, [:yajl_handle, :ustring, :uint], :yajl_status - # yajl_status yajl_parse_complete (yajl_handle hand) - attach_function :yajl_complete_parse, [:yajl_handle], :yajl_status - # unsigned char *yajl_get_error (yajl_handle hand, int verbose, const unsigned char *jsonText, unsigned int jsonTextLength) - attach_function :yajl_get_error, [:yajl_handle, :int, :ustring, :int], :ustring - # void yajl_free_error (yajl_handle hand, unsigned char *str) - attach_function :yajl_free_error, [:yajl_handle, :ustring], :void - - # - attach_function :yajl_config, [:yajl_handle, :yajl_option, :int], :int - - attach_function :yajl_gen_config, [:yajl_gen, :yajl_gen_option, :varargs], :int - - # yajl_gen yajl_gen_alloc (const yajl_alloc_funcs *allocFuncs) - attach_function :yajl_gen_alloc, [:pointer], :yajl_gen - # yajl_gen yajl_gen_alloc2 (const yajl_print_t callback, const yajl_gen_config *config, const yajl_alloc_funcs *allocFuncs, void *ctx) - # attach_function :yajl_gen_alloc2, [:pointer, :pointer, :pointer, :pointer], :yajl_gen - # void yajl_gen_free (yajl_gen handle) - attach_function :yajl_gen_free, [:yajl_gen], :void - - attach_function :yajl_gen_integer, [:yajl_gen, :long_long], :int - attach_function :yajl_gen_double, [:yajl_gen, :double], :int - attach_function :yajl_gen_number, [:yajl_gen, :ustring, :int], :int - attach_function :yajl_gen_string, [:yajl_gen, :ustring, :int], :int - attach_function :yajl_gen_null, [:yajl_gen], :int - attach_function :yajl_gen_bool, [:yajl_gen, :int], :int - attach_function :yajl_gen_map_open, [:yajl_gen], :int - attach_function :yajl_gen_map_close, [:yajl_gen], :int - attach_function :yajl_gen_array_open, [:yajl_gen], :int - attach_function :yajl_gen_array_close, [:yajl_gen], :int - # yajl_gen_status yajl_gen_get_buf (yajl_gen hand, const unsigned char **buf, unsigned int *len) - attach_function :yajl_gen_get_buf, [:yajl_gen, :pointer ,:pointer], :int - # void yajl_gen_clear (yajl_gen hand) - attach_function :yajl_gen_clear, [:yajl_gen], :void - - -end - diff --git a/lib/ffi_yajl/encoder.rb b/lib/ffi_yajl/encoder.rb index d720187..ea6c1d7 100644 --- a/lib/ffi_yajl/encoder.rb +++ b/lib/ffi_yajl/encoder.rb @@ -48,18 +48,22 @@ module FFI_Yajl end end - if ENV['FORCE_FFI_YAJL'] == "ffi" || defined?(Yajl) + if ENV['FORCE_FFI_YAJL'] == "ext" + require 'ffi_yajl/ext/encoder' + include FFI_Yajl::Ext::Encoder + elsif ENV['FORCE_FFI_YAJL'] == "ffi" || defined?(Yajl) # on Linux yajl-ruby and non-FFI ffi_yajl conflict - require 'ffi_yajl/ffi' + require 'ffi_yajl/ffi/encoder' include FFI_Yajl::FFI::Encoder else begin - require 'ffi_yajl/ext' + require 'ffi_yajl/ext/encoder' include FFI_Yajl::Ext::Encoder rescue LoadError - require 'ffi_yajl/ffi' + require 'ffi_yajl/ffi/encoder' include FFI_Yajl::FFI::Encoder end end + end end diff --git a/lib/ffi_yajl/ext.rb b/lib/ffi_yajl/ext.rb deleted file mode 100644 index 94571df..0000000 --- a/lib/ffi_yajl/ext.rb +++ /dev/null @@ -1,3 +0,0 @@ -require 'ffi_yajl/ext/encoder' -require 'ffi_yajl/ext/parser' - diff --git a/lib/ffi_yajl/ffi.rb b/lib/ffi_yajl/ffi.rb index 6e35a63..5940a27 100644 --- a/lib/ffi_yajl/ffi.rb +++ b/lib/ffi_yajl/ffi.rb @@ -1,2 +1,117 @@ -require 'ffi_yajl/ffi/encoder' -require 'ffi_yajl/ffi/parser' + + +require 'ffi' + +# FIXME move to FFI_Yajl::FFI +module FFI_Yajl + extend ::FFI::Library + + libname = ::FFI.map_library_name("yajl") + libpath = File.expand_path(File.join(File.dirname(__FILE__), "..", libname)) + + if File.file?(libpath) + # use our vendored version of libyajl2 if we find it installed + ffi_lib libpath + else + ffi_lib 'yajl' + end + + class YajlCallbacks < ::FFI::Struct + layout :yajl_null, :pointer, + :yajl_boolean, :pointer, + :yajl_integer, :pointer, + :yajl_double, :pointer, + :yajl_number, :pointer, + :yajl_string, :pointer, + :yajl_start_map, :pointer, + :yajl_map_key, :pointer, + :yajl_end_map, :pointer, + :yajl_start_array, :pointer, + :yajl_end_array, :pointer + end + + enum :yajl_status, [ + :yajl_status_ok, + :yajl_status_client_canceled, + :yajl_status_insufficient_data, + :yajl_status_error, + ] + +# FFI::Enums are slow, should remove the rest +# enum :yajl_gen_status, [ +# :yajl_gen_status_ok, +# :yajl_gen_keys_must_be_strings, +# :yajl_max_depth_exceeded, +# :yajl_gen_in_error_state, +# :yajl_gen_generation_complete, +# :yajl_gen_invalid_number, +# :yajl_gen_no_buf, +# ] + + enum :yajl_option, [ + :yajl_allow_comments, 0x01, + :yajl_dont_validate_strings, 0x02, + :yajl_allow_trailing_garbage, 0x04, + :yajl_allow_multiple_values, 0x08, + :yajl_allow_partial_values, 0x10, + ] + + enum :yajl_gen_option, [ + :yajl_gen_beautify, 0x01, + :yajl_gen_indent_string, 0x02, + :yajl_gen_print_callback, 0x04, + :yajl_gen_validate_utf8, 0x08, + ] + + typedef :pointer, :yajl_handle + typedef :pointer, :yajl_gen + + # yajl uses unsinged char *'s consistently + typedef :pointer, :ustring_pointer + typedef :string, :ustring + + # const char *yajl_status_to_string (yajl_status code) + attach_function :yajl_status_to_string, [ :yajl_status ], :string + # yajl_handle yajl_alloc(const yajl_callbacks * callbacks, yajl_alloc_funcs * afs, void * ctx) + attach_function :yajl_alloc, [:pointer, :pointer, :pointer], :yajl_handle + # void yajl_free (yajl_handle handle) + attach_function :yajl_free, [:yajl_handle], :void + # yajl_status yajl_parse (yajl_handle hand, const unsigned char *jsonText, unsigned int jsonTextLength) + attach_function :yajl_parse, [:yajl_handle, :ustring, :uint], :yajl_status + # yajl_status yajl_parse_complete (yajl_handle hand) + attach_function :yajl_complete_parse, [:yajl_handle], :yajl_status + # unsigned char *yajl_get_error (yajl_handle hand, int verbose, const unsigned char *jsonText, unsigned int jsonTextLength) + attach_function :yajl_get_error, [:yajl_handle, :int, :ustring, :int], :ustring + # void yajl_free_error (yajl_handle hand, unsigned char *str) + attach_function :yajl_free_error, [:yajl_handle, :ustring], :void + + # + attach_function :yajl_config, [:yajl_handle, :yajl_option, :int], :int + + attach_function :yajl_gen_config, [:yajl_gen, :yajl_gen_option, :varargs], :int + + # yajl_gen yajl_gen_alloc (const yajl_alloc_funcs *allocFuncs) + attach_function :yajl_gen_alloc, [:pointer], :yajl_gen + # yajl_gen yajl_gen_alloc2 (const yajl_print_t callback, const yajl_gen_config *config, const yajl_alloc_funcs *allocFuncs, void *ctx) + # attach_function :yajl_gen_alloc2, [:pointer, :pointer, :pointer, :pointer], :yajl_gen + # void yajl_gen_free (yajl_gen handle) + attach_function :yajl_gen_free, [:yajl_gen], :void + + attach_function :yajl_gen_integer, [:yajl_gen, :long_long], :int + attach_function :yajl_gen_double, [:yajl_gen, :double], :int + attach_function :yajl_gen_number, [:yajl_gen, :ustring, :int], :int + attach_function :yajl_gen_string, [:yajl_gen, :ustring, :int], :int + attach_function :yajl_gen_null, [:yajl_gen], :int + attach_function :yajl_gen_bool, [:yajl_gen, :int], :int + attach_function :yajl_gen_map_open, [:yajl_gen], :int + attach_function :yajl_gen_map_close, [:yajl_gen], :int + attach_function :yajl_gen_array_open, [:yajl_gen], :int + attach_function :yajl_gen_array_close, [:yajl_gen], :int + # yajl_gen_status yajl_gen_get_buf (yajl_gen hand, const unsigned char **buf, unsigned int *len) + attach_function :yajl_gen_get_buf, [:yajl_gen, :pointer ,:pointer], :int + # void yajl_gen_clear (yajl_gen hand) + attach_function :yajl_gen_clear, [:yajl_gen], :void + + +end + diff --git a/lib/ffi_yajl/ffi/encoder.rb b/lib/ffi_yajl/ffi/encoder.rb index f6aa122..13fd7fb 100644 --- a/lib/ffi_yajl/ffi/encoder.rb +++ b/lib/ffi_yajl/ffi/encoder.rb @@ -1,6 +1,5 @@ -require 'ffi' -# FIXME: should require the lower level ffi stuff here instead of having this included higher up +require 'ffi_yajl/ffi' module FFI_Yajl module FFI diff --git a/lib/ffi_yajl/parser.rb b/lib/ffi_yajl/parser.rb index 25acd3a..33bb2c3 100644 --- a/lib/ffi_yajl/parser.rb +++ b/lib/ffi_yajl/parser.rb @@ -19,16 +19,19 @@ module FFI_Yajl do_yajl_parse(str, yajl_opts) end - if ENV['FORCE_FFI_YAJL'] == "ffi" || defined?(Yajl) + if ENV['FORCE_FFI_YAJL'] == "ext" + require 'ffi_yajl/ext/parser' + include FFI_Yajl::Ext::Parser + elsif ENV['FORCE_FFI_YAJL'] == "ffi" || defined?(Yajl) # on Linux yajl-ruby and non-FFI ffi_yajl conflict - require 'ffi_yajl/ffi' + require 'ffi_yajl/ffi/parser' include FFI_Yajl::FFI::Parser else begin - require 'ffi_yajl/ext' + require 'ffi_yajl/ext/parser' include FFI_Yajl::Ext::Parser rescue LoadError - require 'ffi_yajl/ffi' + require 'ffi_yajl/ffi/parser' include FFI_Yajl::FFI::Parser end end |