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

initial import
author Yoshiki Yazawa <yaz@cc.rim.or.jp>
date Thu, 13 Dec 2007 04:30:14 +0900
parents
children a7ccf412ba02
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Wnn/jserver/do_dic_no.c	Thu Dec 13 04:30:14 2007 +0900
@@ -0,0 +1,595 @@
+/*
+ *  $Id: do_dic_no.c,v 1.5 2003/05/11 18:41:49 hiroo 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, 2003
+ *
+ * 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
+ */
+
+/*
+ *      Do Dic operation by DicNo
+ */
+
+#include <stdio.h>
+
+#include "demcom.h"
+#include "commonhd.h"
+#include "de_header.h"
+#include "kaiseki.h"
+#include "jdata.h"
+#include "hinsi_file.h"
+
+static void return_jbiki (struct jdata *jd);
+static void return_jbiki1 (struct jdata *jd);
+static int count_jdata (struct jdata *p);
+static int count_jdata_kanji (struct jdata *p);
+
+void
+dic_init ()
+{
+  int i;
+  for (i = 0; i < MAX_DIC; i++)
+    {
+      dic_table[i].body = -1;
+      dic_table[i].hindo = -1;
+    }
+}
+
+/*
+        Dic. OPE by DicNo.
+ */
+
+/*      js_dic_info     */
+void
+js_dic_info ()
+{
+  int dic_no, envi;
+  envi = get4_cur ();           /* env_id */
+  dic_no = get4_cur ();
+  if (!dic_in_envp (dic_no, envi))
+    {
+      wnn_errorno = WNN_DICT_NOT_IN_ENV;
+      error_ret ();
+      putc_purge ();
+      return;
+    }
+  put4_cur (0);
+  put_dic_info (dic_no);
+  putc_purge ();
+}
+
+void
+put_dic_info (int dic_no)
+{
+  int fid, hfid;
+  struct JT *jtl;
+
+  put4_cur (dic_no);
+  put4_cur (fid = dic_table[dic_no].body);
+  put4_cur (hfid = dic_table[dic_no].hindo);
+  put4_cur (dic_table[dic_no].rw);
+  put4_cur (dic_table[dic_no].hindo_rw);
+  put4_cur (dic_table[dic_no].enablef);
+  put4_cur (dic_table[dic_no].nice);
+  put4_cur (dic_table[dic_no].rev);
+/* added H.T */
+  jtl = (struct JT *) files[fid].area;
+  putnws_cur (jtl->comment, jtl->maxcomment);
+  puts_cur (files[fid].name);
+  if (hfid >= 0)
+    puts_cur (files[hfid].name);
+  else
+    puts_cur ("");
+  puts_n_cur (files[fid].passwd, WNN_PASSWD_LEN);
+  if (hfid >= 0)
+    puts_n_cur (files[hfid].passwd, WNN_PASSWD_LEN);
+  else
+    puts_n_cur (jtl->hpasswd, WNN_PASSWD_LEN);
+  put4_cur (jtl->syurui);
+  put4_cur (jtl->gosuu);
+  put4_cur (files[fid].localf);
+  if (hfid >= 0)
+    put4_cur (files[hfid].localf);
+  else
+    put4_cur (-1);
+}
+
+
+
+
+/*      js_word_add     */
+void
+js_word_add ()
+{
+  int dic_no, hinsi, envi, hindo, ret;
+  w_char yomi[LENGTHYOMI], kanji[LENGTHKANJI], comment[LENGTHKANJI];
+  envi = get4_cur ();           /* env_id */
+  dic_no = get4_cur ();
+  getws_cur (yomi, LENGTHYOMI);
+  getws_cur (kanji, LENGTHKANJI);
+  getws_cur (comment, LENGTHKANJI);
+  hinsi = get4_cur ();
+  hindo = get4_cur ();
+  ret = word_add (envi, dic_no, yomi, kanji, hinsi, hindo, comment);
+  if (ret == -1)
+    {
+      error_ret ();
+    }
+  else
+    {
+      put4_cur (ret);
+    }
+  putc_purge ();
+}
+
+/*      js_word_delete  */
+void
+js_word_delete ()
+{
+  int dic_no, dic_entry, envi, ret;
+  envi = get4_cur ();           /* env_id */
+  dic_no = get4_cur ();
+  dic_entry = get4_cur ();
+  ret = word_delete (envi, dic_no, dic_entry);
+  if (ret == -1)
+    {
+      error_ret ();
+    }
+  else
+    {
+      put4_cur (ret);
+    }
+  putc_purge ();
+}
+
+void
+js_word_search_by_env ()
+{
+  w_char yomi[LENGTHYOMI];
+  w_char ryomi[LENGTHYOMI];
+  int n;
+
+  c_env = env[get4_cur ()];
+  getws_cur (yomi, LENGTHYOMI);
+#ifdef  CONVERT_from_TOP
+  Strcpy (ryomi, yomi);
+#else
+  Sreverse (ryomi, yomi);
+#endif /* CONVERT_from_TOP */
+  init_jmt ();
+
+  n = jishobiki (ryomi, jmt_ptr);
+  if (n != Strlen (yomi))
+    {                           /* Want to return Error if n < 0 */
+      return_jbiki (NULL);
+    }
+  else
+    {
+      return_jbiki (jmt_ptr[n - 1]);
+    }
+  if (n > 0)
+    jmt_ptr += n;
+  putc_purge ();
+}
+
+
+void
+js_word_search ()
+{
+  w_char yomi[LENGTHYOMI];
+  w_char ryomi[LENGTHYOMI];
+  int dic_no;
+  int n;
+
+  get4_cur ();                  /* env_id */
+  dic_no = get4_cur ();
+  getws_cur (yomi, LENGTHYOMI);
+#ifdef  CONVERT_from_TOP
+  Strcpy (ryomi, yomi);
+#else
+  Sreverse (ryomi, yomi);
+#endif /* CONVERT_from_TOP */
+  init_jmt ();
+
+  n = word_search (dic_no, ryomi, jmt_ptr);
+  if (n != Strlen (yomi))
+    {                           /* Want to return Error if n < 0 */
+      return_jbiki (NULL);
+    }
+  else
+    {
+      return_jbiki (jmt_ptr[n - 1]);
+    }
+  if (n > 0)
+    jmt_ptr += n;
+  putc_purge ();
+}
+
+
+void
+js_word_comment_set ()
+{
+  int dic_no, envi, entry;
+  int ret;
+  w_char comment[LENGTHKANJI];
+
+  envi = get4_cur ();           /* env_id */
+  dic_no = get4_cur ();
+  entry = get4_cur ();
+  getws_cur (comment, LENGTHKANJI);
+
+  ret = word_comment_set (envi, dic_no, entry, comment);
+  if (ret == -1)
+    {
+      error_ret ();
+    }
+  else
+    {
+      put4_cur (0);
+    }
+  putc_purge ();
+}
+
+void
+js_word_info ()
+{
+  int dic_no, entry;
+  struct jdata jdata;
+  w_char yomi[LENGTHYOMI + 1];
+  w_char ryomi[LENGTHYOMI + 1];
+
+  get4_cur ();                  /* env_id */
+  dic_no = get4_cur ();
+  entry = get4_cur ();
+  if (inspect (dic_no, entry, yomi, &jdata) == -1)
+    {
+      error_ret ();
+      putc_purge ();
+    }
+  else
+    {
+      put4_cur (0);
+#ifdef  CONVERT_from_TOP
+      Strcpy (ryomi, yomi);
+#else
+      Sreverse (ryomi, yomi);
+#endif /* CONVERT_from_TOP */
+      putws_cur (ryomi);
+      return_jbiki (&jdata);
+      putc_purge ();
+    }
+}
+
+
+static void
+return_jbiki (struct jdata *jd)
+{
+  put4_cur (count_jdata (jd));
+  put4_cur (count_jdata_kanji (jd));
+  return_jbiki1 (jd);
+}
+
+static void
+return_jbiki1 (struct jdata *jd)
+{
+  int t;
+  w_char kouho[LENGTHKANJI];
+  w_char comment[LENGTHKANJI];
+  struct jdata *p;
+
+  for (p = jd; p; p = p->jptr)
+    {
+      for (t = 0; t < p->kosuu; t++)
+        {
+          put4_cur (p->jishono);
+          put4_cur (p->serial + t);
+
+          put4_cur (*(p->hinsi + t));
+
+          put4_cur (motoni2 (*(p->hindo + t) & 0x7f));
+          put4_cur (*(p->hindo + t) >> 7);
+
+/* internal hindo */
+          if (p->hindo_in)
+            {
+              put4_cur (motoni2 (*(p->hindo_in + t) & 0x7f));
+              put4_cur (*(p->hindo_in + t) >> 7);
+            }
+          else
+            {
+              put4_cur (-1);
+              put4_cur (-1);
+            }
+        }
+    }
+  put4_cur (-1);
+  for (p = jd; p; p = p->jptr)
+    {
+      for (t = 0; t < p->kosuu; t++)
+        {
+          get_knj_com (p, t, kouho, comment);
+/*          get_knj(p, t, kouho);  H.T. Return Also Comment */
+          putws_cur (kouho);    /* kanji */
+          putws_cur (comment);  /* comment */
+        }
+    }
+}
+
+static int
+count_jdata (struct jdata *p)
+{
+  int sum;
+
+  for (sum = 0; p; p = p->jptr)
+    {
+      sum += p->kosuu;
+    }
+  return sum;
+}
+
+static int
+count_jdata_kanji (struct jdata *p)
+{
+  int sum, t;
+  w_char kouho[LENGTHKANJI];
+  w_char comment[LENGTHKANJI];
+
+  for (sum = 0; p; p = p->jptr)
+    {
+      for (t = 0; t < p->kosuu; t++)
+        {
+          get_knj_com (p, t, kouho, comment);
+          sum += Strlen (kouho);        /* kanji */
+          sum += Strlen (comment);      /* comment */
+        }
+    }
+  return sum;
+}
+
+void
+js_hinsi_name ()
+{
+  w_char *c;
+  int no;
+
+  no = get4_cur ();
+  if ((c = wnn_hinsi_name (no)) == NULL)
+    {
+      error_ret ();
+      putc_purge ();
+      return;
+    }
+  put4_cur (Strlen (c));
+  putws_cur (c);
+  putc_purge ();
+}
+
+void
+js_hinsi_number ()
+{
+  w_char name[WNN_HINSI_NAME_LEN];
+  int no;
+
+  getws_cur (name, WNN_HINSI_NAME_LEN);
+
+  if ((no = wnn_hinsi_number (name)) == -1)
+    {
+      error_ret ();
+      putc_purge ();
+      return;
+    }
+  put4_cur (no);
+  putc_purge ();
+}
+
+
+void
+js_hinsi_list ()
+{
+  w_char name[WNN_HINSI_NAME_LEN];
+  w_char *c, *c1;
+  int envi, dic_no, no;
+  int l, l1, k;
+  int fid = 0, mmynode;
+  struct wnn_hinsi_node *mynode;
+  struct JT *jtl;
+
+  envi = get4_cur ();
+  dic_no = get4_cur ();
+  getws_cur (name, WNN_HINSI_NAME_LEN);
+
+  if (dic_no == -1)
+    {
+/*      fid = env[envi]->fzk_fid; */
+      fid = 0;
+      mynode = NULL;
+      mmynode = 0;
+    }
+  else
+    {
+#ifdef nodef                    /* fid ha toumen tukawanai */
+      if (!dic_in_envp (dic_no, envi))
+        {
+          wnn_errorno = WNN_DICT_NOT_IN_ENV;
+          error_ret ();
+          putc_purge ();
+          return;
+        }
+#endif
+      if (dic_no >= MAX_DIC || dic_no < 0)
+        {
+          wnn_errorno = WNN_DICT_NOT_IN_ENV;
+          error_ret ();
+          putc_purge ();
+          return;
+        }
+
+      fid = dic_table[dic_no].body;
+      if (fid == -1)
+        {
+          wnn_errorno = WNN_DICT_NOT_IN_ENV;
+          error_ret ();
+          putc_purge ();
+          return;
+        }
+      jtl = (struct JT *) (files[fid].area);
+      mynode = jtl->node;
+      mmynode = jtl->maxnode;
+      if (mmynode == 0)
+        mynode = NULL;
+    }
+
+  if ((no = wnn_hinsi_list (name, &c, mynode, mmynode)) == -1)
+    {
+      error_ret ();
+      putc_purge ();
+      return;
+    }
+  put4_cur (no);
+  for (l = 0, c1 = c, k = 0; k < no; k++)
+    {
+/*      l += (l1 =  Strlen(c1));
+        c1 += l1 + 1; H.T.*/
+      l += (l1 = Strlen (c1) + 1);
+      c1 += l1;
+    }
+  put4_cur (l);
+  for (k = 0, c1 = c; k < no; k++)
+    {
+      putws_cur (c1);
+      c1 += Strlen (c1) + 1;
+    }
+  putc_purge ();
+}
+
+void
+js_hinsi_dicts ()
+{
+  int envi;
+  w_char *name;
+  register int k;
+  int cnt;
+  struct JT *jtl;
+  int ret[MAX_DIC];
+  int no;
+  int mmynode;
+  struct wnn_hinsi_node *mynode;
+  int max;
+  register int dno;
+
+  envi = get4_cur ();
+  no = get4_cur ();
+  if (no != -1)
+    {                           /* H.T. n == -1 to return all dicts */
+      if ((name = wnn_hinsi_name (no)) == NULL)
+        {
+          error_ret ();
+          putc_purge ();
+          return;
+        }
+    }
+  cnt = 0;
+  max = env[envi]->jishomax;
+  for (k = 0; k < max; k++)
+    {
+      if ((dno = (env[envi]->jisho)[k]) == -1)
+        continue;
+      if (dic_table[dno].body == -1)
+        continue;
+      if (dic_table[dno].rw == WNN_DIC_RDONLY)
+        continue;               /* H.T. */
+      if (no == -1)
+        {
+          ret[cnt++] = dno;
+        }
+      else
+        {
+          jtl = (struct JT *) (files[dic_table[dno].body].area);
+          mynode = jtl->node;
+          mmynode = jtl->maxnode;
+          if (mmynode == 0)
+            mynode = NULL;
+          if (wnn_has_hinsi (mynode, mmynode, name))
+            ret[cnt++] = dno;
+        }
+    }
+  put4_cur (cnt);
+  for (k = 0; k < cnt; k++)
+    {
+      put4_cur (ret[k]);
+    }
+  putc_purge ();
+}
+
+void
+js_hinsi_table_set ()
+{
+  w_char table[HEAP_LEN];
+  int envi, dic_no, fid;
+  /*
+     struct wnn_hinsi_node *mynode;
+   */
+  struct JT *jtl;
+
+  envi = get4_cur ();
+  dic_no = get4_cur ();
+  getws_cur (table, HEAP_LEN);
+
+
+  if (!dic_in_envp (dic_no, envi))
+    {
+      wnn_errorno = WNN_DICT_NOT_IN_ENV;
+      error_ret ();
+      putc_purge ();
+      return;
+    }
+
+  if (dic_no >= MAX_DIC || dic_no < 0)
+    {
+      wnn_errorno = WNN_DICT_NOT_IN_ENV;
+      error_ret ();
+      putc_purge ();
+      return;
+    }
+
+  fid = dic_table[dic_no].body;
+  if (fid == -1)
+    {
+      wnn_errorno = WNN_DICT_NOT_IN_ENV;
+      error_ret ();
+      putc_purge ();
+      return;
+    }
+  jtl = (struct JT *) (files[fid].area);
+  if (hinsi_table_set (jtl, table) == -1)
+    {
+      error_ret ();
+      putc_purge ();
+      return;
+    }
+  put4_cur (0);
+  putc_purge ();
+}