From: nobu.nakada@... Date: 2002-05-10T09:14:52+09:00 Subject: [ruby-list:35033] Re: FILE_READPTR なかだです。 # 青木さんはruby-dev入ってましたっけ。 At Fri, 10 May 2002 00:21:23 +0900, Daisuke Aoki wrote: > [ruby-list:35011]で言われているように入力の改行コードが CRLF の場合に、 > さらに、setup.exe で設定されるレジストリの設定(マウントのフラグ)が > なされていない場合に起きることがわかりました。 > この場合、出力の改行コードは LF になっています。 再現できました。これでどうでしょう。 Index: io.c =================================================================== RCS file: /cvs/ruby/src/ruby/io.c,v retrieving revision 1.137 diff -u -2 -p -r1.137 io.c --- io.c 2002/05/02 07:50:36 1.137 +++ io.c 2002/05/09 20:39:13 @@ -704,4 +704,35 @@ io_read(argc, argv, io) } +#if defined __CYGWIN__ +#define CRLF_CONVERT +#endif + +#ifdef CRLF_CONVERT +#if defined __CYGWIN__ && defined __SCLE +#define TEXT_MODE(fptr) ((fptr)->f->_flags & __SCLE) +#else +#define TEXT_MODE(fptr) (!((fptr)->mode & FMODE_BINMODE)) +#endif +static int +uncountcr(ptr, len) + const char *ptr; + int len; +{ + int count = len; + while (len-- > 1) { + if (*ptr++ == '\r' && *ptr == '\n') { + ptr++; + --len; + --count; + } + } + if (len == 0 && *ptr == '\r') --count; /* may wait '\n' */ + return count; +} +#else +#define TEXT_MODE(fptr) (0) +#define uncountcr(ptr, len) (len) +#endif + static int appendline(fptr, delim, strp) @@ -722,9 +753,12 @@ appendline(fptr, delim, strp) #ifdef READ_DATA_PENDING_PTR int pending = READ_DATA_PENDING_COUNT(f); - if (pending > 0) { + while (pending > 0) { const char *p = READ_DATA_PENDING_PTR(f); const char *e = memchr(p, delim, pending); long last = 0; if (e) pending = e - p + 1; +#ifdef CRLF_CONVERT + if (TEXT_MODE(fptr)) pending = uncountcr(p, pending); +#endif if (!NIL_P(str)) { last = RSTRING(str)->len; @@ -736,7 +770,17 @@ appendline(fptr, delim, strp) if (c != EOF) { RSTRING(str)->ptr[last++] = c; + } + pending = fread(RSTRING(str)->ptr + last, 1, pending, f); +#ifdef CRLF_CONVERT + if (TEXT_MODE(fptr)) { + rb_str_resize(str, last + pending); + if (RSTRING(str)->ptr[last + pending - 1] == delim) + return delim; + pending = READ_DATA_PENDING_COUNT(f); + continue; } - fread(RSTRING(str)->ptr + last, 1, pending, f); /* must not fail */ +#endif if (e) return delim; + break; } rb_thread_wait_fd(fileno(f)); @@ -800,9 +844,18 @@ swallow(fptr, term) const char *p = READ_DATA_PENDING_PTR(f); int i; +#ifdef CRLF_CONVERT + if (TEXT_MODE(fptr)) { + if ((c = getc(f)) != term) { + ungetc(c, f); + return Qtrue; + } + continue; + } +#endif if (cnt > sizeof buf) cnt = sizeof buf; if (*p != term) return Qtrue; i = cnt; while (--i && *++p == term); - if (!fread(buf, 1, cnt - i, f)) /* must not fail */ + if (!(cnt = fread(buf, 1, cnt - i, f))) /* must not fail */ rb_sys_fail(fptr->path); } -- --- 僕の前にBugはない。 --- 僕の後ろにBugはできる。 中田 伸悦