diff options
author | akr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2008-08-24 07:20:21 +0000 |
---|---|---|
committer | akr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2008-08-24 07:20:21 +0000 |
commit | f27b74142e3775625c4ac4506b84c20154549aa6 (patch) | |
tree | f3cbb555f9af028084df0775e07f60e0629adfe1 | |
parent | 9b8adfed222ed950b74d76a45179b3ba785c4e05 (diff) | |
download | ruby-f27b74142e3775625c4ac4506b84c20154549aa6.tar.gz |
* 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
-rw-r--r-- | ChangeLog | 8 | ||||
-rw-r--r-- | include/ruby/encoding.h | 2 | ||||
-rw-r--r-- | io.c | 36 | ||||
-rw-r--r-- | transcode.c | 6 |
4 files changed, 24 insertions, 28 deletions
@@ -1,3 +1,11 @@ +Sun Aug 24 16:19:25 2008 Tanaka Akira <akr@fsij.org> + + * 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 <akr@fsij.org> * 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, @@ -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, |