[#18151] Regexp.last_match — WATANABE Tetsuya <llama@...01.gate01.com>
渡辺哲也です。
[#18186] [req] Marshal — keiju@... (Keiju ISHITSUKA)
けいじゅ@日本ラショナルソフトウェアです.
まつもと ゆきひろです
新井です。
まつもと ゆきひろです
In article <1031498274.659939.18144.nullmailer@picachu.netlab.jp>,
まつもと ゆきひろです
In article <1032189662.175916.22019.nullmailer@picachu.netlab.jp>,
[#18208] Re: [ruby-list:35875] Unsecure world writeabledir の警告 — "U.Nakamura" <usa@...>
こんにちは、なかむら(う)です。
わたなべです。
[#18229] Re: [ruby-cvs] rough/ext/stringio: * ruby-stringio.spec: 0.0.7, added changelog. — "U.Nakamura" <usa@...>
こんにちは、なかむら(う)です。
なかだです。
こんにちは、なかむら(う)です。
なかだです。
こんにちは、なかむら(う)です。
わたなべです。
わたなべです。
こんにちは、なかむら(う)です。
わたなべです。
こんにちは、なかむら(う)です。
なかだです。
こんにちは、なかむら(う)です。
こんにちは、なかむら(う)です。
わたなべです。
[#18246] Re: missing/vsnprintf.c: printf("%+f", -0.0) — WATANABE Hirofumi <eban@...>
わたなべです。
At Tue, 10 Sep 2002 12:21:10 +0900,
[#18262] mswin32: EINVAL on Process.kill — Minero Aoki <aamine@...>
あおきです。
[#18274] $0 handling on DOSISH — "U.Nakamura" <usa@...>
こんにちは、なかむら(う)です。
なかだです。
岩月と申します。
なかだです。
こんにちは、なかむら(う)です。
なかだです。
こんにちは、なかむら(う)です。
[#18285] rubicon on EWS4800 — Koji Arai <JCA02266@...>
新井です。
新井です。
まつもと ゆきひろです
新井です。
まつもと ゆきひろです
新井です。
なかだです。
In message <20020921.152641.11483667.JCA02266@nifty.ne.jp>
なかだです。
In article <200209211605.g8LG52p04564@sharui.nakada.kanuma.tochigi.jp>,
なかだです。
In article <200209211628.g8LGSxp04786@sharui.nakada.kanuma.tochigi.jp>,
なかだです。
In article <200209211739.g8LHdKp05495@sharui.nakada.kanuma.tochigi.jp>,
なかだです。
In article <200209220415.g8M4Fkp24392@sharui.nakada.kanuma.tochigi.jp>,
なかだです。
In article <200209260105.g8Q15PR08171@sharui.nakada.kanuma.tochigi.jp>,
なかだです。
In article <20020921.152641.11483667.JCA02266@nifty.ne.jp>,
なかだです。
In article <200209251737.g8PHbdR03024@sharui.nakada.kanuma.tochigi.jp>,
渡辺哲也です。
なかだです。
渡辺哲也です。
渡辺哲也です。
なかだです。
渡辺哲也です。
なかだです。
In article <200210020254.g922srH01700@sharui.nakada.kanuma.tochigi.jp>,
[#18314] class nest in module_eval — Minero Aoki <aamine@...>
あおきです。
[#18361] compile parse.y with -Wall — nobu.nakada@...
なかだです。
なかだです。
[#18371] Re: [ruby-cvs] ruby/lib/uri: * eval.c (ruby_run): should set toplevel visibility again here. — Kazuhiro NISHIYAMA <zn@...>
西山和広です。
[#18374] Re: [ruby-cvs] ruby/ext/tcltklib: * eval.c (ruby_run): should set toplevel visibility again here. — WATANABE Hirofumi <eban@...>
わたなべです。
まつもと ゆきひろです
なかだです。
わたなべです。
いがらしです。少し前の話ですが。
わたなべです。
なかだです。
まつもと ゆきひろです
なかだです。
まつもと ゆきひろです
[#18391] pstore.rb can make a broken store — YANAGAWA Kazuhisa <kjana@...4lab.to>
# お願いされたから書いてみよう :-)
In article <20020926134339.C8DAE1EE12@milestones.dm4lab.to>,
[ruby-dev:18397] Re: rubicon on EWS4800
なかだです。
At Fri, 27 Sep 2002 15:15:52 +0900,
Tanaka Akira wrote:
> > ということで、問題がないようであれば入れてしまおうかと思います
> > が。忘れないうちに。
>
> HP-UX で試してみました。失敗します。
>
> TestFile:
> ---------
> ./builtin/TestFile.rb:302:in `test_s_open'(TestFile)
> ./builtin/TestFile.rb:297:in `open'
> ./builtin/TestFile.rb:297:in `test_s_open'
> ./builtin/TestFile.rb:274:in `each'
> ./builtin/TestFile.rb:274:in `test_s_open'
> ....Expected: "<koala\n> "
> ....But was: "<nil>"
>
> うぅむ。問題が微妙に違うんですねぇ。
> (今回の発端となった EWS4800 ではどうなのだろう?)
>
> 取り出すと、
>
> hpux% echo wombat>z;./ruby -e 'File.open("z", "r+") {|f| p f.gets; f.puts("koara"); f.rewind; p f.gets; p f.gets}'
> "wombat\n"
> "wombat\n"
> nil
> hpux% cat z
> wombat
> hpux%
>
> という話ですが、rewind の前に flush すると
>
> hpux% echo wombat>z;./ruby -e 'File.open("z", "r+") {|f| p f.gets; f.puts("koara"); f.flush; f.rewind; p f.gets; p f.gets}'
> "wombat\n"
> "wombat\n"
> "koara\n"
> hpux%
>
> となってうまくいきます。
うーん、HP-UXだと[ruby-dev:18345]のテストはどっちになるんでしょ
う。
> fseeko(3S) によれば
>
> ERRORS
> fseek(), fseeko(), fseek_unlocked(), ftell(), ftello(),
> ftell_unlocked(), rewind() and rewind_unlocked() fail if the stream is
> unbuffered or the buffered data needs to be flushed, or ...
>
> だそうなので、上記の例のように buffered data が flush されなければなら
> ない場合には fail するはずだという気もしますが、rb_io_rewind を見る限
> りは fseeko が失敗したら例外が上がるはずなので失敗していないように思え
> ます。へんなの。
>
> それはそれとして、SUSv3 にも同様の文章があるので、fseek する前には
> 有無を言わさず fflush すべきなんでしょう。たぶん。
これは失敗するのが正しい動作で、glibcのようなのは規格から外れた
拡張ってことなんでしょうか。
とりあえずconfigure.inに入れてみましたが、SunOS 5.8だとこんな風
になるようです。
checking whether need to flush between R/W... yes
checking whether need to flush before seek... no
Index: configure.in
===================================================================
RCS file: /cvs/ruby/src/ruby/configure.in,v
retrieving revision 1.142
diff -u -2 -p -r1.142 configure.in
--- configure.in 25 Sep 2002 07:03:01 -0000 1.142
+++ configure.in 27 Sep 2002 09:01:48 -0000
@@ -568,4 +568,49 @@ else
fi
+AC_DEFUN(RUBY_CHECK_IO_NEED_FLUSH,
+[AC_CACHE_CHECK(whether need to flush [$1], [$2],
+ [AC_TRY_RUN([
+#include <stdio.h>
+
+char *fn = "conftest.dat";
+char *wombat = "wombat\n";
+char *koara = "koara\n";
+
+int main()
+{
+ char buf[BUFSIZ];
+ FILE *f;
+ int r = 1;
+
+ if (!(f = fopen(fn, "w+"))) return 1;
+ fputs(wombat, f);
+ fflush(f);
+ fseek(f, 0, 0);
+ if (!fgets(buf, BUFSIZ, f) || strcmp(buf, wombat)) goto fail;
+ ]ifelse(index($2,between_rw),-1,fflush(f);)[
+ fputs(koara, f);
+ ]ifelse(index($2,before_seek),-1,fflush(f);)[
+ fseek(f, 0, 0);
+ ]ifelse(index($2,between_rw),-1,fflush(f);)[
+ if (!fgets(buf, BUFSIZ, f) || strcmp(buf, wombat)) goto fail;
+ if (!fgets(buf, BUFSIZ, f) || strcmp(buf, koara)) goto fail;
+ r = 0;
+ fail:
+ fclose(f);
+ unlink(fn);
+ return r;
+}
+], [$2]=no, [$2]=yes, [$2]=yes)])])
+
+RUBY_CHECK_IO_NEED_FLUSH(between R/W, rb_cv_need_io_flush_between_rw)
+if test "$rb_cv_need_io_flush_between_rw" = yes; then
+ AC_DEFINE(NEED_IO_FLUSH_BETWEEN_RW, 1)
+fi
+
+RUBY_CHECK_IO_NEED_FLUSH(before seek, rb_cv_need_io_flush_before_seek)
+if test "$rb_cv_need_io_flush_before_seek" = yes; then
+ AC_DEFINE(NEED_IO_FLUSH_BEFORE_SEEK, 1)
+fi
+
dnl default value for $KANJI
DEFAULT_KCODE="KCODE_NONE"
Index: io.c
===================================================================
RCS file: /cvs/ruby/src/ruby/io.c,v
retrieving revision 1.160
diff -u -2 -p -r1.160 io.c
--- io.c 25 Sep 2002 07:03:01 -0000 1.160
+++ io.c 27 Sep 2002 08:20:56 -0000
@@ -183,4 +183,10 @@ rb_io_check_closed(fptr)
}
+#if NEED_IO_FLUSH_BETWEEN_RW || NEED_IO_FLUSH_BEFORE_SEEK
+#define SET_MODE_RBUF(fptr) ((fptr)->mode |= FMODE_RBUF)
+#else
+#define SET_MODE_RBUF(fptr) ((void)(fptr))
+#endif
+
void
rb_io_check_readable(fptr)
@@ -190,4 +196,10 @@ rb_io_check_readable(fptr)
rb_raise(rb_eIOError, "not opened for reading");
}
+#if NEED_IO_FLUSH_BETWEEN_RW
+ if ((fptr->mode & FMODE_WBUF) && !fptr->f2) {
+ fflush(fptr->f);
+ fptr->mode &= ~FMODE_WBUF;
+ }
+#endif
}
@@ -199,4 +211,10 @@ rb_io_check_writable(fptr)
rb_raise(rb_eIOError, "not opened for writing");
}
+#if NEED_IO_FLUSH_BETWEEN_RW
+ if ((fptr->mode & FMODE_RBUF) && !fptr->f2) {
+ fflush(fptr->f);
+ fptr->mode &= ~FMODE_RBUF;
+ }
+#endif
}
@@ -389,4 +407,20 @@ rb_io_tell(io)
#endif
+#ifdef NEED_IO_FLUSH_BEFORE_SEEK
+static void
+flush_before_seek(fptr)
+ OpenFile *fptr;
+{
+ if (fptr->mode & FMODE_RBUF) {
+ fflush(fptr->f);
+ }
+ if (fptr->mode & FMODE_WBUF) {
+ fflush(fptr->f2 ? fptr->f2 : fptr->f);
+ }
+}
+#else
+#define flush_before_seek(fptr) ((void)(fptr))
+#endif
+
static VALUE
rb_io_seek(io, offset, whence)
@@ -398,4 +432,5 @@ rb_io_seek(io, offset, whence)
GetOpenFile(io, fptr);
+ flush_before_seek(fptr);
pos = fseeko(fptr->f, NUM2OFFT(offset), whence);
if (pos != 0) rb_sys_fail(fptr->path);
@@ -429,4 +464,5 @@ rb_io_set_pos(io, offset)
GetOpenFile(io, fptr);
+ flush_before_seek(fptr);
pos = fseeko(fptr->f, NUM2OFFT(offset), SEEK_SET);
if (pos != 0) rb_sys_fail(fptr->path);
@@ -443,4 +479,5 @@ rb_io_rewind(io)
GetOpenFile(io, fptr);
+ flush_before_seek(fptr);
if (fseeko(fptr->f, 0L, 0) != 0) rb_sys_fail(fptr->path);
clearerr(fptr->f);
@@ -472,4 +509,5 @@ rb_io_eof(io)
if (ch != EOF) {
ungetc(ch, fptr->f);
+ SET_MODE_RBUF(fptr);
return Qfalse;
}
@@ -718,4 +756,5 @@ read_all(fptr, siz)
if (bytes == 0) return rb_str_new(0,0);
if (bytes != siz) rb_str_resize(str, bytes);
+ SET_MODE_RBUF(fptr);
return str;
@@ -755,4 +794,5 @@ io_read(argc, argv, io)
rb_sys_fail(fptr->path);
}
+ SET_MODE_RBUF(fptr);
RSTRING(str)->len = n;
RSTRING(str)->ptr[n] = '\0';
@@ -905,4 +945,5 @@ rb_io_getline_fast(fptr, delim)
if (!NIL_P(str)) {
+ SET_MODE_RBUF(fptr);
fptr->lineno++;
lineno = INT2FIX(fptr->lineno);
@@ -960,4 +1001,5 @@ rb_io_getline(rs, fptr)
if (!NIL_P(str)) {
+ SET_MODE_RBUF(fptr);
fptr->lineno++;
lineno = INT2FIX(fptr->lineno);
@@ -2233,4 +2275,6 @@ io_reopen(io, nfile)
}
if ((orig->mode & FMODE_READABLE) && pos >= 0) {
+ flush_before_seek(fptr);
+ flush_before_seek(orig);
fseeko(fptr->f, pos, SEEK_SET);
fseeko(orig->f, pos, SEEK_SET);
--
--- 僕の前にBugはない。
--- 僕の後ろにBugはできる。
中田 伸悦