diff options
author | Lamont Granquist <lamont@scriptkiddie.org> | 2013-12-21 11:07:49 -0800 |
---|---|---|
committer | Lamont Granquist <lamont@scriptkiddie.org> | 2013-12-21 11:07:49 -0800 |
commit | 42f668bb8097a3e5f9153227a07c02e9e3d2ee28 (patch) | |
tree | 9b76a9c689b71837532774ecca5db5e2042bd486 /ext/ffi_yajl | |
parent | 11911fc8d992260297e706a0168e4089e7d65eb8 (diff) | |
download | ffi-yajl-42f668bb8097a3e5f9153227a07c02e9e3d2ee28.tar.gz |
fix some encoding bugs
Diffstat (limited to 'ext/ffi_yajl')
-rw-r--r-- | ext/ffi_yajl/ext/parser/parser.c | 38 |
1 files changed, 36 insertions, 2 deletions
diff --git a/ext/ffi_yajl/ext/parser/parser.c b/ext/ffi_yajl/ext/parser/parser.c index 7793a20..543701e 100644 --- a/ext/ffi_yajl/ext/parser/parser.c +++ b/ext/ffi_yajl/ext/parser/parser.c @@ -1,6 +1,11 @@ #include <ruby.h> #include <yajl/yajl_parse.h> +#ifdef HAVE_RUBY_ENCODING_H +#include <ruby/encoding.h> +static rb_encoding *utf8Encoding; +#endif + static VALUE mFFI_Yajl, mExt, mParser, cParseError; typedef struct { @@ -79,9 +84,22 @@ int number_callback(void *ctx, const char *numberVal, size_t numberLen) { int string_callback(void *ctx, const unsigned char *stringVal, size_t stringLen) { char buf[stringLen+1]; + VALUE str; +#ifdef HAVE_RUBY_ENCODING_H + rb_encoding *default_internal_enc; +#endif + buf[stringLen] = 0; memcpy(buf, stringVal, stringLen); - set_value(ctx,rb_str_new2(buf)); + str = rb_str_new2(buf); +#ifdef HAVE_RUBY_ENCODING_H + default_internal_enc = rb_default_internal_encoding(); + rb_enc_associate(str, utf8Encoding); + if (default_internal_enc) { + str = rb_str_export_to_enc(str, default_internal_enc); + } +#endif + set_value(ctx,str); return 1; } @@ -92,9 +110,22 @@ int start_map_callback(void *ctx) { int map_key_callback(void *ctx, const unsigned char *stringVal, size_t stringLen) { char buf[stringLen+1]; + VALUE str; +#ifdef HAVE_RUBY_ENCODING_H + rb_encoding *default_internal_enc; +#endif + buf[stringLen] = 0; memcpy(buf, stringVal, stringLen); - set_key(ctx,rb_str_new2(buf)); + str = rb_str_new2(buf); +#ifdef HAVE_RUBY_ENCODING_H + default_internal_enc = rb_default_internal_encoding(); + rb_enc_associate(str, utf8Encoding); + if (default_internal_enc) { + str = rb_str_export_to_enc(str, default_internal_enc); + } +#endif + set_key(ctx,str); return 1; } @@ -161,5 +192,8 @@ void Init_parser() { mExt = rb_define_module_under(mFFI_Yajl, "Ext"); mParser = rb_define_module_under(mExt, "Parser"); rb_define_method(mParser, "do_yajl_parse", mParser_do_yajl_parse, 2); +#ifdef HAVE_RUBY_ENCODING_H + utf8Encoding = rb_utf8_encoding(); +#endif } |