diff options
author | akr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2008-08-23 02:23:42 +0000 |
---|---|---|
committer | akr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2008-08-23 02:23:42 +0000 |
commit | 860c2331039537c4d0c5c8c92ae1e89395f0edcc (patch) | |
tree | 46aca87ad648da3ee8f5caf5a433c0e3193f74fc | |
parent | 3721df734c9ad1be0bbd64321329c1af405b289b (diff) | |
download | ruby-860c2331039537c4d0c5c8c92ae1e89395f0edcc.tar.gz |
* io.c (rb_io_extract_modeenc): check :textmode and :binmode in option
hash.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@18786 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r-- | ChangeLog | 5 | ||||
-rw-r--r-- | io.c | 18 | ||||
-rw-r--r-- | test/ruby/test_io_m17n.rb | 10 |
3 files changed, 33 insertions, 0 deletions
@@ -1,3 +1,8 @@ +Sat Aug 23 11:23:05 2008 Tanaka Akira <akr@fsij.org> + + * io.c (rb_io_extract_modeenc): check :textmode and :binmode in option + hash. + Sat Aug 23 10:48:56 2008 Tanaka Akira <akr@fsij.org> * ext/pty/pty.c (pty_getpty): follow rb_io_t's path -> pathv change. @@ -125,6 +125,7 @@ static VALUE argf; static ID id_write, id_read, id_getc, id_flush, id_readpartial; static VALUE sym_mode, sym_perm, sym_extenc, sym_intenc, sym_encoding, sym_open_args; +static VALUE sym_textmode, sym_binmode; struct timeval rb_time_interval(VALUE); @@ -3864,6 +3865,18 @@ rb_io_extract_modeenc(VALUE *mode_p, VALUE opthash, } if (!NIL_P(opthash)) { + VALUE v; + v = rb_hash_aref(opthash, sym_textmode); + if (RTEST(v)) + flags |= FMODE_TEXTMODE; + v = rb_hash_aref(opthash, sym_binmode); + if (RTEST(v)) { + flags |= FMODE_BINMODE; +#ifdef O_BINARY + modenum |= O_BINARY; +#endif + } + if (io_extract_encoding_option(opthash, &enc, &enc2)) { if (has_enc) { rb_raise(rb_eArgError, "encoding sepecified twice"); @@ -3871,6 +3884,9 @@ rb_io_extract_modeenc(VALUE *mode_p, VALUE opthash, } } + if ((flags & FMODE_BINMODE) && (flags & FMODE_TEXTMODE)) + rb_raise(rb_eArgError, "both textmode and binmode specified"); + *mode_p = mode; *modenum_p = modenum; @@ -8335,4 +8351,6 @@ Init_IO(void) sym_intenc = ID2SYM(rb_intern("internal_encoding")); sym_encoding = ID2SYM(rb_intern("encoding")); sym_open_args = ID2SYM(rb_intern("open_args")); + sym_textmode = ID2SYM(rb_intern("textmode")); + sym_binmode = ID2SYM(rb_intern("binmode")); } diff --git a/test/ruby/test_io_m17n.rb b/test/ruby/test_io_m17n.rb index 9fb3c63e2a..59a691cbd6 100644 --- a/test/ruby/test_io_m17n.rb +++ b/test/ruby/test_io_m17n.rb @@ -979,11 +979,18 @@ EOT } end + def test_both_textmode_binmode + assert_raise(ArgumentError) { open("not-exist", "r", :textmode=>true, :binmode=>true) } + end + def test_textmode_decode_universal_newline_read with_tmpdir { generate_file("t.crlf", "a\r\nb\r\nc\r\n") assert_equal("a\nb\nc\n", File.read("t.crlf", mode:"rt:euc-jp:utf-8")) assert_equal("a\nb\nc\n", File.read("t.crlf", mode:"rt")) + open("t.crlf", "rt:euc-jp:utf-8") {|f| assert_equal("a\nb\nc\n", f.read) } + open("t.crlf", "rt") {|f| assert_equal("a\nb\nc\n", f.read) } + open("t.crlf", "r", :textmode=>true) {|f| assert_equal("a\nb\nc\n", f.read) } generate_file("t.cr", "a\rb\rc\r") assert_equal("a\nb\nc\n", File.read("t.cr", mode:"rt:euc-jp:utf-8")) @@ -1105,6 +1112,9 @@ EOT open("t.txt", "rb") {|f| assert_equal(src, f.read) } + open("t.txt", "r", :binmode=>true) {|f| + assert_equal(src, f.read) + } if File::BINARY == 0 open("t.txt", "r") {|f| assert_equal(src, f.read) |