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秒

「自震マンマン」作務衣/なまず



●サイズ ・フリーサイズ 身長160~185 胸囲96~104 胴囲84~94   ※単位は全てcm
●素材 綿100%
●カラー 黒

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;