From 27e4aa4a937c032073ee265aa0e71c430bf5774f Mon Sep 17 00:00:00 2001 From: nobu Date: Thu, 18 Nov 2004 01:11:01 +0000 Subject: * io.c, rubyio.h (rb_io_modenum_flags): exported. * ext/stringio/stringio.c (strio_initialize): allow Fixnum as mode as well as IO.new does. [ruby-dev:24896] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@7304 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ext/stringio/stringio.c | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) (limited to 'ext/stringio/stringio.c') diff --git a/ext/stringio/stringio.c b/ext/stringio/stringio.c index 89d2f06290..84ee3f28a7 100644 --- a/ext/stringio/stringio.c +++ b/ext/stringio/stringio.c @@ -201,7 +201,7 @@ strio_initialize(argc, argv, self) { struct StringIO *ptr = check_strio(self); VALUE string, mode; - const char* m; + int trunc = Qfalse; if (!ptr) { DATA_PTR(self) = ptr = strio_alloc(); @@ -209,21 +209,23 @@ strio_initialize(argc, argv, self) rb_call_super(0, 0); switch (rb_scan_args(argc, argv, "02", &string, &mode)) { case 2: - StringValue(mode); + if (FIXNUM_P(mode)) { + int flags = FIX2INT(mode); + ptr->flags = rb_io_modenum_flags(flags); + trunc = flags & O_TRUNC; + } + else { + const char *m = StringValueCStr(mode); + ptr->flags = rb_io_mode_flags(m); + trunc = *m == 'w'; + } StringValue(string); - if (!(m = RSTRING(mode)->ptr)) m = ""; - ptr->flags = rb_io_mode_flags(m); if ((ptr->flags & FMODE_WRITABLE) && OBJ_FROZEN(string)) { errno = EACCES; rb_sys_fail(0); } - switch (*m) { - case 'a': - ptr->flags |= FMODE_APPEND; - break; - case 'w': + if (trunc) { rb_str_resize(string, 0); - break; } break; case 1: -- cgit v1.2.3