[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[freewnn:00919] Re: defect in Japanese conversion



小野寛生です

At Sun, 08 Sep 2002 16:27:02 +0900,
Hiroo Ono wrote:
> Wnn/jserver/fzk.c で malloc で確保している領域を zero clear するように
> したら、正常に変換出来るようになりました。

> もうちょっときちんと見てから、次の休みまでには修正を commit します。

修正の前段階で、スタイル+コンパイラの warning に対する修正です。
(malloc の暫定対処も入っていますが、commit の際はそこは戻すつもり)。
local の cvs repo. に対する差分ですが、多分 cvs の最新のものに問題なく
あたるかと思います。

いつもは、make が通って起動出来たらつっこんでしまっているのですが、
-              fzk_orvt (&fzkwk[point + n], &(fzkinfp->vector[0]));
+              fzk_orvt (fzkwk[point + n].vector, &(fzkinfp->vector[0]));
といった struct FT, kangovect 関連の修正が一寸心配なので、review
お願いします。

明日、これでうまく動くのを確認したら、malloc 関連の修正を除いた部分を
まず commit してから、malloc 周りを見直して、と2段階で commit する予
定です。

他には、変更点が大きくなるので、release した後でいじるつもりではいます
が、struct JT と、readfile.c の *_realloc() 関連で変更を提案したいと
考えています。
% 変更点が多い割に、動きは全然変わらないのですが。

Index: ddefine.h
===================================================================
RCS file: /build/cvsroot/FreeWnn/Wnn/jserver/ddefine.h,v
retrieving revision 1.2
diff -u -r1.2 ddefine.h
--- ddefine.h	4 Aug 2002 10:40:37 -0000	1.2
+++ ddefine.h	10 Sep 2002 14:48:17 -0000
@@ -190,7 +190,7 @@
 /* 幹語の前端接続ベクトルの構造 */
 struct kangovect
 {
-  unsigned int vector[VECT_L];  /* 幹語ベクトル */
+  int vector[VECT_L];  /* 幹語ベクトル */
 };
 
 struct SYO_BNSETSU
Index: fzk.c
===================================================================
RCS file: /build/cvsroot/FreeWnn/Wnn/jserver/fzk.c,v
retrieving revision 1.1.1.1
diff -u -r1.1.1.1 fzk.c
--- fzk.c	13 Jun 2002 20:45:13 -0000	1.1.1.1
+++ fzk.c	10 Sep 2002 17:00:51 -0000
@@ -1,8 +1,4 @@
 /*
- *  $Id: fzk.c,v 1.1.1.1 2002/06/13 20:45:13 hiroo Exp $
- */
-
-/*
  * FreeWnn is a network-extensible Kana-to-Kanji conversion system.
  * This file is part of FreeWnn.
  * 
@@ -28,6 +24,9 @@
  * along with this program; if not, write to the Free Software
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  */
+
+static char rcs_id[] = "$Id: fzk.c,v 1.1.1.1 2002/06/13 20:45:13 hiroo Exp $";
+
 #ifdef HAVE_CONFIG_H
 #  include <config.h>
 #endif
@@ -35,6 +34,7 @@
 #include <stdio.h>
 #if STDC_HEADERS
 #  include <stdlib.h>
+#  include <string.h>
 #else
 #  if HAVE_MALLOC_H
 #    include <malloc.h>
@@ -50,12 +50,21 @@
 #define vungetc(k, pt) {if(pt) {ungetc((k),(pt));}else{xungetc_cur(k);}}
 
 #ifndef NO_FZK
-static void link_job ();
-static int fzk_ken (), setfzk ();
-static struct fzkentry *bsrch ();
+static void link_job (int, struct FT *);
+static int fzk_ken (w_char *, w_char *, int *, struct fzkken *);
+static int setfzk (struct fzkentry *, struct fzkken **, int *, int);
+static struct fzkentry *bsrch (w_char *);
 #endif
-static void fzk_orvt ();
-static int fzk_ck_vector (), bittest (), get_decimal (), check_eof (), get_hexsa (), get_string (), check_eof (), kng_ckvt ();
+static int kng_ckvt (int *, int);
+static int fzk_ck_vector (int *);
+static void fzk_orvt (int *, int *);
+static int bittest (int *, int);
+static int error_fzk (void);
+static int error_eof (void);
+static int get_decimal (FILE *);
+static int get_hexsa (FILE *);
+static int get_string (FILE *, unsigned char *);
+static int check_eof (FILE *);
 
 #ifndef NO_FZK
 static int fzkvect_kosuu;       /* 付属語ベクタ数 */
@@ -106,8 +115,7 @@
 
 
 struct FT *
-fzk_read (fp)
-     register FILE *fp;
+fzk_read (FILE *fp)
 {
   struct FT *fzk_tbl;
 
@@ -122,12 +130,11 @@
 }
 
 struct FT *
-fzk_ld (fp)
-     register FILE *fp;
+fzk_ld (FILE *fp)
 {
   struct FT *fzk_tbl;
-  register int k, l, m;
-  register int vect_count = 0;
+  int k, l, m;
+  int vect_count = 0;
 #ifndef NO_FZK
   struct fzkentry *ptr;
   unsigned char charyomi[(YOMI_L + 1) * 2];
@@ -150,24 +157,24 @@
   if (fzkvect_l > VECT_L)
     {
       wnn_errorno = WNN_FZK_TOO_DEF;
-      error1 ("Sorry, your fuzokugo bit data has too many id.\n");
-      error1 ("Please change define VECT_L %d and compile again\n", fzkvect_l);
+      log_err ("Sorry, your fuzokugo bit data has too many id.");
+      log_err ("Please change define VECT_L %d and compile again.", fzkvect_l);
       return (NULL);
     }
 
   if (kango_vect_l > KANGO_VECT_L)
     {
       wnn_errorno = WNN_FZK_TOO_DEF;
-      error1 ("Sorry, your kango bit data has too many id.\n");
-      error1 ("Please change define KANGO_VECT_L %d and compile again\n", kango_vect_l);
+      log_err ("Sorry, your kango bit data has too many id.");
+      log_err ("Please change define KANGO_VECT_L %d and compile again.", kango_vect_l);
       return (NULL);
     }
 #ifdef nodef                    /* This check doesn't need anymore. KUWARI */
   if (kango_vect_kosuu > KANGO_VECT_KOSUU)
     {
       wnn_errorno = WNN_FZK_TOO_DEF;
-      error1 ("Sorry, your kango bit vector has too many id.\n");
-      error1 ("Please change define KANGO_VECT_KOSUU %d and compile again\n", kango_vect_kosuu);
+      log_err ("Sorry, your kango bit vector has too many id.");
+      log_err ("Please change define KANGO_VECT_KOSUU %d and compile again.", kango_vect_kosuu);
       return (NULL);
     }
 #endif
@@ -175,22 +182,25 @@
   if (kango_length > KANGO_HINSI_MX)
     {
       wnn_errorno = WNN_FZK_TOO_DEF;
-      error1 ("Sorry, your kango bit data has too many id.\n");
-      error1 ("Please change define KANGO_MX %d and compile again\n", kango_length);
+      log_err ("Sorry, your kango bit data has too many id.");
+      log_err ("Please change define KANGO_MX %d and compile again.", kango_length);
       return (NULL);
     }
   if (kango_vect_kosuu > kango_length)
     {
       wnn_errorno = WNN_FZK_TOO_DEF;
-      error1 ("KANGO vector kosuu is more than KANGO hinsi suu\n");
+      log_err ("KANGO vector kosuu is more than KANGO hinsi suu.");
       return (NULL);
     }
   if ((fzk_tbl = (struct FT *) malloc (sizeof (struct FT))) == NULL)
     {
       wnn_errorno = WNN_MALLOC_ERR;
-      error1 ("malloc error in fzk\n");
+      log_err ("fzk_ld: malloc error.");
       return (NULL);
     }
+  /* b MALLOC DEBUG */
+  bzero (fzk_tbl, sizeof (struct FT));
+  /* e MALLOC DEBUG */
   fzk_tbl->kango_hinsi_area = NULL;
   fzk_tbl->kango_vect_area = NULL;
   fzk_tbl->fzkvect_l = fzkvect_l;
@@ -200,35 +210,43 @@
   fzk_tbl->tablefuzokugo = NULL;
   fzk_tbl->fzklength = fzklength;
 
-  if ((fzk_tbl->vect_area = (struct fzkvect *) malloc (sizeof (struct fzkvect) * fzkvect_kosuu)) == NULL)
+  /* MALLOC DEBUG */
+  /* if ((fzk_tbl->vect_area = (struct fzkvect *) malloc (sizeof (struct fzkvect) * fzkvect_kosuu)) == NULL) */
+  if ((fzk_tbl->vect_area = (struct fzkvect *) calloc (fzkvect_kosuu, sizeof (struct fzkvect))) == NULL)
     {
       wnn_errorno = WNN_MALLOC_ERR;
-      error1 ("malloc error in fzk\n");
+      log_err ("fzk_ld: malloc error.");
       fzk_discard (fzk_tbl);
       return (NULL);
     }
 #endif /* NO_FZK */
 
-  if ((fzk_tbl->kango_hinsi_area = (int *) malloc (sizeof (int) * kango_length)) == NULL)
+  /* MALLOC DEBUG */
+  /* if ((fzk_tbl->kango_hinsi_area = (int *) malloc (sizeof (int) * kango_length)) == NULL) */
+  if ((fzk_tbl->kango_hinsi_area = (int *) calloc (kango_length, sizeof (int))) == NULL)
     {
       wnn_errorno = WNN_MALLOC_ERR;
       error1 ("malloc error in fzk\n");
       fzk_discard (fzk_tbl);
       return (NULL);
     }
-  if ((fzk_tbl->kango_vect_area = (struct kangovect *) malloc (sizeof (struct kangovect) * (kango_vect_kosuu + SV_KOSUU))) == NULL)
+  /* MALLOC DEBUG */
+  /* if ((fzk_tbl->kango_vect_area = (struct kangovect *) malloc (sizeof (struct kangovect) * (kango_vect_kosuu + SV_KOSUU))) == NULL) */
+  if ((fzk_tbl->kango_vect_area = (struct kangovect *) calloc ((kango_vect_kosuu + SV_KOSUU), sizeof (struct kangovect))) == NULL)
     {
       wnn_errorno = WNN_MALLOC_ERR;
-      error1 ("malloc error in fzk\n");
+      log_err ("fzk_ld: malloc error.");
       fzk_discard (fzk_tbl);
       return (NULL);
     }
 
 #ifndef NO_FZK
-  if ((fzk_tbl->tablefuzokugo = (struct fzkentry *) malloc (sizeof (struct fzkentry) * fzk_tbl->fzklength)) == NULL)
+  /* MALLOC DEBUG */
+  /* if ((fzk_tbl->tablefuzokugo = (struct fzkentry *) malloc (sizeof (struct fzkentry) * fzk_tbl->fzklength)) == NULL) */
+  if ((fzk_tbl->tablefuzokugo = (struct fzkentry *) calloc (fzk_tbl->fzklength, sizeof (struct fzkentry))) == NULL)
     {
       wnn_errorno = WNN_MALLOC_ERR;
-      error1 ("malloc error in fzk\n");
+      log_err ("fzk_ld: malloc error.");
       fzk_discard (fzk_tbl);
       return (NULL);
     }
@@ -343,16 +361,15 @@
 
 #ifdef  nodef
 void
-giji_hinsi_err (str)
-     char *str;
+giji_hinsi_err (char *str)
 {
   wnn_errorno = WNN_GIJI_HINSI_ERR;
-  error1 ("GIJI hinsi (%s) is not defined in hinsi data file.\n", str);
+  log_err ("GIJI hinsi (%s) is not defined in hinsi data file.", str);
 }
 #endif /* nodef */
+
 void
-fzk_discard (fzk_tbl)
-     struct FT *fzk_tbl;
+fzk_discard (struct FT *fzk_tbl)
 {
   if (fzk_tbl->kango_hinsi_area != NULL)
     free (fzk_tbl->kango_hinsi_area);
@@ -369,12 +386,10 @@
 
 #ifndef NO_FZK
 static void
-link_job (x, fzk_tbl)
-     register int x;
-     struct FT *fzk_tbl;
+link_job (int x, struct FT *fzk_tbl)
 {
-  register int n;
-  register struct fzkentry *pter_a, *pter_b;
+  int n;
+  struct fzkentry *pter_a, *pter_b;
 
   for (pter_a = fzk_tbl->tablefuzokugo, x--, n = 0; n < x; n++, pter_a++)
     {
@@ -390,13 +405,11 @@
  */
 
 int
-fzk_kai (start, end, syuutan_vect, syuutan_vect1, ichbnp_p)
-     w_char *start;             /* string start pointer */
-     w_char *end;               /* string end   pointer */
-     int syuutan_vect;          /* 文節終端 vector */
-     int syuutan_vect1;         /* 文節終端 vector 1 */
-     struct ICHBNP **ichbnp_p;  /* ich-bunpou area 付属語候補 set pointer
-                                   pointer */
+fzk_kai (w_char *start,		/* string start pointer */
+	w_char *end,		/* string end   pointer */
+	int syuutan_vect,	/* 文節終端 vector */
+	int syuutan_vect1,	/* 文節終端 vector 1 */
+	struct ICHBNP **ichbnp_p) /* ich-bunpou area 付属語候補 set pointer pointer */
 {
 #ifndef NO_FZK
   static struct fzkwork fzkwk[STRK_L + 1];      /* 解析 work area */
@@ -406,12 +419,12 @@
   struct fzkken fzkinf[YOMI_L + 1];     /* 検索 work area */
   struct fzkken fzkinf1[YOMI_L + 1];    /* 検索 work area */
   struct fzkken *fzkinfp;
-  struct ICHBNP *getibsp ();
-  struct ICHBNP *ichbnptr, *wkptr;
+  struct ICHBNP *ichbnptr = NULL;
+  struct ICHBNP *wkptr = NULL;
 
-  register int point;           /* index */
-  register int i, j;            /* work index */
-  register int cnt, n;          /* counter */
+  int point;           /* index */
+  int i, j;            /* work index */
+  int cnt, n;          /* counter */
   struct kangovect *endvect;    /* 文節終端 vector pointer */
   struct kangovect *endvect1;   /* 文節終端 vector 1 */
 
@@ -451,28 +464,28 @@
       if (point > STRK_L)
         {
           wnn_errorno = WNN_WKAREA_FULL;
-          error1 ("Fuzokugo-kaiseki area is full");
+          log_err ("fzk_kai: fuzokugo-kaiseki area is full.");
           return (-1);
         }
-      if (fzk_ck_vector (&fzkwk[point]))
+      if (fzk_ck_vector (fzkwk[point].vector))
         {
           /* 付属語検索 vector */
-          fzk_ken (start + point, end, &fzkwk[point], &fzkinf[0]);
+          fzk_ken (start + point, end, fzkwk[point].vector, &fzkinf[0]);
           for (fzkinfp = &fzkinf[0]; fzkinfp->ent_ptr; fzkinfp++)
             {
               n = (fzkinfp->ent_ptr)->yomi_su;
-              fzk_orvt (&fzkwk[point + n], &(fzkinfp->vector[0]));
+              fzk_orvt (fzkwk[point + n].vector, &(fzkinfp->vector[0]));
               maxpoint = (maxpoint < point + n) ? point + n : maxpoint;
             }
         }
-      if (fzk_ck_vector (&fzkwk1[point]))
+      if (fzk_ck_vector (fzkwk1[point].vector))
         {
           /* 付属語検索 vector 1 */
-          fzk_ken (start + point, end, &fzkwk1[point], &fzkinf1[0]);
+          fzk_ken (start + point, end, fzkwk1[point].vector, &fzkinf1[0]);
           for (fzkinfp = &fzkinf1[0]; fzkinfp->ent_ptr; fzkinfp++)
             {
               n = (fzkinfp->ent_ptr)->yomi_su;
-              fzk_orvt (&fzkwk1[point + n], &(fzkinfp->vector[0]));
+              fzk_orvt (fzkwk1[point + n].vector, &(fzkinfp->vector[0]));
               maxpoint = (maxpoint < point + n) ? point + n : maxpoint;
             }
         }
@@ -484,7 +497,8 @@
    */
   for (point = cnt = 0, *ichbnp_p = NULL; point <= maxpoint; point++)
     {
-      if (kng_ckvt (&fzkwk[point], kango_vect_l) || kng_ckvt (&fzkwk1[point], kango_vect_l))
+      if (kng_ckvt (fzkwk[point].vector, kango_vect_l) ||
+	  kng_ckvt (fzkwk1[point].vector, kango_vect_l))
         {
           if (!(n = cnt % FZKIBNO))
             {
@@ -493,7 +507,7 @@
                   if (*ichbnp_p != NULL)
                     (void) freeibsp (*ichbnp_p);
                   *ichbnp_p = NULL;
-                  error1 ("Error in fzk_kai.");
+                  log_err ("fzk_kai: error.");
                   return (-1);
                 }
               else
@@ -516,10 +530,9 @@
     }
   return (cnt);
 #else /* NO_FZK */
-  struct ICHBNP *getibsp ();
   struct ICHBNP *wkptr;
 
-  register int i;               /* work index */
+  int i;               /* work index */
   struct kangovect *endvect;    /* 文節終端 vector pointer */
   struct kangovect *endvect1;   /* 文節終端 vector 1 */
 
@@ -536,7 +549,7 @@
     {
       if ((wkptr = getibsp ()) == NULL)
         {
-          error1 ("Error in fzk_kai.");
+          log_err ("fzk_kai: error.");
           return (-1);
         }
       else
@@ -561,11 +574,9 @@
  */
 
 static int
-kng_ckvt (vector, kango_vect_l)
-     register int *vector;
-     register int kango_vect_l;
+kng_ckvt (int *vector, int kango_vect_l)
 {
-  register int i, rts;
+  int i, rts;
 
   for (rts = 0, i = kango_vect_l; i > 0; i--)
     rts |= *vector++;           /* OR cheak */
@@ -577,18 +588,17 @@
  * fzk_ckvt
  */
 int
-fzk_ckvt (vector)
-     register int vector;
+fzk_ckvt (int vector)
 {
-  return vector >= 0 && fzk_ck_vector (&ft->kango_vect_area[vector]);
+  return vector >= 0 &&
+	 fzk_ck_vector (&(ft->kango_vect_area)->vector[vector]);
 }
 
 
 static int
-fzk_ck_vector (vector)
-     register int *vector;
+fzk_ck_vector (int *vector)
 {
-  register int i, rts;
+  int i, rts;
 
   rts = *vector++ & ~0x01;      /* 「先頭可」のビットを除く */
   for (i = ft->fzkvect_l - 1; i > 0; i--)
@@ -602,11 +612,9 @@
  */
 
 static void
-fzk_orvt (vector1, vector2)
-     register int *vector1;
-     register int *vector2;
+fzk_orvt (int *vector1, int *vector2)
 {
-  register int i;
+  int i;
 
   for (i = ft->fzkvect_l; i > 0; i--)
     *vector1++ |= *vector2++;   /* OR set */
@@ -614,16 +622,12 @@
 
 #ifndef NO_FZK
 static int
-fzk_ken (start, end, vector, fzkptr)
-     w_char *start;
-     w_char *end;
-     int vector[];
-     struct fzkken *fzkptr;
+fzk_ken (w_char *start, w_char *end, int vector[], struct fzkken *fzkptr)
 {
-  register int yomicnt;
-  register int setno;
+  int yomicnt;
+  int setno;
   struct fzkken *ansptr;
-  register struct fzkentry *search_ptr;
+  struct fzkentry *search_ptr;
   w_char key[YOMI_L + 1];
   int fzkvect_l = ft->fzkvect_l;
 
@@ -649,16 +653,15 @@
 
 /******************************************/
 static int
-setfzk (entry_ptr, answer_ptr, vector, fzkvect_l)
-     struct fzkentry *entry_ptr;
-     struct fzkken **answer_ptr;
-     int vector[];
-     int fzkvect_l;
-{
-  register int setno;
-  register int vectroop;
-  register int wcnt, setflg;
-  register struct fzkvect *vect_ptr;
+setfzk (struct fzkentry *entry_ptr,
+	struct fzkken **answer_ptr,
+	int vector[],
+	int fzkvect_l)
+{
+  int setno;
+  int vectroop;
+  int wcnt, setflg;
+  struct fzkvect *vect_ptr;
 
   if (entry_ptr != NULL)
     {
@@ -690,11 +693,9 @@
 
 /***************************************************/
 static int
-bittest (vector, no)
-     int vector[];
-     int no;
+bittest (int vector[], int no)
 {
-  register int wvect;
+  int wvect;
 
   wvect = vector[no / (sizeof (int) << 3)];     /* << 3 == * 8  */
   wvect >>= (int) (no % (sizeof (int) << 3));
@@ -705,22 +706,19 @@
 }
 
 /*
-int Strncmp(s1,s2,n)
-register w_char *s1;
-register w_char *s2;
-register int n;
+int Strncmp(w_char *s1, w_char *s2, int n)
 {
   if(n == 0)return(0);
   for (;n > 0 && *s1++ == *s2++;n--);
   return (int)(*--s1 - *--s2);
 }
 */
+
 #ifndef NO_FZK
 static struct fzkentry *
-bsrch (key_yomi)
-     w_char *key_yomi;
+bsrch (w_char *key_yomi)
 {
-  register int low, high, j, flg;
+  int low, high, j, flg;
 
   for (low = 0, high = ft->fzklength; low < high;)
     {
@@ -729,8 +727,8 @@
          flg = Strncmp(key_yomi, (ft->tablefuzokugo + j)->yomi, YOMI_L);
        */
       {
-        register int n;
-        register w_char *s1, *s2;
+        int n;
+        w_char *s1, *s2;
         s1 = key_yomi;
         s2 = (ft->tablefuzokugo + j)->yomi;
         for (n = YOMI_L; n > 0 && *s1++ == *s2++; n--);
@@ -748,24 +746,23 @@
 #endif
 
 static int
-error_fzk ()
+error_fzk (void)
 {
   wnn_errorno = WNN_NOT_FZK_FILE;
-  error1 ("Bat format in fzk_file\n");
+  log_err ("Bad format in fzk_file.");
   return (-1);
 }
 
 static int
-error_eof ()
+error_eof (void)
 {
   wnn_errorno = WNN_NOT_FZK_FILE;
-  error1 ("Unecpected EOF in reading fzk_file\n");
+  log_err ("Unecpected EOF in reading fzk_file.");
   return (-1);
 }
 
 static int
-get_decimal (fp)
-     register FILE *fp;
+get_decimal (FILE *fp)
 {
   unsigned char buf[24];
   int k;
@@ -781,8 +778,7 @@
 }
 
 static int
-get_hexsa (fp)
-     register FILE *fp;
+get_hexsa (FILE *fp)
 {
   unsigned char buf[24];
   int k;
@@ -798,12 +794,10 @@
 }
 
 static int
-get_string (fp, buf)
-     register FILE *fp;
-     register unsigned char *buf;
+get_string (FILE *fp, unsigned char *buf)
 {
-  register unsigned char *c = buf;
-  register int k;
+  unsigned char *c = buf;
+  int k;
   for (; (k = vgetc (fp)) == ';' || k == '\n' || k == '\t' || k == ' ';)
     {
       if (k == ';')
@@ -831,15 +825,15 @@
 }
 
 static int
-check_eof (fp)
-     register FILE *fp;
+check_eof (FILE *fp)
 {
   unsigned char buf[24];
   if (get_string (fp, buf) != EOF)
     {
       wnn_errorno = WNN_NOT_FZK_FILE;
-      error1 ("Not at the end of fzk_file\n");
+      log_err ("Not at the end of fzk_file.");
       return (-1);
     }
   return (0);
 }
+