From f27b74142e3775625c4ac4506b84c20154549aa6 Mon Sep 17 00:00:00 2001 From: akr Date: Sun, 24 Aug 2008 07:20:21 +0000 Subject: * include/ruby/encoding.h (rb_econv_opts): declared. * transcode.c (rb_econv_opts): defined. * io.c (rb_io_extract_modeenc): use rb_econv_opts. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@18811 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 8 ++++++++ include/ruby/encoding.h | 2 ++ io.c | 36 ++++++++---------------------------- transcode.c | 6 ++++++ 4 files changed, 24 insertions(+), 28 deletions(-) diff --git a/ChangeLog b/ChangeLog index f7f0d1467a..b3a6e248c9 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +Sun Aug 24 16:19:25 2008 Tanaka Akira + + * include/ruby/encoding.h (rb_econv_opts): declared. + + * transcode.c (rb_econv_opts): defined. + + * io.c (rb_io_extract_modeenc): use rb_econv_opts. + Sun Aug 24 16:06:30 2008 Tanaka Akira * include/ruby/encoding.h (rb_econv_option_t): defined. diff --git a/include/ruby/encoding.h b/include/ruby/encoding.h index b952c74027..1aa4385c0d 100644 --- a/include/ruby/encoding.h +++ b/include/ruby/encoding.h @@ -253,6 +253,8 @@ typedef struct { int flags; } rb_econv_option_t; +void rb_econv_opts(VALUE hash, rb_econv_option_t *opts); + rb_econv_t *rb_econv_open(const char *source_encoding, const char *destination_encoding, rb_econv_option_t *opts); rb_econv_result_t rb_econv_convert(rb_econv_t *ec, const unsigned char **source_buffer_ptr, const unsigned char *source_buffer_end, diff --git a/io.c b/io.c index 147670e496..5697951491 100644 --- a/io.c +++ b/io.c @@ -3850,8 +3850,8 @@ io_extract_encoding_option(VALUE opt, rb_encoding **enc_p, rb_encoding **enc2_p) } typedef struct convconfig_t { - rb_encoding *enc; - rb_encoding *enc2; + rb_encoding *enc; + rb_encoding *enc2; } convconfig_t; static void @@ -3893,6 +3893,7 @@ rb_io_extract_modeenc(VALUE *mode_p, VALUE opthash, if (!NIL_P(opthash)) { VALUE v; + rb_econv_option_t ecopts; v = rb_hash_aref(opthash, sym_textmode); if (RTEST(v)) flags |= FMODE_TEXTMODE; @@ -3903,32 +3904,11 @@ rb_io_extract_modeenc(VALUE *mode_p, VALUE opthash, modenum |= O_BINARY; #endif } - v = rb_hash_aref(opthash, sym_invalid); - if (!NIL_P(v)) { - if (v == sym_replace) { - flags |= FMODE_INVALID_REPLACE; - } - else if (v == sym_ignore) { - flags |= FMODE_INVALID_IGNORE; - } - else { - v = rb_inspect(v); - rb_raise(rb_eArgError, "unexpected action for invalid byte sequence: %s", StringValueCStr(v)); - } - } - v = rb_hash_aref(opthash, sym_undef); - if (!NIL_P(v)) { - if (v == sym_replace) { - flags |= FMODE_UNDEF_REPLACE; - } - else if (v == sym_ignore) { - flags |= FMODE_UNDEF_IGNORE; - } - else { - v = rb_inspect(v); - rb_raise(rb_eArgError, "unexpected action for undefined conversion: %s", StringValueCStr(v)); - } - } + rb_econv_opts(opthash, &ecopts); + if (ecopts.flags & ECONV_INVALID_REPLACE) flags |= FMODE_INVALID_REPLACE; + if (ecopts.flags & ECONV_INVALID_IGNORE) flags |= FMODE_INVALID_IGNORE; + if (ecopts.flags & ECONV_UNDEF_REPLACE) flags |= FMODE_UNDEF_REPLACE; + if (ecopts.flags & ECONV_UNDEF_IGNORE) flags |= FMODE_UNDEF_IGNORE; if (io_extract_encoding_option(opthash, &enc, &enc2)) { if (has_enc) { diff --git a/transcode.c b/transcode.c index 66287c957f..78b41724b5 100644 --- a/transcode.c +++ b/transcode.c @@ -1711,6 +1711,12 @@ econv_opts(VALUE opt) return options; } +void +rb_econv_opts(VALUE hash, rb_econv_option_t *opts) +{ + opts->flags = econv_opts(hash); +} + static int str_transcode_enc_args(VALUE str, VALUE arg1, VALUE arg2, const char **sname, rb_encoding **senc, -- cgit v1.2.3