From: matz@... (Yukihiro Matsumoto) Date: 1997-04-02T13:31:46+09:00 Subject: [ruby-list:2568] Re: ruby 1.0-970331 released まつもと ゆきひろです. In message "[ruby-list:2564] Re: ruby 1.0-970331 released" on 97/04/02, WATANABE Hirofumi writes: | |わたなべです. | |rbdj0331.lzh, rbgw0331.lzh を put しました. | |matz@caelum.co.jp (Yukihiro Matsumoto) writes: | |:アナウンスするのを忘れていましたが,970331が出ています.正規 |:表現のバグとりを試してみてください. | |\W, [\W], [^\w] は同じにならないとまずいですよね. 簡単なスク |リプトでチェックしてみました. そうか.うーむ,正規表現は難しい. |というわけで \W, [^\w] も日本語とマッチさせる patch です. た |だし -Kn 時はまだバグってます(眠かったから :-). これだとまずい点があるので,直してみました.まだ完全だと言う 自信は無いんですけど. --- regex.c.bak Wed Apr 2 12:09:57 1997 +++ regex.c Wed Apr 2 13:23:58 1997 @@ -505,3 +505,3 @@ - if (b[size*4-2] == 0xff) { + if (b[(size-1)*4] == 0xff) { i = c; @@ -511,7 +511,7 @@ while (size>0 && b[size*4-2] == 0xff) { - if (b[size*4-3] <= i && i <= b[size*4-1]) { - result = 1; + size--; + if (b[size*4+1] <= i && i <= b[size*4+3]) { + result = 2; break; } - size--; } @@ -528,3 +528,3 @@ && ((unsigned char)c != '\n' && (unsigned char)c != '\0')) - return 2; + return 1; return result; @@ -1696,5 +1696,7 @@ case notwordchar: - for (j = 0; j < (1 << BYTEWIDTH); j++) + for (j = 0; j < 0x80; j++) if (SYNTAX(j) != Sword) fastmap[j] = 1; + for (j = 0x80; j < (1 << BYTEWIDTH); j++) + fastmap[j] = 1; break; @@ -1753,3 +1755,3 @@ multi-byte chars. See set_list_bits(). */ - for (j = *p * BYTEWIDTH; j < 0x80; j++) + for (j = *p * BYTEWIDTH; j < (1 << BYTEWIDTH); j++) if (!ismbchar(j)) @@ -2421,3 +2423,3 @@ int not; /* Nonzero for charset_not. */ - int two; /* 2 if move 2 bytes forward */ + int half; /* 2 if need to match latter half of mbc */ int c; @@ -2435,5 +2437,6 @@ - two = not = is_in_list(c, p); - if (*(p - 1) == (unsigned char)charset_not) + half = not = is_in_list(c, p); + if (*(p - 1) == (unsigned char)charset_not) { not = !not; + } @@ -2445,3 +2448,3 @@ d++; - if (d != dend && two == 2) + if (half != 2 && d != dend && c >= 1 << BYTEWIDTH) d++;