summaryrefslogtreecommitdiff
path: root/io.c
diff options
context:
space:
mode:
authorakr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2008-08-24 06:25:24 +0000
committerakr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2008-08-24 06:25:24 +0000
commitc6d291b003a4d5f8b12d9ff79767525d359b5733 (patch)
tree7bff679edc648869ce7436b6db24062af78836b0 /io.c
parent51ad3df2cec27075db72dff7291c5f8828d0c9da (diff)
* include/ruby/encoding.h (rb_str_transcode): add ecflags argument.
* transcode.c (econv_opts): extracted from str_transcode. (str_transcode_enc_args): extracted from str_transcode. (str_transcode0): extracted from str_transcode. (str_transcode): use econv_opts, str_transcode_enc_args, str_transcode0. (rb_str_transcode): call str_transcode0. (econv_primitive_insert_output): give the additional argument for rb_str_transcode. * io.c (make_writeconv): use invalid/undef flags. (io_fwrite): ditto. (rb_scan_open_args): give the additional argument for rb_str_transcode. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@18808 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'io.c')
-rw-r--r--io.c33
1 files changed, 26 insertions, 7 deletions
diff --git a/io.c b/io.c
index 702e287066..69ed01caad 100644
--- a/io.c
+++ b/io.c
@@ -699,6 +699,12 @@ make_writeconv(rb_io_t *fptr)
fptr->writeconv_initialized = 1;
ecflags = 0;
+
+ if (fptr->mode & FMODE_INVALID_MASK)
+ ecflags |= (fptr->mode / (FMODE_INVALID_MASK/ECONV_INVALID_MASK)) & ECONV_INVALID_MASK;
+ if (fptr->mode & FMODE_UNDEF_MASK)
+ ecflags |= (fptr->mode / (FMODE_UNDEF_MASK/ECONV_UNDEF_MASK)) & ECONV_UNDEF_MASK;
+
#ifdef TEXTMODE_NEWLINE_ENCODER
if (NEED_NEWLINE_ENCODER(fptr))
ecflags |= TEXTMODE_NEWLINE_ENCODER;
@@ -740,18 +746,31 @@ io_fwrite(VALUE str, rb_io_t *fptr)
long len, n, r, l, offset = 0;
if (NEED_WRITECONV(fptr)) {
+ VALUE common_encoding = Qnil;
make_writeconv(fptr);
+
if (fptr->writeconv) {
- if (!NIL_P(fptr->writeconv_stateless)) {
- str = rb_str_transcode(str, fptr->writeconv_stateless);
- }
- str = rb_econv_str_convert(fptr->writeconv, str, ECONV_PARTIAL_INPUT);
+ if (!NIL_P(fptr->writeconv_stateless))
+ common_encoding = fptr->writeconv_stateless;
}
else {
if (fptr->enc2)
- str = rb_str_transcode(str, rb_enc_from_encoding(fptr->enc2));
+ common_encoding = rb_enc_from_encoding(fptr->enc2);
else
- str = rb_str_transcode(str, rb_enc_from_encoding(fptr->enc));
+ common_encoding = rb_enc_from_encoding(fptr->enc);
+ }
+
+ if (!NIL_P(common_encoding)) {
+ int ecflags = 0;
+ if (fptr->mode & FMODE_INVALID_MASK)
+ ecflags |= (fptr->mode / (FMODE_INVALID_MASK/ECONV_INVALID_MASK)) & ECONV_INVALID_MASK;
+ if (fptr->mode & FMODE_UNDEF_MASK)
+ ecflags |= (fptr->mode / (FMODE_UNDEF_MASK/ECONV_UNDEF_MASK)) & ECONV_UNDEF_MASK;
+ str = rb_str_transcode(str, common_encoding, ecflags);
+ }
+
+ if (fptr->writeconv) {
+ str = rb_econv_str_convert(fptr->writeconv, str, ECONV_PARTIAL_INPUT);
}
}
@@ -4622,7 +4641,7 @@ rb_scan_open_args(int argc, VALUE *argv,
static VALUE fs_enc;
if (!fs_enc)
fs_enc = rb_enc_from_encoding(fs_encoding);
- fname = rb_str_transcode(fname, fs_enc);
+ fname = rb_str_transcode(fname, fs_enc, 0);
}
}
#endif