* 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
This commit is contained in:
parent
3721df734c
commit
860c233103
@ -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.
|
||||
|
18
io.c
18
io.c
@ -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"));
|
||||
}
|
||||
|
@ -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)
|
||||
|
Loading…
x
Reference in New Issue
Block a user