diff Wnn/uum/wnnrc_op.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/Wnn/uum/wnnrc_op.c	Thu Dec 13 04:30:14 2007 +0900
@@ -0,0 +1,803 @@
+/*
+ *  $Id: wnnrc_op.c,v 1.10 2002/06/22 13:26:21 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, 2002
+ *
+ * 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
+ */
+
+/* uumrc operations */
+#ifdef HAVE_CONFIG_H
+#  include <config.h>
+#endif
+
+#include <stdio.h>
+#include <ctype.h>
+#include <errno.h>
+#if STDC_HEADERS
+#  include <stdlib.h>
+#  include <string.h>
+#else
+#  if HAVE_MALLOC_H
+#    include <malloc.h>
+#  endif
+#  if HAVE_STRINGS_H
+#    include <strings.h>
+#  endif
+#endif /* STDC_HEADERS */
+#include <pwd.h>
+
+#include "jllib.h"
+#include "commonhd.h"
+#include "wnn_config.h"
+#include "buffer.h"
+#include "rk_spclval.h"
+#include "sdefine.h"
+#include "sheader.h"
+#include "wnn_os.h"
+
+extern int conv_keyin ();
+extern int keyin2 ();
+
+
+void
+getfname (file, path)
+     char *path, *file;
+{
+  char *c;
+
+  c = path + strlen (path);
+  for (; *c != '/' && c >= path; c--);
+  strcpy (file, c + 1);
+}
+
+
+
+ /**    s1とs2がマッチしたら非0を返す。s1にはワイルドカード '*' を
+        含んでよい(s2にはだめ)。*/
+int
+strmatch (s1, s2)
+     char *s1, *s2;
+{
+  while (1)
+    {
+      if (*s1 == '\0')
+        return (*s2 == '\0');
+      if (*s1 != '*')
+        {
+          if (*s1 != *s2)
+            return (0);
+          s1++;
+          s2++;
+          continue;
+        }
+
+      s1++;
+      do
+        {
+          if (strmatch (s1, s2))
+            return (1);
+        }
+      while (*s2++ != '\0');
+      return (0);
+    }
+}
+
+ /**    KEYBOARDという環境変数が設定されていればそれが、又、いなければTERMが
+        返る */
+char *
+get_kbd_env ()
+{
+  char *term;
+
+  return (NULL != (term = getenv (WNN_KEYBOARD_ENV)) ? term : getenv ("TERM"));
+}
+
+ /**    KEYBOARDという環境変数が設定されていればそれが、又、いなければTERMが、
+        引き数とマッチするかどうかの検査(マッチしたら非0が返る)。convert_key
+        の初期設定に使う。*/
+int
+lookWnnterm (s)
+     char *s;
+{
+  char *term;
+
+  return (NULL == (term = get_kbd_env ())? 0 : strmatch (s, term));
+}
+
+int
+expand_expr (s)
+ /**    ~user、@HOME、@LIBDIRの展開(但し、文字列の先頭のみ)。できない時は-1が
+        返り、その場合sの中身は着々とそのまんま。sの長さ<256と仮定してる。*/
+ /**    @USR (env名、logname), @LANG の展開 */
+     char *s;
+{
+  char tmp[EXPAND_PATH_LENGTH];
+  register char *p, *s1;
+  int noerr, expandsuc;
+  struct passwd *u;
+  extern struct passwd *getpwnam ();
+
+  if (*s != '~' && *s != '@')
+    {
+      strcpy (tmp, s);
+      *s = '\0';
+      noerr = 1;
+    }
+  else
+    {
+      if ((int) strlen (s) >= EXPAND_PATH_LENGTH)
+        return (-1);
+
+      s1 = s;
+      if (NULL != (p = strchr (++s1, '/')))
+        {
+          strcpy (tmp, p);
+          *p = '\0';
+        }
+      else
+        *tmp = '\0';
+      /* ここまでは準備。s…先頭、s1…2文字目、p…最初の'/'のあったところ
+         (ここで一旦切る)、tmp…それ以後のコピー。 */
+
+      if (*s == '~')
+        {
+          if (*s1)
+            {
+              noerr = expandsuc = (NULL != (u = getpwnam (s1)) && (int) (strlen (p = u->pw_dir) + strlen (tmp)) < EXPAND_PATH_LENGTH);
+
+            }
+          else
+            {
+              noerr = expandsuc = (NULL != (p = getenv ("HOME")) && (int) (strlen (p) + strlen (tmp)) < EXPAND_PATH_LENGTH);
+            }
+
+        }
+      else
+        {                       /* then, *s must be '@' */
+          if (!strcmp (s1, "HOME"))
+            {
+              noerr = expandsuc = (NULL != (p = getenv ("HOME")) && (int) (strlen (p) + strlen (tmp)) < EXPAND_PATH_LENGTH);
+            }
+          else if (!strcmp (s1, "LIBDIR"))
+            {
+              noerr = expandsuc = ((int) (strlen (p = LIBDIR) + strlen (tmp)) < EXPAND_PATH_LENGTH);
+            }
+          else
+            {                   /* @HOME, @LIBDIR igai ha kaenai */
+              noerr = 1;
+              expandsuc = 0;
+            }
+        }
+      if (expandsuc)
+        strcpy (s, p);
+    }
+
+  if (noerr)
+    {
+      int len = strlen ("@USR");
+      int len1 = strlen ("@LANG");
+      p = tmp;
+      for (; *p; p++)
+        {
+          if (!strncmp (p, "@USR", len))
+            {
+              if ((int) (strlen (username) + strlen (p) + strlen (s) - len) < EXPAND_PATH_LENGTH)
+                {
+                  strcat (s, username);
+                  p += len - 1;
+                }
+              else
+                {
+                  return (-1);
+                }
+            }
+          else if (!strncmp (p, "@LANG", len1))
+            {
+              if ((int) (strlen (lang_dir) + strlen (p) + strlen (s) - len1) < EXPAND_PATH_LENGTH)
+                {
+                  strcat (s, lang_dir);
+                  p += len1 - 1;
+                }
+              else
+                {
+                  return (-1);
+                }
+            }
+          else
+            {
+              strncat (s, p, 1);
+            }
+        }
+    }
+  return (noerr ? 0 : -1);
+}
+
+
+
+/** uumrc を見てのパラメータの設定 */
+int
+uumrc_set_entry (data, dn)
+     char *data;
+     int *dn;
+{
+  int num, d1;
+  char code[256];
+  char s[7][EXPAND_PATH_LENGTH];
+  char tmp[1024];
+  FILE *fp;
+  char *s0or1;
+
+  num = sscanf (data, "%s %s %s %s %s %s %s %s", code, s[0], s[1], s[2], s[3], s[4], s[5], s[6]);
+  if (num <= 0)
+    {
+      return (-1);
+    }
+
+  if (code[0] == ';')
+    {
+      return (0);
+    }
+  else if (strcmp (code, "include") == 0)
+    {
+      if (expand_expr (s[0]) != 0)
+        {
+          fprintf (stderr, "Can't expand %s.\r\n", s[0]);
+        }
+      if ((fp = fopen (s[0], "r")) != NULL)
+        {
+          while (fgets (tmp, 1024, fp) != NULL)
+            {
+              uumrc_set_entry (tmp, dn);
+            }
+          fclose (fp);
+        }
+      else
+        {
+          fprintf (stderr, "Can't open %s.\r\n", s[0]);
+        }
+    }
+  else if (strcmp (code, "setuumkey") == 0)
+    {
+      /* setuumkey --- this must be a file. */
+      if (!uumkey_defined_by_option && (num > 1))
+        {
+          if (expand_expr (s[0]) != 0)
+            {
+              fprintf (stderr, "Can't expand %s.\r\n", s[0]);
+            }
+          strncpy (uumkey_name_in_uumrc, s[0], PATHNAMELEN);
+        }
+    }
+  else if (strcmp (code, "setconvenv") == 0)
+    {
+      if (num > 1)
+        {
+          get_new_env (0);
+          /* setconvenv */
+          if (num > 2)
+            {
+              if (!(strcmp (s[num - 2], "sticky")))
+                {
+                  normal_sticky = 1;
+                  num--;
+                }
+            }
+          if (num == 2)
+            s0or1 = s[0];
+          else
+            {
+              s0or1 = s[1];
+              if (def_servername && *def_servername)
+                {
+                  servername = (char *) malloc (strlen (def_servername) + 1);
+                  strcpy (servername, def_servername);
+                }
+              else
+                {
+                  servername = (char *) malloc (strlen (s[0]) + 1);
+                  strcpy (servername, s[0]);
+                }
+            }
+          if (expand_expr (s0or1) != 0)
+            {
+              fprintf (stderr, "Can't expand %s.\r\n", s0or1);
+            }
+          envrcname = (char *) malloc (strlen (s0or1) + 1);
+          strcpy (envrcname, s0or1);
+        }
+    }
+  else if (strcmp (code, "setkankanaenv") == 0)
+    {
+      if (num > 1)
+        {
+          get_new_env (1);
+          /* setkankanaenv */
+          if (num > 2)
+            {
+              if (!(strcmp (s[num - 2], "sticky")))
+                {
+                  reverse_sticky = 1;
+                  num--;
+                }
+            }
+          if (num == 2)
+            s0or1 = s[0];
+          else
+            {
+              s0or1 = s[1];
+              if (def_reverse_servername && *def_reverse_servername)
+                {
+                  reverse_servername = (char *) malloc (strlen (def_reverse_servername) + 1);
+                  strcpy (reverse_servername, def_reverse_servername);
+                }
+              else
+                {
+                  reverse_servername = (char *) malloc (strlen (s[0]) + 1);
+                  strcpy (reverse_servername, s[0]);
+                }
+            }
+          if (expand_expr (s0or1) != 0)
+            {
+              fprintf (stderr, "Can't expand %s.\r\n", s0or1);
+            }
+          reverse_envrcname = (char *) malloc (strlen (s0or1) + 1);
+          strcpy (reverse_envrcname, s0or1);
+        }
+    }
+  else if (strcmp (code, "setenv") == 0)
+    {
+      if (num > 2)
+        {
+          get_new_env (0);
+          if (!(strcmp (s[num - 2], "sticky")))
+            {
+              normal_sticky = 1;
+              num--;
+            }
+          if (num == 3)
+            s0or1 = s[1];
+          else
+            {
+              s0or1 = s[2];
+              if (def_servername && *def_servername)
+                {
+                  servername = (char *) malloc (strlen (def_servername) + 1);
+                  strcpy (servername, def_servername);
+                }
+              else
+                {
+                  servername = (char *) malloc (strlen (s[1]) + 1);
+                  strcpy (servername, s[1]);
+                }
+            }
+          if (expand_expr (s0or1) != 0)
+            {
+              fprintf (stderr, "Can't expand %s.\r\n", s0or1);
+            }
+          envrcname = (char *) malloc (strlen (s0or1) + 1);
+          strcpy (envrcname, s0or1);
+          strcpy (env_name_s, s[0]);
+        }
+    }
+  else if (strcmp (code, "setenv_R") == 0)
+    {
+      if (num > 2)
+        {
+          get_new_env (1);
+          if (!(strcmp (s[num - 2], "sticky")))
+            {
+              reverse_sticky = 1;
+              num--;
+            }
+          if (num == 3)
+            s0or1 = s[1];
+          else
+            {
+              s0or1 = s[2];
+              if (def_reverse_servername && *def_reverse_servername)
+                {
+                  reverse_servername = (char *) malloc (strlen (def_reverse_servername) + 1);
+                  strcpy (reverse_servername, def_reverse_servername);
+                }
+              else
+                {
+                  reverse_servername = (char *) malloc (strlen (s[1]) + 1);
+                  strcpy (reverse_servername, s[1]);
+                }
+            }
+          if (expand_expr (s0or1) != 0)
+            {
+              fprintf (stderr, "Can't expand %s.\r\n", s0or1);
+            }
+          reverse_envrcname = (char *) malloc (strlen (s0or1) + 1);
+          strcpy (reverse_envrcname, s0or1);
+          strcpy (reverse_env_name_s, s[0]);
+        }
+    }
+  else if (strcmp (code, "setrkfile") == 0)
+    {
+      /* setrkfile */
+      if (!rkfile_defined_by_option && (num > 1))
+        {
+          if (expand_expr (s[0]) != 0)
+            {
+              fprintf (stderr, "Can't expand %s.\r\n", s[0]);
+            }
+          strncpy (rkfile_name_in_uumrc, s[0], PATHNAMELEN);
+        }
+    }
+  else if (strcmp (code, "setconvkey") == 0)
+    {
+      /* setconvkey --- pair of TERM name and used table name */
+      if (!convkey_defined_by_option)
+        {
+          if (num == 2)
+            s0or1 = s[0];
+          else if ((num > 2) && lookWnnterm (s[0]))
+            s0or1 = s[1];
+          else
+            goto NOMATCH;
+
+          if (expand_expr (s0or1) != 0)
+            {
+              fprintf (stderr, "Can't expand %s.\r\n", s0or1);
+            }
+          strncpy (convkey_name_in_uumrc, s0or1, PATHNAMELEN);
+        NOMATCH:;
+        }
+    }
+  else if (strcmp (code, "flow_control_on") == 0)
+    {
+      /* setflowctrl */
+      if (!(defined_by_option & OPT_FLOW_CTRL))
+        {
+          flow_control = 1;
+        }
+    }
+  else if (strcmp (code, "flow_control_off") == 0)
+    {
+      /* setflowctrl */
+      if (!(defined_by_option & OPT_FLOW_CTRL))
+        {
+          flow_control = 0;
+        }
+    }
+  else if (strcmp (code, "waking_up_in_henkan_mode") == 0 || strcmp (code, "waking_up_in_convert_mode") == 0)
+    {
+      /* */
+      if (!(defined_by_option & OPT_WAKING_UP_MODE))
+        {
+          henkan_off_flag = 0;
+        }
+    }
+  else if (strcmp (code, "waking_up_no_henkan_mode") == 0 || strcmp (code, "waking_up_no_convert_mode") == 0)
+    {
+      /* */
+      if (!(defined_by_option & OPT_WAKING_UP_MODE))
+        {
+          henkan_off_flag = 1;
+        }
+    }
+  else if (strcmp (code, "convkey_always_on") == 0)
+    {
+      convkey_on = 1;
+    }
+  else if (strcmp (code, "convkey_not_always_on") == 0)
+    {
+      convkey_on = 0;
+    }
+  else if (strcmp (code, "simple_delete") == 0)
+    {
+      excellent_delete = 0;
+    }
+  else if (strcmp (code, "excellent_delete") == 0)
+    {
+      excellent_delete = 1;
+    }
+  else if (strcmp (code, "send_ascii_char") == 0)
+    {
+      /* send ascii char or not */
+      send_ascii_char = 1;
+    }
+  else if (strcmp (code, "not_send_ascii_char") == 0)
+    {
+      send_ascii_char = 0;
+    }
+  else if (strcmp (code, "setmaxchg") == 0)
+    {
+      /* setmaxchg ----- henkan kanou saidai mojisuu */
+      if (change_ascii_to_int (s[0], &d1) != -1)
+        {
+          maxchg = (d1 <= 0) ? maxchg : d1;
+        }
+    }
+  else if (strcmp (code, "setmaxbunsetsu") == 0)
+    {
+      /* setmaxbunsetsu ---- kaiseki kanou saidai bunsetsu kosuu */
+      if (num >= 2)
+        {
+          if (change_ascii_to_int (s[0], &d1) != -1)
+            {
+              maxbunsetsu = (d1 <= 0) ? maxbunsetsu : d1;
+            }
+        }
+    }
+  else if (strcmp (code, "setmaxichirankosu") == 0)
+    {
+      /* setmaxichirankosuu --- jikouho ichiran hyouji kosuu */
+      if (num >= 2)
+        {
+          if (change_ascii_to_int (s[0], &d1) != -1)
+            {
+              max_ichiran_kosu = (d1 <= 0) ? max_ichiran_kosu : d1;
+            }
+        }
+    }
+  else if (strcmp (code, "setmaxhistory") == 0)
+    {
+      /* setmaxhistory --- set depth of history */
+      if (num >= 2)
+        {
+          if (change_ascii_to_int (s[0], &d1) != -1)
+            {
+              max_history = (d1 <= 0) ? max_history : d1 + 1;
+            }
+        }
+    }
+  else if (strcmp (code, "remove_cs") == 0)
+    {
+      remove_cs_from_termcap = 1;
+    }
+  else if (strcmp (code, "not_remove_cs") == 0)
+    {
+      remove_cs_from_termcap = 0;
+    }
+  else if (strcmp (code, "setjishopath") == 0 || strcmp (code, "setdicpath") == 0)
+    {
+      /* setjishopath --- 辞書のあるディレクトリ */
+      if (num >= 2)
+        {
+          if (expand_expr (s[0]) != 0)
+            {
+              fprintf (stderr, "Can't expand %s.\r\n", s[0]);
+            }
+          Sstrcpy (jishopath, s[0]);
+        }
+    }
+  else if (strcmp (code, "sethindopath") == 0 || strcmp (code, "setfreqpath") == 0)
+    {
+      /* sethindopath --- 頻度のあるディレクトリ */
+      if (num >= 2)
+        {
+          if (expand_expr (s[0]) != 0)
+            {
+              fprintf (stderr, "Can't expand %s.\r\n", s[0]);
+            }
+          Sstrcpy (hindopath, s[0]);
+        }
+    }
+  else if ((strcmp (code, "setfuzokugopath") == 0) || (strcmp (code, "setgrammarpath") == 0))
+    {
+      if (num >= 2)
+        {
+          if (expand_expr (s[0]) != 0)
+            {
+              fprintf (stderr, "Can't expand %s.\r\n", s[0]);
+            }
+          Sstrcpy (fuzokugopath, s[0]);
+        }
+/*
+    } else if (strcmp(code, "dai_kugiri_str") == 0){
+        if(num >= 2){
+            char tmp[MAXKUGIRI * 2];
+            read_kanji_str(tmp, s[0]);
+            Sstrcpy(kugiri_str, tmp);
+        }else{
+            kugiri_str[0] = 0;
+        }
+*/
+    }
+  else if (strcmp (code, "touroku_comment") == 0)
+    {
+      touroku_comment = 1;
+    }
+  else if (strcmp (code, "touroku_no_comment") == 0)
+    {
+      touroku_comment = 0;
+    }
+  else
+    {
+/*      printf("Undefined entry \"%s\" in uumrc.\r\n",code); */
+    }
+  return (0);
+}
+
+int
+change_ascii_to_int (st, dp)
+     char *st;
+     int *dp;
+{
+  register int total, flag;
+
+  total = 0;
+  flag = 0;
+  while (*st != NULL)
+    {
+      if (isdigit (*st))
+        {
+          total = total * 10 + (*st - '0');
+        }
+      else if (*st == '+')
+        {
+          if (flag != 0)
+            {
+              return (-1);
+            }
+          flag = 1;
+        }
+      else if (*st == '-')
+        {
+          if (flag != 0)
+            {
+              return (-1);
+            }
+          flag = -1;
+        }
+      else
+        {
+          return (-1);
+        }
+      st++;
+    }
+  if (flag == 0)
+    {
+      flag = 1;
+    }
+  *dp = total * flag;
+  return (1);
+}
+
+
+/* uumrc ファイルからデータを読みその設定を行う。*/
+int
+uumrc_get_entries ()
+{
+  extern FILE *open_uumrc ();
+  FILE *fp;
+  int dn;
+  char data[1024];
+
+  /* default setting */
+
+  maxchg = MAXCHG;
+  maxbunsetsu = MAXBUNSETSU;
+  max_ichiran_kosu = MAX_ICHIRAN_KOSU;
+
+  max_history = MAX_HISTORY + 1;
+
+  if ((fp = open_uumrc ()) == NULL)
+    {
+      return -1;
+    }
+  dn = 0;
+  while (fgets (data, 1024, fp) != NULL)
+    {
+      uumrc_set_entry (data, &dn);
+    }
+  fclose (fp);
+  return (0);
+}
+
+
+/** uumrc ファイルのオープン */
+FILE *
+open_uumrc ()
+{
+  FILE *fp;
+  char *n, buf[1024];
+
+  if (n = getenv (WNN_UUM_ENV))
+    {
+      if (fp = fopen (n, "r"))
+        {
+          if (verbose_option)
+            fprintf (stderr, "uumrc: using uumrc %s\r\n", n);
+          return fp;
+        }
+      else
+        {
+          goto error;
+        }
+    }
+  if (n = getenv ("HOME"))
+    {
+      strcat (strcpy (buf, n), USR_UUMRC);
+      if (fp = fopen (buf, "r"))
+        {
+          if (verbose_option)
+            fprintf (stderr, "uumrc: using uumrc %s\r\n", buf);
+          return fp;
+        }
+    }
+  strcpy (buf, LIBDIR);
+  strcat (buf, "/");
+  strcat (buf, lang_dir);
+  strcat (buf, RCFILE);
+  if ((fp = fopen (buf, "r")) != NULL)
+    {
+      if (verbose_option)
+        fprintf (stderr, "uumrc: using uumrc %s\r\n", buf);
+      return fp;
+    }
+error:
+  fprintf (stderr, MSG_GET (14));
+/*
+    fprintf(stderr , "uumrc ファイルがありません。");
+*/
+  fflush (stderr);
+  return (0);
+}
+
+
+#ifdef  nodef
+read_kanji_str (c, o)
+     register char *c, *o;
+{
+  for (; *o; c++)
+    {
+      if (*o == '\\')
+        {
+          if (*++o == '0')
+            {
+              o += 1;
+              if (*o >= '0' && *o <= '7')
+                {
+                  *c = (*o++ - '0');
+                }
+              else
+                continue;
+              if (*o >= '0' && *o <= '7')
+                {
+                  *c *= 8;
+                  *c |= (*o++ - '0');
+                }
+              else
+                continue;
+            }
+          else
+            {
+              *c = *o++;
+            }
+        }
+      else
+        {
+          *c = *o++;
+        }
+    }
+  *c = 0;
+}
+#endif