diff Wnn/uum/prologue.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/prologue.c	Thu Dec 13 04:30:14 2007 +0900
@@ -0,0 +1,387 @@
+/*
+ *  $Id: prologue.c,v 1.6 2002/05/12 22:51:17 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
+ */
+
+/* Standard Interface
+ *    Initialize Routine
+ */
+#ifdef HAVE_CONFIG_H
+#  include <config.h>
+#endif
+
+#include <stdio.h>
+#include <ctype.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 <sys/errno.h>
+#include <pwd.h>
+#ifdef HAVE_UNISTD_H
+#  include <unistd.h>
+#endif
+#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"
+
+
+/** romkan のイニシャライズ */
+int
+open_romkan ()
+{
+  char name[PATHNAMELEN];
+  int rk_option_flg;
+
+  romkan_set_lang (lang_dir);
+  if (*rkfile_name_in_uumrc != '\0')
+    {
+      strcpy (name, rkfile_name_in_uumrc);
+    }
+  else
+    {
+      strcpy (name, LIBDIR);
+      strcat (name, RKFILE);
+    }
+  rk_option_flg = RK_REDRAW | RK_CHMOUT | (excellent_delete ? 0 : RK_SIMPLD) | (verbose_option ? RK_VERBOS : 0);
+
+  return (romkan_init5 (name, rubout_code, NULL, NULL, rk_option_flg) == 0 ? 0 : -1);
+  /* romaji-kana henkan junbi */
+}
+
+
+/** 漢字かな変換用 envrc ファイルのオープン */
+int
+get_envrc_name_reverse (str)
+     char *str;
+{
+  if (cur_reverse_env == NULL || *reverse_envrcname == 0)
+    return (0);
+  strcpy (str, reverse_envrcname);
+  if (access (str, R_OK) == -1)
+    {
+      return (-1);
+    }
+  return (1);
+}
+
+
+/** envrc ファイルのオープン */
+int
+get_envrc_name (str)
+     char *str;
+{
+  if (cur_normal_env == NULL || envrcname[0] == '\0')
+    {
+      strcpy (str, LIBDIR);
+      strcat (str, "/");
+      strcat (str, lang_dir);
+      strcat (str, ENVRCFILE);
+    }
+  else
+    {
+      strcpy (str, envrcname);
+    }
+  return (1);
+}
+
+/* uum で必要なエリアをアロケートする。*/
+int
+allocate_areas ()
+{
+  char *area_start;
+  char *area_pter;
+
+  int k;
+  int total_size;
+  int len1 = maxchg * sizeof (w_char);
+  int return_buf_len = len1 * 7;
+
+  total_size = return_buf_len + len1 * 3 + maxbunsetsu * sizeof (int) * 3 + maxbunsetsu * sizeof (struct wnn_env *);
+
+  if ((area_start = malloc (total_size)) == NULL)
+    {
+      /*
+         fprintf(stderr,"初期化でmalloc不能。\n");
+       */
+      fprintf (stderr, MSG_GET (2));
+      return (-1);
+    }
+
+  area_pter = area_start;
+  return_buf = (w_char *) area_pter;    /* mojiretsu -> return_buf */
+  area_pter += return_buf_len;
+  input_buffer = (w_char *) area_pter;
+  area_pter += len1;
+  kill_buffer = (w_char *) area_pter;
+  area_pter += len1;
+  remember_buf = (w_char *) area_pter;
+  *remember_buf = 0;
+  area_pter += len1;
+  bunsetsu = (int *) area_pter;
+  area_pter += maxbunsetsu * sizeof (int);
+  bunsetsuend = (int *) area_pter;
+  area_pter += maxbunsetsu * sizeof (int);
+  bunsetsu_env = (struct wnn_env **) area_pter;
+  area_pter += maxbunsetsu * sizeof (int);
+  touroku_bnst = (int *) area_pter;
+  area_pter += maxbunsetsu * sizeof (int);
+  for (k = 0; k < maxbunsetsu; k++)
+    {
+      bunsetsu[k] = 0;
+      bunsetsuend[k] = 0;
+      touroku_bnst[k] = 0;
+    }
+
+  return (0);
+}
+
+
+/* henkan initialize */
+/** uum のイニシャライズ */
+int
+init_uum ()
+{
+  char *p;
+
+  uumrc_get_entries ();
+
+  if (*(p = convkey_name_in_uumrc) == '\0')
+    p = NULL;
+  if (convert_key_setup (p, (verbose_option != 0)) == -1)
+    return (-1);
+
+  if (init_key_table () == -1)
+    {
+      return (-1);
+    }
+
+  if (open_romkan () == -1)
+    {
+      return (-1);
+    }
+
+  if (allocate_areas () == -1)
+    {
+      return (-1);
+    }
+
+  if (init_history () == -1)
+    {
+      return (-1);
+    }
+
+  connect_jserver (0);
+
+  throw_cur_raw (0, crow + conv_lines);
+  if (keypad_fun)
+    set_keypad_on ();
+  scroll_up ();
+  set_scroll_region (0, crow - 1);
+  throw_cur_raw (0, crow - 1);
+  flush ();
+
+  return (0);
+}
+
+static void
+puts1 (s)
+     char *s;
+{
+  printf ("%s\n", s);
+  flush ();
+}
+
+static void
+puts2 (s)
+     char *s;
+{
+  throw_c (0);
+  clr_line ();
+  printf ("%s", s);
+  flush ();
+}
+
+static int
+yes_or_no_init (s)
+     char *s;
+{
+  for (;;)
+    {
+      char x[256];
+      printf (s);
+      flush ();
+      if (fgets (x, 256, stdin) == NULL)
+        {
+          return (0);
+        }
+      if (*x == 'n' || *x == 'N')
+        return (0);
+      if (*x == 'y' || *x == 'Y')
+        return (1);
+    }
+}
+
+/** Connecting to jserver */
+int
+connect_jserver (first)
+     int first;
+{
+  char uumrc_name[PATHNAMELEN];
+  char environment[PATHNAMELEN];
+  WnnEnv *p;
+  WnnEnv *save_cur_normal_env = NULL, *save_cur_reverse_env = NULL;
+  int (*yes_no_func) ();
+  void (*puts_func) ();
+
+  if (first == 0)
+    {
+      bun_data_ = NULL;
+      yes_no_func = yes_or_no_init;
+      puts_func = puts1;
+    }
+  else
+    {
+      yes_no_func = yes_or_no;
+      puts_func = puts2;
+    }
+  get_envrc_name (uumrc_name);  /* use username for env-name */
+
+  if (cur_normal_env)
+    save_cur_normal_env = cur_normal_env;
+  for (p = normal_env; p; p = p->next)
+    {
+      cur_normal_env = p;
+      get_envrc_name (uumrc_name);
+      strcpy (environment, username);
+      strcat (environment, p->env_name_str);
+      if (servername == NULL && def_servername && *def_servername)
+        {
+          servername = malloc (strlen (def_servername) + 1);
+          strcpy (servername, def_servername);
+        }
+      if (bun_data_ == NULL)
+        {
+          bun_data_ = jl_open_lang (environment, servername, lang_dir, uumrc_name, yes_no_func, puts_func, WNN_TIMEOUT);
+          if (bun_data_ != NULL && bun_data_->env != NULL)
+            {
+              env_normal = bun_data_->env;
+            }
+        }
+      else if (env_normal == 0 || jl_isconnect_e (env_normal) == 0)
+        {
+          env_normal = jl_connect_lang (environment, servername, lang_dir, uumrc_name, yes_no_func, puts_func, WNN_TIMEOUT);
+        }
+      if (env_normal)
+        {
+          if (normal_sticky)
+            jl_env_sticky_e (env_normal);
+          else
+            jl_env_un_sticky_e (env_normal);
+        }
+    }
+  if (save_cur_normal_env)
+    {
+      cur_normal_env = save_cur_normal_env;
+      if (env_normal)
+        jl_env_set (bun_data_, env_normal);
+    }
+  if (normal_env == NULL)
+    {
+      get_new_env (0);
+      cur_normal_env = normal_env;
+      uumrc_name[0] = '\0';
+      bun_data_ = jl_open_lang (username, servername, lang_dir, uumrc_name, yes_no_func, puts_func, WNN_TIMEOUT);
+    }
+
+  if (cur_reverse_env)
+    save_cur_reverse_env = cur_reverse_env;
+  for (p = reverse_env; p; p = p->next)
+    {
+      cur_reverse_env = p;
+      if (get_envrc_name_reverse (uumrc_name) > 0)
+        {
+          strcpy (environment, username);
+          strcat (environment, p->env_name_str);
+          strcat (environment, "R");
+          if (reverse_servername == NULL && def_reverse_servername && *def_reverse_servername)
+            {
+              reverse_servername = malloc (strlen (def_reverse_servername) + 1);
+              strcpy (reverse_servername, def_reverse_servername);
+            }
+          env_reverse = jl_connect_lang (environment, reverse_servername, lang_dir, uumrc_name, yes_no_func, puts_func, WNN_TIMEOUT);
+          if (env_reverse)
+            {
+              if (reverse_sticky)
+                jl_env_sticky_e (env_reverse);
+              if (!reverse_sticky)
+                jl_env_un_sticky_e (env_reverse);
+            }
+        }
+    }
+  if (save_cur_reverse_env)
+    cur_reverse_env = save_cur_reverse_env;
+  return (0);
+}
+
+
+/** 立ち上がり時にメッセージファイルが存在すればそれを表示する。*/
+int
+initial_message_out ()
+{
+  FILE *fp;
+  char data[1024];
+  char fname[PATHNAMELEN];
+
+  strcpy (fname, LIBDIR);
+  strcat (fname, MESSAGEFILE);
+
+  if ((fp = fopen (fname, "r")) != NULL)
+    {
+      while (fgets (data, 1024, fp) != NULL)
+        {
+          fprintf (stderr, "\r%s", data);
+        }
+      fclose (fp);
+      fprintf (stderr, "\r\n");
+    }
+  return (1);
+}