summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog8
-rw-r--r--include/ruby/encoding.h2
-rw-r--r--io.c36
-rw-r--r--transcode.c6
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 <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,
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,