diff Xwnmo/xwnmo/kuten.c @ 0:bbc77ca4def5

initial import
author Yoshiki Yazawa <yaz@cc.rim.or.jp>
date Thu, 13 Dec 2007 04:30:14 +0900
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Xwnmo/xwnmo/kuten.c	Thu Dec 13 04:30:14 2007 +0900
@@ -0,0 +1,467 @@
+/*
+ * $Id: kuten.c,v 1.2 2001/06/14 18:16:16 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 1991, 1992 by Massachusetts Institute of Technology
+ *
+ * Author: OMRON SOFTWARE Co., Ltd. <freewnn@rd.kyoto.omronsoft.co.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, 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 GNU Emacs; see the file COPYING.  If not, write to the
+ * Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ * Commentary:
+ *
+ * Change log:
+ *
+ * Last modified date: 8,Feb.1999
+ *
+ * Code:
+ *
+ */
+/*      Version 4.0
+ */
+/*
+**   programs for KUTEN NYUURYOKU
+*/
+
+#include <stdio.h>
+#include "commonhd.h"
+#include "sdefine.h"
+#ifdef XJUTIL
+#include "xjutil.h"
+#include "sxheader.h"
+#include "xext.h"
+#else /* XJUTIL */
+#include "xim.h"
+#include "sheader.h"
+#include "ext.h"
+#endif /* XJUTIL */
+
+#define MAX_TEN_LENGTH  94
+
+#define RING(ret)       {ring_bell(); return(ret);}
+#ifdef XJUTIL
+#define MES0_NUM        117
+#define MES1_NUM        115
+#define MES2_NUM        116
+#define MES3_NUM        8
+#define SEL_RET         (xjutil->sel_ret)
+#else /* XJUTIL */
+#define MES0_NUM        26
+#define MES1_NUM        24
+#define MES2_NUM        25
+#define MES3_NUM        19
+#define SEL_RET         (xim->sel_ret)
+#endif /* XJUTIL */
+
+static int
+get_ichiran (ku, in, multi, cs, lang)
+     int ku;
+     int in;
+     int multi, cs;
+     char *lang;
+{
+  static char buf[1024];
+  static char *buf_ptr[MAX_TEN_LENGTH];
+  static int i;
+  static char *c;
+  static char kuten_title[32];
+  static int kuten_ichi_step = 0;
+  static w_char code[2];
+
+  if (kuten_ichi_step == 0)
+    {
+      code[1] = (w_char) 0;
+      for (i = 0, c = buf; i < MAX_TEN_LENGTH; i++)
+        {
+          code[0] = (((ku + 32) << 8) | ((i + 1) + 32)) & 0x7f7f;
+          code[0] |= get_cs_mask (cs);
+          buf_ptr[i] = c;
+          c += sStrcpy (c, code) + 1;
+        }
+      if (multi > 1)
+        {
+          sprintf (kuten_title, "%s %d.%2d %s", msg_get (cd, MES1_NUM, default_message[MES1_NUM], lang), cs, ku, msg_get (cd, MES0_NUM, default_message[MES0_NUM], lang));
+        }
+      else
+        {
+          sprintf (kuten_title, "%s %2d %s", msg_get (cd, MES1_NUM, default_message[MES1_NUM], lang), ku, msg_get (cd, MES0_NUM, default_message[MES0_NUM], lang));
+        }
+      kuten_ichi_step++;
+    }
+  if ((i = xw_select_one_element (buf_ptr, MAX_TEN_LENGTH, 0, kuten_title, KUTEN_IN, main_table[4], in)) == -1)
+    {
+      kuten_ichi_step = 0;
+      return (-1);
+    }
+  else if (i == BUFFER_IN_CONT)
+    {
+      return (BUFFER_IN_CONT);
+    }
+  kuten_ichi_step = 0;
+  code[0] = ((((ku + 32) << 8) | ((i + 1) + 32)) & 0x7f7f) | get_cs_mask (cs);
+  return ((int) code[0]);
+}
+
+int
+in_kuten (in)                   /*  returns code for a moji  */
+     int in;
+{
+  static char buffer[7];
+  static int code;
+  static int c_p = 0;
+  static int ret1, ret2;
+  static int mode = -1, mode1 = -1;
+#ifndef XJUTIL
+  static WnnClientRec *c_c_sv = 0;
+#endif /* !XJUTIL */
+  static int kuten_step = 0;
+  static char *lang;
+  static int cs = 0, valid_cs[3], multi, os = 0;
+  register int i, k;
+  register char t_c, *start_p;
+  unsigned char c;
+
+#ifndef XJUTIL
+  if (in == -99)
+    {
+      end_ichiran ();
+      code = -1;
+      goto LAST;
+    }
+  if (c_c_sv != 0 && c_c != c_c_sv)
+    {
+      RING (-1);
+    }
+#endif /* !XJUTIL */
+  if (kuten_step == 0)
+    {
+#ifdef XJUTIL
+      set_cswidth (xjutil->cswidth_id);
+      lang = xjutil->lang;
+#else /* XJUTIL */
+      set_cswidth (cur_lang->cswidth_id);
+      lang = cur_lang->lang;
+      c_c_sv = c_c;
+#endif /* !XJUTIL */
+      for (multi = 0, i = 0; i < 3; i++)
+        {
+          multi += valid_cs[i] = (get_cswidth (i) == 2) ? 1 : 0;
+          if (valid_cs[i])
+            cs = i;
+        }
+      if (multi <= 0)
+        {
+          RING (-1);
+        }
+      if (multi > 1)
+        {
+          os = 2;
+        }
+      else
+        {
+          os = 0;
+        }
+      for (k = 0; k < os + 5; buffer[k++] = ' ');
+      buffer[os + 5] = '\0';
+      c_p = 0;
+      mode = mode1 = -1;
+      kuten_step++;
+    }
+
+start:
+  if (kuten_step == 1)
+    {
+      if (init_ichiran ((unsigned char **) NULL, 0, -1,
+                        (unsigned char *) msg_get (cd, MES1_NUM, default_message[MES1_NUM], lang),
+                        (unsigned char *) msg_get (cd, MES2_NUM, default_message[MES2_NUM], lang),
+                        (unsigned char *) msg_get (cd, MES3_NUM, default_message[MES3_NUM], lang), NULL, os + 5, NYUURYOKU) == -1)
+        {
+#ifndef XJUTIL
+          c_c_sv = 0;
+#endif /* !XJUTIL */
+          RING (-1);
+        }
+      draw_nyuu_w ((unsigned char *) buffer, 1);
+      kuten_step++;
+      return (BUFFER_IN_CONT);
+    }
+  if (kuten_step == 2)
+    {
+      c = (unsigned char) (in & 0xff);
+#ifdef XJUTIL
+      if (!cur_root->ichi->map)
+        return (BUFFER_IN_CONT);
+#else /* XJUTIL */
+      if (!xim->cur_j_c_root->ichi->map)
+        return (BUFFER_IN_CONT);
+#endif /* XJUTIL */
+      if (SEL_RET == -2)
+        {
+          end_ichiran ();
+          SEL_RET = -1;
+          code = -1;
+          goto LAST;
+        }
+      if ((c == ESC) || (t_quit == main_table[5][c]))
+        {
+          end_ichiran ();
+          code = -1;
+          goto LAST;
+#ifndef XJUTIL
+        }
+      else if (henkan_off == main_table[5][c])
+        {
+          RING (BUFFER_IN_CONT);
+#endif /* !XJUTIL */
+        }
+      if ((c <= '9' && c >= '0') || c == '.')
+        {
+          if (os > 0)
+            {
+              if (mode >= 0)
+                {
+                  if (mode1 >= 0)
+                    {
+                      if ((c_p - mode1) <= 2 && c != '.')
+                        {
+                          buffer[c_p++] = (char) c;
+                          goto RET;
+                        }
+                    }
+                  else
+                    {
+                      t_c = buffer[0];
+                      if ((c_p - mode) <= 4 && c != '.')
+                        {
+                          buffer[c_p++] = c;
+                          goto RET;
+                        }
+                      else if (mode == 1 && t_c >= '0' && t_c <= '2' && valid_cs[t_c - '0'] && (c_p - mode) <= 3 && (c_p - mode) >= 2 && c == '.')
+                        {
+                          mode1 = c_p;
+                          buffer[c_p++] = c;
+                          goto RET;
+                        }
+                    }
+                  RING (BUFFER_IN_CONT);
+                }
+              else
+                {
+                  if (c == '.')
+                    {
+                      if (c_p > 0 && c_p <= 2)
+                        {
+                          mode = c_p;
+                          buffer[c_p++] = c;
+                          goto RET;
+                        }
+                    }
+                  else
+                    {
+                      if (c_p < 4)
+                        {
+                          buffer[c_p++] = c;
+                          goto RET;
+                        }
+                    }
+                  RING (BUFFER_IN_CONT);
+                }
+            }
+          else
+            {
+              if (c == '.')
+                {
+                  if ((mode == -1) && 0 < c_p && c_p <= 2)
+                    {
+                      mode = c_p;
+                      buffer[c_p++] = c;
+                      goto RET;
+                    }
+                }
+              else
+                {
+                  if ((mode >= 0 ? (c_p - mode) <= 2 : c_p < 4))
+                    {
+                      buffer[c_p++] = c;
+                      goto RET;
+                    }
+                }
+              RING (BUFFER_IN_CONT);
+            }
+        }
+      else if (c == rubout_code && c_p)
+        {
+          if (os > 0)
+            {
+              if (mode1 >= 0 && buffer[c_p - 1] == '.')
+                {
+                  mode1 = -1;
+                }
+              else if (mode >= 0 && buffer[c_p - 1] == '.')
+                {
+                  mode = -1;
+                }
+            }
+          else
+            {
+              if (buffer[c_p - 1] == '.')
+                mode = -1;
+            }
+          buffer[--c_p] = ' ';
+        }
+      else if (c == rubout_code && c_p == 0)
+        {
+          end_ichiran ();
+          code = -1;
+          goto LAST;
+        }
+      else if ((c == NEWLINE) || (c == CR))
+        {
+          if (os > 0)
+            {
+              if ((mode1 >= 0 && (buffer[c_p - 1] != '.')) || (mode1 == -1 && mode >= 0 && (c_p - mode) >= 2) || (mode == -1 && c_p >= 3))
+                {
+                  if (mode1 >= 0 || (mode == 1 && (c_p - mode) >= 4))
+                    {
+                      cs = buffer[0] - '0';
+                      if (valid_cs[cs] == 0)
+                        RING (BUFFER_IN_CONT);
+                      start_p = &buffer[os];
+                    }
+                  else
+                    {
+                      cs = 0;
+                      start_p = buffer;
+                    }
+                  if ((!(sscanf (start_p, "%d.%d", &ret1, &ret2) == 2) &&
+                       !(((mode == -1) ? (c_p == 4) : (c_p == os + 4)) &&
+                         sscanf (start_p, "%2d%2d", &ret1, &ret2) == 2) &&
+                       !(((mode == -1) ? (c_p == 3) : (c_p == os + 3)) && sscanf (start_p, "%1d%2d", &ret1, &ret2) == 2)) || ret1 <= 0 || ret1 > 94 || ret2 <= 0 || ret2 > 94)
+                    {
+                      RING (BUFFER_IN_CONT);
+                    }
+                  code = (((ret1 + 32) << 8) | (ret2 + 32)) & 0x7f7f;
+                  code |= get_cs_mask (cs);
+                  end_ichiran ();
+                  goto LAST;
+                }
+              else
+                {
+                  if (mode1 >= 0 && (buffer[c_p - 1] == '.'))
+                    {
+                      if (sscanf (&buffer[os], "%d.", &ret1) != 1 || (ret1 <= 0 || ret1 > 94))
+                        {
+                          RING (BUFFER_IN_CONT);
+                        }
+                    }
+                  else if (mode == -1 && (c_p == 1 || c_p == 2))
+                    {
+                      if (sscanf (&buffer[0], "%d", &ret1) != 1 || (ret1 <= 0 || ret1 > 94))
+                        {
+                          RING (BUFFER_IN_CONT);
+                        }
+                    }
+                  else
+                    {
+                      RING (BUFFER_IN_CONT);
+                    }
+                  end_ichiran ();
+                  kuten_step++;
+                  goto NEXT;
+                }
+              RING (BUFFER_IN_CONT);
+            }
+          else
+            {
+              if (c_p >= 3 && (buffer[c_p - 1] != '.'))
+                {
+                  start_p = buffer;
+                  if ((!(sscanf (start_p, "%d.%d", &ret1, &ret2) == 2) &&
+                       !((c_p == 4) &&
+                         sscanf (start_p, "%2d%2d", &ret1, &ret2) == 2) && !((c_p == 3) && sscanf (start_p, "%1d%2d", &ret1, &ret2) == 2)) || ret1 <= 0 || ret1 > 94 || ret2 <= 0 || ret2 > 94)
+                    {
+                      RING (BUFFER_IN_CONT);
+                    }
+                  code = (((ret1 + 32) << 8) | (ret2 + 32)) & 0x7f7f;
+                  code |= get_cs_mask (cs);
+                  end_ichiran ();
+                  goto LAST;
+                }
+              else if (c_p <= 2 && mode == -1)
+                {
+                  if (sscanf (buffer, "%d", &ret1) != 1 || (ret1 <= 0 || ret1 > 94))
+                    {
+                      RING (BUFFER_IN_CONT);
+                    }
+                  end_ichiran ();
+                  kuten_step++;
+                  goto NEXT;
+                }
+              RING (BUFFER_IN_CONT);
+            }
+        }
+    RET:
+      draw_nyuu_w ((unsigned char *) buffer, 1);
+      return (BUFFER_IN_CONT);
+    }
+NEXT:
+  if (kuten_step == 3)
+    {
+      if (os > 0)
+        {
+          if (mode1 >= 0)
+            {
+              cs = buffer[0] - '0';
+            }
+          else
+            {
+              cs = 0;
+            }
+        }
+      if ((code = get_ichiran (ret1, in, multi, cs, lang)) == -1)
+        {
+          kuten_step = 0;
+          goto start;
+        }
+      else if (code == BUFFER_IN_CONT)
+        {
+          return (BUFFER_IN_CONT);
+        }
+    }
+LAST:
+#ifndef XJUTIL
+  c_c_sv = 0;
+#endif /* !XJUTIL */
+  kuten_step = 0;
+  return (code);
+}
+
+#undef RING
+
+/*
+  Local Variables:
+  eval: (setq kanji-flag t)
+  eval: (setq kanji-fileio-code 0)
+  eval: (mode-line-kanji-code-update)
+  End:
+*/