diff options
author | akr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2008-09-03 18:18:10 +0000 |
---|---|---|
committer | akr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2008-09-03 18:18:10 +0000 |
commit | 58964e324975a924947157ac933d11815f1b2483 (patch) | |
tree | 3e678b124aaea7a5cfd319f47ff7214d8862b489 /io.c | |
parent | 0ebcad6a7b59819f6b65e6578b28e00dd6a6a4fe (diff) | |
download | ruby-58964e324975a924947157ac933d11815f1b2483.tar.gz |
* include/ruby/io.h (rb_io_t): new fields: encs.ecopts and
writeconv_pre_ecopts.
(MakeOpenFile): initialize them.
* include/ruby/encoding.h (rb_str_transcode): take ecopts argument.
(rb_econv_flags): removed.
(rb_econv_prepare_opts): declared.
(rb_econv_open_opts): declared.
* io.c (make_writeconv): use rb_econv_open_opts.
(make_readconv): ditto.
(io_fwrite): follow rb_str_transcode change.
(rb_io_extract_modeenc): use rb_econv_prepare_opts.
(rb_file_open_generic): initialize encs.ecopts.
(rb_file_open_internal): ditto.
(rb_io_reopen): ditto.
(argf_ecopts): defined.
(argf_next_argv): set encs.ecopts.
(io_encoding_set): use rb_econv_prepare_opts.
(argf_set_encoding): set argf_ecopts.
* gc.c (gc_mark_children): mark encs.ecopts and writeconv_pre_ecopts
in T_FILE.
* transcode.c (transcode_loop): take ecopts argument. use
rb_econv_open_opts.
(rb_econv_flags): removed.
(rb_econv_prepare_opts): defined.
(rb_econv_open_opts): defined.
(str_transcode0): take ecopts.
(str_transcode): use rb_econv_prepare_opts.
(rb_str_transcode): take ecopts.
(econv_init): accept hash argument.
(econv_insert_output): follow rb_str_transcode change.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@19109 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'io.c')
-rw-r--r-- | io.c | 33 |
1 files changed, 25 insertions, 8 deletions
@@ -691,19 +691,22 @@ make_writeconv(rb_io_t *fptr) const char *senc, *denc; rb_encoding *enc; int ecflags; + VALUE ecopts; fptr->writeconv_initialized = 1; /* ECONV_INVALID_XXX and ECONV_UNDEF_XXX should be set both. * But ECONV_CRLF_NEWLINE_ENCODER should be set only for the first. */ fptr->writeconv_pre_flags = fptr->encs.flags; + fptr->writeconv_pre_ecopts = fptr->encs.ecopts; ecflags = fptr->encs.flags; + ecopts = fptr->encs.ecopts; #ifdef TEXTMODE_NEWLINE_ENCODER if (!fptr->encs.enc) { if (NEED_NEWLINE_ENCODER(fptr)) ecflags |= TEXTMODE_NEWLINE_ENCODER; - fptr->writeconv = rb_econv_open("", "", ecflags); + fptr->writeconv = rb_econv_open_opts("", "", ecflags, ecopts); if (!fptr->writeconv) rb_exc_raise(rb_econv_open_exc("", "", ecflags)); fptr->writeconv_stateless = Qnil; @@ -719,7 +722,7 @@ make_writeconv(rb_io_t *fptr) if (senc) { denc = enc->name; fptr->writeconv_stateless = rb_str_new2(senc); - fptr->writeconv = rb_econv_open(senc, denc, ecflags); + fptr->writeconv = rb_econv_open_opts(senc, denc, ecflags, ecopts); if (!fptr->writeconv) rb_exc_raise(rb_econv_open_exc(senc, denc, ecflags)); } @@ -753,7 +756,8 @@ io_fwrite(VALUE str, rb_io_t *fptr) } if (!NIL_P(common_encoding)) { - str = rb_str_transcode(str, common_encoding, fptr->writeconv_pre_flags); + str = rb_str_transcode(str, common_encoding, + fptr->writeconv_pre_flags, fptr->writeconv_pre_ecopts); } if (fptr->writeconv) { @@ -1438,8 +1442,10 @@ make_readconv(rb_io_t *fptr) { if (!fptr->readconv) { int ecflags; + VALUE ecopts; const char *sname, *dname; ecflags = fptr->encs.flags; + ecopts = fptr->encs.ecopts; if (NEED_NEWLINE_DECODER(fptr)) ecflags |= ECONV_UNIVERSAL_NEWLINE_DECODER; if (fptr->encs.enc2) { @@ -1449,7 +1455,7 @@ make_readconv(rb_io_t *fptr) else { sname = dname = ""; } - fptr->readconv = rb_econv_open(sname, dname, ecflags); + fptr->readconv = rb_econv_open_opts(sname, dname, ecflags, ecopts); if (!fptr->readconv) rb_exc_raise(rb_econv_open_exc(sname, dname, ecflags)); fptr->cbuf_off = 0; @@ -3833,6 +3839,7 @@ rb_io_extract_modeenc(VALUE *mode_p, VALUE opthash, int modenum, flags; rb_encoding *enc, *enc2; int ecflags; + VALUE ecopts; int has_enc = 0; VALUE intmode; @@ -3865,6 +3872,7 @@ rb_io_extract_modeenc(VALUE *mode_p, VALUE opthash, if (NIL_P(opthash)) { ecflags = 0; + ecopts = Qnil; } else { VALUE v; @@ -3878,7 +3886,7 @@ rb_io_extract_modeenc(VALUE *mode_p, VALUE opthash, modenum |= O_BINARY; #endif } - ecflags = rb_econv_flags(opthash); + ecflags = rb_econv_prepare_opts(opthash, &ecopts); if (io_extract_encoding_option(opthash, &enc, &enc2)) { if (has_enc) { @@ -3897,6 +3905,7 @@ rb_io_extract_modeenc(VALUE *mode_p, VALUE opthash, convconfig_p->enc = enc; convconfig_p->enc2 = enc2; convconfig_p->flags = ecflags; + convconfig_p->ecopts = ecopts; } struct sysopen_struct { @@ -4005,6 +4014,7 @@ rb_file_open_generic(VALUE io, VALUE filename, int modenum, int flags, convconfi fptr->encs.enc = NULL; fptr->encs.enc2 = NULL; fptr->encs.flags = 0; + fptr->encs.ecopts = Qnil; } fptr->pathv = rb_str_new_frozen(filename); fptr->fd = rb_sysopen(RSTRING_PTR(fptr->pathv), modenum, perm); @@ -4027,6 +4037,7 @@ rb_file_open_internal(VALUE io, VALUE filename, const char *mode) convconfig.enc = NULL; convconfig.enc2 = NULL; convconfig.flags = 0; + convconfig.ecopts = Qnil; } flags = rb_io_mode_flags(mode); @@ -5012,6 +5023,7 @@ rb_io_reopen(int argc, VALUE *argv, VALUE file) fptr->mode = flags; rb_io_mode_enc(fptr, StringValueCStr(nmode)); fptr->encs.flags = 0; + fptr->encs.ecopts = Qnil; } fptr->pathv = rb_str_new_frozen(fname); @@ -5698,7 +5710,8 @@ argf_alloc(VALUE klass) #define argf_binmode ARGF.binmode #define argf_enc ARGF.encs.enc #define argf_enc2 ARGF.encs.enc2 -#define argf_ecflags ARGF.encs.flags +#define argf_ecflags ARGF.encs.flags +#define argf_ecopts ARGF.encs.ecopts #define rb_argv ARGF.argv static VALUE @@ -5871,6 +5884,7 @@ argf_next_argv(VALUE argf) fptr->encs.enc = argf_enc; fptr->encs.enc2 = argf_enc2; fptr->encs.flags = argf_ecflags; + fptr->encs.ecopts = argf_ecopts; clear_codeconv(fptr); } } @@ -6595,7 +6609,7 @@ io_encoding_set(rb_io_t *fptr, int argc, VALUE v1, VALUE v2, VALUE opt) if (argc == 2) { fptr->encs.enc2 = rb_to_encoding(v1); fptr->encs.enc = rb_to_encoding(v2); - fptr->encs.flags = rb_econv_flags(opt); + fptr->encs.flags = rb_econv_prepare_opts(opt, &fptr->encs.ecopts); clear_codeconv(fptr); } else if (argc == 1) { @@ -6603,18 +6617,20 @@ io_encoding_set(rb_io_t *fptr, int argc, VALUE v1, VALUE v2, VALUE opt) fptr->encs.enc = NULL; fptr->encs.enc2 = NULL; fptr->encs.flags = 0; + fptr->encs.ecopts = Qnil; clear_codeconv(fptr); } else { VALUE tmp = rb_check_string_type(v1); if (!NIL_P(tmp)) { mode_enc(fptr, StringValueCStr(tmp)); - fptr->encs.flags = rb_econv_flags(opt); + fptr->encs.flags = rb_econv_prepare_opts(opt, &fptr->encs.ecopts); } else { fptr->encs.enc = rb_to_encoding(v1); fptr->encs.enc2 = NULL; fptr->encs.flags = 0; + fptr->encs.ecopts = Qnil; clear_codeconv(fptr); } } @@ -7548,6 +7564,7 @@ argf_set_encoding(int argc, VALUE *argv, VALUE argf) argf_enc = fptr->encs.enc; argf_enc2 = fptr->encs.enc2; argf_ecflags = fptr->encs.flags; + argf_ecopts = fptr->encs.ecopts; return argf; } |