KAKASI-2.3.5.pre1 のパッチ ― 2007年09月19日 18時39分14秒
KAKASI 2.3.5pre1 をコンパイルして気になったところを修正してみました。
- iconv_t 変数にキャストなしで -1 を代入または比較している部分を修正
- ptype 変数を初期化せずに使用しているため、未定義の値を参照する可能性があったのを修正
- 関数のプロトタイプ宣言なしで pututf8 を使っていたので、関数のプロトタイプを追加
- make dist の際に tests/env.sh が tarball に含まれないバグを修正
--- src/kakasi.c.org 2007-09-19 17:55:33.000000000 +0900
+++ src/kakasi.c 2007-09-19 17:55:28.000000000 +0900
@@ -53,8 +53,8 @@
#ifdef KAKASI_SUPPORT_UTF8
#include
-iconv_t fromutf8 = -1;
-iconv_t toutf8 = -1;
+iconv_t fromutf8 = (iconv_t)-1;
+iconv_t toutf8 = (iconv_t)-1;
#endif /* KAKASI_SUPPORT_UTF8 */
/* FIXME: this macro should be removed future. */
@@ -638,7 +638,7 @@
setcharbuffer((unsigned char *)str);
#endif
- pctype = OTHER;
+ ptype = pctype = OTHER;
separator_out = 0;
for(;;) {
getkanji(c);
--- src/kanjiio.c.org 2007-09-19 17:55:33.000000000 +0900
+++ src/kanjiio.c 2007-09-19 17:55:28.000000000 +0900
@@ -90,6 +90,7 @@
else \
Len = -1;
+void pututf8(int f, int s);
#endif /* KAKASI_SUPPORT_UTF8 */
@@ -552,7 +553,7 @@
utf8[i] = getchar();
}
fromlen = len;
- if (fromutf8 == -1)
+ if (fromutf8 == (iconv_t)-1)
fromutf8 = iconv_open("EUC-JP", "UTF-8");
l = iconv(fromutf8, &from, &fromlen, &to, &tolen);
if (tolen == 1) {
@@ -1063,7 +1064,7 @@
int i;
fromstr[0] = (char) f;
fromstr[1] = (char) s;
- if (toutf8 == -1)
+ if (toutf8 == (iconv_t)-1)
toutf8 = iconv_open("UTF-8", "EUC-JP");
l = iconv(toutf8, &from, &fromlen, &to, &tolen);
if (tolen >= 6 || tolen < 0)
--- tests/Makefile.am.org 2007-09-19 18:03:34.000000000 +0900
+++ tests/Makefile.am 2007-09-19 17:54:07.000000000 +0900
@@ -9,4 +9,4 @@
clean-local:
rm -f test-log tmp
-EXTRA_DIST = $(TESTS)
+EXTRA_DIST = $(TESTS) env.sh
「自震マンマン」作務衣/なまず ― 2007年09月19日 18時45分02秒
NKF の濁点と半濁点の処理のバグ ― 2007年09月19日 21時41分42秒
NKF 1.71 では問題ありませんが、NKF 2.X では、濁点、半濁点の処理にバグが あるようです。
echo "スまホみ" | nkf -Ee ズポ
となります。(ス、ホはいずれも半角カナ)
これは、半角カナは濁点、半濁点も1文字であり、全角カナに変換する際に2文字を1文字の濁点あるいは半濁点付きの文字に変換しないといけないのですが、この判定を誤っています。
全角の「ま」や「マ」の下位ビットが半角カナの濁点の下位ビットと同じ、
全角の「み」や「ミ」の下位ビットが半角カナの半濁点の下位ビットと同じためです。
これを修正するパッチを添付します。 なお、ソースの3箇所の改行コードがおかしいので、これも修正しています。
--- nkf.c.org 2007-07-25 00:13:03.000000000 +0900
+++ nkf.c 2007-09-19 21:36:35.000000000 +0900
@@ -2755,13 +2755,13 @@
/* normal ASCII code */
SEND;
}
- } else if (c1 == SI && (!is_8bit || mime_decode_mode)) {^M
+ } else if (c1 == SI && (!is_8bit || mime_decode_mode)) {
shift_mode = FALSE;
NEXT;
- } else if (c1 == SO && (!is_8bit || mime_decode_mode)) {^M
+ } else if (c1 == SO && (!is_8bit || mime_decode_mode)) {
shift_mode = TRUE;
NEXT;
- } else if (c1 == ESC && (!is_8bit || mime_decode_mode)) {^M
+ } else if (c1 == ESC && (!is_8bit || mime_decode_mode)) {
if ((c1 = (*i_getc)(f)) == EOF) {
/* (*oconv)(0, ESC); don't send bogus code */
LAST;
@@ -4584,11 +4584,11 @@
return;
}
if (x0201_f && z_prev2==X0201) { /* X0201 */
- if (c1==(0xde&0x7f)) { /* ^[$BByE@^[(B */
+ if (c1==(0xde&0x7f) && c2 == X0201) { /* ^[$BByE@^[(B */
z_prev2=0;
(*o_zconv)(dv[(z_prev1-SPACE)*2],dv[(z_prev1-SPACE)*2+1]);
return;
- } else if (c1==(0xdf&0x7f)&&ev[(z_prev1-SPACE)*2]) { /* ^[$BH>ByE@^[(B
*/
+ } else if (c1==(0xdf&0x7f)&&ev[(z_prev1-SPACE)*2] && c2 == X0201) { /*
^[$BH>ByE@^[(B */
z_prev2=0;
(*o_zconv)(ev[(z_prev1-SPACE)*2],ev[(z_prev1-SPACE)*2+1]);
return;
最近のコメント