1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

* 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
This commit is contained in:
akr 2008-08-19 18:38:32 +00:00
parent 77ba9a5f56
commit b929da2a1e
3 changed files with 51 additions and 37 deletions

View file

@ -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.

View file

@ -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

77
io.c
View file

@ -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;
}
@ -3613,45 +3616,45 @@ rb_io_modenum_flags(int mode)
return flags;
}
int
rb_io_flags_modenum(int flags)
{
int mode = 0;
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;
}
if (flags & FMODE_APPEND) {
mode |= O_APPEND;
}
if (flags & FMODE_TRUNC) {
mode |= O_TRUNC;
}
if (flags & FMODE_CREATE) {
mode |= O_CREAT;
}
#ifdef O_BINARY
if (flags & FMODE_BINMODE) {
mode |= O_BINARY;
}
#endif
return mode;
}
int
rb_io_mode_modenum(const char *mode)
{
int flags = 0;
const char *m = mode;
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);
}
while (*m) {
switch (*m++) {
case 'b':
#ifdef O_BINARY
flags |= O_BINARY;
#endif
break;
case '+':
flags = (flags & ~O_ACCMODE) | O_RDWR;
break;
default:
goto error;
case ':':
return flags;
}
}
return flags;
return rb_io_flags_modenum(rb_io_mode_flags(mode));
}
#define MODENUM_MAX 4