From b929da2a1e03da52fd630d71a940858051f0f456 Mon Sep 17 00:00:00 2001 From: akr Date: Tue, 19 Aug 2008 18:38:32 +0000 Subject: * include/ruby/io.h (FMODE_TRUNC): new constant. * io.c (rb_io_mode_flags): set FMODE_TRUNC for "w". (rb_io_modenum_flags): set FMODE_TRUNC for O_TRUNC. (rb_io_flags_modenum): new function. (rb_io_mode_modenum): just use rb_io_mode_flags and rb_io_flags_modenum. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@18713 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 10 +++++++++ include/ruby/io.h | 1 + io.c | 67 +++++++++++++++++++++++++++++-------------------------- 3 files changed, 46 insertions(+), 32 deletions(-) diff --git a/ChangeLog b/ChangeLog index 83c1899cd2..86c060cfc4 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,13 @@ +Wed Aug 20 03:36:45 2008 Tanaka Akira + + * include/ruby/io.h (FMODE_TRUNC): new constant. + + * io.c (rb_io_mode_flags): set FMODE_TRUNC for "w". + (rb_io_modenum_flags): set FMODE_TRUNC for O_TRUNC. + (rb_io_flags_modenum): new function. + (rb_io_mode_modenum): just use rb_io_mode_flags and + rb_io_flags_modenum. + Wed Aug 20 02:36:21 2008 Tanaka Akira * io.c (fopen): macro for vms removed. fopen is not used now. diff --git a/include/ruby/io.h b/include/ruby/io.h index b588d98219..391ada81f2 100644 --- a/include/ruby/io.h +++ b/include/ruby/io.h @@ -81,6 +81,7 @@ typedef struct rb_io_t { #define FMODE_DUPLEX 0x0020 #define FMODE_APPEND 0x0040 #define FMODE_CREATE 0x0080 +#define FMODE_TRUNC 0x0100 #define FMODE_WSPLIT 0x0200 #define FMODE_WSPLIT_INITIALIZED 0x0400 diff --git a/io.c b/io.c index 80e7216546..09c34f32f1 100644 --- a/io.c +++ b/io.c @@ -3553,7 +3553,7 @@ rb_io_mode_flags(const char *mode) flags |= FMODE_READABLE; break; case 'w': - flags |= FMODE_WRITABLE | FMODE_CREATE; + flags |= FMODE_WRITABLE | FMODE_TRUNC | FMODE_CREATE; break; case 'a': flags |= FMODE_WRITABLE | FMODE_APPEND | FMODE_CREATE; @@ -3601,6 +3601,9 @@ rb_io_modenum_flags(int mode) if (mode & O_APPEND) { flags |= FMODE_APPEND; } + if (mode & O_TRUNC) { + flags |= FMODE_TRUNC; + } if (mode & O_CREAT) { flags |= FMODE_CREATE; } @@ -3614,44 +3617,44 @@ rb_io_modenum_flags(int mode) } int -rb_io_mode_modenum(const char *mode) +rb_io_flags_modenum(int flags) { - int flags = 0; - const char *m = mode; + int mode = 0; - switch (*m++) { - case 'r': - flags |= O_RDONLY; - break; - case 'w': - flags |= O_WRONLY | O_CREAT | O_TRUNC; - break; - case 'a': - flags |= O_WRONLY | O_CREAT | O_APPEND; - break; - default: - error: - rb_raise(rb_eArgError, "invalid access mode %s", mode); + switch (flags & FMODE_READWRITE) { + case FMODE_READABLE: + mode |= O_RDONLY; + break; + case FMODE_WRITABLE: + mode |= O_WRONLY; + break; + case FMODE_READWRITE: + mode |= O_RDWR; + break; } - while (*m) { - switch (*m++) { - case 'b': + if (flags & FMODE_APPEND) { + mode |= O_APPEND; + } + if (flags & FMODE_TRUNC) { + mode |= O_TRUNC; + } + if (flags & FMODE_CREATE) { + mode |= O_CREAT; + } #ifdef O_BINARY - flags |= O_BINARY; -#endif - break; - case '+': - flags = (flags & ~O_ACCMODE) | O_RDWR; - break; - default: - goto error; - case ':': - return flags; - } + if (flags & FMODE_BINMODE) { + mode |= O_BINARY; } +#endif - return flags; + return mode; +} + +int +rb_io_mode_modenum(const char *mode) +{ + return rb_io_flags_modenum(rb_io_mode_flags(mode)); } #define MODENUM_MAX 4 -- cgit v1.2.3