summaryrefslogtreecommitdiff
path: root/ext/stringio
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2004-11-18 01:11:01 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2004-11-18 01:11:01 +0000
commit27e4aa4a937c032073ee265aa0e71c430bf5774f (patch)
tree2ecad42b5e28e028c1b5166ab3e74acb726a60fd /ext/stringio
parente766a04a573d5d878678db553d9b539322f734a6 (diff)
* 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
Diffstat (limited to 'ext/stringio')
-rw-r--r--ext/stringio/stringio.c22
1 files changed, 12 insertions, 10 deletions
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: