[#23168] File.fnmatch のリファクタリング — "H.Yamamoto" <ocean@...2.ccsnet.ne.jp>

山本です。

13 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

山本です。

[#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

[ruby-dev:23168] File.fnmatch のリファクタリング

From: "H.Yamamoto" <ocean@...2.ccsnet.ne.jp>
Date: 2004-03-08 03:46:02 UTC
List: ruby-dev #23168
山本です。

現状の仕様を保存しつつ、リファクタリングの方向で攻めることにしました。

以下の変更は問題ないでしょうか?対象リビジョンは、HEAD (Rev1.109) です。

変更点は、

  ・ '[a' のように閉じてない '[' は普通の文字として扱う (has_magic にあわせた)
  ・ '[\' のように、エスケープが途切れている場合に '\0' を超えるバグを修正
  ・ 高速化 (Compare の部分)

以上です。なお、これがコミット可能な場合は、ruby_1_8 にも同様の変更が必要でしょうか?

よろしくお願いします。

static const char *
range(
    const char *pattern,
    const char *test,
    int flags)
{
    int not = 0, ok = 0;
    const char *p = pattern, *t1, *t2;
    const int nocase = flags & FNM_CASEFOLD;
    const int escape = !(flags & FNM_NOESCAPE);

    if (*p == '!' || *p == '^') {
	not = 1;
	p++;
    }

    while (*p) {
	if (*p == ']')
	    return ok == not ? 0 : p + 1;
	t1 = p;
	if (escape && *t1 == '\\')
	    t1++;
	if (!*t1)
	    break;
	p = Next(t1);
	if (*p == '-' && p[1] != ']') {
	    t2 = p + 1;
	    if (escape && *t2 == '\\')
		t2++;
	    if (!*t2)
		break;
	    p = Next(t2);
	    if (!ok && Compare(t1, test) <= 0 && Compare(test, t2) <= 0)
		ok = 1;
	}
	else {
	    if (!ok && Compare(t1, test) == 0)
		ok = 1;
	}
    }

    return *test == '[' ? pattern : 0; /* treat incompleted '[' as ordinary character */
}


In This Thread

Prev Next