なかだです。

At Fri, 27 Jul 2001 17:52:03 +0900,
matz / ruby-lang.org (Yukihiro Matsumoto) wrote:
> そら、むこうは外人ですから。

  もちろんそりゃそうですが。ちょっとマルチバイト化を気にしてた
ところだったもので。

> んで、1.6の方はこれからコミットしま
> すから、これをbackoutするなり、なんなりしてくださいませ。

  やっぱりまずいです。File.expand_path(".")で最後に"/."が付いて
しまいます。

  つーか、[ruby-dev:14075]もマルチバイトに関してはダメダメでし
た。[ruby-dev:14118]ならともかく。

> 1.7の方はちょっといじっちゃったんでどうしようかなあ。中村さ
> んの変更とconflictしてるのだった。

  あー、なるほど。しかしこうするなら++pはすべてp = CharNext(p)
にしないと。


Index: file.c =================================================================== RCS file: /cvs/ruby/src/ruby/file.c,v retrieving revision 1.65 diff -u -2 -p -r1.65 file.c --- file.c 2001/07/27 09:12:12 1.65 +++ file.c 2001/07/27 13:29:41 @@ -1333,5 +1333,5 @@ rb_file_s_expand_path(argc, argv) { VALUE fname, dname; - char *s, *p, *sbeg, *b; + char *s, *p, *b; char buf[MAXPATHLEN+2]; char *bend = buf + sizeof(buf) - 2; @@ -1341,5 +1341,5 @@ rb_file_s_expand_path(argc, argv) tainted = OBJ_TAINTED(fname); - s = sbeg = StringValuePtr(fname); + s = StringValuePtr(fname); p = buf; if (s[0] == '~') { @@ -1421,6 +1421,12 @@ rb_file_s_expand_path(argc, argv) switch (*s) { case '.': - if (*(s+1) && (s == sbeg || isdirsep(*(s - 1)))) { + if (*p != '/') { + *(p = CharNext(p)) = '.'; + if (p >= bend) goto toolong; + } + else { switch (*++s) { + case '\0': + continue; case '.': if (*(s+1) == '\0' || isdirsep(*(s+1))) { @@ -1430,10 +1436,7 @@ rb_file_s_expand_path(argc, argv) } else { + *(p = CharNext(p)) = '.'; *++p = '.'; - do { - *++p = '.'; - if (p >= bend) goto toolong; - } while (*++s == '.'); - --s; + if (p >= bend) goto toolong; } break; @@ -1442,12 +1445,11 @@ rb_file_s_expand_path(argc, argv) case '\\': #endif - if (!isdirsep(*p)) *++p = '/'; + if (!isdirsep(*p)) *(p = CharNext(p)) = '/'; break; default: - *++p = '.'; *++p = *s; break; + *(p = CharNext(p)) = '.'; + if (p >= bend) goto toolong; + continue; } - } - else { - *++p = '.'; } break; @@ -1456,5 +1458,6 @@ rb_file_s_expand_path(argc, argv) case '\\': #endif - if (!isdirsep(*p)) *++p = '/'; break; + if (!isdirsep(*p)) *(p = CharNext(p)) = '/'; + break; default: b = s; @@ -1465,5 +1468,5 @@ rb_file_s_expand_path(argc, argv) continue; } - s = CharNext(s); + ++s; }
-- --- 僕の前にBugはない。 --- 僕の後ろにBugはできる。 中田 伸悦