diff Wnn/jserver/jishosub.c @ 0:bbc77ca4def5

initial import
author Yoshiki Yazawa <yaz@cc.rim.or.jp>
date Thu, 13 Dec 2007 04:30:14 +0900
parents
children 790205f476c0
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Wnn/jserver/jishosub.c	Thu Dec 13 04:30:14 2007 +0900
@@ -0,0 +1,375 @@
+/*
+ *  $Id: jishosub.c,v 1.3 2001/06/14 18:16:02 ura Exp $
+ */
+
+/*
+ * FreeWnn is a network-extensible Kana-to-Kanji conversion system.
+ * This file is part of FreeWnn.
+ * 
+ * Copyright Kyoto University Research Institute for Mathematical Sciences
+ *                 1987, 1988, 1989, 1990, 1991, 1992
+ * Copyright OMRON Corporation. 1987, 1988, 1989, 1990, 1991, 1992, 1999
+ * Copyright ASTEC, Inc. 1987, 1988, 1989, 1990, 1991, 1992
+ * Copyright FreeWnn Project 1999, 2000
+ *
+ * Maintainer:  FreeWnn Project   <freewnn@tomo.gr.jp>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+
+#include <stdio.h>
+#include "commonhd.h"
+#include "de_header.h"
+#include "jdata.h"
+
+static int inspect_sd (), get_fst_serial (), inspect_ud ();
+
+int
+inspect (dic_no, serial, yomi, jd)
+     int dic_no;
+     int serial;
+     w_char *yomi;
+     struct jdata *jd;
+{
+  struct JT *jtl;
+
+  if (dic_no >= MAX_DIC || dic_no < 0 || dic_table[dic_no].body == -1)
+    {
+      wnn_errorno = WNN_DICT_NOT_IN_ENV;
+      return (-1);
+    }
+  jtl = (struct JT *) (files[dic_table[dic_no].body].area);
+  if (jtl->syurui == WNN_UD_DICT)
+    {
+      if (inspect_ud (dic_no, serial, yomi, jd) == -1)
+        return (-1);
+#if     defined(CONVERT_by_STROKE) || defined(CONVERT_with_SiSheng)
+    }
+  else if ((jtl->syurui & 0xff) == WNN_REV_DICT)
+    {
+#else
+    }
+  else if (jtl->syurui == WNN_REV_DICT)
+    {
+#endif /* CONVERT_by_STROKE || CONVERT_with_SiSheng */
+      if (inspect_rd (dic_no, serial, yomi, jd) == -1)
+        return (-1);
+    }
+  else
+    {
+      if (inspect_sd (dic_no, serial, yomi, jd) == -1)
+        return (-1);
+    }
+  return (0);
+}
+
+
+
+int
+get_yomi_from_serial (dic_no, serial, yomi)
+     int dic_no;
+     int serial;
+     w_char *yomi;
+{
+  int k;
+  struct jdata jdata;
+  struct JT *jtl;
+
+  jtl = (struct JT *) (files[dic_table[dic_no].body].area);
+  for (k = 0; k < LENGTHYOMI; k++)
+    {
+      yomi[k] = 0;
+    }
+
+  if (jtl->syurui == WNN_UD_DICT)
+    {
+      if (inspect_ud (dic_no, serial, yomi, &jdata) == -1)
+        return (-1);
+#if     defined(CONVERT_by_STROKE) || defined(CONVERT_with_SiSheng)
+    }
+  else if ((jtl->syurui & 0xff) == WNN_REV_DICT)
+    {
+#else
+    }
+  else if (jtl->syurui == WNN_REV_DICT)
+    {
+#endif /* CONVERT_by_STROKE || CONVERT_with_SiSheng */
+      if (inspect_rd (dic_no, serial, yomi, &jdata) == -1)
+        return (-1);
+    }
+  else
+    {
+      if (inspect_sd (dic_no, serial, yomi, &jdata) == -1)
+        return (-1);
+    }
+  return (0);
+}
+
+
+static int
+inspect_sd (dic_no, serial, yomi, jd)
+     int dic_no;
+     int serial;
+     w_char *yomi;
+     struct jdata *jd;
+{
+  int len;
+  struct JT *jtl;
+  struct HJT *hjtl;
+  UCHAR *hontaistart;
+  UCHAR *hopter;
+  int key;
+  int tsize;
+  w_char *charst;
+  w_char *sumst;
+  int *ptrst;
+  int state;
+  int sdiff;
+  int last;
+  int serialst;
+  int kanji1;
+
+
+  yomi[0] = 0;
+  jtl = (struct JT *) (files[dic_table[dic_no].body].area);
+  if (dic_table[dic_no].hindo >= 0)
+    hjtl = (struct HJT *) (files[dic_table[dic_no].hindo].area);
+  else
+    hjtl = NULL;
+  hontaistart = jtl->hontai;
+  hopter = hontaistart;
+  if (serial >= jtl->maxserial)
+    {
+      wnn_errorno = WNN_WORD_NO_EXIST;
+      return (-1);
+    }
+  if (jtl->hinsi[serial] == SAKUJO_HINSI)
+    return (-1);
+
+  for (;;)
+    {
+      switch ((state = *(w_char *) hopter))
+        {
+        case ST_NORMAL:
+        case ST_NOPTER:
+          tsize = *(w_char *) (hopter + 2);
+          serialst = *(int *) (hopter + 4);
+          kanji1 = *(int *) (hopter + 8);
+          charst = (w_char *) (hopter + 12);
+          sumst = ((w_char *) charst + tsize + 2);
+          /* + 2 keeps two zero words */
+          ptrst = (int *) ((w_char *) sumst + tsize);
+          sdiff = serial - *(int *) (hopter + 4);
+
+          /* May be a little late, but enough */
+          if ((int) sdiff < (int) sumst[tsize - 1])
+            {
+              for (key = 0; key < tsize; key++)
+                {
+                  if ((int) sdiff < (int) sumst[key])
+                    {
+                      break;
+                    }
+                }
+              len = Strlen (yomi);
+              yomi[len] = charst[key];
+              yomi[len + 1] = 0;
+
+              jd->kanji1 = kanji1;
+              jd->kanji2 = serial - serialst;
+              jd->serial = serial;
+              jd->kosuu = 1;
+              jd->jishono = dic_no;
+              jd->jptr = NULL;
+              jd->hinsi = jtl->hinsi + serial;
+              if (hjtl)
+                {
+                  jd->hindo = hjtl->hindo + serial;
+                  jd->hindo_in = jtl->hindo + serial;
+                }
+              else
+                {
+                  jd->hindo = jtl->hindo + serial;
+                  jd->hindo_in = NULL;
+                }
+              return (0);
+            }
+          else
+            {
+              if (state == ST_NOPTER)
+                {
+                  wnn_errorno = WNN_WORD_NO_EXIST;
+                  return (-1);
+                }
+              last = 0;
+              for (key = 0; key < tsize; key++)
+                {
+                  if (ptrst[key])
+                    {
+                      if (serial < get_fst_serial (hontaistart + ptrst[key], hontaistart))
+                        break;
+                      last = key;
+                    }
+                }
+              len = Strlen (yomi);
+              yomi[len] = charst[last];
+              yomi[len + 1] = 0;
+              hopter = hontaistart + ptrst[last];
+            }
+          break;
+        case ST_NOENT:
+          tsize = *(w_char *) (hopter + 2);
+          charst = (w_char *) (hopter + 4);
+          ptrst = (int *) AL_INT ((w_char *) charst + tsize);
+          last = 0;
+          for (key = 0; key < tsize; key++)
+            {
+              if (ptrst[key])
+                {
+                  if (serial < get_fst_serial (hontaistart + ptrst[key], hontaistart))
+                    break;
+                  last = key;
+                }
+            }
+          len = Strlen (yomi);
+          yomi[len] = charst[last];
+          yomi[len + 1] = 0;
+          hopter = hontaistart + ptrst[last];
+          break;
+        case ST_SMALL:
+          len = Strlen (yomi);
+          yomi[len] = *(w_char *) (hopter + 2);
+          yomi[len + 1] = 0;
+          hopter = hopter + 4;
+          break;
+        default:
+          error1 ("inspect_sd:Error 2\n");
+        }
+    }
+}
+
+static int
+get_fst_serial (hopter, hontaistart)
+     UCHAR *hontaistart;
+     char *hopter;
+{
+  int tsize;
+  int k;
+  int *ptrst;
+  w_char *charst;
+
+  switch (*(w_char *) hopter)
+    {
+    case ST_NORMAL:
+    case ST_NOPTER:
+      return (*(int *) (hopter + 4));
+    case ST_NOENT:
+      tsize = *(w_char *) (hopter + 2);
+      charst = (w_char *) (hopter + 4);
+      ptrst = (int *) AL_INT ((w_char *) charst + tsize);
+      for (k = 0; k < tsize; k++)
+        {
+          if (ptrst[k])
+            {
+              return (get_fst_serial (hontaistart + ptrst[k], hontaistart));
+            }
+        }
+      break;
+    case ST_SMALL:
+      return (get_fst_serial (hopter + 4, hontaistart));
+    default:
+      error1 ("get_fst_serial:Error 1\n");
+    }
+  return (-1);
+}
+
+
+static int
+inspect_ud (dic_no, serial, yomi, jd)
+     int dic_no;
+     int serial;
+     w_char *yomi;
+     struct jdata *jd;
+{
+  struct JT *jtl;
+  struct HJT *hjtl;
+  struct uind1 *tary;
+  struct uind2 *p;
+  int k;
+  int len;
+
+  jtl = (struct JT *) (files[dic_table[dic_no].body].area);
+  tary = jtl->table;
+  if (dic_table[dic_no].hindo >= 0)
+    hjtl = (struct HJT *) (files[dic_table[dic_no].hindo].area);
+  else
+    hjtl = NULL;
+
+  if (serial >= jtl->maxserial)
+    {
+      wnn_errorno = WNN_WORD_NO_EXIST;
+      return (-1);
+    }
+  if (jtl->hinsi[serial] == SAKUJO_HINSI)
+    return (-1);
+
+  for (k = 0; k < jtl->maxtable; k++)
+    {
+      for (p = ((struct uind2 *) ((tary[k].pter) + jtl->hontai));; p = ((struct uind2 *) ((p->next) + jtl->hontai)))
+        {
+          if ((int) p->serial <= (int) serial && (int) (p->serial + p->kosuu) > (int) serial)
+            goto found_it;
+          if (p->next == ENDPTR)
+            break;
+        }
+    }
+  wnn_errorno = WNN_WORD_NO_EXIST;
+  return (-1);
+
+found_it:
+  yomi[0] = tary[k].yomi1 >> 16;
+  yomi[1] = tary[k].yomi1 & 0xffff;
+  if (yomi[1])
+    {
+      yomi[2] = tary[k].yomi2 >> 16;
+      if (yomi[2])
+        {
+          yomi[3] = tary[k].yomi2 & 0xffff;
+        }
+    }
+  len = p->yomi[0];
+  Strncpy (yomi + 4, (p->yomi) + 1, len - 4);
+  yomi[len] = 0;
+
+  jd->kanji1 = p->kanjipter;
+  jd->kanji2 = serial - p->serial;
+  jd->serial = serial;
+  jd->kosuu = 1;
+  jd->jishono = dic_no;
+  jd->jptr = NULL;
+  jd->hinsi = jtl->hinsi + serial;
+  if (hjtl)
+    {
+      jd->hindo = hjtl->hindo + serial;
+      jd->hindo_in = jtl->hindo + serial;
+    }
+  else
+    {
+      jd->hindo = jtl->hindo + serial;
+      jd->hindo_in = NULL;
+    }
+
+  return (0);
+}