From 860c2331039537c4d0c5c8c92ae1e89395f0edcc Mon Sep 17 00:00:00 2001 From: akr Date: Sat, 23 Aug 2008 02:23:42 +0000 Subject: * 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 --- io.c | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) (limited to 'io.c') diff --git a/io.c b/io.c index 0cca5b07f5..a87b8f3bef 100644 --- a/io.c +++ b/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")); } -- cgit v1.2.3