[#19457] equality between "a" and Exception.new("a") — Tanaka Akira <akr@...17n.org>

ふと気がついたのですが、

39 messages 2003/02/02
[#19460] Re: equality between "a" and Exception.new("a") — matz@... (Yukihiro Matsumoto) 2003/02/03

まつもと ゆきひろです

[#19473] Re: equality between "a" and Exception.new("a") — Tanaka Akira <akr@...17n.org> 2003/02/04

In article <1044245817.592933.31973.nullmailer@picachu.netlab.jp>,

[#19474] Re: equality between "a" and Exception.new("a") — matz@... (Yukihiro Matsumoto) 2003/02/04

まつもと ゆきひろです

[#19475] Re: equality between "a" and Exception.new("a") — Tanaka Akira <akr@...17n.org> 2003/02/04

In article <1044329220.257740.28127.nullmailer@picachu.netlab.jp>,

[#19476] Re: equality between "a" and Exception.new("a") — matz@... (Yukihiro Matsumoto) 2003/02/04

まつもと ゆきひろです

[#19477] Re: equality between "a" and Exception.new("a") — Tanaka Akira <akr@...17n.org> 2003/02/04

In article <1044331431.138035.28173.nullmailer@picachu.netlab.jp>,

[#19478] Re: equality between "a" and Exception.new("a") — matz@... (Yukihiro Matsumoto) 2003/02/04

まつもと ゆきひろです

[#19479] Re: equality between "a" and Exception.new("a") — Tanaka Akira <akr@...17n.org> 2003/02/04

In article <1044332948.099873.28206.nullmailer@picachu.netlab.jp>,

[#19482] Re: equality between "a" and Exception.new("a") — matz@... (Yukihiro Matsumoto) 2003/02/04

まつもと ゆきひろです

[#19486] Re: equality between "a" and Exception.new("a") — Tanaka Akira <akr@...17n.org> 2003/02/04

In article <1044338964.502066.28474.nullmailer@picachu.netlab.jp>,

[#19491] Re: equality between "a" and Exception.new("a") — matz@... (Yukihiro Matsumoto) 2003/02/04

まつもと ゆきひろです

[#19493] Re: equality between "a" and Exception.new("a") — matz@... (Yukihiro Matsumoto) 2003/02/04

まつもと ゆきひろです

[#19556] compare between String and Exception — Tanaka Akira <akr@...17n.org> 2003/02/12

さらに気が付いたのですが、

[#19514] [Oniguruma] Version 1.7.1 — "K.Kosako" <kosako@...>

ftp.ruby-lang.orgに、onigd20030207.tar.gzを置きました。

19 messages 2003/02/07

[#19548] [PATCH] file.c for (PR#389) and (PR#390) — nobu.nakada@...

なかだです。

20 messages 2003/02/11
[#19572] Re: [PATCH] file.c for (PR#389) and (PR#390) — pegacorn@... 2003/02/14

From: nobu.nakada@nifty.ne.jp

[#19648] Re: SEGV at search_method in eval.c (PR#400) — nobu.nakada@...

なかだです。

13 messages 2003/02/24

[ruby-dev:19565] Re: Fw: Ruby 1.8.0 bugs

From: nobu.nakada@...
Date: 2003-02-14 03:20:08 UTC
List: ruby-dev #19565
なかだです。

At Fri, 14 Feb 2003 11:09:23 +0900,
Yukihiro Matsumoto wrote:
> |> 1) line numbers reported by error messages are too small.
> |> 2) file reading/writing is inconsistent.
> |
> |textmodeでmountしたディレクトリで改行コードCR+LFで実行すると、再現できました。
> |binmodeでmountしなおしたほうが不具合に遭いにくいと思います。
> 
> ありがとうございます。binmodeでmountしたほうが良いというのは
> 以前にも聞いたことがありますが、
> 
>   * これは一般的にそういうものなのでしょうか
>   * Ruby側で対処する必要があるものでしょうか

一般的にはバッファ内を調べて読む長さを決めるなんてことはしませ
んから、Ruby側で対処する必要があると思います。

(A) バッファ内の検査を止める
(B) cygwinでは常にバイナリモードにする
(C) テキストモードだったら適当にfread()する長さを減らす。

結構I/Oのパフォーマンスに効いてくるのでできればAは避けたいです。
とりあえずCのパッチも作ってみましたが、なんとなくBがいいような
気もして来ました。


Index: io.c
===================================================================
RCS file: /cvs/ruby/src/ruby/io.c,v
retrieving revision 1.185
diff -u -2 -p -r1.185 io.c
--- io.c	9 Feb 2003 18:36:22 -0000	1.185
+++ io.c	14 Feb 2003 03:02:58 -0000
@@ -848,4 +848,11 @@ io_read(argc, argv, io)
 }
 
+#if defined(__CYGWIN__) && defined(__SCLE)
+#define LINE_CONV_MODE(f) ((f)->_flags & __SCLE)
+#endif
+#ifndef LINE_CONV_MODE
+#define LINE_CONV_MODE(f) (0)
+#endif
+
 static int
 appendline(fptr, delim, strp)
@@ -870,5 +877,11 @@ appendline(fptr, delim, strp)
 	    const char *e = memchr(p, delim, pending);
 	    long last = 0, len = (c != EOF);
-	    if (e) pending = e - p + 1;
+	    if (e) {
+		pending = e - p + 1;
+#ifdef LINE_CONV_MODE
+		if (LINE_CONV_MODE(f))
+		    pending = (pending + 1) >> 1;
+#endif
+	    }
 	    len += pending;
 	    if (!NIL_P(str)) {
@@ -878,5 +891,4 @@ appendline(fptr, delim, strp)
 	    else {
 		*strp = str = rb_str_buf_new(len);
-		RSTRING(str)->len = len;
 		RSTRING(str)->ptr[len] = '\0';
 	    }
@@ -884,6 +896,26 @@ appendline(fptr, delim, strp)
 		RSTRING(str)->ptr[last++] = c;
 	    }
-	    fread(RSTRING(str)->ptr + last, 1, pending, f); /* must not fail */
-	    if (e) return delim;
+	    len = fread(RSTRING(str)->ptr + last, 1, pending, f);
+	    if (len < 0) rb_sys_fail(fptr->path);
+	    if (len == 0) return EOF;
+	    RSTRING(str)->len = last += len;
+	    if (e && (!LINE_CONV_MODE(f) || RSTRING(str)->ptr[last - 1] == delim))
+		return delim;
+#ifdef LINE_CONV_MODE
+	    if (LINE_CONV_MODE(f)) {
+		while ((pending = READ_DATA_PENDING_COUNT(f)) > 0) {
+		    p = READ_DATA_PENDING_PTR(f);
+		    e = memchr(p, delim, pending);
+		    if (e) pending = ((e - p) >> 1) + 1;
+		    rb_str_resize(str, last + pending);
+		    len = fread(RSTRING(str)->ptr + last, 1, pending, f);
+		    if (len < 0) rb_sys_fail(fptr->path);
+		    if (len == 0) return EOF;
+		    RSTRING(str)->len = last += len;
+		    if (e && RSTRING(str)->ptr[last - 1] == delim)
+			return delim;
+		}
+	    }
+#endif
 	}
 	else if (c != EOF) {


-- 
--- 僕の前にBugはない。
--- 僕の後ろにBugはできる。
    中田 伸悦

In This Thread