diff options
author | naruse <naruse@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2012-02-10 18:21:01 +0000 |
---|---|---|
committer | naruse <naruse@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2012-02-10 18:21:01 +0000 |
commit | 093ade0eb8229673f4985a3c9a1eadc191f9e533 (patch) | |
tree | 1a5e830b682b9bc8afb7692fdcda6a7fb3022d67 | |
parent | 45501becfbae97316409d9d1d4d8115936b0a365 (diff) |
merge revision(s) 33662,33666,33770: [Backport #5793]
------------------------------------------------------------------------
r33662 | usa | 2011-11-08 02:48:11 +0900 (Tue, 08 Nov 2011) | 18 lines
* include/ruby/encoding.h (ECONV_NEWLINE_DECORATOR_READ_MASK,
ECONV_NEWLINE_DECORATOR_WRITE_MASK): new macro.
* io.c (rb_io_extract_modeenc, pipe_open, prep_stdio, argf_next_argv):
set TEXTMODE_NEWLINE_DECORATOR_ON_WRITE for textmode on creating IO
if the flag is available.
* io.c (make_writeconv): drop decorators for reading.
* io.c (make_readconv): drop decorators for writing.
* io.c (do_writeconv): existing writeconv is not the condition to raise
ArgumentError. should check textmode or not.
* test/ruby/test_io_m17n.rb
(TestIO_M17N#test_{cr,lf,crlf}_decorator_on_stdout): test above
changes.
------------------------------------------------------------------------
* include/ruby/encoding.h (ECONV_NEWLINE_DECORATOR_READ_MASK,
ECONV_NEWLINE_DECORATOR_WRITE_MASK): new macro.
* io.c (rb_io_extract_modeenc, pipe_open, prep_stdio, argf_next_argv):
set TEXTMODE_NEWLINE_DECORATOR_ON_WRITE for textmode on creating IO
if the flag is available.
* io.c (make_writeconv): drop decorators for reading.
* io.c (make_readconv): drop decorators for writing.
* io.c (do_writeconv): existing writeconv is not the condition to raise
ArgumentError. should check textmode or not.
* test/ruby/test_io_m17n.rb
(TestIO_M17N#test_{cr,lf,crlf}_decorator_on_stdout): test above
changes.
* io.c (argf_next_argv): wrong timing of setting ecflags.
fixed the failure of TestArgf#test_textmode introduced at r33662.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_9_3@34542 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r-- | ChangeLog | 25 | ||||
-rw-r--r-- | include/ruby/encoding.h | 2 | ||||
-rw-r--r-- | io.c | 51 | ||||
-rw-r--r-- | test/ruby/test_io_m17n.rb | 57 | ||||
-rw-r--r-- | version.h | 2 |
5 files changed, 120 insertions, 17 deletions
@@ -1,8 +1,33 @@ +Sat Feb 11 03:20:22 2012 NAKAMURA Usaku <usa@ruby-lang.org> + + * io.c (argf_next_argv): wrong timing of setting ecflags. + fixed the failure of TestArgf#test_textmode introduced at r33662. + Sat Feb 11 03:19:45 2012 NAKAMURA Usaku <usa@ruby-lang.org> * test/ruby/test_io_m17n.rb (TestIO_M17N#test_default_stdout_stderr_mode): new test for r33627-33629. see [backport #5565] +Sat Feb 11 03:20:22 2012 NAKAMURA Usaku <usa@ruby-lang.org> + + * include/ruby/encoding.h (ECONV_NEWLINE_DECORATOR_READ_MASK, + ECONV_NEWLINE_DECORATOR_WRITE_MASK): new macro. + + * io.c (rb_io_extract_modeenc, pipe_open, prep_stdio, argf_next_argv): + set TEXTMODE_NEWLINE_DECORATOR_ON_WRITE for textmode on creating IO + if the flag is available. + + * io.c (make_writeconv): drop decorators for reading. + + * io.c (make_readconv): drop decorators for writing. + + * io.c (do_writeconv): existing writeconv is not the condition to raise + ArgumentError. should check textmode or not. + + * test/ruby/test_io_m17n.rb + (TestIO_M17N#test_{cr,lf,crlf}_decorator_on_stdout): test above + changes. + Sat Feb 11 03:19:45 2012 NAKAMURA Usaku <usa@ruby-lang.org> diff --git a/include/ruby/encoding.h b/include/ruby/encoding.h index 123f76aff5..4a046af136 100644 --- a/include/ruby/encoding.h +++ b/include/ruby/encoding.h @@ -305,6 +305,8 @@ void rb_econv_binmode(rb_econv_t *ec); #define ECONV_DECORATOR_MASK 0x0000ff00 #define ECONV_NEWLINE_DECORATOR_MASK 0x00003f00 +#define ECONV_NEWLINE_DECORATOR_READ_MASK 0x00000f00 +#define ECONV_NEWLINE_DECORATOR_WRITE_MASK 0x00003000 #define ECONV_UNIVERSAL_NEWLINE_DECORATOR 0x00000100 #define ECONV_CRLF_NEWLINE_DECORATOR 0x00001000 @@ -750,16 +750,8 @@ make_writeconv(rb_io_t *fptr) fptr->writeconv_initialized = 1; - ecflags = fptr->encs.ecflags; + ecflags = fptr->encs.ecflags & ~ECONV_NEWLINE_DECORATOR_READ_MASK; ecopts = fptr->encs.ecopts; -#ifdef TEXTMODE_NEWLINE_DECORATOR_ON_WRITE - if (NEED_NEWLINE_DECORATOR_ON_WRITE(fptr) && - (!(ecflags & ECONV_NEWLINE_DECORATOR_MASK) || - (ecflags & ECONV_UNIVERSAL_NEWLINE_DECORATOR))) { - ecflags &= ~ECONV_UNIVERSAL_NEWLINE_DECORATOR; - ecflags |= TEXTMODE_NEWLINE_DECORATOR_ON_WRITE; - } -#endif if (!fptr->encs.enc || (fptr->encs.enc == rb_ascii8bit_encoding() && !fptr->encs.enc2)) { /* no encoding conversion */ @@ -897,6 +889,8 @@ io_binwrite(VALUE str, const char *ptr, long len, rb_io_t *fptr, int nosync) return len; } +# define MODE_BTMODE(a,b,c) ((fmode & FMODE_BINMODE) ? (b) : \ + (fmode & FMODE_TEXTMODE) ? (c) : (a)) static VALUE do_writeconv(VALUE str, rb_io_t *fptr) { @@ -906,12 +900,14 @@ do_writeconv(VALUE str, rb_io_t *fptr) make_writeconv(fptr); if (fptr->writeconv) { +#define fmode (fptr->mode) if (!NIL_P(fptr->writeconv_asciicompat)) common_encoding = fptr->writeconv_asciicompat; - else if (!rb_enc_asciicompat(rb_enc_get(str))) { + else if (MODE_BTMODE(DEFAULT_TEXTMODE,0,1) && !rb_enc_asciicompat(rb_enc_get(str))) { rb_raise(rb_eArgError, "ASCII incompatible string written for text mode IO without encoding conversion: %s", rb_enc_name(rb_enc_get(str))); } +#undef fmode } else { if (fptr->encs.enc2) @@ -1669,7 +1665,7 @@ make_readconv(rb_io_t *fptr, int size) int ecflags; VALUE ecopts; const char *sname, *dname; - ecflags = fptr->encs.ecflags; + ecflags = fptr->encs.ecflags & ~ECONV_NEWLINE_DECORATOR_WRITE_MASK; ecopts = fptr->encs.ecopts; if (fptr->encs.enc2) { sname = rb_enc_name(fptr->encs.enc2); @@ -4078,8 +4074,6 @@ rb_io_binmode_p(VALUE io) static const char* rb_io_fmode_modestr(int fmode) { -# define MODE_BTMODE(a,b,c) ((fmode & FMODE_BINMODE) ? (b) : \ - (fmode & FMODE_TEXTMODE) ? (c) : (a)) if (fmode & FMODE_APPEND) { if ((fmode & FMODE_READWRITE) == FMODE_READWRITE) { return MODE_BTMODE("a+", "ab+", "at+"); @@ -4544,6 +4538,11 @@ rb_io_extract_modeenc(VALUE *vmode_p, VALUE *vperm_p, VALUE opthash, ecflags = (fmode & FMODE_READABLE) ? MODE_BTMODE(ECONV_DEFAULT_NEWLINE_DECORATOR, 0, ECONV_UNIVERSAL_NEWLINE_DECORATOR) : 0; +#ifdef TEXTMODE_NEWLINE_DECORATOR_ON_WRITE + ecflags |= (fmode & FMODE_WRITABLE) ? + MODE_BTMODE(TEXTMODE_NEWLINE_DECORATOR_ON_WRITE, + 0, TEXTMODE_NEWLINE_DECORATOR_ON_WRITE) : 0; +#endif ecopts = Qnil; } else { @@ -4579,6 +4578,11 @@ rb_io_extract_modeenc(VALUE *vmode_p, VALUE *vperm_p, VALUE opthash, ecflags = (fmode & FMODE_READABLE) ? MODE_BTMODE(ECONV_DEFAULT_NEWLINE_DECORATOR, 0, ECONV_UNIVERSAL_NEWLINE_DECORATOR) : 0; +#ifdef TEXTMODE_NEWLINE_DECORATOR_ON_WRITE + ecflags |= (fmode & FMODE_WRITABLE) ? + MODE_BTMODE(TEXTMODE_NEWLINE_DECORATOR_ON_WRITE, + 0, TEXTMODE_NEWLINE_DECORATOR_ON_WRITE) : 0; +#endif ecflags = rb_econv_prepare_options(opthash, &ecopts, ecflags); if (rb_io_extract_encoding_option(opthash, &enc, &enc2, &fmode)) { @@ -5268,8 +5272,15 @@ pipe_open(struct rb_exec_arg *eargp, VALUE prog, const char *modestr, int fmode, if (convconfig) { fptr->encs = *convconfig; } - else if (NEED_NEWLINE_DECORATOR_ON_READ(fptr)) { - fptr->encs.ecflags |= ECONV_UNIVERSAL_NEWLINE_DECORATOR; + else { + if (NEED_NEWLINE_DECORATOR_ON_READ(fptr)) { + fptr->encs.ecflags |= ECONV_UNIVERSAL_NEWLINE_DECORATOR; + } +#ifdef TEXTMODE_NEWLINE_DECORATOR_ON_WRITE + if (NEED_NEWLINE_DECORATOR_ON_WRITE(fptr)) { + fptr->encs.ecflags |= TEXTMODE_NEWLINE_DECORATOR_ON_WRITE; + } +#endif } fptr->pid = pid; @@ -6437,6 +6448,9 @@ prep_stdio(FILE *f, int fmode, VALUE klass, const char *path) GetOpenFile(io, fptr); fptr->encs.ecflags |= ECONV_DEFAULT_NEWLINE_DECORATOR; +#ifdef TEXTMODE_NEWLINE_DECORATOR_ON_WRITE + fptr->encs.ecflags |= TEXTMODE_NEWLINE_DECORATOR_ON_WRITE; +#endif fptr->stdio_file = f; return io; @@ -6983,7 +6997,9 @@ argf_next_argv(VALUE argf) if (stdout_binmode) rb_io_binmode(rb_stdout); } fmode = FMODE_READABLE; - if (!ARGF.binmode) fmode |= DEFAULT_TEXTMODE; + if (!ARGF.binmode) { + fmode |= DEFAULT_TEXTMODE; + } ARGF.current_file = prep_io(fr, fmode, rb_cFile, fn); if (!NIL_P(write_io)) { rb_io_set_write_io(ARGF.current_file, write_io); @@ -6999,6 +7015,9 @@ argf_next_argv(VALUE argf) fptr->encs.ecflags &= ~ECONV_NEWLINE_DECORATOR_MASK; if (!ARGF.binmode) { fptr->encs.ecflags |= ECONV_DEFAULT_NEWLINE_DECORATOR; +#ifdef TEXTMODE_NEWLINE_DECORATOR_ON_WRITE + fptr->encs.ecflags |= TEXTMODE_NEWLINE_DECORATOR_ON_WRITE; +#endif } } ARGF.next_p = 0; diff --git a/test/ruby/test_io_m17n.rb b/test/ruby/test_io_m17n.rb index ecf34c793f..18f84c6253 100644 --- a/test/ruby/test_io_m17n.rb +++ b/test/ruby/test_io_m17n.rb @@ -2117,4 +2117,61 @@ EOT end end end if /mswin|mingw/ =~ RUBY_PLATFORM + + def test_cr_decorator_on_stdout + with_pipe do |in_r, in_w| + with_pipe do |out_r, out_w| + pid = Process.spawn({}, EnvUtil.rubybin, in: in_r, out: out_w) + in_r.close + out_w.close + in_w.write <<-EOS + STDOUT.set_encoding('locale', nil, newline: :cr) + STDOUT.puts "abc" + STDOUT.flush + EOS + in_w.close + Process.wait pid + assert_equal "abc\r", out_r.binmode.read + out_r.close + end + end + end + + def test_lf_decorator_on_stdout + with_pipe do |in_r, in_w| + with_pipe do |out_r, out_w| + pid = Process.spawn({}, EnvUtil.rubybin, in: in_r, out: out_w) + in_r.close + out_w.close + in_w.write <<-EOS + STDOUT.set_encoding('locale', nil, newline: :lf) + STDOUT.puts "abc" + STDOUT.flush + EOS + in_w.close + Process.wait pid + assert_equal "abc\n", out_r.binmode.read + out_r.close + end + end + end + + def test_crlf_decorator_on_stdout + with_pipe do |in_r, in_w| + with_pipe do |out_r, out_w| + pid = Process.spawn({}, EnvUtil.rubybin, in: in_r, out: out_w) + in_r.close + out_w.close + in_w.write <<-EOS + STDOUT.set_encoding('locale', nil, newline: :crlf) + STDOUT.puts "abc" + STDOUT.flush + EOS + in_w.close + Process.wait pid + assert_equal "abc\r\n", out_r.binmode.read + out_r.close + end + end + end end @@ -1,5 +1,5 @@ #define RUBY_VERSION "1.9.3" -#define RUBY_PATCHLEVEL 87 +#define RUBY_PATCHLEVEL 88 #define RUBY_RELEASE_DATE "2012-02-11" #define RUBY_RELEASE_YEAR 2012 |