From fbb88b011aab36a5d3bed8be3098b9d4d439cee1 Mon Sep 17 00:00:00 2001 From: matz Date: Wed, 6 Oct 2004 07:40:06 +0000 Subject: * io.c (rb_io_mode_flags): preserve append mode flag. [ruby-dev:24436] * io.c (rb_io_modenum_mode): do not use external output buffer. * string.c (rb_str_justify): differ pointer retrieval to prevent padding string modification. [ruby-dev:24434] * range.c (range_each_func): allow func to terminate loop by returning RANGE_EACH_BREAK. * range.c (member_i): use RANGE_EACH_BREAK. [ruby-talk:114959] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@6999 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- io.c | 72 ++++++++++++++++++++++++++++++++++---------------------------------- 1 file changed, 36 insertions(+), 36 deletions(-) (limited to 'io.c') diff --git a/io.c b/io.c index 5515718b29..b1e6c77a3a 100644 --- a/io.c +++ b/io.c @@ -2288,11 +2288,16 @@ rb_io_flags_mode(flags) int flags; { #ifdef O_BINARY -# define MODE_BINMODE(a,b) ((flags & O_BINARY) ? (a) : (b)) +# define MODE_BINMODE(a,b) ((flags & FMODE_BINMODE) ? (a) : (b)) #else # define MODE_BINMODE(a,b) (a) #endif - + if (flags & FMODE_APPEND) { + if ((flags & FMODE_READWRITE) == FMODE_READWRITE) { + return MODE_BINMODE("a+", "ab+"); + } + return MODE_BINMODE("a", "ab"); + } switch (flags & FMODE_READWRITE) { case FMODE_READABLE: return MODE_BINMODE("r", "rb"); @@ -2320,7 +2325,7 @@ rb_io_mode_flags(mode) flags |= FMODE_WRITABLE; break; case 'a': - flags |= FMODE_WRITABLE; + flags |= FMODE_WRITABLE | FMODE_APPEND; break; default: error: @@ -2357,10 +2362,13 @@ rb_io_modenum_flags(mode) flags = FMODE_WRITABLE; break; case O_RDWR: - flags = FMODE_WRITABLE|FMODE_READABLE; + flags = FMODE_READWRITE; break; } + if (mode & O_APPEND) { + flags |= FMODE_APPEND; + } #ifdef O_BINARY if (mode & O_BINARY) { flags |= FMODE_BINMODE; @@ -2413,36 +2421,30 @@ rb_io_mode_modenum(mode) #define MODENUM_MAX 4 static char* -rb_io_modenum_mode(flags, mode) +rb_io_modenum_mode(flags) int flags; - char *mode; { - char *p = mode; - +#ifdef O_BINARY +# define MODE_BINARY(a,b) ((mode & O_BINARY) ? (a) : (b)) +#else +# define MODE_BINARY(a,b) (a) +#endif + if (flags & O_APPEND) { + if ((flags & O_RDWR) == O_RDWR) { + return MODE_BINARY("a+", "ab+"); + } + return MODE_BINARY("a", "ab"); + } switch (flags & (O_RDONLY|O_WRONLY|O_RDWR)) { case O_RDONLY: - *p++ = 'r'; - break; + return MODE_BINARY("r", "rb"); case O_WRONLY: - *p++ = 'w'; - break; + return MODE_BINARY("w", "wb"); case O_RDWR: - *p++ = 'r'; - *p++ = '+'; - break; + return MODE_BINARY("r+", "rb+"); } - *p++ = '\0'; -#ifdef O_BINARY - if (flags & O_BINARY) { - if (mode[1] == '+') { - mode[1] = 'b'; mode[2] = '+'; mode[3] = '\0'; - } - else { - mode[1] = 'b'; mode[2] = '\0'; - } - } -#endif - return mode; + rb_raise(rb_eArgError, "illegal access modenum %o", flags); + return NULL; /* not reached */ } static int @@ -2567,12 +2569,11 @@ rb_file_sysopen_internal(io, fname, flags, mode) OpenFile *fptr; int fd; char *m; - char mbuf[MODENUM_MAX]; MakeOpenFile(io, fptr); fd = rb_sysopen(fname, flags, mode); - m = rb_io_modenum_mode(flags, mbuf); + m = rb_io_modenum_mode(flags); fptr->mode = rb_io_modenum_flags(flags); fptr->f = rb_fdopen(fd, m); fptr->path = strdup(fname); @@ -2871,13 +2872,12 @@ rb_io_popen(str, argc, argv, klass) { char *mode; VALUE pname, pmode, port; - char mbuf[MODENUM_MAX]; if (rb_scan_args(argc, argv, "11", &pname, &pmode) == 1) { mode = "r"; } else if (FIXNUM_P(pmode)) { - mode = rb_io_modenum_mode(FIX2INT(pmode), mbuf); + mode = rb_io_modenum_mode(FIX2INT(pmode)); } else { mode = StringValuePtr(pmode); @@ -2964,7 +2964,7 @@ rb_io_s_popen(argc, argv, klass) mode = "r"; } else if (FIXNUM_P(pmode)) { - mode = rb_io_modenum_mode(FIX2INT(pmode), mbuf); + mode = rb_io_modenum_mode(FIX2INT(pmode)); } else { strncpy(mbuf, StringValuePtr(pmode), sizeof(mbuf) - 1); @@ -3346,7 +3346,7 @@ rb_io_reopen(argc, argv, file) VALUE file; { VALUE fname, nmode; - char mode[MODENUM_MAX]; + char *mode; OpenFile *fptr; rb_secure(4); @@ -3375,8 +3375,9 @@ rb_io_reopen(argc, argv, file) } fptr->path = strdup(RSTRING(fname)->ptr); + mode = rb_io_flags_mode(fptr->mode); if (!fptr->f) { - fptr->f = rb_fopen(fptr->path, rb_io_flags_mode(fptr->mode)); + fptr->f = rb_fopen(fptr->path, mode); if (fptr->f2) { fclose(fptr->f2); fptr->f2 = 0; @@ -3936,7 +3937,6 @@ rb_io_initialize(argc, argv, io) VALUE fnum, mode, orig; OpenFile *fp, *ofp = NULL; int fd, flags, fmode; - char mbuf[MODENUM_MAX]; rb_secure(4); rb_scan_args(argc, argv, "11", &fnum, &mode); @@ -3973,7 +3973,7 @@ rb_io_initialize(argc, argv, io) if (!ofp) { MakeOpenFile(io, fp); fp->mode = fmode; - fp->f = rb_fdopen(fd, rb_io_modenum_mode(flags, mbuf)); + fp->f = rb_fdopen(fd, rb_io_modenum_mode(flags)); } else { if (argc == 2) { -- cgit v1.2.3