aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorakr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2008-08-19 18:38:32 +0000
committerakr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2008-08-19 18:38:32 +0000
commitb929da2a1e03da52fd630d71a940858051f0f456 (patch)
treeb0eceddce8bcf958b63429f709e6a5a7a66507c6
parent77ba9a5f56ff86d1dc014da32b9e385b92c9626b (diff)
downloadruby-b929da2a1e03da52fd630d71a940858051f0f456.tar.gz
* 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
-rw-r--r--ChangeLog10
-rw-r--r--include/ruby/io.h1
-rw-r--r--io.c67
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 <akr@fsij.org>
+
+ * 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 <akr@fsij.org>
* 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