diff Wnn/jserver/do_henkan.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/do_henkan.c	Thu Dec 13 04:30:14 2007 +0900
@@ -0,0 +1,567 @@
+/*
+ *  $Id: do_henkan.c,v 1.5 2001/06/18 09:09:41 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
+ */
+
+#if defined(HAVE_CONFIG_H)
+#include <config.h>
+#endif
+
+#if defined(HAVE_SYS_TYPES_H)
+#include <sys/types.h>
+#endif
+
+#include "commonhd.h"
+#include "jslib.h"
+#include "kaiseki.h"
+#include "jdata.h"
+#include "de_header.h"
+
+static void ret_sho_x (), ret_sho_kanji (), ret_kanji ();
+static int count_sho (), count_d_kanji (), count_s_kanji (), count_kanji ();
+
+/*      DAI BUN */
+void
+ret_dai (dai_list, cnt)
+     struct DSD_DBN *dai_list;
+     int cnt;
+{
+  register int i;
+  register struct DSD_DBN *dp;
+  if (dai_list == NULL)
+    {
+      put4_cur (0);
+      return;
+    }
+  put4_cur (cnt);
+
+  put4_cur (count_sho (dai_list, cnt));
+  put4_cur (count_d_kanji (dai_list, cnt));
+
+  for (i = 0, dp = dai_list; i < cnt; dp++, i++)
+    {
+#ifdef  DEBUG
+      out ("\tbun_jc:%d, sbncnt:%d, bun_m:%d ,sbn:%x\n", dp->bun_jc, dp->sbncnt, dp->bun_m, dp->sbn);
+#endif
+#ifdef  CONVERT_from_TOP
+      put4_cur (dp->bun_jc);    /* end */
+      put4_cur (dp->bun_m);     /* start */
+#else
+      put4_cur (maxchg - 1 - dp->bun_m);        /* end */
+      put4_cur (maxchg - 1 - dp->bun_jc);       /* start */
+#endif
+      put4_cur (dp->sbncnt);
+      put4_cur (dp->v_jc);
+    }
+  for (i = 0, dp = dai_list; i < cnt; dp++, i++)
+    {
+      ret_sho_x (dp->sbn, dp->sbncnt);
+    }
+  for (i = 0, dp = dai_list; i < cnt; dp++, i++)
+    {
+      ret_sho_kanji (dp->sbn, dp->sbncnt);
+    }
+}
+
+static int
+count_sho (dai_list, cnt)
+     struct DSD_DBN *dai_list;
+     int cnt;
+{
+  register int sho_sum, i;
+  register struct DSD_DBN *dp;
+  for (sho_sum = i = 0, dp = dai_list; i < cnt; dp++, i++)
+    {
+      sho_sum += dp->sbncnt;
+    }
+  return sho_sum;
+}
+
+
+static int
+count_d_kanji (dp, cnt)
+     struct DSD_DBN *dp;
+     int cnt;
+{
+  register int k_sum, i;
+  for (k_sum = i = 0; i < cnt; dp++, i++)
+    {
+      k_sum += count_s_kanji (dp->sbn, dp->sbncnt);
+    }
+  return k_sum;
+}
+
+static int
+count_s_kanji (sp, cnt)
+     struct DSD_SBN *sp;
+     int cnt;
+{
+  register int i, sho_sum;
+  if (sp == NULL)
+    cnt = 0;
+  sho_sum = 0;
+  for (i = 0; i < cnt; sp++, i++)
+    {
+      sho_sum += count_kanji (sp);
+    }
+  return sho_sum;
+}
+
+static int
+count_kanji (sho)
+     struct DSD_SBN *sho;
+{
+  register int tmp, k_sum;
+  w_char kouho[1000];
+
+  if (sho->jentptr)
+    {
+      Get_knj (sho->jentptr, sho->t_jc, kouho, bun + sho->i_jc, sho->bun_jc - sho->i_jc + 1);
+    }
+  else
+    {
+      get_giji_knj (sho->bun_jc, sho->i_jc, sho->t_jc, kouho);
+    }
+
+  k_sum = 0;
+  k_sum += Strlen (kouho) + 1;  /* kanji */
+  /* yomi */
+  for (tmp = sho->bun_jc;; tmp--)
+    {
+      if (tmp < sho->bun_m)
+        break;
+      k_sum++;                  /* put2_cur(bun[tmp]); */
+      if (tmp == sho->i_jc)
+        break;
+    }
+  k_sum++;                      /* put2_cur(0); */
+  /* fuzoku */
+  for (tmp = sho->i_jc - 1;; tmp--)
+    {
+      if (tmp < sho->bun_m)
+        break;
+      k_sum++;                  /* put2_cur(bun[tmp]); */
+    }
+  k_sum++;                      /* put2_cur(0); */
+  return (k_sum);
+}
+
+
+static void
+ret_sho_x (sho_list, cnt)
+     register struct DSD_SBN *sho_list;
+     register int cnt;
+{
+  if (sho_list == NULL)
+    {
+      cnt = 0;
+    }
+  for (; cnt > 0; cnt--)
+    {
+#ifdef  DEBUG
+      out ("\tbun_jc: %d, i_jc: %d, bun_m: %d \n", sho_list->bun_jc, sho_list->i_jc, sho_list->bun_m);
+      out ("\tjdata:%x, kangovect:%d, t_jc:%d, hinsi: %d:%s, status:%d\n",
+           sho_list->jentptr, sho_list->kangovect, sho_list->t_jc, sho_list->hinsi, wnn_get_hinsi_name (sho_list->hinsi), sho_list->status);
+#endif
+
+#ifdef  CONVERT_from_TOP
+      put4_cur (sho_list->bun_jc);      /*end */
+      put4_cur (sho_list->bun_m);       /*start */
+      put4_cur (sho_list->bun_jc);      /*jiriend */
+#else
+      put4_cur (maxchg - 1 - sho_list->bun_m);  /*end */
+      put4_cur (maxchg - 1 - sho_list->bun_jc); /*start */
+      put4_cur (maxchg - 1 - sho_list->i_jc);   /*jiriend */
+#endif
+
+      if (sho_list->jentptr != NULL)
+        {
+          int hindo;
+          put4_cur (sho_list->jentptr->jishono);        /*jisho No */
+          put4_cur (sho_list->jentptr->serial + sho_list->t_jc);
+          /* entry + t_jc */
+          /* Internally, we use "kasou-hindo"
+           * so return kasou-hindo as hindo-value"*/
+          hindo = *(sho_list->jentptr->hindo + sho_list->t_jc) & 0x7F;
+          if (sho_list->jentptr->hindo_in)
+            {
+              hindo += *(sho_list->jentptr->hindo_in + sho_list->t_jc) & 0x7F;
+              /* BUG */
+              if (hindo == 0x7f)
+                hindo--;
+            }
+          put4_cur (hindo);
+          /* hindo (u_char) */
+          put4_cur (*(sho_list->jentptr->hindo + sho_list->t_jc) >> 7);
+          /* ima */
+        }
+      else
+        {
+          put4_cur (-1);
+          put4_cur (sho_list->t_jc);
+          put4_cur (-1);
+          put4_cur (-1);
+        }
+      put4_cur (sho_list->hinsi);       /* hinshi */
+      put4_cur (sho_list->status);
+      put4_cur (sho_list->status_bkwd);
+      put4_cur (sho_list->kangovect);
+      put4_cur (sho_list->v_jc);
+      sho_list++;
+    }
+}
+
+static void
+ret_sho_kanji (sho_list, cnt)
+     register struct DSD_SBN *sho_list;
+     register int cnt;
+{
+  if (sho_list == NULL)
+    {
+      cnt = 0;
+    }
+  for (; cnt > 0; sho_list++, cnt--)
+    {
+      ret_kanji (sho_list);
+    }
+}
+
+static void
+ret_kanji (sho)
+     register struct DSD_SBN *sho;
+{
+  register int tmp;
+  w_char kouho[1000];
+
+  if (sho->jentptr)
+    {
+      Get_knj (sho->jentptr, sho->t_jc, kouho, bun + sho->i_jc, sho->bun_jc - sho->i_jc + 1);
+    }
+  else
+    {
+      get_giji_knj (sho->bun_jc, sho->i_jc, sho->t_jc, kouho);
+    }
+  putws_cur (kouho);            /* kanji */
+  /* yomi */
+#ifdef  CONVERT_from_TOP
+  for (tmp = sho->i_jc; tmp <= sho->bun_jc; tmp++)
+    {
+#else
+  for (tmp = sho->bun_jc; tmp >= sho->i_jc; tmp--)
+    {
+#endif
+      put2_cur (bun[tmp]);
+    }
+
+  put2_cur (0);
+  /* fuzoku */
+  for (tmp = sho->i_jc - 1;; tmp--)
+    {
+      if (tmp < sho->bun_m)
+        break;
+      put2_cur (bun[tmp]);
+    }
+  put2_cur (0);
+}
+
+/*      SHO BUN */
+void
+ret_sho (sho_list, cnt)
+     register struct DSD_SBN *sho_list;
+     register int cnt;
+{
+  if (sho_list == NULL)
+    {
+      cnt = 0;
+      put4_cur (cnt);
+      return;
+    }
+  put4_cur (cnt);
+  put4_cur (count_s_kanji (sho_list, cnt));
+
+  ret_sho_x (sho_list, cnt);
+  ret_sho_kanji (sho_list, cnt);
+}
+
+#ifdef  CONVERT_by_STROKE
+extern struct b_koho *p_kohos[];        /* BWNN koho buffer */
+
+static int
+count_s_kanji_B (cnt)
+     int cnt;
+{
+  register int i, sho_sum;
+  sho_sum = 0;
+  for (i = 0; i < cnt; i++)
+    {
+      sho_sum += Strlen (p_kohos[i]->p_kanji);
+      sho_sum += Strlen (p_kohos[i]->p_yomi);
+      sho_sum += 3;
+    }
+  return sho_sum;
+}
+
+static void
+ret_sho_x_B (end, start, cnt, zenp)
+     int end;
+     int start;
+     register int cnt;
+     int zenp;
+{
+  int i;
+  int hindo = 0;
+  struct b_koho *b_pter;
+
+  for (i = 0; i < cnt; i++)
+    {
+      put4_cur (end);           /*end */
+      put4_cur (start);         /*start */
+      put4_cur (end);           /*jiriend */
+      if ((b_pter = p_kohos[i]) != NULL)
+        {
+          put4_cur (b_pter->dic_no);    /*jisho No */
+          put4_cur (b_pter->serial);
+          hindo = *(b_pter->p_hindo);
+          put4_cur (hindo & 0x7F);      /* hindo (u_char) */
+          put4_cur (hindo >> 7);        /* ima */
+          put4_cur (*(b_pter->p_hinsi));        /* hinshi */
+        }
+      else
+        {
+          put4_cur (-1);
+          put4_cur (0);
+          put4_cur (-1);
+          put4_cur (-1);
+          put4_cur (0);
+        }
+      put4_cur (3);
+      put4_cur (1);
+      put4_cur (0x7);
+      put4_cur (hindo * 5 - i);
+    }
+}
+
+static void
+ret_sho_kanji_B (end, start, cnt, zenp)
+     int end;
+     int start;
+     register int cnt;
+     int zenp;
+{
+  int i;
+  if (zenp == WNN_ZENKOUHO || (cnt != 1))
+    {
+      for (i = 0; i < cnt; i++)
+        {
+          putws_cur (p_kohos[i]->p_kanji);      /* kanji */
+          putws_cur (p_kohos[i]->p_yomi);       /* yomi */
+          /* fuzoku */
+          put2_cur (0);
+        }
+    }
+  else
+    {
+      putws_cur (p_kohos[0]->p_kanji);
+      for (i = end; i < start; i++)
+        put2_cur (bun[i]);
+      put2_cur (0);
+      /* fuzoku */
+      put2_cur (0);
+    }
+}
+
+/* BWNN SHO BUN */
+void
+ret_B (end, start, cnt, zenp)
+     int end;
+     int start;
+     register int cnt;
+     int zenp;
+{
+  if (cnt == 0)
+    {
+      put4_cur (cnt);
+      return;
+    }
+  put4_cur (cnt);
+  put4_cur (count_s_kanji_B (cnt));
+
+  ret_sho_x_B (end, start, cnt, zenp);
+  ret_sho_kanji_B (end, start, cnt, zenp);
+}
+
+void
+ret_daiB (end, start, cnt, zenp)
+     int end;
+     int start;
+     register int cnt;
+     int zenp;
+{
+  register int i;
+  struct b_koho *b_pter;
+  int hindo = 0;
+
+  if (cnt == 0)
+    {
+      put4_cur (cnt);
+      return;
+    }
+  put4_cur (cnt);
+  put4_cur (cnt);
+  put4_cur (count_s_kanji_B (cnt));
+
+  for (i = 0; i < cnt; i++)
+    {
+      put4_cur (end);
+      put4_cur (start);
+      put4_cur (1);
+      b_pter = p_kohos[i];
+      hindo = *(b_pter->p_hindo);
+      put4_cur (hindo * 5 - i);
+    }
+  ret_sho_x_B (end, start, cnt, zenp);
+  ret_sho_kanji_B (end, start, cnt, zenp);
+
+}
+#endif /* CONVERT_by_STROKE */
+
+#ifdef  DEBUG
+
+#ifdef  putwchar
+#undef  putwchar
+#endif
+
+static void _print_dlist ();
+static void _print_dlist1 ();
+
+void
+print_dlist (dlist, cnt)
+     struct DSD_DBN *dlist;
+     int cnt;
+{
+
+  out ("大文節数:%d\n", cnt);
+  if (dlist == 0)
+    return;
+  for (; cnt > 0; dlist++, cnt--)
+    {
+      _print_dlist (dlist);
+      print_dlist1 (dlist->sbn, dlist->sbncnt);
+    }
+  fflush (stdout);
+}
+
+static void
+_print_dlist (dlist)
+     struct DSD_DBN *dlist;
+{
+  struct DSD_SBN *sbn;
+  int i;
+  int tmp;
+  w_char kouho[512];
+
+  out ("大文節:%x\t", dlist);
+  if (dlist == 0)
+    return;
+
+  sbn = dlist->sbn;
+  for (i = dlist->sbncnt; i > 0; i--)
+    {
+      if (sbn == 0)
+        break;
+
+      if (sbn->jentptr)
+        Get_knj (sbn->jentptr, sbn->t_jc, kouho, bun + sbn->i_jc, sbn->bun_jc - sbn->i_jc + 1);
+      else
+        get_giji_knj (sbn->bun_jc, sbn->i_jc, sbn->t_jc, kouho);
+      out (" ");
+      wsputs (kouho);
+      out (":");
+      for (tmp = sbn->i_jc - 1; tmp >= sbn->bun_m; tmp--)
+        putwchar (bun[tmp]);
+
+      sbn++;
+    }
+  out ("\t\thyouka:%d\n", dlist->v_jc);
+  fflush (stdout);
+}
+
+void
+print_dlist1 (dlist1, cnt)
+     struct DSD_SBN *dlist1;
+     int cnt;
+{
+  unsigned int hindo;
+
+  for (; cnt > 0; dlist1++, cnt--)
+    {
+      _print_dlist1 (dlist1);
+      if (dlist1 == 0)
+        return;
+      if (dlist1->jentptr == 0)
+        hindo = 0;
+      else
+        hindo = *(dlist1->jentptr->hindo + dlist1->t_jc);
+      out ("  jdata:%x vect:%d t_jc:%d hinsi:%d:%s hindo:%x hyoka:%d status:%d status_bkwd:%d\n",
+           dlist1->jentptr, dlist1->kangovect, dlist1->t_jc, dlist1->hinsi, wnn_get_hinsi_name (dlist1->hinsi), hindo, dlist1->v_jc, dlist1->status, dlist1->status_bkwd);
+    }
+  fflush (stdout);
+}
+
+static void
+_print_dlist1 (dlist1)
+     struct DSD_SBN *dlist1;
+{
+  int tmp;
+  w_char kouho[512];
+
+  out ("小文節:%x\t", dlist1);
+  if (dlist1 == 0)
+    {
+      return;
+    }
+  for (tmp = dlist1->bun_jc; tmp >= dlist1->bun_m; tmp--)
+    {
+      putwchar (bun[tmp]);
+      if (tmp == dlist1->i_jc)
+        {
+          if (dlist1->jentptr)
+            Get_knj (dlist1->jentptr, dlist1->t_jc, kouho, bun + dlist1->i_jc, dlist1->bun_jc - dlist1->i_jc + 1);
+          else
+            get_giji_knj (dlist1->bun_jc, dlist1->i_jc, dlist1->t_jc, kouho);
+          out (" ");
+          wsputs (kouho);
+          out (":");
+        }
+    }
+  out ("\n");
+  fflush (stdout);
+}
+
+#endif /* DEBUG */