diff src/mule-wnnfns.c @ 70:131b0175ea99 r20-0b30

Import from CVS: tag r20-0b30
author cvs
date Mon, 13 Aug 2007 09:02:59 +0200
parents
children 1ce6082ce73f
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/mule-wnnfns.c	Mon Aug 13 09:02:59 2007 +0200
@@ -0,0 +1,2041 @@
+/*
+   Copyright (C) 1995 Free Software Foundation, Inc.
+   Copyright (C) 1995 Sun Microsystems, Inc.
+
+This file is part of XEmacs.
+
+XEmacs 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.
+
+XEmacs 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 XEmacs; see the file COPYING.  If not, write to
+the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA.  */
+
+/* Synched up with: Mule 2.3.  Not in FSF. */
+
+/*      Jserver Interface for Mule
+        Coded by Yutaka Ishikawa at ETL (yisikawa@etl.go.jp)
+                 Satoru Tomura   at ETL (tomura@etl.go.jp)
+	Modified for Wnn4 library by
+		 Toshiaki Shingu (shingu@cpr.canon.co.jp)
+		 Hiroshi Kuribayashi (kuri@nff.ncl.omron.co.jp) */
+
+/*
+ *	Functions defined in this file are
+ *	   (wnn-server-open wnn-host-name login-name)
+ *		wnn-host-name: STRING or NIL
+ *		login-name: STRING
+ *		RETURNS: BOOLEAN
+ *		DESCRIPTION:
+ *		jserver $B$H@\B3$7!"%5!<%P!<FbIt$K@5JQ49!?5UJQ49#2$D$N4D6-$r(B
+ *		$B:n$k!#%(%i!<$N;~$O(B nil $B$rJV$9!#(B
+ *
+ *	   (wnn-server-close)
+ *		RETURNS: BOOLEAN
+ *		DESCRIPTION:
+ *		jserver $B$H$N@\B3$r@Z$k!#<-=q!"IQEY$O%;!<%V$5$l$J$$!#(B
+ *
+ *	   (wnn-server-dict-add dict-file-name hindo-file-name priority
+ *		dict-file-mode hindo-file-mode pw1 pw2)
+ *		dict-file-name: STRING
+ *		hindo-file-name: STRING or NULL-STRING
+ *		priority: INTEGER
+ *		dict-file-mode: BOOLEAN
+ *		hindo-file-mode: BOOLEAN
+ *		pw1: STRING or NIL
+ *		pw2: STRING or NIL
+ *		DESCRIPTION:
+ *		$B<-=q09:37:18!%$%kL>!"IQEY09:37:18!%$%kL>!"M%@hEY!"<-=q09:37:18!%$%k%b!<%(BI
+ *		$BIQEY09:37:18!%$%k%b!<%I$G;XDj$7$?<-=q$r/export/willow0/xemacs-20.0-release/editor/src/mule/SCCS/s.mule-wnnfns.cC09:37:18!$KDI2C$9$k!(B#
+ *		pw1, pw2 $B$O<-=q09:37:18!%$%k!"IQEY09:37:18!%$%k$N9%o!<%I!(B#
+ *
+ *	   (wnn-server-dict-delete dic-no)
+ *		dic-no: INTEGER
+ *		RETURNS: $B%(%i!<$N;~(B nil
+ *		DESCRIPTION: dic-no $B$N<-=qHV9f$N<-=q$r!"/export/willow0/xemacs-20.0-release/editor/src/mule/SCCS/s.mule-wnnfns.cC09:37:18!$+$i(B
+ *		$B:o=|$9$k!#(B
+ *
+ *	   (wnn-server-dict-list)
+ *		RETURNS: ((dic-no1 file-name1 comment1 word-no1 nice1)
+ *			  (dic-no2 file-name2 comment2 word-no2 nice2)...)
+ *		DESCRIPTION: $B/export/willow0/xemacs-20.0-release/editor/src/mule/SCCS/s.mule-wnnfns.cC09:37:18!>e$N<-=q$N%j%9%H$rF@$k!#(B
+ *
+ *	   (wnn-server-dict-comment dic-no comment)
+ *		RETURNS: $B%(%i!<$N;~(B nil
+ *		DESCRIPTION: dic-no $B$N<-=q$K%3%a%s%H$r$D$1$k!#(B
+ *
+ *	   (wnn-server-set-rev rev)
+ *		rev: BOOLEAN
+ *		rev $B$,(B nil $B$N;~$O@5JQ49!"$=$l0J30$N;~$O5UJQ49(B
+ *
+ *	   (wnn-server-henkan-begin henkan-string)
+ *		henkan-string: STRING
+ *		RETURNS: bunsetu-suu
+ *		DESCRIPTION:
+ *		$B2>L>4A;zJQ49$r$7!"Bh0l8uJd$NJ8@a?t$rJV$9!#(B
+ *
+ *	   (wnn-server-zenkouho bunsetu-no dai)
+ *		bunsetu-no: INTEGER
+ *		dai: BOOLEAN
+ *		RETURNS: offset
+ *		DESCRIPTION:
+ *		$BJ8@aHV9f$G;XDj$5$l$?J8@a$NA48uJd$r$H$j$@$7(B
+ *		$B!"8=:_$N%*09:37:18;89H$rJV$9!#(B
+ *
+ *	   (wnn-server-get-zenkouho offset)
+ *		bunsetu-no: INTEGER
+ *		dai: BOOLEAN
+ *		RETURNS: list of zenkouho
+ *		DESCRIPTION:
+ *		$B%*09:37:18;96H$G;XDj$5$l$?8uJd$rF@$k!#(B
+ *
+ *	   (wnn-server-zenkouho-bun)
+ *		RETURNS: INTEGER
+ *		DESCRIPTION:
+ *		$BA48uJd$rI=<($7$F$$$kJ8@aHV9f$rF@$k!#(B
+ *
+ *	   (wnn-server-zenkouho-suu)
+ *		RETURNS: INTEGER
+ *		DESCRIPTION:
+ *		$BA48uJd$rI=<($7$F$$$kJ8@a$NA48uJd?t$rF@$k!#(B
+ *
+ *	   (wnn-server-dai-top bun-no)
+ *		bun-no: INTEGER
+ *		RETURNS: BOOLEAN
+ *		DESCRIPTION:
+ *		$BJ8@a$,BgJ8@a$N@hF,$J$i(B t
+ *
+ *	   (wnn-server-dai-end bun-no)
+ *		bun-no: INTEGER
+ *		RETURNS: INTEGER
+ *		DESCRIPTION:
+ *		$B<!$NBgJ8@a$NJ8@aHV9f$rF@$k!#(B
+ *
+ *	   (wnn-server-henkan-kakutei kouho-no dai)
+ *		kouho-no: INTEGER
+ *		dai: BOOLEAN
+ *		RETURNS: BOOLEAN
+ *		DESCRIPTION:
+ *		$B8uJdHV9f$G<($5$l$?8uJd$rA*Br$9$k!#(B
+ *		(wnn-server-zenkouho) $B$r8F$s$F$+$i$G$J$$$H$$$1$J$$!#(B
+ *
+ *	   (wnn-server-bunsetu-henkou bunsetu-no bunsetu-length dai)
+ *		bunsetu-no: INTEGER
+ *		bunsetu-length: INTEGER
+ *		dai: BOOLEAN
+ *		RETURNS:
+ *		DESCRIPTION:
+ *		$BJ8@a$ND9$5$rJQ99$9$k!#(B
+ *
+ *         (wnn-bunsetu-kouho-inspect bunsetu-no)
+ *              bunsetu-no: INTEGER
+ *              RETURNS: (kanji yomi jisho-no serial-no hinsi hindo
+ *		ima hyoka daihyoka kangovect)
+ *		DESCRIPTION:
+ *		$BJ8@a$N?'!9$J>pJs$rJQ49/export/willow0/xemacs-20.0-release/editor/src/mule/SCCS/s.mule-wnnfns.cC09:37:18!$+$i$H$j=P$9!#(B
+ *
+ *	   (wnn-server-henkan-quit)
+ *		RETURNS: BOOLEAN
+ *		DESCRIPTION:
+ *		$B2?$b$7$J$$!#(B
+ *
+ *	   (wnn-server-bunsetu-kanji bun-no)
+ *		RETURNS: (bunsetu-kanji length)
+ *		DESCRIPTION:
+ *
+ *	   (wnn-server-bunsetu-yomi bun-no)
+ *		RETURNS: (bunsetu-yomi length)
+ *		DESCRIPTION:
+ *
+ *	   (wnn-server-bunsetu-suu)
+ *		RETURNS: bunsetu-suu
+ *		DESCRIPTION:
+ *
+ *	   (wnn-server-hindo-update &optional bunsetu-no)
+ *              bunsetu-no: INTEGER
+ *		RETURNS: BOOLEAN
+ *		DESCRIPTION:
+ *		$BIQEY>pJs$r99?7$9$k!#(B
+ *
+ *	   (wnn-server-word-add dic-no tango yomi comment hinsi)
+ *		dic-no: INTEGER
+ *		tango: STRING
+ *		yoni: STRING
+ *		comment: STRING
+ *		hinsi: INTEGER
+ *		RETURNS: BOOLEAN
+ *		DESCRIPTION:
+ *		$B<-=q$KC18l$rEPO?$9$k!#(B
+ *
+ *	   (wnn-server-word-delete dic-no entry)
+ *		dic-no: INTEGER
+ *		entry: INTEGER
+ *		RETURNS: BOOLEAN
+ *		DESCRIPTION:
+ *		$B<-=q$+$i%(%s15(B $BSe(Bp $B1995jHV9f$G<($5$l$kC18l$r:o=|$9$k!(B#
+ *
+ *	   (wnn-server-word-use dic-no entry)
+ *		dic-no: INTEGER
+ *		entry: INTEGER
+ *		RETURNS: BOOLEAN
+ *		DESCRIPTION:
+ *		$B<-=q$+$i%(%s15(B $BSe(Bp $B1995jHV9f$G<($5$l$kC18l$NM-8z!?L58z$r1(B5 $BSe(Bp $B19950%k$9$k!(B#
+ *
+ *	   (wnn-server-word-info dic-no entry)
+ *		dic-no: INTEGER
+ *		entry: INTEGER
+ *		RETURNS: (yomi kanji comment hindo hinsi)
+ *		DESCRIPTION:
+ *		$B<-=q$+$i%(%s15(B $BSe(Bp $B1995jHV9f$G<($5$l$kC18l$N>pJs$rF@$k!(B#
+ *
+ *	   (wnn-server-word-hindo-set dic-no entry hindo)
+ *		dic-no: INTEGER
+ *		entry: INTEGER
+ *		hindo: INTEGER
+ *		RETURNS: BOOLEAN
+ *		DESCRIPTION:
+ *		$B<-=q$+$i%(%s15(B $BSe(Bp $B1995jHV9f$G<($5$l$kC18l$NIQEY$r@_Dj$9$k!(B#
+ *
+ *	   (wnn-server-word-search yomi)
+ *		yomi: STRING
+ *		RETURNS: a LIST of dict-joho
+ *		DESCRIPTION:
+ *		$BA4$F$N<-=q$+$iC18l8!:w$r9T$J$&!#(B
+ *
+ *         (wnn-server-dict-save)
+ *              RETURNS: BOOLEAN
+ *              DESCRIPTION:
+ *		$BA4$F$N<-=q$HIQEY09:37:18!%$%k$r%;!<%V$9$k!(B#
+ *
+ *	   (wnn-server-get-param)
+ *		RETURNS: (n nsho p1 p2 p3 ... p15)
+ *		DESCRIPTION: $BJQ49i%a!<%?$rF@$k!(B#
+ *
+ *	   (wnn-server-set-param n sho p1 ... p15)
+ *		RETURNS: $B%(%i!<$N;~(B nil
+ *		DESCRIPTION: $BJQ49i%a!<%?$r@_Dj$9$k!(B#
+ *
+ *	   (wnn-server-get-msg error-no)
+ *		RETURNS: $B%(%i!<%a225;!<%8(B
+ *		DESCRIPTION: $B%(%i!<HV9f$+$i%a226;!<%8$rF@$k!#(B
+ *
+ *	   (wnn-server-fuzokugo-set fname)
+ *		RETURNS: $B%(%i!<$N;~(B nil
+ *		DESCRIPTION: $B/export/willow0/xemacs-20.0-release/editor/src/mule/SCCS/s.mule-wnnfns.cC09:37:18!$KImB08l09:37:18!%$%k$rFI$_9~$`!(B#
+ *
+ *	   (wnn-server-fuzokugo-get)
+ *		RETURNS: $B09:37:18!%$%kL(B>
+ *		DESCRIPTION: $B/export/willow0/xemacs-20.0-release/editor/src/mule/SCCS/s.mule-wnnfns.cC09:37:18!$NImB08l09:37:18!%$%kL>$rF@$k!(B#
+ *
+ *	   (wnn-server-isconnect)
+ *		RETURNS: $B%3mule-wnnfns.c/%H$7$F$l$P(B t, $B$7$F$J$1$l$P(B nil
+ *		DESCRIPTION: $B%5!<%P$H7Q$C$F$$$k$+D4$Y$k!#(B
+ *
+ *	   (wnn-server-hinsi-dicts hinsi-no)
+ *		RETURNS: (dic-no1 dic-no2 ...)
+ *		DESCRIPTION: hinsi-no $B$NIJ;l$,EPO?$G$-$k<-=q$N%j%9%H$rF@$k!#(B
+ *		hinsi-no = -1 $B$N$H$-$K$O!"EPO?2DG=$JA4<-=q$rF@$k!#(B
+ *
+ *	   (wnn-server-hinsi-list dic-no name)
+ *		RETURNS: (name1 name2 ... )
+ *		DESCRIPTION: dic-no $B$N<-=q$G!"IJ;l%N!<%I$KB0$9$k(B
+ *		$BIJ;l%N!<%I!JL>!K$N%j%9%H$rF@$k!#(B
+ *		$BIJ;lL>$rM?$($?;~$O!"#0$rJV$9!#(B
+ *
+ *	   (wnn-server-hinsi-name hinsi-no)
+ *		RETURNS: hinsi-name
+ *		DESCRIPTION: $BIJ;lHV9f$+$iL>A0$r<h$k!#(B
+ *
+ *	   (wnn-server-hinsi-number hinsi-name)
+ *		RETURNS: hinsi-no
+ *		DESCRIPTION: $BIJ;lL>$rIJ;lHV9f$KJQ49$9$k!#(B
+ *
+ *         (wnn-server-version)
+ *              RETURNS: version ID(int)
+ *
+ */
+
+#include <config.h>
+#include "lisp.h"
+
+#include "buffer.h"
+#include "window.h"
+
+#include "commonhd.h"
+#include "jllib.h"
+#include "cplib.h"
+
+/* UCHAR $B$,Fs=EDj5A$5$l$k$N$G(B */
+#define _UCHAR_T
+
+#define EGG_TIMEOUT 5
+#define NSERVER 4
+#define WNNSERVER_J 0
+#define WNNSERVER_C 1
+#define WNNSERVER_T 2
+#define WNNSERVER_K 3
+
+static struct wnn_buf *wnnfns_buf[NSERVER];
+static struct wnn_env *wnnfns_env_norm[NSERVER];
+static struct wnn_env *wnnfns_env_rev[NSERVER];
+static int wnnfns_norm;
+static unsigned char lb_wnn_server_type[NSERVER] =
+{LEADING_BYTE_JP, LEADING_BYTE_CN, LEADING_BYTE_INV, LEADING_BYTE_KR};
+
+/* Lisp Variables and Constants Definition */
+Lisp_Object	Qjserver;
+Lisp_Object	Qcserver;
+/*Lisp_Object	Qtserver;*/
+Lisp_Object	Qkserver;
+Lisp_Object	Qwnn_no_uniq;
+Lisp_Object	Qwnn_uniq;
+Lisp_Object	Qwnn_uniq_kanji;
+Lisp_Object	Vwnn_server_type;
+Lisp_Object	Vcwnn_zhuyin;
+Lisp_Object	Vwnnenv_sticky;
+Lisp_Object	Vwnn_uniq_level;
+int		lb_sisheng;
+
+/* Lisp functions definition */
+
+
+
+DEFUN ("wnn-server-open", Fwnn_open, 2, 2, 0, /*
+Connect to jserver of host HNAME, make an environment with
+login name LNAME in the server.
+Return nil if error occurs
+*/
+       (hname, lname))
+{
+  char	envname[32];
+  char	langname[32];
+  char	hostname[32];
+  int	snum;
+  CHECK_STRING (lname);
+
+  snum = check_wnn_server_type ();
+  switch (snum)
+    {
+    case WNNSERVER_J:
+      strcpy (langname, "ja_JP");
+      break;
+    case WNNSERVER_C:
+      strcpy (langname, "zh_CN");
+      break;
+/*  
+    case WNNSERVER_T:
+    strcpy (langname, "zh_TW");
+    break;
+    */
+    case WNNSERVER_K:
+      strcpy (langname, "ko_KR");
+      break;
+    }
+  strncpy (envname, XSTRING (lname)->data, 32);
+  if (hname == Qnil) strcpy (hostname, "");
+  else
+    {
+      CHECK_STRING (hname);
+      strncpy (hostname, XSTRING (hname)->data, 32);
+    }
+  CHECK_STRING (lname);
+  if (!(wnnfns_buf[snum] = jl_open_lang (envname, hostname, langname,
+					 0, 0, 0, EGG_TIMEOUT)))
+    {
+      return Qnil;
+    }
+  if (!jl_isconnect (wnnfns_buf[snum])) return Qnil;
+  wnnfns_env_norm[snum] = jl_env_get (wnnfns_buf[snum]);
+/*  if (Vwnnenv_sticky == Qt) jl_env_sticky_e (wnnfns_env_norm[snum]);
+    else jl_env_un_sticky_e (wnnfns_env_norm[snum]);*/
+  strcat (envname, "R");
+  if (!(wnnfns_env_rev[snum] = jl_connect_lang (envname, hostname, langname,
+						0, 0, 0, EGG_TIMEOUT)))
+    {
+      return Qnil;
+    }
+/*  if (Vwnnenv_sticky == Qt) jl_env_sticky_e (wnnfns_env_rev[snum]);
+    else jl_env_un_sticky_e (wnnfns_env_rev[snum]);*/
+  return Qt;
+}
+
+
+DEFUN ("wnn-server-close", Fwnn_close, 0, 0, 0, /*
+Close the connection to jserver, Dictionary and friquency files
+are not saved.
+*/
+       ())
+{
+  int	snum;
+  if ((snum = check_wnn_server_type ()) == -1) return Qnil;
+  if (!wnnfns_buf[snum]) return Qnil;
+  if (wnnfns_env_norm[snum])
+    {
+      if (Vwnnenv_sticky == Qnil) jl_env_un_sticky_e (wnnfns_env_norm[snum]);
+      else jl_env_sticky_e (wnnfns_env_norm[snum]);
+      jl_disconnect (wnnfns_env_norm[snum]);
+    }
+  if (wnnfns_env_rev[snum])
+    {
+      if (Vwnnenv_sticky == Qnil) jl_env_un_sticky_e (wnnfns_env_rev[snum]);
+      else jl_env_sticky_e (wnnfns_env_rev[snum]);
+      jl_disconnect (wnnfns_env_rev[snum]);
+    }
+  jl_env_set (wnnfns_buf[snum], 0);
+  jl_close (wnnfns_buf[snum]);
+  wnnfns_buf[snum] = (struct wnn_buf *) 0;
+  wnnfns_env_norm[snum] = wnnfns_env_rev[snum] = (struct wnn_env *) 0;
+  return Qt;
+}
+
+DEFUN ("wnn-server-dict-add", Fwnn_dict_add, 5, MANY, 0, /*
+Add dictionary specified by DICT-FILE-NAME, FREQ-FILE-NAME,
+PRIORITY, DICT-FILE-MODE, FREQ-FILE-MODE.
+Specify password files of dictionary and frequency, PW1 and PW2, if needed.
+*/
+       (int nargs, Lisp_Object *args))
+{
+  static int yes_or_no ();
+  static void puts2 ();
+  struct gcpro gcpro1;
+  int	snum;
+  CHECK_STRING (args[0]);
+  CHECK_STRING (args[1]);
+  CHECK_INT (args[2]);
+  if (args[5] != Qnil) CHECK_STRING (args[5]);
+  if (args[6] != Qnil) CHECK_STRING (args[6]);
+  if ((snum = check_wnn_server_type ()) == -1) return Qnil;
+  if (!wnnfns_buf[snum]) return Qnil;
+  GCPRO1 (*args);
+  gcpro1.nvars = nargs;
+  if (jl_dic_add (wnnfns_buf[snum],
+		  XSTRING (args[0])->data,
+		  XSTRING (args[1])->data,
+		  wnnfns_norm ? WNN_DIC_ADD_NOR : WNN_DIC_ADD_REV,
+		  XINT (args[2]),
+		  (args[3] == Qnil) ? WNN_DIC_RDONLY : WNN_DIC_RW,
+		  (args[4] == Qnil) ? WNN_DIC_RDONLY : WNN_DIC_RW,
+		  (args[5] == Qnil) ? 0 : XSTRING (args[5])->data,
+		  (args[6] == Qnil) ? 0 : XSTRING (args[6])->data,
+		  yes_or_no,
+		  puts2 ) < 0)
+    {
+      UNGCPRO;
+      return Qnil;
+    }
+  UNGCPRO;
+  return Qt;
+}
+
+DEFUN ("wnn-server-dict-delete", Fwnn_dict_delete, 1, 1, 0, /*
+Remove dictionary specified by DIC-NUMBER from buffer.
+*/
+       (dicno))
+{
+  int	no;
+  int	snum;
+  CHECK_INT (dicno);
+  if ((snum = check_wnn_server_type ()) == -1) return Qnil;
+  no = XINT (dicno);
+  if (!wnnfns_buf[snum]) return Qnil;
+  if (jl_dic_delete (wnnfns_buf[snum], no) < 0) return Qnil;
+  return Qt;
+}
+
+DEFUN ("wnn-server-dict-list", Fwnn_dict_list, 0, 0, 0, /*
+Return information of dictionaries.
+*/
+       ())
+{
+  WNN_DIC_INFO	*dicinfo;
+  int		cnt, i;
+  unsigned char	comment[1024];
+  Lisp_Object	val;
+  int	snum;  
+  unsigned char lb;
+
+  if ((snum = check_wnn_server_type ()) == -1) return Qnil;
+  lb = lb_wnn_server_type[snum];
+  if (!wnnfns_buf[snum]) return Qnil;
+#ifdef	WNN6
+  if((cnt = jl_fi_dic_list (wnnfns_buf[snum], 0x3f, &dicinfo)) < 0)
+    return Qnil;
+#else
+  if((cnt = jl_dic_list (wnnfns_buf[snum], &dicinfo)) < 0) return Qnil;
+#endif
+  val = Qnil;
+  for (i = 0, dicinfo += cnt; i < cnt; i++)
+    {
+      dicinfo--;
+      w2m (dicinfo->comment, comment, lb);
+      val = Fcons (Fcons (make_int (dicinfo->dic_no),
+			  list4 (make_string (dicinfo->fname, strlen
+					      (dicinfo->fname)),
+				 make_string (comment, strlen (comment)),
+				 make_int (dicinfo->gosuu),
+				 make_int (dicinfo->nice))), val);
+    }
+  return val;
+}
+
+DEFUN ("wnn-server-dict-comment", Fwnn_dict_comment, 2, 2, 0, /*
+Set comment to dictionary specified by DIC-NUMBER.
+Comment string COMMENT
+*/
+       (dicno, comment))
+{
+  w_char		wbuf[512];
+  int	snum;
+  CHECK_INT (dicno);
+  CHECK_STRING (comment);
+  if ((snum = check_wnn_server_type ()) == -1) return Qnil;
+  if (!wnnfns_buf[snum]) return Qnil;
+  m2w (XSTRING (comment)->data, wbuf);
+  if (jl_dic_comment_set (wnnfns_buf[snum], XINT (dicno), wbuf) < 0) 
+    return Qnil;
+  return Qt;
+}
+
+
+DEFUN ("wnn-server-set-rev", Fwnn_set_rev, 1, 1, 0, /*
+Switch the translation mode to normal if T, or reverse if NIL.
+*/
+       (rev))
+{
+  int	snum;
+  if ((snum = check_wnn_server_type ()) == -1) return Qnil;
+  if (rev == Qnil)
+    {
+      if ((!wnnfns_buf[snum]) || (!wnnfns_env_norm[snum])) return;
+      jl_env_set (wnnfns_buf[snum], wnnfns_env_norm[snum]);
+      wnnfns_norm = 1;
+    }
+  else
+    {
+      if ((!wnnfns_buf[snum]) || (!wnnfns_env_rev[snum])) return;
+      jl_env_set (wnnfns_buf[snum], wnnfns_env_rev[snum]);
+      wnnfns_norm = 0;
+    }
+}
+
+DEFUN ("wnn-server-henkan-begin", Fwnn_begin_henkan, 1, 1, 0, /*
+Translate YOMI string to kanji. Retuen the number of bunsetsu.
+*/
+       (hstring))
+{
+  int			cnt;
+  w_char		wbuf[5000];
+  int	snum;
+  CHECK_STRING (hstring);
+  if ((snum = check_wnn_server_type ()) == -1) return Qnil;
+  if (!wnnfns_buf[snum]) return Qnil;
+  m2w (XSTRING (hstring)->data, wbuf);
+  if (snum == WNNSERVER_C)
+    w2y (wbuf);
+
+#ifdef	WNN6
+  if ((cnt = jl_fi_ren_conv (wnnfns_buf[snum], wbuf,	0, -1, WNN_USE_MAE)) < 0) 
+    return Qnil;
+#else
+  if ((cnt = jl_ren_conv (wnnfns_buf[snum], wbuf,	0, -1, WNN_USE_MAE)) < 0) 
+    return Qnil;
+  return make_int (cnt);
+}
+
+DEFUN ("wnn-server-zenkouho", Fwnn_zenkouho, 2, 2, 0, /*
+Get zenkouho at BUNSETSU-NUMBER. Second argument DAI is T
+if dai-bunsetsu, NIL if sho-bunsetsu. Return the current offset of zenkouho.
+*/
+       (bunNo, dai))
+{
+  int		no, offset;
+  int	snum;
+  int	uniq_level;
+  CHECK_INT (bunNo);
+  if ((snum = check_wnn_server_type ()) == -1) return Qnil;
+  if (!wnnfns_buf[snum]) return Qnil;
+  no = XINT (bunNo);
+  if (Vwnn_uniq_level == Qwnn_no_uniq) uniq_level = WNN_NO_UNIQ;
+  else if (Vwnn_uniq_level == Qwnn_uniq) uniq_level = WNN_UNIQ;
+  else uniq_level = WNN_UNIQ_KNJ;
+  if (dai == Qnil)
+    {
+      if (offset = jl_zenkouho (wnnfns_buf[snum],no,WNN_USE_MAE, uniq_level) < 0)
+	return Qnil;
+    }
+  else
+    {
+      if (offset = jl_zenkouho_dai (wnnfns_buf[snum], no, dai_end (no, snum),
+				    WNN_USE_MAE, uniq_level) < 0)
+	return Qnil;
+    }
+  return make_int (offset);
+}
+
+
+DEFUN ("wnn-server-get-zenkouho", Fwnn_get_zenkouho, 1, 1, 0, /*
+Get kanji string of KOUHO-NUMBER
+*/
+       (kouhoNo))
+{
+  unsigned char	kanji_buf[256];
+  w_char	wbuf[256];
+  int	snum;
+  unsigned char lb;
+  CHECK_INT (kouhoNo);
+  if ((snum = check_wnn_server_type ()) == -1) return Qnil;
+  lb = lb_wnn_server_type[snum];
+  if (!wnnfns_buf[snum]) return Qnil;
+  jl_get_zenkouho_kanji (wnnfns_buf[snum], XINT (kouhoNo), wbuf);
+  w2m (wbuf, kanji_buf, lb);
+  return make_string (kanji_buf, strlen (kanji_buf));
+}
+
+DEFUN ("wnn-server-zenkouho-bun", Fwnn_zenkouho_bun, 0, 0, 0, /*
+For Wnn.
+*/
+       ())
+{
+  int	snum;
+  if ((snum = check_wnn_server_type ()) == -1) return Qnil;
+  return make_int (jl_zenkouho_bun (wnnfns_buf[snum]));
+}
+
+DEFUN ("wnn-server-zenkouho-suu", Fwnn_zenkouho_suu, 0, 0, 0, /*
+Return the number of zen kouho
+*/
+       ())
+{
+  int	snum;
+  if ((snum = check_wnn_server_type ()) == -1) return Qnil;
+  return make_int (jl_zenkouho_suu (wnnfns_buf[snum]));
+}
+
+DEFUN ("wnn-server-dai-top", Fwnn_dai_top, 1, 1, 0, /*
+Return T if bunsetsu BUN-NUMBER is dai-bunsetsu.
+*/
+       (bunNo))
+{
+  int	snum;
+  CHECK_INT (bunNo);
+  if ((snum = check_wnn_server_type ()) == -1) return Qnil;
+  if (!wnnfns_buf[snum]) return Qnil;
+  if (jl_dai_top (wnnfns_buf[snum], XINT (bunNo)) == 1) return Qt;
+  else return Qnil;
+}
+
+DEFUN ("wnn-server-dai-end", Fwnn_dai_end, 1, 1, 0, /*
+Return the bunsetu number of the next dai-bunsetsu after BUN-NUMBER.
+*/
+       (bunNo))
+{
+  int	snum;
+  CHECK_INT (bunNo);
+  if ((snum = check_wnn_server_type ()) == -1) return Qnil;
+  if (!wnnfns_buf[snum]) return Qnil;
+  return make_int (dai_end (XINT (bunNo), snum));
+}
+
+DEFUN ("wnn-server-henkan-kakutei", Fwnn_kakutei, 2, 2, 0, /*
+Set candidate with OFFSET, DAI. DAI is T if dai-bunsetsu.
+*/
+       (offset, dai))
+{
+  int	snum;
+  CHECK_INT (offset);
+  if ((snum = check_wnn_server_type ()) == -1) return Qnil;
+  if (!wnnfns_buf[snum]) return Qnil;
+  if (dai == Qnil)
+    {
+      if (jl_set_jikouho (wnnfns_buf[snum], XINT (offset)) < 0) return Qnil;
+    }
+  else
+    {
+      if (jl_set_jikouho_dai (wnnfns_buf[snum], XINT (offset)) < 0)
+	return Qnil;
+    }
+  return Qt;
+}
+
+DEFUN ("wnn-server-bunsetu-henkou", Fwnn_bunsetu_henkou, 3, 3, 0, /*
+Change length of BUN-NUMBER bunsetu to LEN. DAI is T if dai-bunsetsu.
+*/
+       (bunNo, len, dai))
+{
+  Lisp_Object	val;
+  int		cnt, no;
+  int	snum;
+  CHECK_INT (bunNo);
+  CHECK_INT (len);
+  if ((snum = check_wnn_server_type ()) == -1) return Qnil;
+  if (!wnnfns_buf[snum]) return Qnil;
+  no = XINT (bunNo);
+#ifdef	WNN6
+  if ((cnt = jl_fi_nobi_conv (wnnfns_buf[snum], no, XINT(len), -1, WNN_USE_MAE,
+			      (dai == Qnil) ? WNN_SHO : WNN_DAI)) < 0)
+    return Qnil;
+#else
+  if ((cnt = jl_nobi_conv (wnnfns_buf[snum], no, XINT(len), -1, WNN_USE_MAE,
+			   (dai == Qnil) ? WNN_SHO : WNN_DAI)) < 0)
+    return Qnil;
+#endif
+  return make_int (cnt);
+}
+
+DEFUN ("wnn-server-inspect", Fwnn_inspect, 1, 1, 0, /*
+Get bunsetsu information specified by BUN-NUMBER.
+*/
+       (bunNo))
+{
+  Lisp_Object		val;
+  struct wnn_jdata	*info_buf;
+  unsigned char		cbuf[512];
+  w_char		wbuf[256];
+  int			bun_no, yomilen, jirilen, i;
+  int	snum;
+  unsigned char		lb;
+  CHECK_INT (bunNo);
+  if ((snum = check_wnn_server_type ()) == -1) return Qnil;
+  lb = lb_wnn_server_type[snum];
+  if (!wnnfns_buf[snum]) return Qnil;
+  bun_no = XINT (bunNo);
+  val = Qnil;
+  val = Fcons (make_int (wnnfns_buf[snum]->bun[bun_no]->kangovect), val);
+  val = Fcons (make_int (wnnfns_buf[snum]->bun[bun_no]->daihyoka), val);
+  val = Fcons (make_int (wnnfns_buf[snum]->bun[bun_no]->hyoka), val);
+  val = Fcons (make_int (wnnfns_buf[snum]->bun[bun_no]->ima), val);
+  val = Fcons (make_int (wnnfns_buf[snum]->bun[bun_no]->hindo), val);
+  val = Fcons (make_int (wnnfns_buf[snum]->bun[bun_no]->hinsi), val);
+  val = Fcons (make_int (wnnfns_buf[snum]->bun[bun_no]->entry), val);
+  val = Fcons (make_int (wnnfns_buf[snum]->bun[bun_no]->dic_no), val);
+  yomilen = jl_get_yomi (wnnfns_buf[snum], bun_no, bun_no + 1, wbuf);
+  jirilen = wnnfns_buf[snum]->bun[bun_no]->jirilen;
+  for (i = yomilen; i >= jirilen; i--) wbuf[i+1] = wbuf[i];
+  wbuf[jirilen] = '+';
+  w2m (wbuf, cbuf, lb);
+  val = Fcons (make_string (cbuf, strlen (cbuf)), val);
+  jl_get_kanji (wnnfns_buf[snum], bun_no, bun_no + 1, wbuf);
+  w2m (wbuf, cbuf, lb);
+  val = Fcons (make_string (cbuf, strlen (cbuf)), val);
+  return val;
+}
+
+
+DEFUN ("wnn-server-henkan-quit", Fwnn_quit_henkan, 0, 0, 0, /*
+do nothing
+*/
+       ())
+{
+  int	snum;
+  if ((snum = check_wnn_server_type ()) == -1) return Qnil;
+  if (!wnnfns_buf[snum]) return Qnil;
+  return Qt;
+}
+
+DEFUN ("wnn-server-bunsetu-kanji", Fwnn_bunsetu_kanji, 1, 1, 0, /*
+Get the pair of kanji and length of bunsetsu specified by BUN-NUMBER.
+*/
+       (bunNo))
+{
+  int		no;
+  unsigned char		kanji_buf[256];
+  w_char		wbuf[256];
+  int			kanji_len;
+  int			snum;
+  unsigned char		lb;
+  CHECK_INT (bunNo);
+  if ((snum = check_wnn_server_type ()) == -1) return Qnil;
+  lb = lb_wnn_server_type[snum];
+  if (!wnnfns_buf[snum]) return Qnil;
+  no = XINT (bunNo);
+  kanji_len = jl_get_kanji (wnnfns_buf[snum], no, no + 1, wbuf);
+  w2m (wbuf, kanji_buf, lb);
+  return Fcons (make_string (kanji_buf, strlen (kanji_buf)),
+		make_int (kanji_len));
+}
+
+DEFUN ("wnn-server-bunsetu-yomi", Fwnn_bunsetu_yomi, 1, 1, 0, /*
+Get the pair of yomi and length of bunsetsu specified by BUN-NUMBER.
+*/
+       (bunNo))
+{
+  int		no;
+  unsigned char		yomi_buf[256];
+  w_char		wbuf[256];
+  int			yomi_len;
+  int			snum;
+  unsigned char		lb;
+  CHECK_INT (bunNo);
+  if ((snum = check_wnn_server_type ()) == -1) return Qnil;
+  lb = lb_wnn_server_type[snum];
+  if (!wnnfns_buf[snum]) return Qnil;
+  no = XINT (bunNo);
+  yomi_len = jl_get_yomi (wnnfns_buf[snum], no, no + 1, wbuf);
+  w2m (wbuf, yomi_buf, lb);
+  return Fcons (make_string (yomi_buf, strlen (yomi_buf)),
+		make_int (yomi_len));
+}
+
+DEFUN ("wnn-server-bunsetu-suu", Fwnn_bunsetu_suu, 0, 0, 0, /*
+Get the number of bunsetsu.
+*/
+       ())
+{
+  int	snum;
+  if ((snum = check_wnn_server_type ()) == -1) return Qnil;
+  if (!wnnfns_buf[snum]) return Qnil;
+  return make_int (jl_bun_suu (wnnfns_buf[snum]));
+}
+
+DEFUN ("wnn-server-hindo-update", Fwnn_hindo_update, 0, 1, 0, /*
+Update frequency of bunsetsu specified by NUM-NUMBER.
+*/
+       (bunNo))
+{
+  int		no;
+  Lisp_Object	val;
+  int	snum;
+  if ((snum = check_wnn_server_type ()) == -1) return Qnil;
+  if (bunNo == Qnil) no = -1;
+  else
+    {
+      CHECK_INT (bunNo);
+      no = XINT (bunNo);
+    }
+  if (!wnnfns_buf[snum]) return Qnil;
+#ifdef	WNN6
+  if (jl_optimize_fi (wnnfns_buf[snum], 0, no) < 0) return Qnil;
+#else
+  if (jl_update_hindo (wnnfns_buf[snum], 0, no) < 0) return Qnil;
+#endif
+  return Qt;
+}
+
+
+DEFUN ("wnn-server-word-add", Fwnn_word_toroku, 5, 5, 0, /*
+Add a word to dictionary. Arguments are
+DIC-NUMBER, KANJI, YOMI, COMMENT, HINSI-NUMBER
+*/
+       (dicno, kanji, yomi, comment, hinsi))
+{
+  w_char		yomi_buf[256], kanji_buf[256], comment_buf[256];
+  int	snum;
+  CHECK_INT (dicno);
+  CHECK_STRING (kanji);
+  CHECK_STRING (yomi);
+  CHECK_STRING (comment);
+  CHECK_INT (hinsi);
+  if ((snum = check_wnn_server_type ()) == -1) return Qnil;
+  if (!wnnfns_buf[snum]) return Qnil;
+  m2w (XSTRING (yomi)->data, yomi_buf);
+  if (snum == WNNSERVER_C)
+    w2y (yomi_buf);
+  m2w (XSTRING (kanji)->data, kanji_buf);
+  m2w (XSTRING (comment)->data, comment_buf);
+  if (jl_word_add (wnnfns_buf[snum], XINT (dicno), yomi_buf, kanji_buf,
+		   comment_buf, XINT (hinsi), 0) < 0) 
+    return Qnil;
+  else return Qt;
+}
+
+
+DEFUN ("wnn-server-word-delete", Fwnn_word_sakujo, 2, 2, 0, /*
+Delete a word from dictionary, specified by DIC-NUMBER, SERIAL-NUMBER
+*/
+       (no, serial))
+{
+  int	snum;
+  CHECK_INT (no);
+  CHECK_INT (serial);
+  if ((snum = check_wnn_server_type ()) == -1) return Qnil;
+  if (!wnnfns_buf[snum]) return Qnil;
+  if (jl_word_delete (wnnfns_buf[snum], XINT (no), XINT (serial)) < 0)
+    return Qnil;
+  else return Qt;
+}
+
+
+DEFUN ("wnn-server-word-use", Fwnn_word_use, 2, 2, 0, /*
+Toggle on/off word, specified by DIC-NUMBER and SERIAL-NUMBER
+*/
+       (no, serial))
+{
+  int	snum;
+  CHECK_INT (no);
+  CHECK_INT (serial);
+  if ((snum = check_wnn_server_type ()) == -1) return Qnil;
+  if (!wnnfns_buf[snum]) return Qnil;
+  if (jl_word_use (wnnfns_buf[snum], XINT (no), XINT (serial)) < 0)
+    return Qnil;
+  else return Qt;
+}
+
+DEFUN ("wnn-server-word-info", Fwnn_word_info, 2, 2, 0, /*
+Return list of yomi, kanji, comment, hindo, hinshi.
+*/
+       (no, serial))
+{
+  Lisp_Object		val;
+  struct wnn_jdata	*info_buf;
+  unsigned char		cbuf[512];
+  int			snum;
+  unsigned char		lb;
+  CHECK_INT (no);
+  CHECK_INT (serial);
+  if ((snum = check_wnn_server_type ()) == -1) return Qnil;
+  lb = lb_wnn_server_type[snum];
+  if (!wnnfns_buf[snum]) return Qnil;
+  if ((int)(info_buf =  jl_word_info (wnnfns_buf[snum],
+				      XINT (no), XINT (serial))) <= 0)
+    {
+      return Qnil;
+    }
+  else
+    {
+      val = Qnil;
+      val = Fcons (make_int (info_buf->hinshi), val);
+      val = Fcons (make_int (info_buf->hindo), val);
+      w2m (info_buf->com, cbuf, lb);
+      val = Fcons (make_string (cbuf, strlen (cbuf)), val);
+      w2m (info_buf->kanji, cbuf, lb);
+      val = Fcons (make_string (cbuf, strlen (cbuf)), val);
+      w2m (info_buf->yomi, cbuf, lb);
+      val = Fcons (make_string (cbuf, strlen (cbuf)), val);
+      return val;
+    }
+}
+
+DEFUN ("wnn-server-word-hindo-set", Fwnn_hindo_set, 3, 3, 0, /*
+Set frequency to arbitrary value. Specified by DIC-NUMBER,
+SERIAL-NUMBER, FREQUENCY
+*/
+       (no, serial, hindo))
+{
+  int	snum;
+  CHECK_INT (no);
+  CHECK_INT (serial);
+  CHECK_INT (hindo);
+  if ((snum = check_wnn_server_type ()) == -1) return Qnil;
+  if (!wnnfns_buf[snum]) return Qnil;
+  if (js_hindo_set (jl_env_get (wnnfns_buf[snum]),
+		    XINT (no),
+		    XINT (serial),
+		    WNN_HINDO_NOP,
+		    XINT (hindo)) < 0)
+    return Qnil;
+  else return Qt;
+}
+
+
+DEFUN ("wnn-server-word-search", Fwnn_dict_search, 1, 1, 0, /*
+Search a word YOMI from buffer.
+Return list of (kanji hinshi freq dic_no serial).
+*/
+       (yomi))
+{
+  Lisp_Object		val;
+  struct wnn_jdata	*wordinfo;
+  int			i, count;
+  w_char			wbuf[256];
+  unsigned char		kanji_buf[256];
+  int			kanji_len;
+  int			snum;
+  unsigned char		lb;
+  CHECK_STRING (yomi);
+  if ((snum = check_wnn_server_type ()) == -1) return Qnil;
+  lb = lb_wnn_server_type[snum];
+  if (!wnnfns_buf[snum]) return Qnil;
+  m2w (XSTRING (yomi)->data, wbuf);
+  if (snum == WNNSERVER_C)
+    w2y (wbuf);
+  if ((count = jl_word_search_by_env (wnnfns_buf[snum],
+				      wbuf, &wordinfo)) < 0)
+    return Qnil;
+  val = Qnil;
+  for (i = 0, wordinfo += count; i < count; i++)
+    {
+      wordinfo--;
+      w2m (wordinfo->kanji, kanji_buf, lb);
+      val = Fcons (Fcons (make_string (kanji_buf, strlen (kanji_buf)),
+			  list4 (make_int (wordinfo->hinshi),
+				 make_int (wordinfo->hindo),
+				 make_int (wordinfo->dic_no),
+				 make_int (wordinfo->serial))),
+		   val);
+    }
+  return val;
+}
+
+DEFUN ("wnn-server-dict-save", Fwnn_dict_save, 0, 0, 0, /*
+Save all dictionaries and frequency files.
+*/
+       ())
+{
+  int	snum;
+  if ((snum = check_wnn_server_type ()) == -1) return Qnil;
+  if (!wnnfns_buf[snum]) return Qnil;
+  if (jl_dic_save_all (wnnfns_buf[snum]) < 0) return Qnil;
+  else return Qt;
+}
+
+DEFUN ("wnn-server-get-param", Fwnn_get_param, 0, 0, 0, /*
+Returns (n nsho hindo len jiri flag jisho sbn dbn_len sbn_cnt
+suuji kana eisuu kigou toji_kakko fuzokogo kaikakko)
+*/
+       ())
+{
+  struct wnn_param	param;
+  int	snum;
+  if ((snum = check_wnn_server_type ()) == -1) return Qnil;
+  if (!wnnfns_buf[snum]) return Qnil;
+  if (jl_param_get (wnnfns_buf[snum], &param) < 0) return Qnil;
+  return Fcons (make_int (param.n),
+	 Fcons (make_int (param.nsho),
+	 Fcons (make_int (param.p1),
+	 Fcons (make_int (param.p2),
+	 Fcons (make_int (param.p3),
+	 Fcons (make_int (param.p4),
+	 Fcons (make_int (param.p5),
+	 Fcons (make_int (param.p6),
+	 Fcons (make_int (param.p7),
+	 Fcons (make_int (param.p8),
+	 Fcons (make_int (param.p9),
+	 Fcons (make_int (param.p10),
+	 Fcons (make_int (param.p11),
+	 Fcons (make_int (param.p12),
+	 Fcons (make_int (param.p13),
+	 Fcons (make_int (param.p14),
+	 Fcons (make_int (param.p15),Qnil)))))))))))))))));
+}
+
+DEFUN ("wnn-server-set-param", Fwnn_set_param, 17, MANY, 0, /*
+Set parameters, n nsho hindo len jiri flag jisho sbn dbn_len sbn_cnt
+suuji kana eisuu kigou toji_kakko fuzokogo kaikakko
+*/
+       (int nargs, Lisp_Object *args))
+{
+  int             rc;
+  struct wnn_param	param;
+  int	snum;
+  for (rc = 0; rc < 17; rc++) CHECK_INT (args[rc]);
+  if ((snum = check_wnn_server_type ()) == -1) return Qnil;
+  if (!wnnfns_buf[snum]) return Qnil;
+  param.n = XINT (args[0]);
+  param.nsho = XINT (args[1]);
+  param.p1 = XINT (args[2]);
+  param.p2 = XINT (args[3]);
+  param.p3 = XINT (args[4]);
+  param.p4 = XINT (args[5]);
+  param.p5 = XINT (args[6]);
+  param.p6 = XINT (args[7]);
+  param.p7 = XINT (args[8]);
+  param.p8 = XINT (args[9]);
+  param.p9 = XINT (args[10]);
+  param.p10 = XINT (args[11]);
+  param.p11 = XINT (args[12]);
+  param.p12 = XINT (args[13]);
+  param.p13 = XINT (args[14]);
+  param.p14 = XINT (args[15]);
+  param.p15 = XINT (args[16]);
+  
+  rc = jl_param_set (wnnfns_buf[snum], &param);
+  if (rc < 0) return Qnil;
+  return Qt;
+}
+
+DEFUN ("wnn-server-get-msg", Fwnn_get_msg, 0, 0, 0, /*
+Get message string from wnn_perror.
+*/
+       ())
+{
+  char mbuf[256];
+  char 			*msgp;
+  int			snum;
+  unsigned char		lb;
+  char  langname[32];
+/*  CHECK_INT (errno);*/
+  if ((snum = check_wnn_server_type ()) == -1) return Qnil;
+  lb = lb_wnn_server_type[snum];
+  switch (snum)
+    {
+    case WNNSERVER_J:
+      strcpy (langname, "ja_JP");
+      break;
+    case WNNSERVER_C:
+      strcpy (langname, "zh_CN");
+      break;
+/*
+  case WNNSERVER_T:
+  strcpy (langname, "zh_TW");
+  break;
+  */
+    case WNNSERVER_K:
+      strcpy (langname, "ko_KR");
+      break;
+    }
+  if (!wnnfns_buf[snum]) return Qnil;
+/*  msgp = msg_get (wnn_msg_cat, XINT (errno), 0, 0);*/
+  msgp = wnn_perror_lang (langname);
+  c2m (msgp, mbuf, lb);
+  return make_string (mbuf, strlen (mbuf));
+}
+
+
+DEFUN ("wnn-server-fuzokugo-set", Fwnn_fuzokugo_set, 1, 1, 0, /*
+For Wnn.
+*/
+       (file))
+{
+  int	snum;
+  CHECK_STRING (file);
+  if ((snum = check_wnn_server_type ()) == -1) return Qnil;
+  if (!wnnfns_buf[snum]) return Qnil;
+  if (jl_fuzokugo_set (wnnfns_buf[snum], XSTRING (file)->data) < 0)
+    return Qnil;
+  return Qt;
+}
+
+DEFUN ("wnn-server-fuzokugo-get", Fwnn_fuzokugo_get, 0, 0, 0, /*
+For Wnn.
+*/
+       ())
+{
+  char	fname[256];
+  int	snum;
+  if ((snum = check_wnn_server_type ()) == -1) return Qnil;
+  if (!wnnfns_buf[snum]) return Qnil;
+  if (jl_fuzokugo_get (wnnfns_buf[snum], fname) < 0) return Qnil;
+  return make_string (fname, strlen (fname));
+}
+
+
+DEFUN ("wnn-server-isconnect", Fwnn_isconnect, 0, 0, 0, /*
+For Wnn.
+*/
+       ())
+{
+  int	snum;
+  if ((snum = check_wnn_server_type ()) == -1) return Qnil;
+  if (!wnnfns_buf[snum]) return Qnil;
+  if (jl_isconnect (wnnfns_buf[snum])) return Qt;
+  else return Qnil;
+}
+
+DEFUN ("wnn-server-hinsi-dicts", Fwnn_hinsi_dicts, 1, 1, 0, /*
+For Wnn.
+*/
+       (hinsi))
+{
+  int		*area;
+  int		cnt;
+  Lisp_Object	val;
+  int	snum;
+  CHECK_INT (hinsi);
+  if ((snum = check_wnn_server_type ()) == -1) return Qnil;
+  if (!wnnfns_buf[snum]) return Qnil;
+  if ((cnt = jl_hinsi_dicts (wnnfns_buf[snum], XINT (hinsi), &area)) < 0)
+    return Qnil;
+  val = Qnil;
+  for (area += cnt; cnt > 0; cnt--)
+    {
+      area--;
+      val = Fcons (make_int (*area), val);
+    }
+  return val;
+}
+
+DEFUN ("wnn-server-hinsi-list", Fwnn_hinsi_list, 2, 2, 0, /*
+For Wnn.
+*/
+       (dicno, name))
+{
+  int		cnt;
+  Lisp_Object	val;
+  w_char		wbuf[256];
+  w_char		**area;
+  unsigned char	cbuf[512];
+  int		snum;
+  unsigned char lb;
+  CHECK_INT (dicno);
+  CHECK_STRING (name);
+  if ((snum = check_wnn_server_type ()) == -1) return Qnil;
+  lb = lb_wnn_server_type[snum];
+  if (!wnnfns_buf[snum]) return Qnil;
+  m2w (XSTRING (name)->data, wbuf);
+  if ((cnt = jl_hinsi_list (wnnfns_buf[snum], XINT (dicno), wbuf, &area)) < 0)
+    return Qnil;
+  if (cnt == 0) return make_int (0);
+  val = Qnil;
+  for (area += cnt; cnt > 0; cnt--)
+    {
+      area--;
+      w2m (*area, cbuf, lb);
+      val = Fcons (make_string (cbuf, strlen (cbuf)), val);
+    }
+  return val;
+}
+
+DEFUN ("wnn-server-hinsi-name", Fwnn_hinsi_name, 1, 1, 0, /*
+For Wnn.
+*/
+       (no))
+{
+  unsigned char	name[256];
+  w_char		*wname;
+  int			snum;
+  unsigned char		lb;
+  CHECK_INT (no);
+  if ((snum = check_wnn_server_type ()) == -1) return Qnil;
+  lb = lb_wnn_server_type[snum];
+  if (!wnnfns_buf[snum]) return Qnil;
+  if ((wname = jl_hinsi_name (wnnfns_buf[snum], XINT (no))) == 0) return Qnil;
+  w2m (wname, name, lb);
+  return make_string (name, strlen (name));
+}
+#ifdef	WNN6
+DEFUN ("wnn-server-fisys-dict-add", Fwnn_fisys_dict_add, 3, MANY, 0, /*
+Add dictionary specified by FISYS-DICT-FILE-NAME, FISYS-FREQ-FILE-NAME,
+FISYS-FREQ-FILE-MODE.
+Specify password files of dictionary and frequency, PW1 and PW2, if needed.
+*/
+       (int nargs, Lisp_Object *args))
+{
+  static int yes_or_no();
+  static void puts2();
+  struct gcpro gcpro1;
+  int   snum;
+  CHECK_STRING (args[0]);
+  CHECK_STRING (args[1]);
+  if (args[3] != Qnil) CHECK_STRING (args[3]);
+  if ((snum = check_wnn_server_type()) == -1) return Qnil;
+  if(!wnnfns_buf[snum]) return Qnil;
+  GCPRO1 (*args);
+  gcpro1.nvars = nargs;
+  if(jl_fi_dic_add(wnnfns_buf[snum],
+                XSTRING(args[0])->data,
+                XSTRING(args[1])->data,
+		WNN_FI_SYSTEM_DICT,
+		WNN_DIC_RDONLY,
+                (args[2] == Qnil) ? WNN_DIC_RDONLY : WNN_DIC_RW,
+		0,
+                (args[3] == Qnil) ? 0 : XSTRING(args[3])->data,
+                yes_or_no,
+                puts2 ) < 0) {
+    UNGCPRO;
+    return Qnil;
+  }
+  UNGCPRO;
+  return Qt;
+}
+
+DEFUN ("wnn-server-fiusr-dict-add", Fwnn_fiusr_dict_add, 4, MANY, 0, /*
+Add dictionary specified by FIUSR-DICT-FILE-NAME, FIUSR-FREQ-FILE-NAME,
+FIUSR-DICT-FILE-MODE, FIUSR-FREQ-FILE-MODE.
+Specify password files of dictionary and frequency, PW1 and PW2, if needed.
+*/
+       (int nargs, Lisp_Object *args))
+{
+  static int yes_or_no();
+  static void puts2();
+  struct gcpro gcpro1;
+  int   snum;
+  CHECK_STRING (args[0]);
+  CHECK_STRING (args[1]);
+  if (args[4] != Qnil) CHECK_STRING (args[4]);
+  if (args[5] != Qnil) CHECK_STRING (args[5]);
+  if ((snum = check_wnn_server_type()) == -1) return Qnil;
+  if(!wnnfns_buf[snum]) return Qnil;
+  GCPRO1 (*args);
+  gcpro1.nvars = nargs;
+  if(jl_fi_dic_add(wnnfns_buf[snum],
+                XSTRING(args[0])->data,
+                XSTRING(args[1])->data,
+                WNN_FI_USER_DICT,
+                (args[2] == Qnil) ? WNN_DIC_RDONLY : WNN_DIC_RW,
+		(args[3] == Qnil) ? WNN_DIC_RDONLY : WNN_DIC_RW,
+		(args[4] == Qnil) ? 0 : XSTRING(args[4])->data,
+                (args[5] == Qnil) ? 0 : XSTRING(args[5])->data,
+                yes_or_no,
+                puts2 ) < 0) {
+    UNGCPRO;
+    return Qnil;
+  }
+  UNGCPRO;
+  return Qt;
+}
+
+DEFUN ("wnn-server-notrans-dict-add", Fwnn_notrans_dict_add, 3, MANY, 0, /*
+Add dictionary specified by NOTRANS-DICT-FILE-NAME, PRIORITY, DICT-FILE-MODE.
+Specify password files of dictionary and frequency PW1 if needed.
+*/
+       (int nargs, Lisp_Object *args))
+{
+  static int yes_or_no();
+  static void puts2();
+  struct gcpro gcpro1;
+  int   snum;
+  int	dic_no;
+  struct wnn_env *cur_env;
+  unsigned long vmask = 0;
+  struct wnn_henkan_env henv;
+  CHECK_STRING (args[0]);
+  CHECK_INT (args[1]);
+  if (args[3] != Qnil) CHECK_STRING (args[3]);
+  if ((snum = check_wnn_server_type()) == -1) return Qnil;
+  if(!wnnfns_buf[snum]) return Qnil;
+  GCPRO1 (*args);
+  gcpro1.nvars = nargs;
+  if(wnnfns_norm)
+      cur_env = wnnfns_env_norm[snum];
+  else
+      cur_env = wnnfns_env_rev[snum];
+  dic_no = js_get_autolearning_dic(cur_env, WNN_MUHENKAN_LEARNING);
+  if (dic_no == WNN_NO_LEARNING) {
+      if((dic_no = jl_dic_add(wnnfns_buf[snum],
+			      XSTRING(args[0])->data,
+			      0,
+			      wnnfns_norm ? WNN_DIC_ADD_NOR : WNN_DIC_ADD_REV,
+			      XINT(args[1]),
+			      WNN_DIC_RW, WNN_DIC_RW,
+			      (args[3] == Qnil) ? 0 : XSTRING(args[3])->data,
+			      0,
+			      yes_or_no,
+			      puts2)) < 0) {
+	  UNGCPRO;
+	  return Qnil;
+      }
+      js_set_autolearning_dic(cur_env, WNN_MUHENKAN_LEARNING, dic_no);
+  }
+  if(!js_is_loaded_temporary_dic(cur_env)) {
+      if(js_temporary_dic_add(cur_env,
+			      wnnfns_norm ? WNN_DIC_ADD_NOR : WNN_DIC_ADD_REV) < 0) {
+	  UNGCPRO;
+          return Qnil;
+      }
+  }
+  vmask |= WNN_ENV_MUHENKAN_LEARN_MASK;
+  henv.muhenkan_flag = (args[2] == Qnil) ? WNN_DIC_RDONLY : WNN_DIC_RW;
+  if(jl_set_henkan_env(wnnfns_buf[snum],
+                       vmask,
+                       &henv) < 0) {
+      UNGCPRO;
+      return Qnil;
+  }
+  UNGCPRO;
+  return Qt;
+}
+
+DEFUN ("wnn-server-bmodify-dict-add", Fwnn_bmodify_dict_add, 3, MANY, 0, /*
+Add dictionary specified by BMODIFY-DICT-FILE-NAME, PRIORITY, DICT-FILE-MODE.
+Specify password files of dictionary and frequency PW1 if needed.
+*/
+       (int nargs, Lisp_Object *args))
+{
+  static int yes_or_no();
+  static void puts2();
+  struct gcpro gcpro1;
+  int   snum;
+  int   dic_no;
+  struct wnn_env *cur_env;
+  unsigned long vmask = 0;
+  struct wnn_henkan_env henv;
+  CHECK_STRING (args[0]);
+  CHECK_INT (args[1]);
+  if (args[3] != Qnil) CHECK_STRING (args[3]);
+  if ((snum = check_wnn_server_type()) == -1) return Qnil;
+  if(!wnnfns_buf[snum]) return Qnil;
+  GCPRO1 (*args);
+  gcpro1.nvars = nargs;
+  if(wnnfns_norm)
+      cur_env = wnnfns_env_norm[snum];
+  else
+      cur_env = wnnfns_env_rev[snum];
+  dic_no = js_get_autolearning_dic(cur_env, WNN_BUNSETSUGIRI_LEARNING);
+  if (dic_no == WNN_NO_LEARNING) {
+      if((dic_no = jl_dic_add(wnnfns_buf[snum],
+                              XSTRING(args[0])->data,
+                              0,
+                              wnnfns_norm ? WNN_DIC_ADD_NOR : WNN_DIC_ADD_REV,
+                              XINT(args[1]),
+                              WNN_DIC_RW, WNN_DIC_RW,
+                              (args[3] == Qnil) ? 0 : XSTRING(args[3])->data,
+                              0,
+                              yes_or_no,
+                              puts2)) < 0) {
+          UNGCPRO;
+          return Qnil;
+      }
+      js_set_autolearning_dic(cur_env, WNN_BUNSETSUGIRI_LEARNING, dic_no);
+  }
+  if(!js_is_loaded_temporary_dic(cur_env)) {
+      if(js_temporary_dic_add(cur_env,
+                              wnnfns_norm ? WNN_DIC_ADD_NOR : WNN_DIC_ADD_REV) < 0) {
+          UNGCPRO;
+          return Qnil;
+      }
+  }
+  vmask |= WNN_ENV_BUNSETSUGIRI_LEARN_MASK;
+  henv.bunsetsugiri_flag = (args[2] == Qnil) ? WNN_DIC_RDONLY : WNN_DIC_RW;
+  if(jl_set_henkan_env(wnnfns_buf[snum],
+                       vmask,
+                       &henv) < 0) {
+      UNGCPRO;
+      return Qnil;
+  }
+  UNGCPRO;
+  return Qt;
+}
+
+DEFUN ("wnn-server-set-last-is-first", Fwnn_last_is_first, 1, 1, 0, /*
+For FI-Wnn.
+*/
+       (mode))
+{
+  int   snum;
+  unsigned long vmask = 0;
+  struct wnn_henkan_env henv;
+  if ((snum = check_wnn_server_type()) == -1) return Qnil;
+  if(!wnnfns_buf[snum]) return Qnil;
+  vmask |= WNN_ENV_LAST_IS_FIRST_MASK;      
+  henv.last_is_first_flag = (mode == Qnil) ? False : True;
+  if(jl_set_henkan_env(wnnfns_buf[snum],
+		       vmask,
+		       &henv) < 0) return Qnil;
+  return Qt;
+}
+
+DEFUN ("wnn-server-set-complex-conv-mode", Fwnn_complex_conv, 1, 1, 0, /*
+For FI-Wnn.
+*/
+       (mode))
+{
+  int   snum;
+  unsigned long vmask = 0;
+  struct wnn_henkan_env henv;
+  if ((snum = check_wnn_server_type()) == -1) return Qnil;
+  if(!wnnfns_buf[snum]) return Qnil;
+  vmask |= WNN_ENV_COMPLEX_CONV_MASK;
+  henv.complex_flag = (mode == Qnil) ? False : True;
+  if(jl_set_henkan_env(wnnfns_buf[snum],
+                       vmask,
+                       &henv) < 0) return Qnil;
+  return Qt;
+}
+
+DEFUN ("wnn-server-set-okuri-learn-mode", Fwnn_okuri_learn, 1, 1, 0, /*
+For FI-Wnn.
+*/
+       (mode))
+{
+  int   snum;
+  unsigned long vmask = 0;
+  struct wnn_henkan_env henv;
+  if ((snum = check_wnn_server_type()) == -1) return Qnil;
+  if(!wnnfns_buf[snum]) return Qnil;
+  vmask |= WNN_ENV_OKURI_LEARN_MASK;
+  henv.okuri_learn_flag = (mode == Qnil) ? False : True;
+  if(jl_set_henkan_env(wnnfns_buf[snum],
+                       vmask,
+                       &henv) < 0) return Qnil;
+  return Qt;
+}
+
+DEFUN ("wnn-server-set-okuri-flag", Fwnn_okuri_flag, 1, 1, 0, /*
+For FI-Wnn.
+*/
+       (mode))
+{
+  int   snum;
+  unsigned long vmask = 0;
+  struct wnn_henkan_env henv;
+  CHECK_INT (mode);
+  if ((snum = check_wnn_server_type()) == -1) return Qnil;
+  if(!wnnfns_buf[snum]) return Qnil;
+  if(mode != WNN_OKURI_REGULATION &&
+     mode != WNN_OKURI_NO &&
+     mode != WNN_OKURI_YES)
+      return Qnil;
+  else
+      henv.okuri_flag = mode;
+  vmask |= WNN_ENV_OKURI_MASK;
+  if(jl_set_henkan_env(wnnfns_buf[snum],
+                       vmask,
+                       &henv) < 0) return Qnil;
+  return Qt;
+}
+
+DEFUN ("wnn-server-set-prefix-learn-mode", Fwnn_prefix_learn, 1, 1, 0, /*
+For FI-Wnn.
+*/
+       (mode))
+{
+  int   snum;
+  unsigned long vmask = 0;
+  struct wnn_henkan_env henv;
+  if ((snum = check_wnn_server_type()) == -1) return Qnil;
+  if(!wnnfns_buf[snum]) return Qnil;
+  vmask |= WNN_ENV_PREFIX_LEARN_MASK;
+  henv.prefix_learn_flag = (mode == Qnil) ? False : True;
+  if(jl_set_henkan_env(wnnfns_buf[snum],
+                       vmask,
+                       &henv) < 0) return Qnil;
+  return Qt;
+}
+
+DEFUN ("wnn-server-set-prefix-flag", Fwnn_prefix_flag, 1, 1, 0, /*
+For FI-Wnn.
+*/
+       (mode))
+{
+  int   snum;
+  unsigned long vmask = 0;
+  struct wnn_henkan_env henv;
+  CHECK_INT (mode);
+  if ((snum = check_wnn_server_type()) == -1) return Qnil;
+  if(!wnnfns_buf[snum]) return Qnil;
+  if(mode != WNN_KANA_KOUHO && mode != WNN_KANJI_KOUHO)
+      return Qnil;
+  else
+      henv.prefix_flag = mode;
+  vmask |= WNN_ENV_PREFIX_MASK;
+  if(jl_set_henkan_env(wnnfns_buf[snum],
+                       vmask,
+                       &henv) < 0) return Qnil;
+  return Qt;
+}
+
+DEFUN ("wnn-server-set-suffix-learn-mode", Fwnn_suffix_learn, 1, 1, 0, /*
+For FI-Wnn.
+*/
+       (mode))
+{
+  int   snum;
+  unsigned long vmask = 0;
+  struct wnn_henkan_env henv;
+  if ((snum = check_wnn_server_type()) == -1) return Qnil;
+  if(!wnnfns_buf[snum]) return Qnil;
+  vmask |= WNN_ENV_SUFFIX_LEARN_MASK;
+  henv.suffix_learn_flag = (mode == Qnil) ? False : True;
+  if(jl_set_henkan_env(wnnfns_buf[snum],
+                       vmask,
+                       &henv) < 0) return Qnil;
+  return Qt;
+}
+
+DEFUN ("wnn-server-set-common-learn-mode", Fwnn_common_learn, 1, 1, 0, /*
+For FI-Wnn.
+*/
+       (mode))
+{
+  int   snum;
+  unsigned long vmask = 0;
+  struct wnn_henkan_env henv;
+  if ((snum = check_wnn_server_type()) == -1) return Qnil;
+  if(!wnnfns_buf[snum]) return Qnil;
+  vmask |= WNN_ENV_COMMON_LAERN_MASK;
+  henv.common_learn_flag = (mode == Qnil) ? False : True;
+  if(jl_set_henkan_env(wnnfns_buf[snum],
+                       vmask,
+                       &henv) < 0) return Qnil;
+  return Qt;
+}
+
+DEFUN ("wnn-server-set-freq-func-mode", Fwnn_freq_func, 1, 1, 0, /*
+For FI-Wnn.
+*/
+       (mode))
+{
+  int   snum;
+  unsigned long vmask = 0;
+  struct wnn_henkan_env henv;
+  CHECK_INT (mode);
+  if ((snum = check_wnn_server_type()) == -1) return Qnil;
+  if(!wnnfns_buf[snum]) return Qnil;
+  if(mode != 0 && mode != 1 && mode != 2 && mode != 3 && mode != 4)
+      return Qnil;
+  else
+      henv.freq_func_flag = mode;
+  vmask |= WNN_ENV_FREQ_FUNC_MASK;
+  if(jl_set_henkan_env(wnnfns_buf[snum],
+                       vmask,
+                       &henv) < 0) return Qnil;
+  return Qt;
+}
+
+DEFUN ("wnn-server-set-numeric-mode", Fwnn_numeric, 1, 1, 0, /*
+For FI-Wnn.
+*/
+       (mode))
+{
+  int   snum;
+  unsigned long vmask = 0;
+  struct wnn_henkan_env henv;
+  CHECK_INT (mode);
+  if ((snum = check_wnn_server_type()) == -1) return Qnil;
+  if(!wnnfns_buf[snum]) return Qnil;
+  if(mode != WNN_NUM_KANSUUJI &&
+     mode != WNN_NUM_KANOLD &&
+     mode != WNN_NUM_HANCAN &&
+     mode != WNN_NUM_ZENCAN &&
+     mode != WNN_NUM_HAN &&
+     mode != WNN_NUM_ZEN &&
+     mode != WNN_NUM_KAN)
+      return Qnil;
+  else
+      henv.numeric_flag = mode;
+  vmask |= WNN_ENV_NUMERIC_MASK;
+  if(jl_set_henkan_env(wnnfns_buf[snum],
+                       vmask,
+                       &henv) < 0) return Qnil;
+  return Qt;
+}
+
+DEFUN ("wnn-server-set-alphabet-mode", Fwnn_alphabet, 1, 1, 0, /*
+For FI-Wnn.
+*/
+       (mode))
+{
+  int   snum;
+  unsigned long vmask = 0;
+  struct wnn_henkan_env henv;
+  CHECK_INT (mode);
+  if ((snum = check_wnn_server_type()) == -1) return Qnil;
+  if(!wnnfns_buf[snum]) return Qnil;
+  if(mode != WNN_ALP_HAN && mode != WNN_ALP_ZEN)
+      return Qnil;
+  else
+      henv.alphabet_flag = mode;
+  vmask |= WNN_ENV_ALPHABET_MASK;
+  if(jl_set_henkan_env(wnnfns_buf[snum],
+                       vmask,
+                       &henv) < 0) return Qnil;
+  return Qt;
+}
+
+DEFUN ("wnn-server-set-symbol-mode", Fwnn_symbol, 1, 1, 0, /*
+For FI-Wnn.
+*/
+       (mode))
+{
+  int   snum;
+  unsigned long vmask = 0;
+  struct wnn_henkan_env henv;
+  CHECK_INT (mode);
+  if ((snum = check_wnn_server_type()) == -1) return Qnil;
+  if(!wnnfns_buf[snum]) return Qnil;
+  if(mode != WNN_KIG_HAN && mode != WNN_KIG_JIS && mode != WNN_KIG_ASC)
+      return Qnil;
+  else
+      henv.symbol_flag = mode;
+  vmask |= WNN_ENV_SYMBOL_MASK;
+  if(jl_set_henkan_env(wnnfns_buf[snum],
+                       vmask,
+                       &henv) < 0) return Qnil;
+  return Qt;
+}
+
+DEFUN ("wnn-server-set-yuragi-mode", Fwnn_yuragi, 1, 1, 0, /*
+For FI-Wnn.
+*/
+       (mode))
+{
+  int   snum;
+  unsigned long vmask = 0;
+  struct wnn_henkan_env henv;
+  if ((snum = check_wnn_server_type()) == -1) return Qnil;
+  if(!wnnfns_buf[snum]) return Qnil;
+  vmask |= WNN_ENV_YURAGI_MASK;
+  henv.yuragi_flag = (mode == Qnil) ? False : True;
+  if(jl_set_henkan_env(wnnfns_buf[snum],
+                       vmask,
+                       &henv) < 0) return Qnil;
+  return Qt;
+}
+
+DEFUN ("wnn-reset-previous-info", Fwnn_reset_prev, 0, 0, 0, /*
+For FI-Wnn.
+*/
+       ())
+{
+    int   snum;
+    if ((snum = check_wnn_server_type()) == -1) return Qnil;
+    if(!wnnfns_buf[snum]) return Qnil;
+    if(jl_reset_prev_bun(wnnfns_buf[snum]) < 0) return Qnil;
+    return Qt;
+}
+#endif	/* Wnn6 */
+
+DEFUN ("wnn-server-version", Fwnn_version, 0, 0, 0, /*
+Returns Wnn server version ID.
+*/
+       ())
+{
+    int   snum;
+    int   serv;
+    int   libv;
+    struct wnn_env *cur_env;
+    if ((snum = check_wnn_server_type()) == -1) return Qnil;
+    if(!wnnfns_buf[snum]) return Qnil;
+    if(wnnfns_norm)
+      cur_env = wnnfns_env_norm[snum];
+    else
+      cur_env = wnnfns_env_rev[snum];
+    if(js_version (cur_env->js_id,&serv,&libv) < 0) return Qnil;
+    return make_int (serv);
+}
+
+DEFUN ("wnn-server-hinsi-number", Fwnn_hinsi_number, 1, 1, 0, /*
+For Wnn.
+*/
+       (name))
+{
+  w_char		w_buf[256];
+  int		no;
+  int	snum;
+  CHECK_STRING (name);
+  if ((snum = check_wnn_server_type ()) == -1) return Qnil;
+  if (!wnnfns_buf[snum]) return Qnil;
+  m2w (XSTRING (name)->data, w_buf);
+  if ((no = jl_hinsi_number (wnnfns_buf[snum], w_buf)) < 0) return Qnil;
+  return make_int (no);
+}
+
+void
+syms_of_mule_wnn (void)
+{
+  DEFSUBR (Fwnn_open);
+  DEFSUBR (Fwnn_close);
+  DEFSUBR (Fwnn_dict_add);
+  DEFSUBR (Fwnn_dict_delete);
+  DEFSUBR (Fwnn_dict_list);
+  DEFSUBR (Fwnn_dict_comment);
+  DEFSUBR (Fwnn_set_rev);
+  DEFSUBR (Fwnn_begin_henkan);
+  DEFSUBR (Fwnn_zenkouho);
+  DEFSUBR (Fwnn_get_zenkouho);
+  DEFSUBR (Fwnn_zenkouho_bun);
+  DEFSUBR (Fwnn_zenkouho_suu);
+  DEFSUBR (Fwnn_dai_top);
+  DEFSUBR (Fwnn_dai_end);
+  DEFSUBR (Fwnn_kakutei);
+  DEFSUBR (Fwnn_bunsetu_henkou);
+  DEFSUBR (Fwnn_inspect);
+  DEFSUBR (Fwnn_quit_henkan);
+  DEFSUBR (Fwnn_bunsetu_kanji);
+  DEFSUBR (Fwnn_bunsetu_yomi);
+  DEFSUBR (Fwnn_bunsetu_suu);
+  DEFSUBR (Fwnn_hindo_update);
+  DEFSUBR (Fwnn_word_toroku);
+  DEFSUBR (Fwnn_word_sakujo);
+  DEFSUBR (Fwnn_word_use);
+  DEFSUBR (Fwnn_word_info);
+  DEFSUBR (Fwnn_hindo_set);
+  DEFSUBR (Fwnn_dict_search);
+  DEFSUBR (Fwnn_dict_save);
+  DEFSUBR (Fwnn_get_param);
+  DEFSUBR (Fwnn_set_param);
+  DEFSUBR (Fwnn_get_msg);
+  DEFSUBR (Fwnn_fuzokugo_set);
+  DEFSUBR (Fwnn_fuzokugo_get);
+  DEFSUBR (Fwnn_isconnect);
+  DEFSUBR (Fwnn_hinsi_dicts);
+  DEFSUBR (Fwnn_hinsi_list);
+  DEFSUBR (Fwnn_hinsi_name);
+  DEFSUBR (Fwnn_hinsi_number);
+#ifdef	WNN6
+  DEFSUBR (Fwnn_fisys_dict_add);
+  DEFSUBR (Fwnn_fiusr_dict_add);
+  DEFSUBR (Fwnn_notrans_dict_add);
+  DEFSUBR (Fwnn_bmodify_dict_add);
+  DEFSUBR (Fwnn_last_is_first);
+  DEFSUBR (Fwnn_complex_conv);
+  DEFSUBR (Fwnn_okuri_learn);
+  DEFSUBR (Fwnn_okuri_flag);
+  DEFSUBR (Fwnn_prefix_learn);
+  DEFSUBR (Fwnn_prefix_flag);
+  DEFSUBR (Fwnn_suffix_learn);
+  DEFSUBR (Fwnn_common_learn);
+  DEFSUBR (Fwnn_freq_func);
+  DEFSUBR (Fwnn_numeric);
+  DEFSUBR (Fwnn_alphabet);
+  DEFSUBR (Fwnn_symbol);
+  DEFSUBR (Fwnn_yuragi);
+  DEFSUBR (Fwnn_reset_prev);
+#endif	/* Wnn6 */
+  DEFSUBR (Fwnn_version);
+
+  defsymbol (&Qjserver, "jserver");
+  defsymbol (&Qcserver, "cserver");
+  /* defsymbol (&Qtserver, "tserver"); */
+  defsymbol (&Qkserver, "kserver");
+
+  defsymbol (&Qwnn_no_uniq, "wnn-no-uniq");
+  defsymbol (&Qwnn_uniq, "wnn-uniq");
+  defsymbol (&Qwnn_uniq_kanji, "wnn-uniq-kanji");
+}
+
+void
+vars_of_mule_wnn (void)
+{
+  int i;
+
+  DEFVAR_INT ("lb-sisheng", &lb_sisheng /*
+Leading character for Sisheng.
+*/ );
+  DEFVAR_LISP ("wnn-server-type", &Vwnn_server_type /*
+*jserver, cserver ..
+*/ );
+  DEFVAR_LISP ("cwnn-zhuyin", &Vcwnn_zhuyin /*
+*pinyin or zhuyin
+*/ );
+  DEFVAR_LISP ("wnnenv-sticky", &Vwnnenv_sticky /*
+*If non-nil, make environment sticky
+*/ );
+  DEFVAR_LISP ("wnn-uniq-level", &Vwnn_uniq_level /*
+*Uniq level
+*/ );
+
+  Vwnn_server_type = Qjserver;
+  Vcwnn_zhuyin = Qnil;
+  Vwnnenv_sticky = Qnil;
+
+  Vwnn_uniq_level = Qwnn_uniq;
+
+  for (i = 0; i < NSERVER; i++)
+    {
+      wnnfns_buf[i] = (struct wnn_buf *) 0;
+      wnnfns_env_norm[i] = (struct wnn_env *) 0;
+      wnnfns_env_rev[i] = (struct wnn_env *) 0;
+    }
+}
+
+void
+w2m (w_char *wp, unsigned char *mp, unsigned char lb)
+{
+  w_char	wc;
+  w_char	pzy[10];
+  int		i, len;
+
+  while (wc = *wp++)
+    {
+      switch (wc & 0x8080)
+	{
+	case 0x80:
+	  if (Vwnn_server_type == Qcserver)
+	    {
+	      len = cwnn_yincod_pzy (pzy, wc,
+				     (Vcwnn_zhuyin == Qnil)
+				     ? CWNN_PINYIN
+				     : CWNN_ZHUYIN);
+	      for (i = 0; i < len; i++)
+		{
+		  if (pzy[i] & 0x80)
+		    {
+		      *mp++ = LEADING_BYTE_PRV11;
+		      *mp++ = lb_sisheng;
+		    }
+		  *mp++ = pzy[i];
+		}
+	    }
+	  else
+	    {
+	      *mp++ = LEADING_BYTE_KANA;
+	      *mp++ = (wc & 0xff);
+	    }
+	  break;
+	case 0x8080:
+	  *mp++ = lb;
+	  *mp++ = (wc & 0xff00) >> 8;
+	  *mp++ = wc & 0x00ff;
+	  break;
+	case 0x8000:
+	  if (lb == LEADING_BYTE_JP)
+	    *mp++ = LEADING_BYTE_JP2;
+	  else if (lb == LEADING_BYTE_BIG5_1)
+	    *mp++ = LEADING_BYTE_BIG5_2;
+	  else
+	    *mp++ = lb;
+	  *mp++ = (wc & 0xff00) >> 8;
+	  *mp++ = wc & 0x00ff | 0x80;
+	  break;
+	default:
+	  *mp++ = wc & 0x00ff;
+	  break;
+	}
+    }
+  *mp = 0;
+}
+
+void
+m2w (unsigned char *mp, w_char *wp)
+{
+  unsigned int ch;
+  
+  while (ch = *mp++)
+    {
+      if (BUFBYTE_ASCII_P (ch))
+	{
+	  *wp++ = ch;
+	}
+      else if (BUFBYTE_LEADING_BYTE_P (ch))
+	{
+	  switch (ch)
+	    {
+	    case LEADING_BYTE_KANA:
+	      *wp++ = *mp++; break;
+	    case LEADING_BYTE_ROMAN:
+	      *wp++ = *mp++ & 0x7F; break;
+	    case LEADING_BYTE_JPOLD:
+	    case LEADING_BYTE_CN:
+	    case LEADING_BYTE_JP:
+	    case LEADING_BYTE_KR:
+	      /* case LEADING_BYTE_TW: */
+	      ch = *mp++;
+	      *wp++ = (ch << 8) | *mp++;
+	      break;
+	    case LEADING_BYTE_JP2:
+	      ch = *mp++;
+	      *wp++ = (ch << 8) | (*mp++ & 0x7f);
+	      break;
+	    case LEADING_BYTE_PRV11:
+	      ch = *mp++;
+	      if (ch == lb_sisheng)
+		*wp++ = 0x8e80 | *mp++;
+	      else
+		mp++;
+	      break;
+	    default:			/* ignore this character */
+	      mp += mule_charset_bytes[ch] - 1;
+	    }
+	}
+    }
+  *wp = 0;
+}
+
+void
+_xp (int x)
+{
+  printf ("%x\n", x); fflush (stdout);
+}
+
+void
+w2y (w_char *w)
+{
+  unsigned long		pbuf[5000], ybuf[5000];
+  unsigned long		*pin;
+  w_char *y;
+  int len;
+
+  pin = pbuf;
+  y = w;
+  while (1)
+    {
+      if (*w == 0)
+	{*pin =0; break;}
+      else	       *pin = *w;
+      w++; pin++;
+    }
+  len = cwnn_pzy_yincod (ybuf, pbuf,
+			 (Vcwnn_zhuyin == Qnil) ? CWNN_PINYIN : CWNN_ZHUYIN);
+  if (len <= 0)
+    return;
+
+  pin = ybuf;
+  while (1)
+    {
+      if (*pin == 0 || len == 0)
+	{*y = 0;break;}
+      *y = *pin;
+      y++; pin++; len--;
+    }
+}
+
+void
+c2m (unsigned char *cp, unsigned char *mp, unsigned char lb)
+{
+  unsigned char		ch;
+  while (ch = *cp)
+    {
+      if (ch & 0x80)
+	{
+	  *mp++ = lb;
+	  *mp++ = *cp++;
+	}
+      *mp++ = *cp++;
+    }
+  *mp = 0;
+}
+
+int
+dai_end (int no, int server)
+{
+  for (no++; no < jl_bun_suu (wnnfns_buf[server])
+	       && !jl_dai_top (wnnfns_buf[server], no); no++);
+  return (no);
+}
+
+static int
+yes_or_no (unsigned char *s)
+{
+  extern Lisp_Object	Fy_or_n_p ();
+  unsigned char		mbuf[512];
+  unsigned char		lb;
+  int			len;
+  int			snum;
+  if ((snum  = check_wnn_server_type ()) == -1) return 0;
+  lb = lb_wnn_server_type[snum];
+  /* if no message found, create file without query */
+/*  if (wnn_msg_cat->msg_bd == 0) return 1;*/
+  if (*s == 0) return 1;
+  c2m (s, mbuf, lb);
+  /* truncate "(Y/N)" */
+  for (len = 0; (mbuf[len]) && (len < 512); len++);
+  for (; (mbuf[len] != '(') && (len > 0); len--);
+  if (Fy_or_n_p (make_string (mbuf, len)) == Qnil) return 0;
+  else return (1);
+}
+
+static void
+puts2 (char *s)
+{
+  Lisp_Object		args[1];
+  char			mbuf[512];
+  unsigned char		lb;
+  extern Lisp_Object 	Fmessage ();
+  int			snum;
+  if ((snum = check_wnn_server_type ()) == -1) return;
+  lb = lb_wnn_server_type[snum];
+  c2m (s, mbuf, lb);
+  args[0] = make_string (mbuf, strlen (mbuf));
+  Fmessage (1, args);
+}
+
+int
+check_wnn_server_type (void)
+{
+  if (Vwnn_server_type == Qjserver)
+    {
+      return WNNSERVER_J;
+    }
+  else if (Vwnn_server_type == Qcserver)
+    {
+      return WNNSERVER_C;
+    }
+  /* else if (Vwnn_server_type == Qtserver)
+     {
+     return WNNSERVER_T;
+     } */
+  else if (Vwnn_server_type == Qkserver)
+    {
+      return WNNSERVER_K;
+    }
+  else return -1;
+}