From: nobu.nakada@... Date: 2002-09-22T02:39:26+09:00 Subject: [ruby-dev:18342] Re: rubicon on EWS4800 なかだです。 At Sun, 22 Sep 2002 02:11:35 +0900, Tanaka Akira wrote: > % echo aaa > 0; bin/ruby -e 'open("0", "r+") {|f| f.gets; f.puts("bbb")}'; cat 0 > aaa > aaa > bbb > > この例では、ファイルの内容は "aaa\n" しかないわけで、先読みは gets で > 使い尽くしているわけですが、puts に影響を与えてしまいます。 手抜きですが。 flushが必要かどうか、configureで見るようにしたほうがいいでしょ うか。 Index: io.c =================================================================== RCS file: /cvs/ruby/src/ruby/io.c,v retrieving revision 1.159 diff -u -2 -p -r1.159 io.c --- io.c 17 Sep 2002 13:52:45 -0000 1.159 +++ io.c 21 Sep 2002 17:34:53 -0000 @@ -190,4 +190,9 @@ rb_io_check_readable(fptr) rb_raise(rb_eIOError, "not opened for reading"); } + if ((fptr->mode & FMODE_WBUF) && !fptr->f2) { + fflush(fptr->f); + fptr->mode &= ~FMODE_WBUF; + } + fptr->mode |= FMODE_RBUF; } @@ -199,4 +204,8 @@ rb_io_check_writable(fptr) rb_raise(rb_eIOError, "not opened for writing"); } + if ((fptr->mode & FMODE_RBUF) && !fptr->f2) { + fflush(fptr->f); + fptr->mode &= ~FMODE_RBUF; + } } Index: rubyio.h =================================================================== RCS file: /cvs/ruby/src/ruby/rubyio.h,v retrieving revision 1.18 diff -u -2 -p -r1.18 rubyio.h --- rubyio.h 16 Aug 2002 02:52:25 -0000 1.18 +++ rubyio.h 21 Sep 2002 17:35:51 -0000 @@ -33,4 +33,5 @@ typedef struct OpenFile { #define FMODE_SYNC 8 #define FMODE_WBUF 16 +#define FMODE_RBUF 32 #define GetOpenFile(obj,fp) rb_io_check_closed((fp) = RFILE(rb_io_taint_check(obj))->fptr) -- --- 僕の前にBugはない。 --- 僕の後ろにBugはできる。 中田 伸悦