[#23139] backslash in string — Jun Adachi <adachi@...>
安達@沖データと申します。
8 messages
2004/03/05
[#23148] BSD make(OpenBSD3.4) で make 出来ない — KAWAJI Shinya <kawaji@...>
かわじ、です。
3 messages
2004/03/06
[#23168] File.fnmatch のリファクタリング — "H.Yamamoto" <ocean@...2.ccsnet.ne.jp>
山本です。
13 messages
2004/03/08
[#23175] Re: File.fnmatch のリファクタリング
— "H.Yamamoto" <ocean@...2.ccsnet.ne.jp>
2004/03/08
山本です。
[#23176] Re: File.fnmatch のリファクタリング
— "H.Yamamoto" <ocean@...2.ccsnet.ne.jp>
2004/03/08
山本です。
[#23184] Re: File.fnmatch のリファクタリング
— "H.Yamamoto" <ocean@...2.ccsnet.ne.jp>
2004/03/11
山本です。
[#23187] Re: File.fnmatch のリファクタリング
— "H.Yamamoto" <ocean@...2.ccsnet.ne.jp>
2004/03/12
山本です。
[#23171] Re: File.fnmatch のリファクタリング — kkosako@...
> -----Original Message-----
2 messages
2004/03/08
[#23173] Re: Oniguruma has been merged into ruby CVS — kkosako@...
> -----Original Message-----
4 messages
2004/03/08
[#23192] File.fnmatch と Dir.glob の非互換部分 — "H.Yamamoto" <ocean@...2.ccsnet.ne.jp>
山本です。
19 messages
2004/03/13
[#23194] Re: File.fnmatch と Dir.glob の非互換部分
— matz@... (Yukihiro Matsumoto)
2004/03/13
まつもと ゆきひろです
[#23195] Re: File.fnmatch とDir.glob の非互換部分
— "H.Yamamoto" <ocean@...2.ccsnet.ne.jp>
2004/03/14
山本です。
[#23196] Re: File.fnmatch とDir.glob の非互換部分
— "H.Yamamoto" <ocean@...2.ccsnet.ne.jp>
2004/03/14
山本です。
[#23260] Re: File.fnmatch とDir.glob の非互換部分
— "H.Yamamoto" <ocean@...2.ccsnet.ne.jp>
2004/03/30
山本です。
[#23261] Re: File.fnmatch とDir.glob の非互換部分
— matz@... (Yukihiro Matsumoto)
2004/03/30
まつもと ゆきひろです
[#23265] Re: File.fnmatch とDir.glob の非互換部分
— "H.Yamamoto" <ocean@...2.ccsnet.ne.jp>
2004/03/30
山本です。
[#23267] Re: File.fnmatch とDir.glob の非互換部分
— matz@... (Yukihiro Matsumoto)
2004/03/30
まつもと ゆきひろです
[#23268] Re: File.fnmatch とDir.glob の非互換部分
— "H.Yamamoto" <ocean@...2.ccsnet.ne.jp>
2004/03/30
山本です。
[#23269] Re: File.fnmatch とDir.glob の非互換部分
— "H.Yamamoto" <ocean@...2.ccsnet.ne.jp>
2004/03/30
山本です。
[#23272] Re: File.fnmatch とDir.glob の非互換部分
— matz@... (Yukihiro Matsumoto)
2004/03/30
まつもと ゆきひろです
[#23273] Re: File.fnmatch とDir.glob の非互換部分
— "H.Yamamoto" <ocean@...2.ccsnet.ne.jp>
2004/03/30
山本です。
[#23212] warning: fork terminates thread — Tanaka Akira <akr@...17n.org>
思い出したのですが、thread が動いている時に fork すると、
12 messages
2004/03/23
[#23213] Re: warning: fork terminates thread
— matz@... (Yukihiro Matsumoto)
2004/03/23
まつもと ゆきひろです
[#23214] Re: warning: fork terminates thread
— keiju@... (石塚圭樹)
2004/03/24
けいじゅ@いしつかです.
[#23217] Re: warning: fork terminates thread
— Tietew <tietew-ml-ruby-dev@...>
2004/03/24
[#23221] English alias — nobu.nakada@...
なかだです。
16 messages
2004/03/25
[#23226] [-0xf0000000].pack("U") again — Tanaka Akira <akr@...17n.org>
ふと、[ruby-dev:21577] で書いた
8 messages
2004/03/26
[#23227] (retry; 0).xxx {} dumps core — Tanaka Akira <akr@...17n.org>
ふと気がついたのですが、[ruby-dev:19293] に書いて誰にも反応されなかっ
4 messages
2004/03/26
[#23228] Zlib::GzipWriter.new(nil).close dumps core — Tanaka Akira <akr@...17n.org>
次のように、Zlib::GzipWriter.new(nil).close が core を吐きます。
8 messages
2004/03/26
[#23230] Re: Zlib::GzipWriter.new(nil).close dumps core
— nobu.nakada@...
2004/03/26
なかだです。
[#23231] Re: Zlib::GzipWriter.new(nil).close dumps core
— matz@... (Yukihiro Matsumoto)
2004/03/26
まつもと ゆきひろです
[#23238] Re: [ruby-cvs] ruby, ruby/lib, ruby/lib/rss, ruby/sample/openssl: * lib/logger.rb: trim tail space of each line. no user visible change. — Kouhei Sutou <kou@...>
須藤です.
10 messages
2004/03/27
[#23247] IO#readpartial — Tanaka Akira <akr@...17n.org>
ついに気が向いたので、以前から考えていた、stdio のバッファを考慮する
7 messages
2004/03/28
[#23274] Time.gm(...): gmtime/localtime error (ArgumentError) — MIYAMUKO Katsuyuki <k-miyamuko@...>
みやむこです。
6 messages
2004/03/30
[#23275] Re: Time.gm(...): gmtime/localtime error (ArgumentError)
— Tanaka Akira <akr@...17n.org>
2004/03/30
In article <4069466A.2030008@az.jp.nec.com>,
[#23283] ensure modifier — nobu.nakada@...
なかだです。
11 messages
2004/03/30
[ruby-dev:23195] Re: File.fnmatch とDir.glob の非互換部分
From:
"H.Yamamoto" <ocean@...2.ccsnet.ne.jp>
Date:
2004-03-14 04:28:05 UTC
List:
ruby-dev #23195
山本です。
>|今わかっている File.fnmatch と Dir.glob の非互換部分は以下のとおりです。
>|
>|1. '[' と ']' の間に '/' がある場合
>|2. '[' が閉じていない場合
>|3. '\/' という風に、'/' をエスケープしている場合
>|
>|1. は [ruby-dev:22873] でのまつもとさんの意見から File.fnmatch の 「'/' を無視する」で決定済みだと
>|思われますが、これを実装するには、2. もはっきりさせる必要があります。
>|
>|現在の動作は、File.fnmatch が「全ての文字にマッチしない」で、Dir.glob が「'[' を通常文字扱い」です。
>|rubyの正規表現ではエラーなので前者という考え方と、POSIX.2で後者という考え方があると思います。
>|どちらがいいでしょうか?
>|
>|領域指定で正規表現に合わせたので前者が自然だと思いますが、決まったほうで実装したいと思います。
>|実装していて気づいたことがあれば、その時報告します。
>
>どっちでもよいですが、とりあえず前者(マッチしない)でどうでしょ
>うか。やってみてまずければ変えればよいんだし。
前者で 1. 2. を実装してみたのですが、
E:\ruby-cvs>touch [
Touch Version 4.2 Copyright (c) 1998 Borland International
E:\ruby-cvs>touch ]
Touch Version 4.2 Copyright (c) 1998 Borland International
E:\ruby-cvs>ruby\miniruby.exe -e "puts Dir.glob('[')"
E:\ruby-cvs>ruby\miniruby.exe -e "puts Dir.glob(']')"
]
となってしまいました。閉じていない ']' も「全てにマッチしない」にするべきなのか、後者を選んで
両方通常文字扱いにすべきなのか・・・・それとも、これで問題ないのか。皆さんどう思われますか?
3. は意外と根が深そうなので、後回しにしています。(**\/ === **/ とすべきなのか?など、他の部分の
実装にも関係してくる)
パッチは下のとおりです。
cvs diff -u -wb -p dir.c (in directory E:\ruby-cvs\ruby\)
Index: dir.c
===================================================================
RCS file: /ruby/ruby/dir.c,v
retrieving revision 1.112
diff -u -w -b -p -r1.112 dir.c
--- dir.c 12 Mar 2004 15:00:39 -0000 1.112
+++ dir.c 14 Mar 2004 04:15:00 -0000
@@ -940,23 +940,52 @@ has_magic(s, flags)
const char *s;
int flags;
{
+ const int escape = !(flags & FNM_NOESCAPE);
register const char *p = s;
register char c;
- int open = 0;
- int escape = !(flags & FNM_NOESCAPE);
while (c = *p++) {
switch (c) {
+ case '[':
case '?':
case '*':
return 1;
- case '[': /* Only accept an open brace if there is a close */
- open++; /* brace to match it. Bracket expressions must be */
- continue; /* complete, according to Posix.2 */
+ case '\\':
+ if (escape && !(c = *p++))
+ return 0;
+ continue;
+ }
+
+ p = Next(p-1);
+ }
+
+ return 0;
+}
+
+/* Find directory separator in pattern. */
+static char *
+find_patsep(s, flags)
+ const char *s;
+ int flags;
+{
+ const int escape = !(flags & FNM_NOESCAPE);
+ register const char *p = s;
+ register char c;
+ int open = 0;
+
+ while (c = *p++) {
+ switch (c) {
+ case '[':
+ open = 1;
+ continue;
case ']':
- if (open)
- return 1;
+ open = 0;
+ continue;
+
+ case '/':
+ if (!open)
+ return (char *)p-1;
continue;
case '\\':
@@ -968,7 +997,7 @@ has_magic(s, flags)
p = Next(p-1);
}
- return 0;
+ return (char *)p-1;
}
/* Remove escaping baskclashes */
@@ -1010,23 +1039,21 @@ glob_make_pattern(p, flags)
const char *p;
int flags;
{
- char *buf;
- int dirsep = 0; /* pattern terminates with '/' */
struct glob_pattern *list, *tmp, **tail = &list;
+ int dirsep = 0; /* pattern is terminated with '/' */
while (*p) {
tmp = ALLOC(struct glob_pattern);
if (p[0] == '*' && p[1] == '*' && p[2] == '/') {
- /* fold continuous RECURSIVEs */
+ /* fold continuous RECURSIVEs (for glob_helper) */
do { p += 3; } while (p[0] == '*' && p[1] == '*' && p[2] == '/');
tmp->type = RECURSIVE;
tmp->str = 0;
dirsep = 1;
}
else {
- const char *m;
- for (m = p; *m && *m != '/'; Inc(m));
- buf = ALLOC_N(char, m-p+1);
+ const char *m = find_patsep(p);
+ char *buf = ALLOC_N(char, m-p+1);
memcpy(buf, p, m-p);
buf[m-p] = '\0';
tmp->type = has_magic(buf, flags) ? MAGICAL : PLAIN;