[#28509] Rational — Tadayoshi Funaba <tadf@...>

ふなばです。

49 messages 2006/04/05
[#28510] Re: Rational — keiju@... (石塚圭樹) 2006/04/05

けいじゅ@いしつかです.

[#28512] Re: Rational — Tadayoshi Funaba <tadf@...> 2006/04/05

ふなばです。

[#28513] Re: Rational — Shin-ichiro HARA <sinara@...> 2006/04/05

原です。

[#28514] Re: Rational — keiju@... (石塚圭樹) 2006/04/05

けいじゅ@いしつかです.

[#28517] Re: Rational — Yukihiro Matsumoto <matz@...> 2006/04/06

まつもと ゆきひろです

[#28520] Re: Rational — keiju@... (石塚圭樹) 2006/04/06

けいじゅ@いしつかです.

[#28521] Re: Rational — Yukihiro Matsumoto <matz@...> 2006/04/06

まつもと ゆきひろです

[#28525] Re: Rational — keiju@... (石塚圭樹) 2006/04/06

けいじゅ@いしつかです.

[#28527] Re: Rational — Shin-ichiro HARA <sinara@...> 2006/04/06

原です。

[#28536] Re: Rational — Shin-ichiro HARA <sinara@...> 2006/04/10

原です。

[#28537] Re: Rational — keiju@... (石塚圭樹) 2006/04/10

けいじゅ@いしつかです.

[#28589] Float#div and Float#divmod [AGAIN] — Shin-ichiro HARA <sinara@...>

原です。

16 messages 2006/04/23

[ruby-dev:28598] bug of regex.c (1.8)

From: KIMURA Koichi <kimura.koichi@...>
Date: 2006-04-24 09:10:40 UTC
List: ruby-dev #28598
木村です。

[ruby-list:42096] に関してちょっと調べてみました。

re_compile_pattern の中にあるキャラクタクラスの処理の部分で

	else {
	  if (TRANSLATE_P()) c = (unsigned char)translate[c];
	  if (had_mbchar == 0 && (!current_mbctype || !had_num_literal)) {
	    SET_LIST_BIT(c);
	    had_num_literal = 0;
	  }
	  else {
	    set_list_bits(c, c, b);
	  }
	}

というのがありますが、マルチバイトを考慮した処理になっているとき、
c にはマルチバイト文字の場合には泣き別れになった状態ではなくて
High byte と low byte が bitwise or された状態で来ています
(ShiftJISで'知'なら 0x926d)。

しかし、TRANLATE_Pでは対象がマルチバイト文字かどうかの判定をしていない
ので、マルチバイト文字をそのまま使ってテーブルを引いてしまっています。
結果、ごみを使って変換することになっています。

とりあえずテーブルを引く前にマルチバイト文字かどうかを判定する必要が
あるのではないでしょうか?

--- regex.c.1~	2005-10-19 01:27:53.000000000 +0900
+++ regex.c	2006-04-24 17:57:07.028500000 +0900
@@ -1705,7 +1705,7 @@ re_compile_pattern(pattern, size, bufp)
 	  goto range_retry;
 	}
 	else {
-	  if (TRANSLATE_P()) c = (unsigned char)translate[c];
+	  if (TRANSLATE_P() && c < 0x100) c = (unsigned char)translate[c];
 	  if (had_mbchar == 0 && (!current_mbctype || !had_num_literal)) {
 	    SET_LIST_BIT(c);
 	    had_num_literal = 0;


-- 
木村浩一


In This Thread

Prev Next