diff options
author | akr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2008-08-24 06:25:24 +0000 |
---|---|---|
committer | akr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2008-08-24 06:25:24 +0000 |
commit | c6d291b003a4d5f8b12d9ff79767525d359b5733 (patch) | |
tree | 7bff679edc648869ce7436b6db24062af78836b0 /io.c | |
parent | 51ad3df2cec27075db72dff7291c5f8828d0c9da (diff) | |
download | ruby-c6d291b003a4d5f8b12d9ff79767525d359b5733.tar.gz |
* 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.c | 33 |
1 files changed, 26 insertions, 7 deletions
@@ -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 |