[Canna-dev 95] Re: [Canna:05812] かんなの自動登録の失敗。

Back to archive index

AIDA Shinra aida-****@jcom*****
2002年 12月 11日 (水) 23:51:13 JST


相田です。
> 
> 広瀬です。
> 
> >> On Wed, 11 Dec 2002 00:10:21 +0900 (JST)
> >> toshi****@whi***** (Toshiomi Moriki) said:
> > 
> > 森木です。
> > 以前に自動登録機能について ご質問を出した者として、後始末をば。
> > 
> > > ところで本題ですが、かんなの設定に”自動登録”と
> > > いうものがあり、たとえば
> > >   |すりじゃなわるだなぷらこって|
> > > と変換すると自動的に辞書に
> > >   スリジャナワルダナプラコッテ
> > > と登録される機能です。この設定があるのですが、どうも
> > > RedHat7.3にデフォルトで入っているバイナリでは
> > > 機能しないようです。
> > 
> > 『はい、機能しません』というのが御回答です。
> > 
> > 広瀬さんのメールで、該問題の対策パッチが本MLに公開されています。
> > 自動登録機能を有効にするには、このパッチを当てた上で
> > Canna(正確には libcanna)を ビルド/インストールする必要があります。
> 
> ただ、このカタカナ自動登録の機能(Unix版)は不完全だと認識しています。どうい
> うことかというと、複数文節を入力していて、その中の1文節をカタカナ自動登録
> すると、全ての彼確定文節が登録単語としてカタカナ辞書に登録されてしまいます。
> 
> たとえば、
> % mkdic katakana
> (~/.canna に :katakana "katakana" を追加)
> の状態で、
> 
> |ここは スリジャヤワルダナプラコッテ です|
>         ----------------------------
>         ここを カタカナ に変換
>>         確定
> 
> とすると、カタカナ辞書には
> 
> すりじゃやわるだなぷらこって #T30 ここはスリジャヤワルダナプラコッテです
> 
> が登録されてしまいます。本来は対象文節だけ、
> 
> すりじゃやわるだなぷらこって #T30 スリジャヤワルダナプラコッテ
> 
> が登録されるべきですね。
> 
> その問題点を分かって使うのであれば、つまり、自動登録したいカタカナはその文
> 節だけを読み入力して
> 
> |スリジャヤワルダナプラコッテ|
>    カタカナ に変換
>>    確定
> 
> とするように常に気をつけていれば問題ないのですが、普通のユーザはそんなとこ
> ろまでは注意できないですよね。ということで、この機能はUnix版ではOFFになっ
> ているのだと推測したのですが、今さんあってますかね?:-)
> 
> これに気付いたのが、カタカナ登録の部分のソースを追ったかなり後だったので、
> もう一度ソースを追う気合いが足りずにそのまま使っています。
> 
> > ところでこの本家(Canna-3.6)に取り込む予定はないのでしょうか?
> > #これが言いたかったらしい。
> 
> ということで、このままのパッチではちょっと普通の人が使うには危険かな、と思
> います。
> 
> --yuuji

自動登録なんて機能があったんだ・・・。
こんなんでどうでしょう?(森木さんのパッチにさらに当ててください)
Index: romaji.c
===================================================================
RCS file: /cvsroot/canna/canna/lib/canna/romaji.c,v
retrieving revision 1.2
diff -u -r1.2 romaji.c
--- romaji.c	20 Oct 2002 18:00:21 -0000	1.2
+++ romaji.c	11 Dec 2002 14:46:14 -0000
@@ -2305,6 +2305,13 @@
 }
 
 
+typedef struct _autoDefRec {
+    struct _autoDefRec *next;
+    int ishira;
+    wchar_t yomibuf[ROMEBUFSIZE];
+    wchar_t kanabuf[ROMEBUFSIZE];
+} autoDefRec, *autoDef;
+
 /*
   doKakutei -- 確定処理をする。
 
@@ -2332,16 +2339,8 @@
   yomiContext yc;
   int len, res;
   wchar_t *ss = s;
-  int katakanadef = 0, hiraganadef = 0;
   extern int auto_define;
-#ifndef WIN
-  wchar_t ytmpbuf[256];
-#else
-  wchar_t *ytmpbuf = (wchar_t *)malloc(sizeof(wchar_t) * 256);
-  if (!ytmpbuf) {
-    return 0;
-  }
-#endif
+  autoDef autotop = NULL, autocur;
 
   /* まず確定準備処理をする */
   for (tan = st ; tan != et ; tan = tan->right) {
@@ -2349,16 +2348,24 @@
       yc = (yomiContext)tan;
       d->modec = (mode_context)yc;
       if (yc->jishu_kEndp) {
-        if (auto_define) {
-          if (yc->jishu_kc == JISHU_ZEN_KATA)
-            katakanadef = 1;
+	autocur = NULL;
+        if (auto_define &&
+	    (yc->jishu_kc == JISHU_ZEN_KATA
 #ifdef HIRAGANAAUTO
-          if (yc->jishu_kc == JISHU_HIRA)
-            hiraganadef = 1;
+	     || yc->jishu_kc == JISHU_HIRA
 #endif
-          WStrcpy(ytmpbuf, yc->kana_buffer);
-        }
+	    ))
+	  autocur = (autoDef)malloc(sizeof(autoDefRec));
+	if (autocur) {
+	  WStrcpy(autocur->yomibuf, yc->kana_buffer);
+	  autocur->ishira = (yc->jishu_kc == JISHU_HIRA);
+	}
 	doJishuKakutei(d, yc);
+	if (autocur) {
+	  WStrcpy(autocur->kanabuf, yc->kana_buffer);
+	  autocur->next = autotop;
+	  autotop = autocur;
+	}
       }
       else if (!yc->bunlen && /* 文節伸ばし縮め中 */
 	       (!yc->nbunsetsu || /* 漢字がないか... */
@@ -2472,7 +2479,7 @@
   /* 壊れているかも知れないので使い間違わないように壊し尽くしておく */
 
   /* 字種変換で全角カタカナを確定したら、自動登録する */
-  if (katakanadef || hiraganadef) {
+  for (autocur = autotop; autocur; autocur = autocur->next) {
     wchar_t line[ROMEBUFSIZE];
     int cnt;
     extern int defaultContext;
@@ -2481,12 +2488,12 @@
     extern char *hiraautodic;
 #endif
 
-    WStraddbcpy(line, ytmpbuf, ROMEBUFSIZE);
+    WStraddbcpy(line, autocur->yomibuf, ROMEBUFSIZE);
     EWStrcat(line, " ");
     EWStrcat(line, "#T30");
     EWStrcat(line, " ");
     cnt = WStrlen(line);
-    WStraddbcpy(line + cnt, ss, ROMEBUFSIZE - cnt);
+    WStraddbcpy(line + cnt, autocur->kanabuf, ROMEBUFSIZE - cnt);
 
     if (defaultContext == -1) {
       if ((KanjiInit() < 0) || (defaultContext == -1)) {
@@ -2496,26 +2503,27 @@
       }
     }
 
-    if (katakanadef) {
+    if (!autocur->ishira) {
       if (RkwDefineDic(defaultContext, kataautodic, line) != 0) {
         jrKanjiError = "\274\253\306\260\305\320\317\277\244\307\244\255"
                        "\244\336\244\273\244\363\244\307\244\267\244\277";
                          /* 自動登録できませんでした */
         makeGLineMessageFromString(d, jrKanjiError);
+	goto return_res;
       }
       else {
         if (cannaconf.auto_sync) {
           (void)RkwSync(defaultContext, kataautodic);
         }
       }
-    }
-    if (hiraganadef) {
+    } else {
 #ifdef HIRAGANAAUTO
       if (RkwDefineDic(defaultContext, hiraautodic, line) != 0) {
         jrKanjiError = "\274\253\306\260\305\320\317\277\244\307\244\255"
                        "\244\336\244\273\244\363\244\307\244\267\244\277";
                          /* 自動登録できませんでした */
         makeGLineMessageFromString(d, jrKanjiError);
+	goto return_res;
       }
       else {
         if (cannaconf.auto_sync) {
@@ -2526,9 +2534,11 @@
     }
   }
  return_res:
-#ifdef WIN
-  (void)free((char *)ytmpbuf);
-#endif
+  while (autotop) {
+    autocur = autotop->next;
+    free(autotop);
+    autotop = autocur;
+  }
   return res;
 }
 



Canna-dev メーリングリストの案内
Back to archive index