aboutsummaryrefslogtreecommitdiffstats
path: root/io.c
diff options
context:
space:
mode:
authormatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2004-10-05 01:37:46 +0000
committermatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2004-10-05 01:37:46 +0000
commitc800d0b75d23e2ac8c10674ff41cc25b0c793ddd (patch)
treef5467a0440e49ed7016e2d21f44ff00de5804855 /io.c
parent889a620b769145a7c20c7ce78aff62d80e485496 (diff)
downloadruby-c800d0b75d23e2ac8c10674ff41cc25b0c793ddd.tar.gz
* io.c (rb_fopen): mode string copy at the lowest level.
* io.c (rb_io_flags_mode): requires output buffer no more. no allocation needed. * array.c (rb_ary_index): takes a block to compare items in an array. [ruby-talk:113069] [Ruby2] * array.c (rb_ary_rindex): ditto. * marshal.c (r_byte): retrieve pointer from string value for each time. [ruby-dev:24404] * marshal.c (r_bytes0): ditto. * enum.c (sort_by_i): re-entrance check added. [ruby-dev:24399] * io.c (io_read): should freeze all reading buffer. [ruby-dev:24400] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@6996 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'io.c')
-rw-r--r--io.c61
1 files changed, 23 insertions, 38 deletions
diff --git a/io.c b/io.c
index 9f34783d0b..b5dddd114b 100644
--- a/io.c
+++ b/io.c
@@ -1194,8 +1194,8 @@ io_read(argc, argv, io)
StringValue(str);
rb_str_modify(str);
rb_str_resize(str,len);
- FL_SET(str, FL_FREEZE);
}
+ FL_SET(str, FL_FREEZE);
if (len == 0) return str;
READ_CHECK(fptr->f);
@@ -2283,37 +2283,26 @@ rb_io_binmode(io)
return io;
}
-char*
-rb_io_flags_mode(flags, mode)
+static char*
+rb_io_flags_mode(flags)
int flags;
- char *mode;
{
- char *p = mode;
+#ifdef O_BINARY
+# define MODE_BINMODE(a,b) ((mode & O_BINARY) ? (a) : (b))
+#else
+# define MODE_BINMODE(a,b) (a)
+#endif
switch (flags & FMODE_READWRITE) {
case FMODE_READABLE:
- *p++ = 'r';
- break;
+ return MODE_BINMODE("r", "rb");
case FMODE_WRITABLE:
- *p++ = 'w';
- break;
+ return MODE_BINMODE("w", "wb");
case FMODE_READWRITE:
- *p++ = 'r';
- *p++ = '+';
- break;
- }
- *p++ = '\0';
-#ifdef O_BINARY
- if (flags & FMODE_BINMODE) {
- if (mode[1] == '+') {
- mode[1] = 'b'; mode[2] = '+'; mode[3] = '\0';
- }
- else {
- mode[1] = 'b'; mode[2] = '\0';
- }
+ return MODE_BINMODE("r+", "rb+");
}
-#endif
- return mode;
+ rb_raise(rb_eArgError, "illegal access mode %o", flags);
+ return NULL; /* not reached */
}
int
@@ -2483,12 +2472,15 @@ rb_fopen(fname, mode)
const char *mode;
{
FILE *file;
+ char mbuf[MODENUM_MAX];
- file = fopen(fname, mode);
+ strncpy(mbuf, mode, sizeof(mbuf) - 1);
+ mbuf[sizeof(mbuf) - 1] = 0;
+ file = fopen(fname, mbuf);
if (!file) {
if (errno == EMFILE || errno == ENFILE) {
rb_gc();
- file = fopen(fname, mode);
+ file = fopen(fname, mbuf);
}
if (!file) {
rb_sys_fail(fname);
@@ -2550,13 +2542,11 @@ rb_file_open_internal(io, fname, mode)
const char *fname, *mode;
{
OpenFile *fptr;
- char mbuf[MODENUM_MAX];
MakeOpenFile(io, fptr);
-
fptr->mode = rb_io_mode_flags(mode);
fptr->path = strdup(fname);
- fptr->f = rb_fopen(fptr->path, rb_io_flags_mode(fptr->mode, mbuf));
+ fptr->f = rb_fopen(fptr->path, rb_io_flags_mode(fptr->mode));
return io;
}
@@ -2748,13 +2738,13 @@ pipe_open(argc, argv, pname, mode)
int modef = rb_io_mode_flags(mode);
int pid = 0;
OpenFile *fptr;
- FILE *fpr, *fpw;
VALUE port, arg0;
#if defined(HAVE_FORK)
int status;
struct popen_arg arg;
volatile int doexec;
#elif defined(_WIN32)
+ FILE *fpr, *fpw;
int openmode = rb_io_mode_modenum(mode);
char *prog = NULL;
#endif
@@ -2861,7 +2851,7 @@ pipe_open(argc, argv, pname, mode)
fptr->f = PIPE_FDOPEN(0);
}
if (modef & FMODE_WRITABLE) {
- fpw = PIPE_FDOPEN(1);
+ FILE *fpw = PIPE_FDOPEN(1);
if (fptr->f) fptr->f2 = fpw;
else fptr->f = fpw;
}
@@ -3376,11 +3366,7 @@ rb_io_reopen(argc, argv, file)
}
if (!NIL_P(nmode)) {
- strncpy(mode, StringValuePtr(nmode), sizeof(mode));
- mode[sizeof(mode) - 1] = 0;
- }
- else {
- rb_io_flags_mode(fptr->mode, mode);
+ fptr->mode = rb_io_mode_flags(StringValuePtr(nmode));
}
if (fptr->path) {
@@ -3389,9 +3375,8 @@ rb_io_reopen(argc, argv, file)
}
fptr->path = strdup(RSTRING(fname)->ptr);
- fptr->mode = rb_io_mode_flags(mode);
if (!fptr->f) {
- fptr->f = rb_fopen(fptr->path, mode);
+ fptr->f = rb_fopen(fptr->path, rb_io_flags_mode(fptr->mode));
if (fptr->f2) {
fclose(fptr->f2);
fptr->f2 = 0;