もう一つ Bug fix.

anthy が core を吐くので追ってみたら、

   priv_dic.c:anthy_copy_words_from_private_dic  word_xs == NULL
   mem_dic.c:anthy_mem_dic_push_back_dic_ent     xs->len

で segmentation fault で落ちてました。これは
~/.anthy/last-record2_defaultに下記のような record ができていたためです。

-----------------------------
DEL "OCHAIRE" S"おねがいします。"
ADD "UNKNOWN_WORD" S"おねがいします。" N2 N7 S"お願いします" N1 S"。"
-----------------------------

ADD "UNKNOWN_WORD" のエントリには文字列のものしかこないのに N が来てい
ます。なんでこんなことが起きるのかなと思って追ってみたら、read_session
でrst->cur_session, rst->cur_row を変えてしまっているところがあったので、
下記の修正をしました。

これを引き起こしたのは、6/22 の record.c:check_base_record_uptodate の
(正しい)変更だと思います。

これまでは、record.c:check_base_record_uptodate が間違っていたので
起こりにくかったのだと考えられます。


2010-08-02  NIIBE Yutaka  <gni...@fsij.org>

        * src-worddic/record.c (read_session): Don't change
        rst->cur_session, rst->cur_row.

diff --git a/src-worddic/record.c b/src-worddic/record.c
index f408495..f94d72a 100644
--- a/src-worddic/record.c
+++ b/src-worddic/record.c
@@ -1302,7 +1302,7 @@ read_session(struct record_stat *rst)
 {
   char **tokens;
   int nr;
-  int in_section = 0;
+  struct record_section* rsc = NULL;
   while (!anthy_read_line(&tokens, &nr)) {
     xstr *xs;
     int i;
@@ -1311,11 +1311,10 @@ read_session(struct record_stat *rst)

     if (!strcmp(tokens[0], "---") && nr > 1) {
       /* セクションの切れ目 */
-      in_section = 1;
-      rst->cur_section = do_select_section(rst, tokens[1], 1);
+      rsc = do_select_section(rst, tokens[1], 1);
       goto end;
     }
-    if (!in_section || nr < 2) {
+    if (!rsc || nr < 2) {
       /* セクションが始まってない or 行が不完全 */
       goto end;
     }
@@ -1327,12 +1326,11 @@ read_session(struct record_stat *rst)
     }
     /* 次にindex */
     xs = anthy_cstr_to_xstr(&tokens[0][1], rst->encoding);
-    node = do_select_row(rst->cur_section, xs, 1, dirty);
+    node = do_select_row(rsc, xs, 1, dirty);
     anthy_free_xstr(xs);
     if (!node) {
       goto end;
     }
-    rst->cur_row = node;
     /**/
     for (i = 1; i < nr; i++) {
       if (tokens[i][0] == '"') {
@@ -1341,13 +1339,13 @@ read_session(struct record_stat *rst)
        str[strlen(str) - 1] = 0;
        xs = anthy_cstr_to_xstr(str, rst->encoding);
        free(str);
-       do_set_nth_xstr(rst->cur_row, i-1, xs, &rst->xstrs);
+       do_set_nth_xstr(node, i-1, xs, &rst->xstrs);
        anthy_free_xstr(xs);
       }else if (tokens[i][0] == '*') {
        /* EMPTY entry */
-       get_nth_val_ent(rst->cur_row, i-1, 1);
+       get_nth_val_ent(node, i-1, 1);
       } else {
-       do_set_nth_value(rst->cur_row, i-1, atoi(tokens[i]));
+       do_set_nth_value(node, i-1, atoi(tokens[i]));
       }
     }
   end:

_______________________________________________
Anthy-dev mailing list
Anthy-dev@lists.sourceforge.jp
http://lists.sourceforge.jp/mailman/listinfo/anthy-dev

メールによる返信