changeset 0:92745d501b9a

initial import from kinput2-v3.1
author Yoshiki Yazawa <yaz@honeyplanet.jp>
date Mon, 08 Mar 2010 04:44:30 +0900
parents
children 31f1de16683a
files Imakefile Kinput2.conf NEWS README ccdef/Imakefile ccdef/ccdef.kinput2 ccdef/ccdef.kinput2.egg ccdef/rule.eggfunc ccdef/rule.func ccdef/rule.greek ccdef/rule.hiragana.egg ccdef/rule.kana ccdef/rule.kana2 ccdef/rule.katakana.egg ccdef/rule.kigou.egg ccdef/rule.roma ccdef/rule.wnnroma ccdef/rule.zascii client/README client/convlib.c cmd/Imakefile cmd/Kinput2.ad cmd/kinput2.c cmd/kinput2.man doc/ccdef doc/classes doc/defaultkeys doc/defkeys.wnn doc/problems doc/protocol doc/resources doc/sj3def doc/sj3guide.ps doc/sj3guide.tex include/AdoptedShP.h include/AdoptedShe.h include/AsyncErr.h include/Atok.h include/AtokP.h include/AuxPanel.h include/AuxPanelP.h include/CachedAtom.h include/CachedFont.h include/CandPanel.h include/CandPanelP.h include/Canna.h include/CannaP.h include/Canvas.h include/CanvasP.h include/CanvasSheP.h include/CanvasShel.h include/CcWnn.h include/CcWnnP.h include/ConvCtrl.h include/ConvCtrlP.h include/ConvDisp.h include/ConvDispP.h include/ConvMgr.h include/ConvMgrP.h include/ConvProto.h include/DebugPrint.h include/FontBank.h include/ICLabel.h include/ICLabelP.h include/ICtypes.h include/IMProto.h include/IMProtoP.h include/IOECall.h include/InputConv.h include/InputConvP.h include/KIFontSet.h include/KIProto.h include/KIProtoP.h include/LocalAlloc.h include/MyDispatch.h include/OffConv.h include/OffConvP.h include/OnConv.h include/OnConvP.h include/OverConv.h include/OverConvP.h include/ParseKey.h include/Sj3.h include/Sj3P.h include/WStr.h include/WcharDisp.h include/WcharDispP.h include/XIMProto.h include/XWStr.h include/Xatoklib.h include/XimpProto.h include/XimpProtoP.h include/Xsj3clib.h include/cconv.h include/wnnlib.h lib/AdoptedShe.c lib/Atok.c lib/AuxPanel.c lib/CandPanel.c lib/Canna.c lib/Canvas.c lib/CanvasShel.c lib/CcWnn.c lib/ConvCtrl.c lib/ConvDisp.c lib/ConvMgr.c lib/ICLabel.c lib/IMProto.c lib/Imakefile lib/InputConv.c lib/KIProto.c lib/OffConv.c lib/OnConv.c lib/OverConv.c lib/Sj3.c lib/WcharDisp.c lib/Xatoklib/Imakefile lib/Xatoklib/README lib/Xatoklib/aux.c lib/Xatoklib/buffer.c lib/Xatoklib/compstr.c lib/Xatoklib/event.c lib/Xatoklib/if.c lib/Xatoklib/key.c lib/Xatoklib/key_def.h lib/Xatoklib/misc.c lib/Xatoklib/segment.c lib/Xatoklib/sysline.c lib/XimpProto.c lib/Xsj3clib/Imakefile lib/Xsj3clib/buffer.c lib/Xsj3clib/candidate.c lib/Xsj3clib/code.c lib/Xsj3clib/common.h lib/Xsj3clib/connect.c lib/Xsj3clib/conv.c lib/Xsj3clib/dict.c lib/Xsj3clib/func.c lib/Xsj3clib/func.h lib/Xsj3clib/libif.c lib/Xsj3clib/mode.c lib/Xsj3clib/mode.h lib/Xsj3clib/segment.c lib/Xsj3clib/segment.h lib/Xsj3clib/sj3ctype.c lib/Xsj3clib/sj3ctype.h lib/Xsj3clib/sjrc.c lib/Xsj3clib/symbol.c lib/Xsj3clib/table.c lib/Xsj3clib/table.h lib/Xsj3clib/util.c lib/Xsj3clib/util.h lib/asyncerr.c lib/cachedatom.c lib/cachedfont.c lib/cconv.c lib/ctext.c lib/dispatch.c lib/fontbank.c lib/fontset.c lib/imlib/Imakefile lib/imlib/im.h lib/imlib/imattr.c lib/imlib/imbuf.c lib/imlib/imbuf.h lib/imlib/imconst.h lib/imlib/imconv.c lib/imlib/imdata.c lib/imlib/imdispatch.c lib/imlib/imfuncs.h lib/imlib/imic.c lib/imlib/improto.c lib/imlib/imprtype.h lib/imlib/imreq.h lib/imlib/imrequest.c lib/imlib/imxport.c lib/imlib/imxport.h lib/ioecall.c lib/parsekey.c lib/wnnlib.c lib/wstring.c lib/xtwstr.c lib/xwstr.c patchlevel.h sj3def/Imakefile sj3def/jcode.c sj3def/sjhk.EUC sj3def/sjrc.EUC sj3def/sjrc.iroha.EUC sj3def/sjrc.sjx.EUC sj3def/sjrk.EUC sj3def/sjrk.iroha.EUC sj3def/sjrk.sjx.EUC sj3def/sjsb.EUC sj3def/sjzh.EUC
diffstat 195 files changed, 84644 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Imakefile	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,21 @@
+/*
+ *	Imakefile for kinput2
+ */
+
+#include "Kinput2.conf"
+
+#define IHaveSubdirs
+#define PassCDebugFlags 'CDEBUGFLAGS=$(CDEBUGFLAGS)'
+
+/*
+ * maybe you should set TOP to make xmkmf work correctly
+ */
+/*     TOP = ../../../xc */
+
+SUBDIRS = lib cmd ccdef sj3def
+
+XCOMM for debug...
+XCOMM CDEBUGFLAGS = -g -DDEBUG
+
+MakeSubdirs($(SUBDIRS))
+DependSubdirs($(SUBDIRS))
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Kinput2.conf	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,157 @@
+XCOMM
+XCOMM Kinput2 global configuration parameters
+XCOMM
+/*
+ * Before editing following parameters, you should read 
+ * README file.
+ */
+
+/**
+ ** Conversion system configuration:
+ **	Kinput2 supports 4 conversion systems, Wnn, Canna, Sj3 and Atok.
+ **	In order to install and use kinput2, you have to compile and
+ **	install at least one of them.  If you select more than one
+ **	conversion system, you can choose one at run time with a
+ **	command line option.
+ **/
+
+/* #define UseWnn */	/* define if you are going to use Wnn (v4, v6 or v7) */
+/* #define UseWnn6 */	/* define if you are going to use Wnn6 or above */
+#define UseCanna	/* define if you are going to use Canna */
+#define UseSj3		/* define if you are going to use Sj3 */
+/* #define UseAtok */	/* define if you are going to use Atok */
+
+
+XCOMM Wnn configuration
+/*
+ * If you define UseWnn, set following 3 variables:
+ *
+ *	WNNINCDIR: Wnn include file directory
+ *	WNNLIB: Wnn client-side library
+ *	CCDEF_DIR: directory where character conversion rule
+ *		   definition files are to be installed
+ *
+ * You have to define WnnLibDir if Wnn4 configuration files
+ * are not installed in /usr/local/lib/wnn (which is the default).
+ */
+/* #define WnnLibDir /some/peculiar/directory/wnn */
+
+/* for convenience.. */
+#if defined(UseWnn6) && !defined(UseWnn)
+#define UseWnn
+#endif
+
+CCDEF_DIR = $(LIBDIR)/ccdef
+
+/*
+ * If you have installed Wnn..
+ *
+ * First check the directory where Wnn header files has been installed.
+ * Note that if you installed Wnn4 configuration files in a directory
+ * other than the default (/usr/local/lib/wnn), you have to define
+ * WnnLibDir above.
+ */
+XCOMM use installed header files
+XCOMM WNNINCDIR = /usr/X11R6/include/wnn
+XCOMM use installed library
+XCOMM WNNLIB = -lwnn
+
+/*
+ * Or, use library in the source tree..
+ */
+XCOMM use library in the source tree
+WNNSRC = $(CONTRIBSRC)/programs/Xsi/Wnn
+WNNINCDIR = $(WNNSRC)/include
+WNNLIB = $(WNNSRC)/jlib/libwnn.a
+
+
+XCOMM Canna configuration
+/*
+ * If you define UseCanna, set following 2 variables:
+ *	CANNASRC: Canna source directory (or directory of installed headers)
+ *	CANNALIB: Canna user library
+ * Note that kinput2 no longer supports Canna version 1.x,
+ * which came with X11R5.  Use the new version in R6 contrib.
+ */
+
+/*
+ * If you have already installed Canna header files and libraries..
+ */
+XCOMM use installed headers/libraries
+XCOMM CANNAINSTDIR = /usr/local/canna
+XCOMM CANNASRC = $(CANNAINSTDIR)/include
+XCOMM CANNALIB = -lcanna16
+
+/*
+ * If you have compiled Canna that came with X11R6 (contrib/programs/Canna),
+ * but not installed yet..
+ */
+XCOMM use headers/libraries in the source tree
+CANNASRC = $(CONTRIBSRC)/programs/Canna32
+CANNALIB = -L$(CANNASRC)/lib/canna16 -lcanna16
+
+
+XCOMM SJ3 configuration
+/*
+ * If you define UseSj3, set following 3 variables:
+ *	SJ3SRC: Sj3 source directory
+ *	SJ3LIB: Sj3 user library
+ *	SJ3DEF_DIR: directory where conversion rule
+ *		   definition files are to be installed
+ */
+
+SJ3DEF_DIR = $(LIBDIR)/sj3def
+
+/*
+ * If you have installed SJ3 library and header file,
+ * or your machine is Sony NEWS, on which SJ3 is
+ * already installed..
+ * (in this case, you don't have to care about SJ3SRC)
+ */
+XCOMM use installed header/library
+XCOMM specify the directory where libsj3.h resides as SJ3SRC.
+XCOMM SJ3SRC = /usr/local/include
+XCOMM SJ3LIB = -lsj3lib
+
+/*
+ * Use compiled library in the source tree..
+ */
+XCOMM use library in the source tree
+SJ3SRC = $(CONTRIBSRC)/programs/sj3
+SJ3LIB = $(SJ3SRC)/sj3lib/libsj3lib.a
+
+
+XCOMM Atok configuration
+/*
+ * If you define UseAtok, set following 2 variables:
+ *	ATOKINCDIR: Atok include file directory (if atok.h is there)
+ *	ATOKLIBDIR: Atok client-side library directory
+ */
+
+/*
+ * If you have already installed Atok header files and libraries..
+ */
+XCOMM use installed headers/libraries
+XCOMM ATOKINCDIR = /usr/include/atok
+XCOMM ATOKLIBDIR = /usr/jp/lib
+ATOKLIB = -latok12n -latok12util
+
+
+/**
+ ** Transport configuration:
+ **	Kinput2 X Input Method Protocol handler supports
+ **	3 transports, X, TCP and local (UNIX domain).
+ **	If your system does not support any of these,
+ **	add appropriate flag(s) to TRANSPORTDEFS.
+ **
+ **	-DNO_UNIX_TRANSPORT	-- if UNIX domain transport is not available
+ **	-DNO_TCP_TRANSPORT	-- if TCP/IP transport is not available
+ **	-DNO_X_TRANSPORT	-- if X transport is not available (unlikely)
+ **/
+XCOMM transport configuration
+
+TRANSPORTDEFS = 
+
+XCOMM
+XCOMM End of global configuration parameters
+XCOMM
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/NEWS	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,78 @@
+Major changes from version 3.0 to 3.1:
+
+* Kinput2 now supports ATOK.  The source code is kindly contributed
+  by Justsystem Corporation.  Thanks!
+  To compile for Atok, define symbol `UseAtok' in Kinput2.conf.
+
+* Minimum support of Wnn7 is implemented.
+
+* Two IC attributes, XNPreeditState and XNResetState both of which
+  are introduced by X11R6, are supported.
+
+* Kinput2's `egg'-emulation is improved.
+
+* A workaround for bugs in some Xlib implementations has been added.
+
+* Previously, when kinput2 cannot connect to jserver, kinput2 seems
+  to be frozen (actually it keeps retrying).  Now kinput2 beeps and
+  ends conversion in such a case.  The next time you start conversion,
+  it tries to connect again.
+
+
+Major changes from version 2.0 fix4 (the last official release) to
+version 3.0:
+
+* Kinput2 now supports Wnn6.  The source code is kindly contributed by
+  MORIBE, Hideyuki.  Thanks!  To compile for Wnn6, define symbol
+  `UseWnn6' in Kinput2.conf.
+
+  For those who use both Wnn4 and Wnn6, distinct wnn initialization
+  files (wnnenvrc) for Wnn4 jserver and Wnn6 jserver can be specified.
+  Kinput2 checks the server version at run time, and selects an
+  appropriate one.  Use `*.wnnEnvrc4' resource for specifying
+  initialization file for Wnn4, `*.wnnEnvrc6' for Wnn6.
+
+  Due to Wnn6 support, Wnn4 implementation part saw major changes.
+  We've tried to keep user visible changes small, though.
+
+* On-the-spot input style is available for Ximp and XIM protocols.
+  The code is contributed by Kazuki YASUMATSU.  Thank you!
+  For XIM protocol, following styles are now supported:
+  	XIMPreeditPosition | XIMStatusArea (over-the-spot style)
+  	XIMPreeditPosition | XIMStatusNothing (over-the-spot style)
+  	XIMPreeditArea | XIMStatusArea (off-the-spot style)
+	XIMPreeditCallbacks | XIMStatusCallbacks (on-the-spot style)
+	XIMPreeditCallbacks | XIMStatusNothing (on-the-spot style)
+	XIMPreeditNothing | XIMStatusNothing (root-window style)
+
+* Kinput2 now supports an IC attribute called FilterEvents.  Some
+  applications seem to require the input server to support this
+  attribute, or they go crazy if not.
+
+* Finally, word registration facility is available for Wnn.  A new
+  fuction called `register' is added, and bound to F5 and ^T by
+  default. (If you're using ccdef.kinput2.egg, that's F4) This
+  function is supposed to invoke word registration utility called
+  `tkwnnreg'.  You need a separate package for the utility, currently
+  available from:
+	ftp://ftp.sra.co.jp/pub/lang/tcl/contrib/tcl-wnn-X.Y.tar.gz
+  X.Y is 0.3 as of this writing.  It is still alpha-quality, but I'll
+  work on it once I finish release work of kinput2.
+
+* Kinput2's `egg'-emulation has been improved.
+
+* You can specify preedit font and status font independently when XIM
+  protocol is used.  Previously preedit font was used for both preedit
+  area and status area.
+
+* Now kinput2's mode shell (the small status window appeared when
+  over-the-spot input is active) has Mwm hints that says "I need no
+  titlebar".
+
+* A new boolean resource `useOverrideShellForMode' is provided to use
+  overrideShell for the mode displaying widget, instead of the default
+  transientShell.  This is needed for some window managers which
+  ignores kinput2's input focus preference, causing flickering of mode
+  display.
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/README	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,181 @@
+
+			kinput2 version 3.1
+
+	-- an input server for easy input of Japanese text --
+
+
+Kinput2 is an input server for X11 applications that want Japanese
+text input.
+
+A client that wants kana-kanji conversion service for Japanese text
+sends a request to kinput2.  Kinput2 receives the request, does
+kana-kanji conversion, and sends the converted text back to the
+client.
+
+
+* Kinput2 Features
+
+    Upward-Compatible with Kinput:
+	Kinput2 is fully upward-compatible with kinput, which was
+	contributed to X11R4. Applications using kinput to input
+	Japanese can also use kinput2 without any modification.
+
+    Multiple Input Style:
+	Kinput2 supports 4 input styles: root-window, off-the-spot,
+	over-the-spot and on-the-spot.
+
+    Multiple Protocol:
+	There are several protocols which define how the communication
+	between input server and clients should be done.  Kinput2
+	implements following protocols:
+
+		* kinput protocol
+		* kinput2 protocol
+		* Matsushita's jinput protocol
+		* Sony's xlc protocol
+		* XIMP protocol (X11R5 Ximp implementation)
+		* X Input Method Protocol (X11R6 standard)
+
+	If a client can speak at least one of them, the client can
+	communicate with kinput2 and get Japanese text.
+
+	The support of X Input Method Protocol is not yet fully tested
+	and might have many bugs.
+
+    Multiple Conversion Engine:
+	Kinput2 doesn't do actual kana-kanji conversion itself.  There
+	are several conversion servers available, so kinput2 uses them
+	as its conversion engine.  Kinput2 can connect to the
+	following servers:
+
+		* Wnn jserver (version 4, 6 or 7)
+		* Canna cannaserver
+		* Sj3 sj3serv
+		* Atok server
+
+	Canna and Sj3 are contributed to X11R6.  Wnn is contributed
+	to X11R5.
+
+	You can choose which server to use at compilation time.  If
+	you choose more than one, you can choose your favorite engine
+	by a command line option when you invoke kinput2.
+
+
+                                                +-------------------------+
+    +---------+                           +---->|        jserver          |
+    | client1 |<------+    +---------+    |     | (Wnn conversion daemon) |
+    +---------+       +--->|         |<---+     +-------------------------+
+                           | kinput2 |<-----+
+    +---------+       +--->|         |<--+  |
+    | client2 |<------+    +---------+   |  |   +-------------------------+
+    +---------+                          |  +-->|      irohaserver        |
+                                         |      |(Canna conversion daemon)|
+                                         |      +-------------------------+
+                                         |
+                                         |      +-------------------------+
+                                         +----->|        sj3serv          |
+                                                | (SJ3 conversion daemon) |
+                                                +-------------------------+
+
+
+* Directories
+
+This directory contains the following subdirectories:
+
+	lib/		source code for a library kinput2 uses
+	include/	header files
+	cmd/		kinput2 source code
+	doc/		various documents
+	client/		sample client library and patch to kterm
+	ccdef/		character conversion rule files (for Wnn)
+	sj3def/		SJ3 user customization files
+
+
+* Installation
+
+First you have to decide which conversion server to use.  Currently
+kinput2 supports 4 servers -- Wnn jserver, Canna cannasersver, SJ3
+sj3serv and Atok server.  You can choose one of them, or more (in this
+case, you can choose the server to use at run time with a command line
+option).  Note that if you choose Wnn6, Wnn4 is also chosen
+automatically.
+
+You have to compile and install the conversion system (i.e. conversion
+server and client-side library to communicate with the server) you
+have chosen before making kinput2.  See the documents in each source
+directory for their installation and how to get the servers up and
+running.
+
+Then, you have to edit Kinput2.conf in this directory.  It is the
+global configuration file for kinput2.  See the file for details.
+
+If you're going to generate Makefiles by xmkmf, maybe you should specify
+TOP directory in Imakefile in this directory.
+
+Ready?  Now what you should do to build kinput2 is:
+
+	xmkmf
+	make Makefiles
+	make depend
+	make
+	make install
+
+During make depend, you may get warning messages that kinput2.c
+includes "WcharDisp.h" more than once, which can be ignored.
+
+Don't forget to do 'make install'.  Kinput2 won't run unless its
+application default file (cmd/Kinput2.ad) is properly installed.
+
+
+* How to Use
+
+Please see cmd/kinput2.man for general setting.  Default key bindings
+are described in doc/defaultkeys.  Other documents will be found in
+doc subdirectory, though they are written in Japanese.
+
+
+* Clients
+
+Since kinput2 supports many protocols, various clients can use kinput2
+as their input server.
+
+First, internationalized clients using X11R6 Xlib can connect to
+kinput2 via X Input Method Protocol.
+
+Also internationalized clients using Ximp implementation of X11R5 Xlib
+can connect to kinput2 via Ximp protocol.
+
+A Japanized terminal emulator, 'kterm', can also connect to kinput2
+via kinput2 protocol.  A sample client-side library source for kinput2
+protocol is provided in client subdirectory.  See client/README for
+details.
+
+
+* Changes
+
+See `NEWS' file for recent major changes.
+
+
+* Bugs
+
+If you find a bug, please send a bug report to kinput2@sra.co.jp.
+Please don't forget to include the description of your environment (your
+machine, OS version, X window patchlevel, etc.) as well as the version
+of kinput2 ("kinput2 -version" prints version information).
+
+
+* Credits
+
+I wish to thank the following people who have contributed much to this
+release:
+    Akira Kon, Naoshi Suzuki, Hiroshi Ohta, Masaki Takeuchi, Hideki Hiura,
+    Ryuji Ishiguro, Nayuta Taga, Hideyuki Moribe, Kazuki Yasumatsu, Shinji
+    Morino, the members of the kinput2 mailing list and XXI working group.
+
+Also my thanks go to all the people who participated in beta testing of
+kinput2.
+
+
+					Makoto Ishisone
+					Software Research Associates, Inc.
+					ishisone@sra.co.jp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/ccdef/Imakefile	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,18 @@
+#include "../Kinput2.conf"
+
+      CCDEF_FILES = ccdef.kinput2 rule.eggfunc rule.func \
+		    rule.kana rule.kana2 rule.roma rule.wnnroma rule.zascii \
+		    rule.greek \
+		    ccdef.kinput2.egg rule.hiragana.egg \
+		    rule.katakana.egg rule.kigou.egg
+
+all::
+depend::
+clean::
+
+#ifdef UseWnn
+MakeDirectories(install,$(CCDEF_DIR))
+InstallMultiple($(CCDEF_FILES),$(CCDEF_DIR))
+#else
+install::
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/ccdef/ccdef.kinput2	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,114 @@
+# $Id: ccdef.kinput2,v 1.4 1991/08/24 02:15:12 ishisone Rel $
+
+## 
+##	ccdef for kinput2
+##
+
+### 注意
+### ccdef ファイル (このファイルおよびインクルードされているファイル)
+### はすべて EUC コードでなければなりません。気をつけて下さい。
+
+# モードの宣言
+defmode Ascii ZenkakuAscii Kana JIS Kuten All Restricted
+
+# 初期モードの指定
+initialmode Kana
+
+# 各モードに対するルールの記述
+
+# ローマ字
+mode Kana	"ローマ"	fallthrough All
+###	もしあなたが wnn のローマ字かな変換に慣れているならば
+###	'rule.roma' の代わりに 'rule.wnnroma' をインクルードして下さい
+    include 'rule.roma'
+#   include 'rule.wnnroma'
+	""	Tab		""	goto Ascii
+	""	shift-Tab	""	goto ZenkakuAscii
+	"n"	EXITMODE	"ん"
+endmode
+
+# アスキー
+mode Ascii	"ABC"	fallthrough All
+#	特にルールを記述する必要はない
+	""	Tab		""	goto ZenkakuAscii
+	""	shift-Tab	""	goto Kana
+endmode
+
+# 全角アスキー
+mode ZenkakuAscii	"ABC"	fallthrough All
+    include 'rule.zascii'
+	""	Tab		""	goto Kana
+	""	shift-Tab	""	goto Ascii
+endmode
+
+# JISコード入力
+mode JIS	"JISコード"	fallthrough Restricted
+	""	ENTERMODE	""	jiscode-begin
+	""	EXITMODE	""	jiscode-end
+	""	'0'		"0"
+	""	'1'		"1"
+	""	'2'		"2"
+	""	'3'		"3"
+	""	'4'		"4"
+	""	'5'		"5"
+	""	'6'		"6"
+	""	'7'		"7"
+	""	'8'		"8"
+	""	'9'		"9"
+	""	'a'		"A"
+	""	'b'		"B"
+	""	'c'		"C"
+	""	'd'		"D"
+	""	'e'		"E"
+	""	'f'		"F"
+	""	'A'		"A"
+	""	'B'		"B"
+	""	'C'		"C"
+	""	'D'		"D"
+	""	'E'		"E"
+	""	'F'		"F"
+endmode
+
+# 区点コード入力
+mode Kuten	"区点コード"	fallthrough Restricted
+	""	ENTERMODE	""	kutencode-begin
+	""	EXITMODE	""	kutencode-end
+	""	'0'		"0"
+	""	'1'		"1"
+	""	'2'		"2"
+	""	'3'		"3"
+	""	'4'		"4"
+	""	'5'		"5"
+	""	'6'		"6"
+	""	'7'		"7"
+	""	'8'		"8"
+	""	'9'		"9"
+endmode
+
+# All -- 共通定義
+mode All	"?"
+###	この設定では変換開始時にはつねにローマ字モードにリセットされる
+###	ようになっています。もし最後の入力モードのままにしたい時には
+###	"end-conversion" の後の "goto Kana" を削除して下さい
+	""	control-Kanji	""	end-conversion goto Kana
+	""	shift-space	""	end-conversion goto Kana
+#	""	'^\\'		""	end-conversion goto Kana
+	""	F5		""	goto JIS
+	""	mod1-5		""	goto JIS
+	""	F6		""	goto Kuten
+	""	mod1-6		""	goto Kuten
+###	もしあなたがたまごのキーバインディングに慣れているならば
+###	'rule.func' の代わりに 'rule.eggfunc' をインクルードして下さい
+    include 'rule.func'
+#   include 'rule.eggfunc'
+endmode
+
+# Restricted -- JIS コード / 区点コード用
+mode Restricted	"??"
+	""	F5		""	goto PREV
+	""	F6		""	goto PREV
+	""	mod1-5		""	goto PREV
+	""	mod1-6		""	goto PREV
+	""	'^H'		""	backspace
+	""	@ascii		""	beep
+endmode
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/ccdef/ccdef.kinput2.egg	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,324 @@
+##	Egg が好きな人の為の ccdef for kinput2
+##		by nayuta@is.s.u-tokyo.ac.jp
+
+defmode Ascii ZenkakuAscii Hiragana Katakana JIS All
+
+initialmode Hiragana
+
+casesensitive
+autofix
+
+mode	Hiragana		"[あ]"	fallthrough All
+	include	'rule.hiragana.egg'
+
+	"n"	EXITMODE	"ん"
+	""	'q'		""	goto Ascii
+	""	'Q'		""	goto ZenkakuAscii
+
+	"n"	' '		"ん"	convert-next-or-move-top-or-sendback
+	"n"	'^\\'		"ん"	end-conversion goto Hiragana
+	"n"	'^@'		"ん"	convert-or-fix1
+	"n"	'^A'		"ん"	move-top
+	"n"	'^B'		"ん"	backward
+	"n"	'^D'		"ん"	delete-or-cancel
+	"n"	'^E'		"ん"	move-bottom
+	"n"	'^F'		"ん"	forward
+	"n"	'^I'		"ん"	shrink
+	"n"	'^J'		"ん"	fix
+	"n"	'^K'		"ん"	kill-line
+	"n"	'^L'		"ん"	fix
+	"n"	'^M'		"ん"	fix
+	"n"	'^N'		"ん"	next
+	"n"	'^O'		"ん"	expand
+	"n"	'^P'		"ん"	previous
+	"n"	'^Q'		"ん"	goto PREV
+	"n"	'^W'		"ん"	convert
+	"n"	'^Z'		"ん"	convert-s
+	""	control-underscore "ん"	goto JIS
+
+	"n"	mod1-less	"ん"	to-hankaku
+	"n"	mod1-greater	"ん"	to-zenkaku
+	"n"	mod1-i		"ん"	shrink-s
+	"n"	mod1-n		"ん"	next-s
+	"n"	mod1-o		"ん"	expand-s
+	"n"	mod1-p		"ん"	previous-s
+	"n"	mod1-w		"ん"	convert-s
+	"n"	mod1-h		"ん"	to-hiragana
+	"n"	mod1-k		"ん"	to-katakana
+	"n"	mod1-x		"ん"	to-hankaku
+	"n"	mod1-less	"ん"	to-hankaku
+	"n"	mod1-greater	"ん"	to-zenkaku
+	"n"	mod1-control-h	"ん"	goto Hiragana
+	"n"	mod1-control-k	"ん"	goto Katakana
+	"n"	mod1-q		"ん"	goto Ascii
+	"n"	mod1-shift-q	"ん"	goto Ascii
+	"n"	mod1-s		"ん"	select-s
+	"n"	mod1-shift-s	"ん"	select-s
+	"n"	mod1-z		"ん"	select goto ZenkakuAscii
+	"n"	mod1-shift-z	"ん"	select goto ZenkakuAscii
+	"n"	control-Kanji	"ん"	end-conversion goto Hiragana
+	"n"	shift-space	"ん"	end-conversion goto Hiragana
+	"n"	Kanji		"ん"	end-conversion goto Hiragana
+	"n"	shift-Muhenkan	"ん"	to-hiragana
+	"n"	Muhenkan	"ん"	to-katakana
+
+	"n"	Right		"ん"	forward
+	"n"	Left		"ん"	backward
+	"n"	Down		"ん"	next
+	"n"	Up		"ん"	previous
+	"n"	shift-Right	"ん"	expand
+	"n"	shift-Left	"ん"	shrink
+
+	"n"	F1		"ん"	beep
+	"n"	F2		"ん"	beep
+	"n"	F3		"ん"	goto JIS
+	"n"	F4		"ん"	register
+	"n"	F5		"ん"	to-zenkaku
+	"n"	F6		"ん"	to-hankaku
+	"n"	F7		"ん"	to-katakana
+	"n"	F8		"ん"	to-hiragana
+	"n"	F9		"ん"	convert-move-top-or-sendback
+	"n"	F10		"ん"	beep
+	"n"	F11		"ん"	beep
+	"n"	F12		"ん"	beep
+#	"n"	F13		"ん"	end-conversion goto Hiragana
+	"n"	F13		"ん"	beep
+	"n"	F14		"ん"	beep
+	"n"	F15		"ん"	beep
+	"n"	F16		"ん"	beep
+	"n"	F17		"ん"	beep
+	"n"	F18		"ん"	beep
+	"n"	F19		"ん"	beep
+	"n"	F20		"ん"	beep
+
+	"n"	'^^'		"ん"	symbol-input
+	"n"	'^['		"ん"	add-modifier-mod1
+	"n"	@keypad		"ん&"
+	"n"	@printable	"ん&"
+endmode
+
+mode	Katakana		"[ア]"	fallthrough All
+	include	'rule.katakana.egg'
+
+	"n"	EXITMODE	"ン"
+	""	'q'		""	goto Ascii
+	""	'Q'		""	goto ZenkakuAscii
+
+	"n"	' '		"ン"	convert-next-or-move-top-or-sendback
+	"n"	'^\\'		"ン"	end-conversion goto Hiragana
+	"n"	'^@'		"ン"	convert-or-fix1
+	"n"	'^A'		"ン"	move-top
+	"n"	'^B'		"ン"	backward
+	"n"	'^D'		"ン"	delete-or-cancel
+	"n"	'^E'		"ン"	move-bottom
+	"n"	'^F'		"ン"	forward
+	"n"	'^I'		"ン"	shrink
+	"n"	'^J'		"ン"	fix
+	"n"	'^K'		"ン"	kill-line
+	"n"	'^L'		"ン"	fix
+	"n"	'^M'		"ン"	fix
+	"n"	'^N'		"ン"	next
+	"n"	'^O'		"ン"	expand
+	"n"	'^P'		"ン"	previous
+	"n"	'^Q'		"ン"	goto PREV
+	"n"	'^W'		"ン"	convert
+	"n"	'^Z'		"ン"	convert-s
+	""	control-underscore "ン"	goto JIS
+
+	"n"	mod1-less	"ン"	to-hankaku
+	"n"	mod1-greater	"ン"	to-zenkaku
+	"n"	mod1-i		"ン"	shrink-s
+	"n"	mod1-n		"ン"	next-s
+	"n"	mod1-o		"ン"	expand-s
+	"n"	mod1-p		"ン"	previous-s
+	"n"	mod1-w		"ン"	convert-s
+	"n"	mod1-h		"ン"	to-hiragana
+	"n"	mod1-k		"ン"	to-katakana
+	"n"	mod1-x		"ン"	to-hankaku
+	"n"	mod1-less	"ン"	to-hankaku
+	"n"	mod1-greater	"ン"	to-zenkaku
+	"n"	mod1-control-h	"ン"	goto Hiragana
+	"n"	mod1-control-k	"ン"	goto Katakana
+	"n"	mod1-q		"ン"	goto Ascii
+	"n"	mod1-shift-q	"ン"	goto Ascii
+	"n"	mod1-s		"ン"	select-s
+	"n"	mod1-shift-s	"ン"	select-s
+	"n"	mod1-z		"ン"	select goto ZenkakuAscii
+	"n"	mod1-shift-z	"ン"	select goto ZenkakuAscii
+	"n"	control-Kanji	"ン"	end-conversion goto Hiragana
+	"n"	shift-space	"ン"	end-conversion goto Hiragana
+	"n"	Kanji		"ン"	end-conversion goto Hiragana
+	"n"	shift-Muhenkan	"ン"	to-hiragana
+	"n"	Muhenkan	"ン"	to-katakana
+
+	"n"	Right		"ン"	forward
+	"n"	Left		"ン"	backward
+	"n"	Down		"ン"	next
+	"n"	Up		"ン"	previous
+	"n"	shift-Right	"ン"	expand
+	"n"	shift-Left	"ン"	shrink
+
+	"n"	F1		"ン"	beep
+	"n"	F2		"ン"	beep
+	"n"	F3		"ン"	goto JIS
+	"n"	F4		"ン"	register
+	"n"	F5		"ン"	to-zenkaku
+	"n"	F6		"ン"	to-hankaku
+	"n"	F7		"ン"	to-katakana
+	"n"	F8		"ン"	to-hiragana
+	"n"	F9		"ン"	convert-move-top-or-sendback
+	"n"	F10		"ン"	beep
+	"n"	F11		"ン"	beep
+	"n"	F12		"ン"	beep
+#	"n"	F13		"ン"	end-conversion goto Hiragana
+	"n"	F13		"ン"	beep
+	"n"	F14		"ン"	beep
+	"n"	F15		"ン"	beep
+	"n"	F16		"ン"	beep
+	"n"	F17		"ン"	beep
+	"n"	F18		"ン"	beep
+	"n"	F19		"ン"	beep
+	"n"	F20		"ン"	beep
+
+	"n"	'^^'		"ン"	symbol-input
+	"n"	'^['		"ン"	add-modifier-mod1
+	"n"	@keypad		"ン&"
+	"n"	@printable	"ン&"
+endmode
+
+mode	Ascii			"[aa]"		fallthrough All
+	""	'^G'		""	goto PREV
+	""	'^M'		""	goto PREV
+	""	'^Q'		""	goto PREV
+endmode
+
+mode	ZenkakuAscii		"[a]"	fallthrough All
+	include	'rule.zascii'
+	""	'^G'		""	goto PREV
+	""	'^M'		""	goto PREV
+	""	'^Q'		""	goto PREV
+endmode
+
+mode	JIS			"[JIS]"
+	""	ENTERMODE	""	jiscode-begin
+	""	EXITMODE	""	jiscode-end
+	""	'0'		"0"
+	""	'1'		"1"
+	""	'2'		"2"
+	""	'3'		"3"
+	""	'4'		"4"
+	""	'5'		"5"
+	""	'6'		"6"
+	""	'7'		"7"
+	""	'8'		"8"
+	""	'9'		"9"
+	""	'a'		"A"
+	""	'b'		"B"
+	""	'c'		"C"
+	""	'd'		"D"
+	""	'e'		"E"
+	""	'f'		"F"
+	""	'A'		"A"
+	""	'B'		"B"
+	""	'C'		"C"
+	""	'D'		"D"
+	""	'E'		"E"
+	""	'F'		"F"
+	""	'^G'		""	goto PREV
+	""	'^H'		""	backspace
+	""	'^M'		""	goto PREV
+	""	'^Q'		""	goto PREV
+	""	@ascii		""	beep
+endmode
+
+mode All	"?"
+	""	' '		""	convert-next-or-move-top-or-sendback
+	""	'^\\'		""	end-conversion goto Hiragana
+	""	'^@'		""	convert-or-fix1
+	""	'^A'		""	move-top
+	""	'^B'		""	backward
+	""	'^C'		""	clear-or-cancel
+	""	'^D'		""	delete-or-cancel
+	""	'^E'		""	move-bottom
+	""	'^F'		""	forward
+	""	'^G'		""	clear-or-cancel
+	""	'^H'		""	backspace-or-cancel
+	""	'^I'		""	shrink
+	""	'^J'		""	fix-or-sendback
+	""	'^K'		""	kill-line
+	""	'^L'		""	fix
+#	""	'^M'		""	fix-or-cr
+	""	'^M'		""	fix-or-sendback
+	""	'^N'		""	next
+	""	'^O'		""	expand
+	""	'^P'		""	previous
+	""	'^Q'		""	goto PREV
+	""	'^W'		""	convert
+	""	'^Z'		""	convert-s
+	""	control-underscore ""	goto JIS
+
+	""	mod1-less	""	to-hankaku
+	""	mod1-greater	""	to-zenkaku
+	""	mod1-i		""	shrink-s
+	""	mod1-n		""	next-s
+	""	mod1-o		""	expand-s
+	""	mod1-p		""	previous-s
+	""	mod1-w		""	convert-s
+	""	mod1-h		""	to-hiragana
+	""	mod1-k		""	to-katakana
+	""	mod1-x		""	to-hankaku
+	""	mod1-less	""	to-hankaku
+	""	mod1-greater	""	to-zenkaku
+
+	""	mod1-control-h	""	goto Hiragana
+	""	mod1-control-k	""	goto Katakana
+	""	mod1-q		""	goto Ascii
+	""	mod1-shift-q	""	goto Ascii
+	""	mod1-s		""	select-s
+	""	mod1-shift-s	""	select-s
+	""	mod1-z		""	select goto ZenkakuAscii
+	""	mod1-shift-z	""	select goto ZenkakuAscii
+
+	""	control-Kanji	""	end-conversion goto Hiragana
+	""	shift-space	""	end-conversion goto Hiragana
+	""	Kanji		""	end-conversion goto Hiragana
+	""	shift-Muhenkan	""	to-hiragana
+	""	Muhenkan	""	to-katakana
+
+	""	Right		""	forward
+	""	Left		""	backward
+	""	Down		""	next
+	""	Up		""	previous
+	""	shift-Right	""	expand
+	""	shift-Left	""	shrink
+	""	Delete		""	backspace-or-cancel
+	""	BackSpace	""	backspace-or-cancel
+
+	""	F1		""	beep
+	""	F2		""	beep
+	""	F3		""	goto JIS
+	""	F4		""	register
+	""	F5		""	to-zenkaku
+	""	F6		""	to-hankaku
+	""	F7		""	to-katakana
+	""	F8		""	to-hiragana
+	""	F9		""	convert-move-top-or-sendback
+	""	F10		""	convert-next-or-move-top-or-sendback
+	""	F11		""	beep
+	""	F12		""	beep
+#	""	F13		""	end-conversion goto Hiragana
+	""	F13		""	beep
+	""	F14		""	beep
+	""	F15		""	beep
+	""	F16		""	beep
+	""	F17		""	beep
+	""	F18		""	beep
+	""	F19		""	beep
+	""	F20		""	beep
+
+	""	'^^'		""	symbol-input
+	""	'^['		""	add-modifier-mod1
+	""	'^]'		"^]"
+	""	@keypad		"&"
+	""	@printable	"&"
+endmode
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/ccdef/rule.eggfunc	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,44 @@
+# $Id: rule.eggfunc,v 1.2 1999/01/19 03:49:17 ishisone Exp $
+
+#	conversion function key bindings for egg users
+
+# function key bindings
+	""	'^A'		""	move-top
+	""	'^B'		""	backward
+	""	'^C'		""	unconvert
+	""	'^D'		""	delete
+	""	'^E'		""	move-bottom
+	""	'^F'		""	forward
+	""	'^G'		""	clear
+	""	'^H'		""	backspace
+	""	'^I'		""	shrink
+	""	'^K'		""	kill-line
+	""	'^L'		""	fix
+	""	'^M'		""	fix
+	""	'^N'		""	next
+	""	'^O'		""	expand
+	""	'^P'		""	previous
+	""	'^W'		""	convert
+	""	' '		""	convert-or-space
+	""	Kanji		""	convert
+	""	mod1-w		""	convert-s
+	""	mod1-n		""	next-s
+	""	mod1-p		""	previous-s
+	""	Right		""	forward
+	""	Left		""	backward
+	""	Down		""	next
+	""	Up		""	previous
+	""	shift-Right	""	expand
+	""	shift-Left	""	shrink
+	""	Delete		""	delete
+	""	F1		""	to-katakana
+	""	mod1-1		""	to-katakana
+	""	F2		""	to-hiragana
+	""	mod1-2		""	to-hiragana
+	""	F3		""	to-hankaku
+	""	mod1-3		""	to-hankaku
+	""	F4		""	to-zenkaku
+	""	mod1-4		""	to-zenkaku
+	""	shift-Escape	""	symbol-input
+	""	@keypad		"&"
+	""	@printable	"&"
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/ccdef/rule.func	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,43 @@
+# $Id: rule.func,v 1.4 1999/03/15 09:22:18 ishisone Exp $
+
+#	conversion function key bindings
+
+# function key bindings
+	""	'^J'		""	convert
+	""	Kanji		""	convert
+	""	'^C'		""	convert-s
+	""	'^G'		""	unconvert
+	""	'^F'		""	forward
+	""	'^B'		""	backward
+	""	'^N'		""	next
+	""	mod1-n		""	next-s
+	""	'^P'		""	previous
+	""	mod1-p		""	previous-s
+	""	Right		""	forward
+	""	Left		""	backward
+	""	Down		""	next
+	""	Up		""	previous
+	""	'^A'		""	move-top
+	""	'^E'		""	move-bottom
+	""	shift-Right	""	expand
+	""	shift-Left	""	shrink
+	""	'^L'		""	fix
+	""	'^U'		""	clear
+	""	'^K'		""	kill-line
+	""	'^M'		""	carriage-return
+	""	'^I'		"^I"	fix
+	""	'^H'		""	backspace
+	""	Delete		""	delete
+	""	F1		""	to-katakana
+	""	mod1-1		""	to-katakana
+	""	F2		""	to-hiragana
+	""	mod1-2		""	to-hiragana
+	""	F3		""	to-hankaku
+	""	mod1-3		""	to-hankaku
+	""	F4		""	to-zenkaku
+	""	mod1-4		""	to-zenkaku
+	""	shift-Escape	""	symbol-input
+	""	F5		""	register
+	""	'^T'		""	register
+	""	@keypad		"&"
+	""	@printable	"&"
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/ccdef/rule.greek	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,53 @@
+# $Id: rule.greek,v 1.1 1989/10/19 21:07:49 ishisone Rel $
+
+#	character conversion rule for greek characters
+
+# ギリシャ文字変換ルール
+	""	'a'	"α"
+	""	'b'	"β"
+	""	'g'	"γ"
+	""	'd'	"δ"
+	""	'e'	"ε"
+	""	'z'	"ζ"
+	""	'y'	"η"
+	""	'h'	"θ"
+	""	'i'	"ι"
+	""	'k'	"κ"
+	""	'l'	"λ"
+	""	'm'	"μ"
+	""	'n'	"ν"
+	""	'c'	"ξ"
+	""	'o'	"ο"
+	""	'p'	"π"
+	""	'r'	"ρ"
+	""	's'	"σ"
+	""	't'	"τ"
+	""	'u'	"υ"
+	""	'f'	"φ"
+	""	'x'	"χ"
+	""	'q'	"ψ"
+	""	'w'	"ω"
+	""	'A'	"Α"
+	""	'B'	"Β"
+	""	'G'	"Γ"
+	""	'D'	"Δ"
+	""	'E'	"Ε"
+	""	'Z'	"Ζ"
+	""	'Y'	"Η"
+	""	'H'	"Θ"
+	""	'I'	"Ι"
+	""	'K'	"Κ"
+	""	'L'	"Λ"
+	""	'M'	"Μ"
+	""	'N'	"Ν"
+	""	'C'	"Ξ"
+	""	'O'	"Ο"
+	""	'P'	"Π"
+	""	'R'	"Ρ"
+	""	'S'	"Σ"
+	""	'T'	"Τ"
+	""	'U'	"Υ"
+	""	'F'	"Φ"
+	""	'X'	"Χ"
+	""	'Q'	"Ψ"
+	""	'W'	"Ω"
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/ccdef/rule.hiragana.egg	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,333 @@
+##	Egg が好きな人の為のローマ字かな変換ルール
+##		by nayuta@is.s.u-tokyo.ac.jp
+#
+#
+#	"lts"	'u'	"っ"
+#
+	"xts"	'u'	"っ"
+#
+#
+	"by"	'a'	"びゃ"
+	"by"	'i'	"びぃ"
+	"by"	'u'	"びゅ"
+	"by"	'e'	"びぇ"
+	"by"	'o'	"びょ"
+#
+	"ch"	'a'	"ちゃ"
+	"ch"	'i'	"ち"
+	"ch"	'u'	"ちゅ"
+	"ch"	'e'	"ちぇ"
+	"ch"	'o'	"ちょ"
+#
+	"dy"	'a'	"ぢゃ"
+	"dy"	'i'	"でぃ"
+	"dy"	'u'	"ぢゅ"
+	"dy"	'e'	"ぢぇ"
+	"dy"	'o'	"ぢょ"
+	"dh"	'i'	"でぃ"
+#
+	"gw"	'a'	"ぐゎ"
+	"gw"	'i'	"ぐぃ"
+	"gw"	'u'	"ぐ"
+	"gw"	'e'	"ぐぇ"
+	"gw"	'o'	"ぐぉ"
+	"gy"	'a'	"ぎゃ"
+	"gy"	'i'	"ぎぃ"
+	"gy"	'u'	"ぎゅ"
+	"gy"	'e'	"ぎぇ"
+	"gy"	'o'	"ぎょ"
+#
+	"kw"	'a'	"くゎ"
+	"kw"	'i'	"くぃ"
+	"kw"	'u'	"く"
+	"kw"	'e'	"くぇ"
+	"kw"	'o'	"くぉ"
+	"ky"	'a'	"きゃ"
+	"ky"	'i'	"きぃ"
+	"ky"	'u'	"きゅ"
+	"ky"	'e'	"きぇ"
+	"ky"	'o'	"きょ"
+#
+	"hy"	'a'	"ひゃ"
+	"hy"	'i'	"ひぃ"
+	"hy"	'u'	"ひゅ"
+	"hy"	'e'	"ひぇ"
+	"hy"	'o'	"ひょ"
+#
+	"jy"	'a'	"じゃ"
+	"jy"	'i'	"じぃ"
+	"jy"	'u'	"じゅ"
+	"jy"	'e'	"じぇ"
+	"jy"	'o'	"じょ"
+#
+#	"lt"	'u'	"っ"
+#	"lk"	'a'	"ヵ"
+#	"lk"	'e'	"ヶ"
+#	"ly"	'a'	"ゃ"
+#	"ly"	'u'	"ゅ"
+#	"ly"	'o'	"ょ"
+	"ly"	'a'	"りゃ"
+	"ly"	'i'	"りぃ"
+	"ly"	'u'	"りゅ"
+	"ly"	'e'	"りぇ"
+	"ly"	'o'	"りょ"
+	"lw"	'a'	"ゎ"
+#
+	"my"	'a'	"みゃ"
+	"my"	'i'	"みぃ"
+	"my"	'u'	"みゅ"
+	"my"	'e'	"みぇ"
+	"my"	'o'	"みょ"
+#
+	"ny"	'a'	"にゃ"
+	"ny"	'i'	"にぃ"
+	"ny"	'u'	"にゅ"
+	"ny"	'e'	"にぇ"
+	"ny"	'o'	"にょ"
+#
+	"py"	'a'	"ぴゃ"
+	"py"	'i'	"ぴぃ"
+	"py"	'u'	"ぴゅ"
+	"py"	'e'	"ぴぇ"
+	"py"	'o'	"ぴょ"
+#
+	"ry"	'a'	"りゃ"
+	"ry"	'i'	"りぃ"
+	"ry"	'u'	"りゅ"
+	"ry"	'e'	"りぇ"
+	"ry"	'o'	"りょ"
+#
+	"sh"	'a'	"しゃ"
+	"sh"	'i'	"し"
+	"sh"	'u'	"しゅ"
+	"sh"	'e'	"しぇ"
+	"sh"	'o'	"しょ"
+#
+	"sy"	'a'	"しゃ"
+	"sy"	'i'	"しぃ"
+	"sy"	'u'	"しゅ"
+	"sy"	'e'	"しぇ"
+	"sy"	'o'	"しょ"
+#
+	"tc"	'h'	"っ"
+	"ts"	'a'	"つぁ"
+	"ts"	'i'	"つぃ"
+	"ts"	'u'	"つ"
+	"ts"	'e'	"つぇ"
+	"ts"	'o'	"つぉ"
+#
+	"ty"	'a'	"ちゃ"
+	"ty"	'i'	"てぃ"
+	"ty"	'u'	"ちゅ"
+	"ty"	'e'	"ちぇ"
+	"ty"	'o'	"ちょ"
+	"th"	'i'	"てぃ"
+#
+	"wh"	'i'	"うぃ"
+	"wh"	'e'	"うぇ"
+#
+	"xt"	'u'	"っ"
+	"xk"	'a'	"ヵ"
+	"xk"	'e'	"ヶ"
+	"xt"	'i'	"てぃ"
+	"xd"	'i'	"でぃ"
+	"xd"	'u'	"どぅ"
+	"xd"	'e'	"どぇ"
+	"xd"	'o'	"どぉ"
+	"xy"	'a'	"ゃ"
+	"xy"	'u'	"ゅ"
+	"xy"	'o'	"ょ"
+	"xw"	'a'	"ゎ"
+	"xw"	'i'	"うぃ"
+	"xw"	'e'	"うぇ"
+	"xw"	'o'	"うぉ"
+#
+	"zy"	'a'	"じゃ"
+	"zy"	'i'	"じぃ"
+	"zy"	'u'	"じゅ"
+	"zy"	'e'	"じぇ"
+	"zy"	'o'	"じょ"
+#
+#
+	"b"	'a'	"ば"
+	"b"	'i'	"び"
+	"b"	'u'	"ぶ"
+	"b"	'e'	"べ"
+	"b"	'o'	"ぼ"
+	"b"	'b'	"っb"
+#
+	"c"	'c'	"っc"
+#
+	"f"	'a'	"ふぁ"
+	"f"	'i'	"ふぃ"
+	"f"	'u'	"ふ"
+	"f"	'e'	"ふぇ"
+	"f"	'o'	"ふぉ"
+	"f"	'f'	"っf"
+#
+	"d"	'a'	"だ"
+	"d"	'i'	"ぢ"
+	"d"	'u'	"づ"
+	"d"	'e'	"で"
+	"d"	'o'	"ど"
+	"d"	'd'	"っd"
+#
+	"g"	'a'	"が"
+	"g"	'i'	"ぎ"
+	"g"	'u'	"ぐ"
+	"g"	'e'	"げ"
+	"g"	'o'	"ご"
+	"g"	'g'	"っg"
+#
+	"k"	'a'	"か"
+	"k"	'i'	"き"
+	"k"	'u'	"く"
+	"k"	'e'	"け"
+	"k"	'o'	"こ"
+	"k"	'k'	"っk"
+#
+	"h"	'a'	"は"
+	"h"	'i'	"ひ"
+	"h"	'u'	"ふ"
+	"h"	'e'	"へ"
+	"h"	'o'	"ほ"
+	"h"	'h'	"っh"
+#
+	"j"	'a'	"じゃ"
+	"j"	'i'	"じ"
+	"j"	'u'	"じゅ"
+	"j"	'e'	"じぇ"
+	"j"	'o'	"じょ"
+	"j"	'j'	"っj"
+#
+#	"l"	'a'	"ぁ"
+#	"l"	'i'	"ぃ"
+#	"l"	'u'	"ぅ"
+#	"l"	'e'	"ぇ"
+#	"l"	'o'	"ぉ"
+	"l"	'a'	"ら"
+	"l"	'i'	"り"
+	"l"	'u'	"る"
+	"l"	'e'	"れ"
+	"l"	'o'	"ろ"
+	"l"	'l'	"っl"
+#
+	"m"	'a'	"ま"
+	"m"	'i'	"み"
+	"m"	'u'	"む"
+	"m"	'e'	"め"
+	"m"	'o'	"も"
+	"m"	'b'	"んb"
+	"m"	'm'	"んm"
+	"m"	'p'	"んp"
+	"m"	'm'	"っm"
+#
+	"n"	'a'	"な"
+	"n"	'b'	"んb"
+	"n"	'c'	"んc"
+	"n"	'd'	"んd"
+	"n"	'e'	"ね"
+	"n"	'f'	"んf"
+	"n"	'g'	"んg"
+	"n"	'h'	"んh"
+	"n"	'i'	"に"
+	"n"	'j'	"んj"
+	"n"	'k'	"んk"
+	"n"	'l'	"んl"
+	"n"	'm'	"んm"
+#	"n"	'n'	"ん"
+	"n"	'N'	"んん"
+	"n"	'n'	"んn"
+	"n"	'o'	"の"
+	"n"	'p'	"んp"
+	"n"	'r'	"んr"
+	"n"	's'	"んs"
+	"n"	't'	"んt"
+	"n"	'u'	"ぬ"
+	"n"	'v'	"んv"
+	"n"	'w'	"んw"
+	"n"	'x'	"んx"
+	"n"	'y'	"ny"
+	"n"	'z'	"んz"
+#	"n"	'.'	"ん. "
+#	"n"	','	"ん, "
+#	"n"	'/'	"ん・"
+	"n"	'.'	"ん。"
+	"n"	','	"ん、"
+	"n"	'/'	"ん/"
+#
+	"p"	'a'	"ぱ"
+	"p"	'i'	"ぴ"
+	"p"	'u'	"ぷ"
+	"p"	'e'	"ぺ"
+	"p"	'o'	"ぽ"
+	"p"	'p'	"っp"
+#
+	"r"	'a'	"ら"
+	"r"	'i'	"り"
+	"r"	'u'	"る"
+	"r"	'e'	"れ"
+	"r"	'o'	"ろ"
+	"r"	'r'	"っr"
+#
+	"s"	'a'	"さ"
+	"s"	'i'	"し"
+	"s"	'u'	"す"
+	"s"	'e'	"せ"
+	"s"	'o'	"そ"
+	"s"	's'	"っs"
+#
+	"t"	'a'	"た"
+	"t"	'i'	"ち"
+	"t"	'u'	"つ"
+	"t"	'e'	"て"
+	"t"	'o'	"と"
+	"t"	't'	"っt"
+#
+	"v"	'a'	"ヴぁ"
+	"v"	'i'	"ヴぃ"
+	"v"	'u'	"ヴ"
+	"v"	'e'	"ヴぇ"
+	"v"	'o'	"ヴぉ"
+	"v"	'v'	"っv"
+#
+	"w"	'a'	"わ"
+	"w"	'i'	"ゐ"
+	"w"	'u'	"う"
+	"w"	'e'	"ゑ"
+	"w"	'o'	"を"
+	"w"	'n'	"ん"
+	"w"	'w'	"っw"
+#
+	"x"	'a'	"ぁ"
+	"x"	'i'	"ぃ"
+	"x"	'u'	"ぅ"
+	"x"	'e'	"ぇ"
+	"x"	'o'	"ぉ"
+	"x"	'x'	"っx"
+#
+	"y"	'a'	"や"
+	"y"	'i'	"い"
+	"y"	'u'	"ゆ"
+	"y"	'e'	"いぇ"
+	"y"	'o'	"よ"
+	"y"	'y'	"っy"
+#
+	"z"	'a'	"ざ"
+	"z"	'i'	"じ"
+	"z"	'u'	"ず"
+	"z"	'e'	"ぜ"
+	"z"	'o'	"ぞ"
+	"z"	'z'	"っz"
+#
+#
+	include	'rule.kigou.egg'
+#
+#
+	""	'a'	"あ"
+	""	'i'	"い"
+	""	'u'	"う"
+	""	'e'	"え"
+	""	'o'	"お"
+	""	'N'	"ん"
+#
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/ccdef/rule.kana	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,100 @@
+# $Id: rule.kana,v 1.1 1989/10/19 21:07:54 ishisone Rel $
+
+#	character conversion rule for kana
+
+# かな (旧JIS) 変換ルール
+	""	'3'	"あ"
+	""	'#'	"ぁ"
+	""	'e'	"い"
+	""	'E'	"ぃ"
+	""	'4'	"う"
+	""	'$'	"ぅ"
+	""	'5'	"え"
+	""	'%'	"ぇ"
+	""	'6'	"お"
+	""	'^'	"ぉ"
+	""	't'	"か"
+	""	'T'	"ヵ"
+	""	'"'	"ヶ"
+	""	'g'	"き"
+	""	'h'	"く"
+	""	'\''	"け"
+	""	'b'	"こ"
+	""	'x'	"さ"
+	""	'd'	"し"
+	""	'r'	"す"
+	""	'p'	"せ"
+	""	'c'	"そ"
+	""	'q'	"た"
+	""	'a'	"ち"
+	""	'z'	"つ"
+	""	'Z'	"っ"
+	""	'w'	"て"
+	""	's'	"と"
+	""	'u'	"な"
+	""	'i'	"に"
+	""	'1'	"ぬ"
+	""	','	"ね"
+	""	'k'	"の"
+	""	'f'	"は"
+	""	'v'	"ひ"
+	""	'2'	"ふ"
+	""	'='	"へ"
+	""	'-'	"ほ"
+	""	'j'	"ま"
+	""	'n'	"み"
+	""	'`'	"む"
+	""	'/'	"め"
+	""	'm'	"も"
+	""	'7'	"や"
+	""	'&'	"ゃ"
+	""	'8'	"ゆ"
+	""	'*'	"ゅ"
+	""	'9'	"よ"
+	""	'('	"ょ"
+	""	'o'	"ら"
+	""	'l'	"り"
+	""	'.'	"る"
+	""	';'	"れ"
+	""	'_'	"ろ"
+	""	'0'	"わ"
+	""	')'	"を"
+	""	'y'	"ん"
+	""	'<'	"、"
+	""	'>'	"。"	convert
+	""	'?'	"・"
+	""	kana_RO	"ろ"
+	""	shift-kana_RO	"ー"
+# 'ろ' のキーがないかわいそうなキーボードのために... (SUN のことだけど)
+	""	'|'	"ろ"
+	""	'\\'	"ー"
+	""	'}'	"「"
+	""	'~'	"」"
+	"か"	'['	"が"
+	"き"	'['	"ぎ"
+	"く"	'['	"ぐ"
+	"け"	'['	"げ"
+	"こ"	'['	"ご"
+	"さ"	'['	"ざ"
+	"し"	'['	"じ"
+	"す"	'['	"ず"
+	"せ"	'['	"ぜ"
+	"そ"	'['	"ぞ"
+	"た"	'['	"だ"
+	"ち"	'['	"ぢ"
+	"つ"	'['	"づ"
+	"て"	'['	"で"
+	"と"	'['	"ど"
+	"は"	'['	"ば"
+	"ひ"	'['	"び"
+	"ふ"	'['	"ぶ"
+	"へ"	'['	"べ"
+	"ほ"	'['	"ぼ"
+	"は"	']'	"ぱ"
+	"ひ"	']'	"ぴ"
+	"ふ"	']'	"ぷ"
+	"へ"	']'	"ぺ"
+	"ほ"	']'	"ぽ"
+	"う"	'['	"ヴ"
+	""	'['	"゛"
+	""	']'	"゜"
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/ccdef/rule.kana2	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,153 @@
+# $Id: rule.kana2,v 1.3 1997/05/23 08:27:13 ishisone Exp $
+
+# この定義ファイルは minmin@astec.co.jp 氏によるもので、かなキーボード
+# でのかな入力をするためのものです。
+# かな入力用の定義ファイルとしてはすでに rule.kana が用意されています
+# が、あれはかなキーボードでなくても使えるようにアスキーからかなへの変
+# 換を行なうものでした。それに対してこの定義ファイルは実際にかなの 
+# Keysym を出すかなキーボードでかなを入力するためのものです。
+# 実際にこの定義を使用するためには、ccdef.kinput2 を次のように変更する
+# 必要があります。
+#	・mode Kana で rule.roma の代わりに rule.kana2 をインクルード
+#	  するようにする
+#	・mode Ascii は必要ないので削る
+# また、一部のキーボードでは、かなロックの状態で、コントロールを押しな
+# がらキーを入力すると、期待した動作にならない事があります。具体的には
+# '^J' と押しても、変換されないとか、'^H' でもバックスペースにならない
+# などの不具合が発生します。このような場合、各定義ファイルのコントロー
+# ルキーで入力するファンクション部分に、次のような修正を加えるとうまく
+# いくことがあります。
+#	
+#	""	'^J'		""	convert
+#	""	control-kana_MA	""	convert	    # Jのかなロックはマ
+#	""	'^C'		""	convert-s
+#	""	control-kana_SO	""	convert-s   # Cのかなロックはソ
+#	""	'^G'		""	unconvert
+#	""	control-kana_KI	""	unconvert   # Gのかなロックはキ
+#	""	'^F'		""	forward
+#	""	control-kana_FU ""	forward	    # Fのかなロックはフ
+#
+# 変更方法については doc/ccdef を読めば多分わかると思いますが、もし疑問の
+# 点がありましたら kinput2@sra.co.jp までお問い合わせ下さい。
+
+	""	kana_fullstop	"。"
+	""	kana_openingbracket	"「"
+	""	kana_closingbracket	"」"
+	""	kana_comma	"、"
+	""	kana_middledot	"・"
+	""	kana_WO		"を"
+	""	kana_a		"ぁ"
+	""	kana_i		"ぃ"
+	""	kana_u		"ぅ"
+	""	kana_e		"ぇ"
+	""	kana_o		"ぉ"
+	""	kana_ya		"ゃ"
+	""	kana_yu		"ゅ"
+	""	kana_yo		"ょ"
+	""	kana_tu		"っ"
+	""	prolongedsound	"ー"
+	""	kana_A	"あ"
+	""	kana_I	"い"
+	""	kana_U	"う"
+	""	kana_E	"え"
+	""	kana_O	"お"
+	""	kana_KA	"か"
+	""	kana_KI	"き"
+	""	kana_KU	"く"
+	""	kana_KE	"け"
+	""	kana_KO	"こ"
+	""	kana_SA	"さ"
+	""	kana_SHI	"し"
+	""	kana_SU	"す"
+	""	kana_SE	"せ"
+	""	kana_SO	"そ"
+	""	kana_TA	"た"
+	""	kana_TI	"ち"
+	""	kana_TU	"つ"
+	""	kana_TE	"て"
+	""	kana_TO	"と"
+	""	kana_NA	"な"
+	""	kana_NI	"に"
+	""	kana_NU	"ぬ"
+	""	kana_NE	"ね"
+	""	kana_NO	"の"
+	""	kana_HA	"は"
+	""	kana_HI	"ひ"
+	""	kana_HU	"ふ"
+	""	kana_HE	"へ"
+	""	kana_HO	"ほ"
+	""	kana_MA	"ま"
+	""	kana_MI	"み"
+	""	kana_MU	"む"
+	""	kana_ME	"め"
+	""	kana_MO	"も"
+	""	kana_YA	"や"
+	""	kana_YU	"ゆ"
+	""	kana_YO	"よ"
+	""	kana_RA	"ら"
+	""	kana_RI	"り"
+	""	kana_RU	"る"
+	""	kana_RE	"れ"
+	""	kana_RO	"ろ"
+	""	kana_WA	"わ"
+	""	kana_N	"ん"
+#
+	"か"	voicedsound	"が"
+	"き"	voicedsound	"ぎ"
+	"く"	voicedsound	"ぐ"
+	"け"	voicedsound	"げ"
+	"こ"	voicedsound	"ご"
+	"さ"	voicedsound	"ざ"
+	"し"	voicedsound	"じ"
+	"す"	voicedsound	"ず"
+	"せ"	voicedsound	"ぜ"
+	"そ"	voicedsound	"ぞ"
+	"た"	voicedsound	"だ"
+	"ち"	voicedsound	"ぢ"
+	"つ"	voicedsound	"づ"
+	"て"	voicedsound	"で"
+	"と"	voicedsound	"ど"
+	"は"	voicedsound	"ば"
+	"ひ"	voicedsound	"び"
+	"ふ"	voicedsound	"ぶ"
+	"へ"	voicedsound	"べ"
+	"ほ"	voicedsound	"ぼ"
+	"は"	semivoicedsound	"ぱ"
+	"ひ"	semivoicedsound	"ぴ"
+	"ふ"	semivoicedsound	"ぷ"
+	"へ"	semivoicedsound	"ぺ"
+	"ほ"	semivoicedsound	"ぽ"
+# ここから下は個人の趣味ですので必要ない方はコメントアウトして下さい
+	""	'!'	"!"
+	""	'"'	"“"
+	""	'#'	"#"
+	""	'$'	"$"
+	""	'%'	"%"
+	""	'&'	"&"
+	""	'\''	"’"
+	""	'('	"("
+	""	')'	")"
+	""	'*'	"*"
+	""	'+'	"+"
+	""	','	","
+	""	'-'	"−"
+	""	'.'	"."
+	""	'/'	"/"
+	""	':'	":"
+	""	';'	";"
+	""	'<'	"<"
+	""	'='	"="
+	""	'>'	">"
+	""	'?'	"?"
+	""	'@'	"@"
+	""	'['	"["
+	""	'\\'	"¥"
+	""	']'	"]"
+	""	'^'	"^"
+	""	'_'	"_"
+	""	'`'	"‘"
+	""	' '	" "
+	""	'{'	"{"
+	""	'|'	"|"
+	""	'}'	"}"
+	""	'~'	"〜"
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/ccdef/rule.katakana.egg	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,333 @@
+##	Egg が好きな人の為のローマ字カナ変換ルール
+##		by nayuta@is.s.u-tokyo.ac.jp
+#
+#
+#	"lts"	'u'	"ッ"
+#
+	"xts"	'u'	"ッ"
+#
+#
+	"by"	'a'	"ビャ"
+	"by"	'i'	"ビィ"
+	"by"	'u'	"ビュ"
+	"by"	'e'	"ビェ"
+	"by"	'o'	"ビョ"
+#
+	"ch"	'a'	"チャ"
+	"ch"	'i'	"チ"
+	"ch"	'u'	"チュ"
+	"ch"	'e'	"チェ"
+	"ch"	'o'	"チョ"
+#
+	"dy"	'a'	"ヂャ"
+	"dy"	'i'	"ディ"
+	"dy"	'u'	"ヂュ"
+	"dy"	'e'	"ヂェ"
+	"dy"	'o'	"ヂョ"
+	"dh"	'i'	"ディ"
+#
+	"gw"	'a'	"グヮ"
+	"gw"	'i'	"グィ"
+	"gw"	'u'	"グ"
+	"gw"	'e'	"グェ"
+	"gw"	'o'	"グォ"
+	"gy"	'a'	"ギャ"
+	"gy"	'i'	"ギィ"
+	"gy"	'u'	"ギュ"
+	"gy"	'e'	"ギェ"
+	"gy"	'o'	"ギョ"
+#
+	"kw"	'a'	"クヮ"
+	"kw"	'i'	"クィ"
+	"kw"	'u'	"ク"
+	"kw"	'e'	"クェ"
+	"kw"	'o'	"クォ"
+	"ky"	'a'	"キャ"
+	"ky"	'i'	"キィ"
+	"ky"	'u'	"キュ"
+	"ky"	'e'	"キェ"
+	"ky"	'o'	"キョ"
+#
+	"hy"	'a'	"ヒャ"
+	"hy"	'i'	"ヒィ"
+	"hy"	'u'	"ヒュ"
+	"hy"	'e'	"ヒェ"
+	"hy"	'o'	"ヒョ"
+#
+	"jy"	'a'	"ジャ"
+	"jy"	'i'	"ジィ"
+	"jy"	'u'	"ジュ"
+	"jy"	'e'	"ジェ"
+	"jy"	'o'	"ジョ"
+#
+#	"lt"	'u'	"ッ"
+#	"lk"	'a'	"ヵ"
+#	"lk"	'e'	"ヶ"
+#	"ly"	'a'	"ャ"
+#	"ly"	'u'	"ュ"
+#	"ly"	'o'	"ョ"
+	"ly"	'a'	"リャ"
+	"ly"	'i'	"リィ"
+	"ly"	'u'	"リュ"
+	"ly"	'e'	"リェ"
+	"ly"	'o'	"リョ"
+	"lw"	'a'	"ヮ"
+#
+	"my"	'a'	"ミャ"
+	"my"	'i'	"ミィ"
+	"my"	'u'	"ミュ"
+	"my"	'e'	"ミェ"
+	"my"	'o'	"ミョ"
+#
+	"ny"	'a'	"ニャ"
+	"ny"	'i'	"ニィ"
+	"ny"	'u'	"ニュ"
+	"ny"	'e'	"ニェ"
+	"ny"	'o'	"ニョ"
+#
+	"py"	'a'	"ピャ"
+	"py"	'i'	"ピィ"
+	"py"	'u'	"ピュ"
+	"py"	'e'	"ピェ"
+	"py"	'o'	"ピョ"
+#
+	"ry"	'a'	"リャ"
+	"ry"	'i'	"リィ"
+	"ry"	'u'	"リュ"
+	"ry"	'e'	"リェ"
+	"ry"	'o'	"リョ"
+#
+	"sh"	'a'	"シャ"
+	"sh"	'i'	"シ"
+	"sh"	'u'	"シュ"
+	"sh"	'e'	"シェ"
+	"sh"	'o'	"ショ"
+#
+	"sy"	'a'	"シャ"
+	"sy"	'i'	"シィ"
+	"sy"	'u'	"シュ"
+	"sy"	'e'	"シェ"
+	"sy"	'o'	"ショ"
+#
+	"tc"	'h'	"ッ"
+	"ts"	'a'	"ツァ"
+	"ts"	'i'	"ツィ"
+	"ts"	'u'	"ツ"
+	"ts"	'e'	"ツェ"
+	"ts"	'o'	"ツォ"
+#
+	"ty"	'a'	"チャ"
+	"ty"	'i'	"ティ"
+	"ty"	'u'	"チュ"
+	"ty"	'e'	"チェ"
+	"ty"	'o'	"チョ"
+	"th"	'i'	"ティ"
+#
+	"wh"	'i'	"ウィ"
+	"wh"	'e'	"ウェ"
+#
+	"xt"	'u'	"ッ"
+	"xk"	'a'	"ヵ"
+	"xk"	'e'	"ヶ"
+	"xt"	'i'	"ティ"
+	"xd"	'i'	"ディ"
+	"xd"	'u'	"ドゥ"
+	"xd"	'e'	"ドェ"
+	"xd"	'o'	"ドォ"
+	"xy"	'a'	"ャ"
+	"xy"	'u'	"ュ"
+	"xy"	'o'	"ョ"
+	"xw"	'a'	"ヮ"
+	"xw"	'i'	"ウィ"
+	"xw"	'e'	"ウェ"
+	"xw"	'o'	"ウォ"
+#
+	"zy"	'a'	"ジャ"
+	"zy"	'i'	"ジィ"
+	"zy"	'u'	"ジュ"
+	"zy"	'e'	"ジェ"
+	"zy"	'o'	"ジョ"
+#
+#
+	"b"	'a'	"バ"
+	"b"	'i'	"ビ"
+	"b"	'u'	"ブ"
+	"b"	'e'	"ベ"
+	"b"	'o'	"ボ"
+	"b"	'b'	"ッb"
+#
+	"c"	'c'	"ッc"
+#
+	"f"	'a'	"ファ"
+	"f"	'i'	"フィ"
+	"f"	'u'	"フ"
+	"f"	'e'	"フェ"
+	"f"	'o'	"フォ"
+	"f"	'f'	"ッf"
+#
+	"d"	'a'	"ダ"
+	"d"	'i'	"ヂ"
+	"d"	'u'	"ヅ"
+	"d"	'e'	"デ"
+	"d"	'o'	"ド"
+	"d"	'd'	"ッd"
+#
+	"g"	'a'	"ガ"
+	"g"	'i'	"ギ"
+	"g"	'u'	"グ"
+	"g"	'e'	"ゲ"
+	"g"	'o'	"ゴ"
+	"g"	'g'	"ッg"
+#
+	"k"	'a'	"カ"
+	"k"	'i'	"キ"
+	"k"	'u'	"ク"
+	"k"	'e'	"ケ"
+	"k"	'o'	"コ"
+	"k"	'k'	"ッk"
+#
+	"h"	'a'	"ハ"
+	"h"	'i'	"ヒ"
+	"h"	'u'	"フ"
+	"h"	'e'	"ヘ"
+	"h"	'o'	"ホ"
+	"h"	'h'	"ッh"
+#
+	"j"	'a'	"ジャ"
+	"j"	'i'	"ジ"
+	"j"	'u'	"ジュ"
+	"j"	'e'	"ジェ"
+	"j"	'o'	"ジョ"
+	"j"	'j'	"ッj"
+#
+#	"l"	'a'	"ァ"
+#	"l"	'i'	"ィ"
+#	"l"	'u'	"ゥ"
+#	"l"	'e'	"ェ"
+#	"l"	'o'	"ォ"
+	"l"	'a'	"ラ"
+	"l"	'i'	"リ"
+	"l"	'u'	"ル"
+	"l"	'e'	"レ"
+	"l"	'o'	"ロ"
+	"l"	'l'	"ッl"
+#
+	"m"	'a'	"マ"
+	"m"	'i'	"ミ"
+	"m"	'u'	"ム"
+	"m"	'e'	"メ"
+	"m"	'o'	"モ"
+	"m"	'b'	"ンb"
+	"m"	'm'	"ンm"
+	"m"	'p'	"ンp"
+	"m"	'm'	"ッm"
+#
+	"n"	'a'	"ナ"
+	"n"	'b'	"ンb"
+	"n"	'c'	"ンc"
+	"n"	'd'	"ンd"
+	"n"	'e'	"ネ"
+	"n"	'f'	"ンf"
+	"n"	'g'	"ンg"
+	"n"	'h'	"ンh"
+	"n"	'i'	"ニ"
+	"n"	'j'	"ンj"
+	"n"	'k'	"ンk"
+	"n"	'l'	"ンl"
+	"n"	'm'	"ンm"
+#	"n"	'n'	"ン"
+	"n"	'N'	"ンン"
+	"n"	'n'	"ンn"
+	"n"	'o'	"ノ"
+	"n"	'p'	"ンp"
+	"n"	'r'	"ンr"
+	"n"	's'	"ンs"
+	"n"	't'	"ンt"
+	"n"	'u'	"ヌ"
+	"n"	'v'	"ンv"
+	"n"	'w'	"ンw"
+	"n"	'x'	"ンx"
+	"n"	'y'	"ny"
+	"n"	'z'	"ンz"
+#	"n"	'.'	"ン. "
+#	"n"	','	"ン, "
+#	"n"	'/'	"ン・"
+	"n"	'.'	"ン。"
+	"n"	','	"ン、"
+	"n"	'/'	"ン/"
+#
+	"p"	'a'	"パ"
+	"p"	'i'	"ピ"
+	"p"	'u'	"プ"
+	"p"	'e'	"ペ"
+	"p"	'o'	"ポ"
+	"p"	'p'	"ッp"
+#
+	"r"	'a'	"ラ"
+	"r"	'i'	"リ"
+	"r"	'u'	"ル"
+	"r"	'e'	"レ"
+	"r"	'o'	"ロ"
+	"r"	'r'	"ッr"
+#
+	"s"	'a'	"サ"
+	"s"	'i'	"シ"
+	"s"	'u'	"ス"
+	"s"	'e'	"セ"
+	"s"	'o'	"ソ"
+	"s"	's'	"ッs"
+#
+	"t"	'a'	"タ"
+	"t"	'i'	"チ"
+	"t"	'u'	"ツ"
+	"t"	'e'	"テ"
+	"t"	'o'	"ト"
+	"t"	't'	"ッt"
+#
+	"v"	'a'	"ヴァ"
+	"v"	'i'	"ヴィ"
+	"v"	'u'	"ヴ"
+	"v"	'e'	"ヴェ"
+	"v"	'o'	"ヴォ"
+	"v"	'v'	"ッv"
+#
+	"w"	'a'	"ワ"
+	"w"	'i'	"ヰ"
+	"w"	'u'	"ウ"
+	"w"	'e'	"ヱ"
+	"w"	'o'	"ヲ"
+	"w"	'n'	"ン"
+	"w"	'w'	"ッw"
+#
+	"x"	'a'	"ァ"
+	"x"	'i'	"ィ"
+	"x"	'u'	"ゥ"
+	"x"	'e'	"ェ"
+	"x"	'o'	"ォ"
+	"x"	'x'	"ッx"
+#
+	"y"	'a'	"ヤ"
+	"y"	'i'	"イ"
+	"y"	'u'	"ユ"
+	"y"	'e'	"イェ"
+	"y"	'o'	"ヨ"
+	"y"	'y'	"ッy"
+#
+	"z"	'a'	"ザ"
+	"z"	'i'	"ジ"
+	"z"	'u'	"ズ"
+	"z"	'e'	"ゼ"
+	"z"	'o'	"ゾ"
+	"z"	'z'	"ッz"
+#
+#
+	include	'rule.kigou.egg'
+#
+#
+	""	'a'	"ア"
+	""	'i'	"イ"
+	""	'u'	"ウ"
+	""	'e'	"エ"
+	""	'o'	"オ"
+	""	'N'	"ン"
+#
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/ccdef/rule.kigou.egg	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,224 @@
+##	Egg が好きな人の為の記号変換ルール
+##		by nayuta@is.s.u-tokyo.ac.jp
+#
+#
+	"z"	'1'	"○"
+	"z"	'!'	"●"
+	"z"	'2'	"▽"
+	"z"	'@'	"▼"
+	"z"	'3'	"△"
+	"z"	'#'	"▲"
+	"z"	'4'	"□"
+	"z"	'$'	"■"
+	"z"	'5'	"◇"
+	"z"	'%'	"◆"
+	"z"	'6'	"☆"
+	"z"	'^'	"★"
+	"z"	'7'	"◎"
+	"z"	'&'	"£"
+	"z"	'8'	"¢"
+	"z"	'*'	"×"
+	"z"	'9'	"♂"
+	"z"	'('	"【"
+	"z"	'0'	"♀"
+	"z"	')'	"】"
+	"z"	'-'	"〜"
+	"z"	'_'	"∴"
+	"z"	'='	"≠"
+	"z"	'+'	"±"
+	"z"	'\\'	"\"
+	"z"	'|'	"‖"
+	"z"	'`'	"´"
+	"z"	'~'	"¨"
+	"z"	'q'	"《"
+	"z"	'Q'	"〈"
+	"z"	'w'	"》"
+	"z"	'W'	"〉"
+	"z"	'r'	"々"
+	"z"	'R'	"仝"
+	"z"	't'	"〆"
+	"z"	'T'	"§"
+	"z"	'p'	"〒"
+	"z"	'P'	"↑"
+	"z"	'['	"『"
+	"z"	'{'	"〔"
+	"z"	']'	"』"
+	"z"	'}'	"〕"
+	"z"	's'	"ヽ"
+	"z"	'S'	"ヾ"
+	"z"	'd'	"ゝ"
+	"z"	'D'	"ゞ"
+	"z"	'f'	"〃"
+	"z"	'F'	"→"
+	"z"	'g'	"‐"
+	"z"	'G'	"―"
+	"z"	'h'	"←"
+	"z"	'j'	"↓"
+	"z"	'k'	"↑"
+	"z"	'l'	"→"
+	"z"	';'	"゛"
+	"z"	':'	"゜"
+	"z"	'\''	"‘"
+	"z"	'"'	"“"
+	"z"	'x'	":-"
+	"z"	'X'	":-)"
+	"z"	'c'	"〇"
+	"z"	'C'	"℃"
+	"z"	'v'	"※"
+	"z"	'V'	"÷"
+	"z"	'b'	"°"
+	"z"	'B'	"←"
+	"z"	'n'	"′"
+	"z"	'N'	"↓"
+	"z"	'm'	"″"
+	"z"	'M'	"〓"
+	"z"	','	"‥"
+	"z"	'<'	"≦"
+	"z"	'.'	"…"
+	"z"	'>'	"≧"
+	"z"	'/'	"・"
+	"z"	'?'	"∞"
+#
+#
+	"Z"	'0'	"0"
+	"Z"	'1'	"1"
+	"Z"	'2'	"2"
+	"Z"	'3'	"3"
+	"Z"	'4'	"4"
+	"Z"	'5'	"5"
+	"Z"	'6'	"6"
+	"Z"	'7'	"7"
+	"Z"	'8'	"8"
+	"Z"	'9'	"9"
+	"Z"	'A'	"A"
+	"Z"	'B'	"B"
+	"Z"	'C'	"C"
+	"Z"	'D'	"D"
+	"Z"	'E'	"E"
+	"Z"	'F'	"F"
+	"Z"	'G'	"G"
+	"Z"	'H'	"H"
+	"Z"	'I'	"I"
+	"Z"	'J'	"J"
+	"Z"	'K'	"K"
+	"Z"	'L'	"L"
+	"Z"	'M'	"M"
+	"Z"	'N'	"N"
+	"Z"	'O'	"O"
+	"Z"	'P'	"P"
+	"Z"	'Q'	"Q"
+	"Z"	'R'	"R"
+	"Z"	'S'	"S"
+	"Z"	'T'	"T"
+	"Z"	'U'	"U"
+	"Z"	'V'	"V"
+	"Z"	'W'	"W"
+	"Z"	'X'	"X"
+	"Z"	'Y'	"Y"
+	"Z"	'Z'	"Z"
+	"Z"	'a'	"a"
+	"Z"	'b'	"b"
+	"Z"	'c'	"c"
+	"Z"	'd'	"d"
+	"Z"	'e'	"e"
+	"Z"	'f'	"f"
+	"Z"	'g'	"g"
+	"Z"	'h'	"h"
+	"Z"	'i'	"i"
+	"Z"	'j'	"j"
+	"Z"	'k'	"k"
+	"Z"	'l'	"l"
+	"Z"	'm'	"m"
+	"Z"	'n'	"n"
+	"Z"	'o'	"o"
+	"Z"	'p'	"p"
+	"Z"	'q'	"q"
+	"Z"	'r'	"r"
+	"Z"	's'	"s"
+	"Z"	't'	"t"
+	"Z"	'u'	"u"
+	"Z"	'v'	"v"
+	"Z"	'w'	"w"
+	"Z"	'x'	"x"
+	"Z"	'y'	"y"
+	"Z"	'z'	"z"
+	"Z"	' '	" "
+	"Z"	'!'	"!"
+	"Z"	'@'	"@"
+	"Z"	'#'	"#"
+	"Z"	'$'	"$"
+	"Z"	'%'	"%"
+	"Z"	'^'	"^"
+	"Z"	'&'	"&"
+	"Z"	'*'	"*"
+	"Z"	'('	"("
+	"Z"	')'	")"
+	"Z"	'-'	"−"
+	"Z"	'='	"="
+	"Z"	'`'	"`"
+	"Z"	'\\'	"¥"
+	"Z"	'|'	"|"
+	"Z"	'_'	"_"
+	"Z"	'+'	"+"
+	"Z"	'~'	" ̄"
+	"Z"	'['	"["
+	"Z"	']'	"]"
+	"Z"	'{'	"{"
+	"Z"	'}'	"}"
+	"Z"	':'	":"
+	"Z"	';'	";"
+	"Z"	'"'	"”"
+	"Z"	'\''	"’"
+	"Z"	'<'	"<"
+	"Z"	'>'	">"
+	"Z"	'?'	"?"
+	"Z"	'/'	"/"
+	"Z"	','	","
+	"Z"	'.'	"."
+#
+#
+	""	'0'	"0"
+	""	'1'	"1"
+	""	'2'	"2"
+	""	'3'	"3"
+	""	'4'	"4"
+	""	'5'	"5"
+	""	'6'	"6"
+	""	'7'	"7"
+	""	'8'	"8"
+	""	'9'	"9"
+	""	'!'	"!"
+	""	'@'	"@"
+	""	'#'	"#"
+	""	'$'	"$"
+	""	'%'	"%"
+	""	'^'	"^"
+	""	'&'	"&"
+	""	'*'	"*"
+	""	'('	"("
+	""	')'	")"
+	""	'-'	"ー"
+	""	'='	"="
+	""	'`'	"`"
+	""	'\\'	"¥"
+	""	'|'	"|"
+	""	'_'	"_"
+	""	'+'	"+"
+	""	'~'	" ̄"
+	""	'['	"「"
+	""	']'	"」"
+	""	'{'	"{"
+	""	'}'	"}"
+	""	':'	":"
+	""	';'	";"
+	""	'"'	"”"
+	""	'\''	"’"
+	""	'<'	"<"
+	""	'>'	">"
+	""	'?'	"?"
+#	""	'/'	"・"
+#	""	','	", "
+#	""	'.'	". "
+	""	'/'	"/"
+	""	','	"、"
+	""	'.'	"。"
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/ccdef/rule.roma	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,788 @@
+# $Id: rule.roma,v 1.1 1989/10/19 21:08:02 ishisone Rel $
+
+#	character conversion rule for romaji
+
+# ローマ字変換ルール
+	"by"	'a'	"びゃ"
+	"by"	'i'	"びぃ"
+	"by"	'u'	"びゅ"
+	"by"	'e'	"びぇ"
+	"by"	'o'	"びょ"
+#
+	"ch"	'a'	"ちゃ"
+	"ch"	'i'	"ち"
+	"ch"	'u'	"ちゅ"
+	"ch"	'e'	"ちぇ"
+	"ch"	'o'	"ちょ"
+#
+	"cy"	'a'	"ちゃ"
+	"cy"	'i'	"ちぃ"
+	"cy"	'u'	"ちゅ"
+	"cy"	'e'	"ちぇ"
+	"cy"	'o'	"ちょ"
+#
+	"ds"	'u'	"づ"
+#
+	"dh"	'a'	"でゃ"
+	"dh"	'i'	"でぃ"
+	"dh"	'u'	"でゅ"
+	"dh"	'e'	"でぇ"
+	"dh"	'o'	"でょ"
+#
+	"dw"	'a'	"どゎ"
+	"dw"	'i'	"どぃ"
+	"dw"	'u'	"どぅ"
+	"dw"	'e'	"どぇ"
+	"dw"	'o'	"どぉ"
+#
+	"dy"	'a'	"ぢゃ"
+	"dy"	'i'	"ぢぃ"
+	"dy"	'u'	"ぢゅ"
+	"dy"	'e'	"ぢぇ"
+	"dy"	'o'	"ぢょ"
+#
+	"gw"	'a'	"ぐぁ"
+	"gw"	'i'	"ぐぃ"
+	"gw"	'u'	"ぐぅ"
+	"gw"	'e'	"ぐぇ"
+	"gw"	'o'	"ぐぉ"
+#
+	"kw"	'a'	"くぁ"
+	"kw"	'i'	"くぃ"
+	"kw"	'u'	"くぅ"
+	"kw"	'e'	"くぇ"
+	"kw"	'o'	"くぉ"
+#
+	"ky"	'a'	"きゃ"
+	"ky"	'i'	"きぃ"
+	"ky"	'u'	"きゅ"
+	"ky"	'e'	"きぇ"
+	"ky"	'o'	"きょ"
+#
+	"k"	'a'	"か"
+	"k"	'i'	"き"
+	"k"	'u'	"く"
+	"k"	'e'	"け"
+	"k"	'o'	"こ"
+#
+	"fy"	'a'	"ふゃ"
+	"fy"	'i'	"ふぃ"
+	"fy"	'u'	"ふゅ"
+	"fy"	'e'	"ふぇ"
+	"fy"	'o'	"ふょ"
+#
+	"fw"	'a'	"ふゎ"
+	"fw"	'i'	"ふぃ"
+	"fw"	'u'	"ふぅ"
+	"fw"	'e'	"ふぇ"
+	"fw"	'o'	"ふぉ"
+#
+	"gy"	'a'	"ぎゃ"
+	"gy"	'i'	"ぎぃ"
+	"gy"	'u'	"ぎゅ"
+	"gy"	'e'	"ぎぇ"
+	"gy"	'o'	"ぎょ"
+#
+	"hw"	'a'	"ふぁ"
+	"hw"	'i'	"ふぃ"
+	"hw"	'e'	"ふぇ"
+	"hw"	'o'	"ふぉ"
+#
+	"hy"	'a'	"ひゃ"
+	"hy"	'i'	"ひぃ"
+	"hy"	'u'	"ひゅ"
+	"hy"	'e'	"ひぇ"
+	"hy"	'o'	"ひょ"
+#
+	"jy"	'a'	"じゃ"
+	"jy"	'i'	"じぃ"
+	"jy"	'u'	"じゅ"
+	"jy"	'e'	"じぇ"
+	"jy"	'o'	"じょ"
+#
+	"ly"	'a'	"りゃ"
+	"ly"	'i'	"りぃ"
+	"ly"	'u'	"りゅ"
+	"ly"	'e'	"りぇ"
+	"ly"	'o'	"りょ"
+#
+	"my"	'a'	"みゃ"
+	"my"	'i'	"みぃ"
+	"my"	'u'	"みゅ"
+	"my"	'e'	"みぇ"
+	"my"	'o'	"みょ"
+#
+	"ny"	'a'	"にゃ"
+	"ny"	'i'	"にぃ"
+	"ny"	'u'	"にゅ"
+	"ny"	'e'	"にぇ"
+	"ny"	'o'	"にょ"
+#
+	"py"	'a'	"ぴゃ"
+	"py"	'i'	"ぴぃ"
+	"py"	'u'	"ぴゅ"
+	"py"	'e'	"ぴぇ"
+	"py"	'o'	"ぴょ"
+#
+	"qy"	'a'	"くゃ"
+	"qy"	'i'	"くぃ"
+	"qy"	'u'	"くゅ"
+	"qy"	'e'	"くぇ"
+	"qy"	'o'	"くょ"
+#
+	"qw"	'a'	"くゎ"
+	"qw"	'i'	"くぃ"
+	"qw"	'u'	"くぅ"
+	"qw"	'e'	"くぇ"
+	"qw"	'o'	"くぉ"
+#
+	"ry"	'a'	"りゃ"
+	"ry"	'i'	"りぃ"
+	"ry"	'u'	"りゅ"
+	"ry"	'e'	"りぇ"
+	"ry"	'o'	"りょ"
+#
+	"sw"	'i'	"すぃ"
+	"sw"	'e'	"すぇ"
+#
+	"sh"	'a'	"しゃ"
+	"sh"	'i'	"し"
+	"sh"	'u'	"しゅ"
+	"sh"	'e'	"しぇ"
+	"sh"	'o'	"しょ"
+#
+	"sy"	'a'	"しゃ"
+	"sy"	'i'	"しぃ"
+	"sy"	'u'	"しゅ"
+	"sy"	'e'	"しぇ"
+	"sy"	'o'	"しょ"
+#
+	"th"	'a'	"てゃ"
+	"th"	'i'	"てぃ"
+	"th"	'u'	"てゅ"
+	"th"	'e'	"てぇ"
+	"th"	'o'	"てょ"
+#
+	"ts"	'a'	"つぁ"
+	"ts"	'i'	"つぃ"
+	"ts"	'u'	"つ"
+	"ts"	'e'	"つぇ"
+	"ts"	'o'	"つぉ"
+#
+	"ty"	'a'	"ちゃ"
+	"ty"	'i'	"ちぃ"
+	"ty"	'u'	"ちゅ"
+	"ty"	'e'	"ちぇ"
+	"ty"	'o'	"ちょ"
+#
+	"tw"	'a'	"とゎ"
+	"tw"	'i'	"とぃ"
+	"tw"	'u'	"とぅ"
+	"tw"	'e'	"とぇ"
+	"tw"	'o'	"とぉ"
+#
+	"vy"	'a'	"ヴヮ"
+	"vy"	'i'	"ヴィ"
+	"vy"	'u'	"ヴゥ"
+	"vy"	'e'	"ヴェ"
+	"vy"	'o'	"ヴョ"
+#
+	"wh"	'a'	"うゎ"
+	"wh"	'i'	"うぃ"
+	"wh"	'u'	"うぅ"
+	"wh"	'e'	"うぇ"
+	"wh"	'o'	"うぉ"
+#
+	"xc"	'a'	"ヵ"
+	"xk"	'a'	"ヵ"
+	"xk"	'e'	"ヶ"
+#
+	"xts"	'u'	"っ"
+	"xt"	'u'	"っ"
+#
+	"xy"	'a'	"ゃ"
+	"xy"	'i'	"ぃ"
+	"xy"	'u'	"ゅ"
+	"xy"	'e'	"ぇ"
+	"xy"	'o'	"ょ"
+#
+	"xw"	'a'	"ゎ"
+	"xw"	'i'	"ゐ"
+	"xw"	'e'	"ゑ"
+	"xw"	'o'	"を"
+#
+	"zy"	'a'	"じゃ"
+	"zy"	'i'	"じぃ"
+	"zy"	'u'	"じゅ"
+	"zy"	'e'	"じぇ"
+	"zy"	'o'	"じょ"
+#
+	"b"	'a'	"ば"
+	"b"	'i'	"び"
+	"b"	'u'	"ぶ"
+	"b"	'e'	"べ"
+	"b"	'o'	"ぼ"
+#
+	"c"	'a'	"か"
+	"c"	'i'	"し"
+	"c"	'u'	"く"
+#	"c"	'u'	"きゅ"
+	"c"	'e'	"せ"
+	"c"	'o'	"こ"
+#
+	"d"	'a'	"だ"
+	"d"	'i'	"ぢ"
+	"d"	'u'	"づ"
+	"d"	'e'	"で"
+	"d"	'o'	"ど"
+#
+	"f"	'a'	"ふぁ"
+	"f"	'i'	"ふぃ"
+	"f"	'u'	"ふ"
+	"f"	'e'	"ふぇ"
+	"f"	'o'	"ふぉ"
+#
+	"g"	'a'	"が"
+	"g"	'i'	"ぎ"
+	"g"	'u'	"ぐ"
+	"g"	'e'	"げ"
+	"g"	'o'	"ご"
+#
+	"h"	'a'	"は"
+	"h"	'i'	"ひ"
+	"h"	'u'	"ふ"
+	"h"	'e'	"へ"
+	"h"	'o'	"ほ"
+#
+	"j"	'a'	"じゃ"
+	"j"	'i'	"じ"
+	"j"	'u'	"じゅ"
+	"j"	'e'	"じぇ"
+	"j"	'o'	"じょ"
+#
+	"l"	'a'	"ら"
+	"l"	'i'	"り"
+	"l"	'u'	"る"
+	"l"	'e'	"れ"
+	"l"	'o'	"ろ"
+#
+	"m"	'a'	"ま"
+	"m"	'i'	"み"
+	"m"	'u'	"む"
+	"m"	'e'	"め"
+	"m"	'o'	"も"
+#
+	"n"	'a'	"な"
+	"n"	'i'	"に"
+	"n"	'u'	"ぬ"
+	"n"	'e'	"ね"
+	"n"	'o'	"の"
+#
+	"n"	'n'	"ん"
+#
+	"p"	'a'	"ぱ"
+	"p"	'i'	"ぴ"
+	"p"	'u'	"ぷ"
+	"p"	'e'	"ぺ"
+	"p"	'o'	"ぽ"
+#
+	"q"	'a'	"くぁ"
+	"q"	'i'	"くぃ"
+	"q"	'u'	"く"
+	"q"	'e'	"くぇ"
+	"q"	'o'	"くぉ"
+#
+	"r"	'a'	"ら"
+	"r"	'i'	"り"
+	"r"	'u'	"る"
+	"r"	'e'	"れ"
+	"r"	'o'	"ろ"
+#
+	"s"	'a'	"さ"
+	"s"	'i'	"し"
+	"s"	'u'	"す"
+	"s"	'e'	"せ"
+	"s"	'o'	"そ"
+#
+	"t"	'a'	"た"
+	"t"	'i'	"ち"
+	"t"	'u'	"つ"
+	"t"	'e'	"て"
+	"t"	'o'	"と"
+#
+	"v"	'a'	"ヴァ"
+	"v"	'i'	"ヴィ"
+	"v"	'u'	"ヴ"
+	"v"	'e'	"ヴェ"
+	"v"	'o'	"ヴォ"
+#
+	"w"	'a'	"わ"
+	"w"	'i'	"ゐ"
+	"w"	'u'	"う"
+	"w"	'e'	"ゑ"
+	"w"	'o'	"を"
+#
+	"x"	'a'	"ぁ"
+	"x"	'i'	"ぃ"
+	"x"	'u'	"ぅ"
+	"x"	'e'	"ぇ"
+	"x"	'o'	"ぉ"
+#
+	"y"	'a'	"や"
+	"y"	'i'	"い"
+	"y"	'u'	"ゆ"
+	"y"	'e'	"いぇ"
+	"y"	'o'	"よ"
+#
+	"z"	'a'	"ざ"
+	"z"	'i'	"じ"
+	"z"	'u'	"ず"
+	"z"	'e'	"ぜ"
+	"z"	'o'	"ぞ"
+#
+	""	'a'	"あ"
+	""	'i'	"い"
+	""	'u'	"う"
+	""	'e'	"え"
+	""	'o'	"お"
+#
+	"n"	'\''	"ん"
+	"n"	'b'	"んb"
+	"n"	'c'	"んc"
+	"n"	'd'	"んd"
+	"n"	'f'	"んf"
+	"n"	'g'	"んg"
+	"n"	'h'	"んh"
+	"n"	'j'	"んj"
+	"n"	'k'	"んk"
+	"n"	'l'	"んl"
+	"n"	'm'	"んm"
+	"n"	'n'	"んn"
+	"n"	'p'	"んp"
+	"n"	'r'	"んr"
+	"n"	'q'	"んq"
+	"n"	's'	"んs"
+	"n"	't'	"んt"
+	"n"	'v'	"んv"
+	"n"	'w'	"んw"
+	"n"	'x'	"んx"
+#	"n"	'y'	"んy"
+	"n"	'z'	"んz"
+#
+	"b"	'b'	"っb"
+	"c"	'c'	"っc"
+	"d"	'd'	"っd"
+	"f"	'f'	"っf"
+	"g"	'g'	"っg"
+	"h"	'h'	"っh"
+	"j"	'j'	"っj"
+	"k"	'k'	"っk"
+	"l"	'l'	"っl"
+	"m"	'm'	"っm"
+	"n"	'n'	"っn"
+	"p"	'p'	"っp"
+	"q"	'q'	"っq"
+	"r"	'r'	"っr"
+	"s"	's'	"っs"
+	"t"	't'	"っt"
+	"v"	'v'	"っv"
+	"w"	'w'	"っw"
+	"y"	'y'	"っy"
+	"z"	'z'	"っz"
+# カタカナ
+	"by"	'A'	"ビャ"
+	"by"	'I'	"ビィ"
+	"by"	'U'	"ビュ"
+	"by"	'E'	"ビェ"
+	"by"	'O'	"ビョ"
+#
+	"ch"	'A'	"チャ"
+	"ch"	'I'	"チ"
+	"ch"	'U'	"チュ"
+	"ch"	'E'	"チェ"
+	"ch"	'O'	"チョ"
+#
+	"cy"	'A'	"チャ"
+	"cy"	'I'	"チィ"
+	"cy"	'U'	"チュ"
+	"cy"	'E'	"チェ"
+	"cy"	'O'	"チョ"
+#
+	"ds"	'U'	"ヅ"
+#
+	"dh"	'A'	"デャ"
+	"dh"	'I'	"ディ"
+	"dh"	'U'	"デュ"
+	"dh"	'E'	"デェ"
+	"dh"	'O'	"デョ"
+#
+	"dw"	'A'	"ドヮ"
+	"dw"	'I'	"ドィ"
+	"dw"	'U'	"ドゥ"
+	"dw"	'E'	"ドェ"
+	"dw"	'O'	"ドォ"
+#
+	"dy"	'A'	"ヂャ"
+	"dy"	'I'	"ヂィ"
+	"dy"	'U'	"ヂュ"
+	"dy"	'E'	"ヂェ"
+	"dy"	'O'	"ヂョ"
+#
+	"gw"	'A'	"グァ"
+	"gw"	'I'	"グィ"
+	"gw"	'U'	"グゥ"
+	"gw"	'E'	"グェ"
+	"gw"	'O'	"グォ"
+#
+	"kw"	'A'	"クァ"
+	"kw"	'I'	"クィ"
+	"kw"	'U'	"クゥ"
+	"kw"	'E'	"クェ"
+	"kw"	'O'	"クォ"
+#
+	"ky"	'A'	"キャ"
+	"ky"	'I'	"キィ"
+	"ky"	'U'	"キュ"
+	"ky"	'E'	"キェ"
+	"ky"	'O'	"キョ"
+#
+	"fy"	'A'	"フャ"
+	"fy"	'I'	"フィ"
+	"fy"	'U'	"フュ"
+	"fy"	'E'	"フェ"
+	"fy"	'O'	"フョ"
+#
+	"fw"	'A'	"フヮ"
+	"fw"	'I'	"フィ"
+	"fw"	'U'	"フゥ"
+	"fw"	'E'	"フェ"
+	"fw"	'O'	"フォ"
+#
+	"gy"	'A'	"ギャ"
+	"gy"	'I'	"ギィ"
+	"gy"	'U'	"ギュ"
+	"gy"	'E'	"ギェ"
+	"gy"	'O'	"ギョ"
+#
+	"hw"	'A'	"フヮ"
+	"hw"	'I'	"フィ"
+	"hw"	'E'	"フェ"
+	"hw"	'O'	"フォ"
+#
+	"hy"	'A'	"ヒャ"
+	"hy"	'I'	"ヒィ"
+	"hy"	'U'	"ヒュ"
+	"hy"	'E'	"ヒェ"
+	"hy"	'O'	"ヒョ"
+#
+	"jy"	'A'	"ジャ"
+	"jy"	'I'	"ジィ"
+	"jy"	'U'	"ジュ"
+	"jy"	'E'	"ジェ"
+	"jy"	'O'	"ジョ"
+#
+	"ly"	'A'	"リャ"
+	"ly"	'I'	"リィ"
+	"ly"	'U'	"リュ"
+	"ly"	'E'	"リェ"
+	"ly"	'O'	"リョ"
+#
+	"my"	'A'	"ミャ"
+	"my"	'I'	"ミィ"
+	"my"	'U'	"ミュ"
+	"my"	'E'	"ミェ"
+	"my"	'O'	"ミョ"
+#
+	"ny"	'A'	"ニャ"
+	"ny"	'I'	"ニィ"
+	"ny"	'U'	"ニュ"
+	"ny"	'E'	"ニェ"
+	"ny"	'O'	"ニョ"
+#
+	"py"	'A'	"ピャ"
+	"py"	'I'	"ピィ"
+	"py"	'U'	"ピュ"
+	"py"	'E'	"ピェ"
+	"py"	'O'	"ピョ"
+#
+	"qy"	'A'	"クャ"
+	"qy"	'I'	"クィ"
+	"qy"	'U'	"クュ"
+	"qy"	'E'	"クェ"
+	"qy"	'O'	"クョ"
+#
+	"qw"	'A'	"クヮ"
+	"qw"	'I'	"クィ"
+	"qw"	'U'	"クゥ"
+	"qw"	'E'	"クェ"
+	"qw"	'O'	"クォ"
+#
+	"ry"	'A'	"リャ"
+	"ry"	'I'	"リィ"
+	"ry"	'U'	"リュ"
+	"ry"	'E'	"リェ"
+	"ry"	'O'	"リョ"
+#
+	"sw"	'I'	"スィ"
+	"sw"	'E'	"スェ"
+#
+	"sh"	'A'	"シャ"
+	"sh"	'I'	"シ"
+	"sh"	'U'	"シュ"
+	"sh"	'E'	"シェ"
+	"sh"	'O'	"ショ"
+#
+	"sy"	'A'	"シャ"
+	"sy"	'I'	"シィ"
+	"sy"	'U'	"シュ"
+	"sy"	'E'	"シェ"
+	"sy"	'O'	"ショ"
+#
+	"th"	'A'	"テャ"
+	"th"	'I'	"ティ"
+	"th"	'U'	"テュ"
+	"th"	'E'	"テェ"
+	"th"	'O'	"テョ"
+#
+	"ts"	'A'	"ツァ"
+	"ts"	'I'	"ツィ"
+	"ts"	'U'	"ツ"
+	"ts"	'E'	"ツェ"
+	"ts"	'O'	"ツォ"
+#
+	"ty"	'A'	"チャ"
+	"ty"	'I'	"チィ"
+	"ty"	'U'	"チュ"
+	"ty"	'E'	"チェ"
+	"ty"	'O'	"チョ"
+#
+	"tw"	'A'	"トヮ"
+	"tw"	'I'	"トィ"
+	"tw"	'U'	"トゥ"
+	"tw"	'E'	"トェ"
+	"tw"	'O'	"トォ"
+#
+	"vy"	'A'	"ヴヮ"
+	"vy"	'I'	"ヴィ"
+	"vy"	'U'	"ヴゥ"
+	"vy"	'E'	"ヴェ"
+	"vy"	'O'	"ヴョ"
+#
+	"wh"	'A'	"ウヮ"
+	"wh"	'I'	"ウィ"
+	"wh"	'U'	"ウゥ"
+	"wh"	'E'	"ウェ"
+	"wh"	'O'	"ウォ"
+#
+	"xc"	'A'	"ヵ"
+	"xk"	'A'	"ヵ"
+	"xk"	'E'	"ヶ"
+#
+	"xts"	'u'	"ッ"
+	"xt"	'u'	"ッ"
+#
+	"xy"	'A'	"ャ"
+	"xy"	'I'	"ィ"
+	"xy"	'U'	"ュ"
+	"xy"	'E'	"ェ"
+	"xy"	'O'	"ョ"
+#
+	"xw"	'A'	"ヮ"
+	"xw"	'I'	"ヰ"
+	"xw"	'E'	"ヱ"
+	"xw"	'O'	"ヲ"
+#
+	"zy"	'A'	"ジャ"
+	"zy"	'I'	"ジィ"
+	"zy"	'U'	"ジュ"
+	"zy"	'E'	"ジェ"
+	"zy"	'O'	"ジョ"
+#
+	"b"	'A'	"バ"
+	"b"	'I'	"ビ"
+	"b"	'U'	"ブ"
+	"b"	'E'	"ベ"
+	"b"	'O'	"ボ"
+#
+	"c"	'A'	"カ"
+	"c"	'I'	"シ"
+	"c"	'U'	"ク"
+#	"c"	'U'	"キュ"
+	"c"	'E'	"セ"
+	"c"	'O'	"コ"
+#
+	"d"	'A'	"ダ"
+	"d"	'I'	"ヂ"
+	"d"	'U'	"ヅ"
+	"d"	'E'	"デ"
+	"d"	'O'	"ド"
+#
+	"f"	'A'	"ファ"
+	"f"	'I'	"フィ"
+	"f"	'U'	"フ"
+	"f"	'E'	"フェ"
+	"f"	'O'	"フォ"
+#
+	"k"	'A'	"カ"
+	"k"	'I'	"キ"
+	"k"	'U'	"ク"
+	"k"	'E'	"ケ"
+	"k"	'O'	"コ"
+#
+	"g"	'A'	"ガ"
+	"g"	'I'	"ギ"
+	"g"	'U'	"グ"
+	"g"	'E'	"ゲ"
+	"g"	'O'	"ゴ"
+#
+	"h"	'A'	"ハ"
+	"h"	'I'	"ヒ"
+	"h"	'U'	"フ"
+	"h"	'E'	"ヘ"
+	"h"	'O'	"ホ"
+#
+	"j"	'A'	"ジャ"
+	"j"	'I'	"ジ"
+	"j"	'U'	"ジュ"
+	"j"	'E'	"ジェ"
+	"j"	'O'	"ジョ"
+#
+	"l"	'A'	"ラ"
+	"l"	'I'	"リ"
+	"l"	'U'	"ル"
+	"l"	'E'	"レ"
+	"l"	'O'	"ロ"
+#
+	"m"	'A'	"マ"
+	"m"	'I'	"ミ"
+	"m"	'U'	"ム"
+	"m"	'E'	"メ"
+	"m"	'O'	"モ"
+#
+	"n"	'A'	"ナ"
+	"n"	'I'	"ニ"
+	"n"	'U'	"ヌ"
+	"n"	'E'	"ネ"
+	"n"	'O'	"ノ"
+#
+	"n"	'N'	"ン"
+#
+	"p"	'A'	"パ"
+	"p"	'I'	"ピ"
+	"p"	'U'	"プ"
+	"p"	'E'	"ペ"
+	"p"	'O'	"ポ"
+#
+	"q"	'A'	"クァ"
+	"q"	'I'	"クィ"
+	"q"	'U'	"ク"
+	"q"	'E'	"クェ"
+	"q"	'O'	"クォ"
+#
+	"r"	'A'	"ラ"
+	"r"	'I'	"リ"
+	"r"	'U'	"ル"
+	"r"	'E'	"レ"
+	"r"	'O'	"ロ"
+#
+	"s"	'A'	"サ"
+	"s"	'I'	"シ"
+	"s"	'U'	"ス"
+	"s"	'E'	"セ"
+	"s"	'O'	"ソ"
+#
+	"t"	'A'	"タ"
+	"t"	'I'	"チ"
+	"t"	'U'	"ツ"
+	"t"	'E'	"テ"
+	"t"	'O'	"ト"
+#
+	"v"	'A'	"ヴァ"
+	"v"	'I'	"ヴィ"
+	"v"	'U'	"ヴ"
+	"v"	'E'	"ヴェ"
+	"v"	'O'	"ヴォ"
+#
+	"w"	'A'	"ワ"
+	"w"	'I'	"ヰ"
+	"w"	'U'	"ウ"
+	"w"	'E'	"ヱ"
+	"w"	'O'	"ヲ"
+#
+	"x"	'A'	"ァ"
+	"x"	'I'	"ィ"
+	"x"	'U'	"ゥ"
+	"x"	'E'	"ェ"
+	"x"	'O'	"ォ"
+#
+	"y"	'A'	"ヤ"
+	"y"	'I'	"イ"
+	"y"	'U'	"ユ"
+	"y"	'E'	"イェ"
+	"y"	'O'	"ヨ"
+#
+	"z"	'A'	"ザ"
+	"z"	'I'	"ジ"
+	"z"	'U'	"ズ"
+	"z"	'E'	"ゼ"
+	"z"	'O'	"ゾ"
+#
+	""	'A'	"ア"
+	""	'I'	"イ"
+	""	'U'	"ウ"
+	""	'E'	"エ"
+	""	'O'	"オ"
+#
+	"n"	'\''	"ン"
+	"n"	'B'	"ンB"
+	"n"	'C'	"ンC"
+	"n"	'D'	"ンD"
+	"n"	'F'	"ンF"
+	"n"	'G'	"ンG"
+	"n"	'H'	"ンH"
+	"n"	'J'	"ンJ"
+	"n"	'K'	"ンK"
+	"n"	'L'	"ンL"
+	"n"	'M'	"ンM"
+	"n"	'N'	"ンN"
+	"n"	'P'	"ンP"
+	"n"	'R'	"ンR"
+	"n"	'Q'	"ンQ"
+	"n"	'S'	"ンS"
+	"n"	'T'	"ンT"
+	"n"	'V'	"ンV"
+	"n"	'W'	"ンW"
+	"n"	'X'	"ンX"
+#	"n"	'Y'	"ンY"
+	"n"	'Z'	"ンZ"
+#
+	"b"	'B'	"ッB"
+	"c"	'C'	"ッC"
+	"d"	'D'	"ッD"
+	"f"	'F'	"ッF"
+	"g"	'G'	"ッG"
+	"h"	'H'	"ッH"
+	"j"	'J'	"ッJ"
+	"k"	'K'	"ッK"
+	"l"	'L'	"ッL"
+	"m"	'M'	"ッM"
+	"n"	'N'	"ッN"
+	"p"	'P'	"ッP"
+	"q"	'Q'	"ッQ"
+	"r"	'R'	"ッR"
+	"s"	'S'	"ッS"
+	"t"	'T'	"ッT"
+	"v"	'V'	"ッV"
+	"w"	'W'	"ッW"
+	"y"	'Y'	"ッY"
+	"z"	'Z'	"ッZ"
+# アスキーで記号を入れたいときに
+	"x"	'-'	"-"
+	"x"	'_'	"ー"
+	"x"	','	","
+	"x"	'.'	"."
+	""	kana_RO	"・"
+	""	'-'	"ー"
+	""	'_'	"ー"
+	""	','	"、"
+	""	'.'	"。"	convert
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/ccdef/rule.wnnroma	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,622 @@
+# $Id: rule.wnnroma,v 1.1 1989/10/19 21:08:07 ishisone Rel $
+
+# *** Romaji - Kana conversion rule for wnn users ***
+#
+# この定義ファイルは naota@ouics1.ics.osaka-u.junet 氏の協力によるもので、
+# wnn の標準ローマ字かな変換ルールに近いものです。
+#
+# rule.roma と以下のような点が違います。
+# ・ローマ字かな変換が wnn のデフォルトに近くなった
+# ・ローマ字モードで句点で変換しないようにした
+# ・ローマ字モードで[]が「」に変換されるようになった
+# ・ローマ字モードで/が・に変換されるようになった
+# ・ローマ字モードでnの処理が恐らくwnnと同じになった
+#	そのかわり 'n' を入力するといきなり 'ん' に変換される
+#	でもその後 'a' を入力すればちゃんと 'な' になるので安心してほしい
+
+	"xts"	'u'	"っ"
+	"\\ts"	'u'	"っ"
+#
+	"by"	'a'	"びゃ"
+	"by"	'i'	"びぃ"
+	"by"	'u'	"びゅ"
+	"by"	'e'	"びぇ"
+	"by"	'o'	"びょ"
+#
+	"ch"	'a'	"ちゃ"
+	"ch"	'i'	"ち"
+	"ch"	'u'	"ちゅ"
+	"ch"	'e'	"ちぇ"
+	"ch"	'o'	"ちょ"
+#
+	"dy"	'a'	"ぢゃ"
+	"dy"	'i'	"でぃ"
+	"dy"	'u'	"ぢゅ"
+	"dy"	'e'	"ぢぇ"
+	"dy"	'o'	"ぢょ"
+#
+	"gw"	'a'	"ぐゎ"
+	"gw"	'i'	"ぐぃ"
+	"gw"	'u'	"ぐ"
+	"gw"	'e'	"ぐぇ"
+	"gw"	'o'	"ぐぉ"
+#
+	"kw"	'a'	"くゎ"
+	"kw"	'i'	"くぃ"
+	"kw"	'u'	"く"
+	"kw"	'e'	"くぇ"
+	"kw"	'o'	"くぉ"
+#
+	"ky"	'a'	"きゃ"
+	"ky"	'i'	"きぃ"
+	"ky"	'u'	"きゅ"
+	"ky"	'e'	"きぇ"
+	"ky"	'o'	"きょ"
+#
+	"gy"	'a'	"ぎゃ"
+	"gy"	'i'	"ぎぃ"
+	"gy"	'u'	"ぎゅ"
+	"gy"	'e'	"ぎぇ"
+	"gy"	'o'	"ぎょ"
+#
+	"hy"	'a'	"ひゃ"
+	"hy"	'i'	"ひぃ"
+	"hy"	'u'	"ひゅ"
+	"hy"	'e'	"ひぇ"
+	"hy"	'o'	"ひょ"
+#
+	"ly"	'a'	"りゃ"
+	"ly"	'i'	"りぃ"
+	"ly"	'u'	"りゅ"
+	"ly"	'e'	"りぇ"
+	"ly"	'o'	"りょ"
+#
+	"my"	'a'	"みゃ"
+	"my"	'i'	"みぃ"
+	"my"	'u'	"みゅ"
+	"my"	'e'	"みぇ"
+	"my"	'o'	"みょ"
+#
+	"ny"	'a'	"にゃ"
+	"ny"	'i'	"にぃ"
+	"ny"	'u'	"にゅ"
+	"ny"	'e'	"にぇ"
+	"ny"	'o'	"にょ"
+#
+	"py"	'a'	"ぴゃ"
+	"py"	'i'	"ぴぃ"
+	"py"	'u'	"ぴゅ"
+	"py"	'e'	"ぴぇ"
+	"py"	'o'	"ぴょ"
+#
+	"ry"	'a'	"りゃ"
+	"ry"	'i'	"りぃ"
+	"ry"	'u'	"りゅ"
+	"ry"	'e'	"りぇ"
+	"ry"	'o'	"りょ"
+#
+	"sh"	'a'	"しゃ"
+	"sh"	'i'	"し"
+	"sh"	'u'	"しゅ"
+	"sh"	'e'	"しぇ"
+	"sh"	'o'	"しょ"
+#
+	"sy"	'a'	"しゃ"
+	"sy"	'i'	"しぃ"
+	"sy"	'u'	"しゅ"
+	"sy"	'e'	"しぇ"
+	"sy"	'o'	"しょ"
+#
+	"ts"	'a'	"つぁ"
+	"ts"	'i'	"つぃ"
+	"ts"	'u'	"つ"
+	"ts"	'e'	"つぇ"
+	"ts"	'o'	"つぉ"
+#
+	"ty"	'a'	"ちゃ"
+	"ty"	'i'	"てぃ"
+	"ty"	'u'	"ちゅ"
+	"ty"	'e'	"ちぇ"
+	"ty"	'o'	"ちょ"
+#
+	"xk"	'a'	"ヵ"
+	"xk"	'e'	"ヶ"
+	"\\k"	'a'	"ヵ"
+	"\\k"	'e'	"ヶ"
+#
+	"xt"	'u'	"っ"
+	"\\t"	'u'	"っ"
+#
+	"xy"	'a'	"ゃ"
+	"xy"	'u'	"ゅ"
+	"xy"	'o'	"ょ"
+	"\\y"	'a'	"ゃ"
+	"\\y"	'u'	"ゅ"
+	"\\y"	'o'	"ょ"
+#
+	"xw"	'a'	"ゎ"
+	"xw"	'i'	"うぃ"
+	"xw"	'e'	"うぇ"
+	"xw"	'o'	"うぉ"
+	"\\w"	'a'	"ゎ"
+#
+	"zy"	'a'	"じゃ"
+	"zy"	'i'	"じぃ"
+	"zy"	'u'	"じゅ"
+	"zy"	'e'	"じぇ"
+	"zy"	'o'	"じょ"
+#
+	"b"	'a'	"ば"
+	"b"	'i'	"び"
+	"b"	'u'	"ぶ"
+	"b"	'e'	"べ"
+	"b"	'o'	"ぼ"
+#
+	"d"	'a'	"だ"
+	"d"	'i'	"ぢ"
+	"d"	'u'	"づ"
+	"d"	'e'	"で"
+	"d"	'o'	"ど"
+#
+	"f"	'a'	"ふぁ"
+	"f"	'i'	"ふぃ"
+	"f"	'u'	"ふ"
+	"f"	'e'	"ふぇ"
+	"f"	'o'	"ふぉ"
+#
+	"g"	'a'	"が"
+	"g"	'i'	"ぎ"
+	"g"	'u'	"ぐ"
+	"g"	'e'	"げ"
+	"g"	'o'	"ご"
+#
+	"h"	'a'	"は"
+	"h"	'i'	"ひ"
+	"h"	'u'	"ふ"
+	"h"	'e'	"へ"
+	"h"	'o'	"ほ"
+#
+	"j"	'a'	"じゃ"
+	"j"	'i'	"じ"
+	"j"	'u'	"じゅ"
+	"j"	'e'	"じぇ"
+	"j"	'o'	"じょ"
+#
+	"k"	'a'	"か"
+	"k"	'i'	"き"
+	"k"	'u'	"く"
+	"k"	'e'	"け"
+	"k"	'o'	"こ"
+#
+	"l"	'a'	"ら"
+	"l"	'i'	"り"
+	"l"	'u'	"る"
+	"l"	'e'	"れ"
+	"l"	'o'	"ろ"
+#
+	"m"	'a'	"ま"
+	"m"	'i'	"み"
+	"m"	'u'	"む"
+	"m"	'e'	"め"
+	"m"	'o'	"も"
+#
+	"m"	'b'	"んb"
+	"m"	'm'	"んm"
+	"m"	'p'	"んp"
+#
+	"ん"	'a'	"な"
+	"ん"	'i'	"に"
+	"ん"	'u'	"ぬ"
+	"ん"	'e'	"ね"
+	"ん"	'o'	"の"
+	"ン"	'a'	"な"
+	"ン"	'i'	"に"
+	"ン"	'u'	"ぬ"
+	"ン"	'e'	"ね"
+	"ン"	'o'	"の"
+#
+	"p"	'a'	"ぱ"
+	"p"	'i'	"ぴ"
+	"p"	'u'	"ぷ"
+	"p"	'e'	"ぺ"
+	"p"	'o'	"ぽ"
+#
+	"q"	'a'	"くぁ"
+	"q"	'i'	"くぃ"
+	"q"	'u'	"く"
+	"q"	'e'	"くぇ"
+	"q"	'o'	"くぉ"
+#
+	"r"	'a'	"ら"
+	"r"	'i'	"り"
+	"r"	'u'	"る"
+	"r"	'e'	"れ"
+	"r"	'o'	"ろ"
+#
+	"s"	'a'	"さ"
+	"s"	'i'	"し"
+	"s"	'u'	"す"
+	"s"	'e'	"せ"
+	"s"	'o'	"そ"
+#
+	"t"	'a'	"た"
+	"t"	'i'	"ち"
+	"t"	'u'	"つ"
+	"t"	'e'	"て"
+	"t"	'o'	"と"
+#
+	"v"	'a'	"ヴァ"
+	"v"	'i'	"ヴィ"
+	"v"	'u'	"ヴ"
+	"v"	'e'	"ヴェ"
+	"v"	'o'	"ヴォ"
+#
+	"w"	'a'	"わ"
+	"w"	'i'	"ゐ"
+	"w"	'u'	"う"
+	"w"	'e'	"ゑ"
+	"w"	'o'	"を"
+#
+	"x"	'a'	"ぁ"
+	"x"	'i'	"ぃ"
+	"x"	'u'	"ぅ"
+	"x"	'e'	"ぇ"
+	"x"	'o'	"ぉ"
+	"\\"	'a'	"ぁ"
+	"\\"	'i'	"ぃ"
+	"\\"	'u'	"ぅ"
+	"\\"	'e'	"ぇ"
+	"\\"	'o'	"ぉ"
+#
+	"y"	'a'	"や"
+	"y"	'i'	"い"
+	"y"	'u'	"ゆ"
+	"y"	'e'	"いぇ"
+	"y"	'o'	"よ"
+#
+	"z"	'a'	"ざ"
+	"z"	'i'	"じ"
+	"z"	'u'	"ず"
+	"z"	'e'	"ぜ"
+	"z"	'o'	"ぞ"
+#
+	""	'a'	"あ"
+	""	'i'	"い"
+	""	'u'	"う"
+	""	'e'	"え"
+	""	'o'	"お"
+#
+	"ん"	'\''	"ん/"
+	"ん"	'y'	"ny"
+	"ン"	'Y'	"ny"
+#
+	"b"	'b'	"っb"
+	"c"	'c'	"っc"
+	"d"	'd'	"っd"
+	"f"	'f'	"っf"
+	"g"	'g'	"っg"
+	"h"	'h'	"っh"
+	"j"	'j'	"っj"
+	"k"	'k'	"っk"
+	"l"	'l'	"っl"
+	"m"	'm'	"っm"
+	"n"	'n'	"っn"
+	"p"	'p'	"っp"
+	"q"	'q'	"っq"
+	"r"	'r'	"っr"
+	"s"	's'	"っs"
+	"t"	't'	"っt"
+	"v"	'v'	"っv"
+	"w"	'w'	"っw"
+	"y"	'y'	"っy"
+	"z"	'z'	"っz"
+# カタカナ
+	"xts"	'U'	"ッ"
+	"\\ts"	'U'	"ッ"
+#
+	"by"	'A'	"ビャ"
+	"by"	'I'	"ビィ"
+	"by"	'U'	"ビュ"
+	"by"	'E'	"ビェ"
+	"by"	'O'	"ビョ"
+#
+	"ch"	'A'	"チャ"
+	"ch"	'I'	"チ"
+	"ch"	'U'	"チュ"
+	"ch"	'E'	"チェ"
+	"ch"	'O'	"チョ"
+#
+	"dy"	'A'	"ヂャ"
+	"dy"	'I'	"ディ"
+	"dy"	'U'	"ヂュ"
+	"dy"	'E'	"ヂェ"
+	"dy"	'O'	"ヂョ"
+#
+	"gw"	'A'	"グヮ"
+	"gw"	'I'	"グィ"
+	"gw"	'U'	"グ"
+	"gw"	'E'	"グェ"
+	"gw"	'O'	"グォ"
+#
+	"kw"	'A'	"クヮ"
+	"kw"	'I'	"クィ"
+	"kw"	'U'	"ク"
+	"kw"	'E'	"クェ"
+	"kw"	'O'	"クォ"
+#
+	"ky"	'A'	"キャ"
+	"ky"	'I'	"キィ"
+	"ky"	'U'	"キュ"
+	"ky"	'E'	"キェ"
+	"ky"	'O'	"キョ"
+#
+	"gy"	'A'	"ギャ"
+	"gy"	'I'	"ギィ"
+	"gy"	'U'	"ギュ"
+	"gy"	'E'	"ギェ"
+	"gy"	'O'	"ギョ"
+#
+	"hy"	'A'	"ヒャ"
+	"hy"	'I'	"ヒィ"
+	"hy"	'U'	"ヒュ"
+	"hy"	'E'	"ヒェ"
+	"hy"	'O'	"ヒョ"
+#
+	"ly"	'A'	"リャ"
+	"ly"	'I'	"リィ"
+	"ly"	'U'	"リュ"
+	"ly"	'E'	"リェ"
+	"ly"	'O'	"リョ"
+#
+	"my"	'A'	"ミャ"
+	"my"	'I'	"ミィ"
+	"my"	'U'	"ミュ"
+	"my"	'E'	"ミェ"
+	"my"	'O'	"ミョ"
+#
+	"ny"	'A'	"ニャ"
+	"ny"	'I'	"ニィ"
+	"ny"	'U'	"ニュ"
+	"ny"	'E'	"ニェ"
+	"ny"	'O'	"ニョ"
+#
+	"py"	'A'	"ピャ"
+	"py"	'I'	"ピィ"
+	"py"	'U'	"ピュ"
+	"py"	'E'	"ピェ"
+	"py"	'O'	"ピョ"
+#
+	"ry"	'A'	"リャ"
+	"ry"	'I'	"リィ"
+	"ry"	'U'	"リュ"
+	"ry"	'E'	"リェ"
+	"ry"	'O'	"リョ"
+#
+	"sh"	'A'	"シャ"
+	"sh"	'I'	"シ"
+	"sh"	'U'	"シュ"
+	"sh"	'E'	"シェ"
+	"sh"	'O'	"ショ"
+#
+	"sy"	'A'	"シャ"
+	"sy"	'I'	"シィ"
+	"sy"	'U'	"シュ"
+	"sy"	'E'	"シェ"
+	"sy"	'O'	"ショ"
+#
+	"ts"	'A'	"ツァ"
+	"ts"	'I'	"ツィ"
+	"ts"	'U'	"ツ"
+	"ts"	'E'	"ツェ"
+	"ts"	'O'	"ツォ"
+#
+	"ty"	'A'	"チャ"
+	"ty"	'I'	"ティ"
+	"ty"	'U'	"チュ"
+	"ty"	'E'	"チェ"
+	"ty"	'O'	"チョ"
+#
+	"xk"	'A'	"ヵ"
+	"xk"	'E'	"ヶ"
+	"\\k"	'A'	"ヵ"
+	"\\k"	'E'	"ヶ"
+#
+	"xt"	'u'	"ッ"
+	"\\t"	'u'	"ッ"
+#
+	"xy"	'A'	"ャ"
+	"xy"	'U'	"ュ"
+	"xy"	'O'	"ョ"
+	"\\y"	'A'	"ャ"
+	"\\y"	'U'	"ュ"
+	"\\y"	'O'	"ョ"
+#
+	"xw"	'A'	"ヮ"
+	"xw"	'I'	"ウィ"
+	"xw"	'E'	"ウェ"
+	"xw"	'O'	"ウォ"
+#
+	"zy"	'A'	"ジャ"
+	"zy"	'I'	"ジィ"
+	"zy"	'U'	"ジュ"
+	"zy"	'E'	"ジェ"
+	"zy"	'O'	"ジョ"
+#
+	"b"	'A'	"バ"
+	"b"	'I'	"ビ"
+	"b"	'U'	"ブ"
+	"b"	'E'	"ベ"
+	"b"	'O'	"ボ"
+#
+	"d"	'A'	"ダ"
+	"d"	'I'	"ヂ"
+	"d"	'U'	"ヅ"
+	"d"	'E'	"デ"
+	"d"	'O'	"ド"
+#
+	"f"	'A'	"ファ"
+	"f"	'I'	"フィ"
+	"f"	'U'	"フ"
+	"f"	'E'	"フェ"
+	"f"	'O'	"フォ"
+#
+	"k"	'A'	"カ"
+	"k"	'I'	"キ"
+	"k"	'U'	"ク"
+	"k"	'E'	"ケ"
+	"k"	'O'	"コ"
+#
+	"g"	'A'	"ガ"
+	"g"	'I'	"ギ"
+	"g"	'U'	"グ"
+	"g"	'E'	"ゲ"
+	"g"	'O'	"ゴ"
+#
+	"h"	'A'	"ハ"
+	"h"	'I'	"ヒ"
+	"h"	'U'	"フ"
+	"h"	'E'	"ヘ"
+	"h"	'O'	"ホ"
+#
+	"j"	'A'	"ジャ"
+	"j"	'I'	"ジ"
+	"j"	'U'	"ジュ"
+	"j"	'E'	"ジェ"
+	"j"	'O'	"ジョ"
+#
+	"l"	'A'	"ラ"
+	"l"	'I'	"リ"
+	"l"	'U'	"ル"
+	"l"	'E'	"レ"
+	"l"	'O'	"ロ"
+#
+	"m"	'A'	"マ"
+	"m"	'I'	"ミ"
+	"m"	'U'	"ム"
+	"m"	'E'	"メ"
+	"m"	'O'	"モ"
+#
+	"m"	'B'	"ンB"
+	"m"	'M'	"ンM"
+	"m"	'P'	"ンP"
+#
+	"ん"	'A'	"ナ"
+	"ん"	'I'	"ニ"
+	"ん"	'U'	"ヌ"
+	"ん"	'E'	"ネ"
+	"ん"	'O'	"ノ"
+	"ン"	'A'	"ナ"
+	"ン"	'I'	"ニ"
+	"ン"	'U'	"ヌ"
+	"ン"	'E'	"ネ"
+	"ン"	'O'	"ノ"
+#
+	"p"	'A'	"パ"
+	"p"	'I'	"ピ"
+	"p"	'U'	"プ"
+	"p"	'E'	"ペ"
+	"p"	'O'	"ポ"
+#
+	"q"	'A'	"クァ"
+	"q"	'I'	"クィ"
+	"q"	'U'	"ク"
+	"q"	'E'	"クェ"
+	"q"	'O'	"クォ"
+#
+	"r"	'A'	"ラ"
+	"r"	'I'	"リ"
+	"r"	'U'	"ル"
+	"r"	'E'	"レ"
+	"r"	'O'	"ロ"
+#
+	"s"	'A'	"サ"
+	"s"	'I'	"シ"
+	"s"	'U'	"ス"
+	"s"	'E'	"セ"
+	"s"	'O'	"ソ"
+#
+	"t"	'A'	"タ"
+	"t"	'I'	"チ"
+	"t"	'U'	"ツ"
+	"t"	'E'	"テ"
+	"t"	'O'	"ト"
+#
+	"v"	'A'	"ヴァ"
+	"v"	'I'	"ヴィ"
+	"v"	'U'	"ヴ"
+	"v"	'E'	"ヴェ"
+	"v"	'O'	"ヴォ"
+#
+	"w"	'A'	"ワ"
+	"w"	'I'	"ヰ"
+	"w"	'U'	"ウ"
+	"w"	'E'	"ヱ"
+	"w"	'O'	"ヲ"
+#
+	"x"	'A'	"ァ"
+	"x"	'I'	"ィ"
+	"x"	'U'	"ゥ"
+	"x"	'E'	"ェ"
+	"x"	'O'	"ォ"
+	"\\"	'A'	"ァ"
+	"\\"	'I'	"ィ"
+	"\\"	'U'	"ゥ"
+	"\\"	'E'	"ェ"
+	"\\"	'O'	"ォ"
+#
+	"y"	'A'	"ヤ"
+	"y"	'I'	"イ"
+	"y"	'U'	"ユ"
+	"y"	'E'	"イェ"
+	"y"	'O'	"ヨ"
+#
+	"z"	'A'	"ザ"
+	"z"	'I'	"ジ"
+	"z"	'U'	"ズ"
+	"z"	'E'	"ゼ"
+	"z"	'O'	"ゾ"
+#
+	""	'A'	"ア"
+	""	'I'	"イ"
+	""	'U'	"ウ"
+	""	'E'	"エ"
+	""	'O'	"オ"
+#
+	"ン"	'\''	"ン/"
+	"ん"	'Y'	"ny"
+	"ン"	'Y'	"ny"
+#
+	"b"	'B'	"ッB"
+	"c"	'C'	"ッC"
+	"d"	'D'	"ッD"
+	"f"	'F'	"ッF"
+	"g"	'G'	"ッG"
+	"h"	'H'	"ッH"
+	"j"	'J'	"ッJ"
+	"k"	'K'	"ッK"
+	"l"	'L'	"ッL"
+	"m"	'M'	"ッM"
+	"n"	'N'	"ッN"
+	"p"	'P'	"ッP"
+	"q"	'Q'	"ッQ"
+	"r"	'R'	"ッR"
+	"s"	'S'	"ッS"
+	"t"	'T'	"ッT"
+	"v"	'V'	"ッV"
+	"w"	'W'	"ッW"
+	"y"	'Y'	"ッY"
+	"z"	'Z'	"ッZ"
+# アスキーで記号を入れたいときに
+	"x"	'-'	"-"
+	"x"	'_'	"ー"
+	"x"	','	","
+	"x"	'.'	"."
+	""	'/'	"・"
+	""	'-'	"ー"
+	""	'_'	"ー"
+	""	','	"、"
+	""	'.'	"。"	convert
+	""	'['	"「"
+	""	']'	"」"
+	""	'n'		"ん"
+	""	'N'		"ン"
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/ccdef/rule.zascii	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,100 @@
+# $Id: rule.zascii,v 1.1 1989/10/19 21:08:16 ishisone Rel $
+
+#	character conversion rule for double-width ascii characters
+
+# 全角アスキー変換ルール
+	""	' '	" "
+	""	'!'	"!"
+	""	'"'	"“"
+	""	'#'	"#"
+	""	'$'	"$"
+	""	'%'	"%"
+	""	'&'	"&"
+	""	'\''	"’"
+	""	'('	"("
+	""	')'	")"
+	""	'*'	"*"
+	""	'+'	"+"
+	""	','	","
+	""	'-'	"−"
+	""	'.'	"."
+	""	'/'	"/"
+	""	'0'	"0"
+	""	'1'	"1"
+	""	'2'	"2"
+	""	'3'	"3"
+	""	'4'	"4"
+	""	'5'	"5"
+	""	'6'	"6"
+	""	'7'	"7"
+	""	'8'	"8"
+	""	'9'	"9"
+	""	':'	":"
+	""	';'	";"
+	""	'<'	"<"
+	""	'='	"="
+	""	'>'	">"
+	""	'?'	"?"
+	""	'@'	"@"
+	""	'A'	"A"
+	""	'B'	"B"
+	""	'C'	"C"
+	""	'D'	"D"
+	""	'E'	"E"
+	""	'F'	"F"
+	""	'G'	"G"
+	""	'H'	"H"
+	""	'I'	"I"
+	""	'J'	"J"
+	""	'K'	"K"
+	""	'L'	"L"
+	""	'M'	"M"
+	""	'N'	"N"
+	""	'O'	"O"
+	""	'P'	"P"
+	""	'Q'	"Q"
+	""	'R'	"R"
+	""	'S'	"S"
+	""	'T'	"T"
+	""	'U'	"U"
+	""	'V'	"V"
+	""	'W'	"W"
+	""	'X'	"X"
+	""	'Y'	"Y"
+	""	'Z'	"Z"
+	""	'['	"["
+	""	'\\'	"¥"
+	""	']'	"]"
+	""	'^'	"^"
+	""	'_'	"_"
+	""	'`'	"‘"
+	""	'a'	"a"
+	""	'b'	"b"
+	""	'c'	"c"
+	""	'd'	"d"
+	""	'e'	"e"
+	""	'f'	"f"
+	""	'g'	"g"
+	""	'h'	"h"
+	""	'i'	"i"
+	""	'j'	"j"
+	""	'k'	"k"
+	""	'l'	"l"
+	""	'm'	"m"
+	""	'n'	"n"
+	""	'o'	"o"
+	""	'p'	"p"
+	""	'q'	"q"
+	""	'r'	"r"
+	""	's'	"s"
+	""	't'	"t"
+	""	'u'	"u"
+	""	'v'	"v"
+	""	'w'	"w"
+	""	'x'	"x"
+	""	'y'	"y"
+	""	'z'	"z"
+	""	'{'	"{"
+	""	'|'	"|"
+	""	'}'	"}"
+	""	'~'	"〜"
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/client/README	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,21 @@
+This directory contains a simple client-side library for the kinput2
+protocol.
+
+* Files
+	README		-- this file
+	convlib.c	-- a simple client-side library
+
+You can find detailed description of kinput2 protocol in
+../doc/protocol (written in Japanese).
+
+Although kinput2 protocol is simple and easy to implement, it is a
+non-standard protocol, and there are few input servers which
+understand it.  So if you want to make your application general and
+portable, maybe using this protocol is not a right way.
+
+Convlib.c is a client-side library for handling kinput2 protocol.  It
+is designed to be used with Xt library, so it is difficult for
+applications which doesn't use Xt to make use of it.  In such cases,
+you should use XIM interface provided by Xlib, and still you can use
+kinput2 as the input server via X Input Method Protocol or Ximp
+protocol.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/client/convlib.c	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,1009 @@
+/*
+ *	convlib2.c -- X11 $B%D!<%k%-%C%HJQ49F~NOMQ%i%$%V%i%j(B
+ *
+ *		ishisone@sra.co.jp
+ */
+
+/*
+ * Copyright (c) 1991  Software Research Associates, Inc.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted, provided
+ * that the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Software Research Associates not be
+ * used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission.  Software Research
+ * Associates makes no representations about the suitability of this software
+ * for any purpose.  It is provided "as is" without express or implied
+ * warranty.
+ *
+ * Author:  Makoto Ishisone, Software Research Associates, Inc., Japan
+ */
+
+/*
+ * --$B%$%s%?!<%U%'%$%9(B--
+ *
+ * $BMQ0U$5$l$F$$$k%U%!%s%/%7%g%s$O<!$N(B4$B$D(B ($B$=$N$&$A(B1$B$D$O(B backward
+ * compatibility $B$N$?$a(B) $B$@$1$G$"$k!#;DG0$J$,$i(B X11R5 $B$G:N$jF~$l$i$l$kI8(B
+ * $B=`F~NO%$%s%?!<%U%'%$%9(B XIM $B$K$O=>$C$F$$$J$$!#$7$+$7(B Xt $B%D!<%k%-%C%H$r(B
+ * $BMxMQ$9$k%W%m%0%i%`$J$i(B XIM $B$h$j$b$O$k$+$K4JC1$KAH$_9~$`$3$H$,$G$-$k$@(B
+ * $B$m$&!#(B
+ *
+ * int _beginConversionWithAttributes(
+ *	Widget w,		$BJQ49F~NO$r$7$?$$(B widget
+ *	Atom catom,		$B%;%l%/%7%g%s%"%H%`(B eg "_JAPANESE_CONVERSION"
+ *	Atom tatom,		$BJQ49%F%-%9%H%?%$%W(B eg "COMPOUND_TEXT"
+ *	void (*inputproc)(),	$BJQ49%F%-%9%HF~NO%3!<%k%P%C%/4X?t(B
+ *	void (*startendproc)(),	$BJQ493+;O(B / $B=*N;(B / $B%"%\!<%H(B $B%3!<%k%P%C%/4X?t(B
+ *	XtPointer client_data,	$B%3!<%k%P%C%/4X?t$KEO$5$l$k%G!<%?(B
+ *	ArgList attrs,		$BJQ49B0@-%j%9%H(B
+ *	Cardinal nattrs		$BB0@-%j%9%H$N9`L\?t(B
+ *	)
+ *
+ *	$BJQ49$r3+;O$9$k!#$b$C$H@53N$K$$$&$H!"0z?t(B catom $B$K;XDj$5$l$?%;%l(B
+ *	$B%/%7%g%s%"%H%`$N%*!<%J!<(B ($B$3$l$,JQ49%U%m%s%H%(%s%I!"Nc$($P(B
+ *	kinput2 $B$G$"$k(B) $B$rC5$7!"JQ49$N%j%/%(%9%H$rAw$k!#F1;~$K0z?t(B attrs
+ *	$B$G;XDj$5$l$kJQ49B0@-(B ($BNc$($P%+!<%=%k$N0LCV(B) $B$r%U%m%s%H%(%s%I$KDL(B
+ *	$BCN$9$k!#JQ49B0@-$K$D$$$F$O8e$GJL$K@bL@$9$k!#%U%m%s%H%(%s%I$,B8:_(B
+ *	$B$7$J$$;~$K$O(B -1 $B$r!"$=$l0J30$O(B 0 $B$rJV$9!#(B
+ *
+ *	startendproc $B$OJQ49$N>uBV$NJQ2=$r%"%W%j%1!<%7%g%s$KCN$i$;$k$?$a(B
+ *	$B$N%3!<%k%P%C%/$G$"$k!#$3$N%U%!%s%/%7%g%s$O<!$N$h$&$J7A<0$G8F$S=P(B
+ *	$B$5$l$k!#(B
+ *
+ *	(*startendproc)(Widget w, Atom catom, int state,
+ *			XtPointer client_data, Window convwin)
+ *
+ *	w, catom, client_data $B$O(B _beginConversionWithAttributes() $B$G;XDj(B
+ *	$B$7$?$b$N$HF1$8$b$N$,EO$5$l$k!#(Bstate $B$K$O(B3$B<oN`$"$j!"$=$l$>$l(B
+ *		 0: $B%U%m%s%H%(%s%I$,JQ49%j%/%(%9%H$r<u$1IU$1$?(B
+ *		-1: $B%U%m%s%H%(%s%I$,JQ49%j%/%(%9%H$r5qH]$7$?(B
+ *		 1: $BJQ49$,=*N;$7$?(B
+ *	$B$H$$$&$3$H$rI=$9!#(Bstate $B$,(B 0 $B$N;~!"(Bconvwin $B$K$O<B:]$KJQ49=hM}(B
+ *	$B$,9T$J$o$l$k%&%#%s%I%&$N(B ID $B$,F~$k!#$3$l$O(B eventCaptureMethod 
+ *	$B$r(B "none" $B$K$7$F%/%i%$%"%s%H$KMh$?%-!<%$%Y%s%H$r%U%m%s%H%(%s%I(B
+ *	$B$K%U%)%o!<%I$9$k;~$J$I$K;HMQ$5$l$k!#(B
+ *
+ *	$B:F$S(B _beginConversionWithAttributes() $B$N0z?t$N@bL@$KLa$C$F(Btatom 
+ *	$B$O%U%m%s%H%(%s%I$+$iAw$i$l$F$/$kJ8;zNs$N%(%s%3!<%G%#%s%0$N;XDj$G(B
+ *	$B$"$k!#(B
+ *	kinput2 $B%W%m%H%3%k$G$O!"%U%m%s%H%(%s%I$KBP$7$F(B COMPOUND_TEXT$B%(%s(B
+ *	$B%3!<%G%#%s%0$r%5%]!<%H$9$k$3$H$7$+5a$a$F$$$J$$$N$G!"B>$N%(%s%3!<(B
+ *	$B%G%#%s%0$r%5%]!<%H$9$k$+$I$&$+$O%U%m%s%H%(%s%I$N%$%s%W%j%a%s%F!<(B
+ *	$B%7%g%s$K0MB8$9$k!#=>$C$F(B COMPOUNT_TEXT $B0J30$N%(%s%3!<%G%#%s%0$r(B
+ *	$B;XDj$9$k$H!"<B:]$KAw$i$l$F$/$kJ8;zNs$N%(%s%3!<%G%#%s%0$,;XDj$7$?(B
+ *	$B$b$N$H0[$J$k$3$H$b$"$jF@$k$N$GCm0U$9$k$3$H!#(B
+ *
+ *	$B3NDjJ8;zNs$,JQ49%U%m%s%H%(%s%I$+$iAw$i$l$F$/$k$H(B inputproc $B$K;X(B
+ *	$BDj$5$l$?%3!<%k%P%C%/%U%!%s%/%7%g%s$,<!$N$h$&$J7A<0$G8F$P$l$k!#(B
+ *
+ *	(*inputproc)(Widget w, Atom catom,
+ *			Atom proptype, int propformat,
+ *			unsigned long propsize, unsigned char *propvalue,
+ *			XtPointer client_data)
+ *
+ *	w $B$H(B catom$B!"$=$l$K(B client_data $B$O(B 
+ *	_beginConversionWithAttributes() $B$G;XDj$7$?$b$N$G$"$k!#(B
+ *
+ *	proptype $B$OJ8;zNs$N%(%s%3!<%G%#%s%0!"(Bpropformat $B$O(B1$BJ8;z$N%S%C%H(B
+ *	$BD9!"(Bpropsize $B$,D9$5!"$=$7$F(B propvalue $B$K<B:]$NJ8;zNs%G!<%?$,F~$C(B
+ *	$B$F$$$k!#<B$OJ8;zNs$O%U%m%s%H%(%s%I$+$i(B X $B$N%&%#%s%I%&%W%m%Q%F%#(B
+ *	$B$H$7$FEO$5$l$F$*$j!"$3$l$i$N%Q%i%a!<%?$O$=$N%W%m%Q%F%#$N%Q%i%a!<(B
+ *	$B%?$=$N$b$N$G$"$k!#=>$C$F(B XGetWindowProperty() $B$N@bL@$r;2>H$9$k$H(B
+ *	$B3F%Q%i%a!<%?$N0UL#$,$O$C$-$j$o$+$k$@$m$&!#(B
+ *
+ * void _changeConversionAttributes(
+ *	Widget	w,
+ *	Atom catom,		$B%;%l%/%7%g%s%"%H%`(B eg "_JAPANESE_CONVERSION"
+ *	ArgList attrs,		$BJQ49B0@-%j%9%H(B
+ *	Cardinal nattrs		$BB0@-%j%9%H$N9`L\?t(B
+ *	)
+ *
+ *	$BJQ49Cf$KJQ49B0@-$rJQ2=$5$;$k!#Nc$($P%+!<%=%k0LCV$,JQ$o$C$?$H$-$K(B
+ *	$B$3$N%U%!%s%/%7%g%s$G$=$l$r%U%m%s%H%(%s%I$KCN$i$;$k$3$H$,$G$-$k!#(B
+ *
+ * void _endConversion(
+ *	Widget w,
+ *	Atom catom,		$B%;%l%/%7%g%s%"%H%`(B eg "_JAPANESE_CONVERSION"
+ *	Boolean throwaway	$B$3$N8eMh$?JQ497k2L$r<u$1$H$k$+$I$&$+(B
+ *	)
+ *
+ *	$BJQ49$r=*N;$5$;$k!#DL>o!"JQ49$N=*N;$OJQ49%U%m%s%H%(%s%I$,9T$J$&$N(B
+ *	$B$GFC$K%"%W%j%1!<%7%g%s$+$i$3$N%U%!%s%/%7%g%s$r;H$C$F6/@)E*$K=*N;(B
+ *	$B$5$;$kI,MW$O$J$$!#(B
+ *	$B0z?t(B throwaway $B$,(B True $B$@$H$3$N%U%!%s%/%7%g%s$r<B9T$7$?8e$K%U%m(B
+ *	$B%s%H%(%s%I$+$iAw$i$l$?J8;zNs$rL5;k$9$k!#(B
+ *
+ * void _beginConversion(	-- provided for backward compatibility
+ *	Widgete w,		$BJQ49F~NO$r$7$?$$(B widget
+ *	Atom catom,		$B%;%l%/%7%g%s%"%H%`(B eg "_JAPANESE_CONVERSION"
+ *	Atom tatom,		$BJQ49%F%-%9%H%?%$%W(B eg "COMPOUND_TEXT"
+ *	void (*inputproc)(),	$BJQ49%F%-%9%HF~NO%3!<%k%P%C%/4X?t(B
+ *	XtPointer client_data	$B%3!<%k%P%C%/4X?t$KEO$5$l$k%G!<%?(B
+ *	)
+ *
+ *	$B$3$l$O(B backward compatibility $B$N$?$a$KMQ0U$5$l$?%U%!%s%/%7%g%s$G(B
+ *	$B$"$k!#$3$N%U%!%s%/%7%g%s$G$OJQ49B0@-$N;XDj$,0l@Z$G$-$J$$$7!"JQ49(B
+ *	$B>uBV$NJQ2=$bCN$k$3$H$,$G$-$J$$$N$G!"$G$-$k$@$1(B
+ *	_beginConversionWithAttributes() $B$rMQ$$$k$N$,K>$^$7$$!#(B
+ *
+ *
+ * --$B%;%l%/%7%g%s%"%H%`(B--
+ *
+ * _beginConversionWithAttributes() $B$J$I$K;XDj$9$k%;%l%/%7%g%s%"%H%`$O(B
+ * $BF~NO$7$?$$8@8l$K$h$C$F0[$J$j!"<!$N$h$&$JL>A0$K$J$C$F$$$k!#(B
+ *	"_<$B8@8lL>(B>_CONVERSION"
+ * $BNc$($PF|K\8l$N>l9g$O(B "_JAPANESE_CONVERSION" $B$G$"$k!#(B
+ *
+ *
+ * --$BJQ49B0@-%j%9%H(B--
+ *
+ * $BJQ49B0@-$O(B XtSetValues() $B$J$I$G;HMQ$5$l$k%j%9%H$HF1$87A(B (ArgList) $B$G$"$k!#(B
+ * $BB0@-$H$7$F;XDj$G$-$k$N$O<!$N9`L\$G$"$k!#4pK\E*$K$3$l$i$NB0@-$O(B XIM $B$N(B
+ * $B;EMM$G$NDj5A$r$=$N$^$^:NMQ$7$F$$$k$N$G!"5?LdE@$,$"$l$P(B XIM $B$N%I%-%e%a%s%H$r(B
+ * $B;2>H$7$F$[$7$$!#(B
+ *
+ * "inputStyle" : $BCM(B String
+ *	$BF~NO%9%?%$%k$r;XDj$9$k!#CM$O(B
+ *		"root" (root window style):	$BJL%&%#%s%I%&$K$h$kJQ49(B
+ *		"off" (off-the-spot style):	$B;XDj$7$?JQ49NN0hFb$G$NJQ49(B
+ *		"over" (over-the-spot style):	$B$=$N>lJQ49(B
+ *	$B$N$I$l$+$NJ8;zNs$r;XDj$9$k!#(B
+ *
+ * "focusWindow" : $BCM(B Window
+ *	$BJQ49$r9T$J$&%&%#%s%I%&$r;XDj$9$k!#$3$l$,;XDj$5$l$?$J$+$C$?>l9g$K(B
+ *	$B$O(B _beginConversionWithAttributes() $B$G;XDj$7$?(B Widget $B$N%&%#%s%I(B
+ *	$B%&$,;H$o$l$k$N$GDL>o$O;XDj$7$J$/$F$h$$!#(B
+ *
+ * "spotX", "spotY" : $BCM(B Position
+ *	$B%9%]%C%H%m%1!<%7%g%s$r;XDj$9$k!#$3$l$OF~NO%9%?%$%k$,(B 
+ *	over-the-spot $B$N;~$N$_M-8z$G$"$k!#J8;z$r=q$-;O$a$k0LCV$r;XDj$9$k(B
+ *	$B$,!"(BspotY $B$O%Y!<%9%i%$%s$N0LCV$G$"$k$3$H$KCm0U!#(B
+ *	spotX$B!"(BspotY $B$N$&$AJRJ}$@$1;XDj$7$F$bL58z!#(B
+ *
+ * "foreground", "background" : $BCM(B Pixel
+ *	$BA07J?'!"GX7J?'$r;XDj$9$k!#$3$l$bJRJ}$@$1;XDj$7$F$bL58z!#(B
+ *
+ * "eventCaptureMethod" : $BCM(B String
+ *	$B%U%m%s%H%(%s%I$,$I$N$h$&$KF~NO%$%Y%s%H$r$H$k$+$r;XDj$9$k!#(B
+ *		"none"		$B2?$b$7$J$$(B
+ *		"inputOnly"	InputOnly $B%&%#%s%I%&$K$h$k(B
+ *		"focusSelect"	$B%U%)!<%+%9%&%#%s%I%&$N%$%Y%s%H$rD>@\(B
+ *				$B%;%l%/%H$9$k(B
+ *	$B$G$"$k!#(B
+ *
+ *	"$B2?$b$7$J$$(B" $B$r;XDj$7$?>l9g!"%"%W%j%1!<%7%g%s$OJQ49Cf$K%"%W%j%1!<(B
+ *	$B%7%g%s$KMh$?%$%Y%s%H$r%U%m%s%H%(%s%I$KEO$7$F(B (XSendEvent() $B$r;H(B
+ *	$B$&(B) $B$d$i$J$1$l$P$J$i$J$$!#$3$N%$%Y%s%H$N%U%)%o!<%I:n6H$O$3$N%i%$(B
+ *	$B%V%i%j$G$O%5%]!<%H$7$F$$$J$$!#=>$C$F(B "$B2?$b$7$J$$(B" $B$r;XDj$9$k$3$H(B
+ *	$B$O$"$^$j$*4+$a$7$J$$!#(B
+ *
+ *	"$B%U%)!<%+%9%&%#%s%I%&$N%$%Y%s%H$rD>@\%;%l%/%H$9$k(B" $B>l9g!"%"%W%j(B
+ *	$B%1!<%7%g%s$OJQ49Cf$O(B sendevent $B%U%i%0$NN)$C$F$$$J$$%-!<%$%Y%s%H(B
+ *	$B$rL5;k$7$J$/$F$O$J$i$J$$!#(Bsendevent $B%U%i%0$NN)$C$?%-!<%$%Y%s%H$O(B
+ *	$B%U%m%s%H%(%s%I$+$iLa$5$l$?%$%Y%s%H$G$"$k2DG=@-$,$"$j!"$3$l$OL5;k(B
+ *	$B$7$J$/$F$bNI$$$,!"EvA3$N$3$H$J$,$i%;%-%e%j%F%#$K$O5$$r$D$1$J$/$F(B
+ *	$B$O$J$i$J$$!#(B
+ *
+ *	"InputOnly $B%&%#%s%I%&$K$h$k(B" $B$r;XDj$9$k$H%U%m%s%H%(%s%I$O%/%i%$(B
+ *	$B%"%s%H$N%&%#%s%I%&(B ($B$3$l$O%U%)!<%+%9%&%#%s%I%&$G$O$J$/!"(B
+ *	_beginConversionWithAttributes() $B$G;XDj$7$?(B Widget $B$N%&%#%s%I%&(B
+ *	$B$G$"$k(B) $B$NA0$KF)L@$J%&%#%s%I%&$r:n$j!"$=$3$KMh$?%$%Y%s%H$r2#<h$j(B
+ *	$B$9$k!#$3$N>l9g%$%Y%s%H$O%U%m%s%H%(%s%I$,>!<j$K$H$C$F$7$^$&$N$G%"(B
+ *	$B%W%j%1!<%7%g%s$O%$%Y%s%H$K4X$7$F2?$b9M$($J$/$F$h$$!#=>$C$FJ}K!$H(B
+ *	$B$7$F$O$3$l$,0lHV4JC1$G$"$k!#$7$+$7$J$,$iNc$($P(B click-to-type $B7A(B
+ *	$B<0$N%&%#%s%I%&%^%M!<%8%c$r;H$C$?$j$7$F%-!<F~NO$N%U%)!<%+%9$,@_Dj(B
+ *	$B$5$l$F$$$k>l9g$K$O$&$^$/$$$+$J$$!#(B
+ *
+ * "lineSpacing" : $BCM(B int
+ *	$B9T4V3V$r;XDj$9$k!#%Y!<%9%i%$%s4V$N5wN%$r;XDj$9$k!#(B
+ *
+ * "clientArea" : $BCM(B XRectangle $B$X$N%]%$%s%?(B
+ *	$BJQ49%F%-%9%H$NI=<($K;HMQ$9$kNN0h$r;XDj$9$k!#(B
+ *
+ * "statusArea" : $BCM(B XRectangle $B$X$N%]%$%s%?(B
+ *	$B%b!<%II=<($K;HMQ$9$kNN0h$r;XDj$9$k!#(B
+ *
+ * "cursor" : $BCM(B Cursor
+ *	$B;HMQ$9$k%+!<%=%k(B ($B%^%&%9%+!<%=%k$M(B) $B$r;XDj$9$k!#(B
+ *
+ * "fonts" : $BCM(B NULL $B%?!<%_%M!<%H$5$l$?(B XFontStruct * $B$NG[Ns(B
+ *	$B;HMQ$9$k%U%)%s%H$r;XDj$9$k!#=gHV$O$I$&$G$b$h$$!#%U%m%s%H%(%s%IB&(B
+ *	$B$GH=CG$9$k!#$?$@$7(B XLFD $B$K=>$o$J$$%U%)%s%H$r;XDj$5$l$k$H!"%U%m%s(B
+ *	$B%H%(%s%I$G$=$N%-%c%i%/%?%;%C%H$,$o$+$i$:!"$=$N%U%)%s%H$,;H$o$l$J(B
+ *	$B$$$3$H$,$"$k!#(B
+ *
+ * $B>e5-$NB0@-$N$&$A!"(BinputStyle $B$H(B eventCaptureMethod $B$OJQ49ESCf$G(B ($B$D$^$j(B
+ * _changeConversionAttributes() $B$G(B) $BJQ99$9$k$3$H$O$G$-$J$$!#(B
+ */
+
+#ifndef lint
+static char	*rcsid = "$Id: convlib.c,v 1.13 1999/01/07 03:14:32 ishisone Exp $";
+#endif
+
+#include <X11/StringDefs.h>
+#include <X11/Intrinsic.h>
+#include <X11/Xutil.h>
+#include <X11/Xatom.h>
+#include "ConvProto.h"
+
+typedef struct {
+    Display	*display;
+    Atom	profileAtom;	/* "_CONVERSION_PROFILE" */
+    Atom	typeAtom;	/* "_CONVERSION_ATTRIBUTE_TYPE" */
+    Atom	versionAtom;	/* "PROTOCOL-2.0" */
+    Atom	reqAtom;	/* "CONVERSION_REQUEST" */
+    Atom	notifyAtom;	/* "CONVERSION_NOTIFY" */
+    Atom	endAtom;	/* "CONVERSION_END" */
+    Atom	endReqAtom;	/* "CONVERSION_END_REQUEST" */
+    Atom	attrAtom;	/* "CONVERSION_ATTRIBUTE" */
+    Atom	attrNotifyAtom;	/* "CONVERSION_ATTRIBUTE_NOTIFY" */
+} ConversionAtoms;
+
+typedef struct {
+    Atom	convatom;
+    Window	convowner;
+    Atom	property;
+    void	(*inputproc)();
+    void	(*startendproc)();
+    XtPointer	closure;
+} ConversionContext;
+
+static XContext	convertPrivContext;
+
+#if __STDC__
+/* function prototype */
+static void callStart(Widget, ConversionContext *, Window);
+static void callFail(Widget, ConversionContext *);
+static void callEnd(Widget, ConversionContext *);
+static long getInputStyle(String);
+static long getCaptureMethod(String);
+static ConversionAtoms *getAtoms(Widget);
+static ConversionContext *getConversionContext(Widget);
+static void recvConvAck(Widget, XtPointer, XEvent *, Boolean *);
+static void getConv(Widget, XtPointer, XEvent *, Boolean *);
+static Boolean setConvAttrProp(Widget, ArgList, Cardinal, Atom);
+static int makeAttrData(Widget, ArgList, Cardinal, unsigned long **);
+static Boolean checkProtocols(Display *, Window, ConversionAtoms *);
+#else
+static void callStart();
+static void callFail();
+static void callEnd();
+static long getInputStyle();
+static long getCaptureMethod();
+static ConversionAtoms *getAtoms();
+static ConversionContext *getConversionContext();
+static void recvConvAck();
+static void getConv();
+static Boolean setConvAttrProp();
+static int makeAttrData();
+static Boolean checkProtocols();
+#endif
+
+static void
+callStart(w, context, convwin)
+Widget w;
+ConversionContext *context;
+Window convwin;
+{
+    if (context->startendproc != NULL) {
+	(*context->startendproc)(w, context->convatom,
+				 0, context->closure, convwin);
+    }
+}
+
+static void
+callFail(w, context)
+Widget w;
+ConversionContext *context;
+{
+    if (context->startendproc != NULL) {
+	(*context->startendproc)(w, context->convatom,
+				 -1, context->closure, None);
+    }
+}
+
+static void
+callEnd(w, context)
+Widget w;
+ConversionContext *context;
+{
+    if (context->startendproc != NULL) {
+	(*context->startendproc)(w, context->convatom,
+				 1, context->closure, None);
+    }
+}
+
+static long
+getInputStyle(s)
+String s;
+{
+    String p;
+    char buf[64];
+
+    (void)strcpy(buf, s);
+    for (p = buf; *p != '\0'; p++) {
+	if ('A' <= *p && *p <= 'Z') *p += 'a' - 'A';
+    }
+    if (!strcmp(buf, "over")) return CONVARG_OVERTHESPOT;
+    if (!strcmp(buf, "off")) return CONVARG_OFFTHESPOT;
+    return CONVARG_ROOTWINDOW;
+}
+
+static long
+getCaptureMethod(s)
+String s;
+{
+    String p;
+    char buf[64];
+
+    (void)strcpy(buf, s);
+    for (p = buf; *p != '\0'; p++) {
+	if ('A' <= *p && *p <= 'Z') *p += 'a' - 'A';
+    }
+    if (!strcmp(buf, "none")) return CONVARG_NONE;
+    if (!strcmp(buf, "focusselect")) return CONVARG_SELECT_FOCUS_WINDOW;
+    return CONVARG_CREATE_INPUTONLY;
+}
+
+static ConversionAtoms *
+getAtoms(w)
+Widget	w;
+{
+    int i;
+    Display *disp = XtDisplay(w);
+    ConversionAtoms *cap;
+    static ConversionAtoms *convatomp;
+    static Cardinal ndisp = 0;
+#define nalloc	2
+
+    /*
+     * $B%"%H%`$O%G%#%9%W%l%$$4$H$K0c$&$N$G!"(B
+     * $B%G%#%9%W%l%$$4$H$K:n$i$J$/$F$O$J$i$J$$(B
+     */
+
+    /* $B$9$G$K%"%H%`$,:n$i$l$F$$$k$+$I$&$+D4$Y$k(B */
+    cap = convatomp;
+    for (i = 0; i < ndisp; i++, cap++) {
+	if (cap->display == disp) return cap;
+    }
+
+    /*
+     * $B$^$@:n$i$l$F$$$J$$$N$G?7$7$/:n$k(B
+     */
+    if (ndisp == 0) {
+	/* $B:G=i$J$N$G(B Context $B$bF1;~$K:n$k(B */
+	convertPrivContext = XUniqueContext();
+	convatomp = (ConversionAtoms *)
+	  XtMalloc(sizeof(ConversionAtoms) * nalloc);
+	cap = convatomp;
+    } else if (ndisp % nalloc == 0) {
+	/* $B%5%$%:$rA}$d$9(B */
+	convatomp = (ConversionAtoms *)
+	  XtRealloc((char *)convatomp,
+		    sizeof(ConversionAtoms) * (ndisp + nalloc));
+	cap = convatomp + ndisp;
+    } else {
+	cap = convatomp + ndisp;
+    }
+
+    /* $B%G%#%9%W%l%$$NEPO?(B */
+    cap->display = disp;
+
+    /* Atom $B$N:n@.(B */
+    cap->profileAtom = XInternAtom(disp, CONVERSION_PROFILE, False);
+    cap->typeAtom = XInternAtom(disp, CONVERSION_ATTRIBUTE_TYPE, False);
+    cap->versionAtom = XInternAtom(disp, PROTOCOL_VERSION, False);
+    cap->reqAtom = XInternAtom(disp, "CONVERSION_REQUEST", False);
+    cap->notifyAtom = XInternAtom(disp, "CONVERSION_NOTIFY", False);
+    cap->endAtom = XInternAtom(disp, "CONVERSION_END", False);
+    cap->endReqAtom = XInternAtom(disp, "CONVERSION_END_REQUEST", False);
+    cap->attrAtom = XInternAtom(disp, "CONVERSION_ATTRIBUTE", False);
+    cap->attrNotifyAtom = XInternAtom(disp, "CONVERSION_ATTRIBUTE_NOTIFY", False);
+
+    ndisp++;
+
+    return cap;
+}
+
+static ConversionContext *
+getConversionContext(w)
+Widget	w;
+{
+    ConversionContext *context;
+
+    if (XFindContext(XtDisplay(w), XtWindow(w),
+		     convertPrivContext, (caddr_t *)&context)) {
+	/* error -- $BB?J,%3%s%F%-%9%H$,8+$D$+$i$J$+$C$?$?$a(B */
+	return NULL;
+    } else {
+	return context;
+    }
+}
+
+/* ARGSUSED */
+static void
+recvConvAck(w, closure, ev, junk)
+Widget	w;
+XtPointer	closure;
+XEvent	*ev;
+Boolean	*junk;	/* NOTUSED */
+{
+    XClientMessageEvent *cev = &(ev->xclient);
+    ConversionAtoms *cap;
+    ConversionContext *context;
+
+    if (ev->type != ClientMessage) return;
+
+    cap = getAtoms(w);
+    context = getConversionContext(w);
+
+    /* $B@5$7$$%$%Y%s%H$+$I$&$+%A%'%C%/$9$k(B */
+    if (cev->window != XtWindow(w) ||
+	cev->message_type != cap->notifyAtom ||
+	cev->data.l[0] != context->convatom) {
+	return;
+    }
+
+    /*
+     * $B$3$N%O%s%I%i$O$b$&MQ:Q$_$J$N$G30$9(B
+     */
+    XtRemoveEventHandler(w, NoEventMask, True, recvConvAck, closure);
+
+    if (cev->data.l[2] == None) {
+	XtWarning("selection request failed");
+	XDeleteContext(XtDisplay(w), XtWindow(w), convertPrivContext);
+	callFail(w, context);
+	XtFree((char *)context);
+	return;
+    }
+
+    callStart(w, context, (Window)cev->data.l[3]);
+
+    /*
+     * PropertyNotify $B$H(B CONVERSION_END $BMQ$N%$%Y%s%H%O%s%I%i$r(B
+     * $BEPO?$9$k(B
+     */
+    XtAddEventHandler(w, PropertyChangeMask, True, getConv, closure);
+
+    /* $B%W%m%Q%F%#L>$r%9%H%"$9$k(B */
+    context->property = cev->data.l[2];
+}
+
+/* ARGSUSED */
+static void
+getConv(w, closure, ev, junk)
+Widget	w;
+XtPointer	closure;
+XEvent	*ev;
+Boolean	*junk;	/* NOTUSED */
+{
+    ConversionAtoms *cap;
+    ConversionContext *context;
+
+    /* PropertyNotify $B$H(B ClientMessage $B0J30$OL5;k$9$k(B */
+    if (ev->type != PropertyNotify && ev->type != ClientMessage) return;
+
+    cap = getAtoms(w);
+    context = getConversionContext(w);
+
+    if (ev->type == ClientMessage) {
+	XClientMessageEvent *cev = &(ev->xclient);
+
+	/*
+	 * $BK\Ev$KF~NO=*N;$N%$%Y%s%H$+$I$&$+%A%'%C%/$9$k(B
+	 */
+	if (cev->message_type == cap->endAtom &&
+	    cev->format == 32 &&
+	    cev->data.l[0] == context->convatom) {
+	    /* $B%&%#%s%I%&$N%3%s%F%-%9%H$r:o=|$9$k(B */
+	    XDeleteContext(XtDisplay(w), XtWindow(w),
+			   convertPrivContext);
+	    /* $B%$%Y%s%H%O%s%I%i$r30$9(B */
+	    XtRemoveEventHandler(w, PropertyChangeMask, True,
+				 getConv, closure);
+	    callEnd(w, context);
+	    XtFree((char *)context);
+	}
+    } else {			/* PropertyNotify */
+	XPropertyEvent *pev = &(ev->xproperty);
+	Atom proptype;
+	int propformat;
+	unsigned long propsize, rest;
+	unsigned char *propvalue;
+
+	if (context->property == None) return;
+
+	/* $B@5$7$$%$%Y%s%H$+$I$&$+$N%A%'%C%/(B */
+	if (pev->window != XtWindow(w) ||
+	    pev->atom != context->property ||
+	    pev->state != PropertyNewValue) {
+	    return;
+	}
+
+	/* $B$b$7%3!<%k%P%C%/4X?t(B context->inputproc $B$,(B
+	 * NULL $B$J$i$P%W%m%Q%F%#$r:o=|$9$k$@$1(B
+	 */
+	if (context->inputproc == NULL) {
+	    XDeleteProperty(XtDisplay(w), XtWindow(w), context->property);
+	    return;
+	}
+
+	/* $B%W%m%Q%F%#$+$iJQ49J8;zNs$r<h$j=P$9(B */
+	XGetWindowProperty(XtDisplay(w), XtWindow(w),
+			   context->property,
+			   0L, 100000L, True, AnyPropertyType,
+			   &proptype, &propformat, &propsize, &rest,
+			   &propvalue);
+
+	/* $B%W%m%Q%F%#$N%?%$%W!&%U%)!<%^%C%H$N%A%'%C%/(B */
+	if (proptype == None) {
+	    /* $B%W%m%Q%F%#$,B8:_$7$J$+$C$?(B
+	     * $B$3$l$OO"B3$7$F2?2s$b%W%m%Q%F%#$K%G!<%?$,(B
+	     * $BF~$l$i$l$?;~!"0l2s$N(B GetWindowProperty $B$G(B
+	     * $BJ#?t$N%G!<%?$r$H$C$F$7$^$C$?$"$H$K5/$-$k(B
+	     * $B=>$C$F$3$l$O%(%i!<$G$O$J$$(B
+	     */
+	    return;
+	}
+
+	/* $B%3!<%k%P%C%/$r8F$V(B */
+	(*context->inputproc)(w, context->convatom,
+			      proptype, propformat,
+			      propsize, propvalue,
+			      context->closure);
+    }
+}
+
+static Boolean
+setConvAttrProp(w, attrs, nattrs, prop)
+Widget w;
+ArgList attrs;
+Cardinal nattrs;
+Atom prop;
+{
+    unsigned long *data;
+    int len;
+
+    if ((len = makeAttrData(w, attrs, nattrs, &data)) > 0) {
+	XChangeProperty(XtDisplay(w), XtWindow(w),
+			prop, prop, 32,
+			PropModeReplace, (unsigned char *)data, len);
+	XtFree((char *)data);
+	return True;
+    }
+    return False;
+}
+
+static int
+makeAttrData(w, args, nargs, datap)
+Widget w;
+ArgList args;
+Cardinal nargs;
+unsigned long **datap;
+{
+    unsigned long *data;
+    Cardinal len;
+    Boolean spotx_specified = False, spoty_specified = False;
+    Boolean fore_specified = False, back_specified = False;
+    Pixel savedfg, savedbg;
+    Position savedx, savedy;
+
+#define ALLOC(n) \
+    data = (unsigned long *)XtRealloc((char *)data, \
+				      sizeof(unsigned long)*(len+(n)))
+
+    data = NULL;
+    len = 0;
+    while (nargs-- > 0) {
+	if (!strcmp(args->name, "spotX")) {
+	    savedx = (Position)args->value;
+	    spotx_specified = True;
+	} else if (!strcmp(args->name, "spotY")) {
+	    savedy = (Position)args->value;
+	    spoty_specified = True;
+	} else if (!strcmp(args->name, "foreground")) {
+	    savedfg = (Pixel)args->value;
+	    fore_specified = True;
+	} else if (!strcmp(args->name, "background")) {
+	    savedbg = (Pixel)args->value;
+	    back_specified = True;
+	} else if (!strcmp(args->name, "focusWindow")) {
+	    Window win = (Window)args->value;
+	    ALLOC(2);
+	    data[len] = CONV_ATTR(CONVATTR_FOCUS_WINDOW, 1);
+	    data[len + 1] = (unsigned long)win;
+	    len += 2;
+	} else if (!strcmp(args->name, "inputStyle")) {
+	    long style = getInputStyle((String)args->value);
+	    ALLOC(2);
+	    data[len] = CONV_ATTR(CONVATTR_INPUT_STYLE, 1);
+	    data[len + 1] = style;
+	    len += 2;
+	} else if (!strcmp(args->name, "eventCaptureMethod")) {
+	    long method = getCaptureMethod((String)args->value);
+	    ALLOC(2);
+	    data[len] = CONV_ATTR(CONVATTR_EVENT_CAPTURE_METHOD, 1);
+	    data[len + 1] = method;
+	    len += 2;
+	} else if (!strcmp(args->name, "lineSpacing")) {
+	    int spacing = (int)args->value;
+	    ALLOC(2);
+	    data[len] = CONV_ATTR(CONVATTR_LINE_SPACING, 1);
+	    data[len + 1] = spacing;
+	    len += 2;
+	} else if (!strcmp(args->name, "clientArea")) {
+	    XRectangle *rectp = (XRectangle *)args->value;
+	    ALLOC(3);
+	    data[len] = CONV_ATTR(CONVATTR_CLIENT_AREA, 2);
+	    data[len + 1] = (rectp->x << 16) | (rectp->y & 0xffff);
+	    data[len + 2] = (rectp->width << 16) | (rectp->height & 0xffff);
+	    len += 3;
+	} else if (!strcmp(args->name, "statusArea")) {
+	    XRectangle *rectp = (XRectangle *)args->value;
+	    ALLOC(3);
+	    data[len] = CONV_ATTR(CONVATTR_STATUS_AREA, 2);
+	    data[len + 1] = (rectp->x << 16) | (rectp->y & 0xffff);
+	    data[len + 2] = (rectp->width << 16) | (rectp->height & 0xffff);
+	    len += 3;
+	} else if (!strcmp(args->name, "cursor")) {
+	    Cursor cursor = (Cursor)args->value;
+	    ALLOC(2);
+	    data[len] = CONV_ATTR(CONVATTR_CURSOR, 1);
+	    data[len + 1] = cursor;
+	    len += 2;
+	} else if (!strcmp(args->name, "fonts")) {
+	    XFontStruct **fontp = (XFontStruct **)args->value;
+	    int nfonts, nrealfonts;
+	    int i;
+
+	    for (nfonts = 0; fontp[nfonts] != NULL; nfonts++)
+	        ;
+	    ALLOC(nfonts + 1);
+	    nrealfonts = 0;
+	    for (i = 0; i < nfonts; i++) {
+		unsigned long atom;
+		if (XGetFontProperty(fontp[i], XA_FONT, &atom)) {
+		    data[len + ++nrealfonts] = atom;
+		}
+	    }
+	    data[len] = CONV_ATTR(CONVATTR_FONT_ATOMS, nrealfonts);
+	    len += nrealfonts + 1;
+	} else {
+	    String params[1];
+	    Cardinal num_params;
+
+	    params[0] = args->name;
+	    XtAppWarningMsg(XtWidgetToApplicationContext(w),
+			    "conversionError", "invalidResource",
+			    "ConversionLibraryError",
+			    "_beginConversionWithAttributes: unknown resource %s",
+			    params, &num_params);
+	}
+	args++;
+    }
+    if (spotx_specified && spoty_specified) {
+	ALLOC(2);
+	data[len] = CONV_ATTR(CONVATTR_SPOT_LOCATION, 1);
+	data[len + 1] = (savedx << 16) | (savedy & 0xffff);
+	len += 2;
+    }
+    if (fore_specified && back_specified) {
+	ALLOC(3);
+	data[len] = CONV_ATTR(CONVATTR_COLOR, 2);
+	data[len + 1] = savedfg;
+	data[len + 2] = savedbg;
+	len += 3;
+    }
+    *datap = data;
+    return len;
+#undef ALLOC
+}
+
+static Boolean
+checkProtocols(dpy, window, cap)
+Display *dpy;
+Window window;
+ConversionAtoms *cap;
+{
+    Atom type;
+    int format;
+    unsigned long nitems;
+    unsigned long bytesafter;
+    unsigned long *data, *saveddata;
+    int err;
+    Boolean ret;
+
+    data = NULL;
+    err = XGetWindowProperty(dpy, window, cap->profileAtom,
+			     0L, 100L, False,
+			     cap->typeAtom,
+			     &type, &format, &nitems,
+			     &bytesafter, (unsigned char **)&data);
+    if (err) return False;
+    if (format != 32 || type != cap->typeAtom) {
+	if (data != NULL) XtFree((char *)data);
+	return False;
+    }
+
+    ret = False;
+    saveddata = data;
+    while (nitems > 0) {
+	int code = CODE_OF_ATTR(*data);
+	int len = LENGTH_OF_ATTR(*data);
+
+	data++;
+	nitems--;
+	if (nitems < len) break;
+
+	switch (code) {
+	case CONVPROF_PROTOCOL_VERSION:
+	    if (*data == cap->versionAtom) ret = True;
+	    break;
+	case CONVPROF_SUPPORTED_STYLES:
+	    break;	/* XXX for now */
+	default:
+	    break;
+	}
+	data += len;
+	nitems -= len;
+    }
+    XtFree((char *)saveddata);
+
+    return ret;
+}
+
+
+/*
+ *	public functions
+ */
+
+int
+_beginConversionWithAttributes(w, catom, tatom, inputproc, startendproc, client_data, attrs, nattrs)
+Widget w;
+Atom catom;		/* Selection Atom e.g. JAPANESE_CONVERSION */
+Atom tatom;		/* Property Type Atom e.g. COMPOUND_TEXT */
+void (*inputproc)();	/* conversion text callback function */
+void (*startendproc)();	/* conversion start/end callback function */
+XtPointer client_data;	/* client_data passed to callback function */
+ArgList attrs;		/* attribute data */
+Cardinal nattrs;	/* number of attr args */
+{
+    Window owner;
+    XEvent event;
+    ConversionAtoms *cap;
+    ConversionContext *context;
+    Boolean anyattr;
+
+    cap = getAtoms(w);
+
+    /* $BJQ49%5!<%P$rC5$9(B */
+    if ((owner = XGetSelectionOwner(XtDisplay(w), catom)) == None) {
+	/* $B$J$$(B
+	 * $B$b$7$bJQ49Cf$@$C$?$iJQ49$rCf;_$9$k(B
+	 */
+	XtWarning("Conversion Server not found");
+	if ((context = getConversionContext(w)) != NULL) {
+	    /* $B%$%Y%s%H%O%s%I%i$r30$9(B */
+	    XtRemoveEventHandler(w, NoEventMask, True, recvConvAck,
+				 (XtPointer)NULL);
+	    XtRemoveEventHandler(w, PropertyChangeMask, True, getConv,
+				 (XtPointer)NULL);
+	    /* $B%&%#%s%I%&$N%3%s%F%-%9%H$r:o=|$9$k(B */
+	    XDeleteContext(XtDisplay(w), XtWindow(w), convertPrivContext);
+	    callEnd(w, context);
+	    XtFree((char *)context);
+	}
+	return -1;
+    }
+
+    /*
+     * $B:#$9$G$KJQ49Cf$+$I$&$+D4$Y$k(B
+     * $BJQ49Cf$J$i2?$b$;$:$K%j%?!<%s$9$k!D$o$1$K$O$$$+$J$$(B
+     * $B$J$<$+$H$$$&$H!"JQ49%5!<%P$,2?$i$+$N;v>p$GESCf$G;`$s$@>l9g(B
+     * CONVERSION_END $B$,%/%i%$%"%s%H$KMh$J$$$3$H$,$"$k$+$i$G$"$k(B
+     * $B$=$3$G!"JQ49Cf$N>l9g$G$b(B SelectionOwner $B$rC5$7$F!"$=$l$,(B
+     * $B:G=i$K(B _beginConversion() $B$,8F$P$l$?;~$H(B WindowID $B$,F1$8$+(B
+     * $B$I$&$+3NG'$9$k(B
+     * $BK\Ev$O(B SelectionOwner $B$K$J$C$?;~4V$b%A%'%C%/$7$?$$$N$@$,(B
+     * ICCCM $B$K=R$Y$i$l$F$$$k$h$&$K!"(BGetSelectionOwner $B$G$O(B
+     * $B$=$l$,$o$+$i$J$$$N$G$"$-$i$a$k(B
+     */
+    if ((context = getConversionContext(w)) != NULL) {
+	Window curOwner;
+	curOwner = (catom == context->convatom) ? owner :
+	  XGetSelectionOwner(XtDisplay(w), context->convatom);
+	if (curOwner == context->convowner) {
+	    /* $B2?$b$;$:$K%j%?!<%s(B */
+	    return 0;
+	}
+	/* SelectionOwner $B$,JQ$o$C$F$$$k(B
+	 * $B$3$l$OESCf$GJQ49%5!<%P$,%/%i%C%7%e$7$?$K0c$$$J$$(B
+	 * $B$H$$$&$3$H$G(B CONVERSION_END $B$,Mh$?;~$HF1$8$h$&$J(B
+	 * $B=hM}$r$9$k(B
+	 */
+	/* $B%$%Y%s%H%O%s%I%i$r30$9(B
+	 * CONVERSION_NOTIFY $B$N%$%Y%s%H$,Mh$k$^$G$O(B
+	 * recvConvAck() $B$,%O%s%I%i$G!"$=$N8e$O(B
+	 * getConv() $B$,%O%s%I%i$G$"$k(B
+	 */
+	XtRemoveEventHandler(w, NoEventMask, True, recvConvAck,
+			     (XtPointer)NULL);
+	XtRemoveEventHandler(w, PropertyChangeMask, True, getConv,
+			     (XtPointer)NULL);
+	/* $B%&%#%s%I%&$N%3%s%F%-%9%H$r:o=|$9$k(B */
+	XDeleteContext(XtDisplay(w), XtWindow(w), convertPrivContext);
+	callEnd(w, context);
+	XtFree((char *)context);
+    }
+
+    /*
+     * $B%5!<%P$+$i$N(B CONVERSION_NOTIFY $BMQ$N%$%Y%s%H%O%s%I%i$r(B
+     * $BEPO?$9$k(B
+     */
+    XtAddEventHandler(w, NoEventMask, True, recvConvAck, (XtPointer)NULL);
+
+    /*
+     * $B%3%s%F%-%9%H$r$D$/$C$FI,MW$J>pJs$rEPO?$9$k(B
+     */
+    context = XtNew(ConversionContext);
+    context->convatom = catom;
+    context->convowner = owner;
+    context->property = None;	/* $B$3$l$O(B CONVERSION_NOTIFY $B$,Mh$?;~$K(B
+				 * $B@5$7$/@_Dj$5$l$k(B */
+    context->inputproc = inputproc;
+    context->startendproc = startendproc;
+    context->closure = client_data;
+    XSaveContext(XtDisplay(w), XtWindow(w),
+		 convertPrivContext, (caddr_t)context);
+
+    /*
+     * $BJQ49B0@-%j%9%H$,;XDj$5$l$F$$$l$P%W%m%Q%F%#$K$=$l$rEPO?$9$k(B
+     */
+    if (nattrs != 0 && attrs != NULL &&
+	checkProtocols(XtDisplay(w), owner, cap)) {
+	anyattr = setConvAttrProp(w, attrs, nattrs, cap->attrAtom);
+    }
+
+    /*
+     * ClientMessage $B%$%Y%s%H$r;H$C$FF|K\8lF~NO$r%j%/%(%9%H$9$k(B
+     */
+    event.xclient.type = ClientMessage;
+    event.xclient.window = owner;
+    event.xclient.message_type = cap->reqAtom;
+    event.xclient.format = 32;
+    event.xclient.data.l[0] = catom;
+    event.xclient.data.l[1] = XtWindow(w);
+    event.xclient.data.l[2] = tatom;
+    /* $B7k2L$r%9%H%"$9$k%W%m%Q%F%#L>$O!"B?8@8l$rF1;~$K;HMQ$9$k$3$H$r(B
+     * $B9M$($F!"(Bselection atom $B$r;HMQ$9$k$3$H$K$9$k(B
+     */
+    event.xclient.data.l[3] = catom;
+    event.xclient.data.l[4] = anyattr ? cap->attrAtom : None;
+    XSendEvent(XtDisplay(w), owner, False, NoEventMask, &event);
+
+    return 0;
+}
+
+/* this is provided for backward compatibility */
+void
+_beginConversion(w, catom, tatom, inputproc, client_data)
+Widget	w;
+Atom	catom;			/* Selection Atom e.g. JAPANESE_CONVERSION */
+Atom	tatom;			/* Property Type Atom e.g. COMPOUND_TEXT */
+void	(*inputproc)();		/* conversion text callback function */
+XtPointer client_data;		/* client_data passed to callback function */
+{
+    (void)_beginConversionWithAttributes(w, catom, tatom, inputproc,
+				   (void (*)())NULL, client_data,
+				   (ArgList)NULL, 0);
+}
+
+void
+_changeConversionAttributes(w, catom, attrs, nattrs)
+Widget	w;
+Atom	catom;			/* Selection Atom e.g. JAPANESE_CONVERSION */
+ArgList	attrs;			/* attribute data */
+Cardinal nattrs;		/* number of attr args */
+{
+    XEvent event;
+    ConversionAtoms *cap;
+    ConversionContext *context;
+    unsigned long *data;
+    int len;
+
+    if (attrs == NULL || nattrs == 0) return;
+
+    cap = getAtoms(w);
+    context = getConversionContext(w);
+
+    if (context == NULL || (catom != None && catom != context->convatom)) {
+	return;
+    }
+
+    if (XGetSelectionOwner(XtDisplay(w), context->convatom) !=
+	context->convowner) {
+	/* $BJQ49%5!<%P$,0[$J$k!"$"$k$$$O$J$$(B */
+	XtRemoveEventHandler(w, NoEventMask, True, recvConvAck,
+			     (XtPointer)NULL);
+	XtRemoveEventHandler(w, PropertyChangeMask, True, getConv,
+			     (XtPointer)NULL);
+	/* $B%&%#%s%I%&$N%3%s%F%-%9%H$r:o=|$9$k(B */
+	XDeleteContext(XtDisplay(w), XtWindow(w), convertPrivContext);
+	callEnd(w, context);
+	XtFree((char *)context);
+	return;
+    }
+
+    data = NULL;
+    if ((len = makeAttrData(w, attrs, nattrs, &data)) == 0) return;
+
+    event.xclient.type = ClientMessage;
+    event.xclient.window = context->convowner;
+    event.xclient.message_type = cap->attrNotifyAtom;
+    event.xclient.format = 32;
+    event.xclient.data.l[0] = context->convatom;
+    event.xclient.data.l[1] = XtWindow(w);
+    if (len <= 3 && len == LENGTH_OF_ATTR(data[0]) + 1) {
+	int i;
+	/* $B%$%Y%s%H$NCf$K<}$^$k(B */
+	for (i = 0; i < len; i++) {
+	    event.xclient.data.l[2 + i] = data[i];
+	}
+    } else {
+	XChangeProperty(XtDisplay(w), XtWindow(w),
+			cap->attrAtom, cap->attrAtom, 32,
+			PropModeReplace, (unsigned char *)data, len);
+	event.xclient.data.l[2] = CONV_ATTR(CONVATTR_INDIRECT, 1);
+	event.xclient.data.l[3] = cap->attrAtom;
+    }
+
+    XSendEvent(XtDisplay(w), context->convowner, False, NoEventMask, &event);
+
+    if (data != NULL) XtFree((char *)data);
+}
+
+void
+_endConversion(w, catom, throwaway)
+Widget	w;
+Atom	catom;		/* Selection Atom */
+Boolean	throwaway;
+{
+    XEvent event;
+    ConversionAtoms *cap;
+    ConversionContext *context;
+
+    cap = getAtoms(w);
+    context = getConversionContext(w);
+
+    if (context == NULL || (catom != None && catom != context->convatom)) {
+	return;
+    }
+
+    if (XGetSelectionOwner(XtDisplay(w), context->convatom) !=
+	context->convowner) {
+	/* $BJQ49%5!<%P$,0[$J$k!"$"$k$$$O$J$$(B */
+	XtRemoveEventHandler(w, NoEventMask, True, recvConvAck,
+			     (XtPointer)NULL);
+	XtRemoveEventHandler(w, PropertyChangeMask, True, getConv,
+			     (XtPointer)NULL);
+	/* $B%&%#%s%I%&$N%3%s%F%-%9%H$r:o=|$9$k(B */
+	XDeleteContext(XtDisplay(w), XtWindow(w), convertPrivContext);
+	/* $B%3!<%k%P%C%/$r8F$V(B */
+	callEnd(w, context);
+	XtFree((char *)context);
+	return;
+    }
+
+    if (throwaway) context->inputproc = NULL;
+
+    event.xclient.type = ClientMessage;
+    event.xclient.window = context->convowner;
+    event.xclient.message_type = cap->endReqAtom;
+    event.xclient.format = 32;
+    event.xclient.data.l[0] = context->convatom;
+    event.xclient.data.l[1] = XtWindow(w);
+
+    XSendEvent(XtDisplay(w), context->convowner, False, NoEventMask, &event);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cmd/Imakefile	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,49 @@
+#include "../Kinput2.conf"
+
+         INCLUDES = -I../include -I..
+           KI2LIB = ../lib/libKi2.a
+            IMLIB = ../lib/imlib/libim.a
+
+#ifdef UseWnn
+#ifdef UseWnn6
+#ifdef StrlenNeeded
+             DEFW = -DUSE_WNN -DUSE_WNN6 -DNEED_Strlen
+#else
+             DEFW = -DUSE_WNN -DUSE_WNN6
+#endif
+#else
+#ifdef StrlenNeeded
+             DEFW = -DUSE_WNN -DNEED_Strlen
+#else
+             DEFW = -DUSE_WNN
+#endif
+#endif
+#if HasLibCrypt
+             LIBW = $(WNNLIB) -lcrypt
+#else
+             LIBW = $(WNNLIB)
+#endif
+#endif
+#ifdef UseCanna
+             DEFI = -DUSE_CANNA
+             LIBI = $(CANNALIB)
+#endif
+#ifdef UseSj3
+             DEFS = -DUSE_SJ3
+         XSJ3CLIB = ../lib/Xsj3clib/libXsj3clib.a
+             LIBS = $(XSJ3CLIB) $(SJ3LIB)
+#endif
+#ifdef UseAtok
+             DEFS = -DUSE_ATOK
+         XATOKLIB = ../lib/Xatoklib/libXatoklib.a
+             LIBS = $(XATOKLIB) -L$(ATOKLIBDIR) $(ATOKLIB)
+#endif
+
+          DEPLIBS = $(KI2LIB) $(IMLIB) $(XSJ3CLIB) $(XATOKLIB) XawClientDepLibs
+  LOCAL_LIBRARIES = $(KI2LIB) $(IMLIB) $(LIBW) $(LIBI) $(LIBS) XawClientLibs
+          DEFINES = $(SIGNAL_DEFINES) $(DEFW) $(DEFI) $(DEFS)
+             SRCS = kinput2.c
+             OBJS = kinput2.o
+
+ComplexProgramTarget(kinput2)
+InstallAppDefaults(Kinput2)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cmd/Kinput2.ad	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,121 @@
+! $Id: Kinput2.ad,v 1.24 1999/04/12 09:21:26 ishisone Exp $
+!
+!	app-defaults file for kinput2 version 2.0
+!
+!!
+!! things you shouldn't change
+!!
+Kinput2.mappedWhenManaged: false
+Kinput2.width: 1
+Kinput2.height: 1
+*converter.accelerators: <Key>: to-inputobj()
+! AIX seems to need the following superfluous definition.
+*ki2AppDefsLoaded: true
+!!
+!! title
+!!
+*SeparateConversion.title: Kana-Kanji Conversion
+*selectionShell.title: Candidate Selection
+*auxShell.title: Auxiliary Control
+! if you're using mwm (Motif1.1), you can set kanji titles.
+!*SeparateConversion.title: \033$(B$+$J4A;zJQ49
+!*SeparateConversion.titleEncoding: COMPOUND_TEXT
+!*selectionShell.title: \033$(BA*Br%Q%M%k
+!*selectionShell.titleEncoding: COMPOUND_TEXT
+!!
+!! fonts to be used by root-window type conversion widget and
+!! candidate selection widget
+!!
+*Font: -*-fixed-medium-r-normal--14-*-*-*-c-*-iso8859-1
+*KanjiFont: -misc-fixed-medium-r-normal--14-*-*-*-c-*-jisx0208.1983-0
+*KanaFont: -*-fixed-medium-r-normal--14-*-*-*-c-*-jisx0201.1976-0
+!!
+!!	Wnn setup
+!!
+!*CcWnn.Jserver:	"primary-jserver-host"
+!*CcWnn.jserver2nd:	"secondary-jserver-host-if-any"
+*CcWnn.ccdef:		ccdef.kinput2
+!*CcWnn.wnnEnvrc4:	"wnenvrc-file-for-Wnn4"
+!*CcWnn.wnnEnvrc6:	"wnenvrc-file-for-Wnn6"
+!!
+!!	Canna setup for version 2.x, 3.x
+!!
+!*Canna.Cannahost:	"canna-host"
+!*Canna.Cannafile:	"canna-initialization-file"
+!!
+!!	Sj3 setup
+!*Sj3.sj3serv:		"primary-sj3serv-host"
+!*Sj3.sj3serv2:		"secondary-sj3serv-host-if-any"
+!!
+!! candidate selection
+!!
+*selection.width: 500
+*selectionShell.allowShellResize: True
+*selection.cursor: left_ptr
+!!
+!! input style dependent resources
+!!
+! over-the-spot type input
+*OverTheSpotConversion.AutoSpotForwarding: true
+*OverTheSpotConversion.ShrinkWindow: true
+*OverTheSpotConversion.modeLocation: tracktext
+!*OverTheSpotConversion.modeLocation: bottomleft
+*OverTheSpotConversion*modeShell.input: false
+*OverTheSpotConversion*modeShell.allowShellResize: true
+*OverTheSpotConversion*text.borderWidth: 0
+*OverTheSpotConversion*modeShell.borderWidth: 2
+! off-the-spot type input
+*OffTheSpotConversion.input: false
+*OffTheSpotConversion*modeShell.borderWidth: 0
+*OffTheSpotConversion.text.borderWidth: 0
+! root-window type input
+*SeparateConversion*form*vertDistance: 3
+*SeparateConversion*mode.left: chainleft
+*SeparateConversion*mode.right: chainleft
+*SeparateConversion*mode.top: chaintop
+*SeparateConversion*mode.bottom: chaintop
+*SeparateConversion*mode.width: 80
+*SeparateConversion*mode.height: 20
+*SeparateConversion*mode.resizable: true
+*SeparateConversion*text.fromVert: mode
+*SeparateConversion*text.left: chainleft
+*SeparateConversion*text.right: chainright
+*SeparateConversion*text.top: chaintop
+*SeparateConversion*text.bottom: chainbottom
+*SeparateConversion*text.width: 400
+*SeparateConversion*text.height: 100
+! status display string justification -- for over-the-spot and off-the-spot
+!  "left" seems appropriate for most applications.
+*modeShell.mode.justify: left
+!!
+!! conversion protocol dependent resources
+!!
+! KinputProtocol
+*KinputProtocol.BackwardCompatible: true
+*KinputProtocol.XlcConversionStartKey:	Shift<Key>space
+! XimpProtocol
+*XimpProtocol.ForceDefaultServer: true
+! X Input Method Protocol
+*IMProtocol.locales: ja_JP.SJIS, ja_JP.EUC, ja_JP, japanese, japan, ja
+! common to XimpProtocol and IMProtocol
+*defaultFontList: -misc-fixed-medium-r-normal--14-*-*-*-c-*
+*ConversionStartKeys: \
+	Shift<Key>space \n\
+	Ctrl<Key>Kanji
+!!
+!! sending back unused keypress events
+!!
+*sendbackKeyPress: True
+!!
+!! title bar height of popup shells (candidate selection etc.)
+!!
+!*titlebarHeight: 24
+!!
+!! a work around for buggy window managers
+!!
+! If you encounter a strange phenomenon where kinput2's mode display
+! window is flickering and you cannot type in any text, try enabling
+! the following resource.  This phenomenon is caused by the incorrent
+! focus management of your window manager, and this resource avoids
+! it by making the window manager totally ignore the mode window.
+!*OverTheSpotConversion.UseOverrideShellForMode: True
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cmd/kinput2.c	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,646 @@
+/*
+ *	kinput2
+ */
+
+/*
+ * Copyright (C) 1991 by Software Research Associates, Inc.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted, provided
+ * that the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Software Research Associates not be
+ * used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission.  Software Research
+ * Associates makes no representations about the suitability of this software
+ * for any purpose.  It is provided "as is" without express or implied
+ * warranty.
+ *
+ * Author:  Makoto Ishisone, Software Research Associates, Inc., Japan
+ *		ishisone@sra.co.jp
+ */
+
+#ifndef lint
+static char	*rcsid = "$Id: kinput2.c,v 1.46 2002/01/06 15:13:38 ishisone Exp $";
+#endif
+
+#include <stdio.h>
+#include <signal.h>
+#include <X11/Intrinsic.h>
+#include <X11/StringDefs.h>
+#include <X11/Shell.h>
+#include "patchlevel.h"
+#include "AsyncErr.h"
+#include "MyDispatch.h"
+#include "IOECall.h"
+#include "ConvMgr.h"
+#include "KIProto.h"
+#include "XimpProto.h"
+#include "IMProto.h"
+
+#if !defined(USE_WNN) && !defined(USE_CANNA) && !defined(USE_SJ3) && !defined(USE_ATOK)
+#define USE_WNN			/* default */
+#endif
+
+#ifdef USE_WNN
+#include "CcWnn.h"
+#include "WcharDisp.h"
+#endif
+#ifdef USE_CANNA
+#include "Canna.h"
+#include "WcharDisp.h"
+#endif
+#ifdef USE_SJ3
+#include "Sj3.h"
+#include "WcharDisp.h"
+#endif
+#ifdef USE_ATOK
+#include "Atok.h"
+#include "WcharDisp.h"
+#endif
+
+#include "DebugPrint.h"
+
+int	debug_all;
+
+/* application resource */
+typedef struct {
+    char *conversionEngine;
+    int debugLevel;
+    Boolean useKinputProtocol;
+    Boolean useXimpProtocol;
+    Boolean useXIMProtocol;
+    Boolean appdefs_loaded;
+} AppResRec, *AppResP;
+
+static AppResRec appres;
+
+static XtResource app_resources[] = {
+    { "conversionEngine", "ConversionEngine", XtRString, sizeof(String),
+      XtOffset(AppResP, conversionEngine), XtRString, (XtPointer)"" },
+    { "debugLevel", "DebugLevel", XtRInt, sizeof(int),
+      XtOffset(AppResP, debugLevel), XtRImmediate, (XtPointer)0 },
+    { "useKinputProtocol", "UseKinputProtocol", XtRBoolean, sizeof(Boolean),
+      XtOffset(AppResP, useKinputProtocol), XtRImmediate, (XtPointer)True },
+    { "useXimpProtocol", "UseXimpProtocol", XtRBoolean, sizeof(Boolean),
+      XtOffset(AppResP, useXimpProtocol), XtRImmediate, (XtPointer)True },
+    { "useXIMProtocol", "UseXIMProtocol", XtRBoolean, sizeof(Boolean),
+      XtOffset(AppResP, useXIMProtocol), XtRImmediate, (XtPointer)True },
+    { "ki2AppDefsLoaded", "Ki2AppDefsLoaded", XtRBoolean, sizeof(Boolean),
+      XtOffset(AppResP, appdefs_loaded), XtRImmediate, (XtPointer)True },
+};
+
+static String fallback_resources[] = {
+    "*ki2AppDefsLoaded: false",
+    "Kinput2.mappedWhenManaged: false",
+    "Kinput2.width: 1",
+    "Kinput2.height: 1",
+    NULL,
+};
+
+static XrmOptionDescRec	options[] = {
+    {"-bc",		"*KinputProtocol.backwardCompatible", XrmoptionNoArg,	"True"},
+    {"-font",		"*JpWcharDisplay.font",	XrmoptionSepArg,	NULL},
+    {"-kanjifont",	"*JpWcharDisplay.kanjiFont", XrmoptionSepArg,	NULL},
+    {"-kanafont",	"*JpWcharDisplay.kanaFont", XrmoptionSepArg,	NULL},
+    {"-kinput",		".useKinputProtocol",	XrmoptionNoArg,		"on"},
+    {"+kinput",		".useKinputProtocol",	XrmoptionNoArg,		"off"},
+    {"-ximp",		".useXimpProtocol",	XrmoptionNoArg,		"on"},
+    {"+ximp",		".useXimpProtocol",	XrmoptionNoArg,		"off"},
+    {"-xim",		".useXIMProtocol",	XrmoptionNoArg,		"on"},
+    {"+xim",		".useXIMProtocol",	XrmoptionNoArg,		"off"},
+    {"-tbheight",	"*ConversionControl.titlebarHeight",
+						XrmoptionSepArg,	NULL},
+#ifdef DEBUG
+    {"-debug",		".debugLevel",		XrmoptionNoArg,		"1"},
+    {"-trace",		".debugLevel",		XrmoptionNoArg,		"10"},
+    {"-debuglevel",	".debugLevel",		XrmoptionSepArg,	NULL},
+#endif
+#ifdef USE_WNN
+    {"-wnn",		".conversionEngine",	XrmoptionNoArg,		"wnn"},
+    {"-jserver",	"*CcWnn.jserver",	XrmoptionSepArg,	NULL},
+    {"-ccdef",		"*CcWnn.ccdef",		XrmoptionSepArg,	NULL},
+    {"-wnnenvname",	"*CcWnn.wnnEnvname",	XrmoptionSepArg,	NULL},
+    {"-wnnenvrc4",	"*CcWnn.wnnEnvrc4",	XrmoptionSepArg,	NULL},
+    {"-wnnenvrc6",	"*CcWnn.wnnEnvrc6",	XrmoptionSepArg,	NULL},
+    {"-wnnenvrc",	"*CcWnn.wnnEnvrc",	XrmoptionSepArg,	NULL},
+#endif
+#ifdef USE_CANNA
+    {"-canna",		".conversionEngine",	XrmoptionNoArg,		"canna"},
+    {"-cannaserver",	"*Canna.cannahost",	XrmoptionSepArg,	NULL},
+    {"-cs",		"*Canna.cannahost",	XrmoptionSepArg,	NULL},
+    {"-cannafile",	"*Canna.cannafile",	XrmoptionSepArg,	NULL},
+#endif
+#ifdef USE_SJ3
+    {"-sj3",        ".conversionEngine",    XrmoptionNoArg,     "sj3"},
+    {"-sj3serv",    "*Sj3.sj3serv",     XrmoptionSepArg,    NULL},
+    {"-sj3serv2",   "*Sj3.sj3serv2",    XrmoptionSepArg,    NULL},
+    {"-sj3user",    "*Sj3.sj3user",     XrmoptionSepArg,    NULL},
+    {"-rcfile",     "*Sj3.rcfile",      XrmoptionSepArg,    NULL},
+    {"-sbfile",     "*Sj3.sbfile",      XrmoptionSepArg,    NULL},
+    {"-rkfile",     "*Sj3.rkfile",      XrmoptionSepArg,    NULL},
+    {"-hkfile",     "*Sj3.hkfile",  XrmoptionSepArg,    NULL},
+    {"-zhfile",     "*Sj3.zhfile",  XrmoptionSepArg,    NULL},
+    {"-sjrc",       "*Sj3.rcfile",      XrmoptionSepArg,    NULL},
+    {"-sjsb",       "*Sj3.sbfile",      XrmoptionSepArg,    NULL},
+    {"-sjrk",       "*Sj3.rkfile",      XrmoptionSepArg,    NULL},
+    {"-sjhk",       "*Sj3.hkfile",      XrmoptionSepArg,    NULL},
+    {"-sjzh",       "*Sj3.zhfile",      XrmoptionSepArg,    NULL},
+#endif
+#ifdef USE_ATOK
+    {"-atok",        ".conversionEngine",   XrmoptionNoArg,     "atok"},
+    {"-atokserver",  "*Atok.server",    XrmoptionSepArg,    NULL},
+    {"-as",          "*Atok.server",    XrmoptionSepArg,    NULL},
+    {"-atokport",    "*Atok.port",      XrmoptionSepArg,    NULL},
+    {"-atokconf",    "*Atok.conf",      XrmoptionSepArg,    NULL},
+    {"-atokstyle",   "*Atok.style",     XrmoptionSepArg,    NULL},
+#endif
+};
+
+XtAppContext	apc;
+Widget		toplevel;
+
+static int	numProtocols;
+static int	(*DefaultErrorHandler)();
+
+#if XtSpecificationRelease > 5
+static XtSignalId	interrupt;
+static void	interruptCallback();
+#else
+static void	exitTimer();
+#endif
+
+static WidgetClass	getInputObjClass();
+static int	IgnoreBadWindow();
+#ifdef SIGNALRETURNSINT
+static int	scheduleExit();
+#else
+static void	scheduleExit();
+#endif
+static void	Destroyed();
+static void	Exit();
+static void	realExit();
+static void	usage();
+static void	print_version();
+
+int
+main(ac, av)
+int ac;
+char **av;
+{
+    Widget manager, protocol;
+    int i;
+    WidgetClass inputobjclass, displayobjclass;
+    Widget inputobj;
+
+    toplevel = XtAppInitialize(&apc, "Kinput2",
+			       options, XtNumber(options),
+			       &ac, av,
+			       fallback_resources, (ArgList)NULL, 0);
+
+    /* check invalid argument */ 
+    if (ac > 1) {
+	int do_usage = 0;
+	for (i = 1; i < ac; i++) {
+	    if (!strcmp(av[i], "-version")) {
+		print_version();
+	    } else {
+		fprintf(stderr, "unknown argument: %s\n", av[i]);
+		do_usage = 1;
+	    }
+	}
+	if (do_usage) usage();
+    }
+
+    /* initialize asynchronous error handler */
+    XAEInit();
+
+    /* initialize I/O error callback handler */
+    XIOEInit();
+
+    XtGetApplicationResources(toplevel, &appres,
+			      app_resources, XtNumber(app_resources),
+			      NULL, 0);
+
+    /*
+     * If the application-specific class resource file
+     * (the "app-defaults" file) is not found,
+     * print a warning message.
+     */
+    if (!appres.appdefs_loaded) {
+	fprintf(stderr, "Warning: Cannot load app-defaults file.\n");
+	fprintf(stderr, "  Kinput2 may not work properly without it.\n");
+	fprintf(stderr, "  Maybe kinput2 is not installed correctly,\n");
+	fprintf(stderr, "  or your file search path (specified by\n");
+	fprintf(stderr, "  environment variable 'XFILESEARCHPATH')\n");
+	fprintf(stderr, "  is wrong.\n");
+    }
+
+    /* set debug level */
+    debug_all = appres.debugLevel;
+
+#ifdef RANDOM_ID
+    /*
+     * one nasty hack here:
+     *
+     * kinput clients often use server's window ID for the only key
+     * value to identify their conversion server (kinput), and they
+     * think it is dead and take appropriate action (eg connecting to
+     * the new server) when they notice the ID has changed.
+     *
+     * but it is likely that another kinput has the same resource ID
+     * base (because X servers always choose the smallest unused ID
+     * base for new clients). and if it is the same, so is the owner
+     * window ID, and the clients don't notice the change.
+     *
+     * to get rid of the problem, we add some small random offset to
+     * the resource ID so that every time we get different owner ID
+     * even if the resource ID base is the same.
+     *
+     * of course it heavily depends on the current implementaion of
+     * the resource ID allocation in Xlib, so I call it 'nasty'.
+     */
+    XtDisplay(toplevel)->resource_id += getpid() % 1024;
+#endif
+
+    inputobjclass = getInputObjClass();
+
+    inputobj = XtCreateWidget("inputObj", inputobjclass,
+				toplevel, 0, 0);
+    XtRealizeWidget(inputobj);
+    ICRegisterTriggerKeys(inputobj);
+    /*
+       Destroying the `inputobj' is postponed until all the widgets
+       are realized in order to prevent duplicate initialization of
+       input object, that is, to prevent making connection twice to
+       input conversion server.
+     */
+
+    displayobjclass = jpWcharDisplayObjectClass;
+
+    manager = XtVaCreateManagedWidget("convmanager",
+				      conversionManagerWidgetClass,
+				      toplevel,
+				      XtNwidth, 1,
+				      XtNheight, 1,
+				      NULL);
+
+    numProtocols = 0;
+
+    if (appres.useKinputProtocol) {
+	protocol = XtVaCreateWidget("kinputprotocol",
+				    kinputProtocolWidgetClass,
+				    manager,
+				    XtNlanguage, "JAPANESE",
+				    XtNinputObjectClass, inputobjclass,
+				    XtNdisplayObjectClass, displayobjclass,
+				    XtNwidth, 1,
+				    XtNheight, 1,
+				    NULL);
+	XtAddCallback(protocol, XtNdestroyCallback,
+		      Destroyed, (XtPointer)NULL);
+	numProtocols++;
+    }
+
+    if (appres.useXimpProtocol) {
+	protocol = XtVaCreateWidget("ximpprotocol",
+				    ximpProtocolWidgetClass,
+				    manager,
+				    XtNlocaleName, "ja_JP",
+				    XtNinputObjectClass, inputobjclass,
+				    XtNdisplayObjectClass, displayobjclass,
+				    XtNwidth, 1,
+				    XtNheight, 1,
+				    NULL);
+	XtAddCallback(protocol, XtNdestroyCallback,
+		      Destroyed, (XtPointer)NULL);
+	numProtocols++;
+    }
+
+    if (appres.useXIMProtocol) {
+	protocol = XtVaCreateWidget("improtocol",
+				    imProtocolWidgetClass,
+				    manager,
+				    XtNlanguage, "ja_JP",
+				    XtNinputObjectClass, inputobjclass,
+				    XtNdisplayObjectClass, displayobjclass,
+				    XtNwidth, 1,
+				    XtNheight, 1,
+				    NULL);
+	XtAddCallback(protocol, XtNdestroyCallback,
+		      Destroyed, (XtPointer)NULL);
+	numProtocols++;
+    }
+
+    if (numProtocols == 0) {
+	fprintf(stderr, "no protocols activated\n");
+	exit(1);
+    }
+
+    /* set signal handler */
+    if (signal(SIGINT, SIG_IGN) != SIG_IGN) signal(SIGINT, scheduleExit);
+#if XtSpecificationRelease > 5
+    interrupt = XtAppAddSignal(apc, interruptCallback, (XtPointer)NULL);
+#endif
+    signal(SIGTERM, scheduleExit);
+#ifdef USE_WNN
+    signal(SIGPIPE, SIG_IGN);
+#endif
+
+    /* set my error handler */
+    DefaultErrorHandler = XAESetErrorHandler(IgnoreBadWindow);
+
+    XtRealizeWidget(toplevel);
+
+    XtDestroyWidget(inputobj); /* Don't move this before XtRealizeWidget() */
+
+    for (;;) {
+	XEvent event;
+
+	XtAppNextEvent(apc, &event);
+	XtDispatchEvent(&event);
+	MyDispatchEvent(&event); /* additional dispatcher */
+    }
+    /* NOTREACHED */
+
+    return 0;	/* for lint */
+}
+
+static WidgetClass
+getInputObjClass()
+{
+    WidgetClass class;
+
+#ifdef USE_WNN
+    if (!strcmp(appres.conversionEngine, "wnn")) {
+	return ccWnnObjectClass;
+    }
+#endif
+#ifdef USE_CANNA
+    if (!strcmp(appres.conversionEngine, "canna") ||
+	!strcmp(appres.conversionEngine, "iroha")) {
+	return cannaObjectClass;
+    }
+#endif
+#ifdef USE_SJ3
+    if (!strcmp(appres.conversionEngine, "sj3")) {
+	return sj3ObjectClass;
+    }
+#endif
+#ifdef USE_ATOK
+    if (!strcmp(appres.conversionEngine, "atok")) {
+	return atokObjectClass;
+    }
+#endif
+
+    /* set default input object */
+#ifdef USE_ATOK
+    class = atokObjectClass;
+#endif
+#ifdef USE_SJ3
+    class = sj3ObjectClass;
+#endif
+#ifdef USE_CANNA
+    class = cannaObjectClass;
+#endif
+#ifdef USE_WNN
+    class = ccWnnObjectClass;
+#endif
+
+    return class;
+}
+
+static int
+IgnoreBadWindow(dpy, error)
+Display *dpy;
+XErrorEvent *error;
+{
+    /*
+     * BadWindow events will be sent if any of the active clients die
+     * during conversion.  Although I select DestroyNotify event on the
+     * client windows to detect their destruction and take appropriate
+     * actions, and I'm careful when doing critical operations, but still
+     * there is a chance of getting unexpecting BadWindow error caused by
+     * client death.
+     * There are also chances of getting BadDrawable as well.
+     * So I set the error handler to ignore BadWindow/BadDrawable errors.
+     * Of course I'd better check if the resourceid field of the error
+     * event is the window ID of a client, but I'm too lazy to do that...
+     * P.S.  We should ignore BadColor also..
+     */
+    if (error->error_code != BadWindow &&
+	error->error_code != BadDrawable &&
+	error->error_code != BadColor) {
+	/* invoke default error handler */
+	(*DefaultErrorHandler)(dpy, error);
+    }
+    return 0;
+}
+
+#ifdef SIGNALRETURNSINT
+static int
+#else
+static void
+#endif
+scheduleExit()
+{
+#if XtSpecificationRelease > 5
+    XtNoticeSignal(interrupt);
+#else
+    /*
+     * It is unwise to do complex operation (in this case,
+     * XtDestroyWidget) in a signal handler.
+     * So postpone the real work...
+     */
+    XtAppAddTimeOut(apc, 1L, exitTimer, (XtPointer)NULL);
+#endif
+}
+
+#if XtSpecificationRelease > 5
+/* ARGSUSED */
+static void
+interruptCallback(cldata, sigid)
+XtPointer cldata;
+XtSignalId *sigid;
+{
+    Exit();
+}
+#else
+/* ARGSUSED */
+static void
+exitTimer(cldata, timerp)
+XtPointer cldata;
+XtIntervalId *timerp;
+{
+    Exit();
+}
+#endif
+
+/* ARGSUSED */
+static void
+Destroyed(w, client_data, call_data)
+Widget w;
+XtPointer client_data;
+XtPointer call_data;
+{
+    static int cnt = 0;
+
+    /*
+     * if all the protocol widgets are dead, kill myself.
+     */
+    if (++cnt >= numProtocols) Exit();
+}
+
+static void
+Exit()
+{
+    static int exiting = 0;
+
+    TRACE(("Exit()\n"));
+
+    if (exiting) return;
+    exiting = 1;
+
+    /*
+     * Destroy all widgets.
+     */
+    XtDestroyWidget(toplevel);
+
+    /*
+     * Postpone calling exit() until next XtNextEvent(),
+     * in order to give each widget time to execute their
+     * destroy procedure.
+     */
+    XtAppAddTimeOut(apc, 1L, realExit, (XtPointer)NULL);
+}
+
+/* ARGSUSED */
+static void
+realExit(cldata, timerp)
+XtPointer cldata;
+XtIntervalId *timerp;
+{
+    exit(0);
+}
+
+static void
+usage()
+{
+    char **p;
+    static char *syntaxtable[] = {
+#ifdef USE_WNN
+	"-wnn",			"use Wnn as the conversion engine",
+	"-jserver <hostname>",	"specify jserver host",
+	"-ccdef <ccdeffile>",	"specify character conversion def. file",
+	"-wnnenvname <name>",	"specify Wnn environment name",
+	"-wnnenvrc4 <wnnenvrcfile>", "specify Wnn environment file for Wnn4",
+	"-wnnenvrc6 <wnnenvrcfile>", "specify Wnn environment file for Wnn6",
+	"-wnnenvrc <wnnenvrcfile>", "specify Wnn environment file",
+#endif
+#ifdef USE_CANNA
+	"-canna",		"use Canna (Iroha) as the conversion engine",
+	"{-cannaserver|-cs} <hostname>[:n]", "specify cannaserver host",
+	"-cannafile <cannafile>", "specify canna customize file",
+#endif
+#ifdef USE_SJ3
+	"-sj3",         	"use SJ3 as the conversion engine",
+	"-sj3serv <hostname>",  "specify first sj3serv host",
+	"-sj3serv2 <hostname>", "specify second sj3serv host",
+	"-sj3user <user>",      "specify user name connect to sj3serv",
+	"{-rcfile|-sjrc} <file>",       "specify resource definition file",
+	"{-sbfile|-sjsb} <file>",       "specify symbol table file",
+	"{-rkfile|-sjrk} <file>",       "specify roma-kana coversion definition file",
+	"{-hkfile|-sjhk} <file>",       "specify hira-kata coversion definition file",
+	"{-zhfile|-sjzh} <file>",       "specify zen/han coversion definition file",
+#endif
+#ifdef USE_ATOK
+	"-atok",                        "use ATOK as the conversion engine",
+	"{-atokserver|-as} <hostname>", "specify atok server host",
+	"-atokport <port#>",            "specify atok service port",
+	"-atokconf <file>",             "specify atok customize file",
+	"-atokstyle <file>",            "specify atok style file",
+#endif
+	"-bc",			"backward compatible mode",
+	"-font <font>",		"ASCII font to be used",
+	"-kanjifont <font>",	"KANJI font to be used",
+	"-kanafont <font>",	"KANA font to be used",
+	"-/+kinput",		"activate/deactivate kinput protocol family",
+	"-/+ximp",		"activate/deactivate Ximp protocol",
+	"-/+xim",		"activate/deactivate X Input Method protocol",
+	"-tbheight <number>",	"specify pop-up shell's titlebar height",
+	"-background <color>",	"background color",
+	"-foreground <color>",	"foreground color",
+	"-rv",			"reverse video mode",
+	"-display <display>",	"specify display",
+	"-version",		"print version information and exit",
+#ifdef DEBUG
+	"-debug",		"print debug messages (debug level 1)",
+	"-trace",		"print trace messages (debug level 10)",
+	"-debuglevel <level>",	"set debug level",
+#endif
+	NULL, NULL,
+    };
+
+    fprintf(stderr, "options are:\n");
+    for (p = syntaxtable; *p != NULL; p += 2) {
+	fprintf(stderr, "    %-30s %s\n", *p, *(p + 1));
+    }
+    exit(1);
+}
+
+static void
+print_version()
+{
+    char *p;
+
+    printf("kinput2 %s ", KINPUT2_VERSION);
+    if (PATCHLEVEL > 0) printf("fix %d ", PATCHLEVEL);
+#ifdef STATUS
+    printf("-%s- ", STATUS);
+#endif
+    printf(" (");
+    p = DATE + 7;				/* skip '$Date: ' */
+    while (*p != '\0' && *p != ' ') {
+	putchar(*p);	/* print date */
+	p++;
+    }
+    printf(")\n");
+
+    printf("\toptions: ");
+#ifdef USE_WNN
+#ifdef USE_WNN6
+    printf("[Wnn6] ");
+#else
+    printf("[Wnn] ");
+#endif
+#endif
+#ifdef USE_CANNA
+    printf("[Canna2] ");
+#endif
+#ifdef USE_SJ3
+    printf("[Sj3] ");
+#endif
+#ifdef USE_ATOK
+    printf("[Atok] ");
+#endif
+#ifdef DEBUG
+    printf("[DEBUG] ");
+#endif
+    printf("\n");
+    exit(0);
+}
+
+#if defined(USE_WNN) && defined(NEED_Strlen)
+/*
+ * Wnn/jlib/js.c should have this function...
+ */
+int
+Strlen(s)
+unsigned short *s;
+{
+    int n = 0;
+
+    while (*s++) n++;
+    return n;
+}
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cmd/kinput2.man	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,514 @@
+.\" $Id: kinput2.man,v 1.20 1999/09/13 08:40:31 ishisone Exp $
+.TH KINPUT2 1 "24 March 1999" "X Version 11"
+.SH NAME
+kinput2 \- kanji input server for X11
+.SH SYNOPSIS
+\fBkinput2\fP [-options...]
+.SH DESCRIPTION
+.I Kinput2
+is an X window application to input Japanese text.
+It acts as a front-end for other applications that want
+kana-kanji conversion.
+.PP
+When invoked, after some initialization (which will take about a few to
+30 seconds depending on your machine) \fIkinput2\fP waits quietly for a
+Japanese text input request from another client (i.e. no windows
+appear).
+When \fIkinput2\fP receives a request, it pops up a window and
+starts conversion process. It sends the converted text back to the
+client when the text is fixed.
+.PP
+.I Kinput2
+has some big improvements over its predecessor, kinput, which
+was contributed to X11R4.
+.TP 8
+\fBOver-the-spot/On-the-spot Input\fP
+These features enable conversion process to be done at cursor position,
+avoiding unnecessary movement of eyes between cursor position and conversion
+window.
+.I Kinput2
+also supports root window style input and off-the-spot style input.
+.TP 8
+\fBMultiple Protocol Support\fP
+.I Kinput2
+supports several conversion protocols between front-end and
+client. Supported protocols are:
+.nf
+	kinput protocol
+	kinput2 protocol
+	Matsushita jinput protocol
+	Sony xlc protocol
+	XIMP protocol
+	X Input Method Protocol (X Consortium standard)
+.fi
+.TP 8
+\fBMultiple Conversion Engine Support\fP
+.I Kinput2
+can use 4 different conversion engines, Wnn, Canna, Sj3 and Atok.
+You can choose one at compilation time, or at run time.
+.TP 8
+\fBKinput Compatibility\fP
+.I Kinput2
+is fully upward-compatible with kinput, so applications which use
+kinput as the front-end can also use \fIkinput2\fP.
+In this case, the applications cannot take advantage of over-the-spot
+conversion, though.
+.SH OPTIONS
+.I kinput2
+accepts all of the standard X Toolkit command line options.
+The following options are accepted as well.
+.TP 8
+\fB\-wnn\fP
+This option specifies that Wnn jserver is used as the conversion engine.
+.TP 8
+\fB\-jserver\fP
+This option specifies the hostname of the jserver to be used for conversion.
+.TP 8
+\fB\-ccdef\fP
+This option specifies the input character conversion rule file.
+.TP 8
+\fB\-wnnenvrc4\fP
+This option specifies the Wnn convertion environment initialization
+file (wnnenvrc) for Wnn version 4.
+.TP 8
+\fB\-wnnenvrc6\fP
+This option is similar to \-wnenvrc4, but for Wnn version 6.
+.TP 8
+\fB\-canna\fP
+This option specifies that Canna conversion server (irohaserver) is used as
+the conversion engine.
+.TP 8
+\fB\-cannaserver\fP
+This option specifies the hostname of Canna conversion server.
+.TP 8
+\fB\-cannafile\fP
+This option specifies Canna conversion customization file.
+.TP 8
+\fB\-sj3\fP
+This option specifies that Sj3 conversion server (sj3serv) is used as
+the conversion engine.
+.TP 8
+\fB\-sj3serv\fP
+This option specifies the hostname of the primary sj3 conversion server.
+.TP 8
+\fB\-sj3serv2\fP
+This option specifies the hostname of the secondary sj3 server. The secondary
+server is used when \fIkinput2\fP cannot connect to the primary server.
+.TP 8
+\fB\-atok\fP
+This option specifies that Atok server is used as the conversion engine.
+.TP 8
+\fB\-atokserver\fP
+This option specifies the hostname of the atok server to be used for conversion.
+.TP 8
+\fB\-font\fP \fIascii-font\fP
+This option specifies the default font to be used for displaying ASCII text.
+.TP 8
+\fB\-kanjifont\fP \fIkanji-font\fP
+This option specifies the default font to be used for displaying Kanji text.
+.TP 8
+\fB\-kanafont\fP \fIkana-font\fP
+This option specifies the default font to be used for displaying Kana text.
+.TP 8
+\fB\-/+kinput\fP
+This option enables/disables use of kinput protocol family (i.e.
+kinput protocol, kinput2 protocol, jinput protocol and xlc protocol).
+.TP 8
+\fB\-/+ximp\fP
+This option enables/disables use of XIMP protocol.
+.TP 8
+\fB\-/+xim\fP
+This option enables/disables use of X Input Method Protocol.
+.TP 8
+\fB\-bc\fP
+Kinput protocol, which is one of the communication protocols
+\fIkinput2\fP supports,
+uses X window's selection mechanism to notify other clients of
+front-end's existence.
+This option forces \fIkinput2\fP to use selection ``JAPANESE_CONVERSION''
+(which is not a standard selection name) as well as ``_JAPANESE_CONVERSION''.
+This is for backward compatibility, since many of the applications that
+connect with kinput still use this non-standard selection.
+.TP 8
+\fB\-tbheight\P \fItitle-bar-height\fP
+This option specifies the height (in pixels)  of the titlebar
+attached to popup shells such as candidate selection window.
+.I Kinput2
+uses this value to compute the correct popup location of these windows.
+.SH WIDGET TREE
+Below is the widget hierarchy of \fIkinput2\fP.
+.nf
+.ta 0.5i 1.0i 1.5i 2.0i 2.5i 3.0i 3.5i 4.0i
+	Kinput2  kinput2
+		ConversionManager  convmanager
+			KinputProtocol  kinputprotocol
+			XimpProtocol  ximpprotocol
+			IMProtocol  improtocol
+			SeparateConversion  converter
+				CcWnn  inputObj
+				Canna  inputObj
+				Sj3  inputObj
+				JpWcharDisplay  displayObj
+				Form  form
+					ICLabel  mode
+						JpWcharDisplay  display
+					Canvas  text
+				TransientShell  selectionShell
+					CandidatePanel  selection
+						JpWcharDisplay  display
+				TransientShell  auxShell
+					AuxPanel  aux
+						JpWcharDisplay  display
+			OffTheSpotConversion  converter
+				CcWnn  inputObj
+				Canna  inputObj
+				Sj3  inputObj
+				JpWcharDisplay  displayObj
+				AdoptedShell  modeShell
+					ICLabel  mode
+						JpWcharDisplay display
+				CanvasShell  text
+				TransientShell  selectionShell
+					CandidatePanel  selection
+						JpWcharDisplay  display
+				TransientShell  auxShell
+					AuxPanel  aux
+						JpWcharDisplay  display
+			OverTheSpotConversion  converter
+				CcWnn  inputObj
+				Canna  inputObj
+				Sj3  inputObj
+				JpWcharDisplay  displayObj
+				TransientShell  selectionShell
+					CandidatePanel  selection
+						JpWcharDisplay  display
+				TransientShell  auxShell
+					AuxPanel  aux
+						JpWcharDisplay  display
+				AdoptedShell  modeShell
+					ICLabel  mode
+						JpWcharDisplay  display
+				TransientShell  modeShell
+					ICLabel  mode
+						JpWcharDisplay  display
+				CanvasShell  text
+.fi
+.SH RESOURCES
+There are too many resources to describe here, but you don't have to
+know most of them.
+So here is a brief description of resources which you might want to set.
+.PP
+\fBKinput2\fP application resource:
+.RS 4
+.TP 4
+\fBconversionEngine\fP
+This resource specifies which conversion engine to use.
+You can specify one of ``wnn'', ``canna'', ``sj3'' or ``atok''.
+.RE
+.PP
+.B ConversionControl
+widget (which is a superclass
+of SeparateConversion, OffTheSpotConversion and OverTheSpotConversion)
+resource:
+.RS 4
+.TP 4
+\fBsendbackKeyPress\fP
+If this resource is ``true'', the KeyPress events intercepted but unused
+by \fIkinput2\fP are sent back to the client when there is no conversion text.
+Although this feature is convenient, it might confuse some clients
+since none of corresponding KeyRelease events are sent.
+Also, since the ``send_event'' flag of those events are true, some
+clients do not accept events sent back by \fIkinput2\fP.
+For example, kterm doesn't accept those events without specifying
+.nf
+	KTerm*allowSendEvents: true
+.fi
+in a resource file.
+.br
+The default of \fBsendbackKeyPress\fP resource is \fBtrue\fP.
+.TP 4
+\fBtitlebarHeight\fP
+This resource specifies the height of a title bar which is attached
+to various popup shell windows, such as candicate selection.
+When computing the location of these windows,
+.I kinput2
+uses this value to pop up them at correct position.
+.br
+The default is \fB0\P.
+.RE
+.PP
+.B OverTheSpotConversion
+widget resources:
+.RS 4
+.TP 4
+\fBshrinkWindow\fP
+If this resource is ``true'', the width of on-the-spot conversion window
+shrinks according to the length of the text on it. Otherwise,
+the window never shrinks.
+If the performance of Xserver on window resizing is poor,
+you may consider setting this resources to false.
+The default is \fBtrue\fP.
+.TP 4
+\fBmodeLocation\fP
+This resource specifies the location of status widget in case of 
+over-the-spot type conversion.
+Unless client specifies the location explicitly, the location of
+the status widget is determined by this resource.
+If the value of this resource is ``topleft'', the widget is placed at the
+top left of the client window. You can also specify 
+``topright'', ``bottomleft'' and ``bottomright''.
+If the value is ``tracktext'', the widget is placed just under the cursor
+position, and moves according to the cursor. However, if the
+region available for conversion is too small, status is placed at
+the bottom left of the client area.
+If the value is ``none'', the status widget will never appear.
+.br
+The default is ``tracktext''.
+.TP 4
+\fBmodeBorderForeground\fP
+If this resource is ``true'', the color of status widget is forced
+to be same as the foreground color of the widget.
+.br
+The default is \fBfalse\fP.
+.TP 4
+\fBuseOverrideShellForMode\fP
+If this resource is ``true'', the status widget becomes an instance of
+OverriddeShell, instead of the default TransientShell.
+Turn this resource on if you encounter a strange phenomenon that
+the status widget keeps flickering and you cannnot enter any text.
+This is caused by (incorrect) focus management of your window manager,
+and setting this resource will stop any window management for the widget.
+The result is that the widget will be totally ignored by the window manager,
+meaning you cannot move, resize, raise nor lower the widget.
+.br
+The default is \fBfalse\fP.
+.RE
+.PP
+.B OnTheSpotConversion
+widget resources:
+.RS 4
+.TP 4
+\fBfeedbackAttributes\fP
+This resource specifies the display attributes of preedit string when
+on-the-spot input style is used. In on-the-spot style, it is a client's
+responsibility to draw preedit string, and kinput2 sends some hints
+on how it should be drawn, which is controled by this resource.
+The value of this resource should be a comma-separated list of 4 elements,
+and each element represents the drawing hint of specific type of string.
+They represent the hints for not-yet-converted string,
+for converted string, for converted string which belongs to the current
+clause, for converted string belonging to the current sub-clause, in that
+order.
+Each element consists of zero or more drawing attributes, which are `R'
+(reverse), `U' (underline), `H' (highlight), `P' (primary), `S' (secondary)
+or `T' (tertiary).  You should consult the Xlib document for the meaning
+of these attributes (see the section about preedit draw callback).
+The default is ``U,,R,H'', which is close to the drawing attributes used
+by other input styles.
+.RE
+.PP
+.B CcWnn
+(conversion widget using Wnn) resources:
+.RS 4
+.TP 4
+\fBjserver\fP
+This resource specifies the hostname of the (primary) jserver to be used
+for conversion. If not specified, value of environment variable ``JSERVER''
+is used.
+.TP 4
+\fBjserver2nd\fP
+This resource specifies the hostname of the secondary jserver, which is 
+used if the primary server is down. If not specified, \fIkinput2\fP doesn't
+use secondary server.
+.TP 4
+\fBwnnEnvrc4\fP
+This resource specifies the filename of the Wnn conversion environment
+initialization file. This file is used when the Wnn server (jserver) is
+version 4. See documents of Wnn for the format of the file.
+The default is \fB/usr/local/lib/wnn/wnnenvrc\fP.
+.TP 4
+\fBwnnEnvrc6\fP
+This resource also specifies the filename of the Wnn conversion environment
+initialization file. This file is used when the Wnn server (jserver) is
+version 6. See documents of Wnn for the format of the file.
+.TP 4
+\fBwnnEnvrc\fP
+This resource is provided for backward compatibility.
+Use \fBwnnEnvrc4\fP or \fBwnnEnvrc6\fP instead.
+.TP 4
+\fBccdef\fP
+This resource specifies the input character conversion rule file.
+The default is \fB/usr/lib/X11/ccdef/ccdef.kinput2\fP.
+.RE
+.PP
+.B Canna
+(conversion widget using Canna) resources:
+.RS 4
+.TP 4
+\fBcannahost\fP
+This resource specifies the hostname of the canna server to be used.
+.TP 4
+\fBcannafile\fP
+This resource specifies Canna conversion customization file.
+.RE
+.PP
+.B Sj3
+(conversion widget using SJ3) resources:
+.RS 4
+.TP 4
+\fBsj3serv\fP
+This resource specifies the hostname of the (primary) sj3serv to be used
+for conversion. If not specified, value of environment variable ``SJ3SERV''
+is used.
+.TP 4
+\fBsj3serv2\fP
+This resource specifies the hostname of the secondary sj3serv, which is 
+used if the primary server is down.
+.TP 4
+\fBrcfile\fP
+This resource specifies the filename of the Sj3 conversion customization
+file. The default is \fB/usr/lib/X11/sj3def/sjrc\fP.
+.TP 4
+\fBrkfile\fP
+This resource specifies the Romaji-Kana conversion rule file.
+The default is \fB/usr/lib/X11/sj3def/sjrk\fP.
+.RE
+.PP
+.B Atok
+(conversion widget using Atok) resources:
+.RS 4
+.TP 4
+\fBserver\fP
+This resource specifies the hostname of the atok server to be used
+for conversion.
+.TP 4
+\fBport\fP
+This resource specifies the port number of the atok server.
+.TP 4
+\fBconf\fP
+This resource specifies the name of atok configuration file.
+.TP 4
+\fBstyle\fP
+This resource specifies the name of atok style file.
+.RE
+.PP
+.B JpWcharDisplay
+(widget for drawing Japanese text) resources:
+.RS 4
+.TP 4
+\fBfont\fP, \fBkanjiFont\fP, \fBkanaFont\fP
+These resource specifies the font to be used for displaying ASCII,
+Kanji and Kana text, respectively.
+Since \fIkinput2\fP changes fonts dynamically by client requests,
+the fonts specified by these resources might not be used.
+If not specified, the following fonts are used.
+.nf
+	-*-fixed-medium-r-normal--14-*-*-*-c-*-iso8859-1
+	-*-fixed-medium-r-normal--14-*-*-*-c-*-jisx0208.1983-0
+	-*-fixed-medium-r-normal--14-*-*-*-c-*-jisx0201.1976-0
+.fi
+.RE
+.PP
+.B KinputProtocol
+(widget for handling kinput protocol family \- kinput, kinput2,
+jinput and xlc protocol) resources:
+.RS 4
+.TP 4
+\fBbackwardCompatible\fP
+All of the protocols in kinput protocol family
+use X window's selection mechanism to notify other clients of
+front-end's existence.
+If this resource is ``true'', \fIkinput2\fP uses selection ``JAPANESE_CONVERSION''
+(which is not a standard selection name) as well as ``_JAPANESE_CONVERSION''.
+This is for backward compatibility, since many of the applications
+using these protocols still use this non-standard selection.
+.br
+The default is \fBtrue\fP.
+.TP 4
+\fBxlcConversionStartKey\fP
+This resource specifies the key that starts the conversion.
+The key is a hint for the clients using xlc protocol to determine when
+they should request conversion to \fIkinput2\fP.
+The syntax of the specification is a subset of the translation table syntax:
+.nf
+	\fImodifier-names\fP<Key>\fIkeysym-name\fP
+.fi
+where modifier-names is a combination of \fBShift\fP, \fBLock\fP, \fBMeta\fP,
+\fBAlt\fP and \fBMod[1-5]\fP.
+.br
+The default is \fBShift<Key>space\fP.
+.RE
+.PP
+\fBXimpProtocol\fP and \fBIMProtocol\fP
+(which handle XIMP protocol and X Input Method Protocol) resources:
+.RS 4
+.TP 4
+\fBconversionStartKeys\fP
+This resource specifies the keys that start the conversion.
+The syntax of the specification is a subset of the translation table syntax:
+.nf
+	\fImodifier-names\fP<Key>\fIkeysym-name\fP
+.fi
+where modifier-names is a combination of \fBCtrl\fP, \fBShift\fP, \fBLock\fP,
+\fBMeta\fP, \fBAlt\fP and \fBMod[1-5]\fP. A '~' can precede each modifier
+name, meaning the modifier must not be asserted.
+For example, if the conversion start key is ``Kanji'' key with shift key
+pressed and control key not pressed (other modifier keys may be pressed or 
+not), the specification is:
+.nf
+	Shift ~Ctrl<Key>Kanji
+.fi
+Multiple keys can be specified by separating them with newlines.
+.br
+The default is as follows:
+.nf
+	Shift<Key>space \en\e
+	Ctrl<Key>Kanji
+.fi
+.TP 4
+\fBdefaultFontList\fP
+This resource specifies the default fonts to be used if the client
+does not specify fonts to be used.
+The default is \fB-*-fixed-medium-r-normal--14-*-*-*-c-*\fP.
+.RE
+.SH "CLIENT SETUP"
+When using X Input Method Protocol, you have to specify the
+name of the input server you want to use.
+This can be done by setting ``\fBinputMethod\fP'' resource
+or setting \fBXMODIFIERS\fP environment variable.
+Since some clients don't regard inputMethod resource while other
+clients ignore XMODIFIERS variable, so it is a good idea to set both of
+them.
+.PP
+To use kinput2, you should add the following line to your
+resource file (such as .Xresources or .Xdefaults):
+.nf
+	*inputMethod: kinput2
+.fi
+and, set XMODIFIERS to ``@im=kinput2''.
+.nf
+	setenv XMODIFIERS "@im=kinput2"\ \ \ (for csh)
+	XMODIFIERS="@im=kinput2"; export XMODIFIERS\ \ \ (for sh)
+.fi
+.SH "SEE ALSO"
+Wnn documents, Canna documents, Sj3 documents,
+XIMP protocol specification,
+The Input Method Protocol
+.SH COPYRIGHT
+.nf
+Copyright 1988, 1989, 1990, 1991, 1992, 1994 Software Research Associates, Inc.
+Copyright 1991 NEC Corporation, Tokyo, Japan.
+Copyright 1991 Sony Corporation 
+Copyright 1998 MORIBE, Hideyuki
+Copyright 1999 Kazuki YASUMATSU
+Copyright 1999 Justsystem Corporation, Japan.
+.fi
+.SH AUTHORS
+.nf
+Makoto Ishisone, Software Research Associates, Inc.
+Akira Kon, NEC Corporation
+Naoshi Suzuki, Sony Corporation
+MORIBE, Hideyuki
+Kazuki YASUMATSU
+Atsushi Irisawa
+.fi
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/doc/ccdef	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,803 @@
+*** $BF~NOJ8;zJQ49$N@_Dj(B ***
+ 
+[ $B$3$l$O(B kinput2 $B$GJQ49%7%9%F%`$K(B Wnn $B$r;HMQ$9$k;~$K;H$o$l$kJQ49%*%V%8%'%/(B  ]
+[ $B%H(B CcWnn $B$,;HMQ$7$F$$$k%m!<%^;z$+$JJQ49(B ($B$@$1$G$O$J$/!"JQ49$K;HMQ$9$k%-!<(B ]
+[ $B$N%P%$%s%G%#%s%0$d$+$JF~NO$K$b;HMQ$5$l$k$N$G!VF~NOJ8;zJQ49!W$H8F$s$G$$$^(B  ]
+[ $B$9(B) $B$N%+%9%?%^%$%:J}K!$r2r@b$7$?$b$N$G$9!#<B$O$3$N%I%-%e%a%s%H$O(B wterm    ]
+[ $B$N%f!<%6%^%K%e%"%k$NBh(B4$B>O!XF~NOJ8;zJQ49$N@_Dj!Y$r$A$g$C$HJQ99$7$?$@$1$J(B   ]
+[ $B$N$G$b$7$+$9$k$HITE,Ev$J5-=R$,$"$k$+$bCN$l$^$;$s!#(B                        ]
+
+    $B$3$3$G$O(B kinput2 $B$NJQ49%*%V%8%'%/%H$N0l$D(B CcWnn $B$,JQ49$K;HMQ$9$k%-!<$N(B
+    $B%P%$%s%G%#%s%0$d%m!<%^;z$+$JJQ49$J$I$r%+%9%?%^%$%:$9$k$N$KI,MW$JF~NOJ8(B
+    $B;zJQ49Dj5A%U%!%$%k$N=q$-J}$K$D$$$F@bL@$7$^$9!#$3$3$K=q$+$l$?J8>O$@$1$G(B
+    $B$O$o$+$j$K$/$$$N$G!"$G$-$l$P%G%U%)%k%H$NDj5A%U%!%$%k(B 
+    (/usr/lib/X11/ccdef/ccdef.kinput2 $B$*$h$S$=$NCf$G%$%s%/%k!<%I$5$l$F$$$k(B
+    $B%U%!%$%k(B) $B$r8+$J$,$iFI$`$H$h$$$H;W$$$^$9!#$^$?!":G8e$K$A$g$C$H$7$?%+%9(B
+    $B%?%^%$%:$NNc$r>R2p$7$F$"$j$^$9!#(B
+
+
+** $BF~NOJ8;zJQ49$N35MW(B 
+ 
+$BF~NOJ8;zJQ49$N5!G=$K$O!"Bg$-$/J,$1$F<!$NFs$D$,$"$j$^$9!#(B
+ 
+1. $B%m!<%^;z$+$JJQ49$J$I!"F~NO$5$l$?J8;z(B($BNs(B)$B$rJL$NJ8;z$KCV$-49$($k(B
+2. $BF~NO$5$l$?%-!<$K%P%$%s%I$5$l$?JQ495!G=$r8F$S=P$9(B
+ 
+$B$3$NFs$D$N5!G=$OJ,N%$5$l$F$$$k$N$,IaDL$G$9$,!"(BCcWnn $B$G$OJ,N%$5$l$F$$$^$;$s!#(B
+$B$=$N$?$a!"$"$k%-!<$,F~NO$5$l$?;~$K$=$l$rJL$NJ8;z$KCV$-49$($k$HF1;~$K$"$kJQ(B
+$B495!G=$r8F$S=P$9!"$H$$$&$3$H$,$G$-$k$h$&$K$J$C$F$$$^$9!#(B
+ 
+$B$G$O$3$3$GF~NOJ8;zJQ49$,$I$N$h$&$K9T$J$o$l$k$+$K$D$$$F$6$C$H>R2p$7$^$7$g$&!#(B
+ 
+$B4pK\E*$K$O!"$"$i$+$8$a;XDj$5$l$?JQ49%k!<%k$N=89g$NCf$+$i!"(B
+ 
+	$B!&F~NO%b!<%I(B
+	$B!&F~NO%3%s%F%-%9%H(B
+	$B!&F~NO%-!<(B
+ 
+$B$N#3$D$N>r7o$K%^%C%A$9$kJQ49%k!<%k$rA*$S!"$=$l$rE,MQ$9$k$3$H$GJQ49$,9T$J$o(B
+$B$l$^$9!#(B
+
+$B!&F~NO%b!<%I(B 
+	$B$3$l$ONc$($P!V%m!<%^;z$+$JJQ49%b!<%I!W$H$+!"!V%"%k%U%!%Y%C%HF~NO%b!<(B
+	$B%I!W$H$+$$$C$?$b$N$G$9!#J#?t$NF~NO%b!<%I$r;}$D$3$H$,$G$-!"%b!<%I$N(B
+	$B@ZBX$($OJQ49%k!<%k$K=q$+$l$?%U%!%s%/%7%g%s$G9T$J$$$^$9!#(B
+
+$B!&F~NO%3%s%F%-%9%H(B 
+	$B$3$l$O$"$k%-!<$,2!$5$l$?;~$K!"$9$G$KF~NO$5$l$F$$$kJ8;zNs$N$3$H$G$9!#(B
+	kinput2 $B$G!"%"%s%@!<%i%$%s$D$-$GI=<($5$l$kL$JQ49ItJ,$NJ8;zNs$@$H;W(B
+	$B$($P$@$$$?$$$h$$$G$7$g$&!#@53N$K$$$&$HL$JQ49ItJ,$N%G!<%?$HF~NO%3%s(B
+	$B%F%-%9%H$N%G!<%?$O>/$70[$J$j$^$9!#F~NO%3%s%F%-%9%H$NJ}$O!"F~NO%b!<(B
+	$B%I$,JQ$o$C$?$j$9$k$H%/%j%"$5$l$^$9$7!":GBg(B16$BJ8;z$7$+J];}$5$l$^$;$s!#(B
+
+$B!&F~NO%-!<(B 
+	$B$3$l$O2!$5$l$?%-!<$G$9!#JQ49%k!<%k$K(B
+		$B!&%-!<$N%"%9%-!<I=8=(B (XLookupString $B$7$?$b$N(B)
+		$B!&%-!<$N%$%Y%s%HI=8=(B ($B%b%G%#%U%!%$%"(B+Keysym)
+	$B$N#2DL$j$N7A<0$G=q$/$3$H$,$G$-$^$9!#(B
+ 
+$B<B:]$NF0:n$H$7$F$O!"$^$:=i4|2=$NCJ3,$GJQ49$NDj5A%U%!%$%k$,FI$_9~$^$l$^$9!#(B
+$B$=$3$K$O!"$$$/$D$+$NF~NO%b!<%I(B ($B%m!<%^;z$+$JJQ49%b!<%I$H$+%"%9%-!<J8;zF~NO(B
+$B%b!<%I$H$+(B) $B$4$H$KJQ49%k!<%k$N%;%C%H$,JB$s$G$$$^$9!#8D!9$NJQ49%k!<%k$O<!$N(B
+$B#4$D$N9`L\$+$i9=@.$5$l$^$9!#(B
+ 
+	$B!&F~NO%-!<(B
+	$B!&%3%s%F%-%9%HJ8;zNs(B
+	$B!&JQ497k2LJ8;zNs(B
+	$B!&%U%!%s%/%7%g%s(B
+ 
+$BF~NO%-!<$H%3%s%F%-%9%HJ8;zNs$,E,MQ$9$kJQ49%k!<%k$rA*Br$9$k$N$K;HMQ$5$l!"JQ(B
+$B497k2LJ8;zNs$H%U%!%s%/%7%g%s$,JQ49$NFbMF$rI=$7$^$9!#(B
+ 
+$B%-!<$,F~NO$5$l$k$H!"8=:_$NF~NO%b!<%I$KBP1~$9$kJQ49%k!<%k%;%C%H$NCf$+$i!"F~(B
+$BNO$5$l$?%-!<$*$h$S8=:_$NF~NO%3%s%F%-%9%H$K%^%C%A$9$k%k!<%k$,C5$5$l$^$9!#%^%C(B
+$B%A$9$k%k!<%k$,$"$l$P!"$=$N5-=R$K$7$?$,$C$FJ8;z$NJQ49$,9T$J$o$l!"JQ49%U%!%s(B
+$B%/%7%g%s$,8F$S=P$5$l$^$9!#(B
+ 
+$B6qBNE*$JNc$G@bL@$7$^$7$g$&!#JQ49Dj5A%U%!%$%k$K<!$N$h$&$K=q$+$l$F$$$k$H$7$^(B
+$B$9!#(B
+ 
+	mode Romaji "$B%m!<%^;zF~NO(B"
+		"k"	'a'	"$B$+(B"
+		"k"	'i'	"$B$-(B"
+		""	'a'	"$B$"(B"
+		""	'i'	"$B$$(B"
+		""	'.'	"$B!#(B"	convert
+		... ($B>JN,(B) ...
+	endmode
+ 
+($BDj5A%U%!%$%k$N>\$7$$=q$-J}$K$D$$$F$O$"$H$G@bL@$7$^$9(B)
+ 
+mode Romaji $B$H=q$+$l$?9T$+$i(B endmode $B$^$G$,$3$N%b!<%I(B (Romaji) $B$KBP$9$kJQ(B
+$B49%k!<%k$G$9!#0lHV:G=i$N%k!<%k$O!"%3%s%F%-%9%H$,(B "k"$B!"%-!<%3!<%I$,(B 'a'$B!"JQ(B
+$B49J8;zNs$,(B"$B$+(B" $B$G!"!V(B"k" $B$,$"$i$+$8$aF~NO$5$l$F$$$k;~$K(B 'a' $B$H$$$&%-!<$,2!(B
+$B$5$l$?$i$=$l$r(B "$B$+(B" $B$H$$$&J8;zNs$KJQ49$9$k!W$H$$$&0UL#$G$9!#(B
+ 
+$B:#(B 'a' $B$H$$$&%-!<$,2!$5$l$?$H$7$^$7$g$&!#$b$7D>A0$K(B k $B$,F~NO$5$l$F$$$l$P0l(B
+$BHV:G=i$N%k!<%k$K%^%C%A$7$F(B "$B$+(B" $B$H$$$&J8;zNs$KJQ49$5$l$FF~NO$5$l$^$9!#$b$7(B 
+k $B$,F~NO$5$l$F$$$J$1$l$P(B3$BHV$a$N%k!<%k$K%^%C%A$7$^$9!#(B($B6u$N%3%s%F%-%9%H$O2?(B
+$B$K$G$b%^%C%A$7$^$9(B) $B$=$3$G$3$N>l9g$K$O(B "$B$"(B" $B$H$$$&J8;zNs$KJQ49$5$l$^$9!#(B
+ 
+$BF1MM$K(B '.' $B$H$$$&%-!<$,2!$5$l$k$H(B4$BHV$a$N%k!<%k$K%^%C%A$7$F(B "$B!#(B" $B$H$$$&J8;z(B
+$BNs$KJQ49$5$l$FF~NO$5$l$k$H$H$b$K(B convert $B$H$$$&%U%!%s%/%7%g%s$,8F$P$l$^$9!#(B
+ 
+$B$3$N$h$&$K!"F~NOJ8;zJQ49$N4pK\E*$J%a%+%K%:%`$OHs>o$K4JC1$J$N$G$9$,!"<B:]$K(B
+$B$O$3$l$+$i@bL@$7$F$$$/$h$&$K$J$+$J$+J#;($G$9!#(B
+
+
+** $BF~NOJ8;zJQ49$NF0:n(B 
+ 
+$B$=$l$G$O!"F~NOJ8;zJQ495!G=$,$I$N$h$&$KF0:n$9$k$N$+$r$b$&>/$7>\$7$/@bL@$7$^(B
+$B$9!#$3$l$rM}2r$9$k$K$O(B X$B%&%#%s%I%&$K4X$9$k4pK\E*$JCN<1$,I,MW$G$7$g$&!#(B
+ 
+$B$^$:!"%-!<$,2!$5$l$k$H$=$l$KBP1~$9$k(B KeyPress $B%$%Y%s%H$,%5!<%P$+$iAw$i$l$^(B
+$B$9!#(BCcWnn $B$O$+$J4A;zJQ495!G=$,(B ON $B$K$J$C$F$$$l$P$=$l$rF~NOJ8;zJQ49$N%b%8%e!<(B
+$B%k$KEO$7$^$9!#(B
+ 
+$B8=:_$NF~NO%b!<%I$+$i!"E,MQ$9$Y$-JQ49%k!<%k%;%C%H$rA*$S!"EO$5$l$?%$%Y%s%H$H!"(B
+$BF~NO%3%s%F%-%9%H$r$b$H$K%^%C%A$9$k%k!<%k$rC5$7$^$9!#(B
+ 
+$B%k!<%k$NC5:w$O0l$D$N%-!<$K$D$$$F#32s9T$J$o$l$^$9!#@h$[$I=R$Y$?$h$&$K!"JQ49(B
+$B%k!<%k$K$O%-!<$r%"%9%-!<I=8=$H%$%Y%s%HI=8=$N$I$A$i$G$b=q$1$^$9$7!"%$%Y%s%H(B
+$BI=8=$G=q$/;~$K!"Nc$($P(B
+ 
+	shift + Keysym 'a'
+	Keysym 'A'
+ 
+$B$N$I$A$i$G$b=q$1$k$h$&$K$9$k$?$a$G$9!#(B
+ 
+$B$=$3$G!"%-!<$,2!$5$l$k$H%-!<$NI=8=$rJQ$($F#32sJQ49%k!<%k$,C5$5$l$^$9!#(B
+ 
+1. $B%b%G%#%U%!%$%"$r0l@Z2r<a$7$J$$%$%Y%s%HI=8=(B
+2. $B%7%U%H!&%m%C%/!&%b!<%I%9%$%C%A%b%G%#%U%!%$%"$r2r<a$7$?%$%Y%s%HI=8=(B
+3. $B%"%9%-!<I=8=(B
+ 
+$B$3$N=g$KC5$5$l!":G=i$K%^%C%A$7$?%k!<%k$K$7$?$,$C$FJQ49$,9T$J$o$l$^$9!#(B
+ 
+$BJQ49%k!<%k$ODj5A%U%!%$%k$K=q$+$l$?=g$KC5$5$l$^$9!#=>$C$FDj5A%U%!%$%k$K=q$/(B
+$B=gHV$r4V0c$($k$H;W$C$?DL$j$NJQ49$,9T$J$o$l$J$$$3$H$,$"$j$^$9!#(B
+ 
+$B%^%C%A$9$k%k!<%k$,$J$+$C$?>l9g!"$b$7JQ49%P%C%U%!$,6u(B ($B3NDj$5$l$F$$$J$$J8;z(B
+$B$,$J$$(B) $B$G!"$+$D2!$5$l$?%-!<$,%3%s%H%m!<%k%3!<%I$@$C$?>l9g$K$O$=$N$^$^=PNO(B
+$B$5$l!"$=$l0J30$N>l9g$OL5;k$5$l$^$9!#(B
+ 
+$B%^%C%A$9$k%k!<%k$,8+$D$+$k$H!"$=$l$K$7$?$,$C$FJQ49$,9T$J$o$l$^$9!#(B
+ 
+$B$^$:!"JQ49%P%C%U%!$*$h$SF~NO%3%s%F%-%9%H%G!<%?$+$iJQ49%k!<%k$K=q$+$l$F$$$k(B
+$B%3%s%F%-%9%HJ8;zNs$,:o=|$5$l$^$9!#(B($B%k!<%k$,%^%C%A$7$F$$$k0J>e!"F~NO%3%s%F(B
+$B%-%9%H$*$h$SJQ49%P%C%U%!$N:G8e$NItJ,$O%3%s%F%-%9%HJ8;zNs$HF1$8$O$:$G$9(B)
+ 
+$B<!$KJQ49%P%C%U%!$*$h$SF~NO%3%s%F%-%9%H%G!<%?$K!"JQ49%k!<%k$K=q$+$l$F$$$kJQ(B
+$B497k2LJ8;zNs$,DI2C$5$l$^$9!#(B($B<B:]$K$OJQ497k2LJ8;zNsCf$KF~NO%3%s%F%-%9%H$r(B
+$B%/%j%"$9$kL?Na$rF~$l$F$*$/$3$H$b$G$-$^$9!#$3$N>l9g$K$OF~NO%3%s%F%-%9%H%G!<(B
+$B%?$OJQ497k2LJ8;zNs$N0lIt$GCV$-49$o$k$3$H$K$J$j$^$9(B) autofix $B$,;XDj$5$l$F$$(B
+$B$k$H!"F~NO%3%s%F%-%9%H$,6u$N;~$KF~NO%3%s%F%-%9%H$X$NDI2C$,5/$3$k$H!"<+F03N(B
+$BDj=hM}$,$J$5$l$^$9!#(B
+ 
+$BJQ49%k!<%k$K%U%!%s%/%7%g%s$,=q$$$F$"$l$P!"$=$l$,<B9T$5$l$^$9!#%U%!%s%/%7%g(B
+$B%s$,J#?t=q$$$F$"$l$PA0$+$i=g$K<B9T$5$l$^$9!#(B
+ 
+$B%U%!%s%/%7%g%s$H$7$F8=:_$NF~NO%b!<%I$rJQ$($kL?Na$,=q$+$l$F$$$?;~$K$O>/$7J#(B
+$B;($J=hM}$r9T$J$$$^$9!#$^$:F~NO%b!<%I$rJQ$($kA0$K!"(B EXITMODE $B$H$$$&2>A[E*$J(B
+$B%-!<$GJQ49$,9T$J$o$l$^$9!#$=$N$"$HF~NO%b!<%I$rJQ99$7$F$+$i:#EY$O(B
+ ENTERMODE $B$H$$$&%-!<$GJQ49$,9T$J$o$l$^$9!#$3$NFs$D$N2>A[E*$J%-!<$NF~NO$K(B
+$B$h$j!"%b!<%I$,JQ$o$k;~$NFCJL$JF0:n$rDj5A%U%!%$%k$K5-=R$9$k$3$H$,$G$-$^$9!#(B
+$B:G8e$KF~NO%3%s%F%-%9%H$,%/%j%"$5$l$F!"F~NO%b!<%I$NJQ99$K$H$b$J$&=hM}$,40N;(B
+$B$7$^$9!#(B
+ 
+$BF~NOJ8;zJQ49$O$3$N$h$&$K$7$F9T$J$o$l$^$9!#(B
+
+
+** $BJQ49Dj5A%U%!%$%k$N=q$-J}(B 
+ 
+$BJQ49$OF~NOJ8;zJQ49Dj5A%U%!%$%k$K=q$+$l$?%k!<%k$K$7$?$,$C$F9T$J$o$l$^$9!#$3(B
+$B$3$G$O$=$NDj5A%U%!%$%k$N=q$-J}$r@bL@$7$^$9!#(B
+ 
+$B%U%!%$%k$N%U%)!<%^%C%H$N@bL@$K0\$kA0$K>/$7@bL@$7$F$*$/$3$H$,$"$j$^$9!#$^$:!"(B
+$BDj5A%U%!%$%k$NCf$K$O4A;z$,=q$1$k$N$G$9$,!"4A;z%3!<%I$OI,$:(B EUC $B$G$J$1$l$P(B
+$B$J$j$^$;$s!#$=$l$+$i!"(B'#' $B$G;O$^$k9T$O%3%a%s%H$G$9!#(Binclude $B9T$GB>$N%U%!%$(B
+$B%k$r%$%s%/%k!<%I$9$k$3$H$,$G$-$^$9!#(B
+ 
+	include '$B%U%!%$%kL>(B'
+ 
+$B%U%!%$%kL>$,AjBP%Q%9I=5-$G$"$l$P!"$=$N%5!<%A%Q%9$ODj5A%U%!%$%k$N$b$N$HF1$8(B
+$B$G!"(B
+ 
+	1. $B%+%l%s%H%G%#%l%/%H%j(B
+	2. $B4D6-JQ?t(B  CC_DEF_PATH  $B$K;XDj$5$l$?%G%#%l%/%H%j(B
+	3.  /usr/lib/X11/ccdef/ 
+ 
+$B$N=g$K$J$j$^$9!#(B
+ 
+$B$G$O!"Dj5A%U%!%$%k$N%U%)!<%^%C%H$N@bL@$K0\$j$^$9!#Dj5A%U%!%$%k$O<!$N$h$&$J(B
+$B7A<0$G$9!#(B
+ 
+	<$B%b!<%I@k8@(B>
+	<$B=i4|%b!<%I@k8@(B>
+	[<$B$=$NB>$N@k8@(B>]
+	<$B3F%b!<%I$NJQ49%k!<%k5-=R(B>
+ 
+ 
+<$B%b!<%I@k8@(B> $B$K$O!";HMQ$9$kF~NO%b!<%IL>$r$"$i$+$8$a@k8@$7$F$*$-$^$9!#$9$Y(B
+$B$F$N%b!<%I$O$3$3$G@k8@$7$F$*$+$J$J$1$l$P$J$j$^$;$s!#$3$l$OI,$:Dj5A%U%!%$%k(B
+$B$N:G=i$K=q$+$l$F$$$J$1$l$P$J$j$^$;$s!#<!$N$h$&$J7A<0$G$9!#(B
+ 
+	defmode <$B%b!<%IL>(B1> <$B%b!<%IL>(B2>...
+	$BNc(B) defmode Roma Ascii ZenkakuAscii
+ 
+ 
+$B%b!<%IL>$K;H$($k$N$O%"%9%-!<J8;z$@$1$G$9!#4A;z$O;H$($^$;$s!#(B
+ 
+<$B%b!<%I@k8@(B> $B$N<!$K$O(B <$B=i4|%b!<%I@k8@(B> $B$,Mh$^$9!#$3$l$O:G=i$NF~NO%b!<%I$r(B
+$B;XDj$9$k$b$N$G!"<!$N$h$&$J7A<0$G$9!#(B
+ 
+	initialmode <$B%b!<%IL>(B>
+	$BNc(B) initialmode Ascii
+ 
+$B$3$3$K;XDj$9$k%b!<%I$b!"(B<$B%b!<%I@k8@(B> $B$G@k8@$7$F$*$/I,MW$,$"$j$^$9!#(B
+ 
+<$B=i4|%b!<%I@k8@(B> $B$N$"$H(B ($B$h$j@53N$K$O(B <$B3F%b!<%I$NJQ49%k!<%k5-=R(B> $B$h$j(B
+$BA0$NG$0U$N>l=j(B) $B$K$=$NB>$N@k8@$r=q$/$3$H$,$G$-$^$9!#$3$N@k8@$O>JN,2DG=(B
+$B$G$9!#8=:_$N$H$3$m=q$/$3$H$N$G$-$k@k8@$O#2<oN`$"$j!"$R$H$D$O!"(B
+
+	casesensitive
+
+$B$G$9!#$3$N@k8@$r$7$J$$>l9g!"F~NOJ8;z$H(B <$B3F%b!<%I$NJQ49%k!<%k5-=R(B> $B$K5-(B
+$B=R$5$l$kF~NO%3%s%F%-%9%H$NHf3S;~$KBgJ8;z>.J8;z$,6hJL$5$l$^$;$s!#$7$+$7(B
+$B$3$N@k8@$r2C$($k$3$H$K$h$jBgJ8;z>.J8;z$r6hJL$9$k$h$&$K$J$j$^$9!#$b$&$R(B
+$B$H$D$O!"(B
+ 
+	autofix
+
+$B$G$9!#$3$N@k8@$r$7$F$*$/$H!"F~NO%3%s%F%-%9%H$,6u$N;~$KF~NO%3%s%F%-%9%H(B
+$B$X$NDI2C$,5/$3$k$H!"<+F03NDj=hM}$,$J$5$l$^$9!#$?$@$7!"%/%i%$%"%s%H$H(B
+kinput2 $B$H$NDL?.$K(B XIM $B%W%m%H%3%k$r;HMQ$7$F$$$k>l9g!"(BXlib $B$N%P!<%8%g%s$K(B
+$B$h$C$F$O(B autofix $B$r;XDj$9$k$HI=<($,$*$+$7$/$J$k$3$H$,$"$j$^$9!#(B
+
+<$B=i4|%b!<%I@k8@(B> $B$N$"$H$K$O!"$3$3$NF~NO%b!<%I$KBP$9$kJQ49%k!<%k$N5-=R$,$-(B
+$B$^$9!#$"$k%b!<%I$KBP$9$k5-=R7A<0$O<!$N$h$&$K$J$j$^$9!#(B
+ 
+	mode <$B%b!<%IL>(B> <$B%W%m%s%W%HJ8;zNs(B> [ fallthrough <$B%b!<%IL>(B> ]
+		<$BJQ49%k!<%k(B1>
+		<$BJQ49%k!<%k(B2>
+		...
+	endmode
+ 
+$B$3$N$h$&$K!"3F%b!<%I$N%k!<%k5-=R$O(B mode $B9T$G$O$8$^$j!"(Bendmode $B9T$G=*$j$^$9!#(B
+ 
+<$B%b!<%IL>(B> $B$O(B <$B%b!<%I@k8@(B> $B$G@k8@$7$?%b!<%IL>$G$9!#(B
+ 
+<$B%W%m%s%W%HJ8;zNs(B> $B$O%b!<%I$rI=$9!"%@%V%k%/%)!<%H$G0O$^$l$?J8;zNs$G$9!#(B<$B%W(B
+$B%m%s%W%HJ8;zNs(B> $B$K$O4A;z$b;HMQ$G$-$^$9!#$3$l$O8=:_$NF~NO%b!<%I$rI=<($9$k$N(B
+$B$K;HMQ$5$l$^$9!#(B
+ 
+[ fallthrough <$B%b!<%IL>(B> ] $B$H3g8L$G0O$^$l$F$$$k$N$O!">JN,2DG=$G$"$k$3$H$r(B
+$B<($7$^$9!#$b$7$3$l$,=q$$$F$"$k>l9g!"JQ49$N:]$3$N%b!<%I$K%^%C%A$9$k%k!<%k$,(B
+$B$J$+$C$?>l9g$K$O0zB3$-$3$3$K;XDj$7$?%b!<%I$N%k!<%k$,C5$5$l$^$9!#(B
+ 
+mode $B9T$KB3$$$FJQ49%k!<%k$N5-=R$,JB$S$^$9!#JQ49%k!<%k$ODj5A%U%!%$%k$K=q$+(B
+$B$l$?=g=xDL$j$K%^%C%A%s%0$,D4$Y$i$l$^$9$N$GJQ49%k!<%k$r=q$/=gHV$O=EMW$G$9!#(B
+
+
+** $BJQ49%k!<%k(B 
+ 
+$B$3$NJQ49%k!<%k$O<!$N$h$&$J7A<0$G5-=R$7$^$9!#(B
+ 
+<$B%3%s%F%-%9%HJ8;zNs(B> <$B%-!<(B> <$BJQ497k2LJ8;zNs(B> [ <$B%U%!%s%/%7%g%s(B>... ]
+ 
+<$B%3%s%F%-%9%HJ8;zNs(B> $B$O%@%V%k%/%)!<%H$G0O$^$l$?J8;zNs$G$9!#$"$k%k!<%k$,E,(B
+$BMQ$5$l$k$?$a$K$O!"$3$N%3%s%F%-%9%HJ8;zNs$,8=:_$NF~NO%3%s%F%-%9%H$H%^%C%A$9(B
+$B$kI,MW$,$"$j$^$9!#%^%C%A%s%0$O!"$3$N%3%s%F%-%9%HJ8;zNs$,F~NO%3%s%F%-%9%H$N(B
+$B:G8e$NItJ,$H0lCW$9$k$+$I$&$+$GH=Dj$5$l$^$9!#Nc$($P$"$k%k!<%k$N%3%s%F%-%9%H(B
+$BJ8;zNs$,(B"ky" $B$@$H$9$k$H!"F~NO%3%s%F%-%9%H$N:G8e$N#2J8;z$,(B "ky" $B$G$"$l$P%^%C(B
+$B%A$7$^$9!#%3%s%F%-%9%HJ8;zNs$,6uJ8;zNs(B ("") $B$@$C$?>l9g$K$O!"F~NO%3%s%F%-%9(B
+$B%H$,2?$G$"$C$F$b%^%C%A$7$^$9!#(B
+ 
+$B$3$NJ8;zNs$NCf$G$O(B '^' $B$H(B ' ' $B$N#2$D$NJ8;z$,FC<l%-%c%i%/%?$H$7$F07$o$l$^$9!#(B'
+^' $B$O%3%s%H%m!<%k%-!<$NI=5-$K;H$$$^$9!#(B"^C" $B$H=q$1$P$3$l$O%3%s%H%m!<%k(B-C 
+$B$rI=$7$^$9!#(B' ' $B$O<!$NJ8;z$N!"FC<l%-%c%i%/%?$H$7$F$N0UL#$r$J$/$7$^$9!#(B"
+^C" $B$O%3%s%H%m!<%k(B-C $B$G$O$J$/!"(B'^' $B$H(B 'C' $B$N#2J8;z$+$i$J$kJ8;zNs$rI=$7$^$9!#(B
+$B$b$A$m$s!"(B' ' $B$H$$$&J8;z<+?H$r;H$$$?$$$H$-$K$O(B " " $B$H=E$M$^$9!#(B
+ 
+<$B%-!<(B> $B$OF~NO$5$l$?%-!<$rI=$7$^$9!#$3$l$O(B X$B$N%-!<%$%Y%s%H!"%-%c%i%/%?%3!<(B
+$B%I!"%a%?%-%c%i%/%?!"5?;w%-!<%3!<%I$N$$$:$l$+$r;XDj$7$^$9!#(B
+ 
+X$B$N%-!<%$%Y%s%H$O!"(B
+ 
+	[$B%b%G%#%U%!%$%"(B-]Keysym$BL>(B
+ 
+$B$N$h$&$KI=5-$7$^$9!#%b%G%#%U%!%$%"$H$7$F$O(B
+ 
+	shift
+	lock
+	control
+	mod1
+	mod2
+	mod3
+	mod4
+	mod5
+ 
+$B$,;HMQ$G$-$^$9!#J#?t$N%b%G%#%U%!%$%"$r;XDj$9$k;~$K$O%O%$%U%s(B ' ' $B$G$D$J$.(B
+$B$^$9!#(BKeysym$BL>$O(B X $B$GDj5A$5$l$F$$$k(B Keysym $B$NL>A0$G$9!#$3$l$O(B
+/usr/include/X11/keysymdef.h $B$GDj5A$5$l$F$$$kL>A0$N$+$i@hF,$N(B 'XK_' $B$r<h$j(B
+$B5n$C$?$b$N$G$9!#Nc$($P%?%V%-!<$O(B
+ 
+	#define XK_Tab  0xFF09
+ 
+$B$HDj5A$5$l$F$$$^$9$+$i!"(BKeysym$BL>$O(B 'Tab' $B$K$J$j$^$9!#JQ49%k!<%k$K=q$1$k(B X
+$B$N%-!<%$%Y%s%H$NNc$H$7$F$O<!$N$h$&$J$b$N$,$"$j$^$9!#(B
+ 
+	Tab
+	shift-Tab
+	control-mod1-space
+ 
+$B<!$K%-%c%i%/%?%3!<%I$G$N;XDjJ}K!$G$9$,!"$3$N;~$O%7%s%0%k%/%)!<%H$G0O$_$^$9!#(B
+$BNc$($P<!$N$h$&$KI=5-$7$^$9!#(B
+ 
+	 'a'
+	 '^['
+	 ' ''
+ 
+$B$3$NI=5-$K$bFC<l%-%c%i%/%?(B '^' $B$H(B ' ' $B$,;HMQ$G$-$^$9!#$D$^$j>e$NNc$G$O#2HV(B
+$B$a$NNc$O%(%9%1!<%W(B (0x1e) $B$rI=$7!"#3HV$a$O%7%s%0%k%/%)!<%HJ8;z$rI=$7$F$$$^(B
+$B$9!#(B
+ 
+$B%a%?%-%c%i%/%?$O<!$N(B 9 $B<oN`$,MQ0U$5$l$F$$$^$9!#(B
+ 
+	@any		$B2?$K$G$b%^%C%A$9$k(B
+	@raw		$B%-!<%$%Y%s%H$J$i2?$K$G$b%^%C%A(B
+	@func		$B%U%!%s%/%7%g%s%-!<$K%^%C%A(B
+	@cursor		$B%+!<%=%k%-!<$K%^%C%A(B
+	@keypad		$B%F%s%-!<%Q%C%I$N%-!<$K%^%C%A(B
+	@modifier	$B%b%G%#%U%!%$%"(B (shift, control $B$J$I(B) $B$K%^%C%A(B
+	@ascii		$B%-%c%i%/%?%3!<%I$J$i2?$K$G$b%^%C%A(B
+	@printable	$B0u;z2DG=J8;z(B (0x20 $B!e(B c $B!e(B 0x7e) $B$K%^%C%A(B
+	@control	$B%3%s%H%m!<%kJ8;z(B (0x00 $B!e(B c $B!e(B 0x1f) $B$K%^%C%A(B
+ 
+$B$3$l$i$N%a%?%-%c%i%/%?$G;XDj$5$l$?%-!<$r(B <$BJQ497k2LJ8;zNs(B> $B$G;2>H$9$k$K$O(B
+'&' $B$r;HMQ$7$^$9!#(B
+ 
+$B5?;w%-!<$K$O<!$N#2<oN`$,$"$j$^$9!#(B
+ 
+
+	ENTERMODE
+	EXITMODE
+ 
+$B$3$l$i$OK\Ev$N%-!<F~NO$G$O$"$j$^$;$s!#(BENTERMODE $B$O$"$k%b!<%I$KF~$C$?;~$K2>(B
+$BA[E*$KF~NO$5$l$k%-!<$G$"$j!"(BEXITMODE $B$O$"$k%b!<%I$+$iH4$1$?;~$K2>A[E*$KF~(B
+$BNO$5$l$k%-!<$G$9!#$3$l$i$O$"$k%b!<%I$K$O$$$C$?;~$dH4$1$?;~$KFCJL$NF0:n$r$5(B
+$B$;$k$?$a$KMQ0U$5$l$F$$$^$9!#(BCcWnn $B$G$O$3$l$i$O(B JIS$B%3!<%IF~NO$N$?$a$K;HMQ$5(B
+$B$l$F$$$^$9!#(B
+ 
+<$BJQ497k2LJ8;zNs(B> $B$O%@%V%k%/%)!<%H$G0O$^$l$?J8;zNs$G!"$=$NL>$NDL$j$=$NJQ49(B
+$B%k!<%k$,E,MQ$5$l$?;~$NJQ497k2L$r;XDj$7$^$9!#$3$NJQ497k2L$OF~NO%3%s%F%-%9%H(B
+$B$K$bF~$l$i$l$^$9!#$D$^$j!"F~NO%3%s%F%-%9%H$N$&$A!"(B<$B%3%s%F%-%9%HJ8;zNs(B> $B$H(B
+$B%^%C%A$7$?ItJ,$,(B<$BJQ497k2LJ8;zNs(B> $B$KJQ$o$j$^$9!#Nc$($P!"F~NO%3%s%F%-%9%H$,(B
+"...$B$P(Bk" $B$@$C$?;~$K(B
+ 
+	"k"	'a'	"$B$+(B"
+ 
+$B$H$$$&JQ49%k!<%k$,E,MQ$5$l$k$HF~NO%3%s%F%-%9%H$O(B "...$B$P$+(B" $B$KJQ$o$j$^$9!#(B
+ 
+<$BJQ497k2LJ8;zNs(B> $B$K$D$$$F$b$$$/$D$+$NFC<l%-%c%i%/%?$,Dj5A$5$l$F$$$^$9!#(B'^' 
+$B$H(B ' ' $B$O(B <$B%3%s%F%-%9%HJ8;zNs(B> $B$HF1MM$N0UL#$r;}$A$^$9!#(B'&' $B$O(B <$B%-!<(B> $B$NI=(B
+$B$9%-%c%i%/%?$HCV$-49$($i$l$^$9!#$3$l$O(B <$B%-!<(B> $B$K%a%?%-%c%i%/%?$r;HMQ$7$?>l(B
+$B9g$KJXMx$G$9!#Nc$($P(B 'a' $B$r2!$7$?;~$K(B
+ 
+	""	@printable	"&"
+ 
+$B$H$$$&%k!<%k$,E,MQ$5$l$k$H!"(B'&' $B$O(B 'a' $B$KCV$-49$($i$l$^$9!#$^$?!"(B'/' $B$OF~(B
+$BNO%3%s%F%-%9%H$r%/%j%"$7$^$9!#(B
+ 
+	"k"	'a'	"$B$+(B/"
+ 
+$B$H$$$&%k!<%k$,E,MQ$5$l$k$H(B "$B$+(B" $B$H$$$&J8;zNs$KJQ49$5$l$^$9$,!"F~NO%3%s%F%-(B
+$B%9%H$O%/%j%"$5$l$F$J$/$J$C$F$7$^$$$^$9!#(B'/' $B$rJ8;zNs$NESCf$KF~$l$k$3$H$b2D(B
+$BG=$G$9!#$=$N>l9g$K$O(B '/' $B$N$"$H$NItJ,$@$1$,?7$7$$F~NO%3%s%F%-%9%H$K$J$j$^(B
+$B$9!#(B
+ 
+<$B%U%!%s%/%7%g%s(B> $B$K$O!"<B9T$9$Y$-%U%!%s%/%7%g%s$r=q$-$^$9!#$J$1$l$P=q$/I,(B
+$BMW$O$"$j$^$;$s!#J#?t=q$+$l$?>l9g$K$O!"A0$+$i=g$K<B9T$5$l$^$9!#(B
+ 
+$BJQ49MQ%U%!%s%/%7%g%s$NB>$KFC<l%U%!%s%/%7%g%s$H$7$F!"(B goto $B$H(B redo $B$H(B 
+add-modifier- $B%7%j!<%:$,MQ0U$5$l$F$$$^$9!#(B
+ 
+ goto  $B$O8=:_$NF~NO%b!<%I$rJQ99$9$k$?$a$K;H$$$^$9!#(B
+ 
+	goto <$B%b!<%IL>(B>
+ 
+$B%b!<%IL>$H$7$F(B PREV $B$r;XDj$9$k$H!"$=$ND>A0$NF~NO%b!<%I$KLa$k$3$H$,$G$-$^$9!#(B
+ 
+redo  $B$O:FJQ49$r$5$;$k$?$a$K;H$$$^$9!#(B
+ 
+	redo
+ 
+$B$H=q$/$H$b$&0lEY%^%C%A$9$k%k!<%k$rC5$7$K$$$-$^$9!#$?$@$7!"$=$NA0$K(B <$B%3%s%F(B
+$B%-%9%HJ8;zNs(B> $B$,(B <$BJQ497k2LJ8;zNs(B> $B$GCV$-49$($i$l$F$$$k$N$G!":F$SF1$8%k!<%k(B
+$B$,%^%C%A$9$k$H$O8B$j$^$;$s!#$3$N5!G=$rMxMQ$9$k;~$K$O!"L58B%k!<%W$K4Y$i$J$$(B
+$B$h$&$K==J,5$$r$D$1$kI,MW$,$"$j$^$9!#0l1~(B redo $B$,(B 20$B2sO"B3$7$F8F$P$l$k$H%^%C(B
+$B%A%s%0$K<:GT$9$k$h$&$K$J$C$F$O$$$^$9$,!#(B
+ 
+goto $B$H(B redo $B$N$"$H$K=q$+$l$?%U%!%s%/%7%g%s$O(B $B<B9T$5$l$^$;$s(B $B!#%k!<%k$r=q(B
+$B$/;~$K$O5$$r$D$1$F2<$5$$!#(B
+ 
+add-modifier- $B%7%j!<%:$G$O!"<!$KF~NO$7$?%-!<$K%b%G%#%U%!%$%d$rDI2C$9$k(B
+$B$3$H$,$G$-$^$9!#(Badd-modifier- $B%7%j!<%:$K$O0J2<$N$b$N$,MQ0U$5$l$F$$$^$9!#(B
+
+	add-modifier-shift
+	add-modifier-control
+	add-modifier-lock
+	add-modifier-mod1
+	add-modifier-mod2
+	add-modifier-mod3
+	add-modifier-mod4
+	add-modifier-mod5
+
+$BNc$($P!"(B
+
+	""	'^['		""	add-modifier-mod1
+	""	mod1-i		""	shrink-s
+
+$B$H$$$&JQ49%k!<%k$r=q$$$F$*$/$H!"(Bmod1-i $B$HF~NO$7$F$b!"(B^[ i $B$HF~NO$7$F$b(B 
+shrink-s $B$,<B9T$5$l$k$h$&$K$G$-$^$9!#(B
+
+CcWnn $B$GMQ0U$5$l$F$$$kJQ49%U%!%s%/%7%g%s$H$=$N5!G=$N0lMw$r<!$K<($7$^$9!#5!(B
+$BG=$N5-=R$NCf$G;H$o$l$F$$$k(B [$BL$JQ49(B] $B$J$I$O$=$l$>$l(B
+ 
+	[$BL$JQ49(B]	$B%+%l%s%HJ8@a$,L$JQ49$G$"$k;~$NF0:n(B
+	[$BJQ49:Q(B]	$B%+%l%s%HJ8@a$,$9$G$KJQ49$5$l$F$$$k;~$NF0:n(B
+	[$B8uJdA*Br(B]	$B%9%F!<%?%9%i%$%s$G$NF12;8lA*Br%b!<%I$G$NF0:n(B
+	[$B5-9fF~NO(B]	$B5-9fF~NO%b!<%I$G$NF0:n(B
+ 
+$B$r<($7$F$$$^$9!#(B
+ 
+
+$B%U%!%s%/%7%g%sL>(B	$B5!G=(B
+------------------------------------------------------------------------------
+convert		[$BL$JQ49(B] $B%+%l%s%HJ8@a0J9_$rO"J8@aJQ49$9$k(B
+		[$BJQ49:Q(B] $B%+%l%s%HBgJ8@a$N8uJdA*Br%b!<%I$K$O$$$k(B
+		[$B8uJdA*Br(B]  forward  $B$HF1$8(B
+		[$B5-9fF~NO(B] $B%(%i!<(B ($B%Y%k$,LD$k(B)
+------------------------------------------------------------------------------
+convert-or-fix1	[$BL$JQ49(B][$B8uJdA*Br(B][$B5-9fF~NO(B]  convert  $B$HF1$8(B
+		[$BJQ49:Q(B] $B:G=i$N0lJ8;z$@$1$,3NDj$5$l$k(B
+------------------------------------------------------------------------------
+convert-or-space[$BL$JQ49(B][$BJQ49:Q(B] $BL$3NDjJ8;zNs$,$"$l$P(B  convert  $B$HF1$8!#(B
+		$B$J$1$l$P%9%Z!<%9$,A^F~!&3NDj$5$l$k(B
+		[$B8uJdA*Br(B][$B5-9fF~NO(B]  convert  $B$HF1$8(B
+------------------------------------------------------------------------------
+convert-or-sendback[$BL$JQ49(B][$BJQ49:Q(B] $BL$3NDjJ8;zNs$,$"$l$P(B  convert  $B$HF1$8!#(B
+		$B$J$1$l$P(B send-back $B$HF1$8(B
+		[$B8uJdA*Br(B][$B5-9fF~NO(B]  convert  $B$HF1$8(B
+------------------------------------------------------------------------------
+convert-s	[$BL$JQ49(B] $B%+%l%s%HJ8@a0J9_$rO"J8@aJQ49$9$k(B
+		[$BJQ49:Q(B] $B%+%l%s%H>.J8@a$N8uJdA*Br%b!<%I$K$O$$$k(B
+		[$B8uJdA*Br(B]  forward  $B$HF1$8(B
+		[$B5-9fF~NO(B] $B%(%i!<(B ($B%Y%k$,LD$k(B)
+------------------------------------------------------------------------------
+unconvert	[$BJQ49:Q(B] $B%+%l%s%HBgJ8@a$rL5JQ49$N>uBV$KLa$9(B
+		[$BL$JQ49(B][$B8uJdA*Br(B][$B5-9fF~NO(B] $B%(%i!<(B ($B%Y%k$,LD$k(B)
+------------------------------------------------------------------------------
+next		[$BL$JQ49(B] $B%(%i!<(B ($B%Y%k$,LD$k(B)
+		[$BJQ49:Q(B] $B%+%l%s%HBgJ8@a$r<!8uJd$GCV$-49$($k(B
+		[$B8uJdA*Br(B][$B5-9fF~NO(B] $B<!%Z!<%8$K0\F0$9$k(B
+------------------------------------------------------------------------------
+next-s		[$BL$JQ49(B] $B%(%i!<(B ($B%Y%k$,LD$k(B)
+		[$BJQ49:Q(B] $B%+%l%s%H>.J8@a$r<!8uJd$GCV$-49$($k(B
+		[$B8uJdA*Br(B][$B5-9fF~NO(B] $B<!%Z!<%8$K0\F0$9$k(B
+------------------------------------------------------------------------------
+previous	[$BL$JQ49(B] $B%(%i!<(B ($B%Y%k$,LD$k(B)
+		[$BJQ49:Q(B] $B%+%l%s%HBgJ8@a$rA08uJd$GCV$-49$($k(B
+		[$B8uJdA*Br(B][$B5-9fF~NO(B] $BA0%Z!<%8$K0\F0$9$k(B
+------------------------------------------------------------------------------
+previous-s	[$BL$JQ49(B] $B%(%i!<(B ($B%Y%k$,LD$k(B)
+		[$BJQ49:Q(B] $B%+%l%s%H>.J8@a$rA08uJd$GCV$-49$($k(B
+		[$B8uJdA*Br(B][$B5-9fF~NO(B] $BA0%Z!<%8$K0\F0$9$k(B
+------------------------------------------------------------------------------
+forward		[$BL$JQ49(B] $B%+!<%=%k$r#1J8;z?J$a$k(B
+		[$BJQ49:Q(B] $B%+%l%s%HJ8@a$r#1>.J8@aJ,8e$m$K0\F0$9$k(B
+		[$B8uJdA*Br(B][$B5-9fF~NO(B] $B<!8uJd(B($B5-9f(B)$B$K0\F0$9$k(B
+------------------------------------------------------------------------------
+backward	[$BL$JQ49(B] $B%+!<%=%k$r#1J8;zLa$9(B
+		[$BJQ49:Q(B] $B%+%l%s%HJ8@a$r#1>.J8@aJ,A0$K0\F0$9$k(B
+		[$B8uJdA*Br(B][$B5-9fF~NO(B] $BA08uJd(B($B5-9f(B)$B$K0\F0$9$k(B
+------------------------------------------------------------------------------
+move-top	[$BL$JQ49(B][$BJQ49:Q(B] $B%+!<%=%k$*$h$S%+%l%s%HJ8@a$rJ8$N@hF,$K(B
+		$B0\F0$5$;$k(B
+		[$B8uJdA*Br(B][$B5-9fF~NO(B] $B8=:_%Z!<%8$N@hF,$N8uJd(B($B5-9f(B)$B$K0\F0$9$k(B
+------------------------------------------------------------------------------
+move-bottom	[$BL$JQ49(B][$BJQ49:Q(B] $B%+!<%=%k$*$h$S%+%l%s%HJ8@a$rJ8$N:G8e$K(B
+		$B0\F0$5$;$k(B
+		[$B8uJdA*Br(B][$B5-9fF~NO(B] $B8=:_%Z!<%8$N:G8e$N8uJd(B($B5-9f(B)$B$K0\F0$9$k(B
+------------------------------------------------------------------------------
+clear		[$BL$JQ49(B][$BJQ49:Q(B] $BF~NO$7$?J8$rA4$F:o=|$9$k(B
+		[$B8uJdA*Br(B] $BF~NO$7$?J8$rA4$F:o=|$7!"8uJdA*Br%b!<%I$+$iH4$1$k(B
+		[$B5-9fF~NO(B] $BF~NO$7$?J8$rA4$F:o=|$7!"5-9fF~NO%b!<%I$+$iH4$1$k(B
+------------------------------------------------------------------------------
+expand		[$BJQ49:Q(B] $B%+%l%s%HBgJ8@a$r0lJ8;z$N$P$7:FJQ49$9$k(B
+		[$BL$JQ49(B][$B8uJdA*Br(B][$B5-9fF~NO(B] $B%(%i!<(B ($B%Y%k$,LD$k(B)
+------------------------------------------------------------------------------
+expand-s	[$BJQ49:Q(B] $B%+%l%s%H>.J8@a$r0lJ8;z$N$P$7:FJQ49$9$k(B
+		[$BL$JQ49(B][$B8uJdA*Br(B][$B5-9fF~NO(B] $B%(%i!<(B ($B%Y%k$,LD$k(B)
+------------------------------------------------------------------------------
+shrink		[$BJQ49:Q(B] $B%+%l%s%HBgJ8@a$r0lJ8;z$A$B$a:FJQ49$9$k(B
+		[$BL$JQ49(B][$B8uJdA*Br(B][$B5-9fF~NO(B] $B%(%i!<(B ($B%Y%k$,LD$k(B)
+------------------------------------------------------------------------------
+shrink-s	[$BJQ49:Q(B] $B%+%l%s%H>.J8@a$r0lJ8;z$A$B$a:FJQ49$9$k(B
+		[$BL$JQ49(B][$B8uJdA*Br(B][$B5-9fF~NO(B] $B%(%i!<(B ($B%Y%k$,LD$k(B)
+------------------------------------------------------------------------------
+expand-noconv	[$BJQ49:Q(B] $B%+%l%s%HBgJ8@a$r0lJ8;z$N$P$9(B $B:FJQ49$O$7$J$$(B
+		  ($B$d$C$F$_$k$H$o$+$j$^$9$,$3$l$O$"$^$j0UL#$,$"$j$^$;$s(B)
+		[$BL$JQ49(B][$B8uJdA*Br(B][$B5-9fF~NO(B] $B%(%i!<(B ($B%Y%k$,LD$k(B)
+------------------------------------------------------------------------------
+expand-noconv-s	[$BJQ49:Q(B] $B%+%l%s%H>.J8@a$r0lJ8;z$N$P$9(B $B:FJQ49$O$7$J$$(B
+		  ($B$d$C$F$_$k$H$o$+$j$^$9$,$3$l$O$"$^$j0UL#$,$"$j$^$;$s(B)
+		[$BL$JQ49(B][$B8uJdA*Br(B][$B5-9fF~NO(B] $B%(%i!<(B ($B%Y%k$,LD$k(B)
+------------------------------------------------------------------------------
+shrink-noconv	[$BJQ49:Q(B] $B%+%l%s%HBgJ8@a$r0lJ8;z$A$B$a$k(B $B:FJQ49$O$7$J$$(B
+		  ($B$d$C$F$_$k$H$o$+$j$^$9$,$3$l$O$"$^$j0UL#$,$"$j$^$;$s(B)
+		[$BL$JQ49(B][$B8uJdA*Br(B][$B5-9fF~NO(B] $B%(%i!<(B ($B%Y%k$,LD$k(B)
+------------------------------------------------------------------------------
+shrink-noconv-s	[$BJQ49:Q(B] $B%+%l%s%H>.J8@a$r0lJ8;z$A$B$a$k(B $B:FJQ49$O$7$J$$(B
+		  ($B$d$C$F$_$k$H$o$+$j$^$9$,$3$l$O$"$^$j0UL#$,$"$j$^$;$s(B)
+		[$BL$JQ49(B][$B8uJdA*Br(B][$B5-9fF~NO(B] $B%(%i!<(B ($B%Y%k$,LD$k(B)
+------------------------------------------------------------------------------
+fix		[$BL$JQ49(B][$BJQ49:Q(B] $BJ8$r3NDj$9$k(B
+		[$B8uJdA*Br(B] $B8=:_%+!<%=%k$,$"$k8uJd$rA*Br$7$F$+$iJ8$r3NDj$9$k(B
+		[$B5-9fF~NO(B] $B8=:_%+!<%=%k$,$"$k5-9f$rA*Br$7$F$+$iJ8$r3NDj$9$k(B
+------------------------------------------------------------------------------
+fix2		[$BL$JQ49(B][$BJQ49:Q(B][$B8uJdA*Br(B][$B5-9fF~NO(B] fix $B$HF1$8(B
+		(fix $B$O3NDj$9$kJ8;z$,$J$$;~$K<B9T$9$k$H%Y%k$rLD$i$9$,!"(B
+		fix2 $B$OC1$KL5;k$9$k(B)
+------------------------------------------------------------------------------
+fix-or-cr	[$BL$JQ49(B][$BJQ49:Q(B] $BL$3NDjJ8;zNs$,$"$l$P3NDj$9$k!#(B
+		$B$J$1$l$P(B  carriage-return  $B$HF1$8(B
+		[$B8uJdA*Br(B][$B5-9fF~NO(B]  carriage-return  $B$HF1$8(B
+------------------------------------------------------------------------------
+fix-or-sendback	[$BL$JQ49(B][$BJQ49:Q(B] $BL$3NDjJ8;zNs$,$"$l$P3NDj$9$k!#(B
+		$B$J$1$l$P(B  send-back  $B$HF1$8(B
+		[$B8uJdA*Br(B][$B5-9fF~NO(B]  send-back  $B$HF1$8(B
+------------------------------------------------------------------------------
+to-hankaku	[$BL$JQ49(B][$BJQ49:Q(B] $B%+%l%s%HJ8@a$rH>3QJ8;z$K$9$k(B
+		[$B8uJdA*Br(B] $B%+%l%s%HJ8@a$rH>3QJ8;z$K$7!"8uJdA*Br%b!<%I$rH4$1$k(B
+		[$B5-9fF~NO(B] $B%(%i!<(B ($B%Y%k$,LD$k(B)
+------------------------------------------------------------------------------
+to-zenkaku	[$BL$JQ49(B][$BJQ49:Q(B] $B%+%l%s%HJ8@a$rA43QJ8;z$K$9$k(B
+		[$B8uJdA*Br(B] $B%+%l%s%HJ8@a$rA43QJ8;z$K$7!"8uJdA*Br%b!<%I$rH4$1$k(B
+		[$B5-9fF~NO(B] $B%(%i!<(B ($B%Y%k$,LD$k(B)
+------------------------------------------------------------------------------
+to-hiragana	[$BL$JQ49(B][$BJQ49:Q(B] $B%+%l%s%HJ8@a$r$R$i$,$J$K$9$k(B
+		[$B8uJdA*Br(B] $B%+%l%s%HJ8@a$r$R$i$,$J$K$7!"8uJdA*Br%b!<%I$rH4$1$k(B
+		[$B5-9fF~NO(B] $B%(%i!<(B ($B%Y%k$,LD$k(B)
+------------------------------------------------------------------------------
+to-katakana	[$BL$JQ49(B][$BJQ49:Q(B] $B%+%l%s%HJ8@a$r%+%?%+%J$K$9$k(B
+		[$B8uJdA*Br(B] $B%+%l%s%HJ8@a$r%+%?%+%J$K$7!"8uJdA*Br%b!<%I$rH4$1$k(B
+		[$B5-9fF~NO(B] $B%(%i!<(B ($B%Y%k$,LD$k(B)
+------------------------------------------------------------------------------
+backspace	[$BL$JQ49(B] $B%+!<%=%k$NA0$NJ8;z$r:o=|$9$k(B
+		[$BJQ49:Q(B] $B%+%l%s%HBgJ8@a$rL$JQ49>uBV$KLa$7$F$+$i%+!<%=%k$N(B
+		$BA0$NJ8;z$r:o=|$9$k(B
+		[$B8uJdA*Br(B] $B8uJdA*Br%b!<%I$rH4$1!"%+%l%s%HJ8@a$rL$JQ49>uBV$K(B
+		$BLa$7$F$+$i%+!<%=%k$NA0$NJ8;z$r:o=|$9$k(B
+		[$B5-9fF~NO(B] $B5-9fF~NO%b!<%I$+$iH4$1$k(B
+------------------------------------------------------------------------------
+delete		[$BL$JQ49(B] $B%+!<%=%k$N2<$NJ8;z$r:o=|$9$k(B
+		[$BJQ49:Q(B] $B%+%l%s%HBgJ8@a$rL$JQ49>uBV$KLa$7$F$+$i%+!<%=%k$N(B
+		$B2<$NJ8;z$r:o=|$9$k(B
+		[$B8uJdA*Br(B] $B8uJdA*Br%b!<%I$rH4$1!"%+%l%s%HBgJ8@a$rL$JQ49>uBV$K(B
+		$BLa$7$F$+$i%+!<%=%k$N2<$NJ8;z$r:o=|$9$k(B
+		[$B5-9fF~NO(B] $B5-9fF~NO%b!<%I$+$iH4$1$k(B
+------------------------------------------------------------------------------
+kill-line	[$BL$JQ49(B] $B%+!<%=%k$N2<$NJ8;z$H$=$l0J9_$r:o=|$9$k(B
+		[$BJQ49:Q(B] $B%+%l%s%HJ8@a$H$=$l0J9_$r:o=|$9$k(B
+		[$B8uJdA*Br(B] $B8uJdA*Br%b!<%I$+$iH4$1!"%+%l%s%HJ8@a0J9_$r:o=|$9$k(B
+		[$B5-9fF~NO(B] $B5-9fF~NO%b!<%I$+$iH4$1$k!"$=$l0J9_$r:o=|$9$k(B
+------------------------------------------------------------------------------
+carriage-return	[$BL$JQ49(B][$BJQ49:Q(B] $BJ8$r3NDj$7!"$=$N8e2~9TJ8;z$rA^F~$9$k(B
+		[$B8uJdA*Br(B][$B5-9fF~NO(B] $B8=:_%+!<%=%k$N$"$k8uJd(B($B5-9f(B)$B$rA*Br$9$k(B
+------------------------------------------------------------------------------
+beep		[$BL$JQ49(B][$BJQ49:Q(B][$B8uJdA*Br(B][$B5-9fF~NO(B] $B%Y%k$rLD$i$9(B
+------------------------------------------------------------------------------
+jiscode-begin	[$BL$JQ49(B][$BJQ49:Q(B] JIS$B%3!<%IF~NO%b!<%I$K$O$$$k(B
+		[$B8uJdA*Br(B][$B5-9fF~NO(B] $B%(%i!<(B ($B%Y%k$,LD$k(B)
+------------------------------------------------------------------------------
+jiscode-end	[$BL$JQ49(B][$BJQ49:Q(B] JIS$B%3!<%IF~NO%b!<%I$r$L$1$k(B
+		[$B8uJdA*Br(B][$B5-9fF~NO(B] $B%(%i!<(B ($B%Y%k$,LD$k(B)
+------------------------------------------------------------------------------
+kutencode-begin	[$BL$JQ49(B][$BJQ49:Q(B] $B6hE@%3!<%IF~NO%b!<%I$K$O$$$k(B
+		[$B8uJdA*Br(B][$B5-9fF~NO(B] $B%(%i!<(B ($B%Y%k$,LD$k(B)
+------------------------------------------------------------------------------
+kutencode-end	[$BL$JQ49(B][$BJQ49:Q(B] $B6hE@%3!<%IF~NO%b!<%I$r$L$1$k(B
+		[$B8uJdA*Br(B][$B5-9fF~NO(B] $B%(%i!<(B ($B%Y%k$,LD$k(B)
+------------------------------------------------------------------------------
+symbol-input	[$BL$JQ49(B][$BJQ49:Q(B] $B5-9fF~NO%b!<%I$K$O$$$k(B
+		[$B8uJdA*Br(B] $B%(%i!<(B ($B%Y%k$,LD$k(B)
+		[$B5-9fF~NO(B] $B5-9fF~NO%b!<%I$+$iH4$1$k(B
+------------------------------------------------------------------------------
+send-back	[$BL$JQ49(B][$BJQ49:Q(B][$B8uJdA*Br(B][$B5-9fF~NO(B] $B$3$N%U%!%s%/%7%g%s$r(B
+		$B%H%j%,!<$7$?%-!<%$%Y%s%H$r%"%W%j%1!<%7%g%s$KAw$jJV$9(B
+------------------------------------------------------------------------------
+convert-move-top-or-sendback[$BL$JQ49(B] $BL$3NDjJ8;zNs$,$"$l$PL$JQ49$N@hF,J8(B
+		$B@a$rO"J8@aJQ49$9$k!#$J$1$l$P(B send-back $B$HF1$8(B
+		[$BJQ49:Q(B][$B8uJdA*Br(B][$B5-9fF~NO(B]  convert-or-sendback  $B$HF1$8(B
+------------------------------------------------------------------------------
+convert-move-top-or-space[$BL$JQ49(B] $BL$3NDjJ8;zNs$,$"$l$PL$JQ49$N@hF,J8(B
+		$B@a$rO"J8@aJQ49$9$k!#$J$1$l$P%9%Z!<%9$,A^F~!&3NDj$5$l$k!#(B
+		($BMW$9$k$K(B egg $B$G(B wnn $B$r;H$$(B space $B$r2!$7$?;~$N$h$&$K$J$k(B)
+		[$BJQ49:Q(B][$B8uJdA*Br(B][$B5-9fF~NO(B]  convert-or-space  $B$HF1$8(B
+------------------------------------------------------------------------------
+clear-or-cancel [$BJQ49:Q(B][$B8uJdA*Br(B] $B8uJdA*Br%b!<%I$rH4$1F~NO$5$l$?J8;z(B
+		$BNs$rA4$F$R$i$,$J$K$b$I$7!"%+!<%=%k$rJ8$N:G8e$K0\F0$5$;$k(B
+		[$BL$JQ49(B][$B5-9fF~NO(B]  clear  $B$HF1$8(B
+------------------------------------------------------------------------------
+backspace-or-cancel[$BJQ49:Q(B][$B8uJdA*Br(B]  clear-or-cancel  $B$HF1$8(B
+		[$BL$JQ49(B][$B5-9fF~NO(B]  backspace  $B$HF1$8(B
+------------------------------------------------------------------------------
+delete-or-cancel[$BJQ49:Q(B][$B8uJdA*Br(B]  clear-or-cancel  $B$HF1$8(B
+		[$BL$JQ49(B][$B5-9fF~NO(B]  delete  $B$HF1$8(B
+------------------------------------------------------------------------------
+convert-next-or-move-top-or-sendback[$BJQ49:Q(B] $B%+%l%s%HBgJ8@a$r<!8uJd$GCV$-49$($k(B
+		[$BL$JQ49(B][$B8uJdA*Br(B][$B5-9fF~NO(B]  convert-move-top-or-space  $B$HF1$8(B
+------------------------------------------------------------------------------
+convert-next-or-move-top-or-space[$BJQ49:Q(B] $B%+%l%s%HBgJ8@a$r<!8uJd$GCV$-49$($k(B
+		[$BL$JQ49(B][$B8uJdA*Br(B][$B5-9fF~NO(B]  convert-move-top-or-space  $B$HF1$8(B
+------------------------------------------------------------------------------
+select		[$BL$JQ49(B][$B8uJdA*Br(B][$B5-9fF~NO(B] $B%(%i!<(B ($B%Y%k$,LD$k(B)
+		[$BJQ49:Q(B] $B%+%l%s%HBgJ8@a$N8uJdA*Br%b!<%I$K$O$$$j!"(Bgoto $B$HF1MM$K(B
+		$B<!$N%U%!%s%/%7%g%s$r<B9T$7$J$$(B
+------------------------------------------------------------------------------
+select-s	[$BL$JQ49(B][$B8uJdA*Br(B][$B5-9fF~NO(B] $B%(%i!<(B ($B%Y%k$,LD$k(B)
+		[$BJQ49:Q(B] $B%+%l%s%H>.J8@a$N8uJdA*Br%b!<%I$K$O$$$j!"(Bgoto $B$HF1MM$K(B
+		$B<!$N%U%!%s%/%7%g%s$r<B9T$7$J$$(B
+------------------------------------------------------------------------------
+register	[$BL$JQ49(B][$BJQ49:Q(B] $BC18lEPO?%f!<%F%#%j%F%#$r8F$S=P$9(B
+		[$B8uJdA*Br(B][$B5-9fF~NO(B] $B%(%i!<(B ($B%Y%k$,LD$k(B)
+------------------------------------------------------------------------------
+
+ 
+** $B%+%9%?%^%$%:Nc(B 
+ 
+$B$3$3$G$OF~NOJ8;zJQ49Dj5A%U%!%$%k$N%+%9%?%^%$%:$K$D$$$F!"6qBNNc$r$"$2$F2r@b(B
+$B$7$^$9!#(B
+
+***   $BJQ49%U%!%s%/%7%g%s$N%P%$%s%G%#%s%0JQ99(B 
+ 
+$B$^$:$OJQ49$K;HMQ$9$k%-!<$N3dEv$rJQ$($kNc$G$9!#%G%U%)%k%H$N%P%$%s%G%#%s%0$G(B
+$B$OJQ49$O(B '^J' $B$H(B '$B4A;z(B' $B%-!<$K3d$jEv$F$i$l$F$$$^$9$,!"$3$l$r(B '^W' $B$KJQ99$7(B
+$B$F$_$^$9!#(B
+ 
+$B%G%U%)%k%H$NDj5A%U%!%$%k(B (/usr/lib/X11/ccdef/ccdef.kinput2) $B$r8+$k$H!"(B
+ 
+	include 'rule.func'
+ 
+$B$H$$$&9T$,$"$j!"JQ49$K;HMQ$9$k%-!<$O$3$N%U%!%$%k$KDj5A$5$l$F$$$k$3$H$,$o$+(B
+$B$j$^$9!#$7$?$,$C$F$3$N%U%!%$%k$rJQ99$9$l$P$h$$$N$G$9$,!"(B
+/usr/lib/X11/ccdef/rule.func$B$H$$$&%U%!%$%k$OB>$N?M$b;2>H$7$^$9$+$i!"$3$l$O(B
+$B$=$N$^$^$K$7$F$*$$$?J}$,$h$$$G$7$g$&!#(B
+ 
+$B$=$3$G$^$:4D6-JQ?t(B CC_DEF_PATH $B$rDj5A$7$F!"Dj5A%U%!%$%k$N%5!<%A%Q%9$rJQ99(B
+$B$7$^$9!#(B.cshrc $B$J$I$G(B
+ 
+	setenv CC_DEF_PATH ~/ccdef
+ 
+$B$H@_Dj$9$k$H!"Dj5A%U%!%$%k$rC5$9$N$K(B ~/ccdef $B$H$$$&%G%#%l%/%H%j$,;H$o$l$^(B
+$B$9!#(BCC_DEF_PATH $B$G;XDj$7$?%G%#%l%/%H%j$O%G%U%)%k%H$N%G%#%l%/%H%j$G$"$k(B
+/usr/lib/X11/ccdef $B$h$j$b@h$KC5$5$l$^$9$N$G!"$3$3$K<+J,MQ$N(B rule.func $B$H$$(B
+$B$&%U%!%$%k$r:n$l$P$$$$$o$1$G$9!#(B/usr/lib/X11/ccdef/rule.func $B$r(B 
+~/ccdef/rule.func $B$K%3%T!<$7$F$+$i$3$l$r%(%G%#%C%H$7$^$9!#%U%!%$%kCf$K(B
+ 
+	""	'^J'		""	convert
+	""	Kanji		""	convert
+ 
+$B$H$$$&9T$,$"$j$^$9$+$i!"$3$l$r(B
+ 
+	""	'^W'		""	convert
+ 
+$B$KCV$-49$($l$P=*$j$G$9!#(B
+
+*** $B$+$JF~NO$X$NJQ99(B 
+ 
+$B<!$O!"%m!<%^;z$+$JJQ49$r$7$F$+$J$rF~NO$9$k$N$G$O$J$/!"D>@\$+$J$rF~NO$9$k?M(B
+$B$N$?$a$NJQ99$G$9!#(B
+ 
+$B%G%U%)%k%H$NDj5A%U%!%$%k$O%m!<%^;zF~NOMQ$K$J$C$F$$$F!"%m!<%^;z$+$JJQ49$O(B 
+Kana $B$H$$$&F~NO%b!<%I$G9T$J$o$l$k$h$&$K$J$C$F$$$^$9!#(B
+ 
+	# $B%m!<%^;z(B
+	mode Kana	"$B%m!<%^(B"	fallthrough All
+	    include 'rule.roma'
+		""	Tab		""	goto Ascii
+		""	shift-Tab	""	goto ZenkakuAscii
+		"n"	EXITMODE	"$B$s(B"
+	endmode
+ 
+$B<B:]$NJQ49%k!<%k$O(B rule.roma $B$H$$$&%U%!%$%k$KF~$C$F$$$^$9!#(B
+ 
+$B$5$F!"$3$3$rJQ$($l$P$+$JF~NOMQ$NDj5A%U%!%$%k$,$G$-$^$9!#<B$O$+$JF~NOMQ$NJQ(B
+$B49%k!<%k$O(B /usr/lib/X11/ccdef/rule.kana $B$KMQ0U$5$l$F$$$^$9!#$3$N%U%!%$%k$K(B
+$B$O<!$N$h$&$J%k!<%k$,=q$+$l$F$$$^$9!#(B
+ 
+	""	'3'	"$B$"(B"
+	""	'#'	"$B$!(B"
+	""	'e'	"$B$$(B"
+	""	'E'	"$B$#(B"
+ 
+$B8+$l$P$o$+$k$H;W$$$^$9$,!"$3$N%k!<%k$5$($"$l$PJL$K$+$J%-!<%\!<%I$G$J$/$H$b(B
+$B$+$JF~NO$9$k$3$H$,$G$-$^$9!#(B
+ 
+$B$5$F!"$3$NJQ99$N$?$a$K$O(B ccdef.kinput2 $B$rJQ99$7$J$1$l$P$J$j$^$;$s!#$=$3$G(B
+$B@h$[$I$HF1$8$h$&$K4D6-JQ?t(B CC_DEF_PATH $B$K(B ~/ccdef $B$r;XDj$7!"(B
+/usr/lib/X11/ccdef/ccdef.kinput2 $B$r(B ~/ccdef/ccdef.kinput2 $B$K%3%T!<$7$^$9!#(B
+$B$=$7$F!"(BKana $B%b!<%I$N5-=R$r(B
+ 
+	# $B$+$J(B
+	mode Roma	"$B$+$J(B"	fallthrough All
+	    include 'rule.kana'
+		""	Tab		""	goto Ascii
+		""	shift-Tab	""	goto ZenkakuAscii
+	endmode
+ 
+ 
+$B$KJQ$($l$P$+$JF~NOMQ$NDj5A%U%!%$%k$N=PMh>e$,$j$G$9!#(B
+
+*** Emacs $BMQ$NJQ99(B 
+ 
+$B%+%9%?%^%$%:$N:G8e$NNc$H$7$F!"(Bemacs $B$r;H$&;~$KJXMx$JJQ99$r>R2p$7$^$9!#(B
+
+$B$4B8CN$N$h$&$K!"(Bemacs $B$O%3%s%H%m!<%k%-!<$r6n;H$7$FJT=8$r9T$J$$$^$9!#%j%=!<(B
+$B%9(BsendbackKeyPress $B$,(B True $B$K$J$C$F$$$l$P!"L$3NDj$NJ8;zNs$,$J$$>uBV$G$O$[(B
+$B$H$s$I$N%3%s%H%m!<%k%-!<$O(B($B$=$N%-!<$,JQ49%U%!%s%/%7%g%s$K3d$jEv$F$i$l$F$$(B
+$B$F$b(B) $B$=$N$^$^%"%W%j%1!<%7%g%s$KEO$5$l$^$9$N$G!"$+$J4A;zJQ49$,$G$-$kF~NO%b!<(B
+$B%I$N$^$^(B emacs $B$K%3%^%s%I$rM?$($k$3$H$,$G$-$^$9!#$7$+$7Cf$K$O(B '^Xo' $B$J$I$N(B
+$B$h$&$K#2%9%H%m!<%/$N%3%^%s%I$,$"$j!"$3$l$r%m!<%^;zF~NO%b!<%I$N$^$^F~NO$9$k(B
+$B$H(B '^X' $B$O(B emacs $B$KEO$5$l$^$9$,!"(B'o' $B$O(B '$B$*(B' $B$KJQ49$5$l$F$7$^$$$^$9!#(B
+ 
+$B$3$l$G$OITJX$J$N$G!"(B'^X' $B$H(B '^[' $B$N$"$H$N#1J8;z$O$=$N$^$^%"%W%j%1!<%7%g%s(B
+$B$KEO$5$l$k$h$&$KDj5A%U%!%$%k$r=$@5$7$F$_$^$9!#(B
+
+$B$H$O$$$C$F$b$3$l$O$+$J$j%H%j%C%-!<$JJ}K!$r;H$&I,MW$,$"$j$^$9!#(B
+
+$B$^$:(B /usr/lib/X11/ccdef/ccdef.kinput2 $B$r(B ~/ccdef $B$K%3%T!<$7$^$9!#$=$7$F(B $B?7(B
+$B$?$K(B AsciiHack$B!"(BZenkakuAsciiHack $B$H(B KanaHack $B$N#3$D$N%b!<%I$rDI2C$7$^$9!#(B
+
+    defmode Ascii <$BCfN,(B> Restricted AsciiHack ZenkakuAsciiHack KanaHack
+
+Ascii$B!"(BZenkakuAscii$B!"(BKana $B$N3F%b!<%I$K<!$N%k!<%k$rDI2C$7$^$9!#(B
+
+	""	'^['	""	goto <$B%b!<%IL>(B>Hack
+	""	'^X'	""	goto <$B%b!<%IL>(B>Hack
+
+$B$?$@$7(B <$B%b!<%IL>(B> $B$K$O3F%b!<%IL>$,F~$j$^$9!#(B
+$B<!$K(B AsciiHack$B!"(BZenkakuAsciiHack$B!"(BKanaHack $B$N3F%b!<%I$rDI2C$7$^$9!#(B
+
+    mode <$B%b!<%IL>(B> "<$B%W%m%s%W%HJ8;zNs(B>"
+	""	@ascii	""	goto PREV
+    endmode
+
+$B$3$3$G=EMW$J$3$H$O!V(B<$B%W%m%s%W%HJ8;zNs(B> $B$K$O85$N%b!<%I(B (AsciiHack $B$J$i(B 
+Ascii)$B$N%W%m%s%W%HJ8;zNs$HF1$8$b$N$r;XDj$9$k!W$H$$$&$3$H$G$9!#(B
+
+$B$3$N$h$&$K$9$k$H0l1~(B '^X' $B$H(B '^[' $B$N$"$H$N#1J8;z$O$=$N$^$^%"%W%j%1!<%7%g%s(B
+$B$KEO$5$l$k$h$&$K$J$j$^$9!#$?$@$"$^$j$K$b%H%j%C%-!<$JJ}K!$J$N$G!"$J$<$=$&$J(B
+$B$k$N$+$O(B ($B$A$g$C$HCQ$:$+$7$/$F(B) $B$3$3$G$O@bL@$7$^$;$s!#(B
+
+*** Mule $B$d(B Emacs $B$N(B Egg $B$K9g$o$;$?%-!<%P%$%s%G%#%s%0(B
+
+$BIaCJ(B Mule $B$d(B Emacs $B$G(B Egg $B$rMxMQ$7$FF|K\8lF~NO$r9T$J$C$F$$$kJ}$O!"(B
+kinput2 $B$KIUB0$9$k(B ccdef.kinput2.egg $B$rMxMQ$9$k$H!"(Bkinput2 $B$G$b$[$\F1(B
+$BEy$N%-!<%P%$%s%G%#%s%0$r<B8=$9$k$3$H$,$G$-$^$9!#(B
+
+$B$d$j$+$?$O4JC1$G!"8D?M$N%j%=!<%9%U%!%$%k(B (~/.Xresources $B$J$I(B) $B$K<!$N9T$r(B
+$BDI2C$9$k$@$1$G$9!#(B
+
+	Kinput2*CcWnn.ccdef: ccdef.kinput2.egg
+
+$B$3$l$G%G%U%)%k%H$N(B ccdef.kinput2 $B$NBe$o$j$K(B ccdef.kinput2.egg $B$,;H$o$l(B
+$B$k$h$&$K$J$j$^$9!#(B
+
+$BKt!"(Begg $B$G$O(B
+
+	nn $B"*(B $B$s(Bn
+
+$B$H%m!<%^;zJQ49$5$l$F$7$^$$$^$9$,!"$3$l$r!"(B
+
+	nn $B"*(B $B$s(B
+
+$B$H$J$k$h$&$K(B egg $B$r%+%9%?%^%$%:$7$F$$$kJ}$OB?$$$H;W$$$9!#(Bkinput2 $B$G$3(B
+$B$N%+%9%?%^%$%:$r$9$k$K$O!"(Bccdef.kinput2.egg$B!"(Brule.hiragana.egg$B!"(B
+rule.katakana.egg$B!"(Brule.kigou.egg $B$r!"Nc$($P(B ~/ccdef $B$K%3%T!<$7$F$*$$(B
+$B$F!"(B~/ccdef/rule.hiragana.egg $B$N(B
+
+	#       "n"     'n'     "$B$s(B"
+
+$B$H!"(B~/ccdef/rule.katakana.egg $B$N(B
+
+	#       "n"     'n'     "$B%s(B"
+
+$B$N%3%a%s%H$r30$7$F2<$5$$(B ($B9TF,$N(B # $B$r<h$j=|$$$F2<$5$$(B)$B!#$=$7$F!"(B
+CC_DEF_PATH $B4D6-JQ?t$K(B ~/ccdef $B$r;XDj$7$F$*$1$P!"%k!<%k$,(B ~/ccdef $B$+$i(B
+$B$b8!:w$5$l$k$N$G$3$N@_Dj$,M-8z$K$J$j$^$9!#(B
+
+$B$J$*!"$3$N(B Egg $BMQ$N@_Dj(B ($B$*$h$S$3$N@_Dj$N$?$a$N(B kinput2
+$BK\BN$N3HD%(B) $B$OB?2lF`M3B@$5$s$,:n@.$5$l!"$=$l$r4sB#$7$F$$$?$@$$$?$b$N$G$9!#(B
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/doc/classes	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,125 @@
+** kinput2 $B$G;H$o$l$F$$$k(B widget class $B$K$D$$$F(B **
+
+kinput2 $B$G$O$5$^$6$^$J(B widget $B$r;HMQ$7$F$$$^$9!#$3$N$&$A!":#2s(B kinput2 
+$B$N$?$a$K?7$?$K3+H/$7$?(B widget $B$K$D$$$F!"4JC1$K@bL@$7$^$9!#(B
+
+
+* InputConv object
+$BJQ49$r9T$J$&%*%V%8%'%/%H$G$9!#$?$@$7<B:]$K;H$o$l$k$N$O$3$N%5%V%/%i%9$G!"(B
+InputConv $B$=$N$b$N$r(B XtCreateWidget() $B$7$F$O$$$1$^$;$s!#$3$N%/%i%9$OB>$H(B
+$B$N%$%s%?!<%U%'%$%9$rDj5A$9$k$?$a$KB8:_$9$k%a%?(B widget $B$G$9!#(B
+
+* CcWnn object
+InputConv $B%*%V%8%'%/%H$N%5%V%/%i%9$G!"F~NOJ8;zJQ49$K(B cconv$B!"$+$J4A;zJQ49(B
+$B$K(B Wnn $B$r;HMQ$7$FJQ49$r9T$J$$$^$9!#(B
+
+* ConvDisplay object
+$BJ8;zNs$NI=<($r9T$J$&%*%V%8%'%/%H$G$9!#(BInputConv $B$HF1$8$/%a%?(B widget $B$J$N(B
+$B$G(BCreate $B$7$F$O$$$1$^$;$s!#(Bkinput2 $B$G$OJ8;zNs$NI=<($O$9$Y$F$3$N(B 
+ConvDisplay$B$N%5%V%/%i%9$N%*%V%8%'%/%H$K$h$C$F9T$J$o$l$^$9!#(B
+
+* WcharDisplay object
+ConvDisplay $B%*%V%8%'%/%H$N%5%V%/%i%9$G!"(Bwchar $B7?$NJ8;zNs%G!<%?$rI=<($7$^(B
+$B$9!#(BCcWnn $B$HAH$_9g$o$;$k$HJQ49%F%-%9%H$r@5$7$/I=<($G$-$^$9!#(B
+
+* CandidatePanel widget
+$B8uJdA*BrMQ$N(B widget $B$G$9!#(BAthena $B$N(B List widget $B$_$?$$$J$b$N$G$9$,!"J8;z(B
+$BNs$N%G!<%?7?$,(B ICString $B7?$G$"$k$H$3$m$,0[$J$j$^$9!#(B
+
+* Canvas widget
+$B0lHLE*$J$*3(=q$-(B widget $B$G$9!#(BCore $B$K(B expose $B$H(B resize $B$N%3!<%k%P%C%/$r(B
+$B$D$1$?$@$1$N(B widget$B!#(Bkinput2 $B$K8B$i$:$$$m$$$m;H$($k$G$7$g$&!#(B
+SeparateConversion $B$N%F%-%9%HI=<($K;H$o$l$F$$$^$9!#(B
+
+* ICLabel widget
+$B%b!<%II=<(MQ$N%i%Y%k(B widget $B$G$9!#(BAthena $B$N(B Label widget $B$_$?$$$J$b$N$G(B
+$B$9$,J8;zNs$,(B ICString $B7?$K$J$C$F$$$k$H$3$m$,0c$$$^$9!#(B
+
+* AdoptedShell widget
+$B0l8+$?$@$N%7%'%k(B widget $B$N$h$&$K8+$($^$9$,!"<B$O(B XtNparentWindow $B$H$$$&(B
+$B%j%=!<%9$G?F(B window $B$r;XDj$G$-$k$H$$$&$b$N$G$9!#85Mh(B Xt $B$O?F%&%#%s%I%&$r(B
+$BJQ$($i$l$k$h$&$K$O$G$-$F$$$J$$$N$G!"$A$g$C$H(B Xt $B$r$@$^$7$F$$$k$H$$$&LL$b(B
+$B$"$j$^$9!#(Bkinput2 $B0J30$K$b1~MQ$G$-$k$H;W$$$^$9$,!";H$&;~$K$O$A$g$C$HCm0U(B
+$B$,I,MW$G$7$g$&!#%D!<%k%-%C%H$K$D$$$F$=$l$J$j$NCN<1$,I,MW$G$9!#(B
+
+* CanvasShell widget
+AdoptedShell widget $B$K(B Canvas widget $B$N$h$&$K(B expose $B$H(B resize $B$N%3!<%k(B
+$B%P%C%/$r$D$1$?$b$N$G$9!#(BOverTheSpotConversion $B$H(B OffTheSpotConversion $B$N(B
+$B%F%-%9%HI=<($K;H$o$l$F$$$^$9!#(B
+
+* ConversionControl widget
+$BF~NO%9%?%$%k$r7hDj$7!"JQ49A4BN$r%3%s%H%m!<%k$9$k$?$a$N(B widget $B$G$9!#$3$l(B
+$B$b%a%?(B widget $B$G$9!#(B
+
+* OverTheSpotConversion widget
+ConversionControl $B$N%5%V%/%i%9$G!"(Bover the spot ($B$$$o$f$k$=$N>lJQ49(B) $B%?(B
+$B%$%W$NJQ49$r<B8=$9$k$?$a$N$b$N$G$9!#(B
+
+* OffTheSpotConversion widget
+$BF1$8$/(B ConversionControl $B$N%5%V%/%i%9$G!"(Boff the spot $B%?%$%W$NJQ49$r<B8=(B
+$B$9$k$?$a$N$b$N$G$9!#$3$l$O%/%i%$%"%s%H%&%#%s%I%&>e$N$"$kNN0h$rJQ49@lMQNN(B
+$B0h$H$7$F;HMQ$9$kF~NOJ}K!$G$9!#(B
+
+* SeparateConversion widget
+OffTheSpotConversion $B$N%5%V%/%i%9$G!"(Bkinput$B$N$h$&$K(B $BJQ49@lMQ$NJL%&%#%s%I(B
+$B%&$r$D$/$C$F$=$3$GF~NO$r9T$J$&%?%$%W$NJQ49$r<B8=$9$k$?$a$N$b$N$G$9!#(B
+
+* KinputProtocol widget
+kinput2 $B$H%/%i%$%"%s%H$H$N4V$NDL?.$rC4Ev$9$k(B widget $B$G$9!#$3$NDL?.$O$"$i(B
+$B$+$8$a7h$a$i$l$?%W%m%H%3%k$K$h$C$F9T$J$o$l$^$9$,!"$3$N(B widget $B$O(Bkinput 
+$B%W%m%H%3%k%U%!%_%j!<$KB0$9$k%W%m%H%3%k$r07$$$^$9!#(Bkinput2 $B$N$?$a$K3+H/$7(B
+$B$?(B kinput2 $B%W%m%H%3%k$O(B kinput $B$N;HMQ$7$F$$$?%W%m%H%3%k$H>e0L8_49@-$r;}(B
+$B$A$^$9$,!"$=$NB>$K$b(B kinput $B%W%m%H%3%k$+$iGI@8$7$?%W%m%H%3%k$,B8:_$7$^$9!#(B
+$B$I$l$b7k9=;w$F$$$k$N$G$=$l$i$9$Y$F$r07$&(B widget $B$K$7$^$7$?!#$3$N(B widget 
+$B$O8=:_!"(B
+
+	+ kinput $B%W%m%H%3%k(B
+	+ kinput2 $B%W%m%H%3%k(B 
+	+ jinput $B%W%m%H%3%k(B
+	+ xlc $B%W%m%H%3%k(B
+
+$B$r%5%]!<%H$7$F$$$^$9!#(Bjinput $B%W%m%H%3%k$O>>2<$N%U%m%s%H%(%s%I(B jinput $B$,(B
+$B;HMQ$9$k%W%m%H%3%k!"(Bxlc $B$O%=%K!<$N%U%m%s%H%(%s%I(B sjx $B$,;HMQ$9$k%W%m%H%3(B
+$B%k$G!"$H$b$K(B kinput $B%W%m%H%3%k$N>e0L8_49$G$9!#(B
+
+* XimpProtocol widget
+$B$3$l$b(B KinputProtocol $B$HF1$8$/(B kinput2 $B$H%/%i%$%"%s%H$H$N4V$NDL?.$r(B
+$BC4Ev$9$k(B widget $B$G$9!#$3$N(B widget $B$,07$&$N$O(B XIMP $B$H$$$&%W%m%H%3%k$G!"(B
+$B$3$l$OIY;NDL$d%=%K!<!"(BSun $B$J$I$,6&F1$GDj$a$?%W%m%H%3%k$G$9!#(B
+
+* ConversionManager widget
+$B%W%m%H%3%k(B widget $B$HF~NO%9%?%$%k(B widget $B$r7k$S$D$1$k$?$a$N(B widget $B$G$9!#(B
+$B$3$l$K$h$j(B kinput2 $B$OJ#?t$N%W%m%H%3%k!"J#?t$NF~NO%9%?%$%k$r%5%]!<%H$G$-(B
+$B$k$h$&$K$J$C$F$$$^$9!#(B
+
+
+$B:G8e$K!"$3$l$i$N(B widget $B%/%i%9$N%D%j!<$r$D$1$F$*$-$^$9!#$?$@$73g8L$G3g$i(B
+$B$l$?$b$N$O%D!<%k%-%C%H(B Intrinsics $B$N(B widget $B%/%i%9$G$9!#(B
+
+
+(Object)
+    InputConv
+	CcWnn
+    ConvDisplay
+	WcharDisplay
+    (RectObj)
+	(unnamed)
+	    (Core)
+		CandidatePanel
+		Canvas
+		ICLabel
+		KinputProtocol
+		XimpProtocol
+		(Composite)
+		    ConversionManager
+		    (Shell)
+			(OverrideShell)
+			    AdoptedShell
+				CanvasShell
+			(WmShell)
+			    (VendorShell)
+				(TransientShell)
+				    ConversionControl
+					OverTheSpotConversion
+					OffTheSpotConversion
+					    SeparateConversion
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/doc/defaultkeys	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,136 @@
+** Kinput2 default key bindings **
+
+[ This document describes the default key bindings of kinput2 when Wnn is ]
+[ used as the conversion server.  If you're going to use Canna conversion ]
+[ server, please see the documents of Canna instead.                      ]
+
+
+* Conversion Start/End
+
+The key used to start conversion depends on conversion protocol and
+client.  In case of xlc protocol and XIMP protocol, shift-space should
+work.  Otherwise, kinput2 cannot specify it so there's no default key
+to start conversion. See the manual for each client.
+
+control-Kanji
+shift-space
+	These keys end conversion.  If there is text that is not fixed, it
+	is sent to the client.  It then pops down the conversion window,
+	and kinputw will be waiting for the next conversion request.
+
+
+* Text Input
+
+The initial input mode is Roma-ji mode i.e. text typed in is changed
+to Hiragana.
+
+Tab	changes the input mode as follows:
+		Romaji -> ASCII -> double-width ASCII -> Romaji
+	If it is pressed with shift key, it changes the mode in reverse
+	order.
+	Note that ^I doesn't work.
+
+^H	deletes the character before the text cursor.  If the current
+	clause is converted, this puts it back into unconverted state
+	before deletion.
+
+Delete	deletes the character at the text cursor.  If the current clause
+	is converted, this puts it back into unconverted state before
+	deletion.
+
+^U	erases all text.
+
+
+* Conversion
+
+^J or Kanji
+	These keys do multiple clause conversion from the current clause
+	onwards.
+	If the current clause is already converted, a window is popped up,
+	all the candidates for the current clause will be shown in the
+	window, and then go into the candidate selection mode.
+
+^G	puts the current clause back into unconverted state.
+
+^N or Down arrow
+	These keys substitute the current clause for the next candidate of
+	the clause.  In candidate selection mode and symbol input mode,
+	this key moves the cursor down by one.
+
+
+^P or Up arrow
+	These keys substitute the current clause for the previous
+	candidate of the clause.  In candidate selection mode and symbol
+	input mode, this key moves the cursor up by one.
+
+^L	fixes the converted text, then sends it to the client.
+
+^M	fixes the converted text, then sends it to the client followed by
+	a newline.
+	In candidate selection mode or symbol selection mode, it selects a
+	candidate or symbol, then goes back to normal mode.
+
+
+* Moving Cursor/Changing Current Clause
+
+^F or Right arrow
+	These keys move the text cursor forward.  If the text is already
+	converted, the cursor moves forward a clause, otherwise a
+	character.
+	In the candidate selection mode or symbol input mode, these keys
+	move the cursor to the next candidate.
+
+^B or Left arrow
+	These keys move the text cursor backward.  If the text is already
+	converted, the cursor moves backward a clause, otherwise a
+	character.
+	In the candidate selection mode or symbol input mode, these keys
+	move the cursor to the previous candidate.
+
+^A	moves the text cursor to the beginning of the text.  It moves the
+	cursor to the left most candidate in candidate selection mode or
+	symbol input mode.
+
+^E	moves the text cursor to the end of the text.  It moves the cursor
+	to the right most candidate in candidate selection mode or symbol
+	input mode.
+
+
+* Expanding/Shrinking Clauses
+
+shift-Right arrow
+	expands the current clause by one character, then re-converts it.
+
+shift-Left arrow
+	shrinks the current clause by one character, then re-converts it.
+
+
+* Katakana <-> Hiragana Conversion
+
+F1 or mod1-1
+	These keys convert the current clause into Katakana.
+
+F2 or mod1-2
+	These keys convert the current large clause into Hiragana.
+
+
+* Miscellany
+
+shift-Escape
+	changes the current mode to symbol input mode.  Symbols defined in
+	JIS X0208 (Kanji character set) are displayed in the pop up
+	window.  You can move the cursor and select a symbol with carriage
+	return.
+
+F5 or mod1-5
+	changes the current mode to JIS code input mode.  The text typed
+	in is interpreted as a hexadecimal number representing a code of a
+	Kanji defined in JIS X0208, and converted the corresponding Kanji
+	character.
+	To exit from the mode, type this key again.
+
+F6 or mod1-6
+	changes the current mode to JIS Kuten code input mode.  The text
+	typed in is interpreted as a decimal number representing a 'ku'
+	number and a 'ten' number of a	Kanji, and converted the
+	corresponding Kanji character.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/doc/defkeys.wnn	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,89 @@
+** kinput2 $B$N%G%U%)%k%H%-!<%P%$%s%G%#%s%0(B **
+
+$BJQ49%7%9%F%`$H$7$F!V$+$s$J!W$^$?$O(B SJ3 $B$rA*Br$7$?;~$N%m!<%^;z$+$JJQ49!&JQ(B
+$B49%-!<%P%$%s%G%#%s%0$J$I$O!V$+$s$J!W$^$?$O(B SJ3 $B$N%I%-%e%a%s%H$r8fMw2<$5$$!#(B
+
+$B$3$3$G$O(B Wnn $B$rA*Br$7$?;~$N%G%U%)%k%H$N%-!<%P%$%s%G%#%s%0$K$D$$$F@bL@$7$^(B
+$B$9!#(B
+
+
+* $BJQ493+;O(B / $B=*N;(B
+
+$BJQ493+;O$N%-!<$H$$$&$b$N$OFC$K7h$^$C$F$$$^$;$s!#$3$l$O(B kinput2 $B$G$O$J$/!"(B
+$B%"%W%j%1!<%7%g%s$G@_Dj$9$k$b$N$@$+$i$G$9!#$G$9$+$i$3$l$O%"%W%j%1!<%7%g%s$K(B
+$B$h$C$F;XDjJ}K!$,0c$$$^$9!#(Bkterm $B$G$"$l$P!"%j%=!<%9%U%!%$%k$K(B
+
+	*vt100*translations: #override Ctrl<Key>Shift_R: begin-conversion()
+
+$B$J$I$H=q$/$3$H$K$h$C$FJQ99$G$-$^$9!#(B
+
+$B$3$l$KBP$7$F=*N;$N%-!<$O%U%m%s%H%(%s%I$G@_Dj$7$^$9(B ($B$3$3$,$A$g$C$H5$;}$A0-(B
+$B$$$H$3$m$J$N$G$9$,(B)$B!#%G%U%)%k%H$G$O!"(B
+
+	$B%3%s%H%m!<%k(B + $B4A;z(B ($BJQ49(B)
+	$B%7%U%H(B + $B%9%Z!<%9(B
+
+$B$G=*N;$9$k$h$&$K$J$C$F$$$^$9!#(B
+
+
+* $BF~NO%b!<%I$N@ZBX$((B
+
+$BJQ493+;O;~$NF~NO%b!<%I$O%m!<%^;z%b!<%I$K$J$C$F$$$^$9!#$D$^$j!"%m!<%^;z$GF~(B
+$BNO$9$k$H$+$J$KJQ49$5$l$^$9!#%b!<%I$rJQ$($k$K$O%?%V%-!<$r2!$7$^$9!#(B
+	$B%m!<%^;z(B $B"*(B $B%"%9%-!<(B $B"*(B $BA43Q%"%9%-!<(B $B"*(B $B:F$S%m!<%^;z(B
+$B$H$$$&$h$&$K%b!<%I$,JQ2=$7$^$9!#%7%U%H%-!<$r2!$7$J$,$i%?%V$r2!$9$H5U=g$KJQ(B
+$B2=$7$^$9!#(B($BCm0U(B: $B%?%V%-!<$H(B ^I $B$O0c$$$^$9!#(B^I $B$G$O%b!<%IJQ99$G$-$^$;$s(B)
+
+
+* $B%m!<%^;zF~NO(B
+
+$B%m!<%^;zF~NO$O0lHLE*$J5-=R$r$[$\<u$1$D$1$k$h$&$K$J$C$F$$$^$9!#(B^H $B$,%P%C%/(B
+$B%9%Z!<%9(B (1$BJ8;z>C5n(B) $B$G$9!#(B
+
+
+* JIS $B%3!<%I(B / $B6hE@%3!<%IF~NO(B
+
+F5 ($B$^$?$O%a%?%-!<$r2!$7$J$,$i(B 5 $B$N%-!<(B) $B$r2!$9$H(B JIS $B%3!<%IF~NO%b!<%I$K$J(B
+$B$j$^$9!#F1MM$K(B F6 ($B$^$?$O%a%?(B-6) $B$G6hE@%3!<%IF~NO%b!<%I$K$J$j$^$9!#:F$S(B F5 
+$B$"$k$$$O(B F6 $B$r2!$9$H85$NF~NO%b!<%I$KLa$j$^$9!#(B
+
+
+* $B5-9fF~NO(B
+
+$B%7%U%H%-!<$r2!$7$J$,$i%(%9%1!<%W%-!<$r2!$9$H5-9f0lMw$,I=<($5$l$^$9!#(B^F ^B
+^N ^P ($B$^$?$O%+!<%=%k%-!<$N(B $B"*"+"-",(B) $B$G%+!<%=%k$,F0$-!"%j%?!<%s%-!<$GA*Br(B
+$B$5$l$^$9!#$^$?!"%^%&%9$GA*Br$9$k$3$H$b$G$-$^$9!#(B
+
+
+* $BJQ49(B
+
+$B4A;z%-!<(B ($BJQ49%-!<(B) $B$^$?$O(B ^J $B$GJQ49$7$^$9!#:FEYJQ49$9$k$H8uJd0lMw%b!<%I$K(B
+$B$J$j$^$9!#(B^N $B$H(B ^P $B$G$=$l$>$l<!8uJd!"A08uJd$,I=<($5$l$^$9!#%+!<%=%k%-!<$N(B
+$B"-$H",$bF1$8F/$-$r$7$^$9!#(B^G $B$G0lEYJQ49$7$?J8@a$rL5JQ49>uBV$KLa$7$^$9!#(B
+
+
+* $B%+!<%=%k!&J8@a0\F0(B
+
+^F $B$H(B ^B $B$G%+!<%=%k!&%+%l%s%HJ8@a$,0\F0$7$^$9!#8=:_CmL\$7$F$$$kJ8@a$,L$JQ(B
+$B49>uBV$J$i%+!<%=%k$,0lJ8;zJ,0\F0$7!"JQ49>uBV$J$iJ8@aC10L$G0\F0$7$^$9!#%+!<(B
+$B%=%k%-!<$N"*$H"+$bF1$8F/$-$r$7$^$9!#(B^A $B$H(B ^E $B$O$=$l$>$l:G=i$H:G8e$NJ8@a$K(B
+$B0\F0$7$^$9!#(B
+
+
+* $BJ8@a=L$a!&?-$P$7(B
+
+$B%7%U%H(B-$B"+(B ($B%7%U%H%-!<$r2!$7$J$,$i%+!<%=%k%-!<"+$r2!$9(B) $B$GJ8@a$ND9$5$,=L$_(B
+$B$^$9!#F1MM$K%7%U%H(B-$B"*$G?-$S$^$9!#(B
+
+
+* $B3NDj(B
+
+^L $B$G3NDj$7$^$9!#%j%?!<%s%-!<$r2!$9$H3NDj$7$?8e%-%c%j%C%8%j%?!<%s$,F~$j$^(B
+$B$9!#(B
+
+
+* $B%+%?%+%J!&$R$i$,$JJQ49(B
+
+F1 ($B$^$?$O%a%?(B-1) $B$G%+%l%s%HJ8@a$,%+%?%+%J$K$J$j$^$9!#(BF2 ($B$^$?$O%a%?(B-2) $B$G(B
+$B$R$i$,$J$K$J$j$^$9!#(BF3 ($B$^$?$O%a%?(B-3) $B$GH>3Q$K$J$j!"(BF4 ($B$^$?$O%a%?(B-4) $B$GA4(B
+$B3Q$K$J$j$^$9!#(B
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/doc/problems	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,30 @@
+** $B8=:_$o$+$C$F$$$kLdBjE@(B **
+
+* $B8uJd0lMwI=<($N%&%#%s%I%&$,>C$($:$K;D$k$3$H$,$"$k(B
+	$B$3$l$O%&%#%s%I%&%^%M!<%8%c$,(B twm $B$N;~$@$15/$3$j!"(Bmwm $B$J$I$G$O5/$-(B
+	$B$J$$$h$&$J$N$G(B twm $B$NLdBj$@$H;W$o$l$^$9!#$b$7!"(Btwm $B0J30$N%&%#%s%I(B
+	$B%&%^%M!<%8%c$r;H$C$F$$$F$3$N>I>u$,=P$?;~$K$OLB$o$:%l%]!<%H$rAw$C$F(B
+	$B2<$5$$!#2sHrJ}K!$H$7$F$O!"8uJd0lMwI=<($r=P$7$?;~$K$O$f$C$/$jA`:n$9(B
+	$B$k!"$H$$$&$N$,M-8z$@$H;W$$$^$9!#(B
+
+* $BJL%&%#%s%I%&$K$h$kJQ49$G!"3NDj$9$k$H(B core dump $B$9$k$3$H$,$"$k$i$7$$(B
+	$B$3$l$K$D$$$F$O>\:Y$,0l@ZITL@$G$7$+$b$3$A$i$G$O5/$-$J$$$N$G:#$N$H$3(B
+	$B$m2?$b$G$-$J$$>uBV$G$9!#$b$7$3$N8=>]$K$V$AEv$?$C$?J}$O$<$R%l%]!<%H(B
+	$B$r$*4j$$$7$^$9!#(B
+
+* $B$=$N>lJQ49$G;H$o$l$k%U%)%s%H$,%/%i%$%"%s%H$N;H$C$F$$$k%U%)%s%H$H0[$J$k(B
+	$B%/%i%$%"%s%H$G$A$c$s$H%U%)%s%H>pJs$rAw$C$F$$$k$N$K0[$J$k%U%)%s%H(B
+	($BB?J,(B JpWcharDisplay $B%*%V%8%'%/%H$K@_Dj$5$l$?%G%U%)%k%H%U%)%s%H(B)$B$,(B
+	$B;H$o$l$k$3$H$,$"$j$^$9!#$3$l$OB?J,$=$N%U%)%s%H$,(B XLFD $B$K=>$C$F$$$J(B
+	$B$$$?$a$H;W$o$l$^$9!#(Bkinput2 $B$O;XDj$5$l$?%U%)%s%H$N%W%m%Q%F%#$rD4$Y(B
+	$B$F%-%c%i%/%?%;%C%H$rH=CG$7!";HMQ$9$k$h$&$K$J$C$F$$$k$N$G$9$,!"(BXLFD
+	$B$K=>$C$F$$$J$$%U%)%s%H$@$H$3$N%-%c%i%/%?%;%C%H$N>pJs$,F~$C$F$*$i$:!"(B
+	kinput2 $B$,$I$l$,4A;z$N%U%)%s%H$G$I$l$,%"%9%-!<$N%U%)%s%H$+$o$+$i$J(B
+	$B$$$?$a$G$9!#(B
+	$B$3$l0J30$N>l9g$K!"$=$N>lJQ49$G;H$o$l$k%U%)%s%H$,%/%i%$%"%s%H$N;XDj$H(B
+	$B0[$J$k$H$$$&8=>]$,5/$-$^$7$?$i!"%l%]!<%H$r$*4j$$$7$^$9!#(B
+
+* $B$=$NB>(B
+	XIMP $B%W%m%H%3%k$N%5%]!<%H$O$3$N%j%j!<%9$ND>A0$K:n$C$?$b$N$J$N$G$^(B
+	$B$@%P%0$,$"$k$+$b$7$l$^$;$s!#%P%0$G$O$J$$$+$H$$$&8=>]$,=P$^$7$?$i%l(B
+	$B%]!<%H$r$*4j$$$7$^$9!#(B
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/doc/protocol	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,536 @@
+$Id: protocol,v 1.2 1998/07/21 08:51:24 ishisone Exp $
+
+** kinput2 $B%W%m%H%3%k(B **
+
+
+*$B$O$8$a$K(B
+
+  kinput2 $B%W%m%H%3%k$O%*%j%8%J%k$N(B kinput $B$,;HMQ$7$F$$$?%W%m%H%3%k(B (kinput 
+$B%W%m%H%3%k$H8F$V(B) $B$KBP$7$F>e0L8_49@-$r;}$D!#(B
+
+  kinput $B%W%m%H%3%k$G$OJQ493+;O$N%j%/%(%9%H;~$K%*%W%7%g%s$H$7$F%W%m%Q%F%#(B
+$BL>$r;XDj$G$-$k$h$&$K$J$C$F$$$?!#$3$l$O>-Mh$N3HD%$N$?$a$KMQ0U$5$l$?$b$N$G$"(B
+$B$j!"%W%m%H%3%k%9%Z%C%/$G$O$3$3$K(B None $B$r;XDj$9$k$h$&$K=q$+$l$F$$$?$,!">-Mh(B
+$B$O$3$3$K$"$k%G!<%?$,F~$C$?%W%m%Q%F%#L>$r;XDj$7!"%/%i%$%"%s%H$+$iJQ49%5!<%P(B
+$B$KBP$7$FJQ49$NB0@-$J$I$r;XDj$9$k$3$H$rA@$C$?$b$N$G$"$C$?!#(B
+
+  kinput2 $B%W%m%H%3%k$G$O$3$N3HD%%G!<%?$N7A<0$rDj5A$7!"$+$D(B kinput $B%W%m%H%3(B
+$B%k$r<BAu$7$?$b$N$H6hJL$,$D$/$h$&!"%W%m%H%3%k%P!<%8%g%s$rDI2C$7$?!#(B
+
+  $B3HD%%G!<%?$K;XDj$9$kJQ49B0@-$O!"$3$3$KDj5A$7$?%9%?%s%@!<%I$J$b$N$K2C$($F!"(B
+$B%W%i%$%Y!<%H$J3HD%$,2DG=$J$h$&$K@_7W$5$l$F$$$k!#(B
+
+  $B$5$i$KJQ49ESCf$G$bB0@-$NJQ99$rEA$($i$l$k$h$&$K%W%m%H%3%k$N3HD%$r9T$J$C$?!#(B
+
+
+* $B35MW(B
+
+  $B$^$:!"4JC1$K%W%m%H%3%k$NFbMF$r@bL@$7$F$*$/$3$H$K$9$k!#(B
+
+  $BJQ49%5!<%P$ON)$A>e$,$k$H!"JQ49%5!<%P$HF1$8%G%#%9%W%l%$$r6&M-$9$kB>$N%/%i(B
+$B%$%"%s%H$KBP$7$F!"JQ49%5!<%S%9$rDs6!$9$k$3$H$r@k8@$9$k!#$3$l$K$O%;%l%/%7%g(B
+$B%s$N%a%+%K%:%`$r;HMQ$9$k!#$D$^$j!"JQ49%5!<%P$OF~NO8@8lKh$K7h$a$i$l$?$"$k%;(B
+$B%l%/%7%g%s$N%*!<%J!<$H$J$k!#0l$D$N%G%#%9%W%l%$$GF1$8%;%l%/%7%g%sL>$KBP$7$F(B
+$BJ#?t$N%*!<%J!<$OB8:_$G$-$J$$$?$a!"JQ49%5!<%P$O3F8@8l$K$D$$$F0l$D$:$D$7$+B8(B
+$B:_$G$-$J$$!#(B
+
+  $BJQ49%5!<%P$O%;%l%/%7%g%s$N%*!<%J!<$H$J$k$HF1;~$K!"%5%]!<%H$9$kF~NO%9%?%$(B
+$B%k$J$I$N>pJs$r%*!<%J!<%&%#%s%I%&$N%W%m%Q%F%#$K3JG<$9$k!#(B
+
+  $B$"$k8@8l$NJQ49%5!<%S%9$r<u$1$?$$%/%i%$%"%s%H$O!"$^$:$=$N8@8l$KBP1~$9$k%;(B
+$B%l%/%7%g%s$N%*!<%J!<$rC5$9!#$b$7%*!<%J!<$,8+$D$+$l$P!"$^$:%W%m%Q%F%#$r%A%'%C(B
+$B%/$7!"<+J,$N%j%/%(%9%H$7$h$&$H$7$F$$$kF~NO%9%?%$%k$J$I$rJQ49%5!<%P$,%5%]!<(B
+$B%H$7$F$$$k$+$r%A%'%C%/$9$k$3$H$,$G$-$k!#$=$N8e!"%*!<%J!<$KBP$7$FJQ49F~NO$r(B
+$B%j%/%(%9%H$9$k!#$3$l$O%*!<%J!<$N%&%#%s%I%&$KBP$7$F(B ClientMessage $B%$%Y%s%H(B
+$B$rAw$k$3$H$G9T$J$o$l$k!#(B
+
+  $B$3$N%j%/%(%9%H%$%Y%s%H$K$O!"%/%i%$%"%s%H$N4uK>$9$kF~NO%9%?%$%k$d!";HMQ$9(B
+$B$k%U%)%s%H$J$I$5$^$6$^$JB0@-$,=q$+$l$?%W%m%Q%F%#L>$,4^$^$l$F$$$k!#JQ49%5!<(B
+$B%P$O!"$3$N%$%Y%s%H$r<u$1$H$k$HF1;~$K$=$N%W%m%Q%F%#$NFbMF$rD4$Y$FJQ49$NB0@-(B
+$B$r@_Dj$9$k!#JQ49B0@-$K$O<!$N$h$&$J$b$N$,$"$k!#(B
+
+	* $BJQ49%F%-%9%H$NI=<(3+;O0LCV(B
+	* $BI=<(%U%)%s%H(B
+	* $BI=<(?'(B
+
+  $B$=$N8eJQ49$r%9%?!<%H$5$;!"F1;~$K%/%i%$%"%s%H$KBP$7$FJQ49%5!<%S%9$r;O$a$?(B
+$B$3$H$r(B ClientMessage $B%$%Y%s%H$GDLCN$9$k!#(B
+
+  $BJQ49$O$9$Y$FJQ49%5!<%PB&$G9T$J$o$l!"%/%i%$%"%s%H$OJQ497k2L$,JV$C$F$/$k$N(B
+$B$rBT$D$@$1$G$"$k!#$?$@$7JQ49Cf$K%U%)%s%H$,JQ$o$C$?$j$7$FJQ49$NB0@-$,JQ2=$7(B
+$B$?>l9g$K$O(B ClientMessage $B%$%Y%s%H$rMxMQ$7$F$=$l$rJQ49%5!<%P$KEA$($k$3$H$,(B
+$B$G$-$k!#(B
+
+  $B0l$DLdBj$H$J$k$N$OJQ49%5!<%P$NF~NO%$%Y%s%H$N<hF@J}K!$G$"$k!#JQ49Cf$O%/%i(B
+$B%$%"%s%H$K$$$/F~NO%$%Y%s%H$rJQ49%5!<%P$,2#<h$j$7$J$/$F$O$J$i$J$$!#$3$l$K$O(B 
+3 $B<oN`$NJ}K!$,$"$j!"%/%i%$%"%s%H$OJQ49B0@-$H$7$F$I$l$r;HMQ$9$k$+;XDj$9$k$3(B
+$B$H$,$G$-$k!#(B
+
+  $B0l$D$O!"(Bkinput $B%W%m%H%3%k$G:NMQ$5$l$F$$$?!"JQ49%5!<%P$,%/%i%$%"%s%H$N%&%#(B
+$B%s%I%&$N>e$K(B InputOnly $B%&%#%s%I%&$r:n$j!"$=$N%&%#%s%I%&$GF~NO%$%Y%s%H$r(B
+$B!VEp$`!WJ}K!$G$"$k!#%/%i%$%"%s%H$K$H$C$F$O$3$l$,0lHV=hM}$,3Z(B ($B<+J,$G$O2?$b(B
+$B$7$J$/$F$b$h$$(B) $B$,!"%U%)!<%+%9$N4X78$G!"JQ49%5!<%P$K%-!<%$%Y%s%H$,Mh$J$$$3(B
+$B$H$,$"$k!#(B
+
+  $B<!$OJQ49%5!<%P$,%/%i%$%"%s%H$N%&%#%s%I%&(B ($B@53N$K$O%U%)!<%+%9%&%#%s%I%&(B) 
+$B$GF~NO%$%Y%s%H$r%;%l%/%H$9$k$H$$$&J}K!$G$"$k!#$3$N>l9g%$%Y%s%H$OJQ49%5!<%P(B
+$B$H%/%i%$%"%s%H$NN>J}$KAw$i$l$k$N$G!"$3$NJ}<0$rA*Br$7$?%/%i%$%"%s%H$O!"JQ49(B
+$BCf$OF~NO$5$l$?%$%Y%s%H$rL5;k$7$J$/$F$O$J$i$J$$!#(B
+
+  3$BHVL\$O2?$b$7$J$$!"$H$$$&J}K!$G!"$D$^$j$3$l$OJQ49Cf$O%/%i%$%"%s%H$O%U%)!<(B
+$B%+%9%&%#%s%I%&$KMh$?%-!<%$%Y%s%H$r$9$Y$FJQ49%5!<%P$K(B SendEvent $B$GAw$k!"$H(B
+$B$$$&$3$H$G$"$k!#(B
+
+  $BJQ49%5!<%P$OJQ49$5$l$?J8;zNs$rE,59%/%i%$%"%s%H$KAw$k$3$H$,$G$-$k!#$3$l$O(B
+$B%/%i%$%"%s%H$N%&%#%s%I%&$N%W%m%Q%F%#$KJ8;zNs$r=q$-9~$`$3$H$G<B8=$9$k!#(B
+
+  $BJQ49$,=*N;$9$k$H!"JQ49%5!<%P$O%/%i%$%"%s%H$K(B ClientMessage $B$rAw$j!"CN$i(B
+$B$;$k!#%/%i%$%"%s%H$+$i$bJQ49%5!<%P$KBP$7$F(B ClientMessage $B%$%Y%s%H$rAw$C$F(B
+$BJQ49$N=*N;$r%j%/%(%9%H$9$k$3$H$,$G$-$k!#$3$N>l9g$bJQ49%5!<%P$OJQ49$,=*N;$7(B
+$B$?$3$H$r%/%i%$%"%s%H$KCN$i$;$k!#(B
+
+
+* $B%W%m%H%3%k>\@b(B
+
+  $B35MW$K0zB3$-$3$3$G$O(B kinput2 $B%W%m%H%3%k$K$D$$$F(B kinput $B%W%m%H%3%k$HHf$Y(B
+$B$J$,$i2r@b$7$F$$$/!#(B
+
+* $BJQ49%5!<%P%9%?!<%H%"%C%W(B
+
+** $B%;%l%/%7%g%s(B
+
+  $BJQ49%5!<%P$O!"%/%i%$%"%s%H$KBP$7$FJQ49%5!<%S%9$rDs6!$9$k$3$H$r<($9$?$a$K(B
+$B%;%l%/%7%g%s%*!<%J!<$H$J$k!#$3$l$O(B kinput $B%W%m%H%3%k$HA4$/F1$8$@$,!"%;%l%/(B
+$B%7%g%s%"%H%`$H$7$F$O(B "<language>_CONVERSION" $B$G$O$J$/!"@5<0$KEPO?$5$l$?%;(B
+$B%l%/%7%g%sL>$G$"$k(B "_<language>_CONVERSION" ($BF|K\8l$G$"$l$P(B
+"_JAPANESE_CONVERSION") $B$r;HMQ$9$k$3$H$K$9$k!#$?$@$7%P%C%/%o!<%I%3%s%Q%A%S(B
+$B%j%F%#$N$?$a!"%*%j%8%J%k(B kinput $B$,;HMQ$7$F$$$?%;%l%/%7%g%sL>$r;H$&$3$H$bG'(B
+$B$a$i$l$k!#(B
+
+  $BJQ49%5!<%P$O(B SetSelectionOwner $B$rMxMQ$7$F%;%l%/%7%g%s%*!<%J!<$K$J$k!#(B
+
+    SetSelectionOwner
+	selection:  "_<language>_CONVERSION"
+	owner:  $BJQ49%5!<%P$N%&%#%s%I%&(BID
+	time:  timestamp $B$^$?$O(B CurrentTime
+
+$B%/%i%$%"%s%H$O(B GetSelectionOwner $B$K$h$j!"JQ49%5!<%P$NB8:_$H%&%#%s%I%&(BID $B$r(B
+$BCN$k$3$H$,$G$-$k!#(B
+
+    GetSelectionOwner
+	selection:  "_<language>_CONVERSION"
+    =>
+	owner:  $BJQ49%5!<%P$N%&%#%s%I%&(BID
+
+
+*** SelectionClear $B%$%Y%s%H$N07$$$K$D$$$F(B
+
+  $B$b$7JQ49%5!<%P$,%;%l%/%7%g%s%*!<%J!<$K$J$C$?8e(B SelectionClear $B%$%Y%s%H$r(B
+$B<u$1$H$C$?;~$K$O!"8=:_JQ49Cf$N%/%i%$%"%s%H$,$"$l$P$=$l$i$9$Y$F$KBP$7$FJQ49(B
+$B=*N;$N=hM}!"$D$^$j!"$b$7$^$@%/%i%$%"%s%H$KAw$C$F$$$J$$JQ49%F%-%9%H$,$"$l$P(B
+$BAw$j!"$=$N8eJQ49=*N;$N(B ClientMessage $B%$%Y%s%H$rAw=P$9$k!"$H$$$&=hM}$r9T$J(B
+$B$$!"$=$N8e$9$_$d$+$K(B exit $B$9$k!#(B
+
+** $BJQ49%W%m%U%!%$%k(B
+
+  $B$3$l$@$1$G$O%/%i%$%"%s%H$OJQ49%5!<%P$,(B kinput $B$N%W%m%H%3%k$r%$%s%W%j%a%s(B
+$B%H$7$?$b$N$J$N$+!"$=$l$H$b(B kinput2 $B%W%m%H%3%k$r%$%s%W%j%a%s%H$7$?$b$N$J$N(B
+$B$+$,$o$+$i$J$$!#$^$?!"JQ49%5!<%P$,$I$N$h$&$JF~NO%9%?%$%k$r%5%]!<%H$7$F$$$k(B
+$B$+$b$o$+$i$J$$!#(B
+
+  $B$=$3$G%;%l%/%7%g%s$N%*!<%J!<%&%#%s%I%&$K$=$l$i$N>pJs$,=q$+$l$?%W%m%Q%F%#(B
+$B$rCV$/$3$H$K$9$k!#(B
+
+    ChangeProperty
+	window:  $B%;%l%/%7%g%s$N%*!<%J!<%&%#%s%I%&(B
+	property:  Atom "_CONVERSION_PROFILE"
+	type:  Atom "_CONVERSION_ATTRIBUTE_TYPE"
+	format:  32
+	mode:  Replace
+	data:  $B8e=R(B
+
+  $B$3$l$rJQ49%W%m%U%!%$%k$H8F$V$3$H$K$9$k!#JQ49%W%m%U%!%$%k$,B8:_$9$k$+$I$&(B
+$B$+$G!"%/%i%$%"%s%H$OJQ49%5!<%P$,(B kinput2 $B%W%m%H%3%k$r%5%]!<%H$7$F$$$k$N$+!"(B
+$B$=$l$H$b(B kinput $B$N%W%m%H%3%k$7$+%5%]!<%H$7$F$$$J$$$N$+$rCN$k$3$H$,$G$-$k!#(B
+
+  $B%/%i%$%"%s%H$O(B GetProperty $B$r;HMQ$7$F$3$N%G!<%?$rFI$_=P$9$3$H$,$G$-$k!#(B
+
+    GetProperty
+	window:  $B%;%l%/%7%g%s$N%*!<%J!<%&%#%s%I%&(B
+	property:  Atom "_CONVERSION_PROFILE"
+	type:  Atom "_CONVERSION_ATTRIBUTE_TYPE"
+	format:  32
+	delete:  False
+
+$BJQ49%W%m%U%!%$%k$N%U%)!<%^%C%H$,(B 32 $B$G$"$k$3$H$+$i$b$o$+$k$h$&$K!"$3$N%W%m(B
+$B%Q%F%#$NFbMF$O(B 32bit $BCM$NG[Ns$G$"$k!#JQ49%W%m%U%!%$%k$K4^$^$l$k3F!9$N>pJs(B
+$B$O!">pJs$N<oN`$H%G!<%?D9$rI=$9(B1$B%o!<%I$N%X%C%@$H$=$l$KB3$/%G!<%?(B ($B%G!<%?$O(B
+$B$J$/$F$b$h$$(B) $B$+$i9=@.$5$l$k!#%X%C%@$N>e0L(B 16bit $B$,$=$N>pJs$N<oN`$rI=$7!"(B
+$B2<0L(B 16 bit $B$OB3$/%G!<%?$N%o!<%I?t(B (32bit $BC10L(B) $B$rI=$9!#(B
+
+	+----------------+----------------+
+	|  Code (16bit)  | Length (16bit) |
+	+----------------+----------------+
+	|              Data1              |
+	+---------------------------------+
+	|              .....              |
+	+---------------------------------+
+	|              DataN              |
+	+---------------------------------+
+
+$BDj5A$5$l$F$$$k>pJs$O<!$N(B4$B$D$G$"$k!#(B
+
+  + Protocol Version (code = 1, length = 1)
+	$BJQ49%5!<%P$,;HMQ$7$F$$$k%W%m%H%3%k$N%P!<%8%g%sL>$r<($9!#%G!<%?$K$O(B
+	$B%W%m%H%3%k$N%P!<%8%g%sL>$=$N$b$N$G$O$J$/!"$=$l$r%"%H%`2=$7$?CM$,F~(B
+	$B$k!#$3$N%I%-%e%a%s%H$O(B "PROTOCOL-2.0" $B$H$$$&%P!<%8%g%s$K$D$$$F5-=R(B
+	$B$7$F$$$k!#(B
+
+  + Supported Styles (code = 2, length = 1)
+	$BJQ49%5!<%P$,%5%]!<%H$7$F$$$kF~NO%9%?%$%k$r<($9!#Dj5A$5$l$F$$$kF~NO(B
+	$B%9%?%$%k$O<!$NDL$j$G$"$k!#(B
+		root window style:	1
+		off-the-spot style:	2
+		over-the-spot style:	4
+	$B%G!<%?$K$OJQ49%5!<%P$,%5%]!<%H$9$k%9%?%$%k$N(B bitwise-or $BCM$,F~$k!#(B
+	
+  + Supported Extensions (code = 3, length = N)
+	$BJQ49%5!<%P$,%5%]!<%H$7$F$$$k3HD%$r<($9!#%G!<%?$K$O%5%]!<%H$7$F$$$k(B
+	$B3HD%L>$r%"%H%`2=$7$?CM$,F~$k!#J#?t$N3HD%$rF~$l$k$3$H$,$G$-$k!#(B
+
+  + Extension Data (code = 4, length = N)
+	$B3HD%FCM-$N%W%m%U%!%$%k%G!<%?$r<($9!#=>$C$F$3$3$G%G!<%?$NFbMF$K$D$$(B
+	$B$F5-=R$9$k$3$H$O$G$-$J$$$,!"$?$@0l$D7h$^$C$F$$$k$3$H$O%G!<%?$N@hF,(B
+	$B$O$=$N3HD%L>$r%"%H%`2=$7$?CM$G$J$1$l$P$J$i$J$$$H$$$&$3$H$@$1$G$"$k!#(B
+	$B;D$j$N%G!<%?$NFbMF$O40A4$K3F3HD%$N<+M3$G$"$j!"$3$3$G$O5,Dj$7$J$$!#(B
+
+  $B%/%i%$%"%s%HB&$NL5MQ$N:.Mp$rKI$0$?$a!"(BProtocol Version $B$H(B Supported
+Styles$B$N9`L\$OI,$:$J$1$l$P$J$i$J$$!#$^$?!"(BExtension Data $B0J30$O%W%m%U%!%$(B
+$B%k%G!<%?$NCf$KF1$8%3!<%I$N%G!<%?$,J#?t$"$C$F$O$J$i$J$$!#(B
+
+
+* $BJQ49$N%j%/%(%9%H(B
+
+  $BJQ49$N%j%/%(%9%H$NJ}K!$O%*%j%8%J%k$N%W%m%H%3%k$HF1$8$G$"$k!#$D$^$j!"%/%i(B
+$B%$%"%s%H$O$^$:(B XGetSelectionOwner() $B$r;HMQ$7$FJQ49%5!<%P$rC5$9!#8+$D$+$l$P(B
+$B%*!<%J!<%&%#%s%I%&$KBP$7$FJQ493+;O$r%j%/%(%9%H$9$k%$%Y%s%H$rAw$k!#(B
+
+    SendEvent
+	destination:  $B%;%l%/%7%g%s%*!<%J!<%&%#%s%I%&(B
+	propergate:  False
+	event-mask:  NoEventMask
+	event:  ClientMessage
+		window: $B%;%l%/%7%g%s%*!<%J!<(B
+		type: Atom "CONVERSION_REQUEST"
+		format: 32
+		data:
+			l[0]: $B%;%l%/%7%g%s%"%H%`(B
+			l[1]: $B%/%i%$%"%s%H%&%#%s%I%&(BID
+			l[2]: $BJQ49%F%-%9%H$N%(%s%3!<%G%#%s%0%"%H%`(B
+			l[3]: $BJQ49%F%-%9%HMQ%W%m%Q%F%#(B or None
+			l[4]: $B%W%m%Q%F%#L>$+(B None
+
+  data.l[0] $B$O%;%l%/%7%g%s%"%H%`$rF~$l$k!#(Bdata.l[1] $B$O%/%i%$%"%s%H%&%#%s%I(B
+$B%&(BID $B$G$"$k!#%/%i%$%"%s%H%&%#%s%I%&$OJQ49%5!<%P$,3FJQ49%;%C%7%g%s$r6hJL$9(B
+$B$k$N$K;H$o$l$k!#$3$l$OF10l$N%/%i%$%"%s%H%&%#%s%I%&$GJ#?t$NJQ49$rF1;~$K9T$J(B
+$B$&$3$H$,$G$-$J$$$3$H$r0UL#$9$k!#(B
+
+  data.l[2] $B$K$O!"JQ497k2LJ8;zNs$N%(%s%3!<%G%#%s%0$H$7$F%/%i%$%"%s%H$N4uK>(B
+$B$9$k%(%s%3!<%G%#%s%0$N%"%H%`$rF~$l$k!#Nc$($P(B COMPOUND_TEXT $B$G$"$k!#JQ49J8(B
+$B;zNs$O%W%m%Q%F%#$G%/%i%$%"%s%H$KAw$i$l$k$N$G!"$3$N%(%s%3!<%G%#%s%0$H$$$&$N(B
+$B$O<B$O$=$N%W%m%Q%F%#$N%?%$%W$G$"$k!#$?$@$7$3$l$O$"$/$^$G$bJQ49%5!<%P$KBP$9(B
+$B$k%R%s%H$G$"$C$F!"JQ49%5!<%P$O$3$l$H0[$J$k%(%s%3!<%G%#%s%0$r;HMQ$9$k$+$b$7(B
+$B$l$J$$!#$?$@$7!"JQ49%5!<%P$O(B COMPOUND_TEXT $B%(%s%3!<%G%#%s%0$@$1$O%5%]!<%H(B
+$B$7$J$/$F$O$J$i$J$$!#$D$^$j!"$b$7%/%i%$%"%s%H$,(B COMPOUND_TEXT $B%(%s%3!<%G%#(B
+$B%s%0$r4uK>$7$?>l9g$K$O!"$=$N%(%s%3!<%G%#%s%0$GJ8;zNs$,JV$5$l$k$3$H$,J]>Z$5(B
+$B$l$k!#(B
+
+  data.l[3] $B$K$OJQ497k2LJ8;zNs$rF~$l$k%W%m%Q%F%#L>$r;XDj$9$k!#JQ497k2L$O(B
+data.l[1] $B$G;XDj$7$?%&%#%s%I%&$N!"(Bdata.l[3] $B$G;XDj$5$l$k%W%m%Q%F%#$KAw$i$l(B
+$B$k!#$b$7%W%m%Q%F%#L>$H$7$F(B None $B$r;XDj$7$?>l9g!"%W%m%Q%F%#L>$OJQ49%5!<%P$K(B
+$B$h$C$F7hDj$5$l$k!#(B
+
+  kinput $B%W%m%H%3%k$H0[$J$kE@$O(B data.l[4] $B$G$"$k!#%*%j%8%J%k$G$O$3$3$K$O(B 
+None $B$r;XDj$9$k$3$H$K$J$C$F$$$?!#JQ49%5!<%P$O!"$b$7$3$3$,(B None $B$G$"$l$P%/(B
+$B%i%$%"%s%H$,(B kinput $B%W%m%H%3%k$r;HMQ$9$k$b$N$H$7$F07$&!#(BNone $B$G$J$1$l$P!"(B
+$B$3$l$OJQ49B0@-$N$O$$$C$F$$$k%W%m%Q%F%#L>$G$"$k!#$3$l$O%/%i%$%"%s%H%&%#%s%I(B
+$B%&(B (data.l[1] $B$K;XDj$7$?$b$N(B) $B$N%W%m%Q%F%#$G!"%?%$%W$OJQ49%W%m%U%!%$%k$HF1(B
+$B$8$/(B "_CONVERSION_ATTRIBUTE_TYPE" $B$G$"$k!#=>$C$F$3$NJQ49B0@-%W%m%Q%F%#$N9=(B
+$BB$$bJQ49%W%m%U%!%$%k%W%m%Q%F%#$HF1$8$G!"(B1 $B%o!<%I$N%X%C%@$H$=$l$KB3$/(B 0 $B%o!<(B
+$B%I0J>e$N%G!<%?$H$+$i$J$k!#JQ49%5!<%P$O(B GetProperty $B$rMQ$$$F$3$NJQ49B0@-$r(B
+$BFI$_=P$9!#(B
+
+    GetProperty
+	window: $B%/%i%$%"%s%H%&%#%s%I%&(B
+	property:  "CONVERSION_REQUEST" $B$G;XDj$5$l$?%W%m%Q%F%#(B
+	type:  Atom "_CONVERSION_ATTRIBUTE_TYPE"
+	format:  32
+	delete:  False
+
+
+* $BJQ49B0@-(B
+
+  $BJQ49%W%m%U%!%$%k$HF1$8$/!"JQ49B0@-%W%m%Q%F%#$b3F!9$N>pJs$O!">pJs$N<oN`$H(B
+$B%G!<%?D9$rI=$9(B 32bit 1$B%o!<%I$N%X%C%@$H$=$l$KB3$/%G!<%?(B($B%G!<%?$O$J$/$F$b$h(B
+$B$$(B) $B$+$i9=@.$5$l$k!#%X%C%@$N>e0L(B 16bit $B$,B0@-%3!<%I$rI=$7!"2<0L(B 16bit $B$OB3(B
+$B$/%G!<%?$N%o!<%I?t(B (32bit $BC10L(B) $B$rI=$9!#(B
+
+  $BB0@-%3!<%I$H$7$F(B 0 $B$+$i(B 65535 $B$^$G$NCM$,;HMQ$G$-$k$,!"$3$l$r<!$N$h$&$J(B 2
+$B$D$NNN0h$KJ,$1$k!#(B
+
+	0 - 255:	$BI8=`B0@-%3!<%I(B
+	256 - 65535:	$B3HD%$G;HMQ$9$kB0@-%3!<%I(B
+
+$B$5$i$KI8=`B0@-%3!<%I$O(B2$B$D$NNN0h$KJ,$1$i$l$k!#(B
+
+	0 - 127:	$BJQ49$NESCf$GCM$rJQ$($F$b$h$$B0@-$N%3!<%I(B
+	128 - 255:	$BJQ493+;O;~$K$7$+@_Dj$G$-$J$$B0@-$N%3!<%I(B
+
+$BDj5A$5$l$F$$$kB0@-$r<($9!#(B
+
+  + No Operation (code = 0, length = N)
+	$B2?$b$7$J$$!#(Blength $B$OG$0U$J$N$G%W%m%Q%F%#$N$"$kItJ,$r%9%-%C%W$5$;(B
+	$B$k$N$KJXMx!#(B
+	
+  + Indirect Attribute (code = 1, length = 1)
+	$BB0@-$N4V@\;XDj$G$"$k!#%G!<%?$K$O%W%m%Q%F%#L>$,F~$C$F$*$j!"$=$N%W%m(B
+	$B%Q%F%#$K=>$C$FB0@-$r@_Dj$9$k!#;XDj$7$?%W%m%Q%F%#$O%/%i%$%"%s%H%&%#(B
+	$B%s%I%&$N%W%m%Q%F%#$G$J$1$l$P$J$i$J$$!#(BCONVERSION_ATTRIBUTE$B%$%Y%s%H(B 
+	($B8e=R(B) $B$GJ#?t$NB0@-%G!<%?$r@_Dj$7$?$$;~$d!"%$%Y%s%H$KB0@-%G!<%?$,(B
+	$BF~$j@Z$i$J$$;~$K;HMQ$9$k!#(B
+
+  + Focus Window (code = 2, length = 1)
+	$B%U%)!<%+%9%&%#%s%I%&$r;XDj$9$k!#%G!<%?$K$O%U%)!<%+%9%&%#%s%I%&$N%&%#(B
+	$B%s%I%&(BID $B$,F~$k!#$3$NB0@-$,;XDj$5$l$J$+$C$?;~$O%/%i%$%"%s%H%&%#%s(B
+	$B%I%&$,%U%)!<%+%9%&%#%s%I%&$H$J$k!#(B
+
+  + Spot Location (code = 3, length = 1)
+	$B%9%]%C%H%m%1!<%7%g%s$r;XDj$9$k!#%Y!<%9%i%$%s$N3+;OE@$G;XDj$9$k!#%G!<(B
+	$B%?$N>e0L(B 16bit $B$,(B x $B:BI8!"2<0L(B 16bit $B$,(B y $B:BI8$G$"$k!#$3$NB0@-$O(B 
+	over-the-spot style $B$NJQ49$N;~$7$+0UL#$r;}$?$J$$!#(B
+
+  + Client Area (code = 4, length = 2)
+	$BJQ49%F%-%9%HI=<(NN0h$r;XDj$9$k!#%G!<%?$O(B 32bit 2$B%o!<%I$+$i$J$j!":G(B
+	$B=i$N%o!<%I$N>e0L(B 16bit / $B2<0L(B 16bit $B$,NN0h$N:8>e$N(B x / y $B:BI8!"<!(B
+	$B$N%o!<%I$N>e0L(B 16bit / $B2<0L(B 16bit $B$,NN0h$NI}$H9b$5$rI=$9!#%G%U%)%k(B
+	$B%H$O%U%)!<%+%9%&%#%s%I%&A4BN$G$"$k!#(B
+
+  + Status Area (code = 5, length = 2)
+	$B%9%F!<%?%9I=<(NN0h$r;XDj$9$k!#%G!<%?$N%U%)!<%^%C%H$OA0$HF1$8!#(B
+
+  + Colormap (code = 6, length = 1)
+	$B%+%i!<%^%C%W$r;XDj$9$k!#%G!<%?$K$O%+%i!<%^%C%W(BID $B$,F~$k!#%G%U%)%k(B
+	$B%H$O%9%/%j!<%s$N%G%U%)%k%H%+%i!<%^%C%W$G$"$k!#(B
+
+  + Color (code = 7, length = 2)
+	$B%U%)%"%0%i%&%s%I$H%P%C%/%0%i%&%s%I$N%T%/%;%kCM$r;XDj$9$k!#%G!<%?$O(B
+	2$B%o!<%I$+$i$J$j!":G=i$N%o!<%I$,%U%)%"%0%i%&%s%I$N%T%/%;%kCM!"<!$N(B
+	$B%o!<%I$,%P%C%/%0%i%&%s%I$N%T%/%;%kCM$G$"$k!#;XDj$5$l$J$+$C$?>l9g!"(B
+	$BJQ49%5!<%P$OE,Ev$JCM$r;HMQ$9$k!#(B
+
+  + Background Pixmap (code = 8, length = 1)
+	$B%P%C%/%0%i%&%s%I$N(B Pixmap $B$r;XDj$9$k!#%G!<%?$K$O(B Pixmap ID $B$,F~$k!#(B
+
+  + Line Spacing (code = 9, length = 1)
+	$B9T4V$r;XDj$9$k!#%Y!<%9%i%$%s4V$N5wN%$G;XDj$9$k!#;XDj$5$l$J$+$C$?>l(B
+	$B9g!"JQ49%5!<%P$O<!$N;HMQ$5$l$k%U%)%s%H$+$iE,Ev$JCM$r;;=P$7$F;HMQ$9(B
+	$B$k!#(B
+
+  + Font Atoms (code = 10, length = N)
+	$B;HMQ$9$k%U%)%s%H$r;XDj$9$k!#%G!<%?$K$O3F%U%)%s%H$N(B "FONT" $B%W%m%Q%F%#(B
+	($B$3$l$O$=$N%U%)%s%H$N@5<0L>$r%"%H%`2=$7$?$b$N$K$J$C$F$$$k(B) $B$N%j%9(B
+	$B%H$r;XDj$9$k!#%j%9%HCf$N=gHV$OG$0U$G$"$k!#JQ49%5!<%P$OM?$($i$l$?%U%)(B
+	$B%s%H$N%W%m%Q%F%#$+$i%-%c%i%/%?%;%C%H$rD4$Y!"I,MW$J$b$N$rMxMQ$9$k$+(B
+	$B$i$G$"$k!#;XDj$5$l$J$+$C$?>l9g!"JQ49%5!<%P$OE,Ev$J%U%)%s%H$r;HMQ$9(B
+	$B$k!#(B
+
+  + Cursor (code = 11, length = 1)
+	$B%+!<%=%k$r;XDj$9$k!#%G!<%?$K$O%+!<%=%k(B ID $B$,F~$k!#;XDj$5$l$J$+$C$?(B
+	$B>l9g!"JQ49%5!<%P$OE,Ev$J%+!<%=%k$r;HMQ$9$k!#(B
+
+$B0J9_$OJQ493+;O;~$K$7$+;XDj$G$-$J$$B0@-$G$"$k!#(B
+
+  + Input Style (code = 128, length = 1)
+	$BF~NOJ}K!$r;XDj$9$k!#CM$O(B
+		root window style:	1
+		off-the-spot style:	2
+		over-the-spot style:	4
+	$B$N$I$l$+$G$J$1$l$P$J$i$:!"JQ49%W%m%U%!%$%k$N(B Supported Styles $B$KF~$C(B
+	$B$F$$$k%9%?%$%k$G$J$1$l$P$J$i$J$$!#$3$NB0@-$,;XDj$5$l$J$+$C$?;~$N%G(B
+	$B%U%)%k%H$O(B Root Window Style $B$G$"$k!#(B
+
+  + Event Capture Method (code = 129, length = 1)
+	$B%/%i%$%"%s%H%&%#%s%I%&$+$i$N%$%Y%s%H$N<hF@J}K!$r;XDj$9$k!#%$%Y%s%H(B
+	$B$N<hF@J}K!$O(B3$B<oN`$"$j!"$=$l$>$l%G!<%?$K;XDj$9$kCM$O(B
+		$B$J$K$b$7$J$$(B:			0
+		InputOnly $B%&%#%s%I%&$K$h$kJ}K!(B:	1
+		$B%U%)!<%+%9%&%#%s%I%&$r%;%l%/%H(B:	2
+	$B$G$"$k!#%G%U%)%k%H$O(B InputOnly $B%&%#%s%I%&$K$h$kJ}K!$G$"$k!#(B
+
+  + Use Extension (code = 130, length = N)
+	$B$3$NB0@-@_Dj$G;HMQ$5$l$k3HD%$r;XDj$9$k!#$3$3$G;XDj$9$k3HD%$O%5!<%P(B
+	$B$,%5%]!<%H$7$F$$$k$b$N!"$D$^$j%W%m%U%!%$%k%G!<%?Cf$N(BSupported
+	Extensions $B$K=q$+$l$?3HD%$G$J$1$l$P$J$i$J$$!#$^$?!"$3$N@_Dj$O;HMQ(B
+	$B$9$k3HD%B0@-%3!<%I$,B0@-%G!<%?Cf$K8=$l$kA0$K$J$1$l$P$J$i$J$$!#(B
+
+
+* $BJQ493+;O$NDLCN(B
+
+  $BJQ49$N%j%/%(%9%H$r<u$1$?JQ49%5!<%P$OJQ49B0@-$NFI$_=P$7$J$II,MW$J=hM}$r9T(B
+$B$J$C$?8e!"%/%i%$%"%s%H$KBP$7$FJQ493+;O$NDLCN$r$9$k$H$H$b$K<B:]$NJQ49:n6H$r(B
+$B;O$a$k!#(B
+
+  $BJQ493+;O$NDLCN$O(B ClientMessage $B%$%Y%s%H$K$h$j9T$J$&!#(B
+
+    SendEvent
+	destination:  $B%/%i%$%"%s%H%&%#%s%I%&(B
+	propergate:  False
+	event-mask:  NoEventMask
+	event:  ClientMessage
+		window: $B%/%i%$%"%s%H%&%#%s%I%&(B
+		type: Atom "CONVERSION_NOTIFY"
+		format: 32
+		data:
+			l[0]: $B%;%l%/%7%g%s%"%H%`(B
+			l[1]: $BJQ49%F%-%9%H$N%(%s%3!<%G%#%s%0%"%H%`(B
+			l[2]: $BJQ49%F%-%9%HMQ%W%m%Q%F%#(B or None
+			l[3]: $BJQ49%&%#%s%I%&(BID 
+			l[4]: unused
+
+  data.l[1] $B$OJQ49J8;zNs$r%/%i%$%"%s%H$KAw$k;~$NJ8;zNs$N%(%s%3!<%G%#%s%0$G(B
+$B$"$k!#(Bdata.l[2] $B$O$=$NJ8;zNs$,Aw$i$l$k%W%m%Q%F%#$G$"$j!"(B
+"CONVERSION_REQUEST" $B$G%/%i%$%"%s%H$,;XDj$7$?>l9g$K$O$=$l$,$=$N$^$^F~$j!"(B
+None $B$r;XDj$7$?>l9g$K$OJQ49%5!<%P$OE,Ev$J%W%m%Q%F%#$rA*$s$G$=$l$rF~$l$k!#(B
+
+  $B$b$7!"$J$s$i$+$NM}M3$GJQ49%5!<%P$,$=$N%/%i%$%"%s%H$N$?$a$NJQ49%5!<%S%9$r(B
+$BDs6!$G$-$J$$>l9g$K$O(B data.l[2] $B$K$O(B None $B$rF~$l$k!#(B
+
+  data.l[3] $B$O<B:]$KJQ49=hM}$,9T$J$o$l$k%&%#%s%I%&(BID $B$r;XDj$9$k!#$3$l$O!"(B
+$B%/%i%$%"%s%H$,<+J,$N$H$3$m$KMh$?%-!<%$%Y%s%H$rJQ49%5!<%P$KAw$k;~$K$=$NAw$j(B
+$B@h$H$7$F;HMQ$9$k$?$a$N$b$N$G$"$k!#(B
+
+  $B$3$N%$%Y%s%H$rAw$C$?;~$K$O$9$G$KJQ49%5!<%P$OB0@-%W%m%Q%F%#$NFbMF$rFI$s$G(B
+$B$7$^$C$F$$$k$N$G!"$3$N%$%Y%s%H$r<u$1$H$C$?%/%i%$%"%s%H$OJQ49B0@-%W%m%Q%F%#(B
+$B$r>C$7$?$jFbMF$rJQ99$7$?$j$7$F$h$$!#(B
+
+
+* $BJQ49B0@-$NJQ99(B
+
+  $BJQ493+;O$,DLCN$5$l$?8e!"JQ49$,=*N;$9$k$^$G$N4V$KJQ49B0@-$NJQ2=$,5/$3$C$?(B
+$B>l9g!"%/%i%$%"%s%H$O$=$l$rJQ49%5!<%P$KEA$($k$3$H$,$G$-$k!#(B
+
+  $B%/%i%$%"%s%H$OJQ49%5!<%P$K(B ClientMessage $B%$%Y%s%H$rAw$k$3$H$GJQ49B0@-$N(B
+$BJQ2=$rDLCN$9$k!#(B
+
+    SendEvent
+	destination:  $B%;%l%/%7%g%s%*!<%J!<%&%#%s%I%&(B
+	propergate:  False
+	event-mask:  NoEventMask
+	event:  ClientMessage
+		window: $B%;%l%/%7%g%s%*!<%J!<%&%#%s%I%&(B
+		type: Atom "CONVERSION_ATTRIBUTE_NOTIFY"
+		format: 32
+		data:
+			l[0]: $B%;%l%/%7%g%s%"%H%`(B
+			l[1]: $B%/%i%$%"%s%H%&%#%s%I%&(BID
+			l[2]-l[4]: $BB0@-%G!<%?(B
+
+  data.l[2] $B$+$i(B data.l[4] $B$KJQ99$5$l$?B0@-%G!<%?$rF~$l$k!#B0@-%G!<%?$N7A(B
+$B<0$OJQ49B0@-$N%W%m%Q%F%#$N7A<0$HA4$/F1$8$G$"$k!#$?$@$78+$l$P$o$+$k$h$&$K%$(B
+$B%Y%s%H$KF~$l$i$l$kB0@-%G!<%?$NBg$-$5$O:GBg(B3$B%o!<%I$G$"$k!#=>$C$FJQ99$5$l$?(B
+$BB0@-%G!<%?$,$3$l$h$jBg$-$$$H$+!"JQ99$5$l$?B0@-%G!<%?$,J#?t$"$k$H$-(B ($B$3$N>l(B
+$B9g$K$O$3$N%$%Y%s%H$rJ#?t2sAw$C$F$b$$$$$N$@$,(B) $B$K$OB0@-%G!<%?$O%W%m%Q%F%#$K(B
+$BF~$l!"(BIndirect Attribute $B$N5!G=$r;H$C$F$=$N%W%m%Q%F%#$r;XDj$9$l$P$h$$!#(B
+
+
+* $BJQ49J8;zNs$NAw?.(B
+
+  $B3NDj$5$l$?JQ49J8;zNs$O!"?o;~JQ49%5!<%P$+$i%/%i%$%"%s%H$K%W%m%Q%F%#$r;HMQ(B
+$B$7$FAw$i$l$k!#(B
+
+    ChangeProperty
+	window:  $B%/%i%$%"%s%H%&%#%s%I%&(B
+	property:  "CONVERSION_NOTIFY" $B$G;XDj$7$?%W%m%Q%F%#(B
+	type:  "CONVERSION_NOTIFY" $B$G;XDj$7$?%(%s%3!<%G%#%s%0(B
+	format:  $B%(%s%3!<%G%#%s%0$K$h$k(B
+	mode:  Append
+	data:  $BJQ49J8;zNs(B
+
+  $B%/%i%$%"%s%H$O$"$i$+$8$a%/%i%$%"%s%H%&%#%s%I%&$N(B PropertyNotify $B%$%Y%s%H(B
+$B$r%;%l%/%H$7$F$*$-!"%W%m%Q%F%#$,JQ99$5$l$?$iJQ497k2L$r<h$j=P$9$h$&$K$9$k!#(B
+
+    GetProperty
+	window:  $B%/%i%$%"%s%H%&%#%s%I%&(B
+	property:  "CONVERSION_NOTIFY" $B$G;XDj$5$l$?%W%m%Q%F%#(B
+	type:  "CONVERSION_NOTIFY" $B$G;XDj$5$l$?%(%s%3!<%G%#%s%0(B
+	format: $B%(%s%3!<%G%#%s%0$K$h$k(B
+	delete: True
+
+
+* $BJQ49=*N;$NDLCN(B
+
+  $BJQ49%5!<%P$OJQ49$,=*N;$9$k$H%/%i%$%"%s%H$K(B ClientMessage $B$rAw$C$F$=$l$r(B
+$BDLCN$9$k!#(B
+
+    SendEvent
+	destination:  $B%/%i%$%"%s%H%&%#%s%I%&(B
+	propergate:  False
+	event-mask:  NoEventMask
+	event:  ClientMessage
+		window: $B%/%i%$%"%s%H%&%#%s%I%&(B
+		type: Atom "CONVERSION_END"
+		format: 32
+		data:
+			l[0]: $B%;%l%/%7%g%s%"%H%`(B
+			l[1]: $B%;%l%/%7%g%s%*!<%J!<%&%#%s%I%&(BID
+			l[2]-l[4]: unused
+
+* $BJQ49=*N;$N%j%/%(%9%H(B
+
+  $B%/%i%$%"%s%HB&$+$iJQ49%5!<%P$KBP$7$FJQ49$N=*N;$r%j%/%(%9%H$9$k$3$H$b$G$-(B
+$B$k!#%/%i%$%"%s%H$OJQ49%5!<%P$K<!$N$h$&$J(B ClientMessage $B$rAw$k!#(B
+
+    SendEvent
+	destination:  $B%;%l%/%7%g%s%*!<%J!<%&%#%s%I%&(B
+	propergate:  False
+	event-mask:  NoEventMask
+	event:  ClientMessage
+		window: $B%;%l%/%7%g%s%*!<%J!<(B
+		type: Atom "CONVERSION_END_REQUEST"
+		format: 32
+		data:
+			l[0]: $B%;%l%/%7%g%s%"%H%`(B
+			l[1]: $B%/%i%$%"%s%H%&%#%s%I%&(BID
+			l[2]-l[4]: unused
+
+  $BJQ49%5!<%P$O$3$N%$%Y%s%H$r<u$1$H$k$H!"$^$@%/%i%$%"%s%H$KAw$C$F$$$J$$JQ49(B
+$BJ8;zNs$,$"$l$P$=$l$rAw$j!"$=$N8e(B CONVERSION_END $B$N(B ClientMessage $B$rAw$k!#(B
+
+
+* $B3HD%$K$D$$$F(B
+
+  $B3HD%$K$OB0@-$N3HD%$H%W%m%H%3%k3HD%$H$,$"$k!#B0@-$N3HD%$OJQ49B0@-$NDI2C$G(B
+$B$"$j!"%W%m%H%3%k3HD%$OJQ49%5!<%P$H%/%i%$%"%s%H$NDL?.$K?7$?$J%a%C%;!<%8$rDI(B
+$B2C$9$k$3$H$G$"$k!#$b$A$m$s0l$D$N3HD%$,$3$NN>J}$r4^$s$G$$$F$b$h$$!#(B
+
+  $B$I$A$i$N%?%$%W$N3HD%$r$9$k$K$7$F$b$^$:$=$N3HD%$KL>A0$r$D$1$J$/$F$O$J$i$J(B
+$B$$!#$=$7$F$=$N3HD%$r<BAu$7$?JQ49%5!<%P$OJQ49%W%m%U%!%$%k$N(B Supported
+Extensions$B$K$=$N3HD%L>$rF~$l!"%/%i%$%"%s%H$KBP$7$F$=$N3HD%$r<BAu$7$F$$$k$3(B
+$B$H$r@k8@$7$J$/$F$O$J$i$J$$!#(B
+
+  $B3HD%$r;H$*$&$H$9$k%/%i%$%"%s%H$O$^$:JQ49%5!<%P$NJQ49%W%m%U%!%$%k$rD4$Y!"(B
+$B%5!<%P$,$=$N3HD%$r%5%]!<%H$7$F$$$k$+3N$+$a$kI,MW$,$"$k!#$b$7%5!<%P$,$=$N3H(B
+$BD%$r%5%]!<%H$7$F$$$J$1$l$P!"$=$N%5!<%P$KBP$7$F$=$N3HD%$r;H$C$F$O$J$i$J$$!#(B
+
+  $BB0@-$N3HD%$N>l9g!"?7$?$K3HD%B0@-%3!<%I$r7h$a$J$/$F$O$J$i$J$$!#$3$N%3!<%I(B
+$B$K$D$$$F$O$=$N%3!<%I$NHO0O$,(B 256 $B$+$i(B 65535 $B$G$J$1$l$P$J$i$J$$$H$$$&$3$H$r(B
+$B=|$-!"$3$N%W%m%H%3%k$G$O0l@Z5,Dj$7$J$$!#3HD%%3!<%I$O$3$NHO0O$G>!<j$K%3!<%I(B
+$B$r7h$a$k$3$H$,$G$-$k!#$3$N>l9g!"J#?t$N3HD%$G;H$&%3!<%I$,=EJ#$9$k$3$H$,9M$((B
+$B$i$l$k!#$7$+$7$3$N;vBV$rHr$1$k<jCJ$O0l@ZDs6!$5$l$J$$!#$b$7Fs$D$N3HD%$GDj5A(B
+$B$5$l$?%3!<%I$,=E$J$C$F$7$^$C$?>l9g$K$O$=$NFs$D$N3HD%$OF1;~$K;H$($J$$$@$1$N(B
+$B$3$H$G$"$k!#(B
+
+  $B$3$N$h$&$JIT9,$J;vBV$rHr$1$k$?$a$K!"3HD%$r$7$?$i$=$N3HD%L>$H$=$N3HD%$N>\(B
+$B:Y$rH/I=$9$k$N$,$h$$$@$m$&$H;W$o$l$k$,!"$I$3$K$I$&H/I=$9$k$+$J$I$N>\:Y$OL@(B
+$B$i$+$K%W%m%H%3%k$G5,Dj$9$Y$-$b$N$G$O$J$$$N$G$3$3$K$O=q$+$J$$!#$@$$$?$$$3$N(B
+$B%W%m%H%3%k$r3HD%$7$h$&$J$I$H$$$&$b$N$O$[$H$s$I$$$J$$$G$"$m$&$,!#(B
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/doc/resources	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,355 @@
+** kinput2 $B$G;H$o$l$k(B widget $B$N<g$J%j%=!<%9(B **
+
+$B$3$3$G$O(B kinput2 $B$G;H$o$l$F$$$k(B widget $B$N<g$J%j%=!<%9$K$D$$$F>R2p$7$^$9!#$?(B
+$B$@$7%f!<%6$,%j%=!<%9%U%!%$%k$G;XDj$G$-$J$$(B / $B;XDj$7$F$b0UL#$,$J$$$b$N$K$D$$(B
+$B$F$O>JN,$7$^$7$?!#%j%=!<%9%U%!%$%k$r=q$/;~$K$O%*%s%i%$%s%^%K%e%"%k$K5-:\$5$l(B
+$B$F$$$k(B widget $B%D%j!<$b;29M$K$7$F2<$5$$!#(B
+
+$B$J$*!"$3$3$K5-=R$5$l$F$$$k%G%U%)%k%HCM$O(B widget $B$N%G%U%)%k%H$G$9!#%"%W%j%1!<(B
+$B%7%g%s%j%=!<%9%U%!%$%k(B Kinput $B$K$h$C$FJQ99$5$l$F$$$k$b$N$b$"$k$N$GCm0U$7$F2<(B
+$B$5$$!#(B
+
+
+* CcWnn
+$BJQ49%*%V%8%'%/%H(B CcWnn $B$N%j%=!<%9$K$O<!$N$h$&$J$b$N$,$"$j$^$9!#(B
+
++ jserver ($B%/%i%9(B Jserver)
+	$B%W%i%$%^%jJQ49%5!<%P(B (jserver) $B$N%[%9%HL>$r;XDj$7$^$9!#$3$N%j%=!<%9(B
+	$B$,;XDj$5$l$F$$$J$1$l$P4D6-JQ?t(B JSERVER $B$NCM$,MQ$$$i$l$^$9!#(B
+
++ jserver2nd ($B%/%i%9(B Jserver)
+	$B%;%+%s%@%jJQ49%5!<%P$N%[%9%HL>$r;XDj$7$^$9!#%;%+%s%@%j%5!<%P$O%W%i%$(B
+	$B%^%j%5!<%P$H@\B3$G$-$J$+$C$?;~!"$*$h$SJQ49$NESCf$G%W%i%$%^%j%5!<%P$,(B
+	$B;`$s$G$7$^$C$?;~$K;H$o$l$^$9!#$3$N%j%=!<%9$,;XDj$5$l$F$$$J$1$l$P%;%+(B
+	$B%s%@%j%5!<%P$O;H$o$l$^$;$s!#(B
+
++ wnnEnvname ($B%/%i%9(B WnnEnvname)
+	$BJQ49$K;HMQ$9$k4D6-L>$r;XDj$7$^$9!#%G%U%)%k%H$G$O%f!<%6L>$r4D6-L>$H$7(B
+	$B$F;HMQ$7$^$9$N$GFC$K;XDj$9$kI,MW$O$"$j$^$;$s$,!"$_$s$J$G0l$D$N4D6-$r(B
+	$B6&M-$7$?$j$7$?$$;~$K;H$($^$9!#(B
+
++ wnnEnvrc ($B%/%i%9(B WnnEnvrc)
+	$BJQ494D6-@_Dj%U%!%$%k$r;XDj$7$^$9!#%G%U%)%k%H$G$O4D6-JQ?t(B WNNENVRC $B$,(B
+	$B@_Dj$5$l$F$$$l$P$=$l$r;H$$!"$=$&$G$J$1$l$P%G%U%)%k%H(B (Wnn $B$N%3%s%U%$(B
+	$B%.%e%l!<%7%g%s$K$h$C$F0[$J$j$^$9$,IaDL$O(B /usr/local/lib/wnn/wnnenvrc)
+	$B$,;H$o$l$^$9!#(B
+
++ wnnOverrideEnv ($B%/%i%9(B WnnOverrideEnv)
+	$B%5!<%P$KF1$8L>A0$N4D6-$,$"$C$?;~$K=i4|2=$N=hM}$r9T$J$&$+$I$&$+$r;XDj(B
+	$B$9$k$?$a$N%j%=!<%9$G$9!#(Btrue $B$G$"$l$P=i4|2=$N=hM}$rI,$:9T$J$$$^$9!#(B
+	false $B$J$i9T$J$$$^$;$s!#%G%U%)%k%H$O(B false $B$G$9!#(B
+
++ ccdef ($B%/%i%9(B Ccdef)
+	$BF~NOJ8;zJQ49%k!<%kDj5A%U%!%$%k$r;XDj$7$^$9!#$3$N%j%=!<%9$,;XDj$5$l$J(B
+	$B$+$C$?>l9g$K$O$^$:4D6-JQ?t(B CC_DEF $B$,@_Dj$5$l$F$$$l$P$=$l$,;H$o$l$^$9!#(B
+	$B$J$1$l$P(B ccdef.kinput $B$,;HMQ$5$l$^$9!#$3$N%U%!%$%k$N%5!<%A%Q%9$O4D6-(B
+	$BJQ?t(B CC_DEF_PATH $B$G;XDj$9$k$3$H$,$G$-$^$9!#$?$@$7%j%=!<%9$G$O%5!<%A(B
+	$B%Q%9$r;XDj$9$k$3$H$O$G$-$^$;$s!#(B
+
++ saveInterval ($B%/%i%9(B SaveInterval)
+	$B<-=q$HIQEY%U%!%$%k$r%;!<%V$9$k%?%$%_%s%0$r;XDj$7$^$9!#%;!<%V$O%*%V%8%'(B
+	$B%/%H$,(B Destroy $B$5$l$k$H$-$K9T$J$o$l$^$9$,!"$3$N%j%=!<%9$K$h$j!"JQ49(B
+	$B$NESCf$G$b%;!<%V$5$l$k$h$&$K$J$j$^$9!#%;!<%V$O3NDj$N;~$K9T$J$o$l!"$3(B
+	$B$N%j%=!<%9$G;XDj$7$?2s?t$4$H$K0l2s%;!<%V$5$l$^$9!#Nc$($P(B100$B$r;XDj$9(B
+	$B$k$H(B100$B2s3NDj$9$k$4$H$K0l2s<-=q!&IQEY$N%;!<%V$,9T$J$o$l$^$9!#$3$N%j(B
+	$B%=!<%9$K(B 0 $B$r;XDj$9$k$H3NDj;~$N%;!<%V$O9T$J$o$l$^$;$s!#%G%U%)%k%H$O(B 
+	0 $B$G$9!#(B
+
+
+* Iroha
+$BJQ49%*%V%8%'%/%H$G$"$k(B Iroha $B$N%j%=!<%9$K$O<!$N$h$&$J$b$N$,$"$j$^$9!#(B
+
++ irohahost ($B%/%i%9(B Irohahost)
+	$BJQ49%5!<%P(B (irohaserver) $B$N%[%9%HL>$r;XDj$7$^$9!#(B
+
++ irohafile ($B%/%i%9(B Irohafile)
+	$B$+$s$J$NJQ49@_Dj%U%!%$%k$r;XDj$7$^$9!#(B
+
+
+* Sj3
+$BJQ49%*%V%8%'%/%H(B Sj3 $B$N%j%=!<%9$K$O<!$N$h$&$J$b$N$,$"$j$^$9!#(B
+
++ sj3serv ($B%/%i%9(B Sj3serv)
+	$B%W%i%$%^%jJQ49%5!<%P(B (sj3serv) $B$N%[%9%HL>$r;XDj$7$^$9!#$3$N%j%=!<%9(B
+	$B$,;XDj$5$l$F$$$J$1$l$P4D6-JQ?t(B Sj3SERV $B$NCM$,MQ$$$i$l$^$9!#(B
+	$B4D6-JQ?t(B Sj3SERV $B$b;XDj$5$l$F$$$J$1$l$P(B localhost $B$K$J$j$^$9!#(B
+
++ sj3serv2 ($B%/%i%9(B Sj3serv2)
+	$B%;%+%s%@%jJQ49%5!<%P$N%[%9%HL>$r;XDj$7$^$9!#%;%+%s%@%j%5!<%P$O5/F0;~(B
+	$B$d:F@\B3;~$K%W%i%$%^%j%5!<%P$H@\B3$G$-$J$+$C$?;~$K;H$o$l$^$9!#$3$N(B
+	$B%j%=!<%9$,;XDj$5$l$F$$$J$1$l$P4D6-JQ?t(B Sj3SERV2 $B$NCM$,MQ$$$i$l$^$9!#(B
+	$B4D6-JQ?t(B Sj3SERV $B$b;XDj$5$l$F$$$J$1$l$P(B localhost $B$K$J$j$^$9!#(B
+
++ sj3user ($B%/%i%9(B Sj3user)
+	$B5/F0;~$d:F@\B3;~$KJQ49%5!<%P$H@\B3;~$9$k:]$K%*!<%W%s$9$k%f!<%6<-=q$N(B
+	$BL>A0$r;XDj$7$^$9!#$3$N%j%=!<%9$,;XDj$5$l$F$$$J$1$l$P(B kinput2 $B$r5/F0(B
+	$B$7$?%f!<%6L>$N%f!<%6<-=q$r%*!<%W%s$7$^$9!#(B
+
++ rcfile ($B%/%i%9(B Rcfile)
+	$BJQ49$K;HMQ$9$k%Q%i%a!<%?$d%-!<%P%$%s%I$N@_Dj%U%!%$%k$r;XDj$7$^$9!#$3$N(B
+	$B%j%=!<%9$,;XDj$5$l$F$$$J$1$l$P4D6-JQ?t(B SJRC $B$NCM$,MQ$$$i$l$^$9!#4D6-(B
+	$BJQ?t$N@_Dj$b$J$1$l$P(B kinput2 $B$r5/F0$7$?%f!<%6$N%[!<%`%G%#%l%/%H%j$K$"(B
+	$B$k(B .sjrc $B$H$$$&%U%!%$%k!"(B/usr/lib/X11/sj3def/sjrc $B$N=g$G%5!<%A$7$^$9!#(B
+
++ rkfile ($B%/%i%9(B Rkfile)
+	$B%m!<%^;z$+$JJQ49$NJQ49%F!<%V%k$N@_Dj%U%!%$%k$r;XDj$7$^$9!#$3$N%j%=!<%9(B
+	$B$,;XDj$5$l$F$$$J$1$l$P4D6-JQ?t(B SJRK $B$NCM$,MQ$$$i$l$^$9!#4D6-JQ?t$N@_Dj(B
+	$B$b$J$1$l$P(B kinput2 $B$r5/F0$7$?%f!<%6$N%[!<%`%G%#%l%/%H%j$K$"$k(B .sjrk
+	$B$H$$$&%U%!%$%k!"(B/usr/lib/X11/sj3def/sjrk $B$N=g$G%5!<%A$7$^$9!#(B
+
++ hkfile ($B%/%i%9(B Hkfile)
+	$B$R$i$,$J"N%+%?%+%J$NJQ49$NJQ49%F!<%V%k$N@_Dj%U%!%$%k$r;XDj$7$^$9!#$3$N(B
+	$B%j%=!<%9$,;XDj$5$l$F$$$J$1$l$P4D6-JQ?t(B SJHK $B$NCM$,MQ$$$i$l$^$9!#4D6-JQ(B
+	$B?t$N@_Dj$b$J$1$l$P(B kinput2 $B$r5/F0$7$?%f!<%6$N%[!<%`%G%#%l%/%H%j$K$"$k(B
+	.sjhk $B$H$$$&%U%!%$%k!"(B/usr/lib/X11/sj3def/sjhk $B$N=g$G%5!<%A$7$^$9!#(B
+
++ hkfile ($B%/%i%9(B Hkfile)
+	$BA43QJ8;z"NH>3QJ8;z$NJQ49$NJQ49%F!<%V%k$N@_Dj%U%!%$%k$r;XDj$7$^$9!#$3$N(B
+	$B%j%=!<%9$,;XDj$5$l$F$$$J$1$l$P4D6-JQ?t(B SJZH $B$NCM$,MQ$$$i$l$^$9!#4D6-JQ(B
+	$B?t$N@_Dj$b$J$1$l$P(B kinput2 $B$r5/F0$7$?%f!<%6$N%[!<%`%G%#%l%/%H%j$K$"$k(B
+	.sjzh $B$H$$$&%U%!%$%k!"(B/usr/lib/X11/sj3def/sjzh $B$N=g$G%5!<%A$7$^$9!#(B
+
++ sbfile ($B%/%i%9(B Sbfile)
+	$B5-9fF~NO;~$KI=<($9$kJ8;z%3!<%I0lMw$N@_Dj%U%!%$%k$r;XDj$7$^$9!#$3$N%j(B
+	$B%=!<%9$,;XDj$5$l$F$$$J$1$l$P4D6-JQ?t(B SJSB $B$NCM$,MQ$$$i$l$^$9!#4D6-JQ?t(B
+	$B$N@_Dj$b$J$1$l$P(B kinput2 $B$r5/F0$7$?%f!<%6$N%[!<%`%G%#%l%/%H%j$K$"$k(B
+	.sjsb $B$H$$$&%U%!%$%k!"(B/usr/lib/X11/sj3def/sjsb $B$N=g$G%5!<%A$7$^$9!#(B
+
+
+* ConvDisplay
+$BIA2h%*%V%8%'%/%H(B WcharDisplay $B$N%9!<%Q!<%/%i%9$G$"$k(B ConvDisplay $B$N%j%=!<%9(B
+$B$K$O<!$N$h$&$J$b$N$,$"$j$^$9!#(B
+
++ cursorBitmap ($B%/%i%9(B CursorBitmap)
+	$B%$%s%5!<%H%+!<%=%k$N7A>u$r%S%C%H%^%C%W$G;XDj$7$^$9!#%j%=!<%9$K$O%S%C(B
+	$B%H%^%C%W%U%!%$%kL>$r;XDj$7$^$9!#(B
+
++ hotX, hotY ($B%/%i%9(B HotX, HotY)
+	cursorBitmap $B$G;XDj$7$?%$%s%5!<%H%+!<%=%k$N%[%C%H%9%]%C%H$r;XDj$7$^(B
+	$B$9!#%+!<%=%k$O%[%C%H%9%]%C%H$,%Y!<%9%i%$%s>e<!$NJ8;z$r=q$-;O$a$kE@$H(B
+	$B0lCW$9$k$h$&$KIA$+$l$^$9!#(B
+
+
+* WcharDisplay
+$BIA2h%*%V%8%'%/%H(B jpWcharDisplay $B$N%9!<%Q!<%/%i%9$G$"$k(B WcharDisplay $B$N%j%=!<(B
+$B%9$O$9$Y$F%5%V%/%i%9$K$h$C$F%*!<%P!<%i%$%I$5$l$^$9$N$G$3$3$G$O@bL@$7$^$;$s!#(B
+
+
+* jpWcharDisplay
+$BIA2h%*%V%8%'%/%H(B jpWcharDisplay $B$N%j%=!<%9$K$O<!$N$h$&$J$b$N$,$"$j$^$9!#(B
+
++ font ($B%/%i%9(B Font)
+	$B%G%U%)%k%H$N%"%9%-!<%U%)%s%H$r;XDj$7$^$9!#F~NO%9%?%$%k$K$h$C$F$O%/%i(B
+	$B%$%"%s%H$K$h$k%U%)%s%H$N;XDj$,;H$o$l$k$N$GI,$:$7$b$3$N%j%=!<%9$G;XDj(B
+	$B$7$?%U%)%s%H$,;H$o$l$k$H$O8B$j$^$;$s!#(B
+	$B%G%U%)%k%H$O(B "-Misc-Fixed-Medium-R-*--14-*-*-*-C-*-ISO8859-1" $B$G$9!#(B
+
++ kanjiFont ($B%/%i%9(B KanjiFont)
+	$B%G%U%)%k%H$N4A;z%U%)%s%H$r;XDj$7$^$9!#(Bfont $B$HF1$8$/!"F~NO%9%?%$%k$K(B
+	$B$h$C$F$O%/%i%$%"%s%H$K$h$k%U%)%s%H$N;XDj$,;H$o$l$k$N$GI,$:$7$b$3$N%j(B
+	$B%=!<%9$G;XDj$7$?%U%)%s%H$,;H$o$l$k$H$O8B$j$^$;$s!#(B
+	$B%G%U%)%k%H$O(B "-Misc-Fixed-Medium-R-*--14-*-*-*-C-*-JISX0208.1983-0"
+	$B$G$9!#(B
+
++ kanaFont ($B%/%i%9(B KanaFont)
+	$B%G%U%)%k%H$NH>3Q$+$J%U%)%s%H$r;XDj$7$^$9!#(Bfont $B$HF1$8$/!"F~NO%9%?%$(B
+	$B%k$K$h$C$F$O%/%i%$%"%s%H$K$h$k%U%)%s%H$N;XDj$,;H$o$l$k$N$GI,$:$7$b$3(B
+	$B$N%j%=!<%9$G;XDj$7$?%U%)%s%H$,;H$o$l$k$H$O8B$j$^$;$s!#(B
+	$B$3$N%j%=!<%9$G;XDj$9$k%U%)%s%H$N%-%c%i%/%?%;%C%H$O(B "JISX0201.1976-0"
+	$B$G$J$1$l$P$J$j$^$;$s!#(B
+	$B%G%U%)%k%H$O(B "-Misc-Fixed-Medium-R-*--14-*-*-*-C-*-JISX0201.1976-0"
+	$B$G$9!#(B
+
++ fontMapping ($B%/%i%9(B FontMapping)
+	$BJ8;zNs$r=q$/;~$K!"(Bfont, kanjiFont, kanaFont $B$G;XDj$7$?%U%)%s%H$N(B GL
+	($B:8H>J,(B MSB $B$,Mn$A$F$$$kNN0h(B) GR ($B1&H>J,(B MSB $B$,N)$C$F$$$kNN0h(B) $B$N$I(B
+	$B$A$i$r;HMQ$9$k$+$r;XDj$7$^$9!#;XDjJ}K!$O(B
+
+		*fontMapping: GL,GL,GR
+
+	$B$N$h$&$K=q$-$^$9!#%G%U%)%k%H$O(B GL,GL,GR $B$G$9$,!"(BkanjiFont $B$K(B EUC $B%(%s(B
+	$B%3!<%G%#%s%0$N%U%)%s%H(B ($BNc$($P(B *-JISX0208.1983-1) $B$r;XDj$7$?>l9g$K$O(B
+
+		*fontMapping: GL,GR,GR
+
+	$B$K$7$F2<$5$$!#(B
+
+
+* KinputProtocol
+kinput $B%U%!%_%j!<%W%m%H%3%kMQ$N%W%m%H%3%k%I%i%$%P(B KinputProtocol $B$N%j%=!<%9(B
+$B$K$O<!$N$h$&$J$b$N$,$"$j$^$9!#(B
+
++ backwardCompatible ($B%/%i%9(B BackwardCompatible)
+	kinput $B%W%m%H%3%k$G$OJQ49$N%5!<%S%9$r9T$J$&$3$H$r<($9$N$K%"%H%`$r;H(B
+	$B$$$^$9!#$3$N%j%=!<%9$r(B true $B$K$9$k$H!"$3$N%"%H%`$H$7$F!"@5<0$KEPO?$5(B
+	$B$l$?(B"_JAPANESE_CONVERSION" ($BF|K\8l$N>l9g(B) $B$@$1$G$O$J$/!"(Bkinput $B$,;H(B
+	$BMQ$7$F$$$?(B "JAPANESE_CONVERSION" $B$bF1;~$K;H$($k$h$&$K$7$^$9!#(Bkinput 
+	$B$rMQ$$$FF|K\8lF~NO$r9T$J$C$F$$$?%"%W%j%1!<%7%g%s$K$O(B
+	"JAPANESE_CONVERSIN" $B$rMQ$$$F$$$k$b$N$,B?$$$N$G$=$N$h$&$J%"%W%j%1!<(B
+	$B%7%g%s$r;HMQ$9$k2DG=@-$,$"$k>l9g$K$O$3$N%j%=!<%9$r(B true $B$K$7$F$*$$$?(B
+	$BJ}$,$h$$$G$7$g$&!#%G%U%)%k%H$O(B false $B$K$J$C$F$$$^$9!#(B
+	
++ xlcConversionStartKey ($B%/%i%9(B XlcConversionStartKey)
+	xlc $B%W%m%H%3%k$G$OJQ493+;O$K;H$o$l$k%-!<$r%U%m%s%H%(%s%I$+$i%"(B
+	$B%W%j%1!<%7%g%s$K65$($k$3$H$,$G$-$^$9!#$3$N%j%=!<%9$K$O$3$N%-!<(B
+	$B$r5-=R$7$^$9!#%j%=!<%9$O%D!<%k%-%C%H$N%H%i%s%9%l!<%7%g%s%^%M!<(B
+	$B%8%c$N5-=RIw$K!"<!$N$h$&$K;XDj$7$^$9!#(B
+
+		*xlcConversionStartKey:	Shift<Key>Kanji
+
+	"<Key>" $B$NA0$K=q$1$k$N$O%b%G%#%U%!%$%"$G!"$3$l$O<!$N(B 10 $B8D$"$k(B
+	$B$&$A$N$$$/$D$+$rAH9g$;$?$b$N$G$9!#(B
+		Shift, Lock, Ctrl, Meta, Alt, Mod1, Mod2, Mod3, Mod4, Mod5
+	Meta, Alt, Mod1 $B$OF1$80UL#$K$J$j$^$9!#(B
+	"<Key>" $B$N8e$K=q$+$l$k$N$O(B Keysym $BL>$G$9!#(B
+
+
+* XimpProtocol
+XIMP $B%W%m%H%3%kMQ$N%W%m%H%3%k%I%i%$%P(B XimpProtocol $B$N%j%=!<%9$K$O<!$N$h$&$J(B
+$B$b$N$,$"$j$^$9!#(B
+
++ forceDefaultServer ($B%/%i%9(B ForceDefaultServer)
+	XIMP $B%W%m%H%3%k$G$OJQ49%5!<%S%9$N@k8@$H$7$F0l$D$N%G%#%9%W%l%$$K$?$@(B
+	$B0l$DB8:_$9$k%;%l%/%7%g%s$H%9%/%j!<%s!&%U%m%s%H%(%s%I$4$H$KB8:_$9$k%;(B
+	$B%l%/%7%g%s$N(B2$B<oN`$r;HMQ$7$^$9!#$3$N%j%=!<%9$,(B False $B$@$H(Bkinput2 $B$,5/(B
+	$BF0$7$?;~$KA0<T$N%;%l%/%7%g%s$,$9$G$KB8:_$7$F$$$l$P8e<T$N%;%l%/%7%g%s(B
+	$B$N$_$r;HMQ$7$^$9!#(BTrue $B$J$i$9$G$KB8:_$7$F$$$k$+$I$&$+$K4X$o$i$:N>J}(B
+	$B$N%;%l%/%7%g%s$r;HMQ$7$FJQ49%5!<%S%9$N3+;O$r@k8@$7$^$9!#(B
+
++ conversionStartKeys ($B%/%i%9(B ConversionStartKeys)
+	XIMP $B%W%m%H%3%k$K$O!"%/%i%$%"%s%H$KBP$7$FJQ49$N3+;O$*$h$S=*N;$K;HMQ(B
+	$B$9$k%-!<$r65$($k5!G=$,$"$j$^$9!#$3$N%j%=!<%9$O$=$N%-!<$r;XDj$9$k$?$a(B
+	$B$N$b$N$G$9!#$?$@$7IaDL$O;XDj$5$l$?%-!<$OJQ49=*N;$K$O;HMQ$5$l$^$;$s!#(B
+	$BJQ49=*N;$N%-!<$O3FJQ49%*%V%8%'%/%H$G;XDj$9$k%-!<$,;H$o$l$^$9!#(B
+	$B%j%=!<%9$O%D!<%k%-%C%H$N%H%i%s%9%l!<%7%g%s%^%M!<%8%c$N5-=RIw$K!"<!$N(B
+	$B$h$&$K;XDj$7$^$9!#(B
+
+		*conversionStartKeys: \
+			Shift<Key>Kanji		\n\
+			Ctrl ~Shift<Key>F1
+
+	$B$3$N$h$&$KJ#?t$N%-!<$r%-!<$O2~9T%3!<%I$G6h@Z$k$3$H$G;XDj$G$-$^$9!#(B
+	$B3F%-!<$N5-=RJ}K!$O(B xlcConversionStartKey $B$H$[$\F1$8$G$9$,!"%b%G%#%U%!(B
+	$B%$%"$NA0$K(B '~' $B$r$D$1$k$3$H$G!"$=$N%b%G%#%U%!%$%"$r2!$7$F$O$J$i$J$$(B
+	$B$3$H$r<($9$3$H$,$G$-$^$9!#(B
+
++ defaultFontList ($B%/%i%9(B FontList)
+	XIMP $B$K=>$&%/%i%$%"%s%H$,!"JQ49$K;HMQ$9$k%U%)%s%H$r;XDj$7$J$+$C$?;~(B
+	$B$K;H$o$l$k%U%)%s%H$G$9!#K\Mh!"%/%i%$%"%s%H$,;XDj$7$J$+$C$?>l9g$K$OIA(B
+	$B2h%*%V%8%'%/%H$N%G%U%)%k%H%U%)%s%H$,;H$o$l$^$9$,!"(BXIMP $B$K$O!"%G%U%)(B
+	$B%k%H$N%j%=!<%9CM$r%/%i%$%"%s%H$K65$($k5!G=$,$"$j!"$=$l$OIA2h%*%V%8%'(B
+	$B%/%H$+$i$OCN$k$3$H$,$G$-$J$$$N$G$A$g$C$HJQ$G$9$,$3$N(B widget $B$N%j%=!<(B
+	$B%9$H$7$F;XDj$9$k$h$&$K$7$^$7$?!#(B
+	$B;XDj$O(B R5 $B$N(B FontSet $B$N5-=RJ}K!$HF1$8$G$9!#(B
+
+
+* CandidatePanel
+$B8uJd0lMwA*Br$KMQ$$$i$l$k(B CandidatePanel $B$N%j%=!<%9$K$O<!$N$h$&$J$b$N$,$"$j$^(B
+$B$9!#(B
+
++ horizontalSpacing ($B%/%i%9(B Spacing)
+	$B:81&$N8uJd4V$N%9%Z!<%9$r%T%/%;%kC10L$G;XDj$7$^$9!#%G%U%)%k%H$O(B 6 
+	$B$G$9!#(B
+
++ verticalSpacing  ($B%/%i%9(B Spacing)
+	$B>e2<$N8uJd4V$N%9%Z!<%9$r%T%/%;%kC10L$G;XDj$7$^$9!#%G%U%)%k%H$O(B 4 $B$G(B
+	$B$9!#(B
+
++ defaultWidth ($B%/%i%9(B DefaultWidth)
+	$B%Q%M%k$NBg$-$5$O8uJd?t$K1~$8$FJQ2=$7$^$9$,!"FC$KI}$N;XDj$,$J$$;~$K(B
+	$B%G%U%)%k%H$G;H$o$l$kI}$r;XDj$7$^$9!#%G%U%)%k%H$O(B 400 $B$G$9!#(B
+
+
+* ConversionControl
+OverTheSpotConversion/OffTheSpotConversion/SeparateConversion $B6&DL$N%9!<%Q!<(B
+$B%/%i%9$G$"$k(B ConversionControl $B$N%j%=!<%9$K$O<!$N$h$&$J$b$N$,$"$j$^$9!#(B
+
++ sendbackKeyPress ($B%/%i%9(B SendbackEvent)
+	kinput2 $B$OJQ49Cf!"%/%i%$%"%s%H$KMh$?%-!<%$%Y%s%H$r$J$s$i$+$NJ}K!$G2#(B
+	$B<h$j$7$F$$$^$9!#$3$N%j%=!<%9$,(B true $B$K$J$C$F$$$k$H!"(B
+		1. $B$=$N2#<h$j$7$?%$%Y%s%H$,(B KeyPress $B%$%Y%s%H$G!"(B
+		2. $BJQ49Cf$N%F%-%9%H$,$J$/!"(B
+		3. $B$=$N%$%Y%s%H$,(B kinput2 $B$K$h$C$F;H$o$l$J$+$C$?;~$K(B
+	$B$=$N%$%Y%s%H$r%/%i%$%"%s%H$KAw$j$^$9!#$?$@$7%"%W%j%1!<%7%g%s$K$h$C$F(B
+	$B$OB>$N%"%W%j%1!<%7%g%s$+$iAw$i$l$?%$%Y%s%H$rL5;k$9$k$h$&$K$J$C$F$$$k(B
+	$B$b$N$b$"$j$^$9$N$GCm0U$7$F2<$5$$!#Nc$($P(B kterm $B$O%j%=!<%9$G(B
+		*allowSendEvents:	true
+	$B$r;XDj$7$J$$$H$;$C$+$/Aw$C$?%$%Y%s%H$OL5;k$5$l$^$9!#$^$?!"%W%m%H%3%k(B
+	$B$K$h$C$F$O$3$N<j$N%$%Y%s%H$rJL$NJ}K!$G%/%i%$%"%s%H$KAw$k$b$N$b$"$j!"(B
+	$B$3$N>l9g$K$O$3$N%j%=!<%9;XDj$O0UL#$r;}$A$^$;$s!#(B
+
+
+* OverTheSpotConversion
+$B$=$N>lJQ49F~NO$r<B8=$9$k(B OverTheSpotConversion $B$N%j%=!<%9$K$O<!$N$h$&$J$b$N$,(B
+$B$"$j$^$9!#(B
+
++ autoSpotForwarding ($B%/%i%9(B AutoSpotForwarding)
+	$BJ8;zNs$r3NDj$7$?8e!"<+F0E*$K<!$N%F%-%9%H$NIA2h3+;OE@$r$=$NJ8;zNs$ND9(B
+	$B$5J,$:$i$9$+$I$&$+$r;XDj$7$^$9!#(Btrue $B$J$i$P<+F0E*$K$:$i$7!"(Bfalse$B$J$i(B
+	$B$P%/%i%$%"%s%H$+$iIA2h3+;OE@$NJQ99$rDLCN$5$l$J$$8B$jA0$HF1$8>l=j$+$i(B
+	$B=q$-;O$a$^$9!#%G%U%)%k%H$O(B false $B$G$9!#(B
+
++ modeLocation ($B%/%i%9(B ModeLocation)
+	$BF~NO%b!<%I$NI=<(0LCV$r;XDj$7$^$9!#%/%i%$%"%s%H$+$i0LCV$N;XDj$,$"$l$P(B
+	$B$=$l$K=>$$$^$9$,!"$J$1$l$P$3$N%j%=!<%9$K$h$C$F7h$a$i$l$^$9!#(B
+		TopLeft:	$B%/%i%$%"%s%H%&%#%s%I%&$N:8>e$KI=<((B
+		TopRight:	$B%/%i%$%"%s%H%&%#%s%I%&$N1&>e$KI=<((B
+		BottomLeft:	$B%/%i%$%"%s%H%&%#%s%I%&$N:82<$KI=<((B
+		BottomRight:	$B%/%i%$%"%s%H%&%#%s%I%&$N1&2<$KI=<((B
+		TrackText:	$BJQ49Cf$NJ8;zNs$ND>2<$KI=<((B
+	TrackText $B$r;XDj$7$?>l9g!"F~NO$K$D$l$F%b!<%I$NI=<(0LCV$b0\F0$7$^$9!#(B
+	$B%G%U%)%k%H$O(B BottomLeft $B$G$9!#(B
+
++ shrinkWindow ($B%/%i%9(B ShrinkWindow)
+	$B$=$N>lJQ49$O%/%i%$%"%s%H$N%&%#%s%I%&$N>e$KJQ49J8;zNs$N=q$+$l$?%&%#%s(B
+	$B%I%&$r$*$/$3$H$K$h$C$F<B8=$5$l$F$$$^$9!#EvA3$3$N%&%#%s%I%&$N2<$NFbMF(B
+	$B$O1#$l$F$7$^$$$^$9$+$i!"JQ49J8;zNs$ND9$5$K$h$C$F$3$N%&%#%s%I%&$NBg$-(B
+	$B$5$OJQ2=$5$;$kI,MW$,$"$j$^$9!#$3$N%j%=!<%9$,(B true $B$@$HJQ49J8;zNs$ND9(B
+	$B$5$,=L$`$H$=$l$K9g$o$;$F%&%#%s%I%&$b=L$`$h$&$K$J$j$^$9!#(Bfalse $B$@$H(B
+	$B%&%#%s%I%&$NBg$-$5$O?-$S$k$@$1$G=L$_$^$;$s!#(B
+	$B$I$&$7$F$3$N%j%=!<%9$,MQ0U$5$l$F$$$k$+$H$$$&$H!"(BX$B%5!<%P$K$h$C$F$O%&%#(B
+	$B%s%I%&$N%j%5%$%:$K;~4V$,$+$+$k$b$N$,$"$j!"?-$S$k$N$O$7$+$?$J$$$H$7$F(B
+	$B$b=L$`$N$O$d$a$?$$$H$$$&$3$H$+$i$G$9!#%G%U%)%k%H$O(B false $B$K$J$C$F$$(B
+	$B$^$9$,!"(BX$B%5!<%P$,FC$KCY$/$J$1$l$P(B true $B$K$7$?J}$,$h$$$H;W$o$l$^$9!#(B
+
++ ignoreStatusAreaSpec ($B%/%i%9(B IgnoreStatusAreaSpec)
+	$B%/%i%$%"%s%H$,%9%F!<%?%9I=<(NN0h$r;XDj$7$?>l9g!"DL>o$O$=$l$K$7$?$,$C(B
+	$B$FF~NO%b!<%I$O;XDj0LCV$KI=<($5$l$^$9!#$7$+$7$3$N%j%=!<%9$r(B true $B$K$9(B
+	$B$k$H$=$N;XDj$rL5;k$7!">o$K(B modeLocation $B$G;XDj$5$l$k0LCV$KI=<($5$l$k(B
+	$B$h$&$K$J$j$^$9!#(B
+
+
+* OffTheSpotConversion
+off-the-spot $B%?%$%W$NF~NO$r<B8=$9$k$N$,(B OffTheSpotConversion $B$G$9!#$3$l$OF1(B
+$B;~$K=>Mh$N(B kinput $B$N$h$&$J!"JL%&%#%s%I%&$K$h$kF~NO$r<B8=$9$k(B
+SeparateConversion $B$N%9!<%Q!<%/%i%9$G$b$"$j$^$9!#(BOffTheSpotConversion $B$N%j%=!<(B
+$B%9$K$O<!$N$h$&$J$b$N$,$"$j$^$9!#(B
+
++ leftMargin, rightMargin ($B$H$b$K%/%i%9(B Margin)
+	$BJQ49%F%-%9%H$N:81&$N%^!<%8%s$r;XDj$7$^$9!#%G%U%)%k%H$O$H$b$K(B 2 $B$G$9!#(B
+
+
+* SeparateConversion
+$BJL%&%#%s%I%&$K$h$kF~NO$r<B8=$9$k(B SeparateConversion $B$K$O%f!<%6$,@_Dj$G$-$k%j(B
+$B%=!<%9$O$"$j$^$;$s!#(B
+
+
+* ICLabel
+$BF~NO%b!<%II=<($KMQ$$$i$l$k(B ICLabel $B$N%j%=!<%9$K$O<!$N$h$&$J$b$N$,$"$j$^$9!#(B
+
++ horizontalSpacing ($B%/%i%9(B Spacing)
+	$BI=<(J8;zNs$N:81&$N%9%Z!<%9$r%T%/%;%kC10L$G;XDj$7$^$9!#%G%U%)%k%H$O(B 1
+	$B$G$9!#(B
+
++ verticalSpacing  ($B%/%i%9(B Spacing)
+	$BI=<(J8;zNs$N>e2<$N%9%Z!<%9$r%T%/%;%kC10L$G;XDj$7$^$9!#%G%U%)%k%H$O(B 1 
+	$B$G$9!#(B
+
++ justify ($B%/%i%9(B Justify)
+	$BDL>o$OI=<(J8;zNs$K9g$o$;$F%i%Y%k$NBg$-$5$,JQ2=$7$^$9$,!"%i%Y%k$NBg$-(B
+	$B$5$,8GDj$@$C$?;~$KJ8;zNs$r$I$N0LCV$K=q$/$+$r;XDj$7$^$9!#(B
+		left:	$B:8$h$;(B
+		center:	$BCf1{(B
+		right:	$B1&$h$;(B
+	$B>e2<$O>o$KCf1{$K=q$+$l$k$h$&$K$J$C$F$*$j!"%j%=!<%9$GJQ$($k$3$H$O$G$-(B
+	$B$^$;$s!#%G%U%)%k%H$O(B center $B$G$9!#(B
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/doc/sj3def	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,2449 @@
+$Id: sj3def,v 2.5 1998/07/21 08:51:27 ishisone Exp $
+
+[ $B$3$N%I%-%e%a%s%H$O(B kinput2 $B$GJQ49%7%9%F%`$K(B sj3 $B$r;HMQ$9$k;~$K;H$o$l$k(B   ]
+[ Sj3Object($B%/%i%9L>(B Sj3) $B$r;HMQ$7$?>l9g$N%m!<%^;z$+$JJQ49!"$=$NB>(B         ]
+[ $B3FA`:n%-!<$N%+%9%?%^%$%:$NJ}K!$K$D$$$F5-=R$7$F$$$^$9!#(B                   ]
+
+*** $BF~NOJ8;zJQ49$N@_Dj(B ***
+ 
+    $B$3$3$G$O(B kinput2 $B$NJQ49%*%V%8%'%/%H$N0l$D(B Sj3Object $B$,JQ49$K;HMQ$9$k(B
+    $B%-!<!&%P%$%s%I$r4^$`%f!<%6!&%$%s%?!<%U%'!<%9$dJQ49Dj5A%U%!%$%k(B
+    $B$N=q$-J}$K$D$$$F@bL@$7$^$9!#$G$-$l$P%G%U%)%k%H$NDj5A%U%!%$%k(B 
+    (/usr/lib/X11/sj3def/{sjrc,sjrk,sjhk,sjzh} $B$r8+$J$,$iFI$`$H$h$$$H(B
+    $B;W$$$^$9!#%G%U%)%k%H$G%$%s%9%H!<%k$5$l$k(B /usr/lib/X11/sj3def/sjrc
+    $B$O(B doc/defaultkeys$B!"(B $B$D$^$j(B CcWnn $B$N%f!<%6!&%$%s%?!<%U%'!<%9(B
+    $B$r%(%_%e%l!<%H$9$k$h$&$K$J$C$F$$$^$9!#(B
+    ($B!|(B $BJQ49%5!<%P$N;EMM>e!"BgJ8@a!?>.J8@aJQ49$O%5%]!<%H$7$F$$$^$;$s(B)
+
+    $B$^$?!":G8e$K(B Canna $B$H(B sjx $B$N%f!<%6!&%$%s%?!<%U%'!<%9$r(B
+    $B%(%_%e%l!<%H$9$kNc$r>R2p$7$F$"$j$^$9!#(B
+
+    $B3F9`$G$NCm0UE@$O!V!|!W$KB3$1$F5-=R$7$F$^$9!#(B
+
+<$BL\<!(B>
+    <1> Sj3Object $B$NFCD'(B
+    <2> Sj3Object $B$N%b!<%I(B
+    <3> $B3F%+%9%?%^%$%:MQ%U%!%$%k$N>l=j$H%U%)!<%^%C%H(B
+    <4> sjrc $B%U%!%$%k$K$h$k%f!<%6!&%$%s%?!<%U%'!<%9$N%+%9%?%$%^%$%:(B
+    <5> $BJQ49%5!<%P(B(sj3serv) $B$N%[%9%HL>$N7hDj(B
+    <6> $B<-=qEPO?!?Ku>C%b!<%I$NF0:n(B
+    <7> $BF~NOJ8;zJQ49$N35MW(B(sjrk$B!"(Bsjhk$B!"(Bsjzh $B%U%!%$%k$N%+%9%?%^%$%:(B)
+    <8> $B@)8B;v9`(B
+    <9> $B:#8e$N2]Bj(B
+    <10> $B%P%0$r8+$D$1$?$i!D(B
+    <$BIUO?(B1> Canna $B$N%f!<%6!&%$%s%?!<%U%'!<%9$r%(%_%e%l!<%H$9$kJ}K!(B
+    <$BIUO?(B2> sjx $B$N%f!<%6!&%$%s%?!<%U%'!<%9$r%(%_%e%l!<%H$9$kJ}K!(B
+
+<1> Sj3Object $B$NFCD'(B
+
+    1.  Sj3Object $B$G$O$+$J4A;zJQ49%5!<%P$K(B sj3serv (X11R5 $B$N(B contribute $B$K(B
+        $B4^$^$l$F$$$^$9(B) $B$r;HMQ$7$^$9!#JQ49%5!<%P$OK|0l$NJQ49%5!<%P%@%&%s;~(B
+        $B$N$?$a$K%;%+%s%I%5!<%P$,;XDj2DG=$G$9!#JQ49%5!<%P$N;XDj$K$D$$$F$O(B
+        $B$3$N%I%-%e%a%s%H$N(B <5> $B$r!":F@\B3$NJ}K!$K$D$$$F$O(B
+        <4>[1] $B$N(B recconect $B$N9`$r;2>H$7$F$/$@$5$$!#(B
+
+    2.  Sj3Object $B$G$OJQ49J8;zNsA`:n$K(B sj3lib $B$N>e0L%i%$%V%i%j(B Xsj3clib $B$r(B
+        $B;HMQ$7$^$9(B(lib/Xsj3clib/*)$B!#(B
+
+    3.  $B$+$J%-!<%\!<%I$G$J$$%-!<%\!<%I$G$b5?;wE*$J$+$J%m%C%/!&%-!<$N(B
+        $B%-!<!&%P%$%s%I!J(B<4>[1] $B$N(B kana $B$N9`;2>H!K$r@_Dj$9$k$3$H$K$h$C$F(B
+        $B$+$JF~NO$H$N%H%0%k$,2DG=$G$9!#(B
+
+    4.  $BF~NOJ8;zNs$N#5$D$NJQ49>uBV!J(B<2>$B$N(B[3]$B;2>H!K$K$h$C$F(B
+        $BF1$8%-!<!&%P%$%s%I$K0[$J$kJ8;zNsA`:n$N%U%!%s%/%7%g%s$r(B
+        $B3d$jIU$1$k$3$H$,$G$-!"J8;zF~NO$H%U%!%s%/%7%g%s$NF1;~<B9T$b2DG=$J$I(B
+        $B%H%i%s%9%l!<%7%g%s%F!<%V%kEy$r;HMQ$9$kJ}K!$h$j$b6/NO$J(B
+        $B%-!<!&%P%$%s%I$N%+%9%?%$%^%$%:$,2DG=$J$?$a!"(B
+        $B%-!<!&%P%$%s%I$N@aLs$K$b$J$j!"%&%#%s%I%&%^%M!<%8%cEy(B
+        $BB>$N%"%W%j%1!<%7%g%s$H$N%P%C%F%#%s%0$rMF0W$KHr$1$k$3$H$,$G$-$^$9!#(B
+
+    5.  $B$+$J4AJQ49$N%f!<%6!&%$%s%?!<%U%'!<%9$b%&%#%s%I%&!&%^%M!<%8%c(B
+        $BJB$K%+%9%?%^%$%:$G$-$k$h$&$K$9$Y$-$@$H$$$&%]%j%7!<$K=>$$!"(B
+        sjrc $B%U%!%$%k$r;HMQ$7$?%+%9%?%$%^%$%:$,Hs>o$K9-HO0O$KEO$C$F(B
+        $B9T$&$3$H$,$G$-$k$h$&$K$7$^$7$?!#%f!<%6!&%$%s%?!<%U%'!<%9$K(B
+        $B$D$$$F$O(B CcWnn$B!"(Bsjx$B!"(BCanna $BEyB?$/$N$+$J4A;zJQ49%7%9%F%`$N(B
+        $BJ8;zNsA`:n$r%(%_%e%l!<%H$9$k$3$H$,2DG=$G$9!#(B
+        $B$b$A$m$s<+J,9%$_$N%f!<%6!&%$%s%?!<%U%'!<%9$K(B
+        $B%A%e!<%s%"%C%W$7$F;HMQ$9$k$3$H$b2DG=$G$9!#(B
+
+    6.  $B%j%=!<%9!?%-!<!&%P%$%s%I5-=R%U%!%$%k(B sjrc $B$d(B
+        $B%m!<%^$+$JJQ495,B'5-=R%U%!%$%k(B sjrk $B$N5-=RJ}K!$O(B sjx $B$d(B
+        sj3 $B%3%^%s%I$H$N>e0L8_49@-$r0];}$7$F$$$^$9!#(B
+        $B$^$?!"%U%!%s%/%7%g%sL>$K$D$$$F$O(B
+        CcWnn $B$H$b$J$k$Y$/F10l$K$J$k$h$&$K$7$F$"$j$^$9!#(B
+        sjrc $B%U%!%$%k$N7A<0$K$D$$$F$O$3$N%I%-%e%a%s%H$N(B <3> $B$r!"(B
+        $B<B:]$N%+%9%?%$%^%$%:J}K!$K$D$$$F$O(B <4> $B$r;2>H$7$F$/$@$5$$!#(B
+
+    7.  $B%3!<%IF~NO$G$O(B Shift-JIS$B!"F|K\8l(BEUC$B!"(BJIS$B!"6hE@%3!<%I(B
+        $B$N#4<oN`!"J8;z<o$G$O!"$R$i$,$J!"A43Q%+%?%+%J!"H>3Q%+%?%+%J!"(B
+        $BA43Q%"%k%U%!%Y%C%H!"H>3Q%"%k%U%!%Y%C%H$N#5<oN`$NJ8;z<o$G$N(B
+        $BF~NO!"99$KH>3Q!?A43Q!"1Q>.J8;z!?1QBgJ8;z$r2C$($?J8;z<o$N4V$G(B
+        $BA4J}8~Aj8_JQ49$,2DG=$K$J$C$F$$$^$9!#(BShift-JIS$B!"F|K\8l(BEUC$B!"(BJIS
+        $B$O(B16$B?J%3!<%I!"6hE@%3!<%I$O(B10$B?J%3!<%I$GF~NO$7$^$9(B
+        $BIT@5$J%3!<%I$d$=$N%3!<%IBN7O$KB8:_$7$J$$%3!<%I$N>l9g$O(B
+        $B%(%i!<$K$J$j$^$9!#(B
+
+    8.  $B%+%9%?%$%^%$%:J}K!$,H=$j$d$9$$$h$&$K%m!<%^;z!?$+$JJQ49(B(sjrk)$B!"(B
+        $BH>3Q!?A43QJQ49(B(sjzh)$B$d$R$i$,$J!?%+%?%+%JJQ49(B(sjhk)$B$NJQ495,B'$N(B
+        $B%+%9%?%^%$%:%U%!%$%k$O$=$l$>$lJL$K$7$^$7$?!#BgJ8;z!?>.J8;zJQ49(B
+        $B0J30$O$3$l$i$N%+%9%?%^%$%:$K$h$C$FI}$N9-$$%+%9%?%$%^%$%:$,2DG=$G$9!#(B
+        $B$3$l$i$N%U%!%$%k$N7A<0$K$D$$$F$O$3$N%I%-%e%a%s%H$N(B <3> $B$r!"(B
+        $B<B:]$N%+%9%?%$%^%$%:$N8z2L$K$D$$$F$O(B <7> $B$r;2>H$7$F$/$@$5$$!#(B
+
+    9.  $BF~NO8e!?$+$J4A;zJQ498e$NJ8;zNs$NJT=8J}K!$O(B CcWnn $B$N%f!<%6(B
+        $B%$%s%?!<%U%'!<%9$r:NMQ$7$F$$$^$9!#!J$3$N$?$a(B sjx $B$d(B Canna $B$N(B
+        $BF0:n$N%(%_%e%l!<%HMQ$N(B sjrc $B$r;HMQ$7$F$bJT=8J}K!$O(B
+        CcWnn $B$HF1MM$K$J$j$^$9!K(B
+
+    10. $BD>A0$K3NDj$7$?J8;zNs$r:FEY8F$S=P$95!G=!J(Bsj2/sj3/sjx $B$N5!G=(B
+        :<4>[1] $B$N(B saihenkan $B$N9`;2>H!K$,$"$j!"F1MM$NJQ49$r2?EY$b(B
+        $B9T$&:]$KJXMx$G$9!#(B
+
+    11. $B3F<o$N@_Dj%U%!%$%k$N%3!<%I$O(B Shift-JIS/$BF|K\8l(BEUC/
+        8bit-JIS/7bit-JIS $B$NCf$+$i%f!<%6$N4D6-$KBP1~$7$FA*Br$G$-$^$9!#(B
+
+<2> Sj3Object $B$N%b!<%I(B
+
+    $B%b!<%I$N35G0$K$O0J2<$N#3<oN`9M$($i$l$^$9!#(B
+
+    [1] $BF~NO%b!<%I(B
+        $BF~NO$9$kJ}K!$K$h$C$F6hJL$9$kJ}K!$G(B Sj3Object $B$G$O(B
+
+            1. $B%m!<%^;zF~NO(B
+            2. $B$+$JF~NO(B
+            3. $B%3!<%IF~NO(B
+            4. $B5-9fA*BrF~NO(B
+
+        $B$N#4$D$N6hJL$,$G$-$^$9!#(BSj3Object $B$G$O$3$l$r!VF~NO%b!<%I!W$H(B
+        $B8F$V$3$H$K$7$^$9!#$+$JF~NO$ODL>o(B JIS $B%-!<%\!<%I$N$h$&$J(B
+        $B$+$JG[Ns$N%-!<%\!<%I$G2DG=$G$9$,!"(BSj3Object $B$G$O(B
+        $B$+$J%m%C%/%-!<$N$J$$$h$&$J%-!<%\!<%I$G$b5?;wE*$J(B
+        $B$+$J%m%C%/%-!<MQ$N%-!<!&%P%$%s%I$r;XDj$7$F%m!<%^;zF~NO$H(B
+        $B$+$JF~NO$NN>J}$rF1;~$K<B8=$9$k$h$&$JJ}K!$rDs6!$7$F$$$^$9!#(B
+
+        $B%3!<%IF~NO$OJ8;z$I$*$j#1#6?J$N%3!<%I$K$h$C$FF~NO$9$kJ}K!$G!"(B
+        Shift-JIS$B!"F|K\8l(BEUC$B!"(BJIS$B!"6gE@%3!<%I$N#4<oN`$N%3!<%I$G$N(B
+        $BF~NO$,2DG=$G$9!#5-9fA*BrF~NO$OA*Br%Q%M%k$+$iF~NO$9$k(B
+        $B5-9f$rA*Br$9$kF~NOJ}K!$G$9!#(B
+
+    [2] $BJ8;z<o%b!<%I(B
+        $BF~NO$5$l$?7k2LI=<($5$l$kJ8;z<o$K$h$C$F6hJL$9$kJ}K!$G!"(BSj3Object $B$G$O(B
+
+            1.  $B$R$i$,$J!JA43Q%+%?%+%J!K(B
+            2.  $BA43Q%+%?%+%J(B
+            3.  $BH>3Q%+%?%+%J(B
+            4.  $BA43Q%"%k%U%!%Y%C%H(B
+            5.  $BH>3Q%"%k%U%!%Y%C%H(B
+
+        $B$N#5$D$N6hJL$,$G$-$^$9!#(BSj3Object $B$G$O$3$l$r!VJ8;z<o%b!<%I!W$H(B
+        $B8F$V$3$H$K$7$^$9!#J8;z<o$N%b!<%II=<($,!V$R$i$,$J%b!<%I!W$N;~$O(B
+        sjrk $B%U%!%$%k$N5-=RJ}K!!J8e=R!K$K$h$C$F$OA43Q%+%?%+%J$G$N(B
+        $BF~NO$b2DG=$G$9!#J8;z<o$O87L)$K$OF~NOJ8;z<o$HI=<(J8;z<o$K(B
+        $BJ,$1$k$3$H$,$G$-$^$9!#(B
+
+        $BF~NOJ8;z<o$O%-!<%\!<%I$+$iD>@\F~NO$9$kJ8;z<o$N$3$H$G(B
+        $B%b!<%II=<($b$3$NJQ2=$KBP1~$7$FJQ99$5$l$^$9!#(B
+        $B0lJ}I=<(J8;z<o$O%+%l%s%H!JH?E>$7$F$$$k(B or $B%+!<%=%k$N$"$k!K(B
+        $BJ8@a$NI=<($5$l$F$$$kJ8;z<o$N$3$H$G!"I=<(J8;z<o$OF~NO8e(B
+        $BAj8_$KJQ49$G$-$^$9!#(BSj3Object $B$G$OF~NOJ8;z<o$H$7$F;HMQ$G$-$k(B
+        $B>e5-$N#5$D$NJ8;z<o$NB>$K0J2<$NI=<(J8;z<o$rAj8_JQ49$G$-$^$9!#(B
+
+            6.  $BA43Q%b!<%I(B
+            7.  $BH>3Q%b!<%I(B
+            8.  $BBgJ8;z%"%k%U%!%Y%C%H%b!<%I(B
+            9.  $B>.J8;z%"%k%U%!%Y%C%H%b!<%I(B
+
+        $B!|F~NOJ8;z<o$,JQ99$5$l$?>l9g$O%b!<%II=<($,JQ$o$j$^$9$,!"(B
+            $BI=<(J8;z<o$,JQ99$5$l$?>l9g$O%b!<%II=<($OJQ$o$j$^$;$s!#(B
+        $B!|F~NOJ8;z<o$,>e5-$N(B 4. $BA43Q%"%k%U%!%Y%C%H!"(B5. $BH>3Q%"%k%U%!%Y%C%H$N(B
+            $B;~$O$+$JF~NO$O$G$-$^$;$s!#(B
+        $B!|%3!<%IF~NO!?5-9fA*BrF~NO$K$h$C$FF~NO$5$l$?>l9g!"I=<(J8;z<o$O(B
+            $B$R$i$,$J$H$_$J$5$l$^$9!#(B
+
+    [3] $BJQ49%b!<%I(B
+        $BJQ49Cf$NJ8;zNs$N>uBV$K$h$C$F6hJL$9$kJ}K!$G!"(BSj3Object $B$G$O(B
+
+            1.  NoInputMode $BF~NOJ8;z$,B8:_$7$J$$>uBV(B
+            2.  InputMode   $B%+%l%s%HJ8@a$,L$JQ49$N>uBV(B
+            3.  ConvedMode  $B%+%l%s%HJ8@a$,$+$J4A;zJQ498e$N>uBV(B
+            4.  SelectMode  $BJQ498uJd0lMwA*BrCf$d5-9f!?IJ;lA*BrCf$N>uBV(B
+            5.  DictMode    $B<-=qEPO?!"<-=qEPO?Ku>CCf$N>uBV(B
+
+        $B$N#5$D$N6hJL$,$G$-$^$9!#(BSj3Object $B$G$O$3$l$r!VJQ49%b!<%I!W(B
+        $B$H8F$V$3$H$K$7$^$9!#$=$l$>$l(B NoInputMode $B$H(B InputMode $B$O(B CcWnn
+        $B$G$N(B[$BL$JQ49(B]$B!"(BConvedMode $B$O(B CcWnn $B$G$N(B[$BJQ49:Q(B]$B!"(BSelectMode $B$O(B
+        [$B8uJdA*Br(B] $B$H(B [$B5-9fF~NO(B] $B$KBP1~$9$k$H9M$($l$PNI$$$G$7$g$&!#(B
+
+        InputMode $B$N!VL$JQ49$N>uBV!W$H$$$&$N$H!"!VJ8;zF~NO$,2DG=$J(B
+        $B>uBV!W$H$$$&$N$O0[$J$k$N$GCm0U$,I,MW$G$9!#(B
+
+        NoInputMode $B$+$iJ8;zF~NO$K$h$C$F(B InputMode $B$K$J$k>l9g$O(B
+        $B>o$K!VJ8;zF~NO$,2DG=$J>uBV!W$G$9$,!"0lEY$+$J4A;zJQ49(B
+        $B$7$?8e$N3FJ8@a$O%+%l%s%HJ8@a$N$H$-J8@aA4BN$,(B
+        $BH?E>$7$FJ8;zF~NO$G$-$J$$>uBV$K$J$j$^$9!#(B
+
+        $BNc$($P!"J8;zNs0l3gJQ498e$K8e=R$NJ8;zNsA`:n(B
+        $B%U%!%s%/%7%g%s$N(B unconvert(muhen) $B$r(B
+        $B8F$S=P$7$?;~$K$O!VL$JQ49$N>uBV!W(B(InputMode) $B$K$O(B
+        $B$K$J$j$^$9$,!"8e=R$N%j%=!<%9(B .MoveBySegment $B$,(B on.on $B$G(B
+        InputMode $B$G$N0\F0C10L$,J8@aC10L$G$"$C$?$j$9$k>l9g!"(B
+        $B%+%l%s%HJ8@a$OH?E>$7$?$^$^$G!VJ8;zF~NO$,2DG=$J>uBV!W(B
+        $B$K$O$J$j$^$;$s!#(B
+
+        $B$3$N$h$&$J>l9g!"%U%!%s%/%7%g%s$N(B edit $B$r8F$S=P$9$+!"(B
+        .FlushInConversion $B$d(B .FlushSelectConversion $B$G(B "edit"
+        $B$r;XDj$7!"%+%l%s%HJ8@a$NH?E>>uBV$r2r=|$9$kI,MW$,$"$j$^$9!#(B
+
+        $B$?$@$7!"(B.MoveBySegment $B$,(B off.on $B$d(B off.off $B$G(B
+        InputMode $B$G$N0\F0C10L$,J8;zC10L$N$H$-$O(B  unconvert(muhen)
+        $B$G$bH?E>>uBV$r2r=|$7!VJ8;zF~NO$,2DG=$J>uBV!W(B
+        $B$K$J$j$^$9!#(B
+
+<3> $B3F%+%9%?%^%$%:MQ%U%!%$%k$N>l=j$H%U%)!<%^%C%H(B
+
+    Xsj3clib $B$N%+%9%?%^%$%:MQ$K$O0J2<$N#5<oN`$N%U%!%$%k$,(B
+    $BMQ0U$5$l$F$$$^$9!#(B
+
+    [1] sjrk  $B%m!<%^;z$+$JJQ49%+%9%?%^%$%:MQ(B
+    [2] sjhk  $B$R$i$,$J!?%+%?%+%JJQ49%+%9%?%^%$%:MQ(B
+    [3] sjzh  $BH>3Q!?A43QJQ49%+%9%?%^%$%:MQ(B
+    [4] sjsb  $B5-9fA*Br0lMwI=<($N%+%9%?%^%$%:MQ(B
+    [5] sjrc  $BJ8@a!?JQ49A`:n$N%-!<!&%P%$%s%I5Z$S$=$NB>(B
+              $B%f!<%6!&%$%s%?!<%U%'!<%9%+%9%?%^%$%:MQ(B
+
+    $B0J2<$=$l$>$l$N%+%9%?%^%$%:MQ%U%!%$%k$K$D$$$F@bL@$7$^$9!#(B
+    $B3F%U%!%$%k$KB?%P%$%HJ8;z$r5-=R$9$k%(%s%H%j$,$"$k>l9g!"(B
+    locale $B$N(B LC_CTYPE $B$,(B "ja_JP.SJIS" $B$d(B "js_JP.mscode" $B$N>l9g(B
+    Shift-JIS $B$H$7$F!"(B"ja_JP.jis8" $B$N>l9g$O(B 8bit-JIS $B$H$7$F!"(B
+    "ja_JP.jis7" $B$N>l9g$OH>3Q%+%?%+%J$r(B SO/SI $B$G;X<($9$k(B 7bit-JIS
+    $B$H$$$F!"$=$l0J30$N$H$-$O(B EUC $B$H$7$FFI$_9~$_$^$9!#(B
+
+    LC_CTYPE $B$,(B "ja_JP.SJIS/js_JP.mscode" $B$G$J$/!"(BShift-JIS $B$H$7$F(B
+    $BFI$_9~$_$?$$$H$-!"(B"ja_JP.jis8" $B$G$J$/!"(B 8bit-JIS $B$H$7$F(B
+    $BFI$_9~$_$?$$$H$-!"(B"ja_JP.jis7" $B$G$J$/!"(B 7bit-JIS $B$H$7$F(B
+    $BFI$_9~$_$?$$$H$-$O!"$=$l$>$l(B include/Xsj3clib.h $B$G(B
+    FORCE_SJIS/FORCE_JIS8/FORCE_JIS7 $B$r(B define $B$7$F%3%s%Q%$%k(B
+    $B$9$l$PI,$:$=$l$>$l$N%3!<%I$H$7$F$H$7$FFI$_9~$^$l$^$9!#(B
+
+    $B$^$?!"3F%U%!%$%k$N%5!<%A$5$l$kM%@h=g0L$O0J2<$N$h$&$K$J$j$^$9!#(B
+    sjrc $B%U%!%$%k0J30$O(B kinput2 $B5/F0;~$K$N$_$KFI$_9~$^$l$^$9!#(B
+
+        (1) $B%*%W%7%g%s(B -{rk,hk,zh,sb,rc}file $B$KB3$/%U%!%$%kL>(B
+        (2) $B%j%=!<%9%U%!%$%k(B($B%j%=!<%9%U%!%$%k$N%5!<%A=g$O(B Xtoolkit $B$N(B
+            $B%^%K%e%"%k$r8+$F$/$@$5$$(B)$B$G(B *Sj3.{rk,hk,zh,sb,rc}file $B$K(B
+            $B;XDj$5$l$k%U%!%$%k(B
+        (3) $B4D6-JQ?t(B SJ{RK,HK,ZH,SB,RC} $B$K;XDj$5$l$k%U%!%$%k(B
+        (4) $B%[!<%`%G%#%l%/%H%j$ND>2<$N(B .sj{rk,hk,zh,sb,rc} $B$H$$$&(B
+            $BL>>N$N%U%!%$%k(B
+        (5) /usr/lib/X11/sj3def $B$N2<$N(B sj{rk,hk,zh,sb,rc} $B$H$$$&(B
+            $BL>>N$N%U%!%$%k(B
+
+    $B$?$@$7!"%j%=!<%9%U%!%$%k$d%*%W%7%g%s$K;XDj$7$?>l9g$O!"(B
+    $B;XDj$5$l$?%U%!%$%k$,B8:_$7$J$$$H%(%i!<$G=*N;$7$^$9!#(B
+
+    $B3F%U%!%$%kCf$N3F%(%s%H%j$N6h@Z$j$O?eJ?%?%V%3!<%I(B(0x09)$B$+(B
+    space(0x20) $B$K$J$j$^$9!#$=$l$>$l$N%(%s%H%jCf$K(B space(0x20)$B!"(B
+    '\'(0x5c)$B!"(B'#'(0x23) '.'(0x2e) $B$r4^$`>l9g$O(B '\'
+    $B$G%(%9%1!<%W$9$kI,MW$,$"$j$^$9!#(B
+    $B3F%U%!%$%k$K(B '#' $B$,4^$^$l$k>l9g!"$=$N9T$N0J9_$N5-=R$O(B
+    $B%3%a%s%H$H$_$J$5$l$^$9!#(B
+
+    $BDL>o%+%9%?%$%^%$%:$KIQHK$K;HMQ$5$l$k$N$O(B sjrc $B%U%!%$%k$@$1(B
+    $B$G$7$g$&!#$$$m$$$m$J$+$J4A;zJQ49%7%9%F%`$N%f!<%6!&%$%s%?!<%U%'!<%9$r(B
+    $B%(%_%e%l!<%H$9$k:]$b(B sjrc $B%U%!%$%k$N%+%9%?%$%^%$%:$@$1$G:Q$`>l9g$,(B
+    $BB?$$$H;W$$$^$9!#(B
+
+    $B0J2<$K$=$l$>$l$N%U%!%$%k$N%(%s%H%j$N5-=RJ}K!$K$D$$$F@bL@$7$^$9!#(B
+
+    [1] sjrk    $B%m!<%^;z!?$+$JJQ49%+%9%?%^%$%:MQ(B
+
+        $B3F9T$K$O0J2<$N#3$D$N%(%s%H%j$r5-=R$7$^$9!#(B
+
+        [in_roma] [out_kana] [out_roma]
+
+        [in_roma]  $B%m!<%^;zF~NO;~$NJQ4985$N%m!<%^;z!J(BASCII $B%-%c%i%/%?%;%C%H(B
+                $B$N$&$A(B 0x00$B!A(B0x1f $B$H(B 0x7f $B$r=|$$$?J8;z!K$r;XDj$7$^$9!#(B
+        [out_kana] $BJQ49;~$NA43QJ8;zNs$r;XDj$7$^$9!#(B
+        [out_roma] $BJQ498e$KJQ49%P%C%U%!$K;D$7!"<!$NF~NOJ8;z$H9g$o$;$F(B
+                $BJQ49$K;HMQ$7$?$$J8;zNs$r;XDj$7$^$9!#;XDj$G$-$kJ8;z$O(B
+                [in_romaji]$B$N%(%s%H%j$HF1MM$G$9!#$^$?!"$3$N%(%s%H%j$O(B
+                $B>JN,2DG=$G$9!#(B
+
+        <$BNc(B>
+         kya             $B$-$c(B
+    
+        $B>e5-$NNc$O!V(Bkya$B!W$HF~NO$7$?$H$-$K!V$-$c!W$KJQ49$5$l$k5,B'$r(B
+        $B5-=R$7$?Nc$G$9!#(B
+
+    [2] sjhk    $B$R$i$,$J!?%+%?%+%JJQ49%+%9%?%^%$%:MQ(B
+
+        $B3F9T$K$O0J2<$N#4$D$N%(%s%H%j$r5-=R$7$^$9!#(B
+
+        [zhira] [zkata] [hkata] [ascii]
+
+        [zhira] $BA43Q$R$i$,$J$r#1J8;z;XDj$7$^$9(B
+        [zkata] $BBP1~$9$kA43Q%+%?%+%J$r#1J8;z;XDj$7$^$9(B
+        [hkata] $BBP1~$9$kH>3Q%+%?%+%J(B($B#2J8;z0JFb(B)$B$r5-=R$7$^$9!#(B
+        [ascii] $B$+$J%-!<%\!<%I$G$J$$%-!<%\!<%I$G$+$JF~NO$r2DG=$K$9$k$?$a(B
+                $B$N%(%s%H%j$G$9!#$+$J%-!<%\!<%I$GBP1~$9$k%-!<$N(B
+                $B%"%9%-!<J8;z$rH>3Q$G;XDj$7$^$9!#(B
+
+        <$BNc(B>
+         $B$.(B              $B%.(B              $B%-!+(B             g[
+                                         $B",(B($BK\Ev$OH>3Q(B)
+                                        SJIS/JIS8: 0xb7,0xde
+                                        EUC:  0x8e,0xb7,0x8e,0xde
+        $B>e5-$NNc$O%b!<%IJQ49$G!V$.!W$rA43Q%+%?%+%J$KJQ49$7$?$H$-$O!V%.!W(B
+        $B$K!"H>3Q%+%?%+%J$KJQ49$7$?$H$-$O!V%-!+!W$KJQ49$7!"(B
+        $B$+$JF~NO$G$O!V%-!+!W$HF~NO$7$?>l9g$^$?$O5?;wE*$J(B
+        $B2>L>%m%C%/$N>uBV$G!V(Bg[$B!W$HF~NO$7$?$H$-$K!V$.!W$KJQ49$9$k(B
+        $B5,B'$r5-=R$7$?Nc$G$9!#(B
+
+    [3] sjzh    $BH>3QA43QJQ49%+%9%?%^%$%:MQ(B
+
+        $B3F9T$K$O0J2<$N#4$D$N%(%s%H%j$r5-=R$7$^$9!#(B
+    
+        [halpha] [zalpha] [zkana] [hkana]
+
+        [halpha] $BH>3Q%"%9%-!<J8;z$r#1J8;z;XDj$7$^$9(B
+                $B!JHs%"%9%-!<J8;z$H$7$FH>3QByE@(B(0xde)$B!?H>ByE@(B(0xdf)
+                $B$ONc30$H$7$FG'$a$i$l$k!K(B    
+        [zalpha] $BBP1~$9$kA43Q%"%9%-!<J8;z$r#1J8;z;XDj$7$^$9(B
+        [zkana] $BBP1~$9$kA43Q$+$J$r#1J8;z;XDj$7$^$9(B
+        [hkana] $BBP1~$9$kH>3Q%+%?%+%J$r#1J8;z;XDj$7$^$9(B
+
+        <$BNc(B>
+         [               $B!N(B              $B!V(B              $B!V(B
+                                                          $B",(B($BK\Ev$OH>3Q(B)
+                                                        SJIS/JIS8: 0xa2
+                                                        EUC:  0x8e,0xa2
+        $B>e5-$NNc$O%b!<%IJQ49$G(B "$B!V(B" $B$rH>3Q%"%k%U%!%Y%C%H$KJQ49$7$?$H$-$O(B
+        "[" $B$K!"A43QH>3Q%"%k%U%!%Y%C%H$KJQ49$7$?$H$-$O(B "$B!N(B" $B$K!"(B
+        $BH>3Q%+%?%+%J$KJQ49$7$?$H$-$O(B "$B!V(B" $B$KJQ49$9$k5,B'$r(B
+        $B5-=R$7$?Nc$G$9!#(B
+
+    [4] sjsb    $B5-9fA*Br0lMwI=<($N%+%9%?%^%$%:MQ(B
+
+        $B3F9T$K$O$?$@#1$D$N%(%s%H%j$r5-=R$7$^$9!#(B
+
+        [data]  $B5-9fA*Br;~$KI=<($7$?$$A43QJ8;z$r#1J8;z;XDj$7$^$9(B
+
+        <$BNc(B>
+        $B!z(B
+
+        $B>e5-$NNc$O5-9fA*Br$r3+;O$9$k%-!<(B
+        (sjrc $B$G(B "ki2key.symbol" $B$K%P%$%s%I$5$F$$$k%-!<(B($B8e=R(B))$B$G(B
+        $B5-9fA*BrI=<($r$7$?$H$-$K!V!z!W$rI=<($9$kNc$G$9!#(B
+
+    [5] sjrc  $BJ8@a!?JQ49A`:n$N%-!<!&%P%$%s%I5Z$S$=$NB>(B
+              $B%f!<%6!&%$%s%?!<%U%'!<%9$N%+%9%?%^%$%:MQ(B
+
+        $B3F9T$K$O0J2<$N#2$D!J0J>e!K$N%(%s%H%j$r5-=R$7$^$9!#(B
+
+        [key0].[key1] [value0] [value1] [value2]$B!D!D!D!D(B
+
+        [key?]  $B%+%9%?%^%$%:$7$?$$MWAG(B(keyword)$B$r;XDj$7$^$9!#(B
+                $B:G=i$N(B keyword $B$KB3$1$F!V(B.$B!W(B(0x2e)$B$G6h@Z$C$FBh#2$N(B
+                keyword $B$r;XDj$G$-$^$9!#$3$N%(%s%H%j$O$9$Y$F(B
+                $B%3%s%H%m!<%k%3!<%I$r=|$/H>3Q(B ASCII $BJ8;z$G5-=R$5$l$F(B
+                $B$$$kI,MW$,$"$j$^$9!#(B
+        [value?] $B%+%9%?%^%$%:FbMF(B(value)$B$r;XDj$7$^$9!#:G=i$N(B
+                value $B$KB3$1$F!V(B.$B!W(B(0x2e)$B$d(B space$B!"(Btab $B$G6h@Z$C$F(B
+                $B:GBg(B 10$B8D$^$G;XDj$G$-$^$9!#(B
+
+        <$BNc(B>
+        .guide.hiragana            $B%m!<%^(B
+
+        $B>e5-$NNc$OF~NOJ8;z<o$,$R$i$,$J$N$H$-$K%b!<%II=<(J8;zNs$r(B
+        $B!V%m!<%^!W$K$9$kNc$G$9!#(B
+
+        $B>e5-$NNc$OF~NOJ8;z<o$,$R$i$,$J$N$H$-$K%b!<%II=<(J8;zNs$r(B
+        $B!V%m!<%^!W$K$9$kNc$G$9!#(B
+
+        $B3F(B keyword $B%(%s%H%j$K;XDj$G$-$k(B keyword $B$H(B
+        $BBP1~$7$F;XDj$G$-$k(B value $B$K$D$$$F$O8e=R$7$^$9!#(B
+        $BF10l$N;XDj$,J#?t$"$k>l9g$d(B inlude key (<4>[3] 51. $B;2>H(B)
+        $B$K$h$C$F%M%9%H$r9T$C$?>l9g$O8e$K;XDj$5$l$?$b$N$,M-8z$K$J$j$^$9!#(B
+
+<4> sjrc $B%U%!%$%k$K$h$k%f!<%6!&%$%s%?!<%U%'!<%9$N%+%9%?%$%^%$%:(B
+
+    [1] $BJQ49A`:n$N%-!<!&%P%$%s%I%+%9%?%^%$%:J}K!(B
+    
+    Xsj3clib $B$N3FJQ49A`:n!"J8;zNs!?J8@aA`:n$KBP1~$9$k%-!<!&%P%$%s%I(B
+    $B$N$O%+%9%?%$%^%$%:$O(B sjrc $B%U%!%$%k$G9T$$$^$9!#(B
+    X $B$N%j%=!<%9%U%!%$%k$K=q$$$F(B Xt $B$N%H%i%s%9%l!<%7%g%s%F!<%V%k$r(B
+    $BJQ99$9$kJ}K!$G$O!"JQ49%b!<%I$N>uBV$K$h$C$F0[$J$k%U%!%s%/%7%g%s$r(B
+    $BF1$8%-!<!&%P%$%s%I$K%P%$%s%I$9$k$3$H$,$G$-$J$$!"(BXsj3clib $B$,(B Xlib 
+    $B$@$1$G;HMQ$G$-$J$/$J$k!"(Bsj2/sj3/sjx $B$H$N8_49@-Ey!9$NLdBj$,$"$k$?$a(B
+    sjrc $B%U%!%$%k$r;HMQ$9$kJ}K!$K$7$^$7$?!#(B
+    sj2/sj3/sjx $B$N%-!<!&%P%$%s%IJ}K!$H$N8_49@-$G$O%(%9%1!<%W%7!<%1%s%9(B
+    $B$r;HMQ$9$kJ}K!0J30$H$O>e0L8_49@-$r0];}$7$F$$$^$9!#(B
+    
+    Xsj3clib $B$r;HMQ$7$?(B kinput2 $B$N(B sj3 $BHG$G$O(B sj2/sj3/sjx $B$H$O0[$J$k(B
+    $B%-!<!&%P%$%s%IJ}K!$G%+%9%?%$%^%$%:5!G=$,HtLvE*$K8~>e$7$F$$$^$9!#(B
+    format $B$O0J2<$N$h$&$K#4$D$N%(%s%H%j(B(2 keyword + 3 value)$B$+$i$J$j!"(B
+    $B:G8e$N(B [InputSame] $B$N%U%#!<%k%I$O>JN,2DG=$G$9!#(B
+
+    .ki2key.[$B%U%!%s%/%7%g%sL>(B] [$BJQ49(B Mode/Modifier] [KeySym] [InputSame]
+
+        (1) $B#2HVL\$N(B keyword[$B%U%!%s%/%7%g%sL>(B] $B$N%U%#!<%k%I$N;XDj(B
+
+        $B%U%!%s%/%7%g%sL>$K$O(B[$BJQ49(B Mode/Modifier]$B$N%U%#!<%k%I$G;XDj$9$k(B
+        $BF~NO$5$l$k%-!<!&%P%$%s%I$HCmL\$7$F$$$k(B($B%+%l%s%H(B)$BJ8@a$N(B
+        $BJQ49%b!<%I$NAH9g$;$K$*$$$F8F$S=P$5$l$k%U%!%s%/%7%g%s(B($BA`:n(B)
+        $B$r;XDj$7$^$9!#!J%+%l%s%HJ8@a$H$OH?E>$7$F$$$k!"$b$7$/$O8=:_%F%-%9%H(B
+        $B%+!<%=%k$N$"$kJ8@a$r;X$7$^$9!#!K(B
+
+        $B;XDj$G$-$k%U%!%s%/%7%g%s$H$=$l$N3FJQ49%b!<%I$G$NF0:n$O(B
+        $B0J2<$K@bL@$9$k$H$*$j$G$9!#(Bsource $BCf$N(B lib/Xsj3lib/func.c
+        $B$N%3%a%s%H$b;29M$K$9$k$H$h$$$G$7$g$&!#(B
+
+------------------------------------------------------------------------------
+henkan  [InputMode] $BF~NO%P%C%U%!$NJ8;zNs$r0l3gJQ49$7!"(BConvedMode $B$K$7$^$9(B
+        [ConvedMode] $B%+%l%s%HJQ498uJd$N0lMw$rI=<($7$F!"(BSelectMode $B$K$7$^$9(B
+        [NoInputMode/SelectMode/DictMode] $B%(%i!<$G$"$k$3$H$r(B
+            $BL@<($9$k$?$a%Y%k$rLD$i$7$^$9(B
+        $B!|(B [InputMode] $B$N;~$KJQ49$5$l$kJ8@a$O8e=R$N(B .HenkanSegment $B$N(B
+            $B;XDj$G7h$^$j$^$9(B
+        $B!|(B [InputMode] $B$N;~$KJQ498e$KCmL\$9$kJ8@a$O8e=R$N(B
+            .BeginConversionLast $B$N;XDj$G7h$^$j$^$9(B
+        $B!|(B [InputMode] $B$N;~$K%+%l%s%H$NJ8@aCf$K$R$i$,$J0J30$NJ8;z<o$,(B
+            $B$"$C$?$H$-$K<+F0E*$K$R$i$,$J$KJQ49$7$F$+$i$+$J4A;zJQ49$9$k$+(B
+            $B$I$&$+$O8e=R$N(B .BeforeConversion $B$N;XDj$G$-$^$j$^$9!#(B
+        $B!|%+%l%s%H$NJ8@a$N:G8e$NJ8;z$,%m!<%^$+$JJQ49%F!<%V%k$KF1$8FI$_$K(B
+            $BBP$7$FJ#?t$N%m!<%^;z$,EPO?$5$l$F$$$k$h$&$JJ8;z$N>l9g!"(B
+            $B%+%l%s%HJ8@a$NJ8;z<o$KJQ49$7$F$+$i$+$J4A;zJQ49$9$k$+$O8e=R$N(B
+            .LastDoubleConversion $B$N;XDj$G(B $B$-$^$j$^$9!#(B
+        $B!|(B [ConvedMode] $B$N;~$K8uJdA*Br$r;O$a$kA0$K%+%l%s%HJ8@a$r<!8uJd$G(B
+            $BCV$-49$($kF0:n(B(next/wrap $B$HF1$8(B)$B$r$9$k2s?t$O8e=R$N(B
+            .BeforeSelectCount $B$N;XDj$G7h$^$j$^$9!#(B
+        $B!|(B [ConvedMode] $B$N;~$K8uJdA*Br$r;O$a$kA0$K%+%l%s%HJ8@a$NJ8;z<o$,(B
+            $B$R$i$,$J$G$J$$$H$-$K$R$i$,$J$KJQ49$7$F$+$J4A;zJQ49$9$k(B
+            $BCJ3,$rCV$/$+!"$=$N$^$^8uJdA*Br$r;O$a$k$+$I$&$+$O8e=R$N(B
+            .BeforeSelectConversion $B$N;XDj$G7h$^$j$^$9!#(B
+        $B!|(B $B$+$J4A;zJQ49D>8e(B .BeginConversionLast $B$,(B none $B$G%+!<%=%k0LCV(B
+            $B$,:G8e$K$"$C$FCmL\$9$kJ8@a$,$J$$$H$-$O!"<+F0E*$K#1$DA0$NJ8@a$K(B 
+            $B0\F0$7$F$+$iF0:n$r3+;O$7$^$9!#(B
+        $B!|%b!<%II=<($rJQ99$9$k$+$I$&$+$O8e=R$N(B .DisplayModeChange
+            $B$N;XDj$G7h$^$j$^$9(B
+------------------------------------------------------------------------------
+convert     "henkan" $B$HF1$8$G$9(B
+------------------------------------------------------------------------------
+muhen   [NoInputMode] $BL5;k$7$^$9(B
+        [InputMode/ConvedMode] $B$+$J4A;zJQ49A0$N>uBV$KLa$7!"(BInputMode $B$K$7$^$9(B
+        [SelectMode] $B8uJd0lMw$r%]%C%W%@%&%s$7!"$+$J4A;zJQ49A0$N>uBV$KLa$7!"(B
+            InputMode $B$K$7$^$9(B
+        [DictMode] $BFI$_F~NO%&%#%s%I%&$r$r%]%C%W%@%&%s$7!"$+$J4A;zJQ49A0$N(B
+            $B>uBV$KLa$7!"(BInputMode $B$K$7$^$9(B
+        $B!|(B .MoveBySegment $B$N;XDj$,(B InputMode $B$KBP$7$F(B on $B$N;~$O(B
+            InputMode $B$KLa$7$F$b$=$N$^$^%+%l%s%HJ8@a$K$O(B
+            $BJ8;zF~NO2DG=$K$J$j$^$;$s!#$3$N$H$-$KDL>o$NJ8;zF~NO$N(B
+            $B%-!<$r2!$7$?$H$-$NF0:n$O8e=R$N(B .FlushInConversion $B$N(B
+            $B;XDj$G7h$^$j$^$9(B
+        $B!|L5JQ49>uBV$K$5$l$kJ8@a$O8e=R$N(B .MuhenkanSegment $B$N;XDj$G7h$^$j$^$9(B
+        $B!|L5JQ498e$N%F%-%9%H%+!<%=%k$N0LCV$O(B .MuhenkanCursorLast $B$N;XDj$G(B
+            $B7h$^$j$^$9(B
+        $B!|%b!<%II=<($rJQ99$9$k$+$I$&$+$O8e=R$N(B .DisplayModeChange
+            $B$N;XDj$G7h$^$j$^$9(B
+------------------------------------------------------------------------------
+unconvert   "muhen" $B$HF1$8$G$9(B
+------------------------------------------------------------------------------
+kettei  [NoInputMode] $BL5;k$7$^$9(B
+        [InputMode/ConvedMode] $BJQ49Cf$NJ8;zNs$r3NDj$7$^$9(B
+        [DictMode] $BF~NO$7$?FI$_$dEPO?!?Ku>C$9$kJ8@a$ND9$5$r3NDj$7!"(B
+            $B$^$?$O3NG'$N>l9g$OA`:n$rB39T$7$^$9(B
+        [SelectMode] $BA*BrCf(B($BH?E>$7$F$$$k(B)$B$NJ8;zNs$rA*Br$7$FJ8$r3NDj$7$^$9(B
+            $B$?$@$7IJ;lA*Br$N>l9g$O(B select $B$HF1$8$G$9(B
+        $B!|$$$:$l$N>l9g$b3NDj8e$O(B NoInputMode $B$K$J$j$^$9(B
+        $B!|%b!<%II=<($rJQ99$9$k$+$I$&$+$O8e=R$N(B .DisplayModeChange
+            $B$N;XDj$G7h$^$j$^$9(B
+------------------------------------------------------------------------------
+flush       "kettei" $B$HF1$8$G$9(B
+------------------------------------------------------------------------------
+fix         "kettei" $B$HF1$8$G$9(B
+------------------------------------------------------------------------------
+return  [NoInputMode] $B2~9T$7$^$9(B
+        [InputMode] $BJQ49Cf$NJ8;zNs$r3NDj$7!"8=:_$N%+!<%=%k0LCV$G2~9T$7$^$9(B
+        [ConvedMode] $BJQ49Cf$NJ8;zNs$r3NDj$7!"8=:_CmL\$7$F$$$kJ8@a$N8e$G(B
+            $B2~9T$7$^$9(B
+        [SelectMode] $B8uJdA*BrCf$N$H$-$OA*BrCf(B($BH?E>$7$F$$$k(B)$B$NJ8;zNs$rA*Br$7$F(B
+                ConvedMode $B$KLa$j$^$9(B $B5-9fA*BrCf$N;~$OA*BrCf$N5-9f$r(B
+                $BA*Br$7$F(B InputMode $B$KLa$j$^$9(B $BIJ;lA*BrCf$N;~$OA*BrCf$N(B
+                $BIJ;l$rA*Br$7$F(B DictMode$B!J3NG'%b!<%I!K$KLa$j$^$9(B
+        [DictMode] $BHO0OA*Br!?FI$_F~NO;~$OHO0O!?FI$_$r3NDj$7$^$9(B
+            $B$^$?$N3NG';~$N>l9g$OA`:n$rB39T$7$^$9(B
+        $B!|(B[InputMode/ConvedMode] $B$G$O3NDj8e$O(B NoInputMode $B$K$J$j$^$9(B
+        $B!|%b!<%II=<($rJQ99$9$k$+$I$&$+$O8e=R$N(B .DisplayModeChange
+            $B$N;XDj$G7h$^$j$^$9(B
+------------------------------------------------------------------------------
+halpha  [NoInputMode/InputMode/ConvedMode/DictMode] $BJ8;z<o$r(B
+            $BH>3Q%"%k%U%!%Y%C%H$K$7$^$9(B
+        [SelectMode] $B%(%i!<$G$"$k$3$H$rL@<($9$k$?$a%Y%k$rLD$i$7$^$9(B
+        $B!|8=:_$NF~NOJ8;z<o$rJQ99$9$k$N$+!"%+%l%s%HJ8@a$NI=<(J8;z<o$r(B
+            $BJQ49$9$k$N$+$O8e=R$N(B .ModeConversion $B$N;XDj$G7h$^$j$^$9(B
+            $BF~NOJ8;z<o$rJQ$($?>l9g$O%b!<%II=<($,JQ$o$j$^$9(B
+        $B!|F~NOJ8;z<o$rJQ99$7$?$H$-$K3NDj$9$k$+$I$&$+$O(B
+            $B8e=R$N(B .FlushAfterConversion $B$N;XDj$G7h$^$j$^$9(B
+------------------------------------------------------------------------------
+zalpha [NoInputMode/InputMode/ConvedMode/DictMode] $BJ8;z<o$r(B
+            $BA43Q%"%k%U%!%Y%C%H$K$7$^$9(B
+        [SelectMode] $B%(%i!<$G$"$k$3$H$rL@<($9$k$?$a%Y%k$rLD$i$7$^$9(B
+        $B!|8=:_$NF~NOJ8;z<o$rJQ99$9$k$N$+!"%+%l%s%HJ8@a$NI=<(J8;z<o$r(B
+            $BJQ49$9$k$N$+$O8e=R$N(B .ModeConversion $B$N;XDj$G7h$^$j$^$9(B
+            $BF~NOJ8;z<o$rJQ$($?>l9g$O%b!<%II=<($,JQ$o$j$^$9(B
+        $B!|F~NOJ8;z<o$rJQ99$7$?$H$-$K3NDj$9$k$+$I$&$+$O(B
+            $B8e=R$N(B .FlushAfterConversion $B$N;XDj$G7h$^$j$^$9(B
+------------------------------------------------------------------------------
+hkatakana[NoInputMode/InputMode/ConvedMode/DictMode] $BJ8;z<o$r(B
+            $BH>3Q%+%?%+%J$K$7$^$9(B
+        [SelectMode] $B%(%i!<$G$"$k$3$H$rL@<($9$k$?$a%Y%k$rLD$i$7$^$9(B
+        $B!|8=:_$NF~NOJ8;z<o$rJQ99$9$k$N$+!"%+%l%s%HJ8@a$NI=<(J8;z<o$r(B
+            $BJQ49$9$k$N$+$O8e=R$N(B .ModeConversion $B$N;XDj$G7h$^$j$^$9(B
+            $BF~NO$9$kJ8;z<o$rJQ$($?>l9g$O%b!<%II=<($,JQ$o$j$^$9(B
+        $B!|F~NOJ8;z<o$rJQ99$7$?$H$-$K3NDj$9$k$+$I$&$+$O(B
+            $B8e=R$N(B .FlushAfterConversion $B$N;XDj$G7h$^$j$^$9(B
+------------------------------------------------------------------------------
+zkatakana[NoInputMode/InputMode/ConvedMode/DictMode] $BJ8;z<o$r(B
+            $BA43Q%+%?%+%J$K$7$^$9(B
+        [SelectMode] $B%(%i!<$G$"$k$3$H$rL@<($9$k$?$a%Y%k$rLD$i$7$^$9(B
+        $B!|8=:_$NF~NOJ8;z<o$rJQ99$9$k$N$+!"%+%l%s%HJ8@a$NI=<(J8;z<o$r(B
+            $BJQ49$9$k$N$+$O8e=R$N(B .ModeConversion $B$N;XDj$G7h$^$j$^$9(B
+            $BF~NO$9$kJ8;z<o$rJQ$($?>l9g$O%b!<%II=<($,JQ$o$j$^$9(B
+        $B!|F~NOJ8;z<o$rJQ99$7$?$H$-$K3NDj$9$k$+$I$&$+$O(B
+            $B8e=R$N(B .FlushAfterConversion $B$N;XDj$G7h$^$j$^$9(B
+------------------------------------------------------------------------------
+hiragana[NoInputMode/InputMode/ConvedMode/DictMode] $BJ8;z<o$r(B
+            $B$R$i$,$J$K$7$^$9(B
+        [SelectMode] $B%(%i!<$G$"$k$3$H$rL@<($9$k$?$a%Y%k$rLD$i$7$^$9(B
+        $B!|8=:_$NF~NOJ8;z<o$rJQ99$9$k$N$+!"%+%l%s%HJ8@a$NI=<(J8;z<o$r(B
+            $BJQ49$9$k$N$+$O8e=R$N(B .ModeConversion $B$N;XDj$G7h$^$j$^$9(B
+            $BF~NO$9$kJ8;z<o$rJQ$($?>l9g$O%b!<%II=<($,JQ$o$j$^$9(B
+        $B!|F~NOJ8;z<o$rJQ99$7$?$H$-$K3NDj$9$k$+$I$&$+$O(B
+            $B8e=R$N(B .FlushAfterConversion $B$N;XDj$G7h$^$j$^$9(B
+------------------------------------------------------------------------------
+tohalpha[NoInputMode/InputMode/ConvedMode/DictMode] $B8e=R$N(B
+        .ModeConversion $B$N;XDj$K4X78$J$/I=<(J8;z<o$r(B
+        $BH>3Q%"%k%U%!%Y%C%H$K$7$^$9!J5U%m!<%^;z$+$JJQ49$r$7$^$9!K(B
+        [SelectMode] $B%(%i!<$G$"$k$3$H$rL@<($9$k$?$a%Y%k$rLD$i$7$^$9(B
+------------------------------------------------------------------------------
+tozalpha[NoInputMode/InputMode/ConvedMode/DictMode] $B8e=R$N(B
+        .ModeConversion $B$N;XDj$K4X78$J$/I=<(J8;z<o$r(B
+        $BA43Q%"%k%U%!%Y%C%H$K$7$^$9!J5U%m!<%^;z$+$JJQ49$r$7$^$9!K(B
+        [SelectMode] $B%(%i!<$G$"$k$3$H$rL@<($9$k$?$a%Y%k$rLD$i$7$^$9(B
+------------------------------------------------------------------------------
+tohkatakana[NoInputMode/InputMode/ConvedMode/DictMode] $B8e=R$N(B
+        .ModeConversion $B$N;XDj$K4X78$J$/I=<(J8;z<o$rH>3Q%+%?%+%J$K$7$^$9(B
+        $B!J%m!<%^;z$+$JJQ49$r$7$^$9!K(B
+        [SelectMode] $B%(%i!<$G$"$k$3$H$rL@<($9$k$?$a%Y%k$rLD$i$7$^$9(B
+------------------------------------------------------------------------------
+tozkatakana[NoInputMode/InputMode/ConvedMode/DictMode] $B8e=R$N(B
+        .ModeConversion $B$N;XDj$K4X78$J$/I=<(J8;z<o$rA43Q%+%?%+%J$K$7$^$9(B
+        $B!J%m!<%^;z$+$JJQ49$r$7$^$9!K(B
+        [SelectMode] $B%(%i!<$G$"$k$3$H$rL@<($9$k$?$a%Y%k$rLD$i$7$^$9(B
+------------------------------------------------------------------------------
+tohiragana[NoInputMode/InputMode/ConvedMode/DictMode] $B8e=R$N(B
+        .ModeConversion $B$N;XDj$K4X78$J$/I=<(J8;z<o$r$R$i$,$J$K$7$^$9(B
+        $B!J%m!<%^;z$+$JJQ49$r$7$^$9!K(B
+        [SelectMode] $B%(%i!<$G$"$k$3$H$rL@<($9$k$?$a%Y%k$rLD$i$7$^$9(B
+------------------------------------------------------------------------------
+zenkaku [NoInputMode/InputMode/ConvedMode/DictMode] $BI=<(J8;z<o$r(B
+        $BA43Q$K$7$^$9!J%m!<%^;z$+$JJQ49$O$7$^$;$s!K(B
+        [SelectMode] $B%(%i!<$G$"$k$3$H$rL@<($9$k$?$a%Y%k$rLD$i$7$^$9(B
+------------------------------------------------------------------------------
+hankaku [NoInputMode/InputMode/ConvedMode/DictMode] 
+        $BI=<(J8;z<o$rA43Q$K$7$^$9!J5U%m!<%^;z$+$JJQ49$r$7$^$;$s!K(B
+        [SelectMode] $B%(%i!<$G$"$k$3$H$rL@<($9$k$?$a%Y%k$rLD$i$7$^$9(B
+------------------------------------------------------------------------------
+toupper [NoInputMode/InputMode/ConvedMode/DictMode] $B%+%l%s%HJ8@aCf$N(B
+        $B%"%k%U%!%Y%C%H$rBgJ8;z$K$7$^$9(B
+        [SelectMode] $B%(%i!<$G$"$k$3$H$rL@<($9$k$?$a%Y%k$rLD$i$7$^$9(B
+------------------------------------------------------------------------------
+tolower [NoInputMode/InputMode/ConvedMode/DictMode] $B%+%l%s%HJ8@aCf$N(B
+        $B%"%k%U%!%Y%C%H$r>.J8;z$K$7$^$9(B
+        [SelectMode] $B%(%i!<$G$"$k$3$H$rL@<($9$k$?$a%Y%k$rLD$i$7$^$9(B
+------------------------------------------------------------------------------
+sjis    [NoInputMode/InputMode/ConvedMode/DictMode] $BF~NO%b!<%I$r(B
+            Shift-JIS $B%3!<%IF~NO$K$7!"%b!<%II=<($rJQ$($^$9(B
+        [SelectMode] $B%(%i!<$G$"$k$3$H$rL@<($9$k$?$a%Y%k$rLD$i$7$^$9(B
+        $B!|F~NO%3!<%I$rJQ99$7$?$H$-$K3NDj$9$k$+$I$&$+$O(B
+            $B8e=R$N(B .FlushAfterConversion $B$N;XDj$G7h$^$j$^$9(B
+------------------------------------------------------------------------------
+euc     [NoInputMode/InputMode/ConvedMode/DictMode] $BF~NO%b!<%I$r(B
+            EUC $B%3!<%IF~NO$K$7!"%b!<%II=<($rJQ$($^$9(B
+        [SelectMode] $B%(%i!<$G$"$k$3$H$rL@<($9$k$?$a%Y%k$rLD$i$7$^$9(B
+        $B!|F~NO%3!<%I$rJQ99$7$?$H$-$K3NDj$9$k$+$I$&$+$O(B
+            $B8e=R$N(B .FlushAfterConversion $B$N;XDj$G7h$^$j$^$9(B
+------------------------------------------------------------------------------
+jis     [NoInputMode/InputMode/ConvedMode/DictMode] $BF~NO%b!<%I$r(B
+            JIS $B%3!<%IF~NO$K$7!"%b!<%II=<($rJQ$($^$9(B
+        [SelectMode] $B%(%i!<$G$"$k$3$H$rL@<($9$k$?$a%Y%k$rLD$i$7$^$9(B
+        $B!|F~NO%3!<%I$rJQ99$7$?$H$-$K3NDj$9$k$+$I$&$+$O(B
+            $B8e=R$N(B .FlushAfterConversion $B$N;XDj$G7h$^$j$^$9(B
+------------------------------------------------------------------------------
+kuten   [NoInputMode/InputMode/ConvedMode/DictMode] $BF~NO%b!<%I$r(B
+            $B6hE@%3!<%IF~NO$K$7!"%b!<%II=<($rJQ$($^$9(B
+        [SelectMode] $B%(%i!<$G$"$k$3$H$rL@<($9$k$?$a%Y%k$rLD$i$7$^$9(B
+        $B!|F~NO%3!<%I$rJQ99$7$?$H$-$K3NDj$9$k$+$I$&$+$O(B
+            $B8e=R$N(B .FlushAfterConversion $B$N;XDj$G7h$^$j$^$9(B
+------------------------------------------------------------------------------
+code    [NoInputMode/InputMode/ConvedMode/DictMode] $B%m!<%^;z!?$+$JF~NO(B
+            $B%b!<%I$N;~$O=i4|%3!<%IF~NO$N%b!<%I$K$7!"%3!<%IF~NO%b!<%I(B
+            $B$N;~$OF~NO$9$k%3!<%I$r(B RoolDown $B$7!"%b!<%II=<($rJQ$($^$9(B
+        [SelectMode] $B%(%i!<$G$"$k$3$H$rL@<($9$k$?$a%Y%k$rLD$i$7$^$9(B
+        $B!|=i4|%3!<%IF~NO$N%3!<%I$HF~NO%3!<%I$N(B RoolDown $B$9$k=gHV$O(B
+            $B8e=R$N(B .DefaultCode $B$N;XDj$G7h$^$j$^$9(B
+        $B!|F~NO%3!<%I$rJQ99$7$?$H$-$K3NDj$9$k$+$I$&$+$O(B
+            $B8e=R$N(B .FlushAfterConversion $B$N;XDj$G7h$^$j$^$9(B
+------------------------------------------------------------------------------
+modedown[NoInputMode/InputMode/ConvedMode/DictMode] $BF~NOJ8;z<o!?%3!<%I(B
+            $B$"$k$$$O%+%l%s%HJ8@a$NI=<(J8;z<o$r(B RoolDown $B$7!"8e=R$N(B
+            .InitialMode $B$N;XDj$K$J$$F~NOJ8;z<o$d(B .PrintMode $B$N;XDj$K(B
+            $B$J$$I=<(J8;z<o$N;~$O=i4|F~NOJ8;z<o!J%3!<%I!K!?I=<(J8;z<o$K$7$^$9!#(B
+            $B$^$?!"F~NOJ8;z<o$rJQ99$9$k>l9g$O%b!<%II=<($rJQ$($^$9(B
+        [SelectMode] $B%(%i!<$G$"$k$3$H$rL@<($9$k$?$a%Y%k$rLD$i$7$^$9(B
+        $B!|8=:_$NF~NOJ8;z<o!?%3!<%I$rJQ99$9$k$N$+!"%+%l%s%HJ8@a$NI=<(J8;z<o$r(B
+            $BJQ49$9$k$N$+$O8e=R$N(B .ModeConversion $B$N;XDj$G7h$^$j$^$9(B
+        $B!|=i4|F~NOJ8;z<o$HF~NOJ8;z<o$N(B RoolDown $B$9$k=gHV$O(B
+            $B8e=R$N(B .InitialMode $B$N;XDj$G7h$^$j$^$9(B
+        $B!|=i4|I=<(J8;z<o$HI=<(J8;z<o$N(B RoolDown $B$9$k=gHV$O(B
+            $B8e=R$N(B .PrintMode $B$N;XDj$G7h$^$j$^$9(B
+        $B!|F~NOJ8;z<o$rJQ99$7$?$H$-$K3NDj$9$k$+$I$&$+$O(B
+            $B8e=R$N(B .FlushAfterConversion $B$N;XDj$G7h$^$j$^$9(B
+------------------------------------------------------------------------------
+toggle          "modedown" $B$HF1$8$G$9(B
+------------------------------------------------------------------------------
+modeup  [NoInputMode/InputMode/ConvedMode/DictMode] $BF~NOJ8;z<o!?%3!<%I(B
+            $B$"$k$$$O%+%l%s%HJ8@a$NI=<(J8;z<o$r(B RoolUp $B$7!"8e=R$N(B
+            .InitialMode $B$N;XDj$K$J$$F~NOJ8;z<o$d(B .PrintMode $B$N;XDj$K(B
+            $B$J$$I=<(J8;z<o$N;~$O:G8e$K;XDj$5$l$?F~NOJ8;z<o!J%3!<%I!K(B
+            $B!?I=<(J8;z<o$K$7$^$9!#(B
+            $B$^$?!"F~NOJ8;z<o$rJQ99$9$k>l9g$O%b!<%II=<($rJQ$($^$9(B
+        [SelectMode] $B%(%i!<$G$"$k$3$H$rL@<($9$k$?$a%Y%k$rLD$i$7$^$9(B
+        $B!|8=:_$NF~NOJ8;z<o!?%3!<%I$rJQ99$9$k$N$+!"%+%l%s%HJ8@a$NI=<(J8;z<o$r(B
+            $BJQ49$9$k$N$+$O8e=R$N(B .ModeConversion $B$N;XDj$G7h$^$j$^$9(B
+        $B!|=i4|F~NOJ8;z<o$HF~NOJ8;z<o$N(B RoolUp $B$9$k=gHV$O(B
+            $B!J(Bmodedown $B$H5U!K8e=R$N(B .InitialMode $B$N;XDj$G7h$^$j$^$9(B
+        $B!|=i4|I=<(J8;z<o$HI=<(J8;z<o$N(B RoolUp $B$9$k=gHV$O(B
+            $B!J(Bmodedown $B$H5U!K8e=R$N(B .PrintMode $B$N;XDj$G7h$^$j$^$9(B
+        $B!|F~NOJ8;z<o$rJQ99$7$?$H$-$K3NDj$9$k$+$I$&$+$O(B
+            $B8e=R$N(B .FlushAfterConversion $B$N;XDj$G7h$^$j$^$9(B
+------------------------------------------------------------------------------
+toggleback       "modeup" $B$HF1$8$G$9(B
+------------------------------------------------------------------------------
+nextmode[NoInputMode] $BL5;k$7$^$9(B
+        [InputMode/ConvedMode/DictMode] .ModeConversion $B$N;XDj$K4X78$J$/(B
+            $B%+%l%s%HJ8@a$NI=<(J8;z<o$r(B RoolDown $B$7!"8e=R$N(B .PrintMode $B$N(B
+            $B;XDj$K$J$$I=<(J8;z<o$N;~$O:G=i$K;XDj$5$l$?I=<(J8;z<o$K$7$^$9!#(B
+        [SelectMode] $B%(%i!<$G$"$k$3$H$rL@<($9$k$?$a%Y%k$rLD$i$7$^$9(B
+        $B!|=i4|I=<(J8;z<o$HI=<(J8;z<o$N(B RoolDown $B$9$k=gHV$O(B
+            $B8e=R$N(B .PrintMode $B$N;XDj$G7h$^$j$^$9(B
+------------------------------------------------------------------------------
+prevmode[NoInputMode] $BL5;k$7$^$9(B
+        [InputMode/ConvedMode/DictMode] .ModeConversion $B$N;XDj$K4X78$J$/(B
+            $B%+%l%s%HJ8@a$NI=<(J8;z<o$r(B RoolUp $B$7!"8e=R$N(B .PrintMode $B$N(B
+            $B;XDj$K$J$$I=<(J8;z<o$N;~$O:G8e$K;XDj$5$l$?I=<(J8;z<o$K$7$^$9!#(B
+        [SelectMode] $B%(%i!<$G$"$k$3$H$rL@<($9$k$?$a%Y%k$rLD$i$7$^$9(B
+        $B!|=i4|I=<(J8;z<o$HI=<(J8;z<o$N(B RoolUp $B$9$k=gHV$O(B
+            $B8e=R$N(B .PrintMode $B$N;XDj$G7h$^$j$^$9(B
+------------------------------------------------------------------------------
+muhenkan[NoInputMode/InputMode] $BF~NOJ8;z<o$,$R$i$,$J$G$J$$$H$-$O(B
+            $B8e=R$N(B .MuhenkanMode $B$G;XDj$5$l$F$$$kF~NOJ8;z<o$K$7!"(B
+            .MuhenkanMode $B$G;XDj$5$l$F$$$kJ8;z<o$N$H$-$O$R$i$,$J$K$7$^$9(B
+            $BF1;~$K%b!<%II=<($,JQ$o$j$^$9(B
+        [ConvedMode] $BI=<(J8;z<o$,$R$i$,$J$G$bA43Q%+%?%+%J$G$b$J$$$H$-(B
+            $B!JJQ498e$N4A;z8r$8$j$N>uBV$r4^$`!K$O$R$i$,$J$K$7!"(B
+            $B$R$i$,$J$N$H$-$OA43Q%+%?%+%J$K$7!"A43Q%+%?%+%J$N;~$O(B
+            $B8e=R$N(B .MuhenkanInEdit $B$G;XDj$5$l$F$$$kJ8;z<o$K$7$^$9(B
+        [SelectMode/DictMode] $BL5;k$7$^$9(B
+        $B!|$3$N%U%!%s%/%7%g%s$O(B sj2/sj3/sjx $B$N!VL5JQ49!W%-!<$,2!$5$l$?$H$-$N(B
+            $BF0:n$H$N8_49@-$r0];}$9$k$?$a$K$"$j$^$9(B
+        $B!|8e=R$N(B .MuhenkanToggle $B$N;XDj$K$h$C$F(B [ConvedMode/DictMode]
+            $B$G(B .MuhenkanInEdit $B$G;XDj$5$l$F$$$kI=<(J8;z<o$X$N%H%0%k$r9T$&$+(B
+            $B$7$J$$$+;XDj$G$-$^$9!#(B
+        $B!|F~NOJ8;z<o$rJQ99$7$?$H$-$K3NDj$9$k$+$I$&$+$O(B
+            $B8e=R$N(B .FlushAfterConversion $B$N;XDj$G7h$^$j$^$9(B
+------------------------------------------------------------------------------
+forward [NoInputMode] $BL5;k$7$^$9(B
+        [InputMode/ConvedMode] $B%+%l%s%H!JH?E>$7$F$$$k!KJ8@a$^$?$O%F%-%9%H(B
+            $B%+!<%=%k$r#1$D8e$m$NJ8@a!?J8;z$K0\F0$7$^$9(B
+        [SelectMode] $B8=:_A*BrCf$NJQ498uJd(B($B5-9f!?IJ;l(B)$B$r#1$D1&$N$b$N$K0\$7$^$9(B
+        [DictMode] $BH?E>$7$F$$$kJ8@a$,#1$D$@$1$N;~!"%+%l%s%H!JH?E>$7$F$$$k!K(B
+            $BJ8@a$r#1$D8e$K0\$7!"J#?t$NJ8@a$,A*Br!JH?E>!K$5$l$F$$$k$H$-$O(B
+            $B%(%i!<$G$"$k$3$H$rL@<($9$k$?$a%Y%k$rLD$i$7$^$9(B
+        $B!|(B [InputMode/ConvedMode] $B$G$N0\F0C10L$rJ8@aC10L$K$9$k$+J8;zC10L$K(B
+            $B$9$k$+$O8e=R$N(B .MoveBySegment $B$N;XDj$G7h$^$j$^$9(B
+        $B!|(B $BJ8@aC10L$G0\F0$9$k>l9g!"0\F0$G$-$k:G8e$NJ8@a$N0LCV$O(B
+            $B8e=R$N(B .BeginConversionLast $B$G7h$^$j$^$9(B
+        $B!|(B $B%+%l%s%HJ8@a!?%+!<%=%k$N$"$kJ8;z$,:G8e$NJ8@a!?J8;z$N;~(B
+            $B:G=i$NJ8@a!?J8;z$X0\F0$9$k$+$I$&$+$O8e=R$N(B
+            .MoveLoop $B$N;XDj$G7h$^$j$^$9(B
+------------------------------------------------------------------------------
+right           "forward" $B$HF1$8$G$9(B
+------------------------------------------------------------------------------
+backward[NoInputMode] $BL5;k$7$^$9(B
+        [InputMode/ConvedMode] $B%+%l%s%H!JH?E>$7$F$$$k!KJ8@a$^$?$O%F%-%9%H(B
+            $B%+!<%=%k$r#1$DA0$N$NJ8@a!?J8;z$K0\F0$7$^$9(B
+        [SelectMode] $B8=:_A*BrCf$N8uJd(B($B5-9f!?IJ;l(B)$B$r#1$D:8$N$b$N$K0\$7$^$9(B
+        [DictMode] $BH?E>$7$F$$$kJ8@a$,#1$D$@$1$N;~!"%+%l%s%H!JH?E>$7$F$$$k!K(B
+            $BJ8@a$r#1$DA0$K0\$7!"J#?t$NJ8@a$,A*Br!JH?E>!K$5$l$F$$$k$H$-$O(B
+            $B%(%i!<$G$"$k$3$H$rL@<($9$k$?$a%Y%k$rLD$i$7$^$9(B
+        $B!|(B [InputMode/ConvedMode] $B$G$N0\F0C10L$rJ8@aC10L$K$9$k$+J8;zC10L$K(B
+            $B$9$k$+$O8e=R$N(B .MoveBySegment $B$N;XDj$G7h$^$j$^$9(B
+        $B!|(B $B%+%l%s%HJ8@a!?%+!<%=%k$N$"$kJ8;z$,:G=i$NJ8@a!?J8;z$N;~(B
+            $B:G8e$NJ8@a!?J8;z$X0\F0$9$k$+$I$&$+$O8e=R$N(B
+            .MoveLoop $B$N;XDj$G7h$^$j$^$9(B
+------------------------------------------------------------------------------
+left            "backward" $B$HF1$8$G$9(B
+------------------------------------------------------------------------------
+top     [NoInputMode] $BL5;k$7$^$9(B
+        [InputMode/ConvedMode] $B%+%l%s%H!JH?E>$7$F$$$k!KJ8@a$rJQ49Cf$NJ8;zNs(B
+            $B$N0lHV:G=i$NJ8@a$K0\F0$9$k$+!"%F%-%9%H%+!<%=%k$r8=J8@a$N(B
+            $B:G=i$NJ8;z$K0\F0$7$^$9(B
+        [SelectMode] $B8=:_A*BrCf$N8uJd(B($B5-9f!?IJ;l(B)$B$rA*BrI=<($N9T$N0lHV:G=i$K(B
+            $B0\F0$7$^$9(B
+        [DictMode] $BH?E>$7$F$$$kJ8@a$,#1$D$@$1$N;~!"%+%l%s%H!JH?E>$7$F$$$k!K(B
+            $BJ8@a$rJ8;zNs$N0lHV:G=i$NJ8@a$K0\F0$7!"J#?t$NJ8@a$,A*Br(B
+            $B!JH?E>!K$5$l$F$$$k$H$-$O%(%i!<$G$"$k$3$H$rL@<($9$k$?$a%Y%k(B
+            $B$rLD$i$7$^$9(B
+        $B!|(B [InputMode/ConvedMode] $B$G$N0\F0C10L$rJ8@aC10L$K$9$k$+J8;zC10L$K(B
+            $B$9$k$+$O8e=R$N(B .JumpbySegment $B$N;XDj$G7h$^$j$^$9(B
+------------------------------------------------------------------------------
+end     [NoInputMode] $BL5;k$7$^$9(B
+        [InputMode/ConvedMode] $B%+%l%s%H!JH?E>$7$F$$$k!KJ8@a$rJQ49Cf$NJ8;zNs(B
+            $B$N0lHV:G8e$NJ8@a$K0\F0$9$k$+!"%F%-%9%H%+!<%=%k$r8=J8@a$N(B
+            $B:G8e$NJ8;z$N8e$m$K0\F0$7$^$9(B
+        [SelectMode] $B8=:_A*BrCf$N8uJd(B($B5-9f!?IJ;l(B)$B$rA*BrI=<($N9T$N0lHV:G8e$K(B
+            $B0\F0$7$^$9(B
+        [DictMode] $BH?E>$7$F$$$kJ8@a$,#1$D$@$1$N;~!"%+%l%s%H!JH?E>$7$F$$$k!K(B
+            $BJ8@a$rJ8;zNs$N0lHV:G8e$NJ8@a$K0\F0$7!"J#?t$NJ8@a$,A*Br!JH?E>!K(B
+            $B$5$l$F$$$k$H$-$O%(%i!<$G$"$k$3$H$rL@<($9$k$?$a%Y%k$rLD$i$7$^$9(B
+        $B!|(B [InputMode/ConvedMode] $B$G$N0\F0C10L$rJ8@aC10L$K$9$k$+J8;zC10L$K(B
+            $B$9$k$+$O8e=R$N(B .JumpbySegment $B$N;XDj$G7h$^$j$^$9(B
+        $B!|(B $BJ8@aC10L$G0\F0$9$k>l9g!"0\F0$G$-$k:G8e$NJ8@a$N0LCV$O(B
+            $B8e=R$N(B .BeginConversionLast $B$G7h$^$j$^$9(B
+------------------------------------------------------------------------------
+bottom          "end" $B$HF1$8$G$9(B
+------------------------------------------------------------------------------
+up      [NoInputMode/InputMode/ConvedMode/DictMode] $B%(%i!<$G$"$k$3$H$r(B
+            $BL@<($9$k$?$a%Y%k$rLD$i$7$^$9(B
+        [SelectMode] $B8=:_A*BrCf$N8uJd(B($B5-9f(B)$B$r#1$D>e$N$b$N$K0\$7$^$9(B
+------------------------------------------------------------------------------
+down    [NoInputMode/InputMode/ConvedMode/DictMode] $B%(%i!<$G$"$k$3$H$r(B
+            $BL@<($9$k$?$a%Y%k$rLD$i$7$^$9(B
+        [SelectMode] $B8=:_A*BrCf$N8uJd(B($B5-9f(B)$B$r#1$D2<$N$b$N$K0\$7$^$9(B
+------------------------------------------------------------------------------
+first   [ConvedMode] $BJQ49:Q$_$NJ8@a$NFbMF$r0lHV:G=i$N8uJd$N$b$N$K(B
+            $BCV$-49$($^$9!JJQ498uJd3X=,$OJ8@a0\F0Ey$N:]$K9T$o$l$^$9!K(B
+        [SelectMode] $B8=:_A*BrCf$N8uJd(B($B5-9f!?IJ;l(B)$B$r8=:_I=<($5$l$F$$$J$$$b$N(B
+            $B$b4^$a:G=i$N$b$N$K0\F0$7$^$9(B
+        [NoInputMode/InputMode/DictMode] $B%(%i!<$G$"$k$3$H$rL@<($9$k$?$a(B
+            $B%Y%k$rLD$i$7$^$9(B
+------------------------------------------------------------------------------
+last    [ConvedMode] $BJQ49:Q$_$NJ8@a$NFbMF$r0lHV:G8e$N8uJd$N$b$N$K(B
+            $BCV$-49$($^$9!JJQ498uJd3X=,$OJ8@a0\F0Ey$N:]$K9T$o$l$^$9!K(B
+        [SelectMode] $B8=:_A*BrCf$N8uJd(B($B5-9f!?IJ;l(B)$B$r8=:_I=<($5$l$F$$$J$$$b$N(B
+            $B$b4^$a:G8e$N$b$N$K0\F0$7$^$9(B
+        [NoInputMode/InputMode/DictMode] $B%(%i!<$G$"$k$3$H$rL@<($9$k$?$a(B
+            $B%Y%k$rLD$i$7$^$9(B
+------------------------------------------------------------------------------
+nextp   [NoInputMode/InputMode/ConvedMode/DictMode] $B%(%i!<$G$"$k$3$H$r(B
+            $BL@<($9$k$?$a%Y%k$rLD$i$7$^$9(B
+        [SelectMode] $B8=:_A*BrCf$N8uJd(B($B5-9f!?IJ;l(B)$B$rA*BrI=<($r<!%Z!<%8$K(B
+            $B0\$7$^$9(B
+------------------------------------------------------------------------------
+prevp   [NoInputMode/InputMode/ConvedMode/DictMode] $B%(%i!<$G$"$k$3$H$r(B
+            $BL@<($9$k$?$a%Y%k$rLD$i$7$^$9(B
+        [SelectMode] $B8=:_A*BrCf$N8uJd(B($B5-9f!?IJ;l(B)$B$rA*BrI=<($rA0%Z!<%8$K(B
+            $B0\$7$^$9(B
+------------------------------------------------------------------------------
+wrap    [ConvedMode] $BJQ49:Q$_$NJ8@a$NFbMF$r<!8uJd$N$b$N$KCV$-49$($^$9(B
+        [SelectMode] $B8=:_A*BrCf$N8uJd$r<!8uJd$N$b$N$K0\F0$7$^$9(B
+            (forward/right $B$HF1MM(B)
+        [NoInputMode/InputMode/DictMode] $B%(%i!<$G$"$k$3$H$rL@<($9$k$?$a(B
+            $B%Y%k$rLD$i$7$^$9(B
+------------------------------------------------------------------------------
+next            "wrap" $B$HF1$8$G$9(B
+------------------------------------------------------------------------------
+wrapback[ConvedMode] $BJQ49:Q$_$NJ8@a$NFbMF$rA08uJd$N$b$N$KCV$-49$($^$9(B
+        [SelectMode] $B8=:_A*BrCf$N8uJd$rA08uJd$N$b$N$K0\F0$7$^$9(B
+            (forward/right $B$HF1MM(B)
+        [NoInputMode/InputMode/DictMode] $B%(%i!<$G$"$k$3$H$rL@<($9$k$?$a(B
+            $B%Y%k$rLD$i$7$^$9(B
+------------------------------------------------------------------------------
+prev            "wrapback" $B$HF1$8$G$9(B
+------------------------------------------------------------------------------
+select  [NoInputMode/InputMode/ConvedMode/DictMode] $B%(%i!<$G$"$k$3$H$r(B
+            $BL@<($9$k$?$a%Y%k$rLD$i$7$^$9(B
+        [SelectMode] $B8uJdA*BrCf$N$H$-$OA*BrCf(B($BH?E>$7$F$$$k(B)$B$NJ8;zNs$rA*Br$7$F(B
+            ConvedMode $B$KLa$j$^$9(B $B5-9fA*BrCf$N;~$OA*BrCf$N5-9f$r(B
+            $BA*Br$7$F(B InputMode $B$KLa$j$^$9(B $BIJ;lA*BrCf$N;~$OA*BrCf$N(B
+            $BIJ;l$rA*Br$7$F(B DictMode$B!J3NG'%b!<%I!K$KLa$j$^$9(B(return $B$HF1$8(B)
+------------------------------------------------------------------------------
+cancel  [NoInputMode] $BL5;k$7$^$9(B
+        [InputMode/ConvedMode] $B8=:_JQ49Cf!"$NJ8;zNs$r%-%c%s%;%k$7!"(B
+            NoInputMode $B$K$7$^$9(B
+        [SelectMode] $B8uJdA*BrCf$N$H$-$O8uJdA*Br!JJQ99!KF0:n$r9T$o$:$K(B
+            ConvedMode $B$KLa$j$^$9(B $B5-9fA*BrCf$N;~$OA*BrCf$N5-9f$r(B
+            $BA*Br$;$:$K(B NoInputMode $B$^$?$O(B InputMode $B$KLa$j$^$9(B
+            $BIJ;lA*BrCf$N;~$O(B DictMode($BFI$_F~NO!?HO0OA*Br!K$KLa$j$^$9(B
+        [DictMode] $BFI$_F~NO!?HO0OA*Br;~$OF~NOCf$NJ8;z$r%-%c%s%;%k$7!"(B
+            ConvedMode $B$K$7$^$9(B
+            $B3NG'%b!<$G$G$OFI$_F~NO!?HO0OA*Br$N;~E@$KLa$j$^$9(B
+------------------------------------------------------------------------------
+kakucyou[NoInputMode/SelectMode] $B%(%i!<$G$"$k$3$H$rL@<($9$k$?$a(B
+            $B%Y%k$rLD$i$7$^$9(B
+        [InputMode/ConvedMode] $B%+%l%s%HJ8@a$r#1J8;z?-$P$7$^$9(B
+        [DictMode] $B8=:_H?E>$7$F$$$k:G8e$NJ8@a$H<!$NJ8@a$rJ;$;$F(B
+            $BH?E>$5$;!"A*Br$7$^$9(B
+        $B!|3HD%ItJ,$NI=<(J8;z<o$r%+%l%s%HJ8@a$HF1$8$b$N$K(B
+            $BJQ49$9$k$+$I$&$+$O8e=R$N(B .ExpandModeConversion $B$N;XDj$K$h$C$F(B
+            $B7h$^$j$^$9(B
+        $B!|3HD%ItJ,$r9g$o$;$F:FEY8=J8@a!?<!J8@a$N$+$J4A;zJQ49$r9T$&$+$I$&$+$O(B
+            $B8e=R$N(B .ExpandKanjiConversion $B$N;XDj$K$h$C$F7h$^$j$^$9(B
+------------------------------------------------------------------------------
+expand          "kakucyou" $B$HF1$8$G$9(B
+------------------------------------------------------------------------------
+syukusyou[NoInputMode/SelectMode] $B%(%i!<$G$"$k$3$H$rL@<($9$k$?$a(B
+            $B%Y%k$rLD$i$7$^$9(B
+        [InputMode/ConvedMode] $B%+%l%s%HJ8@a$r#1J8;z=L$a$^$9(B
+        [DictMode] $B8=:_H?E>$7$F$$$k:G8e$NJ8@a72$N$&$A$H:G8e$N$NJ8@a$N(B
+            $BH?E>$r2r>C$7$^$9(B $BH?E>$7$F$$$kJ8@a$,$R$H$D$7$+$J$$$H$-$O(B
+            $B%Y%k$rLD$i$7$^$9(B
+        $B!|=L>.ItJ,$NI=<(J8;z<o$r<!J8@a$HF1$8$b$N$K(B
+            $BJQ49$9$k$+$I$&$+$O8e=R$N(B .ShrinkModeConversion $B$N;XDj$K$h$C$F(B
+            $B7h$^$j$^$9(B
+        $B!|=L>.ItJ,$r<!J8@a$K9g$o$;$F:FEY8=J8@a!?<!J8@a$N$+$J4A;zJQ49$r9T$&$+(B
+            $B$I$&$+$O8e=R$N(B .ShrinkKanjiConversion $B$N;XDj$K$h$C$F7h$^$j$^$9(B
+        $B!|8=J8@a$,#1J8;z$7$+$J$$>l9g!"8=J8@a$rA0J8@a$H9gJ;$9$k$+$I$&$+$O(B
+            $B8e=R$N(B .ShrinkAll $B$N;XDj$K$h$C$F7h$^$j$^$9(B
+------------------------------------------------------------------------------
+shrink          "syukusyou" $B$HF1$8$G$9(B
+------------------------------------------------------------------------------
+backspace[NoInputMode] $BL5;k$7$^$9(B
+        [InputMode/ConvedMode] $B%F%-%9%H%+!<%=%k$N$"$k0LCV$ND>A0$N#1J8;z$+!"(B
+            $B%+%l%s%H!JH?E>$7$F$$$k!KJ8@a$ND>A0$NJ8@a$r>C5n$7$^$9(B
+        [SelectMode] $BA*BrF0:n$r$;$:$KA*BrI=<($r%]%C%W%@%&%s$7$F(B
+            $BJQ498uJdA*Br$N$H$-$O(B ConvedMode $B$K!"5-9fA*Br$N$H$-$O(B NoInputMode
+            $B$+(B InputMode $B$K!"IJ;lA*Br$N$H$-$O(B DictMode($BFI$_F~NO%b!<%I(B)$B$KLa$j!"(B
+            $B$=$l$>$l$N%b!<%I$G$NF0:n$r9T$$$^$9(B
+        [DictMode] $BHO0O;XDj!?FI$_F~NO;~$K$OF~NO$5$l$?FI$_J8;zNs(B
+                $B$N:G8e$NJ8;z$r#1J8;z$r>C5n$7!"$=$l0J30$N%b!<%I$N$H$-$O!"(B
+                $BL5;k$7$^$9(B
+        $B!|(B [InputMode/ConvedMode] $B$G$N>C5nC10L$rJ8@aC10L$K$9$k$+J8;zC10L$K(B
+            $B$9$k$+$O8e=R$N(B .DeleteBySegment $B$N;XDj$G7h$^$j$^$9(B
+        $B!|(B .DeleteBySegment off $B$N$H$-$GJQ49:Q$_$N>l9g$OL5JQ49>uBV$K(B
+            $BLa$7$?$&$($GJ8;zC10L$G>C5n$7$^$9$,!"$3$N$H$-L5JQ49>uBV$K(B
+            $BLa$9HO0O$O8e=R$N(B .DeleteChangeSegment $B$N;XDj$G7h$^$j$^$9(B
+        $B!|(B $B8uJdA*Br$G$N>uBV(B[SelectMode]$B$G8e=R$N(B .SelectBackSpaceMove $B$,(B
+            on $B$N;~$OD>A0$NJ8@a$G$O$J$/!"%+%l%s%HJ8@a$KBP$7$F(B
+            backspace $B$NF0:n$r3+;O$7$^$9(B
+------------------------------------------------------------------------------
+delete  [NoInputMode] $BL5;k$7$^$9(B
+        [InputMode/ConvedMode] $B%F%-%9%H%+!<%=%k$N$"$k0LCV$N#1J8;z$+(B
+            $B%+%l%s%H!JH?E>$7$F$$$k!KJ8@a$r>C5n$7$^$9(B
+        [SelectMode] $BA*BrF0:n$r$;$:$KA*BrI=<($r%]%C%W%@%&%s$7$F(B
+            $BJQ498uJdA*Br$N$H$-$O(B ConvedMode $B$K!"5-9fA*Br$N$H$-$O(B NoInputMode
+            $B$+(B InputMode $B$K!"IJ;lA*Br$N$H$-$O(B DictMode($BFI$_F~NO%b!<%I(B)$B$KLa$j!"(B
+            $B$=$l$>$l$N%b!<%I$G$NF0:n$r9T$$$^$9(B
+        [DictMode] $BL5;k$7$^$9(B
+        $B!|(B [InputMode/ConvedMode] $B$G$N>C5nC10L$rJ8@aC10L$K$9$k$+J8;zC10L$K(B
+            $B$9$k$+$O8e=R$N(B .DeleteBySegment $B$N;XDj$G7h$^$j$^$9(B
+        $B!|(B .DeleteBySegment off $B$N$H$-$G(B ConvedMode $B$N>l9g$OL5JQ49>uBV$K(B
+            $BLa$7$?$&$($GJ8;zC10L$G>C5n$7$^$9$,!"$3$N$H$-L5JQ49>uBV$K(B
+            $BLa$9HO0O$O8e=R$N(B .DeleteChangeSegment $B$N;XDj$G7h$^$j$^$9(B
+            $B$?$@$7!"(B.MuhenkanCursorLast $B$N;XDj$K$O0MB8$;$:!"%+!<%=%k0LCV$O(B
+            $B>o$KL5JQ49>uBV$KLa$5$l$?J8;zNs$N@hF,$K$J$j$^$9!#(B
+        $B!|(B $B>C5n$7$?J8@a$,:G8e$NJ8@a$@$C$?$H$-$K%+%l%s%HJ8@a$r0\F0$9$k$+(B
+            $B$I$&$+$O8e=R$N(B .DeleteLastMove $B$N;XDj$G7h$^$j$^$9(B
+------------------------------------------------------------------------------
+delafter[NoInputMode/DictMode] $BL5;k$7$^$9(B
+        [InputMode/ConvedMode] $B%F%-%9%H%+!<%=%k$N$"$k0LCV$+$i8e$m$N(B
+            $B%+%l%s%HJ8@a!"$^$?$O%+%l%s%HJ8@a$r4^$a$?$=$l0J9_$NJQ49Cf$N(B
+            $BJ8;zNs$r>C5n$7$^$9(B
+        [SelectMode] $BA*BrF0:n$r$;$:$KA*BrI=<($r%]%C%W%@%&%s$7$F(B
+            $BJQ498uJdA*Br$N$H$-$O(B ConvedMode $B$K!"5-9fA*Br$N$H$-$O(B NoInputMode
+            $B$+(B InputMode $B$K!"IJ;lA*Br$N$H$-$O(B DictMode($BFI$_F~NO%b!<%I(B)$B$KLa$j!"(B
+            $B$=$l$>$l$N%b!<%I$G$NF0:n$r9T$$$^$9(B
+        $B!|(B $B>C5n$9$kHO0O$r%+%l%s%HJ8@a0J9_A4$F$NJ8;zNs$K$9$k$+!"(B
+            $B%+%l%s%HJ8@aCf$N%F%-%9%H%+!<%=%k$h$j$"$H$NItJ,$K(B
+            $B$9$k$+$O8e=R$N(B .KillBySegment $B$N;XDj$G7h$^$j$^$9(B
+        $B!|(B $BJ8@aC10L$G:G8e$NJ8@a$r>C5n$7$?8e$K%+%l%s%HJ8@a$r(B
+            $B#1$DA0$K0\F0$9$k$+$I$&$+$O8e=R$N(B .DeleteLastMove $B$N;XDj(B
+            $B$G7h$^$j$^$9(B
+------------------------------------------------------------------------------
+start   [NoInputMode/InputMode/ConvedMode] $BJQ49$r=*N;$7$^$9(B
+        [SelectMode]  $BA*BrCf(B($BH?E>$7$F$$$k(B)$B$NJ8;zNs$rA*Br$7$FJQ49$r=*N;$7$^$9(B
+        [DictMode] $BHO0O!?FI$_7hDjCf$O<-=qEPO?!?Ku>C$r2r>C$7$FJQ49$r=*N;$7$^$9(B
+        $B!|JQ49=*N;;~$KJQ49Cf$NJ8;zNs$r3NDj$9$k$+$I$&$+$O8e=R$N(B
+            .FlushEndConversion $B$N;XDj$G7h$^$j$^$9(B
+        $B!|%b!<%II=<($rJQ99$9$k$+$I$&$+$O8e=R$N(B .DisplayModeChange
+            $B$N;XDj$G7h$^$j$^$9(B
+------------------------------------------------------------------------------
+reconnect[InputMode/ConvedMode/SelectMode/DictMode] $B8=:_JQ49Cf!"(B
+            first server $B$+(B second server $B$+$I$A$i$+$K:F@\B32DG=$J$i$P(B
+            $B:F@\B3$7!"(BNoInputMode $B$K$7$^$9(B
+            $B:F@\B3$K<:GT$7$?>l9g(B kinput2 $B$r=*N;$7$^$9(B
+        $B!|%b!<%II=<($rJQ99$9$k$+$I$&$+$O8e=R$N(B .DisplayModeChange
+            $B$N;XDj$G7h$^$j$^$9(B
+------------------------------------------------------------------------------
+saihenkan[InputMode/ConvedMode/SelectMode/DictMode] $B%(%i!<$G$"$k$3$H$r(B
+            $BL@<($9$k$?$a%Y%k$rLD$i$7$^$9(B
+        [NoInputMode] $BD>A0$K3NDj$7$?J8;zNs$r:FEY8F$S=P$7$FJT=82DG=$K(B
+            $B$7$^$9(B $B;w$?$h$&$JJQ49$r2?EY$b9T$C$?$j!"$J$s$i$+$N860x$G(B
+            $BJQ49%5!<%P$,%@%&%s$7$?$H$-$K:F@\B3A0$KJQ49Cf$@$C$?J8;zNs$r(B
+            $B8F$S=P$9$N$K$OJXMx$J5!G=$G$9(B
+        $B!|:FEYJQ49J8;zNs$r8F$S=P$9:]$KCmL\$9$kJ8@a$N0LCV$O8e=R$N(B
+            .BeginConversionLast $B$N;XDj$G7h$^$j$^$9(B
+------------------------------------------------------------------------------
+reconvert           "saihenkan" $B$HF1$8$G$9(B
+------------------------------------------------------------------------------
+edit    [NoInputMode] $BL5;k$7$^$9(B
+        [InputMode/ConvedMode] $B%+%l%s%HJ8@a$r$+$J4A;zJQ49A0$N>uBV$KLa$7!"(B
+            InputMode $B$K$7!"(B
+        [SelectMode] $B8uJd0lMw$r%]%C%W%@%&%s$7!"%+%l%s%HJ8@a$r(B
+            $B$+$J4A;zJQ49A0$N>uBV$KLa$7!"(BInputMode $B$K$7$^$9(B
+        [DictMode] $BFI$_F~NO%&%#%s%I%&$r$r%]%C%W%@%&%s$7!"%+%l%s%HJ8@a$r(B
+            $B$+$J4A;zJQ49A0$N>uBV$KLa$7!"(BInputMode $B$K$7$^$9(B
+        $B!|(Bmuhen/unconvert $B$H0[$J$kE@$O(B .MuhenkanSegment $B$N;XDj(B
+            $B$K4X78$J$/>o$K%+%l%s%HJ8@a#1J8@a$N$_$+$J4A;zJQ49A0(B
+            $B$N>uBV$KLa$7!"99$K(B .MoveBySegment $B$N;XDj$,(B InputMode $B$KBP$7$F(B
+            on $B$N;~$G$bJ8;zF~NO2DG=$K$9$kE@$G$9!#(B
+        $B!|L5JQ498e$N%F%-%9%H%+!<%=%k$N0LCV$O(B .EditCursorLast $B$N;XDj$G(B
+            $B7h$^$j$^$9(B
+        $B!|%b!<%II=<($rJQ99$9$k$+$I$&$+$O8e=R$N(B .DisplayModeChange
+            $B$N;XDj$G7h$^$j$^$9(B
+------------------------------------------------------------------------------
+toroku  [InputMode/ConvedMode] $B<-=qEPO?$r3+;O$7!"(BDictMode $B$K$7$^$9(B
+        [NoInputMode/SelectMode/DictMode] $B%(%i!<$G$"$k$3$H$r(B
+            $BL@<($9$k$?$a%Y%k$rLD$i$7$^$9(B
+        $B!|%b!<%II=<($rJQ99$9$k$+$I$&$+$O8e=R$N(B .DisplayModeChange
+            $B$N;XDj$G7h$^$j$^$9(B
+------------------------------------------------------------------------------
+register            "toroku" $B$HF1$8$G$9(B
+------------------------------------------------------------------------------
+syoukyo [InputMode/ConvedMode] $B<-=q$+$i$NKu>C$r3+;O$7!"(BDictMode $B$K$7$^$9(B
+        [NoInputMode/SelectMode/DictMode] $B%(%i!<$G$"$k$3$H$r(B
+            $BL@<($9$k$?$a%Y%k$rLD$i$7$^$9(B
+        $B!|%b!<%II=<($rJQ99$9$k$+$I$&$+$O8e=R$N(B .DisplayModeChange
+            $B$N;XDj$G7h$^$j$^$9(B
+------------------------------------------------------------------------------
+eliminate           "syoukyo" $B$HF1$8$G$9(B
+------------------------------------------------------------------------------
+symbol  [NoInputMode/InputMode/ConvedMode] $B5-9fA*Br$r3+;O$7!"(B
+            SelectMode $B$K$7$^$9(B
+        [SelectMode/DictMode] $B%(%i!<$G$"$k$3$H$rL@<($9$k$?$a%Y%k$rLD$i$7$^$9(B
+        $B!|5-9fA*Br3+;O;~$KJQ49Cf$NJ8;zNs$r3NDj$9$k$+$I$&$+$O8e=R$N(B
+            .FlushInConverion $B$N;XDj$G7h$^$j$^$9(B
+        $B!|(BConvedMode $B$N>l9g!"A*Br3+;O;~$K3NDj$9$k$+!"L5JQ49>uBV$K$9$k$+!"(B
+            $B?7$?$JJ8@a$H$7$FF~NO$9$k$+$I$&$+$O(B FlushInConversion $B$N;XDj$G(B
+            $B$G7h$^$j$^$9(B
+------------------------------------------------------------------------------
+quote   [NoInputMode/InputMode/ConvedMode/SelectMode/DictMode] 
+            $B<!$N#1J8;z$rL5>r7o$KF~NO$7$^$9(B
+        $B!|DL>o$O%3%s%m!<%k%3!<%I$OJQ49J8;zNs$KF~NO$5$l$^$;$s$,!"(B
+            $B$3$N>l9g$O<!$KF~NO$5$l$k%3%s%m!<%k%3!<%I$bL5>r7o$K(B
+            $BF~NO$r5v$7$^$9(B
+        $B!|<!$NF~NO$N:]$K3F%U%!%s%/%7%g%s$N5!G=$rF1;~$K<B9T$9$k$+$I$&$+$O(B
+            $B8e=R$N(B .InputSameTime $B$N;XDj$G7h$^$j$^$9(B
+------------------------------------------------------------------------------
+flushbefore[NoInputMode/DictMode] $BL5;k$7$^$9(B
+        [InputMode/ConvedMode] $B%+%l%s%HJ8@a$N%F%-%9%H%+!<%=%k$h$j(B
+            $BA0$NJQ49Cf$NJ8;zNs$rItJ,3NDj$7$^$9(B
+        [SelectMode] $BA*Br$rCfCG$7$F$=$l$>$l!"8uJdA*Br$N>l9g$O(B
+            ConvedMode $B$K5-9fA*Br$N$H$-$O(B NoInputMode/InputMode $B$K(B
+            $BIJ;lA*Br$N>l9g$O(B DictMode $B$KLa$j!"$=$l$>$l$NJQ49%b!<%I$N$H$-$N(B
+            $BF0:n$r$7$^$9!#(B
+        $B!|ItJ,3NDj$9$kA0$KL5JQ49>uBV$K$K$9$k$+!"$^$?!"L5JQ49>uBV$K$K$9$k(B
+            $BNN0h$O8e=R$N(B .FlushChangeSegment $B$N;XDj$G7h$^$j$^$9(B
+        $B!|L5JQ498e$N%F%-%9%H%+!<%=%k$N0LCV$O(B .FlushCursorLast $B$N;XDj$G(B
+            $B7h$^$j$^$9(B
+        $B!|%b!<%II=<($rJQ99$9$k$+$I$&$+$O8e=R$N(B .DisplayModeChange
+            $B$N;XDj$G7h$^$j$^$9(B
+------------------------------------------------------------------------------
+bell    [NoInputMode/InputMode/ConvedMode/SelectMode/DictMode] 
+            $B%Y%k$rLD$i$7$^$9(B
+------------------------------------------------------------------------------
+kana    [NoInputMode/InputMode/ConvedMode/SelectMode/DictMode] 
+            $B$+$J%-!<%\!<%IF~NO$H%"%9%-!<%-!<%\!<%IF~NO$r%H%0%k$7$^$9(B
+            $B!J5?;w$+$J%m%C%/%-!<$H$7$F;HMQ$9$k%-!<!&%P%$%s%I$r;XDj$7$^$9!K(B
+        $B!|%-!<%\!<%I$N=i4|%b!<%I$O(B .KanaInputOnly $B$N;XDj$G7h$^$j$^$9(B
+------------------------------------------------------------------------------
+sjrc    [NoInputMode/InputMode/ConvedMode/SelectMode/DictMode] 
+            $BJQ49Cf$NJ8;zNs$r3NDj!?%-%c%s%;%k$7!":FEY(B sjrc
+            $B%U%!%$%k$rFI$_9~$_!"8=:_$N@_Dj$K>e=q$-$9$k7A$G(B
+            ($BFbIt%G%U%)%k%H$K$K$O:F=i4|2=$7$J$$(B) key table
+            $B$d%+%9%?%$%^%$%:MQ$N%U%i%0$r:F@_Dj$7$^$9!#(B
+        $B!|:FFI$_9~$_;~$KJQ49Cf$NJ8;zNs$r3NDj$9$k$+$I$&$+$O8e=R$N(B
+            .FlushEndConversion $B$N;XDj$G7h$^$j$^$9(B
+        $B!|%b!<%II=<($rJQ99$9$k$+$I$&$+$O8e=R$N(B .DisplayModeChange
+            $B$N;XDj$G7h$^$j$^$9(B
+        $B!|%U%!%s%/%7%g%s<B9T;~$KFI$_9~$^$l$k(B sjrc $B%U%!%$%k$O(B
+            $B8e=R$N(B .NextRCFile $B$N;XDj$G7h$^$j$^$9!#(B
+------------------------------------------------------------------------------
+kill    [NoInputMode/InputMode/ConvedMode/SelectMode/DictMode] 
+            kinput2 $B<+BN$r=*N;$7$^$9(B
+        $B!|$3$N5!G=$O$^$@%5%]!<%H$5$l$F$$$^$;$s(B
+        $B!|=*N;;~$KJQ49Cf$NJ8;zNs$r3NDj$9$k$+$I$&$+$O8e=R$N(B
+            .FlushEndConversion $B$N;XDj$G7h$^$j$^$9(B
+------------------------------------------------------------------------------
+null    [NoInputMode/InputMode/ConvedMode/SelectMode/DictMode] 
+            $BL5;k$7$^$9!J2?$b$7$^$;$s!K%G%U%)%k%H$G%P%$%s%I$5$l$F$$$k(B
+            $B%-!<!&%P%$%s%I$KBP$7$F2?$b$7$J$$$h$&$K$9$k$H$-$J$I$K;H$$$^$9(B
+------------------------------------------------------------------------------
+ignore  [NoInputMode/InputMode/ConvedMode/SelectMode/DictMode] 
+            $B%G%U%)%k%H$N%P%$%s%I$b4^$a$F4{$K%P%$%s%I$5$l$F$$$k(B
+            $B%-!<!&%P%$%s%I$H=E$J$k>l9g$=$N%P%$%s%I$r(B
+            $B%-!<!&%P%$%s%I$H%U%!%s%/%7%g%s$NBP1~%F!<%V%k$+$i(B
+            $B:o=|$7$^$9!#%F!<%V%k<+BN$+$i:o=|$9$kE@$,(B null $B$H(B
+            $B0[$J$kE@$G$9!#(B
+------------------------------------------------------------------------------
+
+        (2) [$BJQ49(B Mode/Modifier]/[KeySym] $B%U%#!<%k%I$N;XDj$N$7$+$?(B
+
+        $B$3$N%(%s%H%j$K$O#1HVL\$N%(%s%H%j$N%U%!%s%/%7%g%s$r(B
+        $B8F$S=P$9$H$-$NJQ49%b!<%I$H%-!<A`:n$r;XDj$7$^$9!#(B
+        [$BJQ49(B Mode/Modifier] $B$O0J2<$NNc$N$h$&$K$=$l$>$l(B '|' $B$G(B
+        OR $B$r<h$k$3$H$,$G$-$^$9(B
+
+        [Modifier] $B$O>.J8;z$G!"(B[$BJQ49(B Mode] $B$OBgJ8;z$+$i;O$^$k(B
+        $BH>3Q%"%k%U%!%Y%C%HJ8;zNs$G;XDj$7$^$9(B
+        [$BJQ49(B Mode] $B$N;XDjJ}K!$O(B kinput2 sj3 $BHG$N=i4|%P!<%8%g%s$H$O(B
+        $B<c430[$J$C$F$$$^$9$,>e0L8_49@-$O0];}$7$F$$$^$9!#(B
+
+        $BNc(B (Control Key $B$H(B Shift Key $B$,F1;~$K2!$5$lJQ49%b!<%I$,(B
+            InputMode $B$N$H$-$K(B KeySym $BL>$,(B 'd' $B$N%-!<$,2!$5$l$k$H(B
+            $B%U%!%s%/%7%g%s(B "toroku" $B$N5!G=$r8F$S=P$9(B
+
+        .ki2key.toroku    c|s|I                     d
+        .ki2key.toroku    control|shift|Input       d
+
+        [$BJQ49(B Mode/Modifier] $B$K(B '|' $B$G6h@Z$C$F(B
+        $B;XDj$G$-$k$b$N$H$=$N0UL#$O0J2<$N$H$*$j$G$9(B
+        $B;XDj$O:G=i$N#1J8;z$7$+8+$J$$$N$G#1J8;z$K>JN,2DG=$G$9!#(B
+        $B!J:G=i$N#1J8;z$,(B 'm' $B$N$H$-$O:G8e$N#1J8;z$b$_$^$9!K(B
+        $B$?$@$7!"BgJ8;z!?>.J8;z$N6hJL$O=EMW$G$9!#(B
+
+        none        $BF1;~$K%b%G%#%U%!%$%"%-!<$,$J$K$b2!$5$l$J$$$H$-(B
+        shift       Shift-Key $B$,F1;~$K2!$5$l$?$H$-(B
+        control     Control-Key $B$,F1;~$K2!$5$l$?$H$-(B
+        mod         Mod1-Key (Meta-Key) $B$,F1;~$K2!$5$l$?$H$-(B
+        lock        Lock-Key $B$,F1;~$K2!$5$l$?$H$-(B
+        mod1        Mod1-Key (Meta-Key) $B$,F1;~$K2!$5$l$?$H$-(B
+        mod2        Mod2-Key $B$,F1;~$K2!$5$l$?$H$-(B
+        mod3        Mod3-Key $B$,F1;~$K2!$5$l$?$H$-(B
+        mod4        Mod4-Key $B$,F1;~$K2!$5$l$?$H$-(B
+        mod5        Mod5-Key $B$,F1;~$K2!$5$l$?$H$-(B
+        kana        $B$+$J%m%C%/;~$K(B Mode_switch $B$N%-!<$,(B
+                    $B%b%G%#%U%!%$%"$H$7$F%;%C%H$5$l$F$$$k$H$-(B
+
+        NoInput     $BJQ49%b!<%I$,(B NoInputMode $B$N;~(B
+        Input       $BJQ49%b!<%I$,(B InputMode $B$N;~(B
+        Conved      $BJQ49%b!<%I$,(B ConvedMode $B$N;~(B
+        Select      $BJQ49%b!<%I$,(B SelectMode $B$N;~(B
+        Dict        $BJQ49%b!<%I$,(B DictMode $B$N;~(B
+        Output      $BJQ49%b!<%I$,(B ConvedMode $B$+(B SelectMode $B$N;~(B ('C|S' $B$HF1$8(B)
+        Flush       $BJQ49%b!<%I$,(B InputMode $B$+(B ConvedMode $B$N;~(B ('I|C' $B$HF1$8(B)
+        All         $B$9$Y$F$NJQ49%b!<%I$N;~(B ('N|I|C|S|D' $B$HF1$8(B)
+
+        $B$?$@$7!"(B[$BJQ49(B Mode/Modifier] $B$N%(%s%H%j$,!"(Bnone$B!"(Bshift$B!"(Bcontrol$B!"(B
+        mod1$B!"(Block$B!"$NAH9g$;$@$1$G=q$+$l$F$$$k$H$-$O$=$NA`:n$O$9$Y$F$N(B
+        $BJQ49%b!<%I$N;~$KM-8z$K$J$j$^$9(B( 'All' $B$,(B OR $B$G;XDj$5$l$?$N$H(B
+        $BF1$8$K$J$k(B)
+
+        [KeySym] $B$N%U%#!<%k%I$K$O(B KeySym $BL>$r;XDj$7$^$9!#(B
+        $B4V0c$C$?(B keysym $B$r;XDj$9$k$H(B function $B$K(B "ignore" $B$r(B
+        $B;XDj$9$k$N$HF1$8$K$J$j$^$9!#(B
+         KeySym $BL>$O(B XKeysymToString(3X11) $B$N%j%?!<%sCM!"(B
+        xmodmap -pk $B$NI=<(Ey$+$iF@$k$3$H$,$G$-$^$9!#(B
+
+        (3) [InputSame] $B%U%#!<%k%I$N;XDj$N$7$+$?(B
+
+        $B$3$N%U%#!<%k%I$O>JN,2DG=$G!"J8;zF~NO2DG=$J(B
+        $B%-!<!&%P%$%s%I$H=E$J$C$?$H$-$K%U%!%s%/%7%g%s$NA`:n$N<B9T$HF1;~$K(B
+        $BJ8;zF~NO$b9T$&$+$I$&$+$r;XDj$7$^$9!#$3$N>l9g$NF0:n;XDj$N(B
+        $B%j%=!<%9$H$7$F$O8e=R$N(B .InputSameTime $B$b$"$j$^$9$,!"(B
+        .InputSameTime $B$,A4$F$N%-!<!&%P%$%s%I$K$D$$$FM-8z$K$J$k$N$K(B
+        $BBP$7$F!"$3$N%U%#!<%k%I$N;XDj$O8DJL$N%-!<!&%P%$%s%I$K$D$$$F(B
+        $B$7$FM-8z$K$J$j$^$9!#(B.InputSameTime $B$N;XDj$H$3$N%U%#!<%k%I$N;XDj(B
+        $B$,0[$J$k>l9g$O$3$N%U%#!<%k%I$N;XDj$,M%@h$5$l$^$9!#(B
+
+        $B;XDj$G$-$kCM$H$=$N0UL#$O0J2<$N$H$*$j$G$9!#(B
+
+        on      $BJ8;zF~NO$rF1;~$K9T$$$^$9!#(B
+        off     $B%U%!%s%/%7%g%s$NA`:n$N$_<B9T$7$^$9(B
+        none    .InputSameTime $B$N;XDj$K0MB8$7$^$9(B($B%G%U%)%k%HCM(B)
+
+        $BNc(B
+        sjrk $B%U%!%$%k$K0J2<$N$h$&$J5-=R$,$"$C$F(B
+        .       $B!#(B
+        sjrc $B%U%!%$%k$K0J2<$N$h$&$J5-=R$,$"$k>l9g!"(B
+        .ki2key.convert   F   period   on
+
+        .InputSameTime $B$N;XDj$K4X78$J$/!V(B.$B!W$NF~NO$HF1;~$K(B
+        $B!V!#!W$KJQ49$5$l!"JQ49Cf$NJ8;zNs$KBP$7$F(B convert $B$N(B
+        $B%U%!%s%/%7%g%s$,<B9T$5$l$^$9!#(B
+
+        (4) $B%W%m%0%i%`FbIt$G$N%G%U%)%k%H$N%-!<!&%P%$%s%I(B
+
+        $BFbIt$N%G%U%)%k%H$N%-!<!&%P%$%s%I$r(B sjrc $B$K;XDj$9$k7A<0$G(B
+        $B<($9$H0J2<$N$h$&$K$J$j$^$9!#(B
+        sjrc $B$KA05-$N$h$&$J%U%)!<%^%C%H$G5-=R$9$k$3$H$K$h$C$F(B
+        $B0[$J$k%-!<!&%P%$%s%I$rDI2C$7$?$jJQ99$7$?$j$G$-$^$9!#(B
+        ignore $B%U%!%s%/%7%g%s$r;HMQ$7$F>e=q$-$9$l$P(B kinput2 $B$G$O(B
+        $B;HMQ$;$:!"%"%W%j%1!<%7%g%s$K%$%Y%s%H$rEO$9$h$&$K$b$G$-$^$9!#(B
+
+        KeySym $B$H(B Modifier $B%-!<$NAH9g$;$,F1$8$G!"F10l$NJQ49%b!<%I$G(B
+        $BM-8z$K$J$k$h$&$K;XDj$7$?%-!<!&%P%$%s%I$,$"$C$?>l9g$O8e$K(B
+        $B5-=R$5$l$?$b$N$,M-8z$K$J$j$^$9!#(B
+
+[Function]  [Modifier/$BJQ49(B Mode]    [Keysym] 
+
+.ki2key.henkan          F           Select
+.ki2key.convert         F           Select
+.ki2key.muhen           s|C         Cancel
+.ki2key.unconvert       s|C         Cancel
+.ki2key.fix             F|D         Execute
+.ki2key.kettei          F           KP_Enter
+.ki2key.flush           F           Escape
+.ki2key.return          A           Return
+.ki2key.halpha          A           F6
+.ki2key.zalpha          A           F7
+.ki2key.hkatakana       A           F8
+.ki2key.zkatakana       A           F9
+.ki2key.hiragana        A           F10
+.ki2key.tohalpha        s|F         F16
+.ki2key.tozalpha        s|F         F17
+.ki2key.tohkatakana     s|F         F18
+.ki2key.tozkatakana     s|F         F19
+.ki2key.tohiragana      s|F         F20
+.ki2key.zenkaku         F           F4
+.ki2key.hankaku         F           F3
+.ki2key.toupper         c|F         u
+.ki2key.tolower         c|F         l
+.ki2key.sjis            s|N|F       F15
+.ki2key.euc             s|N|F       F14
+.ki2key.jis             s|N|F       F13
+.ki2key.kuten           s|N|F       F12
+.ki2key.code            N|F         F5
+.ki2key.modedown        A           Tab
+.ki2key.toggle          A           Tab
+.ki2key.modeup          s|A         Tab
+.ki2key.toggleback      s|A         Tab
+.ki2key.nextmode        c|F         Tab
+.ki2key.prevmode        s|c|F       Tab
+.ki2key.muhenkan        N|F         Cancel
+.ki2key.right           A           Right
+.ki2key.forward         A           Right
+.ki2key.left            A           Left
+.ki2key.backward        A           Left
+.ki2key.top             c|F|D       a
+.ki2key.end             c|F|D       e
+.ki2key.bottom          c|F|D       e
+.ki2key.up              S           Up
+.ki2key.down            S           Down
+.ki2key.first           c|O         Up
+.ki2key.last            c|O         Down
+.ki2key.nextp           S           Select
+.ki2key.prevp           S           Cancel
+.ki2key.wrap            s|C         Down
+.ki2key.next            s|C         Down
+.ki2key.wrapback        s|C         Up
+.ki2key.prev            s|C         Up
+.ki2key.select          S           Execute
+.ki2key.cancel          S|D         Escape
+.ki2key.cancel          s|F         Cancel
+.ki2key.kakucyou        F|D         Up
+.ki2key.expand          F|D         Up
+.ki2key.syukusyou       F|D         Down
+.ki2key.shrink          F|D         Down
+.ki2key.backspace       F|S|D       BackSpace
+.ki2key.delete          F|S|D       Delete
+.ki2key.delafter        c|F         k
+.ki2key.start           s|A         Kanji
+.ki2key.reconnect       m|s|A       Kanji
+.ki2key.saihenkan       c|N         Select
+.ki2key.reconvert       c|N         Select
+.ki2key.edit            m|C         Select
+.ki2key.toroku          C           F1
+.ki2key.register        C           F1
+.ki2key.syoukyo         C           F2
+.ki2key.eliminate       C           F2
+.ki2key.symbol          s|N|F       Escape
+.ki2key.quote           c|N|F       q
+
+    [2] $B%b!<%II=<(J8;zNs$N%+%9%?%^%$%:J}K!(B
+    
+    $B%b!<%II=<(J8;zNs$N%+%9%?%^%$%:(B
+    $B$O(B sjrc $B%U%!%$%k$G9T$$$^$9!#(B
+    format $B$O0J2<$N$h$&$K(B $B#1$D$N%(%s%H%j(B(keyword + 1 value)
+    $B$+$i$J$j$^$9!#(B
+
+    .guide.[$B%b!<%IL>(B]       [$B%b!<%II=<(J8;zNs(B]
+
+        (1) [$B%b!<%IL>(B] $B$K;XDj$G$-$k$b$N(B
+
+        $B%b!<%IL>;XDj$G$-$k$b$N$K$O0J2<$N$b$N$,$"$j$^$9(B
+        hiragana$B!A(Bsyoukyo $B$h$j8e$N$b$N$O(B Xsj3clib $B$G5!G=3HD%$5$l$?$b$N$G$9!#(B
+
+------------------------------------------------------------------------------
+hiragana    $B%m!<%^;zF~NO!?$+$JF~NO%b!<%I$GF~NOJ8;z<o$,$R$i$,$J!?A43Q%+%?%+%J(B
+            $B$N$H$-$KI=<($9$kJ8;zNs$r;XDj;~$K;XDj$7$^$9(B
+------------------------------------------------------------------------------
+zkatakana   $B%m!<%^;zF~NO!?$+$JF~NO%b!<%I$GF~NOJ8;z<o$,A43Q%+%?%+%J$N$H$-$K(B
+            $BI=<($9$kJ8;zNs$r;XDj;~$K;XDj$7$^$9(B
+------------------------------------------------------------------------------
+hkatakana   $B%m!<%^;zF~NO!?$+$JF~NO%b!<%I$GF~NOJ8;z<o$,H>3Q%+%?%+%J$N$H$-$K(B
+            $BI=<($9$kJ8;zNs$r;XDj;~$K;XDj$7$^$9(B
+------------------------------------------------------------------------------
+zalpha      $B%m!<%^;zF~NO%b!<%I$GF~NOJ8;z<o$,A43Q%"%k%U%!%Y%C%H$N$H$-$K(B
+            $BI=<($9$kJ8;zNs$r;XDj;~$K;XDj$7$^$9(B
+------------------------------------------------------------------------------
+halpha      $B%m!<%^;zF~NO%b!<%I$GF~NOJ8;z<o$,H>3Q%"%k%U%!%Y%C%H$N$H$-$K(B
+            $BI=<($9$kJ8;zNs$r;XDj;~$K;XDj$7$^$9(B
+------------------------------------------------------------------------------
+sjis        $B%3!<%IF~NO%b!<%I$G(B Shift-JIS $BF~NO$N;~$KI=<($9$kJ8;zNs$r(B
+            $B;XDj$7$^$9(B
+------------------------------------------------------------------------------
+jis         $B%3!<%IF~NO%b!<%I$G(B JIS $BF~NO$N;~$KI=<($9$kJ8;zNs$r(B
+            $B;XDj$7$^$9(B
+------------------------------------------------------------------------------
+euc         $B%3!<%IF~NO%b!<%I$G(B EUC $BF~NO$N;~$KI=<($9$kJ8;zNs$r(B
+            $B;XDj$7$^$9(B
+------------------------------------------------------------------------------
+kuten       $B%3!<%IF~NO%b!<%I$G6hE@%3!<%IF~NO$N;~$KI=<($9$kJ8;zNs$r(B
+            $B;XDj$7$^$9(B
+------------------------------------------------------------------------------
+toroku      $B<-=qEPO?$N;~$KI=<($9$kJ8;zNs$r;XDj$7$^$9(B
+            $B!|EPO?;~$K%b!<%II=<($rJQ99$9$k$+$I$&$+$O8e=R$N(B .DisplayModeChange 
+                $B$N;XDj$G$G7h$^$j$^$9(B
+------------------------------------------------------------------------------
+register    toroku $B$HF1$8$G$9(B
+------------------------------------------------------------------------------
+syoukyo     $B<-=qEPO?Ku>C$N;~$KI=<($9$kJ8;zNs$r;XDj$7$^$9(B
+            $B!|Ku>C;~$K%b!<%II=<($rJQ99$9$k$+$I$&$+$O8e=R$N(B .DisplayModeChange 
+                $B$N;XDj$G$G7h$^$j$^$9(B
+------------------------------------------------------------------------------
+eliminate   syoukyo $B$HF1$8$G$9(B
+------------------------------------------------------------------------------
+kanji       $BA4$F$NJ8@a$NJQ49%b!<%I$,(B ConvedMode $B$N$H$-$KI=<($9$kJ8;zNs$r(B
+            $B;XDj$7$^$9(B
+            $B!|JQ49;~$K%b!<%II=<($rJQ99$9$k$+$I$&$+$O8e=R$N(B .DisplayModeChange 
+                $B$N;XDj$G$G7h$^$j$^$9(B
+------------------------------------------------------------------------------
+edit        $BJQ49Cf$NJ8;zNs$KJQ49%b!<%I$,(B InputMode/ConvedMode $BAPJ}$N(B
+            $BJ8@a$,$"$k$H$-$KI=<($9$kJ8;zNs$r;XDj$7$^$9(B
+            $B!|%b!<%II=<($rJQ99$9$k$+$I$&$+$O8e=R$N(B .DisplayModeChange 
+                $B$N;XDj$G$G7h$^$j$^$9(B
+------------------------------------------------------------------------------
+candidate   $BJQ49%b!<%I$,(B SelectMode $B$G8uJdA*Br$N$H$-$K$KI=<($9$kJ8;zNs$r(B
+            $B;XDj$7$^$9(B
+            $B!|%b!<%II=<($rJQ99$9$k$+$I$&$+$O8e=R$N(B .DisplayModeChange 
+                $B$N;XDj$G$G7h$^$j$^$9(B
+------------------------------------------------------------------------------
+symbol      $BJQ49%b!<%I$,(B SelectMode $B$G5-9fA*Br$N$H$-$K$KI=<($9$kJ8;zNs$r(B
+            $B;XDj$7$^$9(B
+            $B!|%b!<%II=<($rJQ99$9$k$+$I$&$+$O8e=R$N(B .DisplayModeChange 
+                $B$N;XDj$G$G7h$^$j$^$9(B
+------------------------------------------------------------------------------
+hinsi       $BJQ49%b!<%I$,(B SelectMode $B$GIJ;lA*Br$N$H$-$K$KI=<($9$kJ8;zNs$r(B
+            $B;XDj$7$^$9(B
+            $B!|%b!<%II=<($rJQ99$9$k$+$I$&$+$O8e=R$N(B .DisplayModeChange 
+                $B$N;XDj$G$G7h$^$j$^$9(B
+------------------------------------------------------------------------------
+quote       $B%U%!%s%/%7%g%s$N(B quote $B$r8F$S=P$7$F0zMQJ8;zNs$NA^F~$r(B
+            $B9T$&$H$-$K$KI=<($9$kJ8;zNs$r;XDj$7$^$9(B
+            $B!|%b!<%II=<($rJQ99$9$k$+$I$&$+$O8e=R$N(B .DisplayModeChange 
+                $B$N;XDj$G$G7h$^$j$^$9(B
+------------------------------------------------------------------------------
+    
+    2. [$B%b!<%II=<(J8;zNs(B] $B$K;XDj$G$-$k$b$N(B
+
+        [$B%b!<%II=<(J8;zNs(B] $B$K$OA43QJ8;z!?H>3QJ8;z$NN>J}$r;XDj$G$-$^$9$,!"(B
+        $B;XDj$G$-$k%3!<%I$K$D$$$F$OA0>O(B(<3> $B$N(B [5])$B$N5-=R$r$4Mw$/$@$5$$!#(B
+
+    3. $B%G%U%)%k%H$N%b!<%II=<(J8;zNs$N;XDj(B
+
+        $B%G%U%)%k%H$NI=<(J8;zNs$N;XDj$O0J2<$N$h$&$K$J$C$F$$$^$9!#(B
+        
+.guide.hiragana     $B$+$J(B
+.guide.zkatakana    $BA4%+%J(B
+.guide.hkatakana    $BH>%+%J(B
+.guide.zalpha       ABC
+.guide.halpha       $B#A#B#C(B
+.guide.sjis         Shift-JIS
+.guide.jis          $B#J#I#S(B
+.guide.euc          $B#E#U#C(B
+.guide.kuten        $B6hE@(B
+.guide.toroku       $BEPO?(B 
+.guide.syoukyo      $B>C5n(B
+.guide.kanji        $B4A;z(B
+.guide.edit         $BJT=8(B
+.guide.candidate    $B0lMw(B
+.guide.symbol       $B5-9f(B
+.guide.hinsi        $BIJ;l(B
+.guide.quote        $B0zMQ(B
+
+    [3] $B$=$NB>$N3F<o%f!<%6!&%$%s%?!<%U%'!<%9$N%+%9%?%^%$%:J}K!(B
+
+    Sj3Object $B$G$O$=$NB>!"MM!9$J%f!<%6!&%$%s%?!<%U%'!<%9$r(B
+    $BA*$Y$k$h$&$K(B sjrc $B%U%!%$%k$G%+%9%?%^%$%:$9$k$3$H$,$G$-$^$9!#(B
+    $B$=$l$>$l$N%j%=!<%9$O0J2<$N$b$N$KJ,$1$i$l$^$9!#(B
+
+    (1) sj2/sjx/sj3 $B$H6&DL$N%j%=!<%9(B(3. 4. 5. 7. 8. 9, 10. 11.)
+    (2) sj2/sjx/sj3 $B$K$"$k%j%=!<%9$N2r<a$r3HD%$7$?$b$N(B(1. 2. 6.)
+    (3) Xsj3clib $B$G$N%*%j%8%J%k$N%j%=!<%9(B(12.$B!A(B51.)
+
+    1. $BF~NOJ8;z<o$NJQ99=g$r;XDj$9$k(B
+
+[format] .InitialMode [$BJ8;z<oL>!?%3!<%IL>(B].[$BJ8;z<oL>!?%3!<%IL>(B].$B!E(B
+[default value] hiragana.zkatakana.hkatakana.zalpha.halpha.sjis.euc.jis.kuten
+
+        modedown(toggle)/modeup(toggleback) $B%U%!%s%/%7%g%s!J(B<4>[1]$B;2>H!K(B
+        $B$G$NF~NOJ8;z<o!J%3!<%I!K$NJQ99=g$r;XDj$7$^$9!#0lHV:8$K;XDj$5$l$?(B
+        $BF~NOJ8;z<o!J%3!<%I!K$OJQ495!G=$r=i$a$F8F$S=P$7$?$H$-$N(B
+        $BF~NOJ8;z<o!"$^$?$O(B modedown(toggle) $B$GJQ99A0$NF~NOJ8;z<o$,(B
+        $B$3$N%j%=!<%9Cf$K$J$$$H$-$KJQ99$5$l$kF~NOJ8;z<o$K$J$j$^$9!#(B
+        $BF1MM$K0lHV1&$K;XDj$5$l$?J8;z<o$O(B modeup(toggleback) $B$GJQ99A0$N(B
+        $BF~NOJ8;z<o$,$3$N%j%=!<%9Cf$K$J$$$H$-$KJQ99$5$l$kJ8;z<o$K$J$j$^$9!#(B
+
+        $B;XDj$G$-$kF~NOJ8;z<o!J%3!<%I!KL>$O(B hiragana/zkatakana/hkatakana/
+        zalpha/halpha/sjis/jis/euc/kuten $B$N#9$D$G$9!#(B
+        sj2/sj3/sjx $B$H$N8_49@-$N$?$a!"$O(B unbuff/buffer/direct $B$b(B
+        $B;XDj$G$-$^$9$,L5;k$5$l$^$9!#(B
+
+    2. $B%3!<%IF~NO$NJQ99=g$r;XDj$9$k(B
+
+[format] .DefaultCode [$B%3!<%IL>(B].[$B%3!<%IL>(B]$B!E(B
+[default value] sjis.euc.jis.kuten      
+
+        code $B%U%!%s%/%7%g%s$N5!G=$r8F$S=P$7$?$H$-$N(B
+        $BF~NO%3!<%I$NJQ99=g$r;XDj$7$^$9!#(B
+        $B;XDj$G$-$k%3!<%I$O(B sjis/jis/euc/kuten $B$G$9!#(B
+
+    3. NoInputMode/InputMode $B$G%U%!%s%/%7%g%s(B muhenkan $B$r8F$S=P$7$?(B
+        $B>l9g$KF~NOJ8;z<o$,$R$i$,$J$N$H$-$NJQ99J8;z<o;XDj(B
+    
+[format] .MuhenkanMode [$BJ8;z<oL>(B]
+[default value] halpha
+
+        $BJQ49%b!<%I$,(B NoInputMode/InputMode $B$G%U%!%s%/%7%g%s(B muhenkan
+        $B$r8F$S=P$7$?;~$KF~NOJ8;z<o$,$R$i$,$J$N$H$-$OF~NOJ8;z<o$r(B
+        $B;XDj$5$l$?J8;z<o$KJQ99$7$^$9!#;XDj$G$-$kJ8;z<o$O(B
+        hiragana/zkatakana/hkatakana/zalpha/halpha $B$N#5$D$G$9!#(B
+
+    4. ConvedMode/DictMode $B$G%U%!%s%/%7%g%s(B muhenkan $B$r8F$S=P$7$?$H$-(B
+        $B$NI=<(J8;z<o$N%H%0%k;XDj(B
+
+[format] .MuhenkanToggle [on/off]
+[default value] on
+
+        $BJQ49%b!<%I$,(B ConvedMode/DictMode $B$G%U%!%s%/%7%g%s(B muhenkan $B$r(B
+        $B8F$S=P$7$?$H$-$KI=<(J8;z<o$N%H%0%kF0:n$r(B
+        $B$r9T$&$+$I$&$+$N;XDj$r(B on/off $B$G9T$$$^$9!#(B
+
+    5. ConvedMode/DictMode $B$G%U%!%s%/%7%g%s(B muhenkan $B$r8F$S=P$7$?$H$-(B
+        $B$N%H%0%kF0:n;~$KI=<(J8;z<o$r$I$NJ8;z<o$K%H%0%k$9$k$+$N;XDj(B
+
+[format] .MuhenkanInEdit [$BJ8;z<oL>(B]
+[default value] halpha
+
+        $BJQ49%b!<%I$,(B ConvedMode $B$G%U%!%s%/%7%g%s(B muhenkan $B$r8F$S=P$7$?$H$-(B
+        $B$KI=<(J8;z<o$,A43Q%+%?%+%J$N$H$-$K$O;XDj$5$l$?J8;z<o$K(B
+        $BI=<(J8;z<o$rJQ99$7$^$9!#;XDj$G$-$k%b!<%I$O(B
+        hiragana/zkatakana/hkatakana/zalpha/halpha $B$N#5$D$G$9!#(B
+
+    6. $B%m!<%^;z$+$JJQ49$G$-$J$$$H$-%Y%k$rLD$i$9$+$N;XDj(B
+
+[format] .rkerrbell [on/off]
+[default value] off
+
+        $B%m!<%^;z$+$JJQ49$K<:GT$7$?$H$-$K%Y%k$rLD$i$9$+$I$&$+$r(B
+        $B$r(B on/off $B$G;XDj$7$^$9!#(BXsj3clib $B$G$O$3$N;XDj$,(B on $B$N$H$-(B
+        $B%3!<%IF~NO$GJQ49$K<:GT$7$?$H$-$b%Y%k$rLD$i$7$^$9!#(B
+
+    7. $BF~NOJ8;z<oJQ99;~$K3NDj$9$k$+$I$&$+$N;XDj(B
+
+[format] .FlushAfterConversion [on/off]
+[default value] off
+
+        
+        $BF~NOJ8;z<o$rJQ99$7$?$H$-$KJQ49Cf$NJ8;zNs$r(B
+        $B3NDj$9$k$+$I$&$+$r(B on/off $B$G;XDj$7$^$9!#%G%U%)%k%H$O(B "off" $B$G$9!#(B
+        
+    8. $BJ8@aD93X=,5!G=$r;HMQ$9$k$+(B
+
+[format] .bstudy [on/off]
+[default value] on
+
+        $BJ8@aD9!JJ8@a4V!K3X=,5!G=$r;HMQ$9$k$+$I$&$+$r(B on/off $B$G;XDj$7$^$9!#(B
+
+    9. first sj3serv $B$N%[%9%HL>;XDj(B
+
+[format] .sj3serv [$B%[%9%HL>(B]
+[default value] NULL(localhost)
+
+        first $BJQ49%5!<%P$H$7$F@\B3$9$k%5!<%P$N%[%9%HL>$r;XDj$7$^$9!#(B
+        $B$3$l$O(B kinput2 $B$N%*%W%7%g%s!J%j%=!<%9!K$G$b;XDj$G$-$^$9!#(B
+        (sj3 $B%3%^%s%I$H$N8_49@-$N$?$a(B .server $B$G$bF1$8$G$9(B)
+
+    10. $BJQ49J8;zNs$,$"$k>uBV$G%"%W%j%1!<%7%g%s$KEO$9%3%s%H%m!<%k%3!<%I$N;XDj(B
+
+[format] .SetNormal
+[default value] NULL
+
+        $BJQ49$r3NDj8e!"JQ49$r=*N;$7!";XDj$5$l$?%3%s%H%m!<%k%3!<%I$r(B
+        $B%/%i%$%"%s%H$KD>@\EO$7$^$9!#$3$N%j%=!<%9$NF0:n$O(B
+        $B8e=R$N(B .ControlSameTime $B$r(B on $B$K$7$F!"$3$3$G;XDj$9$k(B
+        $BJ8;z$N(B KeySym $B$rJQ49=*N;$K3d$jEv$F!"$J$*$+$D!"(B
+        $B8e=R$N(B .FlushEndConversion $B$,(B on $B$N>l9g$HEy2A$G$9!#(B
+
+    11. $B;XDj$5$l$?%3%s%H%m!<%k%3!<%I$HD>8e$KF~NO$5$l$?J8;z$r(B
+        $B%"%W%j%1!<%7%g%s$KEO$9;XDj(B
+
+[format] .ThroughNext
+[default value] NULL
+
+        $BJQ49$r3NDj$7!";XDj$5$l$?%3%s%H%m!<%k%3!<%I$H(B
+        $BD>8e$N#1J8;z$r%/%i%$%"%s%H$KD>@\EO$7$^$9!#(B
+        $B;XDj$5$l$F$$$k%3%s%H%m!<%k%3!<%I$rH/@8$9$k%-!<!&%P%$%s%I$,(B
+        $B%U%!%s%/%7%g%s$K3d$jEv$F$i$l$F$$$k$H$-$KF1;~$K(B
+        $B%3%s%H%m!<%k%3!<%I$r%/%i%$%"%s%H$KEO$9$+$I$&$+$O(B
+        $B8e=R$N(B .ControlSameTime $B$N;XDj$G7h$^$j$^$9!#(B
+
+    12. second sj3serv $B$N%[%9%HL>;XDj(B
+
+[format] .sj3serv2 [$B%[%9%HL>(B]
+[default value] NULL(localhost)
+
+        second $BJQ49%5!<%P$H$7$F@\B3$9$k(B sj3serv $B$N%[%9%HL>$r;XDj$7$^$9!#(B
+        $B$3$l$O(B kinput2 $B$N%*%W%7%g%s!J%j%=!<%9!K$G$b;XDj$G$-$^$9!#(B
+
+    13. $B%"%k%U%!%Y%C%H$rBgJ8;z$KJQ49$9$k$+(B
+
+[format] .AlphabetConversion [on/off]
+[default value] off
+
+        $B%m!<%^;z$+$JJQ49;~$N%"%k%U%!%Y%C%H$rA43Q$KJQ49$9$k$+(B
+        $B$r(B on/off $B$G;XDj$7$^$9!#$3$N;XDj$OI=<(J8;z<o$r(B
+        $B!V$R$i$,$J!W!VA43Q%+%?%+%J!W$KJQ49$9$k>l9g$b(B
+        $BM-8z$G$9!#$?$@$7!"(Bsj3 $B$G$O<-=q$N@-<A>eFI$_$,A43Q$NJ}$,(B
+        $B8uJd$rA*Br$G$-$^$9!#(B(Wnn $B$H5U!'Nc$($P!V#1!W$KBP$7$F$O8uJd(B
+        $B$,$$$/$D$+$"$j$^$9$,!"!V(B1$B!W$K$O$"$j$^$;$s(B)
+
+        $BNc$($P(B NEWS-OS $B$N(B sj2/sj3/sjx $B$NF0:n$O(B on$B!"(B
+        CcWnn/Canna $B$NF0:n$O(B off $B$G$9!#(B(Canna $B$G$O?t;z$K8B$C$F(B
+        $BA43Q$KJQ49$7$^$9$,!"$3$l$O(B sjrk $B%U%!%$%k$G%+%9%?%$%^%$%:2DG=$G$9!#(B
+
+    14. $BJ8;z>C5n;~$NF0:n!JJQ49ESCf$N%m!<%^;z$rI=<($9$k$+!K(B
+
+[format] .BackDisplay [on/off]
+[default value] off
+
+        InputMode $B$G$NJ8;z>C5n;~$KD>A0$KF~NO$7$?%m!<%^;z$+$JJQ49:Q$N(B
+        $BJ8;z$NJQ49ESCf$N%"%k%U%!%Y%C%H$rI=<($9$k$+$I$&$+(B
+        $B$r(B on/off $B$G;XDj$7$^$9!#(B
+        $BNc$($P(B NEWS-OS $B$N(B sj3 $B$NF0:n$O(B on$B!"(BCcWnn/Canna $B$NF0:n$O(B off $B$G$9!#(B
+        sjx $B$G$OJQ49%P%C%U%!$K$"$k$9$Y$F$NJ8;z$K$D$$$F>C5n;~$K(B
+        $BJQ49ESCf$N%"%k%U%!%Y%C%H$rI=<($7$^$9$,!"$3$NJ}K!$O(B
+        $B:#2s$O%5%]!<%H$r8+Aw$j$^$7$?!#(B
+
+    15. $B0l3gJQ49;~$KCmL\$9$k%;%0%a%s%H$N0LCV$N;XDj(B
+
+[format] .BeginConversionLast [on/off/none]
+[default value] on
+
+        $B%U%!%s%/%7%g%s(B henkan(convert) $B$N5!G=$r8F$S=P$7$F0l3gJQ49$r(B
+        $B9T$C$?$H$-$K$I$NJ8@a$r%+%l%s%H(B($BH?E>$7$?(B)$BJ8@a(B
+        $B$K$9$k$+$r;XDj$7$^$9!#(Bon $B$N;~$O:G8e$NJ8@a$r(B off $B$N;~$O(B
+        $B:G=i$NJ8@a$r%+%l%s%H(B($BH?E>$7$?(B)$BJ8@a$K$7$^$9!#(B
+        none $B$N;~$O$I$NJ8@a$b%+%l%s%H$K$;$:!"99$K<!$N(B
+        $BJ8@aF~NO=`Hw$N>uBV$K$7!"J8@a0\F0$N%U%!%s%/%7%g%s(B
+        (forward/backward/end $BEy(B)$B$r8F$S=P$7$?$H$-$K(B
+        $B$3$N>uBV$r:G8e$NJ8@a$H$7$F07$$$^$9!#(B
+        $BNc$($P(B NEWS-OS $B$N(B sj3 $B$NF0:n$O(B on$B!"(BCcWnn $B$NF0:n$O(B none$B!"(B
+        Canna $B$NF0:n$O(B off $B$G$9!#(B
+
+    16. $BJ8@a3HD%;~$N3HD%ItJ,$NI=<(J8;z<oJQ49F0:n$N;XDj(B
+
+[format] .ExpandModeConversion [on/off].[on/off]
+[default value] on.off
+
+        $B%U%!%s%/%7%g%s(B kakucyou(expand) $B$N5!G=$r8F$S=P$7$FJ8@a3HD%(B
+        $B$r9T$C$?$H$-$K3HD%$7$?ItJ,$NI=<(J8;z<o$r%+%l%s%HJ8@a$HF1$8(B
+        $BJ8;z<o$KJQ49$9$k$+$I$&$+$r;XDj$7$^$9!#(B
+        on $B$N;~$OI=<(J8;z<o$rJQ49$7(B off $B$N;~$OJQ49$r9T$$$^$;$s!#(B
+
+        value $B$NBh#1%U%#!<%k%I$K$O(B InputMode $B$N;~$NF0:n$r(B
+        $BBh#2%U%#!<%k%I$K$O(B ConvedMode $B$N;~$NF0:n$r;XDj$7$^$9!#(B
+
+    17. $BJ8@a=L>.;~$N=L>.ItJ,$NI=<(J8;z<oJQ49F0:n$N;XDj(B
+
+[format] .ShrinkModeConversion [on/off].[on/off]
+[default value] on.off
+
+        $B%U%!%s%/%7%g%s(B syukusyou(shrink) $B$N5!G=$r8F$S=P$7$FJ8@a=L>.(B
+        $B$r9T$C$?$H$-$K=L>.$7$?ItJ,$r<!J8@a$HF1$8(B
+        $BJ8;z<o$K:FJQ49$9$k$+$I$&$+$r;XDj$7$^$9!#(B
+        on $B$N;~$OI=<(J8;z<o$rJQ49$7(B off $B$N;~$OJQ49$r9T$$$^$;$s!#(B
+
+        value $B$NBh#1%U%#!<%k%I$K$O(B InputMode $B$N;~$NF0:n$r(B
+        $BBh#2%U%#!<%k%I$K$O(B ConvedMode $B$N;~$NF0:n$r;XDj$7$^$9!#(B
+
+    18. $BJ8@a3HD%;~$N3HD%ItJ,$N$+$J4A;zJQ49F0:n$N;XDj(B
+
+[format] .ExpandKnajiConversion [on/off].[on/off]
+[default value] off.on
+
+        $B%U%!%s%/%7%g%s(B kakucyou(expand) $B$N5!G=$r8F$S=P$7$FJ8@a3HD%(B
+        $B$r9T$C$?$H$-$K%+%l%s%HJ8@a$H<!J8@a$N(B
+        $B$+$J4A;zJQ49$r$9$k$+$I$&$+$r;XDj$7$^$9!#(B
+        on $B$r;XDj$7$?;~$O:FEY$+$J4A;zJQ49$r$7$^$9!#(B
+        off $B$N;~$OJQ49$r9T$$$^$;$s!#(B
+
+        value $B$NBh#1%U%#!<%k%I$K$O(B InputMode $B$N;~$NF0:n$r(B
+        $BBh#2%U%#!<%k%I$K$O(B ConvedMode $B$N;~$NF0:n$r;XDj$7$^$9!#(B
+
+    19. $BJ8@a=L>.;~$N=L>.ItJ,$N$+$J4A;zJQ49F0:n$N;XDj(B
+
+[format] .ShrinkKnajiConversion [on/off].[on/off]
+[default value] off.on
+
+        $B%U%!%s%/%7%g%s(B syukusyou(shrink) $B$N5!G=$r8F$S=P$7$FJ8@a=L>.(B
+        $B$r9T$C$?$H$-$K%+%l%s%HJ8@a$H<!J8@a$N(B
+        $B$+$J4A;z:FJQ49$r$9$k$+$I$&$+$r;XDj$7$^$9!#(B
+        on $B$r;XDj$7$?;~$O$+$J4A;z:FJQ49$r$7$^$9!#(B
+        off $B$N;~$O:FJQ49$r9T$$$^$;$s!#%G%U%)%k%H$O(B "on" $B$G$9!#(B
+
+        value $B$NBh#1%U%#!<%k%I$K$O(B InputMode $B$N;~$NF0:n$r(B
+        $BBh#2%U%#!<%k%I$K$O(B ConvedMode $B$N;~$NF0:n$r;XDj$7$^$9!#(B
+
+    20. $BJ8@a=L>.;~$K#1J8;z$7$+$J$$$H$-$NF0:n$N;XDj(B
+
+[format] .ShrinkAll [on/off]
+[default value] off
+
+        $B%U%!%s%/%7%g%s(B syukusyou(shrink) $B$N5!G=$r8F$S=P$7$FJ8@a=L>.;~(B
+        $B$K%+%l%s%HJ8@a$,#1J8;z$7$+$J$$$H$-$NF0:n$r;XDj$7$^$9!#(B
+        on $B$N;~$O%+%l%s%HJ8@a$HA0J8@a$H$r9gBN$7$F%+%l%s%HJ8@a$r(B
+        $BA0J8@a$K0\$7$^$9!JA0J8@a$,$J$$$H$-$O%Y%k$rLD$i$7$^$9!K!#(B
+        off $B$N;~$O%Y%k$rLD$i$7$F$=$l0J>eJ8@a$r=L>.$G$-$^$;$s!#(B
+
+    21. ConvedMode $B$GJ8;zF~NO$N%-!<$r2!$7$?$H$-$NF0:n$N;XDj(B
+
+[format] .FlushInConversion [on/off/none/edit]
+[default value] on
+
+        ConvedMode $B$GJ8;zF~NO$N%-!<$,2!$5$l$?$H$-!"(B
+        $B$^$?!"5-9fA*Br$G%U%!%s%/%7%g%s(B
+        Select/Return/fix(kettei.flush) $B$NA`:n$,9T$o$l$?$H$-!"(B
+        $B$b$7$/$O(B InputMode $B$N;~$G(B .MoveBySegment $B$N;XDj$,(B InputMode
+        $B$KBP$7$FJ8@aC10L$K0\F0$9$k$h$&$K;XDj$5$l$F$$$F!"(B
+        $BJ8;zF~NO$N%-!<$,2!$5$l$?$H$-!"(B
+        $BJQ49Cf$NJ8;zNs$r3NDj$9$k$+$I$&$+$r;XDj$7$^$9!#(B
+
+        on $B$N;~$OJQ49Cf$NJ8;zNs$r3NDj$7$F?7$?$JJ8;zNs$N(B
+        $BF~NO$K0\$j$^$9!#(Boff $B$N;~$O:G8e$NJ8@a$N<!$NJ8@a$H$7$FF~NO$5$l$^$9!#(B
+        none $B$N;~$OL5;k$7$^$9!#(Bedit $B$N;~$O%+%l%s%HJ8@a$rL5JQ49(B
+        $B>uBV(B(InputMode)$B$K$7$F(B .EditCursorLast $B$G;XDj$5$l$?(B
+        $B%+!<%=%k0LCV$KJ8;zF~NO$7$^$9!#(B
+        $BNc$($P(B NEWS-OS $B$N(B sj2/sj3/sjx $B$d(B Canna $B$NF0:n$O(B on$B!"(B
+        CcWnn $B$NF0:n$O(B off $B$G$9!#(B
+
+    22. SelectMode $B!J8uJdA*Br!K$GJ8;zF~NO$N%-!<$r2!$7$?$H$-$NF0:n$N;XDj(B
+
+[format] .FlushSelectConversion [on/off/none/edit]
+[default value] none
+
+        SelectMode$B!J8uJdA*Br!K$GJ8;zF~NO$N%-!<$,2!$5$l$?$H$-!"(B
+        $BJQ49Cf$NJ8;zNs$r3NDj$9$k$+$I$&$+$r;XDj$7$^$9!#(B
+        on $B$N;~$OA*BrF0:n$r$7$FJQ49Cf$NJ8;zNs$r3NDj$7$F?7$?$JJ8;zNs$N(B
+        $BF~NO$K0\$j$^$9!#(Boff $B$N;~$OA*BrF0:n$r$7$F:G8e$NJ8@a$N<!$NJ8@a(B
+        $B$H$7$FF~NO$5$l$^$9!#(Bnone $B$N;~$OL5;k$7$^$9!#(B
+        edit $B$N;~$O%+%l%s%HJ8@a$rL5JQ49>uBV(B(InputMode)$B$K$7$F(B
+        .EditCursorLast $B$G;XDj$5$l$?(B
+        $B%+!<%=%k0LCV$KJ8;zF~NO$7$^$9!#$?$@$7!"5-9fA*Br$N$H$-$O(B
+        $B$3$N;XDj$K4X78$J$/L5;k$7!"IJ;lA*Br$N$H$-$OFI$_F~NO$KLa$j$^$9!#(B
+        $BNc$($P(B NEWS-OS $B$N(B sj2/sj3/sjx $B$NF0:n$O(B none$B!"(B
+        Canna $B$NF0:n$O(B on$B!"(BCcWnn $B$NF0:n$O(B off $B$G$9!#(B
+
+    23. $BJQ49=*N;A`:n;~$N3NDjF0:n$N;XDj(B
+
+[format] .FlushEndConversion [on/off]
+[default value] on
+
+        $BJQ49J8;zNs$,$"$k>uBV$G%U%!%s%/%7%g%s(B start $B$d(B sjrc$B!"(B
+        kill $B$,8F$S=P$5$l$?$H$-$KJQ49Cf$NJ8;zNs$r(B
+        $B3NDj$9$k$+$I$&$+$r;XDj$7$^$9!#(B
+        on $B$N;~$OJQ49Cf$NJ8;zNs$r3NDj$7$F$+$i3F%U%!%s%/%7%g%s$N(B
+        $B5!G=$,<B9T$5$l$^$9!#(Boff $B$N;~$K$OJQ49Cf$NJ8;zNs$O(B
+        $B%/%j%"$5$l$^$9!#(B
+        $BNc$($P(B NEWS-OS $B$N(B sj2/sj3/sjx $B$d(B CcWnn $B$NF0:n$O(B on$B!"(B
+        Canna $B$NF0:n$O(B off $B$G$9!#(B
+
+    24. $B$+$J4A;zJQ49$r9T$&J8@a$N;XDj(B
+
+[format] .HenkanSegment [one/all/after]
+[default value] all
+
+        InputMode $B$G%U%!%s%/%7%g%s(B henkan(convert)$B$,8F$P$l$?$H$-$K(B
+        $BJQ49Cf$NJ8;zNsCf$N$I$NJ8@a$N$+$J4A;zJQ49$r$9$k$+$r;XDj$7$^$9!#(B
+        one $B$N;~$O%+%l%s%HJ8@a!J8=:_%+!<%=%k$,$"$kJ8@a!K$r!"(Ball $B$N;~$O(B
+        $BJQ49Cf$NA4$F$NJ8@a$r!"(Bafter $B$N;~$O%+%l%s%HJ8@a4^$`%+%l%s%HJ8@a0J9_(B
+        $BJ8@a$rJQ49$7$^$9!#(B
+        $BNc$($P(B NEWS-OS $B$N(B sj2/sj3/sjx $B$NF0:n$O(B one$B!"(B CcWnn $B$NF0:n$O(B after$B!"(B
+        Canna $B$NF0:n$O(B all $B$G$9!#(B
+
+    25. $BL5JQ49>uBV$K$9$kJ8@a$N;XDj(B
+
+[format] .MuhenkanSegment [one/all/after]
+[default value] one
+
+        ConvedMode $B$G%U%!%s%/%7%g%s(B muhen(unconvert)$B$,8F$P$l$?$H$-$K(B
+        $BJQ49Cf$NJ8;zNsCf$N$I$NJ8@a$rL5JQ49>uBV$K$9$k$+$r;XDj$7$^$9!#(B
+        one $B$N;~$O%+%l%s%HJ8@a!J8=:_H?E>$7$F$$$kJ8@a!K$r!"(Ball $B$N;~$O(B
+        $BJQ49Cf$NA4$F$NJ8@a$r!"(Bafter $B$N;~$O%+%l%s%HJ8@a4^$`%+%l%s%HJ8@a0J9_(B
+        $BJ8@a$rL5JQ49>uBV$K$7$^$9!#(B
+        $BNc$($P(B Canna $B$NJT=83+;O;~$d(B CcWnn $B$NF0:n$O(B one$B!"(B
+        Canna $B$N(B BS$B%-!<$NF0:n$O(B all $B$G$9!#(B
+
+    26. $BJ8;z>C5n;~$KL5JQ49>uBV$K$9$kJ8@a$N;XDj(B
+
+[format] .DeleteChangeSegment [one/all/after]
+[default value] one
+
+        ConvedMode $B$N$H$-$G(B DeleteBySegment$B!J8e=R!K$,(B off
+        $B$N$H$-(B backspace/delete $B$N%U%!%s%/%7%g%s$r8F$S=P$7$?$H$-$K(B
+        $BJQ49Cf$NJ8;zNs$N$I$NJ8@a$rL5JQ49>uBV(B(InputMode)$B$KLa$9$+$r;XDj$7$^$9!#(B
+        one $B$N;~$O%+%l%s%HJ8@a!J8=:_H?E>$7$F$$$kJ8@a!K$r!"(Ball $B$N;~$O(B
+        $BJQ49Cf$NA4$F$NJ8@a$r!"(Bafter $B$N;~$O%+%l%s%HJ8@a4^$`%+%l%s%HJ8@a0J9_(B
+        $BJ8@a$rL5JQ49>uBV$K$7$^$9!#(B
+        $BNc$($P(B CcWnn $B$NF0:n$O(B one$B!"(BCanna $B$NF0:n$O(B all $B$G$9!#(B
+
+    27. $BItJ,3NDj;~$KL5JQ49>uBV$K$9$kJ8@a$N;XDj(B
+
+[format] .FlushChangeSegment [one/all/off]
+[default value] one
+
+        flushbefore $B$N%U%!%s%/%7%g%s$r8F$S=P$7$?$H$-$K(B
+        $B%+%l%s%HJ8@a$b$7$/$O$=$l0J9_$NJ8@a$rL5JQ49>uBV(B(InputMode)$B$K(B
+        $BLa$9$+$r;XDj$7$^$9!#(B
+        one $B$N;~$O%+%l%s%HJ8@a!J8=:_H?E>$7$F$$$kJ8@a!K$r!"(Ball $B$N;~$O(B
+        $B%+%l%s%HJ8@a0J9_$NA4$F$NJ8@a$r!"J8@a$rL5JQ49>uBV$K$7$F$+$i(B
+        $BItJ,3NDj$NF0:n$r9T$$$^$9!#(Ball $B$r;XDj$7$?$H$-$O(B
+        mobebyseg $B$,(B InputMode $B$G(B on $B$N;~$G$bJ8;zF~NO2DG=$J(B
+        $B>uBV!JF~NO3+;O;~$HF1$8!K$K$7$^$9!#(B
+        off $B$N;~$O%+%l%s%HJ8@a$NL5JU46EYM+$5$O$7$^$;$s$,!"(B
+        $B%+%l%s%HJ8@a$,J8;zF~NO2DG=$J!JH?E>$7$F$$$J$$!K>uBV$G(B
+        $B%F%-%9%H%+!<%=%k$,J8@a$NC<$K$J$$$H$-$K%F%-%9%H%+!<%=%k(B
+        $B$h$jA0$NItJ,$r3NDj$7$^$9!#(B
+
+        $BNc$($P(B Canna $B$NF0:n$O(B all $B$G$9!#(B
+
+    28. $BJ8;z<oJQ99%U%!%s%/%7%g%s$,8F$P$l$?$H$-$NF0:n;XDj(B
+
+[format] .ModeConversion.[$B%b!<%IL>(B] [on/off].[on/off].[on/off]
+[default value] hiragana off.on.off
+[default value] zkatakana off.on.off
+[default value] hkatakana off.on.off
+[default value] halpha off.on.off
+[default value] zalpha off.on.off
+
+        hiragana$B!"(Bzkatakana$B!"(Bhkatakana$B!"(Bhalpha$B!"(Bzalpha$B!"(Bmodedown(toggle)$B!"(B
+        modeup(toggleback) $B$N#7$D$NJ8;z<oJQ99%U%!%s%/%7%g%s$,8F$P$l$?$H$-$K(B
+        $BI=<(J8;z<o$rJQ99$9$k$N$+!"F~NOJ8;z<o$rJQ99$9$k$N$+$r;XDj$7$^$9!#(B
+        [$B%b!<%IL>(B]$B$K;XDj$G$-$k$N$O(B hiragana/zkatakana/hkatakana/halpha/zalpha
+        /rolldown/rollup $B$N#7$D$G!"$=$l$>$l$N%U%!%s%/%7%g%s$NF0:n(B
+        $B$KBP1~$7$^$9!#(B
+
+        value $B$NBh#1%U%#!<%k%I$K$O(B InputMode $B$N;~$NF0:n$r(B
+        $BBh#2%U%#!<%k%I$K$O(B ConvedMode $B$N;~$NF0:n$r;XDj$7$^$9!#(B
+        $BBh#3%U%#!<%k%I$K$O(B NoInputMode $B$N;~$NF0:n$r;XDj$7$^$9!#(B
+
+        $B$3$l$i$N%U%#!<%k%I$,(B on $B$N;~$OI=<(J8;z<o$r!"(B
+        off $B$N;~$OF~NOJ8;z<o$rJQ99$7$^$9!#F~NOJ8;z<o$NJQ99$N$H$-$O(B
+        $BI=<(%b!<%I$bJQ99$7$^$9!#$^$?!"Bh#3%U%#!<%k%I(B(NoInputMode $B$N;~(B) $B$K(B
+        on $B$,;XDj$5$l$?>l9g$O2?$b$7$^$;$s!#(B
+        $BNc$($P(B NEWS-OS $B$N(B sj2/sj3/sjx $B$NF0:n$d(B Canna $B$NF0:n$O(B
+        $B%G%U%)%k%H$HF1$8$G$9$,!"(BCcWnn $B$G$O(B
+
+        hiragana on.on.on
+        zkatakana on.on.on
+
+        $B$K$J$j$^$9!#(B
+
+    29. $B%+%l%s%HJ8@a$d%F%-%9%H%+!<%=%k$rA08e$K0\F0$9$k(B
+        $B%U%!%s%/%7%g%s$,8F$P$l$?$H$-$N0\F0C10L;XDj(B
+
+[format] .MoveBySegment [on/off].[on/off]
+[default value] off.on
+
+        $BJQ49J8;zNs$KBP$7$F0lEY(B henkan(convert) $B$N%U%!%s%/%7%g%s$,8F$P$l$?8e!"(B
+        forward(right)$B!"(Bbackward(left) $B$N%+%l%s%HJ8@a!"%F%-%9%H%+!<%=%k(B
+        $B$rA08e$K0\F0$9$k%U%!%s%/%7%g%s$,8F$P$l$?$H$-$K(B
+        $BJ8@aC10L$G0\F0$9$k$+!"J8;zC10L$G0\F0$9$k$+$r;XDj$7$^$9!#(B
+
+        value $B$NBh#1%U%#!<%k%I$K$O(B InputMode $B$N;~$NF0:n$r(B
+        $BBh#2%U%#!<%k%I$K$O(B ConvedMode $B$N;~$NF0:n$r;XDj$7$^$9!#(B
+        $B$3$l$i$N%U%#!<%k%I$,(B on $B$N;~$OJ8@aC10L$G!"(B
+        off $B$N;~$OJ8;zC10L$G0\F0$7$^$9!#(B
+
+        $B0\F0@h$,(B ConvedMode($BJQ49:Q$_J8@a(B)$B$GJ8;zC10L$K0\F0$9$k$h$&$K(B
+        $B;XDj$5$l$?>l9g!"$=$NJ8@a$rL5JQ49$N>uBV$K$7$F0\F0$7$^$9!#(B
+        henkan(convert) $B$N%U%!%s%/%7%g%s$,8F$P$l$k0JA0$O(B
+        $B$3$N%j%=!<%9$N;XDj$K4X78$J$/J8;zC10L$K0\F0$7$^$9!#(B
+
+        $BNc$($P(B NEWS-OS $B$N(B sj2/sj3/sjx $B$NF0:n$O(B on.on $B$G$9$,!"(B
+        CcWnn $B$d(B Canna $B$NF0:n$O%G%U%)%k%H$HF1$8$G$9!#(B
+        
+    30. $B%+%l%s%HJ8@a$d%F%-%9%H%+!<%=%k$rA08e$K0\F0$9$k(B
+        $B%U%!%s%/%7%g%s$,8F$P$l$?$H$-$N%k!<%W;XDj(B
+
+[format] .MoveLoop [on/off]
+[default value] off
+
+        MoveBySegment $B$,(B on $B$N;~$G%+%l%s%HJ8@a$,:G8e$NJ8@a$N$H$-!"(B
+        MoveBySegment $B$,(B off $B$N;~$G%F%-%9%H%+!<%=%k$,J8@a$N(B
+        $B:G8e$K$"$k$H$-$K(B forward(right) $B$N%U%!%s%/%7%g%s$,8F$P$l$?(B
+        $B;~$NF0:n!"5U$K(B
+        MoveBySegment $B$,(B on $B$N;~$G%+%l%s%HJ8@a$,:G=i$NJ8@a$N$H$-!"(B
+        MoveBySegment $B$,(B off $B$N;~$G%F%-%9%H%+!<%=%k$,J8@a$N(B
+        $B:G=i$K$"$k$H$-$K(B backward(left) $B$N$N%U%!%s%/%7%g%s$,8F$P$l$?(B
+        $B;~$NF0:n$r;XDj$7$^$9!#(B
+
+        on $B$N$H$-$O!"$=$l$>$l:G=i$NJ8@a!?J8@a$N:G=i$K!":G8e$NJ8@a(B
+        $B!?J8@a$N:G8e$K0\F0$7$^$9!#(B
+        off  $B$N;~$OL5;k$7$^$9!#(B
+
+        $B:G8e$NJ8@a$H$7$F07$&J8@a$NDj5A$O(B .BeginConversionLast $B$N(B
+        $B;XDj$K0MB8$7$^$9!#(B
+        $BNc$($P(B NEWS-OS $B$N(B sj2/sj3/sjx $B$NF0:n$d(B CcWnn $B$NF0:n$O(B off $B$G$9$,!"(B
+        Canna $B$NF0:n$O(B on $B$G$9!#(B
+
+    31. $B%+%l%s%HJ8@a$d%F%-%9%H%+!<%=%k$r:G=i$^$?$O:G8e$K$K0\F0$9$k(B
+        $B%U%!%s%/%7%g%s$,8F$P$l$?$H$-$N0\F0C10L;XDj(B
+
+[format] .JumpBySegment [on/off].[on/off]
+[default value] off.on
+
+        $BJQ49J8;zNs$KBP$7$F0lEY(B henkan(convert) $B$N%U%!%s%/%7%g%s$,8F$P$l$?8e!"(B
+        top$B!"(Bend(bottom) $B$N%+%l%s%HJ8@a$rJQ49J8;zNs$N:G=i$"$k$$$O:G8e(B
+        $B$NJ8@a$K!"%F%-%9%H%+!<%=%k$r%+%l%s%HJ8@a$N:G=i$"$k$$$O:G8e$NJ8;z$K(B
+        $B0\F0$9$k%U%!%s%/%7%g%s%U%!%s%/%7%g%s$,8F$P$l$?$H$-$K(B
+        $BJ8@aC10L$G0\F0$9$k$+!"J8;zC10L$G0\F0$9$k$+$r;XDj$7$^$9!#(B
+
+        value $B$NBh#1%U%#!<%k%I$K$O(B InputMode $B$N;~$NF0:n$r(B
+        $BBh#2%U%#!<%k%I$K$O(B ConvedMode $B$N;~$NF0:n$r;XDj$7$^$9!#(B
+        $B$3$l$i$N%U%#!<%k%I$,(B on $B$N;~$OJ8@aC10L$G!"(B
+        off $B$N;~$OJ8;zC10L$G0\F0$7$^$9!#(B
+
+        henkan(convert) $B$N%U%!%s%/%7%g%s$,8F$P$l$k0JA0$O(B
+        $B$3$N%j%=!<%9$N;XDj$K4X78$J$/J8;zC10L$K0\F0$7$^$9!#(B
+        $B:G8e$NJ8@a$H$7$F07$&J8@a$NDj5A$O(B .BeginConversionLast $B$N(B
+        $B;XDj$K0MB8$7$^$9!#(B
+
+        $BNc$($P(B CcWnn $B$NF0:n$O(B on.on $B$G$9$,(B Canna $B$NF0:n$O(B
+        $B%G%U%)%k%H$HF1$8$G$9!#(B
+
+    32. $BJ8;z!?J8@a>C5n$N%U%!%s%/%7%g%s$,8F$P$l$?$H$-$N>C5nC10L;XDj(B
+
+[format] .DeleteBySegment [on/off].[on/off]
+[default value] off.on
+
+        $BJQ49J8;zNs$KBP$7$F0lEY(B henkan(convert) $B$N%U%!%s%/%7%g%s$,8F$P$l$?8e!"(B
+        delete$B!"(Bbackspace $B$NJ8;z!?J8@a>C5n$N%U%!%s%/%7%g%s$,8F$P$l$?$H$-$K(B
+        $BJ8@aC10L$G>C5n$9$k$+!"J8;zC10L$G>C5n$9$k$+$r;XDj$7$^$9!#(B
+        
+        value $B$NBh#1%U%#!<%k%I$K$O(B InputMode $B$N;~$NF0:n$r(B
+        $BBh#2%U%#!<%k%I$K$O(B ConvedMode $B$N;~$NF0:n$r;XDj$7$^$9!#(B
+        $B$3$l$i$N%U%#!<%k%I$,(B on $B$N;~$OJ8@aC10L$G!"(B
+        off $B$N;~$OJ8;zC10L$G>C5n$7$^$9!#(B
+
+        $B>C5n$9$kJ8@a$,(B ConvedMode($BJQ49:Q$_J8@a(B)$B$GJ8;zC10L$K>C5n$9$k$h$&$K(B
+        $B;XDj$5$l$?>l9g!"A0=R$N(B .DeleteChangeSegment $B$N;XDj$K=>$C$F(B
+        $B$=$NJ8@a$rL5JQ49$N>uBV$K$7$F>C5n$7$^$9!#(B
+        $B:G=i$K(B henkan(convert) $B$N%U%!%s%/%7%g%s$,8F$P$l$k0JA0$d(B
+        $B0lEY(B edit $B$,8F$P$l$FJT=8Cf$N!VJ8;zF~NO2DG=$J>uBV!W$N(B
+        $BJ8@a!J%+%l%s%H$N$H$-$K2<@~$,0z$+$l$?>uBV!K$KBP$7$F$O(B
+        $B$3$N%j%=!<%9$N;XDj$K4X78$J$/J8;zC10L$K>C5n$7$^$9!#(B
+
+        $BNc$($P(B NEWS-OS $B$N(B sj2/sj3/sjx $B$NF0:n$O(B on.on$B!"(B
+        Canna $B$NF0:n$O%G%U%)%k%HF1$8!"(BCcWnn $B$NF0:n$O(B off.off $B$G$9!#(B
+
+    33. $BJ8;z!?J8@a>C5n$N%U%!%s%/%7%g%s$,8F$P$l$?$H$-$N>C5nC10L;XDj(B
+
+[format] .KillBySegment [on/off].[on/off]
+[default value] off.on
+
+        delafter $B$N%U%!%s%/%7%g%s$,8F$P$l$?$H$-$K(B
+        $BJ8@aC10L$G!J%+%l%s%HJ8@a0J9_$NA4$F$NJ8@a$r!K>C5n$9$k$+!"(B
+        $BJ8;zC10L$G!J%+%l%s%HJ8@aFb$N%+!<%=%k0LCV0J9_$NJ8;zNs>C5n$9$k$+(B
+        $B$r;XDj$7$^$9!#(B
+        
+        value $B$NBh#1%U%#!<%k%I$K$O(B InputMode $B$N;~$NF0:n$r(B
+        $BBh#2%U%#!<%k%I$K$O(B ConvedMode $B$N;~$NF0:n$r;XDj$7$^$9!#(B
+        $B$3$l$i$N%U%#!<%k%I$,(B on $B$N;~$OJ8@aC10L$G!"(B
+        off $B$N;~$OJ8;zC10L$G>C5n$7$^$9!#(B
+
+        $BJ8;zF~NO2DG=$J>uBV!JH?E>$7$F$$$J$$!K$G(B on $B$N;~$O(B
+        $B%F%-%9%H%+!<%=%k0J9_$NJ8;zNs$rA4$F>C5n$7!"(Boff $B$N;~$O(B
+        $B%F%-%9%H%+!<%=%k0J9_$N%+%l%s%HJ8@aFb$NJ8;zNs$r(B
+        $B>C5n$7$^$9!#J8;zF~NO2DG=$G$J$$>uBV$G(B on $B$N;~$O(B
+        $B%+%l%s%H%+!<%=%k$r4^$`0J9_$NJ8;zNs$rA4$F>C5n$7!"(B
+        off $B$N;~$O%+%l%s%HJ8@a$r>C5n$7$^$9!#(B
+
+        $BNc$($P!"(BCanna $B$NF0:n$O%G%U%)%k%HF1$8$G$9!#(B
+
+    34. $BL5JQ49>uBV$K$9$k%U%!%s%/%7%g%s(B(muhen/unconvert)$B$,8F$P$l$?$H$-(B
+        $B$N%F%-%9%H%+!<%=%k0LCV;XDj(B
+
+[format] .MuhenkanCursorLast [on/off]
+[default value] off
+
+        muhen(unconvert)$B$N%U%!%s%/%7%g%s$,8F$P$l$?$H$-$K%F%-%9%H%+!<%=%k$N(B
+        $B0LCV$r;XDj$7$^$9!#(Bon $B$N;~$OL5JQ49>uBV$K$7$?J8;zNs$N:G8e$K!"(B
+        off $B$N;~$OL5JQ49>uBV$K$7$?J8;zNs$N:G=i$K%F%-%9%H%+!<%=%k$,(B
+        $B0\F0$7$^$9!#Nc$($P(B
+        CcWnn $B$NF0:n$O%G%U%)%k%H$HF1$8$G$9$,!"(BCanna $B$NF0:n$O(B on $B$G$9!#(B
+
+    35. $BJT=83+;O$N%U%!%s%/%7%g%s(B(edit)$B$,8F$P$l$?$H$-$N%F%-%9%H(B
+        $B%+!<%=%k0LCV;XDj(B
+
+[format] .EditCursorLast [on/off]
+[default value] off
+
+        edit $B$N%U%!%s%/%7%g%s$,8F$P$l$?$H$-$K%F%-%9%H%+!<%=%k$N(B
+        $B0LCV$r;XDj$7$^$9!#(Bon $B$N;~$OL5JQ49>uBV$K$7$?J8;zNs$N:G8e$K!"(B
+        off $B$N;~$OJ8;zF~NO2DG=$K$7$?>uBV$NJ8;zNs$N:G=i$K%F%-%9%H%+!<%=%k$,(B
+        $B0\F0$7$^$9!#Nc$($P(B
+        CcWnn $B$d(B Canna $B$NF0:n$O%G%U%)%k%H$HF1$8$G$9!#(B
+
+    36. $BItJ,3NDj$9$k%U%!%s%/%7%g%s$,8F$P$l$?$H$-$KL5JQ49>uBV$K$9$k$H$-$N(B
+        $B%F%-%9%H%+!<%=%k0LCV;XDj(B
+
+[format] .FlushCursorLast [on/off]
+[default value] off
+
+        flushbefore $B$N%U%!%s%/%7%g%s$,8F$P$l$F!"A0=R$N(B
+        .FlushChangeSegment $B$,(B off $B$G$J$$$H$-$N%F%-%9%H%+!<%=%k$N(B
+        $B0LCV$r;XDj$7$^$9!#(Bon $B$N;~$OL5JQ49>uBV$K$7$?J8;zNs$N:G8e$K!"(B
+        off $B$N;~$OL5JQ49>uBV$K$7$?J8;zNs$N:G=i$K%F%-%9%H%+!<%=%k$,(B
+        $B0\F0$7$^$9!#Nc$($P(B Canna $B$NF0:n$O%G%U%)%k%H$HF1$8$G$9!#(B
+
+    37. ConvedMode $B$NJ8@a$NI=<(J}K!;XDj(B
+
+[format] .ConvertedUnderLine [on/off]
+[default value] on
+
+        ConvedMode $B$NJ8@a$G%+%l%s%HJ8@a$G$J$$J8@a$NI=<($K(B
+        $B2<@~$r0z$/$+$I$&$+$r;XDj$7$^$9!#(Bon $B$N;~$O2<@~$r0z$-!"(B
+        off $B$N;~$O2<@~$r0z$-$^$;$s!#%+%l%s%HJ8@a$N;~$O(B
+        $B$3$N%j%=!<%9$N;XDj$K4X78$J$/H?E>I=<($5$l$^$9!#(B
+        $BNc$($P(B NEWS-OS $B$N(B sj2/sj3/sjx $B$d(B Canna $B$NF0:n$O(B on
+        $B$G$9$,!"(BCcWnn $B$NF0:n$O(B off $B$G$9!#(B
+
+    38. $BJQ49%b!<%IJQ99;~$N%b!<%II=<(JQ99;XDj(B
+
+[format] .DisplayModeChange [on/off]
+[default value] off
+
+        $BJQ49Cf$NJ8;zNs$NJQ49%b!<%I$NJQ2=$K$h$C$F%b!<%II=<($r(B
+        $BJQ99$9$k$+$I$&$+$r;XDj$7$^$9!#(Bon $B$N>l9g0J2<$N$h$&$K(B
+        $B%b!<%II=<($rJQ99$7$^$9!#(B
+
+        $BJQ49Cf$NJ8;zNsCf$NJ8@a$,A4$FL$JQ49$N;~!'F~NOJ8;z<o!?%3!<%I(B
+            (.guide.{hiragana,zkatakana,hkatakana,halpha,zalpha,
+                sjis,euc,jis,kuten} $B$N;XDj(B)
+        $BJQ49Cf$NJ8;zNsCf$NJ8@a$,A4$FJQ49:Q$_$N$H$-!'(B .guide.kanji $B$N;XDj(B
+        $BL$JQ49!?JQ49:Q$_N>J}$NJ8@a$,$"$k$H$-!'(B .guide.edit $B$N;XDj(B
+        $B8uJdA*BrCf$N$H$-!'(B .guide.candidate $B$N;XDj(B
+        $B5-9fA*BrCf$N$H$-!'(B .guide.symbol $B$N;XDj(B
+        $BIJ;lA*BrCf$N$H$-!'(B .guide.hinsi $B$N;XDj(B
+        $B<-=qEPO?Cf$N$H$-!'(B .guide.toroku $B$N;XDj(B
+        $B<-=qKu>CCf$N$H$-!'(B .guide.syoukyo $B$N;XDj(B
+        $B0zMQJ8;zF~NOCf$N$H$-!'(B .guide.quote $B$N;XDj(B
+
+        off $B$N$H$-$OJQ49%b!<%I$NJQ2=$K4X78$J$/(B
+        $B>o$K8=:_$NF~NOJ8;z<o!?%3!<%I$r%b!<%II=<($7$^$9!#(B
+
+        $BNc$($P(B NEWS-OS $B$N(B sj2/sj3/sjx $B$d(B CcWnn $B$NF0:n$O(B off
+        $B$G$9$,!"(BCanna $B$NF0:n$O(B on $B$G$9!#(B
+
+    39. $B:G8e$NJ8@a$r>C5n$7$?$H$-$N%+%l%s%HJ8@a0\F0;XDj(B
+
+[format] .DeleteLastMove [on/off]
+[default value] on
+
+        backspace $B$d(B delete $B$NJ8;z>C5n$N%U%!%s%/%7%g%s$G(B
+        $BA0=R$N(B .DeleteBySegment $B$GJ8@aC10L$G>C5n$9$k$h$&$K;XDj$5$l$F$$$k(B
+        $B>l9g$K>C5n$9$kJ8@a$,JQ49Cf$NJ8;zNs$N1&C<$NJ8@a$N$H$-!"(B
+        $B%+%l%s%HJ8@a$r#1$DA0$NJ8@a$K!J>C5nA`:n8e$N1&C<$NJ8@a$K!K0\F0$9$k$+!"(B
+        $B$I$&$+$r;XDj$7$^$9!#(B
+        on $B$N;~$O%+%l%s%HJ8@a#1$DA0$K$r0\F0$7$^$9!#(B
+        off $B$N;~$O0\F0$7$^$;$s!#(B
+
+        $BNc$($P(B NEWS-OS $B$N(B sj2/sj3/sjx $B$NF0:n$O(B on
+        $B$G$9$,!"(BCcWnn $B$NF0:n$O(B off $B$G$9!#(B
+
+    40. $B$+$J%-!<%\!<%I$G$J$$%-!<%\!<%I$G$+$JF~NO$r$9$k5!G=$N=i4|;XDj(B
+
+[format] .KanaInputOnly [on/off]
+[default value] off
+
+        $B$+$J%-!<%\!<%I$G$J$$%-!<%\!<%I$G$+$JF~NO$r$9$k5!G=$r(B
+        $BJQ493+;O;~$K(B on $B$K$9$k$+$I$&$+$r;XDj$7$^$9!#(B
+        $B$3$N5!G=$O(B kana $B$N%U%!%s%/%7%g%s$K;XDj$5$l$?5!G=$G(B
+        $B%H%0%k$G$-$^$9!#(Boff $B$N;~$OJQ493+;O;~$K$O$3$N5!G=$r;HMQ$7$J$$$h$&$K(B
+        $B$7$^$9!#(B
+
+    41. $BJ8;zF~NOF0:n$HF1;~$K%U%!%s%/%7%g%s$N5!G=$r<B9T$9$k$+$I$&$+$N;XDj(B
+
+[format] .InputSameTime [on/off]
+[default value] on
+
+        $BF~NOJ8;z$H$7$FM-8z$J%-!<!&%P%$%s%I$,%U%!%s%/%7%g%s$NA`:n(B
+        $B$N%-!<!&%P%$%s%I$H=E$J$k$H$-$K%U%!%s%/%7%g%s$NA`:n$bF1;~$K(B
+        $B9T$&$+$I$&$+$r;XDj$7$^$9!#(Bon $B$N;~$OJ8;zF~NOF0:n$N8e(B
+        $BF1;~$K%U%!%s%/%7%g%s$NA`:n$,9T$o$l$^$9!#(Boff $B$N;~$O(B
+        $BJ8;zF~NOF0:n$O9T$o$l$:!"%U%!%s%/%7%g%s$NA`:n$N$_$,9T$o$l$^$9!#(B
+        .ki2key $B$N(B value $B$NBh#3%U%#!<%k%I$K;XDj$,$"$k$H$-$O(B
+        $B$=$A$i$N;XDj$,M%@h$5$l$^$9!#(B
+
+        $BNc$($P(B NEWS-OS $B$N(B sj2/sj3/sjx $B$NF0:n$O(B off
+        $B$G$9$,!"(BCcWnn $B$NF0:n$O(B on(ccdef $B$G8DJL$K;XDj(B)$B$G$9!#(B
+
+    42. $B%3%s%H%m!<%k%3!<%IF~NOF0:n$HF1;~$K%U%!%s%/%7%g%s$N(B
+        $B5!G=$r<B9T$9$k$+$I$&$+$N;XDj(B
+
+[format] .ControlSameTime [on/off]
+[default value] off
+
+        $B>e=R$N(B .InputSameTime $B$,(B on $B$N;~$K99$K%3%s%H%m!<%kF~NO$H$7$F(B
+        $BM-8z$J%-!<!&%P%$%s%I$,%U%!%s%/%7%g%s$NA`:n$N%-!<!&%P%$%s%I$H=E$J$k(B
+        $B$H$-$K%U%!%s%/%7%g%s$NA`:n$bF1;~$K(B
+        $B9T$&$+$I$&$+$r;XDj$7$^$9!#(Bon $B$N;~$O%3%s%H%m!<%k%3!<%I$r(B
+        $B%/%i%$%"%s%H$KEO$7$?8eF1;~$K%U%!%s%/%7%g%s$NA`:n$,9T$o$l$^$9!#(B
+        off $B$N;~$O!"%U%!%s%/%7%g%s$NA`:n$N$_$,9T$o$l$^$9!#(B
+
+    43. $BI=<(J8;z<o$NJQ99=g$r;XDj$9$k(B
+
+[format] .PrintMode [$BJ8;z<oL>(B].[$BJ8;z<oL>(B].$B!E(B
+[default value] hiragana.zkatakana.hkatakana.zalpha.halpha.\
+        hankaku.zenkaku.upper.lower
+
+        modedown(toggle)/modeup(toggleback) $B5Z$S(B nextmode/prevmode
+        $B%U%!%s%/%7%g%s!J(B<4>[1]$B;2>H!K$G$NI=<(J8;z<o$NJQ99=g$r;XDj$7$^$9!#(B
+        $B0lHV:8$K;XDj$5$l$?J8;z<o$O(B modedown(toggle)/nextmode $B$G(B
+        $BJQ99A0$NI=<(J8;z<o$,$3$N%j%=!<%9Cf$K$J$$$H$-$KJQ49$5$l$k(B
+        $BJ8;z<o$K$J$j$^$9!#F1MM$K0lHV1&$K;XDj$5$l$?J8;z<o$O(B
+        modeup(toggleback)/prevmode $B$GJQ99A0$NI=<(J8;z<o$,$3$N%j%=!<%9(B
+        $BCf$K$J$$$H$-$KJQ49$5$l$kJ8;z<o$K$J$j$^$9!#(B
+
+        $B;XDj$G$-$kI=<(J8;z<oL>$O(B hiragana/zkatakana/hkatakana/
+        zalpha/halpha/hankaku/zenkaku/upper/lower $B$N#9$D$G$9!#(B
+
+    44. $B8uJdA*Br$NA0$K$R$i$,$J$K$7$F:FEY$+$J4A;zJQ49$r$9$k$+$r;XDj$9$k(B
+
+[format] .BeforeSelectConversion [on/off]
+[default value] on
+
+        $BJQ49:Q$NJ8@a(B(ConvedMode)$B$KBP$7$F(B convert(henkan) $B%U%!%s%/%7%g%s(B
+        $B$,8F$S=P$5$l$?$H$-$KI=<(J8;z<o$,$R$i$,$J$G$J$$>l9g$K(B
+        $B0lEY$R$i$,$J$KJQ49$7$?$b$N$r$+$J4A;zJQ49$7!"<!$N:FEY$N(B
+        convert(henkan) $B%U%!%s%/%7%g%s$N8F=P$7$G(B
+        $B8uJdA*Br$r3+;O$9$k$+$I$&$+$r;XDj$7$^$9!#(B
+
+        on $B$N;~$O0lEY$R$i$,$J$KJQ49$7$F$+$i:FEY$+$J4A;zJQ49$9$k(B
+        $BCJ3,$,$"$j$^$9$,!"(Boff $B$N;~$OI=<(J8;z<o$,$R$i$,$J$G$J$/$H$b(B
+        $B$=$N$^$^8uJdA*Br$r3+;O$7$^$9!#(B
+
+        $BNc$($P(B NEWS-OS $B$N(B sj2/sj3/sjx $B$NF0:n$O(B on
+        $B$G$9$,!"(BCcWnn $B$d(B Canna $B$NF0:n$O(B off $B$G$9!#(B
+        sj3serv $B$r;HMQ$9$k>l9g!"<-=q$N@-<A>e(B on $B$K$7$?>l9g$NJ}$,(B
+        $BM-8z$H;W$o$l$^$9!#(B
+
+    45. $B$+$J4A;zJQ49$NA0$KJ8;z<o$r$R$i$,$J$K$7$FJQ49$r$9$k$+$r;XDj$9$k(B
+
+[format] .BeforeConversion [on/off]
+[default value] off
+
+        $BL$JQ49$NJ8@a(B(InputMode)$B$KBP$7$F(B convert(henkan) $B%U%!%s%/%7%g%s(B
+        $B$,8F$S=P$5$l$?$H$-$K%+%l%s%HJ8@a$K$R$i$,$J$G$J$$J8;z<o$N(B
+        $BJ8;z$,$"$C$?>l9g$K0lEY$R$i$,$J$KJQ49$7$7$F$+$i$+$J4A;zJQ49(B
+        $B$9$k$+$I$&$+$r;XDj$7$^$9!#(B
+
+        on $B$N;~$O$R$i$,$J$KJQ49$7$F$+$i$+$J4A;zJQ49$7$^$9$,!"(B
+        off $B$N;~$O%+%l%s%HJ8@aCf$K$R$i$,$J$G$J$$J8;z$,$"$C$?>l9g$G$b(B
+        $B$=$N$^$^$+$J4A;zJQ49$r3+;O$7$^$9!#(B
+
+        $BNc$($P(B NEWS-OS $B$N(B sj2/sj3/sjx$B!"(BCcWnn $B$d(B Canna $B$NF0:n$O(B off $B$G$9!#(B
+
+    46. $B:G8e$NJ8;z$,%m!<%^$+$JJQ49%F!<%V%k$KF1$8FI$_$KBP$7$FJ#?t$N(B
+        $B%m!<%^;z$,EPO?$5$l$F$$$k$h$&$JJ8;z$N>l9g!"$G$-$k8B$j(B
+        $BF~NOJ8;z<o$KJQ49$7$F$+$i$+$J4A;zJQ49$9$k$+;XDj$9$k(B
+
+[format] .LastDoubleConversion [on/off]
+[default value] off
+
+        $BL$JQ49$NJ8@a(B(InputMode)$B$KBP$7$F(B convert(henkan) $B%U%!%s%/%7%g%s(B
+        $B$,8F$S=P$5$l$?$H$-$K%+%l%s%HJ8@a$N:G8e$NJ8;z$,%m!<%^$+$JJQ49(B
+        $B%F!<%V%k(B(sjrk)$B$KF1$8FI$_$KBP$7$FJ#?t$N%m!<%^;zNs$,!"(B
+        $B$,F1$8%"%k%U%!%Y%C%H$N=E$J$j$GEPO?$5$l$F$$$k$h$&$JJ8;z$N>l9g(B
+        ($BNc(B $B!V$s!W$N!V(Bn$B!W$H!V(Bnn$B!W(B)$B!"0lEY%+%l%s%HJ8@a$NJ8;z<o$KJQ49$7$F(B
+        $B$+$i$+$J4A;zJQ49$9$k$+$I$&$+$r;XDj$7$^$9!#(B
+
+        $B$3$N%j%=!<%9$N;XDj$OA0=R$N(B .BeforeConversion $B$,(B off $B$N;~$N$_(B
+        $BM-8z$K$J$j$^$9!#(B
+        on $B$N;~$O%+%l%s%HJ8@a$NJ8;z<o$KJQ49$7$F$+$i$+$J4A;zJQ49$7$^$9$,!"(B
+        off $B$N;~$O$=$N$^$^$+$J4A;zJQ49$r3+;O$7$^$9!#(B
+
+        $BNc$($P(B NEWS-OS $B$N(B sj2/sj3/sjx$B!"(BCcWnn $B$NF0:n$O(B off $B$G$9$,!"(B
+        Canna $B$NF0:n$O(B on $B$G$9!#(B
+
+    47. $B:G8e$NJ8;z$,%m!<%^$+$JJQ49%F!<%V%k$KF1$8FI$_$KBP$7$FJ#?t$N(B
+        $B%m!<%^;z$,EPO?$5$l$F$$$k$h$&$JJ8;z$N>l9g!"$G$-$k8B$j(B
+        $BF~NOJ8;z<o$KJQ49$7$F$+$i$+$J4A;zJQ49$9$k$+;XDj$9$k(B
+
+[format] .BeforeSelectCount [0/1/2/3/4...]
+[default value] 0
+
+        $BJQ49:Q$NJ8@a(B(ConvedMode)$B$KBP$7$F(B convert(henkan) $B%U%!%s%/%7%g%s(B
+        $B$,8F$S=P$5$l$?$H$-$K$9$0$K8uJd0lMw$rI=<($;$:!"%+%l%s%HJ8@a$r(B
+        $B<!8uJd$GCV$-49$($kF0:n$r$9$k2s?t$r;XDj$7$^$9!#(B
+        0 $B$,;XDj$5$l$?$H$-$O$9$0$K8uJd0lMw$rI=<($7$^$9!#(B
+        $B$?$@$7!"A48uJd?t$,$3$N;XDj$h$j$b>.$5$$$H$-!"$^$?$O(B
+        $BF1$8;~$O$9$0$K8uJd0lMw$rI=<($7$^$9!#(B
+
+        $BNc$($P(B NEWS-OS $B$N(B sj2/sj3/sjx$B!"(BCcWnn $B$NF0:n$O(B 0 $B$G$9!#(B 
+
+    48. $B8uJdA*Br$N$H$-$K(B backspace $B$NF0:n$r$9$kBP>]$NJ8@a$r;XDj$9$k(B
+
+[format] .SelectBackSpaceMove [on/off]
+[default value] off
+
+        $B8uJdA*Br$N>uBV(B(SelectMode)$B$KBP$7$F(B backspace $B$N%U%!%s%/%7%g%s(B
+        $B$,8F$S=P$5$l$?$H$-8uJdA*Br$rH4$1$?$"$H!"D>A0$NJ8@a$r>C5n(B
+        ($BL5JQ498e>C5n(B)$B$r<B9T$9$k$+!"%+%l%s%HJ8@a$KBP$7$F(B
+        $B>C5n(B($BL5JQ498e>C5n(B)$B$r<B9T$9$k$+$r;XDj$7$^$9!#(B
+        
+        on $B$N;~$O%+%l%s%HJ8@a$KBP$7$F>C5n(B($BL5JQ498e>C5n(B)$B$r<B9T$7$^$9$,!"(B
+        off $B$N;~$OD>A0$NJ8@a$KBP$7$F>C5n(B($BL5JQ498e>C5n(B)$B$r<B9T$7$^$9!#(B
+
+        $BNc$($P(B CcWnn $B$NF0:n$O(B on $B$G$9!#(B
+
+    49. $B8uJdA*Br$N$H$-$K>o$K$R$i$,$J!?A43Q%+%?%+%J$rI=<($9$k$+;XDj$9$k(B
+
+[format] .CandidatePadding [on/off]
+[default value] off
+
+        $B8uJdA*BrI=<((B(convert)$B$^$?$O!"(Bnext/prev $BEy$GI=<($5$l$k8uJdI=<($G(B
+        $BI,$:!"$R$i$,$J$HA43Q%+%?%+%J$N8uJd$rI=<($9$k$+$I$&$+$r;XDj$7$^$9!#(B
+        
+        on $B$N;~$O(B sj3serv $B$NJV$9JQ498uJd0J30$KI,$:!"$R$i$,$J$H(B
+        $BA43Q%+%?%+%J$N8uJd$r:G8e$KI=<($7$^$9!#$3$N:G8e$N(B
+        $B#2$D$O(B sj3 $B$N3X=,5!G=$H$OL54X78$G!"C;J8@aJQ49$G(B
+        $B#1EYA*Br$5$l$F$b<!$K@hF,$KMh$k$3$H$O$"$j$^$;$s!#(B
+        off $B$N;~$O(B sj3serv $B$NJV$9JQ498uJd$N$_$rI=<($7$^$9!#(B
+
+        $BNc$($P(B CcWnn $B$d(B Canna $B$NF0:n$O(B on $B$G$9$,!"(Bsjx $B$NF0:n$O(B
+        off $B$G$9!#$3$N%j%=!<%9$r(B on $B$K$7$?>l9g!"8=J8@a$r(B
+        $B#2EYJ8;z<oJQ49$9$k$V$s8uJdA*BrI=<(;~$N%l%9%]%s%9$,0-$/$J$j$^$9!#(B
+        $B$R$i$,$J$d!"%+%?%+%JEy!"8=J8@a$rB>$NJ8;z<o$K$7$?$$$H$-$O(B
+        (to)hiragana/(to)zkatakana/nextmode$B!"Ey$N%U%!%s%/%7%g%s$r(B
+        $B;HMQ$9$k$3$H$r$*A&$a$7$^$9!#(B
+
+    50. sjrc $B%U%!%s%/%7%g%s<B9T;~$KFI$_9~$`%U%!%$%k$N;XDj(B
+
+[format] .NextRCFile [path]
+[default value] $B:G=i$NJQ493+;O;~$KFI$_9~$s$@(B sjrc $B%U%!%$%k(B
+
+        sjrc $B%U%!%s%/%7%g%s<B9T;~$KFI$_9~$`%U%!%$%k$r(B
+        $B@dBP%Q%9$^$?$O5/F0$7$?%G%#%l%/%H%j$+$i$NAjBP%Q%9$G(B
+        $B;XDj$7$^$9!#;XDj$,$J$$>l9g$O(B -rcfile $B%*%W%7%g%sEy$G(B
+        $B;XDj$7$?JQ493+;O;~$HF1$8%U%!%$%k$rFI$_9~$_$^$9!#(B
+
+    51. sjrc $B7A<0$N@_Dj%U%!%$%k$r%M%9%H$7$FFI$_9~$`;XDj(B
+
+[format] .Include [path]
+[default value] $B$J$7(B
+
+        $BJL$N(B sjrc $B7A<0$N%U%!%$%k$r$=$N;~E@$GFI$_9~$`>l9g$K(B
+        $B%U%!%$%kL>$r;XDj$7$^$9!#B>$N%U%!%s%/%7%g%s$HF1MM!"(B
+        $BF10l$N(B sjrc $B%U%!%$%kFb$K$$$/$D$b;XDj2DG=$G!"%M%9%H$O(B
+        $B%G%U%)%k%H$G(B 10$B2s$^$G2DG=$G$9!#AjBP%Q%9$G;XDj$7$?>l9g$O(B
+
+            [1] $B%+%l%s%H%G%#%l%/%H%j(B
+            [2] SJ3DEFPATH $B$G;XDj$7$?%G%#%l%/%H%j(B
+                ($B%G%U%)%k%H$O(B /usr/lib/X11/sj3def)
+
+        $B$N=g$K%5!<%A$7!";XDj$,$J$$>l9g$d%U%!%$%k$,(B
+        $B%*!<%W%s$G$-$J$$>l9g$O%(%i!<$K$J$j$^$9!#(B
+
+<5> $BJQ49%5!<%P(B(sj3serv) $B$N%[%9%HL>$N7hDj(B
+
+        first $BJQ49%5!<%P$N%[%9%HL>$O0J2<$NM%@hEY$G7hDj$5$l$^$9!#(B
+        
+            [1] sjrc $B$N(B .sj3serv $B$N;XDj(B(<4>[3]$B;2>H(B)
+            [2] $B%*%W%7%g%s(B -sj3serv $B$KB3$/%[%9%HL>(B
+            [3] $B%j%=!<%9%U%!%$%k$N(B *Sj3.sj3serv $B%j%=!<%9$K;XDj$5$l$?CM(B
+            [4] $B4D6-JQ?t(B SJ3SERV $B$NCM(B
+            [5] NULL ($B$D$^$j(B localhost)
+
+        second $BJQ49%5!<%P$N%[%9%HL>$O0J2<$NM%@hEY$G7hDj$5$l$^$9!#(B
+        
+            [1] sjrc $B$N(B .sj3serv2 $B$N;XDj(B(<4>[3]$B;2>H(B)
+            [2] $B%*%W%7%g%s(B -sj3serv2 $B$KB3$/%[%9%HL>(B
+            [3] $B%j%=!<%9%U%!%$%k$N(B *Sj3.sj3serv2 $B%j%=!<%9$K;XDj$5$l$?CM(B
+            [4] $B4D6-JQ?t(B SJ3SERV2 $B$NCM(B
+            [5] NULL ($B$D$^$j(B localhost)
+
+<6> $B<-=qEPO?!?Ku>C%b!<%I$NF0:n(B
+
+    kinput2 $B$N(B sj3 $BHG$G$O%$%s%?!<%i%/%F%#%V$J(B
+    $B<-=qEPO?!?Ku>C$G$-$^$9!#<-=qEPO?!?Ku>C$K$O!VFI$_!W$NF~NO(B
+    $BEPO?$9$k4A;zJ8;zNs$NA*Br!"IJ;l$NA*Br!"3NG'!"<B:]$NEPO?!?Ku>C(B
+    $B$H0lO"$NF0:n$,I,MW$K$J$j$^$9$N$G!"B>$NJQ49%b!<%I$N$h$&$K(B
+    $B0lEY$NA`:n$K$h$C$F$R$H$D$NF0:n$,<B9T$5$l$k$H$$$&$h$&$K$O(B
+    $B407k$7$F$$$^$;$s!#(B
+
+    $BEPO?!?>C5n;~$NF0:n$NN.$l$O$=$l$>$l0J2<$N$h$&$K$J$j$^$9(B
+
+    [1] $B<-=qEPO?;~(B
+
+    1. ConvedMode 
+        $B"-(B(ConvedMode: toroku/register $B$K;XDj$5$l$?%-!<A`:n(B)
+
+        $B",(B(DictMode: cancel $B$K;XDj$5$l$?%-!<A`:n(B)
+    2. DictMode $BHO0O;XDj!?FI$_F~NO%b!<%I(B
+        ($B$3$N;~E@$G$O(B forward/backward/expand/shrink $B$K;XDj(B
+        $B$5$l$?A`:n$GEPO?$9$k4A;zJ8;zNs$NHO0OA*Br!"(BInputMode $B$H(B
+        $BF1MM$NA`:n$GFI$_J8;zNs$,F~NO$G$-!"(Bcancel $B$NA`:n$G(B
+        ConvedMode $B$KLa$j$^$9(B kettei/flush/return $B$K;XDj$5$l$?(B
+        $B%-!<A`:n$G<!$NIJ;lA*Br$K0\$j$^$9$,!"F~NOJ8;z$,L5$+$C$?$j!"(B
+        $BD9$9$.$?$j(B(<8>$B@)8B;v9`(B $B$N9`;2>H(B)$B$7$?>l9g$O(B
+        $BEPO?A`:n7k2LI=<(%b!<%I$KHt$S$^$9(B)
+        $B"-(B(DictMode: kettei/flush/return $B$K;XDj$5$l$?%-!<A`:n(B)
+
+        $B",(B(SelectMode: cancel $B$K;XDj$5$l$?%-!<A`:n(B)
+    3. SelectMode $BIJ;lA*Br(B
+        $BIJ;lA*Br$N%&%#%s%I%&$,%]%C%W%"%C%W$5$l!"EPO?$9$k(B
+        $BFI$_$H4A;zJ8;zNs$KBP1~$9$kIJ;l$rA*Br$7$^$9!#(B
+        ($B$3$N;~E@$G$NF0:n$O(B SelectMode $B$H$7$F;XDj$5$l$?%-!<A`:n$,(B
+        $BM-8z$K$J$j$^$9(B)
+        $B"-(B(SelectMode: select/kettei/flush/return $B$K;XDj$5$l$?%-!<A`:n(B)
+
+    4. DictMode $B3NG'%b!<%I(B
+        $BA*Br$5$l$?!VFI$_!W!V4A;z!W!VIJ;l!W$NAH9g$;$G(B
+        $BEPO?A`:n$r9T$&$+:G=*3NG'$r9T$$$^$9!#(B
+        (DictMode: cancel $B$K;XDj$5$l$?%-!<A`:n(B) $B$G(B
+        2. $B$N(B DictMode $BHO0O;XDj!?FI$_F~NO%b!<%I$KLa$j$^$9!#(B
+        (DictMode: kettei/flush/return $B$K;XDj$5$l$?%-!<A`:n(B)
+        $B$G<B:]$NEPO?F0:n$r9T$$$^$9(B
+        $B"-(B(DictMode: kettei/flush/return $B$K;XDj$5$l$?%-!<A`:n(B)
+
+    5. DictMode $BEPO?A`:n7k2LI=<(%b!<%I(B
+        $BEPO?F0:n$r9T$C$?7k2L$rI=<($7$^$9!#%(%i!<$GEPO?$G$-$J$+$C$?(B
+        $B>l9g$O$=$N;]$rI=<($7$^$9!#(B
+        (DictMode: cancel $B$K;XDj$5$l$?%-!<A`:n(B) $B$G(B
+        2. $B$N(B DictMode $BHO0O;XDj!?FI$_F~NO%b!<%I$KLa$j$^$9!#(B
+        (DictMode: kettei/flush/return $B$K;XDj$5$l$?%-!<A`:n(B)
+        $B$G<-=qEPO?3+;OA0$N(B ConvedMode $B$N>uBV$KLa$j$^$9!#(B
+        $B"-(B(DictMode: kettei/flush/return $B$K;XDj$5$l$?%-!<A`:n(B)
+ 
+    6. ConvedMode 
+
+    [2] $B<-=q>C5n;~(B
+
+    1. ConvedMode 
+        $B"-(B(ConvedMode: syoukyo/eliminate $B$K;XDj$5$l$?%-!<A`:n(B)
+
+        $B",(B(DictMode: cancel $B$K;XDj$5$l$?%-!<A`:n(B)
+    2. DictMode $BHO0O;XDj!?FI$_F~NO%b!<%I(B
+        ($B$3$N;~E@$G$O(B forward/backward/expand/shrink $B$K;XDj(B
+        $B$5$l$?A`:n$G>C5n$9$k4A;zJ8;zNs$NHO0OA*Br!"(BInputMode $B$H(B
+        $BF1MM$NA`:n$GFI$_J8;zNs$,F~NO$G$-!"(Bcancel $B$NA`:n$G(B
+        ConvedMode $B$KLa$j$^$9(B kettei/flush/return $B$K;XDj$5$l$?(B
+        $B%-!<A`:n$G<!$NIJ;lA*Br$K0\$j$^$9$,!"F~NOJ8;z$,L5$+$C$?$j!"(B
+        $BD9$9$.$?$j(B(** $B@)8B;v9`(B ** $B$N9`;2>H(B)$B$7$?>l9g$O(B
+        $BEPO?A`:n7k2LI=<(%b!<%I$KHt$S$^$9(B)
+        $B"-(B(DictMode: kettei/flush/return $B$K;XDj$5$l$?%-!<A`:n(B)
+
+        $B",(B(DictMode: cancel $B$K;XDj$5$l$?%-!<A`:n(B)
+    3. DictMode $B3NG'%b!<%I(B
+        $BA*Br$5$l$?!VFI$_!W!V4A;z!W$NAH9g$;$G(B
+        $B>C5nA`:n$r9T$&$+:G=*3NG'$r9T$$$^$9!#(B
+        (DictMode: cancel $B$K;XDj$5$l$?%-!<A`:n(B) $B$G(B
+        2. $B$N(B DictMode $BHO0O;XDj!?FI$_F~NO%b!<%I$KLa$j$^$9!#(B
+        (DictMode: kettei/flush/return $B$K;XDj$5$l$?%-!<A`:n(B)
+        $B$G<B:]$N>C5nF0:n$r9T$$$^$9(B
+        $B"-(B(DictMode: kettei/flush/return $B$K;XDj$5$l$?%-!<A`:n(B)
+
+    4. DictMode $B>C5nA`:n7k2LI=<(%b!<%I(B
+        $B>C5nF0:n$r9T$C$?7k2L$rI=<($7$^$9!#%(%i!<$G>C5n$G$-$J$+$C$?(B
+        $B>l9g$O$=$N;]$rI=<($7$^$9!#(B
+        (DictMode: cancel $B$K;XDj$5$l$?%-!<A`:n(B) $B$G(B
+        2. $B$N(B DictMode $BHO0O;XDj!?FI$_F~NO%b!<%I$KLa$j$^$9!#(B
+        (DictMode: kettei/flush/return $B$K;XDj$5$l$?%-!<A`:n(B)
+        $B$G<-=q>C5n3+;OA0$N(B ConvedMode $B$N>uBV$KLa$j$^$9!#(B
+        $B"-(B(DictMode: kettei/flush/return $B$K;XDj$5$l$?%-!<A`:n(B)
+ 
+    5. ConvedMode 
+
+    $B<-=qEPO?!?>C5n$N0lO"$NN.$l$O0J>e$N$h$&$K$J$j$^$9!#(B
+    $B4JC1$K8@$($P<-=qEPO?!?>C5n$NJQ49%b!<%I$O(B
+    $B$=$N0lO"$NN.$l$K1h$C$F(B
+        $B!z(B $BHO0O;XDj!?FI$_F~NO%b!<%I(B
+        $B!J!z(B $BIJ;lA*Br%b!<%I!K(B
+        $B!z(B $B3NG'%b!<%I(B
+        $B!z(B $BA`:n7k2LI=<(%b!<%I(B
+    $B$KJ,$1$k$3$H$,$G$-!"EPO?$N>l9g$K$O3NG'%b!<%I$NA0$K(B
+    SelectMode $B$NIJ;lA*Br%b!<%I$,M>7W$KF~$k$3$H$K$J$j$^$9!#(B
+
+    $B<-=qEPO?!?>C5n;~$N%a%C%;!<%8$OIJ;lA*Br$NItJ,0J30$O(B
+    CandidatePanel $B$G$O$J$/!"(BAuxPanel $B$r;HMQ$7$^$9!#(B
+
+    $B!v<-=qEPO?;~$NCm0U;v9`!v(B
+
+    (1) $BEPO?!?>C5n;~$NFI$_J8;zNs$O:GBg$G$b(B 31 $BJ8;z$^$G$G$9!#(B
+        $B$=$l0J>e$N$H$-$OEPO?F0:n$,=PMh$^$;$s!#(B
+        $B$^$?!"BP1~$9$k4A;zJ8;zNs$O:GBg$G$b(B 32 $BJ8;z$^$G$G$9!#(B
+
+    (2) $BFI$_J8;zNs$K;HMQ$G$-$k$b$N$O0J2<$N$b$N$K8B$i$l$^$9!#(B
+        
+      $B!<!t!&")(B
+      $B#0#1#2#3#4#5#6#7#8#9(B
+      $B#A#B#C#D#E#F#G#H#I#J#K#L#M#N#O#P#Q#R#S#T#U#V#W#X#Y#Z(B
+      $B#a#b#c#d#e#f#g#h#i#j#k#l#m#n#o#p#q#r#s#t#u#v#w#x#y#z(B
+      $B$"$$$&$($*$+$-$/$1$3$5$7$9$;$=$?$A$D$F$H$J$K$L$M$N(B
+      $B$O$R$U$X$[$^$_$`$a$b$d!!$f!!$h$i$j$k$l$m$o$p!!$q$r$s(B
+      $B$,$.$0$2$4$6$8$:$<$>$@$B$E$G$I$P$S$V$Y$\$Q$T$W$Z$](B
+      $B$!$#$%$'$)$C$c$e$g$n%t%u%v(B
+
+        $B$?$@$70J2<$NJ8;z$OFI$_J8;zNs$N@hF,$H$J$k$3$H$,=PMh$^$;$s!#(B
+
+      $B!<$r$s$!$#$%$'$)$C$c$e$g$n%u%v(B
+
+        $B$J$*!"BP1~$9$k4A;zJ8;zNs$K$OH>3QJ8;z$b;XDj$G$-$^$9!#(B
+
+    (3) $BF0;l$d7AMF;l$rEPO?$9$k>l9g$OEPO?$7$h$&$H$9$kF0;l$N(B
+        $B!V8l44ItJ,!W$NFI$_$H4A;zJ8;zNs$rM?$($kI,MW$,$"$j$^$9!#(B
+        $BNc$($P!V%1%A$k!W$H$$$&F0;l$rEPO?$7$?$$>l9g$K$OFI$_$K(B
+        $B!V$1$A!W!"BP1~$9$kJQ49:Q$_J8;zNs$K!V%1%A!W!"IJ;l$K(B
+        $B!V%i9T8^CJF0;l!W$r;XDj$7$^$9!#$^$?!"!V%d%P$$!W$H$$$&(B
+        $B7AMF;l$rEPO?$7$?$$>l9g$OFI$_$K!V$d$P!W!"BP1~$9$k(B
+        $BJQ49:Q$_J8;zNs$K!V%d%P!W!"IJ;l$K!V7AMF;l!W$r;XDj$7$^$9!#(B
+
+    (4) $B>C5n;~$O0lEY$K$R$H$D$N=O8l(B<->$BIJ;l(B $B$NAH9g$;$7$+>C5n$7$^$;$s!#(B
+        $B$R$H$D$N=O8l$,J#?t$NIJ;l$GEPO?$5$l$F$$$k$H$-$O!"(B[2]4. $B>C5nA`:n(B
+        $B7k2LI=<(%b!<%I(B $B$G(B cancel $B$K%P%$%s%I$5$l$?%-!<$G$^$?(B
+        [2]2. $BHO0O;XDj!?FI$_F~NO%b!<%I$KLa$C$F>C5nF0:n$r7+$jJV$7(B
+        $B9T$C$F$/$@$5$$!#(B
+
+<7> $BF~NOJ8;zJQ49$N35MW(B
+
+    Xsj3clib $B$G$OJ8;zF~NO$O#5<oN`$NJ8;z<o$H#4<oN`$N%3!<%I$GD>@\(B
+    $BF~NO$G$-$^$9$,!"$3$N#5<oN`$NJ8;z<o$GD>@\F~NO$9$k:]$N(B
+    $BJQ495,B'$K$D$$$F@bL@$7$^$9!#(B
+
+    $BJ8;zF~NO;~$N%-!<!&%$%Y%s%H$O$^$:!"(B
+
+#define IsKanaKey(ks)   ((unsigned)(ks) < 0xff00 && ((unsigned)(ks) & 0x0400))
+#define IsLatin1Key(ks) ((unsigned)(ks) < 0x0100)
+
+    $B$H$$$&(B define $B$K$h$C$F!"(BLatin1 $B$N(B keysym $B$H(B Katakana $B$N(B keysym
+    $B$KJ,$1$i$l$F$=$l$>$lA4$/0[$J$k=hM}$,$5$l$^$9!#(B
+
+    [1] Latin1 $B$N(B keysym $B$N$H$-$OF~NOJ8;z<o$K$h$C$F(B
+        XmuLookupKana() $B$GF@$i$l$?H>3QJ8;zNs$KBP$7$F(B
+        $B$=$l$>$l0J2<$N=hM}$r9T$$$^$9!#(B
+
+    (1) $BF~NOJ8;z<o$,!V$R$i$,$J!W(B($B%G%U%)%k%H$N(B sjrc $B$N(B
+        $B%b!<%II=<($G$O!V%m!<%^!W(B)$B$N$H$-(B sjrk $B%U%!%$%k$N5-=R$K(B
+        $B=>$C$F%m!<%^$+$JJQ49$7$?7k2L$rI=<($7$^$9!#(B
+
+    (2) $BF~NOJ8;z<o$,!VA43Q%+%?%+%J!W(B($B%G%U%)%k%H$N(B sjrc $B$G$OL$;HMQ(B)$B$N$H$-(B
+        sjrk $B%U%!%$%k$N5-=R$K=>$C$F%m!<%^$+$JJQ49$7$?7k2L$r(B
+        sjhk $B%U%!%$%k$N#1NsL\(B([zhira])$B$H#2NsL\$N(B([zkata])$B$N(B
+        $BJQ495,B'$K=>$C$FJQ49$7!"I=<($7$^$9!#(B
+
+    (3) $BF~NOJ8;z<o$,!VH>3Q%+%?%+%J!W(B($B%G%U%)%k%H$N(B sjrc $B$G$OL$;HMQ(B)$B$N$H$-(B
+        sjrk $B%U%!%$%k$N5-=R$K=>$C$F%m!<%^$+$JJQ49$7$?7k2L$r(B
+        $B$R$i$,$J$N$H$-$O(B sjhk $B%U%!%$%k$N#1NsL\(B([zhira])$B$H#3NsL\$N(B([hkata])$B$N(B
+        $BJQ495,B'!"A43Q%+%?%+%J$H$-$O(B sjhk $B%U%!%$%k$N#2NsL\(B
+        ([zkata])$B$H#3NsL\(B([hkata])$B$NJQ495,B'$K=>$C$FJQ49$7!"(B
+        $B$=$N$$$:$l$G$b$J$$$H$-$O(B sjzh $B%U%!%$%k$N#3NsL\(B([zkana])
+        $B$H#4NsL\(B([hkana])$B$NJQ495,B'$K=>$C$FJQ49$7!"I=<($7$^$9!#(B
+
+    (4) $BF~NOJ8;z<o$,!VH>3Q%"%k%U%!%Y%C%H!W(B
+        ($B%G%U%)%k%H$N(B sjrc $B$N%b!<%II=<($G$O!V(BABC$B!W(B)
+        $B$N$H$-F~NO$5$l$?%"%9%-!<J8;z$r$=$N$^$^I=<($7$^$9!#(B
+
+    (5) $BF~NOJ8;z<o$,!VA43Q%"%k%U%!%Y%C%H!W(B
+        ($B%G%U%)%k%H$N(B sjrc $B$N%b!<%II=<($G$O!V#A#B#C!W(B)
+        $B$N$H$-F~NO$5$l$?%"%9%-!<J8;z$r(B sjzh $B%U%!%$%k$N#1NsL\(B([halpha])
+        $B$H#2NsL\(B([zalpha])$B$NJQ495,B'$K=>$C$FJQ49$7!"I=<($7$^$9!#(B
+
+    $BNc$($P!"%G%U%)%k%H$N(B sjrk $B%U%!%$%k$K$O!V(B.$B!W$KBP1~$7$F(B
+    $B!V!#!W$,$"$k$N$G!"F~NOJ8;z<o$,!V$R$i$,$J!W$G!V(B.$B!W(B(keysym $B$,(B period)
+    $B$rF~NO$9$k$HA43Q$N!V!#!W$H$7$FI=<($5$l$^$9!#(B
+    $B$h$C$F!"$3$N>l9g(B(keysym $B$,(B period $B$GF~NOJ8;z<o$,$R$i$,$J$N>l9g(B)$B$N(B
+    $BI=<(7k2L$rJQ$($k$K$O(B sjrk $B$r%+%9%?%^%$%:$7$^$9!#(B
+
+    $B$?$@$7!"(BLatin1 $B$N(B keysym $B$G$b5?;w$+$JF~NO5!G=$,(B on $B$K$J$C$F$$$k$H$-(B
+    (<5>[3]40. $B$N(B .KanaInputOnly$B!"(B<5>[1]$B$N(B "kana" $B$N9`;2>H(B)$B$O(B
+    $BNc30$G!"F~NO$5$l$?%"%9%-!<J8;z$r(B sjhk $B%U%!%$%k$N#4NsL\(B([ascii])
+    $B$H#3NsL\(B([hkata])$B$NJQ495,B'$K$h$C$FH>3Q%+%?%+%J$KJQ49$7!"(B
+    $B0J9_8e$K@bL@$9$k(B [2] $B$NF0:n$r9T$$$^$9!#(B
+
+    $B$^$?!"(B.AlphabetConversion on $B$N;~$OF~NOJ8;z<o$,!V$R$i$,$J!W$N;~$H(B
+    $B!VA43Q%+%?%+%J!W$N;~$K8B$j!"%m!<%^$+$JJQ49L$Dj$NJ8;zNs$r(B
+    sjzh $B%U%!%$%k$N#1NsL\(B([halpha])$B$H#2NsL\(B([zalpha])
+    $B$NJQ495,B'$K=>$C$FJQ49$7!"I=<($7$^$9!#(B
+
+    [2] Katakana $B$N(B keysym $B$N$H$-$OF~NOJ8;z<o$K$h$C$F(B
+         XmuLookupKana() $B$GF@$i$l$?H>3QJ8;zNs$KBP$7$F(B
+        $B$=$l$>$l0J2<$N=hM}$r9T$$$^$9!#(B
+        (CcWnn $B$G$O(B XLookupString $B$G8+$F$$$k$N$G2?$bI=<($5$l$J$$(B)
+
+    (1) $BF~NOJ8;z<o$,!V$R$i$,$J!W$N$H$-(B
+        $BF~NO$5$l$?H>3Q%+%?%+%J$r(B .AlphabetConversion off $B$N;~$O(B
+        sjhk $B%U%!%$%k$N#3NsL\(B([hkata])$B$H#1NsL\(B([zhira])$B$NJQ495,B'$K=>$C$F(B
+        $BJQ49$7!"I=<($7$^$9!#(B.AlphabetConversion on $B$N;~$O$3$l$G(B
+        $BJQ49$7$-$l$J$+$C$?$b$N$r(B sjzh $B%U%!%$%k$N#4NsL\(B([hkana])$B$H(B
+        $B#3NsL\(B([zkana])$B$NJQ495,B'$K=>$C$FJQ49$7!"I=<($7$^$9!#(B
+
+    (2) $BF~NOJ8;z<o$,!VA43Q%+%?%+%J!W$N$H$-(B
+        $BF~NO$5$l$?H>3Q%+%?%+%J$r(B .AlphabetConversion off $B$N;~$O(B
+        sjhk $B%U%!%$%k$N#3NsL\(B([hkata])$B$H#2NsL\(B([zkata])$B$NJQ495,B'$K=>$C$F(B
+        $BJQ49$7!"I=<($7$^$9!#(B.AlphabetConversion on $B$N;~$O$3$l$G(B
+        $BJQ49$7$-$l$J$+$C$?$b$N$r(B sjzh $B%U%!%$%k$N#4NsL\(B([hkana])$B$H(B
+        $B#3NsL\(B([zkana])$B$NJQ495,B'$K=>$C$FJQ49$7!"I=<($7$^$9!#(B
+
+    (3) $BF~NOJ8;z<o$,!VH>3Q%+%?%+%J!W$N$H$-(B
+        $BF~NO$5$l$?H>3Q%+%?%+%J$r$=$N$^$^I=<($7$^$9!#(B
+
+    (4) $BF~NOJ8;z<o$,!VH>3Q%"%k%U%!%Y%C%H!W$N$H$-(B
+        $B%Y%k$rLD$i$7$F2?$bF~NO$5$l$^$;$s!#$?$@$7!"5?;w$+$JF~NO5!G=$,(B
+        on $B$N>l9g$OF~NO$5$l$?J8;z$rH>3Q%+%?%+%J$K$;$:!"$=$N$^$^(B
+        $B%"%9%-!<J8;z$GI=<($7$^$9!#(B
+        ($B<B<AE*$K(B [1] $B$N(B (4) $B$HF1$8(B)
+
+    (5) $BF~NOJ8;z<o$,!VA43Q%"%k%U%!%Y%C%H!W$N$H$-(B
+        $B%Y%k$rLD$i$7$F2?$bF~NO$5$l$^$;$s!#$?$@$7!"5?;w$+$JF~NO5!G=$,(B
+        on $B$N>l9g$OF~NO$5$l$?J8;z$rH>3Q%+%?%+%J$K$;$:!"$=$N$^$^(B
+        $B%"%9%-!<J8;z$r(B sjzh $B%U%!%$%k$N#1NsL\(B([halpha])$B$H#2NsL\(B
+        ([zalpha])$B$NJQ495,B'$K=>$C$FJQ49$7!"I=<($7$^$9!#(B
+        ($B<B<AE*$K(B [1] $B$N(B (5) $B$HF1$8(B)
+
+    $BNc$($P!"%G%U%)%k%H$N(B sjhk $B%U%!%$%k$N#3NsL\(B[hkata])$B$N!V!#!W(B($B"+K\Ev$O(B
+    $BH>3Q$N$D$b$j(B) $B$K$OBP1~$7$F#1NsL\(B([zhira]$B!K$KA43Q$N!V!#!W$,$"$k$N$G!"(B
+    $BF~NOJ8;z<o$,!V$R$i$,$J!W$N$H$-(B JIS $BG[Ns$N%-!<%\!<%I$GH>3Q$N(B
+    $B!V!#!W(B(keysym $B$,(B kana_fullstop) $B$rF~NO$9$k$HA43Q$N!V!#!W$H$7$F(B
+    $BI=<($5$l$^$9!#$h$C$F!"$3$N>l9g(B(keysym $B$,(B kana_fullstop $B$G(B
+    $BF~NOJ8;z<o$,$R$i$,$J$N>l9g(B)$B$NI=<(7k2L$rJQ$($k$K$O(B sjhk $B%U%!%$%k(B
+    $B$r%+%9%?%^%$%:$7$^$9!#(B
+
+<8> $B@)8B;v9`(B
+
+    Xsj3clib(sj3lib) $B$K$O0J2<$N$h$&$J@)8B;v9`$,$"$j$^$9!#(B
+
+    1. InputMode $B$GJQ49BP>]$NJ8@a$NFI$_J8;zNs$N9g7W$,(B 480bytes
+        $B$rD6$($k$H$-(B($BH>3Q%+%?%+%J!?H>3Q(B ASCII $BJ8;z$O(B
+        1byte/1$BJ8;z!"$=$l0J30$O(B 2byte/1$BJ8;z(B  $B$H$7$F49;;(B)$B$O(B
+        $B$+$J"*4A;zJQ49$K$h$C$F(B ConvedMode $B$K$O0\$l$^$;$s!#(B
+        $B$?$@$7!"$=$N$^$^3NDj$9$k$3$H$O2DG=$G$9!#(B
+
+<9> $B:#8e$N2]Bj(B
+
+1. Xsj3clib $B$N$+$J4A;zJQ49%5!<%P$K(B sj3serv $B0J30$b%5%]!<%H$7$F!"(B
+    $B$R$H$D$NF~NO%5!<%P$GF1;~$KJ#?t$N$+$J4A;zJQ49%7%9%F%`(B
+    $B$H@\B3$7$?$j!"F0E*$K@Z$jBX$($i$l$k$h$&$K$9$k(B
+2. $B%m!<%^;z$+$JJQ49$GESCf$N(B Preedit $BCf$KBgJ8;z>.J8;z$,:.:_$7$F$b(B
+    CcWnn $B$N$h$&$K:G8e$NJl2;$NBg>.$@$1$G$R$i$,$J!?%+%?%+%J$K(B
+    $BJQ49$G$-$k$h$&$K$9$k(B
+3. $B%3!<%I0l3gJQ49!"%3!<%II=<($X$NJQ49$r%5%]!<%H$9$k(B
+4. $B#1$D$N%-!<!&%P%$%s%I$GF1;~$KJ#?t$N%U%!%s%/%7%g%s$r<B9T$G$-$k$h$&$K$9$k(B
+5. $B2DG=$J8B$jB>$NJQ49%7%9%F%`$N%f!<%6!&%$%s%?!<%U%'!<%9$b%(%_%e%l!<%H(B
+    $B$G$-$k$h$&$K$9$k!#(B
+6. $B%3%s%H%m!<%k%3!<%I$N%"%W%j%1!<%7%g%s$X$N<uEO$7$NJ}K!$N8!F$(B
+7. $BL$%5%]!<%H%U%!%s%/%7%g%s(B(kill)$B$N%5%]!<%H(B
+8. Undo $B5!G=$,M_$7$$!)(B
+9. $B%.%j%7%cJ8;z$d%m%7%"J8;z$b%"%9%-!<$GF~NO$7$?$$!)(B
+
+<10> $B%P%0$r8+$D$1$?$i!D(B
+
+$B%P%0$r8+$D$1$?$i!"$^$?!"$=$NB><ALd!"MWK>$J$I$O(B kinput2@sra.co.jp
+$B08$K%l%]!<%H$7$F$/$@$5$$!#$^$?!"$3$s$J$+$J4A;zJQ49%7%9%F%`(B
+(PC $B>e$N%"%W%j%1!<%7%g%sEy$r4^$`(B)$B$r%(%_%e%l!<%H$9$k(B sjrc $B%U%!%$%k$r(B
+$B:n$C$?$h!"$H$+$3$s$J5!G=$,B-$j$J$$!"$H$$$&>pJs$r4?7^$7$^$9!#(B
+
+<$BIUO?(B1> Canna $B$N%f!<%6!&%$%s%?!<%U%'!<%9$r%(%_%e%l!<%H$9$kJ}K!(B
+
+sj3def/ $B$K(B Canna $B$N%f!<%6%$%s%?!<%U%'!<%9$r(B
+$B%(%_%e%l!<%H$9$k(B sjrc/sjrk $B%U%!%$%k$,$"$j$^$9$N$G4JC1$K(B Canna $B$N(B
+$B%f!<%6!&%$%s%?!<%U%'!<%9$G(B sj3serv $B$r;HMQ$G$-$^$9!#(B
+$B0J2<$N<j=g$G9T$C$F$/$@$5$$!#(B
+
+$B!|(B Kinput2.conf $B$G(B "UseSj3" $B$r(B define $B$7$F(B kinput2 $B$r(B
+    $B%$%s%9%H!<%k$7$F$/$@$5$$!#(B
+
+$B!|(B % cd sj3def
+   % mv sj3def/sjrc.EUC{,.org}
+   % cp sj3def/sjrc{.iroha.EUC,EUC}
+   % mv sj3def/sjrk.EUC{,.org}
+   % cp sj3def/sjrk{.iroha.EUC,EUC}
+   % make clean
+   % make
+    $B$N$h$&$K$7$F$G$-$?(B sj3def/{sjrc,sjrk} $B%U%!%$%k$r(B
+    $HOME/.{sjrc,sjrk} $B$H$7$F%3%T!<$7$^$9!#(B
+
+$B!|(B kinput2 -sj3 $B$G5/F0$7$^$9!#(B
+
+$B"!(B $B$?$@$7!"0J2<$NE@$,<B:]$N(B Canna $B$H0[$J$j$^$9!#(B
+
+1. $BJQ49%5!<%P$N;EMM$N$?$a!"It<sJQ49$O%5%]!<%H$7$F$$$^$;$s(B
+2. $B0lEY$+$J4A;zJQ498e$K(B BS $B%-!<$GL5JQ49>uBV$K$7$?$H$-!"%+%l%s%H$N(B
+    $B0LCV$rH?E>$G$O$J$/!"%F%-%9%H%+!<%=%k$GI=$7$^$9!#(B
+    $B%F%-%9%H%+!<%=%k$OJ8;zNs$N0lHVA0$K$"$k$H7k9=8+$K$/$$$G$9!#(B
+3. $B5-9fF~NO$O(B AuxPanel $B$G$J$/!"(BCandidatePanel $B$NA*BrJ}<0$G$9!#(B
+4. $BJ8@aJT=8J}K!$O(B CcWnn $B$NJ}<0$G$9!#(B
+5. $BJ8;z<o%b!<%I$OJL$NJQ49%b!<%I$K$J$C$F$$$J$$(B(InputMode $B$H6&M-(B)
+    $B$N$GJ8;z<oJQ49NN0h$N3HBg=L>.$O(B Meta-Ctrl-o/Meta-Ctrl-i
+    $B$K3d$jIU$1$F$$$^$9!#J8;z<oJQ49NN0h$bH?E>$7$^$;$s!#(B
+6. $BF1;~$KJ#?t$NJ8@a$GJT=8!"J8;z<oJQ49NN0h$N3HBg=L>.$,$G$-$F$7$^$$$^$9!#(B
+7. $B<-=qEPO?!?:o=|$O(B ConvedMode $B$N(B Help/Shift-Help $B$K3d$jIU$1$F$$$^$9!#(B
+8. Canna $B$G$O$+$J4A;zJQ49$7$?$H$-$K$I$NI=<(J8;z<o$N$H$-$bH>3Q?t;z$O(B
+    $BI,$:A43Q?t;z$KJQ49$7$^$9$,!"(Bsj3 $B$G$O86B'$H$7$FJQ498uJd$NFI$_$KH>3Q$O(B
+    $B<h$l$J$$$N$G!"<+J,$GA43Q?t;z$KJQ49$9$kI,MW$,$"$j$^$9!#(B
+
+<$BIUO?(B2> sjx $B$N%f!<%6!&%$%s%?!<%U%'!<%9$r%(%_%e%l!<%H$9$kJ}K!(B
+
+sj3def/ $B$K(B sjx $B$N%f!<%6!&%$%s%?!<%U%'!<%9$r(B
+$B%(%_%e%l!<%H$9$k(B sjrc/sjrk $B%U%!%$%k$,$"$j$^$9$N$G4JC1$K(B sjx $B$N(B
+$B%f!<%6!&%$%s%?!<%U%'!<%9$G(B sj3serv $B$r;HMQ$G$-$^$9!#(B
+$B0J2<$N<j=g$G9T$C$F$/$@$5$$!#(B
+
+$B!|(B Kinput2.conf $B$G(B "UseSj3" $B$r(B define $B$7$F(B kinput2 $B$r(B
+    $B%$%s%9%H!<%k$7$F$/$@$5$$!#(B
+
+$B!|(B % cd sj3def
+   % mv sj3def/sjrc.EUC{,.org}
+   % cp sj3def/sjrc{.sjx.EUC,EUC}
+   % mv sj3def/sjrk.EUC{,.org}
+   % cp sj3def/sjrk{.sjx.EUC,EUC}
+   % make clean
+   % make
+    $B$N$h$&$K$7$F$G$-$?(B sj3def/{sjrc,sjrk} $B%U%!%$%k$r(B
+    $HOME/.{sjrc,sjrk} $B$H$7$F%3%T!<$7$^$9!#(B
+
+$B!|(B kinput2 -sj3 $B$G5/F0$7$^$9!#(B
+
+$B"!(B $B$?$@$7!"0J2<$NE@$,<B:]$N(B sjx $B$H0[$J$j$^$9!#(B
+
+1. $BJ8@aJT=8(B($B=$@5(B)$BJ}K!$O(B CcWnn $B$NJ}<0$G$9!#(B
+2. .BackDisplay on $B$G$b:G8e$NJ8;z$7$+%m!<%^$+$JJQ49A0$N%"%k%U%!%Y%C%H$r(B
+    $BJ];}$7$F$$$^$;$s!J(BNEWS-OS $B$N(B sj3 $B%3%^%s%I$HF1MM!K!#(B
+3. $B5-9fF~NO$O!"(BCandidatePanel $B$NA*BrJ}<0$G$9(B
+4. .SetNormal $B$d(B .ThroughNext $B$O(B kterm $BEy$N%/%i%$%"%s%H$N(B
+    $B%j%=!<%9(B AllowSendEvent $B$,(B on $B$N(B $B;~$N$_M-8z$G$9!#(B
+5. $BF1;~$KJ#?t$NJ8@a$,JT=8$G$-$F$7$^$$$^$9!#(B
+6. $B%+!<%=%k0\F0$K$h$C$FJ8$NESCf$+$iF~NO$G$-$F$7$^$$$^$9!#(B
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/doc/sj3guide.ps	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,1875 @@
+%!PS-Adobe-2.0
+%%Creator: dvi2ps
+%%Title: sjguide.dvi
+%%Pages: (atend)
+%%BoundingBox: 0 0 595 842
+%%DocumentPaperSizes: A4
+%%Orientation: Portrait
+%%EndComments
+%%BeginFile: /usr/local/lib/tex/dvi2ps-1.7j/tex.ps
+%
+systemdict /setpacking known {
+/savepacking currentpacking def
+true setpacking
+} if
+/TeXDict 200 dict def
+TeXDict begin
+/inch {
+72 mul
+} bind def
+/largepaperarray [
+/letter /legal /11x17
+/b4 /b5 /a5 /a4 /a3
+] def
+/smallpaperarray [
+/note dup where {
+pop
+}{
+pop /lettersmall dup where {
+pop
+}{
+pop /letter
+} ifelse
+} ifelse
+/legal /11x17
+/b4 /b5 /a5
+/a4small dup where {
+pop
+}{
+pop /note dup where {
+pop
+}{
+pop /a4
+} ifelse
+} ifelse
+/a3
+] def
+/setpaper {
+dup where papertray and {
+exch get exec
+} if
+} bind def
+/trayarray [
+/lettertray /legaltray /11x17tray
+/b4tray /b5tray /a5tray /a4tray /a3tray
+] def
+/settray {
+dup statusdict exch known {
+{
+statusdict begin load exec end
+} stopped {
+$error /newerror get {
+$error /errorname get /rangecheck eq {
+(Tray not found, using default tray.) print flush
+/papertray false def
+}{
+handleerror
+} ifelse
+$error /newerror false put
+} if
+} if
+}{
+pop
+} ifelse
+} bind def
+/papertray true def
+/widtharray  [
+8.5 inch 8.5 inch 11 inch
+9.84 inch 6.93 inch
+5.83 inch 8.27 inch 11.69 inch
+] def
+/heightarray [
+11 inch 14 inch 17 inch
+13.9 inch 9.84 inch
+8.27 inch 11.69 inch 16.54 inch
+] def
+/xoffset 0 def
+/yoffset 0 def
+/landscape false def
+/pagesetup {
+dup widtharray exch get /paperwidth exch def
+dup heightarray exch get /paperheight exch def
+dup trayarray exch get settray
+large {largepaperarray}{smallpaperarray} ifelse
+exch get setpaper
+} bind def
+/@letter {0 pagesetup} def
+/@legal {1 pagesetup} def
+/@tabloid {2 pagesetup} def
+/@b4 {3 pagesetup} def
+/@b5 {4 pagesetup} def
+/@a5 {5 pagesetup} def
+/@a4 {6 pagesetup} def
+/@a3 {7 pagesetup} def
+/@landscape {/landscape true def} bind def
+/@manualfeed {
+statusdict /manualfeed known {
+statusdict /manualfeed true put
+statusdict /manualfeedtimeout 120 put
+} if
+} bind def
+/@large {
+/large true def
+} bind def
+/@small {
+/large false def
+} bind def
+/@envelope {
+/xoffset 4.28 inch def
+/yoffset 1.5 inch def
+@letter
+} bind def
+/COPIES	{
+/#copies exch def
+} bind def
+/NF {
+/newname exch def
+/fsize exch def
+/corr exch def
+newname 7 dict def
+newname load begin
+/FontType 3 def
+/FontMatrix [corr 0 0 corr neg 0 0] def
+/FontBBox [0 0 1 1] def
+/BitMaps fsize array def
+/BuildChar /CharBuilder load def
+/Encoding 256 array def
+0 1 255 {Encoding exch /.notdef put} for
+end
+newname newname load definefont pop
+} bind def
+/ch-image {ch-data 0 get} bind def
+/ch-width {ch-data 1 get} bind def
+/ch-height {ch-data 2 get} bind def
+/ch-xoff {ch-data 3 get} bind def
+/ch-yoff {ch-data 4 get} bind def
+/ch-tfmw {ch-data 5 get} bind def
+/CharBuilder {
+/ch-code exch def
+/font-dict exch def
+/ch-data font-dict /BitMaps get ch-code get def
+ch-data null eq not {
+ch-tfmw 0
+ch-xoff neg  ch-yoff neg ch-width ch-xoff sub ch-height ch-yoff sub
+setcachedevice
+ch-width ch-height true [1 0  0 1  ch-xoff ch-yoff]
+{ch-image} imagemask
+} if
+} bind def
+/LWF {
+/lw-v exch def
+/lw-h exch def
+findfont [lw-h 0 0 lw-v 0 0] makefont def
+} bind def
+/LWFX {
+/lw-v exch def
+/lw-h exch def
+/savecurfont currentfont def
+findfont dup setfont
+[
+( ) stringwidth pop dup lw-h exch div
+exch lw-v exch div 0 0 3 -1 roll
+0 0
+] makefont def
+savecurfont setfont
+} bind def
+/LWJF /LWF load def
+/SF /setfont load def
+/s3 3 string def
+/D {
+/ch-code exch def
+dup 0 get
+length 2 lt {
+pop [ <00> 1 1 0 0 8.00 ]
+} if
+/ch-data exch def
+currentfont /BitMaps get ch-code ch-data put
+currentfont /Encoding get ch-code
+dup s3 cvs cvn
+put
+} bind def
+/BP {
+/SaveImage save def
+xoffset yoffset translate
+72 72
+landscape {
+exch translate
+90 rotate
+}{
+paperheight exch sub translate
+} ifelse
+72 Resolution div dup neg scale
+0 0 moveto
+} bind def
+/EP {
+showpage 
+SaveImage restore
+} bind def
+/START {
+/Resolution exch def
+} bind def
+/END /end load def
+/l /lineto load def
+/p /moveto load def
+/r {
+0 rmoveto
+} def
+/s /show load def
+/ru {
+/dy exch neg def
+/dx exch def
+/x currentpoint /y exch def def
+newpath x y moveto
+dx 0 rlineto
+0 dy rlineto
+dx neg 0 rlineto
+closepath fill
+x y moveto
+} bind def
+/@SpecialDefaults {
+/hsi paperwidth inch def
+/vsi paperheight inch def
+/hof 0 def
+/vof 0 def
+/hsc 1 def
+/vsc 1 def
+/rotat 0 def
+/CLIP false def
+/BBOX false def
+/EPSF false def
+} bind def
+/@hsize {/hsi exch def /CLIP true def} bind def
+/@vsize {/vsi exch def /CLIP true def} bind def
+/@hoffset {/hof exch def} bind def
+/@voffset {/vof exch def} bind def
+/@hscale {/hsc exch def} bind def
+/@vscale {/vsc exch def} bind def
+/@rotation {/rotat exch def} bind def
+/@bbox {
+/ury exch def
+/urx exch def
+/lly exch def
+/llx exch def
+/BBOX true def
+} bind def
+/@epsf {
+/hsi 0 def
+/vsi 0 def
+/EPSF true def
+} bind def
+/@setclipper {
+CLIP {
+newpath 0 0 moveto hsi 0 rlineto 0 vsi rlineto hsi neg 0 rlineto
+closepath clip
+} if
+} bind def
+/@beginspecial {
+/SpecialSave save def
+currentpoint transform initgraphics itransform translate
+dup scale
+landscape {90 rotate} if
+@SpecialDefaults
+@MacSetUp
+} bind def
+/@setspecial {
+hof vof translate
+EPSF BBOX and {
+hsi 0 eq {
+vsi 0 eq {
+hsc vsc
+}{
+vsi ury lly sub div dup
+}ifelse
+}{
+vsi 0 eq {
+hsi urx llx sub div dup
+}{
+hsi urx llx sub div vsi ury lly sub div
+} ifelse
+} ifelse
+scale
+llx neg ury neg translate
+newpath
+llx lly moveto
+urx llx sub 0 rlineto
+0 ury lly sub rlineto
+llx urx sub 0 rlineto
+closepath clip
+newpath
+}{
+@setclipper hsc vsc scale rotat rotate
+} ifelse
+end
+/letter {} def /note {} def /legal {} def /11x17
+/b4 {} def /b5 {} def /a5 {} def /a4 {} def /a3 {} def
+/showpage {} def /copypage {} def /erasepage {} def
+} bind def
+/@MacSetUp {
+userdict /md known {
+userdict /md get type /dicttype eq {
+/MacDrwgs true def
+md /txpose known {
+md /txpose {pxs pys neg scale} put
+} if
+md /cp known {
+md /cp {pop pop pm restore} put
+} if
+} if
+} if
+} bind def
+/@push {
+/SpecialSave save def
+currentpoint translate
+dup scale
+newpath
+} bind def
+/@pop {
+SpecialSave restore
+} bind def
+/@pn
+/setlinewidth load
+def
+/@pt {
+moveto currentpoint currentlinewidth 2 div 0 360 arc fill
+} bind def
+/@ln {
+moveto lineto stroke
+} bind def
+/@ar {
+matrix currentmatrix
+7 -2 roll moveto
+currentpoint translate
+newpath
+5 -2 roll scale
+0 0 1 6 -2 roll arc
+setmatrix
+} bind def
+/@wh {1 setgray} bind def
+/@sh {0.75 setgray} bind def
+/@bk {0 setgray} bind def
+/@RGB {setrgbcolor} bind def
+/@HSB {sethsbcolor} bind def
+/@CMYK {setcmykcolor} bind def
+end
+/@endspecial {
+clear
+TeXDict begin
+SpecialSave restore
+} bind def
+systemdict /setpacking known {
+savepacking setpacking
+} if
+%%EndFile
+%%EndProlog
+%%BeginSetup
+%%PaperSize: A4
+%%Feature: *ManualFeed False
+%%Feature: *Resolution 300
+TeXDict begin
+@landscape
+@large
+@a4
+%%BeginFile: /usr/local/lib/tex/dvi2ps-1.7j/ASCII-LW-fix.ps
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%% Following procedures are used to define new japanese font which has 
+%%% correct metrics.
+%%%		Added by T.Kakiuchi (kakiuchi@sy6.isl.mei.co.JP) 89/5/19
+%%%		Copyright (c) Matsushita Electric Industrial Co.,Ltd. 1990
+%%%
+% If the packed-array facility is available, this program sets the
+% array-packing mode.
+systemdict /setpacking known {
+    /savepacking currentpacking def
+    true setpacking
+} if
+% Procedure to make a new font which has new metrics.
+
+/Set-New-Metrics 		% [New-FNam][FNam][Metrics-array]
+{/Set-Metrics exch def		% [New-FNam][FNam]  Set-Metrix=[Metrix-Array]
+ findfont 			% [New-FNam][FDic]
+ /OrigCompFont exch def		% [New-FNam]  OrigCompFont=[FDic]
+ /NewCompFontName exch def	% NewCompFontName=[New-FNam]
+
+ % Create new composite font.
+ OrigCompFont dup		% [FDic][FDic]
+ length dict			% [FDic][dict]
+ /NewCompFont exch def		% [FDic]   NewCompFont=[dict]
+ {1 index			% [FDic][key][value][key]
+   /FID ne			% [FDic][key][value][T/F]
+   2 index /UniqueID ne and     % [FDic][key][value][T/F]
+  {NewCompFont 3 1 roll put}	% if TRUE   NewCompFont <- {key,value}
+  {pop pop}
+  ifelse
+ } forall			% 
+
+ OrigCompFont /FDepVector get	% [FDepVector]
+ dup length array 		% [FDepVector][array]
+ copy				% [array] (=[FDepVector])
+ /NewFDepVector exch def	% NewFDepVector=[arrray]
+ NewCompFont /FDepVector 
+ NewFDepVector put		% [NewCompFont] <- {/FDepVector, NewFDepVector}
+
+ Set-Metrics	% [code,NewBaseFontName,Metrics-Array]
+ {dup 0 get /Code exch def	% set Code
+  dup 1 get 
+  /NewBaseFontName exch def     % set NewBaseFontName
+  2 get /Metric-Array exch def	% set Metrics-Array
+
+  % Extract base font and its index to FDepVector.
+  /Index
+     OrigCompFont 
+     /Encoding get 
+     Code get def
+
+  /OrigBaseFont NewFDepVector Index get def
+
+  % Set Metric-Dictionary
+  Metric-Array length dict
+  /Metric-Dict exch def
+  Metric-Dict begin Metric-Array {exec def} forall end
+
+  % Create new base font.
+  OrigBaseFont dup			% [OrgFont][OrgFont] 
+  length 3 add	 			% [OrgFont][1+current size]
+  dict					% [OrgFont][dict]
+  /NewBaseFont exch def			% [OrgFont]    /NewBaseFont=[dict]
+  {1 index                       	% [OrgFont][key][value][key]
+     /FID ne				% [OrgFont][key][value][T/F]
+     2 index /UniqueID ne and           % [OrgFont][key][value][T/F]
+     {NewBaseFont			% [OrgFont][key][value][NewBaseFont]
+      3 1 roll				% [OrgFont][NewBaseFont][key][value]
+      put}					% [OrgFont]
+     {pop pop}
+     ifelse
+  } forall
+  
+  NewBaseFont /Kusumi-Metrics Metric-Dict put
+
+  NewBaseFont /Metrics
+  Metric-Array dup length dict begin
+   { exec dup 1 1000.0 put def } forall
+  currentdict end put
+
+  NewBaseFont				% [OrgFont][NewBaseFont]
+  /CDevProc
+  {currentfont /Kusumi-Metrics
+		% w0x w0y llx lly urx ury w1x w1y vx vy code font /Kusumi-
+   2 copy known
+   {get		% w0x w0y llx lly urx ury w1x w1y vx vy code metrics
+    exch 2 copy known
+    {
+     get	% w0x w0y llx lly urx ury w1x w1y vx vy array
+     dup 0 get	% w0x w0y llx lly urx ury w1x w1y vx vy array new-llx
+     exch 1 get	% w0x w0y llx lly urx ury w1x w1y vx vy new-llx new-lly
+     dup	% w0x w0y llx lly urx ury w1x w1y vx vy new-llx new-lly new-lly
+     8 -1 roll	% w0x w0y llx lly urx w1x w1y vx vy new-llx new-lly new-lly ury
+     10 -1 roll	% w0x w0y llx urx w1x w1y vx vy new-llx new-lly new-lly ury lly
+     sub add	% w0x w0y llx urx w1x w1y vx vy new-llx new-lly new-ury
+     7 1 roll	% w0x w0y llx urx new-ury w1x w1y vx vy new-llx new-lly
+     8 1 roll	% w0x w0y llx new-lly urx new-ury w1x w1y vx vy new-llx
+     dup	% w0x w0y llx new-lly urx new-ury w1x w1y vx vy new-llx new-llx
+     8 -1 roll	% w0x w0y llx new-lly new-ury w1x w1y vx vy new-llx new-llx urx
+     10 -1 roll	% w0x w0y new-lly new-ury w1x w1y vx vy new-llx new-llx urx llx
+     sub add	% w0x w0y new-lly new-ury w1x w1y vx vy new-llx new-urx
+     7 1 roll	% w0x w0y new-lly new-urx new-ury w1x w1y vx vy new-llx
+     8 1 roll	% w0x w0y new-llx new-lly new-urx new-ury w1x w1y vx vy
+    } { pop pop } ifelse
+   } { pop pop pop } ifelse
+  } put
+
+  %  Regist to FDepVector
+  NewFDepVector Index NewBaseFontName NewBaseFont definefont put
+
+ } forall
+
+ NewCompFontName NewCompFont 
+ definefont pop			% Define [NewCompFont] as [NewCompFontName]
+}
+bind def
+
+% Definition of new metrics for /Ryumin-Light-H 
+/Ryumin-Metrics
+[
+[33/Ryumin-Light-H-33[
+{/c22 [127.507 -74.3191]}
+{/c23 [102.007 -75.2261]}
+{/c24 [103.833 -142.045]}
+{/c25 [106.833 -21.8191]}
+{/c26 [106.333 290.856]}
+{/c27 [105.323 -22.3191]}
+{/c28 [101.333 -88.2392]}
+{/c29 [50.4616 -50.9548]}
+{/c2A [111.833 -50.9548]}
+{/c2B [56.3327 584.077]}
+{/c2C [81.7527 620.896]}
+{/c2D [73.195 622.713]}
+{/c2E [73.1949 622.713]}
+{/c2F [86.4865 695.803]}
+{/c30 [106.905 649.984]}
+{/c33 [123.507 285.037]}
+{/c35 [124.507 236.947]}
+{/c36 [154.717 247.806]}
+{/c37 [145.717 141.902]}
+{/c39 [35.7169 42.2182]}
+{/c3E [51.8327 339.356]}
+{/c42 [79.8026 -76.5983]}
+{/c43 [153.333 -76.5983]}
+{/c46 [101.833 534.532]}
+{/c47 [101.333 510.442]}
+{/c48 [95.6039 553.532]}
+{/c49 [95.824 547.532]}
+{/c4A [137.007 -116.598]}
+{/c4B [137.007 -116.598]}
+{/c4C [120.007 -116.598]}
+{/c4D [120.007 -116.598]}
+{/c4E [132.007 -101.817]}
+{/c4F [131.507 -101.817]}
+{/c50 [192.016 -121.598]}
+{/c51 [192.017 -121.598]}
+{/c52 [99.5065 -1.64352]}
+{/c53 [99.5065 -1.64352]}
+{/c54 [52.5065 -122.598]}
+{/c55 [52.5065 -122.598]}
+{/c56 [87.0065 -95.4706]}
+{/c57 [87.0065 -101.817]}
+{/c58 [104.457 -101.817]}
+{/c59 [104.456 -101.817]}
+{/c5A [122.007 -116.598]}
+{/c5B [122.007 -116.598]}
+{/c68 [12.747 88.0878]}
+{/c69 [33.1968 -90.7713]}
+{/c6A [53.6868 -66.46]}
+{/c6B [129.961 597.806]}
+{/c6C [154.132 592.713]}
+{/c6D [73.5612 592.713]}
+{/c70 [147.722 -99.2739]}
+{/c71 [162.717 -119.0]}
+{/c72 [45.6719 -25.4548]}
+{/c78 [36.5515 -98.3165]}
+]]
+[36/Ryumin-Light-H-36[
+{/c21 [83.9483 -17.5452]}
+{/c23 [76.1769 22.4495]}
+{/c25 [184.155 -73.3244]}
+{/c26 [241.525 -88.5079]}
+{/c27 [97.2168 -29.5]}
+{/c29 [82.2642 -19.8191]}
+{/c2F [295.128 -52.5983]}
+{/c30 [154.133 -78.1888]}
+{/c31 [105.385 -66.101]}
+{/c32 [65.1122 -64.1009]}
+{/c39 [76.6303 -70.8296]}
+{/c3A [51.3751 -79.2765]}
+{/c43 [67.7751 29.6356]}
+{/c63 [75.9087 -25.5052]}
+{/c65 [90.2671 -20.4574]}
+{/c67 [149.762 -22.0]}
+{/c6A [273.126 -74.5131]}
+{/c6E [77.4092 -20.0079]}
+]]
+[37/Ryumin-Light-H-37[
+{/c21 [107.237 -10.5557]}
+{/c22 [140.608 -10.694]}
+{/c23 [138.672 -21.8696]}
+{/c24 [186.108 -23.5983]}
+{/c25 [122.757 10.173]}
+{/c26 [162.618 -18.9653]}
+{/c27 [57.7171 46.4069]}
+{/c29 [108.717 5.18086]}
+{/c2A [134.608 -18.8644]}
+{/c2F [187.108 -13.3749]}
+{/c30 [99.7332 -13.3749]}
+{/c31 [115.108 -38.1461]}
+{/c32 [61.9606 -40.6461]}
+{/c35 [83.0882 -28.101]}
+{/c36 [51.291 -27.6009]}
+{/c3D [164.236 1.72083]}
+{/c3E [72.1387 -3.5531]}
+{/c3F [192.108 6.21558]}
+{/c40 [110.209 -19.3749]}
+{/c41 [97.8211 -5.50787]}
+{/c42 [59.748 -30.0983]}
+{/c43 [117.717 -1.05572]}
+{/c44 [162.608 -4.77917]}
+{/c45 [91.8148 -6.10358]}
+{/c46 [123.608 -16.1914]}
+{/c47 [67.1082 -16.1914]}
+{/c48 [277.108 -19.0983]}
+{/c49 [202.688 -19.0983]}
+{/c4A [116.233 -22.1461]}
+{/c4E [197.608 20.8565]}
+{/c55 [168.068 9.80597]}
+{/c56 [84.1834 -2.28442]}
+{/c57 [89.1683 -21.694]}
+{/c5F [258.608 7.7634]}
+{/c61 [191.608 34.9443]}
+{/c63 [80.217 -31.7792]}
+{/c64 [109.108 -13.2418]}
+{/c65 [49.507 53.3165]}
+{/c67 [152.293 46.8617]}
+{/c69 [178.108 -18.1461]}
+{/c6A [239.098 -22.1435]}
+{/c6E [126.697 -17.1461]}
+{/c6F [163.078 -7.6488]}
+{/c72 [193.323 1.49213]}
+{/c75 [124.712 16.4921]}
+{/c76 [83.6869 -21.5079]}
+]]
+] def
+
+% Definition of new metrics for /GothicBBB-Medium-H 
+/Gothic-Metrics
+[
+[33/GothicBBB-Medium-H-33[
+{/c22 [129.507 -72.8191]}
+{/c23 [98.9866 -92.2713]}
+{/c24 [105.833 -114.729]}
+{/c25 [102.833 -1.72871]}
+{/c26 [102.833 311.447]}
+{/c27 [104.333 47.9522]}
+{/c28 [104.333 -68.9574]}
+{/c29 [81.9568 -5.86435]}
+{/c2A [132.288 -5.86435]}
+{/c2B [62.8327 601.122]}
+{/c2C [78.8429 605.851]}
+{/c2D [55.8326 747.529]}
+{/c2E [55.8327 747.529]}
+{/c2F [102.506 765.029]}
+{/c30 [110.507 728.484]}
+{/c33 [76.5065 192.356]}
+{/c35 [67.0065 168.356]}
+{/c36 [133.717 168.673]}
+{/c37 [148.717 167.947]}
+{/c39 [14.7171 44.9443]}
+{/c3E [-13.1673 338.402]}
+{/c42 [76.8826 -93.6435]}
+{/c43 [149.333 -93.6435]}
+{/c46 [104.333 531.761]}
+{/c47 [104.833 521.303]}
+{/c48 [56.0265 531.761]}
+{/c49 [56.9765 520.303]}
+{/c4A [136.007 -97.0983]}
+{/c4B [136.007 -97.0983]}
+{/c4C [120.007 -92.5531]}
+{/c4D [120.007 -92.5531]}
+{/c4E [132.507 -91.2261]}
+{/c4F [132.507 -91.2261]}
+{/c50 [178.072 -108.0]}
+{/c51 [177.982 -108.0]}
+{/c52 [97.5065 -122.598]}
+{/c53 [97.5065 -122.598]}
+{/c54 [58.5065 -101.598]}
+{/c55 [58.5065 -101.598]}
+{/c56 [93.5065 -115.471]}
+{/c57 [94.0065 -92.7261]}
+{/c58 [107.037 -76.2261]}
+{/c59 [107.036 -76.2261]}
+{/c5A [121.007 -99.0983]}
+{/c5B [121.007 -99.0983]}
+{/c68 [5.70184 53.4974]}
+{/c69 [20.1768 1.63565]}
+{/c6A [43.6568 -67.96]}
+{/c6B [138.987 645.032]}
+{/c6C [157.007 631.803]}
+{/c6D [75.5065 631.303]}
+{/c70 [109.182 -97.3643]}
+{/c71 [130.717 -87.9548]}
+{/c72 [101.717 -23.4548]}
+{/c78 [11.5265 -72.6356]}
+]]
+[36/GothicBBB-Medium-H-36[
+{/c21 [86.707 -70.0]}
+{/c23 [58.2168 -27.0]}
+{/c25 [155.272 -56.8722]}
+{/c26 [207.583 -61.9653]}
+{/c27 [97.2418 -48.5904]}
+{/c29 [51.7468 10.6809]}
+{/c2F [256.108 -51.5531]}
+{/c30 [154.608 -51.5531]}
+{/c31 [128.098 -43.1461]}
+{/c32 [69.0981 -43.1461]}
+{/c39 [93.5732 -52.8218]}
+{/c3A [70.6131 -76.9122]}
+{/c43 [51.2172 -38.8722]}
+{/c63 [52.2169 -55.1861]}
+{/c65 [84.167 -70.2287]}
+{/c67 [106.287 -48.5904]}
+{/c6A [211.098 -46.6887]}
+{/c6E [71.752 -48.4627]}
+]]
+[37/GothicBBB-Medium-H-37[
+{/c21 [47.2171 -61.1914]}
+{/c22 [82.6082 -2.01312]}
+{/c23 [102.766 -49.96]}
+{/c24 [148.446 -30.0983]}
+{/c25 [104.207 -69.2818]}
+{/c26 [149.118 -53.2844]}
+{/c27 [74.2168 -4.90957]}
+{/c29 [72.2168 -46.5452]}
+{/c2A [111.608 -31.9548]}
+{/c2F [135.608 -35.194]}
+{/c30 [91.1081 -35.194]}
+{/c31 [77.6081 -46.9653]}
+{/c32 [48.6081 -71.0557]}
+{/c35 [87.1181 -22.0557]}
+{/c36 [52.1181 -22.0557]}
+{/c3D [123.059 5.81125]}
+{/c3E [83.6081 -25.4174]}
+{/c3F [144.608 -29.2844]}
+{/c40 [76.6081 -29.7844]}
+{/c41 [97.6082 -16.9174]}
+{/c42 [55.1081 -15.9174]}
+{/c43 [84.5454 -66.6861]}
+{/c44 [117.481 2.85648]}
+{/c45 [72.1081 -21.4174]}
+{/c46 [96.6082 -30.827]}
+{/c47 [49.6081 -34.827]}
+{/c48 [262.608 -4.5531]}
+{/c49 [209.108 -19.5531]}
+{/c4A [75.6082 -41.6461]}
+{/c4E [163.334 25.9017]}
+{/c55 [140.608 5.48688]}
+{/c56 [91.1081 -15.6036]}
+{/c57 [64.6481 -15.6036]}
+{/c5F [215.108 -45.5983]}
+{/c61 [188.976 18.9017]}
+{/c63 [67.7169 -53.5052]}
+{/c64 [96.6081 -28.0983]}
+{/c65 [41.7168 5.63565]}
+{/c67 [113.717 -50.9096]}
+{/c69 [129.108 -22.6461]}
+{/c6A [225.578 -27.5983]}
+{/c6E [96.2168 -42.5105]}
+{/c6F [135.608 -40.5131]}
+{/c72 [165.608 -33.327]}
+{/c75 [110.257 -69.1435]}
+{/c76 [63.2168 -52.9627]}
+]]
+] def
+systemdict /setpacking known {
+    savepacking setpacking
+} if
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%EndFile
+300 START
+1.000 120 /f31 NF
+f31 SF
+[<7F1FC0FF1FE07F1FC01C07001C07001C07001FFF000FFE000FFE000E0E000E0E00071C00071C00071C00071C00071C000318
+  0003B80003B80003B80001B00001B00001F00001F00000E000> 24 25 -1 0 21.793] 65 D
+[<01F00007FC000FFE001F0F003C0700380380700380700380F00000E00000E00000E00000E00000E00000E00000E00000F000
+  007003807003803803803C07801F0F800FFF8007FB8001F180> 24 25 -2 0 21.793] 67 D
+[<7FFFE0FFFFE07FFFE01C00E01C00E01C00E01C00E01C00E01C00001C1C001C1C001FFC001FFC001FFC001C1C001C1C001C00
+  001C00001C01C01C01C01C01C01C01C07FFFC0FFFFC07FFFC0> 24 25 -1 0 21.793] 69 D
+[<7F07E0FF8FF07F07E01C03801C07001C07001C0E001C0E001C1C001E1C001F38001FF8001FF0001DF0001CE0001CF0001C78
+  001C3C001C1C001C0E001C0F001C07807F0FE0FF8FF07F0FE0> 24 25 0 0 21.793] 75 D
+[<FFFFE0FFFFE0FFFFE01C00E01C00E01C00E01C00E01C00401C00001C00001C00001C00001C00001C00001C00001C00001C00
+  001C00001C00001C00001C00001C0000FFC000FFC000FFC000> 24 25 -1 0 21.793] 76 D
+[<7F0F00FF9F007F1F001C17001C37001C37001C37001C77001C77001C67001C67001CE7001CE7001CE7001CC7001CC7001DC7
+  001DC7001D87001D87001D87001D07007F1FC0FF3FE07E1FC0> 24 25 -1 0 21.793] 78 D
+[<1FFC003FFE007FFF00780F00F00780F00780E00380E00380E00380E00380E00380E00380E00380E00380E00380E00380E003
+  80E00380E00380E00380F00780780F007FFF003FFE001FFC00> 24 25 -2 0 21.793] 79 D
+[<C7F000FFFC00FFFE00F80F00E00700E00380600380000380000380000700000F0000FE0007FC001FF0003F8000780000F000
+  00E00000E00700E00700F00700781F003FFF001FFF0007E300> 24 25 -2 0 21.793] 83 D
+[<07FC000FFE0007FC0000E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E0
+  0000E000E0E0E0E0E0E0E0E0E0E0E0E0FFFFE0FFFFE07FFFE0> 24 25 -1 0 21.793] 84 D
+[<00E00001F00001F00001B00003B80003B80003B800031800071C00071C00071C00071C00060C000E0E000E0E000E0E000E0E
+  001C07001C07001C07001C0700380380FE0FE0FF1FE0FE0FE0> 24 25 -1 0 21.793] 86 D
+[<0F83E03FE7E07FFFE0783E00E00E00E00E00E00E00700E003E0E001FFE0003FE00000E00000E00300E00783C007FF8003FF0
+  001FE000> 24 18 -2 0 21.793] 97 D
+[<03F00FF81FFC3E0E78077007F000E000E000E000E000E0007000780C3C1E1FFE0FFC03F8> 16 18 -3 0 21.793] 99 D
+[<07C7E00FE7F01FFFE03C1F00700F00700F00E00700E00700E00700E00700E00700E00700700700780F003C1F001FFF000FF7
+  0003C700000700000700000700000700003F00007F00003F00> 24 25 -1 0 21.793] 100 D
+[<03F00FFC1FFE3C0F78077007E000E000FFFFFFFFFFFFE0077007780E3C1E1FFC0FF803E0> 16 18 -3 0 21.793] 101 D
+[<03F8000FFE003FFF807C07C07001C0E000E0E000E0E000E0E000E07803C03FFF801FFF001FFC001800003800001BE0001FF0
+  000FF8001C1C00380E00380E00380E00380E00380E001C1CC00FFFE007F7E003E3C0> 24 28 -1 10 21.793] 103 D
+[<7FC7F0FFE7F87FC7F00E03800E03800E03800E03800E03800E03800E03800E03800E03800E03800F03800F87800FFF000EFE
+  000E3C000E00000E00000E00000E00007E0000FE00007E0000> 24 25 0 0 21.793] 104 D
+[<7FFFFFFF7FFF01C001C001C001C001C001C001C001C001C001C001C001C07FC07FC07FC00000000000000000018003C003C0
+  0180> 16 26 -3 0 21.793] 105 D
+[<3F807FC0FFE0F0F0607000380038003800380038003800380038003800380038003800380038003800380038003800381FF8
+  1FF81FF800000000000000000030007800780030> 16 35 -2 9 21.793] 106 D
+[<FFFF80FFFF80FFFF8001C00001C00001C00001C00001C00001C00001C00001C00001C00001C00001C00001C00001C00001C0
+  0001C00001C00001C00001C00001C000FFC000FFC000FFC000> 24 25 -2 0 21.793] 108 D
+[<FE3C78FE7CF8FE7CF83870E03870E03870E03870E03870E03870E03870E03870E03870E03870E03C78E03C78E0FFFFE0FFEF
+  C0F9C380> 24 18 0 0 21.793] 109 D
+[<7FC7F0FFE7F87FC7F00E03800E03800E03800E03800E03800E03800E03800E03800E03800E03800F03800F87807FFF00FEFE
+  007E3C00> 24 18 0 0 21.793] 110 D
+[<03E0000FF8001FFC003C1E00780F00700700F00780E00380E00380E00380E00380E00380700700780F003C1E001FFC000FF8
+  0003E000> 24 18 -2 0 21.793] 111 D
+[<7FC000FFE0007FC0000E00000E00000E00000E00000E00000E00000E3C000EFF000FFF800F83C00F01E00E00E00E00700E00
+  700E00700E00700E00700E00700E00E00F00E00F83C07FFF80FEFF007E3E00> 24 27 0 9 21.793] 112 D
+[<FFFC00FFFC00FFFC0007000007000007000007000007000007000007000007000007800007800007C00007F040FF7FE0FF3F
+  E0FF0FC0> 24 18 -1 0 21.793] 114 D
+[<C7E0FFF8FFFCF81EF00EE00E600E003C07F81FF07F807000E01CE01CF03C7FFC3FFC0FEC> 16 18 -3 0 21.793] 115 D
+[<00F80001FC0003FE00078700070380070380070380070100070000070000070000070000070000070000070000FFFF00FFFF
+  007FFF00070000070000070000070000030000> 24 23 -1 0 21.793] 116 D
+[<03E3F007FBF80FFFF00E0F800E03800E03800E03800E03800E03800E03800E03800E03800E03800E03800E03807E1F80FE3F
+  807E1F80> 24 18 0 0 21.793] 117 D
+[<00E00001F00001F00003B80003B80003B800071C00071C00071C00071C000E0E000E0E000E0E001E0F001C07007F1FC0FF1F
+  E07F1FC0> 24 18 -1 0 21.793] 118 D
+[<0F1E000F1E000F1E001DB7001DB7001DB7001DB70019B30019F30019F30038E380380380380380380380380380FF1FE0FFBF
+  E0FF1FE0> 24 18 -1 0 21.793] 119 D
+[<03E0000FF8001FFC001E3C003C1E00780F00700700700700F00780E00380E00380E00380E00380E00380E00380E00380E003
+  80700700700700780F00380E001E3C001FFC000FF80003E000> 24 25 -2 0 21.793] 48 D
+[<7FF87FFC7FF8038003800380038003800380038003800380038003800380038003807380FF807F800F800780038003800180> 16 25 -4 0 21.793] 49 D
+[<7FFF80FFFF807FFF803803801E03800F000003800001C00000E000007000003800001C00000E000007000007000003800003
+  80600380F00380F00780E00700783E003FFC001FF80007E000> 24 25 -2 0 21.793] 50 D
+[<07E0001FF8003FFC00781E00E00700F00380600380000380000380000300000700001E0007FC0007F00007FC00003E00000E
+  00000700000700300700780700781E003FFC001FF80007E000> 24 25 -2 0 21.793] 51 D
+[<01C00001C00001C00001C00071C700F9CF807FFF001FFC0007F00007F0001FFC007FFF00F9CF8071C70001C00001C00001C0
+  0001C000> 24 18 -2 -4 21.793] 42 D
+[<70F8F8F870> 8 5 -8 0 21.793] 46 D
+[<70F8F8F870000000000000000070F8F8F870> 8 18 -8 0 21.793] 58 D
+[<FFF0FFF0FFF0E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000
+  E000E000E000E000FFF0FFF0FFF0> 16 32 -8 3 21.793] 91 D
+[<4010F078FDF83FE00F800300> 16 6 -4 -19 21.793] 94 D
+1.000 123 /f32 NF
+f32 SF
+[<E000078070000F0070000F0070001F0038001E0038001E0018003C001C003C001C003C000FFFF8000FFFF8000E0078000600
+  F0000700F0000700F0000381E0000381E0000181C0000183C00001C3C00000C3800000C7800000E780000067000000670000
+  002E0000003E0000003E0000001C0000> 32 29 -1 0 27.673] 65 D
+[<FFFC00FFFF80F007C0F001E0F000F0F00078F00078F00078F00078F00078F000F0F001F0F003E0F03FC0FFFF80FFFE00FFFF
+  80F007C0F001E0F000F0F000F0F000F0F000F0F000F0F001E0F003C0F00F80FFFF00FFF800> 24 29 -4 0 27.673] 66 D
+[<003F8000FFF003C0780780180F00081E00003C00003C0000780000780000780000F00000F00000F00000F00000F00000F000
+  00F00000F00000F000007800007800007800003C00003C00001E00000F000007803003C0F000FFF0003FC0> 24 31 -3 1 26.520] 67 D
+[<FFFFC0FFFFC0F00000F00000F00000F00000F00000F00000F00000F00000F00000F00000F00000F00000FFFF80FFFF80F000
+  00F00000F00000F00000F00000F00000F00000F00000F00000F00000F00000FFFFC0FFFFC0> 24 29 -4 0 24.791] 69 D
+[<F00000F00000F00000F00000F00000F00000F00000F00000F00000F00000F00000F00000F00000F00000FFFF00FFFF00F000
+  00F00000F00000F00000F00000F00000F00000F00000F00000F00000F00000FFFF80FFFF80> 24 29 -4 0 23.638] 70 D
+[<003F8001FFF003C0F80780380F00381E00383C00383C0038780038780038780038F00038F007F8F007F8F00000F00000F000
+  00F00000F00000F000007800007800007800003C00003C00001E00000F001807803803C0F801FFF0003F80> 24 31 -3 1 27.673] 71 D
+[<F000F0F000F0F000F0F000F0F000F0F000F0F000F0F000F0F000F0F000F0F000F0F000F0F000F0F000F0FFFFF0FFFFF0F000
+  F0F000F0F000F0F000F0F000F0F000F0F000F0F000F0F000F0F000F0F000F0F000F0F000F0> 24 29 -4 0 29.403] 72 D
+[<F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0> 8 29 -4 0 11.531] 73 D
+[<1F807FE0FFF0E0F0C07800780078007800780078007800780078007800780078007800780078007800780078007800780078
+  00780078007800780078> 16 30 -2 1 19.602] 74 D
+[<FFFEFFFEF000F000F000F000F000F000F000F000F000F000F000F000F000F000F000F000F000F000F000F000F000F000F000
+  F000F000F000F000> 16 29 -4 0 22.485] 76 D
+[<E003F0E003F0E007F0E00770E00F70E00E70E00E70E01E70E01C70E03C70E03C70E07870E07870E07070E0F070E0E070E1E0
+  70E1E070E3C070E3C070E38070E78070E70070E70070EF0070EE0070FE0070FC0070FC0070> 24 29 -4 0 29.403] 78 D
+[<003F000001FFE00003FFF00007C0F8000F807C001F003E003E001F003C000F007C000F807800078078000780F80007C0F000
+  03C0F00003C0F00003C0F00003C0F00003C0F00003C0F00003C0F00003C07800078078000780780007803C000F003E001F00
+  1E001E000F807C0007C0F80003FFF00001FFE000003F0000> 32 31 -2 1 30.556] 79 D
+[<F00000F00000F00000F00000F00000F00000F00000F00000F00000F00000F00000F00000F00000FFFE00FFFF80F00FC0F003
+  E0F001E0F000F0F000F0F000F0F000F0F000F0F000F0F001E0F003C0F00F80FFFF00FFFC00> 24 29 -4 0 26.520] 80 D
+[<00000F8000001F0000003E0000003C00003F780001FFF80003FFF00007C1F8000F83FC001E03DE003E079F003C0F0F00780E
+  07807800078078000780F00003C0F00003C0F00003C0F00003C0F00003C0F00003C0F00003C0F00003C0F00003C078000780
+  78000780780007803C000F003E001F001F003E000F807C0007C0F80003FFF00001FFE000003F0000> 32 35 -2 5 30.556] 81 D
+[<07F0001FFC007C0E00F00700E00380C001800001C00001C00001C00001C00003C00003C0000780001F8001FF0007FE001FFC
+  003FE0007F0000780000F00000E00000E00000E00000E000006000007003003807001C0F000FFE0003F800> 24 31 -2 1 23.061] 83 D
+[<001E0000001E0000001E0000001E0000001E0000001E0000001E0000001E0000001E0000001E0000001E0000001E0000001E
+  0000001E0000001E0000001E0000001E0000001E0000001E0000001E0000001E0000001E0000001E0000001E0000001E0000
+  001E0000001E0000FFFFFF80FFFFFF80> 32 29 -1 0 28.250] 84 D
+[<01F80007FE000F07801E03803C01C07800E07800E0F00070F00070F00070F00070F00070F00070F00070F00070F00070F000
+  70F00070F00070F00070F00070F00070F00070F00070F00070F00070F00070F00070F00070F00070> 24 30 -4 1 28.538] 85 D
+[<001C0000003E0000003E0000007B0000007300000073000000F3800000F1800001E1C00001E1C00001E0C00003C0E00003C0
+  E00003C0600007807000078070000F0038000F0038000F0038001E001C001E001C003E000E003C000E003C000E0078000700
+  7800070078000700F0000380F0000380> 32 29 -1 0 27.673] 86 D
+[<3F1C7FDC7FFCF07CE01CE01CE01C781C3FFC0FFC00FC001C001C401C70387FF83FF00FC0> 16 18 -2 0 19.948] 97 D
+[<E3C0EFF0FFF8F87CF01CE01CE00EE00EE00EE00EE00EE00EE01EF01CF87CFFF8EFF0E3E0E000E000E000E000E000E000E000
+  E000E000E000E000> 16 29 -3 0 21.447] 98 D
+[<07E00FF81FFC3C1C70047000E000E000E000E000E000E000700070043C1C1FFC0FF807E0> 16 18 -2 0 18.449] 99 D
+[<0F8E1FEE3FFE7C3E701EF00EE00EE00EE00EE00EE00EE00E700E700E7C3E3FFE1FEE0F8E000E000E000E000E000E000E000E
+  000E000E000E000E> 16 29 -2 0 21.447] 100 D
+[<07E01FF83FFC3C1C70047000E000E000E000FFFCFFFCFFFC601C701878783FF01FE007C0> 16 18 -2 0 18.449] 101 D
+[<0E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E00FFE0FFE00E000E000E000E000E000E000E00
+  070003FC01FC00FC> 16 29 0 0 12.684] 102 D
+[<07F8001FFE003FFF007C0F80F003C0E001C0E001C0E001C07007803FFF801FFF001FFC003800003800003BC0001FF0001FF8
+  001C3800381C00381C00381C00381C00381C001C38001FFFC00FFFC003C3C0> 24 27 -1 9 20.755] 103 D
+[<E01CE01CE01CE01CE01CE01CE01CE01CE01CE01CE01CE01CE01CF01CF83CFFF8EFF0E3E0E000E000E000E000E000E000E000
+  E000E000E000E000> 16 29 -3 0 21.447] 104 D
+[<70707070707070707070707070707070707000000000000000F0F0F0F0> 8 29 -2 0 9.916] 105 D
+[<3E00FF00FF80C3C001C001C001C001C001C001C001C001C001C001C001C001C001C001C001C001C001C001C001C001C001C0
+  01C0000000000000000000000000000003C003C003C003C0> 16 37 3 8 11.069] 106 D
+[<E01EE03CE038E078E0F0E0E0F1E0F9C0FB80FF80FF00EF00E780E3C0E1E0E0F0E078E03CE000E000E000E000E000E000E000
+  E000E000E000E000> 16 29 -3 0 20.294] 107 D
+[<E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0> 8 29 -3 0 9.916] 108 D
+[<E00E00E0E00E00E0E00E00E0E00E00E0E00E00E0E00E00E0E00E00E0E00E00E0E00E00E0E00E00E0E00E00E0E00E00E0E00E
+  00E0F00F00E0F81F81E0FFFDFFC0EFF8FF80E3F03F00> 32 18 -3 0 32.977] 109 D
+[<E01CE01CE01CE01CE01CE01CE01CE01CE01CE01CE01CE01CE01CF01CF83CFFF8EFF0E3E0> 16 18 -3 0 21.447] 110 D
+[<03F0000FFC001FFE003C0F00780780700380F003C0E001C0E001C0E001C0E001C0E001C07003807807803C0F001FFE000FFC
+  0003F000> 24 18 -1 0 20.755] 111 D
+[<E000E000E000E000E000E000E000E000E3C0EFF0FFF8F87CF03CE01CE00EE00EE00EE00EE00EE00EE01EF01CF87CFFF8EFF0
+  E3E0> 16 26 -3 8 21.447] 112 D
+[<000E000E000E000E000E000E000E000E0F8E1FEE3FFE7C3E701EF00EE00EE00EE00EE00EE00EE00E700E781E7C3E3FFE1FEE
+  078E> 16 26 -2 8 21.447] 113 D
+[<E000E000E000E000E000E000E000E000E000E000E000F000F000F800FC00EF80E780E380> 16 18 -3 0 14.183] 114 D
+[<1FC07FE0FFF0F07880380038003800F01FE03FC07F00F000E000E000F0307FF03FF01FC0> 16 18 -1 0 15.912] 115 D
+[<07C00FF01FF01C201C001C001C001C001C001C001C001C001C001C001C001C00FFE0FFE01C001C001C001C001C001C00> 16 24 -1 0 14.990] 116 D
+[<3F1C7FDCFFFCE07CE01CE01CE01CE01CE01CE01CE01CE01CE01CE01CE01CE01CE01CE01C> 16 18 -3 0 21.447] 117 D
+[<03C003C007E0076006600E700E701C381C381C38381C381C381C700E700E7006E007E007> 16 18 -1 0 19.141] 118 D
+[<078070000F80F8000F80F8000D80D8001DC1DC001DC1DC001CC1CC0018E18C0038E38E0038E38E0038E38E00707307007077
+  07007077070070370300E03E0380E03E0380E03E0380> 32 18 -1 0 28.365] 119 D
+[<F003C07003803807001C0E000E1C000E180007380003F00001E00001C00001E00003F0000738000E1C001C1C003C0E007807
+  00700380> 24 18 0 0 19.141] 120 D
+[<F800FC00FE000700030003000180018001C001C003C00360076006700E700E300C381C381C18381C381C780E700E700EE007
+  E007> 16 26 -1 8 19.141] 121 D
+[<FFFCFFFCFFFC78003C001C001E000F000700038003C001E000E000F000787FFC7FFC7FFC> 16 18 -1 0 18.045] 122 D
+[<07E00FF01FF83C3C381C700E700E700EE007E007E007E007E007E007E007E007E007E007E007E007E007700E700E700E381C
+  3C3C1FF80FF003C0> 16 29 -2 1 20.755] 48 D
+[<FFF8FFF8070007000700070007000700070007000700070007000700070007000700070007000700070007000700C700FF00
+  3F0007000100> 16 28 -4 0 20.755] 49 D
+[<FFFFFFFF700038001C000E000700038001C001E000F00078003C001C001E000E000F000700074007400FC00FE00E601E701C
+  38781FF007C0> 16 28 -2 0 20.755] 50 D
+[<07E01FF0383C601CC01E800F800F000F000F000F000F001E001C003C07F007E007F00078003C001C001E001E401E401EE01E
+  701C38381FF007E0> 16 29 -2 1 20.755] 51 D
+[<001C00001C00001C00001C00001C00001C00001C00FFFFC0FFFFC0F01C00701C00781C00381C003C1C001C1C000E1C000E1C
+  00071C00071C00039C00039C00019C0001DC0000DC00005C00007C00003C00> 24 27 -1 0 20.755] 52 D
+[<0FC01FF03878603CC01E401E000F000F000F000F000F000F780F781E7C1E7E3C7FF87FF073E0700070007000700070007000
+  70007FFE7FFE> 16 28 -2 1 20.755] 53 D
+[<03E00FF01C38381C300E700E70077007E007E007E007E007E007F007F00EF81EFC3CEFFCE7F871F070007000380038001C00
+  0E00070403FC00F8> 16 29 -2 1 20.755] 54 D
+[<0F803FC070F020300018001C000C000E000E0F861FE73FF73C3F781F700FE00FE007E007E007E007E007E006E00E700E700C
+  381C1C380FF003C0> 16 29 -2 1 20.755] 57 D
+[<C040404060E0E0E0> 8 8 -4 -21 11.531] 39 D
+[<00E001C0038007000E000E001C001C003800380038007000700070007000E000E000E000E000E000E000E000E000E000E000
+  E000E00070007000700070003800380038001C001C000E000E000700038001C000E0> 16 42 -2 11 16.143] 40 D
+[<E000700038001C000E000E000700070003800380038001C001C001C001C000E000E000E000E000E000E000E000E000E000E0
+  00E000E001C001C001C001C0038003800380070007000E000E001C0038007000E000> 16 42 -2 11 16.143] 41 D
+[<C040404060E0E0E0> 8 8 -4 5 11.531] 44 D
+[<E0E0E0> 8 3 -4 0 11.531] 46 D
+[<C000C0006000600060003000300030001800180018000C000C000C000600060003000300030001800180018000C000C000C0
+  00600060003000300030001800180018000C000C000C00060006000600030001> 16 41 -2 10 20.755] 47 D
+[<FFFFFFE0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0FFFFFF> 8 41 -3 10 11.992] 91 D
+[<FFFFFF0707070707070707070707070707070707070707070707070707070707070707070707FFFFFF> 8 41 0 10 11.992] 93 D
+[<0E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C0FFF1
+  C0FFF1C00E00000E00000E00000E00000E00000E00000E000007000007F00003F1C001F1C00001C0> 24 30 0 0 22.254] 12 D
+[<FFE0FFE0> 16 2 0 -8 13.837] 45 D
+1.000 118 /f50 NF
+f50 SF
+[<F80000F8780000F07C0001F03C0003E01E0003C01F0007800F000F8007800F0007C01E0003C03E0001E03C0001F0780000F0
+  F0000079F000007DE000003FC000001FC000001F8000000F0000001F8000001FC000003FC000007DE0000079F00000F0F000
+  01F0780003E07C0003C03C0007C03E000F801F000F000F001E000F803E0007C07C0003C0780003E0> 32 35 -1 0 32.228] 88 D
+[<01FC0007FF800FFFC01F03C03C0040780000780000780000F00000F00000F00000F00000F00000F000007000007800007800
+  003C01801F03800FFF8007FF0001FC00> 24 22 -2 0 21.677] 99 D
+[<01F80007FF000FFF801F07803C0080780000780000700000F00000F00000F00000FFFFC0FFFFC0FFFFC0F001C07803807803
+  803C07803E0F001FFE0007FC0003F000> 24 22 -2 0 21.677] 101 D
+[<1F007FC0FFE0E3E080F000F000F000F000F000F000F000F000F000F000F000F000F000F000F000F000F000F000F000F000F0
+  00F000F000F000F000F000F000F000000000000000000000000000000000000000F000F000F000F0> 16 45 3 10 12.828] 106 D
+[<01FC0007FF000FFF801F07C03E03E07C01F07800F07800F0F00078F00078F00078F00078F00078F000787000707800F07800
+  F03C01E01F07C00FFF8007FF0001FC00> 24 22 -1 0 24.387] 111 D
+[<F000F000F000F000F000F000F000F000F000F000F000F000F000F000F800F800FC00FE00FF00F7E0F3E0F0E0> 16 22 -4 0 16.575] 114 D
+[<0FF03FFCFFFEF81EC00F000F000F000F001F01FE0FFC1FF83FF03F007C007800780078063C0E3FFE1FFC07F0> 16 22 -1 0 18.697] 115 D
+[<1F0F7FCF7FFFF83FF01FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00F> 16 22 -4 0 25.021] 117 D
+[<007000E001C003C0078007000F000E001E001C003C003C00380078007800780078007000F000F000F000F000F000F000F000
+  F000F000F000F000F000F000F0007000780078007800780038003C003C001C001E000E000F000700078003C001C000E00070> 16 50 -3 13 18.968] 40 D
+[<E000700038003C001E000E000F0007000780038003C003C001C001E001E001E001E000E000F000F000F000F000F000F000F0
+  00F000F000F000F000F000F000F000E001E001E001E001E001C003C003C00380078007000F000E001E003C0038007000E000> 16 50 -3 13 18.968] 41 D
+[<F0F0F0F0> 8 4 -5 0 13.548] 46 D
+/F0 /GothicBBB-Medium-H 37.999 -37.999 LWJF
+/F1 /GothicBBB-Medium-H 45.999 -45.999 LWJF
+%%EndSetup
+
+%%Page: 1 1
+BP
+F1 SF
+284 105 p (%-!<%P%$%s%I)s
+83 125 p 678 4 ru
+F0 SF
+384 164 p (JQ49)s
+83 183 p 678 2 ru
+108 222 p (JQ49%b!<%I)s
+f32 SF
+9 r (ON/OFF)s
+50 r (Shift-SP)s
+-2 r (A)s
+-1 r (CE)s
+F0 SF
+108 278 p (JQ49)s
+f32 SF
+9 r (/)s
+F0 SF
+10 r (8uJd0lMw)s
+f32 SF
+140 r (Ctrl-J)s
+F0 SF
+108 333 p (<!8uJd)s
+f32 SF
+294 r (Ctrl-N)s
+F0 SF
+108 389 p (A08uJd)s
+f32 SF
+294 r (Ctrl-P)s
+F0 SF
+108 445 p (3NDj)s
+f32 SF
+332 r (Ctrl-L)s
+F0 SF
+108 501 p (J8@a?-$P$7)s
+f32 SF
+218 r (Ctrl-O)s
+F0 SF
+108 557 p (J8@a=L$a)s
+f32 SF
+256 r (Ctrl-I)s
+F0 SF
+108 612 p (JQ49$r<h>C$7)s
+f32 SF
+180 r (Ctrl-G)s
+83 633 p 678 4 ru
+F0 SF
+308 672 p (%+!<%=%k0\\F0)s
+83 690 p 678 2 ru
+108 729 p (J8;z>C5n)s
+f32 SF
+256 r (Ctrl-H)s
+F0 SF
+108 785 p (>e)s
+f32 SF
+370 r (Ctrl-P)s
+F0 SF
+108 841 p (2<)s
+f32 SF
+370 r (Ctrl-N)s
+F0 SF
+108 897 p (A0)s
+f32 SF
+370 r (Ctrl-F)s
+F0 SF
+108 952 p (8e)s
+f32 SF
+370 r (Ctrl-B)s
+F0 SF
+108 1008 p (9TF,)s
+f32 SF
+332 r (Ctrl-A)s
+F0 SF
+108 1064 p (9TKv)s
+f32 SF
+332 r (Ctrl-E)s
+F0 SF
+108 1120 p (F~NO<h>C$7)s
+f32 SF
+218 r (Ctrl-U)s
+83 1140 p 678 4 ru
+F0 SF
+327 1179 p (F~NO%b!<%I)s
+83 1197 p 678 2 ru
+108 1237 p (5-9fF~NO)s
+f32 SF
+256 r (Ctrl-Q/F10)s
+108 1292 p (JIS)s
+F0 SF
+9 r (%3!<%IF~NO)s
+f32 SF
+155 r (F5)s
+F0 SF
+108 1348 p (6hE@F~NO)s
+f32 SF
+256 r (F6)s
+F0 SF
+108 1404 p (%b!<%I@ZBX$\()s
+f32 SF
+180 r (F9)s
+83 1424 p 678 4 ru
+F0 SF
+327 1463 p (J8;z<oJQ49)s
+83 1482 p 678 2 ru
+108 1521 p (A43Q%+%?%+%J$X)s
+f32 SF
+142 r (F1)s
+F0 SF
+108 1576 p (A43Q$R$i$,$J$X)s
+f32 SF
+142 r (F2)s
+F0 SF
+108 1632 p (H>3Q%+%?%+%J$X)s
+f32 SF
+142 r (F3)s
+F0 SF
+108 1688 p (A43Q$X)s
+f32 SF
+294 r (F4)s
+83 1708 p 678 4 ru
+F0 SF
+384 1747 p (<-=q)s
+83 1766 p 678 2 ru
+108 1805 p (<-=qEPO?)s
+f32 SF
+256 r (Ctrl-T)s
+F0 SF
+108 1861 p (:o=|)s
+f32 SF
+332 r (Ctrl-V)s
+83 1881 p 678 4 ru
+F0 SF
+108 1920 p (%b!<%I$+$i$NC&=P)s
+f32 SF
+104 r (ESC)s
+83 1940 p 678 4 ru
+F1 SF
+1184 105 p (%m!<%^;z$+$JJQ49)s
+892 125 p 951 4 ru
+979 181 p 2 56 ru
+F0 SF
+1005 164 p ($")s
+65 r ($$)s
+188 r ($&)s
+134 r ($\()s
+157 r ($*)s
+892 183 p 951 2 ru
+917 222 p ($")s
+979 239 p 2 56 ru
+f32 SF
+1005 222 p (a)s
+83 r (i)s
+216 r (u)s
+151 r (e)s
+176 r (o)s
+F0 SF
+917 307 p ($+)s
+979 294 p 2 56 ru
+f32 SF
+1005 278 p (ka)s
+63 r (ki/kyi)s
+125 r (ku/qu)s
+67 r (ke)s
+156 r (ko)s
+979 350 p 2 56 ru
+1005 333 p (ca)s
+65 r (ci)s
+197 r (cu)s
+133 r (ce)s
+157 r (co)s
+F0 SF
+917 389 p ($5)s
+979 406 p 2 56 ru
+f32 SF
+1005 389 p (sa)s
+67 r (si/shi)s
+132 r (su)s
+135 r (se)s
+160 r (so)s
+F0 SF
+917 445 p ($?)s
+979 462 p 2 56 ru
+f32 SF
+1005 445 p (ta)s
+68 r (ti/tsyi/chi)s
+50 r (tu/tsu)s
+63 r (te)s
+161 r (to)s
+F0 SF
+917 501 p ($J)s
+979 518 p 2 56 ru
+f32 SF
+1005 501 p (na)s
+62 r (ni)s
+194 r (nu)s
+130 r (ne)s
+154 r (no)s
+F0 SF
+917 557 p ($O)s
+979 573 p 2 56 ru
+f32 SF
+1005 557 p (ha)s
+62 r (hi)s
+194 r (hu/fu)s
+75 r (he)s
+154 r (ho)s
+F0 SF
+917 612 p ($Q)s
+979 629 p 2 56 ru
+f32 SF
+1005 612 p (pa)s
+62 r (pi)s
+194 r (pu)s
+130 r (p)s
+1 r (e)s
+153 r (p)s
+1 r (o)s
+F0 SF
+917 668 p ($^)s
+979 685 p 2 56 ru
+f32 SF
+1005 668 p (ma)s
+50 r (mi)s
+183 r (mu)s
+118 r (me)s
+143 r (mo)s
+F0 SF
+917 724 p ($d)s
+979 741 p 2 56 ru
+f32 SF
+1005 724 p (ya)s
+64 r (yi)s
+197 r (yu)s
+131 r (ye\()s
+F0 SF
+($$$')s
+f32 SF
+(\))s
+49 r (yo)s
+F0 SF
+917 810 p ($i)s
+979 797 p 2 56 ru
+f32 SF
+1005 780 p (ra)s
+69 r (ri)s
+202 r (ru)s
+136 r (re)s
+162 r (ro)s
+979 852 p 2 56 ru
+1005 836 p (la)s
+73 r (li)s
+206 r (lu)s
+141 r (le)s
+166 r (lo)s
+F0 SF
+917 891 p ($o)s
+979 908 p 2 56 ru
+f32 SF
+1005 891 p (wa)s
+55 r (wi\()s
+F0 SF
+($p)s
+f32 SF
+(\))s
+117 r (wu)s
+123 r (w)s
+-1 r (e\()s
+F0 SF
+($q)s
+f32 SF
+(\))s
+78 r (wo\()s
+F0 SF
+($r)s
+f32 SF
+(\))s
+892 910 p 951 2 ru
+F0 SF
+917 949 p ($,)s
+979 966 p 2 56 ru
+f32 SF
+1005 949 p (ga)s
+62 r (gi)s
+196 r (gu)s
+130 r (ge)s
+155 r (go)s
+F0 SF
+917 1005 p ($6)s
+979 1021 p 2 56 ru
+f32 SF
+1005 1005 p (za)s
+65 r (zi/ji)s
+156 r (zu)s
+133 r (ze)s
+158 r (zo)s
+F0 SF
+917 1060 p ($@)s
+979 1077 p 2 56 ru
+f32 SF
+1005 1060 p (da)s
+62 r (di)s
+194 r (du/dsu)s
+50 r (de)s
+155 r (do)s
+F0 SF
+917 1116 p ($P)s
+979 1133 p 2 56 ru
+f32 SF
+1005 1116 p (ba)s
+62 r (bi)s
+194 r (bu)s
+130 r (b)s
+1 r (e)s
+153 r (b)s
+1 r (o)s
+892 1136 p 951 4 ru
+F0 SF
+917 1231 p ("\()s
+14 r (%+%?%+%J$OBgJ8;z$GF~NO)s
+1976 125 p 694 4 ru
+2063 181 p 2 56 ru
+2089 164 p ($c)s
+92 r ($#)s
+74 r ($e)s
+85 r ($')s
+82 r ($g)s
+1976 183 p 694 2 ru
+2001 222 p ($-)s
+2063 239 p 2 56 ru
+f32 SF
+2089 222 p (ky)s
+-1 r (a)s
+184 r (kyu)s
+62 r (kye)s
+61 r (kyo)s
+F0 SF
+2001 278 p ($.)s
+2063 294 p 2 56 ru
+f32 SF
+2089 278 p (gy)s
+-1 r (a)s
+71 r (gyi)s
+62 r (gyu)s
+62 r (gye)s
+61 r (gyo)s
+F0 SF
+2001 333 p ($/)s
+2063 350 p 2 56 ru
+f32 SF
+2089 333 p (qy)s
+-1 r (a)s
+71 r (qyi)s
+61 r (qyu)s
+61 r (qye)s
+61 r (qy)s
+-1 r (o)s
+F0 SF
+2001 419 p ($7)s
+2063 406 p 2 56 ru
+f32 SF
+2089 389 p (sy)s
+-1 r (a)s
+76 r (shi)s
+65 r (syu)s
+67 r (sy)s
+-1 r (e)s
+66 r (syo)s
+2063 462 p 2 56 ru
+2089 445 p (sha)s
+185 r (shu)s
+64 r (she)s
+64 r (sho)s
+F0 SF
+2001 558 p ($8)s
+2063 518 p 2 56 ru
+f32 SF
+2089 501 p (zy)s
+-1 r (a)s
+74 r (zyi)s
+65 r (zyu)s
+65 r (zy)s
+-1 r (e)s
+64 r (zyo)s
+2063 573 p 2 56 ru
+2089 557 p (ja)s
+211 r (ju)s
+91 r (je)s
+90 r (jo)s
+2063 629 p 2 56 ru
+2089 612 p (jy)s
+-1 r (a)s
+81 r (jyi)s
+72 r (jyu)s
+71 r (jye)s
+71 r (jyo)s
+F0 SF
+2001 668 p ($9)s
+2063 685 p 2 56 ru
+f32 SF
+2219 668 p (swi)s
+181 r (swe)s
+F0 SF
+2001 724 p ($F)s
+2063 741 p 2 56 ru
+f32 SF
+2089 724 p (tha)s
+74 r (thi)s
+65 r (thu)s
+66 r (the)s
+64 r (tho)s
+F0 SF
+2001 865 p ($A)s
+2063 797 p 2 56 ru
+f32 SF
+2089 780 p (t)s
+-1 r (y)s
+-1 r (a)s
+78 r (tyi)s
+68 r (tyu)s
+68 r (ty)s
+-2 r (e)s
+68 r (ty)s
+-1 r (o)s
+2063 852 p 2 56 ru
+2089 836 p (tsy)s
+-1 r (a)s
+173 r (tsyu)s
+52 r (tsye)s
+51 r (tsyo)s
+2063 908 p 2 56 ru
+2089 891 p (cha)s
+182 r (chu)s
+62 r (che)s
+61 r (cho)s
+2063 964 p 2 56 ru
+2089 947 p (cy)s
+-1 r (a)s
+185 r (cyu)s
+65 r (cyo)s
+61 r (cya)s
+F0 SF
+2001 1003 p ($B)s
+2063 1020 p 2 56 ru
+f32 SF
+2089 1003 p (dy)s
+-1 r (a)s
+71 r (dyi)s
+61 r (dyu)s
+61 r (dye)s
+61 r (dy)s
+-1 r (o)s
+F0 SF
+2001 1059 p ($G)s
+2063 1075 p 2 56 ru
+f32 SF
+2089 1059 p (dha)s
+-1 r (y)s
+49 r (dhi)s
+59 r (dhu)s
+59 r (dhe)s
+58 r (dho)s
+F0 SF
+2001 1115 p ($I)s
+2063 1131 p 2 56 ru
+f32 SF
+2089 1115 p (dw)s
+-1 r (a)s
+61 r (dwi)s
+53 r (dwu)s
+52 r (dwe)s
+51 r (dw)s
+-1 r (o)s
+F0 SF
+2001 1170 p ($K)s
+2063 1187 p 2 56 ru
+f32 SF
+2089 1170 p (ny)s
+-1 r (a)s
+71 r (nyi)s
+61 r (nyu)s
+61 r (nye)s
+61 r (ny)s
+-1 r (o)s
+F0 SF
+2001 1226 p ($R)s
+2063 1243 p 2 56 ru
+f32 SF
+2089 1226 p (hy)s
+-1 r (a)s
+71 r (hyi)s
+61 r (hyu)s
+61 r (hye)s
+61 r (hy)s
+-1 r (o)s
+F0 SF
+2001 1282 p ($S)s
+2063 1299 p 2 56 ru
+f32 SF
+2089 1282 p (b)s
+-1 r (y)s
+-1 r (a)s
+72 r (byi)s
+61 r (byu)s
+61 r (by)s
+-1 r (e)s
+62 r (b)s
+-1 r (y)s
+-1 r (o)s
+F0 SF
+2001 1338 p ($T)s
+2063 1354 p 2 56 ru
+f32 SF
+2089 1338 p (p)s
+-1 r (y)s
+-1 r (a)s
+72 r (pyi)s
+61 r (pyu)s
+61 r (py)s
+-1 r (e)s
+62 r (p)s
+-1 r (y)s
+-1 r (o)s
+F0 SF
+2001 1393 p ($U)s
+2063 1410 p 2 56 ru
+f32 SF
+2089 1393 p (hw)s
+-1 r (a)s
+61 r (hwi)s
+176 r (hwe)s
+51 r (hwo)s
+F0 SF
+2001 1449 p ($_)s
+2063 1466 p 2 56 ru
+f32 SF
+2089 1449 p (my)s
+-1 r (a)s
+59 r (myi)s
+50 r (myu)s
+50 r (mye)s
+48 r (myo)s
+F0 SF
+2001 1535 p ($j)s
+2063 1522 p 2 56 ru
+f32 SF
+2089 1505 p (ry)s
+-1 r (a)s
+78 r (ryi)s
+69 r (ryu)s
+68 r (rye)s
+68 r (ry)s
+-1 r (o)s
+2063 1578 p 2 56 ru
+2089 1561 p (ly)s
+-1 r (a)s
+82 r (lyi)s
+73 r (lyu)s
+73 r (lye)s
+72 r (ly)s
+-1 r (o)s
+F0 SF
+2001 1617 p (%t)s
+2063 1633 p 2 56 ru
+f32 SF
+2574 1617 p (vy)s
+-1 r (o)s
+1976 1637 p 694 4 ru
+EP
+
+%%Page: 2 2
+BP
+108 105 p 676 4 ru
+195 161 p 2 56 ru
+F0 SF
+221 144 p ($n)s
+81 r ($#)s
+72 r ($%)s
+83 r ($')s
+80 r ($\))s
+108 163 p 676 2 ru
+133 202 p ($&)s
+195 218 p 2 56 ru
+f32 SF
+221 202 p (wha)s
+49 r (whi)s
+50 r (whu)s
+50 r (whe)s
+50 r (who)s
+F0 SF
+133 257 p ($/)s
+195 274 p 2 56 ru
+f32 SF
+221 257 p (qw)s
+-1 r (a)s
+50 r (qwi)s
+50 r (qwu)s
+50 r (qwe)s
+50 r (qwo)s
+F0 SF
+133 313 p ($U)s
+195 330 p 2 56 ru
+f32 SF
+221 313 p (fw)s
+-1 r (a)s
+59 r (fwi)s
+59 r (fwu)s
+58 r (fwe)s
+59 r (fwo)s
+F0 SF
+133 369 p (%t)s
+195 386 p 2 56 ru
+f32 SF
+221 369 p (vy)s
+-1 r (a)s
+62 r (vyi)s
+61 r (vyu)s
+62 r (vy)s
+-1 r (e)s
+108 389 p 676 4 ru
+108 484 p 670 4 ru
+195 540 p 2 56 ru
+F0 SF
+221 523 p ($!)s
+79 r ($#)s
+71 r ($%)s
+83 r ($')s
+78 r ($\))s
+108 542 p 670 2 ru
+133 610 p ($/)s
+195 597 p 2 56 ru
+f32 SF
+221 581 p (kw)s
+-1 r (a)s
+50 r (kwi)s
+50 r (kwu)s
+50 r (kwe)s
+49 r (kwo)s
+195 653 p 2 56 ru
+221 636 p (qa)s
+76 r (qi)s
+198 r (qe)s
+76 r (qo)s
+F0 SF
+133 692 p ($0)s
+195 709 p 2 56 ru
+f32 SF
+221 692 p (gw)s
+-1 r (a)s
+49 r (gwi)s
+50 r (gwu)s
+50 r (gwe)s
+49 r (gw)s
+-1 r (o)s
+F0 SF
+133 748 p ($D)s
+195 765 p 2 56 ru
+f32 SF
+221 748 p (tsa)s
+175 r (tsu)s
+68 r (tse)s
+67 r (tso)s
+F0 SF
+133 804 p ($H)s
+195 820 p 2 56 ru
+f32 SF
+221 804 p (t)s
+-1 r (w)s
+-1 r (a)s
+56 r (twi)s
+56 r (t)s
+-1 r (wu)s
+56 r (tw)s
+-1 r (e)s
+56 r (t)s
+-1 r (w)s
+-1 r (o)s
+F0 SF
+133 860 p ($U)s
+195 876 p 2 56 ru
+f32 SF
+221 860 p (fa)s
+85 r (\014)s
+207 r (fe)s
+85 r (fo)s
+F0 SF
+133 915 p (%t)s
+195 932 p 2 56 ru
+f32 SF
+221 915 p (va)s
+307 r (ve)s
+79 r (vo)s
+108 936 p 670 4 ru
+108 1030 p 615 4 ru
+195 1086 p 2 56 ru
+F0 SF
+221 1070 p ($!)s
+68 r ($#)s
+61 r ($%)s
+71 r ($')s
+67 r ($\))s
+108 1088 p 615 2 ru
+133 1127 p ($!)s
+195 1144 p 2 56 ru
+f32 SF
+221 1127 p (xa)s
+67 r (xi)s
+69 r (xu)s
+69 r (xu)s
+65 r (xo)s
+F0 SF
+133 1183 p ($c)s
+195 1199 p 2 56 ru
+f32 SF
+221 1183 p (xy)s
+-1 r (a)s
+49 r (xyi)s
+50 r (xyu)s
+50 r (xye)s
+49 r (xy)s
+-1 r (o)s
+108 1203 p 615 4 ru
+921 105 p 274 4 ru
+F0 SF
+946 144 p ($s)s
+1008 161 p 2 56 ru
+f32 SF
+1034 144 p (nn/n')s
+F0 SF
+946 200 p ($C)s
+1008 217 p 2 56 ru
+f32 SF
+1034 200 p (xtu/xtu)s
+F0 SF
+946 256 p ($n)s
+1008 272 p 2 56 ru
+f32 SF
+1034 256 p (xw)s
+-1 r (a)s
+F0 SF
+946 312 p ($p)s
+1008 328 p 2 56 ru
+f32 SF
+1034 312 p (xwi)s
+F0 SF
+946 367 p ($q)s
+1008 384 p 2 56 ru
+f32 SF
+1034 367 p (xw)s
+-1 r (e)s
+F0 SF
+946 423 p ($r)s
+1008 440 p 2 56 ru
+f32 SF
+1034 423 p (xw)s
+-1 r (o)s
+F0 SF
+946 479 p (%u)s
+1008 496 p 2 56 ru
+f32 SF
+1034 479 p (xk)s
+-1 r (a/xca)s
+F0 SF
+946 535 p (%v)s
+1008 551 p 2 56 ru
+f32 SF
+1034 535 p (xk)s
+-1 r (e)s
+921 555 p 274 4 ru
+921 650 p 450 4 ru
+F0 SF
+946 689 p (!<)s
+f32 SF
+50 r (\()s
+F0 SF
+(D92;)s
+f32 SF
+(\))s
+1280 706 p 2 56 ru
+1306 689 p (-)s
+946 745 p (-)s
+74 r (\()s
+F0 SF
+(%O%$%U%s)s
+f32 SF
+(\))s
+1280 761 p 2 56 ru
+1306 745 p (x-)s
+F0 SF
+946 800 p (!")s
+f32 SF
+50 r (\()s
+F0 SF
+(FIE@)s
+f32 SF
+(\))s
+1280 817 p 2 56 ru
+1306 800 p (,)s
+946 856 p (,)s
+76 r (\()s
+F0 SF
+(%+%s%^)s
+f32 SF
+(\))s
+1280 873 p 2 56 ru
+1306 856 p (x,)s
+F0 SF
+946 912 p (!#)s
+f32 SF
+50 r (\()s
+F0 SF
+(6gE@)s
+f32 SF
+(\))s
+1280 929 p 2 56 ru
+1306 912 p (.)s
+946 968 p (.)s
+76 r (\()s
+F0 SF
+(%T%j%*%I)s
+f32 SF
+(\))s
+1280 985 p 2 56 ru
+1306 968 p (x.)s
+F0 SF
+946 1024 p (!V)s
+f32 SF
+50 r (\()s
+F0 SF
+($+$.$+$C$3)s
+f32 SF
+(\))s
+1280 1040 p 2 56 ru
+1306 1024 p (x[)s
+F0 SF
+946 1079 p (!W)s
+f32 SF
+50 r (\()s
+F0 SF
+($+$.$+$C$3)s
+f32 SF
+(\))s
+1280 1096 p 2 56 ru
+1306 1079 p (x])s
+F0 SF
+946 1135 p (!&)s
+f32 SF
+50 r (\()s
+F0 SF
+($J$+$0$m)s
+f32 SF
+(\))s
+1280 1152 p 2 56 ru
+1306 1135 p (x/)s
+921 1155 p 450 4 ru
+F1 SF
+1853 105 p (%j%=!<%9)s
+f50 SF
+16 r (\(.Xresources\))s
+f31 SF
+1532 161 p (KTerm*VT100*AllowSendEvents:true)s
+F0 SF
+1664 217 p ($+$J4A;zJQ49%b!<%I$G$b%+!<%=%k$,0\\F0$9$k)s
+f31 SF
+1532 328 p (Kinput2*OverTheSpotConversion.modeLocation:topright)s
+F0 SF
+1664 384 p (%b!<%II=<\($r%&%#%s%I%&$N1&>e$K=P$9)s
+f31 SF
+1532 496 p (Kinput2*Sj3.sj3serv:sj3host1)s
+1532 551 p (Kinput2*Sj3.sj3serv2:sj3host2)s
+F0 SF
+1664 607 p ($+$J4A;zJQ49%5!<%P$N;XDj)s
+F1 SF
+1828 719 p (@_Dj%U%!%$%k)s
+f50 SF
+16 r (\(.sjrc\))s
+f31 SF
+1532 775 p (.sj3serv)s
+22 r (localhost)s
+F0 SF
+1664 830 p (:G=i$K@\\B3$r;n$_$k)s
+f32 SF
+14 r (sj3serv)s
+F0 SF
+14 r ($N%[%9%HL>)s
+f31 SF
+1532 942 p (.sj3serv2)s
+22 r (localhost)s
+f32 SF
+1664 998 p (2)s
+F0 SF
+9 r (HVL\\$K@\\B3$r;n$_$k)s
+f32 SF
+14 r (sj3serv)s
+F0 SF
+14 r ($N%[%9%HL>)s
+f31 SF
+1532 1109 p (.SetNormal)s
+22 r (^[)s
+F0 SF
+1664 1165 p (JQ49Cf$NJ8;zNs$r3NDj$7!";XDj$5$l$?%3%s%H%m!<%k)s
+1664 1221 p (%3!<%I$r%"%W%j%1!<%7%g%s$KEO$7$^$9)s
+f32 SF
+9 r (\(vi)s
+F0 SF
+10 r ($GJXMx)s
+f32 SF
+(\))s
+EP
+%%Trailer
+%%Pages: 2
+END
+%%EOF
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/doc/sj3guide.tex	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,260 @@
+\documentstyle[landscape,a4j]{j-article}
+\pagestyle{empty}
+\def\baselinestretch{0.8}
+\textheight=20cm
+\raggedbottom
+\makeatletter
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% -*- latex -*-
+%
+% MULTIROW.STY
+%	Modified multirow.sty (author unknown) from mailserv@ymir.claremont.edu
+%
+% by Michinori Kawasaki (michi-k@ascii.co.jp)
+% Thu Sep  3 1992
+%
+% usage: \multirow{N}[STRUTt]{WIDTH}[STRUTb]{TEXT}
+%		N	number of rows
+%		STRUTt	additional space (m*\bigstrut) between the above line and TEXT
+%		WIDTH	width of column
+%		STRUTb	pullup TEXT
+%		TEXT	entry of column
+%	see EXAMPLE below '\endinput'
+%
+%	You can define dimension '\bigstrut' and parameter '\multirowsetup'
+%
+\newdimen\bigstrut \bigstrut=.5zh
+\def\multirowsetup{\raggedright}
+%
+\def\multirow#1{\relax\@ifnextchar [{\@multirow{#1}}{\@multirow{#1}[0]}}
+\def\@multirow#1[#2]#3{\@ifnextchar [{\@xmultirow{#1}[#2]{#3}}%
+  {\@xmultirow{#1}[#2]{#3}[0pt]}}
+\def\@xmultirow#1[#2]#3[#4]#5{\@tempcnta=#1%
+  \@tempdima\@tempcnta\ht\@arstrutbox
+  \advance\@tempdima\@tempcnta\dp\@arstrutbox
+  \advance\@tempdima#2\bigstrut
+  \setbox0\hbox{\vtop to \@tempdima{\hsize#3\@parboxrestore
+		\vfill \multirowsetup #5\par\vfill}}%
+  \ht0\z@\dp0\z@
+  \@tempdima\ht\@arstrutbox \ifnum#2>0 \advance\@tempdima\bigstrut \fi
+  \advance\@tempdima#4 \raise\@tempdima\box0 }
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\makeatother
+
+\begin{document}
+
+\sf\dg
+
+\begin{tabular}[t]{ll}
+\multicolumn{2}{c}{\large\sf\dg $B%-!<%P%$%s%I(B}	\\
+\noalign{\hrule height 0.3mm}
+\multicolumn{2}{c}{$BJQ49(B}			\\
+\hline
+$BJQ49%b!<%I(BON/OFF	&	Shift-SPACE	\\
+$BJQ49(B/$B8uJd0lMw(B		&	Ctrl-J		\\
+$B<!8uJd(B			&	Ctrl-N		\\
+$BA08uJd(B			&	Ctrl-P		\\
+$B3NDj(B			&	Ctrl-L		\\
+$BJ8@a?-$P$7(B		&	Ctrl-O		\\
+$BJ8@a=L$a(B		&	Ctrl-I		\\
+$BJQ49$r<h>C$7(B		&	Ctrl-G		\\
+\noalign{\hrule height 0.3mm}
+\multicolumn{2}{c}{$B%+!<%=%k0\F0(B}		\\
+\hline
+$BJ8;z>C5n(B		&	Ctrl-H		\\
+$B>e(B			&	Ctrl-P		\\
+$B2<(B			&	Ctrl-N		\\
+$BA0(B			&	Ctrl-F		\\
+$B8e(B			&	Ctrl-B		\\
+$B9TF,(B			&	Ctrl-A		\\
+$B9TKv(B			&	Ctrl-E		\\
+$BF~NO<h>C$7(B		&	Ctrl-U		\\
+\noalign{\hrule height 0.3mm}
+\multicolumn{2}{c}{$BF~NO%b!<%I(B}			\\
+\hline
+$B5-9fF~NO(B		&	Ctrl-Q/F10	\\
+JIS$B%3!<%IF~NO(B		&	F5		\\
+$B6hE@F~NO(B		&	F6		\\
+$B%b!<%I@ZBX$((B		&	F9		\\
+\noalign{\hrule height 0.3mm}
+\multicolumn{2}{c}{$BJ8;z<oJQ49(B}			\\
+\hline
+$BA43Q%+%?%+%J$X(B		&	F1		\\
+$BA43Q$R$i$,$J$X(B		&	F2		\\
+$BH>3Q%+%?%+%J$X(B		&	F3		\\
+$BA43Q$X(B			&	F4		\\
+\noalign{\hrule height 0.3mm}
+\multicolumn{2}{c}{$B<-=q(B}			\\
+\hline
+$B<-=qEPO?(B		&	Ctrl-T		\\
+$B:o=|(B			&	Ctrl-V		\\
+\noalign{\hrule height 0.3mm}
+$B%b!<%I$+$i$NC&=P(B	&	ESC		\\
+\noalign{\hrule height 0.3mm}
+\end{tabular}
+\hspace{1cm}
+\begin{tabular}[t]{l|lllll}		
+\multicolumn{6}{c}{\large\sf\dg $B%m!<%^;z$+$JJQ49(B}	\\
+\noalign{\hrule height 0.3mm}
+	& $B$"(B	& $B$$(B		& $B$&(B	& $B$((B	& $B$*(B		\\
+\hline
+$B$"(B	& a 	& i		& u 	& e	& o		\\
+\multirow{2}{1zw}{$B$+(B}
+	& ka	& ki/kyi	& ku/qu	& ke	& ko		\\
+	& ca	& ci		& cu	& ce	& co		\\
+$B$5(B	& sa	& si/shi	& su	& se	& so		\\
+$B$?(B	& ta	& ti/tsyi/chi	& tu/tsu& te	& to		\\
+$B$J(B	& na	& ni		& nu	& ne	& no		\\
+$B$O(B	& ha	& hi		& hu/fu	& he	& ho		\\
+$B$Q(B	& pa	& pi		& pu	& pe	& po		\\
+$B$^(B	& ma	& mi		& mu	& me	& mo		\\
+$B$d(B	& ya	& yi		& yu	& ye($B$$$'(B)&yo		\\
+\multirow{2}{1zw}{$B$i(B}
+	& ra	& ri		& ru	& re	& ro		\\
+	& la	& li	 	& lu	& le	& lo		\\
+$B$o(B	& wa	& wi($B$p(B)	& wu	& we($B$q(B)& wo($B$r(B)	\\
+\hline
+$B$,(B	& ga	& gi	& gu	& ge	& go	\\
+$B$6(B	& za	& zi/ji	& zu	& ze	& zo	\\
+$B$@(B	& da	& di	& du/dsu& de	& do	\\
+$B$P(B	& ba	& bi	& bu	& be	& bo	\\
+\noalign{\hrule height 0.3mm}
+\multicolumn{6}{l}{ }				\\
+\multicolumn{6}{l}{$B"((B $B%+%?%+%J$OBgJ8;z$GF~NO(B}	\\
+\end{tabular}
+\hspace{1cm}
+\begin{tabular}[t]{l|lllll}
+\multicolumn{6}{c}{\large\sf\dg\mbox{ }}	\\
+\noalign{\hrule height 0.3mm}
+	& $B$c(B	& $B$#(B	& $B$e(B	& $B$'(B	& $B$g(B	\\
+\hline
+$B$-(B	& kya	& 	& kyu	& kye	& kyo		\\
+$B$.(B	& gya	& gyi	& gyu	& gye	& gyo		\\
+$B$/(B	& qya	& qyi	& qyu	& qye	& qyo		\\
+\multirow{2}{1zw}{$B$7(B}
+	& sya	& shi	& syu	& sye	& syo		\\
+	& sha	& 	& shu	& she	& sho		\\
+\multirow{3}{1zw}{$B$8(B}
+	& zya	& zyi	& zyu	& zye	& zyo		\\
+	& ja	& 	& ju	& je	& jo		\\
+	& jya	& jyi	& jyu	& jye	& jyo		\\
+$B$9(B	& 	& swi	& 	& swe	&		\\
+$B$F(B	& tha	& thi	& thu	& the	& tho		\\
+\multirow{4}{1zw}{$B$A(B}
+	& tya	& tyi	& tyu	& tye	& tyo		\\
+	& tsya	& 	& tsyu	& tsye	& tsyo		\\
+	& cha	& 	& chu	& che	& cho		\\
+	& cya	& 	& cyu	& cyo	& cya		\\
+$B$B(B	& dya	& dyi	& dyu	& dye	& dyo		\\
+$B$G(B	& dhay	& dhi	& dhu	& dhe	& dho		\\
+$B$I(B	& dwa	& dwi	& dwu	& dwe	& dwo		\\
+$B$K(B	& nya	& nyi	& nyu	& nye	& nyo		\\
+$B$R(B	& hya	& hyi	& hyu	& hye	& hyo		\\
+$B$S(B	& bya	& byi	& byu	& bye	& byo		\\
+$B$T(B	& pya	& pyi	& pyu	& pye	& pyo		\\
+$B$U(B	& hwa	& hwi	& 	& hwe	& hwo		\\
+$B$_(B	& mya	& myi	& myu	& mye	& myo		\\
+\multirow{2}{1zw}{$B$j(B}
+	& rya	& ryi	& ryu	& rye	& ryo		\\
+	& lya	& lyi	& lyu	& lye	& lyo		\\
+$B%t(B	& 	& 	& 	& 	& vyo		\\
+\noalign{\hrule height 0.3mm}
+\end{tabular}
+
+\clearpage
+
+\begin{tabular}[t]{l}
+\begin{tabular}[t]{l|lllll}
+\noalign{\hrule height 0.3mm}
+	& $B$n(B	& $B$#(B	& $B$%(B	& $B$'(B	& $B$)(B		\\
+\hline
+$B$&(B	& wha	& whi	& whu	& whe	& who		\\
+$B$/(B	& qwa	& qwi	& qwu	& qwe	& qwo		\\
+$B$U(B	& fwa	& fwi	& fwu	& fwe	& fwo		\\
+$B%t(B	& vya	& vyi	& vyu	& vye	&		\\
+\noalign{\hrule height 0.3mm}
+\end{tabular}	\\
+		\\
+\begin{tabular}[t]{l|lllll}
+\noalign{\hrule height 0.3mm}
+	& $B$!(B	& $B$#(B	& $B$%(B	& $B$'(B	& $B$)(B		\\
+\hline
+\multirow{2}{1zw}{$B$/(B}
+	& kwa	& kwi	& kwu	& kwe	& kwo		\\
+	& qa	& qi	& 	& qe	& qo		\\
+$B$0(B	& gwa	& gwi	& gwu	& gwe	& gwo		\\
+$B$D(B	& tsa	& 	& tsu	& tse	& tso		\\
+$B$H(B	& twa	& twi	& twu	& twe	& two		\\
+$B$U(B	& fa	& fi	& 	& fe	& fo		\\
+$B%t(B	& va	& 	& 	& ve	& vo		\\
+\noalign{\hrule height 0.3mm}
+\end{tabular}	\\
+		\\
+\begin{tabular}[t]{l|lllll}
+\noalign{\hrule height 0.3mm}
+	& $B$!(B	& $B$#(B	& $B$%(B	& $B$'(B	& $B$)(B		\\
+\hline
+$B$!(B	& xa	& xi	& xu	& xu	& xo		\\
+$B$c(B	& xya	& xyi	& xyu	& xye	& xyo		\\
+\noalign{\hrule height 0.3mm}
+\end{tabular}
+\end{tabular}
+\hspace{0.5cm}
+\begin{tabular}[t]{l}
+\begin{tabular}[t]{l|l}
+\noalign{\hrule height 0.3mm}
+$B$s(B	& nn/n'		\\
+$B$C(B	& xtu/xtu	\\
+$B$n(B	& xwa		\\
+$B$p(B	& xwi		\\
+$B$q(B	& xwe		\\
+$B$r(B	& xwo		\\
+$B%u(B	& xka/xca	\\
+$B%v(B	& xke		\\
+\noalign{\hrule height 0.3mm}
+\end{tabular}	\\
+		\\
+\begin{tabular}[t]{ll|l}
+\noalign{\hrule height 0.3mm}
+$B!<(B	& ($BD92;(B)	& -	\\
+-	& ($B%O%$%U%s(B)	& x-	\\
+$B!"(B	& ($BFIE@(B)	& ,	\\
+,	& ($B%+%s%^(B)	& x,	\\
+$B!#(B	& ($B6gE@(B)	& .	\\
+.	& ($B%T%j%*%I(B)	& x.	\\
+$B!V(B	& ($B$+$.$+$C$3(B)	& x[	\\
+$B!W(B	& ($B$+$.$+$C$3(B)	& x]	\\
+$B!&(B	& ($B$J$+$0$m(B)	& x/	\\
+\noalign{\hrule height 0.3mm}
+\end{tabular}
+\end{tabular}
+\hspace{0.5cm}
+\begin{tabular}[t]{l}
+\begin{tabular}[t]{l}
+\multicolumn{1}{c}{\large\sf\dg $B%j%=!<%9(B (.Xresources)}		\\
+\verb+KTerm*VT100*AllowSendEvents:true+				\\
+\hspace*{1cm}	$B$+$J4A;zJQ49%b!<%I$G$b%+!<%=%k$,0\F0$9$k(B	\\
+								\\
+\verb+Kinput2*OverTheSpotConversion.modeLocation:topright+	\\
+\hspace*{1cm}	$B%b!<%II=<($r%&%#%s%I%&$N1&>e$K=P$9(B		\\
+								\\
+\verb+Kinput2*Sj3.sj3serv:sj3host1+				\\
+\verb+Kinput2*Sj3.sj3serv2:sj3host2+				\\
+\hspace*{1cm}	$B$+$J4A;zJQ49%5!<%P$N;XDj(B			\\
+\end{tabular}	\\
+		\\
+\begin{tabular}[t]{l}
+\multicolumn{1}{c}{\large\sf\dg $B@_Dj%U%!%$%k(B (.sjrc)}		\\
+\verb+.sj3serv localhost+					\\
+\hspace*{1cm}	$B:G=i$K@\B3$r;n$_$k(B sj3serv $B$N%[%9%HL>(B		\\
+								\\
+\verb+.sj3serv2 localhost+					\\
+\hspace*{1cm}	2$BHVL\$K@\B3$r;n$_$k(B sj3serv $B$N%[%9%HL>(B		\\
+								\\
+\verb+.SetNormal ^[+						\\
+\hspace*{1cm}	$BJQ49Cf$NJ8;zNs$r3NDj$7!";XDj$5$l$?%3%s%H%m!<%k(B	\\
+\hspace*{1cm}	$B%3!<%I$r%"%W%j%1!<%7%g%s$KEO$7$^$9(B(vi$B$GJXMx(B)	\\
+\end{tabular}
+\end{tabular}
+\end{document}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/include/AdoptedShP.h	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,53 @@
+/* $Id: AdoptedShP.h,v 1.3 1991/03/22 11:41:38 ishisone Rel $ */
+/*
+ * Copyright (c) 1990  Software Research Associates, Inc.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted, provided
+ * that the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Software Research Associates not be
+ * used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission.  Software Research
+ * Associates makes no representations about the suitability of this software
+ * for any purpose.  It is provided "as is" without express or implied
+ * warranty.
+ *
+ * Author:  Makoto Ishisone, Software Research Associates, Inc., Japan
+ */
+
+#ifndef _AdoptedShellP_h
+#define _AdoptedShellP_h
+
+#include <X11/ShellP.h>
+#include "AdoptedShe.h"
+
+typedef struct {
+    int empty;
+} AdoptedShellClassPart;
+
+typedef struct _AdoptedShellClassRec {
+    CoreClassPart	core_class;
+    CompositeClassPart	composite_class;
+    ShellClassPart	shell_class;
+    OverrideShellClassPart	override_shell_class;
+    AdoptedShellClassPart	adoptedshell_class;
+} AdoptedShellClassRec;
+
+extern AdoptedShellClassRec adoptedShellClassRec;
+
+typedef struct {
+    Window	parent;
+    Boolean	disable_geometry;	/* disable geometry management */
+    /* private */
+    Boolean	colormap_specified;
+} AdoptedShellPart;
+
+typedef struct _AdoptedShellRec {
+    CorePart		core;
+    CompositePart	composite;
+    ShellPart		shell;
+    OverrideShellPart	override;
+    AdoptedShellPart	adoptedshell;
+} AdoptedShellRec;
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/include/AdoptedShe.h	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,33 @@
+/* $Id: AdoptedShe.h,v 1.1 1990/11/09 11:16:51 ishisone Rel $ */
+/*
+ * Copyright (c) 1990  Software Research Associates, Inc.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted, provided
+ * that the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Software Research Associates not be
+ * used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission.  Software Research
+ * Associates makes no representations about the suitability of this software
+ * for any purpose.  It is provided "as is" without express or implied
+ * warranty.
+ *
+ * Author:  Makoto Ishisone, Software Research Associates, Inc., Japan
+ */
+
+#ifndef _AdoptedShell_h
+#define _AdoptedShell_h
+
+/* AdoptedShell widget public header file */
+
+#define XtNparentWindow "parentWindow"
+#define XtCParentWindow "ParentWindow"
+#define XtNdisableGeometryManagement "disableGeometryManagement"
+#define XtCDisableGeometryManagement "DisableGeometryManagement"
+
+typedef struct _AdoptedShellClassRec *AdoptedShellWidgetClass;
+typedef struct _AdoptedShellRec *AdoptedShellWidget;
+
+extern WidgetClass adoptedShellWidgetClass;
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/include/AsyncErr.h	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,120 @@
+/* $Id: AsyncErr.h,v 1.2 1994/05/16 09:07:20 ishisone Rel $ */
+/*
+ * Copyright (C) 1992, 1994  Software Research Associates, Inc.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted, provided
+ * that the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Software Research Associates not be
+ * used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission.  Software Research
+ * Associates makes no representations about the suitability of this software
+ * for any purpose.  It is provided "as is" without express or implied
+ * warranty.
+ *
+ * Author:  Makoto Ishisone, Software Research Associates, Inc., Japan
+ */
+
+#ifndef _AsyncErr_h
+#define _AsyncErr_h
+
+/*
+ * X asyncronous error handler
+ *
+ * This library provides asyncronous error handler mechanism.
+ * It enables setting error handlers for particular requests
+ * without using XSync().
+ */
+
+/*
+ * XAEHandle -- an opaque type used as a 'handle' in this library
+ */
+typedef struct fe_errdesc_ *XAEHandle;
+
+/*
+ * XAEHandler -- an error handler for the async error handler mechanism
+ *  This function takes an error event and dispatches it to
+ *  the appropriate async error handler.
+ *  To enable async error handler mechanism, set this function as
+ *  the global error handler using XSetErrorHandler, or just call
+ *  XAEInit, which does the same thing.
+ */
+extern int XAEHandler(
+#if NeedFunctionPrototypes
+	Display *dpy,
+	XErrorEvent *eev
+#endif
+);
+
+/*
+ * XAESetErrorHandler -- XSetErrorHandler replacement
+ *   In order to set the global error handler, this function
+ *   should be used instead of XSetErrorHandler when using
+ *   async error handler mechanism.
+ */
+extern XErrorHandler XAESetErrorHandler(
+#if NeedFunctionPrototypes
+	XErrorHandler handler
+#endif
+);
+
+/*
+ * XAEInit -- async error handler mechanism initializer
+ */
+extern void XAEInit(
+#if NeedFunctionPrototypes
+	void
+#endif
+);
+
+/*
+ * XAESet -- set an async error handler
+ * XAEUnset -- unset handler set by XAEOpen
+ *   These function set and unset the specified async error handler.
+ *   Errors due to the requests issued between calls of XAESet and the
+ *   corresponding XAEUnset are handled by the handler.
+ */
+extern XAEHandle XAESet(
+#if NeedFunctionPrototypes
+	Display *dpy,
+	int (*handler)(),	/* error handler to be called */
+	void (*destroy)(),	/* destroy hook (for freeing cldata etc.) */
+	XPointer client_data
+#endif
+);
+
+extern void XAEUnset(
+#if NeedFunctionPrototypes
+	XAEHandle handle	/* handle returned previous XAESet() call */
+#endif
+);
+
+/*
+ * XAESetIgnoreErrors -- ignore all errors
+ *   This is a convenient function for setting an error handler that
+ *   ignores all the errors.  It is equivalent to
+ *	XAESet(dpy, ignore_error_handler, NULL, NULL)
+ *   where ignore_error_handler is an error handler that simply
+ *   ignores all kind of errors.
+ */
+extern XAEHandle XAESetIgnoreErrors(
+#if NeedFunctionPrototypes
+	Display *dpy
+#endif
+);
+
+extern XAEHandle XAESetRecordErrors(
+#if NeedFunctionPrototypes
+	Display *dpy,
+	unsigned long *errorbitsp
+#endif
+);
+
+
+/*
+ * Replace XSetErrorHandler with XAESetErrorHandler
+ */
+#define XSetErrorHandler XAESetErrorHandler
+
+#endif /* _AsyncErr_h */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/include/Atok.h	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,50 @@
+/* $Id: Atok.h,v 1.1 1999/08/13 06:26:59 ishisone Exp $ */
+/*
+ * Copyright 1999 Justsystem Corporation, Japan.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and that
+ * both that copyright notice and this permission notice appear in
+ * supporting documentation, and that the name of Justsystem Corporation
+ * not be used in advertising or publicity pertaining to distribution
+ * of the software without specific, written prior permission.  Justsystem
+ * Corporation makes no representations about the suitability of this
+ * software for any purpose.  It is provided "as is" without express
+ * or implied warranty.
+ *
+ * Author: Atsushi Irisawa
+ */
+
+#ifndef _Atok_h
+#define _Atok_h
+
+#include "InputConv.h"
+
+/*
+  Atok new resources:
+
+  name			class		type		default		access
+  ----------------------------------------------------------------------------
+  server		Server		String		*1		CG
+  conffile		Conffile	String		*2		CG
+
+  note:	*1) if not specified, use value of an environment variable "ATOKHOST"
+	*2) if not specified, use value of an environment variable "ATOKCONF"
+*/
+
+#define XtNAtokServer	"server"
+#define XtCAtokServer	"Server"
+#define XtNConfFile	"conf"
+#define XtCConfFile	"Conf"
+#define XtNStyleFile	"style"
+#define XtCStyleFile	"StyleFile"
+#define XtNPort		"port"
+#define XtCPort		"Port"
+
+typedef struct _AtokClassRec	*AtokObjectClass;
+typedef struct _AtokRec		*AtokObject;
+
+extern WidgetClass	atokObjectClass;
+
+#endif /* _Atok_h */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/include/AtokP.h	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,112 @@
+/* $Id: AtokP.h,v 1.1 1999/08/13 06:26:59 ishisone Exp $ */
+/*
+ * Copyright 1999 Justsystem Corporation, Japan.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and that
+ * both that copyright notice and this permission notice appear in
+ * supporting documentation, and that the name of Justsystem Corporation
+ * not be used in advertising or publicity pertaining to distribution
+ * of the software without specific, written prior permission.  Justsystem
+ * Corporation makes no representations about the suitability of this
+ * software for any purpose.  It is provided "as is" without express
+ * or implied warranty.
+ *
+ * Author: Atsushi Irisawa
+ */
+
+#ifndef _AtokP_h
+#define _AtokP_h
+
+#include "InputConvP.h"
+
+#include "WStr.h"
+#include "Atok.h"
+#include "Xatoklib.h"
+
+typedef struct {
+    int foo;
+} AtokClassPart;
+
+typedef struct _AtokClassRec {
+    ObjectClassPart 	object_class;
+    InputConvClassPart	inputConv_class;
+    AtokClassPart	atok_class;
+} AtokClassRec;
+
+#define	ATOK_NSEGMENTS	20 		/* $BJ8@a$N:GBg?t(B ???? */
+
+#define	NBR_OF_PART	3
+#if 0
+typedef	struct	{
+    /* $BI=<($O(B $BA4It(B($B:GBg(B)$B$G#3$D$N%Q!<%H$K$J$k!#(B */
+    ICString	ics[NBR_OF_PART];
+    wchar	*gline[NBR_OF_PART];
+    int		glsize[NBR_OF_PART];
+    int		gllen[NBR_OF_PART];
+    /* $B%-!<F~NO$5$l$?%G!<%?$NJ]B8%P%C%U%!(B */
+    wchar	echoStr[1024];
+    int		echoLen;
+    int		revPos;
+    int		revLen;
+} InputBuf;
+#endif
+
+typedef	struct	{
+    wchar	name[64];
+    int		length;
+    int		size;
+} AtokMode;
+
+typedef struct {
+    /* RESOURCES */
+    String	atokserver;
+    String	port;
+    String	conffile;
+    String	stylefile;
+
+    /* private data */
+    long	context;	/* ATOK Communication  $B$N(BContext */
+    /*AtokMode	mode;*/
+    Boolean	textchanged;	/* $BJQ49%F%-%9%H$,JQ$o$C$?$+(B */
+    /*int	convStatus;	/* 0 : $BL5JQ49(B
+				/* 1 : $BJQ49Cf(B
+				 * 2 : $B8uJdI=<(Cf(B
+				 * 3 : $B%3!<%IF~NOCf(B
+				 * 4 : $B%f!<%F%#%j%F%#!<(B
+				 */
+    /* $BL$3NDjJ8;zNsI=<(MQ$NNN0h(B(for ki2) */
+    ICString	ics[NBR_OF_PART];/* $BL$3NDjJ8;zNsI=<((B */
+
+    /* $B%;%0%a%s%H$N4IM}(B */
+    _XatokRecPtr comm;		/* ATOKCE $B$H$N%3%_%e%K%1!<%7%g%s(B */
+
+    /* $B8uJd%G!<%?4X78$NDj5A(B */
+    int		nbr_of_cand;	/* $B8uJdA*Br;~$N8uJd?t(B */
+    ICString	*cand_lists_ics;/* $B8uJd(B */
+    int		cur_cand;	/* $BA*Br$5$l$F$$$k9-Js(B */
+    int		selected_cand;
+    int		cand_list_size;	/* $B%"%m%1!<%7%g%s$5$l$F$$$k%5%$%:(B */
+
+    /* AUX $B%&%#%s%I%&$N$?$a$N(BICS $B4IM}NN0h(B */
+    /*wchar	aux_echoStr[BUFSIZ*2]; */
+    /*int	aux_echoLen;*/
+    /*int	aux_revLen;*/
+    /*int	aux_revPos;*/
+    ICString	aux_ics[NBR_OF_PART];
+    wchar	*aux_string[NBR_OF_PART];
+    int		aux_length[NBR_OF_PART];
+    int		aux_size[NBR_OF_PART];
+    int		aux_curseg;
+    int		aux_nseg;
+    /*wchar	**atok_cand;*/
+} AtokPart;
+
+typedef struct _AtokRec {
+    ObjectPart  	object;
+    InputConvPart	inputConv;
+    AtokPart		atok;
+} AtokRec;
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/include/AuxPanel.h	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,122 @@
+/* $Id: AuxPanel.h,v 1.6 1993/09/08 01:31:45 ishisone Rel $ */
+/*
+ * Copyright (c) 1990  Software Research Associates, Inc.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted, provided
+ * that the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Software Research Associates not be
+ * used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission.  Software Research
+ * Associates makes no representations about the suitability of this software
+ * for any purpose.  It is provided "as is" without express or implied
+ * warranty.
+ *
+ * Author:  Makoto Ishisone, Software Research Associates, Inc., Japan
+ */
+
+/* Copyright 1991 NEC Corporation, Tokyo, Japan.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and that
+ * both that copyright notice and this permission notice appear in
+ * supporting documentation, and that the name of NEC Corporation
+ * not be used in advertising or publicity pertaining to distribution
+ * of the software without specific, written prior permission.  NEC 
+ * Corporation makes no representations about the suitability of this
+ * software for any purpose.  It is provided "as is" without express
+ * or implied warranty.
+ *
+ * NEC CORPORATION DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN 
+ * NO EVENT SHALL NEC CORPORATION BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF 
+ * USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR 
+ * OTHER TORTUOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR 
+ * PERFORMANCE OF THIS SOFTWARE. 
+ *
+ * Author: Akira Kon, NEC Corporation.  (kon@d1.bs2.mt.nec.co.jp)
+ */
+
+#ifndef _AuxPanel_h
+#define _AuxPanel_h
+
+#include "ICtypes.h"
+
+/*
+  AuxPanel new resources:
+
+  name			class		type		default		access
+  ----------------------------------------------------------------------------
+  foreground		Foreground	Pixel		default		CSG
+  horizontalSpacing	Spacing		Dimension	6		CSG
+  verticalSpacing	Spacing		Dimension	4		CSG
+  defaultWidth		DefaultWidth	Dimension	400		CSG
+  cursor		Cursor		Cursor		parent		CSG
+
+  AuxPanel widget $B$K$O<B:]$KJ8;zNs$rI=<($9$k$?$a$N(B widget $B$r;R(B widget
+  $B$H$7$FM?$($kI,MW$,$"$k!#$3$N(B widget $B$N%/%i%9$O(B ConvDisplayObject $B%/%i%9$N(B
+  $B%5%V%/%i%9$G$J$1$l$P$J$i$J$$!#(B
+*/
+
+#define XtCSpacing "Spacing"
+#define XtNhorizontalSpacing "horizontalSpacing"
+#define XtNverticalSpacing "verticalSpacing"
+
+#define XtCDefaultWidth "DefaultWidth"
+#define XtNdefaultWidth "defaultWidth"
+
+#define XtNcursor "cursor"
+
+typedef struct _AuxPanelClassRec*	AuxPanelWidgetClass;
+typedef struct _AuxPanelRec*		AuxPanelWidget;
+
+extern WidgetClass auxPanelWidgetClass;
+
+/*
+ * Public Interface Functions
+ */
+
+/*
+ * void APanelStart(Widget w)
+ *	$B%Q%M%k$NFbMF$,H/@8$7$?$3$H$rDLCN$9$k!#(B
+ */
+extern void APanelStart(
+#if NeedFunctionPrototypes
+	Widget		/* w */,
+	ICString *	/* segments */,
+	Cardinal	/* nseg */,
+	Cardinal	/* curseg */,
+	Cardinal	/* cursorpos */
+#endif
+);
+
+/*
+ * void APanelChange(Widget w)
+ *	$B%Q%M%k$NFbMF$,JQ2=$7$?$3$H$rDLCN$9$k!#(B
+ */
+extern void APanelChange(
+#if NeedFunctionPrototypes
+	Widget		/* w */,
+	ICString *	/* segments */,
+	Cardinal	/* nseg */,
+	Cardinal	/* curseg */,
+	Cardinal	/* cursorpos */
+#endif
+);
+
+/*
+ * void APanelEnd(Widget w)
+ *	$B%Q%M%k$NFbMF$,>CLG$7$?$3$H$rDLCN$9$k!#(B
+ */
+extern void APanelEnd(
+#if NeedFunctionPrototypes
+	Widget		/* w */
+#endif
+);
+
+extern void APanelSetList(), APanelSetCurrent(), APanelMoveCurrent();
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/include/AuxPanelP.h	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,97 @@
+/* $Id: AuxPanelP.h,v 1.7 1993/09/08 01:38:20 ishisone Rel $ */
+/*
+ * Copyright (c) 1990  Software Research Associates, Inc.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted, provided
+ * that the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Software Research Associates not be
+ * used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission.  Software Research
+ * Associates makes no representations about the suitability of this software
+ * for any purpose.  It is provided "as is" without express or implied
+ * warranty.
+ *
+ * Author:  Makoto Ishisone, Software Research Associates, Inc., Japan
+ */
+
+/* Copyright 1991 NEC Corporation, Tokyo, Japan.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and that
+ * both that copyright notice and this permission notice appear in
+ * supporting documentation, and that the name of NEC Corporation
+ * not be used in advertising or publicity pertaining to distribution
+ * of the software without specific, written prior permission.  NEC 
+ * Corporation makes no representations about the suitability of this
+ * software for any purpose.  It is provided "as is" without express
+ * or implied warranty.
+ *
+ * NEC CORPORATION DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN 
+ * NO EVENT SHALL NEC CORPORATION BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF 
+ * USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR 
+ * OTHER TORTUOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR 
+ * PERFORMANCE OF THIS SOFTWARE. 
+ *
+ * Author: Akira Kon, NEC Corporation.  (kon@d1.bs2.mt.nec.co.jp)
+ */
+
+#ifndef _AuxPanelP_h
+#define _AuxPanelP_h
+
+#include <X11/CoreP.h>
+#include "AuxPanel.h"
+
+typedef struct {
+    int empty;
+} AuxPanelClassPart;
+
+typedef struct _AuxPanelClassRec {
+    CoreClassPart		super_class;
+    CompositeClassPart		composite_class;
+    AuxPanelClassPart		auxpanel_class;
+} AuxPanelClassRec;
+
+extern AuxPanelClassRec auxpanelClassRec;
+
+typedef struct {
+    ICString seg;		/* $B%;%0%a%s%H(B */
+    short redrawpos;		/* $B=q$-D>$7$,I,MW$JJ8;z$N3+;O0LCV(B
+				 * (-1 $B$J$i=q$-D>$9I,MW$J$7(B)
+				 */
+    Cardinal width;		/* $BI=<(I}(B */
+} DisplaySegment;
+
+typedef struct {
+    /* resources */
+    Pixel foreground;
+    Dimension defaultwidth;
+    Dimension hspace;
+    Dimension vspace;
+    Cursor cursor;
+    XtCallbackList callback;
+    /* private state */
+    Widget displayobj;		/* actually, this is the only child */
+    GC invgc;
+    int fontheight;
+    /* int ascent; */
+    int maxwidth;	/* $B%"%$%F%`$N:GBgD9(B */
+    int ncolumns;
+    int nrows;
+
+    DisplaySegment	*dispauxsegments;
+    Cardinal		numauxsegments;
+    Cardinal		dispauxsegmentsize;
+} AuxPanelPart;
+
+typedef struct _AuxPanelRec {
+    CorePart		core;
+    CompositePart	composite;
+    AuxPanelPart	cpanel;
+} AuxPanelRec;
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/include/CachedAtom.h	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,47 @@
+/* $Id: CachedAtom.h,v 1.5 1999/01/07 03:06:20 ishisone Exp $ */
+/*
+ * Copyright (c) 1991  Software Research Associates, Inc.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted, provided
+ * that the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Software Research Associates not be
+ * used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission.  Software Research
+ * Associates makes no representations about the suitability of this software
+ * for any purpose.  It is provided "as is" without express or implied
+ * warranty.
+ *
+ * Author:  Makoto Ishisone, Software Research Associates, Inc., Japan
+ */
+
+#ifndef _CachedAtom_h
+#define _CachedAtom_h
+
+/*
+ * Atom CachedInternAtom(Display *dpy, String name, Bool only_if_exists)
+ * String CachedGetAtomName(Display *dpy, Atom atom)
+ *	$B$=$l$>$l(B XInternAtom(), XGetAtomName() $B$H$[$\F1$8!#(B
+ *	$B%-%c%C%7%s%0$r9T$J$&$H$3$m$,0c$&!#(B(R5 $B$N(B XInternAtom() $B$O(B
+ *	$B%-%c%C%7%e$9$k$,(B XGetAtomName() $B$O$7$J$$(B)
+ *	$B$^$?!"(BCachedGetAtomName() $B$,JV$9J8;zNs$O6&M-$5$l$F$$$k$N$G(B
+ *	free() $B$7$F$O$J$i$J$$!#(B
+ */
+
+extern Atom CachedInternAtom(
+#if NeedFunctionPrototypes
+	Display *	/* dpy */,
+	String		/* name */,
+	Bool		/* only_if_exists */
+#endif
+);
+
+extern String CachedGetAtomName(
+#if NeedFunctionPrototypes
+	Display *	/* dpy */,
+	Atom		/* atom */
+#endif
+);
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/include/CachedFont.h	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,85 @@
+/* $Id: CachedFont.h,v 1.3 1999/01/07 03:06:20 ishisone Exp $ */
+/*
+ * Copyright (c) 1991  Software Research Associates, Inc.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted, provided
+ * that the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Software Research Associates not be
+ * used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission.  Software Research
+ * Associates makes no representations about the suitability of this software
+ * for any purpose.  It is provided "as is" without express or implied
+ * warranty.
+ *
+ * Author:  Makoto Ishisone, Software Research Associates, Inc., Japan
+ */
+
+#ifndef _CachedFont_h
+#define _CachedFont_h
+
+/*
+ * XFontStruct *CachedLoadQueryFontByName(Display *dpy, String name)
+ *	XLoadQueryFont() $B$H$[$\F1$8$@$,!";XDj$5$l$?%U%)%s%H$,(B
+ *	$B$9$G$K%*!<%W%s$5$l$F$$$l$P$=$l$rJV$9!#(B 
+ */
+extern XFontStruct *CachedLoadQueryFontByName(
+#if NeedFunctionPrototypes
+	Display *	/* dpy */,
+	String		/* name */
+#endif
+);
+
+/*
+ * XFontStruct *CachedLoadQueryFontByProp(Display *dpy, Atom atom)
+ *	CachedLoadQueryFontByName() $B$H$[$\F1$8$@$,!"%U%)%s%HL>$G$O$J$/!"(B
+ *	$B$=$l$r%"%H%`$K$7$?$b$N(B ($B$D$^$j%U%)%s%H$N(B "FONT" $B%W%m%Q%F%#$NCM(B)
+ *	$B$G;XDj$9$k!#(B
+ *	$B$3$l$O$3$N%"%H%`$NCM(B ($B$*$h$S$3$N%"%H%`$KBP1~$9$kJ8;zNs$G$"$k@5<0$J(B
+ *	$B%U%)%s%HL>(B) $B$,M#0l%U%)%s%H$N<BBN$KBP$7$F(B unique $B$JCM$@$H9M$($i$l$k(B
+ *	$B$+$i$G$"$k!#(B
+ */
+extern XFontStruct *CachedLoadQueryFontByProp(
+#if NeedFunctionPrototypes
+	Display *	/* dpy */,
+	Atom		/* atom */
+#endif
+);
+
+/*
+ * XFontStruct *CachedLoadFontByFontStruct(Display *dpy, XFontStruct *font)
+ *	CachedFreeFont() $B$G0lEY;HMQ$7$J$/$J$C$?%U%)%s%H$r:F$S%m!<%I$9$k$N$K(B
+ *	$BMQ$$$k!#$9$G$K%m!<%I$5$l$F$$$l$P$=$N%U%)%s%H$N%j%U%!%l%s%9%+%&%s%H$r(B
+ *	$BA}$d$9$@$1$G$"$k!#(B
+ *	$B$b$7;XDj$5$l$?(B font $B$,(B CachedLoadQueryFontByName() $B$^$?$O(B
+ *	CachedLoadQueryFontByProp() $B$r;HMQ$7$F:n$i$l$?$b$N$G$O$J$$;~$K$O(B
+ *	NULL $B$,JV$k!#$=$&$G$J$$;~$K$O(B font $B$NCM$,$=$N$^$^JV$5$l$k!#(B
+ */
+extern XFontStruct *CachedLoadFontByFontStruct(
+#if NeedFunctionPrototypes
+	Display *	/* dpy */,
+	XFontStruct *	/* font */
+#endif
+);
+
+/*
+ * void CachedFreeFont(Display *dpy, XFontStruct *font)
+ *	CachedLoadQueryFontByName() $B$^$?$O(B CachedLoadQueryFontByProp() $B$G(B
+ *	$BF@$i$l$?%U%)%s%H$r;HMQ$7$J$/$J$C$?;~$K8F$V!#(B
+ *	XFreeFont() $B$H$[$\F1$8$@$,!"%U%)%s%H>pJs$r%-%c%C%7%e$7$F$$$k(B
+ *	$B4X78>e!";XDj$5$l$?%U%)%s%H$X$N;2>H$,$"$k8B$j%U%)%s%H$O(B
+ *	$B%/%m!<%:$5$l$J$$!#(B
+ *	$B$^$?!"%U%)%s%H>pJs(B (XFontStruct $BFb$N>pJs$N$&$A!"(Bfid $B$r=|$/$b$N(B)
+ *	$B$O$?$H$(%U%)%s%H$X$N;2>H$,$J$/$J$C$F$bJ];}$5$l$k!#%U%)%s%H9=B$BN(B
+ *	$B$b$=$N$^$^J];}$5$l$k$N$G!"$$$C$?$s(B CachedFreeFont() $B$7$?%U%)%s%H$r(B
+ *	CachedLoadFontByFontStruct() $B$G:F$S%m!<%I$9$k$3$H$b$G$-$k!#(B
+ */
+extern void CachedFreeFont(
+#if NeedFunctionPrototypes
+	Display *	/* dpy */,
+	XFontStruct *	/* font */
+#endif
+);
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/include/CandPanel.h	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,114 @@
+/* $Id: CandPanel.h,v 1.5 1999/01/07 03:06:20 ishisone Exp $ */
+/*
+ * Copyright (c) 1990  Software Research Associates, Inc.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted, provided
+ * that the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Software Research Associates not be
+ * used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission.  Software Research
+ * Associates makes no representations about the suitability of this software
+ * for any purpose.  It is provided "as is" without express or implied
+ * warranty.
+ *
+ * Author:  Makoto Ishisone, Software Research Associates, Inc., Japan
+ */
+
+#ifndef _CandidatePanel_h
+#define _CandidatePanel_h
+
+#include "ICtypes.h"
+
+/*
+  CandidatePanel new resources:
+
+  name			class		type		default		access
+  ----------------------------------------------------------------------------
+  foreground		Foreground	Pixel		default		CSG
+  horizontalSpacing	Spacing		Dimension	6		CSG
+  verticalSpacing	Spacing		Dimension	4		CSG
+  list			List		Pointer		NULL		CSG
+  numStrings		NumStrings	Int		0		CSG
+  defaultWidth		DefaultWidth	Dimension	400		CSG
+  currentItem		CurrentItem	Int		0		CSG
+  cursor		Cursor		Cursor		parent		CSG
+  callback		Callback	Callback	--
+
+  CandidatePanel widget $B$K$O<B:]$KJ8;zNs$rI=<($9$k$?$a$N(B widget $B$r;R(B widget
+  $B$H$7$FM?$($kI,MW$,$"$k!#$3$N(B widget $B$N%/%i%9$O(B ConvDisplayObject $B%/%i%9$N(B
+  $B%5%V%/%i%9$G$J$1$l$P$J$i$J$$!#(B
+*/
+
+#define XtCSpacing "Spacing"
+#define XtNhorizontalSpacing "horizontalSpacing"
+#define XtNverticalSpacing "verticalSpacing"
+
+#define XtCList "List"
+#define XtNlist "list"
+#define XtCNumStrings "NumStrings"
+#define XtNnumStrings "numStrings"
+
+#define XtCDefaultWidth "DefaultWidth"
+#define XtNdefaultWidth "defaultWidth"
+
+#define XtCCurrentItem "CurrentItem"
+#define XtNcurrentItem "currentItem"
+
+#define XtNcursor "cursor"
+
+typedef struct _CandidatePanelClassRec*	CandidatePanelWidgetClass;
+typedef struct _CandidatePanelRec*		CandidatePanelWidget;
+
+extern WidgetClass candidatePanelWidgetClass;
+
+/*
+ * Public Interface Functions
+ */
+
+/*
+ * void CPanelSetList(Widget w, ICString *list, int nstrings,
+ *		      int current, int resize)
+ *	$B%j%9%H$r?7$?$K%;%C%H$9$k(B
+ *	current $B$K$O%+%l%s%H%"%$%F%`$NHV9f$r;XDj$9$k(B
+ *	resize $B$,(B True $B$J$i$P@_Dj$5$l$?%j%9%H$K9g$o$;$F%j%5%$%:$r9T$J$&(B
+ *	list $B$,(B NULL $B$J$i$P%j%9%H$OJQ99$5$l$J$$$,!"%5%$%:$N7W;;$r$d$jD>$9$N$G(B
+ *	$B;R(B widget (ConvDisplayObject) $B$N%U%)%s%H$J$I$N%j%=!<%9$rJQ$($?;~$K$O(B
+ *		CPanelSetList(w, NULL, 0, 0, 0);
+ *	$B$r<B9T$9$k$H$h$$(B
+ */
+extern void CPanelSetList(
+#if NeedFunctionPrototypes
+	Widget		/* w */,
+	ICString *	/* list (or NULL) */,
+	int		/* nstrings */,
+	int		/* current */,
+	int		/* resize */
+#endif
+);
+
+/*
+ * void CPanelSetCurrent(Widget w, int current)
+ *	$B%+%l%s%H%"%$%F%`$r(B idx $B$G;XDj$7$?HV9f$N$b$N$K%;%C%H$9$k(B
+ */
+extern void CPanelSetCurrent(
+#if NeedFunctionPrototypes
+	Widget		/* w */,
+	int		/* current */
+#endif
+);
+
+/*
+ * void CPanelMoveCurrent(Widget w, int dir)
+ *	$B%+%l%s%H%"%$%F%`$r(B dir $B$G;XDj$7$?J}8~$N%"%$%F%`$KJQ$($k(B
+ *	dir $B$NCM$O(B ICtypes.h $B$KDj5A$5$l$F$$$k(B
+ */
+extern void CPanelMoveCurrent(
+#if NeedFunctionPrototypes
+	Widget		/* w */,
+	int		/* dir */
+#endif
+);
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/include/CandPanelP.h	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,64 @@
+/* $Id: CandPanelP.h,v 1.5 1999/01/07 03:06:21 ishisone Exp $ */
+/*
+ * Copyright (c) 1990  Software Research Associates, Inc.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted, provided
+ * that the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Software Research Associates not be
+ * used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission.  Software Research
+ * Associates makes no representations about the suitability of this software
+ * for any purpose.  It is provided "as is" without express or implied
+ * warranty.
+ *
+ * Author:  Makoto Ishisone, Software Research Associates, Inc., Japan
+ */
+
+#ifndef _CandidatePanelP_h
+#define _CandidatePanelP_h
+
+#include <X11/CoreP.h>
+#include "CandPanel.h"
+
+typedef struct {
+    int empty;
+} CandidatePanelClassPart;
+
+typedef struct _CandidatePanelClassRec {
+    CoreClassPart		super_class;
+    CompositeClassPart		composite_class;
+    CandidatePanelClassPart	candidatepanel_class;
+} CandidatePanelClassRec;
+
+extern CandidatePanelClassRec candidatepanelClassRec;
+
+typedef struct {
+    /* resources */
+    Pixel foreground;
+    Dimension defaultwidth;
+    Dimension hspace;
+    Dimension vspace;
+    ICString *list;
+    int nstrings;
+    int current;	/* $B%+%l%s%H$N%"%$%F%`HV9f(B */
+    Cursor cursor;
+    XtCallbackList callback;
+    /* private state */
+    Widget displayobj;		/* actually, this is the only child */
+    GC invgc;
+    int fontheight;
+    /* int ascent; */
+    int maxwidth;	/* $B%"%$%F%`$N:GBgD9(B */
+    int ncolumns;
+    int nrows;
+} CandidatePanelPart;
+
+typedef struct _CandidatePanelRec {
+    CorePart		core;
+    CompositePart	composite;
+    CandidatePanelPart	cpanel;
+} CandidatePanelRec;
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/include/Canna.h	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,73 @@
+/* $Id: Canna.h,v 1.2 1994/09/21 04:56:56 kon Exp $ */
+/*
+ * Copyright (c) 1990  Software Research Associates, Inc.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted, provided
+ * that the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Software Research Associates not be
+ * used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission.  Software Research
+ * Associates makes no representations about the suitability of this software
+ * for any purpose.  It is provided "as is" without express or implied
+ * warranty.
+ *
+ * Author:  Makoto Ishisone, Software Research Associates, Inc., Japan
+ */
+
+/* Copyright 1991 NEC Corporation, Tokyo, Japan.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and that
+ * both that copyright notice and this permission notice appear in
+ * supporting documentation, and that the name of NEC Corporation
+ * not be used in advertising or publicity pertaining to distribution
+ * of the software without specific, written prior permission.  NEC 
+ * Corporation makes no representations about the suitability of this
+ * software for any purpose.  It is provided "as is" without express
+ * or implied warranty.
+ *
+ * NEC CORPORATION DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN 
+ * NO EVENT SHALL NEC CORPORATION BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF 
+ * USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR 
+ * OTHER TORTUOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR 
+ * PERFORMANCE OF THIS SOFTWARE. 
+ *
+ * Author: Akira Kon, NEC Corporation.  (kon@d1.bs2.mt.nec.co.jp)
+ */
+
+#ifndef _Canna_h
+#define _Canna_h
+
+#include "InputConv.h"
+
+/*
+  Canna new resources:
+
+  name			class		type		default		access
+  ----------------------------------------------------------------------------
+  cannahost		Cannahost	String		*1		CG
+  cannafile		Cannafile	String		*2		CG
+
+  note:	*1) if not specified, use value of an environment variable "CANNAHOST"
+	*2) if not specified, use value of an environment variable "CANNAFILE"
+*/
+
+#define XtNcannahost	"cannahost"
+#define XtCCannahost	"Cannahost"
+#define XtNcannafile	"cannafile"
+#define XtCCannafile	"Cannafile"
+#define XtNsendReturnByString     "sendReturnByString"
+#define XtCSendReturnByString     "SendReturnByString"
+
+typedef struct _CannaClassRec	*CannaObjectClass;
+typedef struct _CannaRec	*CannaObject;
+
+extern WidgetClass	cannaObjectClass;
+
+#endif /* _Canna_h */
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/include/CannaP.h	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,111 @@
+/* $Id: CannaP.h,v 1.2 1994/09/21 04:57:02 kon Exp $ */
+/*
+ * Copyright (c) 1990  Software Research Associates, Inc.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted, provided
+ * that the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Software Research Associates not be
+ * used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission.  Software Research
+ * Associates makes no representations about the suitability of this software
+ * for any purpose.  It is provided "as is" without express or implied
+ * warranty.
+ *
+ * Author:  Makoto Ishisone, Software Research Associates, Inc., Japan
+ */
+
+/* Copyright 1991 NEC Corporation, Tokyo, Japan.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and that
+ * both that copyright notice and this permission notice appear in
+ * supporting documentation, and that the name of NEC Corporation
+ * not be used in advertising or publicity pertaining to distribution
+ * of the software without specific, written prior permission.  NEC 
+ * Corporation makes no representations about the suitability of this
+ * software for any purpose.  It is provided "as is" without express
+ * or implied warranty.
+ *
+ * NEC CORPORATION DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN 
+ * NO EVENT SHALL NEC CORPORATION BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF 
+ * USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR 
+ * OTHER TORTUOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR 
+ * PERFORMANCE OF THIS SOFTWARE. 
+ *
+ * Author: Akira Kon, NEC Corporation. (kon@d1.bs2.mt.nec.co.jp)
+ */
+
+
+#ifndef _CannaP_h
+#define _CannaP_h
+
+#include "InputConvP.h"
+
+#include "WStr.h"
+#include "Canna.h"
+
+typedef struct {
+    int foo;
+} CannaClassPart;
+
+typedef struct _CannaClassRec {
+    ObjectClassPart object_class;
+    InputConvClassPart inputConv_class;
+    CannaClassPart canna_class;
+} CannaClassRec;
+
+#define NConvertedSegments 3
+
+typedef struct {
+  wchar *str[NConvertedSegments + 3];
+  int size[NConvertedSegments + 3];
+  int len[NConvertedSegments + 3];
+  int offset;
+  int curseg;
+  int nseg;
+  int candstat;	/* $B8uJd0lMw9T$N>uBV!#0J2<$r8+$h(B */
+  ICString ics[3];
+  wchar *gline[3];
+  int glsize[3], gllen[3];
+  int curgseg, ngseg;
+  wchar *curmode;
+  int modesize, modelen;
+} iBuf;
+
+#define CANNA_GLINE_Empty	0
+#define CANNA_GLINE_Start	1
+#define CANNA_GLINE_End		2
+#define CANNA_GLINE_Change	3
+
+typedef struct {
+    /* resources */
+    String	cannahost;
+    String	cannafile;
+    Boolean     sendReturnByString;
+    /* private data */
+    iBuf	*ibuf;
+    Boolean	textchanged;	/* $BJQ49%F%-%9%H$,JQ$o$C$?$+(B */
+    Boolean	selectionending;/* $BA*Br%b!<%I$r=*N;$7$h$&$H$7$F$$$k$+(B */
+    ICString	*symbollist;
+    int		numsymbols;
+    int		cursymbol;	/* $B5-9fA*Br;~!"8=:_A*Br$5$l$F$$$k5-9f(B */
+    ICString	*candlist;
+    int		candlistsize;
+    int		numcand;	/* $BA*Br%b!<%I$N;~!"8uJd?t(B */
+    int		curcand;	/* $B8uJdA*Br;~!"8=:_A*Br$5$l$F$$$k8uJd(B */
+    int		*cur_addr;	/* $B8uJdA*Br;~8uJdHV9f$rF~$l$k%"%I%l%9(B */
+    Boolean	lastTextLengthIsZero;
+} CannaPart;
+
+typedef struct _CannaRec {
+    ObjectPart  object;
+    InputConvPart inputConv;
+    CannaPart canna;
+} CannaRec;
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/include/Canvas.h	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,32 @@
+/* $Id: Canvas.h,v 1.1 1990/12/11 10:39:40 ishisone Rel $ */
+/*
+ * Copyright (c) 1990  Software Research Associates, Inc.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted, provided
+ * that the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Software Research Associates not be
+ * used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission.  Software Research
+ * Associates makes no representations about the suitability of this software
+ * for any purpose.  It is provided "as is" without express or implied
+ * warranty.
+ *
+ * Author:  Makoto Ishisone, Software Research Associates, Inc., Japan
+ */
+
+#ifndef _Canvas_h
+#define _Canvas_h
+
+/* Canvas widget public header file */
+
+#define XtNexposeCallback "exposeCallback"
+#define XtNresizeCallback "resizeCallback"
+
+typedef struct _CanvasClassRec*	CanvasWidgetClass;
+typedef struct _CanvasRec*	CanvasWidget;
+
+extern WidgetClass	canvasWidgetClass;
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/include/CanvasP.h	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,46 @@
+/* $Id: CanvasP.h,v 1.1 1990/12/11 10:39:25 ishisone Rel $ */
+/*
+ * Copyright (c) 1990  Software Research Associates, Inc.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted, provided
+ * that the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Software Research Associates not be
+ * used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission.  Software Research
+ * Associates makes no representations about the suitability of this software
+ * for any purpose.  It is provided "as is" without express or implied
+ * warranty.
+ *
+ * Author:  Makoto Ishisone, Software Research Associates, Inc., Japan
+ */
+
+#ifndef _CanvasP_h
+#define _CanvasP_h
+
+#include <X11/CoreP.h>
+#include "Canvas.h"
+
+typedef struct {
+    int empty;
+} CanvasClassPart;
+
+typedef struct _CanvasClassRec {
+    CoreClassPart	core_class;
+    CanvasClassPart	canvas_class;
+} CanvasClassRec;
+
+extern CanvasClassRec canvasClassRec;
+
+typedef struct {
+    XtCallbackList	exposecallback;
+    XtCallbackList	resizecallback;
+} CanvasPart;
+
+typedef struct _CanvasRec {
+    CorePart	core;
+    CanvasPart	canvas;
+} CanvasRec;
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/include/CanvasSheP.h	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,54 @@
+/* $Id: CanvasSheP.h,v 1.3 1991/03/22 13:15:11 ishisone Rel $ */
+/*
+ * Copyright (c) 1990  Software Research Associates, Inc.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted, provided
+ * that the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Software Research Associates not be
+ * used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission.  Software Research
+ * Associates makes no representations about the suitability of this software
+ * for any purpose.  It is provided "as is" without express or implied
+ * warranty.
+ *
+ * Author:  Makoto Ishisone, Software Research Associates, Inc., Japan
+ */
+
+#ifndef _CanvasShellP_h
+#define _CanvasShellP_h
+
+#include "AdoptedShP.h"
+#include "CanvasShel.h"
+
+typedef struct {
+    int empty;
+} CanvasShellClassPart;
+
+typedef struct _CanvasShellClassRec {
+    CoreClassPart	core_class;
+    CompositeClassPart	composite_class;
+    ShellClassPart	shell_class;
+    OverrideShellClassPart	override_shell_class;
+    AdoptedShellClassPart	adoptedshell_class;
+    CanvasShellClassPart	canvasshell_class;
+} CanvasShellClassRec;
+
+extern CanvasShellClassRec canvasShellClassRec;
+
+typedef struct {
+    Cursor		cursor;
+    XtCallbackList	exposecallback;
+    XtCallbackList	resizecallback;
+} CanvasShellPart;
+
+typedef struct _CanvasShellRec {
+    CorePart		core;
+    CompositePart	composite;
+    ShellPart		shell;
+    OverrideShellPart	override;
+    AdoptedShellPart	adoptedshell;
+    CanvasShellPart	canvasshell;
+} CanvasShellRec;
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/include/CanvasShel.h	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,35 @@
+/* $Id: CanvasShel.h,v 1.3 1991/03/22 13:14:56 ishisone Rel $ */
+/*
+ * Copyright (c) 1990  Software Research Associates, Inc.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted, provided
+ * that the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Software Research Associates not be
+ * used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission.  Software Research
+ * Associates makes no representations about the suitability of this software
+ * for any purpose.  It is provided "as is" without express or implied
+ * warranty.
+ *
+ * Author:  Makoto Ishisone, Software Research Associates, Inc., Japan
+ */
+
+#ifndef _CanvasShell_h
+#define _CanvasShell_h
+
+/* CanvasShell widget public header file */
+
+#include "AdoptedShe.h"
+
+#define XtNcursor "cursor"
+#define XtNexposeCallback "exposeCallback"
+#define XtNresizeCallback "resizeCallback"
+
+typedef struct _CanvasShellClassRec*	CanvasShellWidgetClass;
+typedef struct _CanvasShellRec*		CanvasShellWidget;
+
+extern WidgetClass canvasShellWidgetClass;
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/include/CcWnn.h	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,88 @@
+/* $Id: CcWnn.h,v 1.7 1999/04/12 08:53:38 ishisone Exp $ */
+/*
+ * Copyright (c) 1990  Software Research Associates, Inc.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted, provided
+ * that the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Software Research Associates not be
+ * used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission.  Software Research
+ * Associates makes no representations about the suitability of this software
+ * for any purpose.  It is provided "as is" without express or implied
+ * warranty.
+ *
+ * Author:  Makoto Ishisone, Software Research Associates, Inc., Japan
+ */
+
+#ifndef _CcWnn_h
+#define _CcWnn_h
+
+#include "InputConv.h"
+
+/*
+  CcWnn new resources:
+
+  name			class		type		default		access
+  ----------------------------------------------------------------------------
+  confirmFunc		Function	Pointer		NULL		CG
+  confirmData		ConfirmData	Ponter		NULL		CG
+  jserver		Jserver		String		*1		CG
+  jserver2nd		Jserver		String		NULL		CG
+  wnnEnvName		WnnEnvName	String		*2		CG
+  wnnEnvrc		WnnEnvrc	String		*3		CG
+  wnnEnvrc4		WnnEnvrc	String		*6		CG
+  wnnEnvrc6		WnnEnvrc	String		*6		CG
+  wnnOverrideEnv	WnnOverrideEnv	Boolean		False		CG
+  wnnEnv		WnnEnv		WnnEnv		*4		CG
+  ccdef			Ccdef		String		"ccdef.kinput"	CG
+  ccRule		CcRule		CcRule		*4		CG
+  saveInterval		SaveInterval	Int		0 (*5)		CG
+
+  note:	*1) if not specified, use value of an environment variable "JSERVER"
+	*2) if not specified, use user's loginname
+	*3) if not specified, use value of an environment variable "WNNENVRC"
+	*4) if not specified, create internally
+	*5) 0 means files are never saved
+	*6) if not specified, defaults to wnnEnvrc
+*/
+
+#define XtNconfirmFunc	"confirmFunc"
+#define XtNconfirmData	"confirmData"
+#define XtCConfirmData	"ConfirmData"
+#define XtNjserver	"jserver"
+#define XtNjserver2nd	"jserver2nd"
+#define XtCJserver	"Jserver"
+#define XtNwnnEnvname	"wnnEnvname"
+#define XtCWnnEnvname	"WnnEnvname"
+#define XtNwnnEnvrc	"wnnEnvrc"
+#define XtNwnnEnvrc4	"wnnEnvrc4"
+#define XtNwnnEnvrc6	"wnnEnvrc6"
+#define XtCWnnEnvrc	"WnnEnvrc"
+#define XtNwnnOverrideEnv	"wnnOverrideEnv"
+#define XtCWnnOverrideEnv	"WnnOverrideEnv"
+#define XtNccdef	"ccdef"
+#define XtCCcdef	"Ccdef"
+#define XtNwnnEnv	"wnnEnv"
+#define XtCWnnEnv	"WnnEnv"
+#define XtRWnnEnv	"WnnEnv"
+#define XtNccRule	"ccRule"
+#define XtCCcRule	"CcRule"
+#define XtRCcRule	"CcRule"
+#define XtNsaveInterval	"saveInterval"
+#define XtCSaveInterval	"SaveInterval"
+
+#define DEF_CCDEF_FILE	"ccdef.kinput"	/* for backward compatibility */
+
+#define CCWNN_REGISTER_ATOM	"_KI2_WNN_REG"
+#define CCWNN_YOMI_ATOM		"_KI2_WNN_YOMI"
+#define CCWNN_KANJI_ATOM	"_KI2_WNN_KANJI"
+
+typedef struct _CcWnnClassRec	*CcWnnObjectClass;
+typedef struct _CcWnnRec	*CcWnnObject;
+
+extern WidgetClass	ccWnnObjectClass;
+
+#endif /* _CcWnn_h */
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/include/CcWnnP.h	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,96 @@
+/* $Id: CcWnnP.h,v 1.16 1999/04/12 08:53:38 ishisone Exp $ */
+/*
+ * Copyright (c) 1990  Software Research Associates, Inc.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted, provided
+ * that the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Software Research Associates not be
+ * used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission.  Software Research
+ * Associates makes no representations about the suitability of this software
+ * for any purpose.  It is provided "as is" without express or implied
+ * warranty.
+ *
+ * Author:  Makoto Ishisone, Software Research Associates, Inc., Japan
+ */
+
+#ifndef _CcWnnP_h
+#define _CcWnnP_h
+
+#include "InputConvP.h"
+
+#undef wchar
+#include "WStr.h"
+#include "CcWnn.h"
+#include "wnnlib.h"
+#include "cconv.h"
+
+typedef struct {
+    int foo;
+} CcWnnClassPart;
+
+typedef struct _CcWnnClassRec {
+    ObjectClassPart object_class;
+    InputConvClassPart inputConv_class;
+    CcWnnClassPart ccWnn_class;
+} CcWnnClassRec;
+
+typedef enum {
+    normal_state,
+    selection_s_state,	/* $B>.J8@a8uJdA*Br%b!<%I(B */
+    selection_l_state,	/* $BBgJ8@a8uJdA*Br%b!<%I(B */
+    symbol_state	/* $B5-9fF~NO%b!<%I(B */
+} CcWnnState;
+
+typedef struct {
+    /* resources */
+    int		(*confirmfunc)();
+    XtPointer	confirmdata;
+    String	jservername;
+    String	jservername2;		/* secondary jserver */
+    String	wnnenvname;
+    String	wnnenvrcfile;
+    String	wnnenvrcfile4;		/* rcfile for Wnn4 */
+    String	wnnenvrcfile6;		/* rcfile for Wnn6 */
+    Boolean	wnnoverrideenv;
+    String	ccdeffile;
+    struct wnn_buf     *wnnbuf;
+    ccRule	ccrule;
+    int		saveinterval;
+    /* private data */
+    ccBuf	ccbuf;
+    jcConvBuf	*jcbuf;
+    Boolean	createrule;	/* ccrule $B$r<+J,$G:n$C$?$+30$+$iM?$($i$l$?$+(B */
+    Boolean	createenv;	/* wnnenv $B$r<+J,$G:n$C$?$+30$+$iM?$($i$l$?$+(B */
+    CcWnnState	state;		/* $BJQ49$NFbIt>uBV(B */
+    Boolean	textchanged;	/* $BJQ49%F%-%9%H$,JQ$o$C$?$+(B */
+    Boolean	selectionending;/* $BA*Br%b!<%I$r=*N;$7$h$&$H$7$F$$$k$+(B */
+    Boolean	sendbackevent;	/* $B%$%Y%s%H$rAw$jJV$9$+(B */
+    Boolean	fixperformed;	/* $B3NDj=hM}$,9T$o$l$?$+(B */
+    ICString	*symbollist;
+    int		numsymbols;
+    int		cursymbol;	/* $B5-9fA*Br%b!<%I$N;~!"8=:_A*Br$5$l$F$$$k5-9f(B */
+    ICString	*candlist;
+    int		candlistsize;
+    wchar	*strdata;
+    int		strdatasize;
+    int		numcand;	/* $BA*Br%b!<%I$N;~!"8uJd?t(B */
+    int		curcand;	/* $B8uJdA*Br%b!<%I$N;~!"8=:_A*Br$5$l$F$$$k8uJd(B */
+    int		fixcount;
+    enum {JIS_MODE, KUTEN_MODE, OTHERS} inputmode;
+    wchar	*pendingdata;
+    int		cont;		/* $B8eB3$N%3%^%s%I$r<B9T$9$k$+(B */
+    Widget	selwidget;	/* $B%;%l%/%7%g%sMQ$NJd=u%&%#%8%'%C%H(B */
+    char	*selyomi;	/* $B%;%l%/%7%g%s$GJV$9!VFI$_!W(B */
+    char	*selkanji;	/* $B%;%l%/%7%g%s$GJV$9!V4A;z!W(B */
+} CcWnnPart;
+
+typedef struct _CcWnnRec {
+    ObjectPart  object;
+    InputConvPart inputConv;
+    CcWnnPart ccWnn;
+} CcWnnRec;
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/include/ConvCtrl.h	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,144 @@
+/* $Id: ConvCtrl.h,v 1.20 1998/10/15 09:11:11 ishisone Exp $ */
+/*
+ * Copyright (c) 1990  Software Research Associates, Inc.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted, provided
+ * that the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Software Research Associates not be
+ * used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission.  Software Research
+ * Associates makes no representations about the suitability of this software
+ * for any purpose.  It is provided "as is" without express or implied
+ * warranty.
+ *
+ * Author:  Makoto Ishisone, Software Research Associates, Inc., Japan
+ */
+
+#ifndef _ConversionControl_h
+#define _ConversionControl_h
+
+/* ConversionControl widget public header file */
+
+#include <X11/Shell.h>
+
+#define XtNinputObject "inputObject"
+#define XtCInputObject "InputObject"
+#define XtNinputObjectClass "inputObjectClass"
+#define XtCInputObjectClass "InputObjectClass"
+#define XtNdisplayObjectClass "displayObjectClass"
+#define XtCDisplayObjectClass "DisplayObjectClass"
+#define XtNselectionWidgetClass "selectionWidgetClass"
+#define XtCSelectionWidgetClass "SelectionWidgetClass"
+#define XtNauxWidgetClass "auxWidgetClass"
+#define XtCAuxWidgetClass "AuxWidgetClass"
+
+#define XtNclientWindow "clientWindow"
+#define XtNfocusWindow "focusWindow"
+
+#define XtNcursor "cursor"
+
+#define XtNeventSelectMethod "eventSelectMethod"
+#define XtCEventSelectMethod "EventSelectMethod"
+
+#define XtNtextEncoding "textEncoding"
+#define XtCTextEncoding "TextEncoding"
+
+#define XtNtextCallback "textCallback"
+#define XtNnewTextCallback "newTextCallback"
+#define XtNendCallback "endCallback"
+#define XtNunusedEventCallback "unusedEventCallback"
+
+#define XtNsendbackKeyPress "sendbackKeyPress"
+#define XtCSendbackEvent "SendbackEvent"
+
+#define XtNtitlebarHeight "titlebarHeight"
+#define XtCTitlebarHeight "TitlebarHeight"
+
+typedef enum {
+    ESMethodNone,	/* do nothing */
+    ESMethodInputOnly,	/* creates a Input-Only window on clientwindow
+			 * and select event on it
+			 */
+    ESMethodSelectFocus	/* selects event on fucuswindow */
+} EventSelectMethod;
+
+typedef struct {
+    Atom	encoding;	/* text encoding e.g. COMPOUND_TEXT */
+    int		format;		/* text format (8/16/32) */
+    int		length;		/* text length */
+    XtPointer	text;		/* text data */
+} CCTextCallbackArg;
+
+typedef struct _ConversionControlClassRec*	ConversionControlWidgetClass;
+typedef struct _ConversionControlRec*		ConversionControlWidget;
+
+extern WidgetClass conversionControlWidgetClass;
+
+
+/*
+ *	public functions (and their argument type)
+ */
+
+#define CASpotLocation		0x1L
+#define CAFocusWindow		0x2L
+#define CAClientArea		0x4L
+#define CAStatusArea		0x8L
+#define CAColormap		0x10L
+#define CAColor			0x20L
+#define CABackgroundPixmap	0x40L
+#define CALineSpacing		0x80L
+#define CAFonts			0x100L
+#define CACursor		0x200L
+#define CAStatusFonts		0x400L
+
+typedef struct {
+    Position	spotx, spoty;
+    Window	focuswindow;
+    XRectangle	clientarea;
+    XRectangle	statusarea;
+    Colormap	colormap;
+    Pixel	foreground, background;
+    Pixmap	background_pixmap;
+    Dimension	linespacing;
+    XFontStruct	**fonts;	/* an array of pointers to (XFontStruct),
+				 * NOT a pointer to an array of (XFontStruct)
+				 */
+    Cardinal	num_fonts;
+    XFontStruct	**status_fonts;	/* ditto */
+    Cardinal	num_status_fonts;
+    Cursor	cursor;
+} ConversionAttributes;
+
+extern void CControlStartConversion(
+#if NeedFunctionPrototypes
+	Widget			/* w */,
+	Window			/* clientwindow */,
+	unsigned long		/* valuemask */,
+	ConversionAttributes *	/* value */
+#endif
+);
+
+extern void CControlChangeAttributes(
+#if NeedFunctionPrototypes
+	Widget			/* w */,
+	unsigned long		/* valuemask */,
+	ConversionAttributes *	/* value */
+#endif
+);
+
+extern void CControlChangeFocus(
+#if NeedFunctionPrototypes
+	Widget			/* w */,
+	int			/* set (non-zero: set, zero: unset) */
+#endif
+);
+
+extern void CControlEndConversion(
+#if NeedFunctionPrototypes
+	Widget			/* w */
+#endif
+);
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/include/ConvCtrlP.h	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,153 @@
+/* $Id: ConvCtrlP.h,v 1.20 1999/05/06 09:07:53 ishisone Exp $ */
+/*
+ * Copyright (c) 1990  Software Research Associates, Inc.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted, provided
+ * that the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Software Research Associates not be
+ * used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission.  Software Research
+ * Associates makes no representations about the suitability of this software
+ * for any purpose.  It is provided "as is" without express or implied
+ * warranty.
+ *
+ * Author:  Makoto Ishisone, Software Research Associates, Inc., Japan
+ */
+
+#ifndef _ConversionControlP_h
+#define _ConversionControlP_h
+
+#include <X11/ShellP.h>
+#include "ConvCtrl.h"
+#include "ICtypes.h"
+
+#define XtREventSelectMethod "EventSelectMethod"
+
+/*
+ *	generic conversion control widget data structure
+ */
+
+typedef struct {
+    void	(*Startup)();
+    void	(*Finish)();
+    void	(*ChangeAttributes)();
+    void	(*ChangeFocus)();
+    void	(*TextChange)();
+    void	(*Fix)();
+    void	(*ModeChange)();
+    void	(*SelectionControl)();
+    void	(*AuxControl)();
+} ConversionControlClassPart;
+
+typedef struct _ConversionControlClassRec {
+    CoreClassPart	core_class;
+    CompositeClassPart	composite_class;
+    ShellClassPart	shell_class;
+    WMShellClassPart	wm_shell_class;
+    VendorShellClassPart	vendor_shell_class;
+    TransientShellClassPart	transient_shell_class;
+    ConversionControlClassPart	conversionControl_class;
+} ConversionControlClassRec;
+
+extern ConversionControlClassRec conversionControlClassRec;
+
+typedef struct {
+    /* resources */
+    Widget	inputobj;
+    WidgetClass inputobjclass;
+    WidgetClass	displayobjclass;
+    WidgetClass	selectionwidgetclass;
+    Window	clientwindow;			/* READ ONLY RESOURCE */
+    Window	focuswindow;			/* READ ONLY RESOURCE */
+    Cursor	cursor;
+    EventSelectMethod	eventselectmethod;
+    Atom	textencoding;
+    XtCallbackList	textcallback;
+    XtCallbackList	newtextcallback;
+    XtCallbackList	endcallback;
+    XtCallbackList	unusedeventcallback;
+    Boolean	sendbackKeyPress;	/* whether unused keypress events are
+					 * sent back to the focus window or not
+					 */
+    Dimension	titlebarheight;	/* height of a titlebar attached to
+				 * popup shells (mode/selection/aux)
+				 */
+    /* private state */
+    Boolean	active;		/* Am I active (i.e. doing conversion) now? */
+    Boolean	notext;		/* true iff there is no convertion text */
+    Window	oldclientwindow;	/* the last client window */
+    Position	client_rootx;	/* client window position */
+    Position	client_rooty;
+    XWindowAttributes client_attr;	/* client window attributes */
+    XWindowAttributes focus_attr;	/* focus window attributes */
+    Window	probewindow;	/* window for event interception */
+    Boolean	createinputobj;
+    Boolean	eventused;
+    Boolean	endnotify;	/* endNotify callback is called */
+} ConversionControlPart;
+
+typedef struct _ConversionControlRec {
+    CorePart		core;
+    CompositePart	composite;
+    ShellPart		shell;
+    WMShellPart		wm;
+    VendorShellPart	vendor;
+    TransientShellPart	transient;	
+    ConversionControlPart	ccontrol;
+} ConversionControlRec;
+
+#define XtInheritStartup		(void(*)())_XtInherit
+#define XtInheritFinish			(void(*)())_XtInherit
+#define XtInheritChangeAttributes	(void(*)())_XtInherit
+#define XtInheritChangeFocus		(void(*)())_XtInherit
+#define XtInheritTextChange		(void(*)())_XtInherit
+#define XtInheritFix			(void(*)())_XtInherit
+#define XtInheritModeChange		(void(*)())_XtInherit
+#define XtInheritSelectionControl	(void(*)())_XtInherit
+#define XtInheritAuxControl		(void(*)())_XtInherit
+
+/*
+ * ConversionControlClass methods:
+ *
+ * void (*Startup)(Widget w, unsigned long mask, ConversionAttributes *attrs)
+ *	called from CControlStartCoversion() at conversion startup.
+ *	all the attributes specified in attrs and client window ID are
+ *	guaranteed to be valid (ie you don't have to check their validity).
+ *
+ * void (*Finish)(Widget w)
+ *	called from CControlEndConversion() at conversion finish.
+ *	also called when the client window is destroyed, so take care
+ *	of XErrors, namely BadWindow.
+ *
+ * void (*ChangeAttributes)(Widget w, unsigned long mask,
+ *				ConversionAttributes *attrs)
+ *	called from CControlChangeAttributes when conversion attributes
+ *	are changed. like Startup, all the attributes are guaranteed to
+ *	be valid.
+ *
+ * void (*ChangeFocus)(Widget w, int set)
+ *	called from CControlChangeFocus at focus change.  argument 'set'
+ *	indicates the new focus state.  if it is non-zero, focus is set,
+ *	if it is zero, focus is unset.
+ *
+ * void (*TextChange)(Widget w)
+ *	called when converting text has changed.
+ *
+ * void (*Fix)(Widget w, CCTextCallbackArg *arg)
+ *	called when the text has been fixed.
+ *
+ * void (*ModeChange)(Widget w)
+ *	called when input mode has changed.
+ *
+ * void (*SelectionControl)(Widget w, ICSelectionControlArg *arg)
+ *	called to control candidate slection.
+ *	see InputConv.h for type ICSelectionControlArg.
+ *
+ * void (*AuxControl)(Widget w, ICAuxControlArg *arg)
+ *	called to control auxiliary area.
+ *	see InputConv.h for type ICAuxControlArg.
+ */
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/include/ConvDisp.h	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,183 @@
+/* $Id: ConvDisp.h,v 1.9 1999/01/07 03:06:21 ishisone Exp $ */
+/*
+ * Copyright (c) 1990  Software Research Associates, Inc.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted, provided
+ * that the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Software Research Associates not be
+ * used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission.  Software Research
+ * Associates makes no representations about the suitability of this software
+ * for any purpose.  It is provided "as is" without express or implied
+ * warranty.
+ *
+ * Author:  Makoto Ishisone, Software Research Associates, Inc., Japan
+ */
+
+#ifndef _ConvDisplay_h
+#define _ConvDisplay_h
+
+#include <X11/Object.h>
+#include "ICtypes.h"
+
+/*
+  ConvDisplay new resources:
+
+  name		class		type		default			access
+  ----------------------------------------------------------------------------
+  foreground	Foreground	Pixel		DefaultForeground	CSG
+  background	Background	Pixel		DefaultBackground	CSG
+  cursorBitmap	CursorBitmap	Bitmap		*1			CSG
+  hotX		HotX		Position	3			CSG
+  hotY		HotY		Position	2			CSG
+
+  note:	*1) default is a small caret
+
+*/
+
+#define XtNcursorBitmap "cursorBitmap"
+#define XtCCursorBitmap "CursorBitmap"
+#define XtNhotX "hotX"
+#define XtNhotY "hotY"
+#define XtCHotX "HotX"
+#define XtCHotY "HotY"
+
+typedef struct _ConvDisplayClassRec	*ConvDisplayObjectClass;
+typedef struct _ConvDisplayRec		*ConvDisplayObject;
+
+extern WidgetClass	convDisplayObjectClass;
+
+/*
+ * public interface functions
+ */
+
+/*
+ * int CDStringWidth(Widget object, ICString *str, int start, int end)
+ *	$B;XDj$5$l$?J8;zNs$N(B start $BJ8;zL\$+$i(B end - 1 $BJ8;zL\$^$G$N(B
+ *	$BI}(B ($BC10L$O%T%/%;%k(B) $B$rJV$9(B
+ *	end $B$,Ii$N;~$OJ8;zNs$N:G8e$^$G$rI=$9(B
+ */
+extern int CDStringWidth(
+#if NeedFunctionPrototypes
+	Widget		/* object */,
+	ICString *	/* str */,
+	int		/* start */,
+	int		/* end */
+#endif
+);
+
+/*
+ * int CDLineHeight(Widget object, Position *ascentp)
+ *	$B9T$N9b$5(B ($BC10L$O%T%/%;%k(B) $B$rJV$9(B
+ *	ascentp $B$,(B NULL $B$G$J$$;~$K$O(B ascent $B$,JV$5$l$k(B
+ */
+extern int CDLineHeight(
+#if NeedFunctionPrototypes
+	Widget		/* object */,
+	Position *	/* ascentp */
+#endif
+);
+
+/*
+ * void CDDrawString(Widget object, Widget canvas, ICString *str,
+ *		      int start, int end, int x, int y)
+ *	canvas $B$G;XDj$5$l$k(B widget $B$N:BI8(B (x, y) $B$+$i!";XDj$5$l$?(B
+ *	$BJ8;zNs$N(B start $BJ8;zL\$+$i(B end - 1 $BJ8;zL\$^$G$r=q$/(B
+ *	end $B$,Ii$N;~$OJ8;zNs$N:G8e$^$G$rI=$9(B
+ *	$B$?$@$7!"(B(x, y) $B$OJ8;zNs$N:8>e$N:BI8$G$"$k(B
+ */
+extern void CDDrawString(
+#if NeedFunctionPrototypes
+	Widget		/* object */,
+	Widget		/* canvas */,
+	ICString *	/* str */,
+	int		/* start */,
+	int		/* end */,
+	int		/* x */,
+	int		/* y */
+#endif
+);
+
+/*
+ * int CDMaxChar(Widget object, ICString *str, int start, int width)
+ *	$B;XDj$5$l$?J8;zNs$N(B start $BJ8;zL\$+$i!"%T%/%;%kI}(B width $B$K(B
+ *	$BF~$kJ8;z?t$rJV$9(B
+ */
+extern int CDMaxChar(
+#if NeedFunctionPrototypes
+	Widget		/* object */,
+	ICString *	/* str */,
+	int		/* start */,
+	int		/* end */
+#endif
+);
+
+/*
+ * void CDDrawCursor(Widget object, Widget canvas, int x, int y, int on)
+ *	canvas $B$G;XDj$5$l$k(B widget $B$N:BI8(B (x, y) $B$K%$%s%5!<%H%+!<%=%k$r(B
+ *	$BI=<($9$k(B
+ *	on $B$,(B False $B$N;~$K$O%+!<%=%k$r>C$9(B
+ *	$B;XDj$9$k(B y $B:BI8$K$O%U%)%s%H$N%Y!<%9%i%$%s$r;XDj$9$k(B
+ */
+extern void CDDrawCursor(
+#if NeedFunctionPrototypes
+	Widget		/* object */,
+	Widget		/* canvas */,
+	int		/* x */,
+	int		/* y */,
+	int		/* on */			 
+#endif
+);
+
+/*
+ * void CDGetCursorBounds(Widget object, XRectangle *bounds)
+ *	$BI=<($5$l$k%+!<%=%k$NI=<(NN0h$r(B bounds $B$KJV$9(B
+ *	$B:BI8(B (x, y) $B$K%+!<%=%k$r=q$$$?;~$NI=<(NN0h$O(B
+ *		(x + bounds->x, y + bounds->y): $B:8>e:BI8(B
+ *		(bounds->width, bounds->height): $BNN0h$NBg$-$5(B
+ *	$B$K$J$k(B
+ */
+extern void CDGetCursorBounds(
+#if NeedFunctionPrototypes
+	Widget		/* object */,
+	XRectangle *	/* bounds */
+#endif
+);
+
+
+/*
+ * void CDSetFonts(Widget object, XFontStruct **fontset, Cardinal num_fonts)
+ *		(note: fontset is an array of (XFontStruct *).)
+ *	$BIA2h$K(B fontset $B$G;XDj$5$l$k%U%)%s%H$r;HMQ$9$k$h$&$K@_Dj$9$k(B
+ *	$B%*%V%8%'%/%H$O(B fontset $B$NCf$+$i<+J,$N;HMQ$9$k%-%c%i%/%?%;%C%H$N(B
+ *	$B%U%)%s%H$rA*$s$G@_Dj$9$k(B
+ *	$B$b$7!"I,MW$J%-%c%i%/%?%;%C%H$N%U%)%s%H$,$J$1$l$PE,Ev$J%U%)%s%H$r(B
+ *	$B@_Dj$9$k(B
+ *	$B$3$l$OB>$N%-%c%i%/%?%;%C%H$N%U%)%s%H$K9g$o$;$FA*$V$N$,$h$$$H(B
+ *	$B;W$o$l$k$,!"%G%U%)%k%H%U%)%s%H$G4V$K9g$o$;$F$b$h$$(B
+ *	$B$b$7(B num_fonts $B$,(B 0 $B$G$"$l$P3F%*%V%8%'%/%H$N%G%U%)%k%H%U%)%s%H$r(B
+ *	$B;HMQ$9$k$h$&$K@_Dj$5$l$k(B
+ */
+extern void CDSetFonts(
+#if NeedFunctionPrototypes
+	Widget		/* object */,
+	XFontStruct **	/* fontset */,
+	Cardinal	/* num_fonts */
+#endif
+);
+
+/*
+ * void CDSetBlockCursor(Widget object, XRectangle *shape)
+ *	shape $B$G;XDj$5$l$k%V%m%C%/%+!<%=%k$r@_Dj$9$k(B
+ *	shape $B$N;XDj$O(B CDGetCursorBounds() $B$N(B bounds $B$HF1$8$G$"$k(B
+ */
+extern void CDSetBlockCursor(
+#if NeedFunctionPrototypes
+	Widget		/* object */,
+	XRectangle *	/* shape */
+#endif
+);
+
+#endif /* _ConvDisplay_h */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/include/ConvDispP.h	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,88 @@
+/* $Id: ConvDispP.h,v 1.7 1991/09/17 10:04:46 ishisone Rel $ */
+/*
+ * Copyright (c) 1990  Software Research Associates, Inc.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted, provided
+ * that the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Software Research Associates not be
+ * used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission.  Software Research
+ * Associates makes no representations about the suitability of this software
+ * for any purpose.  It is provided "as is" without express or implied
+ * warranty.
+ *
+ * Author:  Makoto Ishisone, Software Research Associates, Inc., Japan
+ */
+
+#ifndef _ConvDisplayP_h
+#define _ConvDisplayP_h
+
+#include <X11/ObjectP.h>
+#include "ConvDisp.h"
+
+typedef struct {
+    int		(*StringWidth)();
+    int		(*LineHeight)();
+    void	(*DrawString)();
+    int		(*MaxChar)();
+    void	(*DrawCursor)();
+    void	(*GetCursorBounds)();
+    void	(*SetFonts)();
+} ConvDisplayClassPart;
+
+typedef struct _ConvDisplayClassRec {
+    ObjectClassPart object_class;
+    ConvDisplayClassPart convDisplay_class;
+} ConvDisplayClassRec;
+
+typedef struct {
+    /* resources */
+    Pixel	foreground;
+    Pixel	background;
+    Pixmap	cursor;		/* really a bitmap */
+    Position	hotx;
+    Position	hoty;
+    /* private */
+    Boolean	cursorcreated;
+    XRectangle	cursorbounds;
+    GC		cursorgc;
+    Boolean	cursorvisible;
+} ConvDisplayPart;
+
+typedef struct _ConvDisplayRec {
+    ObjectPart  object;
+    ConvDisplayPart convDisplay;
+} ConvDisplayRec;
+
+extern ConvDisplayClassRec	convDisplayClassRec;
+
+#define XtInheritStringWidth	(int(*)())_XtInherit
+#define XtInheritLineHeight	(int(*)())_XtInherit
+#define XtInheritDrawString	(void(*)())_XtInherit
+#define XtInheritMaxChar	(int(*)())_XtInherit
+#define XtInheritDrawCursor	(void(*)())_XtInherit
+#define XtInheritGetCursorBounds	(void(*)())_XtInherit
+#define XtInheritSetFonts	(void(*)())_XtInherit
+
+
+/* semi-public function */
+
+typedef struct {
+    Atom	registry;	/* ex) "ISO8859", "JISX0208.1983" */
+    Atom	encoding;	/* ex) "0", "1" */
+    XFontStruct *font;		/* return value */
+} FontSpec;
+
+extern int _CDPickupFonts(
+#if NeedFunctionPrototypes
+	Widget		/* widget */,
+	FontSpec *	/* spec */,
+	Cardinal	/* num_specs */,
+	XFontStruct **	/* fonts */,
+	Cardinal	/* num_fonts */
+#endif
+);
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/include/ConvMgr.h	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,77 @@
+/* $Id: ConvMgr.h,v 1.5 1991/04/18 16:59:00 ishisone Rel $ */
+/*
+ * Copyright (c) 1990  Software Research Associates, Inc.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted, provided
+ * that the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Software Research Associates not be
+ * used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission.  Software Research
+ * Associates makes no representations about the suitability of this software
+ * for any purpose.  It is provided "as is" without express or implied
+ * warranty.
+ *
+ * Author:  Makoto Ishisone, Software Research Associates, Inc., Japan
+ */
+
+#ifndef _ConversionManager_h
+#define _ConversionManager_h
+
+typedef struct _ConversionManagerClassRec*	ConversionManagerWidgetClass;
+typedef struct _ConversionManagerRec*		ConversionManagerWidget;
+
+extern WidgetClass conversionManagerWidgetClass;
+
+/*
+ * (semi)public functions
+ *
+ *	these functions are for the protocol widgets
+ */
+
+/*
+ * void CMGetConverter()
+ *	returns a widget of the specified class that is on the
+ *	same screen as the client window.
+ *	first it searches its internal cache and if unused one found,
+ *	take and returns it. otherwise make a new one and returns it.
+ */
+extern Widget CMGetConverter(
+#if NeedFunctionPrototypes
+	Widget		/* w */,
+	Window		/* client */,
+	WidgetClass	/* converterclass */,
+	WidgetClass	/* inputobjclass */,
+	WidgetClass	/* displayobjclass */
+#endif
+);
+
+/*
+ * void CMPrepareConverter()
+ *	make a new converter widget of the specified class on the
+ *	specified screen, add it to the internal cache for later use.
+ */
+extern void CMPrepareConverter(
+#if NeedFunctionPrototypes
+	Widget		/* w */,
+	Screen *	/* screen */,
+	WidgetClass	/* converterclass */,
+	WidgetClass	/* inputobjclass */,
+	WidgetClass	/* displayobjclass */
+#endif
+);
+
+/*
+ * void CMReleaseConverter()
+ *	mark specified converter widget as unused, and enter it
+ *	to the cache.
+ */
+extern void CMReleaseConverter(
+#if NeedFunctionPrototypes
+	Widget	/* w */,
+	Widget	/* converter */
+#endif
+);
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/include/ConvMgrP.h	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,64 @@
+/* $Id: ConvMgrP.h,v 1.4 1991/04/18 16:59:16 ishisone Rel $ */
+/*
+ * Copyright (c) 1990  Software Research Associates, Inc.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted, provided
+ * that the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Software Research Associates not be
+ * used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission.  Software Research
+ * Associates makes no representations about the suitability of this software
+ * for any purpose.  It is provided "as is" without express or implied
+ * warranty.
+ *
+ * Author:  Makoto Ishisone, Software Research Associates, Inc., Japan
+ */
+
+#ifndef _ConversionManagerP_h
+#define _ConversionManagerP_h
+
+#include <X11/CompositeP.h>
+#include "ConvMgr.h"
+
+typedef struct {
+    int empty;
+} ConversionManagerClassPart;
+
+typedef struct _ConversionManagerClassRec {
+    CoreClassPart	core_class;
+    CompositeClassPart	composite_class;
+    ConversionManagerClassPart	conversionmanager_class;
+} ConversionManagerClassRec;
+
+extern ConversionManagerClassRec conversionmanagerClassRec;
+
+typedef struct _convlist_ {
+    Boolean	busy;
+    WidgetClass	converterclass;
+    WidgetClass	inputobjclass;
+    WidgetClass	displayobjclass;
+    Widget	converter;
+    Screen	*screen;
+    struct _convlist_	*next;
+} ConverterRec;
+
+typedef struct _inputobjlist_ {
+    WidgetClass	inputobjclass;
+    Widget	inputobj;
+    struct _inputobjlist_	*next;
+} InputObjRec;
+
+typedef struct {
+    /* private state */
+    ConverterRec *converterlist;
+    InputObjRec *inputobjlist;
+} ConversionManagerPart;
+
+typedef struct _ConversionManagerRec {
+    CorePart		core;
+    CompositePart	composite;
+    ConversionManagerPart	convmgr;
+} ConversionManagerRec;
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/include/ConvProto.h	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,321 @@
+/* $Id: ConvProto.h,v 1.6 1999/01/07 03:06:22 ishisone Exp $ */
+/*
+ * Copyright (c) 1991  Software Research Associates, Inc.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted, provided
+ * that the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Software Research Associates not be
+ * used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission.  Software Research
+ * Associates makes no representations about the suitability of this software
+ * for any purpose.  It is provided "as is" without express or implied
+ * warranty.
+ *
+ * Author:  Makoto Ishisone, Software Research Associates, Inc., Japan
+ */
+
+#ifndef _ConvProto_h
+#define _ConvProto_h
+
+/* $BJQ49%5!<%P$N%W%m%U%!%$%k$,F~$k%W%m%Q%F%#L>(B */
+#define CONVERSION_PROFILE	"_CONVERSION_PROFILE"
+
+/* $BJQ49%5!<%P$N%W%m%U%!%$%k$N%W%m%Q%F%#$HJQ49B0@-$N%W%m%Q%F%#$N%?%$%W(B */
+#define CONVERSION_ATTRIBUTE_TYPE	"_CONVERSION_ATTRIBUTE_TYPE"
+
+/* $B%W%m%H%3%k%P!<%8%g%sL>(B */
+#define PROTOCOL_VERSION	"PROTOCOL-2.0"
+
+#define CONV_ATTR(code,len)	((unsigned long)((code)<<16)+(len))
+
+#define UPPER16U(data)		(((data)>>16)&0xffff)
+#define UPPER16S(data)		((short)(((data)>>16)&0xffff))
+#define LOWER16U(data)		((data)&0xffff)
+#define LOWER16S(data)		((short)((data)&0xffff))
+
+#define CODE_OF_ATTR(head)	UPPER16U(head)
+#define LENGTH_OF_ATTR(head)	LOWER16U(head)
+
+/*
+ * Conversion Profile Codes
+ */
+
+#define CONVPROF_PROTOCOL_VERSION	1
+#define CONVPROF_SUPPORTED_STYLES	2
+#define CONVPROF_SUPPORTED_EXTENSIONS	3
+#define CONVPROF_EXTENSION_DATA		4
+
+/*
+ * Standard Conversion Attribute Codes (0-255)
+ */
+
+/* 0-127: can be specified at any time (startup and during conversion) */
+#define CONVATTR_NONE			0
+#define CONVATTR_INDIRECT		1
+#define CONVATTR_FOCUS_WINDOW		2
+#define CONVATTR_SPOT_LOCATION		3
+#define CONVATTR_CLIENT_AREA		4
+#define CONVATTR_STATUS_AREA		5
+#define CONVATTR_COLORMAP		6
+#define CONVATTR_COLOR			7
+#define CONVATTR_BACKGROUND_PIXMAP	8
+#define CONVATTR_LINE_SPACING		9
+#define CONVATTR_FONT_ATOMS		10
+#define CONVATTR_CURSOR			11
+
+/* 128-255: can be specified only at startup time */
+#define CONVATTR_INPUT_STYLE		128
+#define CONVATTR_EVENT_CAPTURE_METHOD	129
+#define CONVATTR_USE_EXTENSION		255
+
+/* argument for CONVATTR_INPUT_STYLE and CONVPROP_SUPPORTED_STYLES */
+#define CONVARG_ROOTWINDOW		1L
+#define CONVARG_OFFTHESPOT		2L
+#define CONVARG_OVERTHESPOT		4L
+
+/* argument for CONVATTR_EVENT_CAPTURE_METHOD */
+#define CONVARG_NONE			0L
+#define CONVARG_CREATE_INPUTONLY	1L
+#define CONVARG_SELECT_FOCUS_WINDOW	2L
+
+/*
+ * $B%W%m%U%!%$%k%G!<%?(B / $BJQ49B0@-%G!<%?$NI=8=J}K!(B
+ *
+ * $BJQ49%5!<%P$NFC@-$rI=$9%W%m%U%!%$%k%G!<%?$H!"JQ49$K4X$9$kB0@-$r;XDj$9(B
+ * $B$kJQ49B0@-%G!<%?$O6&DL$N%U%)!<%^%C%H$rMQ$$$k!#(B
+ *
+ * $B8D!9$N%G!<%?$O(B 32bit$BCM$NG[Ns$GI=8=$5$l$k!#:G=i$N(B 1$B%o!<%I$O%X%C%@$G!"(B
+ * $B$=$l$K(B 0$B%o!<%I0J>e$N%G!<%?$,B3$/!#%X%C%@$N>e0L(B 16bit $B$O$=$N%W%m%U%!%$(B
+ * $B%k(B / $BJQ49B0@-$N%3!<%I$rI=$7!"2<0L(B 16 bit $B$OB3$/%G!<%?$N%o!<%I?t(B 
+ * (32bit $BC10L(B) $B$rI=$9!#(B
+ *
+ *	+----------------+----------------+
+ *	|  Code (16bit)  | Length (16bit) |
+ *	+----------------+----------------+
+ *	|              Data0              |
+ *	+---------------------------------+
+ *	|              .....              |
+ *	+---------------------------------+
+ *	|              DataN              |
+ *	+---------------------------------+
+ *
+ * $B<B:]$N%W%m%U%!%$%k%G!<%?$dJQ49B0@-%G!<%?$O$3$N%G!<%?$,$$$/$D$+O"B3$7(B
+ * $B$?$b$N$G$"$k!#(B
+ */
+
+/*
+ * $B%W%m%U%!%$%k%G!<%?(B
+ *
+ * $B%W%m%U%!%$%k%G!<%?MQ$N%3!<%I$O<!$N(B 4$B<oN`$,Dj5A$5$l$F$$$k!#JQ49B0@-(B
+ * $B%G!<%?$H0[$J$j!"%W%i%$%Y!<%HMQ$N%3!<%INN0h$J$I$OMQ0U$5$l$F$$$J$$!#(B
+ *
+ * Protocol Version
+ *	code: 1
+ *	data-length: 1
+ *	data[0]:
+ *		CARD32: protocol version atom ("PROTOCOL-2.0")
+ *
+ *	$B%G!<%?$OJQ49%5!<%P$N%W%m%H%3%k%P!<%8%g%s$rI=$9%"%H%`$G$"$k!#$3$3(B
+ *	$B$GDj5A$5$l$F$$$k%W%m%H%3%k$N%P!<%8%g%s$O(B "PROTOCOL-2.0" $B$G$"$k!#(B
+ *
+ * Supported Styles
+ *	code: 2
+ *	data-length: 1
+ *	data[0]:
+ *		CARD32: input styles
+ *
+ *	$B%G!<%?$OJQ49%5!<%P$,%5%]!<%H$9$kF~NO%9%?%$%k$rI=$9!#%5%]!<%H$9$k(B
+ *	$BF~NO%9%?%$%k$NCM$N(B bitwise-or $B$G$"$k!#(B
+ *
+ * Supported Extensions
+ *	code: 3
+ *	data-length: N
+ *	data[0]:
+ *		CARD32: extension atom 1 (Atom)
+ *	...
+ *	data[N-1]:
+ *		CARD32: extension atom N (Atom)
+ *
+ *	$B%G!<%?$OJQ49%5!<%P$,%5%]!<%H$9$k3HD%$rI=$9%"%H%`$N%j%9%H$G$"$k!#(B
+ *
+ * Extension Data
+ *	code: 4
+ *	data-length: N
+ *	data[0]:
+ *		CARD32: extension atom (Atom)
+ *	data[1] - data[N-1]:
+ *		extension specific data
+ *
+ *	$B%G!<%?$O3HD%FH<+$KDj5A$7$?%W%m%U%!%$%k%G!<%?$G$"$k!#I8=`%W%m%H%3(B
+ *	$B%k$H$7$F$O%G!<%?$N@hF,$K3HD%%"%H%`(B ($B$3$l$O(BSupported Extensions 
+ *	$B$K;XDj$5$l$?$b$N$G$J$1$l$P$J$i$J$$(B)$B$r$D$1$k$3$H$r5,Dj$9$k$@$1$G!"(B
+ *	$B$=$N8e$N%G!<%?$K4X$7$F$O0l@Z5,Dj$7$J$$!#(B
+ *
+ * $B%/%i%$%"%s%HB&$NL5MQ$N:.Mp$rKI$0$?$a!"(BProtocol Version $B$H(B Supported
+ * Styles$B$N9`L\$OI,$:$J$1$l$P$J$i$J$$!#$^$?!"(BExtension Data $B0J30$O%W%m%U%!(B
+ * $B%$%k%G!<%?$NCf$KF1$8%3!<%I$N%G!<%?$,J#?t$"$C$F$O$J$i$J$$!#(B
+ */
+
+/*
+ * $BJQ49B0@-%G!<%?(B
+ *
+ * $BB0@-%3!<%I$N$&$A!"(B0 $B$+$i(B 255 $B$^$G$OI8=`%W%m%H%3%k$,;HMQ$9$k$b$N$G!"8=(B
+ * $B:_B0@-$,3d$j?6$i$l$F$$$J$$$+$i$H$$$C$F>!<j$K;HMQ$7$F$O$J$i$J$$!#$=$N(B
+ * $B$h$&$JL\E*$N$?$aB0@-%3!<%I(B 256 $B$+$i(B 65535 $B$,%W%i%$%Y!<%H%3!<%I3HD%NN(B
+ * $B0h$H$7$FMQ0U$5$l$F$$$k!#$?$@$7$3$NNN0h$N;HMQ$KEv$?$C$F$O$"$i$+$8$a$=(B
+ * $B$N3HD%%3!<%I$r;HMQ$9$k$3$H$r(B Use Extension ($B2<5-;2>H(B) $B$rMQ$$$F$"$i$+(B
+ * $B$8$a@k8@$9$kI,MW$,$"$k!#(B
+ *
+ * $BB0@-%G!<%?$N;XDjJ}K!$K$O!"JQ493+;O;~$K;XDj$9$kJ}K!$H!"JQ49Cf$K;XDj$9(B
+ * $B$kJ}K!$N(B 2$BDL$j$,$"$k$,!"B0@-%3!<%I$K$h$C$F$OJQ493+;O;~$K$7$+;XDj$G$-(B
+ * $B$J$$$b$N$,$"$k!#$=$3$G!"(B0-255 $B$NI8=`%3!<%I$N$&$A!"(B0 $B$+$i(B 127 $B$^$G$OJQ(B
+ * $B493+;O;~$G$bJQ49Cf$G$b;XDj$G$-$k$b$N!"(B128 $B$+$i(B 255 $B$^$G$OJQ493+;O;~$K(B
+ * $B$7$+;XDj$G$-$J$$$b$N!"$KJ,$1$F$"$k!#3HD%%3!<%I$K$D$$$F$OFC$K$3$N$h$&(B
+ * $B$J6hJL$ODj$a$J$$!#(B
+ *
+ * $B$3$N%W%m%H%3%k$GDj5A$5$l$kB0@-%3!<%I$O<!$NDL$j$G$"$k!#(B
+ *
+ * -- $BJQ493+;O;~$K$b!"JQ49ESCf$K$b;XDj$G$-$k$b$N(B --
+ *
+ * No Operation:
+ *	code: 0
+ *	data-length: N (could be 0)
+ *	data: anything
+ *
+ *	$B2?$b$7$J$$!#%W%m%Q%F%#$N$"$kItJ,$r%9%-%C%W$5$;$k$N$KJXMx!#(B
+ *	
+ * Indirect Attribute:
+ *	code: 1
+ *	data-length: 1
+ *	data[0]:
+ *		CARD32: property name (Atom)
+ *
+ *	$B;XDj$5$l$?%W%m%Q%F%#$K=>$C$FB0@-$r@_Dj$9$k!#(BCONVERSION_ATTRIBUTE
+ * 	$B%$%Y%s%H$GJ#?t$NB0@-%G!<%?$r@_Dj$7$?$$;~$d!"%$%Y%s%H$KB0@-%G!<%?$,(B
+ *	$BF~$j@Z$i$J$$;~$K;HMQ$9$k!#(B
+ *
+ * Focus Window:
+ *	code: 2
+ *	data-length: 1
+ *	data[0]:
+ *		CARD32: focus window (Window)
+ *
+ *	$B%U%)!<%+%9%&%#%s%I%&$r;XDj$9$k!#(B
+ *
+ * Spot Location:
+ *	data-length: 1
+ *	data[0]:
+ *		INT16(upper 16bit): X
+ *		INT16(lower 16bit): Y
+ *
+ *	$B%9%]%C%H%m%1!<%7%g%s$r;XDj$9$k!#%Y!<%9%i%$%s$N3+;OE@$G;XDj$9$k!#(B
+ *
+ * Client Area:
+ *	data-length: 2
+ *	data[0]:
+ *		INT16(upper 16bit): X
+ *		INT16(lower 16bit): Y
+ *	data[1]:
+ *		CARD16(upper 16bit): Width
+ *		CARD16(lower 16bit): Height
+ *
+ *	$BJQ49%F%-%9%HI=<(NN0h$r;XDj$9$k!#(B
+ *
+ * Status Area:
+ *	data-length: 2
+ *	data[0]:
+ *		INT16(upper 16bit): X
+ *		INT16(lower 16bit): Y
+ *	data[1]:
+ *		CARD16(upper 16bit): Width
+ *		CARD16(lower 16bit): Height
+ *
+ *	$B%9%F!<%?%9I=<(NN0h$r;XDj$9$k!#(B
+ *
+ * Colormap:
+ *	data-length: 1
+ *	data[0]:
+ *		CARD32: colormap (XID)
+ *
+ *	$B%+%i!<%^%C%W(B ID $B$r;XDj$9$k!#(B
+ *
+ * Color:
+ *	data-length: 2
+ *	data[0]:
+ *		CARD32: foreground pixel
+ *	data[1]:
+ *		CARD32: background pixel
+ *
+ *	$B%U%)%"%0%i%&%s%I$H%P%C%/%0%i%&%s%I$N%T%/%;%kCM$r;XDj$9$k!#(B
+ *
+ * Background Pixmap:
+ *	data-length: 1
+ *	data[0]:
+ *		CARD32: background pixmap (Pixmap)
+ *
+ *	$B%P%C%/%0%i%&%s%I$N(B Pixmap ID $B$r;XDj$9$k!#(B
+ *
+ * Line Spacing:
+ *	data-length: 1
+ *	data[0]:
+ *		CARD32: line spacing
+ *
+ *	$B9T4V$r;XDj$9$k!#%Y!<%9%i%$%s4V$N5wN%$G;XDj$9$k!#(B
+ *
+ * Font Atoms:
+ *	data-length: N (>0)
+ *	data[0]:
+ *		CARD32: font atom 1 (Atom)
+ *	...
+ *	data[N-1]:
+ *		CARD32: font atom N (Atom)
+ *
+ *	$B;HMQ$9$k%U%)%s%H$N(B "FONT" $B%"%H%`$N%j%9%H$r;XDj$9$k!#(B
+ *
+ * Cursor:
+ *	data-length: 1
+ *	data[0]:
+ *		CARD32: cursor (Cursor)
+ *
+ *	$B%+!<%=%k(B ID $B$r;XDj$9$k!#(B
+ *
+ * -- $BJQ493+;O;~$N$_;XDj$G$-$k$b$N(B --
+ *
+ * Input Style:
+ *	data-length: 1
+ *	data[0]:
+ *		CARD32: input style
+ *
+ *	$BF~NOJ}K!$r;XDj$9$k!#(B
+ *	$B%G%U%)%k%H$O(B Root Window Style $B$G$"$k!#(B
+ *
+ * Event Capture Method:
+ *	data-length: 1
+ *	data[0]:
+ *		CARD32: event capture method
+ *
+ *	$B%/%i%$%"%s%H%&%#%s%I%&$+$i$N%$%Y%s%H$N<hF@J}K!$r;XDj$9$k!#%G%U%)(B
+ *	$B%k%H$O%/%i%$%"%s%H%&%#%s%I%&$NA0$K(B InputOnly $B%&%#%s%I%&$r:n$C$F(B
+ *	$B$=$N%-!<%$%Y%s%H$r%;%l%/%H$9$k$H$$$&$b$N$G$"$k!#B>$NJ}K!$H$7$F$O!"(B
+ *	$B%U%)!<%+%9%&%#%s%I%&(B ($B%U%)!<%+%9%&%#%s%I%&$,;XDj$5$l$F$$$J$1$l$P(B
+ *	$B%/%i%$%"%s%H%&%#%s%I%&(B) $B$N%-!<%$%Y%s%H$rD>@\%;%l%/%H$9$k(B ($B$3$N>l(B
+ *	$B9g!"JQ49Cf$O%/%i%$%"%s%H$O%-!<%$%Y%s%H$rL5;k$7$J$/$F$O$J$i$J$$(B) 
+ *	$B$b$N$H!"2?$b$7$J$$!"$D$^$jJQ49Cf$N%/%i%$%"%s%H$O%-!<%$%Y%s%H$r%U(B
+ *	$B%m%s%H%(%s%I$K(B SendEvent $B$7$J$/$F$O$J$i$J$$!"$H$$$&J}K!$,$"$k!#(B
+ *
+ * Use Extension:
+ *	data-length: N
+ *	data[0]:
+ *		CARD32: extension atom 1 (Atom)
+ *	...
+ *	data[N-1]:
+ *		CARD32: extension atom N (Atom)
+ *
+ *	$B$3$NB0@-@_Dj$G;HMQ$5$l$k3HD%$r;XDj$9$k!#$3$3$G;XDj$9$k3HD%$O%5!<(B
+ *	$B%P$,%5%]!<%H$7$F$$$k$b$N!"$D$^$j%W%m%U%!%$%k%G!<%?Cf$N(BSupported
+ *	Extensions $B$K=q$+$l$?3HD%$G$J$1$l$P$J$i$J$$!#(B
+ */
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/include/DebugPrint.h	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,32 @@
+/* $Id: DebugPrint.h,v 1.5 1994/05/16 08:34:19 ishisone Rel $ */
+
+#ifdef DEBUG
+extern int	debug_all;
+
+#ifdef DEBUG_VAR
+int DEBUG_VAR = 0;
+#else /* DEBUG_VAR */
+#ifdef EXT_DEBUG_VAR
+extern int EXT_DEBUG_VAR;
+#define DEBUG_VAR	EXT_DEBUG_VAR
+#else /* EXT_DEBUG_VAR */
+#define DEBUG_VAR	0
+#endif /* EXT_DEBUG_VAR */
+#endif /* DEBUG_VAR */
+
+#define DEBUG_CONDITION	(debug_all || DEBUG_VAR)
+#define DDEBUG_CONDITION(l) (debug_all >= (l) || DEBUG_VAR >= (l))
+#define DPRINT(args)	{ if (DEBUG_CONDITION) printf args; }
+#define DDPRINT(level, args) \
+	{ if (DDEBUG_CONDITION(level)) printf args; }
+#define TRACE(args)	DDPRINT(10, args)
+
+#else /* !DEBUG */
+
+#define DEBUG_CONDITION	0
+#define DDEBUG_CONDITION(l) 0
+#define DPRINT(args)
+#define DDPRINT(level, args)
+#define TRACE(args)
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/include/FontBank.h	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,53 @@
+/* $Id: FontBank.h,v 1.2 1994/05/12 09:13:24 ishisone Rel $ */
+/*
+ * Copyright (c) 1991, 1994  Software Research Associates, Inc.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted, provided
+ * that the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Software Research Associates not be
+ * used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission.  Software Research
+ * Associates makes no representations about the suitability of this software
+ * for any purpose.  It is provided "as is" without express or implied
+ * warranty.
+ *
+ * Author:  Makoto Ishisone, Software Research Associates, Inc., Japan
+ */
+
+#ifndef _FontBank_h
+#define _FontBank_h
+
+typedef struct _fb_rec_ *FontBank;	/* opaque */
+
+extern FontBank FontBankCreate(
+#if NeedFunctionPrototypes
+	Display *	/* dpy */,
+	char *		/* language */
+#endif
+);
+
+extern void FontBankDestroy(
+#if NeedFunctionPrototypes
+	FontBank	/* bank */
+#endif
+);
+
+extern XFontStruct ** FontBankGet(
+#if NeedFunctionPrototypes
+	FontBank	/* bank */,
+	char *		/* fontset_base_names */,
+	int *		/* num_fontsp */
+#endif
+);
+
+extern void FontBankFreeFonts(
+#if NeedFunctionPrototypes
+	FontBank	/* bank */,
+	XFontStruct **	/* fonts */,
+	int		/* num_fonts */
+#endif
+);
+
+#endif /* _FontBank_h */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/include/ICLabel.h	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,47 @@
+/* $Id: ICLabel.h,v 1.3 1991/03/22 17:46:57 ishisone Rel $ */
+/*
+ * Copyright (c) 1990  Software Research Associates, Inc.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted, provided
+ * that the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Software Research Associates not be
+ * used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission.  Software Research
+ * Associates makes no representations about the suitability of this software
+ * for any purpose.  It is provided "as is" without express or implied
+ * warranty.
+ *
+ * Author:  Makoto Ishisone, Software Research Associates, Inc., Japan
+ */
+
+#ifndef _ICLabel_h
+#define _ICLabel_h
+
+/* ICLabel widget public header file */
+#include "ICtypes.h"
+
+#define XtNcursor "cursor"
+#define XtCSpacing "Spacing"
+#define XtNhorizontalSpacing "horizontalSpacing"
+#define XtNverticalSpacing "verticalSpacing"
+
+typedef struct _ICLabelClassRec*	ICLabelWidgetClass;
+typedef struct _ICLabelRec*		ICLabelWidget;
+
+extern WidgetClass icLabelWidgetClass;
+
+/*
+ * public function:
+ *	void ICLRecomputeSize(Widget widget)
+ *		recompute size and make resize request.
+ *		useful when changing child (convDisplayObject) attributes
+ */
+extern void ICLRecomputeSize(
+#if NeedFunctionPrototypes
+	Widget	/* widget */
+#endif
+);
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/include/ICLabelP.h	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,56 @@
+/* $Id: ICLabelP.h,v 1.4 1991/03/22 17:46:42 ishisone Rel $ */
+/*
+ * Copyright (c) 1990  Software Research Associates, Inc.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted, provided
+ * that the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Software Research Associates not be
+ * used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission.  Software Research
+ * Associates makes no representations about the suitability of this software
+ * for any purpose.  It is provided "as is" without express or implied
+ * warranty.
+ *
+ * Author:  Makoto Ishisone, Software Research Associates, Inc., Japan
+ */
+
+#ifndef _ICLabelP_h
+#define _ICLabelP_h
+
+#include <X11/CompositeP.h>
+#include "ICLabel.h"
+
+typedef struct {
+    int empty;
+} ICLabelClassPart;
+
+typedef struct _ICLabelClassRec {
+    CoreClassPart	core_class;
+    CompositeClassPart	composite_class;
+    ICLabelClassPart	iclabel_class;
+} ICLabelClassRec;
+
+extern ICLabelClassRec icLabelClassRec;
+
+typedef struct {
+    /* resources */
+    Dimension hspace;
+    Dimension vspace;
+    ICString *label;
+    XtJustify justify;
+    Cursor cursor;
+    /* private state */
+    Widget displayobj;
+    Dimension width;
+    Dimension fontheight;
+} ICLabelPart;
+
+typedef struct _ICLabelRec {
+    CorePart	core;
+    CompositePart	composite;
+    ICLabelPart	iclabel;
+} ICLabelRec;
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/include/ICtypes.h	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,64 @@
+/* $Id: ICtypes.h,v 1.3 1999/01/07 03:06:22 ishisone Exp $ */
+/*
+ * Copyright (c) 1990  Software Research Associates, Inc.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted, provided
+ * that the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Software Research Associates not be
+ * used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission.  Software Research
+ * Associates makes no representations about the suitability of this software
+ * for any purpose.  It is provided "as is" without express or implied
+ * warranty.
+ *
+ * Author:  Makoto Ishisone, Software Research Associates, Inc., Japan
+ */
+
+#ifndef _ICtypes_h
+#define _ICtypes_h
+
+/*
+ * $B%"%H%j%S%e!<%H$D$-J8;zNs7?(B -- ICString
+ *	nbytes $B$O!"(BICString $B$N(B data $B$N%G!<%?7?$rCN$i$J$/$F$b(B
+ *	$B%3%T!<$G$-$k$h$&$K$D$1$F$"$k(B
+ */
+
+typedef struct {
+    unsigned short nchars;	/* data $B$NJ8;z?t(B */
+    unsigned short nbytes;	/* data $B$N%P%$%H?t(B */
+    char *data;			/* $BJ8;zNs(B ($B%(%s%3!<%G%#%s%0$O%/%i%90MB8(B) */
+    int attr;			/* $BJ8;zNs$NB0@-(B */
+} ICString;
+
+
+/*
+ * ICString.attr $B$NCM(B
+ */
+
+/* 1. $BJ8;zNs$,JQ49ESCf$N%F%-%9%H%;%0%a%s%H$rI=$7$F$$$k;~(B
+ * ($B2<5-$NCM$N(B bitwise-or)
+ */
+#define ICAttrNotConverted	0	/* $B$^$@JQ49$5$l$F$$$J$$%;%0%a%s%H(B */
+#define ICAttrConverted		1	/* $BJQ49:Q$_%;%0%a%s%H(B */
+#define ICAttrCurrentSegment	2	/* $B8=:_CmL\$7$F$$$k%;%0%a%s%H(B */
+#define ICAttrCurrentSubSegment 4	/* $B8=:_CmL\$7$F$$$k%5%V%;%0%a%s%H(B */
+
+/* 2. $B$=$l0J30!"Nc$($P8=:_$NF~NO%b!<%I$J$I$rI=$7$F$$$k;~(B ($B>o$K$3$NCM(B) */
+#define ICAttrNormalString	(-1)
+
+
+/* $BA*Br$N0\F0J}8~(B */
+#define ICMoveLeft	1
+#define ICMoveRight	2
+#define ICMoveUp	3
+#define ICMoveDown	4
+#define ICMoveLeftMost	5
+#define ICMoveRightMost	6
+#define ICMoveNextPage	7
+#define ICMovePrevPage	8
+#define ICMoveFirst	9
+#define ICMoveLast	10
+
+#endif /* _ICtypes_h */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/include/IMProto.h	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,70 @@
+/* $Id: IMProto.h,v 1.3 1994/05/31 07:54:39 ishisone Rel $ */
+/*
+ * Copyright (c) 1994  Software Research Associates, Inc.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted, provided
+ * that the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Software Research Associates not be
+ * used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission.  Software Research
+ * Associates makes no representations about the suitability of this software
+ * for any purpose.  It is provided "as is" without express or implied
+ * warranty.
+ *
+ * Author:  Makoto Ishisone, Software Research Associates, Inc., Japan
+ */
+
+#ifndef _IMProtocol_h
+#define _IMProtocol_h
+
+#include "ICtypes.h"
+
+/*
+  IMProtocol new resources:
+
+  name			class			type	default		access
+  ----------------------------------------------------------------------------
+  serverName		ServerName		String	"kinput2"	CG
+  language		Language		String	NULL		CG
+  locales		Locales			String	NULL		CG
+  inputObjectClass	Class			Pointer	NULL		CG
+  displayObjectClass	Class			Pointer	NULL		CG
+  defaultFontList	FontList		String	NULL		CG
+  foreground		Foreground		Pixel	DefaultForeground
+									CG
+  transports		Transports		String	"tcp,unix,x"	CG
+*/
+
+#define XtNserverName "serverName"
+#define XtCServerName "ServerName"
+
+#define XtNlanguage "language"
+#define XtCLanguage "Language"
+
+#define XtNlocales "locales"
+#define XtCLocales "Locales"
+
+#define XtNinputObjectClass "inputObjectClass"
+#define XtNdisplayObjectClass "displayObjectClass"
+#define XtCClass "Class"
+
+#define XtNdefaultFontList "defaultFontList"
+#define XtCFontList "FontList"
+
+#define XtNconversionStartKeys "conversionStartKeys"
+#define XtCConversionStartKeys "ConversionStartKeys"
+
+#define XtNstatusWidth "statusWidth"
+#define XtCStatusWidth "StatusWidth"
+
+#define XtNtransports "transports"
+#define XtCTransports "Transports"
+
+typedef struct _IMProtocolClassRec*	IMProtocolWidgetClass;
+typedef struct _IMProtocolRec*		IMProtocolWidget;
+
+extern WidgetClass imProtocolWidgetClass;
+
+#endif /* _IMProtocol_h */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/include/IMProtoP.h	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,115 @@
+/* $Id: IMProtoP.h,v 1.6 1995/05/17 09:15:02 ishisone Exp $ */
+/*
+ * Copyright (c) 1994  Software Research Associates, Inc.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted, provided
+ * that the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Software Research Associates not be
+ * used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission.  Software Research
+ * Associates makes no representations about the suitability of this software
+ * for any purpose.  It is provided "as is" without express or implied
+ * warranty.
+ *
+ * Author:  Makoto Ishisone, Software Research Associates, Inc., Japan
+ */
+
+#ifndef _IMProtocolP_h
+#define _IMProtocolP_h
+
+#include "IMProto.h"
+#include "im.h"
+#include "FontBank.h"
+#include "ConvCtrl.h"
+#include "IOECall.h"
+
+typedef struct {
+    int dummy;
+} IMProtocolClassPart;
+
+typedef struct _IMProtocolClassRec {
+    CoreClassPart		core_class;
+    IMProtocolClassPart		imProtocol_class;
+} IMProtocolClassRec;
+
+extern IMProtocolClassRec imProtocolClassRec;
+
+
+typedef struct {
+    /* resources */
+    String server_name;
+
+    /*
+     * It is not difficult to handle multiple languages in a
+     * protocol widget, but we've determined not to do so
+     * for simplicity (at least for now).
+     */
+    String language;
+    String locales;
+    WidgetClass input_object_class;
+    WidgetClass display_object_class;
+    String default_fontlist;		/* default font list to be used */
+
+    Pixel foreground;			/* default fg pixel */
+    String conversion_start_keys;	/* conversion start/end keys */
+    Dimension status_width;		/* default width of status area */
+    String transport_list;		/* transports to be used */
+
+    /* private state */
+    Boolean use_tcp_transport;
+    Boolean use_unix_transport;
+    Boolean use_x_transport;
+    int tcp_port;			/* TCP port number */
+    int tcp_sock;			/* TCP socket descriptor */
+    XtInputId tcp_id;
+    String unix_path;			/* Unix domain socket pathname */
+    int unix_sock;			/* Unix domain socket descriptor */
+    XtInputId unix_id;
+    Boolean no_more_connections;
+    IMConnection *connection_list;
+    IMConverter converter;
+    long last_imid;
+    long last_icid;
+    IMIM *im_hash[IM_HASH_SIZE];
+    IMIC *ic_hash[IC_HASH_SIZE];
+    IMConnection *scheduler_queue;
+    IMTriggerKey *trigger_keys;		/* conversion start trigger keys */
+    int num_trigger_keys;
+    FontBank font_bank;
+    XFontStruct **default_fonts;
+    int num_default_fonts;
+    XIOEHandle ioe_handle;
+
+    /* atoms */
+    Atom xim_xconnect;			/* "_XIM_XCONNECT" */
+    Atom xim_protocol;			/* "_XIM_PROTOCOL" */
+    Atom xim_moredata;			/* "_XIM_MOREDATA" */
+    Atom ctext_atom;			/* "COMPOUND_TEXT" */
+    Atom locales_atom;			/* "LOCALES" */
+    Atom transport_atom;		/* "TRANSPORT" */
+    Atom ki2comm_atom;			/* "_KINPUT2_COMM" */
+    Atom server_atom;			/* atom stored in XIM_SERVERS prop. */
+} IMProtocolPart;
+
+typedef struct _IMProtocolRec {
+    CorePart		core;
+    IMProtocolPart	imp;
+} IMProtocolRec;
+
+#define IM_IMHASH(w)	(((IMProtocolWidget)(w))->imp.im_hash)
+#define IM_ICHASH(w)	(((IMProtocolWidget)(w))->imp.ic_hash)
+#define IM_LASTIMID(w)	(((IMProtocolWidget)(w))->imp.last_imid)
+#define IM_LASTICID(w)	(((IMProtocolWidget)(w))->imp.last_icid)
+#define IM_QUEUE(w)	(((IMProtocolWidget)(w))->imp.scheduler_queue)
+
+#define ATOM_CTEXT(w)	(((IMProtocolWidget)(w))->imp.ctext_atom)
+#define ATOM_LOCALES(w)	(((IMProtocolWidget)(w))->imp.locales_atom)
+#define ATOM_TRANSPORT(w) (((IMProtocolWidget)(w))->imp.transport_atom)
+#define ATOM_KI2COMM(w) (((IMProtocolWidget)(w))->imp.ki2comm_atom)
+#define ATOM_XCONNECT(w) (((IMProtocolWidget)(w))->imp.xim_xconnect)
+#define ATOM_PROTOCOL(w) (((IMProtocolWidget)(w))->imp.xim_protocol)
+#define ATOM_MOREDATA(w) (((IMProtocolWidget)(w))->imp.xim_moredata)
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/include/IOECall.h	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,50 @@
+/* $Id: IOECall.h,v 1.1 1994/11/22 01:13:01 ishisone Exp $ */
+/*
+ * Copyright (C) 1994  Software Research Associates, Inc.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted, provided
+ * that the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Software Research Associates not be
+ * used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission.  Software Research
+ * Associates makes no representations about the suitability of this software
+ * for any purpose.  It is provided "as is" without express or implied
+ * warranty.
+ *
+ * Author:  Makoto Ishisone, Software Research Associates, Inc., Japan
+ */
+
+#ifndef _IOECall_h
+#define _IOECall_h
+
+/*
+ * X I/O error callback handler
+ */
+
+/*
+ * XIOEHandle -- an opaque type used as a 'handle' in this library
+ */
+typedef struct ioe_cb_desc_ *XIOEHandle;
+
+extern void XIOEInit(
+#if NeedFunctionPrototypes
+	void
+#endif
+);
+
+extern XIOEHandle XIOESet(
+#if NeedFunctionPrototypes
+	void (*)(),
+	XPointer
+#endif
+);
+
+extern void XIOEUnset(
+#if NeedFunctionPrototypes
+	XIOEHandle handle
+#endif
+);
+
+#endif /* _IOECall_h */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/include/InputConv.h	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,411 @@
+/* $Id: InputConv.h,v 1.20 1999/01/13 08:41:54 ishisone Exp $ */
+/*
+ * Copyright (c) 1990  Software Research Associates, Inc.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted, provided
+ * that the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Software Research Associates not be
+ * used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission.  Software Research
+ * Associates makes no representations about the suitability of this software
+ * for any purpose.  It is provided "as is" without express or implied
+ * warranty.
+ *
+ * Author:  Makoto Ishisone, Software Research Associates, Inc., Japan
+ */
+
+#ifndef _InputConv_h
+#define _InputConv_h
+
+#include "ICtypes.h"
+#include <X11/Object.h>
+
+/*
+  InputConv new resources:
+
+  name			class		type		default		access
+  ----------------------------------------------------------------------------
+  selectionControl	Callback	Callback	NULL		C
+  textChangeNotify	Callback	Callback	NULL		C
+  modeChangeNotify	Callback	Callback	NULL		C
+  endNotify		Callback	Callback	NULL		C
+  fixNotify		Callback	Callback	NULL		C
+  auxControl		Callback	Callback	NULL		C
+  displayObjectClass	Class		Pointer		NULL		CG
+*/
+
+/* new resources */
+#define XtNselectionControl "selectionControl"
+#define XtNtextChangeNotify "textChangeNotify"
+#define XtNmodeChangeNotify "modeChangeNotify"
+#define XtNfixNotify "fixNotify"
+#define XtNendNotify "endNotify"
+#define XtNauxControl "auxControl"
+#define XtNdisplayObjectClass "displayObjectClass"
+#define XtCClass "Class"
+
+typedef struct _InputConvClassRec *InputConvObjectClass;
+typedef struct _InputConvRec *InputConvObject;
+
+extern WidgetClass inputConvObjectClass;
+
+
+/*
+ * XtNselectionControl $B%3!<%k%P%C%/$N(B call_data $B9=B$BN(B
+ */
+
+typedef struct {
+
+    int command;	/* $B%3%^%s%I(B
+			 *	Start: $B9`L\A*Br3+;O%j%/%(%9%H(B
+			 *	End: $B9`L\A*Br=*N;%j%/%(%9%H(B
+			 *	Set: $B%+%l%s%H9`L\@_Dj%j%/%(%9%H(B
+			 *	Move: $B%+%l%s%H9`L\0\F0%j%/%(%9%H(B
+			 *	Get: $B%+%l%s%H9`L\<hF@%j%/%(%9%H(B
+			 */
+#define ICSelectionStart	1
+#define ICSelectionEnd		2
+#define ICSelectionSet		3
+#define ICSelectionMove		4
+#define ICSelectionGet		5
+
+    union {
+	int selection_kind;	/* ICSelectionStart $B$N;~(B */
+#define ICSelectionCandidates	1
+#define ICSelectionSymbols	2
+
+	int current_item;	/* ICSelectionSet/ICSelectionEnd/
+				 * ICSelectionGet $B$N;~(B
+			         * ICSelectionEnd/ICSelectionGet $B$N(B
+				 * $B>l9g$O%3!<%k%P%C%/4X?tB&$G8=:_$N(B
+				 * $B%+%l%s%H8uJdHV9f$rBeF~$9$k(B
+				 * ($B%+%l%s%H$,$J$1$l$P(B -1 $B$rBeF~$9$k(B)
+				 */
+
+	int dir;		/* ICSelectionMove $B$N;~(B */
+    } u;
+
+} ICSelectionControlArg;
+
+
+/*
+ * ICCompareSegment $B$GJV$5$l$kCM(B
+ */
+
+#define ICSame		0	/* $BA4$/F1$8(B */
+#define ICAttrChanged	1	/* attr $B$N$_0[$J$k(B */
+#define ICStringChanged	2	/* data $B$,0[$J$k(B */
+				/* attribute $B$H(B data $B$H$b$K0[$J$l$P(B
+				 * (ICAttrChanged | ICStringChanged) $B$,JV$k(B
+				 */
+
+
+/*
+ * XtNauxControl $B%3!<%k%P%C%/$N(B call_data $B9=B$BN(B
+ */
+
+typedef struct {
+
+    int command;	/* $B%3%^%s%I(B
+			 *	Start: $B9`L\A*Br3+;O%j%/%(%9%H(B
+			 *	End: $B9`L\A*Br=*N;%j%/%(%9%H(B
+			 *	Change: $B%+%l%s%H9`L\@_Dj%j%/%(%9%H(B
+			 */
+#define ICAuxStart		1
+#define ICAuxEnd		2
+#define ICAuxChange		3
+
+} ICAuxControlArg;
+
+/*
+ * GetTriggerKeys $B$K;H$o$l$k(B keys $B$N$?$a$N9=B$BN(B
+ */
+
+typedef struct {
+  KeySym keysym;
+  long modifiers;
+  long modifiermask;
+} ICTriggerKey;
+
+/*
+ * $B%Q%V%j%C%/%$%s%?!<%U%'%$%9%U%!%s%/%7%g%s(B
+ */
+
+/*
+ * Boolean ICSupportMultipleObjects(WidgetClass objectclass)
+ *	$B;XDj$5$l$?%*%V%8%'%/%H%/%i%9$+$iJ#?t$N%$%s%9%?%s%9$,@8@.$G$-$k$+(B
+ *	$B$I$&$+$rJV$9(B
+ *	True $B$J$i2DG=$@$7!"(BFalse $B$J$i$?$@0l$D$N%$%s%9%?%s%9$7$+@8@.$G$-$J$$(B
+ *	$B0z?t$,(B Widget $B$G$O$J$/(B WidgetClass $B$G$"$k$3$H$KCm0U(B
+ */
+extern Boolean ICSupportMultipleObjects(
+#if NeedFunctionPrototypes
+	WidgetClass	/* objectclass */
+#endif
+);
+
+/*
+ * int ICInputEvent(Widget ojbect, XEvent *event)
+ *	$B%*%V%8%'%/%H$KF~NO%$%Y%s%H$rM?$($k(B
+ *	$B%(%i!<$,5/$3$C$?>l9g$O(B -1 $B$,JV$k(B
+ *	$B%(%i!<$G$J$1$l$P(B 0 $B$+(B 1 $B$,JV$k(B
+ *	$BDL>o$O(B 0 $B$,JV$k$,!"$b$7(B 1 $B$,JV$C$F$-$?$i!"$=$l$O$G$-$k$J$i$P(B
+ *	$B$=$NF~NO%$%Y%s%H$r%"%W%j%1!<%7%g%s$KAw$jJV$7$?J}$,$h$$$H$$$&(B
+ *	$B%*%V%8%'%/%H$+$i$N%R%s%H$G$"$k(B
+ */
+extern int ICInputEvent(
+#if NeedFunctionPrototypes
+	Widget		/* object */,
+	XEvent *	/* event */
+#endif
+);
+
+/*
+ * ICString *ICGetMode(Widget object)
+ *	$B8=:_$NF~NO%b!<%I$r(B ICString $B$N7A<0$GJV$9(B
+ *	$B%G!<%?$O(B InputConvObject $B$N$b$N$J$N$G>!<j$KCM$rJQ99$7$?$j(B
+ *	free() $B$7$F$O$J$i$J$$(B
+ */
+extern ICString *ICGetMode(
+#if NeedFunctionPrototypes
+	Widget		/* object */
+#endif
+);
+
+/*
+ * int ICCursorPos(Widget object, Cardinal *segidx, Cardinal *offset)
+ *	$B8=:_$N%$%s%5!<%H%+!<%=%k0LCV$rJV$9(B
+ *	$B8=:_%+!<%=%k$,$J$$;~$K$O(B 0 $B$"$k;~$K$O(B 1 $B$,JV$k(B
+ *	1 $B$,JV$5$l$?;~$K$O!"(Bsegidx $B$K%+!<%=%k$N$"$k%;%0%a%s%HHV9f!"(B
+ *	offset $B$K%;%0%a%s%HFb$N0LCV(B($B@hF,$+$i2?J8;zL\$+(B) $B$,JV$5$l$k(B
+ */
+extern int ICCursorPos(
+#if NeedFunctionPrototypes
+	Widget		/* object */,
+	Cardinal *	/* segidx */,
+	Cardinal *	/* offset */
+#endif
+);
+
+/*
+ * int ICNumSegments(Widget object)
+ *	$B%;%0%a%s%H?t$rJV$9(B
+ */
+extern int ICNumSegments(
+#if NeedFunctionPrototypes
+	Widget		/* object */
+#endif
+);
+
+/*
+ * ICString *ICGetSegment(Widget object, Cardinal n)
+ *	n $BHVL\$N%;%0%a%s%H$rJV$9(B ($B@hF,$N%;%0%a%s%H$O(B n=0)
+ *	$B;XDj$5$l$?%;%0%a%s%H$,B8:_$7$J$1$l$P(B NULL $B$rJV$9(B
+ *	$B%G!<%?$O(B InputConvObject $B$N$b$N$J$N$G>!<j$KCM$rJQ99$7$?$j(B
+ *	free() $B$7$F$O$J$i$J$$(B
+ */
+extern ICString *ICGetSegment(
+#if NeedFunctionPrototypes
+	Widget		/* object */,
+	Cardinal	/* n */
+#endif
+);
+
+/*
+ * int ICCompareSegment(Widget object, ICString *seg1, ICString *seg2,
+ *			Cardinal *nchar)
+ *	$BFs$D$N%;%0%a%s%H$rHf3S$9$k(B
+ *	$BHf3S7k2L$O4X?t$NCM$H$7$FJV$5$l$k(B
+ *	nchar $B$K%;%0%a%s%H$N@hF,$+$i$N0lCW$9$kJ8;z?t$,JV$5$l$k(B
+ */
+extern int ICCompareSegment(
+#if NeedFunctionPrototypes
+	Widget		/* object */,
+	ICString *	/* seg1 */,
+	ICString *	/* seg2 */,
+	Cardinal *	/* nchar */
+#endif
+);
+
+/*
+ * ICString *ICGetItemList(Widget object, Cardinal *num_items)
+ *	$BA*Br9`L\$N%j%9%H$rJV$9(B
+ *	$B9`L\A*BrCf$G$J$1$l$P(B NULL $B$rJV$9(B
+ *	num_items $B$K9`L\?t$,JV$5$l$k(B
+ *	$B%G!<%?$O(B InputConvObject $B$N$b$N$J$N$G>!<j$KCM$rJQ99$7$?$j(B
+ *	free() $B$7$F$O$J$i$J$$(B
+ *	$B$3$N4X?t$NJV$9%j%9%H$OA*BrCf(B (ICSelectionStart $B$N%3!<%k%P%C%/$+$i(B
+ *	ICSelectionEnd $B$N%3!<%k%P%C%/$^$?$O(B ICSelectItem() $B$,%3!<%k$5$l$k$^$G(B)
+ *	$BM-8z$G$"$k(B
+ */
+extern ICString *ICGetItemList(
+#if NeedFunctionPrototypes
+	Widget		/* object */,
+	Cardinal *	/* num_items */
+#endif
+);
+
+/*
+ * int ICSelectItem(Widget object, int n)
+ *	n $BHVL\$N9`L\$,A*Br$5$l$?$3$H$r%*%V%8%'%/%H$KCN$i$;$k(B
+ *	n < 0 $B$J$i$I$N9`L\$bA*Br$5$l$J$+$C$?$3$H$r<($9(B
+ *	$B9`L\A*BrCf$G$J$+$C$?$j;XDj$7$?9`L\$,B8:_$7$J$1$l$P(B -1 $B$rJV$9(B
+ *	$B$=$l0J30$O(B 0 $B$rJV$9(B
+ *	XtNselectionControl $B%3!<%k%P%C%/Cf$G$3$N4X?t$r8F$VI,MW$O$J$$(B
+ *	(ICSelectionControlArg.u.current_item $B$K%+%l%s%H$N9`L\HV9f$r(B
+ *	$BBeF~$9$k$@$1$G$h$$(B)
+ */
+extern int ICSelectItem(
+#if NeedFunctionPrototypes
+	Widget		/* object */,
+	int		/* n */
+#endif
+);
+
+/*
+ * int ICGetConvertedString(Widget object, Atom *encoding, int *format,
+ *			    int *length, XtPointer *string)
+ *	$BJQ49$5$l$?%F%-%9%H$r(B string $B$KJV$9(B
+ *	encoding $B$K$O!"%F%-%9%H$N%(%s%3!<%G%#%s%0$r;XDj$7$F$*$/(B
+ *	$B$?$@$7$3$l$OC1$J$k%j%/%(%9%H$G$"$C$F!"JQ49%*%V%8%'%/%H$O(B
+ *	$BJL$N%(%s%3!<%G%#%s%0$GJV$7$F$b$h$$(B
+ *	encoding $B$K$O<B:]$N%(%s%3!<%G%#%s%0$,JV$5$l$k(B
+ *	$BJQ49%*%V%8%'%/%H$O>/$J$/$H$b(B COMPOUND_TEXT $B%(%s%3!<%G%#%s%0$O(B
+ *	$B%5%]!<%H$7$J$/$F$O$J$i$J$$(B
+ *	format $B$K$O(B 8/16/32 $B$N$$$:$l$+!"(Blength $B$O(B string $B$N%(%l%a%s%H?t$,(B
+ *	$B$=$l$>$lJV$5$l$k(B
+ *	$B%F%-%9%H$NNN0h$O(B malloc $B$5$l$F$$$k$N$G$3$N4X?t$r8F$s$@B&$G(B
+ *	free $B$7$J$1$l$P$J$i$J$$(B
+ *	$BJQ49%F%-%9%H$,$J$$;~$d%(%i!<$N>l9g$K$O(B -1$B!"$=$&$G$J$1$l$P(B 0 $B$,(B
+ *	$B4X?t$NCM$H$7$FJV$5$l$k(B
+ *
+ *	$B$3$N4X?t$O(B XtNfixNotify $B%3!<%k%P%C%/$NCf$G;H$o$l$k$3$H$rA[Dj$7$F$$$k(B
+ */
+extern int ICGetConvertedString(
+#if NeedFunctionPrototypes
+	Widget		/* object */,
+	Atom *		/* encoding */,
+	int *		/* format */,
+	int *		/* length */,
+	XtPointer *	/* string */
+#endif
+);
+
+/*
+ * int ICClearConversion(Widget object)
+ *	$B6/@)E*$K(B ($BJQ49ESCf$G$"$C$F$b(B) $BJQ49%F%-%9%H$r%/%j%"$9$k(B
+ *	$B2?$i$+$NM}M3$G%/%j%"$G$-$J$+$C$?;~$K$O(B -1$B!"$=$&$G$J$1$l$P(B 0 $B$,(B
+ *	$BJV$5$l$k(B
+ */
+extern int ICClearConversion(
+#if NeedFunctionPrototypes
+	Widget		/* object */
+#endif
+);
+
+/*
+ * ICString *ICGetAuxSegments(Widget object, Cardinal *n,
+ *                            Cardinal *ns, Cardinal *nc)
+ *	AUX$BNN0h$N%;%0%a%s%H$rJV$9!#(B
+ *	$B;XDj$5$l$?%;%0%a%s%H$,B8:_$7$J$1$l$P(B NULL $B$rJV$9(B
+ *	$B%G!<%?$O(B InputConvObject $B$N$b$N$J$N$G>!<j$KCM$rJQ99$7$?$j(B
+ *	free() $B$7$F$O$J$i$J$$(B
+ *      $BF@$i$l$?%;%0%a%s%H?t!"%+%l%s%H%;%0%a%s%H!"%+%l%s%H%;%0%a%s%H(B
+ *      $BFb$N%+!<%=%k%]%8%7%g%s$,$=$l$>$l(B n, ns, nc $B$K$FJV$k!#(B
+ */
+extern ICString *ICGetAuxSegments(
+#if NeedFunctionPrototypes
+	Widget		/* object */,
+	Cardinal *	/* n */,
+	Cardinal *	/* ns */,
+	Cardinal *	/* nc */
+#endif
+);
+
+/*
+ * int ICRegisterTriggerKeys(Widget object)
+ *	$B;XDj$5$l$?%*%V%8%'%/%H$NF|K\8lF~NO3+;O%-!<$r<h$j=P$7!"(B
+ *	$B%/%i%9JQ?t$K3JG<$9$k!#(B
+ */
+extern int ICRegisterTriggerKeys(
+#if NeedFunctionPrototypes
+	Widget		/* object */
+#endif
+);
+
+/*
+ * int ICGetTriggerKeysOfInputObjectClass(WidgetClass objectclass,
+ *					  ICTriggerKey *keys_return)
+ *	$B;XDj$5$l$?F~NO%*%V%8%'%/%H%/%i%9$KEPO?$5$l$F$$$kF|K\8l(B
+ *	$BF~NO3+;O%-!<$r<h$j=P$9!#(B
+ */
+extern int ICGetTriggerKeysOfInputObjectClass(
+#if NeedFunctionPrototypes
+	WidgetClass	/* objectclass */,
+	ICTriggerKey **	/* keys_return */
+#endif
+);
+
+/*
+ * int ICGetPreeditString(Widget object, int segn, int offset,
+ *			  Atom *encoding, int *format,
+ *			  int *length, XtPointer *string)
+ *	$BJQ49ESCf$N(B segn $BHVL\$N(B $B%;%0%a%s%H$N(B offset $BJ8;z$+$i$N%F%-%9%H$r(B
+ *	string $B$KJV$9(B
+ *	encoding $B$K$O!"%F%-%9%H$N%(%s%3!<%G%#%s%0$r;XDj$7$F$*$/(B
+ *	$B$?$@$7$3$l$OC1$J$k%j%/%(%9%H$G$"$C$F!"JQ49%*%V%8%'%/%H$O(B
+ *	$BJL$N%(%s%3!<%G%#%s%0$GJV$7$F$b$h$$(B
+ *	encoding $B$K$O<B:]$N%(%s%3!<%G%#%s%0$,JV$5$l$k(B
+ *	$BJQ49%*%V%8%'%/%H$O>/$J$/$H$b(B COMPOUND_TEXT $B%(%s%3!<%G%#%s%0$O(B
+ *	$B%5%]!<%H$7$J$/$F$O$J$i$J$$(B
+ *	format $B$K$O(B 8/16/32 $B$N$$$:$l$+!"(Blength $B$O(B string $B$N%(%l%a%s%H?t$,(B
+ *	$B$=$l$>$lJV$5$l$k(B
+ *	$B%F%-%9%H$NNN0h$O(B malloc $B$5$l$F$$$k$N$G$3$N4X?t$r8F$s$@B&$G(B
+ *	free $B$7$J$1$l$P$J$i$J$$(B
+ *	$BJQ49%F%-%9%H$,$J$$;~$d%(%i!<$N>l9g$K$O(B -1$B!"$=$&$G$J$1$l$P(B 0 $B$,(B
+ *	$B4X?t$NCM$H$7$FJV$5$l$k(B
+ */
+extern int ICGetPreeditString(
+#if NeedFunctionPrototypes
+	Widget		/* object */,
+	int		/* segn */,
+	int		/* offset */,
+	Atom *		/* encoding */,
+	int *		/* format */,
+	int *		/* length */,
+	XtPointer *	/* string */
+#endif
+);
+
+/*
+ * int ICGetStatusString(Widget object, Atom *encoding, int *format,
+ *			 int *length, XtPointer *string, int *nchars)
+ *	$B%9%F!<%?%9%F%-%9%H$r(B string $B$KJV$9(B
+ *	encoding $B$K$O!"%F%-%9%H$N%(%s%3!<%G%#%s%0$r;XDj$7$F$*$/(B
+ *	$B$?$@$7$3$l$OC1$J$k%j%/%(%9%H$G$"$C$F!"JQ49%*%V%8%'%/%H$O(B
+ *	$BJL$N%(%s%3!<%G%#%s%0$GJV$7$F$b$h$$(B
+ *	encoding $B$K$O<B:]$N%(%s%3!<%G%#%s%0$,JV$5$l$k(B
+ *	$BJQ49%*%V%8%'%/%H$O>/$J$/$H$b(B COMPOUND_TEXT $B%(%s%3!<%G%#%s%0$O(B
+ *	$B%5%]!<%H$7$J$/$F$O$J$i$J$$(B
+ *	format $B$K$O(B 8/16/32 $B$N$$$:$l$+!"(Blength $B$O(B string $B$N%(%l%a%s%H?t$,(B
+ *	$B$=$l$>$lJV$5$l$k(B
+ *	nchars $B$K$O(B string $B$NJ8;z?t$,JV$5$l$k(B
+ *	$B%F%-%9%H$NNN0h$O(B malloc $B$5$l$F$$$k$N$G$3$N4X?t$r8F$s$@B&$G(B
+ *	free $B$7$J$1$l$P$J$i$J$$(B
+ *	$BJQ49%F%-%9%H$,$J$$;~$d%(%i!<$N>l9g$K$O(B -1$B!"$=$&$G$J$1$l$P(B 0 $B$,(B
+ *	$B4X?t$NCM$H$7$FJV$5$l$k(B
+ */
+extern int ICGetStatusString(
+#if NeedFunctionPrototypes
+	Widget		/* object */,
+	Atom *		/* encoding */,
+	int *		/* format */,
+	int *		/* length */,
+	XtPointer *	/* string */,
+	int *		/* nchars */
+#endif
+);
+
+#endif /* _InputConv_h */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/include/InputConvP.h	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,85 @@
+/* $Id: InputConvP.h,v 1.15 1999/01/13 08:41:55 ishisone Exp $ */
+/*
+ * Copyright (c) 1990  Software Research Associates, Inc.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted, provided
+ * that the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Software Research Associates not be
+ * used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission.  Software Research
+ * Associates makes no representations about the suitability of this software
+ * for any purpose.  It is provided "as is" without express or implied
+ * warranty.
+ *
+ * Author:  Makoto Ishisone, Software Research Associates, Inc., Japan
+ */
+
+#ifndef _InputConvP_h
+#define _InputConvP_h
+
+#include <X11/ObjectP.h>
+#include "InputConv.h"
+
+typedef struct {
+    int		(*InputEvent)();
+    ICString	*(*GetMode)();
+    int		(*CursorPos)();
+    int		(*NumSegments)();
+    ICString	*(*GetSegment)();
+    int		(*CompareSegment)();
+    ICString	*(*GetItemList)();
+    int		(*SelectItem)();
+    int		(*GetConvertedString)();
+    int		(*ClearConversion)();
+    ICString	*(*GetAuxSegments)();
+    Boolean	SupportMultipleObjects;
+    int		(*GetTriggerKeys)();
+    int		num_trigger_keys;
+    ICTriggerKey	*trigger_keys;
+    int		(*GetPreeditString)();
+    int		(*GetStatusString)();
+    /* private state */
+    Boolean	NoMoreObjects;
+} InputConvClassPart;
+
+typedef struct _InputConvClassRec {
+    ObjectClassPart object_class;
+    InputConvClassPart inputConv_class;
+} InputConvClassRec;
+
+extern InputConvClassRec	inputConvClassRec;
+
+typedef struct {
+    /* resources */
+    XtCallbackList	selectioncallback;
+    XtCallbackList	modechangecallback;
+    XtCallbackList	textchangecallback;
+    XtCallbackList	endcallback;
+    XtCallbackList	fixcallback;
+    XtCallbackList	auxcallback;
+    WidgetClass		displayObjClass;
+} InputConvPart;
+
+typedef struct _InputConvRec {
+    ObjectPart  object;
+    InputConvPart inputConv;
+} InputConvRec;
+
+#define XtInheritInputEvent 	(int(*)())_XtInherit
+#define XtInheritGetMode	(ICString*(*)())_XtInherit
+#define XtInheritCursorPos 	(int(*)())_XtInherit
+#define XtInheritNumSegments 	(int(*)())_XtInherit
+#define XtInheritGetSegment	(ICString*(*)())_XtInherit
+#define XtInheritCompareSegment (int(*)())_XtInherit
+#define XtInheritGetItemList	(ICString*(*)())_XtInherit
+#define XtInheritSelectItem 	(int(*)())_XtInherit
+#define XtInheritGetConvertedString 	(int(*)())_XtInherit
+#define XtInheritClearConversion 	(int(*)())_XtInherit
+#define XtInheritGetAuxSegments		(ICString*(*)())_XtInherit
+#define XtInheritGetTriggerKeys		(int(*)())_XtInherit
+#define XtInheritGetPreeditString	(int(*)())_XtInherit
+#define XtInheritGetStatusString	(int(*)())_XtInherit
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/include/KIFontSet.h	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,63 @@
+/* $Id: KIFontSet.h,v 1.2 1991/09/23 04:10:34 ishisone Rel $ */
+/*
+ * Copyright (c) 1991  Software Research Associates, Inc.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted, provided
+ * that the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Software Research Associates not be
+ * used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission.  Software Research
+ * Associates makes no representations about the suitability of this software
+ * for any purpose.  It is provided "as is" without express or implied
+ * warranty.
+ *
+ * Author:  Makoto Ishisone, Software Research Associates, Inc., Japan
+ */
+
+#ifndef _KIFontSet_h
+#define _KIFontSet_h
+
+typedef struct {
+    String pattern;		/* must be in lower case
+				 * ex) "iso8859-*", "jisx0208.1983-0"
+				 */
+    XtPointer cldata;
+} KICharSetSpec;
+
+typedef struct {
+    KICharSetSpec *specs;	/* first spec is the most preferrable
+				 * charset.
+				 */
+    Cardinal num_specs;
+} KICharSet;
+
+typedef struct {
+    XFontStruct *font;
+    String charset;		/* matched KICharSetSpec's pattern */
+    XtPointer cldata;		/* matched KICharSetSpec's cldata */
+} KICharSetFont;
+
+/*
+ * int ExtractFontsFromFontSet(Display *dpy, String fontset_string,
+ *			       KICharSet *charsets, KICharSetFont *result,
+ *			       Cardinal num_charsets)
+ *
+ * gets appropriate fonts for each of give charsets from fontset_string.
+ * fontset_string is similar to base_font_name_list in XCreateFontSet().
+ * returns number of matched fonts.
+ *
+ * note) use CachedFreeFont() to free fonts obtained by this function.
+ */
+extern int ExtractFontsFromFontSet(
+#if NeedFunctionPrototypes
+	Display *	/* dpy */,
+	String		/* fontset_string */,
+	KICharSet *	/* charsets */,
+	KICharSetFont *	/* result (must be allocated by the caller) */,
+	Cardinal	/* num_charsets */
+#endif
+);
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/include/KIProto.h	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,55 @@
+/* $Id: KIProto.h,v 1.3 1991/08/22 06:01:57 ishisone Rel $ */
+/*
+ * Copyright (c) 1990  Software Research Associates, Inc.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted, provided
+ * that the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Software Research Associates not be
+ * used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission.  Software Research
+ * Associates makes no representations about the suitability of this software
+ * for any purpose.  It is provided "as is" without express or implied
+ * warranty.
+ *
+ * Author:  Makoto Ishisone, Software Research Associates, Inc., Japan
+ */
+
+#ifndef _KinputProtocol_h
+#define _KinputProtocol_h
+
+#include "ICtypes.h"
+
+/*
+  KinputProtocol new resources:
+
+  name			class			type	default		access
+  ----------------------------------------------------------------------------
+  language		Language		String	NULL		CG
+  inputObjectClass	Class			Pointer	NULL		CG
+  displayObjectClass	Class			Pointer	NULL		CG
+  backwardCompatible	BackwardCompatible	Boolean	False		CG
+  xlcConversionStartKey	XlcConversionStartKey	String	NULL		CG
+
+*/
+
+#define XtNlanguage "language"
+#define XtCLanguage "Language"
+
+#define XtNinputObjectClass "inputObjectClass"
+#define XtNdisplayObjectClass "displayObjectClass"
+#define XtCClass "Class"
+
+#define XtNbackwardCompatible "backwardCompatible"
+#define XtCBackwardCompatible "BackwardCompatible"
+
+#define XtNxlcConversionStartKey "xlcConversionStartKey"
+#define XtCXlcConversionStartKey "XlcConversionStartKey"
+
+typedef struct _KinputProtocolClassRec*	KinputProtocolWidgetClass;
+typedef struct _KinputProtocolRec*	KinputProtocolWidget;
+
+extern WidgetClass kinputProtocolWidgetClass;
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/include/KIProtoP.h	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,121 @@
+/* $Id: KIProtoP.h,v 1.12 1993/09/16 02:45:33 ishisone Rel $ */
+/*
+ * Copyright (c) 1991  Software Research Associates, Inc.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted, provided
+ * that the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Software Research Associates not be
+ * used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission.  Software Research
+ * Associates makes no representations about the suitability of this software
+ * for any purpose.  It is provided "as is" without express or implied
+ * warranty.
+ *
+ * Author:  Makoto Ishisone, Software Research Associates, Inc., Japan
+ */
+
+#ifndef _KinputProtocolP_h
+#define _KinputProtocolP_h
+
+#include "KIProto.h"
+#include "ConvCtrl.h"
+
+typedef struct {
+    int empty;
+} KinputProtocolClassPart;
+
+typedef struct _KinputProtocolClassRec {
+    CoreClassPart		core_class;
+    KinputProtocolClassPart	kinputprotocol_class;
+} KinputProtocolClassRec;
+
+extern KinputProtocolClassRec kinputProtocolClassRec;
+
+typedef enum {
+    unresolved_protocol,
+    kinput1_protocol,		/* old kinput protocol */
+    kinput2_protocol,		/* new kinput protocol */
+    jinput_protocol,		/* Matsushita's jinput protocol */
+    xlc_protocol		/* Sony's xlc protocol */
+} KinputProtocol;
+
+typedef enum {
+    offthespot_style,
+    overthespot_style,
+    separate_style
+} ConversionStyle;
+
+typedef struct {
+    int		state;
+#define JINPUT_MULTI_COLOR	1
+#define JINPUT_MULTI_FONT	2
+    Position	rawspotx, rawspoty;
+} JinputData;
+
+typedef struct _convclient_ {
+    KinputProtocol	protocol;
+    ConversionStyle	style;
+    Widget		protocolwidget;	/* protocol widget */
+    Widget		conversion;	/* conversion widget */
+    Window		reqwin;		/* conversion requestor window */
+    Atom		selection;	/* selection atom */
+    Atom		target;		/* type of converted string */
+    Atom		property;	/* property to store converted string */
+    EventSelectMethod	esm;
+    unsigned long	attrmask;
+    unsigned long	validattrmask;
+    ConversionAttributes attrs;
+    XtPointer		data;		/* protocol dependent data */
+    void		(*start_proc)();/* protocol dependent proc. routines */
+    void		(*detach_proc)();
+    void		(*fix_proc)();
+    void		(*end_proc)();
+    void		(*free_resources)();
+    struct _convclient_	*next;
+} ConvClient;
+
+typedef struct {
+    /* resources */
+    String language;
+    WidgetClass inputObjClass;
+    WidgetClass displayObjClass;
+    Boolean backward_compatible;
+    String xlcstartkey;
+    /* private state */
+    ConvClient *clients;
+    Position defaultascent;
+    /* atoms -- common */
+    Atom convAtom;		/* _<language>_CONVERSION */
+    Atom oldConvAtom;		/* <language>_CONVERSION (obsolete) */
+    Atom ctextAtom;		/* COMPOUND_TEXT */
+    Atom convStringAtom;	/* CONVERSION_STRING */
+    Atom convNotifyAtom;	/* CONVERSION_NOTIFY */
+    Atom convEndAtom;		/* CONVERSION_END */
+    /* atoms -- kinput2 specific */
+#ifdef notdef
+    Atom convInitializeAtom;	/* CONVERSION_INITIALIZE */
+#endif
+    Atom convAttributeAtom;	/* CONVERSION_ATTRIBUTE */
+    /* atoms -- jinput specific (whew!) */
+    Atom convVersionAtom;	/* CONVERSION_VERSION */
+    Atom convInitialTypeAtom;	/* CONVERSION_INITIAL_TYPE */
+    Atom convOpenNotifyAtom;	/* CONVERSION_OPEN_NOTIFY */
+    Atom convXYRequestAtom;	/* CONVERSION_XY_REQUEST */
+    Atom convFontsRequestAtom;	/* CONVERSION_FONTS_REQUEST */
+    Atom convColorRequestAtom;	/* CONVERSION_COLOR_REQUEST */
+    Atom convCloseNotifyAtom;	/* CONVERSION_CLOSE_NOTIFY */
+    /* atoms -- xlc specific */
+    Atom xlcStatusAtom;		/* _XLC_STATUS */
+    Atom xlcOnTheSpotAtom;	/* _XLC_ON_THE_SPOT */
+    Atom xlcBcModifierAtom;	/* _XLC_BC_MODIFIER */
+    Atom xlcBcKeycodeAtom;	/* _XLC_BC_KEYCODE */
+} KinputProtocolPart;
+
+typedef struct _KinputProtocolRec {
+    CorePart		core;
+    KinputProtocolPart	kinput;
+} KinputProtocolRec;
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/include/LocalAlloc.h	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,24 @@
+/* $Id: LocalAlloc.h,v 1.2 1991/01/22 11:53:28 ishisone Rel $ */
+
+/*
+ * (fast) local allocator macro
+ *
+ * if you use gcc, don't worry.
+ * if you use cc and have reliable alloca(), define HAVE_ALLOCA.
+ */
+
+#ifdef __GNUC__
+#define LOCAL_ALLOC(x)	__builtin_alloca((unsigned int)(x))
+#define LOCAL_FREE(x)
+#else
+#ifdef HAVE_ALLOCA
+#ifdef INCLUDE_ALLOCA_H
+#include <alloca.h>
+#endif
+#define LOCAL_ALLOC(x)	alloca((unsigned int)(x))
+#define LOCAL_FREE(x)
+#else
+#define LOCAL_ALLOC(x)	malloc((unsigned int)(x))
+#define LOCAL_FREE(x)	free((char *)(x))
+#endif /* HAVE_ALLOCA */
+#endif /* __GNUC__ */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/include/MyDispatch.h	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,39 @@
+/* $Id: MyDispatch.h,v 1.3 1991/02/06 10:54:31 ishisone Rel $ */
+
+/*
+ *	a simple event dispatch library for non-widget windows
+ */
+
+extern void MyDispatchEvent(
+#if NeedFunctionPrototypes
+	XEvent *	/* event */
+#endif
+);
+
+extern void MyAddEventHandler(
+#if NeedFunctionPrototypes
+	Display *	/* dpy */,
+	Window		/* window */,
+	int		/* type */,
+	unsigned long	/* mask */,
+	void (*)()	/* func */,
+	XtPointer	/* data */
+#endif
+);
+
+extern void MyRemoveEventHandler(
+#if NeedFunctionPrototypes
+	Display *	/* dpy */,
+	Window		/* window */,
+	int		/* type */,
+	void (*)()	/* func */,
+	XtPointer	/* data */
+#endif
+);
+
+extern void MyRemoveAllEventHandler(
+#if NeedFunctionPrototypes
+	Display *	/* dpy */,
+	Window		/* window */
+#endif
+);
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/include/OffConv.h	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,38 @@
+/* $Id: OffConv.h,v 1.4 1991/08/20 09:22:15 ishisone Rel $ */
+/*
+ * Copyright (c) 1990  Software Research Associates, Inc.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted, provided
+ * that the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Software Research Associates not be
+ * used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission.  Software Research
+ * Associates makes no representations about the suitability of this software
+ * for any purpose.  It is provided "as is" without express or implied
+ * warranty.
+ *
+ * Author:  Makoto Ishisone, Software Research Associates, Inc., Japan
+ */
+
+#ifndef _OffTheSpotConversion_h
+#define _OffTheSpotConversion_h
+
+/* OffTheSpotConversion widget public header file */
+
+#include "ConvCtrl.h"
+
+#define XtNleftMargin "leftMargin"
+#define XtNrightMargin "rightMargin"
+
+typedef struct _OffTheSpotConversionClassRec*	OffTheSpotConversionWidgetClass;
+typedef struct _OffTheSpotConversionRec*		OffTheSpotConversionWidget;
+
+typedef struct _SeparateConversionClassRec*	SeparateConversionWidgetClass;
+typedef struct _SeparateConversionRec*		SeparateConversionWidget;
+
+extern WidgetClass offTheSpotConversionWidgetClass;
+extern WidgetClass separateConversionWidgetClass;
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/include/OffConvP.h	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,144 @@
+/* $Id: OffConvP.h,v 1.7 1999/01/07 03:06:23 ishisone Exp $ */
+/*
+ * Copyright (c) 1990  Software Research Associates, Inc.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted, provided
+ * that the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Software Research Associates not be
+ * used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission.  Software Research
+ * Associates makes no representations about the suitability of this software
+ * for any purpose.  It is provided "as is" without express or implied
+ * warranty.
+ *
+ * Author:  Makoto Ishisone, Software Research Associates, Inc., Japan
+ */
+
+#ifndef _OffTheSpotConversionP_h
+#define _OffTheSpotConversionP_h
+
+#include "ConvCtrlP.h"
+#include "OffConv.h"
+
+typedef struct {
+    Position	x, y;
+} DisplayLocation;
+
+typedef struct _fragment_ {
+    unsigned short from;	/* $BI=<(3+;OJ8;z0LCV(B */
+    unsigned short nchars;	/* $BI=<(J8;z?t(B */
+    XRectangle region;		/* $BI=<(NN0h(B */
+    struct _fragment_ *next;	/* $B<!$N%U%i%0%a%s%H(B */
+} DisplayFragment;
+
+typedef struct {
+    ICString seg;		/* $B%;%0%a%s%H(B */
+    short redrawpos;		/* $B=q$-D>$7$,I,MW$JJ8;z$N3+;O0LCV(B
+				 * (-1 $B$J$i=q$-D>$9I,MW$J$7(B)
+				 */
+    DisplayFragment *fragments;	/* $BI=<(%U%i%0%a%s%H(B */
+} DisplaySegment;
+
+
+/*
+ *	off-the-spot conversion control widget data structure
+ */
+
+typedef struct {
+    int empty;
+} OffTheSpotConversionClassPart;
+
+typedef struct _OffTheSpotConversionClassRec {
+    CoreClassPart	core_class;
+    CompositeClassPart	composite_class;
+    ShellClassPart	shell_class;
+    WMShellClassPart	wm_shell_class;
+    VendorShellClassPart	vendor_shell_class;
+    TransientShellClassPart	transient_shell_class;
+    ConversionControlClassPart	conversionControl_class;
+    OffTheSpotConversionClassPart offTheSpotConversion_class;
+} OffTheSpotConversionClassRec;
+
+extern OffTheSpotConversionClassRec offTheSpotConversionClassRec;
+
+typedef struct {
+    /* resources */
+    Dimension	leftmargin;
+    Dimension	rightmargin;
+    /* private state */
+    Widget	displayobj;
+    Widget	selectionshell;
+    Widget	selectionwidget;
+    Widget	formwidget;
+    Widget	modewidget;
+    Widget	modeshell;
+    Widget	modedisplayobj;
+    Widget	canvaswidget;
+    DisplayLocation	cursorlocation;
+    Boolean	cursorvisible;
+    DisplaySegment	*dispsegments;
+    Cardinal	numsegments;
+    Cardinal	dispsegmentsize;
+    ICString	*candlist;
+    Cardinal	numcands;
+    Boolean	selectionpoppedup;
+    Dimension	lineheight;
+    Position	ascent;
+    Widget	auxshell;
+    Widget	auxwidget;
+    Boolean	auxpoppedup;
+} OffTheSpotConversionPart;
+
+typedef struct _OffTheSpotConversionRec {
+    CorePart		core;
+    CompositePart	composite;
+    ShellPart		shell;
+    WMShellPart		wm;
+    VendorShellPart	vendor;
+    TransientShellPart	transient;	
+    ConversionControlPart	ccontrol;
+    OffTheSpotConversionPart	offthespot;
+} OffTheSpotConversionRec;
+
+
+/*
+ *	separate conversion control widget data structure
+ */
+
+typedef struct {
+    int empty;
+} SeparateConversionClassPart;
+
+typedef struct _SeparateConversionClassRec {
+    CoreClassPart	core_class;
+    CompositeClassPart	composite_class;
+    ShellClassPart	shell_class;
+    WMShellClassPart	wm_shell_class;
+    VendorShellClassPart	vendor_shell_class;
+    TransientShellClassPart	transient_shell_class;
+    ConversionControlClassPart	conversionControl_class;
+    OffTheSpotConversionClassPart offTheSpotConversion_class;
+    SeparateConversionClassPart separateConversion_class;
+} SeparateConversionClassRec;
+
+extern SeparateConversionClassRec separateConversionClassRec;
+
+typedef struct {
+    Widget	formwidget;
+} SeparateConversionPart;
+
+typedef struct _SeparateConversionRec {
+    CorePart		core;
+    CompositePart	composite;
+    ShellPart		shell;
+    WMShellPart		wm;
+    VendorShellPart	vendor;
+    TransientShellPart	transient;	
+    ConversionControlPart	ccontrol;
+    OffTheSpotConversionPart	offthespot;
+    SeparateConversionPart	separate;
+} SeparateConversionRec;
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/include/OnConv.h	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,57 @@
+/* $Id: OnConv.h,v 10.6 1999/05/18 08:53:18 ishisone Exp $ */
+/*
+ * Copyright (c) 1990  Software Research Associates, Inc.
+ * Copyright (c) 1999  Kazuki YASUMATSU
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted, provided
+ * that the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Software Research Associates not be
+ * used in adntising or publicity pertaining to distribution of the
+ * software without specific, written prior permission.  Software Research
+ * Associates makes no representations about the suitability of this software
+ * for any purpose.  It is provided "as is" without express or implied
+ * warranty.
+ *
+ * Author:  Makoto Ishisone, Software Research Associates, Inc., Japan
+ * Author:  Kazuki YASUMATSU (Kazuki.Yasumatsu@fujixerox.co.jp)
+ */
+
+
+#ifndef _OnTheSpotConversion_h
+#define _OnTheSpotConversion_h
+
+/* OnTheSpotConversion widget public header file */
+
+#include "ConvCtrl.h"
+
+#define XtNpreeditStartCallback	"preeditStartCallback"
+#define XtNpreeditDoneCallback	"preeditDoneCallback"
+#define XtNpreeditDrawCallback	"preeditDrawCallback"
+#define XtNpreeditCaretCallback	"preeditCaretCallback"
+#define XtNstatusStartCallback	"statusStartCallback"
+#define XtNstatusDoneCallback	"statusDoneCallback"
+#define XtNstatusDrawCallback	"statusDrawCallback"
+#define XtNfeedbackAttributes	"feedbackAttributes"
+#define XtCFeedbackAttributes	"FeedbackAttributes"
+
+typedef struct {
+    int		caret;		/* cursor offset within pre-edit string */
+    int		chg_first;	/* starting change position */
+    int		chg_length;	/* length of the change in character count */
+    Atom	encoding;	/* text encoding e.g. COMPOUND_TEXT */
+    int		format;		/* text format (8/16/32) */
+    int		text_length;	/* text length */
+    XtPointer	text;		/* text data */
+    int		attrs_length;	/* attributes length */
+    unsigned long *attrs;	/* attributes of the text */
+} OCCPreeditDrawArg;
+
+typedef struct _OnTheSpotConversionClassRec*	OnTheSpotConversionWidgetClass;
+typedef struct _OnTheSpotConversionRec*		OnTheSpotConversionWidget;
+
+extern WidgetClass onTheSpotConversionWidgetClass;
+
+#endif
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/include/OnConvP.h	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,101 @@
+/* $Id: OnConvP.h,v 10.5 1999/05/18 08:53:19 ishisone Exp $ */
+/*
+ * Copyright (c) 1990  Software Research Associates, Inc.
+ * Copyright (c) 1999  Kazuki YASUMATSU
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted, provided
+ * that the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Software Research Associates not be
+ * used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission.  Software Research
+ * Associates makes no representations about the suitability of this software
+ * for any purpose.  It is provided "as is" without express or implied
+ * warranty.
+ *
+ * Author:  Makoto Ishisone, Software Research Associates, Inc., Japan
+ * Author:  Kazuki YASUMATSU (Kazuki.Yasumatsu@fujixerox.co.jp)
+ */
+
+
+#ifndef _OnTheSpotConversionP_h
+#define _OnTheSpotConversionP_h
+
+#include "ConvCtrlP.h"
+#include "OnConv.h"
+
+#define XtRFeedbackAttributes	"FeedbackAttributes"
+
+typedef struct {
+    ICString seg;		/* $B%;%0%a%s%H(B */
+} DisplaySegment;
+
+typedef struct {
+    unsigned long feedbacks[4];
+#define FEEDBACK_NOCONV		0	/* for non-converted segment */
+#define FEEDBACK_CONV		1	/* converted but not current */
+#define FEEDBACK_CURRENT	2	/* converted and current */
+#define FEEDBACK_CURRENTSUB	3	/* converted and current subsegment */
+} FeedbackAttributes;
+
+/*
+ *	on-the-spot conversion control widget data structure
+ */
+
+typedef struct {
+    int empty;
+} OnTheSpotConversionClassPart;
+
+typedef struct _OnTheSpotConversionClassRec {
+    CoreClassPart	core_class;
+    CompositeClassPart	composite_class;
+    ShellClassPart	shell_class;
+    WMShellClassPart	wm_shell_class;
+    VendorShellClassPart	vendor_shell_class;
+    TransientShellClassPart	transient_shell_class;
+    ConversionControlClassPart	conversionControl_class;
+    OnTheSpotConversionClassPart onTheSpotConversion_class;
+} OnTheSpotConversionClassRec;
+
+extern OnTheSpotConversionClassRec onTheSpotConversionClassRec;
+
+typedef struct {
+    /* resources */
+    XtCallbackList	preeditstartcallback;
+    XtCallbackList	preeditdonecallback;
+    XtCallbackList	preeditdrawcallback;
+    XtCallbackList	preeditcaretcallback;
+    XtCallbackList	statusstartcallback;
+    XtCallbackList	statusdonecallback;
+    XtCallbackList	statusdrawcallback;
+    FeedbackAttributes	feedbackattrs;
+    /* private state */
+    Widget	selectionshell;
+    Widget	selectionwidget;
+    Widget	auxshell;
+    Widget	auxwidget;
+    DisplaySegment	*dispsegments;
+    Cardinal	numsegments;
+    Cardinal	dispsegmentsize;
+    ICString	*candlist;
+    Cardinal	numcands;
+    Boolean	selectionpoppedup;
+    Boolean	auxpoppedup;
+    Cardinal	lastcaret;
+    Boolean	fixnotify;
+} OnTheSpotConversionPart;
+
+typedef struct _OnTheSpotConversionRec {
+    CorePart		core;
+    CompositePart	composite;
+    ShellPart		shell;
+    WMShellPart		wm;
+    VendorShellPart	vendor;
+    TransientShellPart	transient;	
+    ConversionControlPart	ccontrol;
+    OnTheSpotConversionPart	onthespot;
+} OnTheSpotConversionRec;
+
+#endif
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/include/OverConv.h	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,57 @@
+/* $Id: OverConv.h,v 1.8 1999/02/04 08:59:14 ishisone Exp $ */
+/*
+ * Copyright (c) 1990  Software Research Associates, Inc.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted, provided
+ * that the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Software Research Associates not be
+ * used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission.  Software Research
+ * Associates makes no representations about the suitability of this software
+ * for any purpose.  It is provided "as is" without express or implied
+ * warranty.
+ *
+ * Author:  Makoto Ishisone, Software Research Associates, Inc., Japan
+ */
+
+#ifndef _OverTheSpotConversion_h
+#define _OverTheSpotConversion_h
+
+/* OverTheSpotConversion widget public header file */
+
+#include "ConvCtrl.h"
+
+#define XtNspotX "spotX"
+#define XtNspotY "spotY"
+#define XtNautoSpotForwarding "autoSpotForwarding"
+#define XtCAutoSpotForwarding "AutoSpotForwarding"
+#define XtNlineSpacing "lineSpacing"
+#define XtCLineSpacing "LineSpacing"
+#define XtNmodeLocation "modeLocation"
+#define XtCModeLocation "ModeLocation"
+#define XtNshrinkWindow "shrinkWindow"
+#define XtCShrinkWindow "ShrinkWindow"
+#define XtNignoreStatusAreaSpec "ignoreStatusAreaSpec"
+#define XtCIgnoreStatusAreaSpec "IgnoreStatusAreaSpec"
+#define XtNmodeBorderForeground "modeBorderForeground"
+#define XtCModeBorderForeground "ModeBorderForeground"
+#define XtNuseOverrideShellForMode "useOverrideShellForMode"
+#define XtCUseOverrideShellForMode "UseOverrideShellForMode"
+
+typedef enum {
+    ModeTopLeft,	/* top-left of the client window */
+    ModeTopRight,	/* top-right			 */
+    ModeBottomLeft,	/* bottom-left			 */
+    ModeBottomRight,	/* bottom-right			 */
+    ModeTrackText,	/* tracks text-in-conversion	 */
+    ModeNone		/* not displeyed		 */
+} ModeLocation;
+
+typedef struct _OverTheSpotConversionClassRec*	OverTheSpotConversionWidgetClass;
+typedef struct _OverTheSpotConversionRec*		OverTheSpotConversionWidget;
+
+extern WidgetClass overTheSpotConversionWidgetClass;
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/include/OverConvP.h	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,143 @@
+/* $Id: OverConvP.h,v 1.18 1999/02/04 08:59:14 ishisone Exp $ */
+/*
+ * Copyright (c) 1990  Software Research Associates, Inc.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted, provided
+ * that the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Software Research Associates not be
+ * used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission.  Software Research
+ * Associates makes no representations about the suitability of this software
+ * for any purpose.  It is provided "as is" without express or implied
+ * warranty.
+ *
+ * Author:  Makoto Ishisone, Software Research Associates, Inc., Japan
+ */
+
+#ifndef _OverTheSpotConversionP_h
+#define _OverTheSpotConversionP_h
+
+#include "ConvCtrlP.h"
+#include "OverConv.h"
+
+#define XtRModeLocation "ModeLocation"
+
+typedef struct _canvasrec_ {
+    Widget	canvas;
+    Position	x, y;
+    Position	maxx, maxy;	/* for canvas reconfiguration */
+    Boolean	shouldpopup;
+    Boolean	poppedup;
+    struct _canvasrec_	*next;
+} TextCanvas;
+
+typedef struct {
+    TextCanvas	*canvas;
+    Position	x, y;
+} DisplayLocation;
+
+typedef struct _fragment_ {
+    unsigned short from;	/* $BI=<(3+;OJ8;z0LCV(B */
+    unsigned short nchars;	/* $BI=<(J8;z?t(B */
+    TextCanvas *canvas;		/* $BI=<($9$k%-%c%s%P%9(B ($B?F(B widget $B$H$O8B$i$J$$(B) */
+    XRectangle region;		/* $BI=<(NN0h(B */
+    struct _fragment_ *next;	/* $B<!$N%U%i%0%a%s%H(B */
+} DisplayFragment;
+
+typedef struct {
+    ICString seg;		/* $B%;%0%a%s%H(B */
+    short redrawpos;		/* $B=q$-D>$7$,I,MW$JJ8;z$N3+;O0LCV(B
+				 * (-1 $B$J$i=q$-D>$9I,MW$J$7(B)
+				 */
+    DisplayFragment *fragments;	/* $BI=<(%U%i%0%a%s%H(B */
+} DisplaySegment;
+
+
+/*
+ *	over-the-spot conversion control widget data structure
+ */
+
+typedef struct {
+    int empty;
+} OverTheSpotConversionClassPart;
+
+typedef struct _OverTheSpotConversionClassRec {
+    CoreClassPart	core_class;
+    CompositeClassPart	composite_class;
+    ShellClassPart	shell_class;
+    WMShellClassPart	wm_shell_class;
+    VendorShellClassPart	vendor_shell_class;
+    TransientShellClassPart	transient_shell_class;
+    ConversionControlClassPart	conversionControl_class;
+    OverTheSpotConversionClassPart overTheSpotConversion_class;
+} OverTheSpotConversionClassRec;
+
+extern OverTheSpotConversionClassRec overTheSpotConversionClassRec;
+
+typedef struct {
+    /* resources */
+    Position	spotx, spoty;
+    Boolean	spotforwarding;
+    Dimension	linespacing;
+    XRectangle	clientarea;
+    ModeLocation	modelocation;
+    Boolean	shrinkwindow;
+    Boolean	ignorestatusarea;
+    Boolean	borderforeground;	/* force the border color to be same
+					 * as foreground color
+					 */
+    Boolean	useoverride;		/* use overrideShell widget for the
+					 * mode displaying shell, instead
+					 * of the default transient shell
+					 */
+    /* private state */
+    Atom	wm_state;	/* WM_STATE atom */
+    Widget	displayobj;
+    Widget	selectionshell;
+    Widget	selectionwidget;
+    Widget	selectiondisplayobj;
+    Widget	auxshell;
+    Widget	auxwidget;
+    Widget	auxdisplayobj;
+    Widget	modeshell;
+    Widget	modewidget;
+    Widget	modedisplayobj;
+    Boolean	modelocationspecified;
+    Widget	modeshell_fix, modewidget_fix, modedisplayobj_fix;
+    Widget	modeshell_float, modewidget_float, modedisplayobj_float;
+    Colormap	colormap;
+    Pixel	background;
+    Cursor	canvascursor;
+    Position	focusoffsetx;
+    Position	focusoffsety;
+    TextCanvas	*canvaslist;
+    TextCanvas	*overflowcanvas;
+    Position	overflowoffset;
+    DisplayLocation	cursorlocation;
+    Boolean	cursorvisible;
+    DisplaySegment	*dispsegments;
+    Cardinal	numsegments;
+    Cardinal	dispsegmentsize;
+    ICString	*candlist;
+    Cardinal	numcands;
+    Boolean	selectionpoppedup;
+    Boolean	auxpoppedup;
+    Position	ascent;
+    Dimension	lineheight;
+    Dimension	saved_bw;
+} OverTheSpotConversionPart;
+
+typedef struct _OverTheSpotConversionRec {
+    CorePart		core;
+    CompositePart	composite;
+    ShellPart		shell;
+    WMShellPart		wm;
+    VendorShellPart	vendor;
+    TransientShellPart	transient;	
+    ConversionControlPart	ccontrol;
+    OverTheSpotConversionPart	overthespot;
+} OverTheSpotConversionRec;
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/include/ParseKey.h	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,31 @@
+/* $Id: ParseKey.h,v 1.1 1994/05/16 05:42:45 ishisone Rel $ */
+/*
+ * Copyright (c) 1991, 1994  Software Research Associates, Inc.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted, provided
+ * that the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Software Research Associates not be
+ * used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission.  Software Research
+ * Associates makes no representations about the suitability of this software
+ * for any purpose.  It is provided "as is" without express or implied
+ * warranty.
+ *
+ * Author:  Makoto Ishisone, Software Research Associates, Inc., Japan
+ */
+
+#ifndef _ParseKey_h
+#define _ParseKey_h
+
+extern int ParseKeyEvent(
+#if NeedFunctionPrototypes
+	String		/* s */,
+	KeySym *	/* keysymp */,
+	long *		/* modp */,
+	long *		/* chkmodp */
+#endif
+);
+
+#endif /* _ParseKey_h */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/include/Sj3.h	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,97 @@
+/* $Id: Sj3.h,v 2.1 1992/06/09 03:55:37 nao Exp $ */
+/*
+ * Copyright (c) 1990  Software Research Associates, Inc.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted, provided
+ * that the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Software Research Associates not be
+ * used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission.  Software Research
+ * Associates makes no representations about the suitability of this software
+ * for any purpose.  It is provided "as is" without express or implied
+ * warranty.
+ *
+ * Author:  Makoto Ishisone, Software Research Associates, Inc., Japan
+ */
+
+/*
+ * Copyright 1991 Sony Corporation
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Sony not be used in advertising or
+ * publicity pertaining to distribution of the software without specific,
+ * written prior permission.  Sony makes no representations about the
+ * suitability of this software for any purpose.  It is provided "as is"
+ * without express or implied warranty.
+ *
+ * SONY DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL SONY
+ * BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
+ * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN 
+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+/*
+ * Author: Naoshi Suzuki, SONY Corporation.  (nao@sm.sony.co.jp)
+ */
+
+#ifndef _Sj3_h
+#define _Sj3_h
+
+#include "InputConv.h"
+
+/*
+  Sj3 new resources:
+
+  name          class       type        default     access
+  ----------------------------------------------------------------------------
+  sj3serv       Sj3serv     String      *1          CG
+  sj3serv2      Sj3serv2    String      *2          CG
+  sj3user       Sj3user     String      *3          CG
+  rkfile        Rkfile      String      *4          CG
+  sbfile        Sbfile      String      *5          CG
+  rcfile        Rcfile      String      *6          CG
+  hkfile        Hkfile      String      *7          CG
+  zhfile        Zhfile      String      *8          CG
+
+  note: *1) if not specified, use value of an environment variable "SJ3SERV"
+                if not specified an environment "SJ3SERV", read from sjrc file
+        *2) if not specified, use value of an environment variable "SJ3SERV2"
+                if not specified an environment "SJ3SERV2", read from sjrc file
+        *3) if not specified, use value of login name
+        *4) if not specified, use value of an environment variable "SJRK"
+        *5) if not specified, use value of an environment variable "SJSB"
+        *6) if not specified, use value of an environment variable "SJRC"
+        *7) if not specified, use value of an environment variable "SJHK"
+        *8) if not specified, use value of an environment variable "SJZH"
+*/
+
+#define XtNsj3serv      "sj3serv"
+#define XtCSj3serv      "Sj3serv"
+#define XtNsj3serv2     "sj3serv2"
+#define XtCSj3serv2     "Sj3serv2"
+#define XtNsj3user      "sj3user"
+#define XtCSj3user      "Sj3user"
+#define XtNrcfile       "rcfile"
+#define XtCRcfile       "Rcfile"
+#define XtNsbfile       "sbfile"
+#define XtCSbfile       "Sbfile"
+#define XtNrkfile       "rkfile"
+#define XtCRkfile       "Rkfile"
+#define XtNhkfile       "hkfile"
+#define XtCHkfile       "Hkfile"
+#define XtNzhfile       "zhfile"
+#define XtCZhfile       "Zhfile"
+
+typedef struct _Sj3ClassRec *Sj3ObjectClass;
+typedef struct _Sj3Rec      *Sj3Object;
+
+extern WidgetClass  sj3ObjectClass;
+
+#endif /* _Sj3_h */
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/include/Sj3P.h	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,100 @@
+/* $Id: Sj3P.h,v 2.0 1992/02/09 17:56:19 nao Exp $ */
+/*
+ * Copyright (c) 1990  Software Research Associates, Inc.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted, provided
+ * that the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Software Research Associates not be
+ * used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission.  Software Research
+ * Associates makes no representations about the suitability of this software
+ * for any purpose.  It is provided "as is" without express or implied
+ * warranty.
+ *
+ * Author:  Makoto Ishisone, Software Research Associates, Inc., Japan
+ */
+
+/*
+ * Copyright 1991 Sony Corporation
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Sony not be used in advertising or
+ * publicity pertaining to distribution of the software without specific,
+ * written prior permission.  Sony makes no representations about the
+ * suitability of this software for any purpose.  It is provided "as is"
+ * without express or implied warranty.
+ *
+ * SONY DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL SONY
+ * BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
+ * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN 
+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+/*
+ * Author: Naoshi Suzuki, SONY Corporation.  (nao@sm.sony.co.jp)
+ */
+
+#ifndef _Sj3P_h
+#define _Sj3P_h
+
+#include "InputConvP.h"
+
+#include "Sj3.h"
+#include "Xsj3clib.h"
+
+typedef struct {
+    int foo;
+} Sj3ClassPart;
+
+typedef struct _Sj3ClassRec {
+    ObjectClassPart     object_class;
+    InputConvClassPart  inputConv_class;
+    Sj3ClassPart        sj3_class;
+} Sj3ClassRec;
+
+typedef enum {
+    normal_state,
+    candidate_state, 
+    symbol_state,
+    hinsi_state 
+} Sj3State;
+
+typedef struct {
+
+    /* resources */
+    String              sj3serv;
+    String              sj3serv2;
+    String              sj3user;
+    String              rcfile;
+    String              rkfile;
+    String              hkfile;
+    String              zhfile;
+    String              sbfile;
+
+    /* private data */
+    Xsj3cBuf            sj3buf;
+    Sj3State            state;
+    ICString           *candlist;
+    int                 candlistsize;
+    int                 numcand;
+    int                 curcand;
+    ICString           *symbollist;
+    int                 cursymbol;
+    ICString           *hinsilist;
+    int                 curhinsi; 
+    Boolean             selectionending;
+} Sj3Part;
+
+typedef struct _Sj3Rec {
+    ObjectPart          object;
+    InputConvPart       inputConv;
+    Sj3Part             sj3;
+} Sj3Rec;
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/include/WStr.h	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,81 @@
+/*
+ *	WStr.h -- header file for Wide-Character String Library
+ */
+
+/*
+ * Copyright (c) 1989  Software Research Associates, Inc.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted, provided
+ * that the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Software Research Associates not be
+ * used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission.  Software Research
+ * Associates makes no representations about the suitability of this software
+ * for any purpose.  It is provided "as is" without express or implied
+ * warranty.
+ *
+ * Author:  Makoto Ishisone, Software Research Associates, Inc., Japan
+ *		ishisone@sra.co.jp
+ */
+
+/* $Id: WStr.h,v 2.1 1991/09/23 05:32:48 ishisone Rel $ */
+
+#ifndef _WStr_h
+#define _WStr_h
+
+#ifndef WCHAR_DEFINED
+#define WCHAR_DEFINED
+typedef unsigned short	wchar;
+#endif
+
+/* for backward compatibility... */
+#define convWStoLatin1	convJWStoLatin1
+#define convLatin1toWS	convLatin1toJWS
+#define convWStoJIS	convJWStoJIS
+#define convJIStoWS	convJIStoJWS
+#define convWStoEUC	convJWStoEUC
+#define convEUCtoWS	convEUCtoJWS
+#define convWStoSJIS	convJWStoSJIS
+#define convSJIStoWS	convSJIStoJWS
+
+#if __STDC__ == 1
+extern int convJWStoLatin1(wchar *, unsigned char *);
+extern int convLatin1toJWS(unsigned char *, wchar *);
+extern int convJWStoJIS(wchar *, unsigned char *);
+extern int convJIStoJWS(unsigned char *, wchar *);
+extern int convJWStoEUC(wchar *, unsigned char *);
+extern int convEUCtoJWS(unsigned char *, wchar *);
+extern int convJWStoSJIS(wchar *, unsigned char *);
+extern int convSJIStoJWS(unsigned char *, wchar *);
+extern wchar *wstrcat(wchar *, wchar *);
+extern wchar *wstrncat(wchar *, wchar *, int);
+extern int wstrcmp(wchar *, wchar *);
+extern int wstrncmp(wchar *, wchar *, int);
+extern wchar *wstrcpy(wchar *, wchar *);
+extern wchar *wstrncpy(wchar *, wchar *, int);
+extern int wstrlen(wchar *);
+extern wchar *windex(wchar *, wchar);
+extern wchar *wrindex(wchar *, wchar);
+#else
+extern int convJWStoLatin1();
+extern int convLatin1toJWS();
+extern int convJWStoJIS();
+extern int convJIStoJWS();
+extern int convJWStoEUC();
+extern int convEUCtoJWS();
+extern int convJWStoSJIS();
+extern int convSJIStoJWS();
+extern wchar *wstrcat();
+extern wchar *wstrncat();
+extern int wstrcmp();
+extern int wstrncmp();
+extern wchar *wstrcpy();
+extern wchar *wstrncpy();
+extern int wstrlen();
+extern wchar *windex();
+extern wchar *wrindex();
+#endif
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/include/WcharDisp.h	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,88 @@
+/* $Id: WcharDisp.h,v 1.4 1991/09/17 10:08:27 ishisone Rel $ */
+/*
+ * Copyright (c) 1990  Software Research Associates, Inc.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted, provided
+ * that the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Software Research Associates not be
+ * used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission.  Software Research
+ * Associates makes no representations about the suitability of this software
+ * for any purpose.  It is provided "as is" without express or implied
+ * warranty.
+ *
+ * Author:  Makoto Ishisone, Software Research Associates, Inc., Japan
+ */
+
+#ifndef _WcharDisplay_h
+#define _WcharDisplay_h
+
+/* WcharDisplay and JpWcharDisplay object public header file */
+
+/*
+  WcharDisplay new resources:
+
+  name		class		type		default		access
+  ----------------------------------------------------------------------------
+  fontG0	Font		FontStruct	XtDefaultFont	CSG
+  fontG1	Font		FontStruct	NULL		CSG
+  fontG2	Font		FontStruct	NULL		CSG
+  fontG3	Font		FontStruct	NULL		CSG
+  fontMapping	FontMapping	FontMappng	GL/GL/GL/GL	CSG
+
+
+  JpWcharDisplay new resources:
+
+  name		class		type		default	access	note
+  ----------------------------------------------------------------------------
+  font		Font		FontStruct	*1	CSG	*4
+  kanjiFont	KanjiFont	FontStruct	*2	CSG	*5
+  kanaFont	KanaFont	FontStruct	*3	CSG	*6
+
+  *1) "-Misc-Fixed-Medium-R-*--14-*-*-*-C-*-ISO8859-1"
+  *2) "-Misc-Fixed-Medium-R-*--14-*-*-*-C-*-JISX0208.1983-0"
+  *3) "-Misc-Fixed-Medium-R-*--14-*-*-*-C-*-JISX0201.1976-0"
+
+  note: *4) this resource overrides superclass's fontG0 resource
+	*5) this resource overrides superclass's fontG1 resource
+	*6) this resource overrides superclass's fontG2 resource
+
+
+  JpWcharDisplay override resource:
+
+  name		class		type		default	access	note
+  ----------------------------------------------------------------------------
+  fontMapping	FontMapping	FontMappng	GL/GL/GR/GL	CSG
+
+*/
+
+#include "ConvDisp.h"
+#include "WStr.h"
+
+#define XtNfontG0 "fontG0"
+#define XtNfontG1 "fontG1"
+#define XtNfontG2 "fontG2"
+#define XtNfontG3 "fontG3"
+
+#define XtNfontMapping "fontMapping"
+#define XtCFontMapping "FontMapping"
+
+#define XtNkanjiFont "kanjiFont"
+#define XtCKanjiFont "KanjiFont"
+#define XtNkanaFont "kanaFont"
+#define XtCKanaFont "KanaFont"
+
+typedef struct _WcharDisplayClassRec	*WcharDisplayObjectClass;
+typedef struct _WcharDisplayRec		*WcharDisplayObject;
+
+extern WidgetClass	wcharDisplayObjectClass;
+
+typedef struct _JpWcharDisplayClassRec	*JpWcharDisplayObjectClass;
+typedef struct _JpWcharDisplayRec	*JpWcharDisplayObject;
+
+extern WidgetClass	jpWcharDisplayObjectClass;
+
+#endif /* _WcharDisplay_h */
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/include/WcharDispP.h	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,111 @@
+/* $Id: WcharDispP.h,v 1.6 1991/09/17 10:08:59 ishisone Rel $ */
+/*
+ * Copyright (c) 1990  Software Research Associates, Inc.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted, provided
+ * that the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Software Research Associates not be
+ * used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission.  Software Research
+ * Associates makes no representations about the suitability of this software
+ * for any purpose.  It is provided "as is" without express or implied
+ * warranty.
+ *
+ * Author:  Makoto Ishisone, Software Research Associates, Inc., Japan
+ */
+
+#ifndef _WcharDisplayP_h
+#define _WcharDisplayP_h
+
+#include "ConvDispP.h"
+#include "WcharDisp.h"
+#include "XWStr.h"
+
+
+#define XtRFontMapping "FontMapping"
+
+typedef struct {
+    String charset;	/* <registry>-<encoding> ex) "JIX0208.1983-0" */
+    int flag;
+#define G0LCharSet	(1<<0)		/* font for G0 chars. use GL */
+#define G0RCharSet	(1<<1)		/* font for G0 chars. use GR */
+#define G1LCharSet	(1<<2)
+#define G1RCharSet	(1<<3)
+#define G2LCharSet	(1<<4)
+#define G2RCharSet	(1<<5)
+#define G3LCharSet	(1<<6)
+#define G3RCharSet	(1<<7)
+} WDCharSet;
+
+typedef struct {
+    WDCharSet *charset_specs;
+    Cardinal num_specs;
+} WcharDisplayClassPart;
+
+typedef struct _WcharDisplayClassRec {
+    ObjectClassPart object_class;
+    ConvDisplayClassPart convDisplay_class;
+    WcharDisplayClassPart wcharDisplay_class;
+} WcharDisplayClassRec;
+
+typedef struct {
+    Boolean grmapping[4];
+} FontMapping;
+
+typedef struct {
+    /* resources */
+    XFontStruct *defaultfonts[4];	/* default fonts */
+    FontMapping defaultmapping;		/* use GR or not */
+    /* private state */
+    WDCharSet *charset_specs;		/* same as the one in class structure.
+					 * just for convenience
+					 */
+    FontSpec *fontspecs;
+    Cardinal num_specs;
+    XFontStruct *fonts[4];		/* fonts now in use */
+    Boolean grmapping[4];
+    Pixmap stipple;			/* Stipple Bitmap */
+    XWSGC gcset_normal;
+    XWSGC gcset_rev;
+    GC gc_normal;
+    GC gc_stipple;
+    int fontheight;
+    int ascent;
+} WcharDisplayPart;
+
+typedef struct _WcharDisplayRec {
+    ObjectPart  object;
+    ConvDisplayPart convDisplay;
+    WcharDisplayPart wcharDisplay;
+} WcharDisplayRec;
+
+extern WcharDisplayClassRec wcharDisplayClassRec;
+
+
+typedef struct {
+    int empry;
+} JpWcharDisplayClassPart;
+
+typedef struct _JpWcharDisplayClassRec {
+    ObjectClassPart object_class;
+    ConvDisplayClassPart convDisplay_class;
+    WcharDisplayClassPart wcharDisplay_class;
+    JpWcharDisplayClassPart jpWcharDisplay_class;
+} JpWcharDisplayClassRec;
+
+typedef struct {
+    int empty;
+} JpWcharDisplayPart;
+
+typedef struct _JpWcharDisplayRec {
+    ObjectPart  object;
+    ConvDisplayPart convDisplay;
+    WcharDisplayPart wcharDisplay;
+    JpWcharDisplayPart jpWcharDisplay;
+} JpWcharDisplayRec;
+
+extern JpWcharDisplayClassRec jpWcharDisplayClassRec;
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/include/XIMProto.h	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,301 @@
+/* @(#)XIMProto.h	2.1 91/07/03 11:28:53 FUJITSU LIMITED. */
+/******************************************************************
+
+    Copyright 1991, by FUJITSU LIMITED.
+    Copyright 1991, by Sun Microsystems, Inc.
+
+Permission to use, copy, modify, distribute, and sell this software
+and its documentation for any purpose is hereby granted without fee,
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in
+supporting documentation, and that the name of FUJITSU LIMITED or Sun
+Microsystems, Inc.  not be used in advertising or publicity pertaining
+to distribution of the software without specific, written prior
+permission.  FUJITSU LIMITED and Sun Microsystems, Inc. make no
+representations about the suitability of this software for any
+purpose.  It is provided "as is" without express or implied warranty.
+
+FUJITSU LIMITED AND SUN MICROSYSTEMS, INC. DISCLAIMS ALL WARRANTIES
+WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL FUJITSU LIMITED AND SUN
+MICROSYSTEMS, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF
+USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
+OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+PERFORMANCE OF THIS SOFTWARE.
+
+Author: Takashi Fujiwara     FUJITSU LIMITED
+			     fujiwara@a80.tech.yk.fujitsu.co.jp
+  Hideki Hiura (hhiura@Sun.COM)
+				     Sun Microsystems, Inc.
+******************************************************************/
+
+/* Ximp Protocol Version */
+#define XIMP_PROTOCOL_VERSION "XIMP.3.5"
+
+/* Input Context ID */
+typedef unsigned long ICID;
+
+/* ClientMessage No. */
+
+/* client <=> frontend  */
+#define  XIMP_KEYPRESS		 1
+
+/* client => frontend  */
+/* Base Protocol       */
+#define  XIMP_CREATE		 2
+#define  XIMP_DESTROY		 3
+#define  XIMP_BEGIN		 4
+#define  XIMP_END		 5
+#define  XIMP_SETFOCUS		 6
+#define  XIMP_UNSETFOCUS	 7
+#define  XIMP_CHANGE		 8
+#define  XIMP_MOVE		 9
+#define  XIMP_RESET		10
+#define  XIMP_SETVALUE		11
+#define  XIMP_GETVALUE		12
+
+/* Callback  Protocol  */
+#define  XIMP_PREEDITSTART_RETURN	20
+#define  XIMP_PREEDITCARET_RETURN	21
+
+/* frontend => client  */
+/* Base Protocol       */
+#define  XIMP_CREATE_RETURN	 2
+#define  XIMP_CONVERSION_BEGIN	30
+#define  XIMP_PROCESS_BEGIN	30
+#define  XIMP_CONVERSION_END	31
+#define  XIMP_PROCESS_END	31
+#define  XIMP_READPROP		32
+#define  XIMP_GETVALUE_RETURN	33
+#define  XIMP_RESET_RETURN	34
+
+/* Callback  Protocol  */
+#define  XIMP_GEOMETRY		40
+#define  XIMP_PREEDITSTART	41
+#define  XIMP_PREEDITDONE	42
+#define  XIMP_PREEDITDRAW	43
+#define  XIMP_PREEDITDRAW_CM	44
+#define  XIMP_PREEDITCARET	45
+#define  XIMP_STATUSSTART	46
+#define  XIMP_STATUSDONE	47
+#define  XIMP_STATUSDRAW	48
+#define  XIMP_STATUSDRAW_CM	49
+
+/* Extension Protocol */
+#define  XIMP_EXTENSION		90
+
+/* frontend = ERROR => client */
+#define  XIMP_ERROR		99
+
+/* Error Notify from IM Server */
+/* Detail Error Number */
+#define  XIMP_NoError			0	/* No Error */
+#define  XIMP_BadAlloc			1	/* Memeory Alloc Fail */
+#define  XIMP_BadStyle         		2	/* Unspported Input Style */
+#define  XIMP_BadClientWindow         	3	/* Invalid Client Window */
+#define  XIMP_BadFocusWindow		4	/* Invalid Focus Window */
+#define  XIMP_BadArea			5	/* Invalid Area */
+#define  XIMP_BadSpotLocation		6	/* SpotLocation Out Of Range */
+#define  XIMP_BadColormap		7	/* Invalid Colormap ID */
+#define  XIMP_BadAtom			8	/* Invalid Atom ID */
+#define  XIMP_BadPixel			9	/* Invalid Pixel Value */
+#define  XIMP_BadPixmap			10	/* Invalid Pixmap Value */
+#define  XIMP_BadName			11	/* Invalid Font Name */
+#define  XIMP_BadCursor			12	/* Invalid Cursor ID */
+#define  XIMP_BadProtocol		13	/* Invalid Protocol ID */
+#define  XIMP_BadProperty		14	/* Invalid Property Name */
+#define  XIMP_BadPropertyType		15	/* Invalid Property Type */
+
+/* Property Name */
+#define  _XIMP_PROTOCOL		"_XIMP_PROTOCOL"
+#define  _XIMP_BASE		"_XIMP_"	/* Root Window
+						 * _XIP_<locale_name> */
+
+/* IMS Window Property Name */
+#define  _XIMP_VERSION		"_XIMP_VERSION"
+#define  _XIMP_STYLE		"_XIMP_STYLE"
+#define  _XIMP_KEYS		"_XIMP_KEYS"
+#define  _XIMP_SERVERNAME	"_XIMP_SERVERNAME"
+#define  _XIMP_SERVERVERSION	"_XIMP_SERVERVERSION"
+#define  _XIMP_EXTENSIONS	"_XIMP_EXTENSIONS"
+#define  _XIMP_PREEDITMAXSIZE	"_XIMP_PREEDITMAXSIZE"
+#define  _XIMP_VENDORNAME	"_XIMP_VENDORNAME"
+
+/* Client Window Property Name */
+#define  _XIMP_LIBVERSION	"_XIMP_VERSION"
+#define  _XIMP_FOCUS		"_XIMP_FOCUS"
+#define  _XIMP_PREEDIT		"_XIMP_PREEDIT"
+#define  _XIMP_STATUS		"_XIMP_STATUS"
+#define  _XIMP_PREEDITFONT	"_XIMP_PREEDITFONT"
+#define  _XIMP_STATUSFONT	"_XIMP_STATUSFONT"
+
+#define  _XIMP_CTEXT		"_XIMP_CTEXT"
+
+/* CallBack Property Name */
+
+#define  _XIMP_PREEDIT_DRAW_DATA	"_XIMP_PREEDIT_DRAW_DATA"
+
+#define  _XIMP_FEEDBACKS		"_XIMP_FEEDBACKS"
+#define  _XIMP_PREEDITDRAWLENGTH 	"_XIMP_PREEDITDRAWLENGTH"
+#define  _XIMP_PREEDITDRAWSTRING 	"_XIMP_PREEDITDRAWSTRING"
+#define  _XIMP_PREEDITDRAWFEEDBACK 	"_XIMP_PREEDITDRAWFEEDBACK"
+
+/* CallBack Property Name / Type	X11R5	 */
+#define  _XIMP_EXT_XIMP_CHOICE_START_REQ       "_XIMP_EXT_XIMP_CHOICE_START_REQ"
+#define  _XIMP_EXT_XIMP_CHOICE_START_REP       "_XIMP_EXT_XIMP_CHOICE_START_REP"
+#define  _XIMP_EXT_XIMP_CHOICE_DRAW_REQ		"_XIMP_EXT_XIMP_CHOICE_DRAW_REQ"
+#define  _XIMP_EXT_XIMP_CHOICE_PROC_REQ		"_XIMP_EXT_XIMP_CHOICE_PROC_REQ"
+#define  _XIMP_EXT_XIMP_CHOICE_PROC_REP		"_XIMP_EXT_XIMP_CHOICE_PROC_REP"
+#define  _XIMP_EXT_XIMP_LOOKUPCHOICES		"_XIMP_EXT_XIMP_LOOKUPCHOICES"
+
+/* Lookup choise REQ and REP 	X11R5	 */
+#define  LOOKUP_CHOICES_BEGIN	        0
+#define  LOOKUP_CHOICES_START_REQ	1
+#define  LOOKUP_CHOICES_START_REP	2
+#define  LOOKUP_CHOICES_PROCESS_REQ	3
+#define  LOOKUP_CHOICES_PROCESS_REP	4
+#define  LOOKUP_CHOICES_DRAW_REQ	5
+#define  LOOKUP_CHOICES_DONE_REQ	6
+
+/* mask (XIMP_CREATE, XIMP_SETVALUE, XIMP_GETVALUE) */
+#define XIMP_FOCUS_WIN_MASK		(1L <<  0)
+#define XIMP_PRE_AREA_MASK		(1L <<  1)
+#define XIMP_PRE_FG_MASK		(1L <<  2)
+#define XIMP_PRE_BG_MASK		(1L <<  3)
+#define XIMP_PRE_COLORMAP_MASK		(1L <<  4)
+#define XIMP_PRE_BGPIXMAP_MASK		(1L <<  5)
+#define XIMP_PRE_LINESP_MASK		(1L <<  6)
+#define XIMP_PRE_CURSOR_MASK		(1L <<  7)
+#define XIMP_PRE_AREANEED_MASK		(1L <<  8)
+#define XIMP_PRE_SPOTL_MASK		(1L <<  9)
+#define XIMP_STS_AREA_MASK		(1L << 10)
+#define XIMP_STS_FG_MASK		(1L << 11)
+#define XIMP_STS_BG_MASK		(1L << 12)
+#define XIMP_STS_COLORMAP_MASK		(1L << 13)
+#define XIMP_STS_BGPIXMAP_MASK		(1L << 14)
+#define XIMP_STS_LINESP_MASK		(1L << 15)
+#define XIMP_STS_CURSOR_MASK		(1L << 16)
+#define XIMP_STS_AREANEED_MASK		(1L << 17)
+#define XIMP_STS_WINDOW_MASK		(1L << 18)
+#define XIMP_PRE_FONT_MASK		(1L << 19)
+#define XIMP_STS_FONT_MASK		(1L << 20)
+
+/* FRONTEND or BACKEND MODE */
+#define XIMP_FRONTEND	 0
+#define XIMP_BACKEND	 1
+
+/** XIMP_PREEDITDRAW_CM status value
+ * post Ximp 3.4 protocol maybe compliant. 
+ * XIMP status flag will may contain the supplementary infomations to 
+ * reassemble the XIMPreeditDrawCallbackStruct.
+ *	  +-----------------------------------------+
+ *	0 | XIMP_PREEDITDRAW_CM                     |
+ *	  +-----------------------------------------+
+ *	4 | ICID                                    |
+ *	  +-------------------+---------------------+
+ *	8 |PreeditDrawCBStatus|       caret         |
+ *	  +-------------------+---------------------+
+ *	12|      chg_first    |      chg_length     |
+ *	  +-------------------+---------------------+
+ *	16|               feedback                  |
+ *	  +-----------------------------------------+
+ * PreeditDrawCBStatus:
+ *    0x0001 no_text:  if 1, string == NULL (no following client message.)
+ *    0x0002 no_feedback: if 1 feedback == NULL
+ *    0x0004 feedbacks_via_property: if 1 , feedback field is property atom#
+ **/
+
+#define XIMP_PDCBSTATUS_NOTEXT 		0x0001
+#define XIMP_PDCBSTATUS_NOFEEDBACK 	0x0002
+#define XIMP_PDCBSTATUS_FEEDBACKS_VIA_PROP 0x0004
+
+/* _XIMP_KEYS   struct  */
+
+typedef struct {
+    unsigned long   modifier;
+    unsigned long   modifier_mask;
+    KeySym          keysym;
+}               Ximp_Key;
+
+typedef struct {
+    unsigned short  count_keys;
+    Ximp_Key       *keys_list;
+}               Ximp_KeyList;
+
+typedef struct _Ximp_Area {
+    long            x;
+    long            y;
+    long            width;
+    long            height;
+}               Ximp_AreaRec;
+
+typedef struct _Ximp_Point {
+    long            x;
+    long            y;
+}               Ximp_PointRec;
+
+typedef struct _Ximp_Size {
+    long            width;
+    long            height;
+}               Ximp_SizeRec;
+
+/* kana-kanji conversion window attributes */
+
+#define XIMP_PREEDIT_MAX_LONG 14
+#define XIMP_PREEDIT_MAX_CHAR 56
+
+typedef struct _Ximp_Preedit {
+    Ximp_AreaRec    Area;
+    unsigned long   Foreground;
+    unsigned long   Background;
+    Colormap        Colormap;
+    Pixmap          Bg_Pixmap;
+    long            LineSpacing;
+    Cursor          Cursor;
+    Ximp_SizeRec    AreaNeeded;
+    Ximp_PointRec   SpotLocation;
+}               Ximp_PreeditPropRec;
+
+#define XIMP_STATUS_MAX_LONG 13
+#define XIMP_STATUS_MAX_CHAR 52
+
+typedef struct _Ximp_Status {
+    Ximp_AreaRec    Area;
+    unsigned long   Foreground;
+    unsigned long   Background;
+    Colormap        Colormap;
+    Pixmap          Bg_Pixmap;
+    long            LineSpacing;
+    Cursor          Cursor;
+    Ximp_SizeRec    AreaNeeded;
+    Window          window;
+}               Ximp_StatusPropRec;
+
+/* for CallBack */
+typedef struct _Ximp_PreeditDrawDataPropRec {
+    long            caret;
+    long            chg_first;
+    long            chg_length;
+}               Ximp_PreeditDrawDataPropRec, *Ximp_PreeditDrawDataProp;
+
+/* for Commit, PreEditDraw, StatusDraw  03/07/12 	X11R5	 */
+typedef struct _Ximp_CommitPropRec {
+    unsigned long   icid;
+    char            size;
+    char            ctext[11];
+}               Ximp_CommitPropRec, Ximp_PreEditDrawCallbackPropRec,
+                Ximp_StatusDrawCallbackPropRec;
+
+/* for PreEditDraw	03/07/16 	X11R5	 */
+typedef struct {
+    short           chg_first;
+    short           chg_length;
+}               Ximp_slong;
+
+typedef union {
+    Ximp_slong      slong;
+    long            l;
+}               Ximp_uslong;
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/include/XWStr.h	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,80 @@
+/*
+ *	XWStr.h -- header file for X Wide-Character String Library
+ */
+
+/*
+ * Copyright (c) 1989  Software Research Associates, Inc.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted, provided
+ * that the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Software Research Associates not be
+ * used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission.  Software Research
+ * Associates makes no representations about the suitability of this software
+ * for any purpose.  It is provided "as is" without express or implied
+ * warranty.
+ *
+ * Author:  Makoto Ishisone, Software Research Associates, Inc., Japan
+ *		ishisone@sra.co.jp
+ */
+
+/* $Id: XWStr.h,v 2.2 1991/09/23 05:33:08 ishisone Rel $ */
+
+#ifndef _XWStr_h
+#define _XWStr_h
+
+#include "WStr.h"
+
+typedef struct {
+	GC		gc;
+	XFontStruct	*font;
+	int		flag;
+} FontEnt;
+
+typedef struct {
+	FontEnt	fe[4];
+} XWSGCSet;
+
+typedef XWSGCSet	*XWSGC;
+
+/* XWSGCSet.flag */
+#define TWOB		1	/* 2-byte character set */
+#define FONTQUERY	2	/* XQueryFont()'ed by this library */
+#define GCCREAT		4	/* XtGetGC()'ed by this library */
+#define GRMAPPING	8	/* use GR */
+
+#define	GSET(c)	((c) & 0x8000 ? ((c) & 0x80 ? 1 : 3) : ((c) & 0x80 ? 2 : 0))
+
+#if __STDC__ == 1
+/* function prototype */
+extern XWSGC XWSSetGCSet(Display *, GC, GC, GC, GC);
+#ifdef _XtIntrinsic_h
+extern XWSGC XtWSGetGCSet(Widget, unsigned long, XGCValues *,
+			  XFontStruct *, XFontStruct *,
+			  XFontStruct *, XFontStruct *);
+extern void XtWSReleaseGCSet(Widget, XWSGC);
+#endif
+extern void XWSSetMapping(XWSGC, int, int, int, int);
+extern void XtWSDestroyGCSet(XWSGC);
+extern int XWSDrawString(Display *, Drawable, XWSGC, int, int, wchar *, int);
+extern int XWSDrawImageString(Display *, Drawable, XWSGC,
+			      int, int, wchar *, int);
+extern void XWSFontHeight(XWSGC, wchar *, int, int *, int *);
+extern int XWSTextWidth(XWSGC, wchar *, int);
+extern void XWSTextExtents(XWSGC, wchar *, int, int *, int *, XCharStruct *);
+#else
+extern XWSGC XWSSetGCSet();
+extern XWSGC XtWSGetGCSet();
+extern void XtWSDestroyGCSet();
+extern void XtWSReleaseGCSet();
+extern void XWSSetMapping();
+extern int XWSDrawString();
+extern int XWSDrawImageString();
+extern void XWSFontHeight();
+extern int XWSTextWidth();
+extern void XWSTextExtents();
+#endif
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/include/Xatoklib.h	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,282 @@
+/*
+ * Copyright 1999 Justsystem Corporation, Japan.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and that
+ * both that copyright notice and this permission notice appear in
+ * supporting documentation, and that the name of Justsystem Corporation
+ * not be used in advertising or publicity pertaining to distribution
+ * of the software without specific, written prior permission.  Justsystem
+ * Corporation makes no representations about the suitability of this
+ * software for any purpose.  It is provided "as is" without express
+ * or implied warranty.
+ *
+ * Author: Atsushi Irisawa
+ */
+
+#ifndef	_xatoklib_h_
+#define	_xatoklib_h_
+
+#include <atok_typ.h>
+#include <atokce.h>
+#include <atok12net.h>
+#include <key_def.h>
+
+/* #include <stdio.h> /* for BUFSIZ? */
+#ifdef BUFSIZ
+#undef BUFSIZ
+#endif
+#define BUFSIZ	1024
+
+/* #define CAND_PAGE */
+#ifdef CAND_PAGE
+#undef CAND_PAGE
+#endif
+
+#define	CAND_ROWS	(9)
+#define	CAND_COLS	(1) 
+#include "WStr.h"
+
+typedef	struct	{
+    int		length;
+    int		size;
+    wchar	*string;
+    int		offset;
+} _XatokSegment;
+
+typedef enum {
+    OP_NONE = 0,
+    OP_NEXT,
+    OP_PREV,
+    OP_FIRST,
+    OP_LAST,
+    OP_SELECT,
+    OP_CANCEL,
+    OP_SPEC
+} _opType;
+
+typedef struct _menuItem MenuItem;
+typedef struct _menu MenuAux;
+typedef struct _menuItem {
+    WORD	key;
+    int		mode;
+    _opType	op;
+    MenuAux	*child;
+    char	*numStr;
+    char	*itemStr;
+} menuItem;
+
+typedef struct  _menu {
+    int		mode;
+    int		cur;
+    int		(*startProc)();
+    int		(*defaultProc)();
+    int		(*endProc)();
+    int		(*stringProc) ();
+    char	*str;
+    MenuAux	*parent;
+    menuItem	*items;
+    int		nitems;
+} menuAux;
+
+typedef	enum {
+    M_NOKEYCONV = 0,		/* $B%-!<%9%k!<(B */
+    M_KEYCONV   = (1L<<0),	/* $BJQ49Cf(B */
+    M_AUX       = (1L<<1),	/* AUX WINDOW $BC18lEPO?(B  */
+    M_CAND      = (1L<<2),	/* $B8uJdI=<(Cf(B */
+    M_SYSLINE   = (1L<<3),	/* $B%7%9%F%`9T(B */
+    M_WDEL      = (1L<<4)	/* $BC18l:o=|(B */
+} opMode;
+
+typedef	enum {
+    W_WORD	= (1L<<0),	/* $BC18l(B */
+    W_YOMI	= (1L<<1),	/* $B$h$_F~NOCf(B */
+    W_HINSHI	= (1L<<2),	/* $BIJ;lA*BrCf(B */
+    W_YORN	= (1L<<3),	/* $B=hM}3NG'(B */
+    W_RESULT	= (1L<<4)	/*  $B7k2LI=<((B */
+} wordMode;
+
+typedef enum {
+    M_TOP,			/* AUX $B%H%C%W%a%K%e!<(B */
+    M_WORDREG,			/* $BC18lEPO?(B */
+    M_CODE,			/* AUX CODE $B%a%K%e!<(B */
+    M_CODESJ,			/* $B%3!<%IF~NO(B SJIS */
+    M_CODEEUC,			/* $B%3!<%IF~NO(B EUC */
+    M_CODEJIS,			/* $B%3!<%IF~NO(B JIS */
+    M_CODEKUTEN,		/* $B%3!<%IF~NO6hE@(B */
+    M_KIGOU,			/* AUX $B5-9fF~NO%a%K%e!<(B */
+    M_NKIGOU,			/* 10 */
+    M_SKIGOU,
+    M_DICUTIL,			/* AUX $B<-=q%a%K%e!<(B */
+    M_WORD,			/* AUX $BC18lEPO?(B */
+    M_WORDR,
+    M_WORDD
+} menuMode;
+
+typedef	struct	{
+    WCHAR	name[64];
+    int		length;
+    WORD	modeKANDSP;	/* IME_PRV_SETKANDSP 1 - 4 
+					1 : $BJ?2>L>(B
+					2 : $BA43Q%+%?%+%J(B
+					3 : $BA43QL5JQ49(B
+					4 : $BH>3Q%+%?%+%J(B
+					5 : $BH>3QL5JQ49(B
+				 */
+    WORD	modeHEN;	/* IME_PRV_SETHENMODE 
+					0 : $BO"J8@a(B
+					1 : $BJ#J8@a(B
+					2 : $B<+F0(B
+				 */
+    WORD	modeGAKU;	/* IME_PRV_GAKMODE
+					0 : $B3X=,(BOFF
+					1 : $B3X=,(BON
+					2 : $B%a%b%j!<3X=,(B
+				 */
+    WORD	modeKOTE;	/* IME_SETKOTEMODE
+					0 : $B8GDjF~NO2r=|(B
+					1 : $B$R$i$,$J8GDj(B
+					2 : $BA43Q%+%?%+%J8GDj(B
+					3 : $BA43QL5JQ498GDj(B
+					4 : $BH>3Q%+%?%+%J8GDj(B
+					5 : $BH>3QL5JQ498GDj(B
+				*/
+    WORD	modeOKURI;	/* IME_PRV_SETOKURIMODE
+					0 : $BK\B'(B
+					1 : $BAw$k(B
+					2 : $B>J$/(B
+					3 : $BA4$F(B
+				 */
+    WORD	modeROT;	/* IME_PRV_SETROTMODEF
+					1 : $B4A;zF~NO(B
+					2 : $BH>3QF~NO(B
+					3 : $B%3!<%IF~NO(B
+					4 : $B5-9fF~NO(B
+				*/
+    /*int	changes;*/
+} _XatokMode;
+
+#define	WORD_HYOKI_MAX	64
+#define	WORD_YOMI_MAX	32
+
+/* #define NBR_OF_PART	(3) */
+#define	ATOK_NSEG	(3)
+
+typedef	struct	{
+    /* $B%5!<%P$H$N@\B3>pJs(B */
+    int		sock;				/* $B%5!<%P(B */
+    int		clntid;				/* $B%;%C%7%g%s(B */
+    int		ctxtid;				/* ID */
+    /* $B%;%0%a%s%H$N4IM}(B */
+    _XatokSegment segments[ATOK_NSEG+3];	/* $BL$3NDjJ8;zNs$N%;%0%a%s%H(B */
+    int		nbr_of_seg;			/* $B;HMQ$7$F$$$k%;%0%a%s%H?t(B */
+    int		cur_seg;			/* $B8=:_$N%;%0%a%s%H(B */
+    int		offset;
+
+    /* $B8=:_$NF~NO%b!<%I$N4IM}(B */
+    _XatokMode	mode;				/* $B%b!<%II=<(J8;zNs(B */
+    opMode	convStatus;			/* M_XXXX $B$r;2>H(B */
+    opMode	oldStatus;			/* M_XXXX $B$r;2>H(B */
+    int		candStatus;			/* 0 :
+						   1 : $B8uJdI=<(3+;O(B
+						   2 : $B8uJdI=<(Cf(B
+						   */
+    menuAux	*menuAux;
+    menuAux	*curAux;
+    int		menuStatus;
+
+    wchar	wbuf[BUFSIZ*4];			/* $B3NDjJ8;zNsMQ$N%P%C%U%!(B */
+    char	wrbuf[BUFSIZ*4];		/* $B3NDjJ8;zNsFI$_MQ$N%P%C%U%!(B */
+    int	wlen;					/* $B3NDjJ8;zNs$ND9$5(B */
+
+    /* $BJQ49CfJ8;zNsI=<(MQ%G!<%?NN0h(B */
+    wchar	echoStr[BUFSIZ*2];		/* $BJQ49CfMQJ8;zNs(B */
+    int		echoLen;			/* $BJQ49CfJ8;zNs$ND9$5(B */
+    int		revPos;				/* $BH?E>$r3+;O$9$k%]%8%7%g%s(B */
+    int		revLen;				/* $BH?E>J8;zNs$ND9$5(B */
+
+    /* AUX $B%&%#%s%I%&$NI=<(J8;zNs$N%G!<%?NN0h(B */
+    wchar	aux_echoStr[BUFSIZ*2];	
+    int		aux_echoLen;
+    int		aux_revPos;
+    int		aux_revLen;			/* $BH?E>J8;zNs$ND9$5(B */
+    int		aux_isopened; 
+
+    /*
+     * $BC18lEPO?$N$?$a$N%G!<%?(B
+     * $BC18l(B $BFI$_!"I=5-!"IJ;l>pJs!"IJ;lAm?t!"<-=q>pJs(B
+     */
+    int		wordStatus;
+    wchar	word_str[66+1];
+    wchar	word_yomi[66+1];
+    int		word_strLen;
+    int		word_yomiLen;
+    wordMode	word_mode;			/* 0 : $BI=5-F~NOCf(B
+						   1 : $BFI$_F~NOCf(B
+						   2 : $BIJ;lA*BrCf(B
+						   3 : $B<-=qA*BrCf(B
+						   */
+    int		word_hinshi;
+    int		hinsiNum;
+    ATOKDEHINSTR *hinsiPtr;
+    int		dicNum;
+    char	**dicPtr;
+
+    /* $B8uJdJ8;zNs$NNN0h(B */
+    int		kohoNum;			/* $B8uJd$N?t(B */
+    int		kohoNum2;
+    int		kohoPos;			/* $BA*Br$5$l$F$$$k8uJdHV9f(B */
+    int		kohoSize;			/* $B8uJd%G!<%?MQ%P%C%U%!%5%$%:(B */
+    int		kohoStrLen;			/* $B<hF@$7$F$$$k8uJdJ8;zNs?t(B */
+    WCHAR	*kohoStrPtr;			/* $B8uJdJ8;zNs(B */
+    BYTE	*kohoLenPtr;			/* $B3F8uJdJ8;zNs$ND9$5(B */
+    BYTE	*kohoSfxPtr;			/* ???? */
+    int		kohoCurPage;			/* $B8=:_I=<($7$F$$$k%Z!<%8(B */
+    int		kohoPageNbr;			/* $BA4%Z!<%8?t(B */
+    int		kohoMax;
+
+    wchar	sysLineStr[BUFSIZ];
+    WORD	*sysAttrPtr;
+    int		sysLineLen;
+    int		sysLineSize;
+    DWORD	guide_openEventIndex;
+    DWORD	guide_closeEventIndex;
+    DWORD	guide_OpenIndex;
+
+    /* $B%5!<%P$H$NDL?.%P%C%U%!(B */
+    AtokReqPacket	NETrqst;		/* $B%j%/%(%9%HMQ$NNN0h(B */
+    AtokRsltPacket	NETrslt;		/* $BJQ497k2LMQ$NNN0h(B */
+
+} _XatokRec, *_XatokRecPtr;
+
+
+typedef	enum {
+    XKEY_START		= (1L<<0),	/* $BJQ49%-!<(B */
+    XKEY_END		= (1L<<1),	/* $BJQ49=*N;(B */
+    XKEY_FIX		= (1L<<2),	/* $B3NDj(B */
+    XKEY_LEFT		= (1L<<3),	/* $B:8(B */
+    XKEY_RIGHT		= (1L<<4),	/* $B1&(B */
+    XKEY_UP		= (1L<<5),	/* $B>e(B */
+    XKEY_DOWN		= (1L<<6),	/* $B2<(B */
+    XKEY_FIRST		= (1L<<7),	/* $B@hF,(B */
+    XKEY_LAST		= (1L<<8),	/* $B:G8e(B */
+    XKEY_PREVP		= (1L<<9),	/* $BA0%Z!<%8(B */
+    XKEY_NEXTP		= (1L<<10),	/* $B<!%Z!<%8(B */
+    XKEY_CAND		= (1L<<11),	/* $B8uJd(B */
+    XKEY_SELECTED	= (1L<<12),	/* $BA*Br(B */
+    XKEY_CANCEL		= (1L<<13),	/* $B%-%c%s%;%k(B */
+    XKEY_START_SELECTION= (1L<<14),	/* $B8uJdI=<((B*/
+    XKEY_DICT		= (1L<<15),	/* $B<-=q(B */
+} XKEY_TYPE;
+
+
+#define	SetIsKakuteI(stat)	((stat) |= 1)
+#define	SetIsMode(stat)		((stat) |= 2)
+#define	IsKakutei(stat)		((stat) & 1)
+#define	IsMode(stat)		((stat) & 2)
+
+extern menuAux *getMenuInstance();
+extern menuAux *auxMenuCopy();
+
+#endif	/* !_xatoklib_h_ */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/include/XimpProto.h	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,67 @@
+/* $Id: XimpProto.h,v 1.5 1993/09/07 06:33:46 ishisone Rel $ */
+/*
+ * Copyright (c) 1991  Software Research Associates, Inc.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted, provided
+ * that the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Software Research Associates not be
+ * used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission.  Software Research
+ * Associates makes no representations about the suitability of this software
+ * for any purpose.  It is provided "as is" without express or implied
+ * warranty.
+ *
+ * Author:  Makoto Ishisone, Software Research Associates, Inc., Japan
+ */
+
+#ifndef _XimpProtocol_h
+#define _XimpProtocol_h
+
+#include "ICtypes.h"
+
+/*
+  XimpProtocol new resources:
+
+  name			class			type	default		access
+  ----------------------------------------------------------------------------
+  localeName		LocaleName		String	NULL		CG
+  serverName		ServerName		String	"kinput2"	CG
+  inputObjectClass	Class			Pointer	NULL		CG
+  displayObjectClass	Class			Pointer	NULL		CG
+  defaultFontList	FontList		String	NULL		CG
+  foreground		Foreground		Pixel	DefaultForeground
+									CG
+  forceDefaultServer	ForceDefaultServer	Boolean False		CG
+
+*/
+
+#define XtNlocaleName "localeName"
+#define XtCLocaleName "LocaleName"
+
+#define XtNserverName "serverName"
+#define XtCServerName "ServerName"
+
+#define XtNinputObjectClass "inputObjectClass"
+#define XtNdisplayObjectClass "displayObjectClass"
+#define XtCClass "Class"
+
+#define XtNdefaultFontList "defaultFontList"
+#define XtCFontList "FontList"
+
+#define XtNforceDefaultServer "forceDefaultServer"
+#define XtCForceDefaultServer "ForceDefaultServer"
+
+#define XtNconversionStartKeys "conversionStartKeys"
+#define XtCConversionStartKeys "ConversionStartKeys"
+
+#define XtNstatusWidth "statusWidth"
+#define XtCStatusWidth "StatusWidth"
+
+typedef struct _XimpProtocolClassRec*	XimpProtocolWidgetClass;
+typedef struct _XimpProtocolRec*	XimpProtocolWidget;
+
+extern WidgetClass ximpProtocolWidgetClass;
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/include/XimpProtoP.h	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,167 @@
+/* $Id: XimpProtoP.h,v 1.12 1999/01/13 08:41:56 ishisone Exp $ */
+/*
+ * Copyright (c) 1991  Software Research Associates, Inc.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted, provided
+ * that the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Software Research Associates not be
+ * used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission.  Software Research
+ * Associates makes no representations about the suitability of this software
+ * for any purpose.  It is provided "as is" without express or implied
+ * warranty.
+ *
+ * Author:  Makoto Ishisone, Software Research Associates, Inc., Japan
+ */
+
+#ifndef _XimpProtocolP_h
+#define _XimpProtocolP_h
+
+#include "FontBank.h"
+#include "XimpProto.h"
+#include "ConvCtrl.h"
+
+typedef struct {
+    int ximp_dummy;
+} XimpProtocolClassPart;
+
+typedef struct _XimpProtocolClassRec {
+    CoreClassPart		core_class;
+    XimpProtocolClassPart	ximpprotocol_class;
+} XimpProtocolClassRec;
+
+extern XimpProtocolClassRec ximpProtocolClassRec;
+
+
+typedef enum {
+    onthespot_style,
+    offthespot_style,
+    overthespot_style,
+    separate_style
+} ConversionStyle;
+
+typedef struct {
+    XIMStyle		ximstyle;
+    ConversionStyle	cstyle;
+} XimpInputStyle;
+
+typedef struct {
+    Position	areax, areay;
+    Dimension	areawidth, areaheight;
+    Pixel	foreground, background;
+    Colormap	colormap;
+    Pixmap	bgpixmap;
+    Dimension	linespacing;
+    Cursor	cursor;
+    Dimension	neededwidth, neededheight;
+    Position	spotx, spoty;
+    String	fontlist;
+} XimpPreEditAttributes;
+
+typedef struct {
+    Position	areax, areay;
+    Dimension	areawidth, areaheight;
+    Pixel	foreground, background;
+    Colormap	colormap;
+    Pixmap	bgpixmap;
+    Dimension	linespacing;
+    Cursor	cursor;
+    Dimension	neededwidth, neededheight;
+    Window	statuswin;
+    String	fontlist;
+} XimpStatusAttributes;
+
+typedef struct _convclient_ {
+    unsigned long	id;		/* ICID */
+    String		version;	/* client version string */
+    ConversionStyle	style;
+    Widget		protocolwidget;	/* protocol widget */
+    Widget		conversion;	/* conversion widget */
+    Window		reqwin;		/* conversion requestor window */
+    Dimension		reqwinwidth;
+    Dimension		reqwinheight;
+    Window		focuswin;	/* focus window */
+    Dimension		focuswidth;
+    Dimension		focusheight;
+    Atom		property;	/* property to store converted string*/
+    XimpPreEditAttributes	xpattrs; /* to keep specified values     */
+    XimpStatusAttributes	xsattrs; /*   for GETVALUE request       */
+    unsigned long	xattrmask;
+    Boolean		defaultsfilledin; /* if def.values are filled in */
+    EventSelectMethod	esm;
+    XFontStruct		**fonts;
+    int			num_fonts;
+    XFontStruct		**status_fonts;
+    int			num_status_fonts;
+    Boolean		resetting;	/* now resetting */
+    XClientMessageEvent	*event;		/* current processing event */
+    XIMStyle		ximstyle;
+    Boolean		in_preedit;
+    Boolean		in_status;
+    Atom		preeditdata;	/* property to store preedit data */
+    Atom		preedittext;	/* property to store preedit text */
+    Atom		preeditfeedback;/* property to store preedit feedback */
+    Atom		statustext;	/* property to store status text */
+    Atom		statusfeedback;	/* property to store status feedback */
+    struct _convclient_	*next;
+} ConvClient;
+
+typedef struct _ximpfcache_ {
+    int			sum;
+    String		namelist;
+    XFontStruct 	**fonts;
+    Cardinal		num_fonts;
+    struct _ximpfcache_	*next;
+} XimpFontListCache;
+
+
+typedef struct {
+    /* resources */
+    String localename;
+    String servername;
+    WidgetClass inputObjClass;
+    WidgetClass displayObjClass;
+    Boolean forceDefaultServer;
+    String defaultfontlist;		/* default font list to be used */
+    Pixel foreground;			/* default fg pixel */
+    String convkeys;			/* conversion start/end keys */
+    Dimension statuswidth;		/* default width of status area */
+    /* private state */
+    FontBank fontbank;
+    XFontStruct **deffonts;
+    int numdeffonts;
+    ConvClient *clients;
+    ConvClient *freeclients;	/* free list */
+    unsigned long icid;		/* next ICID */
+    int propid;
+    int callbackpropid;
+    /* atoms */
+    Atom selAtom1;		/* _XIMP_<localeName> */
+    Atom selAtom2;		/* _XIMP_<localeName>@<serverName>.<screen> */
+    Atom ctextAtom;		/* COMPOUND_TEXT */
+    Atom ximpVersionAtom;	/* _XIMP_VERSION */
+    Atom ximpStyleAtom;		/* _XIMP_STYLE */
+    Atom ximpKeysAtom;		/* _XIMP_KEYS */
+    Atom ximpServerNameAtom;	/* _XIMP_SERVERNAME */
+    Atom ximpServerVersionAtom;	/* _XIMP_SERVERVERSION */
+    Atom ximpVendorNameAtom;	/* _XIMP_VENDORNAME */
+    Atom ximpExtensionsAtom;	/* _XIMP_EXTENSIONS */
+    Atom ximpProtocolAtom;	/* _XIMP_PROTOCOL */
+    Atom ximpFocusAtom;		/* _XIMP_FOCUS */
+    Atom ximpPreeditAtom;	/* _XIMP_PREEDIT */
+    Atom ximpStatusAtom;	/* _XIMP_STATUS */
+    Atom ximpPreeditFontAtom;	/* _XIMP_PREEDITFONT */
+    Atom ximpStatusFontAtom;	/* _XIMP_STATUSFONT */
+    Atom ximpExtXimpBackFrontAtom; /* _XIMP_EXT_XIMP_BACK_FRONT */
+    Atom ximpPreeditDrawDataAtom; /* _XIMP_PREEDIT_DRAW_DATA */
+    Atom ximpFeedbacksAtom;	/* _XIMP_FEEDBACKS */
+} XimpProtocolPart;
+
+typedef struct _XimpProtocolRec {
+    CorePart		core;
+    XimpProtocolPart	ximp;
+} XimpProtocolRec;
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/include/Xsj3clib.h	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,459 @@
+/* $Id: Xsj3clib.h,v 2.2 1993/09/02 14:59:45 nao Exp $ */
+
+/*
+ * Author: Naoshi Suzuki, SONY Corporation.  (nao@sm.sony.co.jp)
+ */
+
+#ifndef _Xsj3clib_h
+#define _Xsj3clib_h
+
+#include    "sj3lib.h"
+#include    <X11/X.h>
+
+/* #define FORCE_SJIS */
+/* #define FORCE_JIS7 */
+/* #define FORCE_JIS8 */
+
+/*
+ * define for default conversion definition file
+ *          and resource file
+ */
+#ifndef SJ3DEFPATH
+#define SJ3DEFPATH              "/usr/lib/X11/sj3def/"
+#endif
+
+/*
+ * define for default include nesting limit
+ */
+#ifndef SJRC_INCLUDE_MAX
+#define SJRC_INCLUDE_MAX        10
+#endif
+
+#define DEF_SJRC_FILE           "sjrc"
+#define DEF_SJRK_FILE           "sjrk"
+#define DEF_SJHK_FILE           "sjhk"
+#define DEF_SJZH_FILE           "sjzh"
+#define DEF_SJSB_FILE           "sjsb"
+
+/*
+ * Kana-Kanji conversion control key event define
+ */
+#define KEY_NULL                (0L)
+#define KEY_HENKAN_START        (1L<<0)
+#define KEY_HENKAN_END          (1L<<1)
+#define KEY_MODE_CHANGE         (1L<<2)
+#define KEY_TEXT_CHANGE         (1L<<3)
+#define KEY_TEXT_FIXED          (1L<<4)
+#define KEY_TEXT_FLUSH          (1L<<5)
+#define KEY_CAND_START          (1L<<6)
+#define KEY_SYMBOL_START        (1L<<7)
+#define KEY_HINSI_START         (1L<<8)
+#define KEY_SELECT_END          (1L<<9)
+#define KEY_SELECT_ABORT        (1L<<10)
+#define KEY_SELECT_RIGHT        (1L<<11)
+#define KEY_SELECT_LEFT         (1L<<12)
+#define KEY_SELECT_UP           (1L<<13)
+#define KEY_SELECT_DOWN         (1L<<14)
+#define KEY_SELECT_FIRST        (1L<<15)
+#define KEY_SELECT_LAST         (1L<<16)
+#define KEY_SELECT_NEXTP        (1L<<17)
+#define KEY_SELECT_PREVP        (1L<<18)
+#define KEY_SELECT_RIGHTMOST    (1L<<19)
+#define KEY_SELECT_LEFTMOST     (1L<<20)
+#define KEY_RECONNECT           (1L<<21)
+#define KEY_BELL                (1L<<22)
+#define KEY_DICT_START          (1L<<23)
+#define KEY_DICT_CHANGE         (1L<<24)
+#define KEY_DICT_REGISTER       (1L<<25)
+#define KEY_DICT_CLEAR          (1L<<26)
+#define KEY_DICT_END            (1L<<27)
+#define KEY_CONTROL             (1L<<28)
+#define KEY_FUNC                (1L<<29)
+
+#define KEY_TEXT_CLEAR  (KEY_TEXT_CHANGE|KEY_TEXT_FIXED)
+#define KEY_CHANGE      (KEY_HENKAN_END|KEY_MODE_CHANGE \
+                |KEY_TEXT_CHANGE|KEY_TEXT_FIXED)
+#define KEY_SELECT      (KEY_CAND_START|KEY_SYMBOL_START|KEY_SELECT_END \
+                |KEY_SELECT_ABORT|KEY_SELECT_RIGHT|KEY_SELECT_LEFT \
+                |KEY_SELECT_UP|KEY_SELECT_DOWN|KEY_SELECT_FIRST \
+                |KEY_SELECT_LAST|KEY_SELECT_NEXTP|KEY_SELECT_PREVP \
+                |KEY_SELECT_LEFTMOST|KEY_SELECT_RIGHTMOST|KEY_HINSI_START)
+#define KEY_DICT        (KEY_DICT_START|KEY_DICT_REGISTER|KEY_DICT_CLEAR \
+                |KEY_DICT_CHANGE|KEY_DICT_END)
+
+#ifndef WCHAR_DEFINED
+#define WCHAR_DEFINED
+#undef wchar
+#ifdef WCHAR_LONG
+typedef unsigned long  wchar;
+#else
+typedef unsigned short wchar;
+#endif
+#endif
+
+/*
+ * define for server status
+ */
+#define CONNECT_OK              0
+#define CONNECT_FAIL            -1
+
+/*
+ * define for locale
+ */
+#define JP_SJIS                 0
+#define JP_EUC                  1
+#define JP_JIS8                 2
+#define JP_JIS7                 3
+#define JP_OTHER                -1
+
+/*
+ * define for buffer size
+ */
+#define YBUFSIZ                 32
+#define RBUFSIZ                 16
+#define CANDBUFSIZ              128
+#define KANABUFSIZ              256
+#define KANJIBUFSIZ             512
+#define BUNBUFSIZ               256
+
+/*
+ * define for attribute of segment
+ */
+#define SEG_REVERSED            0
+#define SEG_UNDER_LINE          1
+#define SEG_NORMAL              2
+
+typedef unsigned long           Xsj3csMode;
+typedef unsigned long           Xsj3ccMode;
+typedef unsigned long           Xsj3cdMode;
+typedef unsigned long           Xsj3cFlag;
+typedef unsigned long           Xsj3cEvent;
+
+#define MODE_HIRA               0
+#define MODE_ZKATA              1
+#define MODE_HKATA              2
+#define MODE_HALPHA             3
+#define MODE_ZALPHA             4
+
+#define MODE_SJIS               5
+#define MODE_EUC                6
+#define MODE_JIS                7
+#define MODE_KUTEN              8
+
+#define MODE_TOROKU             9
+#define MODE_SYOUKYO            10
+#define MODE_KANJI              11
+#define MODE_EDIT               12
+#define MODE_CAND               13
+#define MODE_SYMBOL             14
+#define MODE_HINSI              15
+#define MODE_QUOTE              16
+
+#define MODE_ROLLDOWN           5
+#define MODE_ROLLUP             6
+
+#define MODE_HANKAKU            5
+#define MODE_ZENKAKU            6
+#define MODE_UPPER              7
+#define MODE_LOWER              8
+
+#define MODE_CONV_NUM           7   /* HIRA-ZALPHA,ROLLDOWN,ROLLUP          */
+#define MODE_INROT_NUM          9   /* HIRA-ZALPHA,SJIS-KUTEN               */
+#define MODE_OUTROT_NUM         9   /* HIRA-ZALPHA,HANKAKU-LOWER            */
+#define MODE_CODE_NUM           4   /* SJIS-KUTEN                           */
+#define MODE_STR_NUM            17  /* HIRA-ZALPHA,SJIS-KUTEN,TOROKU-HINSI  */
+
+/*
+ * Roma-Kana Conversion Table Structure
+ */
+typedef struct sj3rktable {
+    unsigned char          *roma;
+    unsigned char          *yomi;
+    unsigned char          *str;
+    int                     rlen;
+    int                     ylen;
+    struct sj3rktable      *next;
+} Xsj3cRKTable;
+
+/*
+ * Hiragana-Katakana Conversion Table Structure
+ */
+typedef struct sj3hktable {
+    unsigned char          *hira;
+    unsigned char          *zkata;
+    unsigned char          *hkata;
+    unsigned char          *halpha;
+    int                     hlen;
+    struct sj3hktable      *next;
+} Xsj3cHKTable;
+
+/*
+ * Zenkaku-Hankaku Conversion Table Structure
+ */
+typedef struct sj3zhtable {
+    unsigned char          *halpha;
+    unsigned char          *zalpha;
+    unsigned char          *zkana;
+    unsigned char          *hkata;
+    struct sj3zhtable      *next;
+} Xsj3cZHTable;
+
+/*
+ * Data Structure
+ */
+typedef struct _Xsj3cData {
+    int                     len;        /* Length of data           */
+    wchar                  *data;
+} Xsj3cDataRec,   *Xsj3cData;
+
+typedef Xsj3cDataRec    Xsj3cSymbolRec;
+typedef Xsj3cData       Xsj3cSymbol;
+typedef Xsj3cDataRec    Xsj3cHinsiRec;
+typedef Xsj3cData       Xsj3cHinsi;
+
+/*
+ * Candidate Structure
+ */
+typedef struct _Xsj3cCand {
+    int                     len;        /* Length of candidate          */
+    wchar                   data[CANDBUFSIZ];  /* Candidate string      */
+    SJ3_STUDYREC            dcid;       /* ID for studying              */
+} Xsj3cCandRec,   *Xsj3cCand;
+
+/*
+ * Dictionary Massage Data Structure
+ */
+typedef struct _Xsj3cDictMsg {
+    int                     len;        /* Length of data           */
+    wchar                  *data;
+    int                     attr;       /* attribute of data        */
+} Xsj3cDictMsgRec,   *Xsj3cDictMsg;
+
+/*
+ * Key Table Structure
+ */
+typedef struct sj3keytable {
+    char                   *keyword;
+    KeySym                  ksym;
+    Xsj3ccMode              modmask;
+    Xsj3cEvent              (*func)();
+    Xsj3cFlag               inputsame;
+    struct sj3keytable     *prev;
+    struct sj3keytable     *next;
+} Xsj3cKeyTable;
+
+/*
+ * Segment structure
+ */
+typedef struct _Xsj3cSeg {
+    int             value;      /* Result value of pre-edit conversion  */
+    unsigned char  *str;        /* Pre-edit strings buffer              */
+    unsigned char  *sp;         /* Current pointer of pre-edit strings  */
+    wchar          *yomi;       /* Yomi characters buffer               */ 
+    wchar          *disp;       /* Display/Kanji characters buffer      */
+    unsigned char  *oldstr;     /* Old pre-edit strings buffer          */
+    int             oldlen;     /* Length old Roma-Kana conversion unit */
+    int             n_roma;     /* Romaji/Code counter of pre-edit      */
+    int             n_kana;     /* Kana counter of pre-edit strings     */
+    int             size;       /* Size of yomi/disp character buffer   */
+    int             cur;        /* Current cursor position              */
+    int             num;        /* Length of yomi characters            */
+    int             dnum;       /* Length of display characters         */
+    Xsj3csMode      cursegmode; /* Character kind of yomi characters    */
+    Xsj3cFlag       status;     /* Conversion status (noconv or conved) */
+    Xsj3cFlag       change;     /* Flag, Need to study or not           */
+    Xsj3cFlag       edit;       /* Flag, Available to edit or not       */
+    SJ3_STUDYREC    dcid;       /* ID for studying                      */
+} Xsj3cSegRec,    *Xsj3cSeg;
+
+/*
+ * Dictionary  Data Structure
+ */
+typedef struct _Xsj3cDictData {
+    Xsj3cSeg                seg;        /* Yomi Segment buffer          */
+    Xsj3cDictMsg            msg;        /* Message buffers              */
+    Xsj3cdMode              mode;       /* Registration or elimination  */
+    Xsj3cdMode              status;     /* Current status               */ 
+    int                     value;      /* Result value of operation    */
+    int                     n_dict;     /* Expanded segment counter     */
+} Xsj3cDictDataRec,   *Xsj3cDictData;
+
+/*
+ * Buffer for Sj3 Object
+ */
+typedef struct _Xsj3cBuf {
+    int             server;         /* Current conversion server            */
+    Xsj3ccMode      convmode;       /* Current conversion mode              */
+
+    /* Converting string data                                               */
+    Xsj3cSeg       *input;          /* Segment buffers for input            */
+    Xsj3cSeg       *backup;         /* Segment buffers for backup           */
+    Xsj3cSeg        current;        /* Segment buffer of current input      */
+    int             curseg;         /* Current segment number               */
+    int             segnum;         /* Total segment number                 */
+    int             backsegnum;     /* Old total segment number             */
+    int             convedsegnum;   /* Total converted segment number       */
+
+    /* Current character mode data                                          */
+    Xsj3csMode      inputmode;      /* Current input character kind         */
+    Xsj3csMode      dispmode;       /* Current display character kind       */
+
+    /* Data for handling dictionary (DictMode)                              */
+    Xsj3cDictData   dict;           /* Data for DictMode                    */
+
+    /* Data for selection (SelectMode)                                      */
+    Xsj3cCand       candidate;      /* Candidate strings                    */
+    Xsj3cSymbol     symbol;         /* Symbol strings                       */
+    Xsj3cHinsi      hinsi;          /* Hinsi strings                        */
+    int             candnum;        /* Total candidate number               */
+    int             curcand;        /* Current candidate number             */
+    int             cursymbol;      /* Current symbol number                */
+    int             curhinsi;       /* Current hinsi number                 */
+    Xsj3ccMode      selectstatus;   /* Status of SelectMode                 */
+    int             n_select;       /* Counter for candidates to SelectMode */
+    int             candseg;        /* Segment number of current candidate  */
+
+    /* Conversion tables                                                    */
+    Xsj3cRKTable   *rktable;        /* Roma-kana conversion table           */ 
+    Xsj3cHKTable   *hktable;        /* Hiragana-Katakana conversion table   */
+    Xsj3cZHTable   *zhtable;        /* Hankaku-Zenkaku conversion table     */
+
+    /* Other data for conversion                                            */
+    unsigned char  *rkdouble;       /* Roma-kana double conversion data     */
+    unsigned char  *plosive;        /* Roma-kana plosive conversion data    */
+
+    /* Next sjrc file to read                                               */
+    char           *rcfile;
+
+    /* Common resource in sjrc file (Common with sj2/sj3/sjx)               */
+    Xsj3cKeyTable  *key;            /* Key-function conversion table        */
+                                    /* Custom-flag (.key .sjxkey .ki2key)   */
+    Xsj3csMode      inmoderot[MODE_INROT_NUM];/* Input character mode       */
+                                    /* Custom-flag (.InitialMode)           */
+    int             inmoderotnum;   /* Total input character mode number    */
+    Xsj3csMode      outmoderot[MODE_OUTROT_NUM];/* Output character mode    */
+                                    /* Custom-flag (.PrintMode)             */
+    int             outmoderotnum;  /* Total output character mode number   */
+    Xsj3csMode      defcode[MODE_CODE_NUM]; /* Input code rotation          */
+                                    /* Custom-flag (.DefaultCode)           */
+    int             coderotnum;     /* Total input code rotation number     */
+    Xsj3csMode      muhenmode;      /* Character kind after unconverting    */
+                                    /* Custom-flag (.MuhenkanMode)          */
+    Xsj3csMode      togglemode;     /* Character kind by toggling           */
+                                    /* Custom-flag (.MuhenkanInEdit)        */
+    Xsj3cFlag       dotoggle;       /* Custom-flag (.MuhenkanToggle)        */
+    Xsj3cFlag       throughflg;     /* Trough character flag                */
+    wchar          *modestr[MODE_STR_NUM]; /* Character mode strings       */
+                                    /* Custom-flag (.guide.[mode])          */
+    int             modelen[MODE_STR_NUM];  /* Length of mode strings       */
+    Xsj3cFlag       gakusyuu;       /* Custom-flag (.bstudy)                */
+    Xsj3cFlag       rkbell;         /* Custom-flag (.rkerrbell)             */
+    Xsj3cFlag       flushaconv;     /* Custom-flag (.FlushAfterConversion)  */
+    char           *sj3serv;        /* First sj3serv hostname               */
+                                    /* Custom-flag (.server)                */
+    unsigned char  *setnormal;      /* Custom-flag (.SetNormal)             */
+    unsigned char  *throughnext;    /* Custom-flag (.ThroughNext)           */
+
+    /* Original resource (Not exists in sj2/sj3/sjx)                        */
+    char           *sj3serv2;       /* Second sj3serv hostname              */
+                                    /* Custom-flag (.server2)               */
+    Xsj3cFlag       flushiconv;     /* Custom-flag (.FlushInConversion)     */
+    Xsj3cFlag       flushsconv;     /* Custom-flag (.FlushSelectConversion) */
+    Xsj3cFlag       flusheconv;     /* Custom-flag (.FlushEndConversion)    */
+    Xsj3cFlag       alphaconv;      /* Custom-flag (.AlphabetConversion)    */
+    Xsj3cFlag       backdisplay;    /* Custom-flag (.BackDisplay)           */
+    Xsj3cFlag       beginlastseg;   /* Custom-flag (.BeginConversionLast)   */
+    Xsj3cFlag       expandmconv;    /* Custom-flag (.ExpandModeConversion)  */
+    Xsj3cFlag       shrinkmconv;    /* Custom-flag (.ShrinkModeConversion)  */
+    Xsj3cFlag       expandkconv;    /* Custom-flag (.ExpandKanjiConversion) */
+    Xsj3cFlag       shrinkkconv;    /* Custom-flag (.ShrinkKanjiConversion) */
+    Xsj3cFlag       shrinkall;      /* Custom-flag (.ShrinkAll)             */
+    Xsj3cFlag       henkanseg;      /* Custom-flag (.HenkanSegment)         */
+    Xsj3cFlag       muhenseg;       /* Custom-flag (.MuhenkanSegment)       */
+    Xsj3cFlag       delchange;      /* Custom-flag (.DeleteChangeSegment)   */
+    Xsj3cFlag       flushchange;    /* Custom-flag (.FlushChangeSegment)    */
+    Xsj3cFlag       modeconv[MODE_CONV_NUM];/* Custom-flag (.ModeConversion)*/
+    Xsj3cFlag       moveloop;       /* Custom-flag (.MoveLoop)              */
+    Xsj3cFlag       movebyseg;      /* Custom-flag (.MoveBySegment)         */
+    Xsj3cFlag       jumpbyseg;      /* Custom-flag (.JumpBySegment)         */
+    Xsj3cFlag       delbyseg;       /* Custom-flag (.DeleteBySegment)       */
+    Xsj3cFlag       killbyseg;      /* Custom-flag (.KillBySegment)         */
+    Xsj3cFlag       muhencurlast;   /* Custom-flag (.MuhenkanCursorLast)    */
+    Xsj3cFlag       editcurlast;    /* Custom-flag (.EditCursorLast)        */
+    Xsj3cFlag       flushcurlast;   /* Custom-flag (.FlushCursorLast)       */
+    Xsj3cFlag       convedunderline;/* Custom-flag (.ConvertedUnderLine)    */
+    Xsj3cFlag       dispmodechange; /* Custom-flag (.DisplayModeChange)     */
+    Xsj3cFlag       dellastmove;    /* Custom-flag (.DeleteLastMove)        */
+    Xsj3cFlag       kanaonly;       /* Custom-flag (.KanaInputOnly)         */
+    Xsj3cFlag       inputsame;      /* Custom-flag (.InputSameTime)         */
+    Xsj3cFlag       cntrlsame;      /* Custom-flag (.ControlSameTime)       */
+    Xsj3cFlag       selectconv;     /* Custom-flag (.BeforeSelectConversion)*/
+    Xsj3cFlag       beforeconv;     /* Custom-flag (.BeforeConversion)      */
+    Xsj3cFlag       lastdoubleconv; /* Custom-flag (.LastDoubleConversion)  */
+    int             selectcount;    /* Custom-flag (.BeforeSelectCount)     */
+    Xsj3cFlag       selectback;     /* Custom-flag (.SelectBackSpaceCurrent)*/
+    Xsj3cFlag       candpadding;    /* Custom-flag (.CandidatePadding)      */
+
+} Xsj3cBufRec,    *Xsj3cBuf;
+
+/* Key event handling                               */
+extern unsigned char       *Xsj3cGetPreeditArea();
+extern Xsj3cEvent           Xsj3cKeyConv();
+
+/* Setting up environment                           */
+extern void                 Xsj3cSetInLang();
+extern void                 Xsj3cSetOutLang();
+extern void                 Xsj3cSetKanaMod();
+
+/* Connection to language conversion server handling */
+extern int                  Xsj3cOpen();
+extern void                 Xsj3cClose();
+extern void                 Xsj3cConnect();
+
+/* Operation of buffers                             */
+extern Xsj3cBuf             Xsj3cCreateBuffer();
+extern void                 Xsj3cFreeBuffer();
+extern void                 Xsj3cClearBuffer();
+extern void                 Xsj3cFlushBuffer();
+extern void                 Xsj3cFixBuffer();
+
+/* Getting data to draw or send to other            */
+extern int                  Xsj3cGetSegNum();
+extern int                  Xsj3cGetPosition();
+extern wchar               *Xsj3cGetSeg();
+extern wchar               *Xsj3cGetModeStr();
+extern wchar               *Xsj3cGetConvertedStr();
+extern int                  Xsj3cGetConvertedLength();
+
+/* Operartion of candidate data                     */
+extern int                  Xsj3cGetCandidateNum();
+extern Xsj3cCand            Xsj3cGetCandidates();
+extern wchar               *Xsj3cGetCandidate();
+extern int                  Xsj3cSetCandidate();
+extern void                 Xsj3cEndCandidate();
+
+/* Operartion of symbol data                        */
+extern int                  Xsj3cGetSymbolNum();
+extern Xsj3cSymbol          Xsj3cGetSymbols();
+extern wchar               *Xsj3cGetSymbol();
+extern int                  Xsj3cSetSymbol();
+extern void                 Xsj3cEndSymbol();
+
+/* Operartion of hinsi data                         */
+extern int                  Xsj3cGetHinsiNum();
+extern Xsj3cHinsi           Xsj3cGetHinsis();
+extern wchar               *Xsj3cGetHinsi();
+extern int                  Xsj3cSetHinsi();
+extern void                 Xsj3cEndHinsi();
+
+/* Operartion of dictionary data                    */
+extern int                  Xsj3cGetDictMsgNum();
+extern Xsj3cDictMsg         Xsj3cGetDictMsgs();
+extern wchar               *Xsj3cGetDictMsg();
+extern void                 Xsj3cDictRegister();
+extern void                 Xsj3cDictClear();
+extern void                 Xsj3cEndDict();
+
+extern void                 Xsj3cInitializeTables();
+
+#endif /* _Xsj3clib_h */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/include/cconv.h	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,74 @@
+/* $Id: cconv.h,v 10.2 1998/12/28 07:33:30 ishisone Exp $ */
+/*
+ *	cconv.h -- header file for cconv library
+ *		version 10.1
+ */
+
+/*
+ * Copyright (c) 1988  Software Research Associates, Inc.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted, provided
+ * that the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Software Research Associates not be
+ * used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission.  Software Research
+ * Associates makes no representations about the suitability of this software
+ * for any purpose.  It is provided "as is" without express or implied
+ * warranty.
+ *
+ * Author:  Makoto Ishisone, Software Research Associates, Inc., Japan
+ *		ishisone@sra.co.jp
+ */
+
+#ifndef WCHAR_DEFINED
+#define WCHAR_DEFINED
+typedef unsigned short	wchar;
+#endif
+
+typedef struct _ccRule	*ccRule;
+typedef struct _ccBuf	*ccBuf;
+
+/* CCDEFPATH -- default ccdef file directory */
+#ifndef CCDEFPATH
+#define CCDEFPATH	"/usr/lib/X11/ccdef/"
+#endif
+
+#ifdef __STDC__
+extern ccRule ccParseRule(char *, void (*)());
+extern ccBuf ccCreateBuf(ccRule, int, char *[], int, void (*)(), void (*)(),
+			 void (*)(), int (*)(), void (*)(), void (*)(),
+			 caddr_t);
+extern void ccFreeRule(ccRule);
+extern void ccDestroyBuf(ccBuf);
+extern int ccConvchar(ccBuf, XKeyPressedEvent *);
+extern int ccGetMode(ccBuf);
+extern wchar *ccGetModePrompt(ccBuf);
+extern ccRule ccGetRule(ccBuf);
+extern void ccContextAppend(ccBuf, int);
+extern void ccContextDelete(ccBuf);
+extern void ccContextClear(ccBuf);
+extern void ccContextSet(ccBuf, wchar *);
+extern void ccContextGet(ccBuf, wchar *);
+
+extern ccBuf ccInit(char *, int, void (*)(), void (*)(), void (*)(),
+		    int (*)(), void (*)(), char **, int);
+extern void ccTerminate(ccBuf);
+#else
+extern ccRule ccParseRule();
+extern ccBuf ccCreateBuf();
+extern void ccFreeRule();
+extern void ccDestroyBuf();
+extern int ccConvchar();
+extern int ccGetMode();
+extern wchar *ccGetModePrompt();
+extern ccRule ccGetRule();
+extern void ccContextAppend();
+extern void ccContextDelete();
+extern void ccContextClear();
+extern void ccContextSet();
+extern void ccContextGet();
+extern ccBuf ccInit();
+extern void ccTerminate();
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/include/wnnlib.h	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,176 @@
+/* $Id: wnnlib.h,v 10.8 1999/05/25 06:21:10 ishisone Exp $ */
+
+/*
+ *	wnnlib.h -- wnnlib $BMQ%X%C%@%U%!%$%k(B (Wnn Version4/6 $BBP1~HG(B)
+ *		version 5.0
+ *		ishisone@sra.co.jp
+ */
+
+/*
+ * Copyright (c) 1989  Software Research Associates, Inc.
+ * Copyright (c) 1998  MORIBE, Hideyuki
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted, provided
+ * that the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Software Research Associates not be
+ * used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission.  Software Research
+ * Associates makes no representations about the suitability of this software
+ * for any purpose.  It is provided "as is" without express or implied
+ * warranty.
+ *
+ * Author:  Makoto Ishisone, Software Research Associates, Inc., Japan
+ *          MORIBE, Hideyuki
+ */
+
+#ifndef _wnnlib_h
+#define _wnnlib_h
+
+#include	<commonhd.h>
+#include	<jllib.h>
+#include	<wnnerror.h>
+
+#ifndef WCHAR_DEFINED
+#define WCHAR_DEFINED
+#undef wchar
+typedef unsigned short wchar;
+#endif
+
+
+/* $BDj?t(B */
+#define JC_FORWARD	1
+#define JC_BACKWARD	0
+#define JC_NEXT		0
+#define JC_PREV		1
+#define JC_HIRAGANA	0
+#define JC_KATAKANA	1
+
+/* $B%(%i!<HV9f(B */
+#define JE_NOERROR		0
+#define JE_WNNERROR		1	/* jllib $B$N%(%i!<(B */
+#define JE_NOCORE		2	/* $B%a%b%j$,3NJ]$G$-$J$$(B */
+#define JE_NOTCONVERTED		3	/* $BBP>]J8@a$,$^$@JQ49$5$l$F$$$J$$(B */
+#define JE_CANTDELETE		4	/* $B%P%C%U%!$N@hF,$NA0!"$"$k$$$O(B
+					 * $B:G8e$N<!$NJ8;z$r:o=|$7$h$&$H$7$?(B */
+#define JE_NOSUCHCLAUSE		5	/* $B;XDj$5$l$?HV9f$NJ8@a$,B8:_$7$J$$(B */
+#define JE_CANTSHRINK		6	/* 1 $BJ8;z$NJ8@a$r=L$a$h$&$H$7$?(B */
+#define JE_CANTEXPAND		7	/* $B:G8e$NJ8@a$r?-$P$=$&$H$7$?(B */
+#define JE_NOCANDIDATE		8	/* $B<!8uJd$,$J$$(B */
+#define JE_NOSUCHCANDIDATE	9	/* $B;XDj$5$l$?HV9f$N8uJd$,B8:_$7$J$$(B */
+#define JE_CANTMOVE		10	/* $B%P%C%U%!$N@hF,$NA0!"$"$k$$$O(B
+					 * $B:G8e$N<!$K0\F0$7$h$&$H$7$?(B */
+#define JE_CLAUSEEMPTY		11	/* $B6u$NJ8$rJQ49$7$h$&$H$7$?(B */
+#define JE_ALREADYFIXED		12	/* $B$9$G$K3NDj$5$l$F$$$kJ8$KBP$7$F(B
+					 * $BA`:n$r9T$J$C$?(B */
+
+/* $B%(%i!<HV9f(B */
+extern int	jcErrno;	/* $B%(%i!<HV9f(B */
+
+/* $B%G!<%?%?%$%W(B */
+
+/* $B3F>.J8@a$N>pJs(B */
+typedef struct {
+	wchar	*kanap;		/* $BFI$_J8;zNs(B */
+	wchar	*dispp;		/* $BI=<(J8;zNs(B */
+	char	conv;		/* $BJQ49:Q$_$+(B */
+				/* 0: $BL$JQ49(B 1: $BJQ49:Q(B -1: $B$G5?;wJQ49(B */
+	char	ltop;		/* $BBgJ8@a$N@hF,$+(B? */
+} jcClause;
+
+
+/* $B:n6H0h(B */
+typedef struct {
+    /* public member */
+	int		nClause;	/* $BJ8@a?t(B */
+	int		curClause;	/* $B%+%l%s%HJ8@aHV9f(B */
+	int		curLCStart;	/* $B%+%l%s%HBgJ8@a3+;OJ8@aHV9f(B */
+	int		curLCEnd;	/* $B%+%l%s%HBgJ8@a=*N;J8@aHV9f(B */
+	wchar		*kanaBuf;	/* $B$+$J%P%C%U%!(B */
+	wchar		*kanaEnd;
+	wchar		*displayBuf;	/* $B%G%#%9%W%l%$%P%C%U%!(B */
+	wchar		*displayEnd;
+	jcClause	*clauseInfo;	/* $BJ8@a>pJs(B */
+	struct wnn_buf	*wnn;
+    /* private member */
+	int		fixed;		/* $B3NDj$5$l$?$+$I$&$+(B */
+	wchar		*dot;		/* $B%I%C%H$N0LCV(B */
+	int		candKind;	/* $BBgJ8@a$NA48uJd$+>.J8@a$N8uJd$+$r(B
+					   $BI=$9%U%i%0(B */
+	int		candClause;	/* $BA48uJd$r$H$C$F$$$kJ8@aHV9f(B */
+	int		candClauseEnd;	/* $BBgJ8@a$NA48uJd$N;~!"=*N;J8@aHV9f(B */
+	int		bufferSize;	/* kanaBuf/displayBuf $B$NBg$-$5(B */
+	int		clauseSize;	/* clauseInfo $B$NBg$-$5(B */
+} jcConvBuf;
+
+#ifdef __STDC__
+extern struct wnn_buf *jcOpen(char *server, char *envname,
+				int override, char *rcfile,
+				void (*error)(), int (*confirm)(),
+				int timeout);
+extern struct wnn_buf *jcOpen2(char *server, char *envname,
+				int override, char *rcfile4, char *rcfile6,
+				void (*error)(), int (*confirm)(),
+				int timeout);
+extern int jcClose(struct wnn_buf *wnn);
+extern int jcIsConnect(struct wnn_buf *wnn);
+extern jcConvBuf *jcCreateBuffer(struct wnn_buf *wnn,
+					int clause, int buffersize);
+extern int jcDestroyBuffer(jcConvBuf *buf, int savedic);
+extern int jcClear(jcConvBuf *buf);
+extern int jcInsertChar(jcConvBuf *buf, int c);
+extern int jcDeleteChar(jcConvBuf *buf, int prev);
+extern int jcKillLine(jcConvBuf *buf);
+extern int jcConvert(jcConvBuf *buf, int small, int tan, int jump);
+extern int jcUnconvert(jcConvBuf *buf);
+extern int jcCancel(jcConvBuf *buf);
+extern int jcExpand(jcConvBuf *buf, int small, int convf);
+extern int jcShrink(jcConvBuf *buf, int small, int convf);
+extern int jcKana(jcConvBuf *buf, int small, int kind);
+extern int jcFix(jcConvBuf *buf);
+extern int jcFix1(jcConvBuf *buf);
+extern int jcNext(jcConvBuf *buf, int small, int prev);
+extern int jcCandidateInfo(jcConvBuf *buf, int small,
+			   int *ncandp, int *curcandp);
+extern int jcGetCandidate(jcConvBuf *buf, int n, wchar *candstr);
+extern int jcSelect(jcConvBuf *buf, int n);
+extern int jcDotOffset(jcConvBuf *buf);
+extern int jcIsConverted(jcConvBuf *buf, int cl);
+extern int jcMove(jcConvBuf *buf, int small, int dir);
+extern int jcTop(jcConvBuf *buf);
+extern int jcBottom(jcConvBuf *buf);
+extern int jcChangeClause(jcConvBuf *buf, wchar *str);
+extern int jcSaveDic(jcConvBuf *buf);
+#else
+extern struct wnn_buf *jcOpen();
+extern struct wnn_buf *jcOpen2();
+extern int jcClose();
+extern int jcIsConnect();
+extern jcConvBuf *jcCreateBuffer();
+extern int jcDestroyBuffer();
+extern int jcClear();
+extern int jcInsertChar();
+extern int jcDeleteChar();
+extern int jcKillLine();
+extern int jcConvert();
+extern int jcUnconvert();
+extern int jcCancel();
+extern int jcExpand();
+extern int jcShrink();
+extern int jcKana();
+extern int jcFix();
+extern int jcNext();
+extern int jcCandidateInfo();
+extern int jcGetCandidate();
+extern int jcSelect();
+extern int jcDotOffset();
+extern int jcIsConverted();
+extern int jcMove();
+extern int jcTop();
+extern int jcBottom();
+extern int jcChangeClause();
+extern int jcSaveDic();
+#endif
+
+#endif /* _wnnlib_h */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/AdoptedShe.c	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,196 @@
+#ifndef lint
+static char *rcsid = "$Id: AdoptedShe.c,v 1.6 1991/09/23 04:03:31 ishisone Rel $";
+#endif
+/*
+ * Copyright (c) 1990  Software Research Associates, Inc.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted, provided
+ * that the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Software Research Associates not be
+ * used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission.  Software Research
+ * Associates makes no representations about the suitability of this software
+ * for any purpose.  It is provided "as is" without express or implied
+ * warranty.
+ *
+ * Author:  Makoto Ishisone, Software Research Associates, Inc., Japan
+ */
+
+#include <X11/IntrinsicP.h>
+#include <X11/StringDefs.h>
+#include "AdoptedShP.h"
+
+static XtResource resources[] = {
+#define offset(field) XtOffset(AdoptedShellWidget, adoptedshell.field)
+    { XtNparentWindow, XtCParentWindow, XtRWindow, sizeof(Window),
+	offset(parent), XtRImmediate, None },
+    { XtNdisableGeometryManagement, XtCDisableGeometryManagement,
+	XtRBoolean, sizeof(Boolean),
+	offset(disable_geometry), XtRString, "False" },
+#undef offset
+};
+
+static void Initialize();
+static void Realize();
+static Boolean SetValues();
+static XtGeometryResult GeometryManager();
+
+static void GetParentInfo();
+
+AdoptedShellClassRec adoptedShellClassRec = {
+  { /* core fields */
+    /* superclass		*/	(WidgetClass) &overrideShellClassRec,
+    /* class_name		*/	"AdoptedShell",
+    /* widget_size		*/	sizeof(AdoptedShellRec),
+    /* class_initialize		*/	NULL,
+    /* class_part_initialize	*/	NULL,
+    /* class_inited		*/	FALSE,
+    /* initialize		*/	Initialize,
+    /* initialize_hook		*/	NULL,
+    /* realize			*/	Realize,
+    /* actions			*/	NULL,
+    /* num_actions		*/	0,
+    /* resources		*/	resources,
+    /* num_resources		*/	XtNumber(resources),
+    /* xrm_class		*/	NULLQUARK,
+    /* compress_motion		*/	TRUE,
+    /* compress_exposure	*/	TRUE,
+    /* compress_enterleave	*/	TRUE,
+    /* visible_interest		*/	FALSE,
+    /* destroy			*/	NULL,
+    /* resize			*/	XtInheritResize,
+    /* expose			*/	XtInheritExpose,
+    /* set_values		*/	SetValues,
+    /* set_values_hook		*/	NULL,
+    /* set_values_almost	*/	XtInheritSetValuesAlmost,
+    /* get_values_hook		*/	NULL,
+    /* accept_focus		*/	NULL,
+    /* version			*/	XtVersion,
+    /* callback_private		*/	NULL,
+    /* tm_table			*/	NULL,
+    /* query_geometry		*/	XtInheritQueryGeometry,
+    /* display_accelerator	*/	XtInheritDisplayAccelerator,
+    /* extension		*/	NULL
+  },
+  { /* Composite */
+    /* geometry_manager		*/	GeometryManager,
+    /* change_managed		*/	XtInheritChangeManaged,
+    /* insert_child		*/	XtInheritInsertChild,
+    /* delete_child		*/	XtInheritDeleteChild,
+    /* extension		*/	NULL
+  },
+  { /* shell fields */
+    /* extension		*/	NULL
+  },
+  { /* overrideShell fields */
+    /* extension		*/	NULL
+  },
+  { /* AdoptedShell fields */
+    /* empty			*/	0
+  }
+};
+
+WidgetClass adoptedShellWidgetClass = (WidgetClass)&adoptedShellClassRec;
+
+/* ARGSUSED */
+static void
+Initialize(req, new, args, num_args)
+Widget req;
+Widget new;
+ArgList args;
+Cardinal *num_args;
+{
+    AdoptedShellWidget asw = (AdoptedShellWidget)new;
+    Cardinal i;
+
+    asw->adoptedshell.colormap_specified = False;
+    for (i = 0; i < *num_args; i++) {
+	if (!strcmp(args[i].name, XtNcolormap)) {
+	    asw->adoptedshell.colormap_specified = True;
+	    break;
+	}
+    }
+}
+
+static void
+Realize(w, maskp, attr)
+Widget w;
+XtValueMask *maskp;
+XSetWindowAttributes *attr;
+{
+    AdoptedShellWidget asw = (AdoptedShellWidget)w;
+    Window savedroot;
+
+    if (asw->adoptedshell.parent == None) {
+	asw->adoptedshell.parent = w->core.screen->root;
+    } else {
+	GetParentInfo(asw);
+    }
+    asw->adoptedshell.colormap_specified = False;
+
+    /* cheat the super-class's realize function */
+    savedroot = w->core.screen->root;
+    w->core.screen->root = asw->adoptedshell.parent;
+
+    /* call super class's realize function */
+    (*adoptedShellWidgetClass->core_class.superclass->core_class.realize)(w, maskp, attr);
+
+    /* restore savedroot */
+    w->core.screen->root = savedroot;
+}
+
+/* ARGSUSED */
+static Boolean
+SetValues(cur, req, new, args, num_args)
+Widget cur;
+Widget req;
+Widget new;
+ArgList args;
+Cardinal *num_args;
+{
+    AdoptedShellWidget asw = (AdoptedShellWidget)new;
+    AdoptedShellWidget old = (AdoptedShellWidget)cur;
+
+    if (asw->adoptedshell.parent != old->adoptedshell.parent) {
+	if (XtIsRealized(new)) {
+	    XtAppError(XtWidgetToApplicationContext(new),
+		       "AdoptedShell: can't change parent window after realization");
+	}
+    }
+    if (asw->core.colormap != old->core.colormap && !XtIsRealized(new)) {
+	asw->adoptedshell.colormap_specified = True;
+    }
+    return False;
+}
+
+static XtGeometryResult
+GeometryManager(w, reqp, repp)
+Widget w;
+XtWidgetGeometry *reqp;
+XtWidgetGeometry *repp;
+{
+    AdoptedShellWidget asw = (AdoptedShellWidget)XtParent(w);
+    ShellWidgetClass super;
+
+    if (asw->adoptedshell.disable_geometry) return XtGeometryYes;
+
+    super = (ShellWidgetClass)(adoptedShellWidgetClass->core_class.superclass);
+    return (*super->composite_class.geometry_manager)(w, reqp, repp);
+}
+
+static void
+GetParentInfo(w)
+AdoptedShellWidget w;
+{
+    Window parent = w->adoptedshell.parent;
+    XWindowAttributes attr;
+
+    (void)XGetWindowAttributes(XtDisplay((Widget)w), parent, &attr);
+    w->core.screen = attr.screen;
+    if (!w->adoptedshell.colormap_specified) w->core.colormap = attr.colormap;
+    /* may be I should honor user-specified visual, etc. */
+    w->core.depth = attr.depth;
+    w->shell.visual = attr.visual;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/Atok.c	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,1851 @@
+/*
+ * Copyright (c) 1990  Software Research Associates, Inc.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted, provided
+ * that the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Software Research Associates not be
+ * used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission.  Software Research
+ * Associates makes no representations about the suitability of this software
+ * for any purpose.  It is provided "as is" without express or implied
+ * warranty.
+ *
+ * Author:  Makoto Ishisone, Software Research Associates, Inc., Japan
+ */
+
+/* Copyright 1991 NEC Corporation, Tokyo, Japan.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and that
+ * both that copyright notice and this permission notice appear in
+ * supporting documentation, and that the name of NEC Corporation
+ * not be used in advertising or publicity pertaining to distribution
+ * of the software without specific, written prior permission.  NEC 
+ * Corporation makes no representations about the suitability of this
+ * software for any purpose.  It is provided "as is" without express
+ * or implied warranty.
+ *
+ * NEC CORPORATION DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN 
+ * NO EVENT SHALL NEC CORPORATION BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF 
+ * USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR 
+ * OTHER TORTUOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR 
+ * PERFORMANCE OF THIS SOFTWARE. 
+ *
+ * Author: Akira Kon, NEC Corporation.  (kon@d1.bs2.mt.nec.co.jp)
+ */
+
+/* 
+ * Copyright 1999 Justsystem Corporation, Japan.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and that
+ * both that copyright notice and this permission notice appear in
+ * supporting documentation, and that the name of Justsystem Corporation
+ * not be used in advertising or publicity pertaining to distribution
+ * of the software without specific, written prior permission.  Justsystem 
+ * Corporation makes no representations about the suitability of this
+ * software for any purpose.  It is provided "as is" without express
+ * or implied warranty.
+ *
+ * Author: Atsushi Irisawa
+ */
+
+#ifndef lint
+static char *rcsid = "$Id: Atok.c,v 1.3 1999/08/24 08:59:35 ishisone Exp $";
+#endif
+
+#include <X11/IntrinsicP.h>
+#include <X11/StringDefs.h>
+#include <X11/Xmu/Atoms.h>
+#define XK_KATAKANA
+#include <X11/keysym.h>
+#if XtSpecificationRelease > 4
+#include <X11/Xfuncs.h>
+#endif
+#include "AtokP.h"
+#include "key_def.h"
+#include "DebugPrint.h"
+
+#define _WCHAR_T
+#define wchar_t wchar
+
+#ifdef SVR4
+#define bzero(p, l)	memset(p, 0, l)
+#else
+#if defined(SYSV) || defined(USG)
+#define OVERLAP_BCOPY
+extern char *memset();
+#define bzero(p, l)	memset(p, 0, l)
+#endif
+#endif
+
+static XtResource resources[] = {
+#define offset(field) XtOffset(AtokObject, atok.field)
+    { XtNAtokServer, XtCAtokServer, XtRString, sizeof(String),
+	offset(atokserver), XtRString, NULL },
+    { XtNConfFile, XtCConfFile, XtRString, sizeof(String),
+	offset(conffile), XtRString, NULL },
+    { XtNStyleFile, XtCStyleFile, XtRString, sizeof(String),
+	offset(stylefile), XtRString, NULL },
+    { XtNPort, XtCPort, XtRString, sizeof(String),
+	offset(port), XtRString, NULL },
+#undef offset
+};
+
+static void ClassInitialize();
+static void Initialize();
+static void Destroy();
+static Boolean SetValues();
+static int InputEvent();
+static ICString *GetMode();
+static int CursorPos();
+static int NumSegments();
+static ICString *GetSegment();
+static int CompareSegment();
+static ICString *GetItemList();
+static int SelectItem();
+static int ConvertedString();
+static int ClearConversion();
+static ICString *GetAuxSegments();
+static int PreeditString();
+static int StatusString();
+
+AtokClassRec atokClassRec = {
+  { /* object fields */
+    /* superclass		*/	(WidgetClass) &inputConvClassRec,
+    /* class_name		*/	"Atok",
+    /* widget_size		*/	sizeof(AtokRec),
+    /* class_initialize		*/	ClassInitialize,
+    /* class_part_initialize	*/	NULL,
+    /* class_inited		*/	FALSE,
+    /* initialize		*/	Initialize,
+    /* initialize_hook		*/	NULL,
+    /* obj1			*/	NULL,
+    /* obj2			*/	NULL,
+    /* obj3			*/	0,
+    /* resources		*/	resources,
+    /* num_resources		*/	XtNumber(resources),
+    /* xrm_class		*/	NULLQUARK,
+    /* obj4			*/	FALSE,
+    /* obj5			*/	FALSE,
+    /* obj6			*/	FALSE,
+    /* obj7			*/	FALSE,
+    /* destroy			*/	Destroy,
+    /* obj8			*/	NULL,
+    /* obj9			*/	NULL,
+    /* set_values		*/	SetValues,
+    /* set_values_hook		*/	NULL,
+    /* obj10			*/	NULL,
+    /* get_values_hook		*/	NULL,
+    /* obj11			*/	NULL,
+    /* version			*/	XtVersion,
+    /* callback_private		*/	NULL,
+    /* obj12			*/	NULL,
+    /* obj13			*/	NULL,
+    /* obj14			*/	NULL,
+    /* extension		*/	NULL
+  },
+  { /* inputConv fields */
+    /* InputEvent		*/	InputEvent,
+    /* GetMode			*/	GetMode,
+    /* CursorPos		*/	CursorPos,
+    /* NumSegments		*/	NumSegments,
+    /* GetSegment		*/	GetSegment,
+    /* CompareSegment		*/	CompareSegment,
+    /* GetItemList		*/	GetItemList,
+    /* SelectItem		*/	SelectItem,
+    /* GetConvertedString	*/	ConvertedString,
+    /* ClearConversion		*/	ClearConversion,
+    /* GetAuxSegments		*/	GetAuxSegments,
+    /* SupportMultipleObjects	*/	True,
+    /* GetTriggerKeys		*/	XtInheritGetTriggerKeys,
+    /* num_trigger_keys		*/	0,
+    /* trigger_keys		*/	NULL,
+    /* GetPreeditString		*/	PreeditString,
+    /* GetStatusString		*/	StatusString,
+    /* NoMoreObjects		*/	False,
+  },
+  { /* atok fields */
+    /* foo			*/	0,
+  }
+};
+
+WidgetClass atokObjectClass = (WidgetClass)&atokClassRec;
+
+static int bell();
+static void fix();
+static void fixProcForAtok();
+static void convend();
+
+static void addObject();
+static void deleteObject();
+
+static void atokDisplay();
+static int atokCandDisplay();
+static int atokAuxDisplay();
+
+static void moveLeft();
+static void moveRight();
+static void setSelection();
+static void moveSelection();
+static void querySelection();
+static void endSelection();
+static void insertSelection();
+static int allocCandList();
+static int changeTextForAtok();
+static int changeTextForAtokAUX();
+static void startSelection();
+static int makeCandList();
+
+static void copyInWchar();
+
+static Display *displaybell = (Display *)0;
+
+static int clientID = -1;
+static int nAtokContexts = 0;
+static int ceSock = -1;
+
+
+static void
+ClassInitialize()
+{
+    DPRINT(( "ATOK Class Initialize\n" ));
+    TRACE(("AtokObjectClass initialized\n"));
+    /* $B2?$b$7$J$$(B */
+}
+
+/* ARGSUSED */
+static void
+Initialize(req, new, args, num_args)
+Widget req;
+Widget new;
+ArgList args;
+Cardinal *num_args;
+{
+    AtokObject obj = (AtokObject)new;
+    AtokObject objX = (AtokObject)req;
+    int sock;
+    menuAux *orgMenuAux;
+    char buf[256];
+    int isConnect = 1;
+    int i;
+
+    bzero((char *)&obj->atok, sizeof(obj->atok));
+
+    obj->atok.textchanged = False;
+    obj->atok.nbr_of_cand = 0;
+    obj->atok.cand_lists_ics = NULL;
+    obj->atok.cur_cand = 0;
+
+    for (i = 0; i < NBR_OF_PART; i++) {
+	obj->atok.aux_ics[i].data = (char *)NULL;
+	obj->atok.aux_ics[i].nchars = 0;
+	obj->atok.aux_ics[i].nbytes = 0;
+	obj->atok.aux_length[i] = 0;
+	obj->atok.aux_size[i] = 0;
+    }
+
+    if (objX->atok.atokserver)
+	obj->atok.atokserver = objX->atok.atokserver;
+    if (objX->atok.port)
+	obj->atok.port = objX->atok.port;
+    if (objX->atok.conffile)
+	obj->atok.conffile = objX->atok.conffile;
+
+    /* $BF~NO%P%C%U%!$r:n@.$9$k!#(B*/
+    obj->atok.comm = (_XatokRecPtr)XtMalloc(sizeof(_XatokRec));
+    bzero((char *)obj->atok.comm, sizeof(_XatokRec));
+    obj->atok.comm->echoLen = 0;
+    /* obj->atok.sock = ceSock; */
+
+    if (!nAtokContexts) {
+	ceSock = atokConnect(obj->atok.atokserver,
+			     obj->atok.port,
+			     obj->atok.conffile,
+			     obj->atok.stylefile,
+			     /*
+			     obj->atok.conffile ?
+				obj->atok.conffile : "atok12.conf",
+			     obj->atok.stylefile ?
+				obj->atok.stylefile : "atok12.sty",
+			     */
+			     obj->atok.comm);
+	if (ceSock < 0) {
+	    XtAppWarning(XtWidgetToApplicationContext((Widget)obj),
+			 "Cannot connect to ATOK server");
+	    /* exit(0); */
+	    XtFree((char *)obj->atok.comm);
+	    obj->atok.comm = (_XatokRecPtr)NULL;
+	    return;
+	}
+	isConnect = 0;
+	obj->atok.comm->sock = ceSock;
+	clientID = obj->atok.comm->NETrqst.clntid;
+    }
+
+    obj->atok.comm->sock = ceSock;
+
+    addObject(obj, ceSock, clientID, isConnect);
+
+    orgMenuAux = getMenuInstance();
+    obj->atok.comm->menuAux = auxMenuCopy(orgMenuAux);
+    obj->atok.comm->curAux = obj->atok.comm->menuAux;
+    XtCallCallbackList((Widget) obj, obj->inputConv.modechangecallback,
+		       (XtPointer)NULL);
+    nAtokContexts++;
+}
+
+static void
+Destroy(w)
+Widget w;
+{
+    AtokObject obj = (AtokObject)w;
+
+    if (obj->atok.comm) XtFree((char *)obj->atok.comm);
+    deleteObject(obj);
+}
+
+/* ARGSUSED */
+static Boolean SetValues(cur, req, wid, args, num_args)
+Widget cur;
+Widget req;
+Widget wid;
+ArgList args;
+Cardinal *num_args;
+{
+    AtokObject old = (AtokObject)cur;
+    AtokObject new = (AtokObject)wid;
+
+    return False;
+}
+
+
+static int
+XKanaLookup(event_struct, buffer_return, bytes_buffer,
+	    keysym, status_return)
+XKeyEvent *event_struct;
+char *buffer_return;
+int bytes_buffer;
+KeySym *keysym;
+XComposeStatus *status_return;
+{
+  int res;
+  res = XLookupString(event_struct, buffer_return, bytes_buffer,
+		      keysym, status_return);
+  if (!res && XK_overline <= *keysym && *keysym <= XK_semivoicedsound) {
+    buffer_return[0] = (unsigned long)(*keysym) & 0xff;
+    res = 1;
+  }
+  return res;
+}
+
+
+/*
+ * Kinput2 API Functions
+ */
+
+static int
+InputEvent(w, event)
+Widget w;
+XEvent *event;
+{
+    AtokObject obj = (AtokObject)w;
+    wchar wbuf[BUFSIZ*4];	/* $B3NDjJ8;zNs$N%P%C%U%!(B */
+    int wlen;			/* $B3NDjJ8;zNs$ND9$5(B */
+    unsigned char kbuf[BUFSIZ];	/* $B%-!<F~NO%G!<%?(B */
+    int nbytes;			/* $B%-!<F~NO$ND9$5(B  */
+    KeySym ks;			/* X$B$N%-!<%7%s%\%k(B */
+    XComposeStatus comp_status;		
+    WORD aajcode;		/* AAJCODE */
+    int kanjiStatus;
+    int enableStatus;
+    int changeStatus;
+    int elseEvent;
+    int status;
+    int isThrue = 0;
+
+    DPRINT(( "\n### NEW EVENT \n" ));
+
+    /* KeyPress$B0J30$O<N$F$k(B */
+    if (event->type != KeyPress /*&& event->type != KeyRelease*/) return 0;
+
+    obj->atok.textchanged = False;
+
+    /*
+     * AtokServer $B$,(B $B:F5/F0$5$l$?$P$"$$$J$I!"%3%M%/%7%g%s$,$-$l$F$$$k>l9g$,(B
+     * $B$"$k$N$G(B $B:FEY%3%M%/%7%g%s$rD%$C$F$_$k!#(B
+     */
+    if (obj->atok.comm == NULL) {
+	/* return -1; /* $B@\B3$G$-$F$$$J$$$H$-$O!"%(%i!<$rJV$9(B */
+	return 1; /* $B@\B3$G$-$F$$$J$$$H$-$O!"L5;k$9$k(B */
+    }
+
+    /* X $B$N%-!<%$%Y%s%H$r<hF@$9$k!#(B*/
+    kbuf[0] = '\0';
+    nbytes = XKanaLookup((XKeyEvent*)event, kbuf, sizeof(kbuf), &ks,
+			 &comp_status);
+
+    wbuf[0] = (wchar)kbuf[0]; /* $B$-$?$J$$(B */
+
+    DPRINT(("nbytes %d\n", nbytes));
+
+    /* $BMW$i$J$$>l9g$OL5;k$9$k(B */
+    if (nbytes == 0 && ks & 0xff00 == 0) return 1;
+
+    /* $B%Y%k$rLD$i$9%G%#%9%W%l%$$N@_Dj(B */
+    displaybell = XtDisplayOfObject((Widget)obj);
+
+    /*
+     * $B8uJd%&%#%s%I%&$,(BACTIVE $B$K$J$C$F$$$?>l9g$N8uJd$N0\F0$O(B
+     * Kinput2 $B$h$j(B Callback $B$,8F$S=P$5$l$:!"A*Br$5$l$F$$$kHV9f$,(B
+     * $B<hF@$G$-$J$$$N$G!"$3$3$G0lEY(B $BA*Br$5$l$F$$$kHV9f$r<hF@$9$k!#(B
+     */
+    if (obj->atok.comm->convStatus & M_CAND) {
+	querySelection(obj);
+    }
+
+    /*
+     * $B%-!<F~NO$r85$K(B AAJCODE$B$KJQ49$7!"(BCE$B$X$N%j%/%(%9%H$r9T$&!#(B
+     * $B%j%/%(%9%H7k2L$K4p$E$$$F!"I=<($d%b!<%I$rJQ99$9$k!#(B
+     * $B3NDjJ8;zNs$,$"$C$?>l9g$K$O!"%j%?!<%s$H$7$F!"$=$NJ8;zNs$ND9$5$,(B
+     * $BJV$C$F$/$k!#(B
+     * $B$3$l0J9_$N=hM}$O(B $B2hLL$KI=<($9$k$?$a$NJ*$G$"$k!#(B
+     */
+    wlen = XatokEventControl(obj->atok.comm, event, ks, kbuf, nbytes,
+			     &aajcode, &kanjiStatus, &enableStatus,
+			     &changeStatus, &elseEvent);
+
+    if (!aajcode) {
+	/* Can't convertsion to AAJ CODE */
+	return 0;
+    }
+
+    if (obj->atok.comm->convStatus == M_NOKEYCONV) {
+	convend(obj);
+	return 0;
+    }
+		
+    /*
+     * $B$3$3$+$i2<$O(B kanjiStatus $B$G;XDj$5$l$F$$$k%b!<%I$N=hM}$r(B
+     * $B9T$$!"2hLL$KI=<($9$k!#(B
+     * $B8uJd0lMw!"!"<-=q!"3NDj$J$I$K2r$l$k!#(B
+     *
+     * $BDL>o$N%-!<F~NO$N>l9g(B
+     * $B8uJd0lMwI=<(Cf$N>l9g(B
+     * $B<-=q%f!<%F%#%j%F%#!<I=<(Cf$N>l9g(B
+     */
+    switch(kanjiStatus) {
+    case KRS_UNCHANGED: /* $B%9%k!<3NDj(B */
+	isThrue = 1 ;
+	obj->atok.comm->wlen = 0 ;
+	obj->atok.comm->wbuf[0] = aajcode ;
+	break;
+    case KRS_BACKSPACE:
+    case KRS_SOFTBACKSPACE:
+    case KRS_SOFTCARRIAGERETURN:
+    case KRS_EXTTANGO_OPEN:
+    default:
+	break;
+    }
+    status = 0;
+    if (enableStatus) {
+	if (elseEvent & EVENTB_BEEP) {
+	    bell();
+	}
+	/* $B%b!<%I$NJQ99$,$"$C$?(B */
+	if (changeStatus & ATCHANGEB_MODESTR) {
+	    XtCallCallbackList((Widget)obj, obj->inputConv.modechangecallback,
+			       (XtPointer)NULL);
+	}
+	if (changeStatus & ATCHANGEB_RESULTSTR) {
+	    /* do nothing */
+	}
+	if (changeStatus & ATCHANGEB_COMPSTR) {
+	    /* do nothing */
+	}
+	/* $B<!8uJd%&%#%s%I%&99?7(B */
+	if (changeStatus &
+	    (ATCHANGEB_RECTOPEN | ATCHANGEB_RECTCLOSE | ATCHANGEB_RECTCHANGE))
+	{
+	    /* do nothing */
+	}
+	if (changeStatus & (ATCHANGEB_SYSLSTR | ATCHANGEB_SYSLTOSYSL)) {
+	    /*
+	     * auxSyslineCtrl() $B$N(B return $B$,#00J30$N;~$O!"(B
+	     * $B%7%9%F%`9T$NI=<($,=*N;$N;~$G$"$j!"(B
+	     * $B3NDjJ8;zNs$,B8:_$9$k2DG=@-$,$"$k$N$G(B
+	     * $B%7%9%F%`9T$r>C$7$F$+$i(B
+	     * AuxDisplay()$B$r8F$S=P$9I,MW$,$"$k!#(B
+	     */
+	    status = auxSyslineCtrl(obj->atok.comm,
+				    changeStatus & ATCHANGEB_RESULTSTR);
+	    atokAuxDisplay(obj, M_SYSLINE);
+	    /*
+	    if (!status) {
+		DPRINT(("SYSLINE END\n"));
+		return 0;
+	    }
+	    */
+	}
+    }
+    /*
+     * $B$3$3$+$i2<$O(B $BI=<($N%3%s%H%m!<%k(B
+     * $BF~NO$5$l$?%-!<$K$h$j=hM}$rJ,$1$F$$$k!#(B
+     */
+    if (obj->atok.comm->convStatus & M_CAND) {
+	status = atokCandDisplay(obj, (int)aajcode);
+	if (status < 1) {
+	    return 0;
+	}
+    }
+    /* else */
+    if (obj->atok.comm->convStatus & M_AUX) {
+	status = atokAuxDisplay(obj, obj->atok.comm->convStatus);
+	if (status < 1) {
+	    return;
+	}
+    }
+    else if (obj->atok.comm->convStatus & M_SYSLINE && !status) {
+	status = auxSyslineCtrl(obj->atok.comm,
+				changeStatus & ATCHANGEB_RESULTSTR);
+	atokAuxDisplay(obj, obj->atok.comm->convStatus);
+	if (!status) {
+	    return 0;
+	}
+    }
+    else if (kanjiStatus == XKEY_DICT) {
+	/* $B<-=q%f!<%F%#%j%F%#!<I=<(;~$N%-!<F~NO(B */
+    }
+    /* $B$=$NB>$N>l9g$N%-!<F~NO(B */
+    if (obj->atok.comm->convStatus & M_KEYCONV) {
+	atokDisplay(obj, &kanjiStatus);
+    }
+
+    return isThrue;
+}
+
+static ICString	*
+GetMode(w)
+Widget w;
+{
+    AtokObject obj = (AtokObject)w;
+    _XatokRecPtr acomm = obj->atok.comm;
+    int len;
+    static ICString icstr;
+
+    if (acomm == NULL) return NULL; /* Not connected */
+
+    icstr.data = (char *)XatokGetModeStr(acomm, &len);
+    icstr.nchars = len;
+    icstr.nbytes = icstr.nchars * sizeof(wchar);
+    icstr.attr = ICAttrNormalString;
+
+    return &icstr;
+}
+
+static int
+CursorPos(w, nsegp, ncharp)
+Widget w;
+Cardinal *nsegp;
+Cardinal *ncharp;
+{
+    AtokObject obj = (AtokObject)w;
+    _XatokRecPtr acomm = obj->atok.comm;
+
+    if (acomm == NULL) return 0; /* Not connected */
+
+    return XatokGetSegmentPosition(acomm, nsegp, ncharp);
+}
+
+static int
+NumSegments(w)
+Widget w;
+{
+    AtokObject obj = (AtokObject)w;
+    _XatokRecPtr acomm = obj->atok.comm;
+
+    if (acomm == NULL) return 0; /* Not connected */
+
+    return XatokGetSegmentNumber(acomm);
+}
+
+static ICString *
+GetSegment(w, n)
+Widget w;
+Cardinal n;
+{
+    AtokObject obj = (AtokObject)w;
+    _XatokRecPtr acomm = obj->atok.comm;
+    int len;
+    int attr;
+    static ICString seg;
+
+    if (acomm == NULL) return NULL; /* Not connected */
+
+    seg.data = (char *)XatokGetSegmentRec(acomm, n, &len, &attr);
+    seg.nchars = len;
+    seg.nbytes = seg.nchars * sizeof(wchar);
+    seg.attr = attr;
+
+    return &seg;
+}
+
+/* ARGSUSED */
+static int
+CompareSegment(w, seg1, seg2, n)
+Widget w;
+ICString *seg1;
+ICString *seg2;
+Cardinal *n;
+{
+    wchar *p, *q;
+    int len, nsame;
+    int result = 0;
+
+    if (seg1->attr != seg2->attr) result |= ICAttrChanged;
+
+    len = seg1->nchars > seg2->nchars ? seg2->nchars : seg1->nchars;
+    nsame = 0;
+    p = (wchar *)seg1->data;
+    q = (wchar *)seg2->data;
+    while (nsame < len && *p++ == *q++) nsame++;
+
+    if (nsame != len || len != seg1->nchars || len != seg2->nchars)
+	result |= ICStringChanged;
+
+    if (n) *n = nsame;
+
+    return result;
+}
+
+static ICString *
+GetItemList(w, n)
+Widget w;
+Cardinal *n;
+{
+    AtokObject obj = (AtokObject)w;
+
+#ifdef CAND_PAGE
+    *n = (CAND_ROWS * CAND_COLS) + 1; /* +1 $B$O(B $B8uJd?t(B */
+#else
+    *n = obj->atok.nbr_of_cand;
+#endif /* CAND_PAGE */
+
+    return obj->atok.cand_lists_ics;
+}
+
+static int
+SelectItem(w, n)
+Widget w;
+int n;
+{
+    AtokObject obj = (AtokObject)w;
+    _XatokRecPtr acomm = obj->atok.comm;
+    int changed = FALSE;
+    int status = 0;
+
+    if (acomm == NULL) return -1; /* Not connected */
+
+    if (n >= 0) obj->atok.selected_cand = n;
+
+    /* ATOK $B$N3NDj(BFUNC$B$r8F$S=P$9!#(B */
+    if (changed) {
+	XtCallCallbackList((Widget)obj, obj->inputConv.fixcallback,
+			   (XtPointer)NULL);
+	/* ATOK $B$N%P%C%U%!$b(BFLUSH$B$9$k!#(B */
+	XtCallCallbackList((Widget)obj, obj->inputConv.textchangecallback,
+			   (XtPointer)NULL);
+    }
+
+    return status;
+}
+
+static int
+ConvertedString(w, encoding, format, length, string)
+Widget w;
+Atom *encoding;
+int *format;
+int *length;
+XtPointer *string;
+{
+    AtokObject obj = (AtokObject)w;
+    _XatokRecPtr acomm = obj->atok.comm;
+    wchar *wbuf, *wp;
+    int len, wlen;
+    extern int convJWStoCT();
+
+    if (acomm == NULL || acomm->nbr_of_seg == 0 || acomm->offset == 0)
+	return -1;
+
+    wlen = acomm->segments[acomm->offset -1].length;
+    wbuf = acomm->segments[acomm->offset -1].string;
+
+    /*
+     * Atok $B%*%V%8%'%/%H$O(B COMPOUND_TEXT $B%(%s%3!<%G%#%s%0$7$+%5%]!<%H$7$J$$(B
+     * COMPOUND_TEXT $B$KJQ49$9$k(B
+     */
+    *encoding = XA_COMPOUND_TEXT( XtDisplayOfObject(( Widget )obj ));
+    *format = 8;
+
+    /* COMPOUND_TEXT $B$O(B \r $B$,Aw$l$J$$$N$G(B \n $B$KJQ49$7$F$*$/(B */
+    for (wp = wbuf; *wp != 0; wp++ ) {
+	if (*wp == '\r') *wp = '\n';
+    }
+
+    *length = len = convJWStoCT(wbuf, (unsigned char *)NULL, 0);
+    *string = XtMalloc(len + 1);
+    (void)convJWStoCT(wbuf, (unsigned char *)*string, 0);
+
+    XatokShiftLeftAll(acomm);
+
+    return 0;
+}
+
+static int
+ClearConversion(w)
+Widget w;
+{
+    AtokObject obj = (AtokObject)w;
+    _XatokRecPtr acomm = obj->atok.comm;
+
+    if (acomm == NULL) return -1; /* Not connected */
+
+    XatokClearBuffer(acomm);
+    XtCallCallbackList((Widget)obj, obj->inputConv.textchangecallback,
+		       (XtPointer)NULL);
+    return 0;
+}
+
+static ICString *
+GetAuxSegments(w, n, ns, nc)
+Widget w;
+Cardinal *n, *ns, *nc;
+{
+    AtokObject obj = (AtokObject)w;
+    Cardinal nseg, nchar;
+
+    if (obj->atok.comm == NULL) return NULL; /* Not connected */
+
+    if (n) {
+	*n = obj->atok.aux_nseg;
+    }
+
+    if (obj->atok.aux_curseg < obj->atok.aux_nseg) {
+	nseg = obj->atok.aux_curseg;
+	nchar = 0;
+    }
+    else {
+	nseg = 0;
+	nchar = obj->atok.aux_length[0];
+    }
+    if (ns) {
+	*ns = nseg;
+    }
+    if (nc) {
+	*nc = nchar;
+    }
+
+    return obj->atok.aux_ics;
+}
+
+/* ARGSUSED */
+static int
+PreeditString(w, segn, offset, encoding, format, length, string)
+Widget w;
+int segn;
+int offset;
+Atom *encoding;
+int *format;
+int *length;
+XtPointer *string;
+{
+    AtokObject obj = (AtokObject)w;
+    _XatokRecPtr acomm = obj->atok.comm;
+    int i;
+    wchar *wbuf, *wp;
+    int	 len, wlen;
+    extern int convJWStoCT();
+
+    if (acomm == NULL) return -1;
+    if (segn < acomm->nbr_of_seg && offset >= acomm->segments[segn].length) {
+	/* $B%;%0%a%s%H$N:G8e(B */
+	++segn;
+	offset = 0;
+    }
+    if (segn >= acomm->nbr_of_seg || offset >= acomm->segments[segn].length) {
+	/* $B:o=|$5$l$?(B */
+	*encoding = XA_COMPOUND_TEXT(XtDisplayOfObject(w));
+	*format = 8;
+	*length = 0;
+	*string = (XtPointer)XtMalloc(1);
+	return 0;
+    }
+
+    wlen = 0;
+    for (i = segn; i < acomm->nbr_of_seg; i++) {
+	wlen += acomm->segments[i].length;
+    }
+    wlen -= offset;
+
+    wp = wbuf = (wchar *)XtMalloc((wlen + 1) * sizeof(wchar));
+    len = acomm->segments[segn].length - offset;
+    (void)bcopy((char *)(acomm->segments[segn].string + offset),
+		(char *)wp,
+		sizeof(wchar) * len);
+    wp += len;
+    for (i = segn + 1; i < acomm->nbr_of_seg; i++) {
+	len = acomm->segments[i].length;
+	(void)bcopy((char *)acomm->segments[i].string,
+		    (char *)wp,
+		    sizeof(wchar) * len);
+	wp += len;
+    }
+    wbuf[wlen] = 0;
+
+    /*
+     * Atok $B%*%V%8%'%/%H$O(B COMPOUND_TEXT $B%(%s%3!<%G%#%s%0$7$+%5%]!<%H$7$J$$(B
+     * COMPOUND_TEXT $B$KJQ49$9$k(B
+     */
+    *encoding = XA_COMPOUND_TEXT(XtDisplayOfObject((Widget)obj));
+    *format = 8;
+
+    /* COMPOUND_TEXT $B$O(B \r $B$,Aw$l$J$$$N$G(B \n $B$KJQ49$7$F$*$/(B */
+    for (wp = wbuf; *wp != 0; wp++) {
+	if (*wp == '\r') *wp = '\n';
+    }
+
+    *length = len = convJWStoCT(wbuf, (unsigned char *)NULL, 0);
+    *string = (XtPointer)XtMalloc(len + 1);
+    (void)convJWStoCT(wbuf, (unsigned char *)*string, 0);
+
+    /* wbuf $B$r(B free $B$7$F$*$/(B */
+    XtFree((char *)wbuf);
+
+    return 0;
+}
+
+/* ARGSUSED */
+static int
+StatusString(w, encoding, format, length, string, nchars)
+Widget w;
+Atom *encoding;
+int *format;
+int *length;
+XtPointer *string;
+int *nchars;
+{
+    ICString *seg;
+    wchar *wbuf, *wp;
+    int len, wlen;
+    extern int convJWStoCT();
+
+    seg = GetMode(w);
+    if (seg == NULL) {
+	*length = *nchars = 0;
+	return -1;
+    }
+
+    wlen = seg->nchars;
+    if (wlen <= 0) {
+	*length = *nchars = 0;
+	return -1;
+    }
+
+    /*
+     * data $B$KF~$C$F$$$kJQ49%F%-%9%H$O(B null $B%?!<%_%M!<%H$5$l$F$$$J$$$+$b(B
+     * $B$7$l$J$$$N$G!"$^$:%3%T!<$7$F(B null $B%?!<%_%M!<%H$9$k(B
+     */
+    wbuf = (wchar *)XtMalloc((wlen + 1) * sizeof(wchar));
+    (void)bcopy(seg->data, (char *)wbuf, sizeof(wchar) * wlen);
+    wbuf[wlen] = 0;
+
+    /*
+     * Canna $B%*%V%8%'%/%H$O(B COMPOUND_TEXT $B%(%s%3!<%G%#%s%0$7$+%5%]!<%H$7$J$$(B
+     * COMPOUND_TEXT $B$KJQ49$9$k(B
+     */
+    *encoding = XA_COMPOUND_TEXT(XtDisplayOfObject(w));
+    *format = 8;
+
+    /* COMPOUND_TEXT $B$O(B \r $B$,Aw$l$J$$$N$G(B \n $B$KJQ49$7$F$*$/(B */
+    for (wp = wbuf; *wp != 0; wp++) {
+	if (*wp == '\r') *wp = '\n';
+    }
+
+    *length = len = convJWStoCT(wbuf, (unsigned char *)NULL, 0);
+    *string = XtMalloc(len + 1);
+    (void)convJWStoCT(wbuf, (unsigned char *)*string, 0);
+    *nchars = seg->nchars;
+
+    /* wbuf $B$r(B free $B$7$F$*$/(B */
+    XtFree((char *)wbuf);
+
+    return 0;
+}
+
+/*
+ * Private FUNCTIONS
+ */
+
+static int
+bell()
+{
+    if (displaybell) {
+	XBell(displaybell, 0);
+    }
+    return 0;
+}
+
+static void
+fix(obj)
+AtokObject obj;
+{
+    /* $B3NDj$N=hM}(B */
+    XtCallCallbackList((Widget)obj, obj->inputConv.fixcallback,
+		       (XtPointer)NULL);	/* $B!)!)!)(B */
+}
+
+static void
+fixProcForAtok(obj, fixedstr, fixedlen)
+AtokObject obj;
+wchar *fixedstr;
+int fixedlen;
+{
+    int offset;
+    int i;
+
+    offset = obj->atok.comm->offset;
+
+    if (offset < ATOK_NSEG) {
+	XatokShiftRight(obj->atok.comm);
+	offset = obj->atok.comm->offset;
+    }
+    else {
+	XatokShiftLeft(obj->atok.comm);
+    }
+    copyInWchar(fixedstr, fixedlen,
+		&(obj->atok.comm->segments[offset-1].string),
+		&(obj->atok.comm->segments[offset-1].size),
+		&(obj->atok.comm->segments[offset-1].length));
+}
+
+/*
+ * $BJQ49=*N;(B
+ */
+static void
+convend(obj)
+AtokObject obj;
+{
+    XtCallCallbackList((Widget)obj, obj->inputConv.endcallback,
+		       (XtPointer)NULL);
+}
+
+/*
+ * keeping list of objects
+ */
+typedef struct _oblist_ {
+    AtokObject obj;
+    struct _oblist_ *next;
+} ObjRec;
+
+static ObjRec *ObjList = NULL;
+
+static void
+addObject(obj, sock, clntid, isConnect)
+AtokObject obj;
+int sock;
+int clntid;
+int isConnect;
+{
+    ObjRec *objp = XtNew(ObjRec);
+    _XatokRecPtr acomm;
+    char buf[256];
+
+    objp->obj = obj;
+    objp->next = ObjList;
+    ObjList = objp;
+
+    acomm = objp->obj->atok.comm;
+    /* bzero(acomm, sizeof(_XatokRecPtr)); */
+
+    acomm->convStatus = M_KEYCONV;	/* $B4A;zJQ49(B ON $B$N%b!<%I$K@_Dj(B */
+    /* acomm->mode.dsp = 1;	/* $B%5!<%P$+$i<hF@$9$k;v$R$i$,$J(B $B%b!<%I$K@_Dj(B */
+
+    if (isConnect) {
+	atokCEOpen(acomm->sock,
+		   clntid, objp->obj->atok.comm
+		   /*
+		   &objp->obj->atok.comm->NETrqst,
+		   &objp->obj->atok.comm->NETrslt);
+		   */
+		   );
+    }
+}
+
+static void
+deleteObject(obj)
+AtokObject obj;
+{
+    ObjRec *objp, *objp0;
+
+    for (objp0 = NULL, objp = ObjList;
+	 objp != NULL;
+	 objp0 = objp, objp = objp->next) {
+	if (objp->obj == obj) {
+	    if (objp0 == NULL) {
+		ObjList = objp->next;
+	    } else {
+		objp0->next = objp->next;
+	    }
+	    XtFree((char *)objp);
+	    return;
+	}
+    }
+}
+
+static void
+atokDisplay(obj, kstat)
+AtokObject obj;
+int *kstat;
+{
+    wchar *wbuf = obj->atok.comm->wbuf;
+    int len = obj->atok.comm->wlen;
+
+    /*
+     * len > 0 $B$N;~$O!"(B atokClntEvent $B$GJQ49$r9T$C$?7k2L!"(B
+     * $B3NDjJ8;zNs$,$"$k;~$G$"$k!#(B
+     */
+    if (len > 0) {
+	/*
+	XtCallCallbackList((Widget)obj, obj->inputConv.fixcallback,
+			   (XtPointer)NULL);
+	*/
+	fixProcForAtok(obj, wbuf, len);
+	fix(obj);
+    }
+    changeTextForAtok(obj, kstat);
+
+    /*
+     * $BI=<($9$kFbMF(B($B%F%-%9%H(B)$B$,JQ$o$C$F$$$?>l9g$K$O!"I=<($7$J$*$9!#(B
+     */
+    if ( obj->atok.textchanged ) {
+	XtCallCallbackList((Widget)obj, obj->inputConv.textchangecallback,
+			   (XtPointer)NULL);
+	obj->atok.textchanged = False;
+    }
+}
+
+static int
+atokCandDisplay(obj, aajcode)
+AtokObject obj;
+int aajcode;
+{
+    int	status = 0;
+
+    /*
+     * $B8uJd%&%$%s%I%&I=<(;~$N%-!<F~NO(B
+     * $B%-!<$O(B key.c $B$GDj5A$7$F$$$k$b$N$r;HMQ$9$k;v!#(B
+     */
+    switch( aajcode ) {
+    case XFER:
+#ifdef CAND_PAGE
+	startSelection(obj, 1);
+#else
+	startSelection(obj, 0);
+#endif
+	break;
+    case SPACE:
+    case RIGHT:
+    case CTR_F:
+#ifdef	CAND_PAGE
+	moveRight(obj, 1);
+#else
+	moveRight(obj, 0);
+#endif	
+	break;
+    case LEFT:
+    case CTR_B:
+#ifdef	CAND_PAGE
+	moveLeft(obj, 1);
+#else
+	moveLeft(obj, 0);
+#endif
+	break;
+    case UP:
+    case CTR_P:
+	moveSelection(obj, ICMoveUp);
+	break;
+    case DOWN:
+    case CTR_N:
+	moveSelection(obj, ICMoveDown);
+	break;
+    case CTR_E:
+	moveSelection(obj, ICMoveLast);
+	break;
+    case CTR_A:
+	moveSelection(obj, ICMoveFirst);
+	break;
+    case CR:
+    case VKEY|FUNC_KAKU_BUBUN:
+	endSelection(obj, FALSE, TRUE);
+	status = 1;
+	break;
+    case CTR_G:
+	endSelection(obj, TRUE, TRUE);
+	obj->atok.cur_cand = -1;
+	break;
+    case CTR_DEL:	/* 616 */
+    case EESC:
+    case FUNC_CNV_CANCL:	/* 1999/06/30 */
+	endSelection(obj, TRUE, TRUE);
+	obj->atok.cur_cand = -1;
+	status = 1;
+	break;
+    case 0:
+    default:
+	break;
+    }
+    return status;
+}
+	
+static int
+atokAuxDisplay(obj, op)
+AtokObject obj;
+opMode op;
+{
+    ICAuxControlArg arg;
+    int status = 1;
+
+    switch (obj->atok.comm->menuStatus) {
+    case ICAuxEnd :
+	if (obj->atok.comm->convStatus & op) {
+	    obj->atok.comm->convStatus ^= op;
+	}
+	obj->atok.comm->convStatus |= M_KEYCONV;
+	status = 0;
+    case ICAuxStart :
+    case ICAuxChange :
+	arg.command = obj->atok.comm->menuStatus;
+	break;
+    default :
+	return -1;
+    }
+    if (arg.command != ICAuxEnd) {
+	changeTextForAtokAUX(&obj->atok);
+    }
+
+    XtCallCallbackList((Widget)obj, obj->inputConv.auxcallback,
+		       (XtPointer)&arg);
+	
+    return status;
+}
+
+/*
+ * Utils
+ */
+/*
+ * $B8uJd0lMwI=<($N4X?t74(B
+ */
+/*
+ * $B40(B
+ */
+static void
+moveLeft(obj, cand_page)
+AtokObject obj;
+int cand_page;
+{
+    _XatokRecPtr comm;
+    int pgMax;
+    int move = TRUE;
+    ICSelectionControlArg arg;
+    int kohoNum;
+
+    if (!cand_page) {
+	moveSelection(obj, ICMoveLeft);
+	return;
+    }
+    comm = obj->atok.comm;
+
+    querySelection(obj);
+    pgMax = comm->kohoMax;
+
+    if (comm->kohoPos == 0) {
+	/*
+	 *  $B:G8e$N%Z!<%8$rI=<($7$F$$$k!#(B
+	 */
+	if (comm->kohoCurPage + 1 == comm->kohoPageNbr) {
+		/*
+		 * $B:G8e$N%Z!<%8$@$,!":G=i$N%Z!<%8$G$"$k(B
+		 * $B$7$?$,$C$FJQ99$9$k%Z!<%8$O$J$$!#(B
+		 */
+		if (comm->kohoCurPage == 0) {
+		    move = TRUE;
+		}
+		else {
+		    comm->kohoCurPage--;
+		    move = FALSE;
+		}
+	}
+	else if (comm->kohoCurPage == 0) {
+	    comm->kohoCurPage = comm->kohoPageNbr - 1;
+	    move = FALSE;
+	}
+	else  {
+	    comm->kohoCurPage--;
+	    move = FALSE;
+	}
+    }
+
+    if (move == FALSE) {
+	endSelection(obj, FALSE, FALSE);
+	kohoNum = comm->kohoNum2 > (comm->kohoCurPage + 1) * pgMax ?
+		pgMax - 1 : comm->kohoNum2 - (comm->kohoCurPage * pgMax)  - 1;
+	makeCandList(obj, obj->atok.cand_lists_ics, pgMax, pgMax + 1,
+		     comm->kohoCurPage, kohoNum, 1);
+	return;
+    }
+
+    moveSelection(obj, ICMoveLeft);
+}
+	
+static void
+moveRight(obj, cand_page)
+AtokObject obj;
+int cand_page;
+{
+    _XatokRecPtr comm;
+    int pgMax;
+    int move = TRUE;
+    int kohoNum;
+    ICSelectionControlArg arg;
+
+    if (!cand_page) {
+	moveSelection(obj, ICMoveRight);
+	return;
+    }
+    comm = obj->atok.comm;
+
+    querySelection(obj);
+    /* pgMax = CAND_COLS * CAND_ROWS; */
+    pgMax = comm->kohoMax;
+
+    if (comm->kohoPos == pgMax - 1) {
+	if (comm->kohoNum2 > (comm->kohoCurPage + 1) * pgMax) {
+	    comm->kohoCurPage++;
+	}
+	else {
+	    comm->kohoCurPage = 0;
+	}
+	move = FALSE;
+	comm->kohoPos = 0;
+    }
+    else if (comm->kohoPos == comm->kohoNum2 - (comm->kohoCurPage * pgMax) - 1)
+    {
+	/* if (comm->kohoCurPage != 0) move = FALSE; */
+	comm->kohoCurPage = 0;
+	move = FALSE;
+	comm->kohoPos = 0;
+    }
+    if (move == FALSE) {
+	endSelection(obj, FALSE, FALSE);
+	makeCandList(obj, obj->atok.cand_lists_ics, pgMax, pgMax + 1,
+		     comm->kohoCurPage, 0, 1);
+	comm->kohoPos = 0;
+	return;
+
+    }
+
+    moveSelection( obj, ICMoveRight );
+}
+		
+static void
+setSelection(obj, kohoNum)
+AtokObject obj;
+int kohoNum;
+{
+    ICSelectionControlArg arg;
+
+    /* Set current candidate */
+    arg.command = ICSelectionSet;
+    arg.u.current_item = kohoNum;	/* $B8uJd(BNO$B$r@_Dj$9$k;v(B */
+    XtCallCallbackList((Widget)obj, obj->inputConv.selectioncallback,
+		       (XtPointer)&arg);
+}
+
+static void
+moveSelection(obj, dir)
+AtokObject obj;
+int dir;
+{
+    ICSelectionControlArg arg;
+
+    arg.command = ICSelectionMove;
+    arg.u.dir = dir;
+    XtCallCallbackList((Widget)obj, obj->inputConv.selectioncallback,
+		       (XtPointer)&arg);
+    querySelection(obj);
+}
+
+static void
+querySelection(obj)
+AtokObject obj;
+{
+    ICSelectionControlArg arg;
+    arg.command = ICSelectionGet;
+    arg.u.current_item = -1;
+    XtCallCallbackList((Widget)obj, obj->inputConv.selectioncallback,
+		       (XtPointer)&arg);
+
+    obj->atok.selected_cand = arg.u.current_item;
+    obj->atok.comm->kohoPos = arg.u.current_item;
+}
+
+static void
+endSelection(obj, isabort, modeChange)
+AtokObject obj;
+int isabort;
+int modeChange;
+{
+    ICSelectionControlArg arg;
+    int selected;
+
+    if (modeChange) {
+	obj->atok.comm->convStatus ^= M_CAND;
+    }
+    arg.command = ICSelectionEnd;
+    arg.u.current_item = -1;
+    XtCallCallbackList((Widget)obj, obj->inputConv.selectioncallback,
+		       (XtPointer)&arg);
+
+    if (!isabort && (selected = arg.u.current_item) >= 0) {
+	insertSelection(obj, selected);
+    }
+}
+
+static void
+insertSelection(obj, selected)
+AtokObject obj;
+int selected;
+{
+    obj->atok.cur_cand = selected;
+    obj->atok.comm->kohoPos = selected;
+
+    /*
+     * ATOK CE $B$KA*Br$5$l$?$3$H$rDLCN$9$kI,MW$"$j(B
+     * API$B$,2r$j<!Bh(B $B%3!<%G%#%s%0(B
+     */
+    return;
+}
+
+/*
+ * $B8uJd%j%9%H$N$?$a$N%P%C%U%!$rMQ0U$9$k!#(B
+ */
+static int
+allocCandList(obj, nbr, cur)
+AtokObject obj;
+int nbr;
+int *cur;
+{
+    ICString *p;
+
+    /*
+     * $B4{$KI,MW$J%5%$%:0J>e(B $B3NJ]$5$l$F$$$k>l9g$K$O2?$b$7$J$$!#(B
+     */
+    if (nbr <= obj->atok.cand_list_size) {
+	return nbr;
+    }
+
+    /*
+     * $B$^$@(B $B3NJ]$5$l$F$$$J$$;~$K$O!"?75,$K!"4{$K(B
+     * $B3NJ]$5$l$F$$$kNN0h$r9-$2$?$$;~$K$O(B realloc $B$9$k!#(B
+     */
+    if (obj->atok.cand_list_size == 0) {
+	p = (ICString *)XtMalloc(nbr * sizeof(ICString));
+    }
+    else {
+	p = (ICString *)XtRealloc((char *)obj->atok.cand_lists_ics,
+				  nbr * sizeof(ICString));
+    }
+    obj->atok.cand_lists_ics = p;
+    obj->atok.cand_list_size = nbr;
+    *cur = 0;
+
+    return nbr;
+}
+
+/*
+ * $B%-!<F~NO8e!"(BCE$B$K$h$C$FJQ49$5$l$?%G!<%?$r2hLL$KI=<($9$k$?$a$N(B
+ * $B%3%s%H%m!<%k$r9T$&=hM}$N%a%$%s$G$"$k!#(B
+ * $BI=<(%;%0%a%s%H$N7W;;!"%,%$%I%i%$%s$J$I$NI=<(J8;zNs$N:n@.$r9T$C$F$$$k!#(B
+ *
+ * $B$3$3$G9T$&$N$OBg$-$/J,$1$F#3$D$N=hM}$G$"$k!#(B
+ *	1 $BF~NOESCf$NJ8;zNs$N(BECHO BACK
+ *	2 $BF~NO%b!<%I$,JQ49$5$l$?;~$N(B $BF~NO%b!<%II=<(J8;zNs$N@_Dj(B
+ *	3 $B0lMwI=<($7$F$$$k;~$N(B
+ */
+static int
+changeTextForAtok(obj, kstat)
+AtokObject obj;
+int *kstat;
+{
+    _XatokRecPtr acomm = obj->atok.comm;
+    int remain;
+    int offset = acomm->offset;
+    int len = acomm->echoLen;
+    int i;
+    wchar *wp;
+
+    if (len == 0) {
+	acomm->cur_seg = offset;
+	acomm->nbr_of_seg = offset;
+	acomm->segments[offset+0].length
+		= acomm->segments[offset+1].length
+		= acomm->segments[offset+2].length = 0;
+	if (*kstat == XKEY_FIX) {
+	    obj->atok.textchanged = TRUE;
+	}
+	obj->atok.textchanged = TRUE;
+    }
+    else if (len > 0) {
+	/* $B%-!<F~NO$,$"$C$?>l9g(B */
+	acomm->segments[offset+1].length
+		= acomm->segments[offset+2].length = 0;
+	if (acomm->revLen > 0) {
+	    if ( acomm->revPos == 0 ) {
+		remain = acomm->echoLen - acomm->revLen;
+		/*
+		 * REVERSE :
+		 * REVERSE : NORMAL
+		 * $BH?E>I=<($,#1%;%0%a%s%HL\$N>l9g$K$O(B
+		 * str[0] $B$KJ8;z$rB-$9(B
+		 */
+		copyInWchar(acomm->echoStr, acomm->revLen,
+			    &(acomm->segments[offset+0].string),
+			    &(acomm->segments[offset+0].size),
+			    &(acomm->segments[offset+0].length));
+		acomm->cur_seg = offset;
+		acomm->nbr_of_seg = offset + 1;
+		/*
+		 * $B#2%;%0%a%s%HL\$,B8:_$9$k>l9g$K$O!"(B
+		 * $B#2%;%0%a%s%HL\$b@_Dj$9$k!#(B
+		 */
+		if (remain) {
+		    copyInWchar(acomm->echoStr + acomm->revLen, remain,
+				&(acomm->segments[offset+1].string),
+				&(acomm->segments[offset+1].size),
+				&(acomm->segments[offset+1].length));
+		    acomm->nbr_of_seg = offset+2;
+		}
+	    }
+	    else {
+		/*
+		 * NORMAL : REVERSE
+		 * NORAML : REVERSE : NORMAL
+		 *
+		 * $B$3$3$K$/$k$H$-$O(B $B#2HVL\0J9_$J$N$G(B str0,
+		 * str1  $B$O@dBP$KB8:_$9$k!#(B
+		 * $BH?E>I=<($,$"$j!"3n$D#1%;%0%a%s%H$,%N!<%^%k(B
+		 * $BI=<($H$$$&;v$O#2%;%0%a%s%HL\$,H?E>I=<($G(B
+		 * $B$"$k!#(B
+		 */
+		remain = acomm->echoLen - acomm->revPos - acomm->revLen;
+		copyInWchar(acomm->echoStr, acomm->revPos,
+			    &(acomm->segments[offset+0].string),
+			    &(acomm->segments[offset+0].size),
+			    &(acomm->segments[offset+0].length));
+		copyInWchar(acomm->echoStr + acomm->revPos, acomm->revLen,
+			    &(acomm->segments[offset+1].string),
+			    &(acomm->segments[offset+1].size),
+			    &(acomm->segments[offset+1].length));
+		acomm->cur_seg = offset+1;
+		acomm->nbr_of_seg = offset+2;
+		/*
+		 * NORMAL : REVERSE : NORMAL $B$N>l9g(B
+		 */
+		if (remain){
+		    copyInWchar(acomm->echoStr + acomm->revPos + acomm->revLen,
+				remain,
+				&(acomm->segments[offset+2].string),
+				&(acomm->segments[offset+2].size),
+				&(acomm->segments[offset+2].length));
+		    acomm->nbr_of_seg = offset+3;
+		}
+	    }
+	}
+	else {
+	    /*
+	     * NORMAL $BI=<((BONLY
+	     */
+	    copyInWchar(acomm->echoStr, acomm->echoLen,
+			&(acomm->segments[offset+0].string),
+			&(acomm->segments[offset+0].size),
+			&(acomm->segments[offset+0].length));
+	    acomm->segments[1].length = acomm->segments[2].length = 0;
+	    acomm->nbr_of_seg = offset+1;
+	    acomm->cur_seg = offset+1;
+	}
+	obj->atok.textchanged = TRUE;
+    }
+}
+
+static int
+changeTextForAtokAUX(obj)
+AtokPart *obj;
+{
+    int remain;
+    int len;
+    int i;
+    _XatokRecPtr acomm = obj->comm;
+
+    /*
+     * $B$3$3$G(B AUX $B$KI=<($9$kJ8;z$r:n@.$9$k!#(B
+     */
+    if (obj->comm->convStatus & M_SYSLINE) {
+	auxSyslineString(acomm, acomm->curAux,
+			 acomm->aux_echoStr, &acomm->aux_echoLen,
+			 &acomm->aux_revLen, &acomm->aux_revPos);
+    }
+    else {
+	auxMenuString(acomm, acomm->curAux,
+		      acomm->aux_echoStr, &acomm->aux_echoLen,
+		      &acomm->aux_revLen, &acomm->aux_revPos);
+    }
+    /*
+     * $BI=<($9$kJ8;z$,$J$$>l9g$O%j%?!<%s$9$k!#(B
+     */
+    if ( acomm->aux_echoLen == 0 ) {
+	obj->aux_curseg = 0;
+	obj->aux_nseg = 0;
+	obj->aux_length[0] = obj->aux_length[1] = obj->aux_length[2] = 0;
+	return 0;
+    }
+    obj->aux_length[1] = obj->aux_length[2] = 0;
+    if (acomm->aux_revLen > 0) {
+	if (acomm->aux_revPos == 0) {
+	    remain = acomm->aux_echoLen - acomm->aux_revLen;
+	    copyInWchar(acomm->aux_echoStr, acomm->aux_revLen,
+			&obj->aux_string[0],
+			&obj->aux_size[0],
+			&obj->aux_length[0]);
+	    obj->aux_curseg = 0;
+	    obj->aux_nseg = 1;
+	    /*
+	     * $B#2%;%0%a%s%HL\$,B8:_$9$k>l9g$K$O!"(B
+	     * $B#2%;%0%a%s%HL\$b@_Dj$9$k!#(B
+	     */
+	    if (remain) {
+		copyInWchar(acomm->aux_echoStr + acomm->aux_revLen, remain,
+			    &obj->aux_string[1],
+			    &obj->aux_size[1],
+			    &obj->aux_length[1]);
+		obj->aux_nseg = 2;
+	    }
+	}
+	else {
+	    /*
+	     * NORMAL : REVERSE
+	     * NORAML : REVERSE : NORMAL
+	     *
+	     * $B$3$3$K$/$k$H$-$O(B $B#2HVL\0J9_$J$N$G(B str0,
+	     * str1  $B$O@dBP$KB8:_$9$k!#(B
+	     * $BH?E>I=<($,$"$j!"3n$D#1%;%0%a%s%H$,%N!<%^%k(B
+	     * $BI=<($H$$$&;v$O#2%;%0%a%s%HL\$,H?E>I=<($G(B
+	     * $B$"$k!#(B
+	     */
+	    remain = acomm->aux_echoLen - acomm->aux_revPos - acomm->aux_revLen;
+	    copyInWchar(acomm->aux_echoStr, acomm->aux_revPos,
+			&obj->aux_string[0],
+			&obj->aux_size[0],
+			&obj->aux_length[0]);
+	    copyInWchar(acomm->aux_echoStr + acomm->aux_revPos,
+			acomm->aux_revLen,
+			&obj->aux_string[1],
+			&obj->aux_size[1],
+			&obj->aux_length[1]);
+	    obj->aux_curseg = 1;
+	    obj->aux_nseg = 2;
+	    /*
+	     * NORMAL : REVERSE : NORMAL $B$N>l9g(B
+	     */
+	    if (remain) {
+		copyInWchar(acomm->aux_echoStr + acomm->aux_revPos
+							+ acomm->aux_revLen,
+			    remain,
+			    &obj->aux_string[2],
+			    &obj->aux_size[2],
+			    &obj->aux_length[2] );
+		obj->aux_nseg = 3;
+	    }
+	}
+    }
+    else {
+	/*
+	 * NORMAL $BI=<((BONLY
+	 */
+	copyInWchar(acomm->aux_echoStr, acomm->aux_echoLen,
+		    &obj->aux_string[0],
+		    &obj->aux_size[0],
+		    &obj->aux_length[0]);
+	obj->aux_length[1] = obj->aux_length[1] = 0;
+	obj->aux_nseg = 1;
+	obj->aux_curseg = 1;
+    }
+
+    for (i = 0; i < obj->aux_nseg; i++) {
+	obj->aux_ics[i].data = (char *)obj->aux_string[i];
+	obj->aux_ics[i].nchars = obj->aux_length[i];
+	obj->aux_ics[i].nbytes = obj->aux_length[i] * sizeof(wchar);
+	obj->aux_ics[i].attr = ICAttrConverted;
+    }
+    if (obj->aux_curseg < obj->aux_nseg) {
+	obj->aux_ics[obj->aux_curseg].attr |= ICAttrCurrentSegment;
+    }
+    return obj->aux_nseg;
+}
+
+/*
+ * $B8uJdJ8;zNs4X78$N%=!<%9(B
+ */
+
+/* Page */
+/*
+ * [$B4X?tL>(B]
+ *		()
+ * [$BI=Bj(B]
+ *		
+ * [$B8F=P7A<0(B]
+ *		
+ * [$B0z?t(B]
+ *		$B7?(B        : $BL>(B       $B>N(B   : IO : $B@b(B      $BL@(B
+ *	
+ *	
+ * [$BJV$jCM(B]
+ *		
+ * [$B;HMQ4X?t(B]
+ *	
+ * [$B5!G=(B]
+ *	Event $B$,H/@8$7$F!"(B CE$B$h$j(B $B8uJd%j%9%H$,<hF@$7$?8e$KI=<($r(B
+ *	 $B3+;O$9$k;~$K8F$S=P$5$l$k!#(B
+ *
+ */
+static void
+startSelection(obj, cand_page)
+AtokObject obj;
+int cand_page;
+{
+    _XatokRecPtr comm = obj->atok.comm;
+    ICString *icsp;
+    int i, n;
+    int pgMax;
+    int oldSize;
+
+    n = obj->atok.nbr_of_cand = comm->kohoNum2;
+    if (cand_page) {
+	pgMax = CAND_COLS * CAND_ROWS;
+    }
+    else {
+	pgMax = n;
+    }
+    comm->kohoMax = pgMax;
+
+    comm->kohoPageNbr = (comm->kohoNum2 + pgMax - 1) / pgMax;
+    comm->kohoCurPage = 0;		/* $B%Z!<%8$O#0$+$i;O$^$k!#(B*/
+    /* comm->kohoPos = 1;		/* ATOKCE $B$N%j%?!<%s$r@_Dj(B */
+
+    /*
+     * $B$^$:$O(B $B8uJd$r@_Dj$9$k(BICSString $B$N%a%b%j!<$r3NJ]$7$F!"(B
+     * $B=i4|2=$9$k!#(B
+     */
+    oldSize = obj->atok.cand_list_size;
+    if (cand_page) {
+	/*
+	 * $B8uJdI=<($N:GBg?t$,7h$^$C$F$$$k>l9g$O!"(B
+	 * $B8uJd$N$?$a$N(BICS $B$,<hF@$5$l$F$$$k$+!"$$$J$$$+$N>l9g$7$+$J$$(B
+	 */
+	n = pgMax + 1;		/* +1 $B$O8uJdHV9fI=<(MQ(B */
+	if (obj->atok.cand_list_size == 0) {
+	    icsp = (ICString *)XtMalloc(n * sizeof(ICString));
+	    obj->atok.cand_list_size = n;
+	    obj->atok.cand_lists_ics = icsp;
+	}
+    }
+    else {
+	if (obj->atok.cand_list_size == 0) {
+	    icsp = (ICString *)XtMalloc(n * sizeof(ICString));
+	    obj->atok.cand_list_size = n;
+	    obj->atok.cand_lists_ics = icsp;
+	}
+	else if (obj->atok.cand_list_size < n) {
+	    icsp = (ICString *)XtRealloc((char *)obj->atok.cand_lists_ics,
+					 n * sizeof(ICString));
+	    obj->atok.cand_list_size = n;
+	    obj->atok.cand_lists_ics = icsp;
+	}
+	else {
+	    icsp = obj->atok.cand_lists_ics;
+	}
+    }
+
+    /*
+     * $B<hF@$5$l$F$$$k8uJd$r@_Dj$9$k!#(B
+     */
+    icsp = obj->atok.cand_lists_ics;
+#ifdef CAND_PAGE
+    makeCandList(obj, icsp, pgMax, n, comm->kohoPos / pgMax, comm->kohoPos, 1);
+#else
+    makeCandList(obj, icsp, pgMax, n, comm->kohoPos / pgMax, comm->kohoPos, 0);
+#endif
+}
+
+static int
+makeCandList(obj, icsp, pgMax, icsNum, page, kohoNum, cand_page)
+AtokObject obj;
+ICString *icsp;	/* $BI=<(MQ%G!<%?(B */
+int pgMax;	/* $B#1%Z!<%8$N:GBg?t(B */
+int icsNum;
+int page;	/* $BI=<($9$k%Z!<%8(B */
+int kohoNum;
+int cand_page;
+{
+    _XatokRecPtr comm = obj->atok.comm;
+    int i, j, n;
+    int len, ksize, klen;
+    int bytes, chars;
+    int es;
+    unsigned char *ep;
+    wchar wbuf[BUFSIZ];
+    char euc[BUFSIZ];
+    int stNbr;
+    int maxCand = 0;
+    ICSelectionControlArg arg;
+    ICString *ticsp = icsp;	/* $BI=<(MQ%G!<%?(B */
+
+    for (i = 0; i < icsNum; i++, ticsp++) {
+	/* if (i < oldSize) continue; */
+	ticsp->nbytes = (unsigned short)0;
+	ticsp->nchars = (unsigned short)0;
+	ticsp->data = (char *)0;
+	ticsp->attr = 0;
+    }
+    stNbr = page * pgMax;
+
+    ksize = 0;
+    for(i = 0; i < stNbr; i++) {
+	ksize += comm->kohoLenPtr[i];
+    }
+    if (cand_page) {
+	n = comm->kohoNum2 - stNbr > pgMax ? pgMax : comm->kohoNum2 - stNbr;
+    }
+    else {
+	n = pgMax;
+    }
+    for (j = 0; j < n; j++) {
+	bzero(euc, sizeof(euc));
+	klen = comm->kohoLenPtr[i];
+	es = klen * 3;
+	ep = (unsigned char *)XtMalloc(es);
+	bzero(ep, es);
+	ucs2euc(&comm->kohoStrPtr[ksize], klen, ep, es, 0x0000a2ae);
+	es = strlen(ep);
+	ksize += klen;
+#ifdef CAND_PAGE
+	sprintf(euc, "%2d %s", j + 1, ep);
+#else
+	strcpy(euc, ep);
+#endif
+	es = strlen(euc);
+	es = euc2wcs(euc, es, wbuf);
+	XtFree((char *)ep);
+
+	bytes = (int)icsp->nbytes;
+	chars = (int)icsp->nchars;
+	copyInWchar(wbuf, es, (wchar **)&(icsp->data), &bytes, &chars);
+	icsp->nbytes = (unsigned short)bytes;
+	icsp->nchars = (unsigned short)chars;
+	if (chars > maxCand) {
+	    maxCand = chars;
+	}
+	icsp->attr = ICAttrNormalString;
+	icsp++;
+	i++;
+    }
+    for(; j < pgMax; j++) {
+	icsp->nbytes = (unsigned short)0;
+	icsp->nchars = (unsigned short)0;
+	icsp->attr = ICAttrNormalString;
+	icsp->data = (char *)0;
+	icsp++;
+    }
+    if (cand_page) {
+#if SHOW_PAGE
+	sprintf(euc, "%d/%d", page * pgMax + 1, comm->kohoNum2);
+#else
+	sprintf(euc, "Page %d/%d", page + 1,
+				   (comm->kohoNum2 + pgMax - 1) / pgMax);
+#endif
+	es = strlen(euc);
+	es = euc2wcs(euc, es, wbuf);
+	bytes = (int)icsp->nbytes;
+	chars = (int)icsp->nchars;
+	copyInWchar(wbuf, es, ( wchar ** )&( icsp->data ), &bytes, &chars);
+
+	icsp->nbytes = (unsigned short)bytes;
+	icsp->nchars = (unsigned short)chars;
+	icsp->attr = ICAttrNormalString;
+    }
+
+    comm->kohoCurPage = page;
+
+    arg.command = ICSelectionStart;
+    arg.u.selection_kind = ICSelectionCandidates;
+    XtCallCallbackList((Widget)obj, obj->inputConv.selectioncallback,
+		       (XtPointer)&arg);
+
+    /* Set current candidate */
+    arg.command = ICSelectionSet;
+    arg.u.current_item = kohoNum;	/* $B8uJd(BNO$B$r@_Dj$9$k;v(B */
+    XtCallCallbackList((Widget)obj, obj->inputConv.selectioncallback,
+		       (XtPointer)&arg);
+
+    return page;
+}
+
+
+/*
+   copyInWchar -- wchar $B$r%3%T!<$9$k!#(B
+
+	ws, wlen $B$G<($5$l$?(B wchar $BJ8;zNs$r(B wsbuf $B$N%]%$%s%H@h$N%P%C%U%!$K3J(B
+	$BG<$9$k!#(Bwsbuf $B$N%5%$%:$O(B wssize $B$N%]%$%s%H@h$K3JG<$5$l$F$$$kCM$G;X(B
+	$BDj$5$l$k$,!"$=$l$G$O>.$5$$;~$O(B copyInWchar $BFb$G(B XtRealloc $B$5$l!"?7(B
+	$B$?$K%"%m%1!<%H$5$l$?%P%C%U%!$,(B wsbuf $B$N%]%$%s%H@h$K3JG<$5$l$k!#$^$?!"(B
+	$B%P%C%U%!$N?7$?$J%5%$%:$,(B wssize $B$N%]%$%s%H@h$K3JG<$5$l$k!#F@$i$l$?(B
+	$BJ8;z?t$,(Bwslen $B$N%]%$%s%H@h$K3JG<$5$l$k!#(B
+*/
+static void
+copyInWchar(ws, wlen, wsbuf, wssize, wslen)
+wchar *ws;
+int wlen;
+wchar **wsbuf;
+int *wssize;
+int *wslen;
+{
+    int i;
+
+    if (*wssize == 0) {
+	*wsbuf = (wchar *)XtMalloc((wlen + 1) * sizeof(wchar));
+	*wssize = wlen + 1;
+    }
+    if (wlen + 1 > *wssize) {
+	*wsbuf = (wchar *)XtRealloc((char *)*wsbuf, (wlen + 1) * sizeof(wchar));
+	*wssize = wlen + 1;
+    }
+    *wslen = wlen;
+    (void)bcopy(ws, *wsbuf, wlen * sizeof(wchar));
+    *(*wsbuf + wlen) = (wchar)0;
+}
+/* Atok.c */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/AuxPanel.c	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,606 @@
+#ifndef lint
+static char *rcsid = "$Id: AuxPanel.c,v 1.23 1994/09/01 06:33:41 ishisone Exp $";
+#endif
+/*
+ * Copyright (c) 1990  Software Research Associates, Inc.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted, provided
+ * that the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Software Research Associates not be
+ * used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission.  Software Research
+ * Associates makes no representations about the suitability of this software
+ * for any purpose.  It is provided "as is" without express or implied
+ * warranty.
+ *
+ * Author:  Makoto Ishisone, Software Research Associates, Inc., Japan
+ */
+
+/* Copyright 1991 NEC Corporation, Tokyo, Japan.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and that
+ * both that copyright notice and this permission notice appear in
+ * supporting documentation, and that the name of NEC Corporation
+ * not be used in advertising or publicity pertaining to distribution
+ * of the software without specific, written prior permission.  NEC 
+ * Corporation makes no representations about the suitability of this
+ * software for any purpose.  It is provided "as is" without express
+ * or implied warranty.
+ *
+ * NEC CORPORATION DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN 
+ * NO EVENT SHALL NEC CORPORATION BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF 
+ * USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR 
+ * OTHER TORTUOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR 
+ * PERFORMANCE OF THIS SOFTWARE. 
+ *
+ * Author: Akira Kon, NEC Corporation.  (kon@d1.bs2.mt.nec.co.jp)
+ */
+
+/*
+  $BLdBjE@(B
+  $B!&J8;zIA2h$,A4It=q$-D>$7=hM}$K$J$C$F$$$k!#(B
+  $B!&$@$l$b(B Destroy $B$r8F$s$G$/$l$J$$$N$G$A$g$C$H$4$_$,;D$k!#(B
+ */
+
+#include <X11/IntrinsicP.h>
+#include <X11/StringDefs.h>
+#if XtSpecificationRelease > 4
+#include <X11/Xfuncs.h>
+#endif
+#include "AuxPanelP.h"
+#include "ConvDisp.h"
+#include "WStr.h"
+
+#define DEBUG_VAR debug_AuxPanel
+#include "DebugPrint.h"
+
+static XtResource resources[] = {
+#define offset(field) XtOffset(AuxPanelWidget, cpanel.field)
+    { XtNforeground, XtCForeground, XtRPixel, sizeof(Pixel),
+	offset(foreground), XtRString, XtDefaultForeground },
+    { XtNhorizontalSpacing, XtCSpacing, XtRDimension, sizeof(Dimension),
+	offset(hspace), XtRString, "6" },
+    { XtNverticalSpacing, XtCSpacing, XtRDimension, sizeof(Dimension),
+	offset(vspace), XtRString, "4" },
+    { XtNdefaultWidth, XtCDefaultWidth, XtRDimension, sizeof(Dimension),
+	offset(defaultwidth), XtRString, "400" },
+    { XtNcursor, XtCCursor, XtRCursor, sizeof(Cursor),
+	offset(cursor), XtRImmediate, (XtPointer)None },
+    { XtNcallback, XtCCallback, XtRCallback, sizeof(XtPointer),
+	offset(callback), XtRCallback, NULL },
+#undef offset
+};
+
+static void Initialize(), Destroy();
+static void Realize();
+static void Redisplay();
+static void Resize();
+static Boolean SetValues();
+static XtGeometryResult QueryGeometry();
+static void InsertChild();
+
+static void GetInvGC();
+static void ComputeSize();
+static void Layout();
+
+static void freeDisplaySegments();
+static void UpdateAuxDisplay();
+
+static CompositeClassExtensionRec CompositeExtension = {
+    /* next_extension		*/	NULL,
+    /* record_type		*/	NULLQUARK,
+    /* version			*/	XtCompositeExtensionVersion,
+    /* record_size		*/	sizeof(CompositeClassExtensionRec),
+    /* accept_objects		*/	True,
+};
+
+AuxPanelClassRec auxPanelClassRec = {
+  { /* core fields */
+    /* superclass		*/	(WidgetClass) &compositeClassRec,
+    /* class_name		*/	"AuxPanel",
+    /* widget_size		*/	sizeof(AuxPanelRec),
+    /* class_initialize		*/	NULL,
+    /* class_part_initialize	*/	NULL,
+    /* class_inited		*/	FALSE,
+    /* initialize		*/	Initialize,
+    /* initialize_hook		*/	NULL,
+    /* realize			*/	Realize,
+    /* actions			*/	NULL,
+    /* num_actions		*/	0,
+    /* resources		*/	resources,
+    /* num_resources		*/	XtNumber(resources),
+    /* xrm_class		*/	NULLQUARK,
+    /* compress_motion		*/	TRUE,
+    /* compress_exposure	*/	TRUE,
+    /* compress_enterleave	*/	TRUE,
+    /* visible_interest		*/	FALSE,
+    /* destroy			*/	Destroy,
+    /* resize			*/	Resize,
+    /* expose			*/	Redisplay,
+    /* set_values		*/	SetValues,
+    /* set_values_hook		*/	NULL,
+    /* set_values_almost	*/	XtInheritSetValuesAlmost,
+    /* get_values_hook		*/	NULL,
+    /* accept_focus		*/	NULL,
+    /* version			*/	XtVersion,
+    /* callback_private		*/	NULL,
+    /* tm_table			*/	NULL,
+    /* query_geometry		*/	QueryGeometry,
+    /* display_accelerator	*/	XtInheritDisplayAccelerator,
+    /* extension		*/	NULL
+  },
+  { /* composite fields */
+    /* geometry_manager		*/	NULL,
+    /* change_managed		*/	NULL,
+    /* insert_child		*/	InsertChild,
+    /* delete_child		*/	XtInheritDeleteChild,
+    /* extension		*/	(XtPointer)&CompositeExtension,
+  },
+  { /* auxpanel fields */
+    /* empty			*/	0
+  }
+};
+
+WidgetClass auxPanelWidgetClass = (WidgetClass)&auxPanelClassRec;
+
+/* ARGSUSED */
+static void
+Initialize(req, new, args, num_args)
+Widget req;
+Widget new;
+ArgList args;
+Cardinal *num_args;
+{
+    AuxPanelWidget cpw = (AuxPanelWidget)new;
+
+    TRACE(("AuxPanel:Initialize()\n"));
+
+    cpw->cpanel.displayobj = NULL;
+    cpw->cpanel.dispauxsegments = NULL;
+    cpw->cpanel.dispauxsegmentsize = 0;
+    cpw->cpanel.numauxsegments = 0;
+    GetInvGC(cpw);
+}
+
+static void
+Destroy(w)
+Widget w;
+{
+    AuxPanelWidget cpw = (AuxPanelWidget)w;
+
+    TRACE(("AuxPanel:Destroy()\n"));
+
+    freeDisplaySegments(cpw);
+    if (cpw->cpanel.invgc != NULL) XtReleaseGC(w, cpw->cpanel.invgc);
+}
+
+static void
+Realize(w, mask, value)
+Widget w;
+XtValueMask *mask;
+XSetWindowAttributes *value;
+{
+    AuxPanelWidget cpw = (AuxPanelWidget)w;
+    CompositeWidgetClass super = (CompositeWidgetClass)XtClass(w)->core_class.superclass;
+    String params[1];
+    Cardinal num_params;
+
+    TRACE(("AuxPanel:Realize()\n"));
+
+    if (cpw->cpanel.displayobj == NULL) {
+	params[0] = XtClass(w)->core_class.class_name;
+	num_params = 1;
+	XtAppErrorMsg(XtWidgetToApplicationContext(w),
+		      "childError", "number", "WidgetError",
+		      "%s: has no child (ConvDisplayObject)",
+		      params, &num_params);
+    }
+
+    if (cpw->cpanel.cursor != None) {
+	*mask |= CWCursor;
+	value->cursor = cpw->cpanel.cursor;
+    }
+
+    (*super->core_class.realize)(w, mask, value);
+}
+
+/* ARGSUSED */
+static void
+Redisplay(w, ev, region)
+Widget w;
+XEvent *ev;
+Region region;
+{
+    AuxPanelWidget cpw = (AuxPanelWidget)w;
+    XExposeEvent *event = (XExposeEvent *)ev;
+    DisplaySegment *dseg;
+    int cheight, hspace, vspace;
+    int x, i;
+
+    TRACE(("AuxPanel:Redisplay()\n"));
+
+    cheight = cpw->cpanel.fontheight;
+    hspace = cpw->cpanel.hspace;
+    vspace = cpw->cpanel.vspace;
+
+    if (event->y + event->height < vspace / 2
+	|| cheight + vspace / 2 < event->y)
+      return;
+
+    for (i = 0, x = hspace / 2, dseg = cpw->cpanel.dispauxsegments;
+	 i < cpw->cpanel.numauxsegments ; i++, dseg++) {
+      if (x < event->x + event->width && event->x < x + dseg->width) {
+	dseg->redrawpos = 0;
+      }
+      else {
+	dseg->redrawpos = -1; /* $B=q$-D>$9I,MW$,$J$$(B */
+      }
+      x += dseg->width;
+    }
+
+    UpdateAuxDisplay(cpw);
+}
+
+static void
+Resize(w)
+Widget w;
+{
+    AuxPanelWidget cpw = (AuxPanelWidget)w;
+
+    TRACE(("AuxPanel:Resize()\n"));
+
+    Layout(cpw, True, True);
+}
+
+/* ARGSUSED */
+static Boolean
+SetValues(cur, req, wid, args, num_args)
+Widget cur;
+Widget req;
+Widget wid;
+ArgList args;
+Cardinal *num_args;
+{
+    AuxPanelWidget old = (AuxPanelWidget)cur;
+    AuxPanelWidget new = (AuxPanelWidget)wid;
+    Boolean redisplay = False;
+
+    TRACE(("AuxPanel:SetValues()\n"));
+
+    if (new->cpanel.displayobj == NULL) return False;
+
+    if (new->cpanel.foreground != old->cpanel.foreground ||
+	new->core.background_pixel != old->core.background_pixel) {
+	XtVaSetValues(new->cpanel.displayobj,
+		      XtNforeground, new->cpanel.foreground,
+		      XtNbackground, new->core.background_pixel,
+		      NULL);
+	redisplay = True;
+    }
+		      
+    if (new->cpanel.numauxsegments > 0 ||
+	new->cpanel.hspace != old->cpanel.hspace ||
+	new->cpanel.vspace != old->cpanel.vspace ||
+	new->cpanel.defaultwidth != old->cpanel.defaultwidth) {
+	Layout(new, True, True);
+	redisplay = True;
+    }
+
+    if (new->cpanel.cursor != old->cpanel.cursor && XtIsRealized(wid)) {
+	XDefineCursor(XtDisplay(wid), XtWindow(wid), new->cpanel.cursor);
+    }
+
+    return redisplay;
+}
+
+static XtGeometryResult
+QueryGeometry(w, req, ret)
+Widget w;
+XtWidgetGeometry *req;
+XtWidgetGeometry *ret;
+{
+    Dimension width, height;
+    Dimension owidth, oheight;
+
+    TRACE(("AuxPanel:QueryGeometry()\n"));
+
+    ret->request_mode = 0;
+
+    if ((req->request_mode & (CWWidth | CWHeight)) == 0) return XtGeometryYes;
+
+    width = (req->request_mode & CWWidth) ? req->width : w->core.width;
+    height = (req->request_mode & CWHeight) ? req->height : w->core.height;
+
+    owidth = width;
+    oheight = height;
+    ComputeSize((AuxPanelWidget)w,
+		(req->request_mode & CWWidth) != 0,
+		(req->request_mode & CWHeight) != 0,
+		&width, &height);
+    ret->request_mode = CWWidth | CWHeight;
+    ret->width = width;
+    ret->height = height;
+
+    if (width != owidth || height != oheight) return XtGeometryAlmost;
+
+    return XtGeometryYes;
+}
+
+static void
+InsertChild(w)
+Widget w;
+{
+    AuxPanelWidget cpw = (AuxPanelWidget)XtParent(w);
+    CompositeWidgetClass super = (CompositeWidgetClass)XtClass(cpw)->core_class.superclass;
+    String params[1];
+    Cardinal num_params;
+
+    TRACE(("AuxPanel:InsertChild()\n"));
+
+    if (!XtIsSubclass(w, convDisplayObjectClass)) {
+	params[0] = XtClass(cpw)->core_class.class_name;
+	num_params = 1;
+	XtAppErrorMsg(XtWidgetToApplicationContext(w),
+		      "childError", "class", "WidgetError",
+		      "%s: child must be subclass of ConvDisplayObject",
+		      params, &num_params);
+    }
+    if (cpw->composite.num_children != 0) {
+	params[0] = XtClass(cpw)->core_class.class_name;
+	num_params = 1;
+	XtAppErrorMsg(XtWidgetToApplicationContext(w),
+		      "childError", "number", "WidgetError",
+		      "%s: can only take one child",
+		      params, &num_params);
+    }
+
+    (*super->composite_class.insert_child)(w);
+
+    cpw->cpanel.displayobj = w;
+    cpw->cpanel.fontheight = CDLineHeight(w, (Position *)NULL);
+
+#ifdef notdef
+    {
+    Pixel fg, bg;
+    XtVaGetValues(w, XtNforeground, &fg, XtNbackground, &bg, NULL);
+    GetInvGC(cpw, fg, bg);
+    }
+#endif
+
+    if (cpw->cpanel.numauxsegments > 0) {
+	Layout(cpw, cpw->core.width == 0, cpw->core.height == 0);
+    }
+}
+
+static void
+GetInvGC(cpw)
+AuxPanelWidget cpw;
+{
+    XGCValues values;
+
+    TRACE(("AuxPanel:GetInvGC()\n"));
+
+    values.function = GXinvert;
+    values.plane_mask = cpw->cpanel.foreground ^ cpw->core.background_pixel;
+    cpw->cpanel.invgc = XtGetGC((Widget)cpw, GCFunction|GCPlaneMask, &values);
+}
+
+/* ARGSUSED */
+static void
+ComputeSize(cpw, resizex, resizey, width_inout, height_inout)
+AuxPanelWidget cpw;
+int resizex;
+int resizey;
+Dimension *width_inout;
+Dimension *height_inout;
+{
+    int width, height;
+    int i, minwidth = 0;
+    DisplaySegment *dseg = cpw->cpanel.dispauxsegments;
+
+
+    TRACE(("AuxPanel:ComputeSize()\n"));
+
+    if (cpw->cpanel.displayobj == NULL) return;
+
+    width = *width_inout;
+    height = *height_inout;
+
+    for (i = 0 ; i < cpw->cpanel.numauxsegments ; i++, dseg++) {
+      minwidth += CDStringWidth(cpw->cpanel.displayobj, &dseg->seg, 0, -1);
+    }
+    minwidth += cpw->cpanel.hspace * 2;
+    if (resizex) {
+      width = minwidth;
+    } else {
+      width = (cpw->core.width < minwidth) ? minwidth : cpw->core.width;
+    }
+    height = cpw->cpanel.fontheight + cpw->cpanel.vspace;
+    *width_inout = width;
+    *height_inout = height;
+}
+
+static void
+Layout(cpw, resizex, resizey)
+AuxPanelWidget cpw;
+int resizex;
+int resizey;
+{
+    Dimension width, height;
+    Dimension owidth, oheight;
+    XtGeometryResult re;
+
+    TRACE(("AuxPanel:Layout()\n"));
+
+    if (cpw->cpanel.displayobj == NULL) return;
+
+    width = cpw->core.width;
+    height = cpw->core.height;
+    ComputeSize(cpw, resizex, resizey, &width, &height);
+    if (width != cpw->core.width || height != cpw->core.height) {
+	owidth = width;
+	oheight = height;
+	re = XtMakeResizeRequest((Widget)cpw, owidth, oheight,
+				 &width, &height);
+	switch (re) {
+	case XtGeometryYes:
+	  /* no problem */
+	  break;
+	}
+    }
+}
+
+/*- allocDisplaySegments: prepare specified number of display segments -*/
+static void
+allocDisplaySegments(cpw, n)
+AuxPanelWidget cpw;
+Cardinal n;
+{
+  if (cpw->cpanel.dispauxsegmentsize > n) return;
+  n = ((n + 3) / 4) * 4 ;
+  if (cpw->cpanel.dispauxsegments == NULL) {
+    cpw->cpanel.dispauxsegments = 
+      (DisplaySegment *)XtCalloc(n, sizeof(DisplaySegment));
+  } else {
+    cpw->cpanel.dispauxsegments = 
+      (DisplaySegment *)XtRealloc((char *)cpw->cpanel.dispauxsegments,
+				  n * sizeof(DisplaySegment));
+    bzero((char *)(cpw->cpanel.dispauxsegments + cpw->cpanel.numauxsegments),
+	  (n - cpw->cpanel.numauxsegments) * sizeof(DisplaySegment));
+  }
+  cpw->cpanel.dispauxsegmentsize = n;
+}
+
+/*- freeDisplaySegments: free display segments -*/
+static void
+freeDisplaySegments(cpw)
+AuxPanelWidget cpw;
+{
+  Cardinal i;
+  DisplaySegment *dseg = cpw->cpanel.dispauxsegments;
+
+  for (i = 0 ; i < cpw->cpanel.dispauxsegmentsize ; i++, dseg++) {
+    if (dseg->seg.data != NULL) XtFree(dseg->seg.data);
+  }
+  XtFree((char *)cpw->cpanel.dispauxsegments);
+  cpw->cpanel.dispauxsegments = (DisplaySegment *)0;
+  cpw->cpanel.dispauxsegmentsize = 0;
+}
+
+/*- copyString: copy ICString -*/
+static void
+copyString(from, to)
+ICString *from;
+ICString *to;
+{
+  if (to->data != NULL) XtFree(to->data);
+  *to = *from;
+  to->data = XtMalloc(to->nbytes);
+  (void)bcopy(from->data, to->data, to->nbytes);
+}
+
+static void
+UpdateAuxDisplay(cpw)
+AuxPanelWidget cpw;
+{
+  Widget dispobj = cpw->cpanel.displayobj;
+  DisplaySegment *dseg;
+  int hspace, vspace;
+  int x, y;
+  Cardinal i;
+
+  if (dispobj == NULL) return;
+
+  hspace = cpw->cpanel.hspace;
+  vspace = cpw->cpanel.vspace;
+
+  x = hspace / 2;
+  y = vspace / 2;
+
+  for (i = 0, dseg = cpw->cpanel.dispauxsegments;
+       i < cpw->cpanel.numauxsegments ; i++, dseg++) {
+    if (dseg->redrawpos >= 0) {
+      int offset = 0;
+      int idx = dseg->redrawpos;
+
+      if (dseg->width == 0) {
+	dseg->width = CDStringWidth(dispobj, &dseg->seg, 0, -1);
+      }
+      if (idx > 0) {
+	offset = CDStringWidth(dispobj, &dseg->seg, 0, idx);
+      }
+      CDDrawString(dispobj, (Widget)cpw, &dseg->seg, 0, -1, x + offset, y);
+    }
+    x += dseg->width;
+  }
+  return;
+}
+
+/*
+ * Public Functions
+ */
+
+/* ARGSUSED */
+void
+APanelStart(w, segments, nseg, curseg, cursorpos)
+Widget w;
+ICString *segments;
+Cardinal nseg, curseg, cursorpos;
+{
+    AuxPanelWidget cpw = (AuxPanelWidget)w;
+    Cardinal i;
+    DisplaySegment *dseg;
+
+    cpw->cpanel.numauxsegments = nseg;
+    allocDisplaySegments(cpw, nseg);
+    for (i = 0, dseg = cpw->cpanel.dispauxsegments ; i < nseg ; i++, dseg++) {
+      copyString(segments +i, &dseg->seg);
+      dseg->redrawpos = 0;
+      dseg->width = 0;
+    }
+    Layout(cpw, True, True);
+    if (XtIsRealized(w)) XClearWindow(XtDisplay(w), XtWindow(w));
+    return;
+}
+
+void
+APanelEnd(w)
+Widget w;
+{
+  AuxPanelWidget cpw = (AuxPanelWidget)w;
+
+  cpw->cpanel.numauxsegments = 0;
+  return;
+}
+
+/* ARGSUSED */
+void
+APanelChange(w, segments, nseg, curseg, cursorpos)
+Widget w;
+ICString *segments;
+Cardinal nseg, curseg, cursorpos;
+{
+  AuxPanelWidget cpw = (AuxPanelWidget)w;
+  Cardinal i;
+  DisplaySegment *dseg;
+
+  cpw->cpanel.numauxsegments = nseg;
+  allocDisplaySegments(cpw, nseg);
+  for (i = 0, dseg = cpw->cpanel.dispauxsegments ; i < nseg ; i++, dseg++) {
+    /* $BA4=q$-49$($K$J$C$F$7$^$&!#(BICCompareSegment $B$,;H$($k$J$i(B
+       $B;H$$$?$$$N$@$,!#(B */
+    copyString(segments +i, &dseg->seg);
+    dseg->redrawpos = 0;
+    dseg->width = 0;
+  }
+  Layout(cpw, False, False);
+  if (XtIsRealized(w)) XClearWindow(XtDisplay(w), XtWindow(w));
+  UpdateAuxDisplay(cpw);
+  return;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/CandPanel.c	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,737 @@
+#ifndef lint
+static char *rcsid = "$Id: CandPanel.c,v 1.11 1994/04/22 04:26:22 ishisone Rel $";
+#endif
+/*
+ * Copyright (c) 1990  Software Research Associates, Inc.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted, provided
+ * that the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Software Research Associates not be
+ * used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission.  Software Research
+ * Associates makes no representations about the suitability of this software
+ * for any purpose.  It is provided "as is" without express or implied
+ * warranty.
+ *
+ * Author:  Makoto Ishisone, Software Research Associates, Inc., Japan
+ */
+
+#include <X11/IntrinsicP.h>
+#include <X11/StringDefs.h>
+#include "CandPanelP.h"
+#include "ConvDisp.h"
+
+static XtResource resources[] = {
+#define offset(field) XtOffset(CandidatePanelWidget, cpanel.field)
+    { XtNforeground, XtCForeground, XtRPixel, sizeof(Pixel),
+	offset(foreground), XtRString, XtDefaultForeground },
+    { XtNhorizontalSpacing, XtCSpacing, XtRDimension, sizeof(Dimension),
+	offset(hspace), XtRString, "6" },
+    { XtNverticalSpacing, XtCSpacing, XtRDimension, sizeof(Dimension),
+	offset(vspace), XtRString, "4" },
+    { XtNlist, XtCList, XtRPointer, sizeof(ICString*),
+	offset(list), XtRImmediate, NULL },
+    { XtNnumStrings, XtCNumStrings, XtRInt, sizeof(int),
+	offset(nstrings), XtRImmediate, 0 },
+    { XtNdefaultWidth, XtCDefaultWidth, XtRDimension, sizeof(Dimension),
+	offset(defaultwidth), XtRString, "400" },
+    { XtNcurrentItem, XtCCurrentItem, XtRInt, sizeof(int),
+	offset(current), XtRImmediate, 0 },
+    { XtNcursor, XtCCursor, XtRCursor, sizeof(Cursor),
+	offset(cursor), XtRImmediate, (XtPointer)None },
+    { XtNcallback, XtCCallback, XtRCallback, sizeof(XtPointer),
+	offset(callback), XtRCallback, NULL },
+#undef offset
+};
+
+static void Move(/* Widget, XEvent*, String*, Cardinal* */);
+static void Set(/* Widget, XEvent*, String*, Cardinal* */);
+static void Notify(/* Widget, XEvent*, String*, Cardinal* */);
+
+static XtActionsRec actions[] = {
+    { "move",	Move },
+    { "set",	Set },
+    { "select",	Notify },
+};
+
+static char translations[] =
+    "<Btn1Down>: set() select()\n\
+     <Key>Up:    move(up)\n\
+     <Key>Down:  move(down)\n\
+     <Key>Left:  move(left)\n\
+     <Key>Right: move(right)";
+
+static void Initialize(), Destroy();
+static void Realize();
+static void Redisplay();
+static void Resize();
+static Boolean SetValues();
+static XtGeometryResult QueryGeometry();
+static void InsertChild();
+
+static void GetInvGC();
+static int MaxWidth();
+static void ComputeSize();
+static void Layout();
+static void ToggleHighlight();
+
+static CompositeClassExtensionRec CompositeExtension = {
+    /* next_extension		*/	NULL,
+    /* record_type		*/	NULLQUARK,
+    /* version			*/	XtCompositeExtensionVersion,
+    /* record_size		*/	sizeof(CompositeClassExtensionRec),
+    /* accept_objects		*/	True,
+};
+
+CandidatePanelClassRec candidatePanelClassRec = {
+  { /* core fields */
+    /* superclass		*/	(WidgetClass) &compositeClassRec,
+    /* class_name		*/	"CandidatePanel",
+    /* widget_size		*/	sizeof(CandidatePanelRec),
+    /* class_initialize		*/	NULL,
+    /* class_part_initialize	*/	NULL,
+    /* class_inited		*/	FALSE,
+    /* initialize		*/	Initialize,
+    /* initialize_hook		*/	NULL,
+    /* realize			*/	Realize,
+    /* actions			*/	actions,
+    /* num_actions		*/	XtNumber(actions),
+    /* resources		*/	resources,
+    /* num_resources		*/	XtNumber(resources),
+    /* xrm_class		*/	NULLQUARK,
+    /* compress_motion		*/	TRUE,
+    /* compress_exposure	*/	TRUE,
+    /* compress_enterleave	*/	TRUE,
+    /* visible_interest		*/	FALSE,
+    /* destroy			*/	Destroy,
+    /* resize			*/	Resize,
+    /* expose			*/	Redisplay,
+    /* set_values		*/	SetValues,
+    /* set_values_hook		*/	NULL,
+    /* set_values_almost	*/	XtInheritSetValuesAlmost,
+    /* get_values_hook		*/	NULL,
+    /* accept_focus		*/	NULL,
+    /* version			*/	XtVersion,
+    /* callback_private		*/	NULL,
+    /* tm_table			*/	translations,
+    /* query_geometry		*/	QueryGeometry,
+    /* display_accelerator	*/	XtInheritDisplayAccelerator,
+    /* extension		*/	NULL
+  },
+  { /* composite fields */
+    /* geometry_manager		*/	NULL,
+    /* change_managed		*/	NULL,
+    /* insert_child		*/	InsertChild,
+    /* delete_child		*/	XtInheritDeleteChild,
+    /* extension		*/	(XtPointer)&CompositeExtension,
+  },
+  { /* candidatepanel fields */
+    /* empty			*/	0
+  }
+};
+
+WidgetClass candidatePanelWidgetClass = (WidgetClass)&candidatePanelClassRec;
+
+/* ARGSUSED */
+static void
+Initialize(req, new, args, num_args)
+Widget req;
+Widget new;
+ArgList args;
+Cardinal *num_args;
+{
+    CandidatePanelWidget cpw = (CandidatePanelWidget)new;
+
+    cpw->cpanel.displayobj = NULL;
+    GetInvGC(cpw);
+}
+
+static void
+Destroy(w)
+Widget w;
+{
+    CandidatePanelWidget cpw = (CandidatePanelWidget)w;
+
+    if (cpw->cpanel.invgc != NULL) XtReleaseGC(w, cpw->cpanel.invgc);
+}
+
+static void
+Realize(w, mask, value)
+Widget w;
+XtValueMask *mask;
+XSetWindowAttributes *value;
+{
+    CandidatePanelWidget cpw = (CandidatePanelWidget)w;
+    CompositeWidgetClass super = (CompositeWidgetClass)XtClass(w)->core_class.superclass;
+    String params[1];
+    Cardinal num_params;
+
+    if (cpw->cpanel.displayobj == NULL) {
+	params[0] = XtClass(w)->core_class.class_name;
+	num_params = 1;
+	XtAppErrorMsg(XtWidgetToApplicationContext(w),
+		      "childError", "number", "WidgetError",
+		      "%s: has no child (ConvDisplayObject)",
+		      params, &num_params);
+    }
+
+    if (cpw->cpanel.cursor != None) {
+	*mask |= CWCursor;
+	value->cursor = cpw->cpanel.cursor;
+    }
+
+    (*super->core_class.realize)(w, mask, value);
+}
+
+/* ARGSUSED */
+static void
+Redisplay(w, ev, region)
+Widget w;
+XEvent *ev;
+Region region;
+{
+    CandidatePanelWidget cpw = (CandidatePanelWidget)w;
+    Widget dispobj = cpw->cpanel.displayobj;
+    XExposeEvent *event = (XExposeEvent *)ev;
+    ICString *list = cpw->cpanel.list;
+    int cwidth, cheight, hspace, vspace;
+    int c0, c1, r0, r1;
+    int row, col;
+    int idx;
+    int x, y;
+
+    if (list == NULL || dispobj == NULL) return;
+
+    cwidth = cpw->cpanel.maxwidth;
+    cheight = cpw->cpanel.fontheight;
+    hspace = cpw->cpanel.hspace;
+    vspace = cpw->cpanel.vspace;
+
+    c0 = (event->x + hspace - hspace / 2) / (cwidth + hspace);
+    c1 = (event->x + event->width - 1 - hspace / 2) / (cwidth + hspace) + 1;
+    if (c1 > cpw->cpanel.ncolumns) c1 = cpw->cpanel.ncolumns;
+
+    r0 = (event->y + vspace - vspace / 2) / (cheight + vspace);
+    r1 = (event->y + event->height - 1 - vspace / 2) / (cheight + vspace) + 1;
+    if (r1 > cpw->cpanel.nrows) r1 = cpw->cpanel.nrows;
+
+    for (row = r0; row < r1; row++) {
+	y = (cheight + vspace) * row + vspace / 2;
+	for (col = c0; col < c1; col++) {
+	    x = (cwidth + hspace) * col + hspace / 2;
+	    idx = row * cpw->cpanel.ncolumns + col;
+	    if (idx >= cpw->cpanel.nstrings) return;
+	    if (idx == cpw->cpanel.current) {
+		XClearArea(XtDisplay(w), XtWindow(w), x, y,
+			   (unsigned int)cwidth, (unsigned int)cheight,
+			   False);
+	    }
+	    CDDrawString(dispobj, w, list + idx, 0, -1, x, y);
+	    if (idx == cpw->cpanel.current) {
+		ToggleHighlight(cpw, idx);
+	    }
+	}
+    }
+}
+
+static void
+Resize(w)
+Widget w;
+{
+    CandidatePanelWidget cpw = (CandidatePanelWidget)w;
+
+    Layout(cpw, False, False);
+}
+
+/* ARGSUSED */
+static Boolean
+SetValues(cur, req, wid, args, num_args)
+Widget cur;
+Widget req;
+Widget wid;
+ArgList args;
+Cardinal *num_args;
+{
+    CandidatePanelWidget old = (CandidatePanelWidget)cur;
+    CandidatePanelWidget new = (CandidatePanelWidget)wid;
+    Boolean redisplay = False;
+    Boolean listspecified = False;
+    int i;
+
+    if (new->cpanel.displayobj == NULL) return False;
+
+    for (i = 0; i < *num_args; i++) {
+	if (!strcmp(args[i].name, XtNlist)) {
+	    listspecified = True;
+	    break;
+	}
+    }
+
+    if (new->cpanel.foreground != old->cpanel.foreground ||
+	new->core.background_pixel != old->core.background_pixel) {
+	XtVaSetValues(new->cpanel.displayobj,
+		      XtNforeground, new->cpanel.foreground,
+		      XtNbackground, new->core.background_pixel,
+		      NULL);
+	redisplay = True;
+    }
+		      
+    if (listspecified ||
+	new->cpanel.list != old->cpanel.list ||
+	new->cpanel.nstrings != old->cpanel.nstrings) {
+	/* compute maximum pixel width of the list items */
+	new->cpanel.maxwidth = MaxWidth(new);
+    }
+
+    if (listspecified ||
+	new->cpanel.list != old->cpanel.list ||
+	new->cpanel.nstrings != old->cpanel.nstrings ||
+	new->cpanel.hspace != old->cpanel.hspace ||
+	new->cpanel.vspace != old->cpanel.vspace ||
+	new->cpanel.defaultwidth != old->cpanel.defaultwidth) {
+	Layout(new, True, True);
+	redisplay = True;
+    }
+
+    if (new->cpanel.current != old->cpanel.current &&
+	!redisplay && XtIsRealized(wid)) {
+	ToggleHighlight(new, old->cpanel.current);
+	ToggleHighlight(new, new->cpanel.current);
+    }
+
+    if (new->cpanel.cursor != old->cpanel.cursor && XtIsRealized(wid)) {
+	XDefineCursor(XtDisplay(wid), XtWindow(wid), new->cpanel.cursor);
+    }
+
+    return redisplay;
+}
+
+static XtGeometryResult
+QueryGeometry(w, req, ret)
+Widget w;
+XtWidgetGeometry *req;
+XtWidgetGeometry *ret;
+{
+    Dimension width, height;
+    Dimension owidth, oheight;
+
+    ret->request_mode = 0;
+
+    if ((req->request_mode & (CWWidth | CWHeight)) == 0) return XtGeometryYes;
+
+    width = (req->request_mode & CWWidth) ? req->width : w->core.width;
+    height = (req->request_mode & CWHeight) ? req->height : w->core.height;
+
+    owidth = width;
+    oheight = height;
+    ComputeSize((CandidatePanelWidget)w,
+		(req->request_mode & CWWidth) != 0,
+		(req->request_mode & CWHeight) != 0,
+		&width, &height);
+    ret->request_mode = CWWidth | CWHeight;
+    ret->width = width;
+    ret->height = height;
+
+    if (width != owidth || height != oheight) return XtGeometryAlmost;
+
+    return XtGeometryYes;
+}
+
+static void
+InsertChild(w)
+Widget w;
+{
+    CandidatePanelWidget cpw = (CandidatePanelWidget)XtParent(w);
+    CompositeWidgetClass super = (CompositeWidgetClass)XtClass(cpw)->core_class.superclass;
+    String params[1];
+    Cardinal num_params;
+
+    if (!XtIsSubclass(w, convDisplayObjectClass)) {
+	params[0] = XtClass(cpw)->core_class.class_name;
+	num_params = 1;
+	XtAppErrorMsg(XtWidgetToApplicationContext(w),
+		      "childError", "class", "WidgetError",
+		      "%s: child must be subclass of ConvDisplayObject",
+		      params, &num_params);
+    }
+    if (cpw->composite.num_children != 0) {
+	params[0] = XtClass(cpw)->core_class.class_name;
+	num_params = 1;
+	XtAppErrorMsg(XtWidgetToApplicationContext(w),
+		      "childError", "number", "WidgetError",
+		      "%s: can only take one child",
+		      params, &num_params);
+    }
+
+    (*super->composite_class.insert_child)(w);
+
+    cpw->cpanel.displayobj = w;
+    cpw->cpanel.fontheight = CDLineHeight(w, (Position *)NULL);
+
+#ifdef notdef
+    {
+    Pixel fg, bg;
+    XtVaGetValues(w, XtNforeground, &fg, XtNbackground, &bg, NULL);
+    GetInvGC(cpw, fg, bg);
+    }
+#endif
+
+    if (cpw->cpanel.list != NULL) {
+	cpw->cpanel.maxwidth = MaxWidth(cpw);
+	Layout(cpw, cpw->core.width == 0, cpw->core.height == 0);
+    }
+}
+
+static void
+GetInvGC(cpw)
+CandidatePanelWidget cpw;
+{
+    XGCValues values;
+
+    values.function = GXinvert;
+    values.plane_mask = cpw->cpanel.foreground ^ cpw->core.background_pixel;
+    cpw->cpanel.invgc = XtGetGC((Widget)cpw, GCFunction|GCPlaneMask, &values);
+}
+
+/* ARGSUSED */
+static void
+Move(w, ev, args, num_args)
+Widget w;
+XEvent *ev;
+String *args;
+Cardinal *num_args;
+{
+    int dir;
+
+    if (*num_args < 1) return;
+
+    if (!strcmp(*args, "left") || !strcmp(*args, "Left")) {
+	dir = ICMoveLeft;
+    } else if (!strcmp(*args, "right") || !strcmp(*args, "Right")) {
+	dir = ICMoveRight;
+    } else if (!strcmp(*args, "up") || !strcmp(*args, "Up")) {
+	dir = ICMoveUp;
+    } else if (!strcmp(*args, "down") || !strcmp(*args, "Down")) {
+	dir = ICMoveDown;
+    } else {
+	XtAppWarning(XtWidgetToApplicationContext(w),
+		     "CandidatePanel: unknown direction");
+	return;
+    }
+
+    CPanelMoveCurrent(w, dir);
+}
+
+/* ARGSUSED */
+static void
+Set(w, ev, args, num_args)
+Widget w;
+XEvent *ev;
+String *args;
+Cardinal *num_args;
+{
+    CandidatePanelWidget cpw = (CandidatePanelWidget)w;
+    XButtonEvent *event = (XButtonEvent *)ev;
+    int cwidth, cheight, hspace, vspace;
+    int x, y;
+    int row, col;
+    int newidx;
+
+    cwidth = cpw->cpanel.maxwidth;
+    cheight = cpw->cpanel.fontheight;
+    hspace = cpw->cpanel.hspace;
+    vspace = cpw->cpanel.vspace;
+
+    x = event->x - hspace / 2;
+    col = x / (cwidth + hspace);
+    if (col >= cpw->cpanel.ncolumns || (x % (cwidth + hspace)) > cwidth) return;
+
+    y = event->y - vspace / 2;
+    row = y / (cheight + vspace);
+    if (row >= cpw->cpanel.nrows || (y % (cheight + vspace)) > cheight) return;
+
+    newidx = col + cpw->cpanel.ncolumns * row;
+    if (newidx >= cpw->cpanel.nstrings) return;
+
+    CPanelSetCurrent(w, newidx);
+}
+
+/* ARGSUSED */
+static void
+Notify(w, ev, args, num_args)
+Widget w;
+XEvent *ev;
+String *args;
+Cardinal *num_args;
+{
+    CandidatePanelWidget cpw = (CandidatePanelWidget)w;
+
+    XtCallCallbackList(w, cpw->cpanel.callback,
+		       (XtPointer)cpw->cpanel.current);
+}
+
+static int
+MaxWidth(cpw)
+CandidatePanelWidget cpw;
+{
+    Widget dispobj = cpw->cpanel.displayobj;
+    ICString *list = cpw->cpanel.list;
+    int maxwidth;
+    int i;
+
+    maxwidth = 0;
+    for (i = 0; i < cpw->cpanel.nstrings; i++) {
+	int w = CDStringWidth(dispobj, list + i, 0, -1);
+	if (w > maxwidth) maxwidth = w;
+    }
+
+    return maxwidth;
+}
+
+static void
+ComputeSize(cpw, resizex, resizey, width_inout, height_inout)
+CandidatePanelWidget cpw;
+int resizex;
+int resizey;
+Dimension *width_inout;
+Dimension *height_inout;
+{
+    int nrows, ncolumns;
+    int width, height;
+
+    if (cpw->cpanel.displayobj == NULL || cpw->cpanel.nstrings == 0) return;
+
+    width = *width_inout;
+    height = *height_inout;
+
+    if (resizex) {
+	if (resizey) {
+	    int maxheight = HeightOfScreen(XtScreen((Widget)cpw));
+
+	    /* use defaultwidth */
+	    ncolumns = cpw->cpanel.defaultwidth /
+			(cpw->cpanel.maxwidth + cpw->cpanel.hspace);
+	    if (ncolumns > cpw->cpanel.nstrings) ncolumns = cpw->cpanel.nstrings;
+	    if (ncolumns <= 0) ncolumns = 1;
+	    nrows = (cpw->cpanel.nstrings + ncolumns - 1) / ncolumns;
+	    width = (cpw->cpanel.maxwidth + cpw->cpanel.hspace) * ncolumns;
+	    height = (cpw->cpanel.fontheight + cpw->cpanel.vspace) * nrows;
+	    /*
+	     * If the computed height exceeds display height,
+	     * expand width so that the entire window fits into the display.
+	     */
+	    if (height > maxheight) {
+		/* compute maximum number of rows */
+		nrows = maxheight / (cpw->cpanel.fontheight + cpw->cpanel.vspace);
+		if (nrows <= 0) nrows = 1;
+		ncolumns = (cpw->cpanel.nstrings + nrows - 1) / nrows;
+		if (ncolumns > cpw->cpanel.nstrings) {
+		    ncolumns = cpw->cpanel.nstrings;
+		}
+		/* re-compute correct number of rows */
+		nrows = (cpw->cpanel.nstrings + ncolumns - 1) / ncolumns;
+		width = (cpw->cpanel.maxwidth + cpw->cpanel.hspace) * ncolumns;
+		height = (cpw->cpanel.fontheight + cpw->cpanel.vspace) * nrows;
+	    }
+	} else {
+	    /* use specified height */
+	    nrows = height / (cpw->cpanel.fontheight + cpw->cpanel.vspace);
+	    if (nrows <= 0) nrows = 1;
+	    ncolumns = (cpw->cpanel.nstrings + nrows - 1) / nrows;
+	    if (ncolumns > cpw->cpanel.nstrings) ncolumns = cpw->cpanel.nstrings;
+	    width = (cpw->cpanel.maxwidth + cpw->cpanel.hspace) * ncolumns;
+	}
+    } else {
+	ncolumns = width / (cpw->cpanel.maxwidth + cpw->cpanel.hspace);
+	if (ncolumns <= 0) ncolumns = 1;
+	nrows = (cpw->cpanel.nstrings + ncolumns - 1) / ncolumns;
+	if (resizey) {
+	    height = (cpw->cpanel.fontheight + cpw->cpanel.vspace) * nrows;
+	}
+    }
+    cpw->cpanel.ncolumns = ncolumns;
+    cpw->cpanel.nrows = nrows;
+    *width_inout = width;
+    *height_inout = height;
+}
+
+static void
+Layout(cpw, resizex, resizey)
+CandidatePanelWidget cpw;
+int resizex;
+int resizey;
+{
+    Dimension width, height;
+    Dimension owidth, oheight;
+    XtGeometryResult re;
+
+    if (cpw->cpanel.displayobj == NULL) return;
+
+    width = cpw->core.width;
+    height = cpw->core.height;
+    ComputeSize(cpw, resizex, resizey, &width, &height);
+
+    if (width != cpw->core.width || height != cpw->core.height) {
+	owidth = width;
+	oheight = height;
+	re = XtMakeResizeRequest((Widget)cpw, owidth, oheight, &width, &height);
+	switch (re) {
+	case XtGeometryYes:
+	    /* no problem */
+	    break;
+	case XtGeometryNo:
+	    width = cpw->core.width;
+	    height = cpw->core.height;
+	    ComputeSize(cpw, False, False, &width, &height);
+	    break;
+	case XtGeometryAlmost:
+	    ComputeSize(cpw,
+			width != owidth,
+			height != oheight,
+			&width, &height);
+	    re = XtMakeResizeRequest((Widget)cpw, width, height, &width, &height);
+	    switch (re) {
+	    case XtGeometryYes:
+		break;
+	    case XtGeometryNo:
+		width = cpw->core.width;
+		height = cpw->core.height;
+		ComputeSize(cpw, False, False, &width, &height);
+		break;
+	    case XtGeometryAlmost:
+		ComputeSize(cpw, False, False, &width, &height);
+		(void)XtMakeResizeRequest((Widget)cpw, width, height, &width, &height);
+	    }
+	}
+    }
+}
+
+static void
+ToggleHighlight(cpw, idx)
+CandidatePanelWidget cpw;
+int idx;
+{
+    int row, col;
+    int x, y;
+    int width;
+
+    if (idx < 0 || cpw->cpanel.nstrings <= idx) return;
+
+    col = idx % cpw->cpanel.ncolumns;
+    row = idx / cpw->cpanel.ncolumns;
+    x = (cpw->cpanel.maxwidth + cpw->cpanel.hspace) * col +
+      cpw->cpanel.hspace / 2;
+    y = (cpw->cpanel.fontheight + cpw->cpanel.vspace) * row +
+      cpw->cpanel.vspace / 2;
+    width = CDStringWidth(cpw->cpanel.displayobj, cpw->cpanel.list + idx,
+			  0, -1);
+
+    XFillRectangle(XtDisplay(cpw), XtWindow(cpw), cpw->cpanel.invgc, x, y,
+		   (unsigned int)width, (unsigned int)cpw->cpanel.fontheight);
+}
+
+
+/*
+ * Public Functions
+ */
+
+void
+CPanelSetList(w, list, nstrings, current, resize)
+Widget w;
+ICString *list;
+int nstrings;
+int current;
+int resize;
+{
+    CandidatePanelWidget cpw = (CandidatePanelWidget)w;
+
+    if (list != NULL) {
+	cpw->cpanel.list = list;
+	cpw->cpanel.nstrings = nstrings;
+	if (current < 0) current = 0;
+	if (current >= nstrings) current = nstrings - 1;
+	cpw->cpanel.current = current;
+    }
+
+    if (cpw->cpanel.displayobj == NULL) return;
+
+    cpw->cpanel.fontheight = CDLineHeight(cpw->cpanel.displayobj,
+					  (Position *)NULL);
+    /* compute maximum pixel width of the list items */
+    cpw->cpanel.maxwidth = MaxWidth(cpw);
+    Layout(cpw, resize, resize);
+
+    if (XtIsRealized(w)) XClearWindow(XtDisplay(w), XtWindow(w));
+}
+
+void
+CPanelSetCurrent(w, idx)
+Widget w;
+int idx;
+{
+    CandidatePanelWidget cpw = (CandidatePanelWidget)w;
+
+    if (idx < 0 || cpw->cpanel.nstrings <= idx) return;
+
+    if (idx == cpw->cpanel.current) return;
+
+    if (cpw->cpanel.displayobj != NULL && XtIsRealized(w)) {
+	ToggleHighlight(cpw, cpw->cpanel.current);
+	ToggleHighlight(cpw, idx);
+    }
+    cpw->cpanel.current = idx;
+}
+
+void
+CPanelMoveCurrent(w, dir)
+Widget w;
+int dir;
+{
+    CandidatePanelWidget cpw = (CandidatePanelWidget)w;
+    int newidx;
+    int row, col;
+    int nstrings = cpw->cpanel.nstrings;
+
+    if (nstrings <= 0) return;
+
+    col = cpw->cpanel.current % cpw->cpanel.ncolumns;
+    row = cpw->cpanel.current / cpw->cpanel.ncolumns;
+
+    switch (dir) {
+    case ICMoveLeft:
+	if ((newidx = cpw->cpanel.current - 1) < 0) newidx = nstrings - 1;
+	break;
+    case ICMoveRight:
+	if ((newidx = cpw->cpanel.current + 1) >= nstrings) newidx = 0;
+	break;
+    case ICMoveUp:
+    case ICMovePrevPage:
+	if (--row < 0) row = cpw->cpanel.nrows - 1;
+	newidx = row * cpw->cpanel.ncolumns + col;
+	if (newidx >= nstrings) newidx -= cpw->cpanel.ncolumns;
+	break;
+    case ICMoveDown:
+    case ICMoveNextPage:
+	if (++row >= cpw->cpanel.nrows) row = 0;
+	newidx = row * cpw->cpanel.ncolumns + col;
+	if (newidx >= nstrings) newidx = col;
+	break;
+    case ICMoveLeftMost:
+	newidx = row * cpw->cpanel.ncolumns;
+	break;
+    case ICMoveRightMost:
+	newidx = (row + 1) * cpw->cpanel.ncolumns - 1;
+	if (newidx >= cpw->cpanel.nstrings) newidx = cpw->cpanel.nstrings - 1;
+	break;
+    case ICMoveFirst:
+	newidx = 0;
+	break;
+    case ICMoveLast:
+	newidx = cpw->cpanel.nstrings - 1;
+	break;
+    }
+
+    CPanelSetCurrent(w, newidx);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/Canna.c	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,1854 @@
+/*
+ * Copyright (c) 1990  Software Research Associates, Inc.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted, provided
+ * that the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Software Research Associates not be
+ * used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission.  Software Research
+ * Associates makes no representations about the suitability of this software
+ * for any purpose.  It is provided "as is" without express or implied
+ * warranty.
+ *
+ * Author:  Makoto Ishisone, Software Research Associates, Inc., Japan
+ */
+
+/* Copyright 1991 NEC Corporation, Tokyo, Japan.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and that
+ * both that copyright notice and this permission notice appear in
+ * supporting documentation, and that the name of NEC Corporation
+ * not be used in advertising or publicity pertaining to distribution
+ * of the software without specific, written prior permission.  NEC 
+ * Corporation makes no representations about the suitability of this
+ * software for any purpose.  It is provided "as is" without express
+ * or implied warranty.
+ *
+ * NEC CORPORATION DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN 
+ * NO EVENT SHALL NEC CORPORATION BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF 
+ * USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR 
+ * OTHER TORTUOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR 
+ * PERFORMANCE OF THIS SOFTWARE. 
+ *
+ * Author: Akira Kon, NEC Corporation.  (kon@d1.bs2.mt.nec.co.jp)
+ */
+
+/* $BD>$5$J$1$l$P$J$i$J$$$H$3$m(B
+
+ $B!&(BDestroy $B$,8F$P$l$J$$$N$G(B CloseUIContext $B$G$-$J$$!#(B
+ $B!&%b!<%INN0h$NBg$-$5!#(B($B$3$l$OB>$N%U%!%$%k$@$m$&$J(B)
+
+ */
+
+#ifndef lint
+static char *rcsid = "$Id: Canna.c,v 1.55 1999/05/25 08:13:03 ishisone Exp $";
+#endif
+
+#include <X11/IntrinsicP.h>
+#include <X11/StringDefs.h>
+#include <X11/Xmu/Atoms.h>
+#define XK_KATAKANA
+#include <X11/keysym.h>
+#if XtSpecificationRelease > 4
+#include <X11/Xfuncs.h>
+#endif
+#include "CannaP.h"
+#include "DebugPrint.h"
+
+#define _WCHAR_T /* $B$3$NDj5A$O(B jrkanji.h $B$G(B wcKanjiStatus $B$J$I$rDj5A$9$k$?$a(B */
+#define wchar_t wchar
+
+#include <canna/jrkanji.h>
+
+static XtResource resources[] = {
+#define offset(field) XtOffset(CannaObject, canna.field)
+    { XtNcannahost, XtCCannahost, XtRString, sizeof(String),
+	offset(cannahost), XtRString, NULL },
+    { XtNcannafile, XtCCannafile, XtRString, sizeof(String),
+	offset(cannafile), XtRString, NULL },
+    { XtNsendReturnByString, XtCSendReturnByString,
+	XtRBoolean, sizeof(Boolean),
+	offset(sendReturnByString), XtRBoolean, False },
+#undef offset
+};
+
+static void ClassInitialize();
+static void Initialize(), Destroy();
+static Boolean SetValues();
+static int InputEvent();
+static ICString *GetMode();
+static int CursorPos();
+static int NumSegments();
+static ICString *GetSegment();
+static int CompareSegment();
+static ICString *GetItemList();
+static int SelectItem();
+static int ConvertedString();
+static int ClearConversion();
+static void displayPreEdit();
+static int GetTriggerKeys();
+static int PreeditString();
+static int StatusString();
+
+static initializeCannaConnection();
+static toJapaneseMode();
+static void convend();
+static changeTextForCanna();
+static copyInWchar();
+static fixProcForCanna();
+static shiftRight(), shiftLeft(), shiftLeftAll();
+static ibufInitialize(), freeIBuf();
+
+#ifdef KC_SETLISTCALLBACK
+#ifdef CANNA_LIST_Convert
+#define CANNA_LISTFUNCTYPE int
+#else
+#define CANNA_LISTFUNCTYPE void
+#endif
+static CANNA_LISTFUNCTYPE listfunc();
+
+static void openSelection();
+#define SELECTION_SET 0 /* SelectionStart $B$r$7$F$bNI$$$H8@$&>pJs$r@_Dj$9$k(B */
+#define SELECTION_DO  1 /* $B<B:]$K(B SelectionStart $B$r3+;O$9$k(B */
+#else /* !KC_SETLISTCALLBACK */
+#define openSelection(x, y, z)
+#endif /* !KC_SETLISTCALLBACK */
+
+static ICString *GetAuxSegments();
+
+CannaClassRec cannaClassRec = {
+  { /* object fields */
+    /* superclass		*/	(WidgetClass) &inputConvClassRec,
+    /* class_name		*/	"Canna",
+    /* widget_size		*/	sizeof(CannaRec),
+    /* class_initialize		*/	ClassInitialize,
+    /* class_part_initialize	*/	NULL,
+    /* class_inited		*/	FALSE,
+    /* initialize		*/	Initialize,
+    /* initialize_hook		*/	NULL,
+    /* obj1			*/	NULL,
+    /* obj2			*/	NULL,
+    /* obj3			*/	0,
+    /* resources		*/	resources,
+    /* num_resources		*/	XtNumber(resources),
+    /* xrm_class		*/	NULLQUARK,
+    /* obj4			*/	FALSE,
+    /* obj5			*/	FALSE,
+    /* obj6			*/	FALSE,
+    /* obj7			*/	FALSE,
+    /* destroy			*/	Destroy,
+    /* obj8			*/	NULL,
+    /* obj9			*/	NULL,
+    /* set_values		*/	SetValues,
+    /* set_values_hook		*/	NULL,
+    /* obj10			*/	NULL,
+    /* get_values_hook		*/	NULL,
+    /* obj11			*/	NULL,
+    /* version			*/	XtVersion,
+    /* callback_private		*/	NULL,
+    /* obj12			*/	NULL,
+    /* obj13			*/	NULL,
+    /* obj14			*/	NULL,
+    /* extension		*/	NULL
+  },
+  { /* inputConv fields */
+    /* InputEvent		*/	InputEvent,
+    /* GetMode			*/	GetMode,
+    /* CursorPos		*/	CursorPos,
+    /* NumSegments		*/	NumSegments,
+    /* GetSegment		*/	GetSegment,
+    /* CompareSegment		*/	CompareSegment,
+    /* GetItemList		*/	GetItemList,
+    /* SelectItem		*/	SelectItem,
+    /* GetConvertedString	*/	ConvertedString,
+    /* ClearConversion		*/	ClearConversion,
+    /* GetAuxSegments		*/	GetAuxSegments,
+    /* SupportMultipleObjects	*/	True,
+    /* GetTriggerKeys		*/	GetTriggerKeys,
+    /* num_trigger_keys		*/	0,
+    /* trigger_keys		*/	NULL,
+    /* GetPreeditString		*/	PreeditString,
+    /* GetStatusString		*/	StatusString,
+    /* NoMoreObjects		*/	False,
+  },
+  { /* canna fields */
+    /* foo			*/	0,
+  }
+};
+
+WidgetClass cannaObjectClass = (WidgetClass)&cannaClassRec;
+
+static void fix();
+
+static ICString *SymbolList;
+static int NumSymbols;
+
+static void addObject();
+static void deleteObject();
+
+static int checkIfFunctionalChar();
+
+static int ignoreListfunc = 0;
+
+static Display *displaybell = (Display *)0;
+
+static void
+ClassInitialize()
+{
+  TRACE(("CannaObjectClass initialized\n"));
+  /* $B2?$b$7$J$$(B */
+}
+
+static int
+XKanaLookup(event_struct, buffer_return, bytes_buffer,
+	    keysym, status_return)
+XKeyEvent *event_struct;
+char *buffer_return;
+int bytes_buffer;
+KeySym *keysym;
+XComposeStatus *status_return;
+{
+  int res;
+  res = XLookupString(event_struct, buffer_return, bytes_buffer,
+		      keysym, status_return);
+  if (!res && XK_overline <= *keysym && *keysym <= XK_semivoicedsound) {
+    buffer_return[0] = (unsigned long)(*keysym) & 0xff;
+    res = 1;
+  }
+  return res;
+}
+
+static int
+InputEvent(w, event)
+Widget w;
+XEvent *event;
+{
+    CannaObject obj = (CannaObject)w;
+    wchar buf[1024];
+    char kanabuf[20];
+    KeySym ks;
+    XComposeStatus   compose_status;
+    wcKanjiStatus    kanji_status;
+    int len, nbytes, functionalChar;
+
+    /* KeyPress$B0J30$O<N$F$k(B */
+    if (event->type != KeyPress /*&& event->type != KeyRelease*/) return 0;
+
+    obj->canna.textchanged = False;
+
+    /* $B<h$j$"$($:J8;z$KD>$7$F$7$^$&(B */
+    kanabuf[0] = '\0';
+    nbytes = XKanaLookup(event, kanabuf, 20, &ks, &compose_status);
+
+    buf[0] = (wchar)kanabuf[0]; /* $B$-$?$J$$(B */
+
+    if (ks == XK_space && (event->xkey.state & ShiftMask)) {
+      void convend();
+
+      convend(obj);
+      return 0;
+    }
+
+    /* $BD9$5$,%<%m$N$b$N$K4X$7$F$O$A$g$C$H5_:Q(B */
+    functionalChar = checkIfFunctionalChar(event, ks, buf, 1024);
+    /* shift+$B"*$N$h$&$JJ8;z$@$C$?$i#1J8;z$H?t$($k(B */
+    if ( !nbytes && functionalChar ) {
+      nbytes = 1;
+    }
+
+    /* $BMW$i$J$$>l9g$OL5;k$9$k(B */
+    if (nbytes == 0) return 1;
+
+    /* $B%Y%k$rLD$i$9%G%#%9%W%l%$$N@_Dj(B */
+ 
+    displaybell = XtDisplayOfObject((Widget)obj);
+
+    /* $B$+$J4A;zJQ49$9$k(B */
+    len = wcKanjiString((int)obj, (int)buf[0],
+			(wchar_t *)buf, 1024, &kanji_status);
+
+    displayPreEdit(obj, len, buf, &kanji_status);
+    return (kanji_status.info & KanjiThroughInfo) ? 1 : 0;
+}
+
+static void
+displayPreEdit(obj, len, buf, ks)
+CannaObject obj;
+int len;
+wchar *buf;
+wcKanjiStatus *ks;
+{
+    Widget w = (Widget)obj;
+
+    if (len > 0) { /* $B3NDjJ8;z$,$"$k>l9g(B */
+      if (len == 1 && (ks->info & KanjiThroughInfo) &&
+	  (obj->canna.sendReturnByString == False ||
+	   (((buf[0] & 0x7f) < (unsigned)0x20 &&
+	     buf[0] != '\r' && buf[0] != '\t') ||
+	    buf[0] == '\177'))) {
+	;/* XSendEvent$B$GAw$C$F$b$i$&$h$&$JJ8;z(B($B2?$b$7$J$$(B) */
+      }
+      else {
+	ks->info &= ~KanjiThroughInfo;
+	fixProcForCanna(obj, buf, len);
+	fix(obj);
+      }
+    }
+
+    changeTextForCanna(obj, ks);
+
+    /* $B%F%-%9%H$NJQ2=$r%A%'%C%/$9$k(B */
+    if (obj->canna.textchanged) {
+	XtCallCallbackList(w, obj->inputConv.textchangecallback,
+			   (XtPointer)NULL);
+	obj->canna.textchanged = False;
+    }
+
+    /* $BF~NO%b!<%I$r%A%'%C%/$9$k(B */
+    if (ks->info & KanjiModeInfo) {
+      XtCallCallbackList(w, obj->inputConv.modechangecallback,
+			 (XtPointer)NULL);
+    }
+
+    if (ks->info & KanjiGLineInfo) { /* $B0lMw9T$,$"$k>l9g(B */
+      ICAuxControlArg arg;
+
+      switch (obj->canna.ibuf->candstat) {
+      case CANNA_GLINE_Start:
+	arg.command = ICAuxStart;
+	XtCallCallbackList((Widget)obj, obj->inputConv.auxcallback,
+			   (XtPointer)&arg);
+	break;
+      case CANNA_GLINE_End:
+	arg.command = ICAuxEnd;
+	XtCallCallbackList((Widget)obj, obj->inputConv.auxcallback,
+			   (XtPointer)&arg);
+	break;
+      case CANNA_GLINE_Change:
+	arg.command = ICAuxChange;
+	XtCallCallbackList((Widget)obj, obj->inputConv.auxcallback,
+			   (XtPointer)&arg);
+	break;
+      }
+    }
+
+    /* $B=*$o$j$+$I$&$+%A%'%C%/$9$k(B */
+    if (ks->info & KanjiModeInfo) {
+      wchar modeinfo[4];
+
+      wcKanjiControl((int)obj, KC_SETMODEINFOSTYLE, (char *)1);
+      wcKanjiControl((int)obj, KC_QUERYMODE, (char *)modeinfo);
+      wcKanjiControl((int)obj, KC_SETMODEINFOSTYLE, (char *)0);
+      if (modeinfo[0] - '@' == CANNA_MODE_AlphaMode) {
+	toJapaneseMode(obj);
+	convend(obj);
+      }
+    }
+    openSelection(obj, SELECTION_DO, 0/* dummy */);
+}
+
+static ICString *
+GetMode(w)
+Widget w;
+{
+    CannaObject obj = (CannaObject)w;
+    wchar *mode;
+    static ICString icstr;
+
+    icstr.nchars = obj->canna.ibuf->modelen;
+    if (icstr.nchars > 0) {
+      mode = obj->canna.ibuf->curmode;
+      icstr.data = (char *)mode;
+      icstr.nbytes = icstr.nchars * sizeof(wchar);
+      icstr.attr = ICAttrNormalString;
+    }
+    return &icstr;
+}
+
+static int
+CursorPos(w, nsegp, ncharp)
+Widget w;
+Cardinal *nsegp;
+Cardinal *ncharp;
+{
+    CannaObject obj = (CannaObject)w;
+    iBuf *ib = obj->canna.ibuf;
+    Cardinal nseg, nchar;
+    int ret = 0;
+
+    if (ib->curseg < ib->nseg) {
+      nseg = ib->curseg;
+      nchar = 0;
+    }
+    else {
+      nseg = ib->offset;
+      nchar = ib->len[0 + ib->offset];
+      ret = 1;
+    }
+    if (nsegp) {
+      *nsegp = nseg;
+    }
+    if (ncharp) {
+      *ncharp = nchar;
+    }
+
+    return ret;
+}
+
+static int
+NumSegments(w)
+Widget w;
+{
+    CannaObject obj = (CannaObject)w;
+    iBuf *ib = obj->canna.ibuf;
+
+    return ib->nseg;
+}
+
+static ICString *
+GetSegment(w, n)
+Widget w;
+Cardinal n;
+{
+    CannaObject obj = (CannaObject)w;
+    iBuf *ib = obj->canna.ibuf;
+    static ICString seg;
+
+    seg.data = (char *)ib->str[n];
+    seg.nchars = ib->len[n];
+    seg.nbytes = seg.nchars * sizeof(wchar);
+    if (ib->curseg == n) {
+      seg.attr = ICAttrConverted | ICAttrCurrentSegment;
+    }
+    else if (n < ib->offset) {
+      seg.attr = ICAttrConverted;
+    }
+    else {
+      seg.attr = ICAttrNotConverted;
+    }
+
+    return &seg;
+}
+
+/* ARGSUSED */
+static int
+CompareSegment(w, seg1, seg2, n)
+Widget w;
+ICString *seg1;
+ICString *seg2;
+Cardinal *n;
+{
+    wchar *p, *q;
+    int len, nsame;
+    int result = 0;
+
+    if (seg1->attr != seg2->attr) result |= ICAttrChanged;
+
+    len = seg1->nchars > seg2->nchars ? seg2->nchars : seg1->nchars;
+    nsame = 0;
+    p = (wchar *)seg1->data;
+    q = (wchar *)seg2->data;
+    while (nsame < len && *p++ == *q++) nsame++;
+
+    if (nsame != len || len != seg1->nchars || len != seg2->nchars)
+	result |= ICStringChanged;
+
+    if (n) *n = nsame;
+
+    return result;
+}
+
+static ICString *
+GetItemList(w, n)
+Widget w;
+Cardinal *n;
+{
+    CannaObject obj = (CannaObject)w;
+
+    *n = obj->canna.numcand;
+    return obj->canna.candlist;
+}
+
+#define SELECTBUFSIZE 1024
+
+static int
+SelectItem(w, n)
+Widget w;
+int n;
+{
+  CannaObject obj = (CannaObject)w;
+  wcKanjiStatus ks;
+  wcKanjiStatusWithValue ksv;
+  wchar buf[SELECTBUFSIZE];
+
+  if (n >= 0)
+    *(obj->canna.cur_addr) = n;
+
+  ksv.ks = &ks;
+  buf[0] = (wchar)'\r';
+  ksv.buffer = buf;
+  ksv.n_buffer = SELECTBUFSIZE;
+  ksv.val = CANNA_FN_Kakutei;
+  {
+    ignoreListfunc = 1;
+    wcKanjiControl((int)obj, KC_DO, (char *)&ksv);
+    ignoreListfunc = 0;
+  }
+  displayPreEdit(obj, ksv.val, buf, ksv.ks);
+  return 0;
+}
+
+static int
+ConvertedString(w, encoding, format, length, string)
+Widget w;
+Atom *encoding;
+int *format;
+int *length;
+XtPointer *string;
+{
+    CannaObject obj = (CannaObject)w;
+    iBuf *ib = obj->canna.ibuf;
+    wchar *wbuf, *wp;
+    int len, wlen;
+    extern int convJWStoCT();
+    int offset = ib->offset;
+
+    if (ib == NULL) return -1;
+
+    if (ib->nseg == 0 || ib->offset == 0) return -1;
+
+    wlen = ib->len[offset - 1];
+    if (wlen == 0) return -1;
+
+    wbuf = ib->str[offset - 1];
+
+    /*
+     * Canna $B%*%V%8%'%/%H$O(B COMPOUND_TEXT $B%(%s%3!<%G%#%s%0$7$+%5%]!<%H$7$J$$(B
+     * COMPOUND_TEXT $B$KJQ49$9$k(B
+     */
+    *encoding = XA_COMPOUND_TEXT(XtDisplayOfObject((Widget)obj));
+    *format = 8;
+
+    /* COMPOUND_TEXT $B$O(B \r $B$,Aw$l$J$$$N$G(B \n $B$KJQ49$7$F$*$/(B */
+    for (wp = wbuf; *wp != 0; wp++) {
+	if (*wp == '\r') *wp = '\n';
+    }
+
+    *length = len = convJWStoCT(wbuf, (unsigned char *)NULL, 0);
+    *string = XtMalloc(len + 1);
+    (void)convJWStoCT(wbuf, (unsigned char *)*string, 0);
+
+    shiftLeftAll(ib);
+
+    return 0;
+}
+
+static int
+ClearConversion(w)
+Widget w;
+{
+  CannaObject obj = (CannaObject)w;
+
+  wcKanjiStatus ks;
+  wcKanjiStatusWithValue ksv;
+  wchar buf[SELECTBUFSIZE];
+
+  ksv.ks = &ks;
+  ksv.buffer = buf;
+  ksv.n_buffer = SELECTBUFSIZE;
+  wcKanjiControl((int)obj, KC_KILL, (char *)&ksv);
+  displayPreEdit(obj, ksv.val, buf, ksv.ks);
+  return 0;
+}
+
+static ICString *
+GetAuxSegments(w, n, ns, nc)
+Widget w;
+Cardinal *n, *ns, *nc;
+{
+  CannaObject obj = (CannaObject)w;
+  iBuf *ib = obj->canna.ibuf;
+  Cardinal nseg, nchar;
+
+  if (n) {
+    *n = ib->ngseg;
+  }
+
+  if (ib->curgseg < ib->ngseg) {
+    nseg = ib->curgseg;
+    nchar = 0;
+  }
+  else {
+    nseg = 0;
+    nchar = ib->gllen[0];
+  }
+  if (ns) {
+    *ns = nseg;
+  }
+  if (nc) {
+    *nc = nchar;
+  }
+
+  return ib->ics;
+}
+
+/* ARGSUSED */
+static void
+Initialize(req, new, args, num_args)
+Widget req;
+Widget new;
+ArgList args;
+Cardinal *num_args;
+{
+    CannaObject obj = (CannaObject)new;
+
+    obj->canna.selectionending = False;
+    obj->canna.textchanged = False;
+    obj->canna.symbollist = SymbolList;
+    obj->canna.numsymbols = NumSymbols;
+    obj->canna.cursymbol = 0;
+    obj->canna.candlist = NULL;
+    obj->canna.candlistsize = 0;
+    obj->canna.numcand = 0;
+    obj->canna.lastTextLengthIsZero = False;
+      
+    ibufInitialize(obj);
+
+    /* $BJQ49$N=i4|2=(B */
+    initializeCannaConnection(obj);
+
+    addObject(obj);
+}
+
+static int
+bell()
+{
+  if (displaybell) {
+    XBell(displaybell, 0);
+  }
+  return 0;
+}
+
+static int nCannaContexts = 0;
+
+static
+initializeCannaConnection(obj)
+CannaObject obj;
+{
+  char **warn = 0;
+  extern (*jrBeepFunc)();
+
+  if (nCannaContexts == 0) {
+#ifdef KC_SETSERVERNAME
+    if (obj->canna.cannahost != NULL) {
+      wcKanjiControl((int)obj, KC_SETSERVERNAME, obj->canna.cannahost);
+    }
+#endif /* KC_SETSERVERNAME */
+#ifdef KC_SETINITFILENAME
+    if (obj->canna.cannafile != NULL) {
+      wcKanjiControl((int)obj, KC_SETINITFILENAME, obj->canna.cannafile);
+    }
+#endif /* KC_SETINITFILENAME */
+  
+    wcKanjiControl((int)obj, KC_INITIALIZE, (char *)&warn);
+    TRACE(("Canna initialized\n"));
+
+    if (warn) {
+      char **p;
+    
+      for (p = warn; *p ; p++) {
+	XtAppWarning(XtWidgetToApplicationContext((Widget)obj), *p);
+      }
+    }
+  }
+  nCannaContexts++;
+
+#ifdef KC_SETAPPNAME
+  wcKanjiControl((int)obj, KC_SETAPPNAME, "kinput2");
+#endif
+
+#ifdef DONT_USE_HANKAKU_KATAKANA
+  /* $BH>3Q%+%?%+%J$N6X;_(B */
+  wcKanjiControl((int)obj, KC_INHIBITHANKAKUKANA, (char *)1);
+#endif
+  
+  /* $B0lMw9T$r#7#8%3%i%`$K@_Dj(B */
+  wcKanjiControl((int)obj, KC_SETWIDTH, (char *)78);
+
+  /* $B8uJd0lMw%3!<%k%P%C%/$r@_Dj(B */
+
+#ifdef KC_SETLISTCALLBACK
+  {
+    jrListCallbackStruct lcs;
+
+    lcs.client_data = (char *)obj;
+    lcs.callback_func = listfunc;
+    wcKanjiControl((int)obj, KC_SETLISTCALLBACK, (char *)&lcs);
+  }
+#endif /* KC_SETLISTCALLBACK */
+
+  jrBeepFunc = bell;
+
+  /* $B$5$i$KF|K\8lF~NO%b!<%I$K$7$F$*$/(B */
+  toJapaneseMode(obj);
+}
+
+
+static void
+Destroy(w)
+Widget w;
+{
+    CannaObject obj = (CannaObject)w;
+    wcKanjiStatusWithValue ksv;
+    wcKanjiStatus ks;
+    wchar buf[512];
+    int i;
+    
+    /* $B%P%C%U%!$N2rJ|(B */
+
+    freeIBuf(obj->canna.ibuf);
+
+    if (obj->canna.candlist) {
+      for (i = 0 ; i < obj->canna.candlistsize ; i++) {
+	if ((obj->canna.candlist + i)->data) {
+	  XtFree((obj->canna.candlist + i)->data);
+	}
+      }
+
+      XtFree((char *)obj->canna.candlist);
+    }
+
+    /* $B!X$+$s$J!Y$N=hM}(B */
+    ksv.buffer = buf;
+    ksv.n_buffer = 512;
+    ksv.ks = &ks;
+
+    wcKanjiControl((int)obj, KC_CLOSEUICONTEXT, (char *)&ksv);
+
+    if (--nCannaContexts == 0) {
+      char **warn = 0;
+
+      wcKanjiControl(0, KC_FINALIZE, (char *)&warn);
+      if (warn) {
+	char **p;
+	
+	for (p = warn; *p ; p++) {
+	  XtAppWarning(XtWidgetToApplicationContext((Widget)obj), *p);
+	}
+      }
+    }
+
+    deleteObject(obj);
+}
+
+static Boolean
+SetValues(cur, req, wid, args, num_args)
+Widget cur;
+Widget req;
+Widget wid;
+ArgList args;
+Cardinal *num_args;
+/* ARGSUSED */
+{
+    CannaObject old = (CannaObject)cur;
+    CannaObject new = (CannaObject)wid;
+
+    return False;	     
+}
+
+static void
+fix(obj)
+CannaObject obj;
+{
+    /* $B3NDj$N=hM}(B */
+    XtCallCallbackList((Widget)obj, obj->inputConv.fixcallback,
+		       (XtPointer)NULL);	/* $B!)!)!)(B */
+}
+
+static void
+convend(obj)
+CannaObject obj;
+{
+    XtCallCallbackList((Widget)obj, obj->inputConv.endcallback,
+		       (XtPointer)NULL);
+}
+
+/*
+ * keeping list of objects
+ */
+typedef struct _oblist_ {
+    CannaObject obj;
+    struct _oblist_ *next;
+} ObjRec;
+
+static ObjRec *ObjList = NULL;
+
+static void
+addObject(obj)
+CannaObject obj;
+{
+    ObjRec *objp = XtNew(ObjRec);
+
+    objp->obj = obj;
+    objp->next = ObjList;
+    ObjList = objp;
+}
+
+static void
+deleteObject(obj)
+CannaObject obj;
+{
+    ObjRec *objp, *objp0;
+
+    for (objp0 = NULL, objp = ObjList;
+	 objp != NULL;
+	 objp0 = objp, objp = objp->next) {
+	if (objp->obj == obj) {
+	    if (objp0 == NULL) {
+		ObjList = objp->next;
+	    } else {
+		objp0->next = objp->next;
+	    }
+	    XtFree((char *)objp);
+	    return;
+	}
+    }
+}
+
+/*
+ * Operations to canna.ibuf
+ */
+
+/* cfuncdef
+
+   changeTextForCanna -- ibuf $B$NFbMF$r(B kanji_status $B$rMQ$$$F=q$-49$($k!#(B
+
+
+   $B4pK\E*$K$O8uJdJ8;zNs$H8uJd0lMw9TJ8;zNs$K4X$7$F0J2<$N=hM}$r9T$&!#(B
+
+   (1) $B$$$:$l$NJ8;zNs$b%F%-%9%H$,H?E>$7$F$$$kItJ,$H$=$&$G$J$$ItJ,(B
+       $B$,B8:_$7!"H?E>$7$F$$$kItJ,$O#1%+=j$7$+B8:_$7$J$$!#(B
+   (2) $B$7$?$,$C$F$$$:$l$NJ8;zNs$bH?E>$7$F$$$k$H$3$m$H$=$NN>C<$KH?E>(B
+       $B$7$F$$$J$$ItJ,$H$,B8:_$9$k>l9g$K#3ItJ,$KJ,$+$l$k$3$H$K$J$j!"(B
+       $BH?E>$7$F$$$kItJ,$N0LCV$d!"H?E>$7$F$$$k2U=j$,$J$$>l9g$J$I$r(B
+       $B9g$o$;$F9M$($F$b#3ItJ,0J>e$KJ,$+$l$k$3$H$O$J$$!#(B
+   (3) $B$7$?$,$C$F!"$$$:$l$NJ8;zNs$b:GBg#3$D$N%;%0%a%s%H$KJ,$1$FI=<((B
+       $B%&%#%8%'%C%H$KEO$9$h$&$K$9$k!#(B
+
+ */
+
+static
+changeTextForCanna(cldata, ksp)
+caddr_t cldata;
+wcKanjiStatus *ksp;
+{
+    CannaObject obj = (CannaObject)cldata;
+    iBuf *ibuf = obj->canna.ibuf;
+    int offset = ibuf->offset, i;
+
+    if (ksp->length == 0) {
+      ibuf->curseg = offset;
+      ibuf->nseg = offset;
+      ibuf->len[0 + offset] = ibuf->len[1 + offset] =
+	ibuf->len[2 + offset] = 0;
+      if (!obj->canna.lastTextLengthIsZero) {
+	obj->canna.textchanged = True;
+	obj->canna.lastTextLengthIsZero = True;
+      }
+    }
+    else if (ksp->length > 0) {
+      obj->canna.lastTextLengthIsZero = False;
+      ibuf->len[1 + offset] = ibuf->len[2 + offset] = 0;
+      if (ksp->revLen > 0) {
+	if (ksp->revPos == 0) {
+	  int remain = ksp->length - ksp->revLen;
+
+	  copyInWchar(ksp->echoStr, ksp->revLen,
+		      &(ibuf->str[0 + offset]), &(ibuf->size[0 + offset]),
+		      &(ibuf->len[0 + offset]));
+	  ibuf->curseg = offset;
+	  ibuf->nseg = offset + 1;
+	  if (remain) {
+	    copyInWchar(ksp->echoStr + ksp->revLen, remain,
+			&(ibuf->str[1 + offset]), &(ibuf->size[1 + offset]),
+			&(ibuf->len[1 + offset]));
+	    ibuf->nseg = offset + 2;
+	  }
+	}
+	else {
+	  int remain = ksp->length - ksp->revPos - ksp->revLen;
+
+	  copyInWchar(ksp->echoStr, ksp->revPos,
+		      &(ibuf->str[0 + offset]), &(ibuf->size[0 + offset]),
+		      &(ibuf->len[0 + offset]));
+	  copyInWchar(ksp->echoStr + ksp->revPos, ksp->revLen,
+		      &(ibuf->str[1 + offset]), &(ibuf->size[1 + offset]),
+		      &(ibuf->len[1 + offset]));
+	  ibuf->curseg = offset + 1;
+	  ibuf->nseg = offset + 2;
+	  if (remain) {
+	    copyInWchar(ksp->echoStr + ksp->revPos + ksp->revLen,
+			remain,
+			&(ibuf->str[2 + offset]), &(ibuf->size[2 + offset]),
+			&(ibuf->len[2 + offset]));
+	  ibuf->nseg = offset + 3;
+	  }
+	}
+      }
+      else {
+	copyInWchar(ksp->echoStr, ksp->length,
+		    &(ibuf->str[0 + offset]), &(ibuf->size[0 + offset]),
+		    &(ibuf->len[0 + offset]));
+	ibuf->len[1 + offset] = ibuf->len[2 + offset] = 0;
+	ibuf->nseg = offset + 1;
+	ibuf->curseg = offset + 1;
+      }
+      obj->canna.textchanged = True;
+    }
+    /* $B%b!<%I(B */
+    if (ksp->info & KanjiModeInfo) {
+      int modelen = 0;
+
+      while (ksp->mode[modelen]) modelen++;
+      copyInWchar(ksp->mode, modelen,
+		  &(ibuf->curmode), &(ibuf->modesize), &(ibuf->modelen));
+    }
+    /* $B0lMw9T(B */
+    if (ksp->info & KanjiGLineInfo) {
+      if (ksp->gline.length == 0) {
+	switch (ibuf->candstat) {
+	case CANNA_GLINE_Empty:
+	case CANNA_GLINE_End:
+	  ibuf->candstat = CANNA_GLINE_Empty;
+	  break;
+	case CANNA_GLINE_Start:
+	case CANNA_GLINE_Change:
+	  ibuf->candstat = CANNA_GLINE_End;
+	  break;
+	}
+	ibuf->curgseg = 0;
+	ibuf->ngseg = 0;
+	ibuf->gllen[0] = ibuf->gllen[1] = ibuf->gllen[2] = 0;
+      }
+      else if (ksp->gline.length > 0) {
+	switch (ibuf->candstat) {
+	case CANNA_GLINE_Empty:
+	case CANNA_GLINE_End:
+	  ibuf->candstat = CANNA_GLINE_Start;
+	  break;
+	case CANNA_GLINE_Start:
+	case CANNA_GLINE_Change:
+	  ibuf->candstat = CANNA_GLINE_Change;
+	  break;
+	}
+	ibuf->gllen[1] = ibuf->gllen[2] = 0;
+	if (ksp->gline.revLen > 0) {
+	  if (ksp->gline.revPos == 0) {
+	    int remain = ksp->gline.length - ksp->gline.revLen;
+	    
+	    copyInWchar(ksp->gline.line, ksp->gline.revLen,
+			&(ibuf->gline[0]), &(ibuf->glsize[0]),
+			&(ibuf->gllen[0]));
+	    ibuf->curgseg = 0;
+	    ibuf->ngseg = 1;
+	    if (remain) {
+	      copyInWchar(ksp->gline.line + ksp->gline.revLen, remain,
+			  &(ibuf->gline[1]), &(ibuf->glsize[1]),
+			  &(ibuf->gllen[1]));
+	      ibuf->ngseg = 2;
+	    }
+	  }
+	  else {
+	    int remain = ksp->gline.length
+	      - ksp->gline.revPos - ksp->gline.revLen;
+	    
+	    copyInWchar(ksp->gline.line, ksp->gline.revPos,
+			&(ibuf->gline[0]), &(ibuf->glsize[0]),
+			&(ibuf->gllen[0]));
+	    copyInWchar(ksp->gline.line + ksp->gline.revPos, ksp->gline.revLen,
+			&(ibuf->gline[1]), &(ibuf->glsize[1]),
+			&(ibuf->gllen[1]));
+	    ibuf->curgseg = 1;
+	    ibuf->ngseg = 2;
+	    if (remain) {
+	      copyInWchar(ksp->gline.line
+			  + ksp->gline.revPos + ksp->gline.revLen,
+			  remain,
+			  &(ibuf->gline[2]), &(ibuf->glsize[2]),
+			  &(ibuf->gllen[2]));
+	      ibuf->ngseg = 3;
+	    }
+	  }
+	}
+	else {
+	  copyInWchar(ksp->gline.line, ksp->gline.length,
+		      &(ibuf->gline[0]), &(ibuf->glsize[0]),
+		      &(ibuf->gllen[0]));
+	  ibuf->gllen[1] = ibuf->gllen[2] = 0;
+	  ibuf->ngseg = 1;
+	  ibuf->curgseg = 1;
+	}
+      }
+      for (i = 0 ; i < ibuf->ngseg ; i++) {
+	ibuf->ics[i].data = (char *)ibuf->gline[i];
+	ibuf->ics[i].nchars = ibuf->gllen[i];
+	ibuf->ics[i].nbytes = ibuf->gllen[i] * sizeof(wchar);
+	ibuf->ics[i].attr = ICAttrConverted;
+      }
+      if (ibuf->curgseg < ibuf->ngseg) {
+	ibuf->ics[ibuf->curgseg].attr |= ICAttrCurrentSegment;
+      }
+    }
+}
+
+/* cfuncdef
+
+   copyInWchar -- wchar $B$r%3%T!<$9$k!#(B
+
+   ws, wlen $B$G<($5$l$?(B wchar $BJ8;zNs$r(B wsbuf $B$N%]%$%s%H@h$N%P%C%U%!$K3J(B
+   $BG<$9$k!#(Bwsbuf $B$N%5%$%:$O(B wssize $B$N%]%$%s%H@h$K3JG<$5$l$F$$$kCM$G;X(B
+   $BDj$5$l$k$,!"$=$l$G$O>.$5$$;~$O(B copyInWchar $BFb$G(B XtRealloc $B$5$l!"?7(B
+   $B$?$K%"%m%1!<%H$5$l$?%P%C%U%!$,(B wsbuf $B$N%]%$%s%H@h$K3JG<$5$l$k!#$^$?!"(B
+   $B%P%C%U%!$N?7$?$J%5%$%:$,(B wssize $B$N%]%$%s%H@h$K3JG<$5$l$k!#F@$i$l$?(B
+   $BJ8;z?t$,(Bwslen $B$N%]%$%s%H@h$K3JG<$5$l$k!#(B
+
+ */
+
+static
+copyInWchar(ws, wlen, wsbuf, wssize, wslen)
+wchar *ws;
+int wlen;
+wchar **wsbuf;
+int *wssize, *wslen;
+{
+  int i;
+
+  if (*wssize == 0) {
+    if ((*wsbuf = (wchar *)XtMalloc((wlen + 1) * sizeof(wchar)))
+	 == (wchar *)0) {
+      /* $B%(%i!<$@(B */
+    }
+    else {
+      *wssize = wlen + 1;
+    }
+  }
+  if (wlen + 1 > *wssize) {
+    if ((*wsbuf = (wchar *)XtRealloc((char *)*wsbuf,
+				     (wlen + 1) * sizeof(wchar)))
+	 == (wchar *)0) {
+      /* $B%(%i!<$@!#$I$&$9$l$PNI$$!)(B */
+    }
+    else {
+      *wssize = wlen + 1;
+    }
+  }
+  *wslen = wlen;
+  (void)bcopy(ws, *wsbuf, wlen * sizeof(wchar));
+  *(*wsbuf + wlen) = (wchar)0;
+
+  return 0; /* $B#0$OFC$K0UL#$,L5$$(B */
+}
+
+/* cfuncdef
+
+   fixProcForCanna -- $B3NDj$7$?J8;z$N=hM}$r9T$&(B
+
+ */
+
+static
+fixProcForCanna(cldata, fixedstr, fixedlen)
+caddr_t cldata;
+wchar *fixedstr;
+int fixedlen;
+{
+  CannaObject obj = (CannaObject)cldata;
+  iBuf *ib = obj->canna.ibuf;
+  int offset = ib->offset;
+  
+  if (offset < NConvertedSegments) {
+    shiftRight(ib);
+    offset = ib->offset;
+  }
+  else {
+    shiftLeft(ib);
+  }
+  copyInWchar(fixedstr, fixedlen,
+	      &(ib->str[offset - 1]), &(ib->size[offset - 1]),
+	      &(ib->len[offset - 1]));
+}
+
+/* cfuncdef
+
+   shiftRight -- ibuf $B$NJ8;z%P%C%U%!$N(B offset $B0J9_$r1&$K%7%U%H$9$k(B
+
+ */
+
+static
+shiftRight(ib)
+iBuf *ib;
+{
+  int i;
+  wchar *tmpbuf;
+  int tmpsize, tmplen;
+  int offset = ib->offset;
+
+  tmpbuf = ib->str[ib->nseg];
+  tmpsize = ib->size[ib->nseg];
+  for (i = ib->nseg ; offset < i ; i--) {
+    ib->str[i] = ib->str[i - 1];
+    ib->size[i] = ib->size[i - 1];
+    ib->len[i] = ib->len[i - 1];
+  }
+  ib->str[offset] = tmpbuf;
+  ib->size[offset] = tmpsize;
+  ib->offset++;
+  ib->nseg++;
+  ib->curseg++;
+}
+
+/* cfuncdef
+
+   shiftLeft -- ibuf $B$NJ8;z%P%C%U%!$N(B offset $B0JA0$r:8$K%7%U%H$9$k(B
+
+ */
+
+static
+shiftLeft(ib)
+iBuf *ib;
+{
+  int i;
+  wchar *tmpbuf;
+  int tmpsize, tmplen;
+  int offset = ib->offset;
+
+  tmpbuf = ib->str[0];
+  tmpsize = ib->size[0];
+  for (i = 0 ; i < offset - 1 ; i++) {
+    ib->str[i] = ib->str[i + 1];
+    ib->size[i] = ib->size[i + 1];
+    ib->len[i] = ib->len[i + 1];
+  }
+  ib->str[offset - 1] = tmpbuf;
+  ib->size[offset - 1] = tmpsize;
+}
+
+/* cfuncdef
+
+   shiftLeftAll -- ibuf $B$NJ8;z%P%C%U%!A4BN$r:8$K%7%U%H$9$k(B
+
+ */
+
+static
+shiftLeftAll(ib)
+iBuf *ib;
+{
+  int i;
+  wchar *tmpbuf;
+  int tmpsize, tmplen;
+  int nseg = ib->nseg;
+
+  tmpbuf = ib->str[0];
+  tmpsize = ib->size[0];
+  for (i = 0 ; i < nseg - 1 ; i++) {
+    ib->str[i] = ib->str[i + 1];
+    ib->size[i] = ib->size[i + 1];
+    ib->len[i] = ib->len[i + 1];
+  }
+  ib->str[nseg - 1] = tmpbuf;
+  ib->size[nseg - 1] = tmpsize;
+  ib->nseg--;
+  ib->curseg--;
+  ib->offset--;
+}
+
+/* cfuncdef
+
+   ibufInitialize -- ibuf $B$N=i4|2==hM}(B
+ */
+
+static
+ibufInitialize(obj)
+CannaObject obj;
+{
+  int i;
+  iBuf *ib;
+
+  ib = obj->canna.ibuf = (iBuf *)XtMalloc(sizeof(iBuf));
+  if (ib == 0) {
+    /* $B%(%i!<$@!#$I$&$9$Y(B */
+  }
+  for (i = 0 ; i < NConvertedSegments + 3 ; i++) {
+    ib->size[i] = 0;
+    ib->len[i] = 0;
+  }
+  ib->offset = ib->curseg = ib->nseg = 0;
+  ib->candstat = CANNA_GLINE_Empty;
+  for (i = 0 ; i < 3 ; i++) {
+    ib->gline[i] = 0;
+    ib->glsize[i] = ib->gllen[i] = 0;
+  }
+  ib->modesize = 0;
+  ib->modelen = 0;
+}
+
+/* cfuncdef
+
+   freeIBuf -- ibuf $B$N(B free
+
+ */
+
+static
+freeIBuf(ib)
+iBuf *ib;
+{
+  int i;
+
+  if (ib == 0) {
+    return 0;
+  }
+  for (i = 0 ; i < NConvertedSegments + 3 ; i++) {
+    if (ib->size[i] > 0) {
+      XtFree((char *)ib->str[i]);
+    }
+  }
+  for (i = 0 ; i < 3 ; i++) {
+    if (ib->glsize[i] > 0) {
+      XtFree((char *)ib->gline[i]);
+    }
+  }
+  if (ib->modesize > 0) {
+    XtFree((char *)ib->curmode);
+  }
+  free(ib);
+  return 0;
+}
+
+static
+toJapaneseMode(obj)
+CannaObject obj;
+{
+  wcKanjiStatusWithValue ksv;
+  wcKanjiStatus ks;
+  wchar buf[1024];
+
+  buf[0] = '@';
+  ksv.ks = &ks;
+  ksv.buffer = buf;
+  ksv.n_buffer = 1024;
+#ifndef KC_DO
+  ksv.val = CANNA_MODE_HenkanMode;
+  wcKanjiControl((int)obj, KC_CHANGEMODE, (char *)&ksv);
+#else
+  ksv.val = CANNA_FN_JapaneseMode;
+  wcKanjiControl((int)obj, KC_DO, (char *)&ksv);
+#endif
+  changeTextForCanna(obj, &ks);
+}
+
+/* checkIfFunctionalChar -- $B%7%U%H%-!<$N$h$&$KL50UL#$J%-!<$+$I$&$+$NH=JL(B
+
+  $BCM(B:		$B#1(B	$B0UL#$,$"$k(B
+  		$B#0(B	$BL50UL#(B($B%b%G%#%U%!%$%"%-!<$J$I(B)
+*/
+
+static int
+checkIfFunctionalChar(event_struct, keysym, buffer_return, n_buffer)
+XKeyEvent *event_struct;
+KeySym keysym;
+wchar *buffer_return;
+int n_buffer;
+{
+  int functionalChar = 0;
+
+  switch ((int)keysym)
+    {
+    case XK_KP_F1:
+    case XK_KP_F2:
+    case XK_KP_F3:
+    case XK_KP_F4:
+      *buffer_return = 	CANNA_KEY_PF1 + (int)keysym - (int)XK_KP_F1;
+      functionalChar = 1;
+      break;
+    case XK_F1:
+    case XK_F2:
+    case XK_F3:
+    case XK_F4:
+    case XK_F5:
+    case XK_F6:
+    case XK_F7:
+    case XK_F8:
+    case XK_F9:
+    case XK_F10:
+    case XK_F11:
+    case XK_F12:
+    case XK_F13:
+    case XK_F14:
+    case XK_F15:
+    case XK_F16:
+      *buffer_return = CANNA_KEY_F1 + (int)keysym - (int)XK_F1;
+      functionalChar = 1;
+      break;
+    case XK_Insert:
+      *buffer_return = CANNA_KEY_Insert;
+      functionalChar = 1;
+      break;
+    case XK_Prior:
+      *buffer_return = CANNA_KEY_Rollup;
+      functionalChar = 1;
+      break;
+    case XK_Next:
+      *buffer_return = CANNA_KEY_Rolldown;
+      functionalChar = 1;
+      break;
+    case XK_Muhenkan:
+      if (event_struct->state & 4 /* control-shifted */)
+	*buffer_return = CANNA_KEY_Cntrl_Nfer;
+      else if (event_struct->state & 1 /* shifted */)
+	*buffer_return = CANNA_KEY_Shift_Nfer;
+      else
+	*buffer_return = CANNA_KEY_Nfer;
+      functionalChar = 1;
+      break;
+    case XK_Kanji:
+      if (event_struct->state & 4 /* control-shifted */)
+	*buffer_return = CANNA_KEY_Cntrl_Xfer;
+      else if (event_struct->state & 1 /* shifted */)
+	*buffer_return = CANNA_KEY_Shift_Xfer;
+      else
+	*buffer_return = CANNA_KEY_Xfer;
+      functionalChar = 1;
+      break;
+    case XK_Up:
+      if (event_struct->state & 4 /* control-shifted */)
+	*buffer_return = CANNA_KEY_Cntrl_Up;
+      else if (event_struct->state & 1 /* shifted */)
+	*buffer_return = CANNA_KEY_Shift_Up;
+      else
+	*buffer_return = CANNA_KEY_Up;
+      functionalChar = 1;
+      break;
+    case XK_Down:
+      if (event_struct->state & 4 /* control-shifted */)
+	*buffer_return = CANNA_KEY_Cntrl_Down;
+      else if (event_struct->state & 1 /* shifted */)
+	*buffer_return = CANNA_KEY_Shift_Down;
+      else
+	*buffer_return = CANNA_KEY_Down;
+      functionalChar = 1;
+      break;
+    case XK_Right:
+      if (event_struct->state & 4 /* control-shifted */)
+	*buffer_return = CANNA_KEY_Cntrl_Right;
+      else if (event_struct->state & 1 /* shifted */)
+	*buffer_return = CANNA_KEY_Shift_Right;
+      else
+	*buffer_return = CANNA_KEY_Right;
+      functionalChar = 1;
+      break;
+    case XK_Left:
+      if (event_struct->state & 4 /* control-shifted */)
+	*buffer_return = CANNA_KEY_Cntrl_Left;
+      else if (event_struct->state & 1 /* shifted */)
+	*buffer_return = CANNA_KEY_Shift_Left;
+      else
+	*buffer_return = CANNA_KEY_Left;
+      functionalChar = 1;
+      break;
+    case XK_Help:
+      *buffer_return = CANNA_KEY_Help;
+      functionalChar = 1;
+      break;
+    case XK_Home:
+      *buffer_return = CANNA_KEY_Home;
+      functionalChar = 1;
+      break;
+    }
+  return functionalChar;
+}
+
+#ifdef KC_SETLISTCALLBACK
+
+static void
+moveSelection(obj, dir)
+CannaObject obj;
+int dir;
+{
+    ICSelectionControlArg arg;
+
+    arg.command = ICSelectionMove;
+    arg.u.dir = dir;
+    XtCallCallbackList((Widget)obj, obj->inputConv.selectioncallback,
+		       (XtPointer)&arg);
+}
+
+static int
+insertSelection(obj, selected)
+CannaObject obj;
+int selected;
+{
+    obj->canna.curcand = selected;
+    *(obj->canna.cur_addr) = selected;
+
+    return 0;
+}
+
+static void
+endSelection(obj, abort)
+CannaObject obj;
+int abort;
+{
+    ICSelectionControlArg arg;
+    int selected;
+
+    if (ignoreListfunc) return; /* SelectItem $B$G=hM}$5$l$k$N$G$3$3$OITMW(B */
+    arg.command = ICSelectionEnd;
+    arg.u.current_item = -1;
+    XtCallCallbackList((Widget)obj, obj->inputConv.selectioncallback,
+		       (XtPointer)&arg);
+
+    if (!abort && (selected = arg.u.current_item) >= 0) {
+        insertSelection(obj, selected);
+    }
+}
+
+#ifdef CANNA_LIST_Query
+static void
+querySelection(obj)
+CannaObject obj;
+{
+  ICSelectionControlArg arg;
+  int selected;
+
+  if (ignoreListfunc) return; /* SelectItem $B$G=hM}$5$l$k$N$G$3$3$OITMW(B */
+  arg.command = ICSelectionGet;
+  arg.u.current_item = -1;
+  XtCallCallbackList((Widget)obj, obj->inputConv.selectioncallback,
+		     (XtPointer)&arg);
+
+  if ((selected = arg.u.current_item) >= 0) {
+    insertSelection(obj, selected);
+  }
+}
+#endif
+
+static void
+openSelection(obj, func, curitem)
+CannaObject obj;
+int func; /* $B0lHV>e$r8+$h(B */
+int curitem;
+{
+  ICSelectionControlArg arg;
+  static int current = 0;
+  static int doit = 0;
+
+  if (func == SELECTION_SET) {
+    current = curitem;
+    doit = 1;
+  }
+  else if (func == SELECTION_DO && doit) {
+    doit = 0;
+    arg.command = ICSelectionStart;
+    arg.u.selection_kind = ICSelectionCandidates;
+    XtCallCallbackList((Widget)obj, obj->inputConv.selectioncallback,
+		       (XtPointer)&arg);
+
+    /* set current item */
+    arg.command = ICSelectionSet;
+    arg.u.current_item = current;
+    XtCallCallbackList((Widget)obj, obj->inputConv.selectioncallback,
+		       (XtPointer)&arg);
+  }
+}
+
+static void getAllCandidates();
+
+/* listfunc -- $B8uJd0lMw%b!<%I$K$J$C$?;~$K8F$S=P$5$l$k4X?t(B
+ *
+ * obj      : KC_SETLISTCALLBACK $B$G@_Dj$7$?%/%i%$%"%s%H%G!<%?(B
+ * func     : $B8uJd0lMw5!G=$N8GM-$N5!G=$rI=$9#I#D(B
+ * items    : Start $B$N;~$K$O8uJd0lMw$NA4%"%$%F%`$,F~$k(B
+ * nitems   :      $B!7(B       $BA4%"%$%F%`$N?t$,F~$k(B
+ * cur_item :      $B!7(B       $B%+%l%s%H%"%$%F%`HV9f$r3JG<$9$k%"%I%l%9$,F~$k(B
+ */
+
+static CANNA_LISTFUNCTYPE
+listfunc(obj, func, items, nitems, cur_item)
+CannaObject obj;
+int  func;
+wchar **items;
+int nitems, *cur_item;
+{
+  ICSelectionControlArg arg;
+  int i;
+  wchar **p;
+
+  switch (func) {
+  case CANNA_LIST_Start:
+    getAllCandidates(obj, nitems, items);
+    obj->canna.numcand = nitems;
+    obj->canna.curcand = *cur_item;
+    obj->canna.cur_addr = cur_item;
+    openSelection(obj, SELECTION_SET, *cur_item);
+    break;
+  case CANNA_LIST_Select:
+    endSelection(obj, False);
+    break;
+  case CANNA_LIST_Quit:
+    endSelection(obj, True);
+    break;
+#ifdef CANNA_LIST_Query
+  case CANNA_LIST_Query:
+    querySelection(obj);
+    break;
+#endif
+#ifdef CANNA_LIST_Convert
+  case CANNA_LIST_Convert:
+#endif
+  case CANNA_LIST_Forward:
+    moveSelection(obj, ICMoveRight);
+    break;
+  case CANNA_LIST_Backward:
+    moveSelection(obj, ICMoveLeft);
+    break;
+  case CANNA_LIST_Next:
+    moveSelection(obj, ICMoveDown);
+    break;
+  case CANNA_LIST_Prev:
+    moveSelection(obj, ICMoveUp);
+    break;
+  case CANNA_LIST_BeginningOfLine:
+    moveSelection(obj, ICMoveLeftMost);
+    break;
+  case CANNA_LIST_EndOfLine:
+    moveSelection(obj, ICMoveRightMost);
+    break;
+#ifdef CANNA_LIST_Insert
+  case CANNA_LIST_Insert:
+    return 0;
+#endif
+  }
+#ifdef CANNA_LIST_Convert
+  return 1;
+#endif
+}
+
+static void
+allocCandlist(obj, n)
+CannaObject obj;
+int n;
+{
+    ICString *p;
+    int i;
+
+    if (n <= obj->canna.candlistsize) return;
+
+    if (obj->canna.candlistsize == 0) {
+	p = (ICString *)XtMalloc(n * sizeof(ICString));
+    } else {
+	p = (ICString *)XtRealloc((char *)obj->canna.candlist,
+				  n * sizeof(ICString));
+    }
+    for (i = obj->canna.candlistsize ; i < n ; i++) {
+      p[i].nbytes = p[i].nchars = (unsigned short)0;
+      p[i].data = (char *)0;
+      p[i].attr = 0;
+    }
+
+    obj->canna.candlist = p;
+    obj->canna.candlistsize = n;
+}
+
+static void
+getAllCandidates(obj, ncand, items)
+CannaObject obj;
+int ncand;
+wchar **items;
+{
+    ICString *strp;
+    wchar **p;
+    int i, bytes, chars;
+
+    allocCandlist(obj, ncand);
+
+    for (i = 0, strp = obj->canna.candlist, p = items ;
+	 i < ncand; i++, strp++, p++) {
+        int len = 0;
+
+        bytes = strp->nbytes;
+	chars = strp->nchars;
+	while ((*p)[len]) len++;
+        copyInWchar(*p, len, (wchar **)&(strp->data), &bytes, &chars);
+	strp->nbytes = bytes;
+	strp->nchars = chars;
+	strp->attr = ICAttrNormalString;
+    }
+}
+#endif /* KC_SETLISTCALLBACK */
+
+struct _keymap {
+  unsigned char cannakey;
+  KeySym keysym;
+  long modifier;
+} cannakeymap[] = {
+  {(unsigned char)'\b',		XK_BackSpace,	0},
+  {(unsigned char)'\t',		XK_Tab,		0},
+  {(unsigned char)'\n',		XK_Linefeed,	0},
+  {(unsigned char)'\013',	XK_Clear,	0},
+  {(unsigned char)'\r',		XK_Return,	0},
+  {(unsigned char)'\023',	XK_Pause,	0},
+  {(unsigned char)'\024',	XK_Scroll_Lock,	0},
+  {(unsigned char)'\e',		XK_Escape,	0},
+  {(unsigned char)CANNA_KEY_Nfer,	XK_Muhenkan,	0},
+  {(unsigned char)CANNA_KEY_Xfer,	XK_Kanji,	0},
+  {(unsigned char)CANNA_KEY_Up,		XK_Up,		0},
+  {(unsigned char)CANNA_KEY_Left,	XK_Left,	0},
+  {(unsigned char)CANNA_KEY_Right,	XK_Right,	0},
+  {(unsigned char)CANNA_KEY_Down,	XK_Down,	0},
+  {(unsigned char)CANNA_KEY_Insert,	XK_Insert,	0},
+  {(unsigned char)CANNA_KEY_Rollup,	XK_Prior,	0},
+  {(unsigned char)CANNA_KEY_Rolldown,	XK_Next,	0},
+  {(unsigned char)CANNA_KEY_Home,	XK_Home,	0},
+  {(unsigned char)CANNA_KEY_Help,	XK_Help,	0},
+  {(unsigned char)CANNA_KEY_KP_Key,	XK_KP_Space,	0}, /* ? */
+  {(unsigned char)CANNA_KEY_Shift_Nfer,	XK_Muhenkan,	ShiftMask},
+  {(unsigned char)CANNA_KEY_Shift_Xfer,	XK_Kanji,	ShiftMask},
+  {(unsigned char)CANNA_KEY_Shift_Up,	XK_Up,		ShiftMask},
+  {(unsigned char)CANNA_KEY_Shift_Left,	XK_Left,	ShiftMask},
+  {(unsigned char)CANNA_KEY_Shift_Right, XK_Right,	ShiftMask},
+  {(unsigned char)CANNA_KEY_Shift_Down,	XK_Down,	ShiftMask},
+  {(unsigned char)CANNA_KEY_Cntrl_Nfer,	XK_Muhenkan,	ControlMask},
+  {(unsigned char)CANNA_KEY_Cntrl_Xfer,	XK_Kanji,	ControlMask},
+  {(unsigned char)CANNA_KEY_Cntrl_Up,	XK_Up,		ControlMask},
+  {(unsigned char)CANNA_KEY_Cntrl_Left,	XK_Left,	ControlMask},
+  {(unsigned char)CANNA_KEY_Cntrl_Right, XK_Right,	ControlMask},
+  {(unsigned char)CANNA_KEY_Cntrl_Down,	XK_Down,	ControlMask},
+  {(unsigned char)CANNA_KEY_F1,		XK_F1,		0},
+  {(unsigned char)CANNA_KEY_F2,		XK_F2,		0},
+  {(unsigned char)CANNA_KEY_F3,		XK_F3,		0},
+  {(unsigned char)CANNA_KEY_F4,		XK_F4,		0},
+  {(unsigned char)CANNA_KEY_F5,		XK_F5,		0},
+  {(unsigned char)CANNA_KEY_F6,		XK_F6,		0},
+  {(unsigned char)CANNA_KEY_F7,		XK_F7,		0},
+  {(unsigned char)CANNA_KEY_F8,		XK_F8,		0},
+  {(unsigned char)CANNA_KEY_F9,		XK_F9,		0},
+  {(unsigned char)CANNA_KEY_F10,	XK_F10,		0},
+  {(unsigned char)CANNA_KEY_PF1,	XK_KP_F1,	0},
+  {(unsigned char)CANNA_KEY_PF2,	XK_KP_F2,	0},
+  {(unsigned char)CANNA_KEY_PF3,	XK_KP_F3,	0},
+  {(unsigned char)CANNA_KEY_PF4,	XK_KP_F4,	0},
+  {(unsigned char)CANNA_KEY_PF5,	XK_F15,		0},
+  {(unsigned char)CANNA_KEY_PF6,	XK_F16,		0},
+  {(unsigned char)CANNA_KEY_PF7,	XK_F17,		0},
+  {(unsigned char)CANNA_KEY_PF8,	XK_F18,		0},
+  {(unsigned char)CANNA_KEY_PF9,	XK_F19,		0},
+  {(unsigned char)CANNA_KEY_PF10,	XK_F20,		0},
+};
+
+#define NCANNAKEYMAP (sizeof(cannakeymap) / sizeof(struct _keymap))
+
+/* ARGSUSED */
+static int
+GetTriggerKeys(w, keys_return)
+Widget w;
+ICTriggerKey **keys_return;
+{
+  CannaObject obj = (CannaObject)w;
+  ICTriggerKey *keys;
+  unsigned char c, mkeys[256], *p, *ekeys; /* enough */
+  int n;
+  struct _keymap *pk, *ek;
+
+  n = wcKanjiControl((int)obj, KC_MODEKEYS, (char *)mkeys);
+
+  *keys_return = keys =
+    (ICTriggerKey *)XtMalloc(2 * n * sizeof(ICTriggerKey));
+  /* $B!V(B2 *$B!W$N0UL#(B:
+     $B0l$D$N%3!<%I$K(B2$B$D$N(B X $B$N%-!<$,B8:_$7$F$$$?$j$9$k;v$,$"$k!#(B
+     ($BNc(B) C-h $B"*(B Ctl<Key>h, <Key>Backspace */
+
+  if (keys) {
+    for (p = mkeys, ekeys = p + n ; p < ekeys ; p++, keys++) {
+      c = *p;
+      if (c == (unsigned char)0) {
+	keys->keysym = XK_space;
+	keys->modifiers = keys->modifiermask = ControlMask;
+	keys++;
+	keys->keysym = XK_at;
+	keys->modifiers = keys->modifiermask = ControlMask;
+      }
+      else if (c < ' ') {
+	keys->keysym = XK_quoteleft + c;
+	keys->modifiers = keys->modifiermask = ControlMask;
+	for (pk = cannakeymap, ek = cannakeymap + NCANNAKEYMAP ;
+	     pk < ek ; pk++) {
+	  if (c == pk->cannakey) {
+	    keys++;
+	    keys->keysym = pk->keysym;
+	    keys->modifiers = keys->modifiermask = pk->modifier;
+	  }
+	}
+      }
+      else if (c <= '~') {
+	keys->keysym = XK_space + (c - (unsigned char)' ');
+	keys->modifiers = keys->modifiermask = 0;
+      }
+      else if (c == 0x7f) {
+	keys->keysym = XK_Delete;
+	keys->modifiers = keys->modifiermask = 0;
+      }
+      else if ((unsigned char)0xa1 <= c && c <= (unsigned char)0xdf) {
+	keys->keysym = XK_kana_fullstop + (c - (unsigned char)0xa1);
+	keys->modifiers = keys->modifiermask = pk->modifier;
+      }
+      else {
+	keys--;
+	for (pk = cannakeymap, ek = cannakeymap + NCANNAKEYMAP ;
+	     pk < ek ; pk++) {
+	  if (c == pk->cannakey) {
+	    keys++;
+	    keys->keysym = pk->keysym;
+	    keys->modifiers = keys->modifiermask = pk->modifier;
+	  }
+	}
+      }
+    }
+    return n;
+  }
+  return 0;
+}
+
+/* ARGSUSED */
+static int
+PreeditString(w, segn, offset, encoding, format, length, string)
+Widget w;
+int segn;
+int offset;
+Atom *encoding;
+int *format;
+int *length;
+XtPointer *string;
+{
+    CannaObject obj = (CannaObject)w;
+    iBuf *ib = obj->canna.ibuf;
+    int i;
+    wchar *wbuf, *wp;
+    int len, wlen;
+    extern int convJWStoCT();
+
+    if (ib == NULL) return -1;
+    if (segn < ib->nseg && offset >= ib->len[segn]) {
+	/* $B%;%0%a%s%H$N:G8e(B */
+	++segn;
+	offset = 0;
+    }
+    if (segn >= ib->nseg || offset >= ib->len[segn]) {
+	/* $B:o=|$5$l$?(B */
+	*encoding = XA_COMPOUND_TEXT(XtDisplayOfObject(w));
+	*format = 8;
+	*length = 0;
+	*string = (XtPointer)XtMalloc(1);
+	return 0;
+    }
+
+    wlen = 0;
+    for (i = segn; i < ib->nseg; i++) {
+	wlen += ib->len[i];
+    }
+    wlen -= offset;
+
+    wp = wbuf = (wchar *)XtMalloc((wlen + 1) * sizeof(wchar));
+    len = ib->len[segn] - offset;
+    (void)bcopy((char *)(ib->str[segn] + offset), (char *)wp, sizeof(wchar) * len);
+    wp += len;
+    for (i = segn + 1; i < ib->nseg; i++) {
+	len = ib->len[i];
+	(void)bcopy((char *)ib->str[i], (char *)wp, sizeof(wchar) * len);
+	wp += len;
+    }
+    wbuf[wlen] = 0;
+
+    /*
+     * Canna $B%*%V%8%'%/%H$O(B COMPOUND_TEXT $B%(%s%3!<%G%#%s%0$7$+%5%]!<%H$7$J$$(B
+     * COMPOUND_TEXT $B$KJQ49$9$k(B
+     */
+    *encoding = XA_COMPOUND_TEXT(XtDisplayOfObject(w));
+    *format = 8;
+
+    /* COMPOUND_TEXT $B$O(B \r $B$,Aw$l$J$$$N$G(B \n $B$KJQ49$7$F$*$/(B */
+    for (wp = wbuf; *wp != 0; wp++) {
+	if (*wp == '\r') *wp = '\n';
+    }
+
+    *length = len = convJWStoCT(wbuf, (unsigned char *)NULL, 0);
+    *string = (XtPointer)XtMalloc(len + 1);
+    (void)convJWStoCT(wbuf, (unsigned char *)*string, 0);
+
+    /* wbuf $B$r(B free $B$7$F$*$/(B */
+    XtFree((char *)wbuf);
+
+    return 0;
+}
+
+/* ARGSUSED */
+static int
+StatusString(w, encoding, format, length, string, nchars)
+Widget w;
+Atom *encoding;
+int *format;
+int *length;
+XtPointer *string;
+int *nchars;
+{
+    ICString *seg;
+    wchar *wbuf, *wp;
+    int len, wlen;
+    extern int convJWStoCT();
+
+    seg = GetMode(w);
+    if (seg == NULL) {
+	*length = *nchars = 0;
+	return -1;
+    }
+
+    wlen = seg->nchars;
+    if (wlen <= 0) {
+	*length = *nchars = 0;
+	return -1;
+    }
+
+    /*
+     * data $B$KF~$C$F$$$kJQ49%F%-%9%H$O(B null $B%?!<%_%M!<%H$5$l$F$$$J$$$+$b(B
+     * $B$7$l$J$$$N$G!"$^$:%3%T!<$7$F(B null $B%?!<%_%M!<%H$9$k(B
+     */
+    wbuf = (wchar *)XtMalloc((wlen + 1) * sizeof(wchar));
+    (void)bcopy(seg->data, (char *)wbuf, sizeof(wchar) * wlen);
+    wbuf[wlen] = 0;
+
+    /*
+     * Canna $B%*%V%8%'%/%H$O(B COMPOUND_TEXT $B%(%s%3!<%G%#%s%0$7$+%5%]!<%H$7$J$$(B
+     * COMPOUND_TEXT $B$KJQ49$9$k(B
+     */
+    *encoding = XA_COMPOUND_TEXT(XtDisplayOfObject(w));
+    *format = 8;
+
+    /* COMPOUND_TEXT $B$O(B \r $B$,Aw$l$J$$$N$G(B \n $B$KJQ49$7$F$*$/(B */
+    for (wp = wbuf; *wp != 0; wp++) {
+	if (*wp == '\r') *wp = '\n';
+    }
+
+    *length = len = convJWStoCT(wbuf, (unsigned char *)NULL, 0);
+    *string = XtMalloc(len + 1);
+    (void)convJWStoCT(wbuf, (unsigned char *)*string, 0);
+    *nchars = seg->nchars;
+
+    /* wbuf $B$r(B free $B$7$F$*$/(B */
+    XtFree((char *)wbuf);
+
+    return 0;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/Canvas.c	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,98 @@
+#ifndef lint
+static char *rcsid = "$Id: Canvas.c,v 1.3 1991/09/23 03:57:20 ishisone Rel $";
+#endif
+/*
+ * Copyright (c) 1990  Software Research Associates, Inc.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted, provided
+ * that the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Software Research Associates not be
+ * used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission.  Software Research
+ * Associates makes no representations about the suitability of this software
+ * for any purpose.  It is provided "as is" without express or implied
+ * warranty.
+ *
+ * Author:  Makoto Ishisone, Software Research Associates, Inc., Japan
+ */
+
+#include <X11/IntrinsicP.h>
+#include <X11/StringDefs.h>
+#include "CanvasP.h"
+
+static XtResource resources[] = {
+#define offset(field) XtOffset(CanvasWidget, canvas.field)
+    { XtNexposeCallback, XtCCallback, XtRCallback, sizeof(XtCallbackList),
+	offset(exposecallback), XtRCallback, (XtPointer)NULL },
+    { XtNresizeCallback, XtCCallback, XtRCallback, sizeof(XtCallbackList),
+	offset(resizecallback), XtRCallback, (XtPointer)NULL },
+#undef offset
+};
+
+static void Redisplay();
+static void Resize();
+
+CanvasClassRec canvasClassRec = {
+  { /* core fields */
+    /* superclass		*/	(WidgetClass) &widgetClassRec,
+    /* class_name		*/	"Canvas",
+    /* widget_size		*/	sizeof(CanvasRec),
+    /* class_initialize		*/	NULL,
+    /* class_part_initialize	*/	NULL,
+    /* class_inited		*/	FALSE,
+    /* initialize		*/	NULL,
+    /* initialize_hook		*/	NULL,
+    /* realize			*/	XtInheritRealize,
+    /* actions			*/	NULL,
+    /* num_actions		*/	0,
+    /* resources		*/	resources,
+    /* num_resources		*/	XtNumber(resources),
+    /* xrm_class		*/	NULLQUARK,
+    /* compress_motion		*/	TRUE,
+    /* compress_exposure	*/	TRUE,
+    /* compress_enterleave	*/	TRUE,
+    /* visible_interest		*/	FALSE,
+    /* destroy			*/	NULL,
+    /* resize			*/	Resize,
+    /* expose			*/	Redisplay,
+    /* set_values		*/	NULL,
+    /* set_values_hook		*/	NULL,
+    /* set_values_almost	*/	XtInheritSetValuesAlmost,
+    /* get_values_hook		*/	NULL,
+    /* accept_focus		*/	NULL,
+    /* version			*/	XtVersion,
+    /* callback_private		*/	NULL,
+    /* tm_table			*/	NULL,
+    /* query_geometry		*/	XtInheritQueryGeometry,
+    /* display_accelerator	*/	XtInheritDisplayAccelerator,
+    /* extension		*/	NULL
+  },
+  { /* canvas fields */
+    /* empty			*/	0
+  }
+};
+
+WidgetClass canvasWidgetClass = (WidgetClass)&canvasClassRec;
+
+/* ARGSUSED */
+static void
+Redisplay(w, event, region)
+Widget w;
+XEvent *event;
+Region region;
+{
+    CanvasWidget csw = (CanvasWidget)w;
+
+    XtCallCallbackList(w, csw->canvas.exposecallback, (XtPointer)event);
+}
+
+static void
+Resize(w)
+Widget w;
+{
+    CanvasWidget csw = (CanvasWidget)w;
+
+    XtCallCallbackList(w, csw->canvas.resizecallback, (XtPointer)NULL);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/CanvasShel.c	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,155 @@
+#ifndef lint
+static char *rcsid = "$Id: CanvasShel.c,v 1.7 1991/09/23 04:03:55 ishisone Rel $";
+#endif
+/*
+ * Copyright (c) 1990  Software Research Associates, Inc.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted, provided
+ * that the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Software Research Associates not be
+ * used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission.  Software Research
+ * Associates makes no representations about the suitability of this software
+ * for any purpose.  It is provided "as is" without express or implied
+ * warranty.
+ *
+ * Author:  Makoto Ishisone, Software Research Associates, Inc., Japan
+ */
+
+#include <X11/IntrinsicP.h>
+#include <X11/StringDefs.h>
+#include "CanvasSheP.h"
+
+static XtResource resources[] = {
+#define offset(field) XtOffset(CanvasShellWidget, canvasshell.field)
+    { XtNcursor, XtCCursor, XtRCursor, sizeof(Cursor),
+	offset(cursor), XtRImmediate, (XtPointer)None },
+    { XtNexposeCallback, XtCCallback, XtRCallback, sizeof(XtCallbackList),
+	offset(exposecallback), XtRCallback, (XtPointer)NULL },
+    { XtNresizeCallback, XtCCallback, XtRCallback, sizeof(XtCallbackList),
+	offset(resizecallback), XtRCallback, (XtPointer)NULL },
+#undef offset
+};
+
+static void Redisplay();
+static void Realize();
+static void Resize();
+static Boolean SetValues();
+
+CanvasShellClassRec canvasShellClassRec = {
+  { /* core fields */
+    /* superclass		*/	(WidgetClass) &adoptedShellClassRec,
+    /* class_name		*/	"CanvasShell",
+    /* widget_size		*/	sizeof(CanvasShellRec),
+    /* class_initialize		*/	NULL,
+    /* class_part_initialize	*/	NULL,
+    /* class_inited		*/	FALSE,
+    /* initialize		*/	NULL,
+    /* initialize_hook		*/	NULL,
+    /* realize			*/	Realize,
+    /* actions			*/	NULL,
+    /* num_actions		*/	0,
+    /* resources		*/	resources,
+    /* num_resources		*/	XtNumber(resources),
+    /* xrm_class		*/	NULLQUARK,
+    /* compress_motion		*/	TRUE,
+    /* compress_exposure	*/	TRUE,
+    /* compress_enterleave	*/	TRUE,
+    /* visible_interest		*/	FALSE,
+    /* destroy			*/	NULL,
+    /* resize			*/	Resize,
+    /* expose			*/	Redisplay,
+    /* set_values		*/	SetValues,
+    /* set_values_hook		*/	NULL,
+    /* set_values_almost	*/	XtInheritSetValuesAlmost,
+    /* get_values_hook		*/	NULL,
+    /* accept_focus		*/	NULL,
+    /* version			*/	XtVersion,
+    /* callback_private		*/	NULL,
+    /* tm_table			*/	NULL,
+    /* query_geometry		*/	XtInheritQueryGeometry,
+    /* display_accelerator	*/	XtInheritDisplayAccelerator,
+    /* extension		*/	NULL
+  },
+  { /* Composite */
+    /* geometry_manager		*/	XtInheritGeometryManager,
+    /* change_managed		*/	XtInheritChangeManaged,
+    /* insert_child		*/	XtInheritInsertChild,
+    /* delete_child		*/	XtInheritDeleteChild,
+    /* extension		*/	NULL
+  },
+  { /* Shell */
+    /* extension		*/	NULL
+  },
+  { /* overrideShell fields */
+    /* extension		*/	NULL
+  },
+  { /* AdoptedShell fields */
+    /* empty			*/	0
+  },
+  { /* canvasShell fields */
+    /* empty			*/	0
+  }
+};
+
+WidgetClass canvasShellWidgetClass = (WidgetClass)&canvasShellClassRec;
+
+/* ARGSUSED */
+static void
+Redisplay(w, event, region)
+Widget w;
+XEvent *event;
+Region region;
+{
+    CanvasShellWidget csw = (CanvasShellWidget)w;
+
+    XtCallCallbackList(w, csw->canvasshell.exposecallback, (XtPointer)event);
+}
+
+static void
+Resize(w)
+Widget w;
+{
+    CanvasShellWidget csw = (CanvasShellWidget)w;
+
+    XtCallCallbackList(w, csw->canvasshell.resizecallback, (XtPointer)NULL);
+}
+
+static void
+Realize(w, maskp, attr)
+Widget w;
+XtValueMask *maskp;
+XSetWindowAttributes *attr;
+{
+    CanvasShellWidget csw = (CanvasShellWidget)w;
+
+    if (csw->canvasshell.cursor != None) {
+	*maskp |= CWCursor;
+	attr->cursor = csw->canvasshell.cursor;
+    }
+    *maskp |= CWBitGravity;
+    attr->bit_gravity = NorthWestGravity;
+    (*canvasShellWidgetClass->core_class.superclass->core_class.realize)(w, maskp, attr);
+}
+
+/* ARGSUSED */
+static Boolean
+SetValues(cur, req, new, args, num_args)
+Widget cur;
+Widget req;
+Widget new;
+ArgList args;
+Cardinal *num_args;
+{
+    CanvasShellWidget csw = (CanvasShellWidget)new;
+    CanvasShellWidget old = (CanvasShellWidget)cur;
+
+    if (csw->canvasshell.cursor != old->canvasshell.cursor &&
+	XtIsRealized(new)) {
+	XDefineCursor(XtDisplay(new), XtWindow(new), csw->canvasshell.cursor);
+    }
+
+    return False;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/CcWnn.c	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,2788 @@
+#ifndef lint
+static char *rcsid = "$Id: CcWnn.c,v 1.59 2002/01/10 15:51:47 ishisone Exp $";
+#endif
+/*
+ * Copyright (c) 1990  Software Research Associates, Inc.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted, provided
+ * that the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Software Research Associates not be
+ * used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission.  Software Research
+ * Associates makes no representations about the suitability of this software
+ * for any purpose.  It is provided "as is" without express or implied
+ * warranty.
+ *
+ * Author:  Makoto Ishisone, Software Research Associates, Inc., Japan
+ */
+
+#include <X11/IntrinsicP.h>
+#include <X11/StringDefs.h>
+#include <X11/Xmu/Atoms.h>
+#if XtSpecificationRelease > 4
+#include <X11/Xfuncs.h>
+#endif
+#include "CcWnnP.h"
+#include "CachedAtom.h"
+#include "IOECall.h"
+
+#define DEBUG_VAR debug_CcWnn
+#include "DebugPrint.h"
+
+static XtResource resources[] = {
+#define offset(field) XtOffset(CcWnnObject, ccWnn.field)
+    { XtNconfirmFunc, XtCFunction, XtRPointer, sizeof(int (*)()),
+       offset(confirmfunc), XtRPointer, (XtPointer)NULL },
+    { XtNconfirmData, XtCConfirmData, XtRPointer, sizeof(XtPointer),
+       offset(confirmdata), XtRPointer, (XtPointer)NULL },
+    { XtNjserver, XtCJserver, XtRString, sizeof(String),
+	offset(jservername), XtRString, NULL },
+    { XtNjserver2nd, XtCJserver, XtRString, sizeof(String),
+	offset(jservername2), XtRString, NULL },
+    { XtNwnnEnvname, XtCWnnEnvname, XtRString, sizeof(String),
+	offset(wnnenvname), XtRString, NULL },
+    { XtNwnnEnvrc, XtCWnnEnvrc, XtRString, sizeof(String),
+	offset(wnnenvrcfile), XtRString, NULL },
+    { XtNwnnEnvrc4, XtCWnnEnvrc, XtRString, sizeof(String),
+	offset(wnnenvrcfile4), XtRString, NULL },
+    { XtNwnnEnvrc6, XtCWnnEnvrc, XtRString, sizeof(String),
+	offset(wnnenvrcfile6), XtRString, NULL },
+    { XtNwnnOverrideEnv, XtCWnnOverrideEnv, XtRBoolean, sizeof(Boolean),
+	offset(wnnoverrideenv), XtRString, "false" },
+    { XtNccdef, XtCCcdef, XtRString, sizeof(String),
+	offset(ccdeffile), XtRString, NULL },
+    { XtNwnnEnv, XtCWnnEnv, XtRWnnEnv, sizeof(struct wnn_buf *),
+	offset(wnnbuf), XtRWnnEnv, NULL},
+    { XtNccRule, XtCCcRule, XtRCcRule, sizeof(ccRule),
+	offset(ccrule), XtRCcRule, NULL},
+    { XtNsaveInterval, XtCSaveInterval, XtRInt, sizeof(int),
+	offset(saveinterval), XtRImmediate, 0 },
+#undef offset
+};
+
+static void ClassInitialize();
+static int buildSymbolList();
+static void Initialize(), Destroy();
+static Boolean SetValues();
+static int InputEvent();
+static ICString *GetMode();
+static int CursorPos();
+static int NumSegments();
+static ICString *GetSegment();
+static int CompareSegment();
+static ICString *GetItemList();
+static int SelectItem();
+static int ConvertedString();
+static int ClearConversion();
+static ICString *GetAuxSegments();
+static int PreeditString();
+static int StatusString();
+
+CcWnnClassRec ccWnnClassRec = {
+  { /* object fields */
+    /* superclass		*/	(WidgetClass) &inputConvClassRec,
+    /* class_name		*/	"CcWnn",
+    /* widget_size		*/	sizeof(CcWnnRec),
+    /* class_initialize		*/	ClassInitialize,
+    /* class_part_initialize	*/	NULL,
+    /* class_inited		*/	FALSE,
+    /* initialize		*/	Initialize,
+    /* initialize_hook		*/	NULL,
+    /* obj1			*/	NULL,
+    /* obj2			*/	NULL,
+    /* obj3			*/	0,
+    /* resources		*/	resources,
+    /* num_resources		*/	XtNumber(resources),
+    /* xrm_class		*/	NULLQUARK,
+    /* obj4			*/	FALSE,
+    /* obj5			*/	FALSE,
+    /* obj6			*/	FALSE,
+    /* obj7			*/	FALSE,
+    /* destroy			*/	Destroy,
+    /* obj8			*/	NULL,
+    /* obj9			*/	NULL,
+    /* set_values		*/	SetValues,
+    /* set_values_hook		*/	NULL,
+    /* obj10			*/	NULL,
+    /* get_values_hook		*/	NULL,
+    /* obj11			*/	NULL,
+    /* version			*/	XtVersion,
+    /* callback_private		*/	NULL,
+    /* obj12			*/	NULL,
+    /* obj13			*/	NULL,
+    /* obj14			*/	NULL,
+    /* extension		*/	NULL
+  },
+  { /* inputConv fields */
+    /* InputEvent		*/	InputEvent,
+    /* GetMode			*/	GetMode,
+    /* CursorPos		*/	CursorPos,
+    /* NumSegments		*/	NumSegments,
+    /* GetSegment		*/	GetSegment,
+    /* CompareSegment		*/	CompareSegment,
+    /* GetItemList		*/	GetItemList,
+    /* SelectItem		*/	SelectItem,
+    /* GetConvetedString	*/	ConvertedString,
+    /* ClearConversion		*/	ClearConversion,
+    /* GetAuxSegments		*/	GetAuxSegments,
+    /* SupportMultipleObjects	*/	True,
+    /* GetTriggerKeys		*/	XtInheritGetTriggerKeys,
+    /* num_trigger_keys		*/	0,
+    /* trigger_keys		*/	NULL,
+    /* GetPreeditString		*/	PreeditString,
+    /* GetStatusString		*/	StatusString,
+    /* NoMoreObjects		*/	False,
+  },
+  { /* ccWnn fields */
+    /* foo			*/	0,
+  }
+};
+
+WidgetClass ccWnnObjectClass = (WidgetClass)&ccWnnClassRec;
+
+/* cconv function table */
+static char *fepfunctbl[] = {
+	"convert",
+	"convert-or-fix1",
+	"convert-or-space",
+ 	"convert-or-sendback",
+	"convert-s",
+	"unconvert",
+	"next",
+	"next-s",
+	"previous",
+	"previous-s",
+	"forward",
+	"backward",
+	"move-top",
+	"move-bottom",
+	"clear",
+	"expand",
+	"expand-s",
+	"shrink",
+	"shrink-s",
+	"expand-noconv",
+	"expand-noconv-s",
+	"shrink-noconv",
+	"shrink-noconv-s",
+	"fix",
+	"fix2",
+	"fix-or-cr",
+ 	"fix-or-sendback",
+	"to-hankaku",
+	"to-zenkaku",
+	"to-hiragana",
+	"to-katakana",
+	"backspace",
+	"delete",
+	"kill-line",
+	"carriage-return",
+	"fix-and-write",
+	"beep",
+	"jiscode-begin",
+	"jiscode-end",
+	"kutencode-begin",
+	"kutencode-end",
+	"symbol-input",
+	"end-conversion",
+	"send-back",
+ 	"convert-move-top-or-sendback",
+	"convert-move-top-or-space",
+	"clear-or-cancel",
+	"backspace-or-cancel",
+	"delete-or-cancel",
+ 	"convert-next-or-move-top-or-sendback",
+	"convert-next-or-move-top-or-space",
+	"select",
+	"select-s",
+	"register",
+};
+#define FTSIZE	(sizeof(fepfunctbl) / sizeof(char *))
+
+static void	convert();
+static void	convert_f1();
+static void	convert_sb();
+static void	convert_sp();
+static void	convert_s();
+static void	convert_mt_sb();
+static void	convert_mt_sp();
+static void	unconvert();
+static void	egg_select();
+static void	egg_select_s();
+
+static void	move_forward();
+static void	move_backward();
+static void	move_top();
+static void	move_bottom();
+
+static void	cand_next();
+static void	cand_next_s();
+static void	cand_next_mt_sb();
+static void	cand_next_mt_sp();
+static void	cand_prev();
+static void	cand_prev_s();
+
+static void	expand_cl();
+static void	expand_cl_s();
+static void	shrink_cl();
+static void	shrink_cl_s();
+static void	expand_cl2();
+static void	expand_cl2_s();
+static void	shrink_cl2();
+static void	shrink_cl2_s();
+
+static void	clear_buffer();
+static void	clear_c();
+
+static void	sel_top();
+static void	sel_bottom();
+static void	sel_forward();
+static void	sel_backward();
+static void	sel_next();
+static void	sel_prev();
+static void	sel_select();
+static void	sel_abort();
+
+static void	fix();
+static void	fix1();
+static void	fix_cr();
+static void	fix_sb();
+
+static void	hankaku();
+static void	zenkaku();
+
+static void	hiragana();
+static void	katakana();
+
+static void	backspace();
+static void	backspace_c();
+static void	delete();
+static void	delete_c();
+static void	kill_line();
+
+static void	bell();
+static void	beep();
+static void	carriageret();
+static void	jiscode_begin();
+static void	jiscode_end();
+static void	kuten_begin();
+static void	kuten_end();
+
+static void	sym_input();
+static void	convend();
+static void	send_back();
+static void	register_word();
+
+/* cconv function dispatch table */
+static void (*functable[][3])() = {
+/* Function Name	Normal-mode	selection-mode	symbol-mode */
+/* convert */		convert,	sel_forward,    beep,
+/* convert-or-fix1 */	convert_f1,	sel_forward,    beep,
+/* convert-or-sendback*/convert_sb,	sel_forward,    beep,
+/* convert-or-space */	convert_sp,	sel_forward,    beep,
+/* convert-s */		convert_s,	sel_forward,    beep,
+/* unconvert */		unconvert,	beep,           beep,
+/* next */		cand_next,	sel_next,       sel_next,
+/* next-s */		cand_next_s,	sel_next,       sel_next,
+/* previous */		cand_prev,	sel_prev,       sel_prev,
+/* previous-s */	cand_prev_s,	sel_prev,       sel_prev,
+/* forward */		move_forward,	sel_forward,    sel_forward,
+/* backward */		move_backward,	sel_backward,   sel_backward,
+/* move-top */		move_top,	sel_top,        sel_top,
+/* move-bottom */	move_bottom,	sel_bottom,     sel_bottom,
+/* clear */		clear_buffer,	clear_buffer,   clear_buffer,
+/* expand */		expand_cl,	expand_cl,  	beep,
+/* expand-s */		expand_cl_s,	expand_cl_s,	beep,
+/* shrink */		shrink_cl,	shrink_cl,  	beep,
+/* shrink-s */		shrink_cl_s,	shrink_cl_s,	beep,
+/* expand-noconv */	expand_cl2,	expand_cl2, 	beep,
+/* expand-noconv-s */	expand_cl2_s,	expand_cl2_s,	beep,
+/* shrink-noconv */	shrink_cl2,	shrink_cl2, 	beep,
+/* shrink-noconv-s */	shrink_cl2_s,	shrink_cl2_s,	beep,
+/* fix */		fix,		fix,            fix,
+/* fix2 */		fix,		fix,            fix,
+/* fix-or-cr */		fix_cr,		sel_select,     sel_select,
+/* fix-or-sendback */	fix_sb,		sel_select,     sel_select,
+/* to-hankaku */	hankaku,	hankaku,        beep,
+/* to-zenkaku */	zenkaku,	zenkaku,        beep,
+/* to-hiragana */	hiragana,	hiragana,       beep,
+/* to-katakana */	katakana,	katakana,       beep,
+/* backspace */		backspace,	backspace,      backspace,
+/* delete */		delete,		delete,         delete,
+/* kill-line */		kill_line,	kill_line,	kill_line,
+/* carriage-return */	carriageret,	sel_select,     sel_select,
+/* fix-and-write */	fix,		beep,           beep,
+/* beep */		bell,		bell,           bell,
+/* jiscode-begin */	jiscode_begin,	beep,		beep,
+/* jiscode-end */	jiscode_end,	beep,		beep,
+/* kutencode-begin */	kuten_begin,	beep,		beep,
+/* kutencode-end */	kuten_end,	beep,		beep,
+/* symbol-input */	sym_input,	beep,           sel_abort,
+/* end-conversion */	convend,	convend,	convend,
+/* send-back */		send_back,	send_back,	send_back,
+/* convert-move-..sb*/	convert_mt_sb,	sel_forward,	beep,
+/* convert-move-..sp*/	convert_mt_sp,	sel_forward,	beep,
+/* clear-or-cancel */	clear_c,	clear_c,	clear_c,
+/* backspace-or-cancel */ backspace_c,	backspace_c,	backspace_c,
+/* delete-or-cancel */	delete_c,	delete_c,	delete_c,
+/* convert-next-..sb */	cand_next_mt_sb, sel_forward,	beep,
+/* convert-next-..sp */	cand_next_mt_sp, sel_forward,	beep,
+/* select */		egg_select,	beep,		beep,
+/* select-s */		egg_select_s,	beep,		beep,
+/* register */		register_word,	beep,		beep,
+};
+
+static ICString *SymbolList;
+static int NumSymbols;
+
+static void ccInitialize();
+static void jcInitialize();
+static void createEnvError();
+static int createConfirm();
+
+static int funcDispatch();
+static void defAction();
+static void insChar();
+static void delChar();
+static void autoFix();
+
+static void startSelection();
+static void moveSelection();
+static int endSelection();
+static int insertSelection();
+
+static int getSymbol();
+
+static void normalState();
+
+static void allocCandlist();
+static void allocStrdata();
+static void getAllCandidates();
+
+static void addObject();
+static void deleteObject();
+static void serverDead();
+
+static void saveData();
+static void restoreData();
+
+static void ioeCallback();
+
+static CcWnnObject findSelectionObj();
+
+static Boolean convertSelection();
+static void saveYomiAndKanji();
+
+static void
+ClassInitialize()
+{
+    /* symbollist $B$r@_Dj(B */
+    NumSymbols = buildSymbolList(&SymbolList);
+    /* I/O error $B%3!<%k%P%C%/4X?t$N@_Dj(B */
+    XIOESet(ioeCallback, (XPointer)NULL);
+}
+
+static int
+buildSymbolList(listp)
+ICString **listp;
+{
+    static struct symgroup {
+	int	first;
+	int last;
+    } symgroups[] = {
+	{ 0xa1a1, 0xa2ae },	/* '$B!!(B' - '$B".(B' */
+	{ 0xa2ba, 0xa2c1 },	/* '$B":(B' - '$B"A(B' */
+	{ 0xa2ca, 0xa2d0 },	/* '$B"J(B' - '$B"P(B' */
+	{ 0xa2dc, 0xa2ea },	/* '$B"\(B' - '$B"j(B' */
+	{ 0xa2f2, 0xa2f9 },	/* '$B"r(B' - '$B"y(B' */
+	{ 0xa2fe, 0xa2fe },	/* '$B"~(B' */
+	{ 0xa4ee, 0xa4ee },	/* '$B$n(B' */
+	{ 0xa4f0, 0xa4f1 },	/* '$B$p(B', '$B$q(B' */
+	{ 0xa5ee, 0xa5ee },	/* '$B%n(B' */
+	{ 0xa5f0, 0xa5f1 },	/* '$B%p(B', '$B%q(B' */
+	{ 0xa5f4, 0xa5f6 },	/* '$B%t(B', '$B%u(B', '$B%v(B' */
+	{ 0xa6a1, 0xa6b8 },	/* '$B&!(B' - '$B&8(B' */
+	{ 0xa6c1, 0xa6d8 },	/* '$B&A(B' - '$B&X(B' */
+	{ 0xa7a1, 0xa7c1 },	/* '$B'!(B' - '$B'A(B' */
+	{ 0xa7d1, 0xa7f1 },	/* '$B'Q(B' - '$B'q(B' */
+	{ 0xa8a1, 0xa8c0 },	/* '$B(!(B' - '$B(@(B' */
+	{ -1, -1 }
+    };
+    struct symgroup *sgp;
+    Cardinal nsyms;
+    ICString *symlist, *sp;
+    wchar *buf, *p;
+
+    for (nsyms = 0, sgp = symgroups; sgp->first > 0; sgp++) {
+#define LINEAR_INDEX(c)	(((((c)>>8)&0x7f)*94)+((c)&0x7f))
+	nsyms += LINEAR_INDEX(sgp->last) - LINEAR_INDEX(sgp->first) + 1;
+    }
+
+    symlist = (ICString *)XtMalloc(nsyms * sizeof(ICString));
+    buf = (wchar *)XtMalloc(nsyms * sizeof(wchar));
+
+    sp = symlist;
+    p = buf;
+    for (sgp = symgroups; sgp->first > 0; sgp++) {
+	int i;
+#define NEXT_CHAR(c) ((((c)&0xff)>0xfd)?(((c)&0xff00)+0x1a1):((c)+1))
+	for (i = sgp->first; i <= sgp->last; i = NEXT_CHAR(i)) {
+	    sp->nchars = 1;
+	    sp->nbytes = sizeof(wchar);
+	    sp->data = (char *)p;
+	    sp->attr = ICAttrNormalString;
+	    sp++;
+	    *p++ = i;
+	}
+    }
+
+    *listp = symlist;
+    return nsyms;
+}
+
+static int
+InputEvent(w, event)
+Widget w;
+XEvent *event;
+{
+    CcWnnObject obj = (CcWnnObject)w;
+    int sendback;
+    int ret = 0;
+    wchar *curmode;
+
+    if (event->type != KeyPress /*&& event->type != KeyRelease*/) return 0;
+
+    /* $B%$%Y%s%H$r%/%i%$%"%s%H$KAw$jJV$9$+$I$&$+$NH=Dj$=$N(B 1 */
+    sendback = (NumSegments(w) == 0 && obj->ccWnn.state == normal_state);
+
+    obj->ccWnn.sendbackevent = False;
+    obj->ccWnn.fixperformed = False;
+    obj->ccWnn.textchanged = False;
+
+    /*
+     * $B$b$7!"(Bwnnbuf $B$,L$3MF@$G$"$k$+(B ($B$3$s$J$3$H$O!"$"$j$($J$$$H;W$&$,(B)$B!"(B
+     * jserver $B$,;`$s$@$J$I$NM}M3$G(B jserver $B$H$N@\B3$,@Z$l$F$$$k$J$i$P!":F(B
+     * $B=i4|2=!J:F@\B3!K$r9T$J$&!#(B
+     */
+    if (obj->ccWnn.wnnbuf == NULL || !jcIsConnect(obj->ccWnn.wnnbuf)) {
+	jcInitialize(obj);
+	/* $B:F@\B3$r;n$_$F$b!"$^$@@\B3$G$-$F$$$J$$$H$-$O!"%(%i!<$rJV$9(B */
+	if (obj->ccWnn.wnnbuf == NULL || !jcIsConnect(obj->ccWnn.wnnbuf)) {
+	    bell(obj);
+	    return -1;
+	}
+    }
+
+    wnn_errorno = 0;
+    curmode = ccGetModePrompt(obj->ccWnn.ccbuf);
+
+    (void)ccConvchar(obj->ccWnn.ccbuf, (XKeyPressedEvent *)event);
+
+    /*
+     * $B%(%i!<HV9f$r%A%'%C%/$7!"(Bjserver $B$,;`$s$G$$$l$P4D6-$r(B destroy $B$7(B
+     * $B:F$S@\B3$r;n$_$k(B
+     */
+    if (wnn_errorno == WNN_JSERVER_DEAD) {
+	XtAppWarning(XtWidgetToApplicationContext((Widget)w),
+		     "ccWnn Object: jserver died");
+	/* $B$b$7$bF~NOCf$NJ8;zNs$,$"$l$P$H$C$F$*$/(B */
+	saveData(obj);
+	serverDead();
+	/* secondary jserver $B$,;XDj$5$l$F$$$l$P:F@\B3$r;n$_$k(B */
+	if (obj->ccWnn.jservername2 != NULL) jcInitialize(obj);
+	if (obj->ccWnn.wnnbuf == NULL || !jcIsConnect(obj->ccWnn.wnnbuf)) {
+	    bell(obj);
+	    ret = -1;
+	}
+    }
+
+    /* $B%F%-%9%H$NJQ2=$r%A%'%C%/$9$k(B */
+    if (obj->ccWnn.textchanged) {
+	XtCallCallbackList(w, obj->inputConv.textchangecallback,
+			   (XtPointer)NULL);
+	obj->ccWnn.textchanged = False;
+    }
+    /* $BF~NO%b!<%I$r%A%'%C%/$9$k(B */
+    if (wstrcmp(ccGetModePrompt(obj->ccWnn.ccbuf), curmode)) {
+	sendback = 0;
+	XtCallCallbackList(w, obj->inputConv.modechangecallback,
+			   (XtPointer)NULL);
+    }
+    /* $B%$%Y%s%H$r%/%i%$%"%s%H$KAw$jJV$9$+$I$&$+$NH=Dj$=$N(B 2 */
+    if (NumSegments(w) != 0 ||
+	obj->ccWnn.state != normal_state ||
+	obj->ccWnn.fixperformed) {
+	sendback = 0;
+    }
+    if (ret == 0 && (obj->ccWnn.sendbackevent || sendback)) ret = 1;
+
+    return ret;
+}
+
+static ICString *
+GetMode(w)
+Widget w;
+{
+    CcWnnObject obj = (CcWnnObject)w;
+    wchar *mode;
+    static ICString icstr;
+
+    mode = ccGetModePrompt(obj->ccWnn.ccbuf);
+    icstr.data = (char *)mode;
+    icstr.nchars = wstrlen(mode);
+    icstr.nbytes = icstr.nchars * sizeof(wchar);
+    icstr.attr = ICAttrNormalString;
+
+    return &icstr;
+}
+
+static int
+CursorPos(w, nsegp, ncharp)
+Widget w;
+Cardinal *nsegp;
+Cardinal *ncharp;
+{
+    CcWnnObject obj = (CcWnnObject)w;
+    jcConvBuf *jcbuf = obj->ccWnn.jcbuf;
+    Cardinal nseg, nchar;
+
+    if (jcbuf == NULL || jcIsConverted(jcbuf, jcbuf->curClause)) return 0;
+
+    nseg = jcbuf->curClause;
+    nchar = jcDotOffset(jcbuf);
+
+    if (nseg >= jcbuf->nClause) {
+	if (nseg == 0) {
+	    nchar = 0;
+	} else {
+	    jcClause *cinfo = jcbuf->clauseInfo;
+	    nseg--;
+	    nchar = cinfo[nseg + 1].dispp - cinfo[nseg].dispp;
+	}
+    }
+
+    if (nsegp) *nsegp = nseg;
+    if (ncharp) *ncharp = nchar;
+
+    return 1;
+}
+
+static int
+NumSegments(w)
+Widget w;
+{
+    CcWnnObject obj = (CcWnnObject)w;
+
+    return (obj->ccWnn.jcbuf != NULL) ? obj->ccWnn.jcbuf->nClause : 0;
+}
+
+static ICString *
+GetSegment(w, n)
+Widget w;
+Cardinal n;
+{
+    CcWnnObject obj = (CcWnnObject)w;
+    jcConvBuf *jcbuf = obj->ccWnn.jcbuf;
+    jcClause *cinfo = jcbuf->clauseInfo;
+    static ICString seg;
+
+    if (jcbuf == NULL || n >= jcbuf->nClause) return NULL;
+    seg.data = (char *)cinfo[n].dispp;
+    seg.nchars = cinfo[n + 1].dispp - cinfo[n].dispp;
+    seg.nbytes = seg.nchars * sizeof(wchar);
+    seg.attr = cinfo[n].conv ? ICAttrConverted : ICAttrNotConverted;
+    if (n == jcbuf->curClause) {
+	seg.attr |= ICAttrCurrentSegment;
+    } else if (jcbuf->curLCStart <= n && n < jcbuf->curLCEnd) {
+	seg.attr |= ICAttrCurrentSubSegment;
+    }
+    return &seg;
+}
+
+/* ARGSUSED */
+static int
+CompareSegment(w, seg1, seg2, n)
+Widget w;
+ICString *seg1;
+ICString *seg2;
+Cardinal *n;
+{
+    wchar *p, *q;
+    int len, nsame;
+    int result = 0;
+
+    if (seg1->attr != seg2->attr) result |= ICAttrChanged;
+
+    len = seg1->nchars > seg2->nchars ? seg2->nchars : seg1->nchars;
+    nsame = 0;
+    p = (wchar *)seg1->data;
+    q = (wchar *)seg2->data;
+    while (nsame < len && *p++ == *q++) nsame++;
+
+    if (nsame != len || len != seg1->nchars || len != seg2->nchars)
+	result |= ICStringChanged;
+
+    if (n) *n = nsame;
+
+    return result;
+}
+
+static ICString *
+GetItemList(w, n)
+Widget w;
+Cardinal *n;
+{
+    CcWnnObject obj = (CcWnnObject)w;
+
+    switch (obj->ccWnn.state) {
+    case selection_l_state:
+    case selection_s_state:
+	*n = obj->ccWnn.numcand;
+	return obj->ccWnn.candlist;
+    case symbol_state:
+	*n = obj->ccWnn.numsymbols;
+	return obj->ccWnn.symbollist;
+    default:
+	*n = 0;
+	return NULL;	/* no item available */
+    }
+    /* NOTREACHED */
+}
+
+static int
+SelectItem(w, n)
+Widget w;
+int n;
+{
+    CcWnnObject obj = (CcWnnObject)w;
+    int ret = 0;
+
+    if (obj->ccWnn.state == normal_state) return -1;
+
+    if (obj->ccWnn.jcbuf == NULL) {
+	ret = -1;
+    } else if (n >= 0) {
+	ret = insertSelection(obj, n);
+	if (obj->ccWnn.textchanged) {
+	    XtCallCallbackList((Widget)obj,
+			       obj->inputConv.textchangecallback,
+			       (XtPointer)NULL);
+	    obj->ccWnn.textchanged = False;
+	}
+    }
+
+    obj->ccWnn.state = normal_state;
+    return ret;
+}
+
+static int
+ConvertedString(w, encoding, format, length, string)
+Widget w;
+Atom *encoding;
+int *format;
+int *length;
+XtPointer *string;
+{
+    CcWnnObject obj = (CcWnnObject)w;
+    jcConvBuf *jcbuf = obj->ccWnn.jcbuf;
+    wchar *wbuf, *wp;
+    int len, wlen;
+    extern int convJWStoCT();
+
+    if (jcbuf == NULL) return -1;
+
+    wlen = jcbuf->displayEnd - jcbuf->displayBuf;
+    if (wlen == 0) return -1;
+
+    /*
+     * jcbuf $B$KF~$C$F$$$kJQ49%F%-%9%H$O(B null $B%?!<%_%M!<%H$5$l$F$$$J$$$N$G(B
+     * $B$^$:%3%T!<$7$F(B null $B%?!<%_%M!<%H$9$k(B
+     */
+    wbuf = (wchar *)XtMalloc((wlen + 1) * sizeof(wchar));
+    (void)bcopy((char *)jcbuf->displayBuf, (char *)wbuf,
+		sizeof(wchar) * wlen);
+    wbuf[wlen] = 0;
+
+    /*
+     * CcWnn $B%*%V%8%'%/%H$O(B COMPOUND_TEXT $B%(%s%3!<%G%#%s%0$7$+%5%]!<%H$7$J$$(B
+     * COMPOUND_TEXT $B$KJQ49$9$k(B
+     */
+    *encoding = XA_COMPOUND_TEXT(XtDisplayOfObject((Widget)obj));
+    *format = 8;
+
+    /* COMPOUND_TEXT $B$O(B \r $B$,Aw$l$J$$$N$G(B \n $B$KJQ49$7$F$*$/(B */
+    for (wp = wbuf; *wp != 0; wp++) {
+	if (*wp == '\r') *wp = '\n';
+    }
+
+    *length = len = convJWStoCT(wbuf, (unsigned char *)NULL, 0);
+    *string = XtMalloc(len + 1);
+    (void)convJWStoCT(wbuf, (unsigned char *)*string, 0);
+
+    /* wbuf $B$r(B free $B$7$F$*$/(B */
+    XtFree((char *)wbuf);
+
+    return 0;
+}
+
+static int
+ClearConversion(w)
+Widget w;
+{
+    CcWnnObject obj = (CcWnnObject)w;
+
+    if (obj->ccWnn.jcbuf == NULL) {
+	return 0;	/* not -1, because it's already cleared */
+    }
+    clear_buffer(obj);
+    XtCallCallbackList(w, obj->inputConv.textchangecallback, (XtPointer)NULL);
+    return 0;
+}
+
+/* ARGSUSED */
+static ICString *
+GetAuxSegments(w, n, ns, nc)
+Widget w;
+Cardinal *n, *ns, *nc;
+{
+    /* CcWnn doesn't use AuxPanel */
+    XtAppWarning(XtWidgetToApplicationContext(w),
+		 "ccWnn Object: GetAuxSegments shouldn't be called");
+    return NULL;
+}
+
+/* ARGSUSED */
+static void
+Initialize(req, new, args, num_args)
+Widget req;
+Widget new;
+ArgList args;
+Cardinal *num_args;
+{
+    CcWnnObject obj = (CcWnnObject)new;
+
+    obj->ccWnn.ccrule = NULL;
+    obj->ccWnn.jcbuf = NULL;
+    obj->ccWnn.state = normal_state;
+    obj->ccWnn.selectionending = False;
+    obj->ccWnn.textchanged = False;
+    obj->ccWnn.symbollist = SymbolList;
+    obj->ccWnn.numsymbols = NumSymbols;
+    obj->ccWnn.cursymbol = 0;
+    obj->ccWnn.candlist = NULL;
+    obj->ccWnn.candlistsize = 0;
+    obj->ccWnn.numcand = 0;
+    obj->ccWnn.strdata = NULL;
+    obj->ccWnn.strdatasize = 0;
+    obj->ccWnn.inputmode = OTHERS;
+    obj->ccWnn.pendingdata = NULL;
+    obj->ccWnn.fixcount = 0;
+    obj->ccWnn.selwidget = NULL;
+    obj->ccWnn.selyomi = obj->ccWnn.selkanji = NULL;
+
+    /* $BJQ49$N=i4|2=(B */
+    obj->ccWnn.createrule = False;
+    obj->ccWnn.createenv = False;
+    ccInitialize(obj);
+    jcInitialize(obj);
+
+    addObject(obj);
+}
+
+static void
+ccInitialize(obj)
+CcWnnObject obj;
+{
+    extern char *getenv();
+
+    if (obj->ccWnn.createrule) {
+	ccDestroyBuf(obj->ccWnn.ccbuf);
+	obj->ccWnn.ccbuf = NULL;
+    }
+    if (obj->ccWnn.ccrule == NULL) {
+	if (obj->ccWnn.ccdeffile == NULL) {
+	    obj->ccWnn.ccdeffile = getenv("CC_DEF");
+	    if (obj->ccWnn.ccdeffile == NULL) {
+		obj->ccWnn.ccdeffile = DEF_CCDEF_FILE;
+	    }
+	}
+	obj->ccWnn.ccrule = ccParseRule(obj->ccWnn.ccdeffile, XtWarning);
+	obj->ccWnn.createrule = True;
+    }
+
+    if (obj->ccWnn.ccrule == NULL) {
+	XtAppError(XtWidgetToApplicationContext((Widget)obj),
+		   "CcWnn Object: cconv initialization failed.");
+    }
+
+    obj->ccWnn.ccbuf = ccCreateBuf(obj->ccWnn.ccrule, 16,
+				   fepfunctbl, FTSIZE,
+				   defAction, insChar, delChar,
+				   funcDispatch, autoFix, NULL, (caddr_t)obj);
+}
+
+static CcWnnObject current_obj = NULL;
+
+static void
+jcInitialize(obj)
+CcWnnObject obj;
+{
+    if (obj->ccWnn.createenv) {
+	(void)jcDestroyBuffer(obj->ccWnn.jcbuf, 0);
+	obj->ccWnn.jcbuf = NULL;
+	obj->ccWnn.createenv = False;
+    }
+
+    if (obj->ccWnn.wnnbuf == NULL || !jcIsConnect(obj->ccWnn.wnnbuf)) {
+	if (obj->ccWnn.wnnbuf != NULL) {
+	    jcClose(obj->ccWnn.wnnbuf);
+	    obj->ccWnn.wnnbuf = NULL;
+	}
+	if (obj->ccWnn.wnnenvname == NULL) obj->ccWnn.wnnenvname = "";
+	if (obj->ccWnn.wnnenvrcfile == NULL) obj->ccWnn.wnnenvrcfile = "";
+	if (obj->ccWnn.wnnenvrcfile4 == NULL) {
+	    obj->ccWnn.wnnenvrcfile4 = obj->ccWnn.wnnenvrcfile;
+	}
+	if (obj->ccWnn.wnnenvrcfile6 == NULL) {
+	    obj->ccWnn.wnnenvrcfile6 = obj->ccWnn.wnnenvrcfile;
+	}
+
+	/*
+	 * jllib $B$N%3!<%k%P%C%/$G$O!"%/%i%$%"%s%H!&%G!<%?$rEO$;$J$$$N(B
+	 * $B$G!"3P$($F$*$/!#(B
+	 */
+	current_obj = obj;
+	obj->ccWnn.wnnbuf = jcOpen2(obj->ccWnn.jservername,
+				    obj->ccWnn.wnnenvname,
+				    obj->ccWnn.wnnoverrideenv,
+				    obj->ccWnn.wnnenvrcfile4,
+				    obj->ccWnn.wnnenvrcfile6,
+				    createEnvError,
+				    createConfirm,
+				    30);
+	/* wnnbuf $B$,3MF@$G$-$J$1$l$P!"$=$N$^$^%j%?!<%s(B */
+	if (obj->ccWnn.wnnbuf == NULL) {
+	    XtAppWarning(XtWidgetToApplicationContext((Widget)obj),
+			 "ccWnn Object: can't open jserver");
+	    return;
+	}
+
+	/* jserver $B$H@\B3$5$l$F$$$J$1$l$P!"%;%+%s%@%j$r;n$7$F$_$k(B */
+	if (!jcIsConnect(obj->ccWnn.wnnbuf)
+		&& obj->ccWnn.jservername2 != NULL) {
+	    jcClose(obj->ccWnn.wnnbuf);
+	    current_obj = obj;
+	    obj->ccWnn.wnnbuf = jcOpen2(obj->ccWnn.jservername2,
+					obj->ccWnn.wnnenvname,
+					obj->ccWnn.wnnoverrideenv,
+					obj->ccWnn.wnnenvrcfile4,
+					obj->ccWnn.wnnenvrcfile6,
+					createEnvError,
+					createConfirm,
+					30);
+	    if (obj->ccWnn.wnnbuf == NULL) {
+		XtAppWarning(XtWidgetToApplicationContext((Widget)obj),
+			     "ccWnn Object: can't open jserver");
+		return;
+	    }
+	}
+	obj->ccWnn.createenv = True;
+	if (!jcIsConnect(obj->ccWnn.wnnbuf)) {
+		XtAppWarning(XtWidgetToApplicationContext((Widget)obj),
+			     "ccWnn Object: can't connect to jserver");
+	}
+    }
+    /* $B@\B3$G$-$J$/$F$b%P%C%U%!$O:n$C$F$*$/(B */
+    obj->ccWnn.jcbuf = jcCreateBuffer(obj->ccWnn.wnnbuf, 10, 80);
+    if (obj->ccWnn.pendingdata) restoreData(obj);
+}
+
+static void
+createEnvError(s)
+char *s;
+{
+    if (current_obj != NULL)
+	XtAppWarning(XtWidgetToApplicationContext((Widget)current_obj), s);
+}
+
+static int
+createConfirm(s)
+char *s;
+{
+    if (current_obj != NULL && current_obj->ccWnn.confirmfunc != NULL)
+	return (*current_obj->ccWnn.confirmfunc)((Widget)current_obj, s);
+    return 1;
+}
+
+static void
+Destroy(w)
+Widget w;
+{
+    CcWnnObject obj = (CcWnnObject)w;
+
+    /* $B%P%C%U%!$N2rJ|(B */
+    if (obj->ccWnn.ccbuf) ccDestroyBuf(obj->ccWnn.ccbuf);
+    if (obj->ccWnn.jcbuf) jcDestroyBuffer(obj->ccWnn.jcbuf, 1);
+
+    /* $B$b$7(B Initialize() $BCf$G%k!<%k(B/$B4D6-$r:n$C$?$N$G$"$l$P2rJ|$9$k(B */
+    if (obj->ccWnn.createrule) ccFreeRule(obj->ccWnn.ccrule);
+    if (obj->ccWnn.createenv) jcClose(obj->ccWnn.wnnbuf);
+
+    if (obj->ccWnn.candlist) XtFree((char *)obj->ccWnn.candlist);
+    if (obj->ccWnn.strdata) XtFree((char *)obj->ccWnn.strdata);
+
+    if (obj->ccWnn.pendingdata) XtFree((char *)obj->ccWnn.pendingdata);
+
+    if (obj->ccWnn.selwidget) XtDestroyWidget(obj->ccWnn.selwidget);
+    if (obj->ccWnn.selyomi) XtFree(obj->ccWnn.selyomi);
+    if (obj->ccWnn.selkanji) XtFree(obj->ccWnn.selkanji);
+
+    deleteObject(obj);
+}
+
+/* ARGSUSED */
+static Boolean
+SetValues(cur, req, wid, args, num_args)
+Widget cur;
+Widget req;
+Widget wid;
+ArgList args;
+Cardinal *num_args;
+{
+    CcWnnObject old = (CcWnnObject)cur;
+    CcWnnObject new = (CcWnnObject)wid;
+
+    if (old->ccWnn.ccdeffile != new->ccWnn.ccdeffile ||
+	old->ccWnn.wnnbuf != new->ccWnn.wnnbuf ||
+	old->ccWnn.ccrule != new->ccWnn.ccrule) {
+	XtAppWarning(XtWidgetToApplicationContext(wid),
+		     "ccWnn Object: can't change resource by XtSetValues()");
+    }
+    return False;
+}
+
+
+/*
+ *	cconv function dispatcher
+ */
+
+/* ARGSUSED */
+static int
+funcDispatch(func, str, nbytes, w)
+int func;
+unsigned char *str;
+int nbytes;
+caddr_t w;
+{
+    CcWnnObject obj = (CcWnnObject)w;
+
+    obj->ccWnn.cont = True;
+    if (func < 0 || func >= FTSIZE) return True;
+
+    wnn_errorno = 0;
+
+    switch (obj->ccWnn.state) {
+    case selection_s_state:
+    case selection_l_state:
+	(*functable[func][1])(obj);
+	break;
+    case symbol_state:
+	(*functable[func][2])(obj);
+	break;
+    default:
+	(*functable[func][0])(obj);
+	break;
+    }
+
+    return obj->ccWnn.cont;
+}
+
+/* ARGSUSED */
+static void
+defAction(str, nbytes, w)
+unsigned char *str;
+int nbytes;
+caddr_t w;
+{
+    if (nbytes > 0) beep((CcWnnObject)w);
+}
+
+#define ZERO	0xa3b0
+#define NINE	0xa3b9
+#define SmallA	0xa3e1
+#define SmallF	0xa3e6
+#define LargeA	0xa3c1
+#define LargeF	0xa3c6
+static int
+toHex(c)
+int	c;
+{
+	if ('0' <= c && c <= '9')
+		return c - '0';
+	if ('a' <= c && c <= 'f')
+		return c + 10 - 'a';
+	if ('A' <= c && c <= 'F')
+		return c + 10 - 'A';
+	if (ZERO <= c && c <= NINE)
+		return c - ZERO;
+	if (SmallA <= c && c <= SmallF)
+		return c + 10 - SmallA;
+	if (LargeA <= c && c <= LargeF)
+		return c + 10 - LargeA;
+	return -1;
+}
+
+static int
+toHex4(s)
+wchar	*s;
+{
+	int	c, h, cnt, hex;
+
+	hex = 0;
+	cnt = 0;
+	while (cnt < 4 && (c = *s++)) {
+		if ((h = toHex(c)) < 0)
+			return -1;
+		hex = hex * 16 + h;
+		cnt++;
+	}
+	if (cnt != 4)
+		return -1;
+
+	return hex;
+}
+
+static int
+toKuten(s)
+wchar *s;
+{
+	int i, c, d[4];
+
+	for (i = 0; i < 4 && (c = *s++); i++) {
+		if ((d[i] = toHex(c)) < 0 || d[i] >= 10)
+			return(-1);
+	}
+	if (i != 4)
+		return(-1);
+	return((((d[0] * 10 + d[1]) << 8) | (d[2] * 10 + d[3])) + 0x2020);
+}
+
+static void
+insChar(c, cldata)
+int c;
+caddr_t cldata;
+{
+    CcWnnObject obj = (CcWnnObject)cldata;
+    jcConvBuf *jcbuf = obj->ccWnn.jcbuf;
+    ccBuf ccbuf = obj->ccWnn.ccbuf;
+    wchar	context[17];
+    int h;
+
+    normalState(obj);
+
+    if (jcIsConverted(jcbuf, jcbuf->curClause)) {
+	(void)jcBottom(jcbuf);
+    }
+
+    switch (obj->ccWnn.inputmode) {
+    case KUTEN_MODE:
+    case JIS_MODE:
+	    /* $B%X%-%5$+$I$&$+$N%F%9%H(B */
+	    if ((h = toHex(c)) < 0 || (obj->ccWnn.inputmode == KUTEN_MODE && h >= 10)) {
+		    beep(obj);
+		    ccContextDelete(ccbuf);
+		    break;
+	    }
+	    ccContextGet(ccbuf, context);
+	    if (wstrlen(context) == 4) {
+		    /* convert to KANJI */
+		    c = obj->ccWnn.inputmode == KUTEN_MODE ? toKuten(context): toHex4(context);
+		    if (c < 0x2121 || 0x7e7e < c || (c & 0xff) < 0x21 ||
+			0x7e < (c & 0xff)) {
+			    beep(obj);
+			    break;
+		    }
+		    /* $B#3J8;z:o=|(B -- $B#4J8;zL\$O$^$@A^F~$7$F$$$J$$(B */
+		    jcDeleteChar(jcbuf, 1);
+		    jcDeleteChar(jcbuf, 1);
+		    jcDeleteChar(jcbuf, 1);
+		    (void)jcInsertChar(jcbuf, c | 0x8080);
+		    obj->ccWnn.textchanged = True;
+		    /* $B%3%s%F%-%9%H$N%/%j%"(B */
+		    ccContextClear(ccbuf);
+		    break;
+	    }
+	    /* fall thru */
+    case OTHERS:
+	    (void)jcInsertChar(jcbuf, c);
+	    obj->ccWnn.textchanged = True;
+	    break;
+    }
+}
+
+static void
+delChar(cldata)
+caddr_t cldata;
+{
+    CcWnnObject obj = (CcWnnObject)cldata;
+
+    if (obj->ccWnn.state != normal_state) {
+	beep(obj);
+	return;
+    }
+    ccContextDelete(obj->ccWnn.ccbuf);
+    jcDeleteChar(obj->ccWnn.jcbuf, 1);
+    obj->ccWnn.textchanged = True;
+}
+
+static void
+autoFix(cldata)
+caddr_t cldata;
+{
+    CcWnnObject obj = (CcWnnObject)cldata;
+
+    switch (obj->ccWnn.state)
+    {
+    case selection_s_state:
+    case selection_l_state:
+    case symbol_state:
+	fix(obj);
+	break;
+    default:
+
+	if (jcIsConverted(obj->ccWnn.jcbuf, 0))
+	    fix(obj);
+	break;
+    }
+}
+
+/*
+ *	cconv functions
+ */
+
+/* some convenient macros */
+#define JCBUF(obj)	((obj)->ccWnn.jcbuf)
+#define CCBUF(obj)	((obj)->ccWnn.ccbuf)
+#define HINT(obj)	((obj)->ccWnn.textchanged)
+
+/* $BJQ49%U%!%s%/%7%g%s72(B
+ *	convert
+ *	convert-sp
+ *	convert-s
+ *	unconvert
+ */
+
+static void
+convert_general(obj, small)
+CcWnnObject obj;
+int small;
+{
+    jcConvBuf	*jcbuf = JCBUF(obj);
+
+    if (jcbuf->curClause == jcbuf->nClause) {
+	(void)jcMove(jcbuf, small, JC_BACKWARD);
+	HINT(obj) = True;
+    }
+
+    if (jcIsConverted(jcbuf, jcbuf->curClause)) {
+	startSelection(obj, small);
+	return;
+    }
+
+    if (jcConvert(jcbuf, small, 0, 1) < 0) beep(obj);
+    ccContextClear(CCBUF(obj));
+    HINT(obj) = True;
+}
+
+static void
+convert(obj)
+CcWnnObject obj;
+{
+    convert_general(obj, 0);
+}
+
+static void
+convert_sb(obj)
+CcWnnObject obj;
+{
+    if (JCBUF(obj)->nClause == 0) {
+	send_back(obj);
+	fix(obj);
+    } else {
+	convert_general(obj, 0);
+    }
+}
+
+static void
+convert_sp(obj)
+CcWnnObject obj;
+{
+    if (JCBUF(obj)->nClause == 0) {
+	insChar(' ', (caddr_t)obj);
+	fix(obj);
+    } else {
+	convert_general(obj, 0);
+    }
+}
+
+static void
+convert_mt(obj)
+CcWnnObject obj;
+{
+    jcConvBuf *jcbuf = JCBUF(obj);
+    if (jcbuf->nClause == 0) {
+	send_back(obj);
+	fix(obj);
+    } else {
+	int nc = jcbuf->nClause - 1;
+	convert_general(obj, 0);
+	if (!jcIsConverted(jcbuf, jcbuf->curClause)) {
+	    int i;
+	    move_top(obj);
+	    if (nc < jcbuf->nClause)
+		for (i = 0; i < nc; i++)
+		    move_forward(obj);
+	}
+    }
+}
+
+static void
+convert_f1(obj)
+CcWnnObject obj;
+{
+    jcConvBuf	*jcbuf = JCBUF(obj);
+
+    if (0 < jcbuf->nClause && jcIsConverted(jcbuf, 0)) {
+	fix1(obj);
+    } else {
+	convert_general(obj, 0);
+    }
+}
+
+static void
+convert_mt_sb(obj)
+CcWnnObject obj;
+{
+    jcConvBuf *jcbuf = JCBUF(obj);
+    if (jcbuf->nClause == 0) {
+	send_back(obj);
+	fix(obj);
+    } else {
+	int nc = jcbuf->nClause - 1;
+	convert_general(obj, 0);
+	if (!jcIsConverted(jcbuf, jcbuf->curClause)) {
+	    int i;
+	    move_top(obj);
+	    if (nc < jcbuf->nClause)
+		for (i = 0; i < nc; i++)
+		    move_forward(obj);
+	}
+    }
+}
+
+static void
+convert_mt_sp(obj)
+CcWnnObject obj;
+{
+    jcConvBuf *jcbuf = JCBUF(obj);
+    if (jcbuf->nClause == 0) {
+	insChar(' ', (caddr_t)obj);
+	fix(obj);
+    } else {
+	int nc = jcbuf->nClause - 1;
+	convert_general(obj, 0);
+	if (!jcIsConverted(jcbuf, jcbuf->curClause)) {
+	    int i;
+	    move_top(obj);
+	    if (nc < jcbuf->nClause)
+		for (i = 0; i < nc; i++)
+		    move_forward(obj);
+	}
+    }
+}
+
+static void
+convert_s(obj)
+CcWnnObject obj;
+{
+    convert_general(obj, 1);
+}
+
+static void
+unconvert(obj)
+CcWnnObject obj;
+{
+    if (jcUnconvert(JCBUF(obj)) < 0) beep(obj);
+    ccContextClear(CCBUF(obj));
+    HINT(obj) = True;
+}
+
+static void
+select_general(obj, small)
+CcWnnObject obj;
+int small;
+{
+    jcConvBuf	*jcbuf = JCBUF(obj);
+
+    if (jcbuf->curClause == jcbuf->nClause) {
+	(void)jcMove(jcbuf, small, JC_BACKWARD);
+	HINT(obj) = True;
+    }
+
+    if (jcIsConverted(jcbuf, jcbuf->curClause)) {
+	startSelection(obj, small);
+	obj->ccWnn.cont = False; /* $B<!$N4X?t$O8F$P$J$$(B */
+    }
+}
+
+
+static void
+egg_select(obj)
+CcWnnObject obj;
+{
+    select_general(obj, 0);
+}
+
+
+static void
+egg_select_s(obj)
+CcWnnObject obj;
+{
+    select_general(obj, 1);
+}
+
+/* $B%+!<%=%k0\F0%U%!%s%/%7%g%s72(B
+ *	move_forward
+ *	move_backward
+ *	move_top
+ *	move_bottom
+ */
+
+static void
+move_general(obj, direction)
+CcWnnObject obj;
+int direction;
+{
+    int status = -1;
+
+    switch (direction) {
+    case ICMoveLeftMost:
+	status = jcTop(JCBUF(obj));
+	break;
+    case ICMoveRightMost:
+	status = jcBottom(JCBUF(obj));
+	break;
+    case ICMoveRight:
+	status = jcMove(JCBUF(obj), 1, JC_FORWARD);
+	break;
+    case ICMoveLeft:
+	status = jcMove(JCBUF(obj), 1, JC_BACKWARD);
+	break;
+    }
+
+    if (status < 0) beep(obj);
+
+    ccContextClear(CCBUF(obj));
+
+    HINT(obj) = True;
+}
+
+static void
+move_forward(obj)
+CcWnnObject obj;
+{
+    move_general(obj, ICMoveRight);
+}
+
+static void
+move_backward(obj)
+CcWnnObject obj;
+{
+    move_general(obj, ICMoveLeft);
+}
+
+static void
+move_top(obj)
+CcWnnObject obj;
+{
+    move_general(obj, ICMoveLeftMost);
+}
+
+static void
+move_bottom(obj)
+CcWnnObject obj;
+{
+    move_general(obj, ICMoveRightMost);
+}
+
+
+/* $B8uJd@ZBX$(%U%!%s%/%7%g%s72(B
+ *	cand_next
+ *	cand_next_s
+ *	cand_prev
+ *	cand_prev_s
+ */
+
+static void
+cand_general(obj, small, type)
+CcWnnObject obj;
+int small;
+int type;
+{
+    if (jcNext(JCBUF(obj), small, type) < 0) beep(obj);
+    ccContextClear(CCBUF(obj));
+    HINT(obj) = True;
+}
+
+static void
+cand_next(obj)
+CcWnnObject obj;
+{
+    cand_general(obj, 0, JC_NEXT);
+}
+
+static void
+cand_next_mt(obj)
+CcWnnObject obj;
+{
+    jcConvBuf *jcbuf = JCBUF(obj);
+    if (jcIsConverted(jcbuf, jcbuf->curClause))
+	cand_general(obj, 0, JC_NEXT);
+    else
+	convert_mt(obj);
+}
+
+static void
+cand_next_mt_sb(obj)
+CcWnnObject obj;
+{
+    jcConvBuf *jcbuf = JCBUF(obj);
+    if (jcIsConverted(jcbuf, jcbuf->curClause))
+	cand_general(obj, 0, JC_NEXT);
+    else
+	convert_mt_sb(obj);
+}
+
+static void
+cand_next_mt_sp(obj)
+CcWnnObject obj;
+{
+    jcConvBuf *jcbuf = JCBUF(obj);
+    if (jcIsConverted(jcbuf, jcbuf->curClause))
+	cand_general(obj, 0, JC_NEXT);
+    else
+	convert_mt_sp(obj);
+}
+
+static void
+cand_next_s(obj)
+CcWnnObject obj;
+{
+    cand_general(obj, 1, JC_NEXT);
+}
+
+static void
+cand_prev(obj)
+CcWnnObject obj;
+{
+    cand_general(obj, 0, JC_PREV);
+}
+
+static void
+cand_prev_s(obj)
+CcWnnObject obj;
+{
+    cand_general(obj, 1, JC_PREV);
+}
+
+
+/* $BJ8@aD9JQ99%U%!%s%/%7%g%s72(B
+ *	expand_cl
+ *	expand_cl_s
+ *	expand_cl2
+ *	expand_cl2_s
+ *	shrink_cl
+ *	shrink_cl_s
+ *	shrink_cl2
+ *	shrink_cl2_s
+ */
+
+static void
+expand_shrink_general(obj, shrink, small, conv)
+CcWnnObject obj;
+int shrink;
+int small;
+int conv;
+{
+    int status;
+
+    normalState(obj);
+
+    if (shrink) {
+	status = jcShrink(JCBUF(obj), small, conv);
+    } else {
+	status = jcExpand(JCBUF(obj), small, conv);
+    }
+    if (status < 0) beep(obj);
+
+    ccContextClear(CCBUF(obj));
+    HINT(obj) = True;
+}
+
+static void
+expand_cl(obj)
+CcWnnObject obj;
+{
+    expand_shrink_general(obj, 0, 0, 1);
+}
+
+static void
+expand_cl_s(obj)
+CcWnnObject obj;
+{
+    expand_shrink_general(obj, 0, 1, 1);
+}
+
+static void
+shrink_cl(obj)
+CcWnnObject obj;
+{
+    expand_shrink_general(obj, 1, 0, 1);
+}
+
+static void
+shrink_cl_s(obj)
+CcWnnObject obj;
+{
+    expand_shrink_general(obj, 1, 1, 1);
+}
+
+static void
+expand_cl2(obj)
+CcWnnObject obj;
+{
+    expand_shrink_general(obj, 0, 0, 0);
+}
+
+static void
+expand_cl2_s(obj)
+CcWnnObject obj;
+{
+    expand_shrink_general(obj, 0, 1, 0);
+}
+
+static void
+shrink_cl2(obj)
+CcWnnObject obj;
+{
+    expand_shrink_general(obj, 1, 0, 0);
+}
+
+static void
+shrink_cl2_s(obj)
+CcWnnObject obj;
+{
+    expand_shrink_general(obj, 1, 1, 0);
+}
+
+
+/* $BJQ49%P%C%U%!%/%j%"%U%!%s%/%7%g%s(B
+ *	clear_buffer
+ */
+
+static void
+clear_buffer(obj)
+CcWnnObject obj;
+{
+    normalState(obj);
+    if (jcClear(JCBUF(obj)) < 0) beep(obj);
+    ccContextClear(CCBUF(obj));
+    HINT(obj) = True;
+}
+
+static void
+cancel(obj)
+CcWnnObject obj;
+{
+    if (jcCancel(JCBUF(obj)) < 0) beep(obj);
+    ccContextClear(CCBUF(obj));
+    move_bottom(obj);
+    HINT(obj) = True;
+}
+
+
+static void
+clear_c(obj)
+CcWnnObject obj;
+{
+    switch (obj->ccWnn.state)
+    {
+    case selection_s_state:
+    case selection_l_state:
+	endSelection(obj, False);
+	cancel(obj);
+	break;
+    case symbol_state:
+	clear_buffer(obj);
+	break;
+    default:
+	if (jcIsConverted(JCBUF(obj), JCBUF(obj)->curClause))
+	    cancel(obj);
+	else
+	    clear_buffer(obj);
+	break;
+    }
+}
+
+/* $B8uJd0\F0%U%!%s%/%7%g%s72(B
+ *	sel_next
+ *	sel_prev
+ *	sel_top
+ *	sel_bottom
+ *	sel_forward
+ *	sel_backward
+ */
+
+static void
+sel_top(obj)
+CcWnnObject obj;
+{
+    moveSelection(obj, ICMoveLeftMost);
+}
+
+static void
+sel_bottom(obj)
+CcWnnObject obj;
+{
+    moveSelection(obj, ICMoveRightMost);
+}
+
+static void
+sel_forward(obj)
+CcWnnObject obj;
+{
+    moveSelection(obj, ICMoveRight);
+}
+
+static void
+sel_backward(obj)
+CcWnnObject obj;
+{
+    moveSelection(obj, ICMoveLeft);
+}
+
+static void
+sel_next(obj)
+CcWnnObject obj;
+{
+    moveSelection(obj, ICMoveDown);
+}
+
+static void
+sel_prev(obj)
+CcWnnObject obj;
+{
+    moveSelection(obj, ICMoveUp);
+}
+
+static void
+sel_select(obj)
+CcWnnObject obj;
+{
+    endSelection(obj, False);
+}
+
+static void
+sel_abort(obj)
+CcWnnObject obj;
+{
+    endSelection(obj, True);
+}
+
+static void
+fix(obj)
+CcWnnObject obj;
+{
+    jcConvBuf *jcbuf = JCBUF(obj);
+
+    normalState(obj);
+    ccContextClear(CCBUF(obj));
+
+    if (jcbuf->nClause > 0) {
+	obj->ccWnn.fixperformed = True;
+
+	if (jcFix(jcbuf) < 0) {
+	    beep(obj);
+	    return;
+	}
+
+	/* $B<-=q%;!<%V$N=hM}(B */
+	obj->ccWnn.fixcount++;
+	if (obj->ccWnn.saveinterval > 0 &&
+	    obj->ccWnn.fixcount >= obj->ccWnn.saveinterval) {
+	    jcSaveDic(jcbuf);
+	    obj->ccWnn.fixcount = 0;
+	}
+
+	/* $B3NDj$N=hM}(B */
+	XtCallCallbackList((Widget)obj, obj->inputConv.fixcallback,
+			   (XtPointer)NULL);	/* ??? */
+
+	HINT(obj) = True;
+    }
+
+    /* $B%P%C%U%!$r%/%j%"$9$k(B */
+    jcClear(jcbuf);
+}
+
+static void
+fix1(obj)
+CcWnnObject obj;
+{
+    jcConvBuf *jcbuf = JCBUF(obj);
+
+    normalState(obj);
+    ccContextClear(CCBUF(obj));
+
+    if (jcbuf->nClause > 0) {
+	obj->ccWnn.fixperformed = True;
+
+	if (jcFix1(jcbuf) < 0) { /* $B$3$3$@$1$,(B fix(obj) $B$H0c$&$H$3$m(B */
+	    beep(obj);
+	    return;
+	}
+
+	/* $B<-=q%;!<%V$N=hM}(B */
+	obj->ccWnn.fixcount++;
+	if (obj->ccWnn.saveinterval > 0 &&
+	    obj->ccWnn.fixcount >= obj->ccWnn.saveinterval) {
+	    jcSaveDic(jcbuf);
+	    obj->ccWnn.fixcount = 0;
+	}
+
+	/* $B3NDj$N=hM}(B */
+	XtCallCallbackList((Widget)obj, obj->inputConv.fixcallback,
+			   (XtPointer)NULL);	/* ??? */
+
+	HINT(obj) = True;
+    }
+
+    /* $B%P%C%U%!$r%/%j%"$9$k(B */
+    jcClear(jcbuf);
+}
+
+static void
+fix_cr(obj)
+CcWnnObject obj;
+{
+    if (JCBUF(obj)->nClause == 0) {
+	carriageret(obj);
+    } else {
+	fix(obj);
+    }
+}
+
+
+static void
+fix_sb(obj)
+CcWnnObject obj;
+{
+    if (JCBUF(obj)->nClause == 0) {
+	send_back(obj);
+    } else {
+	fix(obj);
+    }
+}
+
+
+static void
+to_hankaku(start, end, res)
+wchar *start;
+wchar *end;
+wchar *res;
+{
+    static unsigned short hiratohan[] = {	/* $BA43Q$+$J(B <-> $BH>3Q$+$J(B */
+#define D	(0xde<<8)	/* $BBy2;(B */
+#define H	(0xdf<<8)	/* $BH>By2;(B */
+	/* a */ 0xa7, 0xb1, 0xa8, 0xb2, 0xa9, 0xb3, 0xaa, 0xb4, 0xab, 0xb5,
+	/* k */ 0xb6, 0xb6|D, 0xb7, 0xb7|D, 0xb8, 0xb8|D,
+		0xb9, 0xb9|D, 0xba, 0xba|D,
+	/* s */ 0xbb, 0xbb|D, 0xbc, 0xbc|D, 0xbd, 0xbd|D,
+		0xbe, 0xbe|D, 0xbf, 0xbf|D,
+	/* t */ 0xc0, 0xc0|D, 0xc1, 0xc1|D, 0xaf, 0xc2, 0xc2|D,
+		0xc3, 0xc3|D, 0xc4, 0xc4|D,
+	/* n */	0xc5, 0xc6, 0xc7, 0xc8, 0xc9,
+	/* h */	0xca, 0xca|D, 0xca|H, 0xcb, 0xcb|D, 0xcb|H, 0xcc, 0xcc|D,
+		0xcc|H, 0xcd, 0xcd|D, 0xcd|H, 0xce, 0xce|D, 0xce|H,
+	/* m */ 0xcf, 0xd0, 0xd1, 0xd2, 0xd3,
+	/* y */ 0xac, 0xd4, 0xad, 0xd5, 0xae, 0xd6,
+	/* r */ 0xd7, 0xd8, 0xd9, 0xda, 0xdb,
+	/* w */ 0xdc, 0xdc, 0xb2, 0xb4, 0xa6,
+	/* n */ 0xdd
+#undef D
+#undef H
+    };
+    static struct symzenhan {
+	unsigned short	zen;
+	unsigned char	han;
+    } kigoutohan[] = {				/* $BA43Q5-9f(B -> $BH>3Q5-9f(B */
+	0xa1a1, 0x20,	0xa1a2, 0xa4,	0xa1a3, 0xa1,	0xa1a4, 0x2c,
+	0xa1a5, 0x2e,	0xa1a6, 0xa5,	0xa1a7, 0x3a,	0xa1a8, 0x3b,
+	0xa1a9, 0x3f,	0xa1aa, 0x21,	0xa1ab, 0xde,	0xa1ac, 0xdf,
+	0xa1b0, 0x5e,	0xa1b2, 0x5f,	0xa1bc, 0xb0,	0xa1bf, 0x2f,
+	0xa1c1, 0x7e,	0xa1c3, 0x7c,	0xa1c6, 0x60,	0xa1c7, 0x27,
+	0xa1c8, 0x22,	0xa1c9, 0x22,	0xa1ca, 0x28,	0xa1cb, 0x29,
+	0xa1cc, 0x5b,	0xa1cd, 0x5d,	0xa1ce, 0x5b,	0xa1cf, 0x5d,
+	0xa1d0, 0x7b,	0xa1d1, 0x7d,	0xa1d6, 0xa2,	0xa1d7, 0xa3,
+	0xa1dc, 0x2b,	0xa1dd, 0x2d,	0xa1e1, 0x3d,	0xa1e3, 0x3c,
+	0xa1e4, 0x3e,	0xa1ef, 0x5c,	0xa1f0, 0x24,	0xa1f3, 0x25,
+	0xa1f4, 0x23,	0xa1f5, 0x26,	0xa1f6, 0x2a,	0xa1f7, 0x40,
+    };
+#define KIGOUSIZE	(sizeof(kigoutohan) / sizeof(struct symzenhan))
+    register int c;
+
+    while (start < end) {
+	c = *start++;
+	if (0xa1a1 <= c && c <= 0xa1fe) {		/* symbol */
+	    register struct symzenhan *hi = kigoutohan + KIGOUSIZE;
+	    register struct symzenhan *lo = kigoutohan;
+	    register struct symzenhan *m;
+	    register int dif;
+
+	    while (lo <= hi) {
+		m = lo + (hi - lo) / 2;
+		if ((dif = c - m->zen) == 0) break;
+		if (dif < 0) {
+		    hi = m - 1;
+		} else {
+		    lo = m + 1;
+		}
+	    }
+	    *res++ = (lo > hi) ? c : m->han;
+	} else if (0xa3b0 <= c && c <= 0xa3b9) {	/* Numeric */
+	    *res++ = c - 0xa3b0 + '0';
+	} else if (0xa3c1 <= c && c <= 0xa3da) {	/* A-Z */
+	    *res++ = c - 0xa3c1 + 'A';
+	} else if (0xa3e1 <= c && c <= 0xa3fa) {	/* a-z */
+	    *res++ = c - 0xa3e1 + 'a';
+	} else if (0xa4a1 <= c && c <= 0xa4f3) {	/* $B$R$i$,$J(B */
+	    c = hiratohan[c - 0xa4a1];
+	    *res++ = c & 0xff;
+	    if (c & 0xff00) *res++ = c >> 8;
+	} else if (0xa5a1 <= c && c <= 0xa5f3) {	/* $B$+$?$+$J(B */
+	    c = hiratohan[c - 0xa5a1];
+	    *res++ = c & 0xff;
+	    if (c & 0xff00) *res++ = c >> 8;
+	} else {
+	    *res++ = c;
+	}
+    }
+    *res = 0;	/* NULL terminate */
+}
+
+static void
+to_zenkaku(start, end, res)
+wchar *start;
+wchar *end;
+wchar *res;
+{
+    static wchar hantozen[] = {	/* $BH>3Q(B $B"M(B $BA43QJQ49I=(B */
+	/* C0 */
+	0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007,
+	0x0008, 0x0009, 0x000a, 0x000b, 0x000c, 0x000d, 0x000e, 0x000f,
+	0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017,
+	0x0018, 0x0019, 0x001a, 0x001b, 0x001c, 0x001d, 0x001e, 0x001f,
+	/* ASCII */
+	0xa1a1, 0xa1aa, 0xa1c9, 0xa1f4, 0xa1f0, 0xa1f3, 0xa1f5, 0xa1c7,
+	0xa1ca, 0xa1cb, 0xa1f6, 0xa1dc, 0xa1a4, 0xa1dd, 0xa1a5, 0xa1bf,
+	0xa3b0, 0xa3b1, 0xa3b2, 0xa3b3, 0xa3b4, 0xa3b5, 0xa3b6, 0xa3b7,
+	0xa3b8, 0xa3b9, 0xa1a7, 0xa1a8, 0xa1e3, 0xa1e1, 0xa1e4, 0xa1a9,
+	0xa1f7, 0xa3c1, 0xa3c2, 0xa3c3, 0xa3c4, 0xa3c5, 0xa3c6, 0xa3c7,
+	0xa3c8, 0xa3c9, 0xa3ca, 0xa3cb, 0xa3cc, 0xa3cd, 0xa3ce, 0xa3cf,
+	0xa3d0, 0xa3d1, 0xa3d2, 0xa3d3, 0xa3d4, 0xa3d5, 0xa3d6, 0xa3d7,
+	0xa3d8, 0xa3d9, 0xa3da, 0xa1ce, 0xa1ef, 0xa1cf, 0xa1b0, 0xa1b2,
+	0xa1c6, 0xa3e1, 0xa3e2, 0xa3e3, 0xa3e4, 0xa3e5, 0xa3e6, 0xa3e7,
+	0xa3e8, 0xa3e9, 0xa3ea, 0xa3eb, 0xa3ec, 0xa3ed, 0xa3ee, 0xa3ef,
+	0xa3f0, 0xa3f1, 0xa3f2, 0xa3f3, 0xa3f4, 0xa3f5, 0xa3f6, 0xa3f7,
+	0xa3f8, 0xa3f9, 0xa3fa, 0xa1d0, 0xa1c3, 0xa1d1, 0xa1c1, 0x007f,
+	/* C1 */
+	0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087,
+	0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f,
+	0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097,
+	0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f,
+	/* KANA */
+	0xa1a1, 0xa1a3, 0xa1d6, 0xa1d7, 0xa1a2, 0xa1a6, 0xa5f2, 0xa5a1,
+	0xa5a3, 0xa5a5, 0xa5a7, 0xa5a9, 0xa5e3, 0xa5e5, 0xa5e7, 0xa5c3,
+	0xa1bc, 0xa5a2, 0xa5a4, 0xa5a6, 0xa5a8, 0xa5aa, 0xa5ab, 0xa5ad,
+	0xa5af, 0xa5b1, 0xa5b3, 0xa5b5, 0xa5b7, 0xa5b9, 0xa5bb, 0xa5bd,
+	0xa5bf, 0xa5c1, 0xa5c4, 0xa5c6, 0xa5c8, 0xa5ca, 0xa5cb, 0xa5cc,
+	0xa5cd, 0xa5ce, 0xa5cf, 0xa5d2, 0xa5d5, 0xa5d8, 0xa5db, 0xa5de,
+	0xa5df, 0xa5e0, 0xa5e1, 0xa5e2, 0xa5e4, 0xa5e6, 0xa5e8, 0xa5e9,
+	0xa5ea, 0xa5eb, 0xa5ec, 0xa5ed, 0xa5ef, 0xa5f3, 0xa1ab, 0xa1ac,
+	/* undefined */
+	0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x00e7,
+	0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef,
+	0x00f0, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x00f7,
+	0x00f8, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x00fd, 0x00fe, 0x00ff,
+    };
+    register int c;
+
+    while (start < end) {
+	c = *start++;
+	if ((0x20 <= c && c <= 0x7e) || (0xa1 <= c && c <= 0xdf)) {
+	    *res++ = hantozen[c];
+	} else {
+	      *res++ = c;
+	}
+    }
+    *res = 0;	/* NULL terminate */
+}
+
+static void
+zenkaku_hankaku(obj, hankaku)
+CcWnnObject obj;
+int hankaku;
+{
+    jcConvBuf *jcbuf = JCBUF(obj);
+
+    normalState(obj);
+
+    if (jcbuf->curClause != jcbuf->nClause) {
+	jcClause *cinfo = jcbuf->clauseInfo;
+	wchar *ks = cinfo[jcbuf->curLCStart].kanap;
+	wchar *ke = cinfo[jcbuf->curLCEnd].kanap;
+	wchar buf[256];
+
+	if (hankaku) {
+	    to_hankaku(ks, ke, buf);
+	} else {
+	    to_zenkaku(ks, ke, buf);
+	}
+	if (jcChangeClause(jcbuf, buf) < 0) beep(obj);
+    }
+    ccContextClear(CCBUF(obj));
+    HINT(obj) = True;
+}
+
+static void
+zenkaku(obj)
+CcWnnObject obj;
+{
+    zenkaku_hankaku(obj, 0);
+}
+
+static void
+hankaku(obj)
+CcWnnObject obj;
+{
+    zenkaku_hankaku(obj, 1);
+}
+
+static void
+hiragana_katakana(obj, type)
+CcWnnObject obj;
+int type;
+{
+    normalState(obj);
+
+    if (jcKana(JCBUF(obj), 0, type) < 0) beep(obj);
+    ccContextClear(CCBUF(obj));
+    HINT(obj) = True;
+}
+
+static void
+hiragana(obj)
+CcWnnObject obj;
+{
+    hiragana_katakana(obj, JC_HIRAGANA);
+}
+
+static void
+katakana(obj)
+CcWnnObject obj;
+{
+    hiragana_katakana(obj, JC_KATAKANA);
+}
+
+
+static void
+backspace(obj)
+CcWnnObject obj;
+{
+    switch (obj->ccWnn.state) {
+    case selection_l_state:
+	endSelection(obj, False);
+	(void)jcMove(JCBUF(obj), 0, JC_FORWARD);
+	break;
+    case selection_s_state:
+	endSelection(obj, False);
+	(void)jcMove(JCBUF(obj), 1, JC_FORWARD);
+	break;
+    case symbol_state:
+	endSelection(obj, False);
+	break;
+    }
+    ccContextDelete(CCBUF(obj));
+    if (jcDeleteChar(JCBUF(obj), 1) < 0) beep(obj);
+    HINT(obj) = True;
+}
+
+static void
+backspace_c(obj)
+CcWnnObject obj;
+{
+    switch (obj->ccWnn.state) {
+    case selection_s_state:
+    case selection_l_state:
+	endSelection(obj, False);
+	cancel(obj);
+	break;
+    case symbol_state:
+	backspace(obj);
+	break;
+    default:
+        if (jcIsConverted(JCBUF(obj), 0))
+	    cancel(obj);
+	else
+	    backspace(obj);
+	break;
+    }
+}
+
+static void
+delete(obj)
+CcWnnObject obj;
+{
+    normalState(obj);
+    if (jcDeleteChar(JCBUF(obj), 0) < 0) beep(obj);
+    ccContextClear(CCBUF(obj));
+    HINT(obj) = True;
+}
+
+static void
+delete_c(obj)
+CcWnnObject obj;
+{
+    switch (obj->ccWnn.state) {
+    case selection_s_state:
+    case selection_l_state:
+	endSelection(obj, False);
+	cancel(obj);
+	break;
+    case symbol_state:
+	delete(obj);
+	break;
+    default:
+	if (jcIsConverted(JCBUF(obj), JCBUF(obj)->curClause))
+	    cancel(obj);
+	else
+	    delete(obj);
+	break;
+    }
+}
+
+static void
+kill_line(obj)
+CcWnnObject obj;
+{
+    normalState(obj);
+    if (jcKillLine(JCBUF(obj)) < 0) beep(obj);
+    ccContextClear(CCBUF(obj));
+    HINT(obj) = True;
+}
+
+static void
+bell(obj)
+CcWnnObject obj;
+{
+    XBell(XtDisplayOfObject((Widget)obj), 0);
+}
+
+static void
+beep(obj)
+CcWnnObject obj;
+{
+    if (JCBUF(obj)->nClause == 0) return;
+    bell(obj);
+}
+
+static void
+jiscode_begin(obj)
+CcWnnObject obj;
+{
+    obj->ccWnn.inputmode = JIS_MODE;
+}
+
+static void
+jiscode_end(obj)
+CcWnnObject obj;
+{
+    obj->ccWnn.inputmode = OTHERS;
+}
+
+static void
+kuten_begin(obj)
+CcWnnObject obj;
+{
+    obj->ccWnn.inputmode = KUTEN_MODE;
+}
+
+static void
+kuten_end(obj)
+CcWnnObject obj;
+{
+    obj->ccWnn.inputmode = OTHERS;
+}
+
+static void
+carriageret(obj)
+CcWnnObject obj;
+{
+    insChar('\r', (caddr_t)obj);
+    fix(obj);
+}
+
+
+static void
+convend(obj)
+CcWnnObject obj;
+{
+    fix(obj);
+    /* $B%$%Y%s%H$rAw$jJV$5$J$$$h$&$K(B fixperformed $B$r%;%C%H$7$F$*$/(B */
+    obj->ccWnn.fixperformed = True;
+    XtCallCallbackList((Widget)obj, obj->inputConv.endcallback,
+		       (XtPointer)NULL);
+}
+
+
+static void
+send_back(obj)
+CcWnnObject obj;
+{
+    obj->ccWnn.sendbackevent = True;
+}
+
+
+static void
+register_word(obj)
+CcWnnObject obj;
+{
+    Widget w = obj->ccWnn.selwidget;
+    Display *dpy;
+
+    TRACE(("register_word()\n"));
+    if (w == NULL) {
+	/*
+	 * $B%&%#%s%I%&$r;H$$$?$$$N$G!"<+J,$G(B widget $B$r0l$D:n$k!#(B
+	 * nonwidget $B$r?F$K$7$F(B widget $B$r:n@.$9$k$3$H$O2DG=$J$h$&$K(B
+	 * $B;W$($k$N$@$,!"$J$<$+$G$-$J$$$_$?$$$J$N$G!"$^$:$O(B widget $B$G$"$k(B
+	 * $B?F$rC5$7$F!"$=$3$K:n$k$3$H$K$9$k!#(B
+	 */
+	Widget p = XtParent((Widget)obj);
+
+	while (p != NULL) {
+	    if (XtIsWidget(p)) break;
+	    p = XtParent(p);
+	}
+	if (p == NULL) {
+	    DPRINT(("register_word(): cannot find widget parent\n"));
+	    return;
+	}
+
+	TRACE(("register_word(): creating core widget\n"));
+	w = XtVaCreateWidget("for_selection", coreWidgetClass, p,
+			     XtNwidth, 1, XtNheight, 1, NULL);
+	XtRealizeWidget(w);
+	obj->ccWnn.selwidget = w;
+    }
+    saveYomiAndKanji(obj);
+    if (obj->ccWnn.selyomi == NULL && obj->ccWnn.selkanji == NULL) return;
+
+    dpy = XtDisplay(w);
+    XtOwnSelection(w, CachedInternAtom(dpy, CCWNN_REGISTER_ATOM, False),
+		   XtLastTimestampProcessed(dpy),
+		   convertSelection, NULL, NULL);
+}
+
+static void
+sym_input(obj)
+CcWnnObject obj;
+{
+    ICSelectionControlArg arg;
+
+    if (obj->ccWnn.state != normal_state) {
+	beep(obj);
+	return;
+    }
+    obj->ccWnn.state = symbol_state;
+
+    arg.command = ICSelectionStart;
+    arg.u.selection_kind = ICSelectionSymbols;
+    XtCallCallbackList((Widget)obj, obj->inputConv.selectioncallback,
+		       (XtPointer)&arg);
+
+    arg.command = ICSelectionSet;
+    arg.u.current_item = obj->ccWnn.cursymbol;
+    XtCallCallbackList((Widget)obj, obj->inputConv.selectioncallback,
+		       (XtPointer)&arg);
+}
+
+static int
+getSymbol(obj, n)
+CcWnnObject obj;
+int n;
+{
+    int c;
+
+    if (n < 0 || n >= obj->ccWnn.numsymbols) return -1;
+
+    c = *(wchar *)(obj->ccWnn.symbollist[n].data);
+
+    return c;
+}
+
+static void
+startSelection(obj, small)
+CcWnnObject obj;
+int small;
+{
+    ICSelectionControlArg arg;
+    int ncand, curcand;
+
+    if (obj->ccWnn.state != normal_state) {
+	beep(obj);
+	return;
+    }
+
+    if (jcCandidateInfo(JCBUF(obj), small, &ncand, &curcand) < 0) {
+	beep(obj);
+	return;
+    }
+
+    getAllCandidates(obj, ncand);
+
+    obj->ccWnn.numcand = ncand;
+    obj->ccWnn.curcand = curcand;
+    obj->ccWnn.state = small ? selection_s_state : selection_l_state;
+
+    arg.command = ICSelectionStart;
+    arg.u.selection_kind = ICSelectionCandidates;
+    XtCallCallbackList((Widget)obj, obj->inputConv.selectioncallback,
+		       (XtPointer)&arg);
+
+    /* set current item */
+    arg.command = ICSelectionSet;
+    arg.u.current_item = curcand;
+    XtCallCallbackList((Widget)obj, obj->inputConv.selectioncallback,
+		       (XtPointer)&arg);
+}
+
+static void
+moveSelection(obj, dir)
+CcWnnObject obj;
+int dir;
+{
+    ICSelectionControlArg arg;
+
+    if (obj->ccWnn.state == normal_state) return;
+    arg.command = ICSelectionMove;
+    arg.u.dir = dir;
+    XtCallCallbackList((Widget)obj, obj->inputConv.selectioncallback,
+		       (XtPointer)&arg);
+}
+
+static int
+endSelection(obj, abort)
+CcWnnObject obj;
+int abort;
+{
+    ICSelectionControlArg arg;
+    int selected;
+    int ret = 0;
+
+    if (obj->ccWnn.selectionending) return 0;
+
+    if (obj->ccWnn.state == normal_state) return -1;
+
+    arg.command = ICSelectionEnd;
+    arg.u.current_item = -1;
+    XtCallCallbackList((Widget)obj, obj->inputConv.selectioncallback,
+		       (XtPointer)&arg);
+
+    if (!abort && (selected = arg.u.current_item) >= 0) {
+	ret = insertSelection(obj, selected);
+    }
+    obj->ccWnn.state = normal_state;
+
+    return ret;
+}
+
+static int
+insertSelection(obj, selected)
+CcWnnObject obj;
+int selected;
+{
+    int state = obj->ccWnn.state;
+    int ret = 0;
+
+    HINT(obj) = True;
+
+    obj->ccWnn.selectionending = True;
+    if (state == symbol_state) {
+	int c = getSymbol(obj, selected);
+	if (c < 0) return -1;
+	obj->ccWnn.cursymbol = selected;
+	ccContextAppend(CCBUF(obj), c);
+	insChar(c, (caddr_t)obj);
+    } else {
+	obj->ccWnn.curcand = selected;
+	ret = jcSelect(JCBUF(obj), selected);
+    }
+    obj->ccWnn.selectionending = False;
+
+    return ret;
+}
+
+static void
+normalState(obj)
+CcWnnObject obj;
+{
+    switch (obj->ccWnn.state) {
+    case selection_l_state:
+    case selection_s_state:
+	/* $B8uJdA*BrCf$G$"$l$P%+%l%s%H$N8uJd$rA*Br$7$FA*Br%b!<%I$+$iH4$1$k(B */
+    case symbol_state:
+	/* $B5-9fF~NOCf$G$"$l$P%+%l%s%H$N5-9f$rA*Br$7$F5-9f%b!<%I$+$iH4$1$k(B */
+	endSelection(obj, False);
+	break;
+    }
+}
+
+static void
+allocCandlist(obj, n)
+CcWnnObject obj;
+int n;
+{
+    ICString *p;
+
+    if (n <= obj->ccWnn.candlistsize) return;
+
+    if (obj->ccWnn.candlistsize == 0) {
+	p = (ICString *)XtMalloc(n * sizeof(ICString));
+    } else {
+	p = (ICString *)XtRealloc((char *)obj->ccWnn.candlist,
+				  n * sizeof(ICString));
+    }
+
+    obj->ccWnn.candlist = p;
+    obj->ccWnn.candlistsize = n;
+}
+
+static void
+allocStrdata(obj, nchars)
+CcWnnObject obj;
+Cardinal nchars;
+{
+    wchar *p;
+
+    if (nchars <= obj->ccWnn.strdatasize) return;
+
+    if (obj->ccWnn.strdatasize == 0) {
+	if (nchars < 256) nchars = 256;
+	p = (wchar *)XtMalloc(nchars * sizeof(wchar));
+    } else {
+	if (nchars - obj->ccWnn.strdatasize < 256)
+	    nchars = obj->ccWnn.strdatasize + 256;
+	p = (wchar *)XtRealloc((char *)obj->ccWnn.strdata,
+				 nchars * sizeof(wchar));
+    }
+
+    obj->ccWnn.strdata = p;
+    obj->ccWnn.strdatasize = nchars;
+}
+
+static void
+getAllCandidates(obj, ncand)
+CcWnnObject obj;
+int ncand;
+{
+    ICString *strp;
+    Cardinal nchars;
+    wchar *p;
+    int i;
+    wchar buf[256];
+
+    allocCandlist(obj, ncand);
+
+    nchars = 0;
+    for (i = 0, strp = obj->ccWnn.candlist; i < ncand; i++, strp++) {
+	(void)jcGetCandidate(obj->ccWnn.jcbuf, i, buf);
+	strp->nchars = wstrlen(buf);
+	strp->nbytes = strp->nchars * sizeof(wchar);
+	strp->attr = ICAttrNormalString;
+	allocStrdata(obj, nchars + strp->nchars);
+	(void)bcopy((char *)buf, (char *)(obj->ccWnn.strdata + nchars),
+		    strp->nbytes);
+	nchars += strp->nchars;
+    }
+
+    p = obj->ccWnn.strdata;
+    for (i = 0, strp = obj->ccWnn.candlist; i < ncand; i++, strp++) {
+	strp->data = (char *)p;
+	p += strp->nchars;
+    }
+}
+
+/*
+ * keeping list of objects
+ */
+typedef struct _oblist_ {
+    CcWnnObject obj;
+    struct _oblist_ *next;
+} ObjRec;
+
+static ObjRec *ObjList = NULL;
+
+static void
+addObject(obj)
+CcWnnObject obj;
+{
+    ObjRec *objp = XtNew(ObjRec);
+
+    objp->obj = obj;
+    objp->next = ObjList;
+    ObjList = objp;
+}
+
+static void
+deleteObject(obj)
+CcWnnObject obj;
+{
+    ObjRec *objp, *objp0;
+
+    for (objp0 = NULL, objp = ObjList;
+	 objp != NULL;
+	 objp0 = objp, objp = objp->next) {
+	if (objp->obj == obj) {
+	    if (objp0 == NULL) {
+		ObjList = objp->next;
+	    } else {
+		objp0->next = objp->next;
+	    }
+	    XtFree((char *)objp);
+	    return;
+	}
+    }
+}
+
+static void
+serverDead()
+{
+    ObjRec *objp = ObjList;
+
+    while (objp != NULL) {
+	if (objp->obj->ccWnn.wnnbuf != NULL
+		 && !jcIsConnect(objp->obj->ccWnn.wnnbuf)
+		 && wnn_errorno == WNN_JSERVER_DEAD) {
+	    if (objp->obj->ccWnn.jcbuf != NULL) {
+		(void)jcDestroyBuffer(objp->obj->ccWnn.jcbuf, 0);
+		objp->obj->ccWnn.jcbuf = NULL;
+	    }
+	    (void)jcClose(objp->obj->ccWnn.wnnbuf);
+	    objp->obj->ccWnn.wnnbuf = NULL;
+	    if (objp->obj->ccWnn.ccbuf != NULL) {
+		ccContextClear(objp->obj->ccWnn.ccbuf);
+	    }
+	}
+	objp = objp->next;
+    }
+}
+
+static void
+saveData(obj)
+CcWnnObject obj;
+{
+    wchar *wbuf;
+    int len;
+    jcConvBuf *jcbuf = obj->ccWnn.jcbuf;
+
+    len = jcbuf->kanaEnd - jcbuf->kanaBuf;
+    if (len <= 0) return;
+
+    wbuf = (wchar *)XtMalloc((len + 1) * sizeof(wchar));
+    (void)bcopy((char *)jcbuf->kanaBuf, (char *)wbuf,
+		sizeof(wchar) * (len + 1));
+    wbuf[len] = 0;
+    obj->ccWnn.pendingdata = wbuf;
+}
+
+static void
+restoreData(obj)
+CcWnnObject obj;
+{
+    wchar *wp = obj->ccWnn.pendingdata;
+
+    if (wp == NULL) return;
+
+    while (*wp != 0) {
+	jcInsertChar(obj->ccWnn.jcbuf, (int)*wp++);
+    }
+    XtFree((char *)obj->ccWnn.pendingdata);
+
+    obj->ccWnn.pendingdata = NULL;
+    obj->ccWnn.textchanged = True;
+}
+
+/* ARGSUSED */
+static void
+ioeCallback(dummy)
+XPointer dummy;
+{
+    ObjRec *objp = ObjList;
+
+    /*
+     * I/O Error callback function.
+     * Does minimum cleanup -- i.e. saving dictionaries.
+     */
+    while (objp != NULL) {
+	if (objp->obj->ccWnn.jcbuf != NULL) {
+	    jcSaveDic(objp->obj->ccWnn.jcbuf);
+	}
+	objp = objp->next;
+    }
+}
+
+static CcWnnObject
+findSelectionObj(w)
+Widget w;
+{
+    ObjRec *objp = ObjList;
+
+    while (objp != NULL) {
+	if (objp->obj->ccWnn.selwidget == w) return objp->obj;
+	objp = objp->next;
+    }
+    return NULL;
+}
+
+/* ARGSUSED */
+static int
+PreeditString(w, segn, offset, encoding, format, length, string)
+Widget w;
+int segn;
+int offset;
+Atom *encoding;
+int *format;
+int *length;
+XtPointer *string;
+{
+    CcWnnObject obj = (CcWnnObject)w;
+    jcConvBuf *jcbuf = obj->ccWnn.jcbuf;
+    jcClause *cinfo = jcbuf->clauseInfo;
+    wchar *wbuf, *wp;
+    int len, wlen;
+    extern int convJWStoCT();
+
+    if (jcbuf == NULL) return -1;
+    if (segn < jcbuf->nClause &&
+	offset >= (cinfo[segn + 1].dispp - cinfo[segn].dispp)) {
+	/* $B%;%0%a%s%H$N:G8e(B */
+	++segn;
+	offset = 0;
+    }
+    if (segn >= jcbuf->nClause ||
+	offset >= (cinfo[segn + 1].dispp - cinfo[segn].dispp)) {
+	/* $B:o=|$5$l$?(B */
+	*encoding = XA_COMPOUND_TEXT(XtDisplayOfObject(w));
+	*format = 8;
+	*length = 0;
+	*string = (XtPointer)XtMalloc(1);
+	return 0;
+    }
+
+    wlen = (cinfo[jcbuf->nClause].dispp - cinfo[segn].dispp) - offset;
+
+    /*
+     * jcbuf $B$KF~$C$F$$$kJQ49%F%-%9%H$O(B null $B%?!<%_%M!<%H$5$l$F$$$J$$$N$G(B
+     * $B$^$:%3%T!<$7$F(B null $B%?!<%_%M!<%H$9$k(B
+     */
+    wbuf = (wchar *)XtMalloc((wlen + 1) * sizeof(wchar));
+    (void)bcopy((char *)(cinfo[segn].dispp + offset), (char *)wbuf, sizeof(wchar) * wlen);
+    wbuf[wlen] = 0;
+
+    /*
+     * CcWnn $B%*%V%8%'%/%H$O(B COMPOUND_TEXT $B%(%s%3!<%G%#%s%0$7$+%5%]!<%H$7$J$$(B
+     * COMPOUND_TEXT $B$KJQ49$9$k(B
+     */
+    *encoding = XA_COMPOUND_TEXT(XtDisplayOfObject(w));
+    *format = 8;
+
+    /* COMPOUND_TEXT $B$O(B \r $B$,Aw$l$J$$$N$G(B \n $B$KJQ49$7$F$*$/(B */
+    for (wp = wbuf; *wp != 0; wp++) {
+	if (*wp == '\r') *wp = '\n';
+    }
+
+    *length = len = convJWStoCT(wbuf, (unsigned char *)NULL, 0);
+    *string = (XtPointer)XtMalloc(len + 1);
+    (void)convJWStoCT(wbuf, (unsigned char *)*string, 0);
+
+    /* wbuf $B$r(B free $B$7$F$*$/(B */
+    XtFree((char *)wbuf);
+
+    return 0;
+}
+
+/* ARGSUSED */
+static int
+StatusString(w, encoding, format, length, string, nchars)
+Widget w;
+Atom *encoding;
+int *format;
+int *length;
+XtPointer *string;
+int *nchars;
+{
+    ICString *seg;
+    wchar *wbuf, *wp;
+    int len, wlen;
+    extern int convJWStoCT();
+
+    seg = GetMode(w);
+    if (seg == NULL) {
+	*length = *nchars = 0;
+	return -1;
+    }
+
+    wlen = seg->nchars;
+    if (wlen <= 0) {
+	*length = *nchars = 0;
+	return -1;
+    }
+
+    /*
+     * data $B$KF~$C$F$$$kJQ49%F%-%9%H$O(B null $B%?!<%_%M!<%H$5$l$F$$$J$$$+$b(B
+     * $B$7$l$J$$$N$G!"$^$:%3%T!<$7$F(B null $B%?!<%_%M!<%H$9$k(B
+     */
+    wbuf = (wchar *)XtMalloc((wlen + 1) * sizeof(wchar));
+    (void)bcopy(seg->data, (char *)wbuf, sizeof(wchar) * wlen);
+    wbuf[wlen] = 0;
+
+    /*
+     * CcWnn $B%*%V%8%'%/%H$O(B COMPOUND_TEXT $B%(%s%3!<%G%#%s%0$7$+%5%]!<%H$7$J$$(B
+     * COMPOUND_TEXT $B$KJQ49$9$k(B
+     */
+    *encoding = XA_COMPOUND_TEXT(XtDisplayOfObject(w));
+    *format = 8;
+
+    /* COMPOUND_TEXT $B$O(B \r $B$,Aw$l$J$$$N$G(B \n $B$KJQ49$7$F$*$/(B */
+    for (wp = wbuf; *wp != 0; wp++) {
+	if (*wp == '\r') *wp = '\n';
+    }
+
+    *length = len = convJWStoCT(wbuf, (unsigned char *)NULL, 0);
+    *string = XtMalloc(len + 1);
+    (void)convJWStoCT(wbuf, (unsigned char *)*string, 0);
+    *nchars = seg->nchars;
+
+    /* wbuf $B$r(B free $B$7$F$*$/(B */
+    XtFree((char *)wbuf);
+
+    return 0;
+}
+
+static Boolean
+convertSelection(w, selp, targetp, typep, valp, lenp, formatp)
+Widget w;
+Atom *selp;
+Atom *targetp;
+Atom *typep;
+XtPointer *valp;
+unsigned long *lenp;
+int *formatp;
+{
+    CcWnnObject	obj = findSelectionObj(w);
+    int len;
+    char *s, *data;
+    Atom t = *targetp;
+
+    TRACE(("CcWnn:convertSelection()\n"));
+
+    if (obj == NULL) {
+	DPRINT(("CcWnn:convertSelection(): cannot find selection object\n"));
+	return False;
+    }
+
+    /* $B%+%l%s%HJ8@a$NFI$_$^$?$O4A;z$rJV$9(B */
+    if (t == CachedInternAtom(XtDisplay(w), CCWNN_YOMI_ATOM, True) ||
+	t == CachedInternAtom(XtDisplay(w), "TEXT", True)) {
+	data = obj->ccWnn.selyomi;
+    } else if (t == CachedInternAtom(XtDisplay(w), CCWNN_KANJI_ATOM, True)) {
+	data = obj->ccWnn.selkanji;
+    } else {
+	DPRINT(("CcWnn:convertSelection(): unknown target %s\n",
+		CachedGetAtomName(XtDisplay(w), t)));
+	return False;
+    }
+
+    if (data != NULL) {
+	len = strlen(data);
+	s = XtMalloc(len + 1);
+	strcpy(s, data);
+    } else {
+	len = 0;
+	s = XtMalloc(1);
+	*s = '\0';
+    }
+
+    TRACE(("CcWnn:convertSelection(): sending yomi/kanji\n"));
+    *typep = XA_COMPOUND_TEXT(XtDisplay(w));
+    *valp = (XtPointer)s;
+    *lenp = len;
+    *formatp = 8;
+    return True;
+}
+
+static void
+saveYomiAndKanji(obj)
+CcWnnObject obj;
+{
+    jcConvBuf	*jcbuf = JCBUF(obj);
+    int clnum = jcbuf->curClause;
+    jcClause *cinfo = jcbuf->clauseInfo;
+    wchar wbuf[1024];
+    int wlen;
+    int len;
+
+    TRACE(("CcWnn:saveYomiAndKanji()\n"));
+
+    if (obj->ccWnn.selyomi != NULL) {
+	XtFree(obj->ccWnn.selyomi);
+	obj->ccWnn.selyomi = NULL;
+    }
+    if (obj->ccWnn.selkanji != NULL) {
+	XtFree(obj->ccWnn.selkanji);
+	obj->ccWnn.selkanji = NULL;
+    }
+
+    /* $B%+%l%s%HJ8@a$NFI$_$H4A;z$r<hF@(B */
+    if (clnum == jcbuf->nClause) clnum--;
+    if (clnum < 0) return;
+
+    /* $BFI$_(B */
+    wlen = cinfo[clnum + 1].kanap - cinfo[clnum].kanap;
+    memcpy(wbuf, cinfo[clnum].kanap, wlen * sizeof(wchar));
+    wbuf[wlen] = 0;
+    len = convJWStoCT(wbuf, (unsigned char *)NULL, 0);
+    obj->ccWnn.selyomi = XtMalloc(len + 1);
+    convJWStoCT(wbuf, obj->ccWnn.selyomi, 0);
+
+    /* $B4A;z(B */
+    wlen = cinfo[clnum + 1].dispp - cinfo[clnum].dispp;
+    memcpy(wbuf, cinfo[clnum].dispp, wlen * sizeof(wchar));
+    wbuf[wlen] = 0;
+    len = convJWStoCT(wbuf, (unsigned char *)NULL, 0);
+    obj->ccWnn.selkanji = XtMalloc(len + 1);
+    convJWStoCT(wbuf, obj->ccWnn.selkanji, 0);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/ConvCtrl.c	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,1274 @@
+#ifndef lint
+static char *rcsid = "$Id: ConvCtrl.c,v 1.54 2001/01/10 08:51:28 ishisone Exp $";
+#endif
+/*
+ * Copyright (c) 1990  Software Research Associates, Inc.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted, provided
+ * that the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Software Research Associates not be
+ * used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission.  Software Research
+ * Associates makes no representations about the suitability of this software
+ * for any purpose.  It is provided "as is" without express or implied
+ * warranty.
+ *
+ * Author:  Makoto Ishisone, Software Research Associates, Inc., Japan
+ */
+
+#include <X11/IntrinsicP.h>
+#include <X11/StringDefs.h>
+#include <X11/Xmu/CharSet.h>
+#include "ConvCtrlP.h"
+#include "InputConv.h"
+#include "ConvDisp.h"
+#include "MyDispatch.h"
+#include "AsyncErr.h"
+
+#define DEBUG_VAR debug_ConversionControl
+#include "DebugPrint.h"
+
+static XtResource resources[] = {
+#define offset(field) XtOffset(ConversionControlWidget, ccontrol.field)
+    { XtNinputObject, XtCInputObject, XtRWidget, sizeof(Widget),
+	offset(inputobj), XtRImmediate, (XtPointer)NULL },
+    { XtNinputObjectClass, XtCInputObjectClass,
+	XtRPointer, sizeof(WidgetClass),
+	offset(inputobjclass), XtRImmediate, (XtPointer)NULL },
+    { XtNdisplayObjectClass, XtCDisplayObjectClass,
+	XtRPointer, sizeof(WidgetClass),
+	offset(displayobjclass), XtRImmediate, (XtPointer)NULL },
+    { XtNclientWindow, XtCWindow, XtRWindow, sizeof(Window),
+	offset(clientwindow), XtRImmediate, (XtPointer)None },
+    { XtNfocusWindow, XtCWindow, XtRWindow, sizeof(Window),
+	offset(focuswindow), XtRImmediate, (XtPointer)None },
+    { XtNcursor, XtCCursor, XtRCursor, sizeof(Cursor),
+	offset(cursor), XtRImmediate, (XtPointer)None },
+    { XtNeventSelectMethod, XtCEventSelectMethod,
+	XtREventSelectMethod, sizeof(EventSelectMethod),
+	offset(eventselectmethod), XtRString, (XtPointer)"none" },
+    { XtNtextEncoding, XtCTextEncoding, XtRAtom, sizeof(Atom),
+	offset(textencoding), XtRString, "COMPOUND_TEXT" },
+    { XtNtextCallback, XtCCallback, XtRCallback, sizeof(XtCallbackList),
+	offset(textcallback), XtRCallback, (XtPointer)NULL },
+    { XtNnewTextCallback, XtCCallback, XtRCallback, sizeof(XtCallbackList),
+	offset(newtextcallback), XtRCallback, (XtPointer)NULL },
+    { XtNendCallback, XtCCallback, XtRCallback, sizeof(XtCallbackList),
+	offset(endcallback), XtRCallback, (XtPointer)NULL },
+    { XtNunusedEventCallback, XtCCallback, XtRCallback, sizeof(XtCallbackList),
+	offset(unusedeventcallback), XtRCallback, (XtPointer)NULL },
+    { XtNsendbackKeyPress, XtCSendbackEvent, XtRBoolean, sizeof(Boolean),
+	offset(sendbackKeyPress), XtRString, (XtPointer)"False" },
+    { XtNtitlebarHeight, XtCTitlebarHeight, XtRDimension, sizeof(Dimension),
+	offset(titlebarheight), XtRImmediate, (XtPointer)0 },
+#undef offset
+};
+
+static void EventToInputObject();
+
+static XtActionsRec actions[] = {
+    {"to-inputobj",	EventToInputObject },
+};
+
+static char translations[] = "<Key>: to-inputobj()";
+
+static void ClassInitialize();
+static void StringToESM();
+static void ClassPartInitialize();
+static void Initialize(), Destroy();
+static void Realize();
+static void Resize();
+static Boolean SetValues();
+
+static void ConversionStartup();
+static void ConversionFinish();
+static void ChangeAttributes();
+static void ChangeFocus();
+static void TextChange();
+static void Fix();
+static void ModeChange();
+static void SelectionControl();
+static void AuxControl();
+
+static void GetClientCoordinates();
+
+static Widget CreateInputObject();
+
+static Boolean ClassIsSubClassOf();
+
+static void CaptureClientDead();
+static void InterceptClientKeyEvent();
+static void SelectFocusKeyEvent();
+static void UnselectFocusKeyEvent();
+static void ClientKey();
+static void ClientDead();
+
+static Boolean SafeGetWindowAttributes();
+static void CheckAttributes();
+static void CheckCoordinates();
+static Boolean clipRectangle();
+
+static void FixCallback();
+static void ConversionEndCallback();
+static void TextChangeCallback();
+static void ModeChangeCallback();
+static void SelectionControlCallback();
+static void AuxControlCallback();
+
+static void WidgetError(), WidgetWarning();
+
+static CompositeClassExtensionRec CompositeExtension = {
+    /* next_extension		*/	NULL,
+    /* record_type		*/	NULLQUARK,
+    /* version			*/	XtCompositeExtensionVersion,
+    /* record_size		*/	sizeof(CompositeClassExtensionRec),
+    /* accept_objects		*/	True,
+};
+
+ConversionControlClassRec conversionControlClassRec = {
+  { /* core fields */
+    /* superclass		*/	(WidgetClass) &transientShellClassRec,
+    /* class_name		*/	"ConversionControl",
+    /* widget_size		*/	sizeof(ConversionControlRec),
+    /* class_initialize		*/	ClassInitialize,
+    /* class_part_initialize	*/	ClassPartInitialize,
+    /* class_inited		*/	FALSE,
+    /* initialize		*/	Initialize,
+    /* initialize_hook		*/	NULL,
+    /* realize			*/	Realize,
+    /* actions			*/	actions,
+    /* num_actions		*/	XtNumber(actions),
+    /* resources		*/	resources,
+    /* num_resources		*/	XtNumber(resources),
+    /* xrm_class		*/	NULLQUARK,
+    /* compress_motion		*/	TRUE,
+    /* compress_exposure	*/	TRUE,
+    /* compress_enterleave	*/	TRUE,
+    /* visible_interest		*/	FALSE,
+    /* destroy			*/	Destroy,
+    /* resize			*/	Resize,
+    /* expose			*/	NULL,
+    /* set_values		*/	SetValues,
+    /* set_values_hook		*/	NULL,
+    /* set_values_almost	*/	XtInheritSetValuesAlmost,
+    /* get_values_hook		*/	NULL,
+    /* accept_focus		*/	NULL,
+    /* version			*/	XtVersion,
+    /* callback_private		*/	NULL,
+    /* tm_table			*/	translations,
+    /* query_geometry		*/	XtInheritQueryGeometry,
+    /* display_accelerator	*/	XtInheritDisplayAccelerator,
+    /* extension		*/	NULL
+  },
+  { /* composite fields */
+    /* geometry_manager		*/	XtInheritGeometryManager,
+    /* change_managed		*/	XtInheritChangeManaged,
+    /* insert_child		*/	XtInheritInsertChild,
+    /* delete_child		*/	XtInheritDeleteChild,
+    /* extension		*/	(XtPointer)&CompositeExtension,
+  },
+  { /* shell fields */
+    /* extension		*/	NULL
+  },
+  { /* wm_shell fields */
+    /* extension		*/	NULL
+  },
+  { /* vendor_shell fields */
+    /* extension		*/	NULL
+  },
+  { /* transient_shell fields */
+    /* extension		*/	NULL
+  },
+  { /* conversionControl fields */
+    /* Startup			*/	ConversionStartup,
+    /* Finish			*/	ConversionFinish,
+    /* ChangeAttributes		*/	ChangeAttributes,
+    /* ChangeFocus		*/	ChangeFocus,
+    /* TextChange		*/	TextChange,
+    /* Fix			*/	Fix,
+    /* ModeChange		*/	ModeChange,
+    /* SelectionControl		*/	SelectionControl,
+    /* AuxControl		*/	AuxControl,
+  }
+};
+
+WidgetClass conversionControlWidgetClass = (WidgetClass)&conversionControlClassRec;
+
+/* ARGSUSED */
+static void
+ClassInitialize()
+{
+    /* add String -> EventSelectionMethod converter */
+    XtAddConverter(XtRString, XtREventSelectMethod, StringToESM,
+		   (XtConvertArgList)NULL, (Cardinal)0);
+}
+
+/* ARGSUSED */
+static void
+StringToESM(args, num_args, from, to)
+XrmValue *args;
+Cardinal *num_args;
+XrmValue *from;
+XrmValue *to;
+{
+    char *s = (char *)from->addr;
+    static EventSelectMethod esm = ESMethodNone;
+
+    if (!XmuCompareISOLatin1(s, "inputonly")) {
+	esm = ESMethodInputOnly;
+    } else if (!XmuCompareISOLatin1(s, "selectfocus")) {
+	esm = ESMethodSelectFocus;
+    } else if (!XmuCompareISOLatin1(s, "none")) {
+	esm = ESMethodNone;
+    } else {
+	XtStringConversionWarning(s, XtREventSelectMethod);
+    }
+
+    to->size = sizeof(EventSelectMethod);
+    to->addr = (caddr_t)&esm;
+}
+
+static void
+ClassPartInitialize(cl)
+WidgetClass cl;
+{
+    ConversionControlWidgetClass class = (ConversionControlWidgetClass)cl;
+    ConversionControlWidgetClass super = (ConversionControlWidgetClass)class->core_class.superclass;
+
+#define ccclass conversionControl_class
+    if (class->ccclass.Startup == XtInheritStartup) {
+	class->ccclass.Startup = super->ccclass.Startup;
+    }
+    if (class->ccclass.Finish == XtInheritFinish) {
+	class->ccclass.Finish = super->ccclass.Finish;
+    }
+    if (class->ccclass.ChangeAttributes == XtInheritChangeAttributes) {
+	class->ccclass.ChangeAttributes = super->ccclass.ChangeAttributes;
+    }
+    if (class->ccclass.ChangeFocus == XtInheritChangeFocus) {
+	class->ccclass.ChangeFocus = super->ccclass.ChangeFocus;
+    }
+    if (class->ccclass.TextChange == XtInheritTextChange) {
+	class->ccclass.TextChange = super->ccclass.TextChange;
+    }
+    if (class->ccclass.Fix == XtInheritFix) {
+	class->ccclass.Fix = super->ccclass.Fix;
+    }
+    if (class->ccclass.ModeChange == XtInheritModeChange) {
+	class->ccclass.ModeChange = super->ccclass.ModeChange;
+    }
+    if (class->ccclass.SelectionControl == XtInheritSelectionControl) {
+	class->ccclass.SelectionControl = super->ccclass.SelectionControl;
+    }
+    if (class->ccclass.AuxControl == XtInheritAuxControl) {
+	class->ccclass.AuxControl = super->ccclass.AuxControl;
+    }
+#undef ccclass
+}
+
+/* ARGSUSED */
+static void
+Initialize(req, new, args, num_args)
+Widget req;
+Widget new;
+ArgList args;
+Cardinal *num_args;
+{
+    ConversionControlWidget ccw = (ConversionControlWidget)new;
+
+    /*
+     * check inputobj/inputobjclass resource
+     */
+
+    if (ccw->ccontrol.inputobj == NULL) {
+	/* if inputobj not specified, inputobjclass must be specified */
+	if (ccw->ccontrol.inputobjclass == NULL) {
+	    WidgetError(new, "noResourceError", "inputObjectClass",
+			"either inputObject or inputObjectClass must be specified at creation time");
+	} else if (!ClassIsSubClassOf(ccw->ccontrol.inputobjclass,
+				      inputConvObjectClass)) {
+	    WidgetError(new, "classError", "inputObjectClass",
+			"inputObjectClass must be subclass of inputConvObjectClass");
+	}
+	(void)CreateInputObject(ccw);
+	ccw->ccontrol.createinputobj = True;
+
+    } else if (!XtIsSubclass(ccw->ccontrol.inputobj, inputConvObjectClass)) {
+	WidgetError(new, "classError", "inputObject",
+		    "inputObject must be subclass of inputConvObjectClass");
+    }
+
+    if (ccw->ccontrol.displayobjclass == NULL) {
+	WidgetError(new, "noResourceError", "displayObjectClass",
+		    "displayObjectClass must be specified");
+    } else if (!ClassIsSubClassOf(ccw->ccontrol.displayobjclass,
+				  convDisplayObjectClass)) {
+	WidgetError(new, "classError", "displayObjectClass",
+		    "displayObjectClass must be subclass of convDisplayObjectClass");
+    }
+
+    ccw->ccontrol.active = False;
+    ccw->ccontrol.oldclientwindow = None;
+    ccw->ccontrol.probewindow = None;
+}
+
+static void
+Destroy(w)
+Widget w;
+{
+    ConversionControlWidget ccw = (ConversionControlWidget)w;
+    Display *dpy = XtDisplay(w);
+
+    if (ccw->ccontrol.active == False) return;
+
+    if (ccw->ccontrol.clientwindow != None) {
+	MyRemoveAllEventHandler(dpy, ccw->ccontrol.clientwindow);
+    }
+
+    if (ccw->ccontrol.probewindow != None) {
+	MyRemoveAllEventHandler(dpy, ccw->ccontrol.probewindow);
+	XDestroyWindow(dpy, ccw->ccontrol.probewindow);
+    }
+}
+
+static void
+Realize(w, maskp, attr)
+Widget w;
+XtValueMask *maskp;
+XSetWindowAttributes *attr;
+{
+    ConversionControlWidget ccw = (ConversionControlWidget)w;
+
+    if (ccw->ccontrol.cursor != None) {
+	attr->cursor = ccw->ccontrol.cursor;
+	*maskp |= CWCursor;
+    }
+
+    /* call super class's realize function */
+    (*conversionControlWidgetClass->core_class.superclass->core_class.realize)(w, maskp, attr);
+}
+
+static void
+Resize(w)
+Widget w;
+{
+    ConversionControlWidget ccw = (ConversionControlWidget)w;
+    Widget child;
+    int i;
+
+    TRACE(("ConversionControl:Resize()\n"));
+
+    /* ignore non-widgets */
+    for (i = 0; i < ccw->composite.num_children; i++) {
+	child = ccw->composite.children[i];
+	if (XtIsWidget(child) && child->core.managed) {
+	    XtResizeWidget(child, ccw->core.width, ccw->core.height,
+			   child->core.border_width);
+	}
+    }
+}
+
+/* ARGSUSED */
+static Boolean
+SetValues(cur, req, wid, args, num_args)
+Widget cur;
+Widget req;
+Widget wid;
+ArgList args;
+Cardinal *num_args;
+{
+    ConversionControlWidget old = (ConversionControlWidget)cur;
+    ConversionControlWidget new = (ConversionControlWidget)wid;
+
+    if (new->ccontrol.active) {
+	if (old->ccontrol.inputobj != new->ccontrol.inputobj) {
+	    WidgetWarning(wid, "setValuesError", "inputObject",
+			  "inputObject resource can't be changed during conversion");
+	    new->ccontrol.inputobj = old->ccontrol.inputobj;	/* restore */
+	}
+	if (old->ccontrol.eventselectmethod != new->ccontrol.eventselectmethod) {
+	    WidgetWarning(wid, "setValuesError", "eventSelectionMethod",
+			  "eventSelectionMethod resource can't be changed during conversion");
+	    new->ccontrol.eventselectmethod = old->ccontrol.eventselectmethod; /* restore */
+	}
+    }
+
+    if (new->ccontrol.clientwindow != old->ccontrol.clientwindow ||
+	new->ccontrol.focuswindow != old->ccontrol.focuswindow) {
+	WidgetWarning(wid, "setValuesError", "clientWindow",
+		      "clientWindow and focusWindow resources are read-only");
+	new->ccontrol.clientwindow = old->ccontrol.clientwindow; /* restore */
+	new->ccontrol.focuswindow = old->ccontrol.focuswindow; /* restore */
+    }
+
+    if (new->ccontrol.cursor != old->ccontrol.cursor && XtIsRealized(wid)) {
+	XDefineCursor(XtDisplay(wid), XtWindow(wid), new->ccontrol.cursor);
+    }
+
+    return False;
+}
+
+/* ARGSUSED */
+static void
+ConversionStartup(w, mask, value)
+Widget w;
+unsigned long mask;
+ConversionAttributes *value;
+{
+    /* do nothing */
+}
+
+/* ARGSUSED */
+static void
+ConversionFinish(w)
+Widget w;
+{
+    /* do nothing */
+}
+
+/* ARGSUSED */
+static void
+ChangeAttributes(w, mask, value)
+Widget w;
+unsigned long mask;
+ConversionAttributes *value;
+{
+    /* do nothing */
+}
+
+/* ARGSUSED */
+static void
+ChangeFocus(w, set)
+Widget w;
+int set;
+{
+    /* do nothing */
+}
+
+/* ARGSUSED */
+static void
+TextChange(w)
+Widget w;
+{
+    /* do nothing */
+}
+
+/* ARGSUSED */
+static void
+Fix(w, arg)
+Widget w;
+CCTextCallbackArg *arg;
+{
+    ConversionControlWidget ccw = (ConversionControlWidget)w;
+
+    XtCallCallbackList((Widget)ccw, ccw->ccontrol.textcallback,
+		       (XtPointer)arg);
+}
+
+/* ARGSUSED */
+static void
+ModeChange(w)
+Widget w;
+{
+    /* do nothing */
+}
+
+/* ARGSUSED */
+static void
+SelectionControl(w, controlarg)
+Widget w;
+ICSelectionControlArg *controlarg;
+{
+    /* do nothing */
+}
+
+/* ARGSUSED */
+static void
+AuxControl(w, controlarg)
+Widget w;
+ICAuxControlArg *controlarg;
+{
+    /* do nothing */
+}
+
+/*
+ * public functions
+ */
+
+void
+CControlStartConversion(w, clientwindow, valuemask, value)
+Widget w;
+Window clientwindow;
+unsigned long valuemask;
+ConversionAttributes *value;
+{
+    ConversionControlWidget ccw = (ConversionControlWidget)w;
+    ConversionControlWidgetClass class = (ConversionControlWidgetClass)w->core.widget_class;
+
+    TRACE(("CControlStartConversion(clientwindow=%lx)\n", clientwindow));
+    if (ccw->ccontrol.active) {
+	WidgetWarning(w, "busyError", "CControlStartConversion",
+		      "is busy. can't start conversion");
+	return;
+    }
+    if (clientwindow == None) {
+	/* ouch */
+	WidgetWarning(w, "dataError", "cControlStartConversion",
+		     "clientWindow not specified. can't start conversion.");
+	return;
+    }
+
+    /* check clientWindow's existance */
+    if (!SafeGetWindowAttributes(XtDisplay(w), clientwindow,
+				 &(ccw->ccontrol.client_attr))) {
+	WidgetWarning(w, "badWindowError", "clientWindow",
+		      "clientWindow does not exist. can't start conversion.");
+	return;
+    }
+
+    ICClearConversion(ccw->ccontrol.inputobj);
+    ccw->ccontrol.notext = ICNumSegments(ccw->ccontrol.inputobj) == 0;
+
+    ccw->ccontrol.active = True;
+    ccw->ccontrol.clientwindow = clientwindow;
+
+    /* check given attributes */
+    CheckAttributes(ccw, &valuemask, value);
+
+    if (valuemask & CAFocusWindow) {
+	ccw->ccontrol.focuswindow = value->focuswindow;
+    } else {
+	ccw->ccontrol.focuswindow = clientwindow;
+	ccw->ccontrol.focus_attr = ccw->ccontrol.client_attr;
+    }
+
+    if (ccw->ccontrol.eventselectmethod == ESMethodInputOnly) {
+	InterceptClientKeyEvent(ccw);
+    } else if (ccw->ccontrol.eventselectmethod == ESMethodSelectFocus) {
+	SelectFocusKeyEvent(ccw);
+    }
+
+    CheckCoordinates(ccw, &valuemask, value, 1);
+
+    GetClientCoordinates(ccw);
+
+    CaptureClientDead(ccw);
+
+    XtAddCallback(ccw->ccontrol.inputobj,
+		  XtNfixNotify, FixCallback, (XtPointer)ccw);
+    XtAddCallback(ccw->ccontrol.inputobj,
+		  XtNendNotify, ConversionEndCallback, (XtPointer)ccw);
+    XtAddCallback(ccw->ccontrol.inputobj,
+		  XtNtextChangeNotify, TextChangeCallback, (XtPointer)ccw);
+    XtAddCallback(ccw->ccontrol.inputobj,
+		  XtNmodeChangeNotify, ModeChangeCallback, (XtPointer)ccw);
+    XtAddCallback(ccw->ccontrol.inputobj,
+		  XtNselectionControl, SelectionControlCallback,
+		  (XtPointer)ccw);
+    XtAddCallback(ccw->ccontrol.inputobj,
+		  XtNauxControl, AuxControlCallback,
+		  (XtPointer)ccw);
+
+    /* call input style dependent startup */
+    (*class->conversionControl_class.Startup)(w, valuemask, value);
+}
+
+void
+CControlEndConversion(w)
+Widget w;
+{
+    ConversionControlWidget ccw = (ConversionControlWidget)w;
+    ConversionControlWidgetClass class = (ConversionControlWidgetClass)w->core.widget_class;
+    Display *dpy = XtDisplay(w);
+
+    if (!ccw->ccontrol.active) {
+	WidgetWarning(w, "busyError", "cControlEndConversion",
+		      "is not active. can't stop conversion");
+	return;
+    }
+
+    XtRemoveCallback(ccw->ccontrol.inputobj,
+		     XtNfixNotify, FixCallback, (XtPointer)ccw);
+    XtRemoveCallback(ccw->ccontrol.inputobj,
+		     XtNendNotify, ConversionEndCallback, (XtPointer)ccw);
+    XtRemoveCallback(ccw->ccontrol.inputobj,
+		     XtNtextChangeNotify, TextChangeCallback, (XtPointer)ccw);
+    XtRemoveCallback(ccw->ccontrol.inputobj,
+		     XtNmodeChangeNotify, ModeChangeCallback, (XtPointer)ccw);
+    XtRemoveCallback(ccw->ccontrol.inputobj,
+		     XtNselectionControl, SelectionControlCallback,
+		     (XtPointer)ccw);
+    XtRemoveCallback(ccw->ccontrol.inputobj,
+		     XtNauxControl, AuxControlCallback,
+		     (XtPointer)ccw);
+
+    ICClearConversion(ccw->ccontrol.inputobj);
+
+    MyRemoveEventHandler(dpy, ccw->ccontrol.clientwindow, DestroyNotify,
+			 ClientDead, (XtPointer)ccw);
+
+    if (ccw->ccontrol.probewindow != None) {
+	MyRemoveAllEventHandler(dpy, ccw->ccontrol.probewindow);
+	XDestroyWindow(dpy, ccw->ccontrol.probewindow);
+	ccw->ccontrol.probewindow = None;
+    }
+
+    /* unselect focuswindow events */
+    if (ccw->ccontrol.eventselectmethod == ESMethodSelectFocus) {
+	UnselectFocusKeyEvent(ccw);
+    }
+
+    ccw->ccontrol.active = False;
+
+    /* call input style dependent finish */
+    (*class->conversionControl_class.Finish)(w);
+
+    ccw->ccontrol.oldclientwindow = ccw->ccontrol.clientwindow;
+    ccw->ccontrol.clientwindow = None;
+}
+
+void
+CControlChangeAttributes(w, valuemask, value)
+Widget w;
+unsigned long valuemask;
+ConversionAttributes *value;
+{
+    ConversionControlWidget ccw = (ConversionControlWidget)w;
+    ConversionControlWidgetClass class = (ConversionControlWidgetClass)w->core.widget_class;
+
+    if (!ccw->ccontrol.active) {
+	WidgetWarning(w, "busyError", "cControlChangeAttributes",
+		      "is not active. can't change attributes");
+	return;
+    }
+
+    CheckAttributes(ccw, &valuemask, value);
+    CheckCoordinates(ccw, &valuemask, value, 0);
+
+    if (valuemask == 0L) return;
+
+    if (valuemask & CAFocusWindow) {
+	if (ccw->ccontrol.eventselectmethod == ESMethodSelectFocus) {
+	    UnselectFocusKeyEvent(ccw);
+	}
+	ccw->ccontrol.focuswindow = value->focuswindow;
+	if (ccw->ccontrol.eventselectmethod == ESMethodSelectFocus) {
+	    SelectFocusKeyEvent(ccw);
+	}
+    }
+
+    (*class->conversionControl_class.ChangeAttributes)(w, valuemask, value);
+}
+
+void
+CControlChangeFocus(w, set)
+Widget w;
+int set;
+{
+    ConversionControlWidget ccw = (ConversionControlWidget)w;
+    ConversionControlWidgetClass class = (ConversionControlWidgetClass)w->core.widget_class;
+
+    if (!ccw->ccontrol.active) {
+	WidgetWarning(w, "busyError", "cControlChangeFocus",
+		      "is not active. can't change focus");
+	return;
+    }
+
+    (*class->conversionControl_class.ChangeFocus)(w, set);
+}
+
+static Boolean
+SafeGetWindowAttributes(dpy, w, attr)
+Display *dpy;
+Window w;
+XWindowAttributes *attr;
+{
+    XAEHandle h;
+    unsigned long errbits = 0;
+
+    h = XAESetRecordErrors(dpy, &errbits);
+    (void)XGetWindowAttributes(dpy, w, attr);
+    XAEUnset(h);
+
+    return (errbits == 0);
+}
+
+static void
+CheckAttributes(ccw, valuemaskp, value)
+ConversionControlWidget ccw;
+unsigned long *valuemaskp;
+ConversionAttributes *value;
+{
+    Display *dpy = XtDisplay((Widget)ccw);
+    XAEHandle h;
+    unsigned long ebits = 0;
+
+#define CHECKATTRS (CAFocusWindow|CAColormap|CACursor|CABackgroundPixmap)
+    if ((*valuemaskp & CHECKATTRS) == 0) return;
+#undef CHECKATTRS
+
+#define XERROR(e)	(ebits & (1 << (e)))
+
+    h = XAESetRecordErrors(dpy, &ebits);
+
+    if (*valuemaskp & (CAColormap|CACursor|CABackgroundPixmap)) {
+	XSetWindowAttributes attr;
+	Window w;
+
+	w = XCreateSimpleWindow(dpy, ccw->ccontrol.clientwindow,
+				0, 0, 1, 1, 0, 0L, 0L);
+
+	if (*valuemaskp & CACursor) {
+	    /* BadCursor */
+	    attr.cursor = value->cursor;
+	    XChangeWindowAttributes(dpy, w, CWCursor, &attr);
+	}
+	if (*valuemaskp & CAColormap) {
+	    /* BadMatch or BadColormap */
+	    attr.colormap = value->colormap;
+	    XChangeWindowAttributes(dpy, w, CWColormap, &attr);
+	}
+	if (*valuemaskp & CABackgroundPixmap) {
+	    /* BadMatch or BadPixmap */
+	    attr.background_pixmap = value->background_pixmap;
+	    XChangeWindowAttributes(dpy, w, CWBackPixmap, &attr);
+	}
+
+	XDestroyWindow(dpy, w);
+    }
+    if (*valuemaskp & CAFocusWindow) {
+	(void)XGetWindowAttributes(dpy, value->focuswindow,
+				   &(ccw->ccontrol.focus_attr));
+    } else {
+	XSync(dpy, False);
+    }
+    XAEUnset(h);
+
+    if ((*valuemaskp & CAFocusWindow) && XERROR(BadWindow)) {
+	WidgetWarning((Widget)ccw, "badWindowError", "focusWindow",
+		      "focusWindow does not exist.");
+	*valuemaskp &= ~CAFocusWindow;
+    }
+    if ((*valuemaskp & CAColormap) && XERROR(BadColor)) {
+	WidgetWarning((Widget)ccw, "badColorError", "colormap",
+		      "invalid colormap ID.");
+	*valuemaskp &= ~CAColormap;
+    }
+    if ((*valuemaskp & CAColormap) && XERROR(BadMatch)) {
+	WidgetWarning((Widget)ccw, "badMatchError", "colormap",
+		      "invalid colormap.");
+	*valuemaskp &= ~CAColormap;
+    }
+    if ((*valuemaskp & CABackgroundPixmap) && XERROR(BadPixmap)) {
+	WidgetWarning((Widget)ccw, "badPixmapError", "backgroundPixmap",
+		      "invalid pixmap ID.");
+	*valuemaskp &= ~CABackgroundPixmap;
+    }
+    if ((*valuemaskp & CABackgroundPixmap) && XERROR(BadMatch)) {
+	WidgetWarning((Widget)ccw, "badMatchError", "backgroundPixmap",
+		      "invalid pixmap for background.");
+	*valuemaskp &= ~CABackgroundPixmap;
+    }
+    if ((*valuemaskp & CACursor) && XERROR(BadCursor)) {
+	WidgetWarning((Widget)ccw, "badCursorError", "cursor",
+		      "invalid cursor ID.");
+	*valuemaskp &= ~CACursor;
+    }
+#undef XERROR
+}
+
+static void
+CheckCoordinates(ccw, valuemaskp, value, clip)
+ConversionControlWidget ccw;
+unsigned long *valuemaskp;
+ConversionAttributes *value;
+int clip;
+{
+#define INVALIDRECT(r) (r.width == 0 || r.height == 0)
+    if ((*valuemaskp & CAClientArea) &&
+	(INVALIDRECT(value->clientarea) ||
+	 (clip && !clipRectangle(&value->clientarea, &ccw->ccontrol.client_attr)))) {
+	DPRINT(("CheckCoordinates: invalid ClientArea\n"));
+	*valuemaskp &= ~CAClientArea;
+    }
+    if ((*valuemaskp & CAStatusArea) &&
+	(INVALIDRECT(value->statusarea) ||
+	 (clip && !clipRectangle(&value->statusarea, &ccw->ccontrol.client_attr)))) {
+	DPRINT(("CheckCoordinates: invalid StatusArea\n"));
+	*valuemaskp &= ~CAStatusArea;
+    }
+#undef INVALIDRECT
+}
+
+static Boolean
+clipRectangle(rectp, attrp)
+register XRectangle *rectp;
+register XWindowAttributes *attrp;
+{
+    register int z0, z1, e;
+
+    z0 = rectp->x; z1 = z0 + rectp->width; e = attrp->width;
+    if (z0 == z1) z1 = e;		/* if (rectp->width == 0)... */
+    if (z0 >= e || z1 <= 0) return False;
+    if (z0 < 0) z0 = 0;
+    if (z1 > e) z1 = e;
+    rectp->x = z0; rectp->width = z1 - z0;
+
+    z0 = rectp->y; z1 = z0 + rectp->height; e = attrp->height;
+    if (z0 == z1) z1 = e;		/* if (rectp->height == 0)... */
+    if (z0 >= e || z1 <= 0) return False;
+    if (z0 < 0) z0 = 0;
+    if (z1 > e) z1 = e;
+    rectp->y = z0; rectp->height = z1 - z0;
+
+    return True;
+}
+
+static void
+GetClientCoordinates(ccw)
+ConversionControlWidget ccw;
+{
+    Display *dpy = XtDisplay(ccw);
+    Window root = RootWindowOfScreen(XtScreen(ccw));
+    Window win = ccw->ccontrol.clientwindow;
+    Window junk;
+    int rootx, rooty;
+
+    if (!XTranslateCoordinates(dpy, win, root, 0, 0, &rootx, &rooty, &junk)) {
+	WidgetWarning((Widget)ccw, "windowError", "differentRoot",
+		      "clientWindow and conversion widget have different root. this should not happen!");
+	rootx = rooty = 0;
+    }
+
+    ccw->ccontrol.client_rootx = rootx;
+    ccw->ccontrol.client_rooty = rooty;
+}
+
+/* ARGSUSED */
+static void
+EventToInputObject(w, event, args, num_args)
+Widget w;
+XEvent *event;
+String *args;
+Cardinal *num_args;
+{
+    ConversionControlWidget ccw = (ConversionControlWidget)w;
+    Boolean hascallback = False;
+    int r;
+#ifdef OBSOLETE_FEATURE
+    Boolean sendback = False;
+#endif
+
+    if (ccw->ccontrol.inputobj == NULL) return;
+
+    ccw->ccontrol.endnotify = False;
+
+    if (ccw->ccontrol.unusedeventcallback != NULL &&
+	XtHasCallbacks(w, XtNunusedEventCallback) == XtCallbackHasSome) {
+	hascallback = True;
+    }
+
+#ifdef OBSOLETE_FEATURE
+    /*
+     * a cheap little hack -- sending back unused events
+     *
+     * if user set some callback on XtNunusedEventCallback, we call
+     * the callback functions on 'unused' KeyPress events.
+     * 
+     * otherwise, if the resource XtNsendbackKeyPress is true, we
+     * attempt to send 'unused' KeyPress events back to the client.
+     *
+     * we call callbacks  or send an event back to the client when
+     * following conditions are satisfied:
+     *    + it is a KeyPress event AND
+     *    + the number of segments is 0 before the conversion object
+     *      processes it AND
+     *    + the number of segments remains 0 after processing AND
+     *    + none of the modeChangeNotify, selectionControl, endNotify and
+     *      fixNofity callbacks are called during processing
+     * it is intentional to exclude textChangeNotify callback from
+     * above condition, because this callback is often called even if
+     * the text doesn't change actually. so we use the condition that
+     * the number of segments remains 0 instead.
+     */
+
+    if ((hascallback ||ccw->ccontrol.sendbackKeyPress) &&
+	event->type == KeyPress &&
+	ICNumSegments(ccw->ccontrol.inputobj) == 0) {
+	sendback = True;
+    }
+
+    ccw->ccontrol.eventused = False;
+
+    if ((r = ICInputEvent(ccw->ccontrol.inputobj, event)) == 1 ||
+	(sendback && !ccw->ccontrol.eventused &&
+	 ICNumSegments(ccw->ccontrol.inputobj) == 0)) {
+#else
+    /*
+     * Above feature is obsolete.  Now it is the input object's
+     * responsibility to decide whether the event should be
+     * sent back to the client or not.
+     */
+    if ((r = ICInputEvent(ccw->ccontrol.inputobj, event)) == 1) {
+#endif
+
+	/* event isn't used */
+	if (hascallback) {
+	    TRACE(("call XtNunusedEventCallback\n"));
+	    XtCallCallbackList(w, ccw->ccontrol.unusedeventcallback,
+			       (XtPointer)event);
+	} else if (ccw->ccontrol.sendbackKeyPress) {
+	    Window savewin;
+	    Window savesubwin;
+	    
+	    TRACE(("sendback event to window 0x%lx\n", ccw->ccontrol.focuswindow));
+	    savewin = event->xkey.window;
+	    savesubwin = event->xkey.subwindow;
+	    event->xkey.window = ccw->ccontrol.focuswindow;
+	    event->xkey.subwindow = None;
+
+	    /*
+	     * here we use NoEventMask as the eventmask, not
+	     * KeyPressMask.  that means the event will be sent only
+	     * to the client who created the destination window.
+	     */
+	    XSendEvent(XtDisplay(w), event->xkey.window,
+		       False, NoEventMask, event);
+
+	    event->xkey.window = savewin;	/* restore */
+	    event->xkey.subwindow = savesubwin;	/* restore */
+	}
+    }
+
+    if (r < 0 || ccw->ccontrol.endnotify) {
+	CControlEndConversion(w);
+	XtCallCallbackList(w, ccw->ccontrol.endcallback, (XtPointer)False);
+    }
+}
+
+
+/*
+ * sub-widget creation
+ */
+
+static Widget
+CreateInputObject(ccw)
+ConversionControlWidget ccw;
+{
+    Widget inputobj;
+    Arg args[1];
+
+    XtSetArg(args[0], XtNdisplayObjectClass, ccw->ccontrol.displayobjclass);
+    inputobj = XtCreateWidget("inputObj", ccw->ccontrol.inputobjclass,
+			      (Widget)ccw, args, 1);
+    ccw->ccontrol.inputobj = inputobj;
+
+    return inputobj;
+}
+
+static Boolean
+ClassIsSubClassOf(class, reference)
+WidgetClass class;
+WidgetClass reference;
+{
+    while (class != NULL) {
+	if (class == reference) return True;
+	class = class->core_class.superclass;
+    }
+    return False;
+}
+
+static void
+CaptureClientDead(ccw)
+ConversionControlWidget ccw;
+{
+    Display *dpy = XtDisplay(ccw);
+    Window win = ccw->ccontrol.clientwindow;
+
+    MyAddEventHandler(dpy, win, DestroyNotify, StructureNotifyMask,
+		      ClientDead, (XtPointer)ccw);
+}
+
+static void
+InterceptClientKeyEvent(ccw)
+ConversionControlWidget ccw;
+{
+    Display *dpy = XtDisplay(ccw);
+    Window win = ccw->ccontrol.clientwindow;
+    Window probe;
+
+    TRACE(("InterceptClientKeyEvent()\n"));
+    probe = XCreateWindow(dpy, win, 0, 0, 9999, 9999, 0, 0,
+			  InputOnly, (Visual *)CopyFromParent,
+			  0L, (XSetWindowAttributes *)NULL);
+    TRACE(("\tprobewindow = %lx\n", probe));
+
+    MyAddEventHandler(dpy, probe, KeyPress, KeyPressMask,
+		      ClientKey, (XtPointer)ccw);
+    MyAddEventHandler(dpy, probe, KeyRelease, KeyReleaseMask,
+		      ClientKey, (XtPointer)ccw);
+
+    ccw->ccontrol.probewindow = probe;
+
+    XMapWindow(dpy, probe);
+}
+
+static void
+SelectFocusKeyEvent(ccw)
+ConversionControlWidget ccw;
+{
+    Display *dpy = XtDisplay(ccw);
+    Window win = ccw->ccontrol.focuswindow;
+
+    MyAddEventHandler(dpy, win, KeyPress, KeyPressMask,
+		      ClientKey, (XtPointer)ccw);
+    MyAddEventHandler(dpy, win, KeyRelease, KeyReleaseMask,
+		      ClientKey, (XtPointer)ccw);
+}
+
+static void
+UnselectFocusKeyEvent(ccw)
+ConversionControlWidget ccw;
+{
+    Display *dpy = XtDisplay(ccw);
+    Window win = ccw->ccontrol.focuswindow;
+
+    MyRemoveEventHandler(dpy, win, KeyPress, ClientKey, (XtPointer)ccw);
+    MyRemoveEventHandler(dpy, win, KeyRelease, ClientKey, (XtPointer)ccw);
+}
+
+static void
+ClientKey(ev, data)
+XEvent *ev;
+XtPointer data;
+{
+    Widget w = (Widget)data;
+    Cardinal num_params = 0;
+
+    EventToInputObject(w, ev, (String *)NULL, &num_params);
+}
+
+static void
+ClientDead(ev, data)
+XEvent *ev;
+XtPointer data;
+{
+    ConversionControlWidget ccw = (ConversionControlWidget)data;
+    ConversionControlWidgetClass class = (ConversionControlWidgetClass)ccw->core.widget_class;
+
+    if (ev->type != DestroyNotify ||
+	ev->xdestroywindow.window != ccw->ccontrol.clientwindow) return;
+
+    /*
+     * Client window is destroyed.
+     */
+
+    /* remove all event handlers */
+    MyRemoveAllEventHandler(XtDisplay(ccw), ccw->ccontrol.clientwindow);
+    if (ccw->ccontrol.probewindow != None) {
+	/* no need to destroy probewindow. it's already destroyed. */
+	MyRemoveAllEventHandler(XtDisplay(ccw), ccw->ccontrol.probewindow);
+    }
+    if (ccw->ccontrol.eventselectmethod == ESMethodSelectFocus &&
+	ccw->ccontrol.focuswindow != ccw->ccontrol.clientwindow) {
+	MyRemoveAllEventHandler(XtDisplay(ccw), ccw->ccontrol.focuswindow);
+    }
+
+    ccw->ccontrol.oldclientwindow = ccw->ccontrol.clientwindow;
+    ccw->ccontrol.clientwindow = None;
+    ccw->ccontrol.focuswindow = None;
+    ccw->ccontrol.probewindow = None;
+    ccw->ccontrol.active = False;
+
+    XtRemoveCallback(ccw->ccontrol.inputobj,
+		     XtNfixNotify, FixCallback, (XtPointer)ccw);
+    XtRemoveCallback(ccw->ccontrol.inputobj,
+		     XtNendNotify, ConversionEndCallback, (XtPointer)ccw);
+    XtRemoveCallback(ccw->ccontrol.inputobj,
+		     XtNtextChangeNotify, TextChangeCallback, (XtPointer)ccw);
+    XtRemoveCallback(ccw->ccontrol.inputobj,
+		     XtNmodeChangeNotify, ModeChangeCallback, (XtPointer)ccw);
+    XtRemoveCallback(ccw->ccontrol.inputobj,
+		     XtNselectionControl, SelectionControlCallback,
+		     (XtPointer)ccw);
+    XtRemoveCallback(ccw->ccontrol.inputobj,
+		     XtNauxControl, AuxControlCallback,
+		     (XtPointer)ccw);
+
+    /* call input style dependent finish */
+    (*class->conversionControl_class.Finish)((Widget)ccw);
+
+    /* clear conversion object */
+    ICClearConversion(ccw->ccontrol.inputobj);
+
+    ccw->ccontrol.oldclientwindow = None;
+    XtCallCallbackList((Widget)ccw, ccw->ccontrol.endcallback, (XtPointer)True);
+}
+
+/* ARGSUSED */
+static void
+FixCallback(w, client_data, call_data)
+Widget w;
+XtPointer client_data;
+XtPointer call_data;
+{
+    Widget widget = (Widget)client_data;
+    ConversionControlWidget ccw = (ConversionControlWidget)widget;
+    ConversionControlWidgetClass class = (ConversionControlWidgetClass)widget->core.widget_class;
+    Atom encoding = ccw->ccontrol.textencoding;
+    int format;
+    int length;
+    XtPointer text;
+    CCTextCallbackArg arg;
+
+    ccw->ccontrol.eventused = True;
+
+    if (ICGetConvertedString(w, &encoding, &format, &length, &text) < 0) {
+	return;
+    }
+    arg.encoding = encoding;
+    arg.format = format;
+    arg.length = length;
+    arg.text = text;
+
+    (*class->conversionControl_class.Fix)(widget, &arg);
+
+    XtFree(text);
+}
+
+/* ARGSUSED */
+static void
+ConversionEndCallback(w, client_data, call_data)
+Widget w;
+XtPointer client_data;
+XtPointer call_data;
+{
+    ConversionControlWidget ccw = (ConversionControlWidget)client_data;
+
+    ccw->ccontrol.eventused = True;
+    ccw->ccontrol.endnotify = True;
+}
+
+/* ARGSUSED */
+static void
+TextChangeCallback(w, client_data, call_data)
+Widget w;
+XtPointer client_data;
+XtPointer call_data;
+{
+    Widget widget = (Widget)client_data;
+    ConversionControlWidget ccw = (ConversionControlWidget)widget;
+    ConversionControlWidgetClass class = (ConversionControlWidgetClass)widget->core.widget_class;
+    int nsegs = ICNumSegments(ccw->ccontrol.inputobj);
+
+    /*
+     * don't do:
+     *	ccw->ccontrol.eventused = True;
+     * because this callback is often called even if
+     * the text didn't change actually.
+     */
+
+    /*
+     * when num-segments changed from 0 to 1 (or more),
+     * call new-text calllback
+     */
+    if (ccw->ccontrol.notext && nsegs > 0) {
+	XtCallCallbackList((Widget)ccw, ccw->ccontrol.newtextcallback,
+			   (XtPointer)w);
+    }
+    ccw->ccontrol.notext = nsegs == 0;
+
+    (*class->conversionControl_class.TextChange)(widget);
+}
+
+/* ARGSUSED */
+static void
+ModeChangeCallback(w, client_data, call_data)
+Widget w;
+XtPointer client_data;
+XtPointer call_data;
+{
+    Widget widget = (Widget)client_data;
+    ConversionControlWidget ccw = (ConversionControlWidget)widget;
+    ConversionControlWidgetClass class = (ConversionControlWidgetClass)widget->core.widget_class;
+
+    ccw->ccontrol.eventused = True;
+
+    (*class->conversionControl_class.ModeChange)(widget);
+}
+
+/* ARGSUSED */
+static void
+SelectionControlCallback(w, client_data, call_data)
+Widget w;
+XtPointer client_data;
+XtPointer call_data;
+{
+    Widget widget = (Widget)client_data;
+    ConversionControlWidget ccw = (ConversionControlWidget)widget;
+    ConversionControlWidgetClass class = (ConversionControlWidgetClass)widget->core.widget_class;
+    ICSelectionControlArg *arg = (ICSelectionControlArg *)call_data;
+
+    ccw->ccontrol.eventused = True;
+
+    (*class->conversionControl_class.SelectionControl)(widget, arg);
+}
+
+/* ARGSUSED */
+static void
+AuxControlCallback(w, client_data, call_data)
+Widget w;
+XtPointer client_data;
+XtPointer call_data;
+{
+    Widget widget = (Widget)client_data;
+    ConversionControlWidget ccw = (ConversionControlWidget)widget;
+    ConversionControlWidgetClass class = (ConversionControlWidgetClass)widget->core.widget_class;
+    ICAuxControlArg *arg = (ICAuxControlArg *)call_data;
+
+    ccw->ccontrol.eventused = True;
+
+    (*class->conversionControl_class.AuxControl)(widget, arg);
+}
+
+static void
+WidgetError(w, name, type, msg)
+Widget w;
+String name;
+String type;
+String msg;
+{
+    char buf[512];
+    String params[1];
+    Cardinal num_params;
+
+    params[0] = XtClass(w)->core_class.class_name;
+    num_params = 1;
+
+    (void)sprintf(buf, "%%s: %s", msg);
+
+    XtAppErrorMsg(XtWidgetToApplicationContext(w),
+		  name, type, "WidgetError", buf, params, &num_params);
+}
+
+static void
+WidgetWarning(w, name, type, msg)
+Widget w;
+String name;
+String type;
+String msg;
+{
+    char buf[512];
+    String params[1];
+    Cardinal num_params;
+
+    params[0] = XtClass(w)->core_class.class_name;
+    num_params = 1;
+
+    (void)sprintf(buf, "%%s: %s", msg);
+
+    XtAppWarningMsg(XtWidgetToApplicationContext(w),
+		    name, type, "WidgetError", buf, params, &num_params);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/ConvDisp.c	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,538 @@
+#ifndef lint
+static char *rcsid = "$Id: ConvDisp.c,v 1.19 1992/08/05 01:51:35 ishisone Rel $";
+#endif
+/*
+ * Copyright (c) 1990  Software Research Associates, Inc.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted, provided
+ * that the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Software Research Associates not be
+ * used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission.  Software Research
+ * Associates makes no representations about the suitability of this software
+ * for any purpose.  It is provided "as is" without express or implied
+ * warranty.
+ *
+ * Author:  Makoto Ishisone, Software Research Associates, Inc., Japan
+ */
+
+#include <X11/IntrinsicP.h>
+#include <X11/StringDefs.h>
+#include <X11/Xmu/Atoms.h>
+#include <X11/Xmu/Converters.h>
+#include "CachedAtom.h"
+#include "ConvDispP.h"
+
+#define DEBUG_VAR debug_ConvDisplay
+#include "DebugPrint.h"
+
+static XtResource resources[] = {
+#define offset(field) XtOffset(ConvDisplayObject, convDisplay.field)
+    { XtNforeground, XtCForeground, XtRPixel, sizeof (Pixel),
+	offset(foreground), XtRString, XtDefaultForeground },
+    { XtNbackground, XtCBackground, XtRPixel, sizeof (Pixel),
+	offset(background), XtRString, XtDefaultBackground },
+    { XtNcursorBitmap, XtCCursorBitmap, XtRBitmap, sizeof (Pixmap),
+	offset(cursor), XtRImmediate, None },
+    { XtNhotX, XtCHotX, XtRPosition, sizeof (Position),
+	offset(hotx), XtRString, "3" },
+    { XtNhotY, XtCHotY, XtRPosition, sizeof (Position),
+	offset(hoty), XtRString, "2" },
+#undef offset
+};
+
+static void ClassInitialize();
+static void ClassPartInitialize();
+
+static void Initialize();
+static void Destroy();
+static Boolean SetValues();
+
+static Pixmap DefaultCursor();
+static void GetGC();
+static void ComputeBounds();
+
+static int StringWidth();
+static int LineHeight();
+static void DrawString();
+static int MaxChar();
+static void DrawCursor();
+static void GetCursorBounds();
+static void SetFonts();
+
+ConvDisplayClassRec convDisplayClassRec = {
+  { /* object fields */
+    /* superclass		*/	(WidgetClass) &objectClassRec,
+    /* class_name		*/	"ConvDisplay",
+    /* widget_size		*/	sizeof(ConvDisplayRec),
+    /* class_initialize		*/	ClassInitialize,
+    /* class_part_initialize	*/	ClassPartInitialize,
+    /* class_inited		*/	FALSE,
+    /* initialize		*/	Initialize,
+    /* initialize_hook		*/	NULL,
+    /* obj1			*/	NULL,
+    /* obj2			*/	NULL,
+    /* obj3			*/	0,
+    /* resources		*/	resources,
+    /* num_resources		*/	XtNumber(resources),
+    /* xrm_class		*/	NULLQUARK,
+    /* obj4			*/	FALSE,
+    /* obj5			*/	FALSE,
+    /* obj6			*/	FALSE,
+    /* obj7			*/	FALSE,
+    /* destroy			*/	Destroy,
+    /* obj8			*/	NULL,
+    /* obj9			*/	NULL,
+    /* set_values		*/	SetValues,
+    /* set_values_hook		*/	NULL,
+    /* obj10			*/	NULL,
+    /* get_values_hook		*/	NULL,
+    /* obj11			*/	NULL,
+    /* version			*/	XtVersion,
+    /* callback_private		*/	NULL,
+    /* obj12			*/	NULL,
+    /* obj13			*/	NULL,
+    /* obj14			*/	NULL,
+    /* extension		*/	NULL
+  },
+  { /* convDisplay fields */
+    /* StringWidth		*/	StringWidth,
+    /* LineHeight		*/	LineHeight,
+    /* DrawString		*/	DrawString,
+    /* MaxChar			*/	MaxChar,
+    /* DrawCursor		*/	DrawCursor,
+    /* GetCursorBounds		*/	GetCursorBounds,
+    /* SetFonts			*/	SetFonts,
+  }
+};
+
+WidgetClass convDisplayObjectClass = (WidgetClass)&convDisplayClassRec;
+
+static void
+ClassInitialize()
+{
+    static XtConvertArgRec screenConvertArg[] = {
+        { XtBaseOffset, (caddr_t) XtOffset(Widget, core.screen),
+	   sizeof(Screen *) }
+    };
+
+    /* add string->bitmap converter (for insert-cursor) */
+    XtAddConverter("String", "Bitmap", XmuCvtStringToBitmap,
+                   screenConvertArg, XtNumber(screenConvertArg));
+}
+
+static void
+ClassPartInitialize(cl)
+WidgetClass cl;
+{
+    ConvDisplayObjectClass class = (ConvDisplayObjectClass)cl;
+    ConvDisplayObjectClass super = (ConvDisplayObjectClass)class->object_class.superclass;
+    ConvDisplayClassPart *classpart = &(class->convDisplay_class);
+    ConvDisplayClassPart *superpart = &(super->convDisplay_class);
+
+    if (classpart->StringWidth == XtInheritStringWidth)
+	classpart->StringWidth = superpart->StringWidth;
+    if (classpart->LineHeight == XtInheritLineHeight)
+	classpart->LineHeight = superpart->LineHeight;
+    if (classpart->DrawString == XtInheritDrawString)
+	classpart->DrawString = superpart->DrawString;
+    if (classpart->MaxChar == XtInheritMaxChar)
+	classpart->MaxChar = superpart->MaxChar;
+    if (classpart->DrawCursor == XtInheritDrawCursor)
+	classpart->DrawCursor = superpart->DrawCursor;
+    if (classpart->GetCursorBounds == XtInheritGetCursorBounds)
+	classpart->GetCursorBounds = superpart->GetCursorBounds;
+    if (classpart->SetFonts == XtInheritSetFonts)
+	classpart->SetFonts = superpart->SetFonts;
+}
+
+/* ARGSUSED */
+static void
+Initialize(req, new, args, num_args)
+Widget req;
+Widget new;
+ArgList args;
+Cardinal *num_args;
+{
+    ConvDisplayObject obj = (ConvDisplayObject)new;
+
+    if (obj->convDisplay.cursor == None) {
+	obj->convDisplay.cursor = DefaultCursor(obj);
+	obj->convDisplay.cursorcreated = True;
+    } else {
+	obj->convDisplay.cursorcreated = False;
+    }
+    obj->convDisplay.cursorvisible = False;
+    GetGC(obj);
+    ComputeBounds(obj);
+}
+
+static void
+Destroy(w)
+Widget w;
+{
+    ConvDisplayObject obj = (ConvDisplayObject)w;
+
+    XtReleaseGC(w, obj->convDisplay.cursorgc);
+    if (obj->convDisplay.cursorcreated == True) {
+	XFreePixmap(XtDisplayOfObject(w), obj->convDisplay.cursor);
+    }
+}
+
+/* ARGSUSED */
+static Boolean
+SetValues(cur, req, wid, args, num_args)
+Widget cur;
+Widget req;
+Widget wid;
+ArgList args;
+Cardinal *num_args;
+{
+    ConvDisplayObject new = (ConvDisplayObject)wid;
+    ConvDisplayObject old = (ConvDisplayObject)cur;
+
+    if (new->convDisplay.foreground != old->convDisplay.foreground ||
+	new->convDisplay.background != old->convDisplay.background) {
+	XtReleaseGC(wid, old->convDisplay.cursorgc);
+	GetGC(new);
+    }
+
+    if (new->convDisplay.cursor != old->convDisplay.cursor ||
+	new->convDisplay.hotx != old->convDisplay.hotx ||
+	new->convDisplay.hoty != old->convDisplay.hoty) {
+	if (new->convDisplay.cursor != old->convDisplay.cursor &&
+	    old->convDisplay.cursorcreated) {
+	    XFreePixmap(XtDisplayOfObject(wid), old->convDisplay.cursor);
+	    new->convDisplay.cursorcreated = False;
+	}
+	ComputeBounds(new);
+    }
+
+    return False;
+}
+
+static Pixmap
+DefaultCursor(obj)
+ConvDisplayObject obj;
+{
+    static char default_bits[] = { 0x0c, 0x0c, 0x1e, 0x3f, 0x33 };
+    return XCreateBitmapFromData(XtDisplayOfObject((Widget)obj),
+				 RootWindowOfScreen(XtScreenOfObject((Widget)obj)),
+				 default_bits,
+				 6, 5);
+}
+
+static void
+GetGC(obj)
+ConvDisplayObject obj;
+{
+    XtGCMask mask = GCFunction|GCForeground|GCBackground;
+    XGCValues values;
+
+    values.function = GXxor;
+    values.foreground = obj->convDisplay.foreground ^ obj->convDisplay.background;
+    values.background = 0;
+    obj->convDisplay.cursorgc = XtGetGC((Widget)obj, mask, &values);
+}
+
+static void
+ComputeBounds(obj)
+ConvDisplayObject obj;
+{
+    unsigned int width, height;
+    Window junkroot;
+    int junkx, junky;
+    unsigned int junkbw, junkdepth;
+
+    if (obj->convDisplay.cursor == None ||
+	!XGetGeometry(XtDisplayOfObject((Widget)obj), obj->convDisplay.cursor,
+		      &junkroot, &junkx, &junky, &width, &height,
+		      &junkbw, &junkdepth)) {
+	obj->convDisplay.cursor = None;
+	width = height = 0;
+    }
+    obj->convDisplay.cursorbounds.width = width;
+    obj->convDisplay.cursorbounds.height = height;
+    obj->convDisplay.cursorbounds.x = -obj->convDisplay.hotx;
+    obj->convDisplay.cursorbounds.y = -obj->convDisplay.hoty;
+}
+
+/* ARGSUSED */
+static int
+StringWidth(w, str, start, end)
+Widget w;
+ICString *str;
+int start;
+int end;
+{
+    XtAppError(XtWidgetToApplicationContext(w),
+	       "ConvDisplay Object: StringWidth function isn't defined.");
+    return 0;	/* for lint */
+}
+
+/* ARGSUSED */
+static int
+LineHeight(w, ascentp)
+Widget w;
+Position *ascentp;
+{
+    XtAppError(XtWidgetToApplicationContext(w),
+	       "ConvDisplay Object: LineHeight function isn't defined.");
+    return 0;	/* for lint */
+}
+
+/* ARGSUSED */
+static void
+DrawString(w, canvas, str, start, end, x, y)
+Widget w;
+Widget canvas;
+ICString *str;
+int start;
+int end;
+int x;
+int y;
+{
+    XtAppError(XtWidgetToApplicationContext(w),
+	       "ConvDisplay Object: DrawString function isn't defined.");
+}
+
+/* ARGSUSED */
+static int
+MaxChar(w, str, start, width)
+Widget w;
+ICString *str;
+int start;
+int width;
+{
+    XtAppError(XtWidgetToApplicationContext(w),
+	       "ConvDisplay Object: MaxChar function isn't defined.");
+    return 0;	/* for lint */
+}
+
+static void
+DrawCursor(w, canvas, x, y, on)
+Widget w;
+Widget canvas;
+int x;
+int y;
+int on;
+{
+    ConvDisplayObject obj = (ConvDisplayObject)w;
+
+    if (!XtIsRealized(canvas) ||
+	obj->convDisplay.cursor == None ||
+	(obj->convDisplay.cursorvisible && on) ||
+	(!obj->convDisplay.cursorvisible && !on)) {
+	obj->convDisplay.cursorvisible = (on != 0);
+	return;
+    }
+
+    XCopyPlane(XtDisplay(canvas),
+	       obj->convDisplay.cursor, XtWindow(canvas),
+	       obj->convDisplay.cursorgc,
+	       0, 0,
+	       obj->convDisplay.cursorbounds.width,
+	       obj->convDisplay.cursorbounds.height,
+	       x + obj->convDisplay.cursorbounds.x,
+	       y + obj->convDisplay.cursorbounds.y,
+	       1L);
+    obj->convDisplay.cursorvisible = (on != 0);
+}
+
+static void
+GetCursorBounds(w, bounds)
+Widget w;
+XRectangle *bounds;
+{
+    ConvDisplayObject obj = (ConvDisplayObject)w;
+
+     bounds->x = obj->convDisplay.cursorbounds.x;
+     bounds->y = obj->convDisplay.cursorbounds.y;
+     bounds->width = obj->convDisplay.cursorbounds.width;
+     bounds->height = obj->convDisplay.cursorbounds.height;
+}
+
+/* ARGSUSED */
+static void
+SetFonts(w, fonts, num_fonts)
+Widget w;
+XFontStruct **fonts;
+Cardinal num_fonts;
+{
+    XtAppError(XtWidgetToApplicationContext(w),
+	       "ConvDisplay Object: SetFonts function isn't defined.");
+}
+
+
+/*
+ * public functions
+ */
+
+int
+CDStringWidth(w, str, start, end)
+Widget w;
+ICString *str;
+int start;
+int end;
+{
+    ConvDisplayObjectClass class = (ConvDisplayObjectClass)w->core.widget_class;
+
+    XtCheckSubclass(w, convDisplayObjectClass, "CDStringWidth()");
+    return (*class->convDisplay_class.StringWidth)(w, str, start, end);
+}
+
+int
+CDLineHeight(w, ascent)
+Widget w;
+Position *ascent;
+{
+    ConvDisplayObjectClass class = (ConvDisplayObjectClass)w->core.widget_class;
+
+    XtCheckSubclass(w, convDisplayObjectClass, "CDLineHeight()");
+    return (*class->convDisplay_class.LineHeight)(w, ascent);
+}
+
+void
+CDDrawString(w, canvas, str, start, end, x, y)
+Widget w;
+Widget canvas;
+ICString *str;
+int start;
+int end;
+int x;
+int y;
+{
+    ConvDisplayObjectClass class = (ConvDisplayObjectClass)w->core.widget_class;
+
+    XtCheckSubclass(w, convDisplayObjectClass, "CDDrawString()");
+    (*class->convDisplay_class.DrawString)(w, canvas, str, start, end, x, y);
+}
+
+int
+CDMaxChar(w, str, start, width)
+Widget w;
+ICString *str;
+int start;
+int width;
+{
+    ConvDisplayObjectClass class = (ConvDisplayObjectClass)w->core.widget_class;
+
+    XtCheckSubclass(w, convDisplayObjectClass, "CDMaxChar()");
+    return (*class->convDisplay_class.MaxChar)(w, str, start, width);
+}
+
+void
+CDDrawCursor(w, canvas, x, y, on)
+Widget w;
+Widget canvas;
+int x;
+int y;
+int on;
+{
+    ConvDisplayObjectClass class = (ConvDisplayObjectClass)w->core.widget_class;
+
+    XtCheckSubclass(w, convDisplayObjectClass, "CDDrawCursor()");
+    (*class->convDisplay_class.DrawCursor)(w, canvas, x, y, on);
+}
+
+void
+CDGetCursorBounds(w, bounds)
+Widget w;
+XRectangle *bounds;
+{
+    ConvDisplayObjectClass class = (ConvDisplayObjectClass)w->core.widget_class;
+
+    XtCheckSubclass(w, convDisplayObjectClass, "CDGetCursorBounds()");
+    (*class->convDisplay_class.GetCursorBounds)(w, bounds);
+}
+
+void
+CDSetFonts(w, fonts, num_fonts)
+Widget w;
+XFontStruct **fonts;
+Cardinal num_fonts;
+{
+    ConvDisplayObjectClass class = (ConvDisplayObjectClass)w->core.widget_class;
+
+    XtCheckSubclass(w, convDisplayObjectClass, "CDSetFonts()");
+    (*class->convDisplay_class.SetFonts)(w, fonts, num_fonts);
+}
+
+
+void
+CDSetBlockCursor(w, shape)
+Widget w;
+XRectangle *shape;
+{
+    ConvDisplayObject obj = (ConvDisplayObject)w;
+    Display *dpy = XtDisplayOfObject((Widget)obj);
+    Pixmap block;
+    GC tmpgc;
+    XGCValues values;
+
+    XtCheckSubclass(w, convDisplayObjectClass, "CDMakeBlockCursor()");
+
+    block = XCreatePixmap(dpy,
+			  RootWindowOfScreen(XtScreenOfObject((Widget)obj)),
+			  shape->width, shape->height, 1);
+
+    values.function = GXset;
+    tmpgc = XtGetGC(w, GCFunction, &values);
+    XFillRectangle(dpy, block, tmpgc, 0, 0, shape->width, shape->height);
+    XtReleaseGC(w, tmpgc);
+
+    XtVaSetValues(w,
+		  XtNcursorBitmap, block,
+		  XtNhotX, -shape->x,
+		  XtNhotY, -shape->y,
+		  NULL);
+}
+
+
+/*
+ * semi-public function (for subclass use)
+ */
+
+int
+_CDPickupFonts(widget, fontspecs, num_specs, fonts, num_fonts)
+Widget widget;
+FontSpec *fontspecs;
+Cardinal num_specs;
+XFontStruct **fonts;
+Cardinal num_fonts;
+{
+    Display *dpy = XtDisplayOfObject(widget);
+    Atom cs_reg = CachedInternAtom(dpy, "CHARSET_REGISTRY", False);
+    Atom cs_enc = CachedInternAtom(dpy, "CHARSET_ENCODING", False);
+    Atom atom;
+    Cardinal i, j;
+    FontSpec *fsp;
+    int npick;
+
+    DPRINT(("_CDPickupFonts()\n"));
+
+    /* pickup fonts */
+    npick = 0;
+    for (i = 0, fsp = fontspecs; i < num_specs; i++, fsp++) {
+	DPRINT(("\tlooking for a font..."));
+
+	fsp->font = NULL;
+	for (j = 0; j < num_fonts; j++) {
+	    if (fonts[j] != NULL &&
+		XGetFontProperty(fonts[j], cs_reg, (unsigned long *)&atom) &&
+		atom == fsp->registry &&
+		XGetFontProperty(fonts[j], cs_enc, (unsigned long *)&atom) &&
+		atom == fsp->encoding) {
+		DPRINT((" found"));
+		fsp->font = fonts[j];
+		npick++;
+		break;
+	    }
+	}
+	DPRINT(("\n"));
+    }
+
+    return npick;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/ConvMgr.c	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,356 @@
+#ifndef lint
+static char *rcsid = "$Id: ConvMgr.c,v 1.8 1991/10/14 06:40:01 ishisone Rel $";
+#endif
+/*
+ * Copyright (c) 1990  Software Research Associates, Inc.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted, provided
+ * that the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Software Research Associates not be
+ * used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission.  Software Research
+ * Associates makes no representations about the suitability of this software
+ * for any purpose.  It is provided "as is" without express or implied
+ * warranty.
+ *
+ * Author:  Makoto Ishisone, Software Research Associates, Inc., Japan
+ */
+
+#include <X11/IntrinsicP.h>
+#include <X11/StringDefs.h>
+#include "ConvMgrP.h"
+#include "InputConv.h"
+#include "ConvCtrl.h"
+
+static void Initialize(), Destroy();
+
+static Screen *getScreen();
+static ConverterRec *newConverter();
+static InputObjRec *getInputObjRec();
+static InputObjRec *newInputObj();
+static Boolean isSomeoneBusy();
+
+static CompositeClassExtensionRec CompositeExtension = {
+    /* next_extension		*/	NULL,
+    /* record_type		*/	NULLQUARK,
+    /* version			*/	XtCompositeExtensionVersion,
+    /* record_size		*/	sizeof(CompositeClassExtensionRec),
+    /* accept_objects		*/	True,
+};
+
+ConversionManagerClassRec conversionManagerClassRec = {
+  { /* core fields */
+    /* superclass		*/	(WidgetClass) &compositeClassRec,
+    /* class_name		*/	"ConversionManager",
+    /* widget_size		*/	sizeof(ConversionManagerRec),
+    /* class_initialize		*/	NULL,
+    /* class_part_initialize	*/	NULL,
+    /* class_inited		*/	FALSE,
+    /* initialize		*/	Initialize,
+    /* initialize_hook		*/	NULL,
+    /* realize			*/	XtInheritRealize,
+    /* actions			*/	NULL,
+    /* num_actions		*/	0,
+    /* resources		*/	NULL,
+    /* num_resources		*/	0,
+    /* xrm_class		*/	NULLQUARK,
+    /* compress_motion		*/	TRUE,
+    /* compress_exposure	*/	TRUE,
+    /* compress_enterleave	*/	TRUE,
+    /* visible_interest		*/	FALSE,
+    /* destroy			*/	Destroy,
+    /* resize			*/	NULL,
+    /* expose			*/	NULL,
+    /* set_values		*/	NULL,
+    /* set_values_hook		*/	NULL,
+    /* set_values_almost	*/	XtInheritSetValuesAlmost,
+    /* get_values_hook		*/	NULL,
+    /* accept_focus		*/	NULL,
+    /* version			*/	XtVersion,
+    /* callback_private		*/	NULL,
+    /* tm_table			*/	NULL,
+    /* query_geometry		*/	XtInheritQueryGeometry,
+    /* display_accelerator	*/	XtInheritDisplayAccelerator,
+    /* extension		*/	NULL
+  },
+  { /* composite fields */
+    /* geometry_manager		*/	NULL,
+    /* change_managed		*/	NULL,
+    /* insert_child		*/	XtInheritInsertChild,
+    /* delete_child		*/	XtInheritDeleteChild,
+    /* extension		*/	(XtPointer)&CompositeExtension,
+  },
+  { /* conversionmanager fields */
+    /* empty			*/	0
+  }
+};
+
+WidgetClass conversionManagerWidgetClass = (WidgetClass)&conversionManagerClassRec;
+
+/* ARGSUSED */
+static void
+Initialize(req, new, args, num_args)
+Widget req;
+Widget new;
+ArgList args;
+Cardinal *num_args;
+{
+    ConversionManagerWidget cmw = (ConversionManagerWidget)new;
+
+    cmw->convmgr.converterlist = NULL;
+    cmw->convmgr.inputobjlist = NULL;
+}
+
+static void
+Destroy(w)
+Widget w;
+{
+    ConversionManagerWidget cmw = (ConversionManagerWidget)w;
+    ConverterRec *clist = cmw->convmgr.converterlist;
+    ConverterRec *crp;
+    InputObjRec *ilist = cmw->convmgr.inputobjlist;
+    InputObjRec *iorp;
+
+    while (clist != NULL) {
+	crp = clist->next;
+	XtFree((char *)clist);
+	clist = crp;
+    }
+    while (ilist != NULL) {
+	if (ilist->inputobj != NULL) XtDestroyWidget(ilist->inputobj);
+	iorp = ilist->next;
+	XtFree((char *)ilist);
+	ilist = iorp;
+    }
+}
+
+static Screen *
+getScreen(dpy, win)
+Display *dpy;
+Window win;
+{
+    Window root;
+    int reqx, reqy;
+    unsigned int reqwidth, reqheight, reqborder, junk;
+    int i;
+
+    /* get root window */
+    XGetGeometry(dpy, win, &root, &reqx, &reqy,
+		 &reqwidth, &reqheight, &reqborder, &junk);
+
+    /* get screen of the root window */
+    for (i = 0; i < ScreenCount(dpy); i++) {
+	if (root == RootWindow(dpy, i)) return ScreenOfDisplay(dpy, i);
+    }
+
+    return NULL;
+}
+
+static ConverterRec *
+newConverter(cmw, screen, converterclass, inputobjclass, displayobjclass)
+ConversionManagerWidget cmw;
+Screen *screen;
+WidgetClass converterclass;
+WidgetClass inputobjclass;
+WidgetClass displayobjclass;
+{
+    Arg args[5];
+    int i;
+    ConverterRec *crp;
+    InputObjRec *iorp;
+
+    crp = XtNew(ConverterRec);
+    crp->busy = False;
+    crp->converterclass = converterclass;
+    crp->inputobjclass = inputobjclass;
+    crp->displayobjclass = displayobjclass;
+    crp->screen = screen;
+
+    if ((iorp = getInputObjRec(cmw, inputobjclass)) == NULL) {
+	iorp = newInputObj(cmw, inputobjclass, displayobjclass);
+    }
+
+    i = 0;
+    if (screen != XtScreen((Widget)cmw)) {
+	XtSetArg(args[i], XtNscreen, screen); i++;
+	XtSetArg(args[i], XtNdepth, DefaultDepthOfScreen(screen)); i++;
+	XtSetArg(args[i], XtNcolormap, DefaultColormapOfScreen(screen)); i++;
+    }
+    if (iorp->inputobj != NULL) {
+	XtSetArg(args[i], XtNinputObject, iorp->inputobj); i++;
+    } else {
+	XtSetArg(args[i], XtNinputObjectClass, inputobjclass); i++;
+    }
+    XtSetArg(args[i], XtNdisplayObjectClass, displayobjclass); i++;
+
+    crp->converter = XtCreatePopupShell("converter", converterclass,
+					(Widget)cmw, args, i);
+
+    /* insert it to the list */
+    crp->next = cmw->convmgr.converterlist;
+    cmw->convmgr.converterlist = crp;
+
+    return crp;
+}
+
+static InputObjRec *
+getInputObjRec(cmw, objclass)
+ConversionManagerWidget cmw;
+WidgetClass objclass;
+{
+    InputObjRec *iorp = cmw->convmgr.inputobjlist;
+
+    while (iorp != NULL) {
+	if (iorp->inputobjclass == objclass) return iorp;
+	iorp = iorp->next;
+    }
+    return NULL;
+}
+
+static InputObjRec *
+newInputObj(cmw, objclass, dispobjclass)
+ConversionManagerWidget cmw;
+WidgetClass objclass;
+WidgetClass dispobjclass;
+{
+    InputObjRec *iorp;
+
+    iorp = XtNew(InputObjRec);
+    iorp->inputobjclass = objclass;
+    if (!ICSupportMultipleObjects(objclass)) {
+	Arg args[1];
+
+	XtSetArg(args[0], XtNdisplayObjectClass, dispobjclass);
+	iorp->inputobj = XtCreateWidget("convObject", objclass,
+					(Widget)cmw, args, 1);
+    } else {
+	iorp->inputobj = NULL;
+    }
+
+    iorp->next = cmw->convmgr.inputobjlist;
+    cmw->convmgr.inputobjlist = iorp;
+    return iorp;
+}
+
+static Boolean
+isSomeoneBusy(clist, objclass)
+ConverterRec *clist;
+WidgetClass objclass;
+{
+    while (clist != NULL) {
+	if (clist->inputobjclass == objclass && clist->busy) return True;
+	clist = clist->next;
+    }
+    return False;
+}
+
+
+/*
+ * public functions
+ */
+
+void
+CMPrepareConverter(w, screen, converterclass, inputobjclass, displayobjclass)
+Widget w;
+Screen *screen;
+WidgetClass converterclass;
+WidgetClass inputobjclass;
+WidgetClass displayobjclass;
+{
+    XtCheckSubclass(w, conversionManagerWidgetClass, "CMPrepareConverter()");
+    (void)newConverter((ConversionManagerWidget)w, screen,
+		       converterclass, inputobjclass, displayobjclass);
+}
+
+Widget
+CMGetConverter(w, client, converterclass, inputobjclass, displayobjclass)
+Widget w;
+Window client;
+WidgetClass converterclass;
+WidgetClass inputobjclass;
+WidgetClass displayobjclass;
+{
+    ConversionManagerWidget cmw = (ConversionManagerWidget)w;
+    ConverterRec *clist = cmw->convmgr.converterlist;
+    ConverterRec *crp;
+    InputObjRec *iorp;
+    Screen *scr;
+
+    XtCheckSubclass(w, conversionManagerWidgetClass, "CMGetConverter()");
+
+    if ((iorp = getInputObjRec(cmw, inputobjclass)) == NULL) {
+	iorp = newInputObj(cmw, inputobjclass, displayobjclass);
+    } else if (iorp->inputobj != NULL && isSomeoneBusy(clist, inputobjclass)) {
+	return NULL;
+    }
+    
+    if ((scr = getScreen(XtDisplay(w), client)) == NULL) {
+	String params[1];
+	Cardinal num_params;
+
+	params[0] = XtClass(w)->core_class.class_name;
+	num_params = 1;
+	XtAppWarningMsg(XtWidgetToApplicationContext(w),
+			"parameterError", "cannotGetScreen", "WidgetError",
+			"%s: CMGetConverter() cannot get screen of specified client window",
+			params, &num_params);
+	return NULL;
+    }
+
+    while (clist != NULL) {
+	if (!clist->busy &&
+	    clist->screen == scr &&
+	    clist->converterclass == converterclass &&
+	    clist->inputobjclass == inputobjclass &&
+	    clist->displayobjclass == displayobjclass) {
+	    /* found */
+	    clist->busy = True;
+	    return clist->converter;
+	}
+	clist = clist->next;
+    }
+
+    crp = newConverter(cmw, scr, converterclass,
+		       inputobjclass, displayobjclass);
+    crp->busy = True;
+    return crp->converter;
+}
+
+void
+CMReleaseConverter(w, converter)
+Widget w;
+Widget converter;
+{
+    ConversionManagerWidget cmw = (ConversionManagerWidget)w;
+    ConverterRec *clist = cmw->convmgr.converterlist;
+    String params[1];
+    Cardinal num_params;
+
+    XtCheckSubclass(w, conversionManagerWidgetClass, "CMReleaseConverter()");
+
+    while (clist != NULL) {
+	if (clist->converter == converter) {
+	    if (!clist->busy) {
+		params[0] = XtClass(w)->core_class.class_name;
+		num_params = 1;
+		XtAppWarningMsg(XtWidgetToApplicationContext(w),
+				"parameterError", "converterNotBusy",
+				"WidgetError",
+				"%s: CMReleaseConverter() converter isn't used",
+				params, &num_params);
+	    }
+	    clist->busy = False;
+	    return;
+	}
+	clist = clist->next;
+    }
+
+    params[0] = XtClass(w)->core_class.class_name;
+    num_params = 1;
+    XtAppWarningMsg(XtWidgetToApplicationContext(w),
+		    "parameterError", "noSuchConverter", "WidgetError",
+		    "%s: CMReleaseConverter() no such converter",
+		    params, &num_params);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/ICLabel.c	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,365 @@
+#ifndef lint
+static char *rcsid = "$Id: ICLabel.c,v 1.11 1991/09/23 04:01:20 ishisone Rel $";
+#endif
+/*
+ * Copyright (c) 1990  Software Research Associates, Inc.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted, provided
+ * that the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Software Research Associates not be
+ * used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission.  Software Research
+ * Associates makes no representations about the suitability of this software
+ * for any purpose.  It is provided "as is" without express or implied
+ * warranty.
+ *
+ * Author:  Makoto Ishisone, Software Research Associates, Inc., Japan
+ */
+
+#include <X11/IntrinsicP.h>
+#include <X11/StringDefs.h>
+#include <X11/Xmu/Converters.h>
+#if XtSpecificationRelease > 4
+#include <X11/Xfuncs.h>
+#endif
+#include "ICLabelP.h"
+#include "ConvDisp.h"
+
+static XtResource resources[] = {
+#define offset(field) XtOffset(ICLabelWidget, iclabel.field)
+    { XtNhorizontalSpacing, XtCSpacing, XtRDimension, sizeof(Dimension),
+	offset(hspace), XtRString, "1" },
+    { XtNverticalSpacing, XtCSpacing, XtRDimension, sizeof(Dimension),
+	offset(vspace), XtRString, "1" },
+    { XtNlabel, XtCLabel, XtRPointer, sizeof(ICString*),
+	offset(label), XtRImmediate, NULL },
+    { XtNjustify, XtCJustify, XtRJustify, sizeof(XtJustify),
+	offset(justify), XtRImmediate, (XtPointer)XtJustifyCenter },
+    { XtNcursor, XtCCursor, XtRCursor, sizeof(Cursor),
+	offset(cursor), XtRImmediate, (XtPointer)None },
+#undef offset
+};
+
+static void ClassInitialize();
+static void Initialize(), Destroy();
+static void Realize();
+static void Redisplay();
+static Boolean SetValues();
+static XtGeometryResult QueryGeometry();
+static void InsertChild();
+
+static void computeSize();
+static ICString *copyString();
+static void freeString();
+
+static CompositeClassExtensionRec CompositeExtension = {
+    /* next_extension		*/	NULL,
+    /* record_type		*/	NULLQUARK,
+    /* version			*/	XtCompositeExtensionVersion,
+    /* record_size		*/	sizeof(CompositeClassExtensionRec),
+    /* accept_objects		*/	True,
+};
+
+ICLabelClassRec icLabelClassRec = {
+  { /* core fields */
+    /* superclass		*/	(WidgetClass) &compositeClassRec,
+    /* class_name		*/	"ICLabel",
+    /* widget_size		*/	sizeof(ICLabelRec),
+    /* class_initialize		*/	ClassInitialize,
+    /* class_part_initialize	*/	NULL,
+    /* class_inited		*/	FALSE,
+    /* initialize		*/	Initialize,
+    /* initialize_hook		*/	NULL,
+    /* realize			*/	Realize,
+    /* actions			*/	NULL,
+    /* num_actions		*/	0,
+    /* resources		*/	resources,
+    /* num_resources		*/	XtNumber(resources),
+    /* xrm_class		*/	NULLQUARK,
+    /* compress_motion		*/	TRUE,
+    /* compress_exposure	*/	TRUE,
+    /* compress_enterleave	*/	TRUE,
+    /* visible_interest		*/	FALSE,
+    /* destroy			*/	Destroy,
+    /* resize			*/	NULL,
+    /* expose			*/	Redisplay,
+    /* set_values		*/	SetValues,
+    /* set_values_hook		*/	NULL,
+    /* set_values_almost	*/	XtInheritSetValuesAlmost,
+    /* get_values_hook		*/	NULL,
+    /* accept_focus		*/	NULL,
+    /* version			*/	XtVersion,
+    /* callback_private		*/	NULL,
+    /* tm_table			*/	NULL,
+    /* query_geometry		*/	QueryGeometry,
+    /* display_accelerator	*/	XtInheritDisplayAccelerator,
+    /* extension		*/	NULL
+  },
+  { /* composite fields */
+    /* geometry_manager		*/	NULL,
+    /* change_managed		*/	NULL,
+    /* insert_child		*/	InsertChild,
+    /* delete_child		*/	XtInheritDeleteChild,
+    /* extension		*/	(XtPointer)&CompositeExtension,
+  },
+  { /* iclabel fields */
+    /* empty			*/	0
+  }
+};
+
+WidgetClass icLabelWidgetClass = (WidgetClass)&icLabelClassRec;
+
+static void
+ClassInitialize()
+{
+    XtAddConverter(XtRString, XtRJustify, XmuCvtStringToJustify, NULL, 0);
+}
+
+/* ARGSUSED */
+static void
+Initialize(req, new, args, num_args)
+Widget req;
+Widget new;
+ArgList args;
+Cardinal *num_args;
+{
+    ICLabelWidget iclw = (ICLabelWidget)new;
+
+    if (iclw->iclabel.label != NULL) {
+	iclw->iclabel.label = copyString(iclw->iclabel.label);
+    }
+    iclw->iclabel.width = 0;
+}
+
+static void
+Destroy(w)
+Widget w;
+{
+    ICLabelWidget iclw = (ICLabelWidget)w;
+
+    if (iclw->iclabel.label != NULL) freeString(iclw->iclabel.label);
+}
+
+static void
+Realize(w, maskp, attr)
+Widget w;
+XtValueMask *maskp;
+XSetWindowAttributes *attr;
+{
+    ICLabelWidget iclw = (ICLabelWidget)w;
+
+    if (iclw->iclabel.cursor != None) {
+	*maskp |= CWCursor;
+	attr->cursor = iclw->iclabel.cursor;
+    }
+    (*icLabelWidgetClass->core_class.superclass->core_class.realize)(w, maskp, attr);
+}
+
+/* ARGSUSED */
+static void
+Redisplay(w, ev, region)
+Widget w;
+XEvent *ev;
+Region region;
+{
+    ICLabelWidget iclw = (ICLabelWidget)w;
+    Widget dispobj = iclw->iclabel.displayobj;
+    int x, y;
+
+    if (iclw->iclabel.label == NULL || iclw->iclabel.displayobj == NULL) return;
+
+    switch (iclw->iclabel.justify) {
+    case XtJustifyLeft:
+	x = iclw->iclabel.hspace;
+	break;
+    case XtJustifyRight:
+	x = iclw->core.width - (iclw->iclabel.vspace + iclw->iclabel.width);
+	break;
+    case XtJustifyCenter:
+    default:
+	x = (iclw->core.width - iclw->iclabel.width) / 2;
+	break;
+    }
+    y = (iclw->core.height - iclw->iclabel.fontheight) / 2;
+
+    CDDrawString(dispobj, w, iclw->iclabel.label, 0, -1, x, y);
+}
+
+/* ARGSUSED */
+static Boolean
+SetValues(cur, req, wid, args, num_args)
+Widget cur;
+Widget req;
+Widget wid;
+ArgList args;
+Cardinal *num_args;
+{
+    ICLabelWidget old = (ICLabelWidget)cur;
+    ICLabelWidget new = (ICLabelWidget)wid;
+    Boolean widthspecified = False;
+    Boolean heightspecified = False;
+    Boolean redisplay = False;
+    Boolean label_changed = False;
+    int i;
+
+    for (i = 0; i < *num_args; i++) {
+	if (!strcmp(args->name, XtNwidth)) widthspecified = True;
+	else if (!strcmp(args->name, XtNheight)) heightspecified = True;
+    }
+
+    if (new->iclabel.label != old->iclabel.label) {
+	/* compute maximum pixel width of the list items */
+	if (old->iclabel.label != NULL) freeString(old->iclabel.label);
+	if (new->iclabel.label != NULL) {
+	    new->iclabel.label = copyString(new->iclabel.label);
+	    if (new->iclabel.displayobj != NULL) {
+		new->iclabel.width = CDStringWidth(new->iclabel.displayobj,
+						   new->iclabel.label, 0, -1);
+	    }
+	} else {
+	    new->iclabel.width = 0;
+	}
+	label_changed = True;
+	redisplay = True;
+    }
+
+    if (new->iclabel.hspace != old->iclabel.hspace ||
+	new->iclabel.vspace != old->iclabel.vspace ||
+	label_changed) {
+	computeSize(new, widthspecified, heightspecified);
+	redisplay = True;
+    } else if (new->iclabel.justify != old->iclabel.justify) {
+	redisplay = True;
+    }
+
+    if (new->iclabel.cursor != old->iclabel.cursor && XtIsRealized(wid)) {
+	XDefineCursor(XtDisplay(wid), XtWindow(wid), new->iclabel.cursor);
+    }
+
+    return redisplay;
+}
+
+static XtGeometryResult
+QueryGeometry(w, req, ret)
+Widget w;
+XtWidgetGeometry *req;
+XtWidgetGeometry *ret;
+{
+    ICLabelWidget iclw = (ICLabelWidget)w;
+
+    ret->request_mode = CWWidth | CWHeight;
+
+    ret->width = iclw->iclabel.width + iclw->iclabel.hspace * 2;
+    ret->height = iclw->iclabel.fontheight + iclw->iclabel.vspace * 2;
+
+    if ((!(req->request_mode & CWWidth) || ret->width == req->width) &&
+	(!(req->request_mode & CWHeight) || ret->height == req->height)) {
+	return XtGeometryYes;
+    } else if (ret->width == iclw->core.width &&
+	       ret->height == iclw->core.height) {
+	return XtGeometryNo;
+    }
+    return XtGeometryAlmost;
+}
+
+static void
+InsertChild(w)
+Widget w;
+{
+    ICLabelWidget iclw = (ICLabelWidget)XtParent(w);
+    CompositeWidgetClass super = (CompositeWidgetClass)XtClass(iclw)->core_class.superclass;
+    String params[1];
+    Cardinal num_params;
+
+    if (!XtIsSubclass(w, convDisplayObjectClass)) {
+	params[0] = XtClass(iclw)->core_class.class_name;
+	num_params = 1;
+	XtAppErrorMsg(XtWidgetToApplicationContext(w),
+		      "childError", "class", "WidgetError",
+		      "%s: child must be subclass of ConvDisplayObject",
+		      params, &num_params);
+    }
+    if (iclw->composite.num_children != 0) {
+	params[0] = XtClass(iclw)->core_class.class_name;
+	num_params = 1;
+	XtAppErrorMsg(XtWidgetToApplicationContext(w),
+		      "childError", "number", "WidgetError",
+		      "%s: can only take one child",
+		      params, &num_params);
+    }
+
+    (*super->composite_class.insert_child)(w);
+
+    iclw->iclabel.displayobj = w;
+    iclw->iclabel.fontheight = CDLineHeight(w, (Position *)NULL);
+
+    if (iclw->iclabel.label != NULL) {
+	iclw->iclabel.width = CDStringWidth(iclw->iclabel.displayobj,
+					    iclw->iclabel.label, 0, -1);
+    }
+    computeSize(iclw, iclw->core.width != 0, iclw->core.height != 0);
+}
+
+static void
+computeSize(iclw, fixwidth, fixheight)
+ICLabelWidget iclw;
+Boolean fixwidth;
+Boolean fixheight;
+{
+    if (!fixwidth) {
+	iclw->core.width = iclw->iclabel.width + iclw->iclabel.hspace * 2;
+    }
+    if (!fixheight) {
+	iclw->core.height = iclw->iclabel.fontheight + iclw->iclabel.vspace * 2;
+    }
+}
+
+static ICString *
+copyString(from)
+ICString *from;
+{
+    ICString *to = XtNew(ICString);
+
+    to->nbytes = from->nbytes;
+    to->nchars = from->nchars;
+    to->attr = from->attr;
+    to->data = XtMalloc(from->nbytes);
+    (void)bcopy(from->data, to->data, from->nbytes);
+    return to;
+}
+
+static void
+freeString(s)
+ICString *s;
+{
+    XtFree(s->data);
+    XtFree((char *)s);
+}
+
+
+/*
+ * public function
+ */
+
+void
+ICLRecomputeSize(w)
+Widget w;
+{
+    ICLabelWidget iclw = (ICLabelWidget)w;
+    Dimension width, height;
+
+    if (iclw->iclabel.displayobj != NULL) {
+	iclw->iclabel.fontheight = CDLineHeight(iclw->iclabel.displayobj,
+						(Position *)NULL);
+	if (iclw->iclabel.label != NULL) {
+	    iclw->iclabel.width = CDStringWidth(iclw->iclabel.displayobj,
+						iclw->iclabel.label, 0, -1);
+	}
+	width = iclw->iclabel.width + iclw->iclabel.hspace * 2;
+	height = iclw->iclabel.fontheight + iclw->iclabel.vspace * 2;
+	XtMakeResizeRequest(w, width, height,
+			    (Dimension *)NULL, (Dimension *)NULL);
+    } /* else do nothing */
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/IMProto.c	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,1022 @@
+#ifndef lint
+static char *rcsid = "$Id: IMProto.c,v 1.20 1999/04/12 08:52:23 ishisone Exp $";
+#endif
+/*- 
+ * Copyright (c) 1991, 1994  Software Research Associates, Inc.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted, provided
+ * that the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Software Research Associates not be
+ * used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission.  Software Research
+ * Associates makes no representations about the suitability of this software
+ * for any purpose.  It is provided "as is" without express or implied
+ * warranty.
+ *
+ * Author:  Makoto Ishisone, Software Research Associates, Inc., Japan
+ */
+
+/*
+ * X Input Method Protocol handler is considered to be still in
+ * beta testing phase.  Current version has the following
+ * restrictions.
+ *	- it does not support on-demand-synchronous method.
+ *	- it does not support front-end model.
+ *	- it does not SetIMValues operation.
+ *	- it supports only X, local and TCP transports.
+ * Also, there might be various bugs.
+ */
+
+#define DEBUG_VAR debug_IMProtocol
+
+#include <ctype.h>
+#include <X11/Xos.h>
+#include <sys/stat.h>
+#include <X11/IntrinsicP.h>
+#include <X11/StringDefs.h>
+#include <X11/Xatom.h>
+#include <X11/Xmu/SysUtil.h>
+#include "IMProtoP.h"
+#include "ParseKey.h"
+#include "InputConv.h"
+#include "im.h"
+
+
+#define SERVER_NAME		"kinput2"
+#define UNIX_SOCKET_DIR		"/tmp/.ki2-unix"
+
+/*- resource table -*/
+static XtResource resources[] = {
+#define offset(field) XtOffset(IMProtocolWidget, imp.field)
+    { XtNserverName, XtCServerName, XtRString, sizeof(String),
+	offset(server_name), XtRString, (XtPointer)SERVER_NAME },
+    { XtNlanguage, XtCLanguage, XtRString, sizeof(String),
+	offset(language), XtRImmediate, (XtPointer)NULL },
+    { XtNlocales, XtCLocales, XtRString, sizeof(String),
+	offset(locales), XtRImmediate, (XtPointer)NULL },
+    { XtNinputObjectClass, XtCClass, XtRPointer, sizeof(WidgetClass),
+	offset(input_object_class), XtRImmediate, (XtPointer)NULL },
+    { XtNdisplayObjectClass, XtCClass, XtRPointer, sizeof(WidgetClass),
+	offset(display_object_class), XtRImmediate, (XtPointer)NULL },
+    { XtNdefaultFontList, XtCFontList, XtRString, sizeof(String),
+	offset(default_fontlist), XtRImmediate, (XtPointer)NULL },
+    { XtNconversionStartKeys, XtCConversionStartKeys, XtRString, sizeof(String),
+	offset(conversion_start_keys), XtRImmediate, (XtPointer)NULL },
+    { XtNforeground, XtCForeground, XtRPixel, sizeof (Pixel),
+	offset(foreground), XtRString, XtDefaultForeground },
+    { XtNstatusWidth, XtCStatusWidth, XtRDimension, sizeof(Dimension),
+	offset(status_width), XtRImmediate, (XtPointer)0 },
+    { XtNtransports, XtCTransports, XtRString, sizeof(String),
+	offset(transport_list), XtRString, (XtPointer)"tcp,unix,x" },
+#undef offset
+};
+
+static void Initialize _Pt_((Widget req, Widget new,
+			     ArgList args, Cardinal *num_args));
+static void Destroy _Pt_((Widget w));
+static void Realize _Pt_((Widget w, XtValueMask *mask,
+			  XSetWindowAttributes *value));
+
+/*- IMProtocolClassRec -*/
+IMProtocolClassRec imProtocolClassRec = {
+  { /* core fields */
+    /* superclass		*/	(WidgetClass) &widgetClassRec,
+    /* class_name		*/	"IMProtocol",
+    /* widget_size		*/	sizeof(IMProtocolRec),
+    /* class_initialize		*/	NULL,
+    /* class_part_initialize	*/	NULL,
+    /* class_inited		*/	FALSE,
+    /* initialize		*/	Initialize,
+    /* initialize_hook		*/	NULL,
+    /* realize			*/	Realize,
+    /* actions			*/	NULL,
+    /* num_actions		*/	0,
+    /* resources		*/	resources,
+    /* num_resources		*/	XtNumber(resources),
+    /* xrm_class		*/	NULLQUARK,
+    /* compress_motion		*/	TRUE,
+    /* compress_exposure	*/	TRUE,
+    /* compress_enterleave	*/	TRUE,
+    /* visible_interest		*/	FALSE,
+    /* destroy			*/	Destroy,
+    /* resize			*/	NULL,
+    /* expose			*/	NULL,
+    /* set_values		*/	NULL,
+    /* set_values_hook		*/	NULL,
+    /* set_values_almost	*/	XtInheritSetValuesAlmost,
+    /* get_values_hook		*/	NULL,
+    /* accept_focus		*/	NULL,
+    /* version			*/	XtVersion,
+    /* callback_private		*/	NULL,
+    /* tm_table			*/	NULL,
+    /* query_geometry		*/	XtInheritQueryGeometry,
+    /* display_accelerator	*/	XtInheritDisplayAccelerator,
+    /* extension		*/	NULL
+  },
+  { /* imProtocol fields */
+    /* dummy			*/	0
+  }
+};
+
+WidgetClass imProtocolWidgetClass = (WidgetClass)&imProtocolClassRec;
+
+static void getAtoms _Pt_((IMProtocolWidget ipw));
+static void setProperty _Pt_((IMProtocolWidget ipw));
+static int ownSelection _Pt_((IMProtocolWidget ipw));
+static Boolean convertSelection _Pt_((Widget w, Atom *selectionp,
+				      Atom *targetp, Atom *typep,
+				      XtPointer *valuep,
+				      unsigned long *lengthp, int *formatp));
+static void loseSelection _Pt_((Widget w, Atom *selectionp));
+#ifdef IM_TCP_TRANSPORT
+static void acceptTCPService _Pt_((XtPointer client_data,
+				  int *sourcep, XtInputId *idp));
+#endif
+#ifdef IM_UNIX_TRANSPORT
+static void acceptUnixService _Pt_((XtPointer client_data,
+				    int *sourcep, XtInputId *idp));
+#endif
+#ifdef IM_X_TRANSPORT
+static void acceptXService _Pt_((Widget w, XtPointer client_data,
+				 XEvent *event, Boolean *continuep));
+#endif
+static void initializeError _Pt_((Widget w, String resname));
+static char *compactList _Pt_((char *s));
+static void setTransport _Pt_((Widget w));
+static int makeConverter _Pt_((Widget w));
+static void getTriggerKeys _Pt_((Widget w));
+static void ioeCallback _Pt_((XPointer cldata));
+
+
+/*
+ *+ Core class methods
+ */
+
+/*- Initialize: intern Atoms, get default fonts, etc. -*/
+/* ARGSUSED */
+static void
+Initialize(req, new, args, num_args)
+Widget req;
+Widget new;
+ArgList args;
+Cardinal *num_args;
+{
+    IMProtocolWidget ipw = (IMProtocolWidget)new;
+
+    TRACE(("IMProtocolWidget:Initialize()\n"));
+
+    /*
+     * Check resources which must be specified at the initialization.
+     */
+#define NULLorEMPTY(p)	((p) == NULL || (p)[0] == '\0')
+    if (NULLorEMPTY(ipw->imp.server_name)) {
+	initializeError(new, XtNserverName);
+    }
+
+    ipw->imp.server_name = XtNewString(ipw->imp.server_name);
+
+    if (NULLorEMPTY(ipw->imp.language)) {
+	initializeError(new, XtNlanguage);
+    } else if (NULLorEMPTY(ipw->imp.locales)) {
+	initializeError(new, XtNlocales);
+    } else if (ipw->imp.input_object_class == NULL) {
+	initializeError(new, XtNinputObjectClass);
+    } else if (ipw->imp.display_object_class == NULL) {
+	initializeError(new, XtNdisplayObjectClass);
+    }
+    ipw->imp.locales = compactList(XtNewString(ipw->imp.locales));
+#undef NULLorEMPTY
+
+    /*
+     * Initialize converter info.
+     */
+    if (makeConverter(new) < 0) {
+	/*
+	 * locales is empty.
+	 */
+	String params[1];
+	Cardinal num_params;
+
+	params[0] = XtClass(new)->core_class.class_name;
+	num_params = 1;
+	XtAppErrorMsg(XtWidgetToApplicationContext(new),
+		      "initializeError", "invalidValue", "WidgetError",
+		      "%s: locale list is empty",
+		      params, &num_params);
+    }
+
+    /*
+     * Create font bank (a bank of cached fonts) and enter
+     * default fonts.
+     */
+    ipw->imp.font_bank = FontBankCreate(XtDisplay(new), ipw->imp.language);
+    if (ipw->imp.font_bank == NULL) {
+	/*
+	 * The specified language is not supported.
+	 */
+	String params[2];
+	Cardinal num_params;
+
+	params[0] = XtClass(new)->core_class.class_name;
+	params[1] = ipw->imp.language;
+	num_params = 2;
+	XtAppErrorMsg(XtWidgetToApplicationContext(new),
+		      "initializeError", "invalidValue", "WidgetError",
+		      "%s: language %s not supported",
+		      params, &num_params);
+    }
+
+    if (ipw->imp.default_fontlist != NULL) {
+	ipw->imp.default_fontlist = XtNewString(ipw->imp.default_fontlist);
+
+	DDPRINT(2, ("cache default fonts: %s\n", ipw->imp.default_fontlist));
+	ipw->imp.default_fonts = FontBankGet(ipw->imp.font_bank,
+					     ipw->imp.default_fontlist,
+					     &ipw->imp.num_default_fonts);
+    } else {
+	ipw->imp.default_fonts = NULL;
+	ipw->imp.num_default_fonts = 0;
+    }
+
+    /*
+     * Initialize private data.
+     */
+    ipw->imp.connection_list = NULL;
+    ipw->imp.no_more_connections = False;
+    ipw->imp.scheduler_queue = NULL;
+    setTransport(new);
+    getTriggerKeys(new);
+    IMInitHash(new);
+    getAtoms(ipw);
+
+    /*
+     * Initialilze transport layer.
+     */
+    /* 1. TCP/IP */
+    ipw->imp.tcp_sock = -1;
+#ifdef IM_TCP_TRANSPORT
+    if (ipw->imp.use_tcp_transport) {
+	ipw->imp.tcp_port = 0;	/* let the system choose the port number */
+	ipw->imp.tcp_sock = IMCreateTCPService(&ipw->imp.tcp_port);
+    }
+    if (ipw->imp.tcp_sock >= 0) {
+	TRACE(("call XtAppAddInput for tcp socket(%d)\n", ipw->imp.tcp_sock));
+	ipw->imp.tcp_id = XtAppAddInput(XtWidgetToApplicationContext(new),
+					ipw->imp.tcp_sock,
+					(XtPointer)XtInputReadMask,
+					acceptTCPService, (XtPointer)ipw);
+    }
+#endif /* IM_TCP_TRANSPORT */
+
+    /* 2. UNIX domain */
+    ipw->imp.unix_sock = -1;
+#ifdef IM_UNIX_TRANSPORT
+    if (ipw->imp.use_unix_transport) {
+	char path[1024];
+	char *p;
+
+	/*
+	 * The unix domain socket pathname has the following form:
+	 *   <UNIX_SOCKET_DIR>/<Display Name>-<Language>
+	 */
+	(void)mkdir(UNIX_SOCKET_DIR, 0777);
+#ifdef S_IFLNK
+	{
+	    /*
+	     * This system has symbolic links.  Make sure UNIX_SOCKET_DIR
+	     * is not a symbolic link but a directory before calling
+	     * chmod().
+	     */
+	    struct stat st;
+	    if (lstat(UNIX_SOCKET_DIR, &st) == 0 &&
+		(st.st_mode & S_IFMT) == S_IFDIR) {
+		(void)chmod(UNIX_SOCKET_DIR, 0777);
+	    }
+	}
+#else
+	(void)chmod(UNIX_SOCKET_DIR, 0777);
+#endif
+	(void)sprintf(path, "%s/%s", UNIX_SOCKET_DIR,
+		      DisplayString(XtDisplay(new)));
+	/*
+	 * Omit screen number and the preceding period.
+	 */
+	for (p = path + strlen(path) - 1; p > path && *p != ':'; p--) {
+	    if (*p == '.') {
+		*p = '\0';
+		break;
+	    }
+	}
+	/*
+	 * Append language part.
+	 */
+	(void)strcat(path, "-");
+	(void)strcat(path, ipw->imp.language);
+	/*
+	 * Change every ':' in the path name to '_', since ':' is not
+	 * included in POSIX Portable Filename Character Set.
+	 */
+	for (p = path; *p != '\0'; p++) {
+	    if (*p == ':') *p = '_';
+	}
+	ipw->imp.unix_path = XtNewString(path);
+	ipw->imp.unix_sock = IMCreateUnixService(ipw->imp.unix_path);
+    }
+    if (ipw->imp.unix_sock >= 0) {
+	TRACE(("call XtAppAddInput for unix socket(%d)\n", ipw->imp.unix_sock));
+	ipw->imp.unix_id = XtAppAddInput(XtWidgetToApplicationContext(new),
+					 ipw->imp.unix_sock,
+					 (XtPointer)XtInputReadMask,
+					 acceptUnixService, (XtPointer)ipw);
+	ipw->imp.ioe_handle = XIOESet(ioeCallback, (XPointer)ipw);
+    }
+#endif /* IM_UNIX_TRANSPORT */
+
+#ifdef IM_X_TRANSPORT
+    if (ipw->imp.use_x_transport) {
+	TRACE(("call XtAddEventHandler for X transport\n"));
+	XtAddEventHandler(new, NoEventMask, True, acceptXService,
+			  (XtPointer)NULL);
+    }
+#endif /* IM_X_TRANSPORT */
+
+    /*
+     * Compile request dispatching table.
+     */
+    IMCompileReq();
+}
+
+/*- Destroy: free allocated memory -*/
+static void
+Destroy(w)
+Widget w;
+{
+    IMProtocolWidget ipw = (IMProtocolWidget)w;
+    IMConnection *conn;
+    int i;
+
+    TRACE(("IMProtocolWidget:Destroy()\n"));
+
+    XtFree(ipw->imp.server_name);
+    XtFree(ipw->imp.locales);
+    if (ipw->imp.default_fontlist != NULL) XtFree(ipw->imp.default_fontlist);
+    if (ipw->imp.trigger_keys != NULL) XtFree((char *)ipw->imp.trigger_keys);
+
+    for (i = 0; i < ipw->imp.converter.num_locales; i++) {
+	XtFree(ipw->imp.converter.supported_locales[i]);
+    }
+    XtFree((char *)ipw->imp.converter.supported_locales);
+
+    /*
+     * Close down all connections.
+     */
+    conn = ipw->imp.connection_list;
+    while (conn != NULL) {
+	IMConnection *next = conn->next;
+
+	IMCloseConnection(conn);
+	conn = next;
+    }
+
+    /*
+     * Close down TCP/Unix service sockets.
+     */
+    if (ipw->imp.tcp_sock >= 0) {
+	XtRemoveInput(ipw->imp.tcp_id);
+	(void)close(ipw->imp.tcp_sock);
+    }
+    if (ipw->imp.unix_sock >= 0) {
+	XIOEUnset(ipw->imp.ioe_handle);
+	(void)unlink(ipw->imp.unix_path);
+	XtRemoveInput(ipw->imp.unix_id);
+	(void)close(ipw->imp.unix_sock);
+	XtFree(ipw->imp.unix_path);
+    }
+
+    /*
+     * Unload default fonts.
+     */
+    if (ipw->imp.num_default_fonts > 0) {
+	FontBankFreeFonts(ipw->imp.font_bank,
+			  ipw->imp.default_fonts,
+			  ipw->imp.num_default_fonts);
+    }
+
+    /*
+     * Free font bank.
+     */
+    FontBankDestroy(ipw->imp.font_bank);
+}
+
+/*- Realize: own selection -*/
+static void
+Realize(w, mask, value)
+Widget w;
+XtValueMask *mask;
+XSetWindowAttributes *value;
+{
+    IMProtocolWidget ipw = (IMProtocolWidget)w;
+    CoreWidgetClass super = (CoreWidgetClass)XtClass(w)->core_class.superclass;
+
+    TRACE(("IMProtocolWidget:Realize()\n"));
+
+    (*super->core_class.realize)(w, mask, value);
+
+    if (ownSelection(ipw) < 0) {
+	String params[1];
+	Cardinal num_params;
+
+	params[0] = XtClass(w)->core_class.class_name;
+	num_params = 1;
+	XtAppWarningMsg(XtWidgetToApplicationContext(w),
+			"selectionError", "ownSelection", "WidgetError",
+			"%s: can't own selection", params, &num_params);
+
+	XtDestroyWidget(w);
+    }
+
+    setProperty(ipw);
+}
+
+/*
+ *+ Atom, property and selection handling
+ */
+
+/*- getAtoms: intern atoms -*/
+static void
+getAtoms(ipw)
+IMProtocolWidget ipw;
+{
+    Display *dpy = XtDisplay((Widget)ipw);
+    char buf[256];
+
+    TRACE(("IMProtocolWidget:getAtoms()\n"));
+
+    (void)strcpy(buf, "@server=");
+    (void)strcat(buf, ipw->imp.server_name);
+#define MAKEATOM(s)	XInternAtom(dpy, s, False)
+    ipw->imp.server_atom = MAKEATOM(buf);
+    ipw->imp.ctext_atom = MAKEATOM("COMPOUND_TEXT");
+    ipw->imp.locales_atom = MAKEATOM("LOCALES");
+    ipw->imp.transport_atom = MAKEATOM("TRANSPORT");
+    ipw->imp.ki2comm_atom = MAKEATOM("_KINPUT2_COMM");
+    ipw->imp.xim_xconnect = MAKEATOM("_XIM_XCONNECT");
+    ipw->imp.xim_protocol = MAKEATOM("_XIM_PROTOCOL");
+    ipw->imp.xim_moredata = MAKEATOM("_XIM_MOREDATA");
+#undef MAKEATOM
+}
+
+/*- setProperty: set XIM_SERVERS property -*/
+static void
+setProperty(ipw)
+IMProtocolWidget ipw;
+{
+    Display *dpy = XtDisplay((Widget)ipw);
+    Atom xim_servers = XInternAtom(dpy, "XIM_SERVERS", False);
+    Atom server_atom = ipw->imp.server_atom;
+    Window root0 = RootWindow(dpy, 0);
+    int op_mode = PropModePrepend;
+    int no_registration = 0;
+    Atom type;
+    int format;
+    unsigned long nitems;
+    unsigned long bytes_after;
+    unsigned char *value;
+    unsigned long data;
+
+    TRACE(("IMProtocolWidget:setProperty()\n"));
+
+    /*
+     * For atomic operation, grab the server.
+     */
+#ifndef DEBUG
+    XGrabServer(dpy);
+#endif
+
+    /*
+     * First, check the XIM_SERVERS property's existance.
+     * If it exists, examine the contents.
+     */
+    if (XGetWindowProperty(dpy, root0, xim_servers, 0L, 1024L, False,
+			   AnyPropertyType, &type, &format, &nitems,
+			   &bytes_after, &value) == Success) {
+	if (type != XA_ATOM || format != 32) {
+	    /*
+	     * The contents of the property is invalid.
+	     */
+	    DDPRINT(2, ("XIM_SERVERS is corrupted (type=%ld, format=%d)\n",
+		       type, format));
+	    op_mode = PropModeReplace;
+	} else {
+	    int i;
+	    unsigned long *atoms = (unsigned long *)value;
+
+	    for (i = 0; i < nitems; i++) {
+		if (atoms[i] == server_atom) {
+		    /*
+		     * Already registered.
+		     */
+		    TRACE(("server is already registered in XIM_SERVERS\n"));
+		    no_registration = 1;
+		    break;
+		}
+	    }
+	}
+	if (value != NULL) XFree((char *)value);
+    }
+
+    if (!no_registration) {
+	TRACE(("changing XIM_SERVERS property\n"));
+	data = ipw->imp.server_atom;
+	XChangeProperty(dpy, root0, xim_servers, XA_ATOM, 32, op_mode,
+			(unsigned char *)&data, 1);
+    } else {
+	TRACE(("touching XIM_SERVERS property to generate PropertyNotify\n"));
+	XChangeProperty(dpy, root0, xim_servers, XA_ATOM, 32, PropModeAppend,
+			(unsigned char *)&data, 0);
+    }
+
+#ifndef DEBUG
+    XUngrabServer(dpy);
+#endif
+}
+
+/*- ownSelection: own conversion selection -*/
+static int
+ownSelection(ipw)
+IMProtocolWidget ipw;
+{
+    Display *dpy = XtDisplay((Widget)ipw);
+    Time time = XtLastTimestampProcessed(dpy);
+
+
+    TRACE(("IMProtocolWidget:ownSelection()\n"));
+
+    if (!XtOwnSelection((Widget)ipw, ipw->imp.server_atom, time,
+			convertSelection, loseSelection,
+			(XtSelectionDoneProc)NULL)) {
+	DPRINT(("cannot own selection"));
+	return -1;
+    }
+    DPRINT(("selection atom:%ld owner: %08lx (%ld)\n", ipw->imp.server_atom,
+	    XtWindow((Widget)ipw), XtWindow((Widget)ipw)));
+    return 0;
+}
+
+/*- convertSelection: convert selections -*/
+/* ARGSUSED */
+static Boolean
+convertSelection(w, selectionp, targetp, typep, valuep, lengthp, formatp)
+Widget w;
+Atom *selectionp;
+Atom *targetp;
+Atom *typep;
+XtPointer *valuep;
+unsigned long *lengthp;
+int *formatp;
+{
+    Display *dpy = XtDisplay(w);
+    IMProtocolWidget ipw = (IMProtocolWidget)w;
+
+    TRACE(("IMProtocolWidget:convertSelection()\n"));
+
+    if (*targetp == XInternAtom(dpy, "TARGETS", False)) {
+	Atom *targets;
+
+	TRACE(("target is \"TARGETS\"\n"));
+	targets = (Atom *)XtMalloc(sizeof(Atom) * 2);
+	targets[0] = ATOM_LOCALES(w);
+	targets[1] = ATOM_TRANSPORT(w);
+
+	*typep = XA_ATOM;
+	*valuep = (XtPointer)targets;
+	*lengthp = 2;
+	*formatp = 32;
+	return True;
+    } else if (*targetp == ATOM_LOCALES(w)) {
+	char buf[1024];
+
+	TRACE(("target is \"LOCALES\"\n"));
+	(void)strcpy(buf, "@locale=");
+	(void)strcat(buf, ipw->imp.locales);
+	TRACE(("\ttype: STRING, value: %s\n", buf));
+	/*
+	 * The protocol spec is unclear on the type of the
+	 * selection value.  Since R6 sample implementation
+	 * uses LOCALES, use it.
+	 */
+	*typep = *targetp;
+	/* *typep = XA_STRING; */
+	*valuep = (XtPointer)XtNewString(buf);
+	*lengthp = strlen(buf);
+	*formatp = 8;
+	return True;
+    } else if (*targetp == ATOM_TRANSPORT(w)) {
+	char buf[1024];
+	char hostname[256];
+
+	TRACE(("target is \"TRANSPORT\"\n"));
+
+	XmuGetHostname(hostname, 256);
+
+	(void)strcpy(buf, "@transport=");
+
+#ifdef IM_X_TRANSPORT
+	if (ipw->imp.use_x_transport) {
+	    (void)strcat(buf, "X/,");
+	}
+#endif /* IM_X_TRANSPORT */
+
+#ifdef IM_TCP_TRANSPORT
+	if (ipw->imp.use_tcp_transport) {
+	    char t_buf[1024];
+	    (void)sprintf(t_buf, "tcp/%s:%d,", hostname, ipw->imp.tcp_port);
+	    (void)strcat(buf, t_buf);
+	}
+#endif /* IM_TCP_TRANSPORT */
+
+#ifdef IM_UNIX_TRANSPORT
+	if (ipw->imp.use_unix_transport) {
+	    char u_buf[1024];
+	    (void)sprintf(u_buf, "local/%s:%s,", hostname, ipw->imp.unix_path);
+	    (void)strcat(buf, u_buf);
+	}
+#endif /* IM_UNIX_TRANSPORT */
+
+	/* delete trailing comma */
+	if (buf[strlen(buf) - 1] == ',') buf[strlen(buf) - 1] = '\0';
+	TRACE(("\ttype: STRING, value: %s\n", buf));
+
+	*typep = *targetp;	/* -- see the comment on LOCALES above */
+	*valuep = (XtPointer)XtNewString(buf);
+	*lengthp = strlen(buf);
+	*formatp = 8;
+	return True;
+    } else {
+	DDPRINT(2, ("unknown target atom (%ld)\n", *targetp));
+	return False;
+    }
+}
+
+/*- loseSelection: disable IM protocol handling -*/
+/* ARGSUSED */
+static void
+loseSelection(w, selectionp)
+Widget w;
+Atom *selectionp;
+{
+    IMProtocolWidget ipw = (IMProtocolWidget)w;
+
+    TRACE(("IMProtocolWidget:loseSelection()\n"));
+
+    /*
+     * Someone takes over the selection.  That means
+     * another kinput2 process has been started.
+     * Let the newly process handle new clients, but
+     * as long as existing clients are remained, we have
+     * to maintain them.
+     */
+
+    if (ipw->imp.connection_list == NULL) {
+	/*
+	 * There are no clients.  It is OK to destroy protocol handler.
+	 */
+	XtDestroyWidget(w);
+	return;
+    }
+
+    ipw->imp.no_more_connections = True;
+
+    /*
+     * Close down TCP/Unix service sockets.
+     */
+    if (ipw->imp.tcp_sock >= 0) {
+	TRACE(("\tclose tcp socket\n"));
+	XtRemoveInput(ipw->imp.tcp_id);
+	(void)close(ipw->imp.tcp_sock);
+	ipw->imp.tcp_sock = -1;
+    }
+    if (ipw->imp.unix_sock >= 0) {
+	TRACE(("\tclose unix socket\n"));
+	XtRemoveInput(ipw->imp.unix_id);
+	(void)close(ipw->imp.unix_sock);
+	ipw->imp.unix_sock = -1;
+    }
+}
+
+
+/*
+ *+ Connection acceptance
+ */
+
+#ifdef IM_TCP_TRANSPORT
+/*- acceptTCPService: establish connection via TCP transport -*/
+/* ARGSUSED */
+static void
+acceptTCPService(client_data, sourcep, idp)
+XtPointer client_data;
+int *sourcep;
+XtInputId *idp;
+{
+    IMProtocolWidget ipw = (IMProtocolWidget)client_data;
+    IMConnection *conn;
+
+    TRACE(("IMProtocolWidget:acceptTCPService()\n"));
+
+    /*
+     * Accept connection request.
+     */
+    conn = IMTCPConnection((Widget)ipw, *sourcep);
+
+    /*
+     * Set dispatcher.
+     */
+    if (conn != NULL) IMSetInitialDispatcher(conn);
+
+    /*
+     * Enter to the connections list.
+     */
+    if (conn != NULL) IMRegisterConnection(conn);
+}
+#endif /* IM_TCP_TRANSPORT */
+
+#ifdef IM_UNIX_TRANSPORT
+/*- acceptUnixService: establish connection via UNIX domain transport -*/
+/* ARGSUSED */
+static void
+acceptUnixService(client_data, sourcep, idp)
+XtPointer client_data;
+int *sourcep;
+XtInputId *idp;
+{
+    IMProtocolWidget ipw = (IMProtocolWidget)client_data;
+    IMConnection *conn;
+
+    TRACE(("IMProtocolWidget:acceptUnixService()\n"));
+
+    /*
+     * Accept connection request.
+     */
+    conn = IMUnixConnection((Widget)ipw, *sourcep);
+
+    /*
+     * Set dispatcher.
+     */
+    if (conn != NULL) IMSetInitialDispatcher(conn);
+
+    /*
+     * Enter to the connections list.
+     */
+    if (conn != NULL) IMRegisterConnection(conn);
+}
+#endif /* IM_UNIX_TRANSPORT */
+
+#ifdef IM_X_TRANSPORT
+/*- acceptXService: establish connection via X transport -*/
+/* ARGSUSED */
+static void
+acceptXService(w, client_data, event, continuep)
+Widget w;
+XtPointer client_data;
+XEvent *event;
+Boolean *continuep;
+{
+    IMConnection *conn;
+
+    TRACE(("IMProtocolWidget:acceptXService()\n"));
+
+    /*
+     * Check if the event is really a connection request.
+     */
+    if (event->type != ClientMessage) return;
+    conn = IMXConnection(w, event);
+
+    /*
+     * Set dispatcher.
+     */
+    if (conn != NULL) IMSetInitialDispatcher(conn);
+
+    /*
+     * Enter to the connections list.
+     */
+    if (conn != NULL) IMRegisterConnection(conn);
+}
+#endif /* IM_X_TRANSPORT */
+
+
+/*
+ *+ utility functions
+ */
+
+/*- initializeError: display error message when resource isn't specified -*/
+static void
+initializeError(w, resname)
+Widget w;
+String resname;
+{
+    String params[2];
+    Cardinal num_params;
+
+    params[0] = XtClass(w)->core_class.class_name;
+    params[1] = resname;
+    num_params = 2;
+    XtAppErrorMsg(XtWidgetToApplicationContext(w),
+		  "initializeError", "noResource", "WidgetError",
+		  "%s: resource %s must be specified at widget creation",
+		  params, &num_params);
+}
+
+/*- compactList: remove unnecessary spaces in a comma-separated list -*/
+static char *
+compactList(s)
+char *s;
+{
+    char *src, *dst;
+    int c;
+
+    src = dst = s;
+    for (;;) {
+	/* skip leading space */
+	while (isspace(*src)) src++;
+
+	if (*src == '\0') {
+	    *dst = '\0';
+	    return s;
+	}
+
+	/* copy string until comma or NUL appears */
+	while ((c = *dst++ = *src++) != ',') {
+	    if (c == '\0') return s;
+	}
+    }
+}
+
+/*- setTransport: determine which transport to be used -*/
+static void
+setTransport(w)
+Widget w;
+{
+    IMProtocolWidget ipw = (IMProtocolWidget)w;
+    char *p;
+
+    TRACE(("IMProtocolWidget:setTransport(%s)\n", ipw->imp.transport_list));
+
+    ipw->imp.use_tcp_transport = False;
+    ipw->imp.use_unix_transport = False;
+    ipw->imp.use_x_transport = False;
+
+    p = ipw->imp.transport_list;
+    while (*p != '\0') {
+	char lower[256];
+	char *q;
+
+	while (isspace(*p)) p++;
+	if (*p == '\0') break;
+
+	q = lower;
+	while (*p != '\0' && *p != ',' && !isspace(*p)) {
+	    if (isupper(*p)) {
+		*q++ = tolower(*p);
+	    } else {
+		*q++ = *p;
+	    }
+	    p++;
+	}
+	*q = '\0';
+	while (isspace(*p)) p++;
+	if (*p == ',') p++;
+
+	if (!strcmp(lower, "tcp")) {
+	    TRACE(("\tTCP transport\n"));
+	    ipw->imp.use_tcp_transport = True;
+	} else if (!strcmp(lower, "unix")) {
+	    TRACE(("\tUNIX domain transport\n"));
+	    ipw->imp.use_unix_transport = True;
+	} else if (!strcmp(lower, "x")) {
+	    TRACE(("\tX transport\n"));
+	    ipw->imp.use_x_transport = True;
+	}
+    }
+}
+
+/*- makeConverter: create converter record -*/
+static int
+makeConverter(w)
+Widget w;
+{
+    IMProtocolWidget ipw = (IMProtocolWidget)w;
+    char *locales[100];
+    int num_locales;
+    int size;
+    char *p;
+
+    TRACE(("IMProtocolWidget:makeConverter()\n"));
+
+    ipw->imp.converter.input_object_class = ipw->imp.input_object_class;
+    ipw->imp.converter.display_object_class = ipw->imp.display_object_class;
+
+    p = ipw->imp.locales;
+    num_locales = 0;
+    do {
+	char buf[256];
+	char *q = buf;
+
+	while (isspace(*p)) p++;
+	if (*p == '\0') break;
+
+	while (*p != '\0' && *p != ',' && !isspace(*p)) *q++ = *p++;
+	*q = '\0';
+	TRACE(("\tsupported locale: %s\n", buf));
+	locales[num_locales++] = XtNewString(buf);
+	while (isspace(*p)) p++;
+	if (*p == ',') p++;
+    } while (*p != '\0' && num_locales < 100);
+    TRACE(("\tnumber of supported locales: %d\n", num_locales));
+
+    if (num_locales == 0) return -1;
+    ipw->imp.converter.num_locales = num_locales;
+
+    size = sizeof(char *) * num_locales;
+    ipw->imp.converter.supported_locales = (char **)XtMalloc(size);
+    bcopy((char *)locales, (char *)ipw->imp.converter.supported_locales, size);
+    return 0;
+}
+
+/*- getTriggerKeys: parse conversion trigger key specification -*/
+static void
+getTriggerKeys(w)
+Widget w;
+{
+    IMProtocolWidget ipw = (IMProtocolWidget)w;
+    char *key_str;
+    IMTriggerKey keys[100];
+    int num_keys;
+    int c, n;
+    ICTriggerKey *ckeys, *ekeys;
+
+    TRACE(("IMProtocolWidget:getTriggerKeys()\n"));
+
+    key_str = ipw->imp.conversion_start_keys;
+    num_keys = 0;
+    TRACE(("\tstart keys: %s\n", key_str));
+
+    if (key_str != NULL) {
+	do {
+	    char buf[256];
+	    char *p = buf;
+	    KeySym keysym;
+	    long mods, chk_mods;
+
+	    while ((c = *key_str++) != '\0' && c != '\n') {
+		*p++ = c;
+	    }
+	    *p = '\0';
+	    if (ParseKeyEvent(buf, &keysym, &mods, &chk_mods)) {
+		TRACE(("\tkeysym: %08lx, modifiers: %04lx, check: %04lx\n",
+		       keysym, mods, chk_mods));
+		keys[num_keys].keysym = keysym;
+		keys[num_keys].modifiers = mods;
+		keys[num_keys].check_modifiers = chk_mods;
+		num_keys++;
+	    }
+	} while  (c != '\0' && num_keys < 100);
+    }
+
+    n = ICGetTriggerKeysOfInputObjectClass(ipw->imp.input_object_class,
+					   &ckeys);
+    for (ekeys = ckeys + n ;
+	 ckeys < ekeys && num_keys < (sizeof(keys) / sizeof(IMTriggerKey)) ;
+	 ckeys++) {
+      keys[num_keys].keysym = ckeys->keysym;
+      keys[num_keys].modifiers = ckeys->modifiers;
+      keys[num_keys].check_modifiers = ckeys->modifiermask;
+      num_keys++;
+    }
+
+    TRACE(("\tnumber of trigger keys: %d\n", num_keys));
+    ipw->imp.num_trigger_keys = num_keys;
+
+    if (num_keys > 0) {
+	int size;
+
+	size = sizeof(IMTriggerKey) * num_keys;
+	ipw->imp.trigger_keys = (IMTriggerKey *)XtMalloc(size);
+	bcopy((char *)keys, (char *)ipw->imp.trigger_keys, size);
+    } else {
+	ipw->imp.trigger_keys = NULL;
+    }
+}
+
+/*- ioeCallback: callback procedure for X I/O error -*/
+static void
+ioeCallback(cldata)
+XPointer cldata;
+{
+    IMProtocolWidget ipw = (IMProtocolWidget)cldata;
+
+    if (ipw->imp.unix_sock >= 0 && ipw->imp.unix_path != NULL) {
+	(void)unlink(ipw->imp.unix_path);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/Imakefile	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,75 @@
+#include "../Kinput2.conf"
+
+       WIDGETSRCS = AdoptedShe.c AuxPanel.c CandPanel.c Canvas.c \
+            CanvasShel.c ConvCtrl.c ConvDisp.c ConvMgr.c \
+            ICLabel.c InputConv.c KIProto.c OffConv.c \
+            OverConv.c OnConv.c WcharDisp.c XimpProto.c IMProto.c
+
+       WIDGETOBJS = AdoptedShe.o AuxPanel.o CandPanel.o Canvas.o \
+            CanvasShel.o ConvCtrl.o ConvDisp.o ConvMgr.o \
+            ICLabel.o InputConv.o KIProto.o OffConv.o \
+            OverConv.o OnConv.o WcharDisp.o XimpProto.o IMProto.o
+
+         UTILSRCS = cachedatom.c cachedfont.c ctext.c dispatch.c \
+            fontset.c wstring.c xtwstr.c xwstr.c \
+            asyncerr.c fontbank.c parsekey.c ioecall.c
+
+         UTILOBJS = cachedatom.o cachedfont.o ctext.o dispatch.o \
+            fontset.o wstring.o xtwstr.o xwstr.o \
+            asyncerr.o fontbank.o parsekey.o ioecall.o
+
+#define PassCDebugFlags 'CDEBUGFLAGS=$(CDEBUGFLAGS)'
+#define IHaveSubdirs
+          SUBDIRS = imlib
+
+#ifdef UseWnn
+          WNNSRCS = CcWnn.c cconv.c wnnlib.c
+          WNNOBJS = CcWnn.o cconv.o wnnlib.o
+          WNNINCS = -I$(WNNINCDIR)
+#ifdef UseWnn6
+          WNN6DEF = -DWNN6
+#endif
+#ifdef WnnLibDir
+        WNNLIBDIR = WnnLibDir
+        WNNLIBDEF = -DLIBDIR=\"$(WNNLIBDIR)\"
+#endif
+          WNNDEFS = -DCCDEFPATH=\"$(CCDEF_DIR)/\" \
+                    $(WNN6DEF) $(WNNLIBDEF)
+#endif
+#ifdef UseCanna
+        CANNASRCS = Canna.c
+        CANNAOBJS = Canna.o
+        CANNAINCS = -I$(CANNASRC)
+#endif
+#ifdef UseSj3
+          SJ3SRCS = Sj3.c
+          SJ3OBJS = Sj3.o
+          SJ3INCS = -I$(SJ3SRC)/sj3lib -I$(SJ3SRC)
+          SJ3DEFS = -DSJ3DEFPATH=\"$(SJ3DEF_DIR)/\"
+          SUBDIRS = imlib Xsj3clib
+#endif
+#ifdef UseAtok
+         ATOKSRCS = Atok.c
+         ATOKOBJS = Atok.o
+         ATOKINCS = -I$(ATOKINCDIR)
+          SUBDIRS = imlib Xatoklib
+#endif
+
+             SRCS = $(WIDGETSRCS) $(UTILSRCS) \
+                    $(WNNSRCS) $(CANNASRCS) $(SJ3SRCS) $(ATOKSRCS)
+             OBJS = $(WIDGETOBJS) $(UTILOBJS) \
+                    $(WNNOBJS) $(CANNAOBJS) $(SJ3OBJS) $(ATOKOBJS)
+
+   LOCAL_INCLUDES = -I../include -Iimlib
+         INCLUDES = $(LOCAL_INCLUDES) $(WNNINCS) $(CANNAINCS) $(SJ3INCS) $(ATOKINCS)
+
+          DEFINES = $(WNNDEFS) $(SJ3DEFS) $(TRANSPORTDEFS)
+
+NormalLibraryObjectRule()
+NormalLibraryTarget(Ki2,$(OBJS))
+DependTarget()
+
+#ifdef IHaveSubdirs
+MakeSubdirs($(SUBDIRS))
+DependSubdirs($(SUBDIRS))
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/InputConv.c	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,569 @@
+#ifndef lint
+static char *rcsid = "$Id: InputConv.c,v 1.17 1999/01/13 08:42:00 ishisone Exp $";
+#endif
+/*
+ * Copyright (c) 1990  Software Research Associates, Inc.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted, provided
+ * that the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Software Research Associates not be
+ * used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission.  Software Research
+ * Associates makes no representations about the suitability of this software
+ * for any purpose.  It is provided "as is" without express or implied
+ * warranty.
+ *
+ * Author:  Makoto Ishisone, Software Research Associates, Inc., Japan
+ */
+
+#include <X11/IntrinsicP.h>
+#include <X11/StringDefs.h>
+#include "InputConvP.h"
+
+static XtResource resources[] = {
+#define offset(field) XtOffset(InputConvObject, inputConv.field)
+    {XtNselectionControl, XtCCallback, XtRCallback, sizeof(XtCallbackList), 
+       offset(selectioncallback), XtRCallback, (XtPointer)NULL},
+    {XtNtextChangeNotify, XtCCallback, XtRCallback, sizeof(XtCallbackList), 
+       offset(textchangecallback), XtRCallback, (XtPointer)NULL},
+    {XtNmodeChangeNotify, XtCCallback, XtRCallback, sizeof(XtCallbackList), 
+       offset(modechangecallback), XtRCallback, (XtPointer)NULL},
+    {XtNendNotify, XtCCallback, XtRCallback, sizeof(XtCallbackList), 
+       offset(endcallback), XtRCallback, (XtPointer)NULL},
+    {XtNfixNotify, XtCCallback, XtRCallback, sizeof(XtCallbackList), 
+       offset(fixcallback), XtRCallback, (XtPointer)NULL},
+    {XtNauxControl, XtCCallback, XtRCallback, sizeof(XtCallbackList), 
+       offset(auxcallback), XtRCallback, (XtPointer)NULL},
+    {XtNdisplayObjectClass, XtCClass, XtRPointer, sizeof(WidgetClass),
+	offset(displayObjClass), XtRImmediate, (XtPointer)NULL },
+#undef offset
+};
+
+static void ClassPartInitialize();
+static void Initialize();
+static void Destroy();
+
+static int InputEvent();
+static ICString *GetMode();
+static int CursorPos();
+static int NumSegments();
+static ICString *GetSegment();
+static int CompareSegment();
+static ICString *GetItemList();
+static int SelectItem();
+static int ConvertedString();
+static int Clear();
+static ICString *GetAuxSegments();
+static int GetTriggerKeys();
+static int GetPreeditString();
+static int GetStatusString();
+
+InputConvClassRec inputConvClassRec = {
+  { /* object fields */
+    /* superclass		*/	(WidgetClass) &objectClassRec,
+    /* class_name		*/	"InputConv",
+    /* widget_size		*/	sizeof(InputConvRec),
+    /* class_initialize		*/	NULL,
+    /* class_part_initialize	*/	ClassPartInitialize,
+    /* class_inited		*/	FALSE,
+    /* initialize		*/	Initialize,
+    /* initialize_hook		*/	NULL,
+    /* obj1			*/	NULL,
+    /* obj2			*/	NULL,
+    /* obj3			*/	0,
+    /* resources		*/	resources,
+    /* num_resources		*/	XtNumber(resources),
+    /* xrm_class		*/	NULLQUARK,
+    /* obj4			*/	FALSE,
+    /* obj5			*/	FALSE,
+    /* obj6			*/	FALSE,
+    /* obj7			*/	FALSE,
+    /* destroy			*/	Destroy,
+    /* obj8			*/	NULL,
+    /* obj9			*/	NULL,
+    /* set_values		*/	NULL,
+    /* set_values_hook		*/	NULL,
+    /* obj10			*/	NULL,
+    /* get_values_hook		*/	NULL,
+    /* obj11			*/	NULL,
+    /* version			*/	XtVersion,
+    /* callback_private		*/	NULL,
+    /* obj12			*/	NULL,
+    /* obj13			*/	NULL,
+    /* obj14			*/	NULL,
+    /* extension		*/	NULL,
+  },
+  { /* inputConv fields */
+    /* InputEvent		*/	InputEvent,
+    /* GetMode			*/	GetMode,
+    /* CursorPos		*/	CursorPos,
+    /* NumSegments		*/	NumSegments,
+    /* GetSegment		*/	GetSegment,
+    /* CompareSegment		*/	CompareSegment,
+    /* GetItemList		*/	GetItemList,
+    /* SelectItem		*/	SelectItem,
+    /* GetConvertedString	*/	ConvertedString,
+    /* ClearConversion		*/	Clear,
+    /* GetSegments		*/	GetAuxSegments,
+    /* SupportMultipleObjects	*/	False,
+    /* GetTriggerKeys           */      GetTriggerKeys,
+    /* num_trigger_keys		*/	0,
+    /* trigger_keys		*/	NULL,
+    /* GetPreeditString		*/	GetPreeditString,
+    /* GetStatusString		*/	GetStatusString,
+    /* NoMoreObjects		*/	False,
+  }
+};
+
+WidgetClass inputConvObjectClass = (WidgetClass)&inputConvClassRec;
+
+static void
+ClassPartInitialize(cl)
+WidgetClass cl;
+{
+    InputConvObjectClass class = (InputConvObjectClass)cl;
+    InputConvObjectClass super = (InputConvObjectClass)class->object_class.superclass;
+
+    if (class->inputConv_class.InputEvent == XtInheritInputEvent)
+	class->inputConv_class.InputEvent = super->inputConv_class.InputEvent;
+    if (class->inputConv_class.GetMode == XtInheritGetMode)
+	class->inputConv_class.GetMode = super->inputConv_class.GetMode;
+    if (class->inputConv_class.CursorPos == XtInheritCursorPos)
+	class->inputConv_class.CursorPos = super->inputConv_class.CursorPos;
+    if (class->inputConv_class.NumSegments == XtInheritNumSegments)
+	class->inputConv_class.NumSegments = super->inputConv_class.NumSegments;
+    if (class->inputConv_class.GetSegment == XtInheritGetSegment)
+	class->inputConv_class.GetSegment = super->inputConv_class.GetSegment;
+    if (class->inputConv_class.CompareSegment == XtInheritCompareSegment)
+	class->inputConv_class.CompareSegment = super->inputConv_class.CompareSegment;
+    if (class->inputConv_class.GetItemList == XtInheritGetItemList)
+	class->inputConv_class.GetItemList = super->inputConv_class.GetItemList;
+    if (class->inputConv_class.SelectItem == XtInheritSelectItem)
+	class->inputConv_class.SelectItem = super->inputConv_class.SelectItem;
+    if (class->inputConv_class.GetConvertedString == XtInheritGetConvertedString)
+	class->inputConv_class.GetConvertedString = super->inputConv_class.GetConvertedString;
+    if (class->inputConv_class.ClearConversion == XtInheritClearConversion)
+	class->inputConv_class.ClearConversion = super->inputConv_class.ClearConversion;
+    if (class->inputConv_class.GetAuxSegments == XtInheritGetAuxSegments)
+	class->inputConv_class.GetAuxSegments = super->inputConv_class.GetAuxSegments;
+    if (class->inputConv_class.GetTriggerKeys == XtInheritGetTriggerKeys)
+	class->inputConv_class.GetTriggerKeys = super->inputConv_class.GetTriggerKeys;
+    if (class->inputConv_class.GetPreeditString == XtInheritGetPreeditString)
+	class->inputConv_class.GetPreeditString = super->inputConv_class.GetPreeditString;
+    if (class->inputConv_class.GetStatusString == XtInheritGetStatusString)
+	class->inputConv_class.GetStatusString = super->inputConv_class.GetStatusString;
+
+    class->inputConv_class.NoMoreObjects = False;
+}
+
+/* ARGSUSED */
+static void
+Initialize(req, new, args, num_args)
+Widget req;
+Widget new;
+ArgList args;
+Cardinal *num_args;
+{
+    InputConvObjectClass class = (InputConvObjectClass)new->core.widget_class;
+    String params[1];
+    Cardinal num_params;
+
+    if (class->inputConv_class.NoMoreObjects) {
+	params[0] = XtClass(new)->core_class.class_name;
+	num_params = 1;
+	XtAppErrorMsg(XtWidgetToApplicationContext(new),
+		      "creationError", "widget", "WidgetError",
+		      "Class %s cannot have multiple instances",
+		      params, &num_params);
+    }
+    if (!class->inputConv_class.SupportMultipleObjects) {
+	class->inputConv_class.NoMoreObjects = True;
+    }
+}
+
+static void
+Destroy(w)
+Widget w;
+{
+    InputConvObjectClass class = (InputConvObjectClass)w->core.widget_class;
+
+    class->inputConv_class.NoMoreObjects = False;
+}
+
+/* ARGSUSED */
+static int
+InputEvent(w, event)
+Widget w;
+XEvent *event;
+{
+    XtAppError(XtWidgetToApplicationContext(w),
+	       "InputConv Object: InputEvent function isn't defined.");
+    return -1;	/* for lint */
+}
+
+/* ARGSUSED */
+static ICString *
+GetMode(w)
+Widget w;
+{
+    XtAppError(XtWidgetToApplicationContext(w),
+	       "InputConv Object: GetMode function isn't defined.");
+    return NULL;	/* for lint */
+}
+
+/* ARGSUSED */
+static int
+CursorPos(w, segidx, offset)
+Widget w;
+Cardinal *segidx;
+Cardinal *offset;
+{
+    XtAppError(XtWidgetToApplicationContext(w),
+	       "InputConv Object: CursorPos function isn't defined.");
+    return 0;	/* for lint */
+}
+
+/* ARGSUSED */
+static int
+NumSegments(w)
+Widget w;
+{
+    XtAppError(XtWidgetToApplicationContext(w),
+	       "InputConv Object: NumSegments function isn't defined.");
+    return 0;	/* for lint */
+}
+
+/* ARGSUSED */
+static ICString *
+GetSegment(w, n)
+Widget w;
+Cardinal n;
+{
+    XtAppError(XtWidgetToApplicationContext(w),
+	       "InputConv Object: GetSegment function isn't defined.");
+    return NULL;	/* for lint */
+}
+
+/* ARGSUSED */
+static int
+CompareSegment(w, seg1, seg2, n)
+Widget w;
+ICString *seg1;
+ICString *seg2;
+Cardinal *n;
+{
+    XtAppError(XtWidgetToApplicationContext(w),
+	       "InputConv Object: CompareSegment function isn't defined.");
+    return 0;	/* for lint */
+}
+
+/* ARGSUSED */
+static ICString *
+GetItemList(w, n)
+Widget w;
+Cardinal *n;
+{
+    XtAppError(XtWidgetToApplicationContext(w),
+	       "InputConv Object: GetItem function isn't defined.");
+    return NULL;	/* for lint */
+}
+
+/* ARGSUSED */
+static int
+SelectItem(w, n)
+Widget w;
+int n;
+{
+    XtAppError(XtWidgetToApplicationContext(w),
+	       "InputConv Object: SelectItem function isn't defined.");
+    return -1;	/* for lint */
+}
+
+/* ARGSUSED */
+static int
+ConvertedString(w, encoding, format, length, string)
+Widget w;
+Atom *encoding;
+int *format;
+int *length;
+XtPointer *string;
+{
+    XtAppError(XtWidgetToApplicationContext(w),
+	       "InputConv Object: GetConvertedString function isn't defined.");
+    return -1;	/* for lint */
+}
+
+/* ARGSUSED */
+static int
+Clear(w)
+Widget w;
+{
+    XtAppError(XtWidgetToApplicationContext(w),
+	       "InputConv Object: ClearConversion function isn't defined.");
+    return -1;	/* for lint */
+}
+
+/* ARGSUSED */
+static ICString *
+GetAuxSegments(w, n, ns, nc)
+Widget w;
+Cardinal *n, *ns, *nc;
+{
+    XtAppError(XtWidgetToApplicationContext(w),
+	       "InputConv Object: GetAuxSegments function isn't defined.");
+    return NULL;	/* for lint */
+}
+
+
+/* ARGSUSED */
+static int
+GetTriggerKeys(w, keys_return)
+Widget w;
+ICTriggerKey **keys_return;
+{
+    return 0;
+}
+
+/* ARGSUSED */
+static int
+GetPreeditString(w, segn, offset, encoding, format, length, string)
+Widget w;
+int segn;
+int offset;
+Atom *encoding;
+int *format;
+int *length;
+XtPointer *string;
+{
+    XtAppError(XtWidgetToApplicationContext(w),
+	       "InputConv Object: GetPreeditString function isn't defined.");
+    return 0;	/* for lint */
+}
+
+static int
+GetStatusString(w, encoding, format, length, string, nchars)
+Widget w;
+Atom *encoding;
+int *format;
+int *length;
+XtPointer *string;
+int *nchars;
+{
+    XtAppError(XtWidgetToApplicationContext(w),
+	       "InputConv Object: GetStatusString function isn't defined.");
+    return 0;	/* for lint */
+}
+
+
+/*
+ * public functions
+ */
+
+Boolean
+ICSupportMultipleObjects(cl)
+WidgetClass cl;
+{
+    InputConvObjectClass class = (InputConvObjectClass)cl;
+
+    /* check if specified class is a subclass of InputConvObjectClass */
+    while (cl != NULL) {
+	if (cl == inputConvObjectClass) {
+	    /* OK */
+	    XtInitializeWidgetClass(cl);
+	    return class->inputConv_class.SupportMultipleObjects;
+	}
+	cl = cl->core_class.superclass;
+    }
+    return True;	/* for almost all of other classes, it's True */
+}
+
+int
+ICInputEvent(w, event)
+Widget w;
+XEvent *event;
+{
+    InputConvObjectClass class = (InputConvObjectClass)w->core.widget_class;
+
+    XtCheckSubclass(w, inputConvObjectClass, "ICInputEvent()");
+    return (*class->inputConv_class.InputEvent)(w, event);
+}
+
+ICString *
+ICGetMode(w)
+Widget w;
+{
+    InputConvObjectClass class = (InputConvObjectClass)w->core.widget_class;
+
+    XtCheckSubclass(w, inputConvObjectClass, "ICGetMode()");
+    return (*class->inputConv_class.GetMode)(w);
+}
+
+int
+ICCursorPos(w, segidx, offset)
+Widget w;
+Cardinal *segidx;
+Cardinal *offset;
+{
+    InputConvObjectClass class = (InputConvObjectClass)w->core.widget_class;
+
+    XtCheckSubclass(w, inputConvObjectClass, "ICCursorPos()");
+    return (*class->inputConv_class.CursorPos)(w, segidx, offset);
+}
+
+int
+ICNumSegments(w)
+Widget w;
+{
+    InputConvObjectClass class = (InputConvObjectClass)w->core.widget_class;
+
+    XtCheckSubclass(w, inputConvObjectClass, "ICNumSegments()");
+    return (*class->inputConv_class.NumSegments)(w);
+}
+
+ICString *
+ICGetSegment(w, n)
+Widget w;
+Cardinal n;
+{
+    InputConvObjectClass class = (InputConvObjectClass)w->core.widget_class;
+
+    XtCheckSubclass(w, inputConvObjectClass, "ICGetSegment()");
+    return (*class->inputConv_class.GetSegment)(w, n);
+}
+
+int
+ICCompareSegment(w, seg1, seg2, n)
+Widget w;
+ICString *seg1;
+ICString *seg2;
+Cardinal *n;
+{
+    InputConvObjectClass class = (InputConvObjectClass)w->core.widget_class;
+
+    XtCheckSubclass(w, inputConvObjectClass, "ICCompareSegment()");
+    return (*class->inputConv_class.CompareSegment)(w, seg1, seg2, n);
+}
+
+ICString *
+ICGetItemList(w, n)
+Widget w;
+Cardinal *n;
+{
+    InputConvObjectClass class = (InputConvObjectClass)w->core.widget_class;
+
+    XtCheckSubclass(w, inputConvObjectClass, "ICGetItemList()");
+    return (*class->inputConv_class.GetItemList)(w, n);
+}
+
+int
+ICSelectItem(w, n)
+Widget w;
+int n;
+{
+    InputConvObjectClass class = (InputConvObjectClass)w->core.widget_class;
+
+    XtCheckSubclass(w, inputConvObjectClass, "ICSelectItem()");
+    return (*class->inputConv_class.SelectItem)(w, n);
+}
+
+int
+ICGetConvertedString(w, encoding, format, length, string)
+Widget w;
+Atom *encoding;
+int *format;
+int *length;
+XtPointer *string;
+{
+    InputConvObjectClass class = (InputConvObjectClass)w->core.widget_class;
+
+    XtCheckSubclass(w, inputConvObjectClass, "ICGetConvertedString()");
+    return (*class->inputConv_class.GetConvertedString)(w, encoding, format,
+							length, string);
+}
+
+int
+ICClearConversion(w)
+Widget w;
+{
+    InputConvObjectClass class = (InputConvObjectClass)w->core.widget_class;
+
+    XtCheckSubclass(w, inputConvObjectClass, "ICClearConversion()");
+    return (*class->inputConv_class.ClearConversion)(w);
+}
+
+ICString *
+ICGetAuxSegments(w, n, ns, nc)
+Widget w;
+Cardinal *n, *ns, *nc;
+{
+    InputConvObjectClass class = (InputConvObjectClass)w->core.widget_class;
+
+    XtCheckSubclass(w, inputConvObjectClass, "ICGetAuxSegments()");
+    return (*class->inputConv_class.GetAuxSegments)(w, n, ns, nc);
+}
+
+int
+ICGetPreeditString(w, segn, offset, encoding, format, length, string)
+Widget w;
+int segn;
+int offset;
+Atom *encoding;
+int *format;
+int *length;
+XtPointer *string;
+{
+    InputConvObjectClass class = (InputConvObjectClass)w->core.widget_class;
+
+    XtCheckSubclass(w, inputConvObjectClass, "ICGetPreeditString()");
+    return (*class->inputConv_class.GetPreeditString)(w, segn, offset, encoding, format, length, string);
+}
+
+int
+ICGetStatusString(w, encoding, format, length, string, nchars)
+Widget w;
+Atom *encoding;
+int *format;
+int *length;
+XtPointer *string;
+int *nchars;
+{
+    InputConvObjectClass class = (InputConvObjectClass)w->core.widget_class;
+
+    XtCheckSubclass(w, inputConvObjectClass, "ICGetStatusString()");
+    return (*class->inputConv_class.GetStatusString)(w, encoding, format, length, string, nchars);
+}
+
+/*
+
+   Though the following procedure should be done during initialization
+   of object class, I will do the following separately from the
+   initialization procedure in order to prevent duplicate
+   initialization of input object, that is, to prevent making
+   connection twice to input conversion server.
+
+ */
+
+int
+ICRegisterTriggerKeys(w)
+Widget w;
+{
+    InputConvObjectClass class = (InputConvObjectClass)w->core.widget_class;
+
+    XtCheckSubclass(w, inputConvObjectClass, "ICRegisterTriggerKeys()");
+    return class->inputConv_class.num_trigger_keys =
+      (*class->inputConv_class.GetTriggerKeys)
+	(w, &class->inputConv_class.trigger_keys);
+}
+
+int
+ICGetTriggerKeysOfInputObjectClass(cl, keys_return)
+WidgetClass cl;
+ICTriggerKey **keys_return;
+{
+  InputConvObjectClass class = (InputConvObjectClass)cl;
+
+  *keys_return = class->inputConv_class.trigger_keys;
+  return class->inputConv_class.num_trigger_keys;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/KIProto.c	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,2351 @@
+#ifndef lint
+static char *rcsid = "$Id: KIProto.c,v 1.49 1999/01/07 03:12:57 ishisone Exp $";
+#endif
+/*-
+ * Copyright (c) 1991  Software Research Associates, Inc.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted, provided
+ * that the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Software Research Associates not be
+ * used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission.  Software Research
+ * Associates makes no representations about the suitability of this software
+ * for any purpose.  It is provided "as is" without express or implied
+ * warranty.
+ *
+ * Author:  Makoto Ishisone, Software Research Associates, Inc., Japan
+ */
+
+#include <X11/IntrinsicP.h>
+#include <X11/StringDefs.h>
+#include <X11/Xatom.h>
+#include <X11/Xmu/Atoms.h>
+#include <X11/Xmu/CharSet.h>
+#include "KIProtoP.h"
+#include "ConvMgr.h"
+#include "OverConv.h"
+#include "OffConv.h"
+#include "ConvDisp.h"
+#include "MyDispatch.h"
+#include "CachedFont.h"
+#include "ConvProto.h"
+#include "AsyncErr.h"
+
+#define DEBUG_VAR debug_KinputProtocol
+#include "DebugPrint.h"
+
+#define JINPUT_PROTOCOL_VERSION 0x20000L	/* version 2 */
+
+#define XLC_AUTO_REPLACE	1
+#define XLC_ALL_INFORMATION	2
+#define XLC_FRAME_INFORMATION	4
+#define XLC_OFFSET_INFORMATION	8
+
+/*- resource table -*/
+static XtResource resources[] = {
+#define offset(field) XtOffset(KinputProtocolWidget, kinput.field)
+    { XtNlanguage, XtCLanguage, XtRString, sizeof(String),
+	offset(language), XtRString, (XtPointer)NULL },
+    { XtNinputObjectClass, XtCClass, XtRPointer, sizeof(WidgetClass),
+	offset(inputObjClass), XtRImmediate, (XtPointer)NULL },
+    { XtNdisplayObjectClass, XtCClass, XtRPointer, sizeof(WidgetClass),
+	offset(displayObjClass), XtRImmediate, (XtPointer)NULL },
+    { XtNbackwardCompatible, XtCBackwardCompatible, XtRBoolean, sizeof(Boolean),
+	offset(backward_compatible), XtRString, (XtPointer)"False" },
+    { XtNxlcConversionStartKey, XtCXlcConversionStartKey, XtRString, sizeof(String),
+	offset(xlcstartkey), XtRString, (XtPointer)NULL },
+#undef offset
+};
+
+static void ConversionRequestProc();
+static void ConversionEndRequestProc();
+static void ConversionOpenRequestProc();
+static void ConversionCloseRequestProc();
+static void ConversionCloseProc();
+static void ConversionXYNotifyProc();
+static void ConversionColorNotifyProc();
+static void ConversionFontsNotifyProc();
+static void ConversionAttributeNotifyProc();
+static void SelectionRequestProc();
+static void SelectionClearProc();
+static void XlcOnTheSpotChangedProc();
+
+/*- action table -*/
+static XtActionsRec actions[] = {
+    { "conversion-request",		ConversionRequestProc },
+    { "conversion-end-request",		ConversionEndRequestProc },
+    { "conversion-open-request",	ConversionOpenRequestProc },
+    { "conversion-close-request",	ConversionCloseRequestProc },
+    { "conversion-close",		ConversionCloseProc },
+    { "conversion-xy-notify",		ConversionXYNotifyProc },
+    { "conversion-color-notify",	ConversionColorNotifyProc },
+    { "conversion-fonts-notify",	ConversionFontsNotifyProc },
+    { "conversion-attribute-notify",	ConversionAttributeNotifyProc },
+    { "xlc-on-the-spot-changed",	XlcOnTheSpotChangedProc },
+    { "selection-request",		SelectionRequestProc },
+    { "selection-clear",		SelectionClearProc },
+};
+
+/*- default translation -*/
+static char translations[] =
+    "<Message>CONVERSION_REQUEST:	conversion-request()\n\
+     <Message>CONVERSION_END_REQUEST:	conversion-end-request()\n\
+     <Message>CONVERSION_OPEN_REQUEST:	conversion-open-request()\n\
+     <Message>CONVERSION_CLOSE_REQUEST:	conversion-close-request()\n\
+     <Message>CONVERSION_CLOSE:		conversion-close()\n\
+     <Message>CONVERSION_XY_NOTIFY:	conversion-xy-notify()\n\
+     <Message>CONVERSION_COLOR_NOTIFY:	conversion-color-notify()\n\
+     <Message>CONVERSION_FONTS_NOTIFY:	conversion-fonts-notify()\n\
+     <Message>CONVERSION_ATTRIBUTE_NOTIFY: conversion-attribute-notify()\n\
+     <Prop>_XLC_ON_THE_SPOT:	xlc-on-the-spot-changed()\n\
+     <SelReq>:	selection-request()\n\
+     <SelClr>:	selection-clear()";
+
+/*- static function declarations -*/
+static void Initialize(), Destroy();
+static void Realize();
+static Boolean SetValues();
+
+static void getAtoms();
+static Boolean ownSelection();
+
+static ConvClient *findClient();
+static ConvClient *newClient();
+static Widget attachConverter();
+static void detachConverter();
+static void jinputDetach();
+static void deleteClient();
+
+static Boolean isCorrectClientEvent();
+static Boolean isCorrectWindowID();
+
+static void myStartConversion();
+static void myChangeAttributes();
+
+static void getJinputInitialProperty();
+static void jinputSendReq();
+static void jinputFreeResources();
+static void kinput2FreeResources();
+static void xlcFreeResources();
+static void setAttribute();
+static int getFontsByFontAtoms();
+static int safeGetAttributeProperty();
+static void getAttributeFromProperty1();
+static void getAttributeFromProperty();
+static void getAttributeFromEvent();
+static ConvClient *getXlcDataFromProperty();
+static void initializeError();
+static int parseKeyEvent();
+static char *mystrstr();
+static void getDefaultFontHeight();
+
+static void setJinputProperty();
+static void setKinput2Property();
+static void setXlcProperty();
+static void setXlcStatusProperty();
+static void setXlcBCKey();
+
+static void sendClientMessage();
+static void sendNegativeConversionNotify();
+static void sendConversionNotify();
+static void sendNegativeConversionOpenNotify();
+static void sendConversionOpenNotify();
+static void sendColorRequest();
+static void sendFontRequest();
+static void sendXYRequest();
+
+static void fixCallback();
+static void fixProc();
+static void jinputFix();
+static void endCallback();
+static void endProc();
+static void jinputEnd();
+static void jinputNewTextCallback();
+static void xlcEnd();
+
+static void ClientDead();
+
+/*- KinputProtocolClassRec -*/
+KinputProtocolClassRec kinputProtocolClassRec = {
+  { /* core fields */
+    /* superclass		*/	(WidgetClass) &widgetClassRec,
+    /* class_name		*/	"KinputProtocol",
+    /* widget_size		*/	sizeof(KinputProtocolRec),
+    /* class_initialize		*/	NULL,
+    /* class_part_initialize	*/	NULL,
+    /* class_inited		*/	FALSE,
+    /* initialize		*/	Initialize,
+    /* initialize_hook		*/	NULL,
+    /* realize			*/	Realize,
+    /* actions			*/	actions,
+    /* num_actions		*/	XtNumber(actions),
+    /* resources		*/	resources,
+    /* num_resources		*/	XtNumber(resources),
+    /* xrm_class		*/	NULLQUARK,
+    /* compress_motion		*/	TRUE,
+    /* compress_exposure	*/	TRUE,
+    /* compress_enterleave	*/	TRUE,
+    /* visible_interest		*/	FALSE,
+    /* destroy			*/	Destroy,
+    /* resize			*/	NULL,
+    /* expose			*/	NULL,
+    /* set_values		*/	SetValues,
+    /* set_values_hook		*/	NULL,
+    /* set_values_almost	*/	XtInheritSetValuesAlmost,
+    /* get_values_hook		*/	NULL,
+    /* accept_focus		*/	NULL,
+    /* version			*/	XtVersion,
+    /* callback_private		*/	NULL,
+    /* tm_table			*/	translations,
+    /* query_geometry		*/	XtInheritQueryGeometry,
+    /* display_accelerator	*/	XtInheritDisplayAccelerator,
+    /* extension		*/	NULL
+  },
+  { /* kinputprotocol fields */
+    /* empty			*/	0
+  }
+};
+
+WidgetClass kinputProtocolWidgetClass = (WidgetClass)&kinputProtocolClassRec;
+
+/*
+ *+ Core class methods
+ */
+
+/*- Initialize: intern Atoms -*/
+/* ARGSUSED */
+static void
+Initialize(req, new, args, num_args)
+Widget req;
+Widget new;
+ArgList args;
+Cardinal *num_args;
+{
+    KinputProtocolWidget kpw = (KinputProtocolWidget)new;
+
+    if (kpw->kinput.language == NULL) {
+	initializeError(new, XtNlanguage);
+    } else if (kpw->kinput.inputObjClass == NULL) {
+	initializeError(new, XtNinputObjectClass);
+    } else if (kpw->kinput.displayObjClass == NULL) {
+	initializeError(new, XtNdisplayObjectClass);
+    }
+    kpw->kinput.language = XtNewString(kpw->kinput.language);
+    kpw->kinput.clients = (ConvClient *)NULL;
+    getDefaultFontHeight(kpw);
+    getAtoms(kpw);
+}
+
+/*- Destroy: free allocated memory -*/
+static void
+Destroy(w)
+Widget w;
+{
+    KinputProtocolWidget kpw = (KinputProtocolWidget)w;
+
+    XtFree(kpw->kinput.language);
+}
+
+/*- Realize: own selection -*/
+static void
+Realize(w, mask, value)
+Widget w;
+XtValueMask *mask;
+XSetWindowAttributes *value;
+{
+    KinputProtocolWidget kpw = (KinputProtocolWidget)w;
+    CoreWidgetClass super = (CoreWidgetClass)XtClass(w)->core_class.superclass;
+
+    (*super->core_class.realize)(w, mask, value);
+
+    setJinputProperty(kpw);
+    setKinput2Property(kpw);
+    setXlcProperty(kpw);
+
+    if (!ownSelection(kpw)) {
+	String params[1];
+	Cardinal num_params;
+
+	params[0] = XtClass(w)->core_class.class_name;
+	num_params = 1;
+	XtAppWarningMsg(XtWidgetToApplicationContext(w),
+			"selectionError", "ownSelection", "WidgetError",
+			"%s: can't own selection", params, &num_params);
+
+	XtDestroyWidget(w);
+    } else {
+	CMPrepareConverter(XtParent(w), XtScreen(w),
+			   separateConversionWidgetClass,
+			   kpw->kinput.inputObjClass,
+			   kpw->kinput.displayObjClass);
+    }
+}
+
+/*- SetValues: not implemented yet -*/
+/* ARGSUSED */
+static Boolean
+SetValues(cur, req, wid, args, num_args)
+Widget cur;
+Widget req;
+Widget wid;
+ArgList args;
+Cardinal *num_args;
+{
+#ifdef notdef
+    KinputProtocolWidget old = (KinputProtocolWidget)cur;
+    KinputProtocolWidget new = (KinputProtocolWidget)wid;
+    Boolean redisplay = False;
+#endif
+
+    return False;
+}
+
+/*
+ *+ atom handling
+ */
+
+/*- getAtoms: intern atoms -*/
+static void
+getAtoms(kpw)
+KinputProtocolWidget kpw;
+{
+    Display *dpy = XtDisplay((Widget)kpw);
+    char buf[256];
+
+    (void)sprintf(buf, "_%s_CONVERSION", kpw->kinput.language);
+    kpw->kinput.convAtom = XInternAtom(dpy, buf, False);
+    if (kpw->kinput.backward_compatible) {
+	(void)sprintf(buf, "%s_CONVERSION", kpw->kinput.language);
+	kpw->kinput.oldConvAtom = XInternAtom(dpy, buf, False);
+    } else {
+	kpw->kinput.oldConvAtom = None;
+    }
+
+    kpw->kinput.ctextAtom = XA_COMPOUND_TEXT(dpy);
+
+#define MAKEATOM(s)	XInternAtom(dpy, s, False)
+
+    kpw->kinput.convStringAtom = MAKEATOM("CONVERSION_STRING");
+    kpw->kinput.convNotifyAtom = MAKEATOM("CONVERSION_NOTIFY");
+    kpw->kinput.convEndAtom = MAKEATOM("CONVERSION_END");
+
+    (void)sprintf(buf, "%s_CONVERSION_VERSION", kpw->kinput.language);
+    kpw->kinput.convVersionAtom = XInternAtom(dpy, buf, False);
+    kpw->kinput.convInitialTypeAtom = MAKEATOM("CONVERSION_INITIAL_TYPE");
+    kpw->kinput.convOpenNotifyAtom = MAKEATOM("CONVERSION_OPEN_NOTIFY");
+    kpw->kinput.convXYRequestAtom = MAKEATOM("CONVERSION_XY_REQUEST");
+    kpw->kinput.convFontsRequestAtom = MAKEATOM("CONVERSION_FONTS_REQUEST");
+    kpw->kinput.convColorRequestAtom = MAKEATOM("CONVERSION_COLOR_REQUEST");
+    kpw->kinput.convCloseNotifyAtom = MAKEATOM("CONVERSION_CLOSE_NOTIFY");
+    kpw->kinput.convAttributeAtom = MAKEATOM("CONVERSION_ATTRIBUTE");
+    kpw->kinput.xlcStatusAtom = MAKEATOM("_XLC_STATUS");
+    kpw->kinput.xlcOnTheSpotAtom = MAKEATOM("_XLC_ON_THE_SPOT");
+    kpw->kinput.xlcBcModifierAtom = MAKEATOM("_XLC_BC_MODIFIER");
+    kpw->kinput.xlcBcKeycodeAtom = MAKEATOM("_XLC_BC_KEYCODE");
+
+    /*
+     * some of the clients who speak Xlc protocol check the existence
+     * of atom "CONVERSION_REQUEST" before starting conversion.
+     * so make it at initialization time.
+     */
+    (void)MAKEATOM("CONVERSION_REQUEST");
+
+#undef MAKEATOM
+}
+
+/*- ownSelection: own conversion selection -*/
+static Boolean
+ownSelection(kpw)
+KinputProtocolWidget kpw;
+{
+    Display *dpy = XtDisplay((Widget)kpw);
+    Window w = XtWindow((Widget)kpw);
+    Boolean res;
+
+    TRACE(("kinputProtocol:ownSelection()\n"));
+    XSetSelectionOwner(dpy, kpw->kinput.convAtom, w, CurrentTime);
+    /* $B0l1~(B SetSelectionOwner $B$7$?8e(B GetSelectionOwner $B$7$F$_$F3N$+$a$k(B */
+    res = XGetSelectionOwner(XtDisplay((Widget)kpw), kpw->kinput.convAtom) == w;
+
+    if (kpw->kinput.backward_compatible) {
+	XSetSelectionOwner(dpy, kpw->kinput.oldConvAtom, w, CurrentTime);
+    }
+
+    return res;
+}
+
+/*
+ *+ client data handling
+ */
+
+/*- findClient: get clientdata of given client -*/
+static ConvClient *
+findClient(kpw, client)
+KinputProtocolWidget kpw;
+Window client;
+{
+    register ConvClient *ccp = kpw->kinput.clients;
+
+    while (ccp != NULL) {
+	if (ccp->reqwin == client) return ccp;
+	ccp = ccp->next;
+    }
+
+    return NULL;
+}
+
+/*- newClient: get a clientdata for new client -*/
+static ConvClient *
+newClient(kpw, client, selection)
+KinputProtocolWidget kpw;
+Window client;
+Atom selection;
+{
+    ConvClient *ccp;
+
+    ccp = XtNew(ConvClient);
+    ccp->protocol = unresolved_protocol;
+    ccp->style = separate_style;	/* default */
+    ccp->protocolwidget = (Widget)kpw;
+    ccp->conversion = NULL;
+    ccp->reqwin = client;
+    ccp->selection = selection;
+    ccp->target = None;
+    ccp->property = None;
+    ccp->esm = ESMethodNone;
+    ccp->data = NULL;
+    ccp->attrmask = 0L;
+    ccp->validattrmask = 0L;
+    ccp->start_proc = NULL;
+    ccp->detach_proc = NULL;
+    ccp->fix_proc = NULL;
+    ccp->end_proc = NULL;
+    ccp->free_resources = NULL;
+
+    ccp->next = kpw->kinput.clients;
+    kpw->kinput.clients = ccp;
+
+    return ccp;
+}
+
+/*- attachConverter: attach converter to the client -*/
+static Widget
+attachConverter(ccp)
+ConvClient *ccp;
+{
+    WidgetClass class;
+    KinputProtocolWidget kpw = (KinputProtocolWidget)ccp->protocolwidget;
+
+    if (ccp->conversion != NULL) return ccp->conversion;
+
+    if (ccp->protocol == unresolved_protocol) {
+	ccp->protocol = kinput1_protocol;
+	ccp->style = separate_style;
+    }
+
+    if (ccp->style == overthespot_style) {
+	class = overTheSpotConversionWidgetClass;
+    } else if (ccp->style == offthespot_style) {
+	class = offTheSpotConversionWidgetClass;
+    } else {
+	class = separateConversionWidgetClass;
+    }
+
+    ccp->conversion = CMGetConverter(XtParent(ccp->protocolwidget),
+				     ccp->reqwin, class,
+				     kpw->kinput.inputObjClass,
+				     kpw->kinput.displayObjClass);
+
+    return ccp->conversion;
+}
+
+/*- detachConverter: detach converter from client -*/
+static void
+detachConverter(ccp)
+ConvClient *ccp;
+{
+    TRACE(("detachConverter(window=0x%lx)\n", ccp->reqwin));
+
+    XtRemoveCallback(ccp->conversion, XtNtextCallback,
+		     fixCallback, (XtPointer)ccp);
+    XtRemoveCallback(ccp->conversion, XtNendCallback,
+		     endCallback, (XtPointer)ccp);
+
+    /* call additional detach proc */
+    if (ccp->detach_proc != NULL) (*ccp->detach_proc)(ccp);
+
+    CMReleaseConverter(XtParent(ccp->protocolwidget), ccp->conversion);
+    ccp->conversion = NULL;
+}
+
+/*- jinputDetach: jinput protocol specific detach processing -*/
+static void
+jinputDetach(client)
+ConvClient *client;
+{
+    XtRemoveCallback(client->conversion, XtNnewTextCallback,
+		     jinputNewTextCallback, (XtPointer)client);
+}
+
+/*- deleteClient: delete specified client -*/
+static void
+deleteClient(client)
+ConvClient *client;
+{
+    KinputProtocolWidget kpw = (KinputProtocolWidget)client->protocolwidget;
+    ConvClient *ccp, *ccp0;
+
+    TRACE(("deleteClient(window=0x%lx)\n", client->reqwin));
+    if (client->conversion != NULL) detachConverter(client);
+    if (client->free_resources != NULL) (*client->free_resources)(client);
+
+    for (ccp = kpw->kinput.clients, ccp0 = NULL;
+	 ccp != NULL;
+	 ccp0 = ccp, ccp = ccp->next) {
+	if (ccp == client) {
+	    if (ccp0 == NULL) {
+		kpw->kinput.clients = ccp->next;
+	    } else {
+		ccp0->next = ccp->next;
+	    }
+	    XtFree((char *)client);
+	    return;
+	}
+    }
+    DPRINT(("deleteClient: cannot find the client in the client list!\n"));
+}
+
+/*
+ *+ utility functions
+ */
+
+/*- isCorrectClientEvent: is the event in correct format? -*/
+static Boolean
+isCorrectClientEvent(kpw, event)
+KinputProtocolWidget kpw;
+XEvent *event;
+{
+    XClientMessageEvent *ev = &(event->xclient);
+    Atom atom = (Atom)ev->data.l[0];
+
+    return (ev->window == XtWindow((Widget)kpw) &&
+	    ev->format == 32 &&
+	    (atom == kpw->kinput.convAtom ||
+	     kpw->kinput.backward_compatible && atom == kpw->kinput.oldConvAtom));
+}
+
+/*- isCorrectWindowID: is the given window ID valid? -*/
+static Boolean
+isCorrectWindowID(w, window)
+Widget w;
+Window window;
+{
+    int status;
+    Window root;
+    int x, y;
+    unsigned int width, height, bwidth, depth;
+    XAEHandle h;
+
+    /*
+     * previous version uses XGetWindowAttributes(), which
+     * issues both GetWindowAttributes and GetGeometry request.
+     * since it is a bit inefficient to issue two requests just
+     * for checking if a window exists, I've changed to use
+     * XGetGeometry which issues only GetGeometry.
+     */
+    h = XAESetIgnoreErrors(XtDisplay(w));
+    status = XGetGeometry(XtDisplay(w), window, &root, &x, &y,
+			  &width, &height, &bwidth, &depth);
+    XAEUnset(h);
+    return status == 0 ? False : True;
+}
+
+/*- myStartConversion: custom version of CControlStartConversion -*/
+static void
+myStartConversion(w, clwin, mask, attrs)
+Widget w;
+Window clwin;
+unsigned long mask;
+ConversionAttributes *attrs;
+{
+    if (mask & CAFonts) {
+	mask |= CAStatusFonts;
+	attrs->status_fonts = attrs->fonts;
+	attrs->num_status_fonts = attrs->num_fonts;
+    } else {
+	mask &= ~CAStatusFonts;
+    }
+    CControlStartConversion(w, clwin, mask, attrs);
+}
+
+/*- myChangeAttributes: custom version of CControlChangeAttributes -*/
+static void
+myChangeAttributes(w, mask, attrs)
+Widget w;
+unsigned long mask;
+ConversionAttributes *attrs;
+{
+    if (mask & CAFonts) {
+	mask |= CAStatusFonts;
+	attrs->status_fonts = attrs->fonts;
+	attrs->num_status_fonts = attrs->num_fonts;
+    } else {
+	mask &= ~CAStatusFonts;
+    }
+    CControlChangeAttributes(w, mask, attrs);
+}
+
+/*- getJinputInitialProperty: get property for jinput protocol and set data -*/
+static void
+getJinputInitialProperty(kpw, ccp, prop, reqtype)
+KinputProtocolWidget kpw;
+ConvClient *ccp;
+Atom prop;
+Atom reqtype;
+{
+    Atom type;
+    int format;
+    unsigned long nitems;
+    long *data;
+    unsigned long bytesafter;
+    JinputData *jdp = (JinputData *)ccp->data;
+
+    XGetWindowProperty(XtDisplay((Widget)kpw), ccp->reqwin, prop, 0L, 11L,
+		       False, reqtype, &type, &format, &nitems,
+		       &bytesafter, (unsigned char **)&data);
+
+    if (type != reqtype) {
+	DPRINT(("getJinputInitialProperty(): unknown property type (%ld)\n", type));
+	return;
+    }
+
+    /* data[0]: version number */
+    if (data[0] != JINPUT_PROTOCOL_VERSION) {
+	DPRINT(("getJinputInitialProperty(): unknown version (0x%lx)\n", data[0]));
+	return;
+    }
+    /* data[1]: requestor window */
+    if (data[1] != ccp->reqwin) {
+	return;
+    }
+    /* data[2]: preedit type */
+    if (data[2] == 3) {
+	/* over-the-spot */
+	ccp->style = overthespot_style;
+    } else {
+	ccp->style = separate_style;
+    }
+    /* data[3]: fold mode (ignore) */
+    /* data[4]: clip mode (ignore) */
+    /* data[5]: multi color mode */
+    if (data[5] == 0) {
+	/* fixed color */
+	ccp->attrmask |= CAColor;
+	/* data[6]: background */
+	ccp->attrs.background = data[6];
+	/* data[7]: foreground */
+	ccp->attrs.foreground = data[7];
+    } else {
+	/* query */
+	DPRINT(("getJinputInitialProperty(): multi-color mode\n"));
+	jdp->state |= JINPUT_MULTI_COLOR;
+    }
+    /* data[8]: multi font mode */
+    if (data[8] == 0) {
+	ccp->attrmask |= CAFonts;
+	ccp->attrs.num_fonts = 2;
+	ccp->attrs.fonts = (XFontStruct **)XtMalloc(sizeof(XFontStruct *) * 2);
+	/* data[9]: font1 */
+	ccp->attrs.fonts[0] = XQueryFont(XtDisplay((Widget)kpw),
+					 (XID)data[9]);	/* should make it safe */
+	/* data[10]: font2 */
+	ccp->attrs.fonts[1] = XQueryFont(XtDisplay((Widget)kpw),
+					 (XID)data[10]);
+    } else {
+	/* query */
+	TRACE(("getJinputInitialProperty(): multi-font mode\n"));
+	jdp->state |= JINPUT_MULTI_FONT;
+    }
+}
+
+/*- jinputSendReq: jinput protocol specific startup processing -*/
+static void
+jinputSendReq(client)
+ConvClient *client;
+{
+    JinputData *jdp = (JinputData *)client->data;
+
+    XtAddCallback(client->conversion, XtNnewTextCallback,
+		  jinputNewTextCallback, (XtPointer)client);
+
+    if (jdp->state & JINPUT_MULTI_COLOR) sendColorRequest(client);
+    if (jdp->state & JINPUT_MULTI_FONT) sendFontRequest(client);
+    if (client->style != separate_style) sendXYRequest(client);
+}
+
+/*- jinputFreeResources: free resources for jinput protocol client -*/
+static void
+jinputFreeResources(client)
+ConvClient *client;
+{
+    XtFree(client->data);
+    if (client->attrmask & CAFonts) {
+	/* free fonts */
+	XFreeFontInfo((char **)NULL, client->attrs.fonts[0], 1);
+	XFreeFontInfo((char **)NULL, client->attrs.fonts[1], 1);
+	XtFree((char *)client->attrs.fonts);
+    }
+}
+
+/*- xlcFreeResources: free resources for xlc protocol client -*/
+static void
+xlcFreeResources(client)
+ConvClient *client;
+{
+    if (client->validattrmask & CAFonts) {
+	/* free fonts */
+	XFreeFontInfo((char **)NULL, client->attrs.fonts[0], 1);
+	XFreeFontInfo((char **)NULL, client->attrs.fonts[1], 1);
+	XtFree((char *)client->attrs.fonts);
+    }
+}
+
+/*- kinput2FreeResources: free resources for kinput2 protocol client -*/
+static void
+kinput2FreeResources(client)
+ConvClient *client;
+{
+    if (client->attrmask & CAFonts) {	/* free fonts */
+	Cardinal i;
+	for (i = 0; i < client->attrs.num_fonts; i++) {
+	    CachedFreeFont(XtDisplay(client->protocolwidget),
+			   client->attrs.fonts[i]);
+	}
+	XtFree((char *)client->attrs.fonts);
+    }
+}
+
+struct proprec {
+    Atom prop;
+    struct proprec *prev;
+};
+
+/*- setAttribute: set conversion attribute (kinput2 only) -*/
+static void
+setAttribute(client, data, precp, fromevent)
+ConvClient *client;
+unsigned long *data;
+struct proprec *precp;	/* to prevent possible inifinite loop */
+Boolean fromevent;
+{
+    int code = CODE_OF_ATTR(*data);
+    int len = LENGTH_OF_ATTR(*data);
+
+#define CHECK_LENGTH(num, name) \
+    if (len != num) { DPRINT(("\tlength of %s attribute is wrong\n", name)); break; }
+
+    TRACE(("setAttribute()\n"));
+    data++;
+    switch (code) {
+    case CONVATTR_NONE:
+	TRACE(("\tNone:\n"));
+	break;
+    case CONVATTR_INDIRECT:
+	CHECK_LENGTH(1, "IndirectAttribute");
+	TRACE(("\tIndirectAttribute:\n"));
+	getAttributeFromProperty1(client, data[0], precp, fromevent);
+	break;
+    case CONVATTR_FOCUS_WINDOW:
+	CHECK_LENGTH(1, "FocusWindow");
+	client->attrmask |= CAFocusWindow;
+	client->attrs.focuswindow = data[0];
+	TRACE(("\tFocusWindow: 0x%lx\n", data[0]));
+	break;
+    case CONVATTR_SPOT_LOCATION:
+	CHECK_LENGTH(1, "SpotLocation");
+	client->attrmask |= CASpotLocation;
+	client->attrs.spotx = UPPER16S(data[0]);
+	client->attrs.spoty = LOWER16S(data[0]);
+	TRACE(("\tSpotLocation: x=%d, y=%d\n", client->attrs.spotx, client->attrs.spoty));
+	break;
+    case CONVATTR_CLIENT_AREA:
+	CHECK_LENGTH(2, "ClientArea");
+	client->attrmask |= CAClientArea;
+	client->attrs.clientarea.x = UPPER16S(data[0]);
+	client->attrs.clientarea.y = LOWER16S(data[0]);
+	client->attrs.clientarea.width = UPPER16U(data[1]);
+	client->attrs.clientarea.height = LOWER16U(data[1]);
+	TRACE(("\tClientArea: %d,%d-%d,%d\n", client->attrs.clientarea.x,client->attrs.clientarea.y,client->attrs.clientarea.width,client->attrs.clientarea.height));
+	break;
+    case CONVATTR_STATUS_AREA:
+	CHECK_LENGTH(2, "StatusArea");
+	client->attrmask |= CAStatusArea;
+	client->attrs.statusarea.x = UPPER16S(data[0]);
+	client->attrs.statusarea.y = LOWER16S(data[0]);
+	client->attrs.statusarea.width = UPPER16U(data[1]);
+	client->attrs.statusarea.height = LOWER16U(data[1]);
+	TRACE(("\tStatusArea: %d,%d-%d,%d\n", client->attrs.statusarea.x,client->attrs.statusarea.y,client->attrs.statusarea.width,client->attrs.statusarea.height));
+	break;
+    case CONVATTR_COLORMAP:
+	CHECK_LENGTH(1, "Colormap");
+	client->attrmask |= CAColormap;
+	client->attrs.colormap = data[0];
+	TRACE(("\tColormap: 0x%lx\n", data[0]));
+	break;
+    case CONVATTR_COLOR:
+	CHECK_LENGTH(2, "Color");
+	client->attrmask |= CAColor;
+	client->attrs.foreground = data[0];
+	client->attrs.background = data[1];
+	TRACE(("\tColor: fg=%ld,bg=%ld\n", data[0], data[1]));
+	break;
+    case CONVATTR_BACKGROUND_PIXMAP:
+	CHECK_LENGTH(1, "BackgroundPixmap");
+	client->attrmask |= CABackgroundPixmap;
+	client->attrs.background_pixmap = data[0];
+	TRACE(("\tBackgroundPixmap: 0x%lx\n", data[0]));
+	break;
+    case CONVATTR_LINE_SPACING:
+	CHECK_LENGTH(1, "LineSpacing");
+	client->attrmask |= CALineSpacing;
+	client->attrs.linespacing = data[0];
+	TRACE(("\tLineSpacing: %ld\n", data[0]));
+	break;
+    case CONVATTR_FONT_ATOMS:
+	if (len < 1) {
+	    DPRINT(("length of FontAtoms attribute is less than 1\n"));
+	    break;
+	}
+	if (client->attrmask & CAFonts) {
+	    /* fonts set more than once -- free previously specified fonts */
+	    Cardinal i;
+	    for (i = 0; i < client->attrs.num_fonts; i++) {
+		CachedFreeFont(XtDisplay(client->protocolwidget),
+			       client->attrs.fonts[i]);
+	    }
+	    XtFree((char *)client->attrs.fonts);
+	}
+	client->attrmask |= CAFonts;
+	client->attrs.num_fonts =
+	  getFontsByFontAtoms(XtDisplay(client->protocolwidget),
+			      (Atom *)data, (Cardinal)len,
+			      &client->attrs.fonts);
+	break;
+    case CONVATTR_CURSOR:
+	CHECK_LENGTH(1, "Cursor");
+	client->attrmask |= CACursor;
+	client->attrs.cursor = data[0];
+	TRACE(("\tCursor: 0x%lx\n", data[0]));
+	break;
+    case CONVATTR_INPUT_STYLE:
+	if (fromevent) {
+	    DPRINT(("InputStyle can't change during conversion\n"));
+	    break;
+	}
+	CHECK_LENGTH(1, "InputStyle");
+	if (data[0] == CONVARG_OVERTHESPOT) {
+	    client->style = overthespot_style;
+	} else if (data[0] == CONVARG_OFFTHESPOT) {
+	    client->style = offthespot_style;
+	} else {
+	    client->style = separate_style;
+	}
+	TRACE(("\tInputStyle: %ld\n", data[0]));
+	break;
+    case CONVATTR_EVENT_CAPTURE_METHOD:
+	if (fromevent) {
+	    DPRINT(("EventCaptureMethod can't change during conversion\n"));
+	    break;
+	}
+	CHECK_LENGTH(1, "EventCaptureMethod");
+	if (data[0] == CONVARG_NONE) {
+	    client->esm = ESMethodNone;
+	} else if (data[0] == CONVARG_SELECT_FOCUS_WINDOW) {
+	    client->esm = ESMethodSelectFocus;
+	} else {
+	    client->esm = ESMethodInputOnly;
+	}
+	TRACE(("\tEventCaptureMethod: %ld\n", data[0]));
+	break;
+    case CONVATTR_USE_EXTENSION:
+	if (fromevent) {
+	    DPRINT(("UseExtension must be specified at conversion startup\n"));
+	    break;
+	}
+	TRACE(("\tUseExtension: not supported\n"));
+	break;
+    default:
+	if (code > 255) {
+	    /* private extension code */
+	    DPRINT(("\tPrivateExtension (code=%d): not supported\n", code));
+	}
+    }
+#undef CHECK_LENGTH
+}
+
+/*- getFontsByFontAtoms: get fonts from 'FONT' atom list (kinput2 only) -*/
+static int
+getFontsByFontAtoms(dpy, atoms, len, fontsp)
+Display *dpy;
+Atom *atoms;
+Cardinal len;
+XFontStruct *** fontsp;
+{
+    XFontStruct **fonts;
+    Cardinal nf, i;
+
+    fonts = (XFontStruct **)XtMalloc(sizeof(XFontStruct *) * len);
+    for (nf = 0, i = 0; i < len; i++) {
+	if ((fonts[nf] = CachedLoadQueryFontByProp(dpy, atoms[i])) == NULL) {
+	    TRACE(("\tcan't load font (atom=%ld)\n", atoms[i]));
+	} else {
+	    TRACE(("\tfont loaded (atom=%ld)\n", atoms[i]));
+	    nf++;
+	}
+    }
+
+    *fontsp = fonts;
+    return nf;
+}
+
+/*- safeGetAttributeProperty: get attribute property safely -*/
+static int
+safeGetAttributeProperty(client, prop, data)
+ConvClient *client;
+Atom prop;
+unsigned long **data;
+{
+    KinputProtocolWidget kpw = (KinputProtocolWidget)client->protocolwidget;
+    int err;
+    Atom type;
+    int format;
+    unsigned long nitems;
+    unsigned long bytesafter;
+    XAEHandle h;
+
+    *data = NULL;
+    
+    h = XAESetIgnoreErrors(XtDisplay((Widget)kpw));
+    err = XGetWindowProperty(XtDisplay((Widget)kpw), client->reqwin, prop,
+			     0L, 1000L, False,
+			     kpw->kinput.convAttributeAtom,
+			     &type, &format, &nitems,
+			     &bytesafter, (unsigned char **)data);
+    XAEUnset(h);
+
+    if (err) {
+	DPRINT(("\tcan't get property value. bad property (0x%lx)?\n", prop));
+	return 0;
+    }else if (format != 32 || type != kpw->kinput.convAttributeAtom) {
+	DPRINT(("\twrong format or type\n"));
+	if (*data != NULL) XtFree((char *)*data);
+	return 0;
+    }
+
+    TRACE(("safeGetAttributeProperty(): returns %ld\n", nitems));
+    return nitems;
+}
+
+/*- getAttributeFromProperty1: get and set attribute data (kinput2 only) -*/
+static void
+getAttributeFromProperty1(client, prop, precp, fromevent)
+ConvClient *client;
+Atom prop;
+struct proprec *precp;
+Boolean fromevent;
+{
+    unsigned long *data, *datap;
+    int nitems;
+    struct proprec prec;
+
+    prec.prop = prop;
+    prec.prev = precp;
+
+    /* try to detect loop */
+    while (precp != NULL) {
+	if (precp->prop == prop) {
+	    DPRINT(("loop detected. property=0x%lx\n", prop));
+	    return;
+	}
+	precp = precp->prev;
+    }
+
+    data = NULL;
+    if ((nitems = safeGetAttributeProperty(client, prop, &data)) <= 0) {
+	return;
+    }
+
+    datap = data;
+    while (nitems > 0) {
+	int alen = LENGTH_OF_ATTR(datap[0]) + 1; /* 1 is for the header */
+
+	if (alen > nitems) break;
+	setAttribute(client, datap, &prec, fromevent);
+	nitems -= alen;
+	datap += alen;
+    }
+    XtFree((char *)data);
+}
+
+/*- getAttributeFromProperty: get and set attribute data (kinput2 only) -*/
+static void
+getAttributeFromProperty(client, prop)
+ConvClient *client;
+Atom prop;
+{
+    TRACE(("getAttributeFromProperty(reqwin=0x%lx, prop=%ld)\n", client->reqwin, prop));
+    getAttributeFromProperty1(client, prop, (struct proprec *)NULL, False);
+}
+
+/*- getAttributeFromEvent: set attribute data specified in an event (kinput2 only) -*/
+static void
+getAttributeFromEvent(client, ev)
+ConvClient *client;
+XEvent *ev;
+{
+    XClientMessageEvent *event = &(ev->xclient);
+    unsigned long *data;
+    int alen;
+
+    TRACE(("getAttributeFromEvent(client=0x%lx)\n", client->reqwin));
+
+    data = (unsigned long *)&(event->data.l[2]);
+    alen = LENGTH_OF_ATTR(data[0]);
+    if (alen >= 3) return;
+
+    setAttribute(client, data, (struct proprec *)NULL, True);
+}
+
+/*- getXlcDataFromProperty: get and set attribute data (xlc only) -*/
+static ConvClient *
+getXlcDataFromProperty(kpw, client, initial)
+KinputProtocolWidget kpw;
+ConvClient *client;
+Boolean initial;
+{
+    unsigned long *data;
+    Atom type;
+    int format;
+    unsigned long nitems;
+    unsigned long bytesafter;
+    int flag;
+    int err;
+
+    TRACE(("getXlcDataFromProperty(initial=%d)\n", initial));
+    data = NULL;
+    err = XGetWindowProperty(XtDisplay((Widget)kpw), XtWindow((Widget)kpw),
+			     kpw->kinput.xlcOnTheSpotAtom,
+			     0L, 1000L, True,
+			     kpw->kinput.xlcOnTheSpotAtom,
+			     &type, &format, &nitems,
+			     &bytesafter, (unsigned char **)&data);
+
+    if (err) {
+	DPRINT(("\tcan't get property value\n"));
+	return NULL;
+    } else if (/* format != 32 || */ type != kpw->kinput.xlcOnTheSpotAtom) {
+	DPRINT(("\twrong format(%d) or type(%ld)\n", format, type));
+	if (data != NULL) XtFree((char *)data);
+	return NULL;
+    } else if (nitems < 17) {
+	/* it seems that the current implementation of Xlc library
+	 * (client-side library for XLC protocol) has a bug.
+	 * it seems to set number of bytes instead of number of items
+	 * when calling XChangeProperty().
+	 */
+	DPRINT(("\twrong length (%ld)\n", nitems));
+	return NULL;
+    }
+
+    if (client == NULL) {
+	if ((client = findClient(kpw, (Window)data[1])) == NULL) {
+	    TRACE(("\tcreate new client rec. for the window ID\n"));
+	    /* check validity of the client window ID */
+	    if (!isCorrectWindowID(kpw, (Window)data[1])) {
+		DPRINT(("getXlcDataFromProperty(): client window doesn't exist\n"));
+		return NULL;
+	    }
+	    client = newClient(kpw, (Window)data[1], None);
+	    client->protocol = xlc_protocol;
+	    client->style = overthespot_style;
+	    client->esm = ESMethodInputOnly;
+	    client->end_proc = xlcEnd;
+	    client->free_resources = xlcFreeResources;
+	    MyAddEventHandler(XtDisplay((Widget)kpw), client->reqwin,
+			      DestroyNotify, StructureNotifyMask,
+			      ClientDead, (XtPointer)client);
+	    initial = True;
+	}
+    } else {
+	if (data[1] != client->reqwin) {
+	    DPRINT(("\twindow ID isn't the requestor window ID\n"));
+	    return NULL;
+	}
+    }
+    TRACE(("\t%ld items read\n", nitems));
+
+    flag = data[0];
+    if (flag & XLC_AUTO_REPLACE) {
+	/* set auto spot forwarding */
+	/* XXX */
+	TRACE(("\tauto spot forwarding\n"));
+    }
+    if (flag & XLC_ALL_INFORMATION) {
+	/* foreground / background colors */
+	if (!initial &&
+	    (client->validattrmask & CAColor) &&
+	    client->attrs.foreground == data[5] &&
+	    client->attrs.background == data[6]) {
+	    client->attrmask &= ~CAColor;
+	} else {
+	    client->attrs.foreground = data[5];
+	    client->attrs.background = data[6];
+	    client->attrmask |= CAColor;
+	}
+	client->validattrmask |= CAColor;
+	TRACE(("\tColor: fg=%ld,bg=%ld\n", data[5], data[6]));
+
+	/* fonts */
+	if (data[7] == 0L || data[8] == 0L) {
+	    /* invalid */
+	    if (client->validattrmask & CAFonts) {
+		XFreeFontInfo((char **)NULL, client->attrs.fonts[0], 1);
+		XFreeFontInfo((char **)NULL, client->attrs.fonts[2], 1);
+		XFree((char *)client->attrs.fonts);
+		client->validattrmask &= ~CAFonts;
+	    }
+	    client->attrmask &= ~CAFonts;
+	} else {
+	    if (!initial &&
+		(client->validattrmask & CAFonts) &&
+		client->attrs.fonts[0]->fid == data[7] &&
+		client->attrs.fonts[1]->fid == data[8]) {
+		client->attrmask &= ~CAFonts;
+	    } else if (client->validattrmask & CAFonts) {
+		if (client->attrs.fonts[0]->fid != data[7]) {
+		    XFreeFontInfo((char **)NULL, client->attrs.fonts[0], 1);
+		    client->attrs.fonts[0] = XQueryFont(XtDisplay((Widget)kpw),
+							(XID)data[7]);
+		}
+		if (client->attrs.fonts[1]->fid != data[8]) {
+		    XFreeFontInfo((char **)NULL, client->attrs.fonts[1], 1);
+		    client->attrs.fonts[1] = XQueryFont(XtDisplay((Widget)kpw),
+							(XID)data[8]);
+		}
+		client->attrmask |= CAFonts;
+	    } else {
+		client->attrs.num_fonts = 2;
+		client->attrs.fonts =
+		  (XFontStruct **)XtMalloc(sizeof(XFontStruct *) * 2);
+		client->attrs.fonts[0] = XQueryFont(XtDisplay((Widget)kpw),
+						    (XID)data[7]);
+		client->attrs.fonts[1] = XQueryFont(XtDisplay((Widget)kpw),
+						    (XID)data[8]);
+		client->attrmask |= CAFonts;
+	    }
+	    client->validattrmask |= CAFonts;
+	    TRACE(("\tFonts: 0x%lx, 0x%lx\n", data[7], data[8]));
+	}
+    }
+    if (flag & (XLC_ALL_INFORMATION | XLC_FRAME_INFORMATION)) {
+	/* frame (client area) */
+	if (!initial &&
+	    (client->validattrmask & CAClientArea) &&
+	    client->attrs.clientarea.x == data[10] &&
+	    client->attrs.clientarea.y == data[11] &&
+	    client->attrs.clientarea.width == data[12] &&
+	    client->attrs.clientarea.height == data[13]) {
+	    client->attrmask &= ~CAClientArea;
+	} else {
+	    client->attrs.clientarea.x = data[10];
+	    client->attrs.clientarea.y = data[11];
+	    client->attrs.clientarea.width = data[12];
+	    client->attrs.clientarea.height = data[13];
+	    if (data[12] == 0 || data[13] == 0) {
+		client->attrmask &= ~CAClientArea;
+	    } else {
+		client->attrmask |= CAClientArea;
+	    }
+	}
+	client->validattrmask |= CAClientArea;
+	TRACE(("\tClientArea: %ld,%ld-%ld,%ld\n",
+	       data[10],data[11],data[12],data[13]));
+    }
+    if (flag & (XLC_ALL_INFORMATION | XLC_FRAME_INFORMATION | XLC_OFFSET_INFORMATION)) {
+	/* spot location */
+	client->attrmask |= CASpotLocation;	/* always set spot location */
+	client->attrs.spotx = data[14];
+	client->attrs.spoty = data[15] +
+	  ((client->validattrmask & CAFonts) ?
+		client->attrs.fonts[0]->ascent : kpw->kinput.defaultascent);
+	client->validattrmask |= CASpotLocation;
+	TRACE(("\tSpotLocation: x=%ld, y=%ld\n", data[14], data[15]));
+
+	/* line spacing */
+	if (!initial &&
+	    (client->validattrmask & CALineSpacing) &&
+	    client->attrs.linespacing == data[16]) {
+	    client->attrmask &= ~CALineSpacing;
+	} else {
+	    client->attrmask |= CALineSpacing;
+	    client->attrs.linespacing = data[16];
+	}
+	client->validattrmask |= CALineSpacing;
+	TRACE(("\tLineSpacing: %ld\n", data[16]));
+    }
+
+    XtFree((char *)data);
+    return client;
+}
+
+/*- initializeError: display error message when resource isn't specified -*/
+static void
+initializeError(w, resname)
+Widget w;
+String resname;
+{
+    String params[2];
+    Cardinal num_params;
+
+    params[0] = XtClass(w)->core_class.class_name;
+    params[1] = resname;
+    num_params = 2;
+    XtAppErrorMsg(XtWidgetToApplicationContext(w),
+		  "initializeError", "noResource", "WidgetError",
+		  "%s: resource %s must be specified at widget creation",
+		  params, &num_params);
+}
+
+/*- parseKeyEvent: parses key event description and get keycode and modmask -*/
+static int
+parseKeyEvent(dpy, s, codep, modmaskp)
+Display *dpy;
+char *s;
+long *codep;
+long *modmaskp;
+{
+    char *mod, *key;
+    char *p;
+    KeySym keysym;
+    char buf[128];
+
+    /*
+     * keyevent description (stored in  argument 's') must be of the
+     * following format:
+     *		modifier-list<Key>keysym
+     * modifier-list is a combination of:
+     *		Ctrl, Shift, Lock, Meta, Alt, Mod1, Mod2, Mod3, Mod4, Mod5
+     */
+
+    strcpy(buf, s);
+
+    /* find "<Key>" */
+    if ((p = mystrstr(buf, "<Key>")) != NULL) {
+	key = p + 5;	/* p + strlen("<Key>") */
+    } else if ((p = mystrstr(buf, "<KeyPress>")) != NULL) {
+	key = p + 10;	/* p + strlen("<KeyPress>") */
+    } else if ((p = mystrstr(buf, "<KeyDown>")) != NULL) {
+	key = p + 9;	/* p + strlen("<KeyDown>") */
+    } else {
+	return 0;
+    }
+    mod = buf;
+    *p = '\0';
+
+    /* get modifier mask */
+    *modmaskp = 0;
+    if (mystrstr(mod, "Shift")) *modmaskp |= ShiftMask;
+    if (mystrstr(mod, "Lock")) *modmaskp |= LockMask;
+    if (mystrstr(mod, "Ctrl")) *modmaskp |= ControlMask;
+    if (mystrstr(mod, "Mod1")) *modmaskp |= Mod1Mask;
+    if (mystrstr(mod, "Mod2")) *modmaskp |= Mod2Mask;
+    if (mystrstr(mod, "Mod3")) *modmaskp |= Mod3Mask;
+    if (mystrstr(mod, "Mod4")) *modmaskp |= Mod4Mask;
+    if (mystrstr(mod, "Mod5")) *modmaskp |= Mod5Mask;
+    if (mystrstr(mod, "Meta")) *modmaskp |= Mod1Mask;
+    if (mystrstr(mod, "Alt")) *modmaskp |= Mod1Mask;
+
+    /* get keycode */
+    if ((keysym = XStringToKeysym(key)) == NoSymbol) return 0;
+    if ((*codep = (long)XKeysymToKeycode(dpy, keysym)) == 0) return 0;
+    return 1;
+}
+
+/*- mystrstr: not-so-good implementaion of ANSI strstr() -*/
+static char *
+mystrstr(s1, s2)
+char *s1;
+char *s2;
+{
+    char *p, *q;
+
+    while (*(p = s1++) != '\0') {
+	q = s2;
+	do {
+	    if (*q == '\0') return s1 - 1;
+	} while (*p++ == *q++);
+    }
+    return NULL;
+}
+
+/*- getDefaultFontHeight: get default font ascent (for xlc protocol) -*/
+static void
+getDefaultFontHeight(kpw)
+KinputProtocolWidget kpw;
+{
+    Widget obj;
+
+    obj = XtCreateWidget("displayObj", kpw->kinput.displayObjClass,
+			 (Widget)kpw, NULL, 0);
+    (void)CDLineHeight(obj, &kpw->kinput.defaultascent);
+    XtDestroyWidget(obj);
+}
+
+/*
+ *+ property handling
+ */
+
+/*- setJinputProperty: set version property for jinput protocol -*/
+static void
+setJinputProperty(kpw)
+KinputProtocolWidget kpw;
+{
+    long version;
+
+    version = JINPUT_PROTOCOL_VERSION;
+    XChangeProperty(XtDisplay((Widget)kpw), XtWindow((Widget)kpw),
+		    kpw->kinput.convVersionAtom, XA_INTEGER, 32,
+		    PropModeReplace, (unsigned char *)&version, 1);
+}
+
+/*- setKinput2Property: set version property for kinput2 protocol -*/
+static void
+setKinput2Property(kpw)
+KinputProtocolWidget kpw;
+{
+    Display *dpy = XtDisplay((Widget)kpw);
+    Atom property;
+    Atom type;
+    unsigned long profile[10];
+
+    property = XInternAtom(dpy, CONVERSION_PROFILE, False);
+    type = XInternAtom(dpy, CONVERSION_ATTRIBUTE_TYPE, False);
+
+    profile[0] = CONV_ATTR(CONVPROF_PROTOCOL_VERSION, 1);
+    profile[1] = XInternAtom(dpy, PROTOCOL_VERSION, False);
+    profile[2] = CONV_ATTR(CONVPROF_SUPPORTED_STYLES, 1);
+    profile[3] = CONVARG_ROOTWINDOW|CONVARG_OFFTHESPOT|CONVARG_OVERTHESPOT;
+
+    XChangeProperty(dpy, XtWindow((Widget)kpw),
+		    property, type, 32, PropModeReplace,
+		    (unsigned char *)profile, 4);
+}
+
+/*- setXlcProperty: set initial status property for xlc protocol -*/
+static void
+setXlcProperty(kpw)
+KinputProtocolWidget kpw;
+{
+    setXlcStatusProperty(kpw, 0);
+    setXlcBCKey(kpw);
+}
+
+/*- setXlcStatusProperty: set status property for xlc protocol -*/
+static void
+setXlcStatusProperty(kpw, status)
+KinputProtocolWidget kpw;
+int status;
+{
+    XChangeProperty(XtDisplay((Widget)kpw), XtWindow((Widget)kpw),
+		    kpw->kinput.xlcStatusAtom, XA_INTEGER, 32,
+		    PropModeReplace, (unsigned char *)&status, 1);
+}
+
+/*- setXlcBCKey: set conversion start key code property for xlc protocol -*/
+static void
+setXlcBCKey(kpw)
+KinputProtocolWidget kpw;
+{
+    long code;
+    long mask;
+
+    if (kpw->kinput.xlcstartkey == NULL) return;
+    if (parseKeyEvent(XtDisplay((Widget)kpw), kpw->kinput.xlcstartkey,
+		    &code, &mask) == 0) {
+	String params[1];
+	Cardinal num_params;
+
+	params[0] = XtClass((Widget)kpw)->core_class.class_name;
+	num_params = 1;
+	XtAppWarningMsg(XtWidgetToApplicationContext((Widget)kpw),
+			"parseError", XtNxlcConversionStartKey, "WidgetError",
+			"%s: can't parse coversion start key string",
+			params, &num_params);
+	return;
+    }
+
+    TRACE(("setXlcBCKey(): keycode=%ld, mask=0x%lx\n", code, mask));
+
+    XChangeProperty(XtDisplay((Widget)kpw), XtWindow((Widget)kpw),
+		    kpw->kinput.xlcBcModifierAtom, XA_INTEGER, 32,
+		    PropModeReplace, (unsigned char *)&mask, 1);
+    XChangeProperty(XtDisplay((Widget)kpw), XtWindow((Widget)kpw),
+		    kpw->kinput.xlcBcKeycodeAtom, XA_INTEGER, 32,
+		    PropModeReplace, (unsigned char *)&code, 1);
+}
+
+/*
+ *+ event sending
+ */
+
+/*- sendClientMessage: send a clientmessage event -*/
+static void
+sendClientMessage(dpy, window, type, l0, l1, l2, l3, l4)
+Display *dpy;
+Window window;
+Atom type;
+long l0, l1, l2, l3, l4;
+{
+    XEvent event;
+
+    event.xclient.type = ClientMessage;
+    event.xclient.window = window;
+    event.xclient.message_type = type;
+    event.xclient.format = 32;
+    event.xclient.data.l[0] = l0;
+    event.xclient.data.l[1] = l1;
+    event.xclient.data.l[2] = l2;
+    event.xclient.data.l[3] = l3;
+    event.xclient.data.l[4] = l4;
+
+    XSendEvent(dpy, window, False, NoEventMask, &event);
+}
+
+/*- sendNegativeConversionNotify: send negative conversion-notify event -*/
+static void
+sendNegativeConversionNotify(kpw, window, selection)
+KinputProtocolWidget kpw;
+Window window;
+Atom selection;
+{
+    TRACE(("sendNegativeConversionNotify(window=0x%lx)\n", window));
+    sendClientMessage(XtDisplay((Widget)kpw), window,
+		      kpw->kinput.convNotifyAtom,
+		      (long)selection, (long)None, 0L, 0L, 0L);
+}
+
+/*- sendConversionNotify: send conversion-notify event -*/
+static void
+sendConversionNotify(ccp)
+ConvClient *ccp;
+{
+    KinputProtocolWidget kpw = (KinputProtocolWidget)ccp->protocolwidget;
+    long l4;
+
+    TRACE(("sendConversionNotify(reqwin=0x%lx)\n", ccp->reqwin));
+    if (ccp->protocol == xlc_protocol) {
+	l4 = (long)kpw->kinput.xlcOnTheSpotAtom;
+    } else {
+	l4 = 0L;
+    }
+    sendClientMessage(XtDisplay((Widget)kpw), ccp->reqwin,
+		      kpw->kinput.convNotifyAtom,
+		      (long)ccp->selection, (long)ccp->target,
+		      (long)ccp->property, (long)XtWindow(ccp->conversion),
+		      l4);
+}
+
+/*- sendNegativeConversionOpenNotify: send negative conversion-open-notify event -*/
+static void
+sendNegativeConversionOpenNotify(kpw, window, selection)
+KinputProtocolWidget kpw;
+Window window;
+Atom selection;
+{
+    TRACE(("sendNegativeConversionOpenNotify(window=0x%lx)\n", window));
+    sendClientMessage(XtDisplay((Widget)kpw), window,
+		      kpw->kinput.convOpenNotifyAtom,
+		      (long)selection, 0L, (long)XtWindow(kpw), 0L, 0L);
+}
+
+/*- sendConversionOpenNotify: send conversion-open-notify event -*/
+static void
+sendConversionOpenNotify(ccp)
+ConvClient *ccp;
+{
+    KinputProtocolWidget kpw = (KinputProtocolWidget)ccp->protocolwidget;
+
+    TRACE(("sendConversionOpenNotify(reqwin=0x%lx)\n", ccp->reqwin));
+    sendClientMessage(XtDisplay((Widget)kpw), ccp->reqwin,
+		      kpw->kinput.convOpenNotifyAtom,
+		      (long)ccp->selection, JINPUT_PROTOCOL_VERSION,
+		      (long)XtWindow((Widget)kpw), 1L, 0L);
+}
+
+/*- sendColorRequest: send color-request event (jinput only) -*/
+static void
+sendColorRequest(ccp)
+ConvClient *ccp;
+{
+    KinputProtocolWidget kpw = (KinputProtocolWidget)ccp->protocolwidget;
+
+    TRACE(("sendColorRequest(reqwin=0x%lx)\n", ccp->reqwin));
+    sendClientMessage(XtDisplay((Widget)kpw), ccp->reqwin,
+		      kpw->kinput.convColorRequestAtom,
+		      (long)ccp->selection, JINPUT_PROTOCOL_VERSION,
+		      (long)XtWindow((Widget)kpw), 0L, 0L);
+}
+
+/*- sendFontRequest: send font-request event (jinput only) -*/
+static void
+sendFontRequest(ccp)
+ConvClient *ccp;
+{
+    KinputProtocolWidget kpw = (KinputProtocolWidget)ccp->protocolwidget;
+
+    TRACE(("sendFontRequest(reqwin=0x%lx)\n", ccp->reqwin));
+    sendClientMessage(XtDisplay((Widget)kpw), ccp->reqwin,
+		      kpw->kinput.convFontsRequestAtom,
+		      (long)ccp->selection, JINPUT_PROTOCOL_VERSION,
+		      (long)XtWindow((Widget)kpw), 0L, 0L);
+}
+
+/*- sendXYRequest: send XY-request event (jinput only) -*/
+static void
+sendXYRequest(ccp)
+ConvClient *ccp;
+{
+    KinputProtocolWidget kpw = (KinputProtocolWidget)ccp->protocolwidget;
+
+    TRACE(("sendXYRequest(reqwin=0x%lx)\n", ccp->reqwin));
+    sendClientMessage(XtDisplay((Widget)kpw), ccp->reqwin,
+		      kpw->kinput.convXYRequestAtom,
+		      (long)ccp->selection, JINPUT_PROTOCOL_VERSION,
+		      (long)XtWindow((Widget)kpw), 0L, 0L);
+}
+
+/*
+ *+ callback procedures
+ */
+
+/*- fixCallback: fix callback -*/
+/* ARGSUSED */
+static void
+fixCallback(w, client_data, call_data)
+Widget w;
+XtPointer client_data;
+XtPointer call_data;
+{
+    CCTextCallbackArg *arg = (CCTextCallbackArg *)call_data;
+    ConvClient *ccp = (ConvClient *)client_data;
+
+    TRACE(("fixCallback(reqwin=0x%lx, length=%d)\n",ccp->reqwin, arg->length));
+    fixProc(ccp, arg);
+}
+
+/*- fixProc: do actual fix processing -*/
+static void
+fixProc(client, arg)
+ConvClient *client;
+CCTextCallbackArg *arg;
+{
+    /* Property $B$K7k2L$r%;%C%H$9$k(B */
+    XChangeProperty(XtDisplay(client->conversion), client->reqwin,
+		    client->property, arg->encoding, arg->format,
+		    PropModeAppend, (unsigned char *)arg->text, arg->length);
+
+    /* call protocol dependent proc */
+    if (client->fix_proc != NULL) (*client->fix_proc)(client, arg);
+}
+
+/*- jinputFix: jinput protocol specific fix processing -*/
+static void
+jinputFix(client)
+ConvClient *client;
+{
+    JinputData *jdp = (JinputData *)client->data;
+
+    /* spotlocation information is no longer valid */
+    client->attrmask &= ~CASpotLocation;
+
+    if (jdp->state & JINPUT_MULTI_COLOR) sendColorRequest(client);
+    if (jdp->state & JINPUT_MULTI_FONT) sendFontRequest(client);
+    if (client->style != separate_style) sendXYRequest(client);
+}
+
+/*- endCallback: conversion end callback -*/
+/* ARGSUSED */
+static void
+endCallback(w, client_data, call_data)
+Widget w;
+XtPointer client_data;
+XtPointer call_data;
+{
+    ConvClient *ccp = (ConvClient *)client_data;
+    int abort = (int)call_data;
+
+    TRACE(("endCallback(reqwin=0x%lx,abort=%s)\n", ccp->reqwin, abort?"True":"False"));
+    endProc(ccp, abort);
+}
+
+/*- endProc: conversion end processing -*/
+static void
+endProc(client, abort)
+ConvClient *client;
+int abort;
+{
+    KinputProtocolWidget kpw = (KinputProtocolWidget)client->protocolwidget;
+
+    if (!abort) {
+	/* $B%/%i%$%"%s%H$K(B ClientMessage $B$rAw$C$FCN$i$;$k(B
+	 * $B%$%Y%s%H$N%U%)!<%^%C%H$O!"(B
+	 *	window:		requestor window
+	 *	message_type:	"CONVERSION_END"
+	 *	format:		32
+	 *	data.l[0]:	selection
+	 *	data.l[1]:	selection-owner window
+	 */
+	sendClientMessage(XtDisplay((Widget)kpw), client->reqwin,
+			  kpw->kinput.convEndAtom,
+			  (long)client->selection, (long)XtWindow((Widget)kpw),
+			  0L, 0L, 0L);
+    }
+    if (client->conversion != NULL) {
+	XtRemoveCallback(client->conversion, XtNtextCallback,
+			 fixCallback, (XtPointer)client);
+	XtRemoveCallback(client->conversion, XtNendCallback,
+			 endCallback, (XtPointer)client);
+    }
+
+    /* call protocol dependent proc */
+    if (client->end_proc != NULL) {
+	(*client->end_proc)(client, abort);
+    } else {
+	deleteClient(client);
+    }
+}
+
+/*- jinputEnd: jinput specific conversion end processing -*/
+/* ARGSUSED */
+static void
+jinputEnd(client, abort)
+ConvClient *client;
+Boolean abort;		/* UNUSED */
+{
+    /* don't delete client until CONVERSION_CLOSE_REQUEST or client dead */
+    detachConverter(client);
+
+    client->attrmask &= ~CASpotLocation;
+}
+
+/*- jinputNewTextCallback: jinput protocol specific new text callback -*/
+/* ARGSUSED */
+static void
+jinputNewTextCallback(w, client_data, call_data)
+Widget w;
+XtPointer client_data;
+XtPointer call_data;
+{
+    ConvClient *ccp = (ConvClient *)client_data;
+
+    TRACE(("jinputNewTextCallback(reqwin=0x%lx)\n",ccp->reqwin));
+    if (ccp->style != separate_style) sendXYRequest(ccp);
+}
+
+/*- xlcEnd: xlc specific conversion end processing -*/
+/* ARGSUSED */
+static void
+xlcEnd(client, abort)
+ConvClient *client;
+Boolean abort;		/* UNUSED */
+{
+    /* don't delete client until CONVERSION_CLOSE or client dead */
+    detachConverter(client);
+
+    client->attrmask &= ~CASpotLocation;
+}
+
+/*
+ *+ ClientMessage event handler
+ */
+
+/*- ConversionOpenRequestProc: CONVERSION_OPEN_REQUEST event handler -*/
+/* ARGSUSED */
+static void
+ConversionOpenRequestProc(w, event, args, num_args)
+Widget w;
+XEvent *event;
+String *args;
+Cardinal *num_args;
+{
+    KinputProtocolWidget kpw = (KinputProtocolWidget)w;
+    XClientMessageEvent	*ev = &event->xclient;
+    int version;
+    Window reqwin;
+    Atom convatom;
+    Atom initproperty;
+    Atom initpropertytype;
+    ConvClient	*ccp;
+    JinputData *jdp;
+
+    TRACE(("ConversionOpenRequestProc(window=0x%lx)\n", ev->data.l[2]));
+    /* is it a correct event? */
+    if (!isCorrectClientEvent(kpw, event)) {
+	/*ignore */
+	DPRINT(("got invalid clientmessage event.\n"));
+	return;
+    }
+
+    convatom = (Atom)ev->data.l[0];
+    version = ev->data.l[1];
+    reqwin = (Window)ev->data.l[2];
+    initproperty = ev->data.l[3];
+    initpropertytype = ev->data.l[4];
+
+    /* check the protocol version & initial property type */
+    /* also check if the client already opened connection */
+    if (version != JINPUT_PROTOCOL_VERSION ||
+	initpropertytype != kpw->kinput.convInitialTypeAtom ||
+	findClient(kpw, reqwin) != NULL) {
+	DPRINT(("ConversionOpenRequestProc(): open denied\n"));
+	sendNegativeConversionOpenNotify(kpw, reqwin, convatom);
+	return;
+    }
+    /* check validity of the client window ID */
+    if (!isCorrectWindowID(w, reqwin)) {
+	DPRINT(("ConversionOpenRequestProc(): requestor window doesn't exist\n"));
+	/* nothing to do */
+	return;
+    }
+
+    ccp = newClient(kpw, reqwin, convatom);
+    ccp->protocol = jinput_protocol;
+    ccp->esm = ESMethodInputOnly;
+    ccp->start_proc = jinputSendReq;
+    ccp->detach_proc = jinputDetach;
+    ccp->fix_proc = jinputFix;
+    ccp->end_proc = jinputEnd;
+    ccp->free_resources = jinputFreeResources;
+    jdp = XtNew(JinputData);
+    jdp->state = 0;
+    ccp->data = (XtPointer)jdp;
+
+    getJinputInitialProperty(kpw, ccp, initproperty, initpropertytype);
+
+    /* watch for client destroy */
+    MyAddEventHandler(XtDisplay(w), reqwin, DestroyNotify, StructureNotifyMask,
+		      ClientDead, (XtPointer)ccp);
+
+    sendConversionOpenNotify(ccp);
+}
+
+/*- ConversionRequestProc: CONVERSION_REQUEST event handler -*/
+/* ARGSUSED */
+static void
+ConversionRequestProc(w, event, args, num_args)
+Widget w;
+XEvent *event;
+String *args;
+Cardinal *num_args;
+{
+    KinputProtocolWidget kpw = (KinputProtocolWidget)w;
+    XClientMessageEvent	*ev = &event->xclient;
+    Window reqwin;
+    Atom convatom;
+    Atom prop;
+    ConvClient	*ccp;
+
+    TRACE(("ConversionRequestProc(window=0x%lx)\n", ev->data.l[1]));
+    /* is it a correct event? */
+    if (!isCorrectClientEvent(kpw, event)) {
+	/*ignore */
+	DPRINT(("got invalid clientmessage event.\n"));
+	return;
+    }
+
+    convatom = (Atom)ev->data.l[0];
+    reqwin = (Window)ev->data.l[1];
+    prop = (Atom)ev->data.l[4];
+    TRACE(("\tatom=0x%lx, reqwin=0x%lx\n", convatom, reqwin));
+
+    if ((ccp = findClient(kpw, reqwin)) == NULL) {
+	/* check validity of the client window ID */
+	if (!isCorrectWindowID(w, reqwin)) {
+	    DPRINT(("ConversionRequestProc(): requestor window doesn't exist\n"));
+	    /* nothing to do */
+	    return;
+	}
+	ccp = newClient(kpw, reqwin, convatom);
+	if (prop == kpw->kinput.xlcOnTheSpotAtom) {
+	    /* xlc protocol */
+	    TRACE(("\txlc protocol\n"));
+	    if (getXlcDataFromProperty(kpw, ccp, True)) {
+		ccp->protocol = xlc_protocol;
+		ccp->style = overthespot_style;
+		ccp->esm = ESMethodInputOnly;
+		ccp->end_proc = xlcEnd;
+		ccp->free_resources = xlcFreeResources;
+		MyAddEventHandler(XtDisplay(w), reqwin,
+				  DestroyNotify, StructureNotifyMask,
+				  ClientDead, (XtPointer)ccp);
+	    } else {
+		TRACE(("\tchanged to kinput protocol\n"));
+		ccp->protocol = kinput1_protocol;
+		ccp->style = separate_style;
+		ccp->esm = ESMethodInputOnly;
+	    }
+	} else if (prop != None) {
+	    /* kinput2 protocol */
+	    TRACE(("\tkinput2 protocol\n"));
+	    ccp->protocol = kinput2_protocol;
+	    ccp->style = separate_style;
+	    ccp->esm = ESMethodInputOnly;
+	    ccp->free_resources = kinput2FreeResources;
+	    /* ccp->fix_proc = sendKeyCode0 */
+	    getAttributeFromProperty(ccp, prop);
+	} else {
+	    /* old protocol */
+	    ccp->protocol = kinput1_protocol;
+	    ccp->style = separate_style;
+	    ccp->esm = ESMethodInputOnly;
+	}
+    } else if (ccp->conversion != NULL) {
+	/* now converting */
+	if (ccp->protocol == xlc_protocol) {
+	    /*
+	     * xlc protocol uses CONVERSION_REQUEST event to notify
+	     * the frontend of changing conversion attribute
+	     */
+	    return;
+	}
+	sendNegativeConversionNotify(kpw, reqwin, convatom);
+	return;
+    } else if (ccp->protocol == xlc_protocol) {
+	if (prop == kpw->kinput.xlcOnTheSpotAtom) {
+	    /* reread property before starting conversion */
+	    (void)getXlcDataFromProperty(kpw, ccp, False);
+	}
+    }
+
+    /* set convatom */
+    if (ccp->selection == None) ccp->selection = convatom;
+
+    if (attachConverter(ccp) == NULL) {
+	sendNegativeConversionNotify(kpw, reqwin, convatom);
+	return;
+    }
+
+    /* set target type (ignore client's request) */
+    ccp->target = kpw->kinput.ctextAtom;
+
+    /* use default property if not specified */
+    if ((ccp->property = ev->data.l[3]) == None) {
+	ccp->property = kpw->kinput.convStringAtom;
+    }
+
+    XtAddCallback(ccp->conversion, XtNtextCallback,
+		  fixCallback, (XtPointer)ccp);
+    XtAddCallback(ccp->conversion, XtNendCallback,
+		  endCallback, (XtPointer)ccp);
+
+    /* startup the conversion window */
+    XtVaSetValues(ccp->conversion, XtNeventSelectMethod, ccp->esm, NULL);
+    myStartConversion(ccp->conversion, ccp->reqwin,
+		      ccp->attrmask, &ccp->attrs);
+
+    /* send ConversionNotify to the client */
+    sendConversionNotify(ccp);
+
+    if (ccp->start_proc != NULL) (*ccp->start_proc)(ccp);
+}
+
+/*- ConversionEndRequestProc: CONVERSION_END_REQUEST event handler -*/
+/* ARGSUSED */
+static void
+ConversionEndRequestProc(w, event, args, num_args)
+Widget w;
+XEvent *event;
+String *args;
+Cardinal *num_args;
+{
+    KinputProtocolWidget kpw = (KinputProtocolWidget)w;
+    XClientMessageEvent	*ev = &event->xclient;
+    Window reqwin;
+    ConvClient	*ccp;
+
+    TRACE(("ConversionEndRequestProc(window=0x%lx)\n", ev->data.l[1]));
+    /* is it a correct event? */
+    if (!isCorrectClientEvent(kpw, event)) {
+	/*ignore */
+	DPRINT(("got invalid clientmessage event.\n"));
+	return;
+    }
+
+    reqwin = (Window)ev->data.l[1];
+    if ((ccp = findClient(kpw, reqwin)) == NULL) {
+	/* request from unknown client. just ignore */
+	DPRINT(("got conversion end request from unknown window\n"));
+	return;
+    }
+
+    if (ccp->conversion != NULL) {
+	CControlEndConversion(ccp->conversion);
+	endProc(ccp, False);
+    }
+}
+
+/*- ConversionCloseRequestProc: CONVERSION_CLOSE_REQUEST event handler (jinput only) -*/
+/* ARGSUSED */
+static void
+ConversionCloseRequestProc(w, event, args, num_args)
+Widget w;
+XEvent *event;
+String *args;
+Cardinal *num_args;
+{
+    KinputProtocolWidget kpw = (KinputProtocolWidget)w;
+    XClientMessageEvent	*ev = &event->xclient;
+    Window reqwin;
+    ConvClient	*ccp;
+
+    TRACE(("ConversionCloseRequestProc(window=0x%lx)\n", ev->data.l[2]));
+    /* is it a correct event? */
+    if (!isCorrectClientEvent(kpw, event)) {
+	/*ignore */
+	DPRINT(("got invalid clientmessage event.\n"));
+	return;
+    }
+    if (ev->data.l[1] != JINPUT_PROTOCOL_VERSION) {
+	/* wrong version number */
+	DPRINT(("ConversionCloseRequestProc(): unknown version number (0x%lx)\n", ev->data.l[1]));
+	return;
+    }
+    reqwin = ev->data.l[2];
+    if ((ccp = findClient(kpw, reqwin)) == NULL) {
+	/* request from unknown client. just ignore */
+	DPRINT(("got conversion end request from unknown window\n"));
+	return;
+    }
+    if (ccp->protocol != jinput_protocol) {
+	DPRINT(("got jinput-specific event from a client that use other protocol\n"));
+	return;
+    }
+
+    MyRemoveEventHandler(XtDisplay(w), reqwin, DestroyNotify,
+			 ClientDead, (XtPointer)ccp);
+
+    deleteClient(ccp);
+}
+
+/*- ConversionXYNotifyProc: CONVERSION_XY_NOTIFY event handler (jinput only) -*/
+/* ARGSUSED */
+static void
+ConversionXYNotifyProc(w, event, args, num_args)
+Widget w;
+XEvent *event;
+String *args;
+Cardinal *num_args;
+{
+    KinputProtocolWidget kpw = (KinputProtocolWidget)w;
+    XClientMessageEvent	*ev = &event->xclient;
+    Window reqwin;
+    ConvClient	*ccp;
+    JinputData *jdp;
+
+    TRACE(("ConversionXYNotifyProc(window=0x%lx)\n", ev->data.l[2]));
+    /* is it a correct event? */
+    if (!isCorrectClientEvent(kpw, event)) {
+	/*ignore */
+	DPRINT(("got invalid clientmessage event.\n"));
+	return;
+    }
+    if (ev->data.l[1] != JINPUT_PROTOCOL_VERSION) {
+	/* wrong version number */
+	DPRINT(("ConversionXYNotifyProc(): unknown version number (0x%lx)\n", ev->data.l[1]));
+	return;
+    }
+    reqwin = ev->data.l[2];
+    if ((ccp = findClient(kpw, reqwin)) == NULL) {
+	/* request from unknown client. just ignore */
+	DPRINT(("got conversion end request from unknown window\n"));
+	return;
+    }
+    if (ccp->protocol != jinput_protocol) {
+	DPRINT(("got jinput-specific event from a client that use other protocol\n"));
+	return;
+    }
+    jdp = (JinputData *)ccp->data;
+    jdp->rawspotx = ev->data.l[3];
+    jdp->rawspoty = ev->data.l[4];
+
+    ccp->attrmask |= CASpotLocation;
+    ccp->attrs.spotx = jdp->rawspotx;
+    ccp->attrs.spoty = jdp->rawspoty +
+      ((ccp->attrmask & CAFonts) ? ccp->attrs.fonts[0]->ascent : 0);
+
+    if (ccp->conversion != NULL) {
+	myChangeAttributes(ccp->conversion, CASpotLocation, &ccp->attrs);
+    }
+}
+
+/*- ConversionColorNotifyProc: CONVERSION_COLOR_NOTIFY event handler (jinput only) -*/
+/* ARGSUSED */
+static void
+ConversionColorNotifyProc(w, event, args, num_args)
+Widget w;
+XEvent *event;
+String *args;
+Cardinal *num_args;
+{
+    KinputProtocolWidget kpw = (KinputProtocolWidget)w;
+    XClientMessageEvent	*ev = &event->xclient;
+    Window reqwin;
+    ConvClient	*ccp;
+
+    TRACE(("ConversionColorNotifyProc(window=0x%lx)\n", ev->data.l[2]));
+    /* is it a correct event? */
+    if (!isCorrectClientEvent(kpw, event)) {
+	/*ignore */
+	DPRINT(("got invalid clientmessage event.\n"));
+	return;
+    }
+    if (ev->data.l[1] != JINPUT_PROTOCOL_VERSION) {
+	/* wrong version number */
+	DPRINT(("ConversionColorNotifyProc(): unknown version number (0x%lx)\n", ev->data.l[1]));
+	return;
+    }
+    reqwin = ev->data.l[2];
+    if ((ccp = findClient(kpw, reqwin)) == NULL) {
+	/* request from unknown client. just ignore */
+	DPRINT(("got conversion end request from unknown window\n"));
+	return;
+    }
+    if (ccp->protocol != jinput_protocol) {
+	DPRINT(("got jinput-specific event from a client that use other protocol\n"));
+	return;
+    }
+    ccp->attrmask |= CAColor;
+    ccp->attrs.background = ev->data.l[3];
+    ccp->attrs.foreground = ev->data.l[4];
+
+    if (ccp->conversion != NULL) {
+	myChangeAttributes(ccp->conversion, CAColor, &ccp->attrs);
+    }
+}
+
+/*- ConversionFontsNotifyProc: CONVERSION_FONTS_NOTIFY event handler (jinput only) -*/
+/* ARGSUSED */
+static void
+ConversionFontsNotifyProc(w, event, args, num_args)
+Widget w;
+XEvent *event;
+String *args;
+Cardinal *num_args;
+{
+    KinputProtocolWidget kpw = (KinputProtocolWidget)w;
+    XClientMessageEvent	*ev = &event->xclient;
+    Window reqwin;
+    ConvClient	*ccp;
+    unsigned long attrmask;
+
+    TRACE(("ConversionFontsNotifyProc(window=0x%lx)\n", ev->data.l[2]));
+    /* is it a correct event? */
+    if (!isCorrectClientEvent(kpw, event)) {
+	/*ignore */
+	DPRINT(("got invalid clientmessage event.\n"));
+	return;
+    }
+    if (ev->data.l[1] != JINPUT_PROTOCOL_VERSION) {
+	/* wrong version number */
+	DPRINT(("ConversionFontsNotifyProc(): unknown version number (0x%lx)\n", ev->data.l[1]));
+	return;
+    }
+    reqwin = ev->data.l[2];
+    if ((ccp = findClient(kpw, reqwin)) == NULL) {
+	/* request from unknown client. just ignore */
+	DPRINT(("got conversion end request from unknown window\n"));
+	return;
+    }
+    if (ccp->protocol != jinput_protocol) {
+	DPRINT(("got jinput-specific event from a client that use other protocol\n"));
+	return;
+    }
+
+    attrmask = CAFonts;
+    if (ccp->attrmask & CAFonts) {
+	if (ccp->attrs.fonts[0]->fid != ev->data.l[3]) {
+	    XFreeFontInfo((char **)NULL, ccp->attrs.fonts[0], 1);
+	    ccp->attrs.fonts[0] = XQueryFont(XtDisplay((Widget)kpw),
+					     (XID)ev->data.l[3]);
+	}
+	if (ccp->attrs.fonts[1]->fid != ev->data.l[4]) {
+	    XFreeFontInfo((char **)NULL, ccp->attrs.fonts[1], 1);
+	    ccp->attrs.fonts[1] = XQueryFont(XtDisplay((Widget)kpw),
+					     (XID)ev->data.l[4]);
+	}
+    } else {
+	ccp->attrmask |= CAFonts;
+	ccp->attrs.num_fonts = 2;
+	ccp->attrs.fonts = (XFontStruct **)XtMalloc(sizeof(XFontStruct *) * 2);
+	ccp->attrs.fonts[0] = XQueryFont(XtDisplay((Widget)kpw),
+					 (XID)ev->data.l[3]);
+	ccp->attrs.fonts[1] = XQueryFont(XtDisplay((Widget)kpw),
+					 (XID)ev->data.l[4]);
+    }
+    if (ccp->attrmask & CASpotLocation) {
+	JinputData *jdp = (JinputData *)ccp->data;
+	ccp->attrs.spotx = jdp->rawspotx;
+	ccp->attrs.spoty = jdp->rawspoty + ccp->attrs.fonts[0]->ascent;
+	attrmask |= CASpotLocation;
+    }
+
+    if (ccp->conversion != NULL) {
+	myChangeAttributes(ccp->conversion, attrmask, &ccp->attrs);
+    }
+}
+
+/*- ConversionAttributeNotifyProc: CONVERSION_ATTRIBUTE_NOTIFY event handler (kinput2 only) -*/
+/* ARGSUSED */
+static void
+ConversionAttributeNotifyProc(w, event, args, num_args)
+Widget w;
+XEvent *event;
+String *args;
+Cardinal *num_args;
+{
+    KinputProtocolWidget kpw = (KinputProtocolWidget)w;
+    XClientMessageEvent	*ev = &event->xclient;
+    Window reqwin;
+    ConvClient	*ccp;
+    XFontStruct **fonts;
+    Cardinal nfonts;
+
+    TRACE(("ConversionAttributeNotifyProc(window=0x%lx)\n", ev->data.l[1]));
+    /* is it a correct event? */
+    if (!isCorrectClientEvent(kpw, event)) {
+	/*ignore */
+	DPRINT(("got invalid clientmessage event.\n"));
+	return;
+    }
+
+    reqwin = (Window)ev->data.l[1];
+    TRACE(("\treqwin=0x%lx\n", reqwin));
+
+    if ((ccp = findClient(kpw, reqwin)) == NULL) {
+	/* request from unknown client. just ignore */
+	DPRINT(("got conversion attribute request from unknown window\n"));
+	return;
+    } else if (ccp->protocol != kinput2_protocol) {
+	DPRINT(("get conversion attribute request from a client that doesn't use kinput2 protocol\n"));
+	return;
+    } else if (ccp->conversion == NULL) {
+	/* not converting (this should not happen) */
+	DPRINT(("got conversion attribute request before conversion start\n"));
+	return;
+    }
+
+    /*
+     * special treat for fonts -- because if they are changed,
+     * you should release old fonts.
+     */
+    if (ccp->attrmask & CAFonts) {
+	fonts = ccp->attrs.fonts;
+	nfonts = ccp->attrs.num_fonts;
+    } else {
+	fonts = NULL;
+	nfonts = 0;
+    }
+
+    ccp->attrmask = 0L;
+    getAttributeFromEvent(ccp, event);
+
+    /* change it */
+    myChangeAttributes(ccp->conversion, ccp->attrmask, &ccp->attrs);
+
+    if (ccp->attrmask & CAFonts) {
+	if (fonts != NULL) {
+	    /* fonts changed -- free old fonts */
+	    Cardinal i;
+	    for (i = 0; i < nfonts; i++) {
+		CachedFreeFont(XtDisplay(w), fonts[i]);
+	    }
+	    XtFree((char *)fonts);
+	}
+    } else {
+	/* restore fonts data */
+	ccp->attrmask = CAFonts;
+	ccp->attrs.fonts = fonts;
+	ccp->attrs.num_fonts = nfonts;
+    }
+}
+
+/*- ConversionCloseProc: CONVERSION_CLOSE event handler (xlc only) -*/
+/* ARGSUSED */
+static void
+ConversionCloseProc(w, event, args, num_args)
+Widget w;
+XEvent *event;
+String *args;
+Cardinal *num_args;
+{
+    KinputProtocolWidget kpw = (KinputProtocolWidget)w;
+    XClientMessageEvent	*ev = &event->xclient;
+    Window reqwin;
+    ConvClient	*ccp;
+
+    TRACE(("ConversionCloseProc(window=0x%lx)\n", ev->data.l[2]));
+    /* is it a correct event? */
+    if (!isCorrectClientEvent(kpw, event)) {
+	/*ignore */
+	DPRINT(("got invalid clientmessage event.\n"));
+	return;
+    }
+    reqwin = ev->data.l[1];
+    if ((ccp = findClient(kpw, reqwin)) == NULL) {
+	/* request from unknown client. just ignore */
+	DPRINT(("got conversion end from unknown window\n"));
+	return;
+    }
+
+    if (ccp->protocol != xlc_protocol && ccp->protocol != kinput1_protocol) {
+	/*
+	 * Only XLC protocol uses this event (CONVERSION_CLOSE ClientMessage),
+	 * so the checking for kinput1 protocol seems to be unnecessary.
+	 * ...Wrong. A client using kinput1 protocol and a client using
+	 * XLC protocol with off-the-spot mode can't be distinguishable
+	 * until you get this event.
+	 */
+	DPRINT(("got xlc-specific event from a client that use other protocol\n"));
+	return;
+    }
+
+    MyRemoveEventHandler(XtDisplay(w), reqwin, DestroyNotify,
+			 ClientDead, (XtPointer)ccp);
+    if (ccp->conversion != NULL) {
+	CControlEndConversion(ccp->conversion);
+	endProc(ccp, False);
+    }
+    if (ccp->protocol == xlc_protocol) deleteClient(ccp);
+}
+
+/*
+ *+ other event handler
+ */
+
+/*- XlcOnTheSpotChangedProc: ProptyNotify of "_XLC_ON_THE_SPOT" handler -*/ 
+/* ARGSUSED */
+static void
+XlcOnTheSpotChangedProc(w, event, args, num_args)
+Widget w;
+XEvent *event;
+String *args;			/* not used */
+Cardinal *num_args;		/* not used */
+{
+    KinputProtocolWidget kpw = (KinputProtocolWidget)w;
+    XPropertyEvent *ev = &(event->xproperty);
+    ConvClient *client;
+
+    TRACE(("XlcOnTheSpotChangedProc(window=0x%lx)\n", ev->window));
+
+    if (ev->window != XtWindow(w) ||
+	ev->atom != kpw->kinput.xlcOnTheSpotAtom) {
+	DPRINT(("\tgot invalid PropertyNotify event.\n"));
+	return;
+    } else if (ev->state != PropertyNewValue) {
+	return;
+    }
+    client = getXlcDataFromProperty(kpw, (ConvClient *)NULL, False);
+    if (client == NULL) return;
+
+    if (client->conversion != NULL) {
+	myChangeAttributes(client->conversion,
+			   client->attrmask, &client->attrs);
+    }
+}
+
+/*- SelectionRequestProc: SelectionRequest event handler -*/
+/*ARGSUSED*/
+static void
+SelectionRequestProc(w, event, args, num_args)
+Widget w;
+XEvent *event;
+String *args;			/* not used */
+Cardinal *num_args;		/* not used */
+{
+    XSelectionRequestEvent *ev = &(event->xselectionrequest);
+    XEvent repl;
+    String params[1];
+    Cardinal num_params;
+
+    repl.xselection.type = SelectionNotify;
+    repl.xselection.requestor = ev->requestor;
+    repl.xselection.selection = ev->selection;
+    repl.xselection.target = ev->target;
+    repl.xselection.property = None;
+    repl.xselection.time = ev->time;
+
+    params[0] = XtClass(w)->core_class.class_name;
+    num_params = 1;
+    XtAppWarningMsg(XtWidgetToApplicationContext(w),
+		    "selectionError", "SelectionRequest", "WidgetError",
+		    "%s: SelectionRequest event received",
+		    params, &num_params);
+
+    XSendEvent(ev->display, ev->requestor, False, NoEventMask, &repl);
+}
+
+/*- SelectionClearProc: SelectionClear event handler -*/
+/* ARGSUSED */
+static void
+SelectionClearProc(w, event, args, num_args)
+Widget w;
+XEvent *event;
+String *args;
+Cardinal *num_args;
+{
+    KinputProtocolWidget kpw = (KinputProtocolWidget)w;
+    ConvClient	*ccp;
+    String params[1];
+    Cardinal num_params;
+
+    /* Selection owner changed. kill myself */
+
+    /*
+     * send ConversionEnd event to the clients before exit
+     */
+    for (ccp = kpw->kinput.clients; ccp; ccp = ccp->next) {
+	if (ccp->reqwin != None) {
+	    if (ccp->conversion != NULL) {
+		CControlEndConversion(ccp->conversion);
+	    }
+	    endProc(ccp, False);
+	}
+    }
+
+    params[0] = XtClass(w)->core_class.class_name;
+    num_params = 1;
+    XtAppWarningMsg(XtWidgetToApplicationContext(w),
+		    "selectionError", "SelectionClear", "WidgetError",
+		    "%s: SelectionClear event received",
+		    params, &num_params);
+
+    XtDestroyWidget(w);
+}
+
+/*- ClientDead: DestroyNotify event handler (jinput and xlc) -*/
+static void
+ClientDead(ev, data)
+XEvent *ev;
+XtPointer data;
+{
+    ConvClient	*ccp = (ConvClient *)data;
+
+    TRACE(("ClientDead(window=0x%lx)\n", ev->xdestroywindow.window));
+    if (ev->type != DestroyNotify ||
+	ev->xdestroywindow.window != ccp->reqwin) return;
+
+    MyRemoveAllEventHandler(ev->xany.display, ccp->reqwin);
+    deleteClient(ccp);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/OffConv.c	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,2045 @@
+#ifndef lint
+static char *rcsid = "$Id: OffConv.c,v 1.44 2001/07/01 13:47:00 ishisone Exp $";
+#endif
+/*
+ * Copyright (c) 1990  Software Research Associates, Inc.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted, provided
+ * that the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Software Research Associates not be
+ * used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission.  Software Research
+ * Associates makes no representations about the suitability of this software
+ * for any purpose.  It is provided "as is" without express or implied
+ * warranty.
+ *
+ * Author:  Makoto Ishisone, Software Research Associates, Inc., Japan
+ */
+
+/*
+ * Note: This file contains TWO widget classes, OffTheSpotConversionWidget
+ *       and its subclass SeparateConversionWidget.
+ */
+
+#include <X11/IntrinsicP.h>
+#include <X11/StringDefs.h>
+#if XtSpecificationRelease > 4
+#include <X11/Xfuncs.h>
+#endif
+#include "CachedAtom.h"
+#include "AsyncErr.h"
+#include "OffConvP.h"
+#include <X11/Xaw/Form.h>
+#include "InputConv.h"
+#include "ConvDisp.h"
+#include "CandPanel.h"
+#include "AuxPanel.h"
+#include "Canvas.h"
+#include "AdoptedShe.h"
+#include "CanvasShel.h"
+#include "ICLabel.h"
+
+#define DEBUG_VAR debug_OffTheSpotConversion
+#include "DebugPrint.h"
+
+/*- resource table for OffTheSpotConversion (SeparateConversion has no resources -*/
+static XtResource off_resources[] = {
+#define offset(field) XtOffset(OffTheSpotConversionWidget, offthespot.field)
+    { XtNleftMargin, XtCMargin, XtRDimension, sizeof(Dimension),
+	offset(leftmargin), XtRImmediate, (XtPointer)2 },
+    { XtNrightMargin, XtCMargin, XtRDimension, sizeof(Dimension),
+	offset(rightmargin), XtRImmediate, (XtPointer)2 },
+#undef offset
+};
+
+/*- default translations -- same as superclass's -*/
+static char off_translations[] = "<Key>: to-inputobj()";
+static char sep_translations[] = "<Key>: to-inputobj()";
+
+/*- declarations of static functions -*/
+static void OffTheSpot_Initialize();
+static void OffTheSpot_Destroy();
+static Boolean OffTheSpot_SetValues();
+static void OffTheSpot_Startup();
+static void OffTheSpot_ConversionFinish();
+static void OffTheSpot_ChangeAttributes();
+static void OffTheSpot_ChangeFocus();
+
+static void Separate_Initialize();
+static void Separate_Startup();
+static void Separate_ConversionFinish();
+static void Separate_ChangeAttributes();
+static void Separate_ChangeFocus();
+
+static Widget CreateDisplayObject();
+static Widget CreateSelectionWidget();
+
+static void SetupDisplayObject();
+static Boolean ResetDisplayObject();
+static void SetupModeWidget();
+static Boolean ResetModeWidget();
+static void SetupCanvasWidget();
+static Boolean ResetCanvasWidget();
+
+static void UpdateText();
+static void UpdateMode();
+
+static void SelectionControl();
+static void SelectionStart();
+static void LocateSelectionPopup();
+static void SelectionEnd();
+static void SelectionSet();
+static void SelectionGet();
+static void SelectionMove();
+
+static Widget CreateAuxWidget();
+static void AuxControl();
+static void AuxStart();
+static void AuxEnd();
+static void AuxChange();
+static void LocateAuxPopup();
+
+static void TextRedisplay();
+static void TextResize();
+
+static void SelectionSelected();
+
+static void computeDisplaySegments();
+static void recomputeDisplaySegments();
+static void computeLastPosition();
+static DisplayFragment * computeDisplayFragments();
+static int widthAvailable();
+static void initialLocation();
+static void nextLocation();
+static DisplayLocation * findLocation();
+static void reconfigureDisplay();
+static void updateDisplay();
+static void updateDisplaySegment();
+static void redrawSegments();
+
+static void eraseCursor();
+static void showCursor();
+static Boolean exposeCursor();
+static void computeCursor();
+
+static void MoveShell();
+static Window getToplevelWindow();
+static void setTransientFor();
+static Boolean intersectRect();
+static void unionRect();
+static DisplayFragment * allocDisplayFragment();
+static void freeDisplayFragments();
+static void destroyDisplayFragments();
+static void allocDisplaySegments();
+static void freeDisplaySegment();
+static void clearAllDisplaySegments();
+static void copyString();
+static void freeString();
+
+/*- composite-extension rec: for enabling non-widget children -*/
+static CompositeClassExtensionRec CompositeExtension = {
+    /* next_extension		*/	NULL,
+    /* record_type		*/	NULLQUARK,
+    /* version			*/	XtCompositeExtensionVersion,
+    /* record_size		*/	sizeof(CompositeClassExtensionRec),
+    /* accept_objects		*/	True,
+};
+
+/*- offTheSpotConversionClass record -*/
+OffTheSpotConversionClassRec offTheSpotConversionClassRec = {
+  { /* core fields */
+    /* superclass		*/	(WidgetClass)&conversionControlClassRec,
+    /* class_name		*/	"OffTheSpotConversion",
+    /* widget_size		*/	sizeof(OffTheSpotConversionRec),
+    /* class_initialize		*/	NULL,
+    /* class_part_initialize	*/	NULL,
+    /* class_inited		*/	FALSE,
+    /* initialize		*/	OffTheSpot_Initialize,
+    /* initialize_hook		*/	NULL,
+    /* realize			*/	XtInheritRealize,
+    /* actions			*/	NULL,
+    /* num_actions		*/	0,
+    /* resources		*/	off_resources,
+    /* num_resources		*/	XtNumber(off_resources),
+    /* xrm_class		*/	NULLQUARK,
+    /* compress_motion		*/	TRUE,
+    /* compress_exposure	*/	TRUE,
+    /* compress_enterleave	*/	TRUE,
+    /* visible_interest		*/	FALSE,
+    /* destroy			*/	OffTheSpot_Destroy,
+    /* resize			*/	XtInheritResize,
+    /* expose			*/	NULL,
+    /* set_values		*/	OffTheSpot_SetValues,
+    /* set_values_hook		*/	NULL,
+    /* set_values_almost	*/	XtInheritSetValuesAlmost,
+    /* get_values_hook		*/	NULL,
+    /* accept_focus		*/	NULL,
+    /* version			*/	XtVersion,
+    /* callback_private		*/	NULL,
+    /* tm_table			*/	off_translations,
+    /* query_geometry		*/	XtInheritQueryGeometry,
+    /* display_accelerator	*/	XtInheritDisplayAccelerator,
+    /* extension		*/	NULL
+  },
+  { /* composite fields */
+    /* geometry_manager		*/	XtInheritGeometryManager,
+    /* change_managed		*/	XtInheritChangeManaged,
+    /* insert_child		*/	XtInheritInsertChild,
+    /* delete_child		*/	XtInheritDeleteChild,
+    /* extension		*/	(XtPointer)&CompositeExtension,
+  },
+  { /* shell fields */
+    /* extension		*/	NULL
+  },
+  { /* wm_shell fields */
+    /* extension		*/	NULL
+  },
+  { /* vendor_shell fields */
+    /* extension		*/	NULL
+  },
+  { /* transient_shell fields */
+    /* extension		*/	NULL
+  },
+  { /* conversionControl fields */
+    /* Startup			*/	OffTheSpot_Startup,
+    /* Finish			*/	OffTheSpot_ConversionFinish,
+    /* ChangeAttributes		*/	OffTheSpot_ChangeAttributes,
+    /* ChangeFocus		*/	OffTheSpot_ChangeFocus,
+    /* TextChange		*/	UpdateText,
+    /* Fix			*/	XtInheritFix,
+    /* ModeChange		*/	UpdateMode,
+    /* SelectionControl		*/	SelectionControl,
+    /* AuxControl		*/	AuxControl,
+  },
+  { /* offTheSpotConversion fields */
+    /* empty			*/	0
+  },
+};
+
+WidgetClass offTheSpotConversionWidgetClass = (WidgetClass)&offTheSpotConversionClassRec;
+
+/*- separateConversionClass record -*/
+SeparateConversionClassRec separateConversionClassRec = {
+  { /* core fields */
+    /* superclass		*/	(WidgetClass)&offTheSpotConversionClassRec,
+    /* class_name		*/	"SeparateConversion",
+    /* widget_size		*/	sizeof(SeparateConversionRec),
+    /* class_initialize		*/	NULL,
+    /* class_part_initialize	*/	NULL,
+    /* class_inited		*/	FALSE,
+    /* initialize		*/	Separate_Initialize,
+    /* initialize_hook		*/	NULL,
+    /* realize			*/	XtInheritRealize,
+    /* actions			*/	NULL,
+    /* num_actions		*/	0,
+    /* resources		*/	NULL,
+    /* num_resources		*/	0,
+    /* xrm_class		*/	NULLQUARK,
+    /* compress_motion		*/	TRUE,
+    /* compress_exposure	*/	TRUE,
+    /* compress_enterleave	*/	TRUE,
+    /* visible_interest		*/	FALSE,
+    /* destroy			*/	NULL,
+    /* resize			*/	XtInheritResize,
+    /* expose			*/	NULL,
+    /* set_values		*/	NULL,
+    /* set_values_hook		*/	NULL,
+    /* set_values_almost	*/	XtInheritSetValuesAlmost,
+    /* get_values_hook		*/	NULL,
+    /* accept_focus		*/	NULL,
+    /* version			*/	XtVersion,
+    /* callback_private		*/	NULL,
+    /* tm_table			*/	sep_translations,
+    /* query_geometry		*/	XtInheritQueryGeometry,
+    /* display_accelerator	*/	XtInheritDisplayAccelerator,
+    /* extension		*/	NULL
+  },
+  { /* composite fields */
+    /* geometry_manager		*/	XtInheritGeometryManager,
+    /* change_managed		*/	XtInheritChangeManaged,
+    /* insert_child		*/	XtInheritInsertChild,
+    /* delete_child		*/	XtInheritDeleteChild,
+    /* extension		*/	(XtPointer)&CompositeExtension,
+  },
+  { /* shell fields */
+    /* extension		*/	NULL
+  },
+  { /* wm_shell fields */
+    /* extension		*/	NULL
+  },
+  { /* vendor_shell fields */
+    /* extension		*/	NULL
+  },
+  { /* transient_shell fields */
+    /* extension		*/	NULL
+  },
+  { /* conversionControl fields */
+    /* Startup			*/	Separate_Startup,
+    /* Finish			*/	Separate_ConversionFinish,
+    /* ChangeAttributes		*/	Separate_ChangeAttributes,
+    /* ChangeFocus		*/	Separate_ChangeFocus,
+    /* TextChange		*/	XtInheritTextChange,
+    /* Fix			*/	XtInheritFix,
+    /* ModeChange		*/	XtInheritModeChange,
+    /* SelectionControl		*/	XtInheritSelectionControl,
+    /* AuxControl		*/	XtInheritAuxControl,
+  },
+  { /* offTheSpotConversion fields */
+    /* empty			*/	0
+  },
+  { /* separateConversion fields */
+    /* empty			*/	0
+  },
+};
+
+WidgetClass separateConversionWidgetClass = (WidgetClass)&separateConversionClassRec;
+
+/*
+ *+ OffTheSpot -- Core class method
+ */
+
+/*- OffTheSpot_Initialize: initalize method for OffTheSpotCoversion -*/
+/* ARGSUSED */
+static void
+OffTheSpot_Initialize(req, new, args, num_args)
+Widget req;
+Widget new;
+ArgList args;
+Cardinal *num_args;
+{
+    OffTheSpotConversionWidget ocw = (OffTheSpotConversionWidget)new;
+
+    (void)CreateDisplayObject(ocw);
+    (void)CreateSelectionWidget(ocw);
+    (void)CreateAuxWidget(ocw);
+
+    ocw->offthespot.canvaswidget = NULL;
+    ocw->offthespot.modewidget = NULL;
+    ocw->offthespot.modeshell = NULL;
+
+    ocw->offthespot.dispsegments = NULL;
+    ocw->offthespot.numsegments = 0;
+    ocw->offthespot.dispsegmentsize = 0;
+    ocw->offthespot.candlist = NULL;
+    ocw->offthespot.numcands = 0;
+    ocw->offthespot.selectionpoppedup = False;
+    ocw->offthespot.auxpoppedup = False;
+}
+
+/*- OffTheSpot_Destroy: destroy method for OffTheSpotCoversion -*/
+static void
+OffTheSpot_Destroy(w)
+Widget w;
+{
+    OffTheSpotConversionWidget ocw = (OffTheSpotConversionWidget)w;
+
+    /* $B%G%#%9%W%l%$%;%0%a%s%H$NNN0h$r2rJ|(B */
+    if (ocw->offthespot.dispsegments) {
+	DisplaySegment *dsp = ocw->offthespot.dispsegments;
+	int i;
+
+	for (i = 0; i < ocw->offthespot.numsegments; i++) {
+	    freeString(&dsp[i].seg);
+	    destroyDisplayFragments(dsp->fragments);
+	}
+	XtFree((char *)dsp);
+    }
+}
+
+/*- OffTheSpot_SetValues: setvalues method for OffTheSpotCoversion -*/
+/* ARGSUSED */
+static Boolean
+OffTheSpot_SetValues(cur, req, new, args, num_args)
+Widget cur;
+Widget req;
+Widget new;
+ArgList args;
+Cardinal *num_args;
+{
+    /* OffTheSpotConversionWidget ocw = (OffTheSpotConversionWidget)new; */
+    return False;
+}
+
+/*
+ *+ OffTheSpot -- ConversionControl class method
+ */
+
+/*- OffTheSpot_Startup: OffTheSpot conversion startup -*/
+static void
+OffTheSpot_Startup(widget, valuemask, value)
+Widget widget;
+unsigned long valuemask;
+ConversionAttributes *value;
+{
+    OffTheSpotConversionWidget ocw = (OffTheSpotConversionWidget)widget;
+    Window toplevel;
+
+    if (!(valuemask & CAStatusArea)) {
+	String params[1];
+	Cardinal num_params = 1;
+
+	params[0] = XtClass(widget)->core_class.class_name;
+	XtAppErrorMsg(XtWidgetToApplicationContext(widget),
+		      "conversionAttributeError", "statusArea", "WidgetError",
+		      "%s: status area must be specified",
+		      params, &num_params);
+    }
+
+    SetupDisplayObject(ocw, valuemask, value);
+    SetupModeWidget(ocw, valuemask, value);
+    SetupCanvasWidget(ocw, valuemask, value);
+
+    /* $BFbIt$N%P%C%U%!$r%/%j%"$9$k(B */
+    clearAllDisplaySegments(ocw);
+
+    /* $B%+!<%=%k$N@_Dj(B */
+    ocw->offthespot.cursorvisible = True;
+    eraseCursor(ocw);
+    ocw->offthespot.cursorvisible = True;
+    initialLocation(ocw, &(ocw->offthespot.cursorlocation));
+    ocw->offthespot.cursorlocation.y += ocw->offthespot.ascent;
+
+    /* WM_TRANSIENT_FOR $B%W%m%Q%F%#$r@5$7$/%;%C%H$9$k(B */
+    toplevel = getToplevelWindow(XtDisplay(widget),
+				 ocw->ccontrol.clientwindow);
+    setTransientFor(ocw->offthespot.selectionshell, toplevel);
+    setTransientFor(ocw->offthespot.auxshell, toplevel);
+
+    /*
+     * OffTheSpotConvesion $B$N(B widget $B<+BN$O%]%C%W%"%C%W$5$;$J$$$,!"(B
+     * $B%P%C%/%(%s%I%?%$%W$N;~$K$O%/%i%$%"%s%H$,$3$N(B widget $B$N(B
+     * $B%&%#%s%I%&$KBP$7$F%$%Y%s%H$rAw$k$N$G(B Realize $B$@$1$7$F$*$/(B
+     */
+    if (!XtIsRealized(widget)) {
+	Arg args[2];
+
+	XtSetArg(args[0], XtNwidth, 1);
+	XtSetArg(args[1], XtNheight, 1);
+	XtSetValues(widget, args, 2);
+	XtRealizeWidget(widget);
+    }
+
+    /* $B%]%C%W%"%C%W$9$k(B */
+    XtPopup(ocw->offthespot.modeshell, XtGrabNone);
+    XtPopup(ocw->offthespot.canvaswidget, XtGrabNone);
+}
+
+/*- OffTheSpot_ConversionFinish: OffTheSpot conversion finish -*/
+/* ARGSUSED */
+static void
+OffTheSpot_ConversionFinish(w)
+Widget w;
+{
+    OffTheSpotConversionWidget ocw = (OffTheSpotConversionWidget)w;
+    XAEHandle h;
+
+    /* Popdown and unrealize textcanvas and mode widget
+     *	we must be careful here. if clientwindow are destroyed,
+     *	the text canvas and mode widget are also destroyed.
+     *	we have to popdown and unrealize those widgets, but if
+     *	they are destroyed, BadWindow error will be generated.
+     *	so we must set own error handler that ignores errors.
+     */
+    h = XAESetIgnoreErrors(XtDisplay(w));
+    XtPopdown(ocw->offthespot.modeshell);
+    XtUnrealizeWidget(ocw->offthespot.modeshell);
+    XtPopdown(ocw->offthespot.canvaswidget);
+    XtUnrealizeWidget(ocw->offthespot.canvaswidget);
+    XAEUnset(h);
+
+    if (ocw->offthespot.selectionpoppedup) {
+	XtPopdown(ocw->offthespot.selectionshell);
+	ocw->offthespot.selectionpoppedup = False;
+    }
+    if (ocw->offthespot.auxpoppedup) {
+	XtPopdown(ocw->offthespot.auxshell);
+	ocw->offthespot.auxpoppedup = False;
+    }
+}
+
+/*- OffTheSpot_ChangeAttributes: OffTheSpot conversion attribute change -*/
+/* ARGSUSED */
+static void
+OffTheSpot_ChangeAttributes(w, valuemask, value)
+Widget w;
+unsigned long valuemask;
+ConversionAttributes *value;
+{
+    OffTheSpotConversionWidget ocw = (OffTheSpotConversionWidget)w;
+    Boolean redraw, reconfig;
+
+    if (ResetModeWidget(ocw, valuemask, value) &&
+	XtIsRealized(ocw->offthespot.modewidget)) {
+	XClearArea(XtDisplay(w), XtWindow((Widget)ocw->offthespot.modewidget),
+		   0, 0, 0, 0, True);
+    }
+
+    redraw = ResetDisplayObject(ocw, valuemask, value);
+    reconfig = ResetCanvasWidget(ocw, valuemask, value);
+
+    if (reconfig) {
+	TextResize(ocw->offthespot.canvaswidget, (XtPointer)w, (XtPointer)NULL);
+    } else if (redraw && XtIsRealized(ocw->offthespot.canvaswidget)) {
+	XClearArea(XtDisplay(w), XtWindow(ocw->offthespot.canvaswidget),
+		   0, 0, 0, 0, True);
+    }
+}
+
+/*- OffTheSpot_ChangeFocus: OffTheSpot focus change -*/
+static void
+OffTheSpot_ChangeFocus(w, set)
+Widget w;
+int set;
+{
+    OffTheSpotConversionWidget ocw = (OffTheSpotConversionWidget)w;
+
+    if (set) {
+	XtPopup(ocw->offthespot.modeshell, XtGrabNone);
+	XtPopup(ocw->offthespot.canvaswidget, XtGrabNone);
+    } else {
+	XtPopdown(ocw->offthespot.modeshell);
+	XtPopdown(ocw->offthespot.canvaswidget);
+    }
+}
+
+/*
+ *+ Separate -- Core class method
+ */
+
+/*- Separate_Initialize: initialize method for SeparateConversion -*/
+/* ARGSUSED */
+static void
+Separate_Initialize(req, new, args, num_args)
+Widget req;
+Widget new;
+ArgList args;
+Cardinal *num_args;
+{
+    SeparateConversionWidget scw = (SeparateConversionWidget)new;
+    Widget inputobj = scw->ccontrol.inputobj;
+    Widget form, canvas, mode, tmp[2];
+
+    form = XtCreateManagedWidget("form", formWidgetClass, (Widget)scw,
+				 NULL, 0);
+    tmp[0] = mode = XtVaCreateWidget("mode", icLabelWidgetClass, form,
+				     XtNlabel, ICGetMode(inputobj),
+				     NULL);
+    (void)XtCreateWidget("display", scw->ccontrol.displayobjclass, mode,
+			 NULL, 0);
+
+    tmp[1] = canvas = XtCreateWidget("text", canvasWidgetClass, form, NULL, 0);
+    XtManageChildren(tmp, 2);
+
+    XtAddCallback(canvas, XtNexposeCallback, TextRedisplay, (XtPointer)scw);
+    XtAddCallback(canvas, XtNresizeCallback, TextResize, (XtPointer)scw);
+
+    XtInstallAccelerators(canvas, (Widget)scw);
+    XtInstallAccelerators(mode, (Widget)scw);
+    XtInstallAccelerators(form, (Widget)scw);
+
+    scw->separate.formwidget = form;
+    scw->offthespot.canvaswidget = canvas;
+    scw->offthespot.modewidget = mode;
+
+}
+
+/*
+ *+ Separate -- ConversionControl class method
+ */
+
+/*- Separate_Startup: Separate conversion startup -*/
+/* ARGSUSED */
+static void
+Separate_Startup(widget, valuemask, value)
+Widget widget;
+unsigned long valuemask;
+ConversionAttributes *value;
+{
+    SeparateConversionWidget scw = (SeparateConversionWidget)widget;
+    Position clx, cly;
+    Dimension clw, clh;
+    Position x, y;
+    Dimension w, h;
+    Dimension dpyWidth, dpyHeight;
+    Window toplevel;
+
+    /* $BFbIt$N%P%C%U%!$r%/%j%"$9$k(B */
+    clearAllDisplaySegments((OffTheSpotConversionWidget)scw);
+
+    /* $B%+!<%=%k$N@_Dj(B */
+    scw->offthespot.cursorvisible = True;
+    eraseCursor((OffTheSpotConversionWidget)scw);
+    scw->offthespot.cursorvisible = True;
+    initialLocation((OffTheSpotConversionWidget)scw,
+		    &(scw->offthespot.cursorlocation));
+    scw->offthespot.cursorlocation.y += scw->offthespot.ascent;
+
+    /* $B=i4|%b!<%I$r@_Dj$9$k(B */
+    XtVaSetValues(scw->offthespot.modewidget,
+		  XtNlabel, ICGetMode(scw->ccontrol.inputobj),
+		  NULL);
+
+    /* $BI=<(0LCV$r7h$a$k(B */
+    clx = scw->ccontrol.client_rootx;
+    cly = scw->ccontrol.client_rooty;
+    clw = scw->ccontrol.client_attr.width;
+    clh = scw->ccontrol.client_attr.height;
+
+    XtRealizeWidget((Widget)scw);
+    w =  scw->core.width;
+    h =  scw->core.height;
+    DPRINT(("Off_the_spot_Startup(): widget size = %dx%d\n", w, h));
+    x =  clx + clw / 2 - w / 2;
+    y =  cly + clh + 8;
+
+    dpyWidth = WidthOfScreen(XtScreen(widget));
+    dpyHeight = HeightOfScreen(XtScreen(widget));
+
+    if (x + w > dpyWidth) x = dpyWidth - w;
+    if (x < 0) x = 0;
+    if (y + h > dpyHeight) {
+	y = cly - h;
+	if (y < 0) y = dpyHeight - h;
+    }
+    MoveShell(widget, x, y);
+
+    /* WM_TRANSIENT_FOR $B%W%m%Q%F%#$r@5$7$/%;%C%H$9$k(B */
+    toplevel = getToplevelWindow(XtDisplay(widget),
+				 scw->ccontrol.clientwindow);
+    setTransientFor((Widget)scw, toplevel);
+
+    /*
+     * This is a kind of a magic word... I don't know why, but without this
+     * the selection popup will appear in wrong size (1x1) at the first time.
+     */
+    XtRealizeWidget(scw->offthespot.selectionshell);
+    XtRealizeWidget(scw->offthespot.auxshell);
+
+    /* $B%]%C%W%"%C%W$9$k(B */
+    XtPopup(widget, XtGrabNone);
+}
+
+/*- Separate_ConversionFinish: Separate conversion finish -*/
+/* ARGSUSED */
+static void
+Separate_ConversionFinish(w)
+Widget w;
+{
+    SeparateConversionWidget scw = (SeparateConversionWidget)w;
+
+    if (scw->offthespot.selectionpoppedup) {
+	XtPopdown(scw->offthespot.selectionshell);
+	scw->offthespot.selectionpoppedup = False;
+    }
+    if (scw->offthespot.auxpoppedup) {
+	XtPopdown(scw->offthespot.auxshell);
+	scw->offthespot.auxpoppedup = False;
+    }
+    XtPopdown(w);
+}
+
+/*- Separate_ChangeAttributes: Separate conversion attribute change -*/
+/* ARGSUSED */
+static void
+Separate_ChangeAttributes(w, mask, value)
+Widget w;
+unsigned long mask;
+ConversionAttributes *value;
+{
+    /* do nothing */
+}
+
+/*- Separate_ChangeFocus: Separate focus change -*/
+/* ARGSUSED */
+static void
+Separate_ChangeFocus(w, set)
+Widget w;
+int set;
+{
+    /* do nothing */
+}
+
+/*
+ *+ sub-widget creation
+ */
+
+/*- CreateDisplayObject: create display object for text drawing -*/
+static Widget
+CreateDisplayObject(ocw)
+OffTheSpotConversionWidget ocw;
+{
+    Widget dispobj;
+
+    dispobj = XtCreateWidget("displayObj", ocw->ccontrol.displayobjclass,
+			     (Widget)ocw, NULL, 0);
+
+    ocw->offthespot.displayobj = dispobj;
+    ocw->offthespot.lineheight = CDLineHeight(dispobj, &ocw->offthespot.ascent);
+
+    return dispobj;
+}
+
+/*- CreateSelectionWidget: create selection widget for selecting candidates -*/
+static Widget
+CreateSelectionWidget(ocw)
+OffTheSpotConversionWidget ocw;
+{
+    Widget shell, sel;
+
+    /* set width/height so that XtRealizeWidget() doesn't cause error */
+    shell = XtVaCreatePopupShell("selectionShell",
+				 transientShellWidgetClass,
+				 (Widget)ocw,
+				 XtNwidth, 1,
+				 XtNheight, 1,
+				 NULL);
+    ocw->offthespot.selectionshell = shell;
+
+    sel = XtCreateManagedWidget("selection", candidatePanelWidgetClass,
+				shell, NULL, 0);
+    (void)XtCreateWidget("display", ocw->ccontrol.displayobjclass, sel,
+			 NULL, 0);
+    XtAddCallback(sel, XtNcallback, SelectionSelected, (XtPointer)ocw);
+    XtInstallAccelerators(sel, (Widget)ocw);
+
+    ocw->offthespot.selectionwidget = sel;
+
+    return shell;
+}
+
+/*- CreateAuxWidget: create aux widget for display auxiliary data -*/
+static Widget
+CreateAuxWidget(ocw)
+OffTheSpotConversionWidget ocw;
+{
+    Widget shell, sel;
+
+    /* set width/height so that XtRealizeWidget() doesn't cause error */
+    shell = XtVaCreatePopupShell("auxShell",
+				 transientShellWidgetClass,
+				 (Widget)ocw,
+				 XtNwidth, 1,
+				 XtNheight, 1,
+				 XtNallowShellResize, True,
+				 NULL);
+    ocw->offthespot.auxshell = shell;
+
+    sel = XtCreateManagedWidget("aux", auxPanelWidgetClass,
+				shell, NULL, 0);
+    (void)XtCreateWidget("display", ocw->ccontrol.displayobjclass, sel,
+			 NULL, 0);
+    XtAddCallback(sel, XtNcallback, SelectionSelected, (XtPointer)ocw);
+    XtInstallAccelerators(sel, (Widget)ocw);
+
+    ocw->offthespot.auxwidget = sel;
+
+    return shell;
+}
+
+/*
+ *+ subwidget configuration
+ */
+
+/*- SetupDisplayObject: do display objetct configuration on conversion startup -*/
+static void
+SetupDisplayObject(ocw, mask, value)
+OffTheSpotConversionWidget ocw;
+unsigned long mask;
+ConversionAttributes *value;
+{
+    /*
+     * order is important. we must set fonts BEFORE anything else,
+     * because it is possible that the fonts previously set in the
+     * display object no longer exist, and if so, that causes BadFont
+     * error when changing GCs.
+     */
+
+    if (mask & CAFonts) {
+	CDSetFonts(ocw->offthespot.displayobj,
+		   value->fonts, value->num_fonts);
+    } else {
+	CDSetFonts(ocw->offthespot.displayobj, (XFontStruct **)NULL, 0);
+    }
+    if (mask & CAColor) {
+	XtVaSetValues(ocw->offthespot.displayobj,
+		      XtNforeground, value->foreground,
+		      XtNbackground, value->background,
+		      NULL);
+    }
+
+    ocw->offthespot.lineheight = CDLineHeight(ocw->offthespot.displayobj,
+					      &ocw->offthespot.ascent);
+}
+
+/*- ResetDisplayObject: do display objetct reconfiguration on attribute change -*/
+static Boolean
+ResetDisplayObject(ocw, mask, value)
+OffTheSpotConversionWidget ocw;
+unsigned long mask;
+ConversionAttributes *value;
+{
+    Boolean redraw = False;
+
+    if (mask & CAColor) {
+	XtVaSetValues(ocw->offthespot.displayobj,
+		      XtNforeground, value->foreground,
+		      XtNbackground, value->background,
+		      NULL);
+	redraw = True;
+    }
+    if (mask & CAFonts) {
+	CDSetFonts(ocw->offthespot.displayobj,
+		   value->fonts, value->num_fonts);
+	redraw = True;
+	ocw->offthespot.lineheight = CDLineHeight(ocw->offthespot.displayobj,
+						  &ocw->offthespot.ascent);
+    }
+    return redraw;
+}
+
+/*- SetupModeWidget: do mode widget configuration (OffTheSpot only) -*/
+static void
+SetupModeWidget(ocw, mask, value)
+OffTheSpotConversionWidget ocw;
+unsigned long mask;
+ConversionAttributes *value;
+{
+    Window clwin = ocw->ccontrol.clientwindow;
+    Widget inputobj = ocw->ccontrol.inputobj;
+    Arg shellarg[10], modearg[10], objarg[10];
+    Cardinal i = 0, j = 0, k = 0;
+
+    XtSetArg(shellarg[i], XtNparentWindow, clwin); i++;
+    XtSetArg(shellarg[i], XtNx, value->statusarea.x); i++;
+    XtSetArg(shellarg[i], XtNy, value->statusarea.y); i++;
+    XtSetArg(shellarg[i], XtNwidth, value->statusarea.width); i++;
+    XtSetArg(shellarg[i], XtNheight, value->statusarea.height); i++;
+
+    XtSetArg(modearg[j], XtNlabel, ICGetMode(inputobj)); j++;
+
+    if (mask & CAColormap) {
+	XtSetArg(modearg[j], XtNcolormap, value->colormap); j++;
+    } else {
+	XtSetArg(modearg[j], XtNcolormap,
+		 DefaultColormapOfScreen(XtScreen((Widget)ocw))); j++;
+    }
+    if (mask & CAColor) {
+	XtSetArg(modearg[j], XtNbackground, value->background); j++;
+	XtSetArg(objarg[k], XtNforeground, value->foreground); k++;
+	XtSetArg(objarg[k], XtNbackground, value->background); k++;
+    } else {
+	XtSetArg(modearg[j], XtNbackground, ocw->core.background_pixel); j++;
+    }
+
+    if (ocw->offthespot.modewidget == NULL) {
+	Widget shell, mode, disp;
+	shell = XtCreatePopupShell("modeShell", adoptedShellWidgetClass,
+				   (Widget)ocw, shellarg, i);
+	mode = XtCreateManagedWidget("mode", icLabelWidgetClass, shell,
+				     modearg, j);
+	disp = XtCreateWidget("display", ocw->ccontrol.displayobjclass, mode,
+			      objarg, k);
+	if (mask & CAStatusFonts) {
+	    CDSetFonts(disp, value->status_fonts, value->num_status_fonts);
+	}
+
+	ocw->offthespot.modeshell = shell;
+	ocw->offthespot.modewidget = mode;
+	ocw->offthespot.modedisplayobj = disp;
+	XtInstallAccelerators(mode, (Widget)ocw);
+    } else {
+	if (mask & CAStatusFonts) {
+	    CDSetFonts(ocw->offthespot.modedisplayobj,
+		       value->status_fonts, value->num_status_fonts);
+	} else {
+	    CDSetFonts(ocw->offthespot.modedisplayobj,
+		       (XFontStruct **)NULL, 0);
+	}
+	XtSetValues(ocw->offthespot.modeshell, shellarg, i);
+	XtSetValues(ocw->offthespot.modewidget, modearg, j);
+	XtSetValues(ocw->offthespot.modedisplayobj, objarg, k);
+    }
+
+    ICLRecomputeSize(ocw->offthespot.modewidget);
+}
+
+/*- ResetModeWidget: do mode widget reconfiguration (OffTheSpot only) -*/
+static Boolean
+ResetModeWidget(ocw, mask, value)
+OffTheSpotConversionWidget ocw;
+unsigned long mask;
+ConversionAttributes *value;
+{
+    Arg shellarg[10], modearg[10], objarg[10];
+    Cardinal i = 0, j = 0, k = 0;
+    Boolean redraw = False;
+
+    if (mask & CAStatusArea) {
+	XtSetArg(shellarg[i], XtNx, value->statusarea.x); i++;
+	XtSetArg(shellarg[i], XtNy, value->statusarea.y); i++;
+	XtSetArg(shellarg[i], XtNwidth, value->statusarea.width); i++;
+	XtSetArg(shellarg[i], XtNheight, value->statusarea.height); i++;
+    }
+
+    if (mask & CAColormap) {
+	XtSetArg(modearg[j], XtNcolormap, value->colormap); j++;
+	redraw = True;
+    }
+    if (mask & CAColor) {
+	XtSetArg(modearg[j], XtNbackground, value->background); j++;
+	XtSetArg(objarg[k], XtNforeground, value->foreground); k++;
+	XtSetArg(objarg[k], XtNbackground, value->background); k++;
+	redraw = True;
+    }
+    XtSetValues(ocw->offthespot.modeshell, shellarg, i);
+    XtSetValues(ocw->offthespot.modewidget, modearg, j);
+    XtSetValues(ocw->offthespot.modedisplayobj, objarg, k);
+
+    if (mask & CAStatusFonts) {
+	CDSetFonts(ocw->offthespot.modedisplayobj,
+		   value->status_fonts, value->num_status_fonts);
+	ICLRecomputeSize(ocw->offthespot.modewidget);
+	redraw = True;
+    }
+
+    return redraw;
+}
+
+/*- SetupCanvasWidget: do text canvas configuration on conversion startup -*/
+static void
+SetupCanvasWidget(ocw, mask, value)
+OffTheSpotConversionWidget ocw;
+unsigned long mask;
+ConversionAttributes *value;
+{
+    Window clwin = ocw->ccontrol.clientwindow;
+    Arg arg[10];
+    Cardinal i = 0;
+
+    XtSetArg(arg[i], XtNparentWindow, clwin); i++;
+
+    if (mask & CAClientArea) {
+	XtSetArg(arg[i], XtNx, value->clientarea.x); i++;
+	XtSetArg(arg[i], XtNy, value->clientarea.y); i++;
+	XtSetArg(arg[i], XtNwidth, value->clientarea.width); i++;
+	XtSetArg(arg[i], XtNheight, value->clientarea.height); i++;
+    } else {
+	XtSetArg(arg[i], XtNx, 0); i++;
+	XtSetArg(arg[i], XtNy, 0); i++;
+	XtSetArg(arg[i], XtNwidth, ocw->ccontrol.client_attr.width); i++;
+	XtSetArg(arg[i], XtNheight, ocw->ccontrol.client_attr.height); i++;
+    }
+
+    /* if (mask & CALineSpacing) ... */
+    if (mask & CAColormap) {
+	XtSetArg(arg[i], XtNcolormap, value->colormap); i++;
+    } else {
+	XtSetArg(arg[i], XtNcolormap,
+		 DefaultColormapOfScreen(XtScreen((Widget)ocw))); i++;
+    }
+    if (mask & CAColor) {
+	XtSetArg(arg[i], XtNbackground, value->background); i++;
+    } else {
+	XtSetArg(arg[i], XtNbackground, ocw->core.background_pixel); i++;
+    }
+    if (mask & CACursor) {
+	XtSetArg(arg[i], XtNcursor, value->cursor); i++;
+    } else {
+	XtSetArg(arg[i], XtNcursor, None); i++;
+    }
+
+    if (ocw->offthespot.canvaswidget == NULL) {
+	Widget canvas;
+	canvas = XtCreatePopupShell("text", canvasShellWidgetClass,
+				    (Widget)ocw, arg, i);
+	XtAddCallback(canvas, XtNexposeCallback, TextRedisplay, (XtPointer)ocw);
+	XtAddCallback(canvas, XtNresizeCallback, TextResize, (XtPointer)ocw);
+	XtInstallAccelerators(canvas, (Widget)ocw);
+	ocw->offthespot.canvaswidget = canvas;
+    } else {
+	XtSetValues(ocw->offthespot.canvaswidget, arg, i);
+    }
+}
+
+/*- ResetCanvasWidget: do text canvas reconfiguration on attribute change (OfftheSpot only) -*/
+static Boolean
+ResetCanvasWidget(ocw, mask, value)
+OffTheSpotConversionWidget ocw;
+unsigned long mask;
+ConversionAttributes *value;
+{
+    Arg arg[10];
+    Cardinal i = 0;
+    Boolean redraw = False;
+
+    if (mask & CAClientArea) {
+	XtSetArg(arg[i], XtNx, value->clientarea.x); i++;
+	XtSetArg(arg[i], XtNy, value->clientarea.y); i++;
+	XtSetArg(arg[i], XtNwidth, value->clientarea.width); i++;
+	XtSetArg(arg[i], XtNheight, value->clientarea.height); i++;
+	redraw = True;
+    }
+
+    if (mask & CAColormap) {
+	XtSetArg(arg[i], XtNcolormap, value->colormap); i++;
+	redraw = True;
+    }
+    if (mask & CAColor) {
+	XtSetArg(arg[i], XtNbackground, value->background); i++;
+	redraw = True;
+    }
+    if (mask & CACursor) {
+	XtSetArg(arg[i], XtNcursor, value->cursor); i++;
+    }
+
+    XtSetValues(ocw->offthespot.canvaswidget, arg, i);
+
+    return redraw;
+}
+
+static void
+UpdateText(w)
+Widget w;
+{
+    OffTheSpotConversionWidget ocw = (OffTheSpotConversionWidget)w;
+
+    TRACE(("OffTheSpotConversion:UpdateText()\n"));
+    eraseCursor(ocw);
+    computeDisplaySegments(ocw);
+    computeCursor(ocw);
+    reconfigureDisplay(ocw);
+    updateDisplay(ocw);
+    showCursor(ocw);
+}
+
+static void
+UpdateMode(w)
+Widget w;
+{
+    OffTheSpotConversionWidget ocw = (OffTheSpotConversionWidget)w;
+
+    TRACE(("OffTheSpotConversion:UpdateMode()\n"));
+    XtVaSetValues(ocw->offthespot.modewidget,
+		  XtNlabel, ICGetMode(ocw->ccontrol.inputobj),
+		  NULL);
+}
+
+static void
+SelectionControl(w, arg)
+Widget w;
+ICSelectionControlArg *arg;
+{
+    OffTheSpotConversionWidget ocw = (OffTheSpotConversionWidget)w;
+    String params[1];
+    Cardinal num_params;
+
+    switch (arg->command) {
+    case ICSelectionStart:
+	SelectionStart(ocw, arg->u.selection_kind);
+	break;
+    case ICSelectionEnd:
+	SelectionEnd(ocw, &arg->u.current_item);
+	break;
+    case ICSelectionSet:
+	SelectionSet(ocw, arg->u.current_item);
+	break;
+    case ICSelectionMove:
+	SelectionMove(ocw, arg->u.dir);
+	break;
+    case ICSelectionGet:
+	SelectionGet(ocw, &arg->u.current_item);
+	break;
+    default:
+	params[0] = XtClass(w)->core_class.class_name;
+	num_params = 1;
+	XtAppWarningMsg(XtWidgetToApplicationContext(w),
+			"parameterError", "SelectionControl", "WidgetError",
+			"%s: unknown selection control command",
+			params, &num_params);
+	break;
+    }
+}
+
+/* ARGSUSED */
+static void
+SelectionStart(ocw, kind)
+OffTheSpotConversionWidget ocw;
+int kind;
+{
+    Cardinal ncand;
+
+    TRACE(("OffTheSpotConversion:SelectionStart()\n"));
+    if (ocw->offthespot.selectionpoppedup) {
+	TRACE(("\tselection already started -- ignored\n"));
+	return;
+    }
+
+    ocw->offthespot.candlist = ICGetItemList(ocw->ccontrol.inputobj, &ncand);
+    ocw->offthespot.numcands = ncand;
+
+    TRACE(("\tnumcands=%d\n", ocw->offthespot.numcands));
+    CPanelSetList(ocw->offthespot.selectionwidget,
+		  ocw->offthespot.candlist,
+		  ocw->offthespot.numcands, 0, True);
+
+    /* $B%]%C%W%"%C%W$9$k>l=j$r7h$a$k(B */
+    LocateSelectionPopup(ocw);
+
+    XtPopup(ocw->offthespot.selectionshell, XtGrabNone);
+    ocw->offthespot.selectionpoppedup = True;
+}
+
+static void
+LocateSelectionPopup(ocw)
+OffTheSpotConversionWidget ocw;
+{
+    Position x, y;
+    DisplayLocation lastp;
+    Dimension dpyWidth, dpyHeight;
+    Widget canvas = ocw->offthespot.canvaswidget;
+    Widget panel = ocw->offthespot.selectionwidget;
+    Widget shell = ocw->offthespot.selectionshell;
+    int clx, cly;
+    Window junk;
+    int barheight = ocw->ccontrol.titlebarheight;
+
+    if (ocw->offthespot.numsegments > 0) {
+	computeLastPosition(ocw->offthespot.dispsegments[ocw->offthespot.numsegments - 1].fragments, &lastp);
+    } else {
+	lastp.y = 0;
+    }
+    lastp.x = canvas->core.width / 2;
+    lastp.y += ocw->offthespot.lineheight;
+    (void)XTranslateCoordinates(XtDisplay(canvas), XtWindow(canvas),
+				RootWindowOfScreen(XtScreen(canvas)),
+				0, 0, &clx, &cly, &junk);
+
+    x = clx + lastp.x - panel->core.width / 2;
+    y = cly + lastp.y + 8;	/* XXX */
+
+    dpyWidth = WidthOfScreen(XtScreen(canvas));
+    dpyHeight = HeightOfScreen(XtScreen(canvas));
+
+    if (x + panel->core.width > dpyWidth) x = dpyWidth - panel->core.width;
+    if (x < 0) x = 0;
+    if (y + panel->core.height + barheight > dpyHeight) {
+	y = cly - panel->core.height - 8 - barheight;
+	if (y < 0) y = dpyHeight - panel->core.height - barheight;
+    }
+    MoveShell(shell, x, y);
+}
+
+static void
+SelectionEnd(ocw, current)
+OffTheSpotConversionWidget ocw;
+int *current;
+{
+    TRACE(("OffTheSpotConversion:SelectionEnd()\n"));
+    if (!ocw->offthespot.selectionpoppedup) {	/* for safe */
+	TRACE(("\tnot in selection mode -- ignored\n"));
+	return;
+    }
+
+    XtVaGetValues(ocw->offthespot.selectionwidget,
+		  XtNcurrentItem, current,
+		  NULL);
+
+    XtPopdown(ocw->offthespot.selectionshell);
+
+    ocw->offthespot.selectionpoppedup = False;
+}
+
+static void
+SelectionSet(ocw, current)
+OffTheSpotConversionWidget ocw;
+int current;
+{
+    TRACE(("OffTheSpotConversion:SelectionSet()\n"));
+    if (!ocw->offthespot.selectionpoppedup) {	/* for safe */
+	TRACE(("\tnot in selection mode -- ignored\n"));
+	return;
+    }
+
+    XtVaSetValues(ocw->offthespot.selectionwidget,
+		  XtNcurrentItem, current,
+		  NULL);
+}
+
+static void
+SelectionGet(ocw, current)
+OffTheSpotConversionWidget ocw;
+int *current;
+{
+    TRACE(("OffTheSpotConversion:SelectionGet()\n"));
+    if (!ocw->offthespot.selectionpoppedup) {	/* for safe */
+	TRACE(("\tnot in selection mode -- ignored\n"));
+	return;
+    }
+
+    XtVaGetValues(ocw->offthespot.selectionwidget,
+		  XtNcurrentItem, current,
+		  NULL);
+}
+
+static void
+SelectionMove(ocw, dir)
+OffTheSpotConversionWidget ocw;
+int dir;
+{
+    TRACE(("OffTheSpotConversion:SelectionMove()\n"));
+    if (!ocw->offthespot.selectionpoppedup) {	/* for safe */
+	TRACE(("\tnot in selection mode -- ignored\n"));
+	return;
+    }
+
+    CPanelMoveCurrent(ocw->offthespot.selectionwidget, dir);
+}
+
+/*
+ * Aux Callback
+ */
+
+static void
+AuxControl(w, arg)
+Widget w;
+ICAuxControlArg *arg;
+{
+    OffTheSpotConversionWidget ocw = (OffTheSpotConversionWidget)w;
+    String params[1];
+    Cardinal num_params;
+
+    switch (arg->command) {
+    case ICAuxStart:
+	AuxStart(ocw);
+	break;
+    case ICAuxEnd:
+	AuxEnd(ocw);
+	break;
+    case ICAuxChange:
+	AuxChange(ocw);
+	break;
+    default:
+	params[0] = XtClass(w)->core_class.class_name;
+	num_params = 1;
+	XtAppWarningMsg(XtWidgetToApplicationContext(w),
+			"parameterError", "AuxControl", "WidgetError",
+			"%s: unknown aux control command",
+			params, &num_params);
+	break;
+    }
+}
+
+/* ARGSUSED */
+static void
+AuxStart(ocw)
+OffTheSpotConversionWidget ocw;
+{
+  ICString *auxstr;
+  Cardinal ncand, curseg, cursorpos;
+  
+  if (ocw->offthespot.auxpoppedup) return;
+  
+  /* $B%F%-%9%H%3!<%k%P%C%/$N;~$N$h$&$J=hM}$r$9$k(B
+     $B$N$O(B AuxPanel.c $B$K$^$+$;$h$&(B */
+
+  auxstr = ICGetAuxSegments(ocw->ccontrol.inputobj,
+			    &ncand, &curseg, &cursorpos);
+
+  APanelStart(ocw->offthespot.auxwidget, auxstr, ncand, curseg, cursorpos);
+    
+  /* $B%]%C%W%"%C%W$9$k>l=j$r7h$a$k(B */
+  LocateAuxPopup(ocw);
+
+  XtPopup(ocw->offthespot.auxshell, XtGrabNone);
+  ocw->offthespot.auxpoppedup = True;
+}
+
+/* ARGSUSED */
+static void
+AuxEnd(ocw)
+OffTheSpotConversionWidget ocw;
+{
+  if (!ocw->offthespot.auxpoppedup) return;	/* for safe */
+
+/*  APanelEnd(ocw->offthespot.auxwidget); */
+
+  XtPopdown(ocw->offthespot.auxshell);
+
+  ocw->offthespot.auxpoppedup = False;
+}
+
+/* ARGSUSED */
+static void
+AuxChange(ocw)
+OffTheSpotConversionWidget ocw;
+{
+  Cardinal ncand, curseg, cursorpos;
+  ICString *auxstr;
+
+  if (!ocw->offthespot.auxpoppedup) return;	/* for safe */
+
+  auxstr = ICGetAuxSegments(ocw->ccontrol.inputobj,
+			    &ncand, &curseg, &cursorpos);
+
+  APanelChange(ocw->offthespot.auxwidget, auxstr, ncand, curseg, cursorpos);
+}
+
+static void
+LocateAuxPopup(ocw)
+OffTheSpotConversionWidget ocw;
+{
+    Position x, y;
+    DisplayLocation lastp;
+    Dimension dpyWidth, dpyHeight;
+    Widget canvas = ocw->offthespot.canvaswidget;
+    Widget panel = ocw->offthespot.auxwidget;
+    Widget shell = ocw->offthespot.auxshell;
+    int clx, cly;
+    Window junk;
+    int barheight = ocw->ccontrol.titlebarheight;
+
+    if (ocw->offthespot.numsegments > 0) {
+	computeLastPosition(ocw->offthespot.dispsegments[ocw->offthespot.numsegments - 1].fragments, &lastp);
+    } else {
+	lastp.y = 0;
+    }
+    lastp.x = canvas->core.width / 2;
+    lastp.y += ocw->offthespot.lineheight;
+    (void)XTranslateCoordinates(XtDisplay(canvas), XtWindow(canvas),
+				RootWindowOfScreen(XtScreen(canvas)),
+				0, 0, &clx, &cly, &junk);
+
+    x = clx + lastp.x - panel->core.width / 2;
+    y = cly + lastp.y + 8;	/* XXX */
+
+    dpyWidth = WidthOfScreen(XtScreen(canvas));
+    dpyHeight = HeightOfScreen(XtScreen(canvas));
+
+    if (x + panel->core.width > dpyWidth) x = dpyWidth - panel->core.width;
+    if (x < 0) x = 0;
+    if (y + panel->core.height + barheight > dpyHeight) {
+	y = cly - panel->core.height - 8 - barheight;
+	if (y < 0) y = dpyHeight - panel->core.height - barheight;
+    }
+    MoveShell(shell, x, y);
+}
+
+
+/*
+ *+ TextCanvas callback
+ */
+
+/*- TextRedisplay: redraw text canvas -*/
+static void
+TextRedisplay(w, client_data, call_data)
+Widget w;
+XtPointer client_data;
+XtPointer call_data;
+{
+    OffTheSpotConversionWidget ocw = (OffTheSpotConversionWidget)client_data;
+    XExposeEvent *event = (XExposeEvent *)call_data;
+    XRectangle region;
+    Boolean cursorredraw;
+
+    TRACE(("OffTheSpotConversion:TextRedisplay()\n"));
+    region.x = event->x;
+    region.y = event->y;
+    region.width = event->width;
+    region.height = event->height;
+
+    cursorredraw = exposeCursor(ocw, w, &region);
+    redrawSegments(ocw, &region);
+    if (cursorredraw) showCursor(ocw);
+}
+
+/*- TextResize: do reconfiguration (and redraw) of text canvas when resized -*/
+/* ARGSUSED */
+static void
+TextResize(w, client_data, call_data)
+Widget w;
+XtPointer client_data;
+XtPointer call_data;	/* unused */
+{
+    OffTheSpotConversionWidget ocw = (OffTheSpotConversionWidget)client_data;
+
+    TRACE(("OffTheSpotConversion:TextResize()\n"));
+    recomputeDisplaySegments(ocw);
+    computeCursor(ocw);
+    if (XtIsRealized(w)) {
+	/* redraw it */
+	XClearArea(XtDisplay(w), XtWindow(w), 0, 0, 0, 0, True);
+    }
+}
+
+
+/*
+ *+ Selection Widget callback
+ */
+
+/*- SelectionSelected: selection selected callback -*/
+/* ARGSUSED */
+static void
+SelectionSelected(w, client_data, call_data)
+Widget w;
+XtPointer client_data;
+XtPointer call_data;
+{
+    OffTheSpotConversionWidget ocw = (OffTheSpotConversionWidget)client_data;
+    int current = (int)call_data;
+
+    TRACE(("OffTheSpotConversion:SelectionSelected()\n"));
+    XtPopdown(ocw->offthespot.selectionshell);
+    ocw->offthespot.selectionpoppedup = False;
+    ICSelectItem(ocw->ccontrol.inputobj, current);
+}
+
+
+/*
+ *+ text drawing functions
+ */
+
+/*- computeDisplaySegments: compare old&new text and update segments/fragments -*/
+static void
+computeDisplaySegments(ocw)
+OffTheSpotConversionWidget ocw;
+{
+    Widget inputobj = ocw->ccontrol.inputobj;
+    Cardinal nnew = ICNumSegments(inputobj);
+    Cardinal nold = ocw->offthespot.numsegments;
+    ICString *newseg;
+    DisplaySegment *dseg;
+    DisplayLocation disploc;
+    Cardinal nsame;
+    int diff;
+    Cardinal i;
+
+    TRACE(("OffTheSpotConversion:computeDisplaySegments() nnew=%d\n", nnew));
+    allocDisplaySegments(ocw, nnew);
+
+    initialLocation(ocw, &disploc);
+
+    for (i = 0, dseg = ocw->offthespot.dispsegments; i < nnew; i++, dseg++) {
+	newseg = ICGetSegment(ocw->ccontrol.inputobj, i);
+	if (i >= nold) {
+	    copyString(newseg, &dseg->seg);
+	    dseg->redrawpos = 0;
+	    dseg->fragments = computeDisplayFragments(ocw, newseg, &disploc);
+	} else {
+	    DisplayFragment *oldfragments, *newfragments;
+
+	    dseg->redrawpos = -1;
+	    diff = ICCompareSegment(inputobj, newseg, &dseg->seg, &nsame);
+	    if (diff != ICSame ||
+		disploc.x != dseg->fragments->region.x ||
+		disploc.y != dseg->fragments->region.y) {
+		oldfragments = dseg->fragments;
+		newfragments = computeDisplayFragments(ocw, newseg, &disploc);
+		dseg->fragments = newfragments;
+	    } else {
+		oldfragments = NULL;
+		newfragments = dseg->fragments;
+		computeLastPosition(newfragments, &disploc);
+	    }
+
+	    switch (diff) {
+	    case ICSame:
+		if (oldfragments == NULL ||
+		    oldfragments->region.x == newfragments->region.x &&
+		    oldfragments->region.y == newfragments->region.y) {
+		    dseg->redrawpos = -1;
+		} else {
+		    dseg->redrawpos = 0;
+		}
+		break;
+	    case ICAttrChanged:
+		dseg->redrawpos = 0;
+		dseg->seg.attr = newseg->attr;
+		break;
+	    case ICStringChanged:
+		if (oldfragments == NULL ||
+		    oldfragments->region.x == newfragments->region.x &&
+		    oldfragments->region.y == newfragments->region.y) {
+		    dseg->redrawpos = nsame;
+		} else {
+		    dseg->redrawpos = 0;
+		}
+		freeString(&dseg->seg);
+		copyString(newseg, &dseg->seg);
+		break;
+	    default:
+		dseg->redrawpos = 0;
+		freeString(&dseg->seg);
+		copyString(newseg, &dseg->seg);
+		break;
+	    }
+	    if (oldfragments) freeDisplayFragments(oldfragments);
+	}
+    }
+
+    for (; i < nold; i++, dseg++) freeDisplaySegment(dseg);
+
+    ocw->offthespot.numsegments = nnew;
+}
+
+/*- recomputeDisplaySegments: recompute segments/fragments -*/
+static void
+recomputeDisplaySegments(ocw)
+OffTheSpotConversionWidget ocw;
+{
+    Cardinal nsegs = ocw->offthespot.numsegments;
+    DisplaySegment *dseg;
+    DisplayLocation disploc;
+    Cardinal i;
+
+    initialLocation(ocw, &disploc);
+
+    for (i = 0, dseg = ocw->offthespot.dispsegments; i < nsegs; i++, dseg++) {
+	freeDisplayFragments(dseg->fragments);
+	dseg->redrawpos = 0;
+	dseg->fragments = computeDisplayFragments(ocw, &dseg->seg, &disploc);
+    }
+}
+
+/*- computeLastPosition: get last position of the specified fragment list -*/
+static void
+computeLastPosition(fragments, disploc)
+DisplayFragment *fragments;
+DisplayLocation *disploc;
+{
+    while (fragments->next != NULL) fragments = fragments->next;
+    disploc->x = fragments->region.x + fragments->region.width;
+    disploc->y = fragments->region.y;
+}
+
+/*- computeDisplayFragments: compute fragment(s) of the specified segment -*/
+static DisplayFragment *
+computeDisplayFragments(ocw, newseg, disploc)
+OffTheSpotConversionWidget ocw;
+ICString *newseg;
+DisplayLocation *disploc;
+{
+    int start;
+    int nchars;
+    Widget dispobj = ocw->offthespot.displayobj;
+    DisplayFragment *fragments, *dfp;
+    int widthavailable;
+
+    TRACE(("computeDisplayFragments()\n"));
+    start = 0;
+    fragments = NULL;
+    while (start < newseg->nchars) {
+	widthavailable = widthAvailable(ocw, disploc);
+	nchars = CDMaxChar(dispobj, newseg, start, widthavailable);
+	if (nchars == 0 && disploc->x <= ocw->offthespot.leftmargin) {
+	    /*
+	     * avoiding infinite loop
+	     * we display at least one character per line
+	     */
+	    nchars = 1;
+	}
+	TRACE(("\twidthavailable=%d, start=%d, maxchar=%d\n", widthavailable, start, nchars));
+	if (nchars > 0) {
+	    if (fragments == NULL) {
+		fragments = dfp = allocDisplayFragment();
+	    } else {
+		dfp->next = allocDisplayFragment();
+		dfp = dfp->next;
+	    }
+	    dfp->from = start;
+	    dfp->nchars = nchars;
+	    dfp->region.x = disploc->x;
+	    dfp->region.y = disploc->y;
+	    dfp->region.width = CDStringWidth(dispobj, newseg, start,
+						    start + nchars);
+	    dfp->region.height = ocw->offthespot.lineheight;
+	    dfp->next = NULL;
+
+	    disploc->x += dfp->region.width;
+	}
+	start += nchars;
+
+	if (start < newseg->nchars) nextLocation(ocw, disploc);
+    }
+
+    return fragments;
+}
+
+/*- widthAvailable: return the width of the current line left for drawing -*/
+static int
+widthAvailable(ocw, disploc)
+OffTheSpotConversionWidget ocw;
+DisplayLocation *disploc;
+{
+    return ocw->offthespot.canvaswidget->core.width - 
+           ocw->offthespot.rightmargin - disploc->x;
+}
+
+/*- initialLocation: return the initial text drawing position -*/
+static void
+initialLocation(ocw, disploc)
+OffTheSpotConversionWidget ocw;
+DisplayLocation *disploc;
+{
+    int cheight = ocw->offthespot.canvaswidget->core.height;
+    int lheight = ocw->offthespot.lineheight;
+
+    disploc->x = ocw->offthespot.leftmargin;
+    if (cheight / lheight == 1) {
+	/* if there's space for a single line, locate it in the center */
+	disploc->y = (cheight - lheight) / 2;
+    } else {
+	disploc->y = 0;
+    }
+}
+
+/*- nextLocation: return the position of the next line -*/
+static void
+nextLocation(ocw, disploc)
+OffTheSpotConversionWidget ocw;
+DisplayLocation *disploc;
+{
+    disploc->x = ocw->offthespot.leftmargin;
+    disploc->y += ocw->offthespot.lineheight;
+}
+
+/*- findLocation: compute the display position of specific character -*/
+static DisplayLocation *
+findLocation(ocw, dsp, offset, disploc)
+OffTheSpotConversionWidget ocw;
+DisplaySegment *dsp;
+Cardinal offset;
+DisplayLocation *disploc;
+{
+    DisplayFragment *dfp = dsp->fragments;
+
+    while (dfp != NULL) {
+	if (dfp->nchars > offset ||
+	    dfp->next == NULL && dfp->nchars == offset) {
+	    break;
+	}
+	offset -= dfp->nchars;
+	dfp = dfp->next;
+    }
+    if (dfp == NULL) return NULL;
+
+    disploc->x = dfp->region.x + CDStringWidth(ocw->offthespot.displayobj,
+					       &dsp->seg, dfp->from,
+					       dfp->from + offset);
+    disploc->y = dfp->region.y;
+
+    return disploc;
+}
+
+/*- reconfigureDisplay: do reconfiguration of text canvas (resize/popup/popdown) -*/
+static void
+reconfigureDisplay(ocw)
+OffTheSpotConversionWidget ocw;
+{
+    DisplaySegment *dsp;
+    DisplayFragment *dfp;
+    Widget canvas = ocw->offthespot.canvaswidget;
+    Position lastx, lasty;
+    Dimension height = ocw->offthespot.lineheight;
+    int i;
+
+    lastx = 0;
+    dsp = ocw->offthespot.dispsegments;
+    if (ocw->offthespot.numsegments > 0 && dsp->fragments != NULL) {
+	lasty = dsp->fragments->region.y;
+    } else {
+	lasty = 0;
+    }
+    for (i = 0, dsp = ocw->offthespot.dispsegments; i < ocw->offthespot.numsegments; i++, dsp++) {
+	for (dfp = dsp->fragments; dfp != NULL; dfp = dfp->next) {
+	    if (lasty != dfp->region.y) {
+		XClearArea(XtDisplay(canvas), XtWindow(canvas),
+			   lastx, lasty, 0, height, False);
+	    }
+	    lastx = dfp->region.x + dfp->region.width;
+	    lasty = dfp->region.y;
+	}
+    }
+
+    XClearArea(XtDisplay(canvas), XtWindow(canvas),
+	       lastx, lasty, 0, 0, False);
+    if (lasty + height < canvas->core.height) {
+	XClearArea(XtDisplay(canvas), XtWindow(canvas),
+		   0, lasty + height, 0, 0, False);
+    }
+}
+
+/*- updateDisplay: redraw text (if needed) -*/
+static void
+updateDisplay(ocw)
+OffTheSpotConversionWidget ocw;
+{
+    DisplaySegment *dsp = ocw->offthespot.dispsegments;
+    int i;
+
+    for (i = 0; i < ocw->offthespot.numsegments; i++, dsp++) {
+	if (dsp->redrawpos >= 0) {
+	    TRACE(("updateDisplaySegment(seg#=%d)\n", i));
+	    updateDisplaySegment(ocw, dsp);
+	}
+    }
+}
+
+/*- updateDisplaySegment: redraw specified segment (if needed) -*/
+static void
+updateDisplaySegment(ocw, dsp)
+OffTheSpotConversionWidget ocw;
+DisplaySegment *dsp;
+{
+    DisplayFragment *dfp = dsp->fragments;
+    Widget dispobj = ocw->offthespot.displayobj;
+    Widget canvas = ocw->offthespot.canvaswidget;
+    int from;
+    int x;
+
+    while (dfp != NULL) {
+	if (dsp->redrawpos < dfp->from + dfp->nchars) {
+	    from = (dsp->redrawpos > dfp->from) ? dsp->redrawpos : dfp->from;
+	    x = dfp->region.x;
+	    if (from > dfp->from) {
+		x += CDStringWidth(dispobj, &dsp->seg, dfp->from, from);
+	    } 
+	    CDDrawString(dispobj, canvas, &dsp->seg,
+			 from, dfp->from + dfp->nchars,
+			 x, dfp->region.y);
+	}
+	dfp = dfp->next;
+    }
+}
+
+/*- redrawSegments: redraw segments in specified area -*/
+static void
+redrawSegments(ocw, region)
+OffTheSpotConversionWidget ocw;
+XRectangle *region;
+{
+    DisplaySegment *dsp = ocw->offthespot.dispsegments;
+    DisplayFragment *dfp;
+    Widget dispobj = ocw->offthespot.displayobj;
+    Widget canvas = ocw->offthespot.canvaswidget;
+    int i;
+
+    for (i = 0; i < ocw->offthespot.numsegments; i++, dsp++) {
+	for (dfp = dsp->fragments; dfp != NULL; dfp = dfp->next) {
+	    if (intersectRect(&dfp->region, region)) {
+		CDDrawString(dispobj, canvas, &dsp->seg,
+			      dfp->from, dfp->from + dfp->nchars,
+			      dfp->region.x, dfp->region.y);
+	    }
+	}
+    }
+}
+
+/*
+ *+ insert cursor handling
+ */
+
+/*- eraseCursor: erase insert cursor -*/
+static void
+eraseCursor(ocw)
+OffTheSpotConversionWidget ocw;
+{
+    if (!ocw->offthespot.cursorvisible) return;
+
+    TRACE(("eraseCursor() at (%d,%d)\n",
+	    ocw->offthespot.cursorlocation.x,
+	    ocw->offthespot.cursorlocation.y));
+    CDDrawCursor(ocw->offthespot.displayobj,
+		 ocw->offthespot.canvaswidget,
+		 ocw->offthespot.cursorlocation.x,
+		 ocw->offthespot.cursorlocation.y,
+		 False);
+    ocw->offthespot.cursorvisible = False;
+}
+
+/*- showCursor: draw insert cursor -*/
+static void
+showCursor(ocw)
+OffTheSpotConversionWidget ocw;
+{
+    if (!ocw->offthespot.cursorvisible) return;
+
+    TRACE(("showCursor at (%d,%d)\n",
+	    ocw->offthespot.cursorlocation.x,
+	    ocw->offthespot.cursorlocation.y));
+    CDDrawCursor(ocw->offthespot.displayobj,
+		 ocw->offthespot.canvaswidget,
+		 ocw->offthespot.cursorlocation.x,
+		 ocw->offthespot.cursorlocation.y,
+		 True);
+}
+
+/*- exposeCursor: make the insert cursor redraw correctly when exposing -*/
+static Boolean
+exposeCursor(ocw, w, region)
+OffTheSpotConversionWidget ocw;
+Widget w;
+XRectangle *region;
+{
+    XRectangle bounds;
+
+    if (!ocw->offthespot.cursorvisible) return False;
+
+    TRACE(("exposeCursor(region=%d,%d-%d,%d)\n",
+	    region->x, region->y, region->width, region->height));
+    CDGetCursorBounds(ocw->offthespot.displayobj, &bounds);
+    bounds.x += ocw->offthespot.cursorlocation.x;
+    bounds.y += ocw->offthespot.cursorlocation.y;
+    if (intersectRect(region, &bounds)) {
+	eraseCursor(ocw);
+	XClearArea(XtDisplay(w), XtWindow(w),
+		   bounds.x, bounds.y, bounds.width, bounds.height, False);
+	unionRect(region, &bounds, region);
+    }
+    ocw->offthespot.cursorvisible = True;
+    return True;
+}
+
+/*- computeCursor: compute cursor position -*/
+static void
+computeCursor(ocw)
+OffTheSpotConversionWidget ocw;
+{
+    DisplaySegment *dsp;
+    DisplayLocation disploc;
+    Cardinal seg, offset;
+
+    if (ocw->offthespot.numsegments == 0) {
+	/* special case */
+	initialLocation(ocw, &(ocw->offthespot.cursorlocation));
+	ocw->offthespot.cursorlocation.y += ocw->offthespot.ascent;
+	ocw->offthespot.cursorvisible = True;
+	return;
+    }
+
+    if (!ICCursorPos(ocw->ccontrol.inputobj, &seg, &offset)) return;
+
+    /* sanity check */
+    if (seg >= ocw->offthespot.numsegments) return;
+    dsp = ocw->offthespot.dispsegments + seg;
+    if (offset > dsp->seg.nchars) return;
+
+    if (findLocation(ocw, dsp, offset, &disploc) == NULL) return;
+
+    disploc.y += ocw->offthespot.ascent;
+
+    ocw->offthespot.cursorvisible = True;
+    ocw->offthespot.cursorlocation = disploc;
+}
+
+/*
+ *+ miscelaneous functions
+ */
+
+/*- MoveShell: move shell widget -*/
+static void
+MoveShell(w, x, y)
+Widget w;
+Position x;
+Position y;
+{
+    XtWidgetGeometry req;
+
+    /*
+     * calling XtMoveWidget() is NOT enough to move shell widgets.
+     * we must use XtMakeGeometryRequest() or XtSetValues() to
+     * invoke root-geometry-manager which modifies the size hint
+     * appropriately.
+     */
+    req.request_mode = CWX | CWY;
+    req.x = x;
+    req.y = y;
+    (void)XtMakeGeometryRequest(w, &req, (XtWidgetGeometry *)NULL);
+}
+
+/*- getToplevelWindow: get top-level window of a given window -*/
+static Window
+getToplevelWindow(dpy, win)
+Display *dpy;
+Window win;
+{
+    Atom wm_state;
+    Atom type;
+    int format;
+    unsigned long nitems, bytesafter;
+    unsigned char *data;
+    Window root, parent;
+    Window *children;
+    unsigned int nchildren;
+
+    /*
+     * find toplevel window which has WM_STATE property or if no exists,
+     * direct subwindow of the root window. (ie I assume that if a
+     * window manager is running, that is a ICCCM compliant one)
+     */
+    wm_state = CachedInternAtom(dpy, "WM_STATE", True);
+    for (;;) {
+	type = None;
+	if (wm_state != None) {
+	    data = NULL;
+	    XGetWindowProperty(dpy, win, wm_state, 0L, 0L, False,
+			       AnyPropertyType, &type, &format,
+			       &nitems, &bytesafter, &data);
+	    if (data != NULL) XtFree((char *)data);
+	    if (type != None) break;
+	}
+	if (!XQueryTree(dpy, win, &root, &parent, &children, &nchildren)) break;
+	if (nchildren > 0) XtFree((char *)children);
+	if (root == parent) break;
+	win = parent;
+    }
+    return win;
+}
+
+/*- setTransientFor: set WM_TRANSIENT_FOR property to specified widget -*/
+static void
+setTransientFor(w, win)
+Widget w;
+Window win;
+{
+    if (!XtIsRealized(w)) XtRealizeWidget(w);
+    XSetTransientForHint(XtDisplay(w), XtWindow(w), win);
+}
+
+/*- intersectRect: return whether given two rectangles have a intersection -*/
+static Boolean
+intersectRect(rect1, rect2)
+register XRectangle *rect1;
+register XRectangle *rect2;
+{
+    return (rect1->x + rect1->width <= rect2->x ||
+	    rect1->x >= rect2->x + rect2->width ||
+	    rect1->y + rect1->height <= rect2->y ||
+	    rect1->y >= rect2->y + rect2->height) ? False : True;
+}
+
+/*- unionRect: returns a minimum rectangle that covers given two rectangles -*/
+static void
+unionRect(rect1, rect2, rect_ret)
+register XRectangle *rect1;
+register XRectangle *rect2;
+XRectangle *rect_ret;
+{
+    int x0, x1, y0, y1;
+
+    x0 = (rect1->x > rect2->x) ? rect2->x : rect1->x;
+    y0 = (rect1->y > rect2->y) ? rect2->y : rect1->y;
+    x1 = (rect1->x + rect1->width > rect2->x + rect2->width) ?
+		rect1->x + rect1->width : rect2->x + rect2->width;
+    y1 = (rect1->y + rect1->height > rect2->y + rect2->height) ?
+		rect1->y + rect1->height : rect2->y + rect2->height;
+
+    rect_ret->x = x0;
+    rect_ret->y = y0;
+    rect_ret->width = x1 - x0;
+    rect_ret->height = y1 - y0;
+}
+
+static DisplayFragment *free_fragments = NULL;
+
+/*- allocDisplayFragment: get a new fragment -*/
+static DisplayFragment *
+allocDisplayFragment()
+{
+    if (free_fragments == NULL) {
+	return XtNew(DisplayFragment);
+    } else {
+	DisplayFragment *dfp = free_fragments;
+	free_fragments = dfp->next;
+	return dfp;
+    }
+}
+
+/*- freeDisplayFragments: add specified fragment list to the free-list -*/
+static void
+freeDisplayFragments(fragments)
+DisplayFragment *fragments;
+{
+    DisplayFragment *dfp = fragments;
+
+    if (dfp == NULL) return;
+    while (dfp->next != NULL) dfp = dfp->next;
+    dfp->next = free_fragments;
+    free_fragments = fragments;
+}
+
+/*- destroyDisplayFragments: do 'free()' specified fragment list -*/
+static void
+destroyDisplayFragments(fragments)
+DisplayFragment *fragments;
+{
+    DisplayFragment *dfp;
+
+    while (fragments != NULL) {
+	dfp = fragments->next;
+	XtFree((char *)fragments);
+	fragments = dfp;
+    }
+}
+
+/*- allocDisplaySegments: prepare specified number of display segments -*/
+static void
+allocDisplaySegments(ocw, n)
+OffTheSpotConversionWidget ocw;
+Cardinal n;
+{
+    if (ocw->offthespot.dispsegmentsize > n) return;
+    n = ((n + 3) / 4) * 4 ;
+    if (ocw->offthespot.dispsegments == NULL) {
+	ocw->offthespot.dispsegments = (DisplaySegment *)XtMalloc(n * sizeof(DisplaySegment));
+    } else {
+	ocw->offthespot.dispsegments = (DisplaySegment *)XtRealloc((char *)ocw->offthespot.dispsegments, n * sizeof(DisplaySegment));
+    }
+    ocw->offthespot.dispsegmentsize = n;
+}
+
+/*- freeDisplaySegment: free display segment's contents -*/
+static void
+freeDisplaySegment(dsp)
+DisplaySegment *dsp;
+{
+    freeString(&dsp->seg);
+    freeDisplayFragments(dsp->fragments);
+    dsp->fragments = NULL;
+}
+
+/*- clearAllDisplaySegments: clear all display segment's -*/
+static void
+clearAllDisplaySegments(ocw)
+OffTheSpotConversionWidget ocw;
+{
+    DisplaySegment *dsp = ocw->offthespot.dispsegments;
+    int i;
+
+    for (i = 0; i < ocw->offthespot.numsegments; i++) {
+	freeDisplaySegment(dsp++);
+    }
+    ocw->offthespot.numsegments = 0;
+}
+
+/*- copyString: copy ICString -*/
+static void
+copyString(from, to)
+ICString *from;
+ICString *to;
+{
+    *to = *from;
+    to->data = XtMalloc(to->nbytes);
+    (void)bcopy(from->data, to->data, to->nbytes);
+}
+
+/*- freeString: free ICString -*/
+static void
+freeString(seg)
+ICString *seg;
+{
+    XtFree(seg->data);
+    seg->data = NULL;
+    seg->nbytes = 0;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/OnConv.c	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,1442 @@
+#ifndef lint
+static char *rcsid = "$Id: OnConv.c,v 10.9 1999/05/19 08:52:42 ishisone Exp $";
+#endif
+/*
+ * Copyright (c) 1990  Software Research Associates, Inc.
+ * Copyright (c) 1999  Kazuki YASUMATSU
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted, provided
+ * that the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Software Research Associates not be
+ * used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission.  Software Research
+ * Associates makes no representations about the suitability of this software
+ * for any purpose.  It is provided "as is" without express or implied
+ * warranty.
+ *
+ * Author:  Makoto Ishisone, Software Research Associates, Inc., Japan
+ * Author:  Kazuki YASUMATSU (Kazuki.Yasumatsu@fujixerox.co.jp)
+ */
+
+
+#include <X11/IntrinsicP.h>
+#include <X11/StringDefs.h>
+#include <X11/Xmu/Atoms.h>
+#if XtSpecificationRelease > 4
+#include <X11/Xfuncs.h>
+#endif
+#include "CachedAtom.h"
+#include "AsyncErr.h"
+#include "OnConvP.h"
+#include "InputConv.h"
+#include "ConvDisp.h"
+#include "CandPanel.h"
+#include "AuxPanel.h"
+#include "ICLabel.h"
+
+#define DEBUG_VAR debug_OnTheSpotConversion
+#include "DebugPrint.h"
+
+/*- resource table -*/
+static XtResource resources[] = {
+#define offset(field) XtOffset(OnTheSpotConversionWidget, onthespot.field)
+    { XtNpreeditStartCallback, XtCCallback, XtRCallback, sizeof(XtCallbackList),
+	offset(preeditstartcallback), XtRCallback, (XtPointer)NULL },
+    { XtNpreeditDoneCallback, XtCCallback, XtRCallback, sizeof(XtCallbackList),
+	offset(preeditdonecallback), XtRCallback, (XtPointer)NULL },
+    { XtNpreeditDrawCallback, XtCCallback, XtRCallback, sizeof(XtCallbackList),
+	offset(preeditdrawcallback), XtRCallback, (XtPointer)NULL },
+    { XtNpreeditCaretCallback, XtCCallback, XtRCallback, sizeof(XtCallbackList),
+	offset(preeditcaretcallback), XtRCallback, (XtPointer)NULL },
+    { XtNstatusStartCallback, XtCCallback, XtRCallback, sizeof(XtCallbackList),
+	offset(statusstartcallback), XtRCallback, (XtPointer)NULL },
+    { XtNstatusDoneCallback, XtCCallback, XtRCallback, sizeof(XtCallbackList),
+	offset(statusdonecallback), XtRCallback, (XtPointer)NULL },
+    { XtNstatusDrawCallback, XtCCallback, XtRCallback, sizeof(XtCallbackList),
+	offset(statusdrawcallback), XtRCallback, (XtPointer)NULL },
+    { XtNfeedbackAttributes, XtCFeedbackAttributes,
+	XtRFeedbackAttributes, sizeof(FeedbackAttributes),
+	offset(feedbackattrs), XtRString, (XtPointer)"U,,R,H" },
+#undef offset
+};
+
+/*- default translations -*/
+static char translations[] = "<Key>: to-inputobj()";	/* same as superclass's	*/
+
+/*- declarations of local structures -*/
+typedef struct {
+    int		attrs_length;
+    int		attrs_limit;
+    unsigned long *attrs_buffer;
+} AttributeBuffer;
+
+/*- declarations of static functions -*/
+static void ClassInitialize();
+static void Initialize();
+static void Destroy();
+static Boolean SetValues();
+
+static void ConversionStartup();
+static void ConversionFinish();
+static void ChangeAttributes();
+static void ChangeFocus();
+
+static void StringToFeedbackAttrs();
+
+static Widget CreateSelectionWidget();
+
+static void UpdateText();
+static void CommitText();
+static void UpdateMode();
+static void SelectionControl();
+
+static void SelectionStart();
+static void LocateSelectionPopup();
+static void SelectionEnd();
+static void SelectionSet();
+static void SelectionGet();
+static void SelectionMove();
+
+static Widget CreateAuxWidget();
+static void AuxControl();
+static void AuxStart();
+static void AuxEnd();
+static void AuxChange();
+static void LocateAuxPopup();
+
+static void SelectionSelected();
+
+static Boolean SafeGetWindowAttributes();
+static void MoveShell();
+static Window getToplevelWindow();
+static void setTransientFor();
+static void allocDisplaySegments();
+static void freeDisplaySegment();
+static void clearAllDisplaySegments();
+static void copyString();
+static void freeString();
+static AttributeBuffer *allocAttributeBuffer();
+static void destroyAttributeBuffer();
+static void addAttributeBuffer();
+static unsigned long attrToFeedback();
+static void CBPreeditStart();
+static void CBPreeditDone();
+static void CBPreeditDraw();
+static void CBPreeditCaret();
+static void CBStatusStart();
+static void CBStatusDone();
+static void CBStatusDraw();
+
+/*- composite-extension rec: for enabling non-widget children -*/
+static CompositeClassExtensionRec CompositeExtension = {
+    /* next_extension		*/	NULL,
+    /* record_type		*/	NULLQUARK,
+    /* version			*/	XtCompositeExtensionVersion,
+    /* record_size		*/	sizeof(CompositeClassExtensionRec),
+    /* accept_objects		*/	True,
+};
+
+/*- onTheSpotConversionClass record -*/
+OnTheSpotConversionClassRec onTheSpotConversionClassRec = {
+  { /* core fields */
+    /* superclass		*/	(WidgetClass)&conversionControlClassRec,
+    /* class_name		*/	"OnTheSpotConversion",
+    /* widget_size		*/	sizeof(OnTheSpotConversionRec),
+    /* class_initialize		*/	ClassInitialize,
+    /* class_part_initialize	*/	NULL,
+    /* class_inited		*/	FALSE,
+    /* initialize		*/	Initialize,
+    /* initialize_hook		*/	NULL,
+    /* realize			*/	XtInheritRealize,
+    /* actions			*/	NULL,
+    /* num_actions		*/	0,
+    /* resources		*/	resources,
+    /* num_resources		*/	XtNumber(resources),
+    /* xrm_class		*/	NULLQUARK,
+    /* compress_motion		*/	TRUE,
+    /* compress_exposure	*/	TRUE,
+    /* compress_enterleave	*/	TRUE,
+    /* visible_interest		*/	FALSE,
+    /* destroy			*/	Destroy,
+    /* resize			*/	XtInheritResize,
+    /* expose			*/	NULL,
+    /* set_values		*/	SetValues,
+    /* set_values_hook		*/	NULL,
+    /* set_values_almost	*/	XtInheritSetValuesAlmost,
+    /* get_values_hook		*/	NULL,
+    /* accept_focus		*/	NULL,
+    /* version			*/	XtVersion,
+    /* callback_private		*/	NULL,
+    /* tm_table			*/	translations,
+    /* query_geometry		*/	XtInheritQueryGeometry,
+    /* display_accelerator	*/	XtInheritDisplayAccelerator,
+    /* extension		*/	NULL
+  },
+  { /* composite fields */
+    /* geometry_manager		*/	XtInheritGeometryManager,
+    /* change_managed		*/	XtInheritChangeManaged,
+    /* insert_child		*/	XtInheritInsertChild,
+    /* delete_child		*/	XtInheritDeleteChild,
+    /* extension		*/	(XtPointer)&CompositeExtension,
+  },
+  { /* shell fields */
+    /* extension		*/	NULL
+  },
+  { /* wm_shell fields */
+    /* extension		*/	NULL
+  },
+  { /* vendor_shell fields */
+    /* extension		*/	NULL
+  },
+  { /* transient_shell fields */
+    /* extension		*/	NULL
+  },
+  { /* conversionControl fields */
+    /* Startup			*/	ConversionStartup,
+    /* Finish			*/	ConversionFinish,
+    /* ChangeAttributes		*/	ChangeAttributes,
+    /* ChangeFocus		*/	ChangeFocus,
+    /* TextChange		*/	UpdateText,
+    /* Fix			*/	CommitText,
+    /* ModeChange		*/	UpdateMode,
+    /* SelectionControl		*/	SelectionControl,
+    /* AuxControl		*/	AuxControl,
+  },
+  { /* onTheSpotConversion fields */
+    /* empty			*/	0
+  },
+};
+
+WidgetClass onTheSpotConversionWidgetClass = (WidgetClass)&onTheSpotConversionClassRec;
+
+/*
+ *+ Core class method
+ */
+
+/*- ClassInitialize: class initializer -*/
+/* ARGSUSED */
+static void
+ClassInitialize()
+{
+    /* add String -> FeedbackAttributes converter */
+    XtAddConverter(XtRString, XtRFeedbackAttributes, StringToFeedbackAttrs,
+		   (XtConvertArgList)NULL, (Cardinal)0);
+}
+
+/*- Initialize: initalize method -*/
+/* ARGSUSED */
+static void
+Initialize(req, new, args, num_args)
+Widget req;
+Widget new;
+ArgList args;
+Cardinal *num_args;
+{
+    OnTheSpotConversionWidget ocw = (OnTheSpotConversionWidget)new;
+
+    (void)CreateSelectionWidget(ocw);
+    (void)CreateAuxWidget(ocw);
+
+    ocw->onthespot.dispsegments = NULL;
+    ocw->onthespot.numsegments = 0;
+    ocw->onthespot.dispsegmentsize = 0;
+    ocw->onthespot.candlist = NULL;
+    ocw->onthespot.numcands = 0;
+    ocw->onthespot.selectionpoppedup = False;
+    ocw->onthespot.auxpoppedup = False;
+    ocw->onthespot.lastcaret = 0;
+    ocw->onthespot.fixnotify = False;
+}
+
+/*- Destroy: destroy method -*/
+static void
+Destroy(w)
+Widget w;
+{
+    OnTheSpotConversionWidget ocw = (OnTheSpotConversionWidget)w;
+
+    /* $B%G%#%9%W%l%$%;%0%a%s%H$NNN0h$r2rJ|(B */
+    if (ocw->onthespot.dispsegments) {
+	DisplaySegment *dsp = ocw->onthespot.dispsegments;
+	int i;
+
+	for (i = 0; i < ocw->onthespot.numsegments; i++) {
+	    freeString(&dsp[i].seg);
+	}
+	XtFree((char *)dsp);
+    }
+}
+
+/*- SetValues: setvalues method -*/
+/* ARGSUSED */
+static Boolean
+SetValues(cur, req, new, args, num_args)
+Widget cur;
+Widget req;
+Widget new;
+ArgList args;
+Cardinal *num_args;
+{
+    /* OnTheSpotConversionWidget ocw = (OnTheSpotConversionWidget)new; */
+    return False;
+}
+
+/*
+ *+ ConversionControl class method
+ */
+
+/*- ConversionStartup: class specific conversion startup -*/
+static void
+ConversionStartup(widget, valuemask, value)
+Widget widget;
+unsigned long valuemask;
+ConversionAttributes *value;
+{
+    OnTheSpotConversionWidget ocw = (OnTheSpotConversionWidget)widget;
+    Widget inputobj = ocw->ccontrol.inputobj;
+    Window toplevel;
+
+    TRACE(("OnTheSpot:ConversionStartup()\n"));
+
+    /* $BFbIt$N%P%C%U%!$r%/%j%"$9$k(B */
+    clearAllDisplaySegments(ocw);
+
+    /* WM_TRANSIENT_FOR $B%W%m%Q%F%#$r@5$7$/%;%C%H$9$k(B */
+    toplevel = getToplevelWindow(XtDisplay(widget),
+				 ocw->ccontrol.clientwindow);
+    setTransientFor(ocw->onthespot.selectionshell, toplevel);
+    setTransientFor(ocw->onthespot.auxshell, toplevel);
+
+    /*
+     * OnTheSpotConvesion $B$N(B widget $B<+BN$O%]%C%W%"%C%W$5$;$J$$$,!"(B
+     * $B%P%C%/%(%s%I%?%$%W$N;~$K$O%/%i%$%"%s%H$,$3$N(B widget $B$N(B
+     * $B%&%#%s%I%&$KBP$7$F%$%Y%s%H$rAw$k$N$G(B Realize $B$@$1$7$F$*$/(B
+     */
+    if (!XtIsRealized(widget)) {
+	Arg args[2];
+
+	XtSetArg(args[0], XtNwidth, 1);
+	XtSetArg(args[1], XtNheight, 1);
+	XtSetValues(widget, args, 2);
+	XtRealizeWidget(widget);
+    }
+
+    ocw->onthespot.lastcaret = 0;
+    ocw->onthespot.fixnotify = False;
+
+    /* $B%9%F!<%?%9$r99?7$9$k(B */
+    UpdateMode(widget);
+
+    /* $B%W%l%(%G%#%C%H$r3+;O$9$k(B */
+    CBPreeditStart(widget);
+}
+
+/*- ConversionFinish: class specific conversion finish -*/
+/* ARGSUSED */
+static void
+ConversionFinish(w)
+Widget w;
+{
+    OnTheSpotConversionWidget ocw = (OnTheSpotConversionWidget)w;
+    Atom encoding = XA_COMPOUND_TEXT(XtDisplayOfObject(w));
+    int format = 8;
+
+    if (!ocw->onthespot.fixnotify) {
+	/* $B3NDj$7$F$$$J$$(B */
+	DisplaySegment *dseg = ocw->onthespot.dispsegments;
+	int i, len = 0;
+	for (i = 0; i < ocw->onthespot.numsegments; i++, dseg++) {
+	    len += dseg->seg.nchars;
+	}
+	if (len > 0) {
+	    /* $B%W%l%(%G%#%C%H%P%C%U%!$N>C5n(B */
+	    unsigned long attr = 0;
+	    CBPreeditDraw(ocw, 0, 0, len, encoding, format, 0, (XPointer)"",
+			  0, &attr);
+	}
+    }
+
+    /* $B%W%l%(%G%#%C%H$r=*N;$9$k(B */
+    CBPreeditDone(w);
+
+    /* $B%9%F!<%?%9$r99?7(B($B=i4|2=(B)$B$9$k(B */
+    CBStatusDraw(ocw, encoding, format, 0, (XPointer)"", 0);
+
+    if (ocw->onthespot.selectionpoppedup) {
+	XtPopdown(ocw->onthespot.selectionshell);
+	ocw->onthespot.selectionpoppedup = False;
+    }
+    if (ocw->onthespot.auxpoppedup) {
+	XtPopdown(ocw->onthespot.auxshell);
+	ocw->onthespot.auxpoppedup = False;
+    }
+}
+
+/*- ChangeAttributes: class specific conversion attribute change routine -*/
+/* ARGSUSED */
+static void
+ChangeAttributes(w, valuemask, value)
+Widget w;
+unsigned long valuemask;
+ConversionAttributes *value;
+{
+    /* do nothing */
+}
+
+/*- ChangeFocus: class specific conversion attribute change routine -*/
+static void
+ChangeFocus(w, set)
+Widget w;
+int set;
+{
+    if (set) {
+	UpdateMode(w);
+    } else {
+#if 0
+	/* $B%U%)!<%+%9$r<:$C$?>l9g$K$O2?$b$7$J$$(B */
+	OnTheSpotConversionWidget ocw = (OnTheSpotConversionWidget)w;
+	Atom encoding = XA_COMPOUND_TEXT(XtDisplayOfObject(w));
+	int format = 8;
+
+	CBStatusDraw(ocw, encoding, format, 0, (XPointer)"", 0);
+#endif
+    }
+}
+
+/*
+ *+ resource converter
+ */
+
+/*- StringToFeedbackAttrs: string to feedback attiributes converter -*/
+static void
+StringToFeedbackAttrs(args, num_args, from, to)
+XrmValue *args;
+Cardinal *num_args;
+XrmValue *from;
+XrmValue *to;
+{
+    char *s = (char *)from->addr;
+    int idx;
+    int invalid = 0;
+    static FeedbackAttributes fba;
+
+    for (idx = 0; idx < 4; idx++) fba.feedbacks[idx] = 0;
+
+    for (idx = 0; idx < 4; idx++) {
+	int c;
+	unsigned long fb = 0;
+
+	while ((c = *s++) != ',' && c != '\0') {
+	    switch (c) {
+	    case 'R': case 'r': fb |= XIMReverse; break;
+	    case 'U': case 'u':	fb |= XIMUnderline; break;
+	    case 'H': case 'h': fb |= XIMHighlight; break;
+	    case 'P': case 'p': fb |= XIMPrimary; break;
+	    case 'S': case 's': fb |= XIMSecondary; break;
+	    case 'T': case 't': fb |= XIMTertiary; break;
+	    case ' ': case '\t':
+		break;
+	    default:
+		invalid++;
+		break;
+	    }
+	}
+	fba.feedbacks[idx] = fb;
+	if (c == '\0') break;
+    }
+
+    if (invalid) {
+	XtStringConversionWarning((char *)from->addr, XtRFeedbackAttributes);
+    }
+    to->size = sizeof(fba);
+    to->addr = (caddr_t)&fba;
+}
+
+/*
+ *+ sub-widget creation
+ */
+
+/*- CreateSelectionWidget: create selection widget for selecting candidates -*/
+static Widget
+CreateSelectionWidget(ocw)
+OnTheSpotConversionWidget ocw;
+{
+    Widget shell, sel;
+
+    /* set width/height so that XtRealizeWidget() doesn't cause error */
+    shell = XtVaCreatePopupShell("selectionShell",
+				 transientShellWidgetClass,
+				 (Widget)ocw,
+				 XtNwidth, 1,
+				 XtNheight, 1,
+				 NULL);
+    ocw->onthespot.selectionshell = shell;
+
+    sel = XtCreateManagedWidget("selection", candidatePanelWidgetClass,
+				shell, NULL, 0);
+    (void)XtCreateWidget("display", ocw->ccontrol.displayobjclass, sel,
+			 NULL, 0);
+    XtAddCallback(sel, XtNcallback, SelectionSelected, (XtPointer)ocw);
+    XtInstallAccelerators(sel, (Widget)ocw);
+
+    ocw->onthespot.selectionwidget = sel;
+
+    return shell;
+}
+
+/*- CreateAuxWidget: create aux widget for display auxiliary data -*/
+static Widget
+CreateAuxWidget(ocw)
+OnTheSpotConversionWidget ocw;
+{
+    Widget shell, sel;
+
+    /* set width/height so that XtRealizeWidget() doesn't cause error */
+    shell = XtVaCreatePopupShell("auxShell",
+				 transientShellWidgetClass,
+				 (Widget)ocw,
+				 XtNwidth, 1,
+				 XtNheight, 1,
+				 XtNallowShellResize, True,
+				 NULL);
+    ocw->onthespot.auxshell = shell;
+
+    sel = XtCreateManagedWidget("aux", auxPanelWidgetClass,
+				shell, NULL, 0);
+    (void)XtCreateWidget("display", ocw->ccontrol.displayobjclass, sel,
+			 NULL, 0);
+    XtAddCallback(sel, XtNcallback, SelectionSelected, (XtPointer)ocw);
+    XtInstallAccelerators(sel, (Widget)ocw);
+
+    ocw->onthespot.auxwidget = sel;
+
+    return shell;
+}
+
+/*
+ *+ inputobject callback
+ */
+
+/*- UpdateText: update text -*/
+static void
+UpdateText(w)
+Widget w;
+{
+    OnTheSpotConversionWidget ocw = (OnTheSpotConversionWidget)w;
+    Widget inputobj = ocw->ccontrol.inputobj;
+    int nnew = ICNumSegments(inputobj);
+    int nold = ocw->onthespot.numsegments;
+    FeedbackAttributes *fba = &ocw->onthespot.feedbackattrs;
+    Cardinal cseg, caret;
+    ICString *newseg;
+    DisplaySegment *dseg;
+    Boolean changed;
+    int chgseg, chgoffset;
+    int oldlen;
+    AttributeBuffer *buffer;
+    int i;
+    int diff;
+    Cardinal nsame;
+
+    TRACE(("OnTheSpotConversion:UpdateText() nnew=%d\n", nnew));
+
+    ocw->onthespot.fixnotify = False;
+
+    if (!ICCursorPos(inputobj, &cseg, &caret)) {
+	cseg = nnew;
+	caret = 0;
+    }
+
+    allocDisplaySegments(ocw, nnew);
+
+    changed = False;
+    chgseg = chgoffset = 0;
+    oldlen = 0;
+    buffer = allocAttributeBuffer();
+    for (i = 0, dseg = ocw->onthespot.dispsegments; i < nnew; i++, dseg++) {
+	newseg = ICGetSegment(inputobj, i);
+	if (i < cseg) {
+	    caret += newseg->nchars;
+	}
+	if (i >= nold) {
+	    copyString(newseg, &dseg->seg);
+	    addAttributeBuffer(buffer, inputobj, newseg, 0, fba);
+	    if (!changed) {
+		chgseg = i;
+		chgoffset = 0;
+		changed = True;
+	    }
+	} else {
+	    oldlen += dseg->seg.nchars;
+	    diff = ICCompareSegment(inputobj, newseg, &dseg->seg, &nsame);
+	    switch (diff) {
+	    case ICSame:
+		if (changed) {
+		    addAttributeBuffer(buffer, inputobj, newseg, 0, fba);
+		}
+		break;
+	    case ICAttrChanged:
+		dseg->seg.attr = newseg->attr;
+		addAttributeBuffer(buffer, inputobj, newseg, 0, fba);
+		if (!changed) {
+		    chgseg = i;
+		    chgoffset = 0;
+		    changed = True;
+		}
+		break;
+	    case ICStringChanged:
+		freeString(&dseg->seg);
+		copyString(newseg, &dseg->seg);
+		if (!changed) {
+		    addAttributeBuffer(buffer, inputobj, newseg, nsame, fba);
+		    chgseg = i;
+		    chgoffset = nsame;
+		    changed = True;
+		}
+		else {
+		    addAttributeBuffer(buffer, inputobj, newseg, 0, fba);
+		}
+		break;
+	    default: /* ICAttrChanged | ICStringChanged */
+		freeString(&dseg->seg);
+		copyString(newseg, &dseg->seg);
+		addAttributeBuffer(buffer, inputobj, newseg, 0, fba);
+		if (!changed) {
+		    chgseg = i;
+		    chgoffset = 0;
+		    changed = True;
+		}
+		break;
+	    }
+	}
+    }
+
+    for (; i < nold; i++, dseg++) {
+	oldlen += dseg->seg.nchars;
+	if (!changed) {
+	    chgseg = i;
+	    chgoffset = 0;
+	    changed = True;
+	}
+	freeDisplaySegment(dseg);
+    }
+
+    ocw->onthespot.numsegments = nnew;
+
+    if (!changed) {
+	if (ocw->onthespot.lastcaret != caret) {
+	    CBPreeditCaret(ocw, caret);
+	}
+    }
+    else { /* changed */
+	Atom encoding = ocw->ccontrol.textencoding;
+	int format;
+	int length;
+	XtPointer string;
+
+	if (ICGetPreeditString(inputobj, chgseg, chgoffset, &encoding, &format,
+			       &length, &string) == 0) {
+
+	    dseg = ocw->onthespot.dispsegments;
+	    for (i = 0; i < chgseg; i++, dseg++) {
+		chgoffset += dseg->seg.nchars;
+	    }
+	    CBPreeditDraw(ocw, caret, chgoffset, oldlen - chgoffset,
+			  encoding, format, length, string,
+			  buffer->attrs_length, buffer->attrs_buffer);
+
+	    /* string $B$r(B free $B$7$F$*$/(B */
+	    XtFree((char *)string);
+	}
+    }
+
+    ocw->onthespot.lastcaret = caret;
+
+    /* buffer $B$r(B destroy $B$7$F$*$/(B */
+    destroyAttributeBuffer(buffer);
+}
+
+/*- CommitText: commit text -*/
+static void
+CommitText(w, arg)
+Widget w;
+CCTextCallbackArg *arg;
+{
+    OnTheSpotConversionWidget ocw = (OnTheSpotConversionWidget)w;
+    DisplaySegment *dseg;
+    int i, len;
+
+    dseg = ocw->onthespot.dispsegments;
+    len = 0;
+    for (i = 0; i < ocw->onthespot.numsegments; i++, dseg++) {
+	len += dseg->seg.nchars;
+    }
+    if (len > 0) {
+	/* $B%W%l%(%G%#%C%H%P%C%U%!$N>C5n(B */
+	Atom encoding = XA_COMPOUND_TEXT(XtDisplayOfObject(w));
+	int format = 8;
+	unsigned long attr = 0;
+	CBPreeditDraw(ocw, 0, 0, len, encoding, format, 0, (XPointer)"",
+		      0, &attr);
+    }
+    /* $BFbIt$N%P%C%U%!$r%/%j%"$9$k(B */
+    clearAllDisplaySegments(ocw);
+    ocw->onthespot.lastcaret = 0;
+
+    XtCallCallbackList((Widget)ocw, ocw->ccontrol.textcallback,
+		       (XtPointer)arg);
+
+    ocw->onthespot.fixnotify = True;
+}
+
+/*- UpdateMode: update mode -*/
+static void
+UpdateMode(w)
+Widget w;
+{
+    OnTheSpotConversionWidget ocw = (OnTheSpotConversionWidget)w;
+    Widget inputobj = ocw->ccontrol.inputobj;
+    Atom encoding = ocw->ccontrol.textencoding;
+    int format;
+    int length;
+    XtPointer string;
+    int nchars;
+
+    TRACE(("OnTheSpotConversion:UpdateMode()\n"));
+
+    if (ICGetStatusString(inputobj, &encoding, &format, &length, &string,
+			  &nchars) == -1)
+	return;
+
+    CBStatusDraw(ocw, encoding, format, length, string, nchars);
+
+    /* string $B$r(B free $B$7$F$*$/(B */
+    XtFree((char *)string);
+}
+
+/*- SelectionControl: selection control -*/
+static void
+SelectionControl(w, arg)
+Widget w;
+ICSelectionControlArg *arg;
+{
+    OnTheSpotConversionWidget ocw = (OnTheSpotConversionWidget)w;
+    String params[1];
+    Cardinal num_params;
+
+    switch (arg->command) {
+    case ICSelectionStart:
+	SelectionStart(ocw, arg->u.selection_kind);
+	break;
+    case ICSelectionEnd:
+	SelectionEnd(ocw, &arg->u.current_item);
+	break;
+    case ICSelectionSet:
+	SelectionSet(ocw, arg->u.current_item);
+	break;
+    case ICSelectionMove:
+	SelectionMove(ocw, arg->u.dir);
+	break;
+    case ICSelectionGet:
+	SelectionGet(ocw, &arg->u.current_item);
+	break;
+    default:
+	params[0] = XtClass(w)->core_class.class_name;
+	num_params = 1;
+	XtAppWarningMsg(XtWidgetToApplicationContext(w),
+			"parameterError", "SelectionControl", "WidgetError",
+			"%s: unknown selection control command",
+			params, &num_params);
+	break;
+    }
+}
+
+/*- SelectionStart: selection startup -*/
+/* ARGSUSED */
+static void
+SelectionStart(ocw, kind)
+OnTheSpotConversionWidget ocw;
+int kind;
+{
+    Cardinal ncand;
+
+    TRACE(("OnTheSpotConversion:SelectionStart()\n"));
+    if (ocw->onthespot.selectionpoppedup) {
+	TRACE(("\tselection already started -- ignored\n"));
+	return;
+    }
+
+    ocw->onthespot.candlist = ICGetItemList(ocw->ccontrol.inputobj, &ncand);
+    ocw->onthespot.numcands = ncand;
+
+    TRACE(("\tnumcands=%d\n", ocw->onthespot.numcands));
+    CPanelSetList(ocw->onthespot.selectionwidget,
+		  ocw->onthespot.candlist,
+		  ocw->onthespot.numcands, 0, True);
+
+    LocateSelectionPopup(ocw);
+    XtPopup(ocw->onthespot.selectionshell, XtGrabNone);
+    ocw->onthespot.selectionpoppedup = True;
+}
+
+/*- LocateSelectionPopup: put selection popup at an appropriate position -*/
+static void
+LocateSelectionPopup(ocw)
+OnTheSpotConversionWidget ocw;
+{
+    Position x, y;
+    int clx, cly;
+    Dimension dpyWidth, dpyHeight;
+    Widget panel = ocw->onthespot.selectionwidget;
+    Widget shell = ocw->onthespot.selectionshell;
+    Window junk;
+    int barheight = ocw->ccontrol.titlebarheight;
+
+    (void)XTranslateCoordinates(XtDisplay(ocw),
+				ocw->ccontrol.clientwindow,
+				RootWindowOfScreen(XtScreen(ocw)),
+				0, 0, &clx, &cly, &junk);
+
+    (void)SafeGetWindowAttributes(XtDisplay(ocw), ocw->ccontrol.clientwindow,
+				  &(ocw->ccontrol.client_attr));
+
+    x = clx;
+    y = cly + ocw->ccontrol.client_attr.height;
+
+    dpyWidth = WidthOfScreen(XtScreen(shell));
+    dpyHeight = HeightOfScreen(XtScreen(shell));
+
+    if (x + panel->core.width > (int)dpyWidth) x = dpyWidth - panel->core.width;
+    if (x < 0) x = 0;
+#if 0
+    if (y + panel->core.height + barheight > (int)dpyHeight) {
+	y = cly - panel->core.height - 8 - barheight - 20; /* XXX */
+	if (y < 0) y = dpyHeight - panel->core.height - barheight;
+    }
+#endif
+    if (y + panel->core.height + barheight > (int)dpyHeight)
+	y = dpyHeight - panel->core.height - 8 - barheight - 20; /* XXX */
+    if (y < 0) y = 0;
+    MoveShell(shell, x, y);
+}
+
+/*- SelectionEnd: selection finish -*/
+static void
+SelectionEnd(ocw, current)
+OnTheSpotConversionWidget ocw;
+int *current;
+{
+    TRACE(("OnTheSpotConversion:SelectionEnd()\n"));
+
+    if (!ocw->onthespot.selectionpoppedup) {	/* for safe */
+	TRACE(("\tnot in selection mode -- ignored\n"));
+	return;
+    }
+
+    XtVaGetValues(ocw->onthespot.selectionwidget,
+		  XtNcurrentItem, current,
+		  NULL);
+
+    XtPopdown(ocw->onthespot.selectionshell);
+
+    ocw->onthespot.selectionpoppedup = False;
+}
+
+/*- SelectionSet: set current selection item -*/
+static void
+SelectionSet(ocw, current)
+OnTheSpotConversionWidget ocw;
+int current;
+{
+    TRACE(("OnTheSpotConversion:SelectionSet()\n"));
+
+    if (!ocw->onthespot.selectionpoppedup) {	/* for safe */
+	TRACE(("\tnot in selection mode -- ignored\n"));
+	return;
+    }
+
+    XtVaSetValues(ocw->onthespot.selectionwidget,
+		  XtNcurrentItem, current,
+		  NULL);
+}
+
+/*- SelectionGet: get current selection item -*/
+static void
+SelectionGet(ocw, current)
+OnTheSpotConversionWidget ocw;
+int *current;
+{
+    TRACE(("OnTheSpotConversion:SelectionGet()\n"));
+
+    if (!ocw->onthespot.selectionpoppedup) {	/* for safe */
+	TRACE(("\tnot in selection mode -- ignored\n"));
+	return;
+    }
+
+    XtVaGetValues(ocw->onthespot.selectionwidget,
+		  XtNcurrentItem, current,
+		  NULL);
+}
+
+/*- SelectionMove: move crrent selection to specified direction -*/
+static void
+SelectionMove(ocw, dir)
+OnTheSpotConversionWidget ocw;
+int dir;
+{
+    TRACE(("OnTheSpotConversion:SelectionMove()\n"));
+
+    if (!ocw->onthespot.selectionpoppedup) {	/* for safe */
+	TRACE(("\tnot in selection mode -- ignored\n"));
+	return;
+    }
+
+    CPanelMoveCurrent(ocw->onthespot.selectionwidget, dir);
+}
+
+/*
+ * Aux Callback
+ */
+
+static void
+AuxControl(w, arg)
+Widget w;
+ICAuxControlArg *arg;
+{
+    OnTheSpotConversionWidget ocw = (OnTheSpotConversionWidget)w;
+    String params[1];
+    Cardinal num_params;
+
+    switch (arg->command) {
+    case ICAuxStart:
+	AuxStart(ocw);
+	break;
+    case ICAuxEnd:
+	AuxEnd(ocw);
+	break;
+    case ICAuxChange:
+	AuxChange(ocw);
+	break;
+    default:
+	params[0] = XtClass(w)->core_class.class_name;
+	num_params = 1;
+	XtAppWarningMsg(XtWidgetToApplicationContext(w),
+			"parameterError", "AuxControl", "WidgetError",
+			"%s: unknown aux control command",
+			params, &num_params);
+	break;
+    }
+}
+
+/* ARGSUSED */
+static void
+AuxStart(ocw)
+OnTheSpotConversionWidget ocw;
+{
+  ICString *auxstr;
+  Cardinal ncand, curseg, cursorpos;
+  
+  if (ocw->onthespot.auxpoppedup) return;
+  
+  /* $B%F%-%9%H%3!<%k%P%C%/$N;~$N$h$&$J=hM}$r$9$k(B
+     $B$N$O(B AuxPanel.c $B$K$^$+$;$h$&(B */
+
+  auxstr = ICGetAuxSegments(ocw->ccontrol.inputobj,
+			    &ncand, &curseg, &cursorpos);
+
+  APanelStart(ocw->onthespot.auxwidget, auxstr, ncand, curseg, cursorpos);
+
+  /* $B%]%C%W%"%C%W$9$k>l=j$r7h$a$k(B */
+  LocateAuxPopup(ocw);
+
+  XtPopup(ocw->onthespot.auxshell, XtGrabNone);
+  ocw->onthespot.auxpoppedup = True;
+}
+
+/* ARGSUSED */
+static void
+AuxEnd(ocw)
+OnTheSpotConversionWidget ocw;
+{
+  if (!ocw->onthespot.auxpoppedup) return;	/* for safe */
+
+/*  APanelEnd(ocw->onthespot.auxwidget); */
+
+  XtPopdown(ocw->onthespot.auxshell);
+
+  ocw->onthespot.auxpoppedup = False;
+}
+
+/* ARGSUSED */
+static void
+AuxChange(ocw)
+OnTheSpotConversionWidget ocw;
+{
+  Cardinal ncand, curseg, cursorpos;
+  ICString *auxstr;
+
+  if (!ocw->onthespot.auxpoppedup) return;	/* for safe */
+
+  auxstr = ICGetAuxSegments(ocw->ccontrol.inputobj,
+			    &ncand, &curseg, &cursorpos);
+
+  APanelChange(ocw->onthespot.auxwidget, auxstr, ncand, curseg, cursorpos);
+}
+
+/*- LocateAuxPopup: put aux popup at an appropriate position -*/
+static void
+LocateAuxPopup(ocw)
+OnTheSpotConversionWidget ocw;
+{
+    Position x, y;
+    int clx, cly;
+    Dimension dpyWidth, dpyHeight;
+    Widget panel = ocw->onthespot.auxwidget;
+    Widget shell = ocw->onthespot.auxshell;
+    Window junk;
+    int barheight = ocw->ccontrol.titlebarheight;
+
+    (void)XTranslateCoordinates(XtDisplay(ocw),
+				ocw->ccontrol.clientwindow,
+				RootWindowOfScreen(XtScreen(ocw)),
+				0, 0, &clx, &cly, &junk);
+
+    (void)SafeGetWindowAttributes(XtDisplay(ocw), ocw->ccontrol.clientwindow,
+				  &(ocw->ccontrol.client_attr));
+
+    x = clx;
+    y = cly + ocw->ccontrol.client_attr.height;
+
+    dpyWidth = WidthOfScreen(XtScreen(shell));
+    dpyHeight = HeightOfScreen(XtScreen(shell));
+
+    if (x + panel->core.width > (int)dpyWidth) x = dpyWidth - panel->core.width;
+    if (x < 0) x = 0;
+#if 0
+    if (y + panel->core.height + barheight > (int)dpyHeight) {
+	y = cly - panel->core.height - 8 - barheight - 20; /* XXX */
+	if (y < 0) y = dpyHeight - panel->core.height - barheight;
+    }
+#endif
+    if (y + panel->core.height + barheight > (int)dpyHeight)
+	y = dpyHeight - panel->core.height - 8 - barheight - 20; /* XXX */
+    if (y < 0) y = 0;
+    MoveShell(shell, x, y);
+}
+
+/*
+ *+ Selection Widget callback
+ */
+
+/*- SelectionSelected: selection selected callback -*/
+/* ARGSUSED */
+static void
+SelectionSelected(w, client_data, call_data)
+Widget w;
+XtPointer client_data;
+XtPointer call_data;
+{
+    OnTheSpotConversionWidget ocw = (OnTheSpotConversionWidget)client_data;
+    int current = (int)call_data;
+
+    TRACE(("OnTheSpotConversion:SelectionSelected()\n"));
+    XtPopdown(ocw->onthespot.selectionshell);
+    ocw->onthespot.selectionpoppedup = False;
+    ICSelectItem(ocw->ccontrol.inputobj, current);
+}
+
+/*
+ *+ miscelaneous functions
+ */
+
+/*- SafeGetWindowAttributes: get window attributes -*/
+static Boolean
+SafeGetWindowAttributes(dpy, w, attr)
+Display *dpy;
+Window w;
+XWindowAttributes *attr;
+{
+    XAEHandle h;
+    unsigned long errbits = 0;
+
+    h = XAESetRecordErrors(dpy, &errbits);
+    (void)XGetWindowAttributes(dpy, w, attr);
+    XAEUnset(h);
+
+    return (errbits == 0);
+}
+
+/*- MoveShell: move shell widget -*/
+static void
+MoveShell(w, x, y)
+Widget w;
+Position x;
+Position y;
+{
+    XtWidgetGeometry req;
+
+    /*
+     * calling XtMoveWidget() is NOT enough to move shell widgets.
+     * we must use XtMakeGeometryRequest() or XtSetValues() to
+     * invoke root-geometry-manager which modifies the size hint
+     * appropriately.
+     */
+    req.request_mode = CWX | CWY;
+    req.x = x;
+    req.y = y;
+    (void)XtMakeGeometryRequest(w, &req, (XtWidgetGeometry *)NULL);
+}
+
+/*- getToplevelWindow: get top-level window of a given window -*/
+static Window
+getToplevelWindow(dpy, win)
+Display *dpy;
+Window win;
+{
+    Atom wm_state;
+    Atom type;
+    int format;
+    unsigned long nitems, bytesafter;
+    unsigned char *data;
+    Window root, parent;
+    Window *children;
+    unsigned int nchildren;
+
+    /*
+     * find toplevel window which has WM_STATE property or if no exists,
+     * direct subwindow of the root window. (ie I assume that if a
+     * window manager is running, that is a ICCCM compliant one)
+     */
+    wm_state = CachedInternAtom(dpy, "WM_STATE", True);
+    for (;;) {
+	type = None;
+	if (wm_state != None) {
+	    data = NULL;
+	    XGetWindowProperty(dpy, win, wm_state, 0L, 0L, False,
+			       AnyPropertyType, &type, &format,
+			       &nitems, &bytesafter, &data);
+	    if (data != NULL) XtFree((char *)data);
+	    if (type != None) break;
+	}
+	if (!XQueryTree(dpy, win, &root, &parent, &children, &nchildren)) break;
+	if (nchildren > 0) XtFree((char *)children);
+	if (root == parent) break;
+	win = parent;
+    }
+    return win;
+}
+
+/*- setTransientFor: set WM_TRANSIENT_FOR property to specified widget -*/
+static void
+setTransientFor(w, win)
+Widget w;
+Window win;
+{
+    if (!XtIsRealized(w)) XtRealizeWidget(w);
+    XSetTransientForHint(XtDisplay(w), XtWindow(w), win);
+}
+
+/*- allocDisplaySegments: prepare specified number of display segments -*/
+static void
+allocDisplaySegments(ocw, n)
+OnTheSpotConversionWidget ocw;
+Cardinal n;
+{
+    if (ocw->onthespot.dispsegmentsize > n) return;
+    n = ((n + 3) / 4) * 4 ;
+    if (ocw->onthespot.dispsegments == NULL) {
+	ocw->onthespot.dispsegments = (DisplaySegment *)XtMalloc(n * sizeof(DisplaySegment));
+    } else {
+	ocw->onthespot.dispsegments = (DisplaySegment *)XtRealloc((char *)ocw->onthespot.dispsegments, n * sizeof(DisplaySegment));
+    }
+    ocw->onthespot.dispsegmentsize = n;
+}
+
+/*- freeDisplaySegment: free display segment's contents -*/
+static void
+freeDisplaySegment(dsp)
+DisplaySegment *dsp;
+{
+    freeString(&dsp->seg);
+}
+
+/*- clearAllDisplaySegments: clear all display segment's -*/
+static void
+clearAllDisplaySegments(ocw)
+OnTheSpotConversionWidget ocw;
+{
+    DisplaySegment *dsp = ocw->onthespot.dispsegments;
+    int i;
+
+    for (i = 0; i < ocw->onthespot.numsegments; i++) {
+	freeDisplaySegment(dsp++);
+    }
+    ocw->onthespot.numsegments = 0;
+}
+
+/*- copyString: copy ICString -*/
+static void
+copyString(from, to)
+ICString *from;
+ICString *to;
+{
+    *to = *from;
+    to->data = XtMalloc(to->nbytes);
+    (void)bcopy(from->data, to->data, to->nbytes);
+}
+
+/*- freeString: free ICString -*/
+static void
+freeString(seg)
+ICString *seg;
+{
+    XtFree(seg->data);
+    seg->data = NULL;
+    seg->nbytes = 0;
+}
+
+/*- allocAttributeBuffer: allocate attribute buffer -*/
+static AttributeBuffer *
+allocAttributeBuffer()
+{
+    AttributeBuffer *buffer;
+
+    buffer = (AttributeBuffer *)XtMalloc(sizeof(AttributeBuffer));
+    buffer->attrs_length = 0;
+    buffer->attrs_limit = 64;
+    buffer->attrs_buffer = (unsigned long *)XtMalloc(buffer->attrs_limit * sizeof(unsigned long));
+    return buffer;
+}
+
+/*- destroyAttributeBuffer: destroy draw string buffer's contents -*/
+static void
+destroyAttributeBuffer(buffer)
+AttributeBuffer *buffer;
+{
+    XtFree((char *)buffer->attrs_buffer);
+    XtFree((char *)buffer);
+}
+
+/*- addAttributeBuffer: add segment to draw string buffer's contents -*/
+static void
+addAttributeBuffer(buffer, inputobj, seg, offset, fba)
+AttributeBuffer *buffer;
+Widget inputobj;
+ICString *seg;
+int offset;
+FeedbackAttributes *fba;
+{
+    int nchars = seg->nchars - offset;
+    unsigned long fb;
+    int i;
+
+    if (buffer->attrs_length + nchars > buffer->attrs_limit) {
+	unsigned long *new_attrs_buffer;
+	int new_limit = buffer->attrs_limit * 2;
+	if (new_limit < buffer->attrs_length + nchars)
+	    new_limit = buffer->attrs_length + nchars + 8;
+	new_attrs_buffer = (unsigned long *)XtMalloc(new_limit * sizeof(unsigned long));
+	bcopy(buffer->attrs_buffer, new_attrs_buffer,
+	      buffer->attrs_length * sizeof(unsigned long));
+	XtFree((char *)buffer->attrs_buffer);
+	buffer->attrs_limit = new_limit;
+	buffer->attrs_buffer = new_attrs_buffer;
+    }
+    fb = attrToFeedback(fba, seg->attr);
+    for (i = 0; i < nchars; i++) {
+	buffer->attrs_buffer[buffer->attrs_length + i] = fb;
+    }
+    buffer->attrs_length += nchars;
+}
+
+/*- attrToFeedback: ICString attribute -> XIMFeedback attribute converter -*/
+static unsigned long
+attrToFeedback(fba, attr)
+FeedbackAttributes *fba;
+int attr;
+{
+    int idx;
+
+    if (attr == ICAttrNormalString) return 0;
+
+    if (!(attr & ICAttrConverted)) {
+	/* Not yet converted */
+	idx = FEEDBACK_NOCONV;
+    } else if (attr & ICAttrCurrentSegment) {
+	/* it's converted and the current segment */
+	idx = FEEDBACK_CURRENT;
+    } else if (attr & ICAttrCurrentSubSegment) {
+	/* it's converted and the current sub segment */
+	idx = FEEDBACK_CURRENTSUB;
+    } else {
+	/* converted, not current */
+	idx = FEEDBACK_CONV;
+    }
+    return fba->feedbacks[idx];
+}
+
+/*- CBPreeditStart: callback preedit start -*/
+static void
+CBPreeditStart(ocw)
+OnTheSpotConversionWidget ocw;
+{
+    if (ocw->onthespot.preeditstartcallback == NULL ||
+	XtHasCallbacks((Widget)ocw, XtNpreeditStartCallback) != XtCallbackHasSome)
+    {
+	/* no callback */
+	return;
+    }
+
+    TRACE(("OnTheSpot:CBPreeditStart()\n"));
+
+    XtCallCallbackList((Widget)ocw, ocw->onthespot.preeditstartcallback,
+		       (XtPointer)NULL);
+}
+
+/*- CBPreeditDone: callback preedit done -*/
+static void
+CBPreeditDone(ocw)
+OnTheSpotConversionWidget ocw;
+{
+    if (ocw->onthespot.preeditdonecallback == NULL ||
+	XtHasCallbacks((Widget)ocw, XtNpreeditDoneCallback) != XtCallbackHasSome)
+    {
+	/* no callback */
+	return;
+    }
+
+    TRACE(("OnTheSpot:CBPreeditDone()\n"));
+
+    XtCallCallbackList((Widget)ocw, ocw->onthespot.preeditdonecallback,
+		       (XtPointer)NULL);
+}
+
+/*- CBPreeditDraw: callback preedit draw -*/
+static void
+CBPreeditDraw(ocw, caret, chg_first, chg_length, encoding, format, text_length, text, attrs_length, attrs)
+OnTheSpotConversionWidget ocw;
+int caret;
+int chg_first;
+int chg_length;
+Atom encoding;
+int format;
+int text_length;
+XtPointer text;
+int attrs_length;
+unsigned long *attrs;
+{
+    OCCPreeditDrawArg arg;
+
+    if (ocw->onthespot.preeditdrawcallback == NULL ||
+	XtHasCallbacks((Widget)ocw, XtNpreeditDrawCallback) != XtCallbackHasSome)
+    {
+	/* no callback */
+	return;
+    }
+
+    TRACE(("OnTheSpot:CBPreeditDraw()\n"));
+
+    arg.caret = caret;
+    arg.chg_first = chg_first;
+    arg.chg_length = chg_length;
+    arg.encoding = encoding;
+    arg.format = format;
+    arg.text_length = text_length;
+    arg.text = text;
+    arg.attrs_length = attrs_length;
+    arg.attrs = attrs;
+    XtCallCallbackList((Widget)ocw, ocw->onthespot.preeditdrawcallback,
+		       (XtPointer)&arg);
+}
+
+/*- CBPreeditCaret: callback preedit caret -*/
+static void
+CBPreeditCaret(ocw, caret)
+OnTheSpotConversionWidget ocw;
+int caret;
+{
+    if (ocw->onthespot.preeditcaretcallback == NULL ||
+	XtHasCallbacks((Widget)ocw, XtNpreeditCaretCallback) != XtCallbackHasSome)
+    {
+	/* no callback */
+	return;
+    }
+
+    TRACE(("OnTheSpot:CBPreeditCaret()\n"));
+
+    XtCallCallbackList((Widget)ocw, ocw->onthespot.preeditcaretcallback,
+		       (XtPointer)caret);
+}
+
+/*- CBStatusStart: callback status start -*/
+static void
+CBStatusStart(ocw)
+OnTheSpotConversionWidget ocw;
+{
+    if (ocw->onthespot.statusstartcallback == NULL ||
+	XtHasCallbacks((Widget)ocw, XtNstatusStartCallback) != XtCallbackHasSome)
+    {
+	/* no callback */
+	return;
+    }
+
+    TRACE(("OnTheSpot:CBStatusStart()\n"));
+
+    XtCallCallbackList((Widget)ocw, ocw->onthespot.statusstartcallback,
+		       (XtPointer)NULL);
+}
+
+/*- CBStatusDone: callback status done -*/
+static void
+CBStatusDone(ocw)
+OnTheSpotConversionWidget ocw;
+{
+    if (ocw->onthespot.statusdonecallback == NULL ||
+	XtHasCallbacks((Widget)ocw, XtNstatusDoneCallback) != XtCallbackHasSome)
+    {
+	/* no callback */
+	return;
+    }
+
+    TRACE(("OnTheSpot:CBStatusDone()\n"));
+
+    XtCallCallbackList((Widget)ocw, ocw->onthespot.statusdonecallback,
+		       (XtPointer)NULL);
+}
+
+/*- CBStatusDraw: callback status draw -*/
+static void
+CBStatusDraw(ocw, encoding, format, length, text, nchars)
+OnTheSpotConversionWidget ocw;
+Atom encoding;
+int format;
+int length;
+XtPointer text;
+int nchars;
+{
+    OCCPreeditDrawArg arg;
+
+    if (ocw->onthespot.statusdrawcallback == NULL ||
+	XtHasCallbacks((Widget)ocw, XtNstatusDrawCallback) != XtCallbackHasSome)
+    {
+	/* no callback */
+	return;
+    }
+
+    TRACE(("OnTheSpot:CBStatusDraw()\n"));
+
+    arg.caret = 0;	/* ignored */
+    arg.chg_first = 0;	/* ignored */
+    arg.chg_length = 0;	/* ignored */
+    arg.encoding = encoding;
+    arg.format = format;
+    arg.text_length = length;
+    arg.text = text;
+    arg.attrs_length = nchars;
+    arg.attrs = NULL;	/* ignored */
+    XtCallCallbackList((Widget)ocw, ocw->onthespot.statusdrawcallback,
+		       (XtPointer)&arg);
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/OverConv.c	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,2708 @@
+#ifndef lint
+static char *rcsid = "$Id: OverConv.c,v 1.71 1999/05/06 09:07:58 ishisone Exp $";
+#endif
+/*-
+ * Copyright (c) 1990  Software Research Associates, Inc.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted, provided
+ * that the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Software Research Associates not be
+ * used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission.  Software Research
+ * Associates makes no representations about the suitability of this software
+ * for any purpose.  It is provided "as is" without express or implied
+ * warranty.
+ *
+ * Author:  Makoto Ishisone, Software Research Associates, Inc., Japan
+ */
+
+#include <X11/IntrinsicP.h>
+#include <X11/StringDefs.h>
+#include <X11/Xmu/CharSet.h>
+#if XtSpecificationRelease > 4
+#include <X11/Xfuncs.h>
+#endif
+#include "CachedAtom.h"
+#include "AsyncErr.h"
+#include "OverConvP.h"
+#include "InputConv.h"
+#include "ConvDisp.h"
+#include "CandPanel.h"
+#include "AuxPanel.h"
+#include "CanvasShel.h"
+#include "ICLabel.h"
+
+#define DEBUG_VAR debug_OverTheSpotConversion
+#include "DebugPrint.h"
+
+typedef enum { NeedNone, NeedRedraw, NeedReconfig } ResetStatus;
+
+/*- resource table -*/
+static XtResource resources[] = {
+#define offset(field) XtOffset(OverTheSpotConversionWidget, overthespot.field)
+    { XtNspotX, XtCPosition, XtRPosition, sizeof(Position),
+	offset(spotx), XtRImmediate, (XtPointer)0 },
+    { XtNspotY, XtCPosition, XtRPosition, sizeof(Position),
+	offset(spoty), XtRImmediate, (XtPointer)0 },
+    { XtNautoSpotForwarding, XtCAutoSpotForwarding, XtRBoolean, sizeof(Boolean),
+	offset(spotforwarding), XtRImmediate, (XtPointer)False },
+    { XtNlineSpacing, XtCLineSpacing, XtRDimension, sizeof(Dimension),
+	offset(linespacing), XtRImmediate, (XtPointer)0 },
+    { XtNmodeLocation, XtCModeLocation, XtRModeLocation, sizeof(ModeLocation),
+	offset(modelocation), XtRString, "BottomLeft" },
+    { XtNshrinkWindow, XtCShrinkWindow, XtRBoolean, sizeof(Boolean),
+	offset(shrinkwindow), XtRImmediate, (XtPointer)False },
+    { XtNignoreStatusAreaSpec, XtCIgnoreStatusAreaSpec,
+	XtRBoolean, sizeof(Boolean),
+	offset(ignorestatusarea), XtRImmediate, (XtPointer)False },
+    { XtNmodeBorderForeground, XtCModeBorderForeground,
+	XtRBoolean, sizeof(Boolean),
+	offset(borderforeground), XtRImmediate, (XtPointer)False },
+    { XtNuseOverrideShellForMode, XtCUseOverrideShellForMode,
+	XtRBoolean, sizeof(Boolean),
+	offset(useoverride), XtRImmediate, (XtPointer)False },
+    /* changes superclass's default */
+    { XtNmappedWhenManaged, XtCMappedWhenManaged, XtRBoolean, sizeof(Boolean),
+	XtOffset(OverTheSpotConversionWidget, core.mapped_when_managed),
+	XtRImmediate, (XtPointer)False },
+#undef offset
+};
+
+/*- default translation table -*/
+static char translations[] = "<Key>: to-inputobj()";	/* same as superclass's */
+
+/*- declarations of static functions -*/
+static void ClassInitialize();
+static void Initialize();
+static void Destroy();
+static Boolean SetValues();
+
+static void ConversionStartup();
+static void ChangeAttributes();
+static void ChangeFocus();
+static void ConversionFinish();
+
+static void CreateDisplayObject();
+static void CreateSelectionWidget();
+static void CreateModeWidget();
+static TextCanvas * CreateTextCanvas();
+
+static void setupTextCanvas();
+static ResetStatus resetTextCanvas();
+static void setupDisplayObject();
+static ResetStatus resetDisplayObject();
+static void setupModeWidget();
+static ResetStatus resetModeWidget();
+static void locateTextCanvasInitial();
+static void locateModeWidget();
+static void locateTrackingModeWidget();
+static void redrawAndReconfigureTextCanvas();
+
+static void UpdateText();
+static void UpdateMode();
+static void SelectionControl();
+
+static void SelectionStart();
+static void locateSelectionPopup();
+static void SelectionEnd();
+static void SelectionSet();
+static void SelectionGet();
+static void SelectionMove();
+static void ForwardSpot();
+
+static void CreateAuxWidget();
+static void AuxControl();
+static void AuxStart();
+static void locateAuxPopup();
+static void AuxEnd();
+static void AuxChange();
+
+
+static void TextRedisplay();
+
+static void SelectionSelected();
+
+static void computeDisplaySegments();
+static void recomputeDisplaySegments();
+static void computeLastPosition();
+static DisplayFragment *computeDisplayFragments();
+static int computeWidthAvailable();
+static void nextLocation();
+static DisplayLocation *findLocation();
+static void reconfigureDisplay();
+static void updateDisplay();
+static void updateDisplaySegment();
+static void redrawSegments();
+
+static void adjustDisplay();
+static Boolean getAttributeSegmentRange();
+static Boolean getInsertingSegmentRange();
+static void adjustOffset();
+
+static void eraseCursor();
+static void showCursor();
+static Boolean exposeCursor();
+static void computeCursor();
+
+static void StringToModeLocation();
+
+static void MoveShell();
+static Window getToplevelWindow();
+static void setTransientFor();
+static void setMwmHints();
+static void getFocusOffset();
+static Boolean intersectRect();
+static void unionRect();
+static int enoughSpaceForStatus();
+static DisplayFragment *allocDisplayFragment();
+static void freeDisplayFragments();
+static void destroyDisplayFragments();
+static void allocDisplaySegments();
+static void freeDisplaySegment();
+static void clearAllDisplaySegments();
+static void copyString();
+static void freeString();
+
+/*- composite-extension rec: for enabling non-widget children -*/
+static CompositeClassExtensionRec CompositeExtension = {
+    /* next_extension		*/	NULL,
+    /* record_type		*/	NULLQUARK,
+    /* version			*/	XtCompositeExtensionVersion,
+    /* record_size		*/	sizeof(CompositeClassExtensionRec),
+    /* accept_objects		*/	True,
+};
+
+/*- overTheSpotConversionClass record -*/
+OverTheSpotConversionClassRec overTheSpotConversionClassRec = {
+  { /* core fields */
+    /* superclass		*/	(WidgetClass)&conversionControlClassRec,
+    /* class_name		*/	"OverTheSpotConversion",
+    /* widget_size		*/	sizeof(OverTheSpotConversionRec),
+    /* class_initialize		*/	ClassInitialize,
+    /* class_part_initialize	*/	NULL,
+    /* class_inited		*/	FALSE,
+    /* initialize		*/	Initialize,
+    /* initialize_hook		*/	NULL,
+    /* realize			*/	XtInheritRealize,
+    /* actions			*/	NULL,
+    /* num_actions		*/	0,
+    /* resources		*/	resources,
+    /* num_resources		*/	XtNumber(resources),
+    /* xrm_class		*/	NULLQUARK,
+    /* compress_motion		*/	TRUE,
+    /* compress_exposure	*/	TRUE,
+    /* compress_enterleave	*/	TRUE,
+    /* visible_interest		*/	FALSE,
+    /* destroy			*/	Destroy,
+    /* resize			*/	XtInheritResize,
+    /* expose			*/	NULL,
+    /* set_values		*/	SetValues,
+    /* set_values_hook		*/	NULL,
+    /* set_values_almost	*/	XtInheritSetValuesAlmost,
+    /* get_values_hook		*/	NULL,
+    /* accept_focus		*/	NULL,
+    /* version			*/	XtVersion,
+    /* callback_private		*/	NULL,
+    /* tm_table			*/	translations,
+    /* query_geometry		*/	XtInheritQueryGeometry,
+    /* display_accelerator	*/	XtInheritDisplayAccelerator,
+    /* extension		*/	NULL
+  },
+  { /* composite fields */
+    /* geometry_manager		*/	XtInheritGeometryManager,
+    /* change_managed		*/	XtInheritChangeManaged,
+    /* insert_child		*/	XtInheritInsertChild,
+    /* delete_child		*/	XtInheritDeleteChild,
+    /* extension		*/	(XtPointer)&CompositeExtension,
+  },
+  { /* shell fields */
+    /* extension		*/	NULL
+  },
+  { /* wm_shell fields */
+    /* extension		*/	NULL
+  },
+  { /* vendor_shell fields */
+    /* extension		*/	NULL
+  },
+  { /* transient_shell fields */
+    /* extension		*/	NULL
+  },
+  { /* conversionControl fields */
+    /* Startup			*/	ConversionStartup,
+    /* Finish			*/	ConversionFinish,
+    /* ChangeAttributes		*/	ChangeAttributes,
+    /* ChangeFocus		*/	ChangeFocus,
+    /* TextChange		*/	UpdateText,
+    /* Fix			*/	XtInheritFix,
+    /* ModeChange		*/	UpdateMode,
+    /* SelectionControl		*/	SelectionControl,
+    /* SelectionControl		*/	AuxControl,
+  },
+  { /* overTheSpotConversion fields */
+    /* empty			*/	0
+  },
+};
+
+WidgetClass overTheSpotConversionWidgetClass = (WidgetClass)&overTheSpotConversionClassRec;
+
+/*
+ *+ Convenience macros
+ */
+#define SPOTX(w)	((w)->overthespot.spotx)
+#define SPOTY(w)	((w)->overthespot.spoty)
+#define CLAREA(w)	((w)->overthespot.clientarea)
+#define FOCUSOFFX(w)	((w)->overthespot.focusoffsetx)
+#define FOCUSOFFY(w)	((w)->overthespot.focusoffsety)
+
+/*
+ *+ Core class methods
+ */
+
+/*- ClassInitialize: add resource converter (string->modelocation) -*/
+/* ARGSUSED */
+static void
+ClassInitialize()
+{
+    XtAddConverter(XtRString, XtRModeLocation, StringToModeLocation,
+		   NULL, 0);
+}
+
+/*- Initialize: initialize method -*/
+/* ARGSUSED */
+static void
+Initialize(req, new, args, num_args)
+Widget req;
+Widget new;
+ArgList args;
+Cardinal *num_args;
+{
+    OverTheSpotConversionWidget ocw = (OverTheSpotConversionWidget)new;
+
+    ocw->overthespot.background = ocw->core.background_pixel;
+    ocw->overthespot.canvaslist = NULL;
+    ocw->overthespot.overflowcanvas = NULL;
+    ocw->overthespot.dispsegments = NULL;
+    ocw->overthespot.numsegments = 0;
+    ocw->overthespot.dispsegmentsize = 0;
+    ocw->overthespot.candlist = NULL;
+    ocw->overthespot.numcands = 0;
+    ocw->overthespot.selectionpoppedup = False;
+    ocw->overthespot.cursorvisible = False;
+    ocw->overthespot.canvascursor = None;
+    ocw->overthespot.auxpoppedup = False;
+
+    ocw->overthespot.wm_state =
+      CachedInternAtom(XtDisplay(new), "WM_STATE", False);
+
+    /* $B%F%-%9%HI=<($N(B widget $B$O:G=i$NJQ493+;O;~$K:n$k(B */
+    CreateDisplayObject(ocw);
+    CreateSelectionWidget(ocw);
+    CreateAuxWidget(ocw);
+    CreateModeWidget(ocw);
+}
+
+/*- Destroy: destroy method -*/
+static void
+Destroy(w)
+Widget w;
+{
+    OverTheSpotConversionWidget ocw = (OverTheSpotConversionWidget)w;
+
+    /* $B%G%#%9%W%l%$%;%0%a%s%H$NNN0h$r2rJ|(B */
+    if (ocw->overthespot.dispsegments) {
+	DisplaySegment *dsp = ocw->overthespot.dispsegments;
+	int i;
+
+	for (i = 0; i < ocw->overthespot.numsegments; i++) {
+	    freeString(&dsp[i].seg);
+	    destroyDisplayFragments(dsp->fragments);
+	}
+	XtFree((char *)dsp);
+    }
+
+    /* canvaslist $B$NNN0h$r2rJ|(B (canvas widget $B$O(B $B<+F0E*$K(B destroy $B$5$l$k(B */
+    if (ocw->overthespot.canvaslist) {
+	TextCanvas *p = ocw->overthespot.canvaslist;
+	while (p) {
+	    TextCanvas *q = p->next;
+	    XtFree((char *)p);
+	    p = q;
+	}
+    }
+}
+
+/*- SetValues: setvalues method -*/
+/* ARGSUSED */
+static Boolean
+SetValues(cur, req, new, args, num_args)
+Widget cur;
+Widget req;
+Widget new;
+ArgList args;
+Cardinal *num_args;
+{
+    /* OverTheSpotConversionWidget ocw = (OverTheSpotConversionWidget)new; */
+    return False;
+}
+
+/*
+ *+ ConversionControl cass methods
+ */
+
+/*- ConversionStartup: class specific conversion startup -*/
+static void
+ConversionStartup(w, mask, value)
+Widget w;
+unsigned long mask;
+ConversionAttributes *value;
+{
+    OverTheSpotConversionWidget ocw = (OverTheSpotConversionWidget)w;
+    Widget inputobj = ocw->ccontrol.inputobj;
+    Window toplevel;
+
+    TRACE(("OverTheSpot:ConversionStartup()\n"));
+
+    /* $BFbIt$N%P%C%U%!$r%/%j%"$9$k(B */
+    clearAllDisplaySegments(ocw);
+
+    /* $BJQ49%*%V%8%'%/%H$K%3!<%k%P%C%/$r@_Dj$9$k(B */
+    XtAddCallback(inputobj, XtNfixNotify, ForwardSpot, (XtPointer)w);
+
+    if (ocw->overthespot.ignorestatusarea) mask &= ~CAStatusArea;
+
+    setupDisplayObject(ocw, mask, value);
+    setupTextCanvas(ocw, mask, value);
+    setupModeWidget(ocw, mask, value);
+
+    /* WM_TRANSIENT_FOR $B%W%m%Q%F%#$r@5$7$/%;%C%H$9$k(B */
+    toplevel = getToplevelWindow(XtDisplay(w),
+				 ocw->ccontrol.clientwindow,
+				 ocw->overthespot.wm_state);
+    setTransientFor(ocw->overthespot.modeshell, toplevel);
+    setTransientFor(ocw->overthespot.selectionshell, toplevel);
+    setTransientFor(ocw->overthespot.auxshell, toplevel);
+
+    /* $B%F%-%9%H%-%c%s%P%9$NI=<(0LCV$r7h$a$k(B */
+    locateTextCanvasInitial(ocw);
+
+    /* $B%b!<%I$NI=<(0LCV$r7h$a$k(B */
+    if (!ocw->overthespot.modelocationspecified) locateModeWidget(ocw);
+
+    /*
+     * OverTheSpotConvesion $B$N>l9g!"<+J,<+?H$O%]%C%W%"%C%W$7$J$$$,!"(B
+     * $B%P%C%/%(%s%I%?%$%W$N;~$K$O%/%i%$%"%s%H$,$3$N(B widget $B$N(B
+     * $B%&%#%s%I%&$KBP$7$F%$%Y%s%H$rAw$k$N$G!"(BRealize $B$@$1$7$F$*$/(B
+     * $B$=$N:]!"Bg$-$5$r;XDj$7$J$$$H%5%$%:$,(B 0 $B$K$J$C$F$7$^$&$N$GCm0U$9$k(B
+     */
+    if (!XtIsRealized(w)) {
+	Arg args[2];
+
+	XtSetArg(args[0], XtNwidth, 1);
+	XtSetArg(args[1], XtNheight, 1);
+	XtSetValues(w, args, 2);
+	XtRealizeWidget(w);
+    }
+
+    /* $B%b!<%II=<(%-%c%s%P%9$r%]%C%W%"%C%W$9$k(B */
+    if (ocw->overthespot.modeshell != NULL) {
+	XtPopup(ocw->overthespot.modeshell, XtGrabNone);
+    }
+}
+
+/*- ChangeAttributes: class specific conversion attribute change routine -*/
+/* ARGSUSED */
+static void
+ChangeAttributes(w, mask, value)
+Widget w;
+unsigned long mask;
+ConversionAttributes *value;
+{
+    OverTheSpotConversionWidget ocw = (OverTheSpotConversionWidget)w;
+    ResetStatus dispres, tcres;
+
+    TRACE(("OverTheSpot:ChangeAttributes()\n"));
+
+    if (ocw->overthespot.ignorestatusarea) mask &= ~CAStatusArea;
+
+    dispres = resetDisplayObject(ocw, mask, value);
+    tcres = resetTextCanvas(ocw, mask, value);
+    if (dispres == NeedReconfig || tcres == NeedReconfig) {
+	redrawAndReconfigureTextCanvas(ocw);
+    } else if (dispres == NeedRedraw || tcres == NeedRedraw) {
+	TextCanvas *tcp = ocw->overthespot.canvaslist;
+
+	while (tcp != NULL) {
+	    if (XtIsRealized(tcp->canvas)) {
+		XClearArea(XtDisplay(tcp->canvas), XtWindow(tcp->canvas),
+			   0, 0, 0, 0, True);
+	    }
+	    tcp = tcp->next;
+	}
+    }
+
+    if (resetModeWidget(ocw, mask, value) != NeedNone &&
+	XtIsRealized(ocw->overthespot.modewidget)) {
+	XClearArea(XtDisplay(w), XtWindow((Widget)ocw->overthespot.modewidget),
+		   0, 0, 0, 0, True);
+    }
+}
+
+/*- ChangeFocus: class specific conversion attribute change routine -*/
+static void
+ChangeFocus(w, set)
+Widget w;
+int set;
+{
+    OverTheSpotConversionWidget ocw = (OverTheSpotConversionWidget)w;
+
+    TRACE(("OverTheSpot:ChangeFocus()\n"));
+
+    if (ocw->overthespot.modeshell == NULL) return;
+    if (set) {
+	XtPopup(ocw->overthespot.modeshell, XtGrabNone);
+    } else {
+	XtPopdown(ocw->overthespot.modeshell);
+    }
+}
+
+/*- ConversionFinish: class specific conversion finish -*/
+/* ARGSUSED */
+static void
+ConversionFinish(w)
+Widget w;
+{
+    OverTheSpotConversionWidget ocw = (OverTheSpotConversionWidget)w;
+    Widget inputobj = ocw->ccontrol.inputobj;
+    TextCanvas *tcp = ocw->overthespot.canvaslist;
+    XAEHandle h;
+
+    /* $BJQ49%*%V%8%'%/%H$N%3!<%k%P%C%/$r>C$9(B */
+    XtRemoveCallback(inputobj, XtNfixNotify, ForwardSpot, (XtPointer)w);
+
+    /* Popdown and unrealize textcanvases
+     *	we must be careful here. if clientwindow are destroyed,
+     *	the text canvases are also destroyed.
+     *	we have to popdown and unrealize canvas widgets, but if
+     *	they are destroyed, BadWindow error will be generated.
+     *	so we must set own error handler that ignores errors.
+     */
+    h = XAESetIgnoreErrors(XtDisplay(w));
+    while (tcp != NULL) {
+	if (tcp->poppedup) XtPopdown(tcp->canvas);
+	XtUnrealizeWidget(tcp->canvas);
+	/* XtVaSetValues(tcp->canvas, XtNcursor, None, NULL); */
+	tcp->poppedup = False;
+	tcp = tcp->next;
+    }
+    /* Popdown mode widget */
+    if (ocw->overthespot.modeshell != NULL) {
+	XtPopdown(ocw->overthespot.modeshell);
+    }
+    if (ocw->overthespot.modeshell == ocw->overthespot.modeshell_fix) {
+	XtUnrealizeWidget(ocw->overthespot.modeshell);
+    }
+    XAEUnset(h);
+
+    /* Popdown selection popup (if popped-up) */
+    if (ocw->overthespot.selectionpoppedup) {
+	XtPopdown(ocw->overthespot.selectionshell);
+	ocw->overthespot.selectionpoppedup = False;
+    }
+    if (ocw->overthespot.auxpoppedup) {
+	XtPopdown(ocw->overthespot.auxshell);
+	ocw->overthespot.auxpoppedup = False;
+    }
+}
+
+/*
+ *+ sub-widget creation
+ */
+
+/*- CreateDisplayObject: create display object for text drawing -*/
+static void
+CreateDisplayObject(ocw)
+OverTheSpotConversionWidget ocw;
+{
+    Widget dispobj;
+
+    dispobj = XtCreateWidget("displayObj", ocw->ccontrol.displayobjclass,
+			     (Widget)ocw, NULL, 0);
+
+    ocw->overthespot.displayobj = dispobj;
+    ocw->overthespot.lineheight = CDLineHeight(dispobj,
+					       &ocw->overthespot.ascent);
+
+}
+
+/*- CreateSelectionWidget: create selection widget for selecting candidates -*/
+static void
+CreateSelectionWidget(ocw)
+OverTheSpotConversionWidget ocw;
+{
+    Widget shell, sel, obj;
+
+    shell = XtVaCreatePopupShell("selectionShell",
+				 transientShellWidgetClass,
+				 (Widget)ocw,
+				 XtNwidth, 1, XtNheight, 1,
+				 NULL);
+    ocw->overthespot.selectionshell = shell;
+
+    sel = XtCreateManagedWidget("selection", candidatePanelWidgetClass,
+				shell, NULL, 0);
+    obj = XtCreateWidget("display", ocw->ccontrol.displayobjclass,
+			 sel, NULL, 0);
+    XtAddCallback(sel, XtNcallback, SelectionSelected, (Widget)ocw);
+    XtInstallAccelerators(sel, (Widget)ocw);
+
+    ocw->overthespot.selectionwidget = sel;
+    ocw->overthespot.selectiondisplayobj = obj;
+}
+
+/*- CreateAuxWidget: create auxiliary widget for displaying auxiliary data -*/
+static void
+CreateAuxWidget(ocw)
+OverTheSpotConversionWidget ocw;
+{
+    Widget shell, sel, obj;
+
+    shell = XtVaCreatePopupShell("auxShell",
+				 transientShellWidgetClass,
+				 (Widget)ocw,
+				 XtNwidth, 1, XtNheight, 1,
+				 XtNallowShellResize, True,
+				 NULL);
+    ocw->overthespot.auxshell = shell;
+
+    sel = XtCreateManagedWidget("aux", auxPanelWidgetClass,
+				shell, NULL, 0);
+    obj = XtCreateWidget("display", ocw->ccontrol.displayobjclass,
+			 sel, NULL, 0);
+    XtAddCallback(sel, XtNcallback, SelectionSelected, (Widget)ocw);
+    XtInstallAccelerators(sel, (Widget)ocw);
+
+    ocw->overthespot.auxwidget = sel;
+    ocw->overthespot.auxdisplayobj = obj;
+}
+
+/*- CreateModeWidget: create mode displaying widget -*/
+static void
+CreateModeWidget(ocw)
+OverTheSpotConversionWidget ocw;
+{
+    Widget shell, w, obj;
+
+    TRACE(("CreateModeWidget()\n"));
+
+    /* create fixed widget */
+    shell = XtCreatePopupShell("modeShell", adoptedShellWidgetClass,
+			       (Widget)ocw, NULL, 0);
+    XtVaGetValues(shell, XtNborderWidth, &ocw->overthespot.saved_bw, NULL);
+    w = XtCreateManagedWidget("mode", icLabelWidgetClass, shell, NULL, 0);
+    obj = XtCreateWidget("display", ocw->ccontrol.displayobjclass, w,
+			 NULL, 0);
+    XtInstallAccelerators(shell, (Widget)ocw);
+    XtInstallAccelerators(w, (Widget)ocw);
+    ocw->overthespot.modeshell_fix = shell;
+    ocw->overthespot.modewidget_fix = w;
+    ocw->overthespot.modedisplayobj_fix = obj;
+
+    /* create floating widget */
+    if (ocw->overthespot.useoverride) {
+	shell = XtCreatePopupShell("modeShell", overrideShellWidgetClass,
+				   (Widget)ocw, NULL, 0);
+    } else {
+	shell = XtCreatePopupShell("modeShell", transientShellWidgetClass,
+				   (Widget)ocw, NULL, 0);
+    }
+    w = XtCreateManagedWidget("mode", icLabelWidgetClass, shell, NULL, 0);
+    obj = XtCreateWidget("display", ocw->ccontrol.displayobjclass, w,
+			 NULL, 0);
+    XtInstallAccelerators(shell, (Widget)ocw);
+    XtInstallAccelerators(w, (Widget)ocw);
+    ocw->overthespot.modeshell_float = shell;
+    ocw->overthespot.modewidget_float = w;
+    ocw->overthespot.modedisplayobj_float = obj;
+
+    /* set mwm hints for the shell */
+    setMwmHints(shell);
+}
+
+/*- CreateTextCanvas: create a text canvas -*/
+static TextCanvas *
+CreateTextCanvas(ocw)
+OverTheSpotConversionWidget ocw;
+{
+    TextCanvas *tcp;
+
+    tcp = XtNew(TextCanvas);
+    tcp->x = 0;
+    tcp->y = 0;
+    tcp->poppedup = False;
+    tcp->next = NULL;
+    tcp->canvas = XtVaCreatePopupShell("text",
+				       canvasShellWidgetClass,
+				       (Widget)ocw,
+				       XtNcolormap,
+				           ocw->overthespot.colormap,
+				       XtNbackground,
+				           ocw->overthespot.background,
+				       XtNparentWindow,
+				           ocw->ccontrol.clientwindow,
+				       XtNoverrideRedirect, True,
+				       NULL);	/* XXX for now XXX */
+    XtAddCallback(tcp->canvas, XtNexposeCallback, TextRedisplay, (XtPointer)ocw);
+    XtInstallAccelerators(tcp->canvas, (Widget)ocw);
+
+    return tcp;
+}
+
+
+/*
+ *+ subwidget configuration
+ */
+
+/*- setupTextCanvas: do text canvas configuration on conversion startup -*/
+static void
+setupTextCanvas(ocw, mask, value)
+OverTheSpotConversionWidget ocw;
+unsigned long mask;
+ConversionAttributes *value;
+{
+    TRACE(("setupTextCanvas(mask=0x%lx)\n", mask));
+
+    getFocusOffset(ocw);
+
+    if (mask & CAClientArea) {
+	CLAREA(ocw) = value->clientarea;
+    } else {
+	/* default */
+	CLAREA(ocw).x = 0;
+	CLAREA(ocw).y = 0;
+	CLAREA(ocw).width = ocw->ccontrol.focus_attr.width;
+	CLAREA(ocw).height = ocw->ccontrol.focus_attr.height;
+    }
+    CLAREA(ocw).x += FOCUSOFFX(ocw);
+    CLAREA(ocw).y += FOCUSOFFY(ocw);
+
+    TRACE(("\tclientarea: (%d,%d)-(%d,%d)\n",CLAREA(ocw).x,CLAREA(ocw).y,CLAREA(ocw).width,CLAREA(ocw).height));
+    if (mask & CASpotLocation) {
+	SPOTX(ocw) = value->spotx + FOCUSOFFX(ocw);
+	SPOTY(ocw) = value->spoty + FOCUSOFFY(ocw);
+    } else {
+	/* default */
+	SPOTX(ocw) = CLAREA(ocw).x;
+	SPOTY(ocw) = CLAREA(ocw).y + ocw->overthespot.ascent;
+    }
+    TRACE(("\tspotlocation: (%d,%d)\n",SPOTX(ocw),SPOTY(ocw)));
+
+    if (mask & CALineSpacing) {
+	ocw->overthespot.linespacing = value->linespacing;
+	if (ocw->overthespot.linespacing == 0) {
+	    DPRINT(("\tspecified linespacing is 0. reset to default\n"));
+	    ocw->overthespot.linespacing = ocw->overthespot.lineheight;
+	}
+    } else {
+	ocw->overthespot.linespacing = ocw->overthespot.lineheight;
+    }
+    if (mask & CAColormap) {
+	ocw->overthespot.colormap = value->colormap;
+    } else {
+	ocw->overthespot.colormap = DefaultColormapOfScreen(XtScreen((Widget)ocw));
+    }
+    if (mask & CAColor) {
+	ocw->overthespot.background = value->background;
+    } else {
+	/* default */
+	ocw->overthespot.background = ocw->core.background_pixel;
+    }
+    if (mask & CACursor) {
+	ocw->overthespot.canvascursor = value->cursor;
+    } else {
+	ocw->overthespot.canvascursor = None;
+    }
+
+    if (ocw->overthespot.canvaslist == NULL) {
+	ocw->overthespot.canvaslist = CreateTextCanvas(ocw);
+    } else {
+	TextCanvas *tcp = ocw->overthespot.canvaslist;
+	while (tcp != NULL) {
+	    XtVaSetValues(tcp->canvas,
+			  XtNcolormap, ocw->overthespot.colormap,
+			  XtNbackground, ocw->overthespot.background,
+			  XtNparentWindow, ocw->ccontrol.clientwindow,
+			  XtNcursor, ocw->overthespot.canvascursor,
+			  NULL);
+	    tcp = tcp->next;
+	}
+    }
+}
+
+/*- resetTextCanvas: do text canvas reconfiguration on attribute change -*/
+static ResetStatus
+resetTextCanvas(ocw, mask, value)
+OverTheSpotConversionWidget ocw;
+unsigned long mask;
+ConversionAttributes *value;
+{
+    ResetStatus redraw = NeedNone;
+
+    if (mask & (CAColormap|CAColor|CACursor)) {
+	Arg args[3];
+	Cardinal i = 0;
+	if (mask & CAColormap &&
+	    value->colormap != ocw->overthespot.colormap) {
+	    ocw->overthespot.colormap = value->colormap;
+	    XtSetArg(args[i], XtNcolormap, value->colormap); i++;
+	}
+	if (mask & CAColor &&
+	    value->background != ocw->overthespot.background) {
+	    ocw->overthespot.background = value->background;
+	    XtSetArg(args[i], XtNbackground, value->background); i++;
+	}
+	if (mask & CACursor &&
+	    value->cursor != ocw->overthespot.canvascursor) {
+	    ocw->overthespot.canvascursor = value->cursor;
+	    XtSetArg(args[i], XtNcursor, value->cursor); i++;
+	}
+	if (i > 0) {
+	    TextCanvas *tcp = ocw->overthespot.canvaslist;
+
+	    while (tcp != NULL) {
+		XtSetValues(tcp->canvas, args, i);
+		tcp = tcp->next;
+	    }
+	    redraw = NeedRedraw;
+	}
+    }
+    if (mask & CAFocusWindow) {
+	getFocusOffset(ocw);
+	redraw = NeedReconfig;
+    }
+    if (mask & CAClientArea) {
+	if (value->clientarea.x + FOCUSOFFX(ocw) != CLAREA(ocw).x ||
+	    value->clientarea.y + FOCUSOFFY(ocw) != CLAREA(ocw).y ||
+	    value->clientarea.width != CLAREA(ocw).width ||
+	    value->clientarea.height != CLAREA(ocw).height) {
+	    CLAREA(ocw) = value->clientarea;
+	    CLAREA(ocw).x += FOCUSOFFX(ocw);
+	    CLAREA(ocw).y += FOCUSOFFY(ocw);
+	    redraw = NeedReconfig;
+	}
+    } else if (mask & CAFocusWindow) {
+	CLAREA(ocw).x = FOCUSOFFX(ocw);
+	CLAREA(ocw).y = FOCUSOFFY(ocw);
+	CLAREA(ocw).width = ocw->ccontrol.focus_attr.width;
+	CLAREA(ocw).height = ocw->ccontrol.focus_attr.height;
+    }
+    if (mask & CASpotLocation) {
+	if (value->spotx + FOCUSOFFX(ocw) != SPOTX(ocw) ||
+	    value->spoty + FOCUSOFFY(ocw) != SPOTY(ocw)) {
+	    SPOTX(ocw) = value->spotx + FOCUSOFFX(ocw);
+	    SPOTY(ocw) = value->spoty + FOCUSOFFY(ocw);
+	    redraw = NeedReconfig;
+	}
+    } else if (mask & CAFocusWindow) {
+	SPOTX(ocw) = CLAREA(ocw).x;
+	SPOTY(ocw) = CLAREA(ocw).y + ocw->overthespot.ascent;
+    }
+    if (mask & CALineSpacing) {
+	if (value->linespacing != ocw->overthespot.linespacing &&
+	    value->linespacing != 0) {
+	    ocw->overthespot.linespacing = value->linespacing;
+	    redraw = NeedReconfig;
+	}
+    } else if (mask & CAFonts) {
+	ocw->overthespot.linespacing = ocw->overthespot.lineheight;
+	redraw = NeedReconfig;
+    }
+
+    return redraw;
+}
+
+/*- setupDisplayObject: do displayobj configuration on conversion startup -*/
+static void
+setupDisplayObject(ocw, mask, value)
+OverTheSpotConversionWidget ocw;
+unsigned long mask;
+ConversionAttributes *value;
+{
+    Widget dispobj = ocw->overthespot.displayobj;
+
+    TRACE(("setupDisplayObject()\n"));
+
+    /*
+     * order is important. we must set fonts BEFORE anything else,
+     * because it is possible that the fonts previously set in the
+     * display object no longer exist, and if so, that causes BadFont
+     * error when changing GCs.
+     */
+
+    if (mask & CAFonts) {
+	TRACE(("\tchanging fonts...\n"));
+	CDSetFonts(dispobj, value->fonts, value->num_fonts);
+    } else {
+	/* reset to default */
+	CDSetFonts(dispobj, (XFontStruct **)NULL, 0);
+    }
+    if (mask & CAColor) {
+	TRACE(("\tchanging colors...\n"));
+	XtVaSetValues(dispobj,
+		      XtNforeground, value->foreground,
+		      XtNbackground, value->background,
+		      NULL);
+    }
+    ocw->overthespot.lineheight = CDLineHeight(dispobj,
+					       &ocw->overthespot.ascent);
+}
+
+/*- resetDisplayObject: do displayobj reconfiguration on attribute change -*/
+static ResetStatus
+resetDisplayObject(ocw, mask, value)
+OverTheSpotConversionWidget ocw;
+unsigned long mask;
+ConversionAttributes *value;
+{
+    Widget dispobj = ocw->overthespot.displayobj;
+    ResetStatus redraw = NeedNone;
+
+    TRACE(("resetDisplayObject()\n"));
+
+    if (mask & CAColor) {
+	TRACE(("\tchanging colors...\n"));
+	XtVaSetValues(dispobj,
+		      XtNforeground, value->foreground,
+		      XtNbackground, value->background,
+		      NULL);
+	redraw = NeedRedraw;
+    }
+    if (mask & CAFonts) {
+	TRACE(("\tchanging fonts...\n"));
+	CDSetFonts(dispobj, value->fonts, value->num_fonts);
+	ocw->overthespot.lineheight = CDLineHeight(dispobj,
+						   &ocw->overthespot.ascent);
+	redraw = NeedReconfig;
+    }
+
+    return redraw;
+}
+
+/*- setupModeWidget: do mode widget configuration on conversion startup -*/
+static void
+setupModeWidget(ocw, mask, value)
+OverTheSpotConversionWidget ocw;
+unsigned long mask;
+ConversionAttributes *value;
+{
+    Widget inputobj = ocw->ccontrol.inputobj;
+    Widget dispobj;
+    Widget mode;
+    Arg modeargs[10];
+    Arg shellargs[15];
+    Cardinal i = 0, j = 0;
+
+    TRACE(("setupModeWidget()\n"));
+
+    /* choose appropriate widgets */
+    if (mask & CAStatusArea) {
+	/* use fixed modedisplay */
+	ocw->overthespot.modeshell = ocw->overthespot.modeshell_fix;
+	ocw->overthespot.modewidget = ocw->overthespot.modewidget_fix;
+	ocw->overthespot.modedisplayobj = ocw->overthespot.modedisplayobj_fix;
+	XtSetArg(shellargs[j], XtNparentWindow, ocw->ccontrol.clientwindow); j++;
+	XtSetArg(shellargs[j], XtNborderWidth, 0); j++;
+	XtSetArg(shellargs[j], XtNallowShellResize, False); j++;
+	XtSetArg(shellargs[j], XtNx, value->statusarea.x); j++;
+	XtSetArg(shellargs[j], XtNy, value->statusarea.y); j++;
+	XtSetArg(shellargs[j], XtNwidth, value->statusarea.width); j++;
+	XtSetArg(shellargs[j], XtNheight, value->statusarea.height); j++;
+	ocw->overthespot.modelocationspecified = True;
+    } else if (ocw->overthespot.modelocation == ModeTrackText &&
+	       enoughSpaceForStatus(ocw)) {
+	ocw->overthespot.modeshell = ocw->overthespot.modeshell_fix;
+	ocw->overthespot.modewidget = ocw->overthespot.modewidget_fix;
+	ocw->overthespot.modedisplayobj = ocw->overthespot.modedisplayobj_fix;
+	ocw->overthespot.modelocationspecified = False;
+	XtSetArg(shellargs[j], XtNparentWindow, ocw->ccontrol.clientwindow); j++;
+	XtSetArg(shellargs[j], XtNallowShellResize, True); j++;
+	XtSetArg(shellargs[j], XtNborderWidth, ocw->overthespot.saved_bw); j++;
+    } else if (ocw->overthespot.modelocation == ModeNone) {
+	ocw->overthespot.modeshell = NULL;
+	ocw->overthespot.modewidget = NULL;
+	ocw->overthespot.modedisplayobj = NULL;
+	ocw->overthespot.modelocationspecified = False;
+	return;
+    } else {
+	/* use floating modedisplay */
+	ocw->overthespot.modeshell = ocw->overthespot.modeshell_float;
+	ocw->overthespot.modewidget = ocw->overthespot.modewidget_float;
+	ocw->overthespot.modedisplayobj = ocw->overthespot.modedisplayobj_float;
+	ocw->overthespot.modelocationspecified = False;
+    }
+
+    mode = ocw->overthespot.modewidget;
+    dispobj = ocw->overthespot.modedisplayobj;
+
+    XtSetArg(modeargs[i], XtNlabel, ICGetMode(inputobj)); i++;
+    if (mask & CAColormap) {
+	XtSetArg(modeargs[i], XtNcolormap, value->colormap); i++;
+    }
+    /* ignore background_pixmap... */
+
+    /*
+     * order of changing display object resources is important.
+     * see comment in setupDisplayObject() for details.
+     */
+    if (mask & CAStatusFonts) {
+	TRACE(("\tchanging fonts...\n"));
+	CDSetFonts(dispobj, value->status_fonts, value->num_status_fonts);
+    } else {
+	/* reset to default */
+	CDSetFonts(dispobj, (XFontStruct **)NULL, 0);
+    }
+    if (mask & CAColor) {
+	TRACE(("\tchanging colors...\n"));
+	XtVaSetValues(dispobj,
+		      XtNforeground, value->foreground,
+		      XtNbackground, value->background,
+		      NULL);
+	XtSetArg(modeargs[i], XtNbackground, value->background); i++;
+	if (ocw->overthespot.borderforeground) {
+	    XtSetArg(shellargs[j], XtNborderColor, value->foreground); j++;
+	}
+    } else {
+	XtSetArg(modeargs[i], XtNbackground, ocw->overthespot.background); i++;
+    }
+
+    XtSetValues(mode, modeargs, i);
+    ICLRecomputeSize(mode);
+
+    if (!(mask & CAStatusArea)) {
+	/*
+	 * force shell to resize.
+	 * it is because Shell doesn't honor its child's dimension
+	 * at second (or later)  realization.
+	 */
+	XtSetArg(shellargs[j], XtNwidth, mode->core.width); j++;
+	XtSetArg(shellargs[j], XtNheight, mode->core.height); j++;
+    }
+    XtSetValues(ocw->overthespot.modeshell, shellargs, j);
+}
+
+/*- resetModeWidget: do mode widget reconfiguration on attribute change -*/
+static ResetStatus
+resetModeWidget(ocw, mask, value)
+OverTheSpotConversionWidget ocw;
+unsigned long mask;
+ConversionAttributes *value;
+{
+    Widget mode = ocw->overthespot.modewidget;
+    Widget dispobj = ocw->overthespot.modedisplayobj;
+    ResetStatus redraw = NeedNone;
+
+    TRACE(("resetModeWidget()\n"));
+
+    if (ocw->overthespot.modeshell == NULL) return NeedNone;
+
+    if (mask & CAStatusArea) {
+	if (ocw->overthespot.modelocationspecified &&
+	    ocw->overthespot.modeshell == ocw->overthespot.modeshell_fix) {
+	    XtVaSetValues(ocw->overthespot.modeshell,
+			  XtNx, value->statusarea.x,
+			  XtNy, value->statusarea.y,
+			  XtNwidth, value->statusarea.width,
+			  XtNheight, value->statusarea.height,
+			  NULL);
+	} /* else ignore... */
+    }
+
+    if (mask & CAColormap) {
+	XtVaSetValues(mode, XtNcolormap, value->colormap, NULL);
+    }
+
+    if (mask & CAColor) {
+	TRACE(("\tchanging colors...\n"));
+	XtVaSetValues(dispobj,
+		      XtNforeground, value->foreground,
+		      XtNbackground, value->background,
+		      NULL);
+	XtVaSetValues(mode, XtNbackground, value->background, NULL);
+	if (ocw->overthespot.borderforeground) {
+	    XtVaSetValues(ocw->overthespot.modeshell,
+			  XtNborderColor, value->foreground,
+			  NULL);
+	}
+	redraw = NeedRedraw;
+    }
+    if (mask & CAStatusFonts) {
+	TRACE(("\tchanging fonts...\n"));
+	CDSetFonts(dispobj, value->status_fonts, value->num_status_fonts);
+	ICLRecomputeSize(mode);
+	redraw = NeedRedraw;
+    }
+
+    return redraw;
+}
+
+/*- locateTextCanvasInitial: put the text canvas at the initial position -*/
+static void
+locateTextCanvasInitial(ocw)
+OverTheSpotConversionWidget ocw;
+{
+    TextCanvas *tcp = ocw->overthespot.canvaslist;
+
+    tcp->x = SPOTX(ocw);
+    tcp->y = SPOTY(ocw) - ocw->overthespot.ascent;
+}
+
+/*- locateModeWidget: put the mode widget at the initial position -*/
+static void
+locateModeWidget(ocw)
+OverTheSpotConversionWidget ocw;
+{
+    Position x, y;
+    Widget modewidget = ocw->overthespot.modewidget;
+    Widget modeshell = ocw->overthespot.modeshell;
+    int rootx, rooty;
+    Window child;
+
+    if (modeshell == ocw->overthespot.modeshell_fix) {
+	/* must be tracking text type */
+	locateTrackingModeWidget(ocw, True, 0, 0);
+	return;
+    }
+
+    switch (ocw->overthespot.modelocation) {
+    case ModeTopLeft:
+	x = 0;
+	y = -(modewidget->core.height + modeshell->core.border_width * 2);
+	y -= ocw->ccontrol.titlebarheight;
+	break;
+    case ModeTopRight:
+	x = ocw->ccontrol.client_attr.width - modewidget->core.width + modeshell->core.border_width * 2;
+	y = -(modewidget->core.height + modeshell->core.border_width * 2);
+	y -= ocw->ccontrol.titlebarheight;
+	break;
+    case ModeBottomRight:
+	x = ocw->ccontrol.client_attr.width - modewidget->core.width + modeshell->core.border_width * 2;
+	y = ocw->ccontrol.client_attr.height;
+	break;
+    case ModeTrackText:	/* in case of insufficient space in the client area */
+	x = CLAREA(ocw).x;
+	y = CLAREA(ocw).y + CLAREA(ocw).height + 2;
+	break;
+    case ModeBottomLeft:
+	x = 0;
+	y = ocw->ccontrol.client_attr.height;
+	break;
+    default:
+	/* ModeNone */
+	return;
+    }
+
+    (void)XTranslateCoordinates(XtDisplay(ocw), ocw->ccontrol.clientwindow,
+				RootWindowOfScreen(XtScreen(ocw)),
+				x, y, &rootx, &rooty, &child);
+    MoveShell(ocw->overthespot.modeshell, rootx, rooty);
+}
+
+/*- locateTrackingModeWidget: put the tracking text type mode widget at appropriate position */
+static void
+locateTrackingModeWidget(ocw, initial, x, y)
+OverTheSpotConversionWidget ocw;
+Boolean initial;
+Position x;
+Position y;
+{
+    Widget modewidget = ocw->overthespot.modewidget;
+    Widget modeshell = ocw->overthespot.modeshell;
+    Dimension width, height;
+    XRectangle *clarea = &CLAREA(ocw);
+    static Position lastx, lasty;
+
+    if (initial) {
+	x = SPOTX(ocw);
+	y = SPOTY(ocw) - ocw->overthespot.ascent
+		+ ocw->overthespot.lineheight;
+    } else if (x == lastx && y == lasty) {
+	return;
+    }
+
+    lastx = x;
+    lasty = y;
+
+    width = modewidget->core.width + modeshell->core.border_width * 2;
+    height = modewidget->core.height + modeshell->core.border_width * 2;
+
+    /* adjust x */
+    if (x + width > clarea->x + clarea->width) {
+	x = clarea->x + clarea->width - width;
+    }
+    if (x < clarea->x) x = clarea->x;
+
+    /* adjust y */
+    if (y + height + 2 <= clarea->y + clarea->height) {
+	y += 2;	/* make some (2pixels high) space between text and mode */
+    } else if (y + height > clarea->y + clarea->height) {
+	Position initx, inity;
+
+	if (initial) {
+	    initx = SPOTX(ocw);
+	    inity = SPOTY(ocw) - ocw->overthespot.ascent;
+	} else {
+	    TextCanvas *tcp = ocw->overthespot.canvaslist;
+	    initx = tcp->x;
+	    inity = tcp->y;
+	}
+	if (inity - height > clarea->y) {
+	    y = inity - height;
+	} else if (x + width < initx) {
+	    y = inity - modeshell->core.border_width * 2;
+	} else if (clarea->x + width < initx) {
+	    x = initx - width;
+	    y = inity - modeshell->core.border_width * 2;
+	} else {
+	    x = initx - width;
+	    y = inity - height;
+	}
+	if (y < clarea->y) y = clarea->y;
+    }
+    XtMoveWidget(modeshell, x, y);
+}
+
+/*- redrawAndReconfigureTextCanvas: redraw & reconfigure text canvas -*/
+static void
+redrawAndReconfigureTextCanvas(ocw)
+OverTheSpotConversionWidget ocw;
+{
+    TextCanvas *tcp = ocw->overthespot.canvaslist;
+
+    TRACE(("OverTheSpotConversion:redrawAndReconfigureTextCanvas()\n"));
+
+    /* popdown and clear all canvases */
+    while (tcp != NULL) {
+	if (tcp->poppedup) XtPopdown(tcp->canvas);
+	tcp->poppedup = False;
+	if (XtIsRealized(tcp->canvas)) {
+	    XClearArea(XtDisplay(tcp->canvas), XtWindow(tcp->canvas),
+		       0, 0, 0, 0, True);
+	}
+	tcp = tcp->next;
+    }
+    locateTextCanvasInitial(ocw);
+    recomputeDisplaySegments(ocw);
+    computeCursor(ocw);
+    reconfigureDisplay(ocw);
+}
+
+/*
+ *+ inputobject callback
+ */
+
+/*- UpdateText: update text -*/
+static void
+UpdateText(w)
+Widget w;
+{
+    OverTheSpotConversionWidget ocw = (OverTheSpotConversionWidget)w;
+
+    TRACE(("OverTheSpotConversion:UpdateText()\n"));
+    eraseCursor(ocw);
+    computeDisplaySegments(ocw);
+    computeCursor(ocw);
+    reconfigureDisplay(ocw);
+    updateDisplay(ocw);
+    showCursor(ocw);
+}
+
+/*- UpdateMode: update mode -*/
+static void
+UpdateMode(w)
+Widget w;
+{
+    OverTheSpotConversionWidget ocw = (OverTheSpotConversionWidget)w;
+
+    if (ocw->overthespot.modewidget == NULL) return;
+
+    XtVaSetValues(ocw->overthespot.modewidget,
+		  XtNlabel, ICGetMode(ocw->ccontrol.inputobj),
+		  NULL);
+#ifdef notdef
+    /* a hack... */
+    if (ocw->overthespot.modeshell == ocw->overthespot.modeshell_float &&
+	XtIsRealized(ocw->overthespot.modeshell)) {
+	XRaiseWindow(XtDisplay(ocw->overthespot.modeshell),
+		     XtWindow(ocw->overthespot.modeshell));
+    }
+#endif
+}
+
+/*- SelectionControl: selection control -*/
+static void
+SelectionControl(w, arg)
+Widget w;
+ICSelectionControlArg *arg;
+{
+    OverTheSpotConversionWidget ocw = (OverTheSpotConversionWidget)w;
+
+    switch (arg->command) {
+    case ICSelectionStart:
+	SelectionStart(ocw, arg->u.selection_kind);
+	break;
+    case ICSelectionEnd:
+	SelectionEnd(ocw, &arg->u.current_item);
+	break;
+    case ICSelectionSet:
+	SelectionSet(ocw, arg->u.current_item);
+	break;
+    case ICSelectionMove:
+	SelectionMove(ocw, arg->u.dir);
+	break;
+    case ICSelectionGet:
+	SelectionGet(ocw, &arg->u.current_item);
+	break;
+    default:
+	XtAppWarning(XtWidgetToApplicationContext(w),
+		     "OverTheSpotConversion: unknown selection control command");
+	break;
+    }
+}
+
+/*- SelectionStart: selection startup -*/
+/* ARGSUSED */
+static void
+SelectionStart(ocw, kind)
+OverTheSpotConversionWidget ocw;
+int kind;
+{
+    Cardinal ncand;
+
+    TRACE(("OverTheSpotConversion:SelectionStart()\n"));
+    if (ocw->overthespot.selectionpoppedup) {
+	DPRINT(("\tselection already started -- ignored\n"));
+	return;
+    }
+
+    ocw->overthespot.candlist = ICGetItemList(ocw->ccontrol.inputobj, &ncand);
+    ocw->overthespot.numcands = ncand;
+
+    TRACE(("\tnumcands=%d\n", ocw->overthespot.numcands));
+    CPanelSetList(ocw->overthespot.selectionwidget,
+		  ocw->overthespot.candlist,
+		  ocw->overthespot.numcands, 0, True);
+
+    locateSelectionPopup(ocw);
+    XtPopup(ocw->overthespot.selectionshell, XtGrabNone);
+    ocw->overthespot.selectionpoppedup = True;
+}
+
+/*- locateSelectionPopup: put selection popup at an appropriate position -*/
+static void
+locateSelectionPopup(ocw)
+OverTheSpotConversionWidget ocw;
+{
+    Position x, y;
+    int clx, cly;
+    Dimension dpyWidth, dpyHeight;
+    Widget panel = ocw->overthespot.selectionwidget;
+    Widget shell = ocw->overthespot.selectionshell;
+    Window junk;
+    int barheight = ocw->ccontrol.titlebarheight;
+
+    (void)XTranslateCoordinates(XtDisplay(ocw),
+				ocw->ccontrol.clientwindow,
+				RootWindowOfScreen(XtScreen(ocw)),
+				0, 0, &clx, &cly, &junk);
+
+    if (ocw->overthespot.numsegments > 0) {
+	DisplayLocation lastp;
+	DisplaySegment *dsp = ocw->overthespot.dispsegments;
+	int i;
+	int offset = 0;
+
+	/* find current segment. if not found, use last segment */
+	for (i = 0; i < ocw->overthespot.numsegments - 1; i++) {
+	    if (dsp[i].seg.attr & ICAttrCurrentSegment) break;
+	}
+
+	computeLastPosition(dsp[i].fragments, &lastp);
+	if (lastp.canvas == ocw->overthespot.overflowcanvas) {
+	    offset = ocw->overthespot.overflowoffset;
+	}
+	x = clx + lastp.canvas->x + lastp.x
+	  - panel->core.width / 2 + offset;
+	y = cly + lastp.canvas->y + lastp.y + ocw->overthespot.lineheight;
+    } else {
+	x = clx + SPOTX(ocw) - panel->core.width / 2;
+	y = cly + SPOTY(ocw);
+    }
+
+    dpyWidth = WidthOfScreen(XtScreen(shell));
+    dpyHeight = HeightOfScreen(XtScreen(shell));
+
+    if (x + panel->core.width > (int)dpyWidth) x = dpyWidth - panel->core.width;
+    if (x < 0) x = 0;
+    if (y + panel->core.height + barheight > (int)dpyHeight) {
+	y = cly + SPOTY(ocw) - panel->core.height - barheight;
+	if (y < 0) y = dpyHeight - panel->core.height - barheight;
+    }
+    MoveShell(shell, x, y);
+}
+
+/*- SelectionEnd: selection finish -*/
+static void
+SelectionEnd(ocw, current)
+OverTheSpotConversionWidget ocw;
+int *current;
+{
+    TRACE(("OverTheSpotConversion:SelectionEnd()\n"));
+
+    if (!ocw->overthespot.selectionpoppedup) {	/* for safe */
+	TRACE(("\tnot in selection mode -- ignored\n"));
+	return;
+    }
+
+    XtVaGetValues(ocw->overthespot.selectionwidget,
+		  XtNcurrentItem, current,
+		  NULL);
+
+    XtPopdown(ocw->overthespot.selectionshell);
+
+    ocw->overthespot.selectionpoppedup = False;
+}
+
+/*- SelectionSet: set current selection item -*/
+static void
+SelectionSet(ocw, current)
+OverTheSpotConversionWidget ocw;
+int current;
+{
+    TRACE(("OverTheSpotConversion:SelectionSet()\n"));
+
+    if (!ocw->overthespot.selectionpoppedup) {	/* for safe */
+	TRACE(("\tnot in selection mode -- ignored\n"));
+	return;
+    }
+
+    XtVaSetValues(ocw->overthespot.selectionwidget,
+		  XtNcurrentItem, current,
+		  NULL);
+}
+
+/*- SelectionGet: get current selection item -*/
+static void
+SelectionGet(ocw, current)
+OverTheSpotConversionWidget ocw;
+int *current;
+{
+    TRACE(("OverTheSpotConversion:SelectionGet()\n"));
+
+    if (!ocw->overthespot.selectionpoppedup) {	/* for safe */
+	TRACE(("\tnot in selection mode -- ignored\n"));
+	return;
+    }
+
+    XtVaGetValues(ocw->overthespot.selectionwidget,
+		  XtNcurrentItem, current,
+		  NULL);
+}
+
+/*- SelectionMove: move crrent selection to specified direction -*/
+static void
+SelectionMove(ocw, dir)
+OverTheSpotConversionWidget ocw;
+int dir;
+{
+    TRACE(("OverTheSpotConversion:SelectionMove()\n"));
+
+    if (!ocw->overthespot.selectionpoppedup) {	/* for safe */
+	TRACE(("\tnot in selection mode -- ignored\n"));
+	return;
+    }
+
+    CPanelMoveCurrent(ocw->overthespot.selectionwidget, dir);
+}
+
+/*- ForwardSpot: forward spot location when text is fixed -*/
+/* ARGSUSED */
+static void
+ForwardSpot(w, client_data, call_data)
+Widget w;
+XtPointer client_data;
+XtPointer call_data;
+{
+    OverTheSpotConversionWidget ocw = (OverTheSpotConversionWidget)client_data;
+    DisplaySegment *dsp = ocw->overthespot.dispsegments;
+    Cardinal nsegs = ocw->overthespot.numsegments;
+    DisplayLocation disploc;
+
+    if (!ocw->overthespot.spotforwarding || nsegs == 0) return;
+
+    /* get next spot location */
+    computeLastPosition(dsp[nsegs - 1].fragments, &disploc);
+
+    SPOTX(ocw) = disploc.canvas->x + disploc.x;
+    SPOTY(ocw) = disploc.canvas->y + disploc.y + ocw->overthespot.ascent;
+    locateTextCanvasInitial(ocw);
+}
+
+/*
+ * Aux Callback
+ */
+
+static void
+AuxControl(w, arg)
+Widget w;
+ICAuxControlArg *arg;
+{
+    OverTheSpotConversionWidget ocw = (OverTheSpotConversionWidget)w;
+    String params[1];
+    Cardinal num_params;
+
+    switch (arg->command) {
+    case ICAuxStart:
+	AuxStart(ocw);
+	break;
+    case ICAuxEnd:
+	AuxEnd(ocw);
+	break;
+    case ICAuxChange:
+	AuxChange(ocw);
+	break;
+    default:
+	params[0] = XtClass(w)->core_class.class_name;
+	num_params = 1;
+	XtAppWarningMsg(XtWidgetToApplicationContext(w),
+			"parameterError", "AuxControl", "WidgetError",
+			"%s: unknown aux control command",
+			params, &num_params);
+	break;
+    }
+}
+
+/* ARGSUSED */
+static void
+AuxStart(ocw)
+OverTheSpotConversionWidget ocw;
+{
+  ICString *auxstr;
+  Cardinal ncand, curseg, cursorpos;
+  
+  if (ocw->overthespot.auxpoppedup) return;
+  
+  /* $B%F%-%9%H%3!<%k%P%C%/$N;~$N$h$&$J=hM}$r$9$k(B
+     $B$N$O(B AuxPanel.c $B$K$^$+$;$h$&(B */
+
+  auxstr = ICGetAuxSegments(ocw->ccontrol.inputobj,
+			    &ncand, &curseg, &cursorpos);
+
+  APanelStart(ocw->overthespot.auxwidget, auxstr, ncand, curseg, cursorpos);
+
+  /* $B%]%C%W%"%C%W$9$k>l=j$r7h$a$k(B */
+  locateAuxPopup(ocw, False);
+  
+  XtPopup(ocw->overthespot.auxshell, XtGrabNone);
+  ocw->overthespot.auxpoppedup = True;
+}
+
+/* ARGSUSED */
+static void
+AuxEnd(ocw)
+OverTheSpotConversionWidget ocw;
+{
+  if (!ocw->overthespot.auxpoppedup) return;	/* for safe */
+
+/*  APanelEnd(ocw->overthespot.auxwidget); */
+
+  XtPopdown(ocw->overthespot.auxshell);
+
+  ocw->overthespot.auxpoppedup = False;
+}
+
+/* ARGSUSED */
+static void
+AuxChange(ocw)
+OverTheSpotConversionWidget ocw;
+{
+  Cardinal ncand, curseg, cursorpos;
+  ICString *auxstr;
+
+  if (!ocw->overthespot.auxpoppedup) return;	/* for safe */
+
+  auxstr = ICGetAuxSegments(ocw->ccontrol.inputobj,
+			    &ncand, &curseg, &cursorpos);
+
+  APanelChange(ocw->overthespot.auxwidget, auxstr, ncand, curseg, cursorpos);
+
+  /* reposition popup shell */
+  locateAuxPopup(ocw, True);
+}
+
+/*- locateAuxPopup: put aux popup at an appropriate position -*/
+static void
+locateAuxPopup(ocw, usecurloc)
+OverTheSpotConversionWidget ocw;
+Boolean usecurloc;	/* use the current location as the default */
+{
+    int x, y;
+    int clx, cly;
+    int dpyWidth, dpyHeight;
+    Widget panel = ocw->overthespot.auxwidget;
+    Widget shell = ocw->overthespot.auxshell;
+    Window junk;
+    int barheight = ocw->ccontrol.titlebarheight;
+
+    (void)XTranslateCoordinates(XtDisplay(ocw),
+				ocw->ccontrol.clientwindow,
+				RootWindowOfScreen(XtScreen(ocw)),
+				0, 0, &clx, &cly, &junk);
+
+    if (usecurloc) {
+	x = shell->core.x;
+	y = shell->core.y;
+    } else {
+	if (ocw->overthespot.numsegments > 0) {
+	    DisplayLocation lastp;
+	    DisplaySegment *dsp = ocw->overthespot.dispsegments;
+	    int i;
+	    int offset;
+	    
+	    /* find current segment. if not found, use last segment */
+	    for (i = 0; i < ocw->overthespot.numsegments - 1; i++) {
+		if (dsp[i].seg.attr & ICAttrCurrentSegment) break;
+	    }
+	    
+	    computeLastPosition(dsp[i].fragments, &lastp);
+	    if (lastp.canvas == ocw->overthespot.overflowcanvas)
+		offset = ocw->overthespot.overflowoffset;
+	    else
+		offset = 0;
+	    x = clx + lastp.canvas->x + lastp.x
+		- panel->core.width / 2 + offset;
+	    y = cly + lastp.canvas->y + lastp.y + ocw->overthespot.lineheight;
+	} else {
+	    x = clx + ocw->overthespot.spotx - panel->core.width / 2;
+	    y = cly + ocw->overthespot.spoty;
+	}
+    }
+
+    dpyWidth = (int)WidthOfScreen(XtScreen(shell));
+    dpyHeight = (int)HeightOfScreen(XtScreen(shell));
+
+    if ((int)(x + panel->core.width) > dpyWidth) x = dpyWidth - panel->core.width;
+    if (x < 0) x = 0;
+    if ((int)(y + panel->core.height + barheight) > dpyHeight) {
+	y = cly + ocw->overthespot.spoty - panel->core.height - barheight;
+	if (y < 0) y = dpyHeight - panel->core.height - barheight;
+    }
+    MoveShell(shell, x, y);
+}
+
+
+/*
+ *+ TextCanvas callback
+ */
+
+/*- TextRedisplay: redraw text canvas -*/
+static void
+TextRedisplay(w, client_data, call_data)
+Widget w;
+XtPointer client_data;
+XtPointer call_data;
+{
+    OverTheSpotConversionWidget ocw = (OverTheSpotConversionWidget)client_data;
+    XExposeEvent *event = (XExposeEvent *)call_data;
+    XRectangle region;
+    Boolean cursorredraw;
+
+    TRACE(("OverTheSpotConversion:TextRedisplay()\n"));
+    region.x = event->x;
+    region.y = event->y;
+    region.width = event->width;
+    region.height = event->height;
+
+    cursorredraw = exposeCursor(ocw, w, &region);
+    redrawSegments(ocw, w, &region);
+    if (cursorredraw) showCursor(ocw);
+}
+
+
+/*
+ *+ Selection Widget callback
+ */
+
+/*- SelectionSelected: selection selected callback -*/
+/* ARGSUSED */
+static void
+SelectionSelected(w, client_data, call_data)
+Widget w;
+XtPointer client_data;
+XtPointer call_data;
+{
+    OverTheSpotConversionWidget ocw = (OverTheSpotConversionWidget)client_data;
+    int current = (int)call_data;
+
+    TRACE(("OverTheSpotConversion:SelectionSelected()\n"));
+    XtPopdown(ocw->overthespot.selectionshell);
+    ocw->overthespot.selectionpoppedup = False;
+    ICSelectItem(ocw->ccontrol.inputobj, current);
+}
+
+
+/*
+ *+ text drawing functions
+ */
+
+/*- computeDisplaySegments: compare old&new text and update segments/fragments -*/
+static void
+computeDisplaySegments(ocw)
+OverTheSpotConversionWidget ocw;
+{
+    Widget inputobj = ocw->ccontrol.inputobj;
+    int nnew = ICNumSegments(inputobj);
+    int nold = ocw->overthespot.numsegments;
+    ICString *newseg;
+    DisplaySegment *dseg;
+    DisplayLocation disploc;
+    Cardinal nsame;
+    int diff;
+    int i;
+
+    TRACE(("OverTheSpotConversion:computeDisplaySegments() nnew=%d\n", nnew));
+    allocDisplaySegments(ocw, nnew);
+
+    ocw->overthespot.overflowcanvas = NULL;
+
+    disploc.x = disploc.y = 0;
+    if (ocw->overthespot.canvaslist == NULL) {
+	ocw->overthespot.canvaslist = CreateTextCanvas(ocw);
+    }
+    disploc.canvas = ocw->overthespot.canvaslist;
+
+    for (i = 0, dseg = ocw->overthespot.dispsegments; i < nnew; i++, dseg++) {
+	newseg = ICGetSegment(ocw->ccontrol.inputobj, i);
+	if (i >= nold) {
+	    copyString(newseg, &dseg->seg);
+	    dseg->redrawpos = 0;
+	    dseg->fragments = computeDisplayFragments(ocw, newseg, &disploc);
+	} else {
+	    DisplayFragment *oldfragments, *newfragments;
+
+	    dseg->redrawpos = -1;
+	    diff = ICCompareSegment(inputobj, newseg, &dseg->seg, &nsame);
+	    if (diff != ICSame ||
+		disploc.canvas != dseg->fragments->canvas ||
+		disploc.x != dseg->fragments->region.x ||
+		disploc.y != dseg->fragments->region.y) {
+		oldfragments = dseg->fragments;
+		newfragments = computeDisplayFragments(ocw, newseg, &disploc);
+		dseg->fragments = newfragments;
+	    } else {
+		oldfragments = NULL;
+		newfragments = dseg->fragments;
+		computeLastPosition(newfragments, &disploc);
+	    }
+
+	    switch (diff) {
+	    case ICSame:
+		if (oldfragments == NULL ||
+		    oldfragments->canvas == newfragments->canvas &&
+		    oldfragments->region.x == newfragments->region.x &&
+		    oldfragments->region.y == newfragments->region.y) {
+		    dseg->redrawpos = -1;
+		} else {
+		    dseg->redrawpos = 0;
+		}
+		break;
+	    case ICAttrChanged:
+		dseg->redrawpos = 0;
+		dseg->seg.attr = newseg->attr;
+		break;
+	    case ICStringChanged:
+		if (oldfragments == NULL ||
+		    oldfragments->canvas == newfragments->canvas &&
+		    oldfragments->region.x == newfragments->region.x &&
+		    oldfragments->region.y == newfragments->region.y) {
+		    dseg->redrawpos = nsame;
+		} else {
+		    dseg->redrawpos = 0;
+		}
+		freeString(&dseg->seg);
+		copyString(newseg, &dseg->seg);
+		break;
+	    default:
+		dseg->redrawpos = 0;
+		freeString(&dseg->seg);
+		copyString(newseg, &dseg->seg);
+		break;
+	    }
+	    if (oldfragments) freeDisplayFragments(oldfragments);
+	}
+    }
+
+    for (; i < nold; i++, dseg++) freeDisplaySegment(dseg);
+
+    ocw->overthespot.numsegments = nnew;
+}
+
+/*- recomputeDisplaySegments: recompute segments/fragments -*/
+static void
+recomputeDisplaySegments(ocw)
+OverTheSpotConversionWidget ocw;
+{
+    int nseg = ocw->overthespot.numsegments;
+    DisplaySegment *dseg;
+    DisplayLocation disploc;
+    int i;
+
+    ocw->overthespot.overflowcanvas = NULL;
+
+    disploc.x = disploc.y = 0;
+    if (ocw->overthespot.canvaslist == NULL) {
+	ocw->overthespot.canvaslist = CreateTextCanvas(ocw);
+    }
+    disploc.canvas = ocw->overthespot.canvaslist;
+
+    for (i = 0, dseg = ocw->overthespot.dispsegments; i < nseg; i++, dseg++) {
+	freeDisplayFragments(dseg->fragments);
+	dseg->redrawpos = 0;
+	dseg->fragments = computeDisplayFragments(ocw, &dseg->seg, &disploc);
+    }
+}
+
+/*- computeLastPosition: get last position of the specified fragment -*/
+static void
+computeLastPosition(fragments, disploc)
+DisplayFragment *fragments;
+DisplayLocation *disploc;
+{
+    while (fragments->next != NULL) fragments = fragments->next;
+    disploc->canvas = fragments->canvas;
+    disploc->x = fragments->region.x + fragments->region.width;
+    disploc->y = fragments->region.y;
+}
+
+/*- computeDisplayFragments: compute fragment(s) of the specified segment -*/
+static DisplayFragment *
+computeDisplayFragments(ocw, newseg, disploc)
+OverTheSpotConversionWidget ocw;
+ICString *newseg;
+DisplayLocation *disploc;
+{
+    int start;
+    int nchars;
+    Widget dispobj = ocw->overthespot.displayobj;
+    DisplayFragment *fragments, *dfp;
+    int widthavailable;
+
+    TRACE(("computeDisplayFragments()\n"));
+    start = 0;
+    fragments = NULL;
+    while (start < newseg->nchars) {
+	widthavailable = computeWidthAvailable(ocw, disploc);
+	nchars = CDMaxChar(dispobj, newseg, start, widthavailable);
+	if (nchars == 0) {
+	    if (disploc->canvas->x <= CLAREA(ocw).x &&
+		disploc->x == 0) {
+		/*
+		 * specified width is too narrow to display a character.
+		 * we force to display at least one character per line.
+		 */
+		nchars = 1;
+	    }
+	}
+	TRACE(("\twidthavailable=%d, start=%d, maxchar=%d\n", widthavailable, start, nchars));
+	if (nchars > 0) {
+	    if (fragments == NULL) {
+		fragments = dfp = allocDisplayFragment();
+	    } else {
+		dfp->next = allocDisplayFragment();
+		dfp = dfp->next;
+	    }
+	    dfp->from = start;
+	    dfp->nchars = nchars;
+	    dfp->canvas = disploc->canvas;
+	    dfp->region.x = disploc->x;
+	    dfp->region.y = disploc->y;
+	    dfp->region.width = CDStringWidth(dispobj, newseg, start,
+						    start + nchars);
+	    dfp->region.height = ocw->overthespot.lineheight;
+	    dfp->next = NULL;
+
+	    disploc->x += dfp->region.width;
+	}
+	start += nchars;
+	if (start < newseg->nchars) nextLocation(ocw, disploc);
+    }
+
+    return fragments;
+}
+
+/*- computeWidthAvailable: return the width of the current line left for drawing -*/
+/* ARGSUSED */
+static int
+computeWidthAvailable(ocw, disploc)
+OverTheSpotConversionWidget ocw;
+DisplayLocation *disploc;
+{
+    XRectangle *cregion = &CLAREA(ocw);
+
+    if (disploc->canvas == ocw->overthespot.overflowcanvas) {
+	 /* we pretend this canvas is veeeeeeery wide */
+	return 9999;
+    }
+    return (cregion->x + cregion->width) - (disploc->canvas->x + disploc->x);
+}
+
+/*- nextLocation: return the position of the next line -*/
+/* ARGSUSED */
+static void
+nextLocation(ocw, disploc)
+OverTheSpotConversionWidget ocw;
+DisplayLocation *disploc;
+{
+    XRectangle *cregion = &CLAREA(ocw);
+    Position x, y;
+
+    if (disploc->canvas->y + ocw->overthespot.linespacing * 2 >
+	cregion->y + cregion->height) {
+	/* no new canvas can create underneath this canvas */
+	ocw->overthespot.overflowcanvas = disploc->canvas;
+	return;
+    }
+
+    if (disploc->canvas->next == NULL) {
+	disploc->canvas->next = CreateTextCanvas(ocw);
+    }
+    x = CLAREA(ocw).x;
+    y = disploc->canvas->y + ocw->overthespot.linespacing;
+    disploc->canvas = disploc->canvas->next;
+    disploc->x = disploc->y = 0;
+
+    disploc->canvas->x = x;
+    disploc->canvas->y = y;
+}
+
+/*- findLocation: compute the display position of specified char -*/
+static DisplayLocation *
+findLocation(ocw, dsp, offset, disploc)
+OverTheSpotConversionWidget ocw;
+DisplaySegment *dsp;
+Cardinal offset;
+DisplayLocation *disploc;
+{
+    DisplayFragment *dfp = dsp->fragments;
+
+    while (dfp != NULL) {
+	if (dfp->nchars > offset ||
+	    dfp->next == NULL && dfp->nchars == offset) {
+	    break;
+	}
+	offset -= dfp->nchars;
+	dfp = dfp->next;
+    }
+    if (dfp == NULL) return NULL;
+
+    disploc->canvas = dfp->canvas;
+    disploc->x = dfp->region.x + CDStringWidth(ocw->overthespot.displayobj,
+					       &dsp->seg, dfp->from,
+					       dfp->from + offset);
+    disploc->y = dfp->region.y;
+
+    return disploc;
+}
+
+/*- reconfigureDisplay: do reconfiguration of text canvas (resize/popup/popdown) -*/
+static void
+reconfigureDisplay(ocw)
+OverTheSpotConversionWidget ocw;
+{
+    DisplaySegment *dsp;
+    DisplayFragment *dfp;
+    TextCanvas *tcp, *lasttcp;
+    Boolean shrink = ocw->overthespot.shrinkwindow;
+    XRectangle *areap = &CLAREA(ocw);
+    int i;
+
+    for (tcp = ocw->overthespot.canvaslist; tcp != NULL; tcp = tcp->next) {
+	tcp->maxx = tcp->maxy = 0;
+	tcp->shouldpopup = False;
+    }
+
+    for (i = 0, dsp = ocw->overthespot.dispsegments; i < ocw->overthespot.numsegments; i++, dsp++) {
+	for (dfp = dsp->fragments; dfp != NULL; dfp = dfp->next) {
+	    tcp = dfp->canvas;
+	    tcp->maxx = dfp->region.x + dfp->region.width;
+	    tcp->maxy = dfp->region.y + dfp->region.height;
+	    tcp->shouldpopup = True;
+	}
+    }
+
+    lasttcp = NULL;
+    for (tcp = ocw->overthespot.canvaslist; tcp != NULL; tcp = tcp->next) {
+	if (tcp->maxx < tcp->canvas->core.width && XtIsRealized(tcp->canvas)) {
+	    XClearArea(XtDisplay(tcp->canvas), XtWindow(tcp->canvas),
+		       tcp->maxx, 0, 0, 0, False);
+	}
+	if (tcp->shouldpopup) lasttcp = tcp;
+    }
+
+    if (!ocw->overthespot.modelocationspecified &&
+	ocw->overthespot.modeshell == ocw->overthespot.modeshell_fix) {
+	/* ModeTrackText */
+	if (lasttcp == NULL) {
+	    locateTrackingModeWidget(ocw, True, 0, 0);
+	} else {
+	    locateTrackingModeWidget(ocw, False, lasttcp->x,
+				     lasttcp->y + lasttcp->maxy);
+	}
+    }
+
+    if (ocw->overthespot.cursorvisible) {
+	DisplayLocation *dlp = &ocw->overthespot.cursorlocation;
+	XRectangle cbounds;
+	int x;
+
+	tcp = dlp->canvas;
+	CDGetCursorBounds(ocw->overthespot.displayobj, &cbounds);
+	x = dlp->x +  cbounds.x + cbounds.width;
+	if (x > tcp->maxx) tcp->maxx = x;
+    }
+
+    if (lasttcp != NULL &&
+	lasttcp->x + lasttcp->maxx > areap->x + areap->width) {
+	ocw->overthespot.overflowcanvas = lasttcp;
+	adjustDisplay(ocw);
+    }
+
+    for (tcp = ocw->overthespot.canvaslist; tcp != NULL; tcp = tcp->next) {
+	Arg args[2];
+	int nargs = 0;
+	if (tcp->shouldpopup && tcp->maxx > 0 && tcp->maxy > 0) {
+	    if (tcp == ocw->overthespot.overflowcanvas) {
+		XtMoveWidget(tcp->canvas,
+			     tcp->x + ocw->overthespot.overflowoffset, tcp->y);
+	    } else if (tcp->x != tcp->canvas->core.x ||
+		       tcp->y != tcp->canvas->core.y) {
+		XtMoveWidget(tcp->canvas, tcp->x, tcp->y);
+	    }
+	    if (shrink || !tcp->poppedup ||
+		tcp->maxx > tcp->canvas->core.width) {
+		XtSetArg(args[nargs], XtNwidth, tcp->maxx); nargs++;
+	    }
+	    if (!tcp->poppedup || tcp->maxy > tcp->canvas->core.height) {
+		XtSetArg(args[nargs], XtNheight, tcp->maxy); nargs++;
+	    }
+	    if (nargs > 0) XtSetValues(tcp->canvas, args, nargs);
+
+	    if (!tcp->poppedup) {
+		TRACE(("reconfigureDisplay(): canvas popup\n"));
+		XtPopup(tcp->canvas, XtGrabNone);
+		tcp->poppedup = True;
+	    }
+	} else {
+	    if (tcp->poppedup) {
+		TRACE(("reconfigureDisplay(): canvas popdown\n"));
+		XtPopdown(tcp->canvas);
+		tcp->poppedup = False;
+	    }
+	}
+    }
+}
+
+/*- updateDisplay: redraw text (if needed) -*/
+static void
+updateDisplay(ocw)
+OverTheSpotConversionWidget ocw;
+{
+    Widget dispobj = ocw->overthespot.displayobj;
+    DisplaySegment *dsp = ocw->overthespot.dispsegments;
+    int i;
+
+    for (i = 0; i < ocw->overthespot.numsegments; i++, dsp++) {
+	if (dsp->redrawpos >= 0) {
+	    TRACE(("updateDisplaySegment(seg#=%d)\n", i));
+	    updateDisplaySegment(dispobj, dsp);
+	}
+    }
+}
+
+/*- updateDisplaySegment: redraw specified segment (if needed) -*/
+static void
+updateDisplaySegment(dispobj, dsp)
+Widget dispobj;
+DisplaySegment *dsp;
+{
+    DisplayFragment *dfp = dsp->fragments;
+    int from;
+    int x;
+
+    while (dfp != NULL) {
+	if (dsp->redrawpos < dfp->from + dfp->nchars) {
+	    from = (dsp->redrawpos > dfp->from) ? dsp->redrawpos : dfp->from;
+	    x = dfp->region.x;
+	    if (from > dfp->from) {
+		x += CDStringWidth(dispobj, &dsp->seg, dfp->from, from);
+	    } 
+	    CDDrawString(dispobj, dfp->canvas->canvas, &dsp->seg,
+			 from, dfp->from + dfp->nchars,
+			 x, dfp->region.y);
+	}
+	dfp = dfp->next;
+    }
+}
+
+/*- redrawSegments: redraw segments in specified area -*/
+static void
+redrawSegments(ocw, canvas, region)
+OverTheSpotConversionWidget ocw;
+Widget canvas;
+XRectangle *region;
+{
+    DisplaySegment *dsp = ocw->overthespot.dispsegments;
+    DisplayFragment *dfp;
+    Widget dispobj = ocw->overthespot.displayobj;
+    int i;
+
+    for (i = 0; i < ocw->overthespot.numsegments; i++, dsp++) {
+	for (dfp = dsp->fragments; dfp != NULL; dfp = dfp->next) {
+	    if (dfp->canvas->canvas == canvas &&
+		intersectRect(&dfp->region, region)) {
+		CDDrawString(dispobj, canvas, &dsp->seg,
+			      dfp->from, dfp->from + dfp->nchars,
+			      dfp->region.x, dfp->region.y);
+	    }
+	}
+    }
+}
+
+/*
+ *+ handle overflow canvas functions
+ */
+
+/*- adjustDisplay: compute appropriate offset for the overflow canvas -*/
+static void
+adjustDisplay(ocw)
+OverTheSpotConversionWidget ocw;
+{
+    Position outerleft, outerright, innerleft, innerright;
+    TextCanvas *overflowcanvas = ocw->overthespot.overflowcanvas;
+    Cardinal curseg;
+    Cardinal curoffset;
+    XRectangle *areap;
+    Position offset;
+
+    TRACE(("adjustDisplay()\n"));
+    ocw->overthespot.overflowoffset = 0;
+
+    /*
+     * $B%9%H%i%F%8$H$7$F$O(B
+     * $B%+%l%s%H%;%0%a%s%H!&%+%l%s%H%5%V%;%0%a%s%H!&%$%s%5!<%H%+!<%=%k$N$"$k(B
+     * $B%;%0%a%s%H$N$I$l$b$J$1$l$P5$$K$7$J$$(B
+     * $B%$%s%5!<%H%+!<%=%k$,$"$l$P$=$l$r:GM%@h$9$k!#$D$^$j%$%s%5!<%H%+!<%=%k(B
+     * $B$O2?$,$"$C$F$bI=<($9$k$h$&$K$9$k!#(B
+     * $B$G$-$l$P%$%s%5!<%H%+!<%=%k$N$"$k%;%0%a%s%H$O$9$Y$FI=<($9$k!#(B
+     */
+
+    outerleft = innerleft = 9999;
+    outerright = innerright = 0;
+
+    if (ICCursorPos(ocw->ccontrol.inputobj, &curseg, &curoffset) == 1) {
+	(void)getInsertingSegmentRange(ocw, overflowcanvas,
+				       curseg, curoffset,
+				       &outerleft, &outerright, &innerleft);
+	if (outerleft <= outerright) innerright = innerleft + 2; /* XXX */
+    } else {
+	(void)getAttributeSegmentRange(ocw, overflowcanvas,
+				       ICAttrCurrentSegment,
+				       &innerleft, &innerright);
+	(void)getAttributeSegmentRange(ocw, overflowcanvas,
+				       ICAttrCurrentSubSegment,
+				       &outerleft, &outerright);
+    }
+
+    if (outerleft > outerright && innerleft > innerright) {
+	/* no important segments is on the overflow canvas */
+	TRACE(("\tno important segments on the canvas\n"));
+	return;
+    }
+
+    if (outerleft > innerleft) outerleft = innerleft;
+    if (outerright < innerright) outerright = innerright;
+
+    areap = &CLAREA(ocw);
+
+    if (areap->x <= outerleft && outerright <= areap->x + areap->width) {
+	/* important part fits in the visible area */
+	TRACE(("\timportant segments are visible\n"));
+	return;
+    }
+
+    offset = 0;
+    adjustOffset(areap, outerleft, outerright, &offset, False);
+    adjustOffset(areap, innerleft, innerright, &offset, True);
+    TRACE(("\toffset = %d\n", offset));
+    ocw->overthespot.overflowoffset = offset;
+}
+
+/*- getAttributeSegmentRange: compute span of segments which has the specified attributes -*/
+static Boolean
+getAttributeSegmentRange(ocw, canvas, attr, leftp, rightp)
+OverTheSpotConversionWidget ocw;
+TextCanvas *canvas;
+int attr;
+Position *leftp;
+Position *rightp;
+{
+    int nsegs = ocw->overthespot.numsegments;
+    DisplaySegment *dseg = ocw->overthespot.dispsegments;
+    DisplayFragment *dfp;
+    Position left, right;
+
+    left = 32767;
+    right = 0;
+
+    while (nsegs-- > 0) {
+	if (dseg->seg.attr & attr) {
+	    dfp = dseg->fragments;
+
+	    while (dfp != NULL) {
+		if (dfp->canvas == canvas) {
+		    if (dfp->region.x < left) left = dfp->region.x;
+		    if (right < dfp->region.x + dfp->region.width) {
+			right = dfp->region.x + dfp->region.width;
+		    }
+		}
+		dfp = dfp->next;
+	    }
+	}
+	dseg++;
+    }
+
+    if (left > right) return False;
+
+    *leftp = left + canvas->x;
+    *rightp = right + canvas->x;
+    return True;
+}
+
+/*- getInsertingSegmentRange: compute span of segments which has insert cursor -*/
+static Boolean
+getInsertingSegmentRange(ocw, canvas, curseg, offset, leftp, rightp, posp)
+OverTheSpotConversionWidget ocw;
+TextCanvas *canvas;
+Cardinal curseg;
+Cardinal offset;
+Position *leftp;
+Position *rightp;
+Position *posp;
+{
+    DisplaySegment *dseg = ocw->overthespot.dispsegments + curseg;
+    DisplayFragment *dfp;
+    Position left, right, insert;
+
+    left = 32767;
+    right = 0;
+
+    dfp = dseg->fragments;
+
+    while (dfp != NULL) {
+	if (dfp->canvas == canvas &&
+	    dfp->from <= offset && offset <= dfp->from + dfp->nchars) {
+	    if (dfp->region.x < left) left = dfp->region.x;
+	    if (right < dfp->region.x + dfp->region.width) {
+		right = dfp->region.x + dfp->region.width;
+	    }
+
+	    if (offset == dfp->from) {
+		insert = dfp->region.x;
+	    } else if (offset == dfp->from + dfp->nchars) {
+		insert = dfp->region.x + dfp->region.width;
+	    } else {
+		insert = dfp->region.x +
+		         CDStringWidth(ocw->overthespot.displayobj,
+				       &dseg->seg, dfp->from,
+				       offset);
+	    }
+	    break;
+	}
+	dfp = dfp->next;
+    }
+
+    if (left > right) return False;
+
+    *leftp = left + canvas->x;
+    *rightp = right + canvas->x;
+    *posp = insert + canvas->x;
+    return True;
+}
+
+/*- adjustOffset: make the span fit within the specified area -*/
+static void
+adjustOffset(rectp, left, right, offsetp, force)
+XRectangle *rectp;
+Position left;
+Position right;
+Position *offsetp;
+Boolean force;
+{
+    Position offset = *offsetp;
+
+    if (rectp->x <= left + offset &&
+	right + offset <= rectp->x + rectp->width) return;
+
+    if (right - left > rectp->width) {
+	if (!force) return;
+	/* centering */
+	offset = (rectp->x + rectp->width / 2) - (right + left) / 2;
+    } else {
+	if (left + offset < rectp->x) {
+	    offset = rectp->x - left;
+	} else if (rectp->x + rectp->width < right + offset) {
+	    offset = rectp->x + rectp->width - right;
+	}
+    }
+    *offsetp = offset;
+    return;
+}
+
+
+/*
+ *+ insert cursor handling functions
+ */
+
+/*- eraseCursor: erase insert cursor -*/
+static void
+eraseCursor(ocw)
+OverTheSpotConversionWidget ocw;
+{
+    if (!ocw->overthespot.cursorvisible) return;
+
+    TRACE(("eraseCursor() at (%d,%d)\n",
+	    ocw->overthespot.cursorlocation.x,
+	    ocw->overthespot.cursorlocation.y));
+    CDDrawCursor(ocw->overthespot.displayobj,
+		 ocw->overthespot.cursorlocation.canvas->canvas,
+		 ocw->overthespot.cursorlocation.x,
+		 ocw->overthespot.cursorlocation.y,
+		 False);
+    ocw->overthespot.cursorvisible = False;
+}
+
+/*- showCursor: draw insert cursor -*/
+static void
+showCursor(ocw)
+OverTheSpotConversionWidget ocw;
+{
+    if (!ocw->overthespot.cursorvisible) return;
+
+    TRACE(("showCursor at (%d,%d)\n",
+	    ocw->overthespot.cursorlocation.x,
+	    ocw->overthespot.cursorlocation.y));
+    CDDrawCursor(ocw->overthespot.displayobj,
+		 ocw->overthespot.cursorlocation.canvas->canvas,
+		 ocw->overthespot.cursorlocation.x,
+		 ocw->overthespot.cursorlocation.y,
+		 True);
+}
+
+/*- exposeCursor: make the insert cursor redraw correctly when exposing -*/
+static Boolean
+exposeCursor(ocw, w, region)
+OverTheSpotConversionWidget ocw;
+Widget w;
+XRectangle *region;
+{
+    XRectangle bounds;
+
+    if (!ocw->overthespot.cursorvisible ||
+	w != ocw->overthespot.cursorlocation.canvas->canvas) return False;
+
+    TRACE(("exposeCursor(region=%d,%d-%d,%d)\n",
+	    region->x, region->y, region->width, region->height));
+    /*
+     * if a part of the insert cursor is in the exposing region,
+     * clear the entire cursor before redraw, since the cursor is
+     * drawn with xor mode.
+     */
+    CDGetCursorBounds(ocw->overthespot.displayobj, &bounds);
+    bounds.x += ocw->overthespot.cursorlocation.x;
+    bounds.y += ocw->overthespot.cursorlocation.y;
+    if (intersectRect(region, &bounds)) {
+	eraseCursor(ocw);
+	XClearArea(XtDisplay(w), XtWindow(w),
+		   bounds.x, bounds.y, bounds.width, bounds.height, False);
+	unionRect(region, &bounds, region);
+    }
+    ocw->overthespot.cursorvisible = True;
+    return True;
+}
+
+/*- computeCursor: compute insert cursor position if visible -*/
+static void
+computeCursor(ocw)
+OverTheSpotConversionWidget ocw;
+{
+    DisplaySegment *dsp;
+    DisplayLocation disploc;
+    Cardinal seg, offset;
+
+    if (!ICCursorPos(ocw->ccontrol.inputobj, &seg, &offset)) {
+	ocw->overthespot.cursorvisible = False;
+	return;
+    }
+
+    /* sanity check */
+    if (seg >= ocw->overthespot.numsegments) return;
+    dsp = ocw->overthespot.dispsegments + seg;
+    if (offset > dsp->seg.nchars) return;
+
+    if (findLocation(ocw, dsp, offset, &disploc) == NULL) return;
+
+    disploc.y += ocw->overthespot.ascent;
+
+    ocw->overthespot.cursorvisible = True;
+    ocw->overthespot.cursorlocation = disploc;
+}
+
+/*
+ *+ resource converter
+ */
+
+/*- StringToModeLocation: string->mode-location resource converter -*/
+/* ARGSUSED */
+static void
+StringToModeLocation(args, num_args, from, to)
+XrmValue *args;
+Cardinal *num_args;
+XrmValue *from;
+XrmValue *to;
+{
+    char *s = (char *)from->addr;
+    static ModeLocation ml = ModeBottomLeft;
+
+    if (!XmuCompareISOLatin1(s, "topleft")) ml = ModeTopLeft;
+    else if (!XmuCompareISOLatin1(s, "topright")) ml = ModeTopRight;
+    else if (!XmuCompareISOLatin1(s, "bottomleft")) ml = ModeBottomLeft;
+    else if (!XmuCompareISOLatin1(s, "bottomright")) ml = ModeBottomRight;
+    else if (!XmuCompareISOLatin1(s, "tracktext")) ml = ModeTrackText;
+    else if (!XmuCompareISOLatin1(s, "none")) ml = ModeNone;
+    else {
+	XtStringConversionWarning(s, XtRModeLocation);
+    }
+
+    to->size = sizeof(ModeLocation);
+    to->addr = (caddr_t)&ml;
+}
+
+/*
+ *+ miscellaneous functions
+ */
+
+/*- MoveShell: move shell widget -*/
+static void
+MoveShell(w, x, y)
+Widget w;
+Position x;
+Position y;
+{
+    ShellWidget shell = (ShellWidget)w;
+
+    TRACE(("MoveShell(%s,x=%d,y=%d,core.x=%d,core.y=%d)\n",XtName(w),x,y,w->core.x,w->core.y));
+    XtCheckSubclass(w, shellWidgetClass,
+		    "MoveShell: specified widget is not a shell");
+    /*
+     * calling XtMoveWidget() is NOT enough to move shell widgets when
+     * they are not mapped. we must use XtMakeGeometryRequest() or
+     * XtSetValues() to invoke root-geometry-manager which modifies
+     * the size hint appropriately.
+     */
+    if (shell->shell.popped_up) {
+	XtMoveWidget(w, x, y);
+    } else {
+	XtWidgetGeometry req;
+
+	req.request_mode = CWX | CWY;
+	req.x = x;
+	req.y = y;
+	(void)XtMakeGeometryRequest(w, &req, (XtWidgetGeometry *)NULL);
+    }
+}
+
+/*- getToplevelWindow: get top-level window of a given window -*/
+static Window
+getToplevelWindow(dpy, win, wm_state)
+Display *dpy;
+Window win;
+Atom wm_state;
+{
+    Atom type;
+    int format;
+    unsigned long nitems, bytesafter;
+    unsigned char *data;
+    Window root, parent;
+    Window *children;
+    unsigned int nchildren;
+
+    /*
+     * find toplevel window which has WM_STATE property or if no exists,
+     * direct subwindow of the root window. (ie I assume that if a
+     * window manager is running, that is a ICCCM compliant one)
+     */
+    for (;;) {
+	type = None;
+	if (wm_state != None) {
+	    data = NULL;
+	    XGetWindowProperty(dpy, win, wm_state, 0L, 0L, False,
+			       AnyPropertyType, &type, &format,
+			       &nitems, &bytesafter, &data);
+	    if (data != NULL) XtFree((char *)data);
+	    if (type != None) break;
+	}
+	if (!XQueryTree(dpy, win, &root, &parent, &children, &nchildren)) break;
+	if (nchildren > 0) XtFree((char *)children);
+	if (root == parent) break;
+	win = parent;
+    }
+    return win;
+}
+
+/*- setTransientFor: set WM_TRANSIENT_FOR property to specified widget -*/
+static void
+setTransientFor(w, win)
+Widget w;
+Window win;
+{
+    if (w == NULL) return;
+    if (!XtIsRealized(w)) XtRealizeWidget(w);
+    XSetTransientForHint(XtDisplay(w), XtWindow(w), win);
+}
+
+/*-setMwmHints: set _MOTIF_WM_HINTS for mode shell -*/
+static void
+setMwmHints(w)
+Widget w;
+{
+#define MWM_HINTS_ATOM		"_MOTIF_WM_HINTS"
+#define MWM_HINTS_DECOR		(1 << 1)
+#define MWM_DECOR_BORDER	(1 << 1)
+    Atom mwm_hints;
+    unsigned long hints[5];
+
+    if (w == NULL) return;
+    if (!XtIsRealized(w)) XtRealizeWidget(w);
+
+    mwm_hints = CachedInternAtom(XtDisplay(w), MWM_HINTS_ATOM, False);
+    if (mwm_hints == None) return;	/* just in case.. */
+
+    hints[0] = MWM_HINTS_DECOR;		/* flags */
+    hints[2] = MWM_DECOR_BORDER;	/* decorations */
+    hints[1] = hints[3] = hints[4] = 0;	/* functions, input mode and status */
+
+    XChangeProperty(XtDisplay(w), XtWindow(w),
+		    mwm_hints, mwm_hints, 32, PropModeReplace,
+		    (unsigned char *)hints, 5);
+}
+
+/*- getFocusOffset: get the focus window's position relative to the client window -*/
+static void
+getFocusOffset(ocw)
+OverTheSpotConversionWidget ocw;
+{
+    int offx, offy;
+    Window junkw;
+
+    if (ocw->ccontrol.focuswindow == ocw->ccontrol.clientwindow) {
+	FOCUSOFFX(ocw) = 0;
+	FOCUSOFFY(ocw) = 0;
+	return;
+    }
+    XTranslateCoordinates(XtDisplay((Widget)ocw),
+			  ocw->ccontrol.focuswindow,
+			  ocw->ccontrol.clientwindow,
+			  0, 0, &offx, &offy, &junkw);
+    FOCUSOFFX(ocw) = offx;
+    FOCUSOFFY(ocw) = offy;
+}
+   
+/*- intersectRect: returns given rectangles have a intersection -*/
+static Boolean
+intersectRect(rect1, rect2)
+register XRectangle *rect1;
+register XRectangle *rect2;
+{
+    return (rect1->x + rect1->width <= rect2->x ||
+	    rect1->x >= rect2->x + rect2->width ||
+	    rect1->y + rect1->height <= rect2->y ||
+	    rect1->y >= rect2->y + rect2->height) ? False : True;
+}
+
+/*- unionRect: returns minimum rectangle that covers given rectangles -*/
+static void
+unionRect(rect1, rect2, rect_ret)
+register XRectangle *rect1;
+register XRectangle *rect2;
+XRectangle *rect_ret;
+{
+    int x0, x1, y0, y1;
+
+    x0 = (rect1->x > rect2->x) ? rect2->x : rect1->x;
+    y0 = (rect1->y > rect2->y) ? rect2->y : rect1->y;
+    x1 = (rect1->x + rect1->width > rect2->x + rect2->width) ?
+		rect1->x + rect1->width : rect2->x + rect2->width;
+    y1 = (rect1->y + rect1->height > rect2->y + rect2->height) ?
+		rect1->y + rect1->height : rect2->y + rect2->height;
+
+    rect_ret->x = x0;
+    rect_ret->y = y0;
+    rect_ret->width = x1 - x0;
+    rect_ret->height = y1 - y0;
+}
+
+/*- enoughSpaceForStatus: checks if there's enough space for the status display -*/
+static int
+enoughSpaceForStatus(ocw)
+OverTheSpotConversionWidget ocw;
+{
+    Widget modew = ocw->overthespot.modewidget_fix;
+    int modespace;
+    int ascent = ocw->overthespot.ascent;
+    int descent = ocw->overthespot.lineheight - ascent;
+    int lspace = ocw->overthespot.linespacing;
+    int areatop = CLAREA(ocw).y;
+    int areabottom = CLAREA(ocw).y + CLAREA(ocw).height;
+    int top, bottom, y;
+
+    if (lspace == 0) lspace = 1;	/* avoid "divide by zero" error */
+
+    /*
+     * tracking $B%9%F!<%?%9$,I=<($G$-$k$+$I$&$+%A%'%C%/$9$k$K$O!"%/%i%$(B
+     * $B%"%s%H%(%j%"$KI=<($G$-$k:G=i$H:G8e$N9T$K$D$$$F$=$N>e$+2<$K%9%F!<(B
+     * $B%?%9$,I=<($G$-$k$3$H$rD4$Y$l$P$h$$!#(B
+     */
+
+    modespace = modew->core.height + modew->core.border_width * 2 + 2;
+
+    /* $B:G=i$N9T$N>e2<$N(B Y $B:BI8$r7W;;$7$F%9%F!<%?%9$,I=<($G$-$k$+D4$Y$k(B */
+    y = SPOTY(ocw) - ascent;
+    top = y - ((y - areatop) / lspace) * lspace;
+    bottom = top + ascent + descent;
+    if (top - areatop < modespace && areabottom - bottom < modespace) {
+	return 0;
+    }
+
+    /* $B:G8e$N9T$N>e2<$N(B Y $B:BI8$r7W;;$7$F%9%F!<%?%9$,I=<($G$-$k$+D4$Y$k(B */
+    y = SPOTY(ocw) + descent;
+    bottom = y + ((areabottom - y) / lspace) * lspace;
+    top = bottom - (ascent + descent);
+    if (top - areatop < modespace && areabottom - bottom < modespace) {
+	return 0;
+    }
+
+    return 1;
+}
+
+static DisplayFragment *free_fragments = NULL;
+
+/*- allocDisplayFragment: get new fragment -*/
+static DisplayFragment *
+allocDisplayFragment()
+{
+    if (free_fragments == NULL) {
+	return XtNew(DisplayFragment);
+    } else {
+	DisplayFragment *dfp = free_fragments;
+	free_fragments = dfp->next;
+	return dfp;
+    }
+}
+
+/*- freeDisplayFragments: add specified fragment list to free-list -*/
+static void
+freeDisplayFragments(fragments)
+DisplayFragment *fragments;
+{
+    DisplayFragment *dfp = fragments;
+
+    if (dfp == NULL) return;
+    while (dfp->next != NULL) dfp = dfp->next;
+    dfp->next = free_fragments;
+    free_fragments = fragments;
+}
+
+/*- destroyDisplayFragments: free specified fragment list -*/
+static void
+destroyDisplayFragments(fragments)
+DisplayFragment *fragments;
+{
+    DisplayFragment *dfp;
+
+    while (fragments != NULL) {
+	dfp = fragments->next;
+	XtFree((char *)fragments);
+	fragments = dfp;
+    }
+}
+
+/*- allocDisplaySegments: prepare specified number of display segments -*/
+static void
+allocDisplaySegments(ocw, n)
+OverTheSpotConversionWidget ocw;
+int n;
+{
+    if (ocw->overthespot.dispsegmentsize > n) return;
+    n = ((n + 3) / 4) * 4 ;
+    if (ocw->overthespot.dispsegments == NULL) {
+	ocw->overthespot.dispsegments = (DisplaySegment *)XtMalloc(n * sizeof(DisplaySegment));
+    } else {
+	ocw->overthespot.dispsegments = (DisplaySegment *)XtRealloc((char *)ocw->overthespot.dispsegments, n * sizeof(DisplaySegment));
+    }
+    ocw->overthespot.dispsegmentsize = n;
+}
+
+/*- freeDisplaySegment: free display segment's contents -*/
+static void
+freeDisplaySegment(dsp)
+DisplaySegment *dsp;
+{
+    freeString(&dsp->seg);
+    freeDisplayFragments(dsp->fragments);
+    dsp->fragments = NULL;
+}
+
+/*- clearAllDisplaySegments: clear all display segment's -*/
+static void
+clearAllDisplaySegments(ocw)
+OverTheSpotConversionWidget ocw;
+{
+    DisplaySegment *dsp = ocw->overthespot.dispsegments;
+    int i;
+
+    for (i = 0; i < ocw->overthespot.numsegments; i++) {
+	freeDisplaySegment(dsp++);
+    }
+    ocw->overthespot.numsegments = 0;
+}
+
+/*- copyString: copy ICString -*/
+static void
+copyString(from, to)
+ICString *from;
+ICString *to;
+{
+    *to = *from;
+    to->data = XtMalloc(to->nbytes);
+    (void)bcopy(from->data, to->data, to->nbytes);
+}
+
+/*- freeString: free ICString -*/
+static void
+freeString(seg)
+ICString *seg;
+{
+    XtFree(seg->data);
+    seg->data = NULL;
+    seg->nbytes = 0;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/Sj3.c	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,1282 @@
+#ifndef lint
+static char *rcsid = "$Id: Sj3.c,v 2.10 1999/05/25 08:13:05 ishisone Exp $";
+#endif
+/*
+ * Copyright (c) 1990  Software Research Associates, Inc.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted, provided
+ * that the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Software Research Associates not be
+ * used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission.  Software Research
+ * Associates makes no representations about the suitability of this software
+ * for any purpose.  It is provided "as is" without express or implied
+ * warranty.
+ *
+ * Author:  Makoto Ishisone, Software Research Associates, Inc., Japan
+ */
+/*
+ * Copyright 1991 Sony Corporation
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Sony not be used in advertising or
+ * publicity pertaining to distribution of the software without specific,
+ * written prior permission.  Sony makes no representations about the
+ * suitability of this software for any purpose.  It is provided "as is"
+ * without express or implied warranty.
+ *
+ * SONY DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL SONY
+ * BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
+ * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN 
+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+/*
+ * Author: Naoshi Suzuki, SONY Corporation.  (nao@sm.sony.co.jp)
+ */
+
+#include <X11/IntrinsicP.h>
+#include <X11/StringDefs.h>
+#if XtSpecificationRelease > 4
+#include <X11/Xfuncs.h>
+#endif
+#include <X11/Xmu/Atoms.h>
+#include <X11/Xutil.h>
+#include <X11/keysym.h>
+#ifdef X_LOCALE
+#include <X11/Xlocale.h>
+#else /* X_LOCALE */
+#include <locale.h>
+#endif /* X_LOCALE */
+#include <pwd.h>
+#include "Sj3P.h"
+
+static XtResource resources[] = {
+#define offset(field) XtOffset(Sj3Object, sj3.field)
+    { XtNsj3serv, XtCSj3serv, XtRString, sizeof(String),
+    offset(sj3serv), XtRString, NULL },
+    { XtNsj3serv2, XtCSj3serv2, XtRString, sizeof(String),
+    offset(sj3serv2), XtRString, NULL },
+    { XtNsj3user, XtCSj3user, XtRString, sizeof(String),
+    offset(sj3user), XtRString, NULL },
+    { XtNrcfile, XtCRcfile, XtRString, sizeof(String),
+    offset(rcfile), XtRString, NULL },
+    { XtNsbfile, XtCSbfile, XtRString, sizeof(String),
+    offset(sbfile), XtRString, NULL },
+    { XtNrkfile, XtCRkfile, XtRString, sizeof(String),
+    offset(rkfile), XtRString, NULL },
+    { XtNhkfile, XtCHkfile, XtRString, sizeof(String),
+    offset(hkfile), XtRString, NULL },
+    { XtNzhfile, XtCZhfile, XtRString, sizeof(String),
+    offset(zhfile), XtRString, NULL },
+#undef offset
+};
+
+static void             ClassInitialize();
+static void             Initialize(),   Destroy();
+static Boolean          SetValues();
+static int              InputEvent();
+static ICString        *GetMode();
+static int              CursorPos();
+static int              NumSegments();
+static ICString        *GetSegment();
+static int              CompareSegment();
+static ICString        *GetItemList();
+static int              SelectItem();
+static int              ConvertedString();
+static int              ClearConversion();
+static ICString        *GetAuxSegments();
+static int              PreeditString();
+static int              StatusString();
+
+Sj3ClassRec sj3ClassRec = {
+  { /* object fields */
+    /* superclass       */          (WidgetClass) &inputConvClassRec,
+    /* class_name       */          "Sj3",
+    /* widget_size      */          sizeof(Sj3Rec),
+    /* class_initialize */          ClassInitialize,
+    /* class_part_initialize    */  NULL,
+    /* class_inited     */          FALSE,
+    /* initialize       */          Initialize,
+    /* initialize_hook  */          NULL,
+    /* obj1             */          NULL,
+    /* obj2             */          NULL,
+    /* obj3             */          0,
+    /* resources        */          resources,
+    /* num_resources    */          XtNumber(resources),
+    /* xrm_class        */          NULLQUARK,
+    /* obj4             */          FALSE,
+    /* obj5             */          FALSE,
+    /* obj6             */          FALSE,
+    /* obj7             */          FALSE,
+    /* destroy          */          Destroy,
+    /* obj8             */          NULL,
+    /* obj9             */          NULL,
+    /* set_values       */          SetValues,
+    /* set_values_hook  */          NULL,
+    /* obj10            */          NULL,
+    /* get_values_hook  */          NULL,
+    /* obj11            */          NULL,
+    /* version          */          XtVersion,
+    /* callback_private */          NULL,
+    /* obj12            */          NULL,
+    /* obj13            */          NULL,
+    /* obj14            */          NULL,
+    /* extension        */          NULL
+  },
+  { /* inputConv fields */
+    /* InputEvent       */          InputEvent,
+    /* GetMode          */          GetMode,
+    /* CursorPos        */          CursorPos,
+    /* NumSegments      */          NumSegments,
+    /* GetSegment       */          GetSegment,
+    /* CompareSegment   */          CompareSegment,
+    /* GetItemList      */          GetItemList,
+    /* SelectItem       */          SelectItem,
+    /* GetConvertedString   */      ConvertedString,
+    /* ClearConversion  */          ClearConversion,
+    /* GetAuxSegments   */          GetAuxSegments,
+    /* SupportMultipleObjects   */  True,
+    /* GetTriggerKeys		*/  XtInheritGetTriggerKeys,
+    /* num_trigger_keys	*/          0,
+    /* trigger_keys	*/          NULL,
+    /* GetPreeditString */          PreeditString,
+    /* GetStatusString */           StatusString,
+    /* NoMoreObjects    */          False,
+  },
+  { /* sj3 fields */
+    /* foo              */          (int)NULL,
+  }
+};
+
+WidgetClass sj3ObjectClass = (WidgetClass)&sj3ClassRec;
+
+static void             startCandidate();
+static void             startSymbol();
+static void             startHinsi();
+static void             moveSelection();
+static int              endSelection();
+static int              insertSelection();
+static void             hinsiInit();
+static void             symbolInit();
+static void             allocCandlist();
+static void             startRegistration();
+static void             changeRegistration();
+static void             endRegistration();
+static void             setLocale();
+static void             setUser();
+
+static void             addObject();
+static void             deleteObject();
+static void             bell();
+
+static ICString        *SymbolList = NULL;
+static int              NumSymbol;
+static ICString        *HinsiList = NULL;
+static int              NumHinsi;
+
+static int              clcount = 0;
+
+static int              usr_code;
+static char             home[256];
+static char             uname[32];
+
+/*
+ * ClassInitialize()
+ *  Initialize common resource.
+ */
+static void
+ClassInitialize()
+{
+    setLocale();
+    setUser();
+
+    Xsj3cSetInLang(usr_code);
+    Xsj3cSetOutLang(JP_EUC);
+}
+
+/*
+ * setLocale()
+ *  Set locale and decide file code for all set-up files.
+ */
+static void
+setLocale()
+{
+    char    *loc;
+
+#ifdef X_LOCALE
+    if (loc = _Xsetlocale (LC_CTYPE, "")) {
+#else /* X_LOCALE */
+    if (loc = setlocale (LC_CTYPE, "")) {
+#endif /* X_LOCALE */
+        if (!strcmp(loc, "ja_JP.SJIS")||!strcmp(loc, "ja_JP.mscode"))
+            usr_code = JP_SJIS;
+        else if (!strcmp(loc, "ja_JP.jis7"))
+            usr_code = JP_JIS7;
+        else if (!strcmp(loc, "ja_JP.jis8"))
+            usr_code = JP_JIS8;
+        else 
+            usr_code = JP_EUC;
+    } else
+        usr_code = JP_EUC;
+#ifdef FORCE_SJIS
+    usr_code = JP_SJIS;
+#endif
+#ifdef FORCE_JIS8
+    usr_code = JP_JIS8;
+#endif
+#ifdef FORCE_JIS7
+    usr_code = JP_JIS7;
+#endif
+}
+
+/*
+ * setUser()
+ *  Set user name and home directory.
+ */
+static void
+setUser()
+{
+    extern char             *getenv(),  *getlogin();
+    char                    *login;
+    struct passwd           *pwd,   *getpwnam(),    *getpwuid();
+
+
+    if (login = getlogin())
+        strcpy(uname, login);
+    setpwent();
+    if (!uname || *uname == '\0') {
+        if (pwd = getpwuid(getuid())) {
+            strcpy(uname, pwd->pw_name);
+        }
+    } else {
+        pwd = getpwnam(uname);
+    }
+    if (pwd)
+        strcpy(home, pwd->pw_dir);
+    else
+        strcpy(home, getenv("HOME"));
+    endpwent();
+}
+
+/*
+ * InputEvent()
+ *  KeyPress event dispatch routine
+ */
+static int
+InputEvent(w, ev)
+    Widget      w;
+    XEvent     *ev;
+{
+    Sj3Object               obj = (Sj3Object)w;
+    Xsj3cBuf                buf = obj->sj3.sj3buf;
+    int                     ret = 0,    len,    nbytes;
+    unsigned char           *pre;
+    unsigned long           modmask;
+    KeySym                  ks;
+    register Xsj3cEvent     value,      select,     dict;
+
+    /* KeyPress$B0J30$O<N$F$k(B */
+    if (ev->type != KeyPress)
+        return ret;
+    
+    pre = Xsj3cGetPreeditArea(buf, &len);
+
+    /* $B%$%Y%s%H$rJ8;zNs5Z$S(B KeySym $B$KJQ49$9$k(B */
+    nbytes = XmuLookupKana((XKeyPressedEvent *)ev, (char *)pre, len, &ks, NULL);
+    modmask = ev->xkey.state & 0xff;
+
+    value = Xsj3cKeyConv(buf, nbytes, modmask, ks);
+
+    if (select = (value & KEY_SELECT)) {
+        switch (select) {
+        case KEY_CAND_START:
+            startCandidate(obj);
+            break;
+        case KEY_SYMBOL_START:
+            startSymbol(obj);
+            break;
+        case KEY_HINSI_START:
+            startHinsi(obj);
+            break;
+        case KEY_SELECT_RIGHT:
+            moveSelection(obj, ICMoveRight);
+            break;
+        case KEY_SELECT_LEFT:
+            moveSelection(obj, ICMoveLeft);
+            break;
+        case KEY_SELECT_UP:
+            moveSelection(obj, ICMoveUp);
+            break;
+        case KEY_SELECT_DOWN:
+            moveSelection(obj, ICMoveDown);
+            break;
+        case KEY_SELECT_FIRST:
+            moveSelection(obj, ICMoveFirst);
+            break;
+        case KEY_SELECT_LAST:
+            moveSelection(obj, ICMoveLast);
+            break;
+        case KEY_SELECT_NEXTP:
+            moveSelection(obj, ICMoveNextPage);
+            break;
+        case KEY_SELECT_PREVP:
+            moveSelection(obj, ICMovePrevPage);
+            break;
+        case KEY_SELECT_RIGHTMOST:
+            moveSelection(obj, ICMoveRightMost);
+            break;
+        case KEY_SELECT_LEFTMOST:
+            moveSelection(obj, ICMoveLeftMost);
+            break;
+        case KEY_SELECT_END:
+            endSelection(obj, False);
+            break;
+        case KEY_SELECT_ABORT:
+            endSelection(obj, True);
+            break;
+        default:
+            break;
+        }
+    } 
+    if (dict = (value & KEY_DICT)) {
+        switch (dict) {
+        case KEY_DICT_START:
+            startRegistration(obj);
+            break;
+        case KEY_DICT_CHANGE:
+            changeRegistration(obj);
+            break;
+        case KEY_DICT_REGISTER:
+            Xsj3cDictRegister(buf);
+            changeRegistration(obj);
+            break;
+        case KEY_DICT_CLEAR:
+            Xsj3cDictClear(buf);
+            changeRegistration(obj);
+            break;
+        case KEY_DICT_END:
+            endRegistration(obj);
+            break;
+        default:
+            break;
+        }
+    }
+    if (value & KEY_CONTROL || value == KEY_NULL)
+        ret = 1;
+    if (value & KEY_CHANGE){
+        if (value & KEY_MODE_CHANGE) {
+        /* Change display mode string       */
+            XtCallCallbackList(w, obj->inputConv.modechangecallback,
+               (XtPointer)NULL);
+        }
+        if (value & KEY_TEXT_FIXED) {
+        /* Fix converting strings           */
+            XtCallCallbackList(w, obj->inputConv.fixcallback,
+               (XtPointer)NULL);
+            Xsj3cFixBuffer(buf);
+        } else if (value & KEY_TEXT_FLUSH) {
+        /* Fix & Input strings at same time */
+            XtCallCallbackList(w, obj->inputConv.fixcallback,
+               (XtPointer)NULL);
+            Xsj3cFlushBuffer(buf);
+        }
+        if (value & KEY_TEXT_CHANGE) {
+        /* Change  converting strings       */
+            XtCallCallbackList(w, obj->inputConv.textchangecallback,
+               (XtPointer)NULL);
+        }
+        if (value & KEY_HENKAN_END) {
+        /* End conversion                   */
+            XtCallCallbackList((Widget)obj, obj->inputConv.endcallback,
+                   (XtPointer)NULL);
+            Xsj3cClearBuffer(buf);
+        }
+    } 
+    if  (value & KEY_BELL){
+        bell(obj);
+        return ret;
+    } else if (value & KEY_RECONNECT) {
+        Xsj3cConnect(buf, obj->sj3.sj3serv,
+                obj->sj3.sj3serv2, obj->sj3.sj3user);
+        Xsj3cClearBuffer(buf);
+        return ret;
+    }
+    return ret;
+}
+
+static ICString *
+GetMode(w)
+    Widget                  w;
+{
+    Sj3Object               obj = (Sj3Object)w;
+    Xsj3cBuf                buf = obj->sj3.sj3buf;
+    int                     len;
+    static ICString         icstr;
+
+    icstr.data = (char *)Xsj3cGetModeStr(buf, &len);
+    icstr.nchars = len;
+    icstr.nbytes = icstr.nchars * sizeof(wchar);
+    icstr.attr = ICAttrNormalString;
+    return &icstr;
+}
+
+static int
+CursorPos(w, nsegp, ncharp)
+    Widget                  w;
+    Cardinal                *nsegp;
+    Cardinal                *ncharp;
+{
+    Sj3Object               obj = (Sj3Object)w;
+    Xsj3cBuf                buf = obj->sj3.sj3buf;
+
+    return(Xsj3cGetPosition(buf, nsegp, ncharp));
+}
+
+static int
+NumSegments(w)
+Widget                      w;
+{
+    Sj3Object               obj = (Sj3Object)w;
+    Xsj3cBuf                buf = obj->sj3.sj3buf;
+
+    return (Xsj3cGetSegNum(buf));
+}
+
+static ICString *
+GetSegment(w, n)
+    Widget                  w;
+    Cardinal                n;
+{
+    Sj3Object               obj = (Sj3Object)w;
+    Xsj3cBuf                buf = obj->sj3.sj3buf;
+    static                  ICString seg;
+    int                     len, attr;
+
+    seg.data = (char *)Xsj3cGetSeg(buf, n, &len, &attr);
+    seg.nchars = len;
+    seg.nbytes = seg.nchars * sizeof(wchar);
+    switch (attr) {
+    case SEG_REVERSED:
+        seg.attr = ICAttrConverted|ICAttrCurrentSegment;
+        break;
+    case SEG_UNDER_LINE:
+        seg.attr = ICAttrNotConverted;
+        break;
+    case SEG_NORMAL:
+        seg.attr = ICAttrConverted;
+        break;
+    default:
+        seg.attr = ICAttrConverted;
+        break;
+    }
+
+    return &seg;
+}
+
+/* ARGSUSED */
+static int
+CompareSegment(w, seg1, seg2, n)
+    Widget                  w;
+    ICString               *seg1;
+    ICString               *seg2;
+    Cardinal               *n;
+{
+    register unsigned char  *p,     *q;
+    register int            len,    nsame = 0;
+    int                     result = ICSame;
+
+    if (seg1->attr != seg2->attr)
+        result |= ICAttrChanged;
+
+    len = seg1->nbytes > seg2->nbytes ? seg2->nbytes : seg1->nbytes;
+    p = (unsigned char *)seg1->data;
+    q = (unsigned char *)seg2->data;
+    while (nsame < len && *p++ == *q++) nsame++;
+
+    if (nsame != len || len != seg1->nbytes
+        || len != seg2->nbytes || seg1->data != seg2->data)
+        result |= ICStringChanged;
+
+    if (n)
+        *n = nsame / sizeof(wchar);
+
+    return result;
+
+}
+
+static ICString *
+GetItemList(w, n)
+    Widget                  w;
+    Cardinal               *n;
+{
+    Sj3Object               obj = (Sj3Object)w;
+    
+    switch (obj->sj3.state) {
+    case candidate_state:
+        *n = obj->sj3.numcand;
+        return obj->sj3.candlist;
+    case symbol_state:
+        *n = NumSymbol;
+        return obj->sj3.symbollist;
+    case hinsi_state:
+        *n = NumHinsi;
+        return obj->sj3.hinsilist;
+    default:
+        *n = 0;
+        return NULL;    /* no item available */
+    }
+    /* NOTREACHED */
+
+}
+
+static int
+SelectItem(w, n)
+    Widget                  w;
+    int                     n;
+{
+    Sj3Object   obj = (Sj3Object)w;
+    Xsj3cBuf    buf = obj->sj3.sj3buf;
+    int         ret = 0,    changed = False,    flush = False;
+
+    if (obj->sj3.state == normal_state )
+        return -1;
+    else if (n >= 0)
+        ret = insertSelection(obj, n, &changed, &flush);
+    
+    switch (obj->sj3.state) {
+    case candidate_state:
+        Xsj3cEndCandidate(buf, changed);
+        break;
+    case symbol_state:
+        Xsj3cEndSymbol(buf);
+        break;
+    case hinsi_state:
+        Xsj3cEndHinsi(buf);
+        break;
+    default:
+        XtAppWarning(XtWidgetToApplicationContext((Widget)obj),
+             "sj3 Object: Unknown ConvMode state");
+        break;
+    }
+    obj->sj3.state = normal_state;
+
+    if (changed) {
+        if (flush) {
+            XtCallCallbackList((Widget)obj, obj->inputConv.fixcallback,
+               (XtPointer)NULL);
+            Xsj3cFlushBuffer(buf);
+        }
+        XtCallCallbackList((Widget)obj,
+               obj->inputConv.textchangecallback,
+               (XtPointer)NULL);
+    }
+
+    return ret;
+
+}
+
+static int
+ConvertedString(w, encoding, format, length, string)
+    Widget                  w;
+    Atom                   *encoding;
+    int                    *format;
+    int                    *length;
+    XtPointer              *string;
+{
+    Sj3Object   obj = (Sj3Object)w;
+    Xsj3cBuf    buf = obj->sj3.sj3buf;
+    wchar      *wbuf, *wp;
+    wchar      *data;
+    int         len, wlen;
+    extern int  convJWStoCT();
+
+    wlen = Xsj3cGetConvertedLength(buf);
+    wbuf = (wchar *)XtMalloc((wlen + 1) * sizeof(wchar));
+
+    if ((Xsj3cGetConvertedStr(buf, wbuf)) == NULL) {
+        XtAppWarning(XtWidgetToApplicationContext(w),
+             "sj3 Object: Could not get converted string");
+        return -1;
+    }
+    *encoding = XA_COMPOUND_TEXT(XtDisplayOfObject((Widget)obj));
+    *format = 8;
+
+    for (wp = wbuf; *wp != 0; wp++) {
+        if (*wp == '\r') *wp = '\n';
+    }
+
+    *length = len = convJWStoCT(wbuf, (unsigned char *)NULL, 0);
+    *string = XtMalloc(len + 1);
+    (void)convJWStoCT(wbuf, (unsigned char *)*string, 0);
+
+    XtFree((char *)wbuf);
+    
+    return 0;
+}
+
+static int
+ClearConversion(w)
+    Widget                  w;
+{
+    Sj3Object               obj = (Sj3Object)w;
+    Xsj3cBuf                buf = obj->sj3.sj3buf;
+
+    Xsj3cClearBuffer(buf);
+    XtCallCallbackList(w, obj->inputConv.textchangecallback, (XtPointer)NULL);
+    return 0;
+}
+
+static ICString *
+GetAuxSegments(w, n, ns, nc)
+    Widget                  w;
+    Cardinal               *n, *ns, *nc;
+{
+    Sj3Object               obj = (Sj3Object)w;
+    Xsj3cBuf                buf = obj->sj3.sj3buf;
+    register int            i;
+    register Xsj3cDictMsg   p;
+    register ICString      *seg;
+    static ICString        *ics;
+
+    *n = Xsj3cGetDictMsgNum(buf);
+    if (!ics) {
+        ics = (ICString *)XtCalloc(*n, sizeof(ICString));
+    } else { 
+        ics = (ICString *)XtRealloc((char *)ics, *n * sizeof(ICString));
+    }
+    bzero(ics, *n * sizeof(ICString));
+    for (i = 0, seg = ics, p = Xsj3cGetDictMsgs(buf);
+            i < *n; i++, seg++) {
+        seg->data = (char *)p[i].data;
+        seg->nchars = p[i].len;
+        seg->nbytes = seg->nchars * sizeof(wchar);
+        switch (p[i].attr) {
+        case SEG_REVERSED:
+            seg->attr = ICAttrConverted|ICAttrCurrentSegment;
+            break;
+        case SEG_UNDER_LINE:
+            seg->attr = ICAttrNotConverted;
+            break;
+        case SEG_NORMAL:
+            seg->attr = ICAttrConverted;
+            break;
+        default:
+            seg->attr = ICAttrNotConverted;
+            break;
+        }
+    }
+    *ns = *n - 1;
+    *nc = 0;
+
+    return ics;
+}
+
+/* ARGSUSED */
+static int
+PreeditString(w, segn, offset, encoding, format, length, string)
+Widget w;
+int segn;
+int offset;
+Atom *encoding;
+int *format;
+int *length;
+XtPointer *string;
+{
+    Sj3Object obj = (Sj3Object)w;
+    Xsj3cBuf buf = obj->sj3.sj3buf;
+    int segnum = Xsj3cGetSegNum(buf);
+    int seglen, junk;
+    wchar *segdata;
+    Boolean deleted;
+    int i;
+    wchar *wbuf, *wp;
+    int len, wlen;
+    extern int convJWStoCT();
+
+    if (segn < segnum) {
+	segdata = Xsj3cGetSeg(buf, segn, &seglen, &junk);
+	if (offset >= seglen) {
+	    /* $B%;%0%a%s%H$N:G8e(B */
+	    ++segn;
+	    offset = 0;
+	}
+    }
+    if (segn >= segnum) {
+	deleted = True;
+    }
+    else {
+	segdata = Xsj3cGetSeg(buf, segn, &seglen, &junk);
+	deleted = (offset >= seglen);
+    }
+    if (deleted) {
+	/* $B:o=|$5$l$?(B */
+	*encoding = XA_COMPOUND_TEXT(XtDisplayOfObject(w));
+	*format = 8;
+	*length = 0;
+	*string = (XtPointer)XtMalloc(1);
+	return 0;
+    }
+
+    wlen = 0;
+    for (i = segn; i < segnum; i++) {
+	segdata = Xsj3cGetSeg(buf, i, &seglen, &junk);
+	wlen += seglen;
+    }
+    wlen -= offset;
+
+    wp = wbuf = (wchar *)XtMalloc((wlen + 1) * sizeof(wchar));
+    segdata = Xsj3cGetSeg(buf, segn, &seglen, &junk);
+    len = seglen - offset;
+    (void)bcopy((char *)(segdata + offset), (char *)wp, sizeof(wchar) * len);
+    wp += len;
+    for (i = segn + 1; i < segnum; i++) {
+	segdata = Xsj3cGetSeg(buf, i, &seglen, &junk);
+	(void)bcopy((char *)segdata, (char *)wp, sizeof(wchar) * seglen);
+	wp += seglen;
+    }
+    wbuf[wlen] = 0;
+
+    /*
+     * Sj3 $B%*%V%8%'%/%H$O(B COMPOUND_TEXT $B%(%s%3!<%G%#%s%0$7$+%5%]!<%H$7$J$$(B
+     * COMPOUND_TEXT $B$KJQ49$9$k(B
+     */
+    *encoding = XA_COMPOUND_TEXT(XtDisplayOfObject(w));
+    *format = 8;
+
+    /* COMPOUND_TEXT $B$O(B \r $B$,Aw$l$J$$$N$G(B \n $B$KJQ49$7$F$*$/(B */
+    for (wp = wbuf; *wp != 0; wp++) {
+	if (*wp == '\r') *wp = '\n';
+    }
+
+    *length = len = convJWStoCT(wbuf, (unsigned char *)NULL, 0);
+    *string = (XtPointer)XtMalloc(len + 1);
+    (void)convJWStoCT(wbuf, (unsigned char *)*string, 0);
+
+    /* wbuf $B$r(B free $B$7$F$*$/(B */
+    XtFree((char *)wbuf);
+
+    return 0;
+}
+
+/* ARGSUSED */
+static int
+StatusString(w, encoding, format, length, string, nchars)
+Widget w;
+Atom *encoding;
+int *format;
+int *length;
+XtPointer *string;
+int *nchars;
+{
+    ICString *seg;
+    wchar *wbuf, *wp;
+    int len, wlen;
+    extern int convJWStoCT();
+
+    seg = GetMode(w);
+    if (seg == NULL) {
+	*length = *nchars = 0;
+	return -1;
+    }
+
+    wlen = seg->nchars;
+    if (wlen <= 0) {
+	*length = *nchars = 0;
+	return -1;
+    }
+
+    /*
+     * data $B$KF~$C$F$$$kJQ49%F%-%9%H$O(B null $B%?!<%_%M!<%H$5$l$F$$$J$$$+$b(B
+     * $B$7$l$J$$$N$G!"$^$:%3%T!<$7$F(B null $B%?!<%_%M!<%H$9$k(B
+     */
+    wbuf = (wchar *)XtMalloc((wlen + 1) * sizeof(wchar));
+    (void)bcopy(seg->data, (char *)wbuf, sizeof(wchar) * wlen);
+    wbuf[wlen] = 0;
+
+    /*
+     * Sj3 $B%*%V%8%'%/%H$O(B COMPOUND_TEXT $B%(%s%3!<%G%#%s%0$7$+%5%]!<%H$7$J$$(B
+     * COMPOUND_TEXT $B$KJQ49$9$k(B
+     */
+    *encoding = XA_COMPOUND_TEXT(XtDisplayOfObject(w));
+    *format = 8;
+
+    /* COMPOUND_TEXT $B$O(B \r $B$,Aw$l$J$$$N$G(B \n $B$KJQ49$7$F$*$/(B */
+    for (wp = wbuf; *wp != 0; wp++) {
+	if (*wp == '\r') *wp = '\n';
+    }
+
+    *length = len = convJWStoCT(wbuf, (unsigned char *)NULL, 0);
+    *string = XtMalloc(len + 1);
+    (void)convJWStoCT(wbuf, (unsigned char *)*string, 0);
+    *nchars = seg->nchars;
+
+    /* wbuf $B$r(B free $B$7$F$*$/(B */
+    XtFree((char *)wbuf);
+
+    return 0;
+}
+
+/* ARGSUSED */
+static void
+Initialize(req, new, args, num_args)
+    Widget                  req;
+    Widget                  new;
+    ArgList                 args;
+    Cardinal               *num_args;
+{
+    Sj3Object               obj = (Sj3Object)new;
+    Xsj3cBuf                buf = NULL;
+    int                     min_keycode,  max_keycode,  keysyms_per_keycode;
+    register int            i,  j,  k;
+    unsigned long           kanamod = 0;
+    KeySym                 *keymap;
+    XModifierKeymap        *modmap;
+
+    obj->sj3.symbollist = SymbolList;
+    obj->sj3.hinsilist = HinsiList;
+    obj->sj3.candlist = NULL;
+    obj->sj3.numcand = 0;
+    obj->sj3.curcand = 0;
+    obj->sj3.cursymbol = 0;
+    obj->sj3.curhinsi = 0;
+    obj->sj3.candlistsize = 0;
+    obj->sj3.state = normal_state;
+    obj->sj3.selectionending = False;
+
+    if (!obj->sj3.sj3user || *obj->sj3.sj3user == '\0') 
+        obj->sj3.sj3user = uname;
+
+    if (!clcount++) {
+        /* Get kana lock modmask   */
+        XDisplayKeycodes (XtDisplayOfObject((Widget)obj),
+                &min_keycode, &max_keycode);
+        keymap = XGetKeyboardMapping (XtDisplayOfObject((Widget)obj),
+                min_keycode, (max_keycode - min_keycode + 1),
+                &keysyms_per_keycode);
+        XFree(keymap);
+
+        if (keysyms_per_keycode == 4) {
+            modmap = XGetModifierMapping(XtDisplayOfObject((Widget)obj));
+            k = 0;
+            for (i = 0; i < 8; i++) {
+                for (j = 0; j < modmap->max_keypermod; j++) {
+                    if (XK_Mode_switch ==
+                        XKeycodeToKeysym(XtDisplayOfObject((Widget)obj),
+                            modmap->modifiermap[k], 0)) {
+                        kanamod |= 1 << i;
+                    }
+                    k++;
+                }
+            }
+            XFreeModifiermap(modmap);
+        }
+
+        /* Set kana lock modmask   */
+        Xsj3cSetKanaMod(kanamod);
+
+    }
+
+    /* Making buffer for Xsj3clib   */
+    buf = obj->sj3.sj3buf = Xsj3cCreateBuffer();
+    if (!buf) {
+        XtAppError(XtWidgetToApplicationContext(new),
+            "sj3 Object: Failed to allocate buffers");
+    }
+
+    /* Read user resource customize file and set flags    */
+    (void)Xsj3cRCInit(buf, obj->sj3.rcfile, home);
+
+    /* Convertion table initialization    */
+    Xsj3cInitializeTables(buf, home, obj->sj3.rkfile, obj->sj3.hkfile,
+            obj->sj3.zhfile, obj->sj3.sbfile);
+
+    /* Connect to Kana-kanji conversion server  */
+    if ((Xsj3cOpen(buf, obj->sj3.sj3serv,
+                obj->sj3.sj3user, False, False)) != CONNECT_OK) {
+        XtAppWarning(XtWidgetToApplicationContext(new),
+     "sj3 Object: Failed to connect first server, then try to second server");
+        if ((Xsj3cOpen(buf, obj->sj3.sj3serv2,
+                obj->sj3.sj3user, False, True)) != CONNECT_OK) {
+            XtAppError(XtWidgetToApplicationContext(new),
+                 "sj3 Object: Failed to connect to second server");
+        }
+    };
+    
+    addObject(obj);
+}
+
+static void
+Destroy(w)
+    Widget                  w;
+{
+    Sj3Object               obj = (Sj3Object)w;
+    Xsj3cBuf                buf = obj->sj3.sj3buf;
+    
+    Xsj3cClose(buf, False);
+    Xsj3cFreeBuffer(buf);
+    deleteObject(obj);
+}
+
+static void
+symbolInit(obj)
+    Sj3Object obj;
+{
+    Xsj3cBuf                buf = obj->sj3.sj3buf;
+    register ICString      *strp;
+    register int            i;
+    register Xsj3cSymbol    p;
+
+    for (i = 0, strp = SymbolList, p = Xsj3cGetSymbols(buf);
+            i < NumSymbol; i++, strp++) {
+        strp->data = (char *)p[i].data;
+        strp->nchars = p[i].len;
+        strp->nbytes = strp->nchars * sizeof(wchar);
+        strp->attr = ICAttrNormalString;
+    }
+}
+
+static void
+startSymbol(obj)
+    Sj3Object obj;
+{
+    Xsj3cBuf                buf = obj->sj3.sj3buf;
+    ICSelectionControlArg   arg;
+    
+    /* Symbol list initialization   */
+    if (!SymbolList) {
+        NumSymbol = Xsj3cGetSymbolNum(buf, &obj->sj3.cursymbol);
+        SymbolList = (ICString *)XtMalloc(NumSymbol * sizeof(ICString));
+        symbolInit(obj);
+        obj->sj3.symbollist = SymbolList;
+    } else if (!obj->sj3.symbollist) {
+        obj->sj3.symbollist = SymbolList;
+    }
+
+    obj->sj3.state = symbol_state;
+
+    arg.command = ICSelectionStart;
+    arg.u.selection_kind = ICSelectionCandidates;
+    XtCallCallbackList((Widget)obj, obj->inputConv.selectioncallback,
+               (XtPointer)&arg);
+
+    /* set current item */
+    arg.command = ICSelectionSet;
+    arg.u.current_item = obj->sj3.cursymbol;
+    XtCallCallbackList((Widget)obj, obj->inputConv.selectioncallback,
+               (XtPointer)&arg);
+}
+
+static void
+startCandidate(obj)
+    Sj3Object obj;
+{
+    Xsj3cBuf                buf = obj->sj3.sj3buf;
+    ICSelectionControlArg   arg;
+    register ICString      *strp;
+    register int            i;
+    int                     ncand,  curcand;
+    register Xsj3cCand      p;
+    
+    if ((ncand = Xsj3cGetCandidateNum(buf, &curcand)) <= 0) {
+        bell(obj);
+        return;
+    }
+    obj->sj3.curcand = curcand;
+    obj->sj3.numcand = ncand;
+
+    allocCandlist(obj, obj->sj3.numcand);
+    
+    for (i = 0, strp = obj->sj3.candlist, p = Xsj3cGetCandidates(buf);
+            i < obj->sj3.numcand; i++, strp++) {
+        strp->data = (char *)p[i].data;
+        strp->nchars = p[i].len;
+        strp->nbytes = strp->nchars * sizeof(wchar);
+        strp->attr = ICAttrNormalString;
+    }
+
+    obj->sj3.state = candidate_state;
+
+    arg.command = ICSelectionStart;
+    arg.u.selection_kind = ICSelectionCandidates;
+    XtCallCallbackList((Widget)obj, obj->inputConv.selectioncallback,
+               (XtPointer)&arg);
+
+    /* set current candidate */
+    arg.command = ICSelectionSet;
+    arg.u.current_item = curcand;
+    XtCallCallbackList((Widget)obj, obj->inputConv.selectioncallback,
+               (XtPointer)&arg);
+}
+
+static void
+hinsiInit(obj)
+    Sj3Object obj;
+{
+    Xsj3cBuf                buf = obj->sj3.sj3buf;
+    register ICString      *strp;
+    register int            i;
+    register Xsj3cHinsi     p;
+
+    for (i = 0, strp = HinsiList, p = Xsj3cGetHinsis(buf);
+            i < NumHinsi; i++, strp++) {
+        strp->data = (char *)p[i].data;
+        strp->nchars = p[i].len;
+        strp->nbytes = strp->nchars * sizeof(wchar);
+        strp->attr = ICAttrNormalString;
+    }
+}
+
+static void
+startHinsi(obj) 
+    Sj3Object obj;
+{
+    Xsj3cBuf                buf = obj->sj3.sj3buf;
+    ICSelectionControlArg   arg;
+    
+    /* Hinsi list initialization    */
+    if (!HinsiList) {
+        NumHinsi = Xsj3cGetHinsiNum(buf, &obj->sj3.curhinsi);
+        HinsiList = (ICString *)XtMalloc(NumHinsi * sizeof(ICString));
+        hinsiInit(obj);
+        obj->sj3.hinsilist = HinsiList;
+    } else if (!obj->sj3.hinsilist) {
+        obj->sj3.hinsilist = HinsiList;
+    }
+
+    obj->sj3.state = hinsi_state;
+
+    arg.command = ICSelectionStart;
+    arg.u.selection_kind = ICSelectionCandidates;
+    XtCallCallbackList((Widget)obj, obj->inputConv.selectioncallback,
+               (XtPointer)&arg);
+
+    /* set current item */
+    arg.command = ICSelectionSet;
+    arg.u.current_item = obj->sj3.curhinsi;
+    XtCallCallbackList((Widget)obj, obj->inputConv.selectioncallback,
+               (XtPointer)&arg);
+}
+
+static void
+moveSelection(obj, dir)
+    Sj3Object               obj;
+    int                     dir;
+{
+    ICSelectionControlArg   arg;
+
+    if (obj->sj3.state == normal_state) return;
+    arg.command = ICSelectionMove;
+    arg.u.dir = dir;
+    XtCallCallbackList((Widget)obj, obj->inputConv.selectioncallback,
+               (XtPointer)&arg);
+}
+
+static int
+endSelection(obj, abort)
+    Sj3Object               obj;
+    int                     abort;
+{
+    ICSelectionControlArg   arg;
+    int                     selected;
+    int                     ret = 0,    changed = False,    flush = False;
+    Xsj3cBuf                buf = obj->sj3.sj3buf;
+
+    if (obj->sj3.selectionending)
+        return 0;
+
+    if (obj->sj3.state == normal_state)
+        return -1;
+
+    arg.command = ICSelectionEnd;
+    arg.u.current_item = -1;
+    XtCallCallbackList((Widget)obj, obj->inputConv.selectioncallback,
+               (XtPointer)&arg);
+
+    if (!abort && (selected = arg.u.current_item) >= 0) {
+        ret = insertSelection(obj, selected, &changed, &flush);
+    }
+
+    switch (obj->sj3.state) {
+    case candidate_state:
+        Xsj3cEndCandidate(buf, changed);
+        break;
+    case symbol_state:
+        Xsj3cEndSymbol(buf);
+        break;
+    case hinsi_state:
+        Xsj3cEndHinsi(buf);
+        break;
+    default:
+        XtAppWarning(XtWidgetToApplicationContext((Widget)obj),
+             "sj3 Object: Unknow ConvMode state");
+        break;
+    }
+    obj->sj3.state = normal_state;
+
+    if (changed) {
+        if (flush) {
+            XtCallCallbackList((Widget)obj, obj->inputConv.fixcallback,
+               (XtPointer)NULL);
+            Xsj3cFlushBuffer(buf);
+        }
+        XtCallCallbackList((Widget)obj,
+               obj->inputConv.textchangecallback,
+               (XtPointer)NULL);
+    }
+
+    return ret;
+}
+
+/* ARGSUSED */
+static Boolean
+SetValues(cur, req, wid, args, num_args)
+    Widget                  cur;
+    Widget                  req;
+    Widget                  wid;
+    ArgList                 args;
+    Cardinal                *num_args;
+{
+    return False;        
+}
+
+static int
+insertSelection(obj, selected, changed, flush)
+    Sj3Object               obj;
+    int                     selected;
+    int                    *changed;
+    int                    *flush;
+{
+    Xsj3cBuf                buf = obj->sj3.sj3buf;
+    int                     ret = 0;
+
+    obj->sj3.selectionending = True;
+    switch (obj->sj3.state) {
+    case candidate_state:
+        obj->sj3.curcand = selected;
+        ret = Xsj3cSetCandidate(buf, selected, changed, flush);
+        break;
+    case symbol_state:
+        obj->sj3.cursymbol = selected;
+        ret = Xsj3cSetSymbol(buf, selected, changed, flush);
+        break;
+    case hinsi_state:
+        obj->sj3.curhinsi = selected;
+        ret = Xsj3cSetHinsi(buf, selected, changed, flush);
+        break;
+    }
+    obj->sj3.selectionending = False;
+
+    return ret;
+}
+
+static void
+allocCandlist(obj, n)
+    Sj3Object               obj;
+    int                     n;
+{
+    ICString *p;
+
+    if (n <= obj->sj3.candlistsize)
+        return;
+
+    if (obj->sj3.candlistsize == 0) {
+        p = (ICString *)XtMalloc(n * sizeof(ICString));
+    } else {
+        p = (ICString *)XtRealloc((char *)obj->sj3.candlist,
+                  n * sizeof(ICString));
+    }
+
+    obj->sj3.candlist = p;
+    obj->sj3.candlistsize = n;
+}
+
+static void
+startRegistration(obj)
+    Sj3Object   obj;
+{
+    ICAuxControlArg         arg;
+
+    arg.command = ICAuxStart;
+    XtCallCallbackList((Widget)obj, obj->inputConv.auxcallback,
+               (XtPointer)&arg);
+}
+
+static void
+changeRegistration(obj)
+    Sj3Object               obj;
+{
+    ICAuxControlArg         arg;
+
+    arg.command = ICAuxChange;
+    XtCallCallbackList((Widget)obj, obj->inputConv.auxcallback,
+               (XtPointer)&arg);
+}
+
+static void
+endRegistration(obj)
+    Sj3Object   obj;
+{
+    Xsj3cBuf                buf = obj->sj3.sj3buf;
+    ICAuxControlArg         arg;
+
+    arg.command = ICAuxEnd;
+    XtCallCallbackList((Widget)obj, obj->inputConv.auxcallback,
+               (XtPointer)&arg);
+    Xsj3cEndDict(buf);
+}
+
+/*
+ * keeping list of objects
+ */
+typedef struct _oblist_ {
+    Sj3Object               obj;
+    struct _oblist_        *next;
+} ObjRec;
+
+static ObjRec *ObjList = NULL;
+
+static void
+addObject(obj)
+    Sj3Object               obj;
+{
+    ObjRec                 *objp = XtNew(ObjRec);
+
+    objp->obj = obj;
+    objp->next = ObjList;
+    ObjList = objp;
+}
+
+static void
+deleteObject(obj)
+    Sj3Object obj;
+{
+    ObjRec                 *objp, *objp0;
+
+    for (objp0 = NULL, objp = ObjList;
+            objp != NULL;
+            objp0 = objp, objp = objp->next) {
+        if (objp->obj == obj) {
+            if (objp0 == NULL) {
+                ObjList = objp->next;
+            } else {
+                objp0->next = objp->next;
+            }
+            XtFree((char *)objp);
+            return;
+        }
+    }
+}
+
+static void
+bell(obj)
+    Sj3Object               obj;
+{
+    XBell(XtDisplayOfObject((Widget)obj), 0);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/WcharDisp.c	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,853 @@
+#ifndef lint
+static char *rcsid = "$Id: WcharDisp.c,v 1.23 1994/10/27 08:29:05 ishisone Exp $";
+#endif
+/*
+ * Copyright (c) 1990  Software Research Associates, Inc.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted, provided
+ * that the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Software Research Associates not be
+ * used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission.  Software Research
+ * Associates makes no representations about the suitability of this software
+ * for any purpose.  It is provided "as is" without express or implied
+ * warranty.
+ *
+ * Author:  Makoto Ishisone, Software Research Associates, Inc., Japan
+ */
+
+#include <X11/IntrinsicP.h>
+#include <X11/StringDefs.h>
+#include <X11/Xmu/CharSet.h>
+#include "CachedAtom.h"
+#include "WcharDispP.h"
+#include "LocalAlloc.h"
+
+#define DEBUG_VAR debug_wcharDisplay
+#include "DebugPrint.h"
+
+/*
+ * R5 servers implicitly changes font properties when an alias name is
+ * used.  The character set properties (CHARSET_REGISTRY and
+ * CHARSET_ENCODING) are taken from the XLFD fontname.  So if the
+ * fontname is represented in lower-case letters, for example:
+ *    -jis-fixed-medium-r-normal--16-110-100-100-c-160-jisx0208.1983-0
+ *       (this example is taken from R5 fonts/misc/fonts.alias file)
+ * then, the value of CHARSET_REGISTRY becomes "jisx0208.1983",
+ * instead of the registered charset name "JISX0208.1983".
+ * The following flag forces kinput2 to accept these invalid lower
+ * case charset names as well.
+ */
+#define ALLOW_LOWERCASE_CHARSET_NAME
+
+static FontMapping defaultMapping = { { False, False, False, False } };
+
+static XtResource resources[] = {
+#define offset(field) XtOffset(WcharDisplayObject, wcharDisplay.field)
+    { XtNfontG0, XtCFont, XtRFontStruct, sizeof (XFontStruct *),
+	offset(defaultfonts[0]), XtRString, XtDefaultFont },
+    { XtNfontG1, XtCFont, XtRFontStruct, sizeof (XFontStruct *),
+	offset(defaultfonts[1]), XtRImmediate, (XtPointer)NULL },
+    { XtNfontG2, XtCFont, XtRFontStruct, sizeof (XFontStruct *),
+	offset(defaultfonts[2]), XtRImmediate, (XtPointer)NULL },
+    { XtNfontG3, XtCFont, XtRFontStruct, sizeof (XFontStruct *),
+	offset(defaultfonts[3]), XtRImmediate, (XtPointer)NULL },
+    { XtNfontMapping, XtCFontMapping, XtRFontMapping, sizeof (FontMapping),
+	offset(defaultmapping), XtRFontMapping, (XtPointer)&defaultMapping },
+#undef offset
+};
+
+static WDCharSet defCharSet[] = {
+    { "ISO8859-1",		G0LCharSet },
+    { "JISX0201.1976-0",	G0LCharSet },	/* alternative */
+#ifdef ALLOW_LOWERCASE_CHARSET_NAME
+    { "iso8859-1",		G0LCharSet },
+    { "jisx0201.1976-0",	G0LCharSet },	/* alternative */
+#endif
+};
+
+static void ClassInitialize();
+static void StringToFontMapping();
+
+static void Initialize();
+static void Destroy();
+static Boolean SetValues();
+
+static void GetAtoms();
+static void GetGC();
+static void ChangeFont();
+
+static int StringWidth();
+static int LineHeight();
+static void DrawString();
+static int MaxChar();
+static void SetFonts();
+
+static int countControlChars();
+static void expandControlChars();
+static int charWidth();
+
+WcharDisplayClassRec wcharDisplayClassRec = {
+  { /* object fields */
+    /* superclass		*/	(WidgetClass)&convDisplayClassRec,
+    /* class_name		*/	"WcharDisplay",
+    /* widget_size		*/	sizeof(WcharDisplayRec),
+    /* class_initialize		*/	ClassInitialize,
+    /* class_part_initialize	*/	NULL,
+    /* class_inited		*/	FALSE,
+    /* initialize		*/	Initialize,
+    /* initialize_hook		*/	NULL,
+    /* obj1			*/	NULL,
+    /* obj2			*/	NULL,
+    /* obj3			*/	0,
+    /* resources		*/	resources,
+    /* num_resources		*/	XtNumber(resources),
+    /* xrm_class		*/	NULLQUARK,
+    /* obj4			*/	FALSE,
+    /* obj5			*/	FALSE,
+    /* obj6			*/	FALSE,
+    /* obj7			*/	FALSE,
+    /* destroy			*/	Destroy,
+    /* obj8			*/	NULL,
+    /* obj9			*/	NULL,
+    /* set_values		*/	SetValues,
+    /* set_values_hook		*/	NULL,
+    /* obj10			*/	NULL,
+    /* get_values_hook		*/	NULL,
+    /* obj11			*/	NULL,
+    /* version			*/	XtVersion,
+    /* callback_private		*/	NULL,
+    /* obj12			*/	NULL,
+    /* obj13			*/	NULL,
+    /* obj14			*/	NULL,
+    /* extension		*/	NULL
+  },
+  { /* convDisplay fields */
+    /* StringWidth		*/	StringWidth,
+    /* LineHeight		*/	LineHeight,
+    /* DrawString		*/	DrawString,
+    /* MaxChar			*/	MaxChar,
+    /* DrawCursor		*/	XtInheritDrawCursor,
+    /* GetCursorBounds		*/	XtInheritGetCursorBounds,
+    /* SetFonts			*/	SetFonts,
+  },
+  { /* wcharDisplay fields */
+    /* charset_specs		*/	defCharSet,
+    /* num_specs		*/	XtNumber(defCharSet),
+  }
+};
+
+WidgetClass wcharDisplayObjectClass = (WidgetClass)&wcharDisplayClassRec;
+
+/* ARGSUSED */
+static void
+ClassInitialize()
+{
+    /* add String -> FontMapping converter */
+    XtAddConverter(XtRString, XtRFontMapping, StringToFontMapping,
+		   (XtConvertArgList)NULL, (Cardinal)0);
+}
+
+/* ARGSUSED */
+static void
+StringToFontMapping(args, num_args, from, to)
+XrmValue *args;
+Cardinal *num_args;
+XrmValue *from;
+XrmValue *to;
+{
+    char *s = (char *)from->addr;
+    char buf[128];
+    static FontMapping fm;
+    int c;
+    int i;
+
+    for (i = 0; i < 4; i++) fm.grmapping[i] = False;
+    to->size = sizeof(FontMapping);
+    to->addr = (caddr_t)&fm;
+
+    if (strlen(s) + 1 > sizeof(buf)) return;
+
+    XmuCopyISOLatin1Lowered(buf, s);
+    s = buf;
+    for (i = 0; i < 4; i++) {
+	while ((c = *s) != '\0' && (c == ' ' || c == '\t' || c == '\n')) s++;
+	if (c == '\0') break;
+	if (c == '/' || c == ',') {
+	    s++;
+	    continue;
+	}
+	if (!strncmp(s, "gl", 2)) {
+	    fm.grmapping[i] = False;
+	} else if (!strncmp(s, "gr", 2)) {
+	    fm.grmapping[i] = True;
+	} else {
+	    XtStringConversionWarning(s, XtRFontMapping);
+	}
+	s += 2;
+	while ((c = *s) != '\0' && (c == ' ' || c == '\t' || c == '\n')) s++;
+	if (c == '\0') break;
+	if (c == '/' || c == ',') s++;
+    }
+}
+
+/* ARGSUSED */
+static void
+Initialize(req, new, args, num_args)
+Widget req;
+Widget new;
+ArgList args;
+Cardinal *num_args;
+{
+    WcharDisplayObjectClass class = (WcharDisplayObjectClass)XtClass(new);
+    WcharDisplayObject obj = (WcharDisplayObject)new;
+    int i;
+    static char stipple_bits[] = {
+	0x55, 0x55, 0x00, 0x00, 0xaa, 0xaa, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00,
+	0xaa, 0xaa, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00, 0xaa, 0xaa, 0x00, 0x00,
+	0x55, 0x55, 0x00, 0x00, 0xaa, 0xaa, 0x00, 0x00
+    };
+
+    /* create a Stipple Bitmap (for drawing CurrentSubSegment) */
+    obj->wcharDisplay.stipple =
+      XCreateBitmapFromData(XtDisplayOfObject((Widget)obj),
+			    RootWindowOfScreen(XtScreenOfObject((Widget)obj)),
+			    stipple_bits, 16, 16);
+
+    for (i = 0; i < 4; i++) {
+	obj->wcharDisplay.fonts[i] = obj->wcharDisplay.defaultfonts[i];
+	obj->wcharDisplay.grmapping[i] =
+		obj->wcharDisplay.defaultmapping.grmapping[i];
+    }
+
+    obj->wcharDisplay.num_specs = class->wcharDisplay_class.num_specs;
+    obj->wcharDisplay.charset_specs = class->wcharDisplay_class.charset_specs;
+
+    GetAtoms(obj);
+    GetGC(obj);
+}
+
+static void
+Destroy(w)
+Widget w;
+{
+    WcharDisplayObject obj = (WcharDisplayObject)w;
+
+    XtFree((char *)obj->wcharDisplay.fontspecs);
+    XtWSReleaseGCSet(w, obj->wcharDisplay.gcset_normal);
+    XtWSReleaseGCSet(w, obj->wcharDisplay.gcset_rev);
+    XFreePixmap(XtDisplayOfObject((Widget)obj), obj->wcharDisplay.stipple);
+}
+
+/* ARGSUSED */
+static Boolean
+SetValues(cur, req, wid, args, num_args)
+Widget cur;
+Widget req;
+Widget wid;
+ArgList args;
+Cardinal *num_args;
+{
+    WcharDisplayObject old = (WcharDisplayObject)cur;
+    WcharDisplayObject new = (WcharDisplayObject)wid;
+    Boolean redraw = False;
+    int i;
+
+#define wd wcharDisplay 
+    for (i = 0; i < 4; i++) {
+	if ((new->wd.defaultfonts[i] != old->wd.defaultfonts[i] ||
+	     new->wd.defaultmapping.grmapping[i] !=
+			new->wd.defaultmapping.grmapping[i]) &&
+	    new->wd.fonts[i] == old->wd.defaultfonts[i]) {
+	    redraw = True;
+	    break;
+	}
+    }
+    if (redraw ||
+	new->convDisplay.foreground != old->convDisplay.foreground ||
+	new->convDisplay.background != old->convDisplay.background) {
+	XtWSReleaseGCSet(wid, new->wcharDisplay.gcset_normal);
+	XtWSReleaseGCSet(wid, new->wcharDisplay.gcset_rev);
+	GetGC(new);
+	redraw = True;
+    }
+#undef wd
+
+    return redraw;
+}
+
+static void
+GetAtoms(obj)
+WcharDisplayObject obj;
+{
+    Display *dpy = XtDisplayOfObject((Widget)obj);
+    WDCharSet *csp;
+    FontSpec *fsp;
+    Cardinal nspecs;
+    char buf[128];
+    char *p, *q;
+    int i;
+    String params[1];
+    Cardinal num_params;
+
+    if ((nspecs = obj->wcharDisplay.num_specs) == 0) {
+	params[0] = XtClass((Widget)obj)->core_class.class_name;
+	num_params = 1;
+	XtAppErrorMsg(XtWidgetToApplicationContext((Widget)obj),
+		      "noEntry", "charSpec", "WidgetError",
+		      "%s: has no character set spec.",
+		      params, &num_params);
+    }
+
+    csp = obj->wcharDisplay.charset_specs;
+    fsp = (FontSpec *)XtMalloc(sizeof(FontSpec) * obj->wcharDisplay.num_specs);
+    obj->wcharDisplay.fontspecs = fsp;
+
+    for (i = 0; i < nspecs; i++, csp++, fsp++) {
+	p = csp->charset;
+	q = buf;
+	while (*p != '\0' && *p != '-') *q++ = *p++;
+	if (*p++ == '\0' || *p == '\0') {
+	    params[0] = XtClass((Widget)obj)->core_class.class_name;
+	    num_params = 1;
+	    XtAppErrorMsg(XtWidgetToApplicationContext((Widget)obj),
+			  "invalidSpec", "charSetSpec", "WidgetError",
+			  "%s: has invalid character set spec.",
+			  params, &num_params);
+	}
+	*q = '\0';
+	fsp->registry = CachedInternAtom(dpy, buf, False);
+	fsp->encoding = CachedInternAtom(dpy, p, False);
+    }
+}
+
+static void
+GetGC(obj)
+WcharDisplayObject obj;
+{
+    XtGCMask mask = GCFont|GCForeground|GCBackground;
+    XGCValues values;
+    int ascent, descent;
+    Boolean *map = obj->wcharDisplay.grmapping;
+
+    values.function = GXcopy;
+    values.foreground = obj->convDisplay.foreground;
+    values.background = obj->convDisplay.background;
+    mask = GCFunction|GCForeground|GCBackground;
+    obj->wcharDisplay.gc_normal = XtGetGC((Widget)obj, mask, &values);
+
+    values.foreground = obj->convDisplay.background;
+    values.fill_style = FillStippled;
+    values.stipple = obj->wcharDisplay.stipple;
+    mask = GCFunction|GCForeground|GCFillStyle|GCStipple;
+    obj->wcharDisplay.gc_stipple = XtGetGC((Widget)obj, mask, &values);
+
+    mask = GCFont|GCFunction|GCForeground|GCBackground;
+    values.function = GXcopy;
+    values.foreground = obj->convDisplay.foreground;
+    values.background = obj->convDisplay.background;
+    obj->wcharDisplay.gcset_normal = XtWSGetGCSet((Widget)obj, mask, &values,
+						  obj->wcharDisplay.fonts[0],
+						  obj->wcharDisplay.fonts[1],
+						  obj->wcharDisplay.fonts[2],
+						  obj->wcharDisplay.fonts[3]);
+    values.foreground = obj->convDisplay.background;
+    values.background = obj->convDisplay.foreground;
+    obj->wcharDisplay.gcset_rev = XtWSGetGCSet((Widget)obj, mask, &values,
+					       obj->wcharDisplay.fonts[0],
+					       obj->wcharDisplay.fonts[1],
+					       obj->wcharDisplay.fonts[2],
+					       obj->wcharDisplay.fonts[3]);
+
+    /* set font mapping */
+    XWSSetMapping(obj->wcharDisplay.gcset_normal,
+		  map[0], map[1], map[2], map[3]);
+    XWSSetMapping(obj->wcharDisplay.gcset_rev,
+		  map[0], map[1], map[2], map[3]);
+
+    XWSFontHeight(obj->wcharDisplay.gcset_normal, NULL, 0, &ascent, &descent);
+    obj->wcharDisplay.ascent = ascent;
+    obj->wcharDisplay.fontheight = ascent + descent;
+}
+
+static void
+ChangeFont(obj, fonts, mapping)
+WcharDisplayObject obj;
+XFontStruct **fonts;
+Boolean *mapping;
+{
+    Boolean newgc = False;
+    int i;
+
+    for (i = 0; i < 4; i++) {
+	if (fonts[i] != obj->wcharDisplay.fonts[i] ||
+	    mapping[i] != obj->wcharDisplay.grmapping[i]) {
+	    obj->wcharDisplay.fonts[i] = fonts[i];
+	    obj->wcharDisplay.grmapping[i] = mapping[i];
+	    newgc = True;
+	}
+    }
+    if (newgc) {
+	XtWSReleaseGCSet((Widget)obj, obj->wcharDisplay.gcset_normal);
+	XtWSReleaseGCSet((Widget)obj, obj->wcharDisplay.gcset_rev);
+	GetGC(obj);
+    }
+}
+
+static int
+StringWidth(w, seg, start, end)
+Widget w;
+ICString *seg;
+int start;
+int end;
+{
+    WcharDisplayObject obj = (WcharDisplayObject)w;
+    wchar *wstr;
+    int len = seg->nchars;
+    int nctl;
+    int width;
+
+    if (end < 0 || len < end) end = len;
+    if (start >= end || start >= len) return 0;
+
+    wstr = (wchar *)seg->data + start;
+    len = end - start;
+
+    /*
+     * searching for control characters -- if found, convert them
+     * into '^?' format for readability.
+     */
+    if ((nctl = countControlChars(wstr, len)) == 0) {
+	/* no control characters */
+	width = XWSTextWidth(obj->wcharDisplay.gcset_normal, wstr, len);
+    } else {
+	wchar *s = (wchar *)LOCAL_ALLOC(sizeof(wchar) * (len + nctl));
+
+	expandControlChars(wstr, len, s);
+	width = XWSTextWidth(obj->wcharDisplay.gcset_normal, s, len + nctl);
+	LOCAL_FREE(s);
+    }
+    return width;
+}
+
+static int
+LineHeight(w, ascentp)
+Widget w;
+Position *ascentp;
+{
+    WcharDisplayObject obj = (WcharDisplayObject)w;
+
+    if (ascentp != NULL) *ascentp = obj->wcharDisplay.ascent;
+    return obj->wcharDisplay.fontheight;
+}
+
+static void
+DrawString(w, canvas, seg, start, end, x, y)
+Widget w;
+Widget canvas;
+ICString *seg;
+int start;
+int end;
+int x;
+int y;
+{
+    WcharDisplayObject obj = (WcharDisplayObject)w;
+    wchar *wstr;
+    XWSGC gcset;
+    int len = seg->nchars;
+    int nctl;
+    Display *dpy = XtDisplay(canvas);
+    Window win = XtWindow(canvas);
+    int width;
+    int attr;
+
+    if (end < 0 || len < end) end = len;
+    if (start >= end || start >= len) return;
+
+    wstr = (wchar *)seg->data + start;
+    len = end - start;
+
+#define STIPPLED	1
+#define UNDERLINED	2
+
+    if (seg->attr == ICAttrNormalString) {
+	gcset = obj->wcharDisplay.gcset_normal;
+	attr = 0;
+    } else if (seg->attr & ICAttrConverted) {
+	/* converted segment */
+	if (seg->attr & ICAttrCurrentSegment) {
+	    gcset = obj->wcharDisplay.gcset_rev;
+	    attr = 0;
+	} else if (seg->attr & ICAttrCurrentSubSegment) {
+	    gcset = obj->wcharDisplay.gcset_rev;
+	    attr = STIPPLED;
+	} else {
+	    gcset = obj->wcharDisplay.gcset_normal;
+	    attr = 0;
+	}
+    } else {	/* ICAttrNotConverted */
+	gcset = obj->wcharDisplay.gcset_normal;
+	attr = UNDERLINED;
+    }
+
+    if ((nctl = countControlChars(wstr, len)) == 0) {
+	width = XWSDrawImageString(dpy, win, gcset,
+				   x, y + obj->wcharDisplay.ascent,
+				   wstr, len);
+    } else {
+	wchar *s = (wchar *)LOCAL_ALLOC((len + nctl) * sizeof(wchar));
+	expandControlChars(wstr, len, s);
+	width = XWSDrawImageString(dpy, win, gcset,
+				   x, y + obj->wcharDisplay.ascent,
+				   s, len + nctl);
+	LOCAL_FREE(s);
+    }
+
+    if (attr == UNDERLINED) {
+	int uloffset = 1;
+	int descent = obj->wcharDisplay.fontheight - obj->wcharDisplay.ascent;
+
+	if (descent <= 1) {
+	    /* font descent is 0 or 1 */
+	    uloffset = descent - 1;
+	}
+	XDrawLine(dpy, win, obj->wcharDisplay.gc_normal,
+		  x, y + obj->wcharDisplay.ascent + uloffset,
+		  x + width - 1, y + obj->wcharDisplay.ascent + uloffset);
+    } else if (attr == STIPPLED) {
+	XFillRectangle(dpy, win, obj->wcharDisplay.gc_stipple, x, y,
+		       (unsigned int)width,
+		       (unsigned int)obj->wcharDisplay.fontheight);
+    }
+}
+
+static int
+MaxChar(w, seg, start, width)
+Widget w;
+ICString *seg;
+int start;
+int width;
+{
+    WcharDisplayObject obj = (WcharDisplayObject)w;
+    XWSGC gcset = obj->wcharDisplay.gcset_normal;
+    wchar *sp = (wchar *)seg->data + start;
+    wchar *ep = (wchar *)seg->data + seg->nchars;
+    int cwidth;
+    int chars;
+
+    chars = 0;
+    while (sp < ep) {
+	cwidth = charWidth(*sp++, gcset);
+	if (width < cwidth) break;
+	chars++;
+	if ((width -= cwidth) == 0) break;
+    }
+    return chars;
+}
+
+static void
+SetFonts(w, fonts, num_fonts)
+Widget w;
+XFontStruct  **fonts;
+Cardinal num_fonts;
+{
+    WcharDisplayObject obj = (WcharDisplayObject)w;
+    WDCharSet *csp = obj->wcharDisplay.charset_specs;
+    FontSpec *fsp = obj->wcharDisplay.fontspecs;
+    Cardinal nspecs = obj->wcharDisplay.num_specs;
+    Cardinal i, j;
+    XFontStruct *pickedfonts[4];
+    Boolean mapping[4];
+    static int csetmask[4] = {
+	G0LCharSet|G0RCharSet,
+	G1LCharSet|G1RCharSet,
+	G2LCharSet|G2RCharSet,
+	G3LCharSet|G3RCharSet,
+    };
+
+    if (num_fonts == 0) {
+	ChangeFont(obj, obj->wcharDisplay.defaultfonts,
+		   obj->wcharDisplay.defaultmapping.grmapping);
+	return;
+    }
+
+    for (i = 0; i < 4; i++) pickedfonts[i] = NULL;
+
+    (void)_CDPickupFonts(w, fsp, nspecs, fonts, num_fonts);
+
+#define GRMAP	(G0RCharSet|G1RCharSet|G2RCharSet|G3RCharSet)
+    for (j = 0; j < nspecs; j++, fsp++, csp++) {
+	if (fsp->font == NULL) continue;
+	for (i = 0; i < 4; i++) {
+	    if (pickedfonts[i] == NULL && (csp->flag & csetmask[i])) {
+		pickedfonts[i] = fsp->font;
+		mapping[i] = (csp->flag & csetmask[i] & GRMAP) ? True : False;
+	    }
+	}
+    }
+#undef GRMAP
+    for (i = 0; i < 4; i++) {
+	if (pickedfonts[i] == NULL) {
+	    pickedfonts[i] = obj->wcharDisplay.defaultfonts[i];
+	    mapping[i] = obj->wcharDisplay.defaultmapping.grmapping[i];
+	}
+    }
+
+    ChangeFont(obj, pickedfonts, mapping);
+}
+
+/* countControlChars -- count number of control characters in a string */
+static int
+countControlChars(wstr, len)
+register wchar *wstr;
+int len;
+{
+    register wchar *end = wstr + len;
+    register int n = 0;
+
+    while (wstr < end) {
+	if (*wstr < 0x20 || *wstr == 0x7f) n++;
+	wstr++;
+    }
+    return n;  
+}
+
+/* expandControlChars -- convert control characters into '^?' format */
+static void
+expandControlChars(org, orglen, res)
+wchar *org;
+int orglen;
+wchar *res;
+{
+    wchar *end;
+
+    for (end = org + orglen; org < end; org++) {
+	if (*org < 0x20 || *org == 0x7f) {
+	    *res++ = '^';
+	    *res++ = *org ^ 0x40;
+	} else {
+	    *res++ = *org;
+	}
+    }
+}
+
+#define WITHIN_RANGE_2D(row, col, fs) \
+    ((fs)->min_byte1 <= (row) && (row) <= (fs)->max_byte1 && \
+     (fs)->min_char_or_byte2 <= (col) && (col) <= (fs)->max_char_or_byte2)
+
+#define WITHIN_RANGE(c, fs) \
+    ((fs)->min_char_or_byte2 <= (c) && (c) <= (fs)->max_char_or_byte2)
+
+#define CHAR_INFO_2D(row, col, fs) \
+    ((fs)->per_char + ((row) - (fs)->min_byte1) * \
+     ((fs)->max_char_or_byte2 - (fs)->min_char_or_byte2 + 1) + \
+     ((col) - (fs)->min_char_or_byte2))
+
+#define CHAR_INFO(c, fs) \
+    ((fs)->per_char + ((c) - (fs)->min_char_or_byte2))
+
+#define CHAR_EXIST(csp) \
+    ((csp)->width != 0 || ((csp)->rbearing != 0) || ((csp)->lbearing != 0))
+
+static int
+defaultCharWidth(font)
+XFontStruct *font;
+{
+    int defchar = font->default_char;
+
+    if (font->min_byte1 || font->max_byte1) {
+	int row = defchar >> 8;
+	int col = defchar & 0xff;
+	if (WITHIN_RANGE_2D(row, col, font)) {
+	    if (font->per_char == NULL) {
+		return font->min_bounds.width;
+	    } else {
+		XCharStruct *csp = CHAR_INFO_2D(row, col, font);
+		return CHAR_EXIST(csp) ? csp->width : 0;
+	    }
+	} else {
+	    return 0;
+	}
+    } else {
+	if (WITHIN_RANGE(defchar, font)) {
+	    if (font->per_char == NULL) {
+		return font->min_bounds.width;
+	    } else {
+		XCharStruct *csp = CHAR_INFO(defchar, font);
+		return CHAR_EXIST(csp) ? csp->width : 0;
+	    }
+	} else {
+	    return 0;
+	}
+    }
+}
+
+/* charWidth -- returns width of the specified character */
+static int
+charWidth(c, gcset)
+register int c;
+XWSGC gcset;
+{
+    register XFontStruct *font;
+    int width;
+    int gset;
+    int nonPrinting = (c < 0x20 || c == 0x7f);    
+
+    if (nonPrinting) c ^= 0x40;
+
+    switch (c & 0x8080) {
+    case 0x0000: gset = 0; break;
+    case 0x8080: gset = 1; break;
+    case 0x0080: gset = 2; break;
+    case 0x8000: gset = 3; break;
+    }
+
+    if ((font = gcset->fe[gset].font) == NULL) return 0;
+
+    if (gcset->fe[gset].flag & GRMAPPING) {
+	c |= 0x8080;
+    } else {
+	c &= 0x7f7f;
+    }
+
+    if (gcset->fe[gset].flag & TWOB) {
+	register int row = (c >> 8) & 0xff;
+	register int col = c & 0xff;
+	if (WITHIN_RANGE_2D(row, col, font)) {
+	    if (font->per_char == NULL) {
+		width = font->min_bounds.width;
+	    } else {
+		XCharStruct *csp = CHAR_INFO_2D(row, col, font);
+
+		width = CHAR_EXIST(csp) ? csp->width : defaultCharWidth(font);
+	    }
+	} else {
+	    width = defaultCharWidth(font);
+	}
+    } else {
+	c &= 0xff;
+	if (WITHIN_RANGE(c, font)) {
+	    if (font->per_char == NULL) {
+		width = font->min_bounds.width;
+	    } else {
+		XCharStruct *csp = CHAR_INFO(c, font);
+
+		width = CHAR_EXIST(csp) ? csp->width : defaultCharWidth(font);
+	    }
+	} else {
+	    width = defaultCharWidth(font);
+	}
+    }
+    if (nonPrinting) width += charWidth('^', gcset);
+
+    return width;
+}
+
+
+/*
+ * jpWcharDisplay definition
+ *
+ *	character set assignment for Japanese wchar:
+ *	    G0: ascii (ISO8859/1 left-half)
+ *	    G1: kanji (JISX0208)
+ *	    G2: half-width kana (JISX0201 right-half)
+ *	    G3: unused
+ */
+
+static FontMapping jpDefaultMapping = { { False, False, True, False } };
+
+#define JPFONT_ASCII	"-Misc-Fixed-Medium-R-*--14-*-*-*-C-*-ISO8859-1"
+#define JPFONT_KANJI	"-Misc-Fixed-Medium-R-*--14-*-*-*-C-*-JISX0208.1983-0"
+#define JPFONT_KANA	"-Misc-Fixed-Medium-R-*--14-*-*-*-C-*-JISX0201.1976-0"
+
+static XtResource jpresources[] = {
+    /* only override superclass's default */
+#define offset(field) XtOffset(JpWcharDisplayObject, wcharDisplay.field)
+    { XtNfont, XtCFont, XtRFontStruct, sizeof (XFontStruct *),
+	offset(defaultfonts[0]), XtRString, JPFONT_ASCII },
+    { XtNkanjiFont, XtCKanjiFont, XtRFontStruct, sizeof (XFontStruct *),
+	offset(defaultfonts[1]), XtRString, JPFONT_KANJI },
+    { XtNkanaFont, XtCKanaFont, XtRFontStruct, sizeof (XFontStruct *),
+	offset(defaultfonts[2]), XtRString, JPFONT_KANA },
+    { XtNfontG3, "Not.used", XtRFontStruct, sizeof (XFontStruct *),
+	offset(defaultfonts[3]), XtRImmediate, (XtPointer)NULL },
+    { XtNfontMapping, XtCFontMapping, XtRFontMapping, sizeof (FontMapping),
+	offset(defaultmapping), XtRFontMapping, (XtPointer)&jpDefaultMapping },
+#undef offset
+};
+
+static WDCharSet jpCharSet[] = {
+    { "ISO8859-1",		G0LCharSet },		/* my preference */
+    { "JISX0201.1976-0",	G0LCharSet | G2RCharSet },
+    { "JISX0208.1990-0",	G1LCharSet },
+    { "JISX0208.1983-0",	G1LCharSet },
+    { "JISX0208.1978-0",	G1LCharSet },
+    { "JISX0208.1983-1",	G1RCharSet },
+    { "JISX0208.1978-1",	G1RCharSet },
+#ifdef ALLOW_LOWERCASE_CHARSET_NAME
+    { "iso8859-1",		G0LCharSet },		/* my preference */
+    { "jisx0201.1976-0",	G0LCharSet | G2RCharSet },
+    { "jisx0208.1990-0",	G1LCharSet },
+    { "jisx0208.1983-0",	G1LCharSet },
+    { "jisx0208.1978-0",	G1LCharSet },
+    { "jisx0208.1983-1",	G1RCharSet },
+    { "jisx0208.1978-1",	G1RCharSet },
+#endif
+};
+
+JpWcharDisplayClassRec jpWcharDisplayClassRec = {
+  { /* object fields */
+    /* superclass		*/	(WidgetClass)&wcharDisplayClassRec,
+    /* class_name		*/	"JpWcharDisplay",
+    /* widget_size		*/	sizeof(JpWcharDisplayRec),
+    /* class_initialize		*/	NULL,
+    /* class_part_initialize	*/	NULL,
+    /* class_inited		*/	FALSE,
+    /* initialize		*/	NULL,
+    /* initialize_hook		*/	NULL,
+    /* obj1			*/	NULL,
+    /* obj2			*/	NULL,
+    /* obj3			*/	0,
+    /* resources		*/	jpresources,
+    /* num_resources		*/	XtNumber(jpresources),
+    /* xrm_class		*/	NULLQUARK,
+    /* obj4			*/	FALSE,
+    /* obj5			*/	FALSE,
+    /* obj6			*/	FALSE,
+    /* obj7			*/	FALSE,
+    /* destroy			*/	NULL,
+    /* obj8			*/	NULL,
+    /* obj9			*/	NULL,
+    /* set_values		*/	NULL,
+    /* set_values_hook		*/	NULL,
+    /* obj10			*/	NULL,
+    /* get_values_hook		*/	NULL,
+    /* obj11			*/	NULL,
+    /* version			*/	XtVersion,
+    /* callback_private		*/	NULL,
+    /* obj12			*/	NULL,
+    /* obj13			*/	NULL,
+    /* obj14			*/	NULL,
+    /* extension		*/	NULL
+  },
+  { /* convDisplay fields */
+    /* StringWidth		*/	XtInheritStringWidth,
+    /* LineHeight		*/	XtInheritLineHeight,
+    /* DrawString		*/	XtInheritDrawString,
+    /* MaxChar			*/	XtInheritMaxChar,
+    /* DrawCursor		*/	XtInheritDrawCursor,
+    /* GetCursorBounds		*/	XtInheritGetCursorBounds,
+    /* SetFonts			*/	XtInheritSetFonts,
+  },
+  { /* wcharDisplay fields */
+    /* charset_specs		*/	jpCharSet,
+    /* num_specs		*/	XtNumber(jpCharSet),
+  },
+  { /* jpWcharDisplay fields */
+    /* empty			*/	0,
+  },
+};
+
+WidgetClass jpWcharDisplayObjectClass = (WidgetClass)&jpWcharDisplayClassRec;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/Xatoklib/Imakefile	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,22 @@
+#include "../../Kinput2.conf"
+
+             SRCS = \
+		aux.c \
+		buffer.c \
+		compstr.c \
+		event.c \
+		if.c \
+		key.c \
+		misc.c \
+		segment.c \
+		sysline.c
+
+             OBJS = $(SRCS:%.c=%.o)
+
+   	INCLUDES = -I../../include  -I$(ATOKINCDIR)
+
+          DEFINES =
+
+NormalLibraryObjectRule()
+NormalLibraryTarget(Xatoklib,$(OBJS))
+DependTarget()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/Xatoklib/README	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,23 @@
+/* 
+ * Copyright 1999 Justsystem Corporation, Japan.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and that
+ * both that copyright notice and this permission notice appear in
+ * supporting documentation, and that the name of Justsystem Corporation
+ * not be used in advertising or publicity pertaining to distribution
+ * of the software without specific, written prior permission.  Justsystem 
+ * Corporation makes no representations about the suitability of this
+ * software for any purpose.  It is provided "as is" without express
+ * or implied warranty.
+ *
+ * $B$3$N%G%#%l%/%H%j!<$K$O(B ATOK $B$N%i%$%V%i%j!<$r%"%/%;%9$9$k$?$a$N%3!<%I(B
+ * $B$*$h$S(B kinput2 $B$N%P%C%U%!$H(B $B%"%/%;%9%i%$%V%i%j!<$N%P%C%U%!$N(B
+ * $B%G!<%?$NJQ49$r9T$J$&%=!<%9$,B8:_$7$^$9!#(B
+ * ATOK $B$+$i(B $BLa$C$F$/$k%3!<%I$O!"(BUNICODE$B!"(BSHIFT JIS $B$G$9$,!"(B
+ * kinput2 $B$K=PNO$9$k$H$-$O!"(B EUC $B$KJQ49$7$F$$$^$9!#(B
+ * $B2?8D$+$N%=!<%9%U%!%$%k$K$O!"%a%C%;!<%8$,(BEUC$B$G$"$k$3$H$,A0Ds$K(B
+ * $B$J$C$F$$$^$9$N$G(B  $B%3%s%Q%$%k$O$G$-$l$P(B EUC$B$G9T$J$C$F$/$@$5$$!#(B
+ * 
+ */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/Xatoklib/aux.c	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,1182 @@
+/* 
+ * Copyright 1999 Justsystem Corporation, Japan.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and that
+ * both that copyright notice and this permission notice appear in
+ * supporting documentation, and that the name of Justsystem Corporation
+ * not be used in advertising or publicity pertaining to distribution
+ * of the software without specific, written prior permission.  Justsystem 
+ * Corporation makes no representations about the suitability of this
+ * software for any purpose.  It is provided "as is" without express
+ * or implied warranty.
+ *
+ * Author: Atsushi Irisawa
+ */
+#ifndef lint
+static  char    rcsid[] = "$Id: aux.c,v 1.3 1999/08/24 09:05:25 ishisone Exp $" ;
+#endif  /* !lint */
+
+#include        <stdio.h>
+#include        <X11/IntrinsicP.h>
+#include        <X11/StringDefs.h>
+#include        <X11/Xmu/Atoms.h>
+#include        <X11/keysym.h>
+
+#include	<Xatoklib.h>
+
+
+/* Page */
+/*
+ * [$B4X?tL>(B]
+ *		wordStartFunc( )
+ * [$BI=Bj(B]
+ *              $BC18lEPO?%a%K%e!<$N=i4|2==hM}(B
+ * [$B8F=P7A<0(B]
+ *	int	wordStartFunc( _XatokRecPtr  acomm )
+ *
+ * [$B0z?t(B]
+ *              $B7?(B           : $BL>(B  $B>N(B  : I O : $B@b(B      $BL@(B
+ *		_XatokRecPtr : acomm   : i/o : kinput2$BMQJQ49%P%C%U%!(B
+ *
+ * [$BJV$jCM(B]
+ *		1 : $B>o$K#1(B
+ *
+ * [$B;HMQ4X?t(B]
+ *		$B$J$7(B
+ * [$B5!G=(B]
+ *		$BC18lEPO?%a%K%e!<$rI=<($9$k0Y$K!"%G!<%?$N=i4|2=$r9T$J$&!#(B
+ */
+int wordStartFunc(acomm)
+_XatokRecPtr	acomm;
+{
+
+#ifdef	ATOK_DEBUG
+	printf( "\303\261\270\354\305\320\317\277\263\253\273\317\n"/*=$BC18lEPO?3+;O(B\n=*/ ) ;
+#endif	/* ATOK_DEBUG */
+	bzero( acomm->word_str, sizeof( acomm->word_str )) ;
+	bzero( acomm->word_yomi, sizeof( acomm->word_yomi )) ;
+	acomm->word_strLen = 0 ;
+	acomm->word_yomiLen = 0 ;
+	acomm->word_mode = W_WORD ;
+
+	return 1 ;
+}
+
+/* Page */
+/*
+ * [$B4X?tL>(B]
+ *		wordFunc( )
+ * [$BI=Bj(B]
+ *              $BC18lEPO?;~$N%$%Y%s%H=hM}(B
+ * [$B8F=P7A<0(B]
+ *      int wordFunc( _XatokRecPtr acomm,  menuAux *mAux, 
+ *			WORD *aajcode, int *op )
+ *
+ * [$B0z?t(B]
+ *              $B7?(B           : $BL>(B   $B>N(B  : I/O : $B@b(B      $BL@(B
+ *		_XatokRecPtr : acomm    : i/o : kinput2$BMQJQ49%P%C%U%!(B
+ *		menuAux      : *mAux    : i   :  $B8=:_I=<($7$F$$$k(BMENU
+ *		WORD         : *aajcode : i/o : $BF~NO$5$l$?J8;z(B
+ *		int          : *op      :   o : MENU OPERATION
+ *
+ *
+ * [$BJV$jCM(B]
+ *		0 : key $BF~NO$r%(%s%8%s$KAw$i$J$$!#(B
+ *		1 : key$BF~NO$r%(%s%8%s$KAw$k!#(B
+ *
+ * [$B;HMQ4X?t(B]
+ *		atokModeSet( )
+ *		atokWordRegister( )
+ *		atokWordStyleList( )
+ * [$B5!G=(B]
+ *		$BC18lEPO?MQ$N(BAUX WINDOW$BI=<(;~$N%$%Y%s%H4IM}$r9T$J$&!#(B
+ *		$BC18lEPO?;~$O!"C18lI=5-F~NO!"FI$_F~NO!"IJ;lA*Br!"=hM}3NG'(B
+ *		$B=hM}7k2LI=<($N%b!<%I$,B8:_$9$k!#(B
+ *		$B3F%b!<%I$K$*$$$F!"F~NO$G$-$kJ8;zBN7O$r@_Dj$9$k!#(B
+ *		CTR$B%-!<$J$I$N@)8f%-!<$NA`:n$b9T$J$&!#(B
+ */
+int wordFunc(acomm, mAux, aajcode, op)
+_XatokRecPtr    acomm;
+menuAux		*mAux;
+WORD		*aajcode;
+int		*op;
+{
+	ATOKDEHINSTR	*hptr ;
+	char		euc[BUFSIZ] ;
+	int		i ;
+	int		pgMax = CAND_ROWS * CAND_COLS ;
+	int		status ;
+
+	char	*pp ;
+#ifdef	ATOK_DEBUG
+printf( "WORD FUNC OK (%x) word_mode (%d)\n", *aajcode, acomm->word_mode ) ;
+printf( "word_strLen  %d, word_yomiLen %d\n", 
+		acomm->word_strLen, acomm->word_yomiLen ) ;
+#endif	/* ATOK_DEBUG */
+	if ( *aajcode == CTR_H ) 	*aajcode = BS ;
+
+	/*
+	 * $BL$3NDjJ8;z$,L5$$;~$K@)8f%-!<$rF~NO$5$l$?>l9g$K$O(B
+	 * $B%*%Z%l!<%7%g%s$rL58z$K$9$k!#(B
+	 */
+	if ( !acomm->echoLen  && 
+		(( *aajcode & CTRL ) || *aajcode == DEL )) {
+		return 0 ;
+	}
+	/*
+	 * $BC18lEPO?<B;\Cf$K(B $B%3!<%IF~NO$J$I$N#A#U#X%&%#%s%I%&$O(B
+	 * $BI=<($G$-$J$$$N$G%*%Z%l!<%7%g%s$rL58z$K$9$k!#(B
+	 */
+	if ( *aajcode == F10 ) {
+		return 0 ;
+	}
+	/*
+	 * $BC18lF~NO;~$N#O#P(B
+	 */
+	if ( acomm->word_mode == W_WORD ) {
+		if ( *aajcode == CR && acomm->echoLen == 0 ) {
+			if ( acomm->word_strLen ) {
+				atokModeSet( acomm, IME_PRV_SETKOTEMODE, 0x0001 ) ;
+				acomm->word_mode <<= 1 ;
+				return 0 ;
+			}
+			return 0 ;
+		}
+		else if ( *aajcode == BS && !acomm->echoLen ) {
+			if (  acomm->word_strLen ) {
+				acomm->word_strLen-- ;
+			}
+			else {
+				*op  = OP_CANCEL ; 
+			}
+			return 0 ;
+		}
+
+		else if ( *aajcode == EESC ) {
+			if ( !( acomm->convStatus & M_CAND )) {	/* 616 */
+				*op = OP_CANCEL ;
+			}
+			/*
+			 * $BL$3NDjJ8;zNs$,$"$k;~$O!"L$3NDj%P%C%U%!$r%/%j%"$9$k(B
+			 */
+			if ( acomm->echoLen  ) {
+				acomm->echoLen = 0 ;
+				*aajcode = EESC ;
+				return 1 ;
+			}
+			return 0 ;
+		}
+		else if ((( *aajcode & CTRL ) && !acomm->echoLen ) 
+			|| *aajcode == TAB ){
+			return 0 ;
+		}
+		return 1 ;
+	}
+	/*
+	 * $BFI$_F~NO;~$N(BOP
+	 */
+	else if ( acomm->word_mode == W_YOMI ) {
+		if ( *aajcode == CR  && acomm->echoLen == 0 ) {
+			if ( acomm->word_yomiLen ) {
+				atokModeSet( acomm, IME_PRV_SETKOTEMODE, 0x0000 ) ;
+				acomm->word_mode <<= 1 ;
+				acomm->convStatus |= M_CAND ;
+				atokWordStyleList( acomm ) ;
+				*aajcode = XFER ;
+				return 0 ;
+			}
+			return 0 ;
+		}
+		else if ( *aajcode == BS && !acomm->echoLen ) {
+			if (  acomm->word_yomiLen ) {
+				acomm->word_yomiLen-- ;
+			}
+			else {
+				atokModeSet( acomm, IME_PRV_SETKOTEMODE, 0x0000 ) ;
+				acomm->word_mode >>= 1 ;
+			}
+			return 0 ;
+		}
+		else if ((( *aajcode & CTRL ) && !acomm->echoLen ) 
+			|| *aajcode == TAB ){
+			return 0 ;
+		}
+		else if ( *aajcode == EESC ) {
+			atokModeSet( acomm, IME_PRV_SETKOTEMODE, 0x0000 ) ;
+			/* acomm->word_mode >>= 1 ; */
+			*op = OP_CANCEL ;
+			return 0 ;
+		}
+		return 1 ;
+	}
+	/*
+	 * $BIJ;l$rA*BrCf$N(BOP
+	 */
+	else if ( acomm->word_mode == W_HINSHI ) {
+		if ( *aajcode > '0' && *aajcode <= '9' ) {
+			acomm->kohoPos = *aajcode - '1' ;
+			 *aajcode = CR ;
+		}
+		if ( *aajcode == CR ) {
+			acomm->word_hinshi = acomm->kohoCurPage * pgMax + acomm->kohoPos + 1 ;
+			acomm->word_mode <<= 1 ;
+		}
+		else if ( *aajcode == CTR_G ||
+			*aajcode == EESC ) {
+			acomm->word_mode >>= 1 ;
+		}
+		return 0 ;
+	}
+	/*
+	 * $BEPO?3NG'$N%@%$%"%m%0I=<(Cf$N(BOP
+	 */
+	else if ( acomm->word_mode == W_YORN ) {
+		if ( *aajcode == 'y' || *aajcode == 'Y'  ) {
+			acomm->word_str[acomm->word_strLen] = 0x00 ;
+			acomm->word_str[acomm->word_strLen+1] = 0x00 ;
+
+			acomm->wordStatus = atokWordRegister(
+				acomm,
+				acomm->word_str,
+				acomm->word_strLen,
+				acomm->word_yomi,
+				acomm->word_yomiLen,
+				acomm->word_hinshi ) ;
+			acomm->word_mode <<= 1 ;
+			/* *op  = OP_CANCEL ; */
+		}
+		else if ( *aajcode == 'n' || *aajcode == 'N' || *aajcode == BS ) {
+			atokWordStyleList( acomm ) ;
+			acomm->convStatus |= M_CAND ;
+			acomm->word_mode >>= 1 ;
+			*aajcode = XFER ;
+		}
+		else if ( *aajcode == EESC ) {
+			acomm->word_mode = 0 ;
+			*op = OP_CANCEL ;
+		}
+		return 0 ;
+	}
+	/*
+	 * $BEPO?7k2LI=<(Cf$N(BOP
+	 */
+	else if ( acomm->word_mode == W_RESULT ) {
+		if ( *aajcode == CR || *aajcode == EESC ) {
+			acomm->word_mode = 0 ;
+			*op = OP_CANCEL ;
+		}
+		return 0 ;
+	}
+	return 0 ;
+		
+#ifdef	ATOK_DEBUG
+	printf( "WORD STR [%s]\n", pp ) ;
+#endif	/* ATOK_DEBUG */
+}
+
+/* Page */
+/*
+ * [$B4X?tL>(B]
+ *		wordEndFunc( )
+ * [$BI=Bj(B]
+ *              $BC18lEPO?%a%K%e!<$N8e=hM}(B
+ * [$B8F=P7A<0(B]
+ *	int	wordEndFunc( _XatokRecPtr  acomm )
+ *
+ * [$B0z?t(B]
+ *              $B7?(B           : $BL>(B  $B>N(B  : I O : $B@b(B      $BL@(B
+ *		_XatokRecPtr : acomm   : i/o : kinput2$BMQJQ49%P%C%U%!(B
+ *
+ * [$BJV$jCM(B]
+ *		1 : $B>o$K#1(B
+ *
+ * [$B;HMQ4X?t(B]
+ *		$B$J$7(B
+ * [$B5!G=(B]
+ *		$BC18lEPO?%a%K%e!<$r:o=|$9$k0Y$K!"%G!<%?$N8e=hM}$r9T$J$&!#(B
+ *		
+ */
+int wordEndFunc(acomm)
+_XatokRecPtr    acomm;
+{
+
+	/* printf( "wordEndFunc\n" ) ; */
+	return 1 ;
+}
+/*
+ * Str
+ * $BC18lEPO?(B : $BC18l(B [XXXXX] $BFI$_(B [XXXX] $BIJ;l(B :
+ */
+/* Page */
+/*
+ * [$B4X?tL>(B]
+ *		wordStringFunc( )
+ * [$BI=Bj(B]
+ *              $BC18lEPO?%a%K%e!<$NJ8;zNs:n@.(B
+ * [$B8F=P7A<0(B]
+ *	int	wordStringFunc( _XatokRecPtr  acomm, menuAux *mAux,
+ *			wchar *echoStr, int *echoLen, int *revLen,
+ *			int *revPos )
+ *
+ * [$B0z?t(B]
+ *              $B7?(B           : $BL>(B  $B>N(B  : I O : $B@b(B      $BL@(B
+ *		_XatokRecPtr : acomm   : i/o : kinput2$BMQJQ49%P%C%U%!(B
+ *		menuAux      : *mAux   : i  : $B8=:_$N(B MENU CLASS
+ *		wchar        : *echoStr:   o : $BI=<(J8;zNs3JG<NN0h(B
+ *		int          : *echoLen :  o : $BI=<(J8;zNs$ND9$5(B
+ *		int          : *revLen :   o : $BI=<(J8;zNs$NH?E>$ND9$5(B
+ *		int          : *revPos :   o : $BI=<(J8;z%F%k$NH?E>$N3+;O0LCV(B
+ *
+ * [$BJV$jCM(B]
+ *		$BI=<(J8;zNs$ND9$5(B
+ *
+ * [$B;HMQ4X?t(B]
+ *		euc2wcs( )
+ *		s2e( )
+ * [$B5!G=(B]
+ *		$BC18lEPO?%a%K%e!<$rI=<(;~$NI=<(MQ$NJ8;zNs$r:n@.$9$k!#(B
+ *		$BI=5-F~NO;~$O!"I=5-3NDjJ8;zNs$HL$3NDjJ8;zNs!"(B
+ *		$B$h$_F~NO;~$O!"I=5-3NDjJ8;zNs$H!"$h$_3NDjJ8;zNs!"$h$_L$3NDjJ8;zNs(B
+ *		$BIJ;lA*Br;~$O!"FI$_F~NO;~$HF1$8!"(B
+ *		$BEPO?3NG';~$O!"I=5-3NDjJ8;zNs(B,$B$h$_J8;zNs!"IJ;l(B
+ *		$BEPO?40N;;~$O!"%9%F!<%?%9J8;zNs(B
+ *		$B$r:n@.$9$k!#(B
+ */
+int wordStringFunc(acomm, mAux, echoStr, echoLen, revLen, revPos)
+_XatokRecPtr    acomm;
+menuAux		*mAux;
+wchar		*echoStr;
+int		*echoLen;
+int		*revLen;
+int		*revPos;
+{
+	char	tbuf[BUFSIZ*2] ;
+	int	len ;
+	int	n ;
+	int	i, j, k, es ;
+	char	*ep ;
+	int		status ;
+	int	c ;
+
+	*revPos = 0 ;
+	*revLen = 0 ;
+
+	ep = tbuf ;
+	if ( mAux->str ) {
+		strcpy( ep, mAux->str ) ;
+		ep += strlen( ep ) ;
+	}
+#ifdef	ATOK_DEBUG
+printf(  "WORD MODE %d\n", acomm->word_mode );
+	printf( "  \303\261\270\354 [%s"/*=  $BC18l(B [%s=*/, acomm->word_str ) ;
+printf( "\303\261\270\354\263\316\304\352\272\321\312\270\273\372\316\363(%d) [%s]\n"/*=$BC18l3NDj:QJ8;zNs(B(%d) [%s]\n=*/, acomm->word_strLen, acomm->word_str ) ;
+printf( "\303\261\270\354  \263\316\304\352\244\267\244\277\312\270\273\372\316\363(%d) [%s]\n"/*=$BC18l(B  $B3NDj$7$?J8;zNs(B(%d) [%s]\n=*/, acomm->wlen, acomm->wbuf ) ;
+printf( "\303\261\270\354 \314\244\263\316\304\352\312\270\273\372\316\363[%s]\n"/*=$BC18l(B $BL$3NDjJ8;zNs(B[%s]\n=*/, acomm->echoStr ) ;
+for( i = 0 ; i < acomm->echoLen ; i++ ) {
+	printf( "%x ", acomm->echoStr[i] ) ;
+}
+printf( "\n" );
+#endif	/* ATOK_DEBUG */
+
+
+	/*
+	 * $BC18lEPO?$N%,%$%I$r@_Dj(B
+	 */
+	sprintf( ep, "  \303\261\270\354 ["/*=  $BC18l(B [=*/ ) ;
+	es = strlen( tbuf ) ;
+	len = euc2wcs( tbuf, es, echoStr ) ;
+	for( i = 0 ; i < acomm->word_strLen ; i++ ) {
+		echoStr[len++] = acomm->word_str[i] ;
+	}
+	/*
+	 * $BC18lF~NOCf$NI=<((B
+	 */
+	if (  acomm->word_mode == W_WORD ) {
+		/* 
+		 * $B:#2s$NF~NO$G3NDj$7$?J8;zNs$,$"$k>l9g$K$O!"(B
+		 * $B3NDjC18lJ8;zNs$H$7$F@_Dj$9$k!#(B
+		 */
+		for( i = 0 ; i < acomm->wlen ; i++ ) {
+			if ( acomm->word_strLen+i >= WORD_HYOKI_MAX ) {
+				/* printf( "$BC18l$,$J$,$9$.$k!#(B(%d)\n", i ) ; */
+				break ;
+			}
+			acomm->word_str[acomm->word_strLen+i] = acomm->wbuf[i] ;
+			echoStr[len++] = acomm->word_str[acomm->word_strLen+i] ;
+/* printf( "0x%x ", acomm->wbuf[i] ) ; */
+		}
+/* printf( "\n" ) ; */
+		acomm->word_strLen += i ;
+		acomm->word_str[acomm->word_strLen] = 0x00 ;
+		/*
+		 * $BL$3NDjJ8;zNs$r@_Dj(B
+		 */
+		if ( acomm->echoLen > 0 ) {
+			*revPos = len + acomm->revPos ;
+			*revLen = acomm->revLen ;
+			for( i = 0 ; i < acomm->echoLen ; i++ ) {
+				echoStr[len++] = acomm->echoStr[i] ;
+			}
+		}
+		else { 
+			*revPos = len ;
+			*revLen = 1 ;
+		}
+	}
+	n = euc2wcs( "]", 1, &echoStr[len] ) ;
+	len += n ;
+	*echoLen = len ;
+	if ( acomm->word_mode < W_YOMI ) {
+		return ;
+	}
+	sprintf( tbuf, "  \306\311\244\337 ["/*=  $BFI$_(B [=*/ ) ;
+	es = strlen( tbuf ) ;
+	n = euc2wcs( tbuf, es, &echoStr[len] ) ;
+	len += n ;
+
+	/*
+	 * $B$h$_$N$J$,$5$O(B $B4A;z$H(BANK$B$G$O(B $BF1$8$G$"$k!#(B
+	 */
+	for( i = 0 ; i < acomm->word_yomiLen ; i++ ) {
+		echoStr[len++] = acomm->word_yomi[i] ;
+	}
+	if ( acomm->word_mode == W_YOMI ) {
+		/* 
+		 * $B:#2s$NF~NO$G3NDj$7$?J8;zNs$,$"$k>l9g$K$O!"(B
+		 * $B3NDjC18lJ8;zNs$H$7$F@_Dj$9$k!#(B
+		 */
+		for( i = 0 ; i < acomm->wlen ; i++ ) {
+			if ( acomm->word_yomiLen+i >= WORD_YOMI_MAX ) {
+				/* printf( "$B$h$_$,$J$,$9$.$k!#(B(%d)\n", i ) ; */
+				break ;
+			}
+			acomm->word_yomi[acomm->word_yomiLen+i] = acomm->wbuf[i] ;
+			echoStr[len++] = acomm->word_yomi[acomm->word_yomiLen+i] ;
+		}
+		acomm->word_yomiLen += i ;
+		/*
+		 * $BL$3NDjJ8;zNs$r@_Dj(B
+		 */
+		if ( acomm->echoLen > 0 ) {
+			*revPos = len + acomm->revPos ;
+			*revLen = acomm->revLen ;
+			for( i = 0 ; i < acomm->echoLen ; i++ ) {
+				echoStr[len++] = acomm->echoStr[i] ;
+			}
+		}
+		else { 
+			*revPos = len ;
+			*revLen = 1 ;
+		}
+	}
+
+	n = euc2wcs( "]", 1, &echoStr[len] ) ;
+	len += n ;
+
+	*echoLen = len ;
+	if ( acomm->word_mode < W_HINSHI ) {
+		return len ;
+	}
+	if ( acomm->word_mode > W_HINSHI ) {
+		sprintf( tbuf, "  \311\312\273\354  ["/*=  $BIJ;l(B  [=*/ ) ;
+		es = strlen( tbuf ) ;
+		n = euc2wcs( tbuf, es, &echoStr[len] ) ;
+		len += n ;
+
+		s2e( acomm->hinsiPtr[acomm->word_hinshi-1].szHinsiStr, 
+			strlen( acomm->hinsiPtr[acomm->word_hinshi-1].szHinsiStr ),
+			tbuf, sizeof( tbuf )) ;
+
+		es = strlen( tbuf ) ;
+		n = euc2wcs( tbuf, es, &echoStr[len] ) ;
+		len += n ;
+			
+		sprintf( tbuf, "] \244\350\244\355\244\267\244\244\244\307\244\271\244\253 [y/n]"/*=] $B$h$m$7$$$G$9$+(B [y/n]=*/, tbuf ) ;
+		es = strlen( tbuf ) ;
+		n = euc2wcs( tbuf, es, &echoStr[len] ) ;
+		len += n ;
+
+		*revPos = len - 1 ;
+		*revLen = 1 ;
+	}
+	if ( acomm->word_mode == W_RESULT ) {
+		switch( acomm->wordStatus ) {
+			case 0 :
+				sprintf( tbuf, "\305\320\317\277\275\252\316\273\244\267\244\336\244\267\244\277\241\243"/*=$BEPO?=*N;$7$^$7$?!#(B=*/ ) ;
+				break ;
+			case 1 :
+				sprintf( tbuf, "\244\263\244\316\306\311\244\337\244\307\244\317\244\263\244\354\260\312\276\345\305\320\317\277\244\307\244\255\244\336\244\273\244\363\241\243"/*=$B$3$NFI$_$G$O$3$l0J>eEPO?$G$-$^$;$s!#(B=*/ ) ;
+				break ;
+			case 2 :
+				sprintf( tbuf, "\244\263\244\354\260\312\276\345\305\320\317\277\244\307\244\255\244\336\244\273\244\363\241\243"/*=$B$3$l0J>eEPO?$G$-$^$;$s!#(B=*/ ) ;
+				break ;
+			case 3 :
+				sprintf( tbuf, "\274\255\275\361\300\337\304\352\244\254\311\324\305\254\300\332\244\307\244\271\241\243"/*=$B<-=q@_Dj$,ITE,@Z$G$9!#(B=*/ ) ;
+				break ;
+			case 4 :
+				sprintf( tbuf, "\303\261\270\354\244\313\311\324\305\254\300\332\244\312\312\270\273\372\244\254\264\336\244\336\244\354\244\306\244\244\244\336\244\271\241\243"/*=$BC18l$KITE,@Z$JJ8;z$,4^$^$l$F$$$^$9!#(B=*/ ) ;
+				break ;
+			case 5 :
+				sprintf( tbuf, "\305\320\317\277\244\307\244\255\244\336\244\273\244\363\241\243"/*=$BEPO?$G$-$^$;$s!#(B=*/ ) ;
+				break ;
+			case 6 :
+				sprintf( tbuf, "\306\311\244\337\244\313\311\324\305\254\300\332\244\312\312\270\273\372\244\254\264\336\244\336\244\354\244\306\244\244\244\336\244\271\241\243"/*=$BFI$_$KITE,@Z$JJ8;z$,4^$^$l$F$$$^$9!#(B=*/ ) ;
+				break ;
+			case 7 :
+				sprintf( tbuf, "\264\373\244\313\305\320\317\277\244\265\244\354\244\306\244\244\244\336\244\271\241\243"/*=$B4{$KEPO?$5$l$F$$$^$9!#(B=*/ ) ;
+				break ;
+			default:
+				sprintf( tbuf, "\303\261\270\354\305\320\317\277\244\313\274\272\307\324\244\267\244\336\244\267\244\277\241\243"/*=$BC18lEPO?$K<:GT$7$^$7$?!#(B=*/ ) ;
+				break;
+		}
+		strcat( tbuf, " " ) ;
+		es = strlen( tbuf ) ;
+		n = euc2wcs( tbuf, es, echoStr ) ;
+		len = n ;
+		*revPos = len - 1 ;
+		*revLen = 1 ;
+	}
+	*echoLen = len ;
+
+#ifdef	ATOK_DEBUG
+printf( "\303\261\270\354 EUC STR [%s]\n"/*=$BC18l(B EUC STR [%s]\n=*/, tbuf ) ;
+#endif	/* ATOK_DEBUG */
+	return len ;
+}
+
+
+#define	OFF	0
+#define	ON	1
+#define	itemSize( item )	sizeof( item ) / sizeof( item[0] )
+
+/*
+ * $BC18lEPO?(B
+ */
+menuItem	auxWordRegItem[] = {
+	  { CTR_G,   OFF, OP_CANCEL, NULL, NULL, NULL } 
+} ;
+menuAux		auxWordRegMenu[] = {
+	M_WORD, -1, 
+		wordStartFunc,
+		wordFunc,
+		NULL, 
+		wordStringFunc,
+		"\303\261\270\354\305\320\317\277\241\247"/*=$BC18lEPO?!'(B=*/, NULL,
+		auxWordRegItem, itemSize( auxWordRegItem ) 
+} ;
+
+#define	REVERSE		printf( "\033[7m" )
+#define	NORMAL		printf( "\033[m" )
+
+menuAux	*getMenuInstance( )
+{
+	return auxWordRegMenu ;
+}
+
+/* Page */
+/*
+ * [$B4X?tL>(B]
+ *		menuPrevOn( )
+ * [$BI=Bj(B]
+ *              $B%a%K%e!<9`L\$N0\F0(B
+ * [$B8F=P7A<0(B]
+ *	int	menuPrevOn( int cur, int mode, menuAux *mAux )
+ *
+ * [$B0z?t(B]
+ *              $B7?(B           : $BL>(B  $B>N(B  : I O : $B@b(B      $BL@(B
+ *		int          : cur    : i    : $B8=:_$N9`L\(B
+ *		int          : mode   : i    : $B0\F0%b!<%I(B
+ *		menuAux      : *mAux  : i  : $B8=:_$N%a%K%e!<%G!<%?(B
+ *
+ * [$BJV$jCM(B]
+ *		$B0\F08e$N9`L\HV9f(B
+ *
+ * [$B;HMQ4X?t(B]
+ *		$B$J$7(B
+ * [$B5!G=(B]
+ *		mode $B$,#0$N;~$O!"8=:_A*Br$5$l$F$$$k9`L\$h$j#1$DA0$N(B
+ *		$BA*Br2DG=$J9`L\$rC5$9!#(B
+ *		mode $B$,#1$N;~$O!"8=:_$N%a%K%e!<$G#1HV8e$m$NA*Br2DG=$J(B
+ *		$B9`L\$rC5$9!#(B
+ *		$BA*Br2DG=$J9`L\$H$O(Bitem $B$N(B mode $B$,(BON$B$N;~$G$"$k!#(B
+ */
+int menuPrevOn(cur, mode, mAux)
+int	cur;
+int	mode;
+menuAux	*mAux;
+{
+	register	menuItem	*item ;
+	int		last = -1 ;
+	int		target = -1 ;
+	int		i ;
+
+	item = &( mAux->items[mAux->nitems-1] ) ;
+	for( i = mAux->nitems - 1 ; i >= 0 ; i-- ) {
+#ifdef	ATOK_DEBUG
+		printf( "item->mode = (%s) %s\n", 
+			item->itemStr ?  item->itemStr : "NULL", 
+			item->mode == ON ? "ON" : "OFF" ) ;
+#endif	/* ATOK_DEBUG */
+		if ( item->mode == ON ) {
+			if ( last == -1 ) {
+				last = i ;
+				if ( mode ) {
+					/* printf( "LAST FOUND %d\n", last ); */
+					return last ;
+				}
+			}
+			if ( target == -1 && i < cur ) {
+				target = i ;
+			}
+		}
+		item-- ;
+	}
+	if ( target == -1 ) {
+		target = last ;
+	}
+
+	return target ;
+}
+
+/* Page */
+/*
+ * [$B4X?tL>(B]
+ *		menuNextOn( )
+ * [$BI=Bj(B]
+ *              $B%a%K%e!<9`L\$N0\F0(B
+ * [$B8F=P7A<0(B]
+ *	int	menuNextOn( int cur, int mode, menuAux *mAux )
+ *
+ * [$B0z?t(B]
+ *              $B7?(B           : $BL>(B  $B>N(B  : I O : $B@b(B      $BL@(B
+ *		int          : cur    : i    : $B8=:_$N9`L\(B
+ *		int          : mode   : i    : $B0\F0%b!<%I(B
+ *		menuAux      : *mAux : i  : $B8=:_$N%a%K%e!<%G!<%?(B
+ *
+ * [$BJV$jCM(B]
+ *		$B0\F08e$N9`L\HV9f(B
+ *
+ * [$B;HMQ4X?t(B]
+ *		$B$J$7(B
+ * [$B5!G=(B]
+ *		mode $B$,#0$N;~$O!"8=:_A*Br$5$l$F$$$k9`L\$h$j#1$D8e$m$N(B
+ *		$BA*Br2DG=$J9`L\$rC5$9!#(B
+ *		mode $B$,#1$N;~$O!"8=:_$N%a%K%e!<$G@hF,$NA*Br2DG=$J(B
+ *		$B9`L\$rC5$9!#(B
+ *		$BA*Br2DG=$J9`L\$H$O(Bitem $B$N(B mode $B$,(BON$B$N;~$G$"$k!#(B
+ */
+int menuNextOn(cur, mode, mAux)
+int	cur;
+int	mode;
+menuAux	*mAux;
+{
+	register menuItem	*item ;
+	int	first = -1 ;
+	int	target = -1 ;
+	int	i ;
+
+	item = mAux->items ;
+	for( i = 0 ; i < mAux->nitems ; i++ ) {
+		if ( item->mode == ON ) {
+			if ( first == -1 ) {
+				first = i ;
+				if ( mode ) {
+					return first ;
+				}
+			}
+			if ( target == -1 && i > cur ) {
+				target = i ;
+			}
+		}
+		item++ ;
+	}
+	if ( target == -1 ) {
+		target = first ;
+	}
+
+	return target ;
+}
+
+/* Page */
+/*
+ * [$B4X?tL>(B]
+ *		menuKey( )
+ * [$BI=Bj(B]
+ *              $B%a%K%e!<FbM-8z%-!<$N%A%'%C%/(B
+ * [$B8F=P7A<0(B]
+ *		int	menuKey( menuAux *mAux, WORD key, int *cur )
+ *
+ * [$B0z?t(B]
+ *              $B7?(B           : $BL>(B  $B>N(B  : I O : $B@b(B      $BL@(B
+ *		menuAux      : *mAux : i  : $B8=:_$N%a%K%e!<%G!<%?(B
+ *		WORD         : key      : i  : $BF~NO$5$l$?%-!<(B
+ *		int          : *cur    :   o    : $BA*Br$5$l$?9`L\(B
+ *
+ * [$BJV$jCM(B]
+ *		0 : $B9`L\$OA*Br$5$l$F$$$J$$!#(B 
+ *		$B$=$NB>(B: $BA*Br$5$l$?9`L\$N%"%I%l%9(B
+ *
+ * [$B;HMQ4X?t(B]
+ *		$B$J$7(B
+ * [$B5!G=(B]
+ *		$B;XDj$5$l$?%-!<$,!"(B $B8=:_I=<($7$F$$$k%a%K%e!<$h$j!"(B
+ *		$B9`L\$rA*Br$9$k$?$a$NM-8z%-!<$+%A%'%C%/$7!"(B
+ *		$BM-8z%-!<N)$C$?>l9g$K$O!"9`L\$,A*Br$5$l$?J*$H$7!"(B
+ *		$B$=$N9`L\HV9f$r@_Dj$7!"9`L\$N%"%I%l%9$rJV$9!#(B
+ */
+menuItem *menuKey(mAux, key, cur)
+menuAux	*mAux;
+WORD	key;
+int	*cur;
+{
+	register menuItem	*item ;
+	register int		i ;
+
+	*cur = 0 ;
+	item = mAux->items ;
+	for ( i = 0 ; i < mAux->nitems ; i++ ) {
+		/*
+		printf( "Check Keys for '%s'\n",
+			item->itemStr ?  item->itemStr : "NULL" ) ;
+		*/
+		if ( item->key == key ) {
+		/* printf( "found\n" ) ; */
+			*cur = i ;
+			return item ;
+		}
+		item++ ;
+	}
+	/* printf( "not found\n" ) ; */
+	return ( menuItem * )NULL ;
+}
+
+/* Page */
+/*
+ * [$B4X?tL>(B]
+ *		MenuCtrl( )
+ * [$BI=Bj(B]
+ *              $B%a%K%e!<I=<(;~$N%$%Y%s%H%3%s%H%m!<%k(B
+ * [$B8F=P7A<0(B]
+ *		int	MenuCtrl( _XatokRecPtr acomm, menuAux **curMenu,
+ *			WORD *aajcode, int op, int *length )
+ * [$B0z?t(B]
+ *              $B7?(B           : $BL>(B  $B>N(B  : I O : $B@b(B      $BL@(B
+ *		_XatokRecPtr : acomm   : i/o : kinput2$BMQJQ49%P%C%U%!(B
+ *		menuAux      : **curMenu : i/o : $B8=:_$N%a%K%e!<%G!<%?(B
+ *		WORD         : *aajcode : i/o : $BF~NO$5$l$?(BAAJCODE
+ *		int          : op       : i   : $B3+;O%U%!%s%/%7%g%s$N8F$S=P$7(B
+ *		int          : *length  : o   : $BF~NOJ8;zNs$ND9$5(B
+ *
+ * [$BJV$jCM(B]
+ *		0 : $B%a%K%e!<$NJQ99L5$7(B
+ *		1 : $B%a%K%e!<=hM}%-%c%s%;%k(B
+ *		2 : $B%a%K%e!<A*Br9`L\$N=hM}7hDj(B
+ *
+ * [$B;HMQ4X?t(B]
+ *		menuAux->startProc( )
+ *		menuAux->defaultProc( )
+ *		menuAux->endProc( )
+ *		menuNextOn( )
+ *		menuPrevOn( )
+ * [$B5!G=(B]
+ *		AUX$B%&%#%s%I%&$K%a%K%e!<$,I=<($5$l$F$$$k;~$N(B
+ *		$B%$%Y%s%H4IM}$r9T$J$&!#(B
+ *		$B%$%Y%s%H$K$h$j!"I=<($7$F$$$k%a%K%e!<%G!<%?$N(B
+ *		$B@ZBX$($d!"(BAUX$B%&%#%s%I%&$N=*N;$r9T$J$&!#(B
+ */
+int MenuCtrl(acomm, curMenu, aajcode, op, length)
+_XatokRecPtr    acomm;
+menuAux		**curMenu;
+WORD		*aajcode;
+int		op;
+int		*length;
+{
+
+	menuItem	*target ;
+	menuItem	sel ;
+	int		newNbr ;
+	int		changes =-1 ;
+	int		cur ;
+
+	*length = 0 ;
+	if ( op ) {	/* Start Proc */
+		if (( *curMenu  )->startProc ) {
+			( *curMenu )->startProc( acomm ) ;
+		}
+		return ;
+	}
+
+	target = menuKey( *curMenu, *aajcode, &newNbr ) ;
+	/*
+	 * $B>e0L$G(BDEFAULT PROC$B$r<B9T$9$k!#(B
+	 */
+	if ( !target ) {
+#ifdef	ATOK_DEBUG
+		printf( "AUX DEFAULT FUNC\n" ) ;
+#endif	/* ATOK_DEBUG */
+
+		if (( *curMenu )->defaultProc ) {
+			sel.op = 0 ;
+			*length = ( *curMenu )->defaultProc( acomm, *curMenu, aajcode, &sel.op ) ;
+			if ( sel.op ) {
+				target = &sel ;
+				goto menu_op ;
+			}
+#ifdef	ATOK_DEBUG
+		printf( "\274\302\271\324\n"/*=$B<B9T(B\n=*/ ) ;
+#endif	/* ATOK_DEBUG */
+		}
+		else {
+#ifdef	ATOK_DEBUG
+			printf( "\244\312\244\267\n"/*=$B$J$7(B\n=*/ ) ;
+#endif	/* ATOK_DEBUG */
+		}
+		return -1 ;
+	}
+	/*
+	 *  $BI=<($7$F$$$k%a%K%e!<$h$j!"A*Br$7$F$$$k$b$N$,JQ$o$C$?!#(B
+	 */
+menu_op :
+	switch( target->op ) {
+		case OP_NEXT :
+			( *curMenu )->cur = menuNextOn(( *curMenu )->cur, 0, *curMenu ) ;
+			changes = 0 ;
+			break ;
+		case OP_FIRST :
+			( *curMenu )->cur = menuNextOn(( *curMenu )->cur, 1, *curMenu ) ;
+			changes = 0 ;
+			break ;
+		case OP_PREV :
+			( *curMenu )->cur = menuPrevOn(( *curMenu )->cur, 0, *curMenu ) ;
+			changes = 0 ;
+			break ;
+		case OP_LAST :
+			( *curMenu )->cur = menuPrevOn(( *curMenu )->cur, 1, *curMenu ) ;
+			changes = 0 ;
+			break ;
+		case OP_SPEC :
+			/*
+			 * $B;XDj$7$?HV9f(B
+			 */
+			( *curMenu )->cur = newNbr ;
+			changes = 0 ;
+			break ;
+		case OP_CANCEL :
+			/*
+			 * $B%-%c%s%;%k$,2!$5$l$?$N$G>e0L%a%K%e!<$X(B
+			 */
+			if (( *curMenu )->endProc ) {
+				( *curMenu )->endProc( acomm ) ;
+			}
+			*curMenu = ( *curMenu )->parent ;
+			if ( *curMenu ) {
+				if (( *curMenu )->startProc ) {
+					( *curMenu )->startProc( acomm ) ;
+				}
+			}
+			changes = 1 ;
+			break ;
+		case OP_SELECT :
+			/*
+			 * $B7hDj%-!<$,2!$5$l$?$N$G=hM}<B9T(B
+			 * $B2<0L%a%K%e!<$,$"$l$P!"%a%K%e!<JQ99(B
+			 */
+			cur = ( *curMenu )->cur ;
+			if (( *curMenu )->items[cur].child ) {
+				( *curMenu )->items[cur].child->parent = ( *curMenu ) ;
+				*curMenu = ( *curMenu )->items[cur].child ;
+				if (( *curMenu )->startProc ) {
+					( *curMenu )->startProc( acomm, *aajcode ) ;
+				}
+			}
+			changes = 2 ;
+			break ;
+		default :
+			changes = 0 ;
+			break ;
+	}
+
+	return changes ;
+}
+
+
+/* Page */
+/*
+ * [$B4X?tL>(B]
+ *		auxMenuCopy( )
+ * [$BI=Bj(B]
+ *              $B%a%K%e!<%G!<%?$N%3%T!<(B
+ * [$B8F=P7A<0(B]
+ *		menuAux *auxMenuCopy( menuAux *orgAux )
+ *
+ * [$B0z?t(B]
+ *              $B7?(B           : $BL>(B  $B>N(B  : I O : $B@b(B      $BL@(B
+ *		menuAux      : *orgAux : i   : $B%3%T!<85%a%K%e!<%G!<%?(B
+ *
+ * [$BJV$jCM(B]
+ *		$B%3%T!<$7$?%a%K%e!<%G!<%?(B
+ *
+ * [$B;HMQ4X?t(B]
+ *		auxMenuCopy( )
+ * [$B5!G=(B]
+ *		$B;XDj$5$l$?%a%K%e!<%G!<%?$r?75,%P%C%U%!$K%3%T!<$7$F(B
+ *		$B$=$N%"%I%l%9$rJV$9!#(B
+ */
+menuAux	*auxMenuCopy(orgAux)
+menuAux	*orgAux;
+{
+	menuItem	*item ;
+	int		nitem ;
+	int		i ;
+	menuAux		*newAux ;
+
+	newAux = ( menuAux * )malloc( sizeof( menuAux )) ;
+	if ( !newAux )	return 0 ;
+
+	memcpy(( char * )newAux, ( char * )orgAux, sizeof( menuAux )) ;
+
+	item = ( menuItem * )malloc( sizeof( menuItem ) * orgAux->nitems ) ;
+	newAux->items = item ;
+	for( i = 0 ; i < orgAux->nitems ; i++ ) {
+		memcpy(( char * )item, ( char * )&orgAux->items[i], 
+			sizeof( menuItem )) ;
+		if ( item->child ) {
+			item->child = auxMenuCopy( item->child ) ;
+		}
+		item++ ;
+	}
+	return newAux ;
+}
+
+/* Page */
+/*
+ * [$B4X?tL>(B]
+ *		auxMenuString( )
+ * [$BI=Bj(B]
+ *              $B%a%K%e!<I=<(MQJ8;zNs$N:n@.(B
+ * [$B8F=P7A<0(B]
+ *	int	auxMenuString( _XatokRecPtr  acomm, menuAux *mAux,
+ *			wchar *echoStr, int *echoLen, int *revLen,
+ *			int *revPos )
+ *
+ * [$B0z?t(B]
+ *              $B7?(B           : $BL>(B  $B>N(B  : I O : $B@b(B      $BL@(B
+ *		_XatokRecPtr : acomm   : i/o : kinput2$BMQJQ49%P%C%U%!(B
+ *		menuAux      : *mAux : i  : $B8=:_$N(B MENU CLASS
+ *		wchar        : *echoStr:   o : $BI=<(J8;zNs3JG<NN0h(B
+ *		int          : *echoLen :  o : $BI=<(J8;zNs$ND9$5(B
+ *
+ * [$BJV$jCM(B]
+ *		$BI=<(J8;zNs$ND9$5(B
+ *
+ * [$B;HMQ4X?t(B]
+ *		menuAux->stringProc( )
+ *		euc2wcs( )
+ * [$B5!G=(B]
+ *		$B%a%K%e!<$KI=<($9$k$?$a$NJ8;zNs$r:n@.$9$k!#(B
+ *		$B8=:_I=<($7$F$$$k%a%K%e!<$KJ8;zNs$r:n@.$9$k$?$a$N(B
+ *		$B4X?t(B(menuAux->stirngProc)$B$,;XDj$5$l$F$$$k>l9g$K$O!"(B
+ *		$B$=$N4X?t$r8F$S=P$7$F!"J8;zNs$r:n@.$9$k!#(B
+ */
+int auxMenuString(acomm, mAux, echoStr, echoLen, revLen, revPos)
+_XatokRecPtr    acomm;
+menuAux		*mAux;
+wchar		*echoStr;
+int		*echoLen;
+int		*revLen;
+int		*revPos;
+{
+	register menuItem	*item ;
+	char	tbuf[BUFSIZ*2] ;
+	int	len ;
+	int	i, es ;
+	char	*ep ;
+	int		status ;
+
+	item = mAux->items ;
+
+	*revPos = 0 ;
+	*revLen = 0 ;
+	len = 0 ;
+	bzero( tbuf, sizeof( tbuf )) ;
+
+#ifdef	ATOK_DEBUG
+printf( "AUX ADDR (STR) 0x%x\n", mAux ) ;
+#endif	/* ATOK_DEBUG */
+	if ( mAux->stringProc ) {
+#ifdef	ATOK_DEBUG
+	printf( "STRING PROC\n" ) ;
+#endif	/* ATOK_DEBUG */
+		len = ( mAux->stringProc )( acomm, mAux,
+			echoStr, echoLen, revLen, revPos ) ;
+		return len ;
+	}
+	ep = tbuf ;
+	if ( mAux->str ) {
+		strcpy( ep, mAux->str ) ;
+		ep += strlen( ep ) ;
+	}
+
+#ifdef	ATOK_DEBUG
+	printf( "auxMenuString START(%d)\n", mAux->nitems ) ;
+#endif	/* ATOK_DEBUG */
+
+	for( i = 0 ; i < mAux->nitems ; i++ ) {
+
+#ifdef	ATOK_DEBUG
+	printf( "ITEMS %s\n", item->itemStr ? item->itemStr : "NULL" ) ;
+#endif	/* ATOK_DEBUG */
+		if ( item->mode == ON ) {
+			if ( mAux->cur == i ) {
+				es = strlen( tbuf ) ;
+				*revPos = euc2wcs( tbuf, es, echoStr )  ;
+#ifdef	ATOK_DEBUG
+			printf( "SET ECHO POS %d\n", *revPos ) ;
+#endif	/* ATOK_DEBUG */
+
+				len += *revPos ;
+				es = strlen( item->numStr ) ;
+
+				*revLen = euc2wcs( item->numStr, es, 
+						&echoStr[*revPos] ) ;
+				len += *revLen ;
+#ifdef	ATOK_DEBUG
+			printf( "SET ECHO LEN %d\n", *revLen ) ;
+#endif	/* ATOK_DEBUG */
+				ep = tbuf ;
+				sprintf( ep, " %s", item->itemStr ) ;
+				ep += strlen( ep ) ;
+
+				REVERSE ;
+				printf( "%s", item->numStr ) ;
+				NORMAL ;
+				printf( " %s", item->itemStr ) ;
+			}
+			else {
+				sprintf( ep, "%s %s", item->numStr, item->itemStr ) ;
+				ep += strlen( ep ) ;
+
+#ifdef	ATOK_DEBUG
+				printf( "%s", item->numStr ) ;
+				printf( " %s", item->itemStr ) ;
+#endif	/* ATOK_DEBUG */
+			}
+			sprintf( ep, "    " ) ;
+			ep += strlen( ep ) ;
+		}
+		item++ ;
+	}
+
+	if (( es = strlen( tbuf ))) {
+		es = euc2wcs( tbuf, es, &echoStr[*revPos + *revLen] ) ;
+#ifdef	ATOK_DEBUG
+		printf( "STR [%s] set +len = %d\n", tbuf, es ) ;
+#endif	/* ATOK_DEBUG */
+		len += es ;
+	}
+	*echoLen = len ;
+#ifdef	ATOK_DEBUG
+	printf( "len = %d, echoLen = %d\n", len, *echoLen ) ;
+#endif	/* ATOK_DEBUG */
+	return len ;
+}
+
+/*
+ * $B$3$3$+$i2<$O(BDEBUG$BMQ(B
+ */
+
+menuPrint(mAux)
+menuAux	*mAux;
+{
+	int	i ;
+	register menuItem	*item ;
+
+	item = mAux->items ;
+	if ( mAux->str ) {
+		printf( "%s", mAux->str ) ;
+	}
+	for( i = 0 ; i < mAux->nitems ; i++ ) {
+		if ( item->mode == ON ) {
+			if ( mAux->cur == i ) {
+				REVERSE ;
+				printf( "%s", item->numStr ) ;
+				NORMAL ;
+				printf( " %s", item->itemStr ) ;
+			}
+			else {
+				printf( "%s", item->numStr ) ;
+				printf( " %s", item->itemStr ) ;
+			}
+			printf( "    " ) ;
+		}
+		item++ ;
+	}
+	printf( "\n" ) ;
+}
+
+#ifdef	STAND
+void
+main (argc, argv)
+int argc;
+char **argv;
+{
+	
+	char	buf[BUFSIZ] ;
+	menuAux *topMenu ;
+	menuAux *cur ;
+
+	int	status ;
+	int	key ;
+
+	topMenu = auxTopMenu ;
+	cur = topMenu ;
+
+	while( 1 ) {
+		menuPrint( cur ) ;
+		printf( "enter command => " ) ;
+		gets( buf ) ;
+		key = buf[0] ;
+		status = MenuCtrl( &cur, key ) ;
+		if ( status == 1 ) {
+			if ( !cur ) {
+				printf( "Program terminated\n" ) ;
+				exit( 0 ) ;
+			}
+		}
+		else if ( status == 2 ) {
+			printf( "go to Chiled\n" ) ;
+		}
+		else if ( status != 0 ) {
+			switch( cur->mode ) {
+				case M_AUX :
+					printf( "TOP MENU FUNC\n" ) ;
+					break ;
+				case 	M_CODE	:
+					printf( "CODE MENU FUNC\n" ) ;
+					break ;
+				case 	M_CODESJ	:
+					printf( "SJ FUNC\n" ) ;
+					break ;
+				case 	M_CODEEUC	:
+					printf( "EUC FUNC\n" ) ;
+					break ;
+				case 	M_CODEJIS	:
+					printf( "JIS FUNC\n" ) ;
+					break ;
+				case 	M_CODEKUTEN	:
+					printf( "KUTEN FUNC\n" ) ;
+					break ;
+				case 	M_KIGOU		:
+					printf( "KIGOU FUNC\n" ) ;
+					break ;
+				default: 
+					printf( "UNKNOWN\n" ) ;
+					break ;
+			}
+		}
+	}
+}
+
+#endif	STAND
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/Xatoklib/buffer.c	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,337 @@
+/* 
+ * Copyright 1999 Justsystem Corporation, Japan.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and that
+ * both that copyright notice and this permission notice appear in
+ * supporting documentation, and that the name of Justsystem Corporation
+ * not be used in advertising or publicity pertaining to distribution
+ * of the software without specific, written prior permission.  Justsystem 
+ * Corporation makes no representations about the suitability of this
+ * software for any purpose.  It is provided "as is" without express
+ * or implied warranty.
+ *
+ * Author: Atsushi Irisawa
+ */
+
+#ifndef lint
+static  char    rcsid[] = "$Id: buffer.c,v 1.3 1999/08/24 09:05:26 ishisone Exp $" ;
+#endif  /* !lint */
+
+#include        <stdio.h>
+#include        <X11/IntrinsicP.h>
+#include        <X11/StringDefs.h>
+#include        <X11/Xmu/Atoms.h>
+#include        <X11/keysym.h>
+
+
+#include	<Xatoklib.h>
+
+
+/* Page */
+/*
+ * [$B4X?tL>(B]
+ *		XatokClearBuffer( )
+ * [$BI=Bj(B]
+ *              kinput2$BMQJQ49%P%C%U%!$K%/%j%"(B
+ * [$B8F=P7A<0(B]
+ *	int	XatokClearBuffer( _XatokRecPtr  acomm )
+ *
+ * [$B0z?t(B]
+ *              $B7?(B           : $BL>(B  $B>N(B  : I O : $B@b(B      $BL@(B
+ *		_XatokRecPtr : acomm   : i/o : kinput2$BMQJQ49%P%C%U%!(B
+ *
+ * [$BJV$jCM(B]
+ *		 $B$J$7(B
+ *
+ * [$B;HMQ4X?t(B]
+ *		$B$J$7(B
+ * [$B5!G=(B]
+ *		$B3NJ]$5$l$?(B kinput2$BMQJQ49%P%C%U%!$r%/%j%"$9$k!#(B
+ */
+void XatokClearBuffer(abuf)
+_XatokRecPtr	abuf;
+{
+	int	i, n ;
+
+	for( i = 0 ; i < abuf->nbr_of_seg ; i++ ) {
+		/* XatokFreeSegement( abuf->segments[i] ) ; */
+	}
+	abuf->cur_seg = 0 ;
+	abuf->nbr_of_seg = 0 ;
+
+}
+
+/* Page */
+/* 
+ * [$B4X?tL>(B]
+ *		XatokBufferConvert( )
+ * [$BI=Bj(B]
+ *		$B%(%s%8%sJQ497k2L%G!<%?$N%3%s%P!<%H(B
+ * [$B8F=P7A<0(B]
+ *		int XatokBufferConvert( _XatokRecPtr acomm,
+ *			WORD ceCmd, AtokRsltPacket *result, int *status, 
+ *			int *enable, int *change, int *elseEvent )
+ * [$B0z?t(B]
+ *              $B7?(B           : $BL>(B  $B>N(B  : I O : $B@b(B      $BL@(B
+ *		_XatokRecPtr : acomm   : i/o : kinput2$BMQJQ49%P%C%U%!(B
+ *		WORD		ceCmd,
+ *		AtokRsltPacket	*result,
+ *		int		*status,
+ *		int		*enable,
+ *		int		*change,
+ *		int		*elseEvent
+ *	
+ *	
+ * [$BJV$jCM(B]
+ *		$B3NDjJ8;zNs$ND9$5(B
+ * [$B;HMQ4X?t(B]
+ *		ucs2euc( )
+ *		es = euc2wcs( )
+ *		s2e( )
+ *		XatokCompStr( )
+ *	
+ * [$B5!G=(B]
+ *		ATOK12X $B$X$N(BREQUEST$B$h$j(B $BLa$C$FMh$?%G!<%?$r%A%'%C%/$7!"(B
+ *		kinput2 $B$N(B ATOK CLASS$B$G;HMQ$G$-$k%G!<%?7A<0$KJQ49$9$k!#(B
+ *
+ */
+int XatokBufferConvert(acomm, ceCmd, result, status, enable, change, elseEvent)
+_XatokRecPtr	acomm;
+WORD		ceCmd;
+AtokRsltPacket	*result;
+int		*status;
+int		*enable;
+int		*change;
+int		*elseEvent;
+{
+	char 		euc[BUFSIZ*4] ;	/* $BFI$_I=<($N$?$a$N%P%C%U%!(B */
+	int		es ;			/* euc $BJ8;zNs$ND9$5(B */
+	unsigned char	*sp, *sp1, *uni2euc( ) ;
+	wchar		*wbuf ;		/* $B3NDjJ8;zNs(B */
+	char		*wrbuf ;	/* $B3NDjFI$_J8;zNs(B */
+
+	int		length = 0 ;		/* $B3NDjJ8;zNs$ND9$5(B */
+	int		i, n, ksize ;			/* WORK */
+	AtokRsltHdr	*hdr ;			/* WORK */
+	int		wsize ; 		/* WORK */
+	static	int euclen = 1 ;
+		
+	wsize = sizeof( wchar ) ;
+	wbuf = acomm->wbuf ;
+	wrbuf = acomm->wrbuf ;
+
+	hdr = &acomm->NETrslt.header ;
+
+	/*
+	 * $B%b!<%IJ8;zNs$N@_Dj(B
+	 * $B%b!<%IJ8;zNs$N@hF,$K6uGr$,B8:_$9$k$N$G:o=|$9$k!#(B
+	 */
+#ifdef	ATOK_DEBUG
+	printf( "buffer conv \245\342\241\274\245\311LEN %d\n"/*=buffer conv $B%b!<%I(BLEN %d\n=*/, hdr->modeLen ) ;
+#endif	/* ATOK_DEBUG */
+	if ( hdr->modeLen > 0 ) {
+		es = hdr->modeLen * 3 ;
+		sp = ( unsigned char * )malloc( es ) ;
+		bzero( sp, es ) ;
+		ucs2euc( hdr->modePtr, hdr->modeLen, sp, es, 0x0000a2ae ) ;
+		sp1 = sp ;
+		while( *sp1 == 0x20 ) sp1++ ;	/* SPACE */
+		es = strlen( sp1 ) ;
+		es = euc2wcs( sp1, es, acomm->mode.name ) ;
+#ifdef	ATOK_DEBUG
+		printf( "\245\342\241\274\245\311\312\270\273\372\316\363 [%s]\n"/*=$B%b!<%IJ8;zNs(B [%s]\n=*/, sp ) ;
+#endif	/* ATOK_DEBUG */
+		acomm->mode.length = hdr->modeLen ;
+		acomm->mode.length = es ;
+		free( sp ) ;
+		/* acomm->mode.changes = 1 ; */
+	}
+
+	/*
+	 * $B3NDjJ8;zNs$,B8:_$9$k>l9g$K$O!"(Bwbuf $B$K3NDjJ8;zNs$r@_Dj$7!"(B
+	 * $B%j%?!<%sCM$G$"$k3NDjJ8;zNs$ND9$5$r@_Dj$9$k!#(B
+	 * wrbuf $B$K$OFI$_J8;zNs$r@_Dj$9$k!#(B
+	 */
+	if ( hdr->resultStrLen ) {
+		es = hdr->resultStrLen * 3 ;
+		sp = ( unsigned char * )malloc( es ) ;
+		bzero( sp, es ) ;
+		ucs2euc( hdr->resultStrPtr, hdr->resultStrLen, sp, es, 0x0000a2ae ) ;
+
+		es = strlen( sp ) ;
+		es = euc2wcs( sp, es, wbuf ) ;
+		length = hdr->resultStrLen ;
+		free( sp ) ;
+
+		/*
+		 * $B$h$_J8;zNs(B
+		 */
+		bzero( acomm->wrbuf, sizeof( acomm->wrbuf )) ;
+		es = hdr->resultReadLen ;
+		s2e( hdr->resultReadPtr, es, wrbuf, sizeof( acomm->wrbuf )) ;
+
+#ifdef	ATOK_DEBUG
+	printf( "=== buffer.c \263\316\304\352EUC [%s] === \n"/*==== buffer.c $B3NDj(BEUC [%s] === \n=*/, sp ) ;
+	printf( "=== buffer.c \263\316\304\352 READ EUC [%s] === \n"/*==== buffer.c $B3NDj(B READ EUC [%s] === \n=*/, acomm->wrbuf ) ;
+#endif	/* ATOK_DEBUG */
+
+	}
+	/*
+	 * $BL$3NDjJ8;zNs$,$"$C$?>l9g$K$O!"(B
+	 * $BL$3NDjJ8;zNs$r(BUNICODE$B$+$i(BEUC$B$KJQ49$7!"(B
+	 * $BH?E>I=<(Ey$N0LCV$r5a$a$k!#(B
+	 * $BL$3NDjJ8;zNs$ND9$5$HL$3NDjJ8;zNsB0@-$ND9$5$O(B
+	 * $BF1$8$J$N$G(B if $BJ8$O$^$H$a$F=hM}$9$k!#(B
+	 */
+	if ( hdr->compStrLen ) {
+		es = hdr->compStrLen * wsize ;
+		es = hdr->compStrLen * 3 ;
+		sp = ( unsigned char * )malloc( es ) ;
+		bzero( sp, es ) ;
+
+		ucs2euc( hdr->compStrPtr, hdr->compStrLen, sp, es, 0x0000a2ae ) ;
+		es = strlen( sp ) ;
+
+		acomm->echoLen = euc2wcs( sp, es, acomm->echoStr ) ;
+		/*
+		 * $B$3$3$GH?E>I=<($N%3%a%s%H$b:n@.$9$k!#(B
+		 */
+		XatokCompStr( hdr->compStrPtr, hdr->compAttrPtr, 
+			hdr->compStrLen, &acomm->revPos, &acomm->revLen ) ;
+#ifdef	ATOK_DEBUG
+		/* printf( "$BL$3NDjJ8;zNs(B[%s]\n", sp ) ; */
+		printf( "EUC CODE\n" ) ;
+		for( i = 0 ; sp[i] ; i++ ) {
+			printf( "0x%x ", sp[i] ) ;
+		}
+		printf( "\n" ) ;
+
+		printf( "== DEBUG \314\244\263\316\304\352\311\275\274\250:\n"/*=== DEBUG $BL$3NDjI=<((B:\n=*/ ) ;
+		printf( "==> [%s]\n", sp ) ;
+		printf( "==> [----+----1----+----2----+----3]\n" ) ;
+		printf( "==> [" ) ;
+		for( i = 0 ; i < acomm->revPos ; i++ ) {
+			printf( "\241\373"/*=$B!{(B=*/ ) ;
+		}
+		for( i = 0 ; i < acomm->revLen ; i++ ) {
+			printf( "\241\374"/*=$B!|(B=*/ ) ;
+		}
+		for( i = acomm->revPos + acomm->revLen ; i < hdr->compStrLen ; i++ ) {
+			printf( "\241\373"/*=$B!{(B=*/ ) ;
+		}
+		printf( "-]\n" ) ;
+		printf( "revPos %d, revLen %d\n", acomm->revPos, acomm->revLen ) ;
+#endif	/* ATOK_DEBUG */
+
+		free( sp ) ;
+	}
+	else {
+		acomm->echoLen = 0 ;
+		acomm->echoStr[0] = 0 ;
+	}
+
+	/*
+	 * $B8uJdJ8;zNs(B
+	 */
+#ifdef	ATOK_DEBUG
+	printf( "\270\365\312\344\277\364\241\242 %d, \270\365\312\344\245\265\245\244\245\272 %d\n"/*=$B8uJd?t!"(B %d, $B8uJd%5%$%:(B %d\n=*/, hdr->kohoNum, hdr->kohoStrLen ) ;
+#endif	/* ATOK_DEBUG */
+
+	acomm->kohoNum = 0 ;
+	if ( hdr->kohoNum > 0 && hdr->kohoStrLen > 0 ) {
+		n = hdr->kohoNum ;
+		ksize = hdr->kohoStrLen ;
+		if ( acomm->kohoSize == 0 ) {
+			acomm->kohoStrPtr = ( WCHAR * )malloc( ksize * sizeof( WCHAR )) ;
+			acomm->kohoLenPtr = ( BYTE * )malloc( n * sizeof( BYTE )) ;
+			acomm->kohoSfxPtr = ( BYTE * )malloc( n * sizeof( BYTE )) ;
+			acomm->kohoSize = n ;
+			acomm->kohoStrLen = ksize ;
+		}
+		/*
+		 * $BJ8;zNsD9!"B0@-$O!"8uJd?t$@$13NJ](B
+		 * $B8uJd?t$O(B kohoSize $B$K(B $B@_Dj$7$F$"$k!#(B
+		 */
+		if ( acomm->kohoSize < n ) {
+
+			acomm->kohoLenPtr = ( BYTE * )realloc( acomm->kohoLenPtr, n * sizeof( BYTE )) ;
+			acomm->kohoSfxPtr = ( BYTE * )realloc( acomm->kohoSfxPtr, n * sizeof( BYTE )) ;
+			acomm->kohoSize = n ;
+		}
+		if ( acomm->kohoStrLen < ksize ) {
+			acomm->kohoStrPtr = ( WCHAR * )realloc( acomm->kohoStrPtr, ksize * sizeof( WCHAR )) ;
+			acomm->kohoStrLen = ksize ;
+		}
+
+                memcpy( acomm->kohoStrPtr, hdr->kohoStrPtr, ksize * sizeof( WCHAR)) ;
+		memcpy( acomm->kohoLenPtr, hdr->kohoLenPtr, n * sizeof( BYTE )) ;
+		memcpy( acomm->kohoSfxPtr, hdr->kohoSfxPtr, n * sizeof( BYTE )) ;
+		acomm->kohoNum = n ;
+		acomm->kohoPos = hdr->kohoPos ;
+
+#ifdef	ATOK_DEBUG
+{
+	int kk ;
+	char	*eep ;
+	kk = ksize * sizeof( WCHAR );
+	eep = uni2euc( acomm->kohoStrPtr, &kk ) ;
+	printf( "\270\365\312\344 [%s]\n"/*=$B8uJd(B [%s]\n=*/, eep ) ;
+	for ( i = 0 ; i < n ; i++ ) {
+		printf( "%d ", acomm->kohoLenPtr[i] ) ;
+	}
+	printf( "\304\271\244\265\n"/*=$BD9$5(B\n=*/ ) ;
+}
+#endif	/* ATOK_DEBUG */
+	}
+
+	/*
+	 * $B%7%9%F%`9T%G!<%?(B
+	 */
+	if ( hdr->sysStrLen ) {
+		es = hdr->sysStrLen * 3 ;
+		sp = ( unsigned char * )malloc( es ) ;
+		bzero( sp, es ) ;
+		ucs2euc( hdr->sysStrPtr, hdr->sysStrLen, sp, es, 0x0000a2ae ) ;
+		es = strlen( sp ) ;
+		es = euc2wcs( sp, es, acomm->sysLineStr ) ;
+		acomm->sysLineLen = hdr->sysStrLen ;
+#ifdef	ATOK_DEBUG
+		printf( "SYS LINE LEN in buffer.c (%d)\n", hdr->sysStrLen ) ;
+#endif	/* ATOK_DEBUG */
+		if ( acomm->sysLineSize == 0 ) {
+			acomm->sysAttrPtr = ( WORD * )malloc( sizeof( WORD ) *
+				hdr->sysStrLen ) ;
+			acomm->sysLineSize = hdr->sysStrLen ;
+		}
+		else if ( acomm->sysLineSize < hdr->sysStrLen ) {
+			acomm->sysAttrPtr = ( WORD * )malloc( sizeof( WORD ) *
+				hdr->sysStrLen ) ;
+			acomm->sysLineSize = hdr->sysStrLen ;
+		}
+		memcpy( acomm->sysAttrPtr, hdr->sysAttrPtr, sizeof( WORD ) * hdr->sysStrLen ) ;
+
+		free( sp ) ;
+	}
+	if ( hdr->guideStrLen ) {
+		es = hdr->guideStrLen * 3 ;
+		sp = ( unsigned char * )malloc( es ) ;
+		bzero( sp, es ) ;
+		ucs2euc( hdr->guideStrPtr, hdr->guideStrLen, sp, es, 0x0000a2ae ) ;
+		free( sp ) ;
+	}
+	acomm->kohoNum = hdr->kohoNum ;
+
+	acomm->guide_openEventIndex = hdr->CEGuideOpenEventIndx ;
+	acomm->guide_closeEventIndex = hdr->CEGuideCloseEventIndx ;
+	acomm->guide_OpenIndex = hdr->CEGuideOpenIndx ;
+
+	*status = hdr->CEOutinf ;
+	*enable = hdr->StatusEnableFlag ;
+	*change = hdr->DispChangeStatus ;
+	*elseEvent = hdr->StatusElseEvent ;
+
+	return length ;
+}
+/* End of buffer.c */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/Xatoklib/compstr.c	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,99 @@
+/* 
+ * Copyright 1999 Justsystem Corporation, Japan.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and that
+ * both that copyright notice and this permission notice appear in
+ * supporting documentation, and that the name of Justsystem Corporation
+ * not be used in advertising or publicity pertaining to distribution
+ * of the software without specific, written prior permission.  Justsystem 
+ * Corporation makes no representations about the suitability of this
+ * software for any purpose.  It is provided "as is" without express
+ * or implied warranty.
+ *
+ * Author: Atsushi Irisawa
+ */
+
+#ifndef lint
+static  char    rcsid[] = "$Id: compstr.c,v 1.2 1999/08/24 09:01:08 ishisone Exp $" ;
+#endif  /* !lint */
+#include	<Xatoklib.h>
+#include	<key_def.h>
+
+/* Page */
+/* 
+ * [$B4X?tL>(B]
+ *		XatokCompStr( )
+ * [$BI=Bj(B]
+ *		$BL$3NDjJ8;zNs>uBV<hF@(B
+ * [$B8F=P7A<0(B]
+ *		int	XatokCompStr( WCHAR *compStr, WORD *compAttr,
+ *				WORD compLen, int *revPos, int *revLen )
+ *		
+ * [$B0z?t(B]
+ *		$B7?(B        : $BL>(B       $B>N(B   : IO : $B@b(B      $BL@(B
+ *		WCHAR : *compStr : i : $BL$3NDjJ8;zNs(B
+ *		WORD : *compAttr : i : $BL$3NDjJ8;zNsB0@-(B
+ *		WORD : compLen : i : $BL$3NDjJ8;zNsD9$5(B
+ *		int : *revPos : o : $BH?E>I=<(3+;O0LCV(B
+ *		int : *revLen : o : $BH?E>I=<(D9$5(B
+ *	
+ * [$BJV$jCM(B]
+ *		$B%;%0%a%s%H$N8D?t(B(1-3)
+ *		
+ * [$B;HMQ4X?t(B]
+ *		$B$J$7(B
+ * [$B5!G=(B]
+ *		$BL$3NDjJ8;zNs$NJ8;z>pJs!"B0@->pJs$h$j!"(B
+ *		$BL$3NDjJ8;zNs$NI=<(>uBV$r<hF@$9$k!#(B
+ *		$BI=<(>uBV$H$O!"(B $B%N!<%^%kI=<(!"H?E>I=<($+$i@.N)$A!"(B
+ *		$B:GBg#3$D$N%;%0%a%s%H$KJ,3d$5$l$k!#(B
+ *
+ */
+
+int XatokCompStr(compStr, compAttr, compLen, revPos, revLen)
+WCHAR		*compStr;
+WORD		*compAttr;
+WORD		compLen;
+int		*revPos;
+int		*revLen;
+{
+	int	i ;
+	int	nseg = 0 ;
+	int	prevAttr = -1 ;
+	int	isReverse = 0 ;
+	*revPos = 0 ;
+	*revLen = 0 ;
+
+	for( i = 0 ; i < ( int )compLen ; i++ ) {
+		/* printf( "compAttr[%d] = %d\n", i , compAttr[i] ) ; */
+		switch( compAttr[i] ) {
+			case ATCOLINDX_TARGETCONVERT:
+			case ATCOLINDX_TARGETNOTCONVERTED:
+			case ATCOLINDX_INPUTCUR:
+			case ATCOLINDX_INPUTCURKOTEI:
+			case ATCOLINDX_TARGETNOTCONVERTEDKOTEI:
+			case ATCOLINDX_TARGETCOMMENT :
+				( *revLen )++ ;
+				if ( !isReverse ) {
+					*revPos = i ;
+					isReverse = 1 ;
+				}
+				if ( prevAttr != 1 ) {
+					prevAttr = 1 ;
+					nseg++ ;
+				}
+				break ;
+			default :
+				if ( prevAttr != 0 ) {
+					prevAttr = 0 ;
+					nseg++ ;
+				}
+				break ;
+		}
+	}
+	return nseg ;
+}
+
+/* End of compstr.c */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/Xatoklib/event.c	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,593 @@
+/* 
+ * Copyright 1999 Justsystem Corporation, Japan.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and that
+ * both that copyright notice and this permission notice appear in
+ * supporting documentation, and that the name of Justsystem Corporation
+ * not be used in advertising or publicity pertaining to distribution
+ * of the software without specific, written prior permission.  Justsystem 
+ * Corporation makes no representations about the suitability of this
+ * software for any purpose.  It is provided "as is" without express
+ * or implied warranty.
+ *
+ * Author: Atsushi Irisawa
+ */
+
+#ifndef lint
+static  char    rcsid[] = "$Id: event.c,v 1.4 1999/08/24 09:05:26 ishisone Exp $" ;
+#endif  /* !lint */
+
+#include	<stdio.h>
+#include	<X11/IntrinsicP.h>
+#include	<X11/StringDefs.h>
+#include	<X11/Xmu/Atoms.h>
+#include	<X11/keysym.h>
+#include	<InputConv.h>
+
+#include	<Xatoklib.h>
+#include	<key_def.h>
+
+
+/* Page */
+/*
+ * [$B4X?tL>(B]
+ *              WordDelEvent( )
+ * [$BI=Bj(B]
+ *              $BC18l:o=|%&%#%s%I%&I=<(;~$N%$%Y%s%H=hM}(B
+ * [$B8F=P7A<0(B]
+ *      int WordDelEvent( _XatokRecPtr acomm, WORD *aajcode, WORD *ceCmd )
+ *
+ * [$B0z?t(B]
+ *              $B7?(B        : $BL>(B       $B>N(B   : IO : $B@b(B      $BL@(B
+ *		_XatokRecPtr : acomm    : i/o : kinput2$BMQJQ49%P%C%U%!(B
+ *		WORD      :  *aajcode   : i/o : $BF~NO%-!<%3!<%I(B
+ *              WORD      :  *ceCmd     :   o : ATOK12CE $B$N%3%^%s%IHV9f(B
+ *
+ * [$BJV$jCM(B]
+ *		0 : $B%-!<F~NO%$%Y%s%H$r(BCE$B$XEO$5$J$$(B
+ *		1 : $B%-!<F~NO%$%Y%s%H$r(BCE$B$XEO$9(B
+ *
+ * [$B;HMQ4X?t(B]
+ *		$B$J$7(B
+ * [$B5!G=(B]
+ *		$BC18l:o=|3NG'%@%$%"%m%0$rI=<($7$F$$$k;~$KM-8z$J%-!<$N(B
+ *		$B@)8f$r9T$J$&!#M-8z$J%-!<$O(B 'Y','y', 'N', 'n' $B$@$1$G$"$k!#(B
+ *		$B$=$l0J30$N%-!<$,F~NO$5$l$?;~$O2?$b$7$J$$!#(B
+ *		$BM-8z%-!<$N;~$@$1!"%(%s%8%s$K%-!<$rEO$9$N$G#1$rJV$9!#(B
+ */
+static int WordDelEvent(acomm, aajcode, ceCmd)
+_XatokRecPtr	acomm;
+WORD		*aajcode;
+WORD		*ceCmd;
+{
+	int	status = 0 ;
+
+	switch( *aajcode ) {
+		case 'y' :
+		case 'Y' :
+		case 'n' :
+		case 'N' :
+			/* 
+			 * $BM-8z%-!<$N>l9g(B
+			 */
+			acomm->convStatus ^= M_WDEL ;	/* 623 */
+			status = 1 ;
+			break ;
+		default :
+			status = 0 ;
+	}
+	return status ;
+}
+/* Page */
+/*
+ * [$B4X?tL>(B]
+ *		AuxEvent( )
+ * [$BI=Bj(B]
+*		AUX$B%&%#%s%I%&I=<(;~$N%$%Y%s%H=hM}(B
+ * [$B8F=P7A<0(B]
+ *      	int AuxEvent( _XatokRecPtr acomm, WORD *aajcode, 
+ *			WORD *ceCmd, int *length )
+ *
+ * [$B0z?t(B]
+ *              $B7?(B        : $BL>(B       $B>N(B   : IO : $B@b(B      $BL@(B
+ *		_XatokRecPtr : acomm    : i/o : kinput2$BMQJQ49%P%C%U%!(B
+ *		WORD      :  *aajcode   : i/o : $BF~NO%-!<%3!<%I(B
+ *              WORD      :  *ceCmd     :   o : ATOK12CE $B$N%3%^%s%IHV9f(B
+ *		int       : *length     :   o : $BF~NO$5$l$?J8;zNs$ND9$5(B
+ *
+ *
+ * [$BJV$jCM(B]
+ *		-1 : $BAw?.%(%i!<(B
+ *		 N : $BAw?.%P%$%H?t(B
+ *
+ * [$B;HMQ4X?t(B]
+ *		MenuCtrl( )
+ * [$B5!G=(B]
+ *		AUX $B%&%#%s%I%&I=<(;~$N%$%Y%s%H=hM}$r9T$J$&!#(B
+ *		AUX $B%&%#%s%I%&$K$O(B MenuClass $B$,@_Dj$5$l$F$$$F!"(B
+ *		MenuClass $B$KDj5A$5$l$?2hLL$NA+0\$r9T$J$&!#(B
+ */
+static int AuxEvent(acomm, aajcode, ceCmd, length)
+_XatokRecPtr	acomm;
+WORD		*aajcode;
+WORD		*ceCmd;
+int		*length;
+{
+	int	status ;
+
+	*length = 0 ;
+
+#ifdef	ATOK_DEBUG
+	printf( "AUX KEY 0x%x\n", *aajcode ) ;
+#endif	/* ATOK_DEBUG */
+	status = MenuCtrl( acomm, &acomm->curAux, aajcode, 0, length ) ;
+#ifdef	ATOK_DEBUG
+	printf( "MENU Status = %d\n", status ) ;
+#endif	/* ATOK_DEBUG */
+	/*
+	 * NULL $B$K$J$C$?>l9g$O(BAUX WINDOW$B$r%-%c%s%;%k$5$l$?>l9g(B
+	 * status : -1 $BJQ99$J$7(B(DefaultProc $B$G=hM}(B)
+	 * 	  :  0 $B%a%K%e!<$NA*BrJQ99(B
+	 *	  :  1 $B%a%K%e!<JQ99(B
+	 *	  :  2 $B%a%K%e!<$N3NDj(B
+	 *
+	 * MenuStatus : 1  AuxStart
+	 *		2  AuxChange
+	 *		3  AuxEnd
+	 */
+	switch( status ) {
+		case 1 :
+			/* $B%a%K%e!<JQ99$"$j(B */
+			/* printf( "acomm->curAux 0x%x\n", acomm->curAux ) ; */
+			if ( !acomm->curAux ) {
+				acomm->curAux = acomm->menuAux ;
+				acomm->menuStatus = ICAuxEnd ;	/* END */
+			}
+			break ;
+		case 2 :
+			/* $B%a%K%e!<3NDj(B */
+			acomm->menuStatus = ICAuxChange ;
+			break ;
+		case -1 :
+			acomm->menuStatus = ICAuxChange ;
+			return *length ;
+		case 0 :
+		default :
+			acomm->menuStatus = ICAuxChange ;
+			return 0 ;
+	}
+	/* return 0 ; */
+	return *length ;
+}
+
+/* Page */
+/*
+ * [$B4X?tL>(B]
+ *              CandEvent( )
+ * [$BI=Bj(B]
+ *              $B8uJd%&%#%s%I%&I=<(;~$N%$%Y%s%H=hM}(B
+ * [$B8F=P7A<0(B]
+ *      int CandEvent( _XatokRecPtr acomm, WORD *aajcode, WORD *ceCmd )
+ *
+ * [$B0z?t(B]
+ *              $B7?(B        : $BL>(B     $B>N(B   : IO  : $B@b(B      $BL@(B
+ *		_XatokRecPtr : acomm    : i/o : kinput2$BMQJQ49%P%C%U%!(B
+ *		WORD      :  *aajcode   : i/o : $BF~NO%-!<%3!<%I(B
+ *              WORD      :  *ceCmd     :   o : ATOK12CE $B$N%3%^%s%IHV9f(B
+ *
+ *
+ * [$BJV$jCM(B]
+ *		0 : $B%-!<F~NO%$%Y%s%H$r(BCE$B$XEO$5$J$$(B
+ *		1 : $B%-!<F~NO%$%Y%s%H$r(BCE$B$XEO$9(B
+ *
+ * [$B;HMQ4X?t(B]
+ *		atokCandidate( )
+ * [$B5!G=(B]
+ *		$B8uJd%&%#%s%I%&$,I=<($5$l$F$$$k;~$N%$%Y%s%H=hM}$r9T$J$&!#(B
+ *		$B%$%Y%s%H=hM}$OF~NO$5$l$?(B aajcode $B$K$h$jBP1~$9$k=hM}$,(B
+ *		$B7hDj$9$k!#$3$3$G%A%'%C%/$7$F$$$k%3!<%I$O(B
+ *		kinput2 $B$N(BAtokClass $B$N%b%8%e!<%k$G$bI=<(@)8f$N$?$a(B
+ *		$B%A%'%C%/$7$F$$$k!#(B
+ *		CTR_DEL $B$,2!$5$l$?;~$O!"(Bkinput2 $BB&$GJQ99$5$l$?%+%l%s%H8uJd$r(B
+ *		$B%(%s%8%s$KEA$($F$+$i!"(BCTR_DEL $B$N:o=|=hM}$r8F$S=P$9!#(B
+ */
+static int CandEvent(acomm, aajcode, ceCmd)
+_XatokRecPtr	acomm;
+WORD		*aajcode;
+WORD		*ceCmd;
+{
+	int	pgMax ;
+	int	len = 0 ;
+
+	pgMax = acomm->kohoMax ;
+
+	switch( *aajcode ) {
+		case EESC :
+			*aajcode = FUNC_CNV_CANCL ;
+			return 0 ;
+		case LEFT :
+		case RIGHT :
+		case DOWN :
+		case UP :
+		case CTR_U :
+		case CTR_N :
+		case CTR_F :
+		case CTR_B :
+		case CTR_A :
+			return 0 ;
+		case CTR_DEL :
+			/*
+			 * $B8=:_(B $BI=<(>eA*Br$5$l$F$$$k8uJd$r%(%s%8%s$KEA$($k(B
+			 * $BI,MW$,$"$k!#(B
+			 */
+			*aajcode = acomm->kohoPos ;
+			atokCandidate( acomm, *aajcode ) ;
+			*aajcode = CTR_DEL ;
+			acomm->convStatus |= M_WDEL ;	/* 623 */
+			return 1 ;
+		case SPACE :
+			*aajcode = SPACE ;
+			/* *aajcode = XFER ; */
+			return 0 ;	/* 617 */
+			break ;
+		case CR :
+			/*
+			 * kinput2 $BB&$GA*Br$5$l$F$$$k=j$H%(%s%8%sFb$G(B
+			 * $BA*Br$5$l$F$$$k=j$rF14|$5$;$k!#(B
+			 */
+			*aajcode = acomm->kohoPos ;
+
+			acomm->NETrqst.AtCEIncode = acomm->kohoPos ;
+#ifdef	ATOK_DEBUG
+	printf( "\301\252\302\362\244\265\244\354\244\277\270\365\312\344\310\326\271\346 (%d) Page (%d)\n"/*=$BA*Br$5$l$?8uJdHV9f(B (%d) Page (%d)\n=*/, 
+				acomm->NETrqst.AtCEIncode,
+			acomm->kohoCurPage ) ;
+#endif	/* ATOK_DEBUG */
+			len = 1 ;
+			break ;
+		/*
+		 * $B?t;z%-!<$N>l9g$O8uJdHV9f$rA*Br$7$?;v$H$9$k!#(B
+		 * $BM-8z$J?t;z$K$D$$$F$O%A%'%C%/$9$k;v(B
+		 */
+
+		default :
+			len = 0 ;
+#ifdef	CAND_PAGE
+			if ( *aajcode >= '1' && *aajcode <= '9' ) {
+				*aajcode -= '1' ;
+				len = 1 ;
+			}
+			else if ( *aajcode >= 'a' && *aajcode <= 'z' ) {
+				*aajcode -=  'a' ;
+				*aajcode += 10 ;
+				len = 1 ;
+			}
+			else if ( *aajcode >= 'A' && *aajcode <= 'Z' ) {
+				*aajcode -=  'A' ;
+				*aajcode += 10 ;
+				len = 1 ;
+			}
+			*aajcode = acomm->kohoCurPage * pgMax + *aajcode ;
+			*aajcode = acomm->kohoCurPage * pgMax + *aajcode ;
+#else			
+			len = 0 ;
+#endif
+	}
+	if ( len > 0 ) {
+#ifdef	ATOK_DEBUG
+		Printf( "\270\365\312\344 \270\275\272\337\244\316\245\332\241\274\245\270 (%d)\n"/*=$B8uJd(B $B8=:_$N%Z!<%8(B (%d)\n=*/, acomm->kohoCurPage ) ;
+		printf( "\270\365\312\344 \263\316\304\352\310\326\271\346 (%d)\n"/*=$B8uJd(B $B3NDjHV9f(B (%d)\n=*/, *aajcode ) ;
+		printf( "\270\365\312\344 \263\316\304\352\310\326\271\346 (%d)\n"/*=$B8uJd(B $B3NDjHV9f(B (%d)\n=*/, acomm->NETrqst.AtCEIncode ) ;
+#endif	/* ATOK_DEBUG */
+		atokCandidate( acomm, *aajcode ) ;
+
+		*aajcode = VKEY|FUNC_KAKU_BUBUN ;
+
+	}
+	return len ;
+}
+/* Page */
+/*
+ * [$B4X?tL>(B]
+ *              KeyEvent( )
+ * [$BI=Bj(B]
+ *              $B%-!<F~NO%$%Y%s%H=hM}(B
+ * [$B8F=P7A<0(B]
+ *      	int KeyEvent( _XatokRecPtr acomm, WORD *aajcode, WORD *ceCmd )
+ *
+ * [$B0z?t(B]
+ *              $B7?(B        : $BL>(B       $B>N(B   : IO : $B@b(B      $BL@(B
+ *		_XatokRecPtr : acomm    : i/o : kinput2$BMQJQ49%P%C%U%!(B
+ *		WORD      :  *aajcode   : i/o : $BF~NO%-!<%3!<%I(B
+ *              WORD      :  *ceCmd     :   o : ATOK12CE $B$N%3%^%s%IHV9f(B
+ *
+ * [$BJV$jCM(B]
+ *		0 : $B%-!<F~NO%$%Y%s%H$r(BCE$B$XEO$5$J$$(B
+ *		1 : $B%-!<F~NO%$%Y%s%H$r(BCE$B$XEO$9(B
+ *
+ * [$B;HMQ4X?t(B]
+ *		atokCandidate( )
+ *		XatokBufferConvert( )
+ * [$B5!G=(B]
+ *		$BDL>oF~NO>uBV$G$N%-!<F~NO%$%Y%s%H$N=hM}$r9T$J$&!#(B
+ *		$BDL>o$N>uBV$G$O$J$/!"B>$N%$%Y%s%H=hM}$r9T$J$o$l$?8e$G$b(B
+ *		$B%(%s%8%s$K%-!<$rEO$9I,MW$,$"$k>l9g$K$O8F$S=P$5$l$k!#(B
+ */
+static int KeyEvent(acomm, aajcode, ceCmd, wbuf, length, status, enable, change, elseEvent)
+_XatokRecPtr	acomm;
+WORD		*aajcode;
+WORD		*ceCmd;
+wchar		*wbuf;
+int		*length;
+int		*status;
+int		*enable;
+int		*change;
+int		*elseEvent;
+{
+	int	call = 1 ;
+	int	sRet = 0 ;
+	WORD	key ;
+
+	*length = 0 ;
+	*status = 0 ;
+	*enable = 0 ;
+	*change = 0 ;
+	acomm->NETrqst.AtCEIncode = 0 ;
+	acomm->NETrqst.AtCEPrvAPIOutinf = 0 ;
+	/*
+	 * $BL$3NDjJ8;zNs$,$J$$$H$-$K@)8f%-!<$r2!$5$l$?>l9g$K$O(B
+	 *  $B%-!<$r$=$N$^$^JV$9!#(B
+	 * $B@)8f%-!<$K$D$$$F$N(B if $BJ8$O(B $B=$@5$9$kI,MW$"$j!#(B
+	 */
+#if	0
+	if ( !acomm->echoLen && *aajcode == CR ) {
+		/*
+		( 
+			 *aajcode == CR ||
+			 *aajcode == SPACE   ||
+			 *aajcode == BS
+			)) {
+		*/
+		printf( "\245\271\245\353\241\274 KEY %x\n"/*=$B%9%k!<(B KEY %x\n=*/, *aajcode ) ;
+#ifdef	ATOK_DEBUG
+#endif	/* ATOK_DEBUG */
+		wbuf[0] = *aajcode & 0xff ;
+		*length = 1 ;
+		return  1 ;
+	}
+#endif
+	key =  *aajcode ;
+	/*
+	 * CTRL + W $B$O(B $BF~NO%b!<%I$N@Z$jBX$(%-!<(B
+	 * $B%-!<F~NOCf$KBP1~$7$?(BAAJ CODE$B$N5!G=$G(B SWITCH$B$9$k$3$H!#(B
+	 */
+	switch( *aajcode ) {
+		case CTR_F7 :
+		case CTR_W :
+			if ( acomm->echoLen > 0 ) {
+				return 0 ;
+			}
+			acomm->convStatus = M_AUX ;
+			MenuCtrl( acomm, &acomm->curAux, aajcode, 1, length ) ;
+			acomm->menuStatus = ICAuxStart ;	
+			return 0 ;
+		case SPACE :
+			*ceCmd = IME_PRV_KEYCONVERT ;
+			/* *aajcode = XFER ; */
+			/* key = XFER ; */
+			/*
+			 * $B$3$3$O(B $B%9%Z!<%9%-!<$N3dEv$r%A%'%C%/$9$k;v(B
+			 */
+			if ( !acomm->echoLen )	key = SPACE ;
+			else 			key = XFER ;
+			/* key = XFER ; */
+			key = SPACE ;	 /* 616 */
+
+			acomm->NETrqst.AtCEIncode = key & 0xffff ;
+			sRet = 1 ;
+			break ;
+		/* KEYCONV */
+		default :
+			*ceCmd = IME_PRV_KEYCONVERT ;
+			acomm->NETrqst.AtCEIncode = *aajcode & 0xffff ;
+			sRet = 1 ;
+			break ;
+	}
+
+	if ( call  ) {
+		acomm->NETrqst.ceCmd = *ceCmd ;
+
+#ifdef	ATOK_DEBUG
+printf( "COMMUNICATE CMD(%d) AAJCODE(0x%04x)\n", *ceCmd, *aajcode & 0xffff ) ;
+#endif	/* ATOK_DEBUG */
+		AtokClntCommunicate( acomm->sock, &acomm->NETrqst, &acomm->NETrslt ) ;
+#ifdef	ATOK_DEBUG
+printf( "REQ OK\n" ) ;
+#endif	/* ATOK_DEBUG */
+	}
+
+	*length = XatokBufferConvert( acomm, *ceCmd, &acomm->NETrslt, 
+			status, enable, change, elseEvent ) ;
+
+#ifdef	ATOK_DEBUG
+	printf( "\270\365\312\344\244\316\277\364\244\362\245\301\245\247\245\303\245\257(%d)\241\243\n"/*=$B8uJd$N?t$r%A%'%C%/(B(%d)$B!#(B\n=*/, acomm->kohoNum ) ;
+	printf( "CAND STAT (%d)\n", acomm->convStatus & M_CAND ) ;
+#endif	/* ATOK_DEBUG */
+	/*
+	 * $B8uJd$,J#?tB8:_$7!"8=:_$^$@8uJd%&%#%s%I%&$rI=<($7$F$$$J$$$J$i(B
+	 * $B8uJd%&%#%s%I%&$rI=<($9$k$?$a$K!"8uJd%j%9%H$r<hF@$9$k!#(B
+	 */
+	if ( acomm->kohoNum > 1 && 
+		 !( acomm->convStatus & M_CAND ) ) {
+
+		/*
+		 * kohoNum $B$K$O(B $B8=:_$O8uJd?t$,F~$C$F$$$k$,!"(B
+		 * Candidate $B$r$h$V$H%+%l%s%H8uJdHV9f$K$J$C$F$7$^$&$N$G(B
+		 * kohoNum2 $B$K8uJd$NAm?t$rJ]B8$7$F$*$/(B
+		 */
+		acomm->kohoNum2 = acomm->kohoNum ;
+
+#ifdef	ATOK_DEBUG
+		printf( "\270\365\312\344\244\254\244\242\244\303\244\277\244\316\244\307 \270\365\312\344\311\275\274\250\245\342\241\274\245\311\244\313\260\334\244\353\241\243\n"/*=$B8uJd$,$"$C$?$N$G(B $B8uJdI=<(%b!<%I$K0\$k!#(B\n=*/ ) ;
+#endif	/* ATOK_DEBUG */
+		atokCandidate( acomm, ATCEPRVAPI_READCMD ) ;
+		acomm->convStatus |= M_CAND ;
+		*aajcode = XFER ;
+		*length = XatokBufferConvert( acomm, *ceCmd, &acomm->NETrslt, 
+			status, enable, change, elseEvent ) ;
+	}
+
+	return 1 ;
+}
+
+/* Page */
+/* 
+ * [$B4X?tL>(B]
+ *		XatokEventControl( )
+ * [$BI=Bj(B]
+ *		$B%-!<F~NO$N<u$1IU$1(B
+ * [$B8F=P7A<0(B]
+ *		int	XatokEventControl( AtokPart
+ * [$B0z?t(B]
+ *		$B7?(B        : $BL>(B       $B>N(B   : IO : $B@b(B      $BL@(B
+ *	
+ *	
+ * [$BJV$jCM(B]
+ *		
+ * [$B;HMQ4X?t(B]
+ *	
+ * [$B5!G=(B]
+ *		X $B$+$i$N%$%Y%s%H$r<u$1<h$j(B ATOK $B$N(B AAJCODE$B$KJQ49$7$F!"(B
+ *		ATOK CE $B$KJQ49$r0MMj$9$k!#(B
+ *		$BJQ497k2L$r<u$1<h$C$?8e$K!"(BlibXatok $BMQ$KJQ497k2L$r(B
+ *		$B%P%C%U%!$K@_Dj$9$k!#(B
+ *
+ */
+int XatokEventControl(acomm, event, xkey, kbuf, nbytes, aajcode, status, enable, change, elseEvent)
+/* Fix Length */
+_XatokRecPtr	acomm;
+XKeyEvent	*event;
+KeySym		xkey;
+char		*kbuf;
+int		nbytes;
+WORD		*aajcode;
+int		*status;
+int		*enable;
+int		*change;
+int		*elseEvent;
+{
+	char 		euc[BUFSIZ*4] ;	/* $BFI$_I=<($N$?$a$N%P%C%U%!(B */
+	int		es ;			/* euc $BJ8;zNs$ND9$5(B */
+	unsigned char	*sp ;
+	wchar		*wbuf ;	
+
+	WORD		ceCmd = -1 ;		/* CE $B$XAw$k%3%^%s%I(B */
+	int		length ;		/* $B3NDjJ8;zNs$ND9$5(B */
+	extern WORD	getAAJCode( )  ;	
+	int		i ;			/* WORK */
+	int		sRet ;
+		
+	wbuf = acomm->wbuf ;
+	*status = 0 ;
+	wbuf[0] = 0 ;
+	length = 0 ;
+	acomm->wlen = 0 ;
+
+	/*
+	 * $BK\Ev$O$3$3$G(B ATOK CE$B$r8F$S=P$7(B $BJQ497k2L$r8+$F=hM}$r$9$k!#(B
+	 * CE $B$r8F$S=P$9(BAPI$B$O(B X$B$N%-!<%$%Y%s%H$r8+$F(B AAJCODE$B$K$9$k!#(B
+	 * $B3NDj$7$?J8;z$,$"$k>l9g$K$O!"(B wbuf $B$K3NDjJ8;z$r@_Dj$9$k!#(B
+	 * $B3NDj$7$J$+$C$?>l9g$K$O!"F~NOJ8;z$H$7$F(Bprebuf $B$K%;%C%H$9$k!#(B
+	 */
+	/*
+	 * $B$3$3$G(B $B%-!<F~NO$r(BATOK$B$N%3!<%I(B(AAJCODE)$B$KJQ49$7$F!"(B
+	 * $B3F%b!<%I;~$KBP1~$7$?%3%^%s%I$NE83+$9$k!#(B
+	 */
+	*aajcode = getAAJCode( event, xkey, kbuf ) ;
+#ifdef	ATOK_DEBUG
+printf( "aajcode  0x%x = len = %d\n", *aajcode, acomm->echoLen ) ;
+printf( "convStatus  %d\n",  acomm->convStatus ) ;
+#endif	/* ATOK_DEBUG */
+	if ( *aajcode == 0 ) {
+		return 0 ;
+	}
+
+	/*
+	 * $B%-!<%$%Y%s%H$,H/@8$7$F$3$N4X?t$K$H$s$GMh$?;~$K(B
+	 * $B%b!<%I$,@_Dj$5$l$F$$$J$$>l9g$K$O!"JQ493+;O$N%-!<$r(B
+	 * $B2!$5$l$?;~$G$"$k$N$G!"%-!<JQ49%b!<%I$K@_Dj$9$k!#(B
+	 */
+	if ( acomm->convStatus == M_NOKEYCONV ) {
+		atokKanjiOn( acomm ) ;
+/* printf( "KANJI ON MODE (%d)\n", acomm->convStatus ) ; */
+	}
+
+	/*
+	 * CTRL_SPACE $B$O(B $B4A;z(BON$B!?(BOFF$B$N@Z$jBX$(%-!<(B
+	 * CTRL_SPACE $B$O$I$s$J>l9g$G$b4A;z(BOFF
+	 */	
+	if ( *aajcode == SFT_SP ) {
+#ifdef	ATOK_DEBUG
+	printf( "AAJ SFT_SP -> KANJIOFF\n" ) ;
+#endif	/* ATOK_DEBUG */
+		if  ( acomm->convStatus == M_KEYCONV ) {
+			atokKanjiOff( acomm ) ;
+/* printf( "KANJI ON OFF (%d)\n", acomm->oldStatus ) ; */
+		}
+		return 0 ;
+	}
+
+	if ( acomm->convStatus & M_AUX ) {
+		/*
+		 * AUX $B%&%#%s%I%&(B $BI=<(Cf$N%$%Y%s%H=hM}(B
+		 */
+
+		sRet = AuxEvent( acomm, aajcode, &ceCmd, &length ) ;
+		/* printf( "AUX %d RETURN LENGTH = %d\n", sRet, length ) ; */
+		if ( sRet < 1 ) {
+			return length ;
+		}
+	}
+	/* if ( acomm->convStatus & M_CAND ) { */
+	/*
+	 * $B8uJd%&%#%s%I%&$rI=<(Cf$G$+$D%7%9%F%`9T$rI=<($7$F$$$J$$>l9g$N(B
+	 * $B%$%Y%s%H=hM}(B
+	 */
+	if ( acomm->convStatus & M_WDEL ) {
+		sRet = WordDelEvent( acomm, aajcode, &ceCmd ) ;
+		if ( sRet == 0 ) {
+			return 0 ;
+		}
+	}
+	if ( acomm->convStatus & M_CAND &&
+		!( acomm->convStatus & M_SYSLINE )) { /* 616 */
+		/*
+		 * $B8uJd%&%#%s%I%&$rI=<(Cf$N%$%Y%s%H=hM}(B
+		 */
+		sRet = CandEvent( acomm, aajcode, &ceCmd ) ;
+		/* 
+		 * $B%9%F!<%?%9$,#00J30$N;~$O!"8uJd$,3NDj$5$l$?;~(B
+		 */
+		if ( sRet == 0 ) {
+			return 0 ;
+		}
+	}
+	/*
+	 * $B$=$NB>$O(B $BDL>o$N%-!<F~NO%$%Y%s%H(B
+	 */
+/* printf( "KEY CONV AAJ 0x%x\n", *aajcode ) ; */
+	 KeyEvent( acomm, aajcode, &ceCmd, wbuf, &length,
+			status, enable, change, elseEvent ) ;
+
+/* printf( "$B8uJd$NHV9f(B(%d)$B!#(B\n", acomm->kohoPos ) ; */
+#ifdef	ATOK_DEBUG
+	printf( "\263\316\304\352\312\270\273\372\316\363EVENT[%s]\n"/*=$B3NDjJ8;zNs(BEVENT[%s]\n=*/, acomm->wbuf ) ;
+#endif	/* ATOK_DEBUG */
+	acomm->wlen = length ;
+
+	return length ;
+}
+
+/* End of event.c */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/Xatoklib/if.c	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,564 @@
+/* 
+ * Copyright 1999 Justsystem Corporation, Japan.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and that
+ * both that copyright notice and this permission notice appear in
+ * supporting documentation, and that the name of Justsystem Corporation
+ * not be used in advertising or publicity pertaining to distribution
+ * of the software without specific, written prior permission.  Justsystem 
+ * Corporation makes no representations about the suitability of this
+ * software for any purpose.  It is provided "as is" without express
+ * or implied warranty.
+ *
+ * Author: Atsushi Irisawa
+ */
+
+#ifndef lint
+static  char    rcsid[] = "$Id: if.c,v 1.3 1999/08/24 09:05:26 ishisone Exp $" ;
+#endif  /* !lint */
+
+#include	<stdio.h>
+#include	<X11/IntrinsicP.h>
+#include	<X11/StringDefs.h>
+#include	<X11/Xmu/Atoms.h>
+#include	<X11/keysym.h>
+
+#include	<Xatoklib.h>
+#include	<key_def.h>
+
+/* Page */
+/*
+ * [$B4X?tL>(B]
+ *              atokModeSet( )
+ * [$BI=Bj(B]
+ *              $B%b!<%I$N@_Dj(B
+ * [$B8F=P7A<0(B]
+ *      	int atokModeSet( _XatokRecPtr acomm, WORD ceCmd, WORD value )
+ *
+ * [$B0z?t(B]
+ *              $B7?(B           : $BL>(B   $B>N(B : IO : $B@b(B      $BL@(B
+ *		_XatokRecPtr : acomm   : i/o : kinput2$BMQJQ49%P%C%U%!(B
+ *		WORD         : ceCmd   : i   : CE $B%3%^%s%IHV9f(B
+ *		WORD         : value   : i   : $BCM(B
+ *
+ *
+ * [$BJV$jCM(B]
+ *		CE$B$N=hM}7k2L(B
+ * [$B;HMQ4X?t(B]
+ *		AtokClntCommunicate( )
+ * [$B5!G=(B]
+ *		CE$B$N%b!<%I$r9T$J$&(BAPI$B$r8F$S=P$9!#(B
+ *		value $B$,(BATCEPRVAPI_READCMD $B$N;~$O!"(B
+ *		$B8=:_$N@_DjCM$NFI$_9~$_$G$"$k!#(B
+ */
+WORD atokModeSet(acomm, ceCmd, value)
+_XatokRecPtr	acomm;
+WORD		ceCmd;
+WORD		value;
+{
+	if ( value  == ATCEPRVAPI_READCMD ) {
+		acomm->NETrqst.AtCEPrvAPIOutinf = ATCEPRVAPI_READCMD ;
+	}
+	else {
+		acomm->NETrqst.AtCEPrvAPIOutinf = value ;
+	}
+	acomm->NETrqst.ceCmd = ceCmd ; ;
+	AtokClntCommunicate( acomm->sock, &acomm->NETrqst, &acomm->NETrslt ) ;
+		
+	return acomm->NETrslt.header.CEOutinf ;
+}
+
+/* Page */
+/*
+ * [$B4X?tL>(B]
+ *              atokConnect( )
+ * [$BI=Bj(B]
+ *              ATOK12X $B%5!<%P$H$N@\B3(B
+ * [$B8F=P7A<0(B]
+ *      int atokConnect( char *server, char *port, char *conf, char  *style,
+ *				_XatokRecPtr acomm )
+ *
+ * [$B0z?t(B]
+ *              $B7?(B        : $BL>(B       $B>N(B   : IO : $B@b(B      $BL@(B
+ *		char         : *server : i   : ATOK12x $B2TF/%[%9%HL>(B
+ *		char         : *port   : i   : $B@\B3%5!<%S%9L>(B
+ *		char         : *conf   : i   : conf $B%U%!%$%kL>(B
+ *		char         : *style  : i   : style $B%U%!%$%kL>(B
+ *		_XatokRecPtr : acomm   : i/o : kinput2$BMQJQ49%P%C%U%!(B
+ *
+ *
+ * [$BJV$jCM(B]
+ *		0 $BL$K~(B : $B@\B3%(%i!<(B
+ *		 $B#00J>e(B :$B@\B3$7$?(BSOCKET$B5-=R;R(B
+ *
+ * [$B;HMQ4X?t(B]
+ *		AtokClntConnect( )
+ *		XatokBufferConvert( )
+ * [$B5!G=(B]
+ *		$B?75,$K(B ATO$B#1#2(Bx$B$H$N@\B3$r9T$J$&!#(B
+ *		$B@\B3$O%W%m%;%9$G#1$D$G$h$$!#(B
+ *		$B@\B3$,=PMh$?>l9g$K$O!"3F%b!<%I$N8=:_$N@_DjCM$r<hF@$9$k!#(B
+ */
+int atokConnect(server, port, conf, style, acomm)
+char	*server;
+char	*port;
+char	*conf;
+char	*style;
+_XatokRecPtr	acomm;
+{
+	wchar	dummy[128] ;
+	int	status ;
+	int	sock ;
+
+	sock = AtokClntConnect( server, port, conf, style,
+		&acomm->NETrqst, &acomm->NETrslt ) ;
+	if ( sock < 0 ) {
+		return sock ;
+	}
+
+	/*
+	 * $B@\B3$K@.8y$7$?$i8=:_$N%b!<%I$r<hF@$9$k!#(B
+	 *$B%b!<%IJ8;zNs$K4X$7$F$O!"@\B3;~$K%j%?!<%s$5$l$k!#(B
+	 */
+	XatokBufferConvert( acomm, ( WORD ) -1,  &acomm->NETrslt, 
+		dummy, &status, &status, &status, &status ) ;
+
+	acomm->sock = sock ;
+
+	/*
+	 * $B8=:_$N@_DjCM$r<hF@$9$k!#(B
+	 */
+	acomm->mode.modeKANDSP = atokModeSet( acomm, 
+			IME_PRV_SETKANDSP, ATCEPRVAPI_READCMD ) ;
+	acomm->mode.modeHEN = atokModeSet( acomm, 
+			IME_PRV_SETHENMODE, ATCEPRVAPI_READCMD ) ;
+	acomm->mode.modeGAKU = atokModeSet( acomm, 
+			IME_PRV_SETGAKUMODE, ATCEPRVAPI_READCMD ) ;
+	acomm->mode.modeKOTE = atokModeSet( acomm, 
+			IME_PRV_SETKOTEMODE, ATCEPRVAPI_READCMD ) ;
+	acomm->mode.modeOKURI = atokModeSet( acomm, 
+			IME_PRV_SETOKURIMODE, ATCEPRVAPI_READCMD ) ;
+	acomm->mode.modeROT = atokModeSet( acomm, 
+			IME_PRV_SETROTMODEF, ATCEPRVAPI_READCMD ) ;
+
+	return sock ;
+}
+/* Page */
+/*
+ * [$B4X?tL>(B]
+ *		atokCEOpen( )
+ * [$BI=Bj(B]
+ *              CONTEXT$B$N:n@.(B
+ * [$B8F=P7A<0(B]
+ *      int atokCEOpen( int sock, int clntid, _XatokRecPtr acomm )
+ *
+ * [$B0z?t(B]
+ *              $B7?(B        : $BL>(B       $B>N(B   : IO : $B@b(B      $BL@(B
+ * 		int          : sock    : i   : ATOK12X $B$H$N@\B3(BSOCKET
+ *		int          : clntid  : i   : $B%/%i%$%"%s%H(BID
+ *		_XatokRecPtr : acomm   : i/o : kinput2$BMQJQ49%P%C%U%!(B
+ *
+ * [$BJV$jCM(B]
+ *		-1 : CONTEXT$B:n@.%(%i!<(B
+ *		 1 : CONTEXT $B:n@.@.8y(B
+ *
+ * [$B;HMQ4X?t(B]
+ *		AtokClntCEOpen( )
+ *		XatokBufferConvert( )
+ * [$B5!G=(B]
+ *		$B4{$K@\B3$5$l$F$$$F!"%/%i%$%"%s%H(BID$B$,3d$jEv$F$i$l$F$$$k(B
+ *		$B%;%C%7%g%s$KBP$7!"(BATOK12CE $B$H$N(BCONTEXT$B$rDI2C:n@.$9$k!#(B
+ */
+
+int atokCEOpen(sock, clntid, acomm)
+int	sock;
+int	clntid;
+_XatokRecPtr	acomm;
+{
+	wchar	dummy[128] ;	/* BufferConvert $B$N$?$a$N(B TMP */
+	int	status ;	/* BufferConvert $B$N$?$a$N(B TMP */
+
+	if ( AtokClntCEOpen( sock, clntid, &acomm->NETrqst, &acomm->NETrslt ) < 0 ) {
+		return -1 ;
+	}
+
+	XatokBufferConvert( acomm, ( WORD ) -1,  &acomm->NETrslt, 
+		dummy, &status, &status, &status, &status ) ;
+
+	acomm->mode.modeKANDSP = atokModeSet( acomm, 
+			IME_PRV_SETKANDSP, ATCEPRVAPI_READCMD ) ;
+	acomm->mode.modeHEN = atokModeSet( acomm, 
+			IME_PRV_SETHENMODE, ATCEPRVAPI_READCMD ) ;
+	acomm->mode.modeGAKU = atokModeSet( acomm, 
+			IME_PRV_SETGAKUMODE, ATCEPRVAPI_READCMD ) ;
+	acomm->mode.modeKOTE = atokModeSet( acomm, 
+			IME_PRV_SETKOTEMODE, ATCEPRVAPI_READCMD ) ;
+	acomm->mode.modeOKURI = atokModeSet( acomm, 
+			IME_PRV_SETOKURIMODE, ATCEPRVAPI_READCMD ) ;
+	acomm->mode.modeROT = atokModeSet( acomm, 
+			IME_PRV_SETROTMODEF, ATCEPRVAPI_READCMD ) ;
+
+	return 1 ;
+}
+
+
+/* Page */
+/* 
+ * [$B4X?tL>(B]
+ *		atokKanjiOn
+ * [$BI=Bj(B]
+ *		$B4A;z(BON
+ * [$B8F=P7A<0(B]
+ *		int	atokKanjiOn( _XatokRecPtr acomm )
+ * [$B0z?t(B]
+ *		$B7?(B        : $BL>(B       $B>N(B   : IO : $B@b(B      $BL@(B
+ *		_XatokRecPtr : acomm   : i/o : kinput2$BMQJQ49%P%C%U%!(B
+ *	
+ * [$BJV$jCM(B]
+ *		0 $BL$K~(B : $B%(%i!<(B
+ *		0      : OK
+ *		
+ * [$B;HMQ4X?t(B]
+ *		atokClntCommunicate( )
+ * [$B5!G=(B]
+ *		CE $B$N%b!<%I$r4A;z(BON$B$H$9$k!#(B
+ *
+ */
+int atokKanjiOn(acomm)
+_XatokRecPtr	acomm;
+{
+	int	status ;
+
+	acomm->convStatus = M_KEYCONV ;
+	acomm->convStatus = acomm->oldStatus ;
+	acomm->NETrqst.ceCmd = IME_PRV_KANJION ;
+	acomm->curAux = acomm->menuAux ;
+
+	status = AtokClntCommunicate( acomm->sock, 
+		&acomm->NETrqst, &acomm->NETrslt ) ;
+	
+	return status ;
+}
+
+int atokKanjiOff(acomm)
+_XatokRecPtr	acomm;
+{
+	int	status ;
+
+	acomm->oldStatus = acomm->convStatus ;
+	acomm->convStatus = M_NOKEYCONV ;
+	acomm->NETrqst.ceCmd = IME_PRV_KANJIOFF ;
+	acomm->curAux = acomm->menuAux ;
+
+	status = AtokClntCommunicate( acomm->sock, 
+		&acomm->NETrqst, &acomm->NETrslt ) ;
+	
+	return status ;
+}
+
+/* Page */
+/*
+ * [$B4X?tL>(B]
+ *		atokWordStyleList( )
+ * [$BI=Bj(B]
+ *              $BIJ;l%j%9%H$N<hF@(B
+ * [$B8F=P7A<0(B]
+ *		int atokWordStyleList( _XatokRecPtr acomm )
+ *
+ * [$B0z?t(B]
+ *              $B7?(B           : $BL>(B  $B>N(B  : I O : $B@b(B      $BL@(B
+ *		_XatokRecPtr : acomm   : i/o : kinput2$BMQJQ49%P%C%U%!(B
+ *
+ * [$BJV$jCM(B]
+ *		-1 : $BAw?.%(%i!<(B
+ *		 N : $BIJ;l$N8D?t(B
+ *
+ * [$B;HMQ4X?t(B]
+ *		atokClntCommunicate( )
+ * [$B5!G=(B]
+ *		$B<-=q$KEPO?$9$k$?$a$NIJ;l%j%9%H$r<hF@$9$k!#(B
+ *		$BIJ;l%j%9%H$O(B S-JIS $B$GAw$i$l$FMh$k!#(Bkinput2 $BFbIt$G$O(B
+ *		EUC $B$G4IM}$7$F$$$k$?$a!"$3$3$G%3!<%IJQ49$r9T$J$&!#(B
+ *		$BIJ;l%j%9%H$O!"8uJd%j%9%H$r4IM}$9$k$N$HF1$8%P%C%U%!$G(B
+ *		$B4IM}$9$k!#$=$N%P%C%U%!$,<hF@$5$l$F$$$J$$>l9g$K$O!"(B
+ *		$B?7$?$K<hF@$9$k!#(B
+ */
+int atokWordStyleList(acomm)
+_XatokRecPtr	acomm;
+{
+	int		size ;
+	int		i, j, n ;
+	int		len ;
+	ATOKDEHINSTR	*sptr ;
+	char		euc[BUFSIZ] ;
+
+	if ( acomm->hinsiPtr ) {
+		goto make_cand ;
+	}
+
+	acomm->NETrqst.ceCmd = IME_PRV_WORDSYLECOUNT ;
+	if ( AtokClntCommunicate( acomm->sock, &acomm->NETrqst, &acomm->NETrslt ) < 0 ) {
+		return -1 ;
+	}
+
+#ifdef	ATOK_DEBUG
+	printf( "CHECK %d\n", acomm->NETrslt.header.CEOutinf ) ;
+#endif	/* ATOK_DEBUG */
+	acomm->hinsiNum = acomm->NETrslt.header.CEOutinf ;
+	acomm->NETrqst.ceCmd = IME_PRV_WORDSTYLELIST ;
+	acomm->NETrqst.AtCEIncode = acomm->hinsiNum ;
+#ifdef	ATOK_DEBUG
+printf( "\311\312\273\354\301\355\277\364 %d\n"/*=$BIJ;lAm?t(B %d\n=*/, acomm->hinsiNum ) ;
+#endif	/* ATOK_DEBUG */
+	AtokClntCommunicate( acomm->sock, &acomm->NETrqst, &acomm->NETrslt ) ;
+
+	size = sizeof( ATOKDEHINSTR ) * acomm->hinsiNum ;
+	acomm->hinsiPtr = ( ATOKDEHINSTR * )malloc( size ) ;
+	sptr = acomm->NETrslt.header.wordPtr ;
+	memcpy( acomm->hinsiPtr, sptr, size ) ;
+make_cand:
+	size = 0 ;
+	/*
+	 * S-JIS $B$GAw$i$l$F$-$?IJ;l%j%9%H%G!<%?$r(B kinput2$BB&$G07$($k$h$&$K(B
+	 * EUC $B$KJQ49$9$k!#(B
+	 */
+	for( i = 0 ; i < acomm->hinsiNum ; i++ ) {
+		size += s2e( acomm->hinsiPtr[i].szHinsiStr, 
+			strlen( acomm->hinsiPtr[i].szHinsiStr ),
+			euc, sizeof( euc )) ;
+	}
+	/*
+	 * $BIJ;l%j%9%H$r4IM}$9$k%P%C%U%!$O8uJd%j%9%H$r4IM}$9$k%P%C%U%!$H(B
+	 * $BF1$8NN0h$H$7!"4{$K3NJ]$5$l$F$$$k>l9g$K$O$=$NNN0h$O3NJ]$7$J$$!#(B
+	 * $B%P%C%U%!$r6&M-=PMh$k$N$O!"8uJd$r=PNOCf$K!"IJ;l%j%9%H$r(B
+	 * $B=PNO$9$k;v$,$J$$$+$i$G$"$j!"F1;~$K=PNO$9$k;v$,$"$k>l9g$K$O(B
+	 * $BNN0h$rJL$K$H$k$h$&$K=$@5$9$kI,MW$,$"$k!#(B
+	 */
+	if ( acomm->kohoSize == 0 ) {
+		acomm->kohoStrPtr =  ( WCHAR * )malloc( size * sizeof( WCHAR )) ;
+		acomm->kohoLenPtr = ( BYTE * )malloc( acomm->hinsiNum * sizeof( BYTE )) ;
+		acomm->kohoSfxPtr = ( BYTE * )malloc( acomm->hinsiNum * sizeof( BYTE )) ;
+		acomm->kohoSize = acomm->hinsiNum ;
+		acomm->kohoStrLen = size ;
+	}
+	if ( acomm->kohoSize < acomm->hinsiNum ) {
+		acomm->kohoLenPtr = ( BYTE * )realloc( acomm->kohoLenPtr, 
+			acomm->hinsiNum  * sizeof( BYTE )) ;
+		acomm->kohoSfxPtr = ( BYTE * )realloc( acomm->kohoSfxPtr, 
+			acomm->hinsiNum * sizeof( BYTE )) ;
+		acomm->kohoSize = n ;
+	}
+	if ( acomm->kohoStrLen < size ) {
+		acomm->kohoStrPtr = ( WCHAR * )realloc( acomm->kohoStrPtr,
+			size * sizeof( WCHAR )) ;
+		acomm->kohoStrLen = size ;
+	}
+	len = 0 ;
+	for( i = 0 ; i < acomm->hinsiNum ; i++ ) {
+		n = strlen( acomm->hinsiPtr[i].szHinsiStr ) ;
+		n = sjis2ucs( acomm->hinsiPtr[i].szHinsiStr, n, 
+			&acomm->kohoStrPtr[len], size -len, 0 ) ;
+		acomm->kohoLenPtr[i] = n ;
+		len += n ;
+	}
+	acomm->kohoNum2 = acomm->hinsiNum ;
+	acomm->kohoPos = 0 ;
+		
+	return acomm->hinsiNum ;
+}
+
+/* Page */
+/*
+ * [$B4X?tL>(B]
+ *              atokCandidate( )
+ * [$BI=Bj(B]
+ *              $B8uJd%j%9%H$N<hF@!?@_Dj(B
+ * [$B8F=P7A<0(B]
+ *      	int atokCandidate( _XatokRecPtr acomm, int nbr )
+ *
+ * [$B0z?t(B]
+ *              $B7?(B           : $BL>(B  $B>N(B  : I O : $B@b(B      $BL@(B
+ *		_XatokRecPtr : acomm   : i/o : kinput2$BMQJQ49%P%C%U%!(B
+ *		int          :   nbr   : i   : $B@_Dj$9$kHV9f(B
+ *
+ * [$BJV$jCM(B]
+ *		0 $BL$K~(B : $BAw?.%(%i!<(B
+ *		 0 : OK
+ *
+ * [$B;HMQ4X?t(B]
+ *		atokClntCommunicate( )
+ * [$B5!G=(B]
+ *		$B8uJd%j%9%H$h$j!"8=:_A*Br$5$l$F$$$k8uJdHV9f$r@_Dj$9$k!#(B
+ */
+int atokCandidate(acomm, nbr)
+_XatokRecPtr	acomm;
+int		nbr;
+{
+	int	status ;
+	/*
+	 * if $BJ8I,MW$J$7(B
+	 */
+	if ( nbr != ATCEPRVAPI_READCMD ) {
+		acomm->NETrqst.AtCEIncode = nbr ;
+	}
+	else {
+		acomm->NETrqst.AtCEIncode = ATCEPRVAPI_READCMD ;
+	}
+	acomm->NETrqst.ceCmd = IME_PRV_CANDLIST ;
+
+	status = AtokClntCommunicate( acomm->sock, &acomm->NETrqst, &acomm->NETrslt ) ;
+
+	return status ;
+}
+
+/* Page */
+/*
+ * [$B4X?tL>(B]
+ *		atokWordRegister( )
+ * [$BI=Bj(B]
+ *              $BC18l$NEPO?(B
+ * [$B8F=P7A<0(B]
+ *		atokWordRegister( _XatokRecPtr acomm, wchar *word,
+ *			int wlen, wchar	*yomi, int ylen, int hinshi )
+ *
+ * [$B0z?t(B]
+ *              $B7?(B           : $BL>(B  $B>N(B  : I O : $B@b(B      $BL@(B
+ *		_XatokRecPtr : acomm   : i/o : kinput2$BMQJQ49%P%C%U%!(B
+ *		wchar        : *word   : i   : $BEPO?C18l(B
+ *		int          : wlen    : i   : $BEPO?C18lD9$5(B
+ *		wchar        : *yomi   : i   : $BC18l$h$_(B
+ *		int          :  ylen   : i   : $BC18l$h$_$J$,$5(B
+ *		int          : hinshi  : i   : $BIJ;lHV9f(B
+ *
+ *
+ * [$BJV$jCM(B]
+ *		-1 : $BAw?.$G$-$J$$!#(B
+ *	 	 0 : $B@5>o=*N;(B
+ *		 1 : $B$3$NFI$_$G$O$3$l0J>eEPO?IT2D(B
+ *		 2 : $B$3$l0J>eEPO?IT2D(B
+ *		 3 : $B<-=q@_DjIT@5(B
+ *		 4 : $BI=5-$KITE,@Z$JJ8;z$r4^$`(B
+ *		 5 : $BEPO?$G$-$J$$!#(B
+ *		 6 : $BFI$_$KITE,@Z$JJ8;z$r4^$`(B
+ *		 7 : $B4{$KEPO?$5$l$F$$$k!#(B
+ *
+ * [$B;HMQ4X?t(B]
+ *		atokClntCommunicate( )
+ *		wcs2euc( )
+ *		euc2ucs( )
+ * [$B5!G=(B]
+ *		$BC18lEPO?$r9T$J$&!#(B
+ *		$BC18lI=5-!"$h$_$O(B $B$=$l$>$F(B UCS$B%3!<%I$GEPO?$9$k!#(B
+ *		kinput2 $B$G4IM}$7$F$$$k;~$O(B
+ *		$BC18lI=5-$O(B WCHAR, $BFI$_%3!<%I$O(BEUC$B$G$"$k$N$G$=$l$>$l(B
+ *		UCS $B$X$NJQ49$r0lEY9T$J$&!#(B
+ *		$BIJ;lHV9f$O!"#1$+$i;O$^$kJ*$G$"$k!#(B
+ */
+	
+int atokWordRegister(acomm, word, wlen, yomi, ylen, hinshi)
+_XatokRecPtr	acomm;
+wchar		*word;
+int		wlen;
+wchar		*yomi;
+int		ylen;
+int		hinshi;
+{
+	AtokReqPacket	*req ;
+	unsigned	char	*eucp ;
+	WCHAR		*ucs_wp ;		/* $BC18l(B UCS $BJ8;zNs(B */
+	WCHAR		*ucs_yp ;	/* $BFI$_(B UCS $BJ8;zNs(B */
+	unsigned char	*sjp ;
+	int		len ;
+	int		alen ;
+int i ;
+
+	if ( wlen > ylen ) 	alen = wlen ;
+	else			alen = ylen ;
+
+	acomm->NETrqst.ceCmd = IME_PRV_REGISTERWORDEX ;
+	req = &acomm->NETrqst ;
+/* printf( "wlen %d, ylen %d\n", wlen, ylen ) ; */
+
+	eucp = ( unsigned char * )malloc( alen * sizeof( WCHAR ) + 1 ) ;
+	sjp = ( unsigned char * )malloc( ylen * sizeof( WCHAR ) + 1 ) ;
+
+	/*
+	 * $BC18lJ8;zNs$r(B WCS -> EUC -> UCS $BJQ49$9$k!#(B
+	 */
+	bzero( eucp, alen ) ;
+	wcs2euc( word, wlen, eucp ) ;
+	len = strlen( eucp ) ;
+	ucs_wp = ( WCHAR * )malloc(( len  + 1 ) * sizeof( WCHAR )) ;
+	euc2ucs( eucp, strlen( eucp ), ucs_wp, len, 0x3013 ) ;
+
+#if 0
+printf( "\303\261\270\354 WCS CODE -> "/*=$BC18l(B WCS CODE -> =*/ ) ;
+for( i = 0 ; i <= wlen ; i++ ) {
+	printf( "0x%x ", word[i] ) ;
+}
+printf( "\303\261\270\354 EUC CODE -> "/*=$BC18l(B EUC CODE -> =*/ ) ;
+for( i = 0 ; i <= len ; i++ ) {
+	printf( "0x%x ", eucp[i] ) ;
+}
+printf( "\n" ) ;
+printf( "\303\261\270\354 EUC [%s]\n"/*=$BC18l(B EUC [%s]\n=*/, eucp ) ;
+printf( "\303\261\270\354 UCS CODE -> "/*=$BC18l(B UCS CODE -> =*/ ) ;
+for( i = 0 ; i <= wlen ; i++ ) {
+	/* printf( "0x%x ", ucs_wp[i] ) ; */
+}
+printf( "\n" ) ;
+#endif
+	
+
+	/*
+	 * $BFI$_J8;zNs$r(B WCS -> EUC -> UCS $BJQ49$9$k!#(B
+	 */
+	bzero( eucp, alen ) ;
+	wcs2euc( yomi, ylen, eucp ) ;
+	len = strlen( eucp ) ;
+	ucs_yp = ( WCHAR * )malloc(( len  + 1 ) * sizeof( WCHAR )) ;
+	euc2ucs( eucp, strlen( eucp ), ucs_yp, len, 0x3013 ) ;
+
+#if	0
+printf( "\306\311\244\337 EUC CODE -->"/*=$BFI$_(B EUC CODE -->=*/ ) ;
+for( i = 0 ; i <= len ; i++ ) {
+	printf( "0x%x ", eucp[i] ) ;
+}
+printf( "\n" ) ;
+printf( "\306\311\244\337 EUC [%s]\n"/*=$BFI$_(B EUC [%s]\n=*/, eucp ) ;
+for( i = 0 ; i <= strlen( eucp )  ; i++ ) {
+	printf( "0x%0x ", eucp[i] ) ;
+}
+printf( "\n" ) ;
+printf( "\306\311\244\337 UCS CODE -> "/*=$BFI$_(B UCS CODE -> =*/ ) ;
+for( i = 0 ; i <= ylen ; i++ ) {
+	printf( "0x%x ", ucs_yp[i] ) ;
+}
+printf( "\n" ) ;
+#endif
+
+	/*
+	 * $BAw?.%Q%i%a!<%?$N:n@.(B
+	 */
+	req->Kind[0] = T_WCHAR ;
+	req->Size[0] = wlen ;
+	req->ArgPtr[0] = ucs_wp ;
+
+	req->Kind[1] = T_WCHAR ;
+	req->Size[1] = ylen ;
+	req->ArgPtr[1] = ucs_yp ;
+
+	req->Ctr[0] = hinshi ;
+
+	AtokClntCommunicate( acomm->sock, &acomm->NETrqst, &acomm->NETrslt ) ;
+
+	free( ucs_wp ) ;
+	free( ucs_yp ) ;
+	free( eucp ) ;
+
+/* printf( "$BEPO?7k2L(B %d\n", acomm->NETrslt.header.CEOutinf ) ; */
+	return acomm->NETrslt.header.CEOutinf ;
+}
+/* End of if.c */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/Xatoklib/key.c	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,198 @@
+/* 
+ * Copyright 1999 Justsystem Corporation, Japan.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and that
+ * both that copyright notice and this permission notice appear in
+ * supporting documentation, and that the name of Justsystem Corporation
+ * not be used in advertising or publicity pertaining to distribution
+ * of the software without specific, written prior permission.  Justsystem 
+ * Corporation makes no representations about the suitability of this
+ * software for any purpose.  It is provided "as is" without express
+ * or implied warranty.
+ *
+ * Author: Atsushi Irisawa
+ */
+
+#ifndef lint
+static  char    rcsid[] = "$Id: key.c,v 1.3 1999/08/24 09:01:09 ishisone Exp $" ;
+#endif  /* !lint */
+
+
+#include	<X11/IntrinsicP.h>
+#include <X11/StringDefs.h>
+#include <X11/Xmu/Atoms.h>
+#include	<X11/keysym.h>
+
+#include	<Xatoklib.h>
+#include	<key_def.h>
+
+const WORD XkeyAAJtable[]={
+/*      0,8   ,1,9   ,2,a   ,3,b   ,4,c   ,5,d   ,6,e   ,7,f */
+        0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,    /* 00-07 */
+        0x0108,0x0109,0x0000,0x0000,0x0000,0x010d,0x0000,0x0000,    /* 08-0f */
+        0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,    /* 10-17 */
+        0x0000,0x0000,0x0000,0x011b,0x0000,0x0000,0x0000,0x0000,    /* 18-1f */
+	/*          !      "      #      $      %      &      ' */
+	/*     XK_Kanji XK_Muhenkan XK_                         */
+        0x0000,XFER,NFER,XFER,EIJI,HIRAGANA,KATAKANA,HIRAGANA,      /* 20-27 */
+	/*   (      )      *      +      ,      -               */
+          ZORH,  ZORH,  ZORH,0x0341,0x033a,0x0015,0x0000,0x0000,    /* 28-2f */
+        0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,    /* 30-37 */
+        0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,    /* 38-3f */
+        0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,    /* 40-47 */
+        0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,    /* 48-4f */
+	/*   P      Q      R      S      T      U      V      W */
+	/* XK_Home XK_Left XK_Up XK_Right XK_PageUP XK_PageDown XK_End */
+          HOME,  LEFT,    UP, RIGHT,  DOWN,  PGUP,  PGDN,  EEND,    /* 50-57 */
+	/*   X      Y      Z      [      \      ]      ^      _ */
+        0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,    /* 58-5f */
+	/*   `      a      b      c      d      e      f      g */
+        0x0000,0x0000,  NFER,   INS,0x0000,0x0000,0x0000,0x0000,    /* 60-67 */
+	/*   h      i      j      k      l      m      n      o */
+        0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,    /* 68-6f */
+	/*   p      q      r      s      t      u      v      w */
+        0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,    /* 70-77 */
+	/*   x      y      z      {      |      }      ~    del */
+        0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,    /* 78-7f */
+        0x0020,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,    /* 80-87 */
+        0x0000,   TAB,0x0000,0x0000,0x0000,    CR,0x0000,0x0000,    /* 88-8f */
+        0x0000,    F1,    F2,    F3,    F4,  HOME,  LEFT,    UP,    /* 90-97 */
+         RIGHT,  DOWN,  PGUP,  PGDN,  EEND,0x0000,   INS,   DEL,    /* 98-9f */
+        0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,    /* a0-a7 */
+        0x0000,0x0000,0x022a,0x022b,0x0000,0x022d,0x0000,0x022f,    /* a8-af */
+        0x0230,0x0231,0x0232,0x0233,0x0234,0x0235,0x0236,0x0237,    /* b0-b7 */
+	/*                                         XK_F1  XK_F2 */
+        0x0238,0x0239,0x0000,0x0000,0x0000,0x0000,    F1,    F2,    /* b8-bf */
+	/* XK_F3 XK_F4 XK_F5  XK_F6  XK_F7  XK_F8  XK_F9 XK_F10 */
+            F3,    F4,    F5,    F6,    F7,    F8,    F9,   F10,    /* c0-c7 */
+	/* XK_F11 XK_F12 XK_F13 XK_F14 XK_F15 XK_F16 XK_F17 XK_F18 */
+           F11,   F12,   F13,   F14,   F15,   F16,   F17,   F18,    /* c8-cf */
+	/* XK_F19 XK_F20                                        */
+           F19,   F20,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,    /* d0-d7 */
+	/*                                        XK_F33        */
+        0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,  HELP,0x0000,    /* d8-df */
+        0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,    /* e0-e7 */
+        0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,    /* e8-ef */
+        0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,    /* f0-f7 */
+	/*                                              XK_Delete */
+        0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,   DEL     /* f8-ff */
+};
+
+/* Page */
+/*
+ * [$B4X?tL>(B]
+ *		getAAJCode( )
+ * [$BI=Bj(B]
+ *              AAJCODE $B$N<hF@(B
+ * [$B8F=P7A<0(B]
+ *	WORD	getAAJCode( XKeyEvent *event, KeySym xkeysym,
+ *			unsigned char *kbuf )
+ *
+ * [$B0z?t(B]
+ *              $B7?(B            : $BL>(B  $B>N(B  : I O : $B@b(B      $BL@(B
+ *		XKeyEvent     : *event  : i   : X $B$N%$%Y%s%H%3!<%I(B
+ *		KeySym        : xkeysym : i   : X$B$N%-!<%7%s%\%k(B
+ *	        unsigned char : *kbuf   : i   : $BF~NO$5$l$?J8;z%3!<%I(B
+ *
+ * [$BJV$jCM(B]
+ *		AAJCODE : $BJQ49$5$l$?(BAAJCODE
+ *
+ * [$B;HMQ4X?t(B]
+ *		$B$J$7(B
+ * [$B5!G=(B]
+ *		X$B$N%-!<%$%Y%s%H$h$j!"(B AAJCODE$B$KJQ49$9$k!#(B
+ *
+ */
+WORD getAAJCode(event, xkeysym, kbuf)
+/* Fix Length */
+XKeyEvent	*event;
+KeySym		xkeysym;
+unsigned char	*kbuf;
+{
+
+	WORD	aajcode = 0 ;
+	unsigned char	ch ;
+
+	ch = kbuf[0] ;
+
+#ifdef	ATOK_DEBUG
+printf( "KEY CODE CH = 0x%02x\n", ch ) ;
+printf( "KEY SYM ORG 0x%x, FF00 4 = 0x%04x\n", xkeysym, xkeysym & 0xff00  ) ;
+printf( "KEY SYM CODE 4 = 0x%04x\n", xkeysym  ) ;
+printf( "SHIFT STAT %d\n",  event->state & ShiftMask )  ;
+printf( "CTRL STAT %d\n",  event->state & ControlMask )  ;
+
+#endif	/* ATOK_DEBUG */
+
+	/*
+ 	 * X $B$N5!G=%-!<$@$C$?>l9g(B,AAJTABLE $B$KDj5A$7$F$"$k%3!<%I$KJQ49(B
+	 */
+	if (( xkeysym & 0xFF00 ) == 0xFF00 ) {
+		int	index ;
+		index = xkeysym & 0xff ;
+#ifdef	ATOK_DEBUG
+		printf( "FUNCTIONAL KEY INDEX = 0x%02x\n", index  ) ;
+#endif	/* ATOK_DEBUG */
+		aajcode = XkeyAAJtable[index] ;
+		if ( !aajcode ) {
+			return 0 ;
+		}
+	}
+	/*
+ 	 * $BF~NO$5$l$?J8;z$H%-!<%3!<%I$,F1$8>l9g$K$O(B
+	 * $B$=$N%3!<%I$r(BAAJ$B%3!<%I$H$9$k!#(B
+ 	 * $BF~NOJ8;z$,%3%s%H%m!<%k%3!<%I$N>l9g$OF~NOJ8;z$r(B
+	 * AAJ$B%3!<%I$H$9$k!#(B
+	 */
+	else if ( ch == 0x8e ) {
+		aajcode = ( WORD )kbuf[1] ;
+	}
+	else if ( ch == xkeysym & 0xff ) {
+		aajcode = ( WORD )xkeysym ;
+	}
+	else if ( ch > 0 && ch < 0x20 ) {
+		aajcode = ch ;
+	}
+/* 990614 */
+	else if ( ch == 0 && xkeysym & 0xff ) {
+		aajcode = xkeysym & 0xff ;
+		if (( xkeysym & 0xff ) == '@' && ( event->state & ControlMask )) {
+			aajcode = 0x1000 ;
+			return aajcode ;
+		}
+	}
+/* 990614 */
+	else {
+	/* printf( "unknonw key\n" ) ; */
+		return 0 ;
+	}
+
+	if ( event->state & ShiftMask ) {
+		aajcode |= SHIFT ;
+	}
+	if ( event->state & ControlMask ) {
+		 aajcode |= CTRL ;
+	}
+	if( event->state & 0x08 ) { /* ALT Mask */
+                 aajcode |= ALT ;
+	}
+	switch( aajcode ) {
+		case 0x101b :	/* CTR + 3 */
+		case 0x101c :	/* CTR + 4 */
+		case 0x101d :	/* CTR + 5 */
+		case 0x101e :	/* CTR + 6 */
+		case 0x101f :	/* CTR + 7 */
+			aajcode = 0x1033 + aajcode - 0x101b ;
+			break ;
+	}
+
+
+	return aajcode ;
+}
+/* End of  key.c */
+
+
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/Xatoklib/key_def.h	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,848 @@
+/******************************************************************************
+* $B%U%!%$%kL>(B   : KEY_DEF.H
+* $B%U%!%$%k35MW(B : $BFbIt%-!<%3!<%I(B,$B5!G=%-!<HV9f(B,$B%-!<%G!<%?9=B$$NDj5A(B
+* $B:n@.<T(B   :
+* $B:n@.F|(B   :
+* $BE,MQ%7%9%F%`(B :
+* $BE,MQ5!<o(B :
+* $BFC5-;v9`(B :
+******************************************************************************/
+
+/*===========================================================================*/
+/* $B5!G=$NE}GQ9g$K$D$$$F$N%3%a%s%H!#(B  $B%+%9%?%^%$%6$N%9%?%$%k%3%s%P!<%H$K4X78!#(B*/
+/*===========================================================================*/
+/* ATOK11$B$N5!G=$r(BATOK12$B$G$OE}9g!"J,3d!":o=|$9$k5!G=$O0J2<$NDL$j(B */
+/*
+	ATOK11						-> ATOK12
+
+	FUNC_CAND_NEXT(0x3b)  $B<!8uJdI=<(Cf$N<!8uJd0\F0(B	-> FUNC_CNV_NEXT(0x08) $BJQ49(B($B<!8uJd(B)$B$XE}9g(B
+	FUNC_CAND_PREV(0x3d)  $B<!8uJdI=<(Cf$NA08uJd0\F0(B	-> FUNC_CNV_PREV(0x09) $BJQ49(B($BA08uJd(B)$B$XE}9g(B
+	FUNC_CNV_CODE(0x69)   $B%3!<%IJQ49(B                -> FUNC_CNV_NEXT(0x08) $BJQ49(B($B<!8uJd(B)$B$XE}9g(B
+	FUNC_DECIDEONE(0x7d)  $BJQ49J8@a#1J8;z3NDj(B	-> FUNC_KAKU_ONE(0x0a) $B#12;3NDj$XE}9g(B
+	FUNC_DESTRUCTONE(0x7e)$BJQ49J8@a#1J8;z>C5n(B	-> FUNC_CHR_DEL(0x01)  $B#1J8;z:o=|(B($B%+!<%=%k0LCV(B)$B$XE}9g(B
+	FUNC_REVERTFLUSH(0x82)$BJQ49<h>C$7$FA4J8;z:o=|(B	-> FUNC_CNV_CANCL(0x32) $BJQ49<h>C(B($BCmL\J8@a0J9_(B) $B$H(B FUNC_DEL_ALL(0x1e) $BA4J8;z:o=|$XJ,3d(B
+	FUNC_ICONEXEC(0xb1)   $B:G>.2=(B			-> $B:o=|(B
+	FUNC_OPPLEXEC(0xb5)   $BA`:n%Q%l%C%H5/F0(B          -> $B:o=|(B
+*/
+
+
+/*===========================================================================*/
+/*      ATOK$B5!G=%-!<HV9fDj5A(B                                                 */
+/*===========================================================================*/
+/*
+	00$B!A(Bff$B$r5!G=%-!<HV9f$H$7$FDj5A$9$k(B
+	(@$B%^!<%/$O%Q%l%C%HMQ$K8x3+$7$F$$$k5!G=HV9f(B. @@$B$O(BWien$B$GDI2CM=Dj(B)
+	($B!_%^!<%/$O%-!<!"%Q%l%C%H$H$b$K8x3+$7$J$$5!G=HV9f$G$"$k(B)
+	(<<$B%^!<%/$O(BATOK12$B$+$i$NJQ992U=j$G$"$k(B)
+*/
+
+/* $B"#JQ99MzNr(B */
+/*    98/06/18	$B:o=|(B FUNC_CNV_FUKUGO	0x9d $BJ#9g8lJQ49(B */
+/*    98/06/18	$B:o=|(B FUNC_MENU_ENV	0x5b $B4D6-@_Dj0l3g@ZBX%a%K%e!<(B */
+
+#define FUNC_CHR_BS		0x00 	/*@ $B#1J8;z:o=|(B($B%+!<%=%k$N:8B&(B)  */
+#define FUNC_CHR_DEL		0x01	/*@ $B#1J8;z:o=|(B($B%+!<%=%k0LCV(B)	$B5l$NJQ49J8@a#1J8;z>C5n5!G=$r%W%i%9(B */
+#define FUNC_CHR_RIGHT		0x02	/*@ $B%+!<%=%k0\F0(B($B#1J8;z1&(B)      */
+#define FUNC_CHR_LEFT		0x03	/*@ $B%+!<%=%k0\F0(B($B#1J8;z:8(B)      */
+#define FUNC_CHR_TAIL		0x04	/*@ $B%+!<%=%k0\F0(B($BJ8Kv(B)          */
+#define FUNC_CHR_HEAD		0x05	/*@ $B%+!<%=%k0\F0(B($BJ8F,(B)          */
+#define FUNC_CNV_BUSYU		0x06	/*@ $BIt<sJQ49(B                    */
+#define FUNC_CNV_KEEP		0x07	/*  $B7QB3JQ49(B($B<+F0JQ49;~(B)        */
+#define FUNC_CNV_NEXT		0x08	/*@ $BJQ49(B($B<!8uJd(B)				$B5lL>(B FUNC_CNV */
+#define FUNC_CNV_PREV		0x09	/*  $BJQ49(B($BA08uJd(B)                <<$BDI2C(B*/
+#define FUNC_KAKU_ONE		0x0a	/*@ $B#12;3NDj(B                    $B5l$NJQ49J8@a#1J8;z3NDj5!G=$r%W%i%9(B */
+#define FUNC_CNV_HMUHEN		0x0b	/*@ $BH>3QL5JQ498eJQ49(B			$B5lL>(B FUNC_CNV_HANMU */
+#define FUNC_CNV_HIRA		0x0c	/*@ $B$R$i$,$J(B($B8e(B)$BJQ49(B            */
+#define FUNC_CNV_ZKATA		0x0d	/*@ $B%+%?%+%J(B($B8e(B)$BJQ49(B            $B5lL>(B FUNC_CNV_KANA */
+#define FUNC_CNV_HAN		0x0e	/*@ $BH>3Q(B($B8e(B)$BJQ49(B                */
+#define FUNC_CNV_ZMUHEN		0x0f	/*@ $BL5JQ49(B($B8e(B)$BJQ49(B              $B5lL>(B FUNC_CNV_MUHEN */
+#define FUNC_MENU_DIC		0x10	/*@ $BJQ49<-=q@ZBXA*Br%a%K%e!<(B    */
+#define FUNC_CNV_DIC01		0x11	/*@ $B<-=q#1JQ49(B                  */
+#define FUNC_CNV_DIC02		0x12	/*@ $B<-=q#2JQ49(B                  */
+#define FUNC_CNV_DIC03		0x13	/*@ $B<-=q#3JQ49(B                  */
+#define FUNC_CNV_DIC04		0x14	/*@ $B<-=q#4JQ49(B                  */
+#define FUNC_CNV_DIC05		0x15	/*@ $B<-=q#5JQ49(B                  */
+#define FUNC_CNV_DIC06		0x16	/*@ $B<-=q#6JQ49(B                  */
+#define FUNC_CNV_DIC07		0x17	/*@ $B<-=q#7JQ49(B                  */
+#define FUNC_CNV_DIC08		0x18	/*@ $B<-=q#8JQ49(B                  */
+#define FUNC_CNV_DIC09		0x19	/*@ $B<-=q#9JQ49(B                  */
+#define FUNC_CNV_DIC10		0x1a	/*@ $B<-=q#0JQ49(B                  */
+#define FUNC_KAKU_BUBUN		0x1b	/*@ $BItJ,3NDj(B($BCmL\J8@a$^$G(B)      */
+#define FUNC_CANDZ   		0x1c	/*@ $BA48uJdJQ49(B	                $B5lL>(B FUNC_CAND_ALL */
+#define FUNC_KAKU_ALL		0x1d	/*@ $BA4J83NDj(B                    */
+#define FUNC_DEL_ALL		0x1e	/*@ $BA4J8;z:o=|(B                  */
+#define FUNC_REPEAT		0x1f    /*@ $B3NDj%j%T!<%H(B                */
+#define FUNC_UNDO		0x20	/*@ $B3NDj%"%s%I%%(B                */
+#define FUNC_KAKU_BUBUNONE	0x21	/*$B!_ItJ,3NDj(B($B@hF,J8@a$N$_(B)      <<$BDI2C(B $BHs8x3+(BHN */
+#define FUNC_MENU_ALL		0x22	/*@ ATOK$B%a%K%e!<(B                */
+#define FUNC_MENU_MOJI		0x23	/*@ $BF~NOJ8;z<oA*Br%a%K%e!<(B      */
+#define FUNC_MENU_KUTO		0x24	/*@ $B6gFIE@%b!<%IA*Br%a%K%e!<(B    */
+#define FUNC_SWTCH_AFIX		0x25	/*  $B8GDjF~NO=g<!@ZBX(B            $B5lL>(B FUNC_SWTCH_AKOTE */
+#define FUNC_SWTCH_EFIX	    	0x26	/*  $B8GDjF~NO1Q;z=g<!@ZBX(B        $B5lL>(B FUNC_SWTCH_EKOTE */
+#define FUNC_SWTCH_KFIX	    	0x27	/*  $B8GDjF~NO%+%?%+%J=g<!@ZBX(B    $B5lL>(B FUNC_SWTCH_KKOTE */
+#define FUNC_SWTCH_KUTO		0x28	/*  $B6gFIE@%b!<%I@ZBX(B            */
+#define FUNC_ONOFF_FIXHIRA	0x29	/*@ $BA43Q$R$i$,$J8GDj(B($B$"(B)ON/OFF  $B5lL>(B FUNC_ONOFF_HIRA */
+#define FUNC_ONOFF_FIXZKATA	0x2a	/*@ $BA43Q%+%?%+%J8GDj(B($B%"(B)ON/OFF  $B5lL>(B FUNC_ONOFF_ZKANA */
+#define FUNC_ONOFF_FIXHKATA	0x2b	/*@ $BH>3Q%+%?%+%J8GDj(B($B%"(B)ON/OFF   $B5lL>(B FUNC_ONOFF_HKANA */
+#define FUNC_ONOFF_FIXZMUHEN	0x2c	/*@ $BL5JQ49A43Q8GDj(B($B#A(B)ON/OFF    $B5lL>(B FUNC_ONOFF_MUHEN */
+#define FUNC_ONOFF_FIXHMUHEN	0x2d	/*@ $BL5JQ49H>3Q8GDj(B(A)ON/OFF     $B5lL>(B FUNC_ONOFF_HAN */
+#define FUNC_ONOFF_EIJI		0x2e	/*@ $B1Q;zF~NO(BON/OFF              */
+#define FUNC_CHR_ERRYOMI	0x2f	/*@ $BF~NOFI$_8m$j0LCV%8%c%s%W(B    */
+#define FUNC_KAKU_HEAD		0x30	/*@ $B#1J8;z3NDj(B($BJ8F,(B)            $B5lL>(B FUNC_OUT_HEAD */
+#define FUNC_KAKU_TAIL		0x31	/*@ $B#1J8;z3NDj(B($BJ8Kv(B)            $B5lL>(B FUNC_OUT_TAIL */
+#define FUNC_CNV_CANCL		0x32	/*@ $BJQ49<h>C(B($BCmL\J8@a0J9_(B)      */
+#define FUNC_CNV_CANCLALL	0x33	/*@ $BA4JQ49<h>C(B                  */
+#define FUNC_KUGI_RIGHT		0x34	/*@ $BJ8@a6h@Z$j(B($B#1J8;z1&(B)        $B5lL>(B FUNC_FOCUS_RIGHT */
+#define FUNC_KUGI_LEFT		0x35	/*@ $BJ8@a6h@Z$j(B($B#1J8;z:8(B)        $B5lL>(B FUNC_FOCUS_LEFT */
+#define FUNC_BST_NEXT		0x36	/*@ $BJ8@a0\F0(B($B1&(B)                $B5lL>(B FUNC_FOCUS_NEXT */
+#define FUNC_BST_PREV		0x37	/*@ $BJ8@a0\F0(B($B:8(B)                $B5lL>(B FUNC_FOCUS_PREV */
+#define FUNC_BST_TAIL		0x38	/*@ $BJ8@a0\F0(B($B:G=*(B)              $B5lL>(B FUNC_FOCUS_TAIL */
+#define FUNC_BST_HEAD		0x39	/*@ $BJ8@a0\F0(B($B@hF,(B)              $B5lL>(B FUNC_FOCUS_HEAD */
+#define FUNC_TAN_DEL		0x3a	/*@ $BC18l:o=|(B                    */
+/*				0x3b	    $B3HD%MQ(B                      <<$B:o=|(B FUNC_CAND_NEXT $B<!8uJd0\F0(B */
+/*				0x3c	    $B3HD%MQ(B                      */
+/*				0x3d	    $B3HD%MQ(B                      <<$B:o=|(B FUNC_CAND_PREV $BA08uJd0\F0(B */
+#define FUNC_CAND_PGNEXT	0x3e	/*  $B<!8uJd72I=<((B                $B5lL>(B FUNC_CNV_PGNEXT */
+#define FUNC_CAND_PGPREV	0x3f	/*  $BA08uJd72I=<((B                $B5lL>(B FUNC_CNV_PGPREV */
+#define FUNC_SWTCH_ZORH		0x40	/*  $BA43Q!?H>3QJ8;z@ZBX(B          */
+#define FUNC_TAN_TOROKU		0x41	/*@ $BC18lEPO?(B                    */
+/*				0x42	    $B3HD%MQ(B                      */
+#define FUNC_SWTCH_OKRI		0x43	/*  $BAw$j$,$J%b!<%I=g<!@ZBX(B      */
+#define FUNC_SWTCH_ROMA		0x44	/*  $B4A;zF~NO%b!<%I@ZBX(B          */
+#define FUNC_SWTCH_HEN		0x45	/*  $BJQ49%b!<%I=g<!@ZBX(B          */
+#define FUNC_SWTCH_AKCI		0x46	/*  $BF~NOJ8;z<o=g<!@ZBX(B          */
+#define FUNC_SWTCH_EKCI		0x47	/*  $BF~NOJ8;z<o1Q;z=g<!@ZBX(B      */
+#define FUNC_SWTCH_KKCI		0x48	/*  $BF~NOJ8;z<o%+%?%+%J=g<!@ZBX(B  */
+#define FUNC_TO_KCIHIRA		0x49	/*@ $BF~NOJ8;z<oA43Q$R$i$,$J(B($B$"(B)	$B5lL>(B FUNC_TO_KC_HIRA */
+#define FUNC_TO_KCIZKATA	0x4a	/*@ $BF~NOJ8;z<oA43Q%+%?%+%J(B($B%"(B)  $B5lL>(B FUNC_TO_KC_ZKANA */
+#define FUNC_TO_KCIHKATA	0x4b	/*@ $BF~NOJ8;z<oH>3Q%+%?%+%J(B($B%"(B)   $B5lL>(B FUNC_TO_KC_HKANA */
+#define FUNC_TO_KCIZMUHEN	0x4c	/*@ $BF~NOJ8;z<oL5JQ49A43Q(B($B#A(B)    $B5lL>(B FUNC_TO_KC_MUHEN */
+#define FUNC_TO_KCIHMUHEN	0x4d	/*@ $BF~NOJ8;z<oL5JQ49H>3Q(B(A)     $B5lL>(B FUNC_TO_KC_HAN */
+#define FUNC_TO_DIC		0x4e	/*@ $B<-=q!&3X=,JQ99(B              */
+#define FUNC_SWTCH_KOUGO	0x4f	/*  $B8}8lBN%b!<%I@ZBX(B            */
+#define FUNC_MENU_KOUGO		0x50	/*@ $B8}8lBN%b!<%IA*Br%a%K%e!<(B    */
+#define FUNC_MENU_ROMA		0x51	/*@ $B4A;zF~NO%b!<%IA*Br%a%K%e!<(B  */
+#define FUNC_MENU_HEN		0x52	/*@ $BJQ49%b!<%IA*Br%a%K%e!<(B      */
+/*				0x53	    $B3HD%MQ(B                      */
+#define FUNC_MENU_OKRI		0x54	/*@ $BAw$j$,$JA*Br%a%K%e!<(B        */
+#define FUNC_MENU_COMP		0x55	/*$B!_(BATOK$BL$3NDjJ8;z%a%K%e!<(B      */
+#define FUNC_MENU_CAND		0x56	/*$B!_(BATOK$B8uJd%a%K%e!<(B            */
+#define FUNC_CHG_KANHAN		0x57	/*  $B4A;z!?H>3Q%b!<%I@ZBX(B        */
+#define FUNC_MENU_IM		0x58	/*@ $BF~NO%b!<%IA*Br%a%K%e!<(B      */
+#define FUNC_ONOFF_ATOK		0x59	/*  ATOK ON/OFF                 <<$B8x3+I|3h(B */
+#define FUNC_SWTCH_IM		0x5a	/*  $BF~NO%b!<%I=g<!@ZBX(B          */
+/* #define FUNC_MENU_ENV	0x5b	/* @@$B4D6-@_Dj0l3g@ZBX%a%K%e!<(B	<<$BDI2C(B */
+#define FUNC_MENU_OPE		0x5c	/*@@$BA`:n%a%K%e!<(B		<<$BDI2C(B */
+#define FUNC_MENU_REYOMI	0x5d	/*  $B:FJQ49JLFI$_%a%K%e!<(B	<<$BDI2C(B */
+/*				0x5e	    $B3HD%MQ(B                      */
+/*				0x5f	    $B3HD%MQ(B                      */
+/*				0x60	    $B3HD%MQ(B                      */
+/*				0x61	    $B3HD%MQ(B                      */
+/*				0x62	    $B3HD%MQ(B                      */
+/*				0x63	    $B3HD%MQ(B                      */
+/*				0x64	    $B3HD%MQ(B                      */
+/*				0x65	    $B3HD%MQ(B                      */
+#define FUNC_MENU_HAN		0x66	/*@ $BH>3Q%b!<%IA*Br%a%K%e!<(B      */
+#define FUNC_MENU_KCODE		0x67	/*  $B%3!<%IBN7OA*Br%a%K%e!<(B      */
+#define FUNC_MENU_GUIDE		0x68	/*$B!_(BATOK$B%,%$%I%a%K%e!<(B		*/
+/*				0x69	    $B3HD%MQ(B                      <<$B:o=|(B FUNC_CNV_CODE $B%3!<%IJQ49(B */
+#define FUNC_SWTCH_KCODE	0x6a	/*  $B%3!<%IBN7O=g<!@ZBX(B          */
+/*				0x6b	    $B3HD%MQ(B                      */
+#define FUNC_SWTCH_HAN		0x6c	/*  $BH>3Q%b!<%I=g<!@ZBX(B          */
+#define FUNC_KIGO_KAKU		0x6d	/*  $B5-9f3NDj(B                    */
+#define FUNC_KIGO_NEXT		0x6e	/*  $B5-9f<!8uJd0\F0(B              */
+#define FUNC_KIGO_PREV		0x6f	/*  $B5-9fA08uJd0\F0(B              */
+#define FUNC_KIGO_PGNEXT	0x70	/*  $B5-9f<!8uJd72I=<((B            */
+#define FUNC_KIGO_PGPREV	0x71	/*  $B5-9fA08uJd72I=<((B            */
+#define FUNC_KUTEN_NEXT		0x72	/*  $B5-9f<!6hE@I=<((B              */
+#define FUNC_KUTEN_PREV		0x73	/*  $B5-9fA06hE@I=<((B              */
+#define FUNC_KANJ_TOP		0x74	/*  $B5-9f@hF,I=<((B                */
+#define FUNC_GAIJ_TOP		0x75	/*  $B5-9f30;z@hF,I=<((B            */
+#define FUNC_CAND_NEXTATR	0x76	/*  $B<!8uJdB0@-%8%c%s%W(B          $B5lL>(B FUNC_KOHOATR_NEXT */
+#define FUNC_CAND_PREVATR	0x77	/*  $BA08uJdB0@-%8%c%s%W(B          $B5lL>(B FUNC_KOHOATR_PREV */
+#define FUNC_CNV_ACNV		0x78	/*  $B=g<!8eJQ49(B                  $B5lL>(B FUNC_CNV_AATHN */
+#define FUNC_CNV_ECNV		0x79	/*  $B=g<!L5JQ498eJQ49(B            $B5lL>(B FUNC_CNV_EATHN */
+#define FUNC_CNV_KCNV		0x7a	/*  $B=g<!%+%?%+%J8eJQ49(B          $B5lL>(B FUNC_CNV_KATHN */
+#define FUNC_KUGI_ROMARIGHT	0x7b	/*@ $B%m!<%^;z6h@Z$jD>$7(B($B1&(B)      $B5lL>(B FUNC_CHG_RMADJUST_R */
+#define FUNC_KUGI_ROMALEFT	0x7c	/*@ $B%m!<%^;z6h@Z$jD>$7(B($B:8(B)      $B5lL>(B FUNC_CHG_RMADJUST_L */
+/*				0x7d	    $B3HD%MQ(B			<<$B:o=|(B FUNC_DECIDEONE   $BJQ49J8@a#1J8;z3NDj(B */
+/*				0x7e	    $B3HD%MQ(B			<<$B:o=|(B FUNC_DESTRUCTONE $BJQ49J8@a#1J8;z>C5n(B */
+#define FUNC_CNVREAD_AORK	0x7f	/*  $B1Q;zFI$_%+%JFI$_=g<!JQ49(B    */
+#define FUNC_CNVREAD_KTOA	0x80	/*  $B1Q;zFI$_JQ49(B                */
+#define FUNC_CNVREAD_ATOK	0x81	/*  $B%+%JFI$_JQ49(B                */
+#define FUNC_SWTCH_HIRAKATA	0x82	/*  $BJ8;z<o=g<!@ZBX(B($B$"(B/$B%"(B)       <<$BDI2C(BHN <<$B:o=|(B FUNC_REVERTFLUSH $BJQ49<h>C$7$FA4J8;z:o=|(B */
+#define FUNC_SWTCH_HIRAKATAEI	0x83	/*  $BJ8;z<o=g<!@ZBX(B($B$"(B/$B%"(B/$B#A(B)    <<$BDI2C(BHN */
+#define FUNC_SWTCH_HIKAEI	0x84	/*  $BJ8;z<o=g<!@ZBX(B($B$"(B,$B%"(B/$B#A(B)    <<$BDI2C(BHN */
+#define FUNC_SWTCH_HIRAEI	0x85	/*  $BJ8;z<o=g<!@ZBX(B($B$"(B/$B#A(B)       <<$BDI2C(BHN */
+#define FUNC_SWTCH_KATAEI	0x86	/*  $BJ8;z<o=g<!@ZBX(B($B%"(B/$B#A(B)	    <<$BDI2C(BHN */
+#define FUNC_ONOFF_FIXMODE	0x87	/*  $B8GDjF~NO(BON/OFF              <<$BDI2C(BHN */
+/*				0x88	    $B3HD%MQ(B                      */
+/*				0x89	    $B3HD%MQ(B                      */
+/*				0x8a	    $B3HD%MQ(B                      */
+/*				0x8b	    $B3HD%MQ(B                      */
+/*				0x8c	    $B3HD%MQ(B			*/
+#define FUNC_CAND_SORTFULL	0x8d	/*  $B8uJdJB$SBX$((B($B%3!<%I=g(B)	<<$BDI2C(BHN*/
+#define FUNC_CAND_SORTHEAD	0x8e	/*  $B8uJdJB$SBX$((B($B@hF,J8;z(B)	<<$BDI2C(BHN*/
+#define FUNC_CAND_SORTTAIL	0x8f	/*  $B8uJdJB$SBX$((B($BKvHxJ8;z(B)	<<$BDI2C(BHN*/
+#define FUNC_MENU_AMET		0x90	/*@ $B#A#M#E#T@ZBXA*Br%a%K%e!<(B    $B5lL>(B FUNC_MENU_VARI */
+#define FUNC_AMET01		0x91	/*@ $B#A#M#E#T#1(B                  $B5lL>(B FUNC_OUT_VARI01 */
+#define FUNC_AMET02		0x92	/*@ $B#A#M#E#T#2(B                  $B5lL>(B FUNC_OUT_VARI02 */
+#define FUNC_AMET03		0x93	/*@ $B#A#M#E#T#3(B                  $B5lL>(B FUNC_OUT_VARI03 */
+#define FUNC_AMET04		0x94	/*@ $B#A#M#E#T#4(B                  $B5lL>(B FUNC_OUT_VARI04 */
+#define FUNC_AMET05		0x95	/*@ $B#A#M#E#T#5(B                  $B5lL>(B FUNC_OUT_VARI05 */
+#define FUNC_AMET06		0x96	/*@ $B#A#M#E#T#6(B                  $B5lL>(B FUNC_OUT_VARI06 */
+#define FUNC_AMET07		0x97	/*@ $B#A#M#E#T#7(B                  $B5lL>(B FUNC_OUT_VARI07 */
+#define FUNC_AMET08		0x98	/*@ $B#A#M#E#T#8(B                  $B5lL>(B FUNC_OUT_VARI08 */
+#define FUNC_AMET09		0x99	/*@ $B#A#M#E#T#9(B                  $B5lL>(B FUNC_OUT_VARI09 */
+#define FUNC_AMET10		0x9a	/*@ $B#A#M#E#T#0(B                  $B5lL>(B FUNC_OUT_VARI10 */
+/*				0x9b	    $B3HD%MQ(B                      */
+/*				0x9c	    $B3HD%MQ(B                      */
+/* #define FUNC_CNV_FUKUGO	0x9d	/*  $BJ#9g8lJQ49(B                  <<$BDI2CHyL/(B*/
+#define FUNC_CNV_ABBREV		0x9e	/*@@$B>JF~NOJQ49(B                  <<$BDI2C(BHN */
+#define FUNC_CNV_UNDO		0x9f	/*@@$B:FJQ49(B                      <<$BDI2C(B */
+#define FUNC_TO_KANJ		0xa0	/*  $B4A;z%b!<%I(B                  */
+#define FUNC_TO_HAN		0xa1	/*  $BH>3Q%b!<%I(B                  */
+#define FUNC_TO_CODE		0xa2	/*  $B%3!<%IF~NO%b!<%I(B            */
+#define FUNC_TO_KIGO		0xa3	/*  $B5-9f%b!<%I(B                  */
+/*				0xa4	    $B3HD%MQ(B                      */
+#define FUNC_ON_KANALK		0xa5	/*  $B%+%J%m%C%/(BON                */
+#define FUNC_OFF_KANALK 	0xa6	/*  $B%+%J%m%C%/(BOFF               */
+#define FUNC_ONOFF_KANALK	0xa7	/*  $B%+%J%m%C%/(BONOFF             */
+#define FUNC_CANDZ_NEXT		0xa8	/*  $BA48uJd<!9`L\0\F0(B		*/
+#define FUNC_CAND_HEAD		0xa9	/*  $B8uJd0\F0(B($B@hF,(B)              <<$BDI2C(B */
+#define FUNC_CANDZ_PREV		0xaa	/*  $BA48uJdA09`L\0\F0(B		*/
+#define FUNC_CANDZ_LNNEXT	0xab	/*  $BA48uJd<!9T9`L\0\F0(B          $B5lL>(B FUNC_CAND_LNNEXT */
+#define FUNC_CANDZ_LNPREV	0xac	/*  $BA48uJdA09T9`L\0\F0(B          $B5lL>(B FUNC_CAND_LNPREV */
+#define FUNC_CANDZ_KAKU		0xad	/*  $BA48uJd9`L\A*Br3NDj(B          $B5lL>(B FUNC_CAND_KAKU */
+#define FUNC_CANDZ_ESC		0xae	/*  $BA48uJd9`L\A*Br<h>C(B          $B5lL>(B FUNC_CAND_ESC */
+#define FUNC_CAND_TAIL		0xaf	/*  $B8uJd0\F0(B($B:G=*(B)              <<$BDI2C(B */
+#define FUNC_APLEXEC_STARTNO	0xb0    /* $B%"%W%j5/F04X783+;O(BNO.  */
+/* #define FUNC_HELPEXEC	0xb0	/*@ $B%X%k%W5/F0(B                  */
+#define FUNC_MENU_HELP		0xb0	/*@ $B%X%k%W%a%K%e!<5/F0(B		*/
+/*    $BK\Mh!"5/F07O$G$J$$$,%9%?%$%k%3%s%P!<%H$J$I$N8_49@-$N0Y$K$3$3$KF~$l$k(B */
+/*				0xb1	    $B3HD%MQ(B                      <<$B:o=|(B FUNC_ICONEXEC $B:G>.2=(B */
+#define FUNC_ATUTEXEC		0xb2	/*@ ATOK$B%W%m%Q%F%#5/F0(B          */
+#define FUNC_UTEXEC		0xb3	/*@ $B<-=q%f!<%F%#%j%F%#5/F0(B      */
+#define FUNC_MJPLEXEC		0xb4	/*@ $BJ8;z%Q%l%C%H5/F0(B            */
+/*				0xb5	/*  $B3HD%MQ(B						<<$B:o=|(B FUNC_OPPLEXEC $BA`:n%Q%l%C%H(B */
+#define FUNC_SOFTKEYBOARD	0xb6	/*@ $B%/%j%C%/%Q%l%C%H(B		*/
+#define FUNC_RESULTRECORD	0xb7	/*@ $BJ8;zNs%\%C%/%95/F0(B		*/
+#define FUNC_FUNCKEYGUIDE	0xb8	/*@@$B%U%!%s%/%7%g%s%-!<%,%$%I(B	*/
+#define FUNC_HELPTOPICEXEC	0xb9	/*$B!_%X%k%W%H%T%C%/5/F0(B		*/
+#define FUNC_HELPWEBEXEC	0xba	/*$B!_(BWeb$B%X%k%W5/F0(B		*/
+#define FUNC_VERINFOEXEC	0xbb	/*$B!_%P!<%8%g%s>pJs5/F0(B		*/
+
+#define FUNC_APLEXEC_ENDNO	0xbb   /* $B%"%W%j5/F04X78=*N;(BNO     */
+/*				0xbc	    $B3HD%MQ(B                      */
+/*				0xbd	    $B3HD%MQ(B                      */
+/*				0xbe	    $B3HD%MQ(B                      */
+/*				0xbf	    $B3HD%MQ(B                      */
+/*				0xc0	    $B3HD%MQ(B                      */
+/*				0xc1	    $B3HD%MQ(B                      */
+/*				0xc2	    $B3HD%MQ(B                      */
+/*				0xc3	    $B3HD%MQ(B                      */
+/*				0xc4	    $B3HD%MQ(B                      */
+/*				0xc5	    $B3HD%MQ(B                      */
+/*				0xc6	    $B3HD%MQ(B                      */
+/*				0xc7	    $B3HD%MQ(B                      */
+/*				0xc8	    $B3HD%MQ(B                      */
+/*				0xc9	    $B3HD%MQ(B                      */
+/*				0xca	    $B3HD%MQ(B                      */
+/*				0xcb	    $B3HD%MQ(B                      */
+/*				0xcc	    $B3HD%MQ(B                      */
+/*				0xcd	    $B3HD%MQ(B                      */
+/*				0xce	    $B3HD%MQ(B                      */
+/*				0xcf	    $B3HD%MQ(B                      */
+/*				0xd0	    $B3HD%MQ(B                      */
+/*				0xd1	    $B3HD%MQ(B                      */
+/*				0xd2	    $B3HD%MQ(B                      */
+/*				0xd3	    $B3HD%MQ(B                      */
+/*				0xd4	    $B3HD%MQ(B                      */
+/*				0xd5	    $B3HD%MQ(B                      */
+/*				0xd6	    $B3HD%MQ(B                      */
+/*				0xd7	    $B3HD%MQ(B                      */
+/*				0xd8	    $B3HD%MQ(B                      */
+/*				0xd9	    $B3HD%MQ(B                      */
+/*				0xda	    $B3HD%MQ(B                      */
+/*				0xdb	    $B3HD%MQ(B                      */
+/*				0xdc	    $B3HD%MQ(B                      */
+/*				0xdd	    $B3HD%MQ(B                      */
+/*				0xde	    $B3HD%MQ(B                      */
+/*				0xdf	    $B3HD%MQ(B			*/
+/*--------------------------------------------------------------------*/
+/* $B0J2<$O!"(BATOK$BFbIt2>A[5!G=%-!<HV9fDj5A(B($B%+%9%?%^%$%6$K$OL54X78$J$b$N(B  */
+/*--------------------------------------------------------------------*/
+#define VFUNC_MENU_ESC		0xe0	/*$B!_%a%K%e!<(B($B%b!<%I(B)$B2r=|(B        */
+#define VFUNC_MENU_KAKU		0xe1	/*$B!_%a%K%e!<(B($B%b!<%I(B)$B3NDj(B        */
+#define VFUNC_CANDDIRECT	0xe2	/*$B!_<!8uJd%@%$%l%/%H(B            */
+#define VFUNC_FLUSH     	0xe3	/*$B!_%U%i%C%7%e(B                  */
+#define VFUNC_FLUSH_KAKU	0xe4	/*$B!_%U%i%C%7%e(B($B3NDj$7$F(B)        */
+#define VFUNC_GUIDE_KAKU	0xe5	/*$B!_%,%$%I%i%$%sF~NO3NDj(B        */
+#define VFUNC_OTHERCANDLIST	0xe6	/*$B!_<!$NJL8uJd%j%9%H$X$N@ZBX(B    <<$BDI2C(B*/
+#define VFUNC_SOLOSHIFTKEY	0xe7	/*$B!_C1FH(BShift$B%-!<$G$N2r=|=hM}(B   <<$BDI2C(B*/
+/*				0xe8	    $B3HD%MQ(B                      */
+/*				0xe9	    $B3HD%MQ(B                      */
+/*				0xea	    $B3HD%MQ(B                      */
+/*				0xeb	    $B3HD%MQ(B                      */
+/*				0xec	    $B3HD%MQ(B                      */
+/*				0xed	    $B3HD%MQ(B                      */
+/*				0xee	    $B3HD%MQ(B                      */
+/*				0xef	    $B3HD%MQ(B                      */
+/*				0xf0	    $B3HD%MQ(B                      */
+/*				0xf1	    $B3HD%MQ(B                      */
+/*				0xf2	    $B3HD%MQ(B                      */
+/*				0xf3	    $B3HD%MQ(B                      */
+/*				0xf4	    $B3HD%MQ(B                      */
+/*				0xf5	    $B3HD%MQ(B                      */
+/*				0xf6	    $B3HD%MQ(B                      */
+/*				0xf7	    $B3HD%MQ(B                      */
+/*				0xf8	    $B3HD%MQ(B			*/
+/*				0xf9	    $B3HD%MQ(B                      */
+/*				0xfa	    $B3HD%MQ(B                      */
+/*				0xfb	    $B3HD%MQ(B                      */
+/*				0xfc	    $B3HD%MQ(B                      */
+/*				0xfd	    $B3HD%MQ(B                      */
+/*				0xfe	    $B3HD%MQ(B                      */
+/*				0xff	    $B3HD%MQ(B                      */
+
+/*===========================================================================*/
+/*      $B%+%9%?%^%$%65!G=%-!<HV9fM-8z>uBVDj5A(B                                 */
+/*===========================================================================*/
+/*
+   $B%+%9%?%^%$%65!G=%-!<HV9f$NM-8z>uBV$O(B
+	$B4A(B1 : $BJ8;zL$F~NO(B          $BH>(B : $BH>3QF~NO(B
+	$B4A(B2 : $BJ8;zF~NOCf(B          $B5-(B : $B5-9fF~NO(B
+	$B4A(B3 : $BJQ49Cf(B
+	$B4A(B4 : $B<!8uJdI=<(Cf(B      ($B%3!<%IF~NO>uBV$O$J$$(B   ($BJ8@a=$@5Cf>uBV$O$J$$(B
+	$B4A(B5 : $BA48uJdI=<(Cf(B       $B%3(B1 : $B4A(B1,$B5-$N%5%V%;%C%H(B $B4A(B1$B$H$7$F07$&(B)
+	$B4A(B6 : $BJ8@a6h@Z$jD>$7Cf(B   $B%3(B2 : $B4A(B2$B$N%5%V%;%C%H(B)
+   $B$NAH$_9g$o$;$GDj5A$5$l$k(B
+*/
+#define FNG_NONE	    0x0000	/* $B>uBV$J$7(B : 0$B8GDjCM(B */
+#define FNG_KANNONE         0x0001	/* $B4A(B1 : $BJ8;zL$F~NO(B */
+#define FNG_KANINPUT        0x0002	/* $B4A(B2 : $BJ8;zF~NOCf(B */
+#define FNG_KANHENKAN       0x0004	/* $B4A(B3 : $BJQ49Cf(B */
+#define FNG_KANKOHO         0x0008	/* $B4A(B4 : $B<!8uJdI=<(Cf(B */
+#define FNG_KANZKOHO        0x0010	/* $B4A(B5 : $BA48uJdI=<(Cf(B */
+#define FNG_KANKUGIRI       0x0020	/* $B4A(B6 : $BJ8@a6h@Z$jD>$7Cf(B */
+#define FNG_HAN             0x4000	/* $BH>(B  : $BH>3QF~NO(B */
+#define FNG_KIGOU           0x8000	/* $B5-(B  : $B5-9fF~NO(B */
+/*
+  $B"(Cm0U(B $B%+%9%?%^%$%6>uBVDj5A$NHO0O$O(B0x0001$B!A(B0x8000$B$H$9$k!#(B
+  ATOK$BFbIt>uBVDj5A$NHO0O$O(B0x00010000$B!A(B0x80000000$B$H$9$k!#(B
+*/
+#define FNG_NEUTRAL	  (FNG_KANNONE | FNG_HAN | FNG_KIGOU)
+#define FNG_KANALLMIGHTY  (FNG_KANNONE | FNG_KANINPUT | FNG_KANHENKAN | FNG_KANKOHO | FNG_KANZKOHO | FNG_KANKUGIRI)
+#define FNG_ALLMIGHTY	  (FNG_KANALLMIGHTY | FNG_HAN | FNG_KIGOU)
+#define FNG_KANALLINPUT   (FNG_KANNONE | FNG_KANINPUT )
+#define FNG_KANSTOCK	  (FNG_KANINPUT | FNG_KANHENKAN | FNG_KANKOHO | FNG_KANZKOHO | FNG_KANKUGIRI)
+#define FNG_KANSTOCK234   (FNG_KANINPUT | FNG_KANHENKAN | FNG_KANKOHO )
+#define FNG_KANSTOCK2346  (FNG_KANINPUT | FNG_KANHENKAN | FNG_KANKOHO | FNG_KANKUGIRI)
+#define FNG_KANSTOCK236   (FNG_KANINPUT  | FNG_KANHENKAN | FNG_KANKUGIRI)
+#define FNG_KANSTOCK34    (FNG_KANHENKAN | FNG_KANKOHO)
+#define FNG_KANSTOCK345   (FNG_KANHENKAN | FNG_KANKOHO | FNG_KANZKOHO)
+#define FNG_KANSTOCK346   (FNG_KANHENKAN | FNG_KANKOHO | FNG_KANKUGIRI)
+#define FNG_KANSTOCK3456  (FNG_KANHENKAN | FNG_KANKOHO | FNG_KANZKOHO | FNG_KANKUGIRI)
+#define FNG_KANKOHOCMN    (FNG_KANKOHO | FNG_KANZKOHO)
+/*
+#define FNG_KANUNDO     (FNG_KANNONE | FNG_KANINPUT | FNG_KANHENKAN)
+#define FNG_KANUNDOTOGGLE (FNG_KANNONE | FNG_KANINPUT | FNG_KANHENKAN | FNG_KANKOHO | FNG_KANKUGIRI)
+*/
+
+/*===========================================================================*/
+/*      ATOKCE$BFbIt>uBVDj5A(B $B%+%9%?%^%$%6$K$O4X78$J$$ItJ,(B $B$3$3$+$i(B             */
+/*===========================================================================*/
+
+/*
+   ATOK$B%(%s%8%sFbIt5!G=%-!<HV9f$NM-8z>uBV$O%+%9%?%^%$%6>uBV$K2C$($F0J2<$N>uBV$,$"$k!#(B
+   $B$3$N>uBV$O%+%9%?%^%$%6$K$OL54X78!#(B
+*/
+/* $B"(2<5-$rJQ99$9$k>l9g$O!"(Batok12ce.rc$B$N(BFNGR_xxx$B$bJQ99$9$kI,MW$"$j!#(B*/
+#define FNG_ATOKOFF	0x00100000	/* OFF : $B4A;z(BOFF			$B!J%-!<$O!"FCJL=hM}!K(B*/
+#define FNG_CODENONE	0x00010000	/* $B%3(B1  : $B%3!<%IL$F~NO(B		$B!J%-!<$O!"4A(B1($BJ8;zL$F~NO(B)$B>uBV$G;2>H!K(B*/
+#define FNG_CODEINPUT	0x00020000	/* $B%3(B2  : $B%3!<%IF~NOCf(B		$B!J%-!<$O!"4A(B2($BJ8;zF~NOCf(B)$B>uBV$G;2>H!K(B*/
+#define FNG_BUSYU	0x00040000	/* $BIt(B  : $BIt<s!"%3!<%IJQ49Cf(B	$B!J%-!<$O!"5-9f(B	         $B>uBV$G;2>H!K(B*/
+#define FNG_TANDEL	0x00200000	/* $B:o(B  : $BC18l:o=|Cf(B			$B!J%-!<$O!"4A(B3($BJQ49Cf(B)    $B>uBV$G;2>H!K(B*/
+#define FNGSP_CHGINPUT	0x10000000	/* $BF~NO%b!<%I(B(rot)$BJQ99$K4X$o$k5!G=(B($BFCJL(B)*/
+#define FNGSP_AMET	0x20000000	/* AMET$B5/F05!G=(B($BFCJL(B)*/
+/*
+   $B"(%+%9%?%^%$%6>uBVDj5A$NHO0O$O(B0x0001$B!A(B0x8000$B$H$9$k!#(B
+     ATOK$BFbIt>uBVDj5A$NHO0O$O(B0x00010000$B!A(B0x80000000$B$H$9$k!#(B
+*/
+
+
+/*===========================================================================*/
+/*      ATOK$B%(%s%8%sF~NO%-!<%3!<%IDj5A(B(AAJ$B%-!<%3!<%II=(B)                      */
+/*===========================================================================*/
+/*****************************************************************************/
+/* AAJ$B%-!<%3!<%II=(B($B3HD%%$%Y%s%HDj5A(B)                                         */
+/*****************************************************************************/
+#define BUTTONEVENT	0x7ffa	/* Mouse Event*/
+#define KANJIINPUTEVENT	0x7ffb	/* $B4A;z%3!<%IF~NO(B Event*/
+/*
+   AAJ$B%3!<%I$NDj5A$,(B2$B%P%$%H$N9=@.$G$"$k$?$a!">u67$K$h$j(BAAJ$B3HD%%(%j%"$r;HMQ$9$k(B
+   1.$B3HD%(B1 .AtCEIncode($BF~NO%-!<%3!<%I(B)$B$NCM$,(BBUTTONEVENT$B$N>l9g(B
+     $B%^%&%9A`:n%$%Y%s%H$H2r<a$5$l!"0J2<$N9`L\$r;2>H$9$k!#(B(MSE_DEF.H$B;2>H(B)
+      .AtCEInMouseMsg  ($BF~NO%^%&%9%a%C%;!<%8%?%$%W(B)
+      .AtCEInWndNo     ($BF~NO%^%&%9%a%C%;!<%8H/@8%&%$%s%I%&(B)
+      .AtCEInEventPosX ($BF~NO%^%&%9%a%C%;!<%8H/@8J8;z0LCV(B     1$B!A(B)
+      .AtCEInEventPosY ($BF~NO%^%&%9%a%C%;!<%8H/@8J8;z0LCVJdB-(B 0/1 $BA0H>(B/$B8eH>(B)
+   2.$B3HD%(B2 .AtCEIncode($BF~NO%-!<%3!<%I(B)$B$NCM$,(BKANJIINPUTEVENT$B$N>l9g(B
+     UCS2$BJ8;zF~NO%$%Y%s%H$H2r<a$5$l!"0J2<$N9`L\$r;2>H$9$k!#(B
+      .AtCEInkanjicode ($BF~NO%-!<%3!<%I(B(UCS2$BJ8;z%3!<%I(B))
+   
+   $B0J30$O(BAAJ$B%-!<%3!<%ICM$,@_Dj$5$l$k!#(B(KEY_DEF.H$B;2>H(B)
+    [AAJ$B%3!<%I(B]
+      NKEY                     $BL58z%-!<Dj5A(B
+      (VKEY|$B5!G=%-!<HV9f(B)      $B2>A[%-!<Dj5A(B(ATOK$B5!G=%-!<(B)
+      (VMOJIKEY|$B2>A[J8;zHV9f(B)  $B2>A[%-!<Dj5A(B($BFHJ)H/2;J8;z%-!<(B)
+      $BJ*M}%-!<%3!<%I(B
+     |                               |               |
+     | 15  14  13  12| 11  10  09  08| 07          00|
+     |---|---|---|---|---|---|---|---|-----.....-----|
+           |   |   |       |   |   |    $B%-!<%3!<%ICM(B
+           |   |   |       |   |   | 
+           |   |   |       |   |   |__ FNCKEY($B5!G=%-!<(B bit)
+           |   |   |       |   |______ TENKEY($B%F%s%-!<(B bit)
+           |   |   |       |__________ SHIFT (Shift$B>uBV(Bbit)
+           |   |   | 
+           |   |   |__________________ CTRL  (Ctrl$B>uBV(B bit)
+           |   |______________________ ALT   (Alt$B>uBV(B  bit)
+           |__________________________ CAPS  (CAPS$B>uBV(B bit)
+*/
+
+/*****************************************************************************/
+/* AAJ$B%-!<%3!<%II=(B($B@)8f(Bbit$BDj5A(B)                                              */
+/*****************************************************************************/
+#define NKEY		0xffff		/* $BL58z%-!<%3!<%IDj5A(B*/
+#define VKEY		0x0300		/* 0x03xx  $B2>A[5!G=%-!<%3!<%I(Bbit*/
+#define VKEY_H		0x03		/* 0x03xx  $B2>A[5!G=%-!<%3!<%I(Bbit*/
+#define FNCKEY		0x0100		/* $B5!G=%-!<(Bbit*/
+#define TENKEY		0x0200		/* $B%F%s%-!<(Bbit*/
+#define SHIFT		0x0400		/* Shift$B>uBV(Bbit*/
+#define VMOJIKEY	0x0a00		/* 0x0axx  $B2>A[J8;z%-!<%3!<%I(Bbit*/
+#define VMOJIKEY_H	0x0a		/* 0x0axx  $B2>A[J8;z%-!<%3!<%I(Bbit*/
+#define CTRL		0x1000		/* Ctrl$B>uBV(Bbit*/
+#define ALT		0x2000		/* Alt$B>uBV(B bit*/
+#define GRPH		ALT		/*  "*/
+#define CAPS		0x4000		/* CAPS$B>uBV(B bit*/
+
+#define NOTMOJIKEY_MASK	(FNCKEY|CTRL|ALT) /*$BJ8;z%-!<H=DjMQ(BMask*/
+#define VKEY_MASK	0x0300		/* $B2>A[5!G=%-!<H=DjMQ(BMask*/
+#define VMOJIKEY_MASK	0x0a00		/* $B2>A[J8;z%-!<%3!<%IH=DjMQ(BMask*/
+
+/************************************************************************/
+/* AAJ$B%-!<%3!<%II=(B($BJ*M}%-!<%3!<%ICMDj5A(B)                                */
+/************************************************************************/
+#define SPACE			0x0020			/* Space */
+#define BS			(FNCKEY|0x0008) 	/* BackSpace */
+#define TAB			(FNCKEY|0x0009) 	/* Tab */
+#define CR			(FNCKEY|0x000d)		/* Enter */
+#define EESC			(FNCKEY|0x001b)		/* Esc */
+#define F1			(FNCKEY|0x0021)		/* F1 $B!A(B F20 */
+#define F2			(FNCKEY|0x0022)		/**/
+#define F3			(FNCKEY|0x0023)		/**/
+#define F4			(FNCKEY|0x0024)		/**/
+#define F5			(FNCKEY|0x0025)		/**/
+#define F6			(FNCKEY|0x0026)		/**/
+#define F7			(FNCKEY|0x0027)		/**/
+#define F8			(FNCKEY|0x0028)		/**/
+#define F9			(FNCKEY|0x0029)		/**/
+#define F10			(FNCKEY|0x002A)		/**/
+#define F11			(FNCKEY|0x002B)		/**/
+#define F12			(FNCKEY|0x002C)		/**/
+#define F13			(FNCKEY|0x002D)		/**/
+#define F14			(FNCKEY|0x002E)		/**/
+#define F15			(FNCKEY|0x002F)		/**/
+#define F16			(FNCKEY|0x0030)		/**/
+#define F17			(FNCKEY|0x0031)		/**/
+#define F18			(FNCKEY|0x0032)		/**/
+#define F19			(FNCKEY|0x0033)		/**/
+#define F20			(FNCKEY|0x0034)		/**/
+/*#define JIKKO			(FNCKEY|0x0046)		/* $B<B9T(B */
+/*#define CLEAR			(FNCKEY|0x0047)		/* $B%/%j%"(B */
+/*#define SHURYOU		(FNCKEY|0x0048)		/* $B=*N;(B */
+/*#define TORIKESI		(FNCKEY|0x0049)		/* $B<h>C(B */
+#define EEND			(FNCKEY|0x004f)		/* End */
+#define HIRAGANA		(FNCKEY|0x0050)		/* $B$R$i$,$J(B */
+#define KATAKANA		(FNCKEY|0x0051)		/* $B%+%?%+%J(B */
+#define EIJI			(FNCKEY|0x0052)		/* $B1Q?t(B */
+#define ZORH			(FNCKEY|0x0053)		/* $BA43Q!&H>3Q(B */
+#define ROMA			(FNCKEY|0x0054)		/* $B%m!<%^;z(B<< */
+/*#define LWIN			(FNCKEY|0x005a)		/* Windows(Left) */
+/*#define RWIN			(FNCKEY|0x005b)		/* Windows(Right) */
+/*#define APPS			(FNCKEY|0x005c)		/* Application */
+#define XFER			(FNCKEY|0x0060)		/* $BJQ49(B */
+#define PGDN			(FNCKEY|0x0061)		/* PageDown */
+#define RLUP			PGDN			/* " */
+#define PGUP			(FNCKEY|0x0062)		/* PageUp */
+#define RLDN			PGUP			/* " */
+#define INS			(FNCKEY|0x0063)		/* Insert */
+#define DEL			(FNCKEY|0x0064)		/* Delete */
+#define UP			(FNCKEY|0x0065)		/* $B",(B */
+#define LEFT			(FNCKEY|0x0066)		/* $B"+(B */
+#define RIGHT			(FNCKEY|0x0067)		/* $B"*(B */
+#define DOWN			(FNCKEY|0x0068)		/* $B"-(B */
+#define HOME			(FNCKEY|0x0069)		/* Home */
+#define HELP			(FNCKEY|0x006a)		/* Help */
+#define NFER			(FNCKEY|0x006b)		/* $BL5JQ49(B */
+#define KANJ			(FNCKEY|0x006c)		/* $B4A;z(B */
+
+#define SFT_SP			(SHIFT+SPACE)
+#define SFT_BS			(SHIFT+BS)
+#define SFT_TAB			(SHIFT+TAB)
+#define SFT_CR			(SHIFT+CR)
+#define SFT_ESC			(SHIFT+EESC)
+#define SFT_F1			(SHIFT+F1)
+#define SFT_F2			(SHIFT+F2)
+#define SFT_F3			(SHIFT+F3)
+#define SFT_F4			(SHIFT+F4)
+#define SFT_F5			(SHIFT+F5)
+#define SFT_F6			(SHIFT+F6)
+#define SFT_F7			(SHIFT+F7)
+#define SFT_F8			(SHIFT+F8)
+#define SFT_F9			(SHIFT+F9)
+#define SFT_F10			(SHIFT+F10)
+#define SFT_F11			(SHIFT+F11)
+#define SFT_F12			(SHIFT+F12)
+#define SFT_F13			(SHIFT+F13)
+#define SFT_F14			(SHIFT+F14)
+#define SFT_F15			(SHIFT+F15)
+#define SFT_F16			(SHIFT+F16)
+#define SFT_F17			(SHIFT+F17)
+#define SFT_F18			(SHIFT+F18)
+#define SFT_F19			(SHIFT+F19)
+#define SFT_F20			(SHIFT+F20)
+/*#define SFT_JIKKO		(SHIFT+JIKKO)	*/
+/*#define SFT_CLEAR		(SHIFT+CLEAR)	*/
+/*#define SFT_SHURYOU		(SHIFT+SHURYOU)	*/
+/*#define SFT_TORIKESI		(SHIFT+TORIKESI)*/
+#define SFT_EEND		(SHIFT+EEND)
+/*#define SFT_HIRAGANA		(SHIFT+HIRAGANA)*/
+/*#define SFT_KATAKANA		(SHIFT+KATAKANA)*/
+/*#define SFT_EIJI		(SHIFT+EIJI)	*/
+/*#define SFT_ZORH		(SHIFT+ZORH)	*/
+/*#define SFT_ROMA		(SHIFT+ROMA)	*/
+/*#define SFT_LWIN		(SHIFT+LWIN)	*/
+/*#define SFT_RWIN		(SHIFT+RWIN)	*/
+/*#define SFT_APPS		(SHIFT+APPS)	*/
+#define SFT_XFER		(SHIFT+XFER)
+#define SFT_PGDN		(SHIFT+PGDN)
+#define SFT_RLUP		SFT_PGDN
+#define SFT_PGUP		(SHIFT+PGUP)
+#define SFT_RLDN		SFT_PGUP
+#define SFT_INS			(SHIFT+INS)
+#define SFT_DEL			(SHIFT+DEL)
+#define SFT_UP			(SHIFT+UP)
+#define SFT_LEFT		(SHIFT+LEFT)
+#define SFT_RIGHT		(SHIFT+RIGHT)
+#define SFT_DOWN		(SHIFT+DOWN)
+#define SFT_HOME		(SHIFT+HOME)
+#define SFT_HELP		(SHIFT+HELP)
+#define SFT_NFER		(SHIFT+NFER)
+#define SFT_KANJ		(SHIFT+KANJ)
+
+#define CTR_SP			(CTRL+SPACE)
+#define CTR_BS			(CTRL+BS)
+#define CTR_TAB			(CTRL+TAB)
+#define CTR_CR			(CTRL+CR)
+#define CTR_ESC			(CTRL+EESC)
+#define CTR_F1			(CTRL+F1)
+#define CTR_F2			(CTRL+F2)
+#define CTR_F3			(CTRL+F3)
+#define CTR_F4			(CTRL+F4)
+#define CTR_F5			(CTRL+F5)
+#define CTR_F6			(CTRL+F6)
+#define CTR_F7			(CTRL+F7)
+#define CTR_F8			(CTRL+F8)
+#define CTR_F9			(CTRL+F9)
+#define CTR_F10			(CTRL+F10)
+#define CTR_F11			(CTRL+F11)
+#define CTR_F12			(CTRL+F12)
+#define CTR_F13			(CTRL+F13)
+#define CTR_F14			(CTRL+F14)
+#define CTR_F15			(CTRL+F15)
+#define CTR_F16			(CTRL+F16)
+#define CTR_F17			(CTRL+F17)
+#define CTR_F18			(CTRL+F18)
+#define CTR_F19			(CTRL+F19)
+#define CTR_F20			(CTRL+F20)
+/*#define CTR_JIKKO		(CTRL+JIKKO)	*/
+/*#define CTR_CLEAR		(CTRL+CLEAR)	*/
+/*#define CTR_SHURYOU		(CTRL+SHURYOU)	*/
+/*#define CTR_TORIKESI		(CTRL+TORIKESI)	*/
+#define CTR_EEND		(CTRL+EEND)
+/*#define CTR_HIRAGANA		(CTRL+HIRAGANA)	*/
+/*#define CTR_KATAKANA		(CTRL+KATAKANA)	*/
+/*#define CTR_EIJI		(CTRL+EIJI)	*/
+/*#define CTR_ZORH		(CTRL+ZORH)	*/
+/*#define CTR_ROMA		(CTRL+ROMA)	*/
+/*#define CTR_LWIN		(CTRL+LWIN)	*/
+/*#define CTR_RWIN		(CTRL+RWIN)	*/
+/*#define CTR_APPS		(CTRL+APPS)	*/
+#define CTR_XFER		(CTRL+XFER)
+#define CTR_PGDN		(CTRL+PGDN)
+#define CTR_RLUP		CTR_PGDN
+#define CTR_PGUP		(CTRL+PGUP)
+#define CTR_RLDN		CTR_PGUP
+#define CTR_INS			(CTRL+INS)
+#define CTR_DEL			(CTRL+DEL)
+#define CTR_UP			(CTRL+UP)
+#define CTR_LEFT		(CTRL+LEFT)
+#define CTR_RIGHT		(CTRL+RIGHT)
+#define CTR_DOWN		(CTRL+DOWN)
+#define CTR_HOME		(CTRL+HOME)
+#define CTR_HELP		(CTRL+HELP)
+#define CTR_NFER		(CTRL+NFER)
+#define CTR_KANJ		(CTRL+KANJ)
+
+#define CTRSFT_SP		(CTRL+SHIFT+SPACE)
+#define CTRSFT_BS		(CTRL+SHIFT+BS)
+#define CTRSFT_TAB		(CTRL+SHIFT+TAB)
+#define CTRSFT_CR		(CTRL+SHIFT+CR)
+#define CTRSFT_ESC		(CTRL+SHIFT+EESC)
+#define CTRSFT_F1		(CTRL+SHIFT+F1)
+#define CTRSFT_F2		(CTRL+SHIFT+F2)
+#define CTRSFT_F3		(CTRL+SHIFT+F3)
+#define CTRSFT_F4		(CTRL+SHIFT+F4)
+#define CTRSFT_F5		(CTRL+SHIFT+F5)
+#define CTRSFT_F6		(CTRL+SHIFT+F6)
+#define CTRSFT_F7		(CTRL+SHIFT+F7)
+#define CTRSFT_F8		(CTRL+SHIFT+F8)
+#define CTRSFT_F9		(CTRL+SHIFT+F9)
+#define CTRSFT_F10		(CTRL+SHIFT+F10)
+#define CTRSFT_F11		(CTRL+SHIFT+F11)
+#define CTRSFT_F12		(CTRL+SHIFT+F12)
+#define CTRSFT_F13		(CTRL+SHIFT+F13)
+#define CTRSFT_F14		(CTRL+SHIFT+F14)
+#define CTRSFT_F15		(CTRL+SHIFT+F15)
+#define CTRSFT_F16		(CTRL+SHIFT+F16)
+#define CTRSFT_F17		(CTRL+SHIFT+F17)
+#define CTRSFT_F18		(CTRL+SHIFT+F18)
+#define CTRSFT_F19		(CTRL+SHIFT+F19)
+#define CTRSFT_F20		(CTRL+SHIFT+F20)
+/*#define CTRSFT_JIKKO		(CTRL+SHIFT+JIKKO)	*/
+/*#define CTRSFT_CLEAR		(CTRL+SHIFT+CLEAR)	*/
+/*#define CTRSFT_SHURYOU	(CTRL+SHIFT+SHURYOU)	*/
+/*#define CTRSFT_TORIKESI	(CTRL+SHIFT+TORIKESI)	*/
+#define CTRSFT_EEND		(CTRL+SHIFT+EEND)
+/*#define CTRSFT_HIRAGANA	(CTRL+SHIFT+HIRAGANA)	*/
+/*#define CTRSFT_KATAKANA	(CTRL+SHIFT+KATAKANA)	*/
+/*#define CTRSFT_EIJI		(CTRL+SHIFT+EIJI)	*/
+/*#define CTRSFT_ZORH		(CTRL+SHIFT+ZORH)	*/
+/*#define CTRSFT_ROMA		(CTRL+SHIFT+ROMA)	*/
+/*#define CTRSFT_LWIN		(CTRL+SHIFT+LWIN)	*/
+/*#define CTRSFT_RWIN		(CTRL+SHIFT+RWIN)	*/
+/*#define CTRSFT_APPS		(CTRL+SHIFT+APPS)	*/
+#define CTRSFT_XFER		(CTRL+SHIFT+XFER)
+#define CTRSFT_PGDN		(CTRL+SHIFT+PGDN)
+#define CTRSFT_RLUP		CTRSFT_PGDN
+#define CTRSFT_PGUP		(CTRL+SHIFT+PGUP)
+#define CTRSFT_RLDN		CTRSFT_PGUP
+#define CTRSFT_INS		(CTRL+SHIFT+INS)
+#define CTRSFT_DEL		(CTRL+SHIFT+DEL)
+#define CTRSFT_UP		(CTRL+SHIFT+UP)
+#define CTRSFT_LEFT		(CTRL+SHIFT+LEFT)
+#define CTRSFT_RIGHT		(CTRL+SHIFT+RIGHT)
+#define CTRSFT_DOWN		(CTRL+SHIFT+DOWN)
+#define CTRSFT_HOME		(CTRL+SHIFT+HOME)
+#define CTRSFT_HELP		(CTRL+SHIFT+HELP)
+#define CTRSFT_NFER		(CTRL+SHIFT+NFER)
+#define CTRSFT_KANJ		(CTRL+SHIFT+KANJ)
+#define SFTCTR_SP		CTRSFT_SP
+#define SFTCTR_BS		CTRSFT_BS
+#define SFTCTR_TAB		CTRSFT_TAB
+#define SFTCTR_CR		CTRSFT_CR
+#define SFTCTR_ESC		CTRSFT_ESC
+#define SFTCTR_F1		CTRSFT_F1
+#define SFTCTR_F2		CTRSFT_F2
+#define SFTCTR_F3		CTRSFT_F3
+#define SFTCTR_F4		CTRSFT_F4
+#define SFTCTR_F5		CTRSFT_F5
+#define SFTCTR_F6		CTRSFT_F6
+#define SFTCTR_F7		CTRSFT_F7
+#define SFTCTR_F8		CTRSFT_F8
+#define SFTCTR_F9		CTRSFT_F9
+#define SFTCTR_F10		CTRSFT_F10
+#define SFTCTR_F11		CTRSFT_F11
+#define SFTCTR_F12		CTRSFT_F12
+#define SFTCTR_F13		CTRSFT_F13
+#define SFTCTR_F14		CTRSFT_F14
+#define SFTCTR_F15		CTRSFT_F15
+#define SFTCTR_F16		CTRSFT_F16
+#define SFTCTR_F17		CTRSFT_F17
+#define SFTCTR_F18		CTRSFT_F18
+#define SFTCTR_F19		CTRSFT_F19
+#define SFTCTR_F20		CTRSFT_F20
+/*#define SFTCTR_JIKKO		CTRSFT_JIKKO		*/
+/*#define SFTCTR_CLEAR		CTRSFT_CLEAR		*/
+/*#define SFTCTR_SHURYOU	CTRSFT_SHURYOU		*/
+/*#define SFTCTR_TORIKESI	CTRSFT_TORIKESI		*/
+#define SFTCTR_EEND		CTRSFT_EEND
+/*#define SFTCTR_HIRAGANA	CTRSFT_HIRAGANA		*/
+/*#define SFTCTR_KATAKANA	CTRSFT_KATAKANA		*/
+/*#define SFTCTR_EIJI		CTRSFT_EIJI		*/
+/*#define SFTCTR_ZORH		CTRSFT_ZORH		*/
+/*#define SFTCTR_ROMA		CTRSFT_ROMA		*/
+/*#define SFTCTR_LWIN		CTRSFT_LWIN		*/
+/*#define SFTCTR_RWIN		CTRSFT_RWIN		*/
+/*#define SFTCTR_APPS		CTRSFT_APPS		*/
+#define SFTCTR_XFER		CTRSFT_XFER
+#define SFTCTR_PGDN		CTRSFT_PGDN
+#define SFTCTR_RLUP		CTRSFT_RLUP
+#define SFTCTR_PGUP		CTRSFT_PGUP
+#define SFTCTR_RLDN		CTRSFT_RLDN
+#define SFTCTR_INS		CTRSFT_INS
+#define SFTCTR_DEL		CTRSFT_DEL
+#define SFTCTR_UP		CTRSFT_UP
+#define SFTCTR_LEFT		CTRSFT_LEFT
+#define SFTCTR_RIGHT		CTRSFT_RIGHT
+#define SFTCTR_DOWN		CTRSFT_DOWN
+#define SFTCTR_HOME		CTRSFT_HOME
+#define SFTCTR_HELP		CTRSFT_HELP
+#define SFTCTR_NFER		CTRSFT_NFER
+#define SFTCTR_KANJ		CTRSFT_KANJ
+
+#define CTR_AT			(CTRL+0x0000)      	/* CTRL+@ */
+#define CTR_A			(CTRL+0x0001)
+#define CTR_B			(CTRL+0x0002)
+#define CTR_C			(CTRL+0x0003)
+#define CTR_D			(CTRL+0x0004)
+#define CTR_E			(CTRL+0x0005)
+#define CTR_F			(CTRL+0x0006)
+#define CTR_G			(CTRL+0x0007)
+#define CTR_H			(CTRL+0x0008)
+#define CTR_I			(CTRL+0x0009)
+#define CTR_J			(CTRL+0x000a)
+#define CTR_K			(CTRL+0x000b)
+#define CTR_L			(CTRL+0x000c)
+#define CTR_M			(CTRL+0x000d)
+#define CTR_N			(CTRL+0x000e)
+#define CTR_O			(CTRL+0x000f)
+#define CTR_P			(CTRL+0x0010)
+#define CTR_Q			(CTRL+0x0011)
+#define CTR_R			(CTRL+0x0012)
+#define CTR_S			(CTRL+0x0013)
+#define CTR_T			(CTRL+0x0014)
+#define CTR_U			(CTRL+0x0015)
+#define CTR_V			(CTRL+0x0016)
+#define CTR_W			(CTRL+0x0017)
+#define CTR_X			(CTRL+0x0018)
+#define CTR_Y			(CTRL+0x0019)
+#define CTR_Z			(CTRL+0x001a)
+#define CTR_KL			(CTRL+0x001b)		/* CTRL+[ */
+#define CTR_YEN			(CTRL+0x001c)		/* CTRL+\ */
+#define CTR_RAG			(CTRL+0x001d)		/* CTRL+] */
+#define CTR_HAT			(CTRL+0x001e)		/* CTRL+^ */
+#define CTR__			(CTRL+0x001f)		/* CTRL+_ */
+
+#define CTRSFT_AT		(CTRL+SHIFT+0x0000)     /* CTRL+@ */
+#define CTRSFT_A		(CTRL+SHIFT+0x0001)
+#define CTRSFT_B		(CTRL+SHIFT+0x0002)
+#define CTRSFT_C		(CTRL+SHIFT+0x0003)
+#define CTRSFT_D		(CTRL+SHIFT+0x0004)
+#define CTRSFT_E		(CTRL+SHIFT+0x0005)
+#define CTRSFT_F		(CTRL+SHIFT+0x0006)
+#define CTRSFT_G		(CTRL+SHIFT+0x0007)
+#define CTRSFT_H		(CTRL+SHIFT+0x0008)
+#define CTRSFT_I		(CTRL+SHIFT+0x0009)
+#define CTRSFT_J		(CTRL+SHIFT+0x000a)
+#define CTRSFT_K		(CTRL+SHIFT+0x000b)
+#define CTRSFT_L		(CTRL+SHIFT+0x000c)
+#define CTRSFT_M		(CTRL+SHIFT+0x000d)
+#define CTRSFT_N		(CTRL+SHIFT+0x000e)
+#define CTRSFT_O		(CTRL+SHIFT+0x000f)
+#define CTRSFT_P		(CTRL+SHIFT+0x0010)
+#define CTRSFT_Q		(CTRL+SHIFT+0x0011)
+#define CTRSFT_R		(CTRL+SHIFT+0x0012)
+#define CTRSFT_S		(CTRL+SHIFT+0x0013)
+#define CTRSFT_T		(CTRL+SHIFT+0x0014)
+#define CTRSFT_U		(CTRL+SHIFT+0x0015)
+#define CTRSFT_V		(CTRL+SHIFT+0x0016)
+#define CTRSFT_W		(CTRL+SHIFT+0x0017)
+#define CTRSFT_X		(CTRL+SHIFT+0x0018)
+#define CTRSFT_Y		(CTRL+SHIFT+0x0019)
+#define CTRSFT_Z		(CTRL+SHIFT+0x001a)
+#define CTRSFT_KL		(CTRL+SHIFT+0x001b)	/* CTRL+[ */
+#define CTRSFT_YEN		(CTRL+SHIFT+0x001c)	/* CTRL+\ */
+#define CTRSFT_RAG		(CTRL+SHIFT+0x001d)	/* CTRL+] */
+#define CTRSFT_HAT		(CTRL+SHIFT+0x001e)	/* CTRL+^ */
+#define CTRSFT__		(CTRL+SHIFT+0x001f)	/* CTRL+_ */
+#define SFTCTR_AT		CTRSFT_AT		/* CTRL+@ */
+#define SFTCTR_A		CTRSFT_A
+#define SFTCTR_B		CTRSFT_B
+#define SFTCTR_C		CTRSFT_C
+#define SFTCTR_D		CTRSFT_D
+#define SFTCTR_E		CTRSFT_E
+#define SFTCTR_F		CTRSFT_F
+#define SFTCTR_G		CTRSFT_G
+#define SFTCTR_H		CTRSFT_H
+#define SFTCTR_I		CTRSFT_I
+#define SFTCTR_J		CTRSFT_J
+#define SFTCTR_K		CTRSFT_K
+#define SFTCTR_L		CTRSFT_L
+#define SFTCTR_M		CTRSFT_M
+#define SFTCTR_N		CTRSFT_N
+#define SFTCTR_O		CTRSFT_O
+#define SFTCTR_P		CTRSFT_P
+#define SFTCTR_Q		CTRSFT_Q
+#define SFTCTR_R		CTRSFT_R
+#define SFTCTR_S		CTRSFT_S
+#define SFTCTR_T		CTRSFT_T
+#define SFTCTR_U		CTRSFT_U
+#define SFTCTR_V		CTRSFT_V
+#define SFTCTR_W		CTRSFT_W
+#define SFTCTR_X		CTRSFT_X
+#define SFTCTR_Y		CTRSFT_Y
+#define SFTCTR_Z		CTRSFT_Z
+#define SFTCTR_KL		CTRSFT_KL		/* CTRL+[ */
+#define SFTCTR_YEN		CTRSFT_YEN		/* CTRL+\ */
+#define SFTCTR_RAG		CTRSFT_RAG		/* CTRL+] */
+#define SFTCTR_HAT		CTRSFT_HAT		/* CTRL+^ */
+#define SFTCTR__		CTRSFT__		/* CTRL+_ */
+
+/************************************************************************/
+/* AAJ$B%-!<%3!<%II=(B($BFHJ)H/2;%-!<%\!<%IMQ2>A[J8;z%-!<%3!<%ICMDj5A(B)         */
+/************************************************************************/
+#define TDRJSTATE_DEAD		0x00	/* $BDV$j;z2?$b$7$J$$(B */
+#define TDRJSTATE_ACST		0x01	/* $BDV$j;z!Z!-![$K$9$k(B */
+#define TDRJSTATE_ACSC		0x02	/* $BDV$j;z!Z!.![$K$9$k(B */
+#define TDRJSTATE_ACSY		0x03	/* $BDV$j;z!Z!0![$K$9$k(B */
+#define TDRJSTATE_UMRT		0x04	/* $BDV$j;z!Z!/![$K$9$k(B */
+#define VMOJI_TDRJSTATE_DEAD	(VMOJIKEY+TDRJSTATE_DEAD)
+#define VMOJI_TDRJSTATE_ACST	(VMOJIKEY+TDRJSTATE_ACST)
+#define VMOJI_TDRJSTATE_ACSC	(VMOJIKEY+TDRJSTATE_ACSC)
+#define VMOJI_TDRJSTATE_ACSY	(VMOJIKEY+TDRJSTATE_ACSY)
+#define VMOJI_TDRJSTATE_UMRT	(VMOJIKEY+TDRJSTATE_UMRT)
+
+#define HATU_AE			0xe6	/* * ae	1$B%-!<(B */
+#define HATU_A1			0xbb	/* a	2$B%-!<(B */
+#define HATU_O			0xa4	/* o	3$B%-!<(B */
+#define HATU_A2			0xb4	/* ^	4$B%-!<(B */
+#define HATU_A3			0xa7	/*  	5$B%-!<(B */
+#define HATU_A4			0xab	/*  	6$B%-!<(B */
+#define HATU_E			0xb0	/* $B&E(B	7$B%-!<(B */
+#define HATU_TH			0xb7	/* $B&H(B	8$B%-!<(B */
+#define HATU_Z			0xf0	/* * 	9$B%-!<(B */
+#define HATU_S			0xb8	/* S	0$B%-!<(B */
+#define HATU_A5			0xbe	/* $B'Y(B	^$B%-!<(B */
+#define HATU_NG			0xbf	/* ng	\$B%-!<(B */
+#define HATU_COLON		0xae	/* : 	@$B%-!<(B */
+#define VMOJI_HATU_AE		HATU_AE
+#define VMOJI_HATU_A1		(VMOJIKEY+HATU_A1)
+#define VMOJI_HATU_O		(VMOJIKEY+HATU_O)
+#define VMOJI_HATU_A2		(VMOJIKEY+HATU_A2)
+#define VMOJI_HATU_A3		(VMOJIKEY+HATU_A3)
+#define VMOJI_HATU_A4		(VMOJIKEY+HATU_A4)
+#define VMOJI_HATU_E		(VMOJIKEY+HATU_E)
+#define VMOJI_HATU_TH		(VMOJIKEY+HATU_TH)
+#define VMOJI_HATU_Z		HATU_Z
+#define VMOJI_HATU_S		(VMOJIKEY+HATU_S)
+#define VMOJI_HATU_A5		(VMOJIKEY+HATU_A5)
+#define VMOJI_HATU_NG		(VMOJIKEY+HATU_NG)
+#define VMOJI_HATU_COLON	(VMOJIKEY+HATU_COLON)
+
+#define FUTU_OE			0x9c	/* oe	\$B%-!<(B */
+#define FUTU_OE2		0x8c	/* OE	|$B%-!<(B */
+#define VMOJI_FUTU_OE		(VMOJIKEY+FUTU_OE)
+#define VMOJI_FUTU_OE2		(VMOJIKEY+FUTU_OE2)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/Xatoklib/misc.c	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,144 @@
+/*
+ * Copyright 1999 Justsystem Corporation, Japan.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and that
+ * both that copyright notice and this permission notice appear in
+ * supporting documentation, and that the name of Justsystem Corporation
+ * not be used in advertising or publicity pertaining to distribution
+ * of the software without specific, written prior permission.  Justsystem
+ * Corporation makes no representations about the suitability of this
+ * software for any purpose.  It is provided "as is" without express
+ * or implied warranty.
+ *
+ * Author: Atsushi Irisawa
+ */
+
+#ifndef lint
+static  char    rcsid[] = "$Id: misc.c,v 1.2 1999/08/24 09:01:09 ishisone Exp $" ;
+#endif  /* !lint */
+
+#include	<Xatoklib.h>
+
+/* Page */
+/*
+ * [$B4X?tL>(B]
+ *		wcs2euc( )
+ * [$BI=Bj(B]
+ *              WCHAR $B7?$+$i(BEUC$BJ8;zNs$X$NJQ49(B
+ * [$B8F=P7A<0(B]
+ *	int	wcs2euc( wchar *wbuf, int wlen, unsigned char *euc )
+ *
+ * [$B0z?t(B]
+ *              $B7?(B           : $BL>(B  $B>N(B  : I O : $B@b(B      $BL@(B
+ *		wchar        : *wbuf   : i   : WCHAR $B7?J8;zNs(B
+ *		int          : wlen    : i   : wchar $B7?J8;zNs$ND9$5(B
+ *		unsigned char : *euc   :   o : EUC $BJ8;zNs3JG<NN0h(B
+ *
+ * [$BJV$jCM(B]
+ *		EUC $BJ8;zNs$ND9$5(B
+ *
+ * [$B;HMQ4X?t(B]
+ *		$B$J$7(B
+ * [$B5!G=(B]
+ *		wchar $B7?J8;zNs$+$i(B unsigined char  $B$N(BEUC$BJ8;zNs$KJQ49$9$k!#(B
+ *
+ */
+
+int wcs2euc(wbuf, wlen, euc)
+wchar	*wbuf;
+int	wlen;
+unsigned char *euc;
+{
+	int	i ;
+	int	n = 0 ;
+	unsigned char	c ;
+	for( i = 0 ; i < wlen ; i++ ) {
+		c =  ( *wbuf & 0xff00 ) >> 8 ;
+		if ( c ) {
+			*euc++ = c ;
+			n++ ;
+		}
+		else if (( *wbuf & 0xff ) & 0x80 ) {
+			*euc++ = 0x8e ;
+			n++ ;
+		}
+		*euc++ =  *wbuf & 0xff ;
+		wbuf++ ;
+		n++ ;
+	}
+	*euc = 0 ;
+
+	return n ;
+}
+/* Page */
+/*
+ * [$B4X?tL>(B]
+ *		euc2wcs( )
+ * [$BI=Bj(B]
+ *              EUC$BJ8;zNs$+$i(B wchar $B7?J8;zNs$X$NJQ49(B
+ * [$B8F=P7A<0(B]
+ *		int	euc2wcs( unsigned char *euc, int elen, wchar *wbuf )
+ *
+ * [$B0z?t(B]
+ *              $B7?(B            : $BL>(B  $B>N(B  : I O : $B@b(B      $BL@(B
+ *		unsigned char : *euc   : i   : EUC $BJ8;zNs(B
+ *		int           : elen   : i   : EUC $BJ8;zNs$ND9$5(B
+ *		wchar         : *wbuf  :   o : wchar $B7?J8;zNs3JG<NN0h(B
+ *
+ * [$BJV$jCM(B]
+ *		1 : $B>o$K#1(B
+ *
+ * [$B;HMQ4X?t(B]
+ *		$B$J$7(B
+ * [$B5!G=(B]
+ *		unsigined char $B7?$N(BEUC $BJ8;zNs$r(Bwchar $B7?$KJQ49$9$k!#(B
+ *		EUC $BJ8;zNs$K$O!"(B0x8f $B$NFCJL$J%3!<%I$,4^$^$l$F$$$k$N$G(B
+ *		wchar $B$KJQ49$9$k;~$K8DJL=hM}$r$9$k!#(B
+ */
+int euc2wcs(euc, elen, wbuf)
+unsigned char	*euc;
+int		elen;
+wchar		*wbuf;
+{
+	int	lb = 0, hb = 0 ;
+	int	i ;
+	int	n = 0 ;
+	int	isSkip ;
+
+	for( i = 0 ; i < elen ; i++ ) {
+		isSkip = 0 ;
+		if (  *euc == 0x8e ) {
+			euc++ ;
+			hb = *euc ;
+			lb = 0 ;
+			i++ ;
+		}
+		else if (  *euc & 0x80 ) {
+			if ( *euc == 0x8f ) {
+				isSkip=1 ;
+			}
+			else {
+				lb = *euc ;
+				euc++ ;
+				hb = *euc ;
+				i++ ;
+			}
+		}
+		else {
+			hb = *euc ;
+			lb = 0 ;
+		}
+		euc++ ;
+		if ( !isSkip ) {
+			*wbuf = (( lb << 8 ) | hb ) & 0xffff ;
+			wbuf++ ;
+			n++ ;
+		}
+	}
+
+	*wbuf = 0 ;
+	return n ;
+}
+/* End of misc.c */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/Xatoklib/segment.c	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,450 @@
+/*
+ * Copyright 1999 Justsystem Corporation, Japan.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and that
+ * both that copyright notice and this permission notice appear in
+ * supporting documentation, and that the name of Justsystem Corporation
+ * not be used in advertising or publicity pertaining to distribution
+ * of the software without specific, written prior permission.  Justsystem
+ * Corporation makes no representations about the suitability of this
+ * software for any purpose.  It is provided "as is" without express
+ * or implied warranty.
+ *
+ * Author: Atsushi Irisawa
+ */
+
+#ifndef lint
+static  char    rcsid[] = "$Id: segment.c,v 1.3 1999/08/24 09:05:27 ishisone Exp $" ;
+#endif  /* !lint */
+
+#include	<ICtypes.h>
+#include	<Xatoklib.h>
+/* Page */
+/*
+ * [$B4X?tL>(B]
+ *		XatokGetModeStr( )
+ * [$BI=Bj(B]
+ *              $B%b!<%IJ8;zNs$N<hF@(B
+ * [$B8F=P7A<0(B]
+ *		WCHAR	*XatokGetModeStr( _XatokRecPtr abuf, int *length )
+ * [$B0z?t(B]
+ *              $B7?(B           : $BL>(B  $B>N(B  : I O : $B@b(B      $BL@(B
+ *		_XatokRecPtr : abuf   : i/o : kinput2$BMQJQ49%P%C%U%!(B
+ *		int          : *length :  o : $BJ8;zNs$ND9$5(B
+ *
+ * [$BJV$jCM(B]
+ *		$B%b!<%IJ8;zNs3JG<NN0h$N%"%I%l%9(B
+ * [$B;HMQ4X?t(B]
+ *		$B$J$7(B
+ * [$B5!G=(B]
+ *		$B%b!<%II=<(MQ$NJ8;zNs$*$h$S$=$ND9$5$r<hF@$9$k!#(B
+ */
+WCHAR *XatokGetModeStr(abuf, length)
+_XatokRecPtr	abuf;
+int		*length;
+{
+	int i, n ;
+	
+	*length = ( int )abuf->mode.length ;
+	n = *length ;
+
+#ifdef	ATOK_DEBUG
+	printf( "GET \245\342\241\274\245\311 : "/*=GET $B%b!<%I(B : =*/ ) ;
+	for ( i = 0 ; i < n ; i++ ) {
+		printf( "0x%x ", abuf->mode.name[i] ) ;
+	}
+	printf( "\n" ) ;
+#endif	/* ATOK_DEBUG */
+
+	return abuf->mode.name ;
+}
+
+/* Page */
+/*
+ * [$B4X?tL>(B]
+ *		XatokGetSegmentPosition( )
+ * [$BI=Bj(B]
+ *              $B%+%l%s%H%;%0%a%s%H$N<hF@(B
+ * [$B8F=P7A<0(B]
+ *	int	wordStartFunc( _XatokRecPtr  acomm )
+ *
+ * [$B0z?t(B]
+ *              $B7?(B           : $BL>(B  $B>N(B  : I O : $B@b(B      $BL@(B
+ *		_XatokRecPtr : acomm   : i/o : kinput2$BMQJQ49%P%C%U%!(B
+ *
+ * [$BJV$jCM(B]
+ *		0 : 
+ *		1 :
+ *
+ * [$B;HMQ4X?t(B]
+ *		$B$J$7(B
+ * [$B5!G=(B]
+ *		$B8=:_$N%+%l%s%H%;%0%a%s%H$r<hF@$9$k!#(B
+ * 		$B8=:_4IM}$7$F$$$k(B $B%+%l%s%H%]%7%7%g%s$,(B
+ * 		$B%;%0%a%s%H?t$h$j>.$5$1$l$P$=$N%;%0%a%s%H$,!"(B
+ * 		$B8F$P$l$?;~$N%;%0%a%s%H$H$J$k!#(B
+ * 		$B%;%0%a%s%H$,8:>/$7$F(B($BJ8@a$r1d$P$7$?>l9g$J$I(B)
+ * 		$B8=:_$N%]%8%7%g%s$,%;%0%a%s%H?t$h$jBg$-$1$l$P!"(B
+ * 		$B:G8e$N%;%0%a%s%H$,(B $B%+%l%s%H%]%8%7%g%s$H$J$k!#(B
+ */
+int XatokGetSegmentPosition(abuf, nsegp, ncharp)
+_XatokRecPtr	abuf;
+int		*nsegp;
+int		*ncharp;
+{
+	int	ret = 0 ;
+
+	if ( abuf->cur_seg < abuf->nbr_of_seg ) {
+		*nsegp = abuf->cur_seg ;
+		*ncharp = abuf->segments[abuf->cur_seg].offset ;
+	}
+	else if ( abuf->cur_seg > 0 ) {
+		*nsegp = abuf->nbr_of_seg - 1 ;
+		*ncharp = abuf->segments[abuf->cur_seg].offset ;
+		ret = 1 ;
+	}
+	else {
+		*nsegp = 0 ;
+		*ncharp = 0 ;
+		ret = 1 ;
+	}
+
+	return ret ;
+}
+
+/* Page */
+/*
+ * [$B4X?tL>(B]
+ *		XatokGetSegmentNumber( )
+ * [$BI=Bj(B]
+ *              $B%;%0%a%s%H?t$N<hF@(B
+ * [$B8F=P7A<0(B]
+ *		int	XatokGetSegmentNumber( _XatokRecPtr abuf )
+ *
+ * [$B0z?t(B]
+ *              $B7?(B           : $BL>(B  $B>N(B  : I O : $B@b(B      $BL@(B
+ *		_XatokRecPtr : acomm   : i/o : kinput2$BMQJQ49%P%C%U%!(B
+ *
+ * [$BJV$jCM(B]
+ *		N : $B%;%0%a%s%H?t(B
+ *
+ * [$B;HMQ4X?t(B]
+ *		$B$J$7(B
+ * [$B5!G=(B]
+ *		$B8=:_$N%;%0%a%s%H?t$r<hF@$9$k!#(B
+ */
+int XatokGetSegmentNumber(abuf)
+_XatokRecPtr	abuf;
+{
+	int	nbr ;
+
+	nbr = abuf->nbr_of_seg ;
+
+	return nbr ;
+}
+
+/* Page */
+/*
+ * [$B4X?tL>(B]
+ *		XatokGetSegmentRec( )
+ * [$BI=Bj(B]
+ *              $B;XDj%;%0%a%s%H$N%G!<%?<hF@(B
+ * [$B8F=P7A<0(B]
+ *		wchar *XatokGetSegmentRec( _XatokRecPtr *abuf,
+ *			int n, int *len, int *attr )
+ *
+ * [$B0z?t(B]
+ *              $B7?(B           : $BL>(B  $B>N(B  : I O : $B@b(B      $BL@(B
+ *		_XatokRecPtr : acomm   : i   : kinput2$BMQJQ49%P%C%U%!(B
+ *		int          : n       : i   : $B;XDj%;%0%a%s%HHV9f(B
+ *		int          : *len    :  o  : $B;XDj%;%0%a%s%H$NJ8;zNs$ND9$5(B
+ *              int          : *attr   :  o  : $B;XDj%;%0%a%s%H$NB0@-(B
+ *
+ * [$BJV$jCM(B]
+ *		$B;XDj%;%0%a%s%H$NJ8;zNs(B
+ *
+ * [$B;HMQ4X?t(B]
+ *		$B$J$7(B
+ * [$B5!G=(B]
+ *		$B;XDj$5$l$?%;%0%a%s%H$NJ8;zNs$*$h$S$=$NJ8;zNs$ND9$5!"(B
+ *		$BI=<(B0@-$r<hF@$9$k!#(B
+ */
+wchar *XatokGetSegmentRec(abuf, n, len, attr)
+_XatokRecPtr	abuf;
+int		n;
+int		*len;
+int		*attr;
+{
+	wchar	*data ;
+
+	if ( abuf->cur_seg == n ) {
+		*attr = ICAttrConverted | ICAttrCurrentSegment ;
+	}
+	else if ( n < abuf->cur_seg ) {
+		*attr = ICAttrConverted ;
+	}
+	else {
+		*attr = ICAttrConverted ;
+	}
+
+	*len = abuf->segments[n].length ;
+	data = abuf->segments[n].string ;
+
+	return data ;
+}
+/* Page */
+/*
+ * [$B4X?tL>(B]
+ *		XatokGetConvertedLength( )
+ * [$BI=Bj(B]
+ *              $BJQ497k2LJ8;zNs$ND9$5<hF@(B
+ * [$B8F=P7A<0(B]
+ *		int XatokGetConvertedLength( _XatokRecPtr abuf )
+ *
+ * [$B0z?t(B]
+ *              $B7?(B           : $BL>(B  $B>N(B  : I O : $B@b(B      $BL@(B
+ *		_XatokRecPtr : abuf   : i   : kinput2$BMQJQ49%P%C%U%!(B
+ *
+ * [$BJV$jCM(B]
+ *		N : $BJ8;zNs$ND9$5(B
+ *
+ * [$B;HMQ4X?t(B]
+ *		$B$J$7(B
+ * [$B5!G=(B]
+ *		$BJQ497k2LJ8;zNs$ND9$5$r<hF@$9$k!#(B
+ *		$BJQ497k2LJ8;zNs$ND9$5$H$O!"%;%0%a%s%H$KJ]B8$5$l$F$$$k(B
+ *		$BJ8;zNs$ND9$5$N9g7W$G$"$k!#(B
+ */
+int XatokGetConvertedLength(abuf)
+_XatokRecPtr	abuf;
+{
+
+	int	n = 0 ;
+	int	i ;
+
+	for( i = 0 ; i < abuf->nbr_of_seg ; i++ ) {
+		n += abuf->segments[i].length ;
+	}
+	return n ;
+}
+
+/* Page */
+/*
+ * [$B4X?tL>(B]
+ *		XatokGetConvertedString( )
+ * [$BI=Bj(B]
+ *              $BJQ497k2LJ8;zNs$N<hF@(B
+ * [$B8F=P7A<0(B]
+ *		int XatokGetConvertedString( _XatokRecPtr abuf, wchar *wstr )
+ *
+ * [$B0z?t(B]
+ *              $B7?(B           : $BL>(B  $B>N(B  : I O : $B@b(B      $BL@(B
+ *		_XatokRecPtr : abuf   : i   : kinput2$BMQJQ49%P%C%U%!(B
+ *		wchar        : *wstr  :  o  : $B<hF@$7$?J8;zNs3JG<NN0h(B
+ *
+ * [$BJV$jCM(B]
+ *		N : $BJ8;zNs$ND9$5(B
+ *
+ * [$B;HMQ4X?t(B]
+ *		$B$J$7(B
+ * [$B5!G=(B]
+ *		$BJQ497k2LJ8;zNs$ND9$5$r<hF@$9$k!#(B
+ */
+int XatokGetConvertedString(abuf, wstr)
+_XatokRecPtr	abuf;
+wchar		*wstr;
+{
+	register	wchar *w1, *w2 ;
+	int		i, n = 0 ;
+
+	w1 = wstr ;
+
+	for( i = 0 ; i < abuf->nbr_of_seg ; i++ ) {
+		w2 = abuf->segments[i].string ;
+		while( *w2 ) {
+			*w1 = *w2 ;
+			w1++ ;
+			w2++ ;
+			n++ ;
+		}
+	}
+	*w1 = 0 ;
+	return n ;
+}
+/* Page */
+/*
+ * [$B4X?tL>(B]
+ *		XatokShiftRight( )
+ * [$BI=Bj(B]
+ *              $B%;%0%a%s%H%G!<%?$N1&(BROTATE
+ * [$B8F=P7A<0(B]
+ *		int	XatokShiftRight( _XatokRecPtr  abuf )
+ *
+ * [$B0z?t(B]
+ *              $B7?(B           : $BL>(B  $B>N(B  : I O : $B@b(B      $BL@(B
+ *		_XatokRecPtr : abuf   : i/o : kinput2$BMQJQ49%P%C%U%!(B
+ *
+ * [$BJV$jCM(B]
+ *		1 : $B>o$K#1(B
+ *
+ * [$B;HMQ4X?t(B]
+ *		$B$J$7(B
+ * [$B5!G=(B]
+ *		$B%;%0%a%s%H%G!<%?$r1&$K(B ROTATE$B$9$k!#(B
+ *		$B1&$N(BROTATE$B$H$O(B $B%;%0%a%s%H$NG[Ns$N%$%s%G%C%/%9$,>.$5$$%G!<%?$r(B
+ *		$B#1$DBg$-$$=j$K0\$9$H$$$&;v$G$"$k!#(B
+ *		$B#1HVBg$-$$=j$O!"@hF,$K0\$k!#(B
+ */
+int XatokShiftRight(abuf)
+_XatokRecPtr	abuf;
+{
+	_XatokSegment	tmpseg ;
+	_XatokSegment	*sp ;
+	int		offset ;
+	int		nseg ;
+	int		i ;
+
+	nseg = abuf->nbr_of_seg ;
+	offset = abuf->offset ;
+	sp = abuf->segments ;
+
+	tmpseg.string = sp[nseg].string ;
+	tmpseg.length = sp[nseg].length ;
+	tmpseg.size = sp[nseg].size ;
+	tmpseg.offset = sp[nseg].offset ;
+
+	sp = &abuf->segments[nseg] ;
+	for( i = nseg ; i > offset ; i-- ) {
+		sp->string = ( sp - 1 )->string ;
+		sp->length = ( sp - 1 )->length ;
+		sp->size = ( sp - 1 )->size ;
+		sp->offset = ( sp - 1 )->offset ;
+		sp-- ;
+	}
+	sp = &abuf->segments[offset] ;
+	sp->string = tmpseg.string ;
+	sp->length = tmpseg.length ;
+	sp->size = tmpseg.size ;
+	sp->offset = tmpseg.offset ;
+
+	abuf->offset++ ;
+	abuf->nbr_of_seg++ ;
+	abuf->cur_seg++ ;
+
+	return 1 ;
+}
+
+
+/* Page */
+/*
+ * [$B4X?tL>(B]
+ *		XatokShiftLeft( )
+ * [$BI=Bj(B]
+ *              $B%;%0%a%s%H%G!<%?$N:8(BROTATE
+ * [$B8F=P7A<0(B]
+ *		int	XatokShiftLeft( _XatokRecPtr  abuf )
+ *
+ * [$B0z?t(B]
+ *              $B7?(B           : $BL>(B  $B>N(B  : I O : $B@b(B      $BL@(B
+ *		_XatokRecPtr : abuf   : i/o : kinput2$BMQJQ49%P%C%U%!(B
+ *
+ * [$BJV$jCM(B]
+ *		1 : $B>o$K#1(B
+ *
+ * [$B;HMQ4X?t(B]
+ *		$B$J$7(B
+ * [$B5!G=(B]
+ *		$B%;%0%a%s%H%G!<%?$r:8$K(B ROTATE$B$9$k!#(B
+ *		$B:8$N(BROTATE$B$H$O(B $B%;%0%a%s%H$NG[Ns$N%$%s%G%C%/%9$,Bg$-$$%G!<%?$r(B
+ *		$B#1$D>.$5$$=j$K0\$9$H$$$&;v$G$"$k!#(B
+ *		$B#1HV>.$5$$=j$O!"(BOFFSET$B$K0\$k!#(B
+ */
+int XatokShiftLeft(abuf)
+_XatokRecPtr	abuf;
+{
+	_XatokSegment	tmpseg ;
+	_XatokSegment	*sp ;
+	int		offset ;
+	int		i ;
+
+	offset = abuf->offset ;
+
+	sp = abuf->segments ;
+	tmpseg.string = sp[0].string ;
+	tmpseg.length = sp[0].length ;
+	tmpseg.size = sp[0].size ;
+	tmpseg.offset = sp[0].offset ;
+
+	for( i = 0 ; i < offset - 1 ; i++ ) {
+		sp->string = ( sp + 1 )->string ;
+		sp->length = ( sp + 1 )->length ;
+		sp->size = ( sp + 1 )->size ;
+		sp->offset = ( sp + 1 )->offset ;
+		sp++ ;
+	}
+	abuf->segments[offset-1].string = tmpseg.string ;
+	abuf->segments[offset-1].length = tmpseg.length ;
+	abuf->segments[offset-1].size = tmpseg.size ;
+	abuf->segments[offset-1].offset = tmpseg.offset ;
+
+	return 1 ;
+}
+/* Page */
+/*
+ * [$B4X?tL>(B]
+ *		XatokShiftLeftAll( )
+ * [$BI=Bj(B]
+ *              $BA4%;%0%a%s%H%G!<%?$N:8(BROTATE
+ * [$B8F=P7A<0(B]
+ *		int	XatokShiftLeftAll( _XatokRecPtr  abuf )
+ *
+ * [$B0z?t(B]
+ *              $B7?(B           : $BL>(B  $B>N(B  : I O : $B@b(B      $BL@(B
+ *		_XatokRecPtr : abuf   : i/o : kinput2$BMQJQ49%P%C%U%!(B
+ *
+ * [$BJV$jCM(B]
+ *		1 : $B>o$K#1(B
+ *
+ * [$B;HMQ4X?t(B]
+ *		$B$J$7(B
+ * [$B5!G=(B]
+ *		$B%;%0%a%s%H%G!<%?$r:8$K(B ROTATE$B$9$k!#(B
+ *		$B:8$N(BROTATE$B$H$O(B $B%;%0%a%s%H$NG[Ns$N%$%s%G%C%/%9$,Bg$-$$%G!<%?$r(B
+ *		$B#1$D>.$5$$=j$K0\$9$H$$$&;v$G$"$k!#(B
+ */
+int XatokShiftLeftAll(abuf)
+_XatokRecPtr	abuf;
+{
+	_XatokSegment	tmpseg ;
+	_XatokSegment	*sp ;
+	int		offset ;
+	int		nseg ;
+	int		i ;
+
+	nseg = abuf->nbr_of_seg ;
+	sp = abuf->segments ;
+	tmpseg.string = sp->string ;
+	tmpseg.length = sp->length ;
+	tmpseg.size = sp->size ;
+	tmpseg.offset = sp->offset ;
+	for( i = 0 ; i < nseg - 1 ; i++ ) {
+		sp->string = ( sp + 1 )->string ;
+		sp->length = ( sp + 1 )->length ;
+		sp->size = ( sp + 1 )->size ;
+		sp->offset = ( sp + 1 )->offset ;
+		sp++ ;
+	}
+	sp = &abuf->segments[nseg-1] ;
+	sp->string = tmpseg.string ;
+	sp->length = tmpseg.length ;
+	sp->size = tmpseg.size ;
+	sp->offset = tmpseg.offset ;
+
+	abuf->offset-- ;
+	abuf->nbr_of_seg-- ;
+	abuf->cur_seg-- ;
+}
+
+/* End of segment.c */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/Xatoklib/sysline.c	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,191 @@
+/* 
+ * Copyright 1999 Justsystem Corporation, Japan.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and that
+ * both that copyright notice and this permission notice appear in
+ * supporting documentation, and that the name of Justsystem Corporation
+ * not be used in advertising or publicity pertaining to distribution
+ * of the software without specific, written prior permission.  Justsystem 
+ * Corporation makes no representations about the suitability of this
+ * software for any purpose.  It is provided "as is" without express
+ * or implied warranty.
+ *
+ * Author: Atsushi Irisawa
+ */
+
+#ifndef lint
+static  char    rcsid[] = "$Id: sysline.c,v 1.2 1999/08/24 09:01:10 ishisone Exp $" ;
+#endif  /* !lint */
+
+#include        <stdio.h>
+#include        <X11/IntrinsicP.h>
+#include        <X11/StringDefs.h>
+#include        <X11/Xmu/Atoms.h>
+#include        <X11/keysym.h>
+#include	<InputConv.h>
+
+#include	<Xatoklib.h>
+
+/* Page */
+/*
+ * [$B4X?tL>(B]
+ *              auxSyslineCtrl( )
+ * [$BI=Bj(B]
+ *              $B%G!<%?$NAw?.(B
+ * [$B8F=P7A<0(B]
+ *      	int auxSyslineCtrl( _XatokRecPtr acomm, int isdecision )
+ *
+ * [$B0z?t(B]
+ *              $B7?(B           : $BL>(B  $B>N(B  : I O : $B@b(B      $BL@(B
+ *		_XatokRecPtr : acomm   : i/o : kinput2$BMQJQ49%P%C%U%!(B
+ *		int          : isdecision : i : $B3NDj%G!<%?%U%i%0(B
+ *
+ *
+ * [$BJV$jCM(B]
+ *		 0 : AUX $B%&%#%s%I%&7QB3(B
+ *		 1 : AUX $B%&%#%s%I%&=*N;(B
+ *
+ * [$B;HMQ4X?t(B]
+ *		$B$J$7(B
+ * [$B5!G=(B]
+ *		SYSLINE$B%G!<%?$N%U%i%0$,(B ATOK12CE $B%(%s%8%s$G@_Dj$5$l$F$$$k>l9g$K(B
+ *		$B%7%9%F%`9T$r?75,$K3+$/!"%7%9%F%`9T$NJ8;zNs$rJQ99$9$k!"(B
+ *		$B%7%9%F%`9T$rJD$8$k$J$I$N!"I=<($r$I$N$h$&$K9T$J$&$+$rH=CG$9$k(B
+ *		$B%U%!%s%/%7%g%s$G$"$j!"I=<($r4IM}$7$F$$$k%b%8%e!<%k$h$j(B
+ *		$B8F$S=P$5$l$k!#(B
+ */
+int auxSyslineCtrl(acomm, isdecision)
+_XatokRecPtr    acomm;
+int		isdecision;		/* $B3NDjJ8;z$,$"$k$+$J$$$+!)(B */
+{
+	int	status = 0 ;
+
+#ifdef	ATOK_DEBUG
+	printf( "GUIDE isdecision %d\n", isdecision ) ;
+	printf( "GUIDE VAL %d\n", acomm->guide_OpenIndex ) ;
+	printf( "GUIDE CLOSE VAL %d\n", acomm->guide_closeEventIndex ) ;
+	printf( "GUIDE OPEN VAL %d\n", acomm->guide_openEventIndex ) ;
+#endif
+	if ( acomm->guide_openEventIndex & CEGUIDEINDX_ERROR ) {
+		/* printf( "CEGUIDEINDX_ERROR\n" ) ; */
+		acomm->convStatus |= M_SYSLINE ;
+		if ( acomm->aux_isopened ) {
+			acomm->menuStatus = ICAuxChange ;
+		}
+		else {
+			acomm->menuStatus = ICAuxStart ;
+		}
+		acomm->aux_isopened = 1 ;
+	}
+	else if ( acomm->guide_OpenIndex & CEGUIDEINDX_CODE )  {
+		/* printf( "CEGUIDEINDX_CODE\n" ) ; */
+		acomm->convStatus |= M_SYSLINE ;
+		if ( acomm->aux_isopened ) {
+			acomm->menuStatus = ICAuxChange ;
+		}
+		else {
+			acomm->menuStatus = ICAuxStart ;
+		}
+		acomm->aux_isopened = 1 ;
+	}
+	else if ( acomm->guide_OpenIndex & CEGUIDEINDX_KIGOU ) {
+		/* printf( "CEGUIDEINDX_CODE\n" ) ; */
+		acomm->convStatus |= M_SYSLINE ;
+		if ( acomm->aux_isopened ) {
+			acomm->menuStatus = ICAuxChange ;
+		}
+		else {
+			acomm->menuStatus = ICAuxStart ;
+		}
+		acomm->aux_isopened = 1 ;
+		status = isdecision ;
+	}
+	else {
+		/* printf( "SYSLINE OTHER\n" ) ; */
+
+		acomm->convStatus ^=  M_SYSLINE ;	/* 0616 */
+		acomm->aux_isopened = 0 ;
+		acomm->menuStatus = ICAuxEnd ;
+		status = 1 ;
+	}
+	return status ;
+}
+/* Page */
+/*
+ * [$B4X?tL>(B]
+ *		auxSyslineString( )
+ *              AtokNetSend( )
+ * [$BI=Bj(B]
+ *              $B%7%9%F%`9TJ8;zNs$N:n@.!#(B
+ * [$B8F=P7A<0(B]
+ *      int auxSyslineString( _XatokRecPtr acomm, menuAux *mAux,
+ *		wchar *echoStr, int *echoLen, int *revLen, int	*revPos )
+ *
+ * [$B0z?t(B]
+ *              $B7?(B           : $BL>(B  $B>N(B  : I O : $B@b(B      $BL@(B
+ *		_XatokRecPtr : acomm   : i/o : kinput2$BMQJQ49%P%C%U%!(B
+ *		menuAux	     : *mAux:     : $B8=:_L$;HMQ(B
+ *		wchar	     : *echoStr:   o : $BI=<(J8;zNs(B
+ *		int          : *echoLen:   o : $BI=<(J8;zNs$ND9$5(B
+ *		int	     : *revLen :   o : $BH?E>3+;O0LCV(B
+ *		int	     : *revPos :   o : $BH?E>J8;zNsD9$5(B
+ *
+ *
+ * [$BJV$jCM(B]
+ *		-1 : $BAw?.%(%i!<(B
+ *		 N : $BAw?.%P%$%H?t(B
+ *
+ * [$B;HMQ4X?t(B]
+ *		$B$J$7(B
+ * [$B5!G=(B]
+ *		$B%7%9%F%`9T$KI=<($9$kJ8;zNs$r:n@.$7!"H?E>I=<(0LCV!"H?E>I=<($N(B
+ *		$BD9$5$r5a$a$k!#(B
+ */
+
+int auxSyslineString(acomm, mAux, echoStr, echoLen, revLen, revPos)
+_XatokRecPtr    acomm;
+menuAux		*mAux;
+wchar		*echoStr;
+int		*echoLen;
+int		*revLen;
+int		*revPos;
+{
+	int	wsize = sizeof( wchar ) ;
+	int	isreverse = 0 ;
+	int	rev = 0 ;
+	int	i ;
+
+	*revPos = 0 ;
+	*revLen = 0 ;
+
+	memcpy( acomm->aux_echoStr, acomm->sysLineStr, acomm->sysLineLen * wsize ) ;
+
+	*echoLen = acomm->sysLineLen ;
+	for ( i = 0 ; i < acomm->sysLineLen ; i++ ) {
+		switch( acomm->sysAttrPtr[i] ) {
+			case ATCOLINDX_SYSLINEBACK :
+			case ATCOLINDX_SYSLINEINPUT :
+			case ATCOLINDX_SYSLINEINPUTCUR :
+			case ATCOLINDX_SYSLINENOTSELECTITEM :
+			case ATCOLINDX_SYSLINEHOSOKU :
+			case ATCOLINDX_SYSLINEGUIDEMESSAGE :
+				if ( isreverse ) {
+					goto done;
+				}
+				rev++ ;
+				break ;
+			case ATCOLINDX_SYSLINESELECTITEM :
+				isreverse = 1 ;
+				( *revLen ) ++ ;
+				break ;
+		}
+	}
+done:
+	if ( isreverse ) {
+		*revPos = rev ;
+	}
+	return 1 ;
+}
+/* End of sysline.c */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/XimpProto.c	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,3013 @@
+#ifndef lint
+static char *rcsid = "$Id: XimpProto.c,v 1.49 1999/05/18 08:53:21 ishisone Exp $";
+#endif
+/*- 
+ * Copyright (c) 1991  Software Research Associates, Inc.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted, provided
+ * that the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Software Research Associates not be
+ * used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission.  Software Research
+ * Associates makes no representations about the suitability of this software
+ * for any purpose.  It is provided "as is" without express or implied
+ * warranty.
+ *
+ * Author:  Makoto Ishisone, Software Research Associates, Inc., Japan
+ */
+
+#include <X11/Xos.h>
+#include <X11/IntrinsicP.h>
+
+/* this widget needs X11R5 header files... */
+#if defined(XlibSpecificationRelease) && XlibSpecificationRelease >= 5
+
+#include <X11/StringDefs.h>
+#include <X11/Xatom.h>
+#include <X11/Xmu/Atoms.h>
+#include <X11/Xmu/CharSet.h>
+#include "XIMProto.h"
+#include "XimpProtoP.h"
+#include "ConvMgr.h"
+#include "InputConv.h"
+#include "OverConv.h"
+#include "OffConv.h"
+#include "OnConv.h"
+#include "MyDispatch.h"
+#include "AsyncErr.h"
+#include "ParseKey.h"
+
+
+#define DEBUG_VAR debug_XimpProtocol
+#include "DebugPrint.h"
+
+
+#define PROTOCOL_VERSION_STR	"XIMP.3.5"
+#define SERVER_NAME		"kinput2"
+#define SERVER_VERSION		"1"
+#define VENDOR_NAME		"SRA"
+
+
+#define PREEDIT_MASK (XIMP_PRE_AREA_MASK|XIMP_PRE_FG_MASK|XIMP_PRE_BG_MASK|\
+		      XIMP_PRE_COLORMAP_MASK|XIMP_PRE_BGPIXMAP_MASK|\
+		      XIMP_PRE_LINESP_MASK|XIMP_PRE_CURSOR_MASK|\
+		      XIMP_PRE_AREANEED_MASK|XIMP_PRE_SPOTL_MASK)
+#define STATUS_MASK (XIMP_STS_AREA_MASK|XIMP_STS_FG_MASK|XIMP_STS_BG_MASK|\
+		     XIMP_STS_COLORMAP_MASK|XIMP_STS_BGPIXMAP_MASK|\
+		     XIMP_STS_LINESP_MASK|XIMP_STS_CURSOR_MASK|\
+		     XIMP_STS_AREANEED_MASK|XIMP_STS_WINDOW_MASK)
+
+#define MIN_LINE_SPACING	2
+#define MIN_AREA_WIDTH		16
+#define MIN_AREA_HEIGHT		10
+
+
+/*- resource table -*/
+static XtResource resources[] = {
+#define offset(field) XtOffset(XimpProtocolWidget, ximp.field)
+    { XtNlocaleName, XtCLocaleName, XtRString, sizeof(String),
+	offset(localename), XtRImmediate, (XtPointer)NULL },
+    { XtNserverName, XtCServerName, XtRString, sizeof(String),
+	offset(servername), XtRString, (XtPointer)SERVER_NAME },
+    { XtNforceDefaultServer, XtCForceDefaultServer, XtRBoolean, sizeof(Boolean),
+	offset(forceDefaultServer), XtRImmediate, (XtPointer)False },
+    { XtNconversionStartKeys, XtCConversionStartKeys, XtRString, sizeof(String),
+	offset(convkeys), XtRImmediate, (XtPointer)NULL },
+    { XtNinputObjectClass, XtCClass, XtRPointer, sizeof(WidgetClass),
+	offset(inputObjClass), XtRImmediate, (XtPointer)NULL },
+    { XtNdisplayObjectClass, XtCClass, XtRPointer, sizeof(WidgetClass),
+	offset(displayObjClass), XtRImmediate, (XtPointer)NULL },
+    { XtNdefaultFontList, XtCFontList, XtRString, sizeof(String),
+	offset(defaultfontlist), XtRImmediate, (XtPointer)NULL },
+    { XtNforeground, XtCForeground, XtRPixel, sizeof (Pixel),
+	offset(foreground), XtRString, XtDefaultForeground },
+    { XtNstatusWidth, XtCStatusWidth, XtRDimension, sizeof(Dimension),
+	offset(statuswidth), XtRImmediate, (XtPointer)0 },
+#undef offset
+};
+
+static void XimpMessageProc();
+static void SelectionRequestProc();
+static void SelectionClearProc();
+
+/*- action table -*/
+static XtActionsRec actions[] = {
+    { "ximp-message",		XimpMessageProc },
+    { "selection-request",	SelectionRequestProc },
+    { "selection-clear",	SelectionClearProc },
+};
+
+/*- default translation -*/
+static char translations[] =
+    "<Message>_XIMP_PROTOCOL:	ximp-message()\n\
+     <SelReq>:	selection-request()\n\
+     <SelClr>:	selection-clear()";
+
+
+/*- static function declarations -*/
+static void ClassInitialize();
+static void Initialize();
+static void Destroy();
+static void Realize();
+
+static void getAtoms();
+static int ownSelection();
+
+static ConvClient *findClient();
+static ConvClient *newClient();
+static Widget attachConverter();
+static void detachConverter();
+static void deleteClient();
+
+static Boolean isCorrectClientEvent();
+static Boolean isCorrectWindowID();
+static void initializeError();
+static void checkLocale();
+static void fillInDefaultAttributes();
+static void computeAreaForStartup();
+static void computeAreaForQuery();
+static unsigned long makeConvAttributes();
+static void getFonts();
+
+static void setProperty();
+static void setKeyProperty();
+static void getAttributes();
+static void getFocusProperty();
+static void getPreeditFontProperty();
+static void getStatusFontProperty();
+static void getPreeditProperty();
+static void getStatusProperty();
+static Boolean readProperty();
+static void setAttributes();
+static void setFocusProperty();
+static void setPreeditFontProperty();
+static void setStatusFontProperty();
+static void setPreeditProperty();
+static void setStatusProperty();
+static void writeProperty();
+
+static void sendClientMessage8();
+static void sendClientMessage32();
+static void sendKeyEvent();
+static void sendErrorEvent();
+static void sendCreateRefusal();
+
+static void fixCallback();
+static void fixProc();
+static void endCallback();
+static void endProc();
+static void unusedEventCallback();
+
+static void ximpCreateMessageProc();
+static void ximpDestroyMessageProc();
+static void ximpBeginMessageProc();
+static void ximpEndMessageProc();
+static void ximpSetFocusMessageProc();
+static void ximpUnsetFocusMessageProc();
+static void ximpMoveMessageProc();
+static void ximpResetMessageProc();
+static void ximpSetValueMessageProc();
+static void ximpGetValueMessageProc();
+static void ximpKeyPressMessageProc();
+static void ximpExtensionMessageProc();
+
+static void ClientDead();
+
+static void preeditStartCallback();
+static void preeditDoneCallback();
+static void preeditDrawCallback();
+static void preeditCaretCallback();
+static void statusStartCallback();
+static void statusDoneCallback();
+static void statusDrawCallback();
+static void preeditStart();
+static void preeditDone();
+static void preeditDraw();
+static void preeditCaret();
+static void statusStart();
+static void statusDone();
+static void statusDraw();
+
+/*- XimpProtocolClassRec -*/
+XimpProtocolClassRec ximpProtocolClassRec = {
+  { /* core fields */
+    /* superclass		*/	(WidgetClass) &widgetClassRec,
+    /* class_name		*/	"XimpProtocol",
+    /* widget_size		*/	sizeof(XimpProtocolRec),
+    /* class_initialize		*/	ClassInitialize,
+    /* class_part_initialize	*/	NULL,
+    /* class_inited		*/	FALSE,
+    /* initialize		*/	Initialize,
+    /* initialize_hook		*/	NULL,
+    /* realize			*/	Realize,
+    /* actions			*/	actions,
+    /* num_actions		*/	XtNumber(actions),
+    /* resources		*/	resources,
+    /* num_resources		*/	XtNumber(resources),
+    /* xrm_class		*/	NULLQUARK,
+    /* compress_motion		*/	TRUE,
+    /* compress_exposure	*/	TRUE,
+    /* compress_enterleave	*/	TRUE,
+    /* visible_interest		*/	FALSE,
+    /* destroy			*/	Destroy,
+    /* resize			*/	NULL,
+    /* expose			*/	NULL,
+    /* set_values		*/	NULL,
+    /* set_values_hook		*/	NULL,
+    /* set_values_almost	*/	XtInheritSetValuesAlmost,
+    /* get_values_hook		*/	NULL,
+    /* accept_focus		*/	NULL,
+    /* version			*/	XtVersion,
+    /* callback_private		*/	NULL,
+    /* tm_table			*/	translations,
+    /* query_geometry		*/	XtInheritQueryGeometry,
+    /* display_accelerator	*/	XtInheritDisplayAccelerator,
+    /* extension		*/	NULL
+  },
+  { /* ximpprotocol fields */
+    /* ximp_dummy		*/	0
+  }
+};
+
+WidgetClass ximpProtocolWidgetClass = (WidgetClass)&ximpProtocolClassRec;
+
+static XimpInputStyle XimpStyles[] = {
+    { XIMPreeditPosition|XIMStatusArea, overthespot_style },
+    { XIMPreeditPosition|XIMStatusNothing, overthespot_style },
+    { XIMPreeditArea|XIMStatusArea, offthespot_style },
+    { XIMPreeditCallbacks|XIMStatusCallbacks, onthespot_style },
+    { XIMPreeditCallbacks|XIMStatusNothing, onthespot_style },
+    { XIMPreeditNothing|XIMStatusNothing, separate_style },
+    { 0 },
+};
+
+/*
+ *+ Core class methods
+ */
+
+/*- ClassInitialize: set supported locale list -*/
+static void
+ClassInitialize()
+{
+}
+    
+/*- Initialize: intern Atoms, get default fonts, etc. -*/
+/* ARGSUSED */
+static void
+Initialize(req, new, args, num_args)
+Widget req;
+Widget new;
+ArgList args;
+Cardinal *num_args;
+{
+    XimpProtocolWidget xpw = (XimpProtocolWidget)new;
+
+    if (xpw->ximp.localename == NULL) {
+	initializeError(new, XtNlocaleName);
+    } else if (xpw->ximp.inputObjClass == NULL) {
+	initializeError(new, XtNinputObjectClass);
+    } else if (xpw->ximp.displayObjClass == NULL) {
+	initializeError(new, XtNdisplayObjectClass);
+    }
+
+    checkLocale(xpw, xpw->ximp.localename);
+    xpw->ximp.localename = XtNewString(xpw->ximp.localename);
+
+    xpw->ximp.servername = XtNewString(xpw->ximp.servername);
+
+    xpw->ximp.clients = NULL;
+    xpw->ximp.freeclients = NULL;
+    xpw->ximp.icid = 1;
+    xpw->ximp.propid = 0;
+    xpw->ximp.callbackpropid = 0;
+
+    if (xpw->ximp.defaultfontlist != NULL) {
+	TRACE(("enter default fontlist <%s> into cache\n", xpw->ximp.defaultfontlist));
+	/* extract fonts from default font list and enter them into cache */
+	xpw->ximp.defaultfontlist = XtNewString(xpw->ximp.defaultfontlist);
+	xpw->ximp.deffonts = FontBankGet(xpw->ximp.fontbank,
+					 xpw->ximp.defaultfontlist,
+					 &xpw->ximp.numdeffonts);
+    } else {
+	xpw->ximp.deffonts = NULL;
+	xpw->ximp.numdeffonts = 0;
+    }
+
+    getAtoms(xpw);
+}
+
+/*- Destroy: free allocated memory -*/
+static void
+Destroy(w)
+Widget w;
+{
+    XimpProtocolWidget xpw = (XimpProtocolWidget)w;
+    ConvClient *client;
+
+    XtFree(xpw->ximp.localename);
+    XtFree(xpw->ximp.servername);
+    if (xpw->ximp.defaultfontlist != NULL) XtFree(xpw->ximp.defaultfontlist);
+
+    while (xpw->ximp.clients != NULL) {
+	statusDone(xpw->ximp.clients);
+	endProc(xpw->ximp.clients, False);
+	deleteClient(xpw->ximp.clients);
+	/*
+	 * since deleteClient() removes the given client from client list
+	 * and insert it in free list, following commented statement is
+	 * not necessary.
+	 *
+	 * xpw->ximp.clients = xpw->ximp.clients->next;
+	 */
+    }
+
+    /*
+     * now, all the clients are deleted and moved into free list.
+     */
+    client = xpw->ximp.freeclients;
+    while (client != NULL) {
+	ConvClient *ccp = client;
+	client = client->next;
+	XtFree((char *)ccp);
+    }
+
+    /*
+     * free cached fontlist
+     */
+    if (xpw->ximp.numdeffonts > 0) {
+	FontBankFreeFonts(xpw->ximp.fontbank,
+			  xpw->ximp.deffonts,
+			  xpw->ximp.numdeffonts);
+    }
+    FontBankDestroy(xpw->ximp.fontbank);
+}
+
+/*- Realize: own selection -*/
+static void
+Realize(w, mask, value)
+Widget w;
+XtValueMask *mask;
+XSetWindowAttributes *value;
+{
+    XimpProtocolWidget xpw = (XimpProtocolWidget)w;
+    CoreWidgetClass super = (CoreWidgetClass)XtClass(w)->core_class.superclass;
+
+    (*super->core_class.realize)(w, mask, value);
+
+    setProperty(xpw);
+
+    if (!ownSelection(xpw)) {
+	String params[1];
+	Cardinal num_params;
+
+	params[0] = XtClass(w)->core_class.class_name;
+	num_params = 1;
+	XtAppWarningMsg(XtWidgetToApplicationContext(w),
+			"selectionError", "ownSelection", "WidgetError",
+			"%s: can't own selection", params, &num_params);
+
+	XtDestroyWidget(w);
+    } else {
+	DPRINT(("\tselection owner: 0x%lx (%ld)\n", XtWindow(w), XtWindow(w)));
+    }
+}
+
+/*
+ *+ atom handling
+ */
+
+/*- getAtoms: intern atoms -*/
+static void
+getAtoms(xpw)
+XimpProtocolWidget xpw;
+{
+    Display *dpy = XtDisplay((Widget)xpw);
+    char buf[256];
+
+#define MAKEATOM(s)	XInternAtom(dpy, s, False)
+    (void)sprintf(buf, "_XIMP_%s", xpw->ximp.localename);
+    xpw->ximp.selAtom1 = MAKEATOM(buf);
+    (void)sprintf(buf, "_XIMP_%s@%s.%d",
+		  xpw->ximp.localename,
+		  xpw->ximp.servername,
+		  DefaultScreen(XtDisplay((Widget)xpw)));
+    xpw->ximp.selAtom2 = MAKEATOM(buf);
+
+    xpw->ximp.ctextAtom = XA_COMPOUND_TEXT(dpy);
+
+    xpw->ximp.ximpVersionAtom = MAKEATOM("_XIMP_VERSION");
+    xpw->ximp.ximpStyleAtom = MAKEATOM("_XIMP_STYLE");
+    xpw->ximp.ximpKeysAtom = MAKEATOM("_XIMP_KEYS");
+    xpw->ximp.ximpServerNameAtom = MAKEATOM("_XIMP_SERVERNAME");
+    xpw->ximp.ximpServerVersionAtom = MAKEATOM("_XIMP_SERVERVERSION");
+    xpw->ximp.ximpVendorNameAtom = MAKEATOM("_XIMP_VENDORNAME");
+    xpw->ximp.ximpExtensionsAtom = MAKEATOM("_XIMP_EXTENSIONS");
+    xpw->ximp.ximpProtocolAtom = MAKEATOM("_XIMP_PROTOCOL");
+    xpw->ximp.ximpFocusAtom = MAKEATOM("_XIMP_FOCUS");
+    xpw->ximp.ximpPreeditAtom = MAKEATOM("_XIMP_PREEDIT");
+    xpw->ximp.ximpStatusAtom = MAKEATOM("_XIMP_STATUS");
+    xpw->ximp.ximpPreeditFontAtom = MAKEATOM("_XIMP_PREEDITFONT");
+    xpw->ximp.ximpStatusFontAtom = MAKEATOM("_XIMP_STATUSFONT");
+    xpw->ximp.ximpExtXimpBackFrontAtom = MAKEATOM("_XIMP_EXT_XIMP_BACK_FRONT");
+    xpw->ximp.ximpPreeditDrawDataAtom = MAKEATOM("_XIMP_PREEDIT_DRAW_DATA");
+    xpw->ximp.ximpFeedbacksAtom = MAKEATOM("_XIMP_FEEDBACKS");
+
+#undef MAKEATOM
+}
+
+/*- ownSelection: own conversion selection -*/
+static int
+ownSelection(xpw)
+XimpProtocolWidget xpw;
+{
+    Display *dpy = XtDisplay((Widget)xpw);
+    Window w = XtWindow((Widget)xpw);
+
+    TRACE(("ximpProtocol:ownSelection()\n"));
+
+    if (xpw->ximp.forceDefaultServer ||
+	XGetSelectionOwner(dpy, xpw->ximp.selAtom1) == None) {
+	TRACE(("\tdefault server\n"));
+	XSetSelectionOwner(dpy, xpw->ximp.selAtom1, w, CurrentTime);
+    }
+    TRACE(("\tspecific server\n"));
+    XSetSelectionOwner(dpy, xpw->ximp.selAtom2, w, CurrentTime);
+
+    return XGetSelectionOwner(dpy, xpw->ximp.selAtom2) == w;
+}
+
+/*
+ *+ client data handling
+ */
+
+/*- findClient: get clientdata of given client -*/
+static ConvClient *
+findClient(xpw, id)
+XimpProtocolWidget xpw;
+int id;
+{
+    register ConvClient *ccp = xpw->ximp.clients;
+
+    while (ccp != NULL) {
+	if (ccp->id == id) return ccp;
+	ccp = ccp->next;
+    }
+
+    return NULL;
+}
+
+/*- newClient: get a clientdata for new client -*/
+static ConvClient *
+newClient(xpw, client)
+XimpProtocolWidget xpw;
+Window client;
+{
+    ConvClient *ccp;
+
+    if (xpw->ximp.freeclients != NULL) {
+	/* get one from free list */
+	ccp = xpw->ximp.freeclients;
+	xpw->ximp.freeclients = ccp->next;
+    } else {
+	char buf[30];
+
+	ccp = XtNew(ConvClient);
+	(void)sprintf(buf, "_XIMP_STRING_%d", xpw->ximp.propid++);
+	ccp->property = XInternAtom(XtDisplay((Widget)xpw), buf, False);
+	(void)sprintf(buf, "_XIMP_CALLBACKS_%d", xpw->ximp.callbackpropid++);
+	ccp->preeditdata = XInternAtom(XtDisplay((Widget)xpw), buf, False);
+	(void)sprintf(buf, "_XIMP_CALLBACKS_%d", xpw->ximp.callbackpropid++);
+	ccp->preedittext = XInternAtom(XtDisplay((Widget)xpw), buf, False);
+	(void)sprintf(buf, "_XIMP_CALLBACKS_%d", xpw->ximp.callbackpropid++);
+	ccp->preeditfeedback = XInternAtom(XtDisplay((Widget)xpw), buf, False);
+	(void)sprintf(buf, "_XIMP_CALLBACKS_%d", xpw->ximp.callbackpropid++);
+	ccp->statustext = XInternAtom(XtDisplay((Widget)xpw), buf, False);
+	(void)sprintf(buf, "_XIMP_CALLBACKS_%d", xpw->ximp.callbackpropid++);
+	ccp->statusfeedback = XInternAtom(XtDisplay((Widget)xpw), buf, False);
+    }
+    ccp->id = xpw->ximp.icid++;
+
+    ccp->version = NULL;
+    ccp->style = separate_style;	/* default */
+    ccp->protocolwidget = (Widget)xpw;
+    ccp->conversion = NULL;
+    ccp->reqwin = client;
+    ccp->focuswin = client;		/* default */
+    ccp->xpattrs.fontlist = NULL;
+    ccp->xsattrs.fontlist = NULL;
+    ccp->xattrmask = 0L;
+    ccp->defaultsfilledin = False;
+    ccp->esm = ESMethodSelectFocus;	/* default */
+    ccp->fonts = NULL;
+    ccp->num_fonts = 0;
+    ccp->status_fonts = NULL;
+    ccp->num_status_fonts = 0;
+    ccp->resetting = False;
+    ccp->event = NULL;
+    ccp->ximstyle = XIMPreeditNothing|XIMStatusNothing; /* default */
+    ccp->in_preedit = False;
+    ccp->in_status = False;
+
+    ccp->next = xpw->ximp.clients;
+    xpw->ximp.clients = ccp;
+
+    return ccp;
+}
+
+/*- attachConverter: attach converter to the client -*/
+static Widget
+attachConverter(ccp)
+ConvClient *ccp;
+{
+    WidgetClass class;
+    XimpProtocolWidget xpw = (XimpProtocolWidget)ccp->protocolwidget;
+
+    TRACE(("attachConverter(client window=0x%lx)\n", ccp->reqwin));
+    if (ccp->conversion != NULL) return ccp->conversion;
+
+    if (ccp->style == overthespot_style) {
+	class = overTheSpotConversionWidgetClass;
+    } else if (ccp->style == onthespot_style) {
+	class = onTheSpotConversionWidgetClass;
+    } else if (ccp->style == offthespot_style) {
+	class = offTheSpotConversionWidgetClass;
+    } else {
+	class = separateConversionWidgetClass;
+    }
+
+    ccp->conversion = CMGetConverter(XtParent(ccp->protocolwidget),
+				     ccp->reqwin, class,
+				     xpw->ximp.inputObjClass,
+				     xpw->ximp.displayObjClass);
+
+    return ccp->conversion;
+}
+
+/*- detachConverter: detach converter from client -*/
+static void
+detachConverter(ccp)
+ConvClient *ccp;
+{
+    TRACE(("detachConverter(client window=0x%lx)\n", ccp->reqwin));
+
+    XtRemoveCallback(ccp->conversion, XtNtextCallback,
+		     fixCallback, (XtPointer)ccp);
+    XtRemoveCallback(ccp->conversion, XtNendCallback,
+		     endCallback, (XtPointer)ccp);
+    XtRemoveCallback(ccp->conversion, XtNunusedEventCallback,
+		     unusedEventCallback, (XtPointer)ccp);
+    if (ccp->style == onthespot_style) {
+	XtRemoveCallback(ccp->conversion, XtNpreeditStartCallback,
+			 preeditStartCallback, (XtPointer)ccp);
+	XtRemoveCallback(ccp->conversion, XtNpreeditDoneCallback,
+			 preeditDoneCallback, (XtPointer)ccp);
+	XtRemoveCallback(ccp->conversion, XtNpreeditDrawCallback,
+			 preeditDrawCallback, (XtPointer)ccp);
+	XtRemoveCallback(ccp->conversion, XtNpreeditCaretCallback,
+			 preeditCaretCallback, (XtPointer)ccp);
+	XtRemoveCallback(ccp->conversion, XtNstatusStartCallback,
+			 statusStartCallback, (XtPointer)ccp);
+	XtRemoveCallback(ccp->conversion, XtNstatusDoneCallback,
+			 statusDoneCallback, (XtPointer)ccp);
+	XtRemoveCallback(ccp->conversion, XtNstatusDrawCallback,
+			 statusDrawCallback, (XtPointer)ccp);
+    }
+
+    CMReleaseConverter(XtParent(ccp->protocolwidget), ccp->conversion);
+    ccp->conversion = NULL;
+}
+
+/*- deleteClient: delete specified client -*/
+static void
+deleteClient(client)
+ConvClient *client;
+{
+    XimpProtocolWidget xpw = (XimpProtocolWidget)client->protocolwidget;
+    ConvClient *ccp, *ccp0;
+
+    TRACE(("deleteClient(client window=0x%lx)\n", client->reqwin));
+
+    if (client->conversion != NULL) detachConverter(client);
+    if (client->num_fonts > 0) {
+	FontBankFreeFonts(xpw->ximp.fontbank,
+			  client->fonts, client->num_fonts);
+    }
+    if (client->num_status_fonts > 0) {
+	FontBankFreeFonts(xpw->ximp.fontbank,
+			  client->status_fonts, client->num_status_fonts);
+    }
+    if (client->xpattrs.fontlist != NULL &&
+	client->xpattrs.fontlist != xpw->ximp.defaultfontlist) {
+	XFree(client->xpattrs.fontlist);
+    }
+    if (client->xsattrs.fontlist != NULL) {
+	XFree(client->xsattrs.fontlist);
+    }
+    if (client->version != NULL) XtFree(client->version);
+
+    for (ccp = xpw->ximp.clients, ccp0 = NULL;
+	 ccp != NULL;
+	 ccp0 = ccp, ccp = ccp->next) {
+	if (ccp == client) {
+	    if (ccp0 == NULL) {
+		xpw->ximp.clients = ccp->next;
+	    } else {
+		ccp0->next = ccp->next;
+	    }
+	    /* put it back to free list */
+	    client->next = xpw->ximp.freeclients;
+	    xpw->ximp.freeclients = client;
+	    return;
+	}
+    }
+    DPRINT(("deleteClient: cannot find the client in the client list!\n"));
+}
+
+/*
+ *+ utility functions
+ */
+
+/*- isCorrectClientEvent: is the event in correct format? -*/
+static Boolean
+isCorrectClientEvent(xpw, event)
+XimpProtocolWidget xpw;
+XEvent *event;
+{
+    XClientMessageEvent *ev = &(event->xclient);
+
+    return (event->type == ClientMessage &&
+	    ev->window == XtWindow((Widget)xpw) &&
+	    ev->message_type == xpw->ximp.ximpProtocolAtom &&
+	    ev->format == 32);
+}
+
+/*- isCorrectWindowID: is the given window ID valid? -*/
+static Boolean
+isCorrectWindowID(w, window, widthp, heightp)
+Widget w;
+Window window;
+Dimension *widthp;
+Dimension *heightp;
+{
+    XWindowAttributes attr;
+    int status;
+    XAEHandle h;
+
+    h = XAESetIgnoreErrors(XtDisplay(w));
+    status = XGetWindowAttributes(XtDisplay(w), window, &attr);
+    XAEUnset(h);
+
+    if (status == 0) return False;
+
+    if (widthp != NULL) *widthp = attr.width;
+    if (heightp != NULL) *heightp = attr.height;
+    return True;
+}
+
+/*- initializeError: display error message when resource isn't specified -*/
+static void
+initializeError(w, resname)
+Widget w;
+String resname;
+{
+    String params[2];
+    Cardinal num_params;
+
+    params[0] = XtClass(w)->core_class.class_name;
+    params[1] = resname;
+    num_params = 2;
+    XtAppErrorMsg(XtWidgetToApplicationContext(w),
+		  "initializeError", "noResource", "WidgetError",
+		  "%s: resource %s must be specified at widget creation",
+		  params, &num_params);
+}
+
+/*- checkLocale: check specified locale is supported -*/
+static void
+checkLocale(xpw, name)
+XimpProtocolWidget xpw;
+String name;
+{
+    XimpProtocolWidgetClass class = (XimpProtocolWidgetClass)XtClass((Widget)xpw);
+    FontBank fontbank;
+
+    TRACE(("checkLocale(localename=%s)\n", name));
+
+    fontbank = FontBankCreate(XtDisplay((Widget)xpw), name);
+    if (fontbank == NULL) {
+	/* not supported locale name */
+	String params[2];
+	Cardinal num_params;
+
+	params[0] = class->core_class.class_name;
+	params[1] = name;
+	num_params = 2;
+	XtAppErrorMsg(XtWidgetToApplicationContext((Widget)xpw),
+		      "initializeError", "localeNotSupported", "WidgetError",
+		      "%s: specified locale %s is not supported (yet)",
+		      params, &num_params);
+    } else {
+	xpw->ximp.fontbank = fontbank;
+    }
+}
+
+/*- fillInDefaultAttributes: fill in unspecified attributes -*/
+static void
+fillInDefaultAttributes(client)
+ConvClient *client;
+{
+    XimpProtocolWidget xpw = (XimpProtocolWidget)client->protocolwidget;
+    XimpPreEditAttributes *xpattr = &client->xpattrs;
+    XimpStatusAttributes *xsattr = &client->xsattrs;
+    unsigned long xmask = client->xattrmask;
+
+    if (client->defaultsfilledin) return;
+
+    /*
+     * Compute reasonable default values for the unspecified
+     * attributes except Area and AreaNeeded.
+     */
+    TRACE(("fillInDefaultAttributes()\n"));
+    if (!(xmask & XIMP_FOCUS_WIN_MASK)) {
+	client->focuswin = client->reqwin;
+	client->focuswidth = client->reqwinwidth;
+	client->focusheight = client->reqwinheight;
+    }
+
+    if (!(xmask & XIMP_PRE_FONT_MASK)) {
+	xpattr->fontlist = xpw->ximp.defaultfontlist;
+	getFonts(client, xpattr->fontlist, 1);
+	client->xattrmask |= XIMP_PRE_FONT_MASK;
+    }
+    if (!(xmask & XIMP_STS_FONT_MASK)) {
+	/* Default is same as preedit font */
+	xsattr->fontlist = XtNewString(xpattr->fontlist);
+	getFonts(client, xsattr->fontlist, 0);
+	client->xattrmask |= XIMP_STS_FONT_MASK;
+    }
+
+    if (!(xmask & XIMP_PRE_FG_MASK)) {
+	xpattr->foreground = xpw->ximp.foreground;
+    }
+    if (!(xmask & XIMP_PRE_BG_MASK)) {
+	xpattr->background = xpw->core.background_pixel;
+    }
+    if (!(xmask & XIMP_PRE_COLORMAP_MASK)) {
+	xpattr->colormap = xpw->core.colormap;
+    }
+    if (!(xmask & XIMP_PRE_BGPIXMAP_MASK)) {
+	xpattr->bgpixmap = None;
+    }
+    if (!(xmask & XIMP_PRE_LINESP_MASK)) {
+	Cardinal i;
+	XFontStruct *font;
+	int maxascent = 0, maxdescent = 0;
+
+	for (i = 0; i < client->num_fonts; i++) {
+	    font = client->fonts[i];
+	    if (maxascent < font->ascent) maxascent = font->ascent;
+	    if (maxdescent < font->descent) maxdescent = font->descent;
+	}
+	xpattr->linespacing = maxascent + maxdescent;
+    }
+    if (!(xmask & XIMP_PRE_CURSOR_MASK)) {
+	xpattr->cursor = None;		/* ie use parent's cursor */
+    }
+    if (!(xmask & XIMP_PRE_SPOTL_MASK)) {
+	xpattr->spotx = xpattr->spoty = 0;
+    }
+    if (!(xmask & XIMP_STS_FG_MASK)) {
+	xsattr->foreground = xpattr->foreground;
+    }
+    if (!(xmask & XIMP_STS_BG_MASK)) {
+	xsattr->background = xpattr->background;
+    }
+    if (!(xmask & XIMP_STS_COLORMAP_MASK)) {
+	xsattr->colormap = xpattr->colormap;
+    }
+    if (!(xmask & XIMP_STS_BGPIXMAP_MASK)) {
+	xsattr->bgpixmap = xpattr->bgpixmap;
+    }
+    if (!(xmask & XIMP_STS_LINESP_MASK)) {
+	xsattr->linespacing = xpattr->linespacing;
+    }
+    if (!(xmask & XIMP_STS_CURSOR_MASK)) {
+	xsattr->cursor = xpattr->cursor;
+    }
+    if (!(xmask & XIMP_STS_WINDOW_MASK)) {
+	xsattr->statuswin = None;
+    }
+
+    client->defaultsfilledin = True;
+}
+
+/*- computeAreaForStartup: compute Area for conversion startup -*/
+static void
+computeAreaForStartup(client)
+ConvClient *client;
+{
+    XimpPreEditAttributes *xpattr = &client->xpattrs;
+    XimpStatusAttributes *xsattr = &client->xsattrs;
+    unsigned long mask = client->xattrmask;
+
+    TRACE(("computeAreaForStartup(client=0x%lx)\n", client->reqwin));
+
+    if (client->style == separate_style ||
+	client->style == onthespot_style ||
+	client->style == overthespot_style) {
+	/*
+	 * These styles don't need status nor preedit area.
+	 * The separate style simpley ignores them, and the
+	 * over-the-spot style uses default value if not specified.
+	 */
+	return;
+    }
+
+    if ((mask & XIMP_STS_AREA_MASK) && (mask & XIMP_PRE_AREA_MASK)) return;
+
+    /*
+     * Compute default status/pre-edit area based on the AreaNeeded values.
+     */
+    computeAreaForQuery(client);
+
+    if (!(mask & XIMP_STS_AREA_MASK)) {
+	xsattr->areax = 0;
+	xsattr->areay = client->reqwinheight - xsattr->neededheight;
+	xsattr->areawidth = xsattr->neededwidth;
+	xsattr->areaheight = xsattr->neededheight;
+    }
+    if (!(mask & XIMP_PRE_AREA_MASK)) {
+	xpattr->areax = xsattr->areax + xsattr->areawidth;
+	xpattr->areay = client->reqwinheight - xpattr->neededheight;
+	xpattr->areawidth = xpattr->neededwidth;
+	xpattr->areaheight = xpattr->neededheight;
+    }
+}
+
+/*- computeAreaForQuery: compute Area and AreaNeeded for query from clients -*/
+static void
+computeAreaForQuery(client)
+ConvClient *client;
+{
+    XimpProtocolWidget xpw = (XimpProtocolWidget)client->protocolwidget;
+    XimpPreEditAttributes *xpattr = &client->xpattrs;
+    XimpStatusAttributes *xsattr = &client->xsattrs;
+    unsigned long mask = client->xattrmask;
+    int width, height;
+    int maxwidth, maxheight;
+    int fontheight;
+
+    TRACE(("computeAreaForQuery(client=0x%lx)\n", client->reqwin));
+
+    if (client->style == overthespot_style ||
+	client->style == offthespot_style) {
+
+	/*
+	 * Get the size of the request window again.
+	 * The size was checked when XIMP_CREATE message was received,
+	 * but it is possible that the size has changed since then.
+	 */
+	(void)isCorrectWindowID(client->protocolwidget, client->reqwin,
+				&client->reqwinwidth, &client->reqwinheight);
+    }
+
+    /*
+     * Compute the dimensions of the status region.
+     */
+    if (client->style == overthespot_style ||
+	client->style == offthespot_style) {
+
+	/*
+	 * Compute AreaNeeded value.
+	 */
+	fontheight = xsattr->linespacing + 2;
+	maxwidth = maxheight = 0;
+	if (mask & XIMP_STS_AREANEED_MASK) {
+	    maxwidth = xsattr->neededwidth;
+	    maxheight = xsattr->neededheight;
+	    TRACE(("\tstatus areaNeeded was: (%d,%d)\n", maxwidth, maxheight));
+	}
+
+	if (xpw->ximp.statuswidth > 0) {
+	    width = xpw->ximp.statuswidth;
+	} else {
+	    width = client->reqwinwidth / 5;	/* wild guess */
+	    if (width < fontheight * 3) {
+		width = fontheight * 3;		/* another wild guess */
+	    }
+	}
+	height = fontheight;
+    
+	if (maxwidth > 0 && width > maxwidth) width = maxwidth;
+	if (maxheight > 0 && height > maxheight) height = maxheight;
+	if (width < MIN_AREA_WIDTH) width = MIN_AREA_WIDTH;
+	if (height < MIN_AREA_HEIGHT) height = MIN_AREA_HEIGHT;
+    
+	xsattr->neededwidth = width;
+	xsattr->neededheight = height;
+	TRACE(("\tstatus areaNeeded is now: (%d, %d)\n", width, height));
+    
+	/*
+	 * If client has not specified the status area yet,
+	 * supply default value.
+	 */
+	if (!(mask & XIMP_STS_AREA_MASK)) {
+	    xsattr->areax = 0;
+	    xsattr->areay = client->reqwinheight - xsattr->neededheight;
+	    xsattr->areawidth = xsattr->neededwidth;
+	    xsattr->areaheight = xsattr->neededheight;
+	}
+    }
+
+    /*
+     * Compute the dimensions of the pre-edit region.
+     */
+    if (client->style == offthespot_style) {
+	/*
+	 * Compute AreaNeeded value.
+	 */
+	fontheight = xpattr->linespacing + 2;
+	maxwidth = maxheight = 0;
+	if (mask & XIMP_PRE_AREANEED_MASK) {
+	    maxwidth = xpattr->neededwidth;
+	    maxheight = xpattr->neededheight;
+	    TRACE(("\tpreedit areaNeeded was: (%d,%d)\n", maxwidth, maxheight));
+	}
+
+	width = client->reqwinwidth - xsattr->neededwidth;
+	height = fontheight;
+
+	if (maxwidth > 0 && width > maxwidth) width = maxwidth;
+	if (maxheight > 0 && height > maxheight) height = maxheight;
+	if (width < MIN_AREA_WIDTH) width = MIN_AREA_WIDTH;
+	if (height < MIN_AREA_HEIGHT) height = MIN_AREA_HEIGHT;
+
+	xpattr->neededwidth = width;
+	xpattr->neededheight = height;
+	TRACE(("\tpreedit areaNeeded is now: (%d, %d)\n", width, height));
+
+	/*
+	 * If client has not specified the status area yet,
+	 * supply default value.
+	 */
+	if (!(mask & XIMP_PRE_AREA_MASK)) {
+	    xpattr->areax = xsattr->neededwidth;
+	    xpattr->areay = client->reqwinheight - xpattr->neededheight;
+	    xpattr->areawidth = xpattr->neededwidth;
+	    xpattr->areaheight = xpattr->neededheight;
+	}
+    } else if (client->style == overthespot_style) {
+	/*
+	 * No need to calculate AreaNeeded value, which is
+	 * ignored by the client.  Just calculate default
+	 * Area if not specified.
+	 */
+	if (!(mask & XIMP_PRE_AREA_MASK)) {
+	    xpattr->areax = 0;
+	    xpattr->areay = 0;
+	    xpattr->areawidth = client->focuswidth;
+	    xpattr->areaheight = client->focusheight;
+	}
+    }
+}
+
+/*- makeConvAttributes: -*/
+static unsigned long
+makeConvAttributes(client, attr)
+ConvClient *client;
+ConversionAttributes *attr;
+{
+    XimpPreEditAttributes *xpattr = &client->xpattrs;
+    XimpStatusAttributes *xsattr = &client->xsattrs;
+    unsigned long xmask = client->xattrmask;
+    unsigned long mask;
+
+    TRACE(("makeConvAttributes()\n"));
+    mask = 0L;
+
+    /* focus window */
+    attr->focuswindow = client->focuswin;
+    mask |= CAFocusWindow;
+
+    if (client->style == overthespot_style ||
+	client->style == offthespot_style) {
+
+	/* client area */
+	if (client->style == offthespot_style ||
+	    (xmask & XIMP_PRE_AREA_MASK)) {
+	    attr->clientarea.x = xpattr->areax;
+	    attr->clientarea.y = xpattr->areay;
+	    attr->clientarea.width = xpattr->areawidth;
+	    attr->clientarea.height = xpattr->areaheight;
+	    mask |= CAClientArea;
+	}
+
+	/* foreground/background */
+	attr->foreground = xpattr->foreground;
+	attr->background = xpattr->background;
+	mask |= CAColor;
+
+	/* colormap */
+	if (xmask & XIMP_PRE_COLORMAP_MASK) {
+	    attr->colormap = xpattr->colormap;
+	    mask |= CAColormap;
+	}
+
+	/* background pixmap */
+	if (xmask & XIMP_PRE_BGPIXMAP_MASK) {
+	    attr->background_pixmap = xpattr->bgpixmap;
+	    mask |= CABackgroundPixmap;
+	}
+
+	/* line spacing */
+	if (xmask & XIMP_PRE_LINESP_MASK) {
+	    attr->linespacing = xpattr->linespacing;
+	    mask |= CALineSpacing;
+	}
+
+	/* cursor */
+	if (xmask & XIMP_PRE_CURSOR_MASK) {
+	    attr->cursor = xpattr->cursor;
+	    mask |= CACursor;
+	}
+
+	/* status area */
+	/* offTheSpotConversion doesn't allow status area left unspecified */
+	if (client->style == offthespot_style ||
+	    (xmask & XIMP_STS_AREA_MASK)) {
+	    attr->statusarea.x = xsattr->areax;
+	    attr->statusarea.y = xsattr->areay;
+	    attr->statusarea.width = xsattr->areawidth;
+	    attr->statusarea.height = xsattr->areaheight;
+	    mask |= CAStatusArea;
+	}
+
+	/* font */
+	attr->fonts = client->fonts;
+	attr->num_fonts = client->num_fonts;
+	attr->status_fonts = client->status_fonts;
+	attr->num_status_fonts = client->num_status_fonts;
+	mask |= CAFonts|CAStatusFonts;
+    }
+
+    if (client->style == overthespot_style) {
+	/* spot location */
+	if (xmask & XIMP_PRE_SPOTL_MASK) {
+	    attr->spotx = xpattr->spotx;
+	    attr->spoty = xpattr->spoty;
+	    mask |= CASpotLocation;
+	}
+    }
+    return mask;
+}
+
+/*- getFonts: get fonts from specified fontnamelist -*/
+static void
+getFonts(client, fontnamelist, preedit)
+ConvClient *client;
+String fontnamelist;
+int preedit;
+{
+    XimpProtocolWidget xpw = (XimpProtocolWidget)client->protocolwidget;
+    XFontStruct **fonts;
+    int num_fonts;
+
+    TRACE(("getFonts(%s)\n", preedit ? "preedit" : "status"));
+    TRACE(("\tfontnamelist: %s\n", fontnamelist));
+
+    fonts = FontBankGet(xpw->ximp.fontbank, fontnamelist, &num_fonts);
+    if (preedit) {
+	client->fonts = fonts;
+	client->num_fonts = num_fonts;
+    } else {
+	client->status_fonts = fonts;
+	client->num_status_fonts = num_fonts;
+    }
+}
+
+
+/*
+ *+ property handling
+ */
+
+/*- setProperty: set information properties -*/
+static void
+setProperty(xpw)
+XimpProtocolWidget xpw;
+{
+    Display *dpy = XtDisplay((Widget)xpw);
+    Window win = XtWindow((Widget)xpw);
+    XimpInputStyle *xisp;
+    unsigned long styles[20];
+    Cardinal nstyles;
+    unsigned long extensions[10];
+    Cardinal nextensions;
+
+    TRACE(("setProperty()\n"));
+
+#define SETPROPERTY(p, t, f, d, n) \
+    XChangeProperty(dpy, win, p, t, f, PropModeReplace, (unsigned char *)d, n)
+
+    SETPROPERTY(xpw->ximp.ximpVersionAtom, XA_STRING, 8,
+		PROTOCOL_VERSION_STR, strlen(PROTOCOL_VERSION_STR));
+    SETPROPERTY(xpw->ximp.ximpServerNameAtom, XA_STRING, 8,
+		SERVER_NAME, strlen(xpw->ximp.servername));
+    SETPROPERTY(xpw->ximp.ximpServerVersionAtom, XA_STRING, 8,
+		SERVER_VERSION, strlen(SERVER_VERSION));
+    SETPROPERTY(xpw->ximp.ximpVendorNameAtom, XA_STRING, 8,
+		VENDOR_NAME, strlen(VENDOR_NAME));
+
+    for (xisp = XimpStyles, nstyles = 0; xisp->ximstyle != 0;
+	 xisp++, nstyles++) {
+	styles[nstyles] = xisp->ximstyle;
+    }
+    SETPROPERTY(xpw->ximp.ximpStyleAtom, xpw->ximp.ximpStyleAtom, 32,
+		styles, nstyles);
+
+    nextensions = 0;
+    extensions[nextensions++] = xpw->ximp.ximpExtXimpBackFrontAtom;
+    SETPROPERTY(xpw->ximp.ximpExtensionsAtom, xpw->ximp.ximpExtensionsAtom, 32,
+		extensions, nextensions);
+
+    setKeyProperty(xpw);
+
+#undef SETPROPERTY
+}
+
+/*- setKeyProperty: set _XIM_KEYS property -*/
+static void
+setKeyProperty(xpw)
+XimpProtocolWidget xpw;
+{
+    long data[100];	/* enough */
+    char line[256];	/* enough */
+    Display *dpy = XtDisplay((Widget)xpw);
+    int nkeys = 0;
+    String p, q;
+    int c, n;
+    ICTriggerKey *keys, *ekeys;
+
+    if ((p = xpw->ximp.convkeys) != NULL) {
+	TRACE(("setKeyProperty(%s)\n", p));
+	do {
+	    KeySym keysym;
+	    long mods, chk_mods;
+
+	    q = line;
+	    while ((c = *p++) != '\0' && c != '\n') {
+		*q++ = c;
+	    }
+	    *q = '\0';
+	    if (ParseKeyEvent(line, &keysym, &mods, &chk_mods)) {
+		data[nkeys * 3] = mods;
+		data[nkeys * 3 + 1] = chk_mods;
+		data[nkeys * 3 + 2] = keysym;
+		nkeys++;
+	    }
+	} while  (c != '\0');
+    }
+
+    n = ICGetTriggerKeysOfInputObjectClass(xpw->ximp.inputObjClass, &keys);
+    for (ekeys = keys + n ;
+	 keys < ekeys && nkeys < (sizeof(data) / sizeof(long)) / 3 ; keys++) {
+      data[nkeys * 3] = keys->modifiers;
+      data[nkeys * 3 + 1] = keys->modifiermask;
+      data[nkeys * 3 + 2] = keys->keysym;
+      nkeys++;
+    }
+
+    XChangeProperty(dpy, XtWindow((Widget)xpw), xpw->ximp.ximpKeysAtom,
+		    xpw->ximp.ximpKeysAtom, 32, PropModeReplace,
+		    (unsigned char *)data, nkeys * 3);
+}
+
+/*- getVersionProperty: get _XIMP_VERSION property -*/
+static void
+getVersionProperty(client)
+ConvClient *client;
+{
+    XimpProtocolWidget xpw = (XimpProtocolWidget)client->protocolwidget;
+    String data;
+    unsigned long len;
+
+    TRACE(("getVersionProperty()\n"));
+    if (!readProperty(client, xpw->ximp.ximpVersionAtom, XA_STRING, 8,
+		      (unsigned char **)&data, &len)) {
+	DPRINT(("can't read _XIMP_VERSION property\n"));
+	client->version = NULL;
+	return;
+    }
+    TRACE(("\tclient version is %s\n", data));
+
+    /* what to do? */
+
+    client->version = data;
+}
+
+/*- getAttributes: read properties and set conversion attributes -*/
+static void
+getAttributes(client, mask)
+ConvClient *client;
+unsigned long mask;
+{
+    if (mask & XIMP_FOCUS_WIN_MASK) {
+	getFocusProperty(client);
+    }
+    if (mask & XIMP_PRE_FONT_MASK) {
+	getPreeditFontProperty(client);
+    }
+    if (mask & XIMP_STS_FONT_MASK) {
+	getStatusFontProperty(client);
+    }
+    if (mask & PREEDIT_MASK) {
+	getPreeditProperty(client, mask & PREEDIT_MASK);
+    }
+    if (mask & STATUS_MASK) {
+	getStatusProperty(client, mask & STATUS_MASK);
+    }
+}
+
+/*- getFocusProperty: get _XIMP_FOCUS property -*/
+static void
+getFocusProperty(client)
+ConvClient *client;
+{
+    XimpProtocolWidget xpw = (XimpProtocolWidget)client->protocolwidget;
+    unsigned char *data;
+    unsigned long len;
+    Window focus;
+    Dimension w, h;
+
+    TRACE(("getFocusProperty()\n"));
+    if (!readProperty(client, xpw->ximp.ximpFocusAtom, XA_WINDOW, 32,
+		      &data, &len)) {
+	DPRINT(("can't read _XIMP_FOCUS property\n"));
+	return;
+    } else if (len != 1) {
+	DPRINT(("length of _XIMP_FOCUS property is not 1\n"));
+	XtFree((char *)data);
+	return;
+    }
+
+    focus = *(Window *)data;
+    XtFree((char *)data);
+    TRACE(("\tfocus window=0x%lx\n", focus));
+
+    if (!isCorrectWindowID((Widget)xpw, focus, &w, &h)) {
+	DPRINT(("specified focus window doesn't exist\n"));
+	sendErrorEvent(client, XIMP_BadFocusWindow);
+	return;
+    }
+
+    client->focuswin = focus;
+    client->focuswidth = w;
+    client->focusheight = h;
+    client->xattrmask |= XIMP_FOCUS_WIN_MASK;
+}
+
+/*- getPreeditFontProperty: get _XIMP_PREEDITFONT property -*/
+static void
+getPreeditFontProperty(client)
+ConvClient *client;
+{
+    XimpProtocolWidget xpw = (XimpProtocolWidget)client->protocolwidget;
+    char *data;
+    unsigned long len;
+
+    TRACE(("getPreeditFontProperty()\n"));
+    if (!readProperty(client, xpw->ximp.ximpPreeditFontAtom, XA_STRING, 8,
+		      (unsigned char **)&data, &len)) {
+	DPRINT(("can't read _XIMP_PREEDITFONT property\n"));
+	return;
+    }
+
+    if (client->xpattrs.fontlist != NULL) {
+	if (!strcmp(data, client->xpattrs.fontlist)) {
+	    XtFree(data);
+	    return;
+	}
+	if (client->xpattrs.fontlist != xpw->ximp.defaultfontlist) {
+	    XtFree(client->xpattrs.fontlist);
+	}
+    }
+    client->xpattrs.fontlist = data;
+    client->xattrmask |= XIMP_PRE_FONT_MASK;
+
+    /* extract fonts to be used */
+    getFonts(client, data, 1);
+}
+
+/*- getStatusFontProperty: get _XIMP_STATUSFONT property -*/
+static void
+getStatusFontProperty(client)
+ConvClient *client;
+{
+    XimpProtocolWidget xpw = (XimpProtocolWidget)client->protocolwidget;
+    unsigned char *data;
+    unsigned long len;
+
+    TRACE(("getStatusFontProperty()\n"));
+    if (!readProperty(client, xpw->ximp.ximpStatusFontAtom, XA_STRING, 8,
+		      &data, &len)) {
+	DPRINT(("can't read _XIMP_STATUSFONT property\n"));
+	return;
+    }
+
+    if (client->xsattrs.fontlist != NULL) {
+	if (!strcmp(data, client->xsattrs.fontlist)) {
+	    XtFree(data);
+	    return;
+	}
+	if (client->xsattrs.fontlist != xpw->ximp.defaultfontlist) {
+	    XtFree(client->xsattrs.fontlist);
+	}
+    }
+    client->xsattrs.fontlist = (String)data;
+    client->xattrmask |= XIMP_STS_FONT_MASK;
+
+    /* extract fonts to be used */
+    getFonts(client, data, 0);
+}
+
+/*- getPreeditProperty: get _XIMP_PREEDIT property -*/
+static void
+getPreeditProperty(client, mask)
+ConvClient *client;
+unsigned long mask;
+{
+    XimpProtocolWidget xpw = (XimpProtocolWidget)client->protocolwidget;
+    XimpPreEditAttributes *xpattr = &client->xpattrs;
+    unsigned long *data;
+    unsigned long len;
+
+    TRACE(("getPreeditProperty()\n"));
+    if (!readProperty(client, xpw->ximp.ximpPreeditAtom,
+		      xpw->ximp.ximpPreeditAtom, 32,
+		      (unsigned char **)&data, &len)) {
+	DPRINT(("can't read _XIMP_PREEDIT property\n"));
+	return;
+    } else if (len < 14) {
+	DPRINT(("length of _XIMP_PREEDIT property is less than 14(%ld)\n",len));
+	XtFree((char *)data);
+	return;
+    }
+
+    client->xattrmask |= mask;
+
+    /* data[0]-data[3]: Area.{x,y,width,height} */
+    if (mask & XIMP_PRE_AREA_MASK) {
+	xpattr->areax = data[0];
+	xpattr->areay = data[1];
+	xpattr->areawidth = data[2];
+	xpattr->areaheight = data[3];
+	if (xpattr->areawidth == 0 || xpattr->areaheight == 0) {
+	    client->xattrmask &= ~XIMP_PRE_AREA_MASK;
+	    DPRINT(("invalid area specified:\n"));
+	}
+	TRACE(("\tArea: (%ld,%ld)-(%ld,%ld)\n",data[0],data[1],data[2],data[3]));
+    }
+    /* data[4]: Foreground */
+    if (mask & XIMP_PRE_FG_MASK) {
+	xpattr->foreground = data[4];
+	TRACE(("\tForeground: %ld\n", data[4]));
+    }
+    /* data[5]: Background */
+    if (mask & XIMP_PRE_BG_MASK) {
+	xpattr->background = data[5];
+	TRACE(("\tBackground: %ld\n", data[5]));
+    }
+    /* data[6]: Colormap */
+    if (mask & XIMP_PRE_COLORMAP_MASK) {
+	xpattr->colormap = data[6];
+	TRACE(("\tColormap: 0x%lx\n", data[6]));
+    }
+    /* data[7]: BackgroundPixmap */
+    if (mask & XIMP_PRE_BGPIXMAP_MASK) {
+	xpattr->bgpixmap = data[7];
+	TRACE(("\tBackgroundPixmap: 0x%lx\n", data[7]));
+    }
+    /* data[8]: LineSpacing */
+    if (mask & XIMP_PRE_LINESP_MASK) {
+	if (data[8] < MIN_LINE_SPACING) {
+	    client->xattrmask &= ~XIMP_PRE_LINESP_MASK;
+	    DPRINT(("specified line spacing is too small (%ld)\n", data[8]));
+	} else {
+	    xpattr->linespacing = data[8];
+	    TRACE(("\tLineSpacing: %ld\n", data[8]));
+	}
+    }
+    /* data[9]: Cursor */
+    if (mask & XIMP_PRE_CURSOR_MASK) {
+	xpattr->cursor = data[9];
+	TRACE(("\tCursor: 0x%lx\n", data[9]));
+    }
+    /* data[10]-data[11]: AreaNeeded.{width,height} */
+    if (mask & XIMP_PRE_AREANEED_MASK) {
+	xpattr->neededwidth = data[10];
+	xpattr->neededheight = data[11];
+	TRACE(("\tAreaNeeded: %ld,%ld\n", data[10], data[11]));
+    }
+    /* data[12]-data[13]: SpotLocation.{x,y} */
+    if (mask & XIMP_PRE_SPOTL_MASK) {
+	xpattr->spotx = data[12];
+	xpattr->spoty = data[13];
+        TRACE(("\tSpotLocation: %ld,%ld\n", data[12], data[13]));
+    }
+
+    XtFree((char *)data);
+}
+
+/*- getStatusProperty: get _XIMP_STATUS property -*/
+static void
+getStatusProperty(client, mask)
+ConvClient *client;
+unsigned long mask;
+{
+    XimpProtocolWidget xpw = (XimpProtocolWidget)client->protocolwidget;
+    XimpStatusAttributes *xsattr = &client->xsattrs;
+    unsigned long *data;
+    unsigned long len;
+
+    TRACE(("getStatusProperty()\n"));
+    if (!readProperty(client, xpw->ximp.ximpStatusAtom,
+		      xpw->ximp.ximpStatusAtom, 32,
+		      (unsigned char **)&data, &len)) {
+	DPRINT(("can't read _XIMP_STATUS property\n"));
+	return;
+    } else if (len < 12) {
+	DPRINT(("length of _XIMP_STATUS property is less than 12(%ld)\n",len));
+	XtFree((char *)data);
+	return;
+    }
+
+    client->xattrmask |= mask;
+
+    /* data[0]-data[3]: Area.{x,y,width,height} */
+    if (mask & XIMP_STS_AREA_MASK) {
+	xsattr->areax = data[0];
+	xsattr->areay = data[1];
+	xsattr->areawidth = data[2];
+	xsattr->areaheight = data[3];
+	if (xsattr->areawidth == 0 || xsattr->areaheight == 0) {
+	    client->xattrmask &= ~XIMP_STS_AREA_MASK;
+	    DPRINT(("invalid area specified:\n"));
+	} 
+	TRACE(("\tArea: (%ld,%ld)-(%ld,%ld)\n",
+		data[0],data[1],data[2],data[3]));
+    }
+    /* data[4]: Foreground */
+    if (mask & XIMP_STS_FG_MASK) {
+	xsattr->foreground = data[4];
+	TRACE(("\tForeground: %ld\n", data[4]));
+    }
+    /* data[5]: Background */
+    if (mask & XIMP_STS_BG_MASK) {
+	xsattr->background = data[5];
+	TRACE(("\tBackground: %ld\n", data[5]));
+    }
+    /* data[6]: Colormap */
+    if (mask & XIMP_STS_COLORMAP_MASK) {
+	xsattr->colormap = data[6];
+	TRACE(("\tColormap: 0x%lx\n", data[6]));
+    }
+    /* data[7]: BackgroundPixmap */
+    if (mask & XIMP_STS_BGPIXMAP_MASK) {
+	xsattr->bgpixmap = data[7];
+	TRACE(("\tBackgroundPixmap: 0x%lx\n", data[7]));
+    }
+    /* data[8]: LineSpacing */
+    if (mask & XIMP_STS_LINESP_MASK) {
+	if (data[8] < MIN_LINE_SPACING) {
+	    client->xattrmask &= ~XIMP_STS_LINESP_MASK;
+	    DPRINT(("specified line spacing is too small (%ld)\n", data[8]));
+	} else {
+	    xsattr->linespacing = data[8];
+	    TRACE(("\tLineSpacing: %ld\n", data[8]));
+	}
+    }
+    /* data[9]: Cursor */
+    if (mask & XIMP_STS_CURSOR_MASK) {
+	xsattr->cursor = data[9];
+	TRACE(("\tCursor: 0x%lx\n", data[9]));
+    }
+    /* data[10]-data[11]: AreaNeeded.{width,height} */
+    if (mask & XIMP_STS_AREANEED_MASK) {
+	xsattr->neededwidth = data[10];
+	xsattr->neededheight = data[11];
+	TRACE(("\tAreaNeeded: %ld,%ld\n", data[10], data[11]));
+    }
+    /* data[12]: StatusWindowID -- not suppoted by kinput2 */
+    if (len > 12 && (mask & XIMP_STS_WINDOW_MASK)) {
+	xsattr->statuswin = None;	/* ignore specified value */
+	TRACE(("\tStatusWindow(not supported): 0x%lx\n", data[12]));
+    }
+
+    XtFree((char *)data);
+}
+
+/*- readProperty: read specified property of the client window -*/
+static Boolean
+readProperty(client, prop, type, format, datapp, lenp)
+ConvClient *client;
+Atom prop;
+Atom type;
+int format;
+unsigned char **datapp;
+unsigned long *lenp;
+{
+    Atom realtype;
+    int realformat;
+    unsigned long bytesafter;
+
+    *datapp = NULL;
+    /*
+     * generally, XGetWindowProperty can generate BadAtom, BadValue and
+     * BadWindow errors. but in this case, none of those errors can occur.
+     * atoms are valid, offset 0 won't cause BadValue, and window ID is
+     * already validated. (strictly speaking, there's a chance of getting
+     * BadWindow if the client window destroyed after it was validated.
+     * let's forget it for a while :-) so we don't have to be careful to
+     * errors.
+     */
+    (void)XGetWindowProperty(XtDisplay(client->protocolwidget),
+			     client->reqwin,
+			     prop, 0L, 1000L, True, type,
+			     &realtype, &realformat, lenp,
+			     &bytesafter, datapp);
+    if (realtype == None) {
+	/* specified property doesn't exist */
+	sendErrorEvent(client, XIMP_BadProperty);
+	return False;
+    } else if (realtype != type) {
+	/* wrong type */
+	sendErrorEvent(client, XIMP_BadPropertyType);
+	return False;
+    } else if (realformat != format) {
+	/* wrong format */
+	if (*datapp != NULL) XtFree((char *)*datapp);
+	*datapp = NULL;
+	/* there's no XIMP_BadFormat error. use XIMP_BadPropertyType instead */
+	sendErrorEvent(client, XIMP_BadPropertyType);
+	return False;
+    }
+    return True;
+}
+
+/*- setAttributes: set properties according to the conversion attributes -*/
+static void
+setAttributes(client, mask)
+ConvClient *client;
+unsigned long mask;
+{
+    if (mask & XIMP_FOCUS_WIN_MASK) {
+	setFocusProperty(client);
+    }
+    if (mask & XIMP_PRE_FONT_MASK) {
+	setPreeditFontProperty(client);
+    }
+    if (mask & XIMP_STS_FONT_MASK) {
+	setStatusFontProperty(client);
+    }
+    if (mask & PREEDIT_MASK) {
+	setPreeditProperty(client, mask);
+    }
+    if (mask & STATUS_MASK) {
+	setStatusProperty(client, mask);
+    }
+}
+
+/*- setFocusProperty: set _XIMP_FOCUS property -*/
+static void
+setFocusProperty(client)
+ConvClient *client;
+{
+    XimpProtocolWidget xpw = (XimpProtocolWidget)client->protocolwidget;
+
+    TRACE(("setFocusProperty()\n"));
+    writeProperty(client, xpw->ximp.ximpFocusAtom, XA_WINDOW, 32,
+		  (unsigned char *)&client->focuswin, 1);
+}
+
+/*- setPreeditFontProperty: set _XIMP_PREEDITFONT property -*/
+static void
+setPreeditFontProperty(client)
+ConvClient *client;
+{
+    XimpProtocolWidget xpw = (XimpProtocolWidget)client->protocolwidget;
+
+    TRACE(("setPreeditFontProperty()\n"));
+    writeProperty(client, xpw->ximp.ximpPreeditFontAtom, XA_STRING, 8,
+		  (unsigned char *)client->xpattrs.fontlist,
+		  strlen(client->xpattrs.fontlist));
+}
+
+/*- setStatusFontProperty: set _XIMP_STATUSFONT property -*/
+static void
+setStatusFontProperty(client)
+ConvClient *client;
+{
+    XimpProtocolWidget xpw = (XimpProtocolWidget)client->protocolwidget;
+
+    TRACE(("setStatusFontProperty()\n"));
+    writeProperty(client, xpw->ximp.ximpStatusFontAtom, XA_STRING, 8,
+		  (unsigned char *)client->xsattrs.fontlist,
+		  strlen(client->xsattrs.fontlist));
+}
+
+/*- setPreeditProperty: set _XIMP_PREEDIT property -*/
+static void
+setPreeditProperty(client, mask)
+ConvClient *client;
+unsigned long mask;
+{
+    XimpProtocolWidget xpw = (XimpProtocolWidget)client->protocolwidget;
+    XimpPreEditAttributes *xpattr = &client->xpattrs;
+    long data[14];
+
+    TRACE(("setPreeditProperty()\n"));
+
+    /* data[0]-data[3]: Area.{x,y,width,height} */
+    if (mask & XIMP_PRE_AREA_MASK) {
+	data[0] = xpattr->areax;
+	data[1] = xpattr->areay;
+	data[2] = xpattr->areawidth;
+	data[3] = xpattr->areaheight;
+    }
+    /* data[4]: Foreground */
+    if (mask & XIMP_PRE_FG_MASK) {
+	 data[4] = xpattr->foreground;
+    }
+    /* data[5]: Background */
+    if (mask & XIMP_PRE_BG_MASK) {
+	data[5] = xpattr->background;
+    }
+    /* data[6]: Colormap */
+    if (mask & XIMP_PRE_COLORMAP_MASK) {
+	data[6] = xpattr->colormap;
+    }
+    /* data[7]: BackgroundPixmap */
+    if (mask & XIMP_PRE_BGPIXMAP_MASK) {
+	data[7] = xpattr->bgpixmap;
+    }
+    /* data[8]: LineSpacing */
+    if (mask & XIMP_PRE_LINESP_MASK) {
+	data[8] = xpattr->linespacing;
+    }
+    /* data[9]: Cursor */
+    if (mask & XIMP_PRE_CURSOR_MASK) {
+	data[9] = xpattr->cursor;
+    }
+    /* data[10]-data[11]: AreaNeeded.{width,height} */
+    if (mask & XIMP_PRE_AREANEED_MASK) {
+	data[10] = xpattr->neededwidth;
+	data[11] = xpattr->neededheight;
+    }
+    /* data[12]-data[13]: SpotLocation.{x,y} */
+    if (mask & XIMP_PRE_SPOTL_MASK) {
+	data[12] = xpattr->spotx;
+	data[13] = xpattr->spoty;
+    }
+
+    writeProperty(client, xpw->ximp.ximpPreeditAtom,
+		  xpw->ximp.ximpPreeditAtom, 32,
+		  (unsigned char *)data, 14);
+}
+
+/*- setStautsProperty: set _XIMP_STATUS property -*/
+static void
+setStatusProperty(client, mask)
+ConvClient *client;
+unsigned long mask;
+{
+    XimpProtocolWidget xpw = (XimpProtocolWidget)client->protocolwidget;
+    XimpStatusAttributes *xsattr = &client->xsattrs;
+    long data[13];
+
+    TRACE(("setStatusProperty()\n"));
+
+    /* data[0]-data[3]: Area.{x,y,width,height} */
+    if (mask & XIMP_STS_AREA_MASK) {
+	data[0] = xsattr->areax = data[0];
+	data[1] = xsattr->areay = data[1];
+	data[2] = xsattr->areawidth = data[2];
+	data[3] = xsattr->areaheight = data[3];
+    }
+    /* data[4]: Foreground */
+    if (mask & XIMP_STS_FG_MASK) {
+	data[4] = xsattr->foreground;
+    }
+    /* data[5]: Background */
+    if (mask & XIMP_STS_BG_MASK) {
+	data[5] = xsattr->background;
+    }
+    /* data[6]: Colormap */
+    if (mask & XIMP_STS_COLORMAP_MASK) {
+	data[6] = xsattr->colormap;
+    }
+    /* data[7]: BackgroundPixmap */
+    if (mask & XIMP_STS_BGPIXMAP_MASK) {
+	data[7] = xsattr->bgpixmap;
+    }
+    /* data[8]: LineSpacing */
+    if (mask & XIMP_STS_LINESP_MASK) {
+	data[8] = xsattr->linespacing;
+    }
+    /* data[9]: Cursor */
+    if (mask & XIMP_STS_CURSOR_MASK) {
+	data[9] = xsattr->cursor;
+    }
+    /* data[10]-data[11]: AreaNeeded.{width,height} */
+    if (mask & XIMP_STS_AREANEED_MASK) {
+	data[10] = xsattr->neededwidth;
+	data[11] = xsattr->neededheight;
+    }
+    /* data[12]: StatusWindowID -- not suppoted by kinput2 */
+    if (mask & XIMP_STS_WINDOW_MASK) {
+	data[12] = xsattr->statuswin;
+    }
+
+    writeProperty(client, xpw->ximp.ximpStatusAtom,
+		  xpw->ximp.ximpStatusAtom, 32,
+		  (unsigned char *)data, 13);
+}
+
+/*- writeProperty: write specified property of the client window -*/
+static void
+writeProperty(client, prop, type, format, datap, len)
+ConvClient *client;
+Atom prop;
+Atom type;
+int format;
+unsigned char *datap;
+int len;
+{
+    /*
+     * generally, XChangeWindowProperty can generate BadAlloc, BadAtom,
+     * BadMatch, BadValue and BadWindow errors. but in this case, none of
+     * those errors except BadAlloc can occur.  atoms and values to be
+     * specified are valid (at least if the program is correct :-), mode
+     * PropModeReplace won't cause BadMatch, and window ID is already
+     * validated.  so, if we assume amount of memory is infinite :-), we
+     * don't have to be careful to errors.
+     */
+    (void)XChangeProperty(XtDisplay(client->protocolwidget),
+			  client->reqwin, prop, type, format,
+			  PropModeReplace, datap, len);
+}
+
+/*
+ *+ event sending
+ */
+
+/*- sendClientMessage8: send a clientmessage event (format=8) -*/
+static void
+sendClientMessage8(client, str, len)
+ConvClient *client;
+char *str;
+int len;
+{
+    XimpProtocolWidget xpw = (XimpProtocolWidget)client->protocolwidget;
+    XEvent event;
+    
+    event.xclient.type = ClientMessage;
+    event.xclient.window = client->focuswin;
+    event.xclient.message_type = xpw->ximp.ximpProtocolAtom;
+    event.xclient.format = 8;
+
+    /* client ID must be stored in network byte order (ie MSB first) */
+    event.xclient.data.b[0] = (client->id >> 24) & 0xff;
+    event.xclient.data.b[1] = (client->id >> 16) & 0xff;
+    event.xclient.data.b[2] = (client->id >> 8) & 0xff;
+    event.xclient.data.b[3] = client->id & 0xff;
+
+    event.xclient.data.b[4] = len;
+
+    (void)strncpy(&event.xclient.data.b[5], str, 20 - 5);
+
+    XSendEvent(XtDisplay((Widget)xpw), event.xclient.window,
+	       False, NoEventMask, &event);
+}
+
+/*- sendClientMessage32: send a clientmessage event (format=32) -*/
+static void
+sendClientMessage32(client, type, l1, l2, l3, l4)
+ConvClient *client;
+int type;
+unsigned long l1, l2, l3, l4;
+{
+    XimpProtocolWidget xpw = (XimpProtocolWidget)client->protocolwidget;
+    XEvent event;
+
+    event.xclient.type = ClientMessage;
+    event.xclient.window = client->focuswin;
+    event.xclient.message_type = xpw->ximp.ximpProtocolAtom;
+    event.xclient.format = 32;
+    event.xclient.data.l[0] = type;
+    event.xclient.data.l[1] = l1;
+    event.xclient.data.l[2] = l2;
+    event.xclient.data.l[3] = l3;
+    event.xclient.data.l[4] = l4;
+
+    XSendEvent(XtDisplay((Widget)xpw), event.xclient.window,
+	       False, NoEventMask, &event);
+}
+
+/*- sendKeyEvent: send unused keypress event via clientmessage event -*/
+static void
+sendKeyEvent(client, keyevent)
+ConvClient *client;
+XKeyEvent *keyevent;
+{
+    TRACE(("sendKeyEvent()\n"));
+    sendClientMessage32(client, XIMP_KEYPRESS, client->id,
+			(unsigned long)keyevent->keycode,
+			(unsigned long)keyevent->state, 0L);
+}
+
+/*- sendErrorEvent: send error event via clientmessage event -*/
+static void
+sendErrorEvent(client, error)
+ConvClient *client;
+int error;
+{
+    sendClientMessage32(client, XIMP_ERROR, client->id,
+			client->event->serial, (unsigned long)error, 0L);
+}
+
+/*- sendCreateRefusal: send rejecting message to a CREATE request -*/
+static void
+sendCreateRefusal(xpw, window)
+XimpProtocolWidget xpw;
+Window window;
+{
+    XEvent event;
+
+    event.xclient.type = ClientMessage;
+    event.xclient.window = window;
+    event.xclient.message_type = xpw->ximp.ximpProtocolAtom;
+    event.xclient.format = 32;
+    event.xclient.data.l[0] = XIMP_CREATE_RETURN;
+    event.xclient.data.l[1] = 0L;
+    event.xclient.data.l[2] = 0L;
+    event.xclient.data.l[3] = 0L;
+    event.xclient.data.l[4] = 0L;
+
+    XSendEvent(XtDisplay((Widget)xpw), window, False, NoEventMask, &event);
+}
+
+/*
+ *+ callback procedures
+ */
+
+/*- fixCallback: fix callback -*/
+/* ARGSUSED */
+static void
+fixCallback(w, client_data, call_data)
+Widget w;
+XtPointer client_data;
+XtPointer call_data;
+{
+    CCTextCallbackArg *arg = (CCTextCallbackArg *)call_data;
+    ConvClient *ccp = (ConvClient *)client_data;
+
+    TRACE(("fixCallback(reqwin=0x%lx, length=%d)\n",ccp->reqwin, arg->length));
+    fixProc(ccp, arg);
+}
+
+/*- fixProc: do actual fix processing -*/
+static void
+fixProc(client, arg)
+ConvClient *client;
+CCTextCallbackArg *arg;
+{
+    XimpProtocolWidget xpw = (XimpProtocolWidget)client->protocolwidget;
+
+    /* check encoding and format */
+    if (arg->encoding != xpw->ximp.ctextAtom ||	arg->format != 8) {
+	/*
+	 * since every conversion object must support COMPOUND_TEXT,
+	 * it is a serious error.
+	 */
+	String params[2];
+	Cardinal num_params;
+
+	params[0] = XtClass((Widget)xpw)->core_class.class_name;
+	params[1] = xpw->ximp.inputObjClass->core_class.class_name;
+	num_params = 2;
+
+	XtAppErrorMsg(XtWidgetToApplicationContext(client->protocolwidget),
+		      "encodingError", "convertedString", "WidgetError",
+		      "%s: encoding of the converted string is not COMPOUND_STRING. check inputObject %s",
+		      params, &num_params);
+    }
+
+    /*
+     * normaly, converted string can be sent to client either via
+     * ClientMessage event or via property.
+     * the strategy used here is as follows:
+     *     if the string is short enough to fit in a event,
+     *     use ClientMessage. else, use property.
+     * however in case of reset, the string must be sent via property.
+     */
+#define MAX_BYTES_IN_A_EVENT	(20 - 4 - 1)
+
+    if (!client->resetting && arg->length <= MAX_BYTES_IN_A_EVENT) {
+	TRACE(("\tsending string via event\n"));
+	sendClientMessage8(client, arg->text, arg->length);
+    } else {
+	TRACE(("\tsending string via property\n"));
+	XChangeProperty(XtDisplay((Widget)xpw), XtWindow((Widget)xpw),
+		    client->property, arg->encoding, arg->format,
+		    PropModeAppend, (unsigned char *)arg->text, arg->length);
+	/* when resetting, XIMP_READPROP event should not be sent */
+	if (!client->resetting) {
+	    TRACE(("\tsending XIMP_READPROP message\n"));
+	    sendClientMessage32(client, XIMP_READPROP,
+				client->id, client->property, 0L, 0L);
+	}
+    }
+#undef MAX_BYTES_IN_A_EVENT
+}
+
+/*- endCallback: conversion end callback -*/
+/* ARGSUSED */
+static void
+endCallback(w, client_data, call_data)
+Widget w;
+XtPointer client_data;
+XtPointer call_data;
+{
+    ConvClient *ccp = (ConvClient *)client_data;
+    int abort = (int)call_data;
+
+    TRACE(("endCallback(reqwin=0x%lx,abort=%s)\n", ccp->reqwin, abort?"True":"False"));
+    endProc(ccp, abort);
+}
+
+/*- endProc: conversion end processing -*/
+static void
+endProc(client, abort)
+ConvClient *client;
+int abort;
+{
+    if (client->conversion == NULL) return;
+
+    preeditDone(client);
+
+    if (!abort) {
+	TRACE(("\tsending XIMP_PROCESS_END message\n"));
+	sendClientMessage32(client, XIMP_PROCESS_END,
+			    client->id, 0L, 0L, 0L);
+    }
+    detachConverter(client);
+}
+
+/*- unusedEventCallback: unused key event callback -*/
+/* ARGSUSED */
+static void
+unusedEventCallback(w, client_data, call_data)
+Widget w;
+XtPointer client_data;
+XtPointer call_data;
+{
+    ConvClient *ccp = (ConvClient *)client_data;
+    XKeyEvent *ev = (XKeyEvent *)call_data;
+
+    TRACE(("unusedEventCallback(reqwin=0x%lx)\n", ccp->reqwin));
+    sendKeyEvent(ccp, ev);
+}
+
+/*
+ *+ ClientMessage event handler
+ */
+
+/*- ximpCreateMessageProc: XIMP_CREATE message handler -*/
+static void
+ximpCreateMessageProc(xpw, ev)
+XimpProtocolWidget xpw;
+XClientMessageEvent *ev;
+{
+    Window reqwin;
+    XIMStyle inputstyle;
+    unsigned long attrmask;
+    ConvClient *client;
+    XimpInputStyle *styles = XimpStyles;
+    Dimension w, h;
+
+    TRACE(("ximpCreateMessageProc(window=0x%lx)\n", ev->data.l[1]));
+
+    reqwin = ev->data.l[1];
+
+    /* check validity of the client window ID */
+    if (!isCorrectWindowID((Widget)xpw, reqwin, &w, &h)) {
+	DPRINT(("\tspecified window doesn't exist!\n"));
+	return;
+    }
+
+    inputstyle = ev->data.l[2];
+
+    /* check specified input style */
+    while (styles->ximstyle != inputstyle) {
+	if (styles->ximstyle == 0L) {
+	    /*
+	     * client is requesting an input style which kinput2
+	     * doesn't support
+	     */
+	    DPRINT(("\tclient wants unspported input style\n"));
+	    sendCreateRefusal(xpw, reqwin);
+	    return;
+	}
+	styles++;
+    }
+
+#ifdef DEBUG
+    if (DEBUG_CONDITION) {
+	printf("\tinputstyle: Preedit");
+	if (styles->ximstyle & XIMPreeditArea) printf("Area");
+	if (styles->ximstyle & XIMPreeditCallbacks) printf("Callbacks");
+	if (styles->ximstyle & XIMPreeditPosition) printf("Position");
+	if (styles->ximstyle & XIMPreeditNothing) printf("Nothing");
+	if (styles->ximstyle & XIMPreeditNone) printf("None");
+	printf(", Status");
+	if (styles->ximstyle & XIMStatusArea) printf("Area");
+	if (styles->ximstyle & XIMStatusCallbacks) printf("Callbacks");
+	if (styles->ximstyle & XIMStatusNothing) printf("Nothing");
+	if (styles->ximstyle & XIMStatusNone) printf("None");
+	printf("\n");
+    }
+#endif
+    client = newClient(xpw, reqwin);
+    client->reqwinwidth = w;
+    client->reqwinheight = h;
+    client->event = ev;
+    client->style = styles->cstyle;
+    client->ximstyle = styles->ximstyle;
+
+    attrmask = ev->data.l[3];
+
+    getVersionProperty(client);
+
+    /* get conversion attributes */
+    getAttributes(client, attrmask);
+
+    /* watch for client destroy */
+    MyAddEventHandler(XtDisplay((Widget)xpw), reqwin,
+		      DestroyNotify, StructureNotifyMask,
+		      ClientDead, (XtPointer)client);
+
+    TRACE(("\tsending XIMP_CREATE_RETURN message\n"));
+    sendClientMessage32(client, XIMP_CREATE_RETURN, client->id, 0L, 0L, 0L);
+
+    statusStart(client);
+}
+
+/*- ximpDestroyMessageProc: XIMP_DESTROY message handler -*/
+static void
+ximpDestroyMessageProc(xpw, ev)
+XimpProtocolWidget xpw;
+XClientMessageEvent *ev;
+{
+    ConvClient *client;
+    int id;
+
+    TRACE(("ximpDestroyMessageProc()\n"));
+
+    id = ev->data.l[1];
+    if ((client = findClient(xpw, id)) == NULL) {
+	DPRINT(("\tinvalid ID\n"));
+	return;
+    }
+    client->event = ev;
+
+    MyRemoveEventHandler(XtDisplay((Widget)xpw), client->reqwin, DestroyNotify,
+			 ClientDead, (XtPointer)client);
+
+    statusDone(client);
+    if (client->conversion != NULL) {
+	CControlEndConversion(client->conversion);
+	endProc(client, False);
+    }
+    deleteClient(client);
+}
+
+/*- ximpBeginMessageProc: XIMP_BEGIN message handler -*/
+static void
+ximpBeginMessageProc(xpw, ev)
+XimpProtocolWidget xpw;
+XClientMessageEvent *ev;
+{
+    ConvClient *client;
+    int id;
+    ConversionAttributes attrs;
+    unsigned long attrmask;
+
+    TRACE(("ximpBeginMessageProc()\n"));
+
+    id = ev->data.l[1];
+    if ((client = findClient(xpw, id)) == NULL) {
+	DPRINT(("\tinvalid ID\n"));
+	return;
+    }
+    client->event = ev;
+    if (client->conversion != NULL) {
+	/* already converting */
+	DPRINT(("\tclient already in conversion mode\n"));
+	/* should we send XIMP_BadProtocol error event? */
+	return;
+    }
+
+    if (attachConverter(client) == NULL) {
+	/*
+	 * since no appropriate error code is defined,
+	 * use BadAlloc...
+	 */
+	sendErrorEvent(client, XIMP_BadAlloc);
+	/*
+	 * to let the client select key events again,
+	 * send XIMP_PROCESS_END message.
+	 */
+	sendClientMessage32(client, XIMP_PROCESS_END,
+			    client->id, 0L, 0L, 0L);
+	return;
+    }
+
+    XtAddCallback(client->conversion, XtNtextCallback,
+		  fixCallback, (XtPointer)client);
+    XtAddCallback(client->conversion, XtNendCallback,
+		  endCallback, (XtPointer)client);
+    XtAddCallback(client->conversion, XtNunusedEventCallback,
+		  unusedEventCallback, (XtPointer)client);
+    if (client->style == onthespot_style) {
+	XtAddCallback(client->conversion, XtNpreeditStartCallback,
+		      preeditStartCallback, (XtPointer)client);
+	XtAddCallback(client->conversion, XtNpreeditDoneCallback,
+		      preeditDoneCallback, (XtPointer)client);
+	XtAddCallback(client->conversion, XtNpreeditDrawCallback,
+		      preeditDrawCallback, (XtPointer)client);
+	XtAddCallback(client->conversion, XtNpreeditCaretCallback,
+		      preeditCaretCallback, (XtPointer)client);
+	XtAddCallback(client->conversion, XtNstatusStartCallback,
+		      statusStartCallback, (XtPointer)client);
+	XtAddCallback(client->conversion, XtNstatusDoneCallback,
+		      statusDoneCallback, (XtPointer)client);
+	XtAddCallback(client->conversion, XtNstatusDrawCallback,
+		      statusDrawCallback, (XtPointer)client);
+    }
+
+    fillInDefaultAttributes(client);
+    computeAreaForStartup(client);
+    attrmask = makeConvAttributes(client, &attrs);
+
+    /* start conversion */
+    XtVaSetValues(client->conversion, XtNeventSelectMethod, client->esm, NULL);
+    CControlStartConversion(client->conversion, client->reqwin,
+			    attrmask, &attrs);
+
+    TRACE(("\tsending XIMP_PROCESS_BEGIN message\n"));
+    sendClientMessage32(client, XIMP_PROCESS_BEGIN, client->id, 0L, 0L, 0L);
+
+    preeditStart(client);
+}
+
+/*- ximpEndMessageProc: XIMP_END message handler -*/
+static void
+ximpEndMessageProc(xpw, ev)
+XimpProtocolWidget xpw;
+XClientMessageEvent *ev;
+{
+    ConvClient *client;
+    int id;
+
+    TRACE(("ximpEndMessageProc()\n"));
+
+    id = ev->data.l[1];
+    if ((client = findClient(xpw, id)) == NULL) {
+	DPRINT(("\tinvalid ID\n"));
+	return;
+    }
+    client->event = ev;
+    if (client->conversion == NULL) {
+	/* not converting now */
+	DPRINT(("\tclient isn't in conversion mode\n"));
+	/* should we send XIMP_BadProtocol error event? */
+	return;
+    }
+
+    CControlEndConversion(client->conversion);
+    endProc(client, False);
+}
+
+/*- ximpSetFocusMessageProc: XIMP_SETFOCUS message handler -*/
+static void
+ximpSetFocusMessageProc(xpw, ev)
+XimpProtocolWidget xpw;
+XClientMessageEvent *ev;
+{
+    ConvClient *client;
+    int id;
+
+    TRACE(("ximpSetFocusMessageProc()\n"));
+
+    id = ev->data.l[1];
+    if ((client = findClient(xpw, id)) == NULL) {
+	DPRINT(("\tinvalid ID\n"));
+	return;
+    }
+    client->event = ev;
+    /* what to do? */
+
+    statusStart(client);
+    if (client->conversion != NULL) {
+	CControlChangeFocus(client->conversion, 1);
+    }
+}
+
+/*- ximpUnsetFocusMessageProc: XIMP_UNSETFOCUS message handler -*/
+static void
+ximpUnsetFocusMessageProc(xpw, ev)
+XimpProtocolWidget xpw;
+XClientMessageEvent *ev;
+{
+    ConvClient *client;
+    int id;
+
+    TRACE(("ximpUnsetFocusMessageProc()\n"));
+
+    id = ev->data.l[1];
+    if ((client = findClient(xpw, id)) == NULL) {
+	DPRINT(("\tinvalid ID\n"));
+	return;
+    }
+    client->event = ev;
+    /* what to do? */
+
+    if (client->conversion != NULL) {
+	CControlChangeFocus(client->conversion, 0);
+    }
+    statusDone(client);
+}
+
+/*- ximpMoveMessageProc: XIMP_MOVE message handler -*/
+static void
+ximpMoveMessageProc(xpw, ev)
+XimpProtocolWidget xpw;
+XClientMessageEvent *ev;
+{
+    ConvClient *client;
+    int id;
+    ConversionAttributes attrs;
+
+    TRACE(("ximpMoveMessageProc()\n"));
+
+    id = ev->data.l[1];
+    if ((client = findClient(xpw, id)) == NULL) {
+	DPRINT(("\tinvalid ID\n"));
+	return;
+    }
+    client->event = ev;
+    client->xpattrs.spotx = ev->data.l[2];
+    client->xpattrs.spoty = ev->data.l[3];
+    client->xattrmask |= XIMP_PRE_SPOTL_MASK;
+    if (client->conversion != NULL) {
+	attrs.spotx = client->xpattrs.spotx;
+	attrs.spoty = client->xpattrs.spoty;
+	CControlChangeAttributes(client->conversion, CASpotLocation, &attrs);
+    }
+}
+
+/*- ximpResetMessageProc: XIMP_RESET message handler -*/
+static void
+ximpResetMessageProc(xpw, ev)
+XimpProtocolWidget xpw;
+XClientMessageEvent *ev;
+{
+    ConvClient *client;
+    int id;
+    Widget inputobj;
+
+    TRACE(("ximpResetMessageProc()\n"));
+
+    id = ev->data.l[1];
+    if ((client = findClient(xpw, id)) == NULL) {
+	DPRINT(("\tinvalid ID\n"));
+	return;
+    }
+    client->event = ev;
+    client->resetting = True;
+
+    if (client->conversion == NULL) {
+	XChangeProperty(XtDisplay((Widget)xpw), XtWindow((Widget)xpw),
+		    client->property, xpw->ximp.ctextAtom, 8,
+		    PropModeAppend, (unsigned char *)"", 0);
+    } else {
+	/*
+	 * get input object by asking conversion widget of XtNinputObject
+	 * resource. however, it is not recommended since protocol widget
+	 * should interact with input object only through conversion
+	 * widget.
+	 */
+	CCTextCallbackArg arg;
+
+	XtVaGetValues(client->conversion, XtNinputObject, &inputobj, NULL);
+	arg.encoding = xpw->ximp.ctextAtom;
+	if (ICGetConvertedString(inputobj, &arg.encoding, &arg.format,
+				 &arg.length, &arg.text) >= 0) {
+	    fixProc(client, &arg);
+	} else {
+	    /* there's no string */
+	    XChangeProperty(XtDisplay((Widget)xpw), XtWindow((Widget)xpw),
+			    client->property, xpw->ximp.ctextAtom, 8,
+			    PropModeAppend, (unsigned char *)"", 0);
+	}
+	ICClearConversion(inputobj);
+    }
+
+    TRACE(("\tsending XIMP_RESET_RETURN message\n"));
+    sendClientMessage32(client, XIMP_RESET_RETURN, client->id,
+			client->property, 0L, 0L);
+}
+
+/*- ximpSetValueMessageProc: XIMP_SETVALUE message handler -*/
+static void
+ximpSetValueMessageProc(xpw, ev)
+XimpProtocolWidget xpw;
+XClientMessageEvent *ev;
+{
+    ConvClient *client;
+    unsigned long mask;
+    ConversionAttributes attrs;
+    unsigned long attrmask;
+    int id;
+
+    TRACE(("ximpSetValueMessageProc()\n"));
+
+    id = ev->data.l[1];
+    if ((client = findClient(xpw, id)) == NULL) {
+	DPRINT(("\tinvalid ID\n"));
+	return;
+    }
+    mask = ev->data.l[2];
+    client->event = ev;
+    getAttributes(client, mask); 
+    if (client->conversion != NULL) {
+	attrmask = makeConvAttributes(client, &attrs);
+	CControlChangeAttributes(client->conversion, attrmask, &attrs);
+    }
+}
+
+/*- ximpChangeMessageProc: XIMP_CHANGE message handler -*/
+static void
+ximpChangeMessageProc(xpw, ev)
+XimpProtocolWidget xpw;
+XClientMessageEvent *ev;
+{
+    ConvClient *client;
+    Atom atom;
+    unsigned long mask;
+    ConversionAttributes attrs;
+    unsigned long attrmask;
+    int id;
+
+    TRACE(("ximpChangeMessageProc()\n"));
+
+    id = ev->data.l[1];
+    if ((client = findClient(xpw, id)) == NULL) {
+	DPRINT(("\tinvalid ID\n"));
+	return;
+    }
+    atom = (Atom)ev->data.l[2];
+
+    if (atom == xpw->ximp.ximpFocusAtom) {
+	mask = XIMP_FOCUS_WIN_MASK;
+    } else if (atom == xpw->ximp.ximpPreeditAtom) {
+	mask = PREEDIT_MASK;
+    } else if (atom == xpw->ximp.ximpStatusAtom) {
+	mask = STATUS_MASK;
+    } else if (atom == xpw->ximp.ximpPreeditFontAtom) {
+	mask = XIMP_PRE_FONT_MASK;
+    } else if (atom == xpw->ximp.ximpStatusFontAtom) {
+	mask = XIMP_STS_FONT_MASK;
+    } else {
+	/* invalid property name */
+	sendErrorEvent(client, XIMP_BadProperty);
+	return;
+    }
+
+    client->event = ev;
+    getAttributes(client, mask); 
+    if (client->conversion != NULL) {
+	attrmask = makeConvAttributes(client, &attrs);
+	CControlChangeAttributes(client->conversion, attrmask, &attrs);
+    }
+}
+
+/*- ximpGetValueMessageProc: XIMP_GETVALUE message handler -*/
+static void
+ximpGetValueMessageProc(xpw, ev)
+XimpProtocolWidget xpw;
+XClientMessageEvent *ev;
+{
+    ConvClient *client;
+    unsigned long mask;
+    int id;
+
+    TRACE(("ximpGetValueMessageProc()\n"));
+
+    id = ev->data.l[1];
+    if ((client = findClient(xpw, id)) == NULL) {
+	DPRINT(("\tinvalid ID\n"));
+	return;
+    }
+    mask = ev->data.l[2];
+    client->event = ev;
+
+    fillInDefaultAttributes(client);
+    computeAreaForQuery(client);
+    setAttributes(client, mask);
+
+    TRACE(("\tsending XIMP_GETVALUE_RETURN message\n"));
+    sendClientMessage32(client, XIMP_GETVALUE_RETURN, client->id, 0L, 0L, 0L);
+}
+
+/*- ximpKeyPressMessageProc: XIMP_KEYPRESS message handler -*/
+static void
+ximpKeyPressMessageProc(xpw, ev)
+XimpProtocolWidget xpw;
+XClientMessageEvent *ev;
+{
+    ConvClient *client;
+    int id;
+    XKeyEvent keyevent;
+
+    TRACE(("ximpKeyPressMessageProc()\n"));
+
+    id = ev->data.l[1];
+    if ((client = findClient(xpw, id)) == NULL) {
+	DPRINT(("\tinvalid ID\n"));
+	return;
+    }
+    client->event = ev;
+
+    if (client->conversion == NULL) return;
+
+    /* make a fake keypress event */
+    keyevent.type = KeyPress;
+    keyevent.serial = ev->serial;
+    keyevent.send_event = True;
+    keyevent.display = ev->display;
+    keyevent.window = client->focuswin;
+    keyevent.root = DefaultRootWindow(ev->display);
+			/* hope conversion object won't check this field */
+    keyevent.subwindow = None;
+			/* hope conversion object won't check this field */
+    keyevent.time = 0;	/* hope conversion object won't check this field */
+    keyevent.x = 0;
+    keyevent.y = 0;
+    keyevent.x_root = 0;
+    keyevent.y_root = 0;
+    keyevent.state = ev->data.l[3];
+    keyevent.keycode = ev->data.l[2];
+    keyevent.same_screen = True;
+
+    /* call action routine */
+    XtCallActionProc(client->conversion, "to-inputobj", (XEvent *)&keyevent,
+		     (String *)NULL, (Cardinal)0);
+}
+
+/*- ximpExtensionMessageProc: XIMP_Extension message handler -*/
+static void
+ximpExtensionMessageProc(xpw, ev)
+XimpProtocolWidget xpw;
+XClientMessageEvent *ev;
+{
+    ConvClient *client;
+    Atom extatom;
+    int id;
+
+    TRACE(("ximpExtensionMessageProc()\n"));
+
+    id = ev->data.l[1];
+    if ((client = findClient(xpw, id)) == NULL) {
+	DPRINT(("\tinvalid ID\n"));
+	return;
+    }
+    extatom = ev->data.l[2];	/* extension name */
+    client->event = ev;
+
+    if (extatom == xpw->ximp.ximpExtXimpBackFrontAtom) {
+	TRACE(("\t_XIMP_EXT_XIMP_BACK_FRONT extension -- "));
+	if (client->conversion != NULL) {
+	    /* invalid */
+	    DPRINT(("invalid (now in conversion mode)\n"));
+	    return;
+	}
+	if (ev->data.l[3] != 0) {
+	    /* backend method */
+	    TRACE(("backend\n"));
+	    client->esm = ESMethodNone;
+	} else {
+	    TRACE(("frontend\n"));
+	    client->esm = ESMethodSelectFocus;
+	}
+    } else {
+	DPRINT(("\tunknown extension atom -- %ld", extatom));
+	sendErrorEvent(client, XIMP_BadAtom);
+    }
+}
+
+/*- XimpMessageProc: _XIMP_PROTOCOL message event handler -*/
+/* ARGSUSED */
+static void
+XimpMessageProc(w, event, args, num_args)
+Widget w;
+XEvent *event;
+String *args;
+Cardinal *num_args;
+{
+    XimpProtocolWidget xpw = (XimpProtocolWidget)w;
+    XClientMessageEvent *ev = &event->xclient;
+    ConvClient *client;
+
+    TRACE(("XimpMessageProc()\n"));
+    /* is it a correct event? */
+    if (!isCorrectClientEvent(xpw, event)) {
+	/*ignore */
+	DPRINT(("got invalid clientmessage event.\n"));
+	return;
+    }
+    switch((int)ev->data.l[0]) {
+    case XIMP_CREATE:	  ximpCreateMessageProc(xpw, ev); break;
+    case XIMP_DESTROY:	  ximpDestroyMessageProc(xpw, ev); break;
+    case XIMP_BEGIN:	  ximpBeginMessageProc(xpw, ev); break;
+    case XIMP_END:	  ximpEndMessageProc(xpw, ev); break;
+    case XIMP_SETFOCUS:	  ximpSetFocusMessageProc(xpw, ev); break;
+    case XIMP_UNSETFOCUS: ximpUnsetFocusMessageProc(xpw, ev); break;
+    case XIMP_KEYPRESS:	  ximpKeyPressMessageProc(xpw, ev); break;
+    case XIMP_SETVALUE:	  ximpSetValueMessageProc(xpw, ev); break;
+    case XIMP_CHANGE:	  ximpChangeMessageProc(xpw, ev); break;
+    case XIMP_GETVALUE:	  ximpGetValueMessageProc(xpw, ev); break;
+    case XIMP_MOVE:	  ximpMoveMessageProc(xpw, ev); break;
+    case XIMP_RESET:	  ximpResetMessageProc(xpw, ev); break;
+    case XIMP_EXTENSION:  ximpExtensionMessageProc(xpw, ev); break;
+    case XIMP_PREEDITSTART_RETURN: break;
+    case XIMP_PREEDITCARET_RETURN: break;
+    default:
+	DPRINT(("\tunknown command code (%ld) ignored\n", ev->data.l[0]));
+	/* assume ev->data.l[1] contains ICID */
+	if ((client = findClient(xpw, (int)ev->data.l[1])) != NULL) {
+	    client->event = ev;
+	    sendErrorEvent(client, XIMP_BadProtocol);
+	}
+	break;
+    }
+}
+
+/*
+ *+ other event handler
+ */
+
+/*- SelectionRequestProc: SelectionRequest event handler -*/
+/*ARGSUSED*/
+static void
+SelectionRequestProc(w, event, args, num_args)
+Widget w;
+XEvent *event;
+String *args;			/* not used */
+Cardinal *num_args;		/* not used */
+{
+    XSelectionRequestEvent *ev = &(event->xselectionrequest);
+    XEvent repl;
+    String params[1];
+    Cardinal num_params;
+
+    repl.xselection.type = SelectionNotify;
+    repl.xselection.requestor = ev->requestor;
+    repl.xselection.selection = ev->selection;
+    repl.xselection.target = ev->target;
+    repl.xselection.property = None;
+    repl.xselection.time = ev->time;
+
+    params[0] = XtClass(w)->core_class.class_name;
+    num_params = 1;
+    XtAppWarningMsg(XtWidgetToApplicationContext(w),
+		    "selectionError", "SelectionRequest", "WidgetError",
+		    "%s: SelectionRequest event received",
+		    params, &num_params);
+
+    XSendEvent(ev->display, ev->requestor, False, NoEventMask, &repl);
+}
+
+/*- SelectionClearProc: SelectionClear event handler -*/
+/* ARGSUSED */
+static void
+SelectionClearProc(w, event, args, num_args)
+Widget w;
+XEvent *event;
+String *args;
+Cardinal *num_args;
+{
+    XimpProtocolWidget xpw = (XimpProtocolWidget)w;
+    XSelectionClearEvent *ev = (XSelectionClearEvent *)event;
+    ConvClient	*ccp;
+    String params[1];
+    Cardinal num_params;
+
+    /* Selection owner changed */
+
+    if (ev->selection == xpw->ximp.selAtom1) {
+	/* someone has become a new default server */
+	xpw->ximp.selAtom1 = None;
+	return;
+    } else if (ev->selection != xpw->ximp.selAtom2) {
+	TRACE(("XimpProtocol:SelectionClearProc() SelectionClear event for unknown selection received\n"));
+	return;
+    }
+
+    /*
+     * send ConversionEnd event to the clients before exit
+     */
+    for (ccp = xpw->ximp.clients; ccp; ccp = ccp->next) {
+	if (ccp->reqwin != None) {
+	    statusDone(ccp);
+	    endProc(ccp, False);
+	}
+    }
+
+    params[0] = XtClass(w)->core_class.class_name;
+    num_params = 1;
+    XtAppWarningMsg(XtWidgetToApplicationContext(w),
+		    "selectionError", "SelectionClear", "WidgetError",
+		    "%s: SelectionClear event received",
+		    params, &num_params);
+
+    XtDestroyWidget(w);
+}
+
+/*- ClientDead: DestroyNotify event handler -*/
+static void
+ClientDead(ev, data)
+XEvent *ev;
+XtPointer data;
+{
+    ConvClient	*ccp = (ConvClient *)data;
+
+    TRACE(("ClientDead(window=0x%lx)\n", ev->xdestroywindow.window));
+    if (ev->type != DestroyNotify ||
+	ev->xdestroywindow.window != ccp->reqwin) return;
+
+    MyRemoveAllEventHandler(ev->xany.display, ccp->reqwin);
+    deleteClient(ccp);
+}
+
+/*
+ *+ on-the-spot callback procedures
+ */
+
+/*- preeditStartCallback: preedit start -*/
+/* ARGSUSED */
+static void
+preeditStartCallback(w, client_data, call_data)
+Widget w;
+XtPointer client_data;
+XtPointer call_data;
+{
+    ConvClient *ccp = (ConvClient *)client_data;
+    TRACE(("preeditStartCallback(reqwin=0x%lx)\n", ccp->reqwin));
+    preeditStart(ccp);
+}
+
+/*- preeditDoneCallback: preedit done -*/
+/* ARGSUSED */
+static void
+preeditDoneCallback(w, client_data, call_data)
+Widget w;
+XtPointer client_data;
+XtPointer call_data;
+{
+    ConvClient *ccp = (ConvClient *)client_data;
+    TRACE(("preeditDoneCallback(reqwin=0x%lx)\n", ccp->reqwin));
+    preeditDone(ccp);
+}
+
+/*- preeditDrawCallback: preedit draw -*/
+/* ARGSUSED */
+static void
+preeditDrawCallback(w, client_data, call_data)
+Widget w;
+XtPointer client_data;
+XtPointer call_data;
+{
+    ConvClient *ccp = (ConvClient *)client_data;
+    OCCPreeditDrawArg *arg = (OCCPreeditDrawArg *)call_data;
+    TRACE(("preeditDrawCallback(reqwin=0x%lx, length=%d)\n", ccp->reqwin, arg->text_length));
+    preeditDraw(ccp, arg);
+}
+
+/*- preeditCaretCallback: preedit caret -*/
+/* ARGSUSED */
+static void
+preeditCaretCallback(w, client_data, call_data)
+Widget w;
+XtPointer client_data;
+XtPointer call_data;
+{
+    ConvClient *ccp = (ConvClient *)client_data;
+    int caret = (int)call_data;
+    TRACE(("preeditCaretCallback(reqwin=0x%lx, caret=%d)\n",ccp->reqwin,caret));
+    preeditCaret(ccp, caret);
+}
+
+/*- statusStartCallback: status start -*/
+/* ARGSUSED */
+static void
+statusStartCallback(w, client_data, call_data)
+Widget w;
+XtPointer client_data;
+XtPointer call_data;
+{
+    ConvClient *ccp = (ConvClient *)client_data;
+    TRACE(("statusStartCallback(reqwin=0x%lx)\n", ccp->reqwin));
+    statusStart(ccp);
+}
+
+/*- statusDoneCallback: status done -*/
+/* ARGSUSED */
+static void
+statusDoneCallback(w, client_data, call_data)
+Widget w;
+XtPointer client_data;
+XtPointer call_data;
+{
+    ConvClient *ccp = (ConvClient *)client_data;
+    TRACE(("statusDoneCallback(reqwin=0x%lx)\n", ccp->reqwin));
+    statusDone(ccp);
+}
+
+/*- statusDrawCallback: status draw -*/
+/* ARGSUSED */
+static void
+statusDrawCallback(w, client_data, call_data)
+Widget w;
+XtPointer client_data;
+XtPointer call_data;
+{
+    ConvClient *ccp = (ConvClient *)client_data;
+    OCCPreeditDrawArg *arg = (OCCPreeditDrawArg *)call_data;
+    TRACE(("statusDrawCallback(reqwin=0x%lx, length=%d)\n", ccp->reqwin, arg->text_length));
+    statusDraw(ccp, arg);
+}
+
+/*- preeditStart: do preedit start -*/
+static void
+preeditStart(client)
+ConvClient *client;
+{
+    TRACE(("preeditStart(reqwin=0x%lx)\n", client->reqwin));
+    if (!(client->ximstyle & XIMPreeditCallbacks))
+	return;
+    if (!client->in_preedit) {
+	TRACE(("\tsending XIMP_PREEDITSTART message\n"));
+	sendClientMessage32(client, XIMP_PREEDITSTART, client->id, 0L, 0L, 0L);
+	client->in_preedit = True;
+    }
+}
+
+/*- preeditDone: do preedit done -*/
+static void
+preeditDone(client)
+ConvClient *client;
+{
+    TRACE(("preeditDone(reqwin=0x%lx)\n", client->reqwin));
+    if (!(client->ximstyle & XIMPreeditCallbacks))
+	return;
+    if (client->in_preedit) {
+	TRACE(("\tsending XIMP_PREEDITDONE message\n"));
+	sendClientMessage32(client, XIMP_PREEDITDONE, client->id, 0L, 0L, 0L);
+	client->in_preedit = False;
+    }
+}
+
+/*- preeditDraw: do actual preedit draw -*/
+static void
+preeditDraw(client, data)
+ConvClient *client;
+OCCPreeditDrawArg *data;
+{
+    XimpProtocolWidget xpw = (XimpProtocolWidget)client->protocolwidget;
+    Display *xd = XtDisplay((Widget)xpw);
+    Window xw = XtWindow((Widget)xpw);
+    unsigned long *feedbacks;
+    Boolean allsamefb;
+    int i;
+
+    if (!(client->ximstyle & XIMPreeditCallbacks))
+	return;
+
+    preeditStart(client);
+
+    /* check encoding and format */
+    if (data->encoding != xpw->ximp.ctextAtom || data->format != 8) {
+	/*
+	 * since every conversion object must support COMPOUND_TEXT,
+	 * it is a serious error.
+	 */
+	String params[2];
+	Cardinal num_params;
+
+	params[0] = XtClass((Widget)xpw)->core_class.class_name;
+	params[1] = xpw->ximp.inputObjClass->core_class.class_name;
+	num_params = 2;
+
+	XtAppErrorMsg(XtWidgetToApplicationContext(client->protocolwidget),
+		      "encodingError", "preeditString", "WidgetError",
+		      "%s: encoding of the preedit string is not COMPOUND_STRING. check inputObject %s",
+		      params, &num_params);
+    }
+
+    feedbacks = data->attrs;
+    allsamefb = True;
+    if (data->attrs_length > 0) {
+	unsigned long check = data->attrs[0];
+	for (i = 0; i < data->attrs_length; i++) {
+	    if (feedbacks[i] != check) allsamefb = False;
+	}
+    }
+
+#define MAX_BYTES_IN_A_EVENT	(20 - 4 - 1)
+    if (data->text_length <= MAX_BYTES_IN_A_EVENT) {
+	if (!allsamefb) {
+	    TRACE(("\tsending feedbacks via property\n"));
+	    XChangeProperty(xd, xw, client->preeditfeedback,
+			    xpw->ximp.ximpFeedbacksAtom, 32, PropModeAppend,
+			    (unsigned char *)feedbacks, data->attrs_length);
+	}
+	if (!client->resetting) {
+	    unsigned long fb = (data->attrs_length > 0 ? feedbacks[0] : 0);
+	    int status = 0;
+
+	    if (data->text_length == 0)
+		status |= 0x1; /* no_text */
+	    if (data->attrs_length == 0)
+		status |= 0x2; /* no_feedback */
+	    if (!allsamefb)
+		status |= 0x4; /* feedbacks_via_property */
+
+	    TRACE(("\tsending XIMP_PREEDITDRAW_CM message\n"));
+	    sendClientMessage32(
+		client, XIMP_PREEDITDRAW_CM, client->id,
+		(status << 16) | (data->caret & 0xffff),
+		(data->chg_first << 16) | (data->chg_length & 0xffff),
+		(allsamefb ? fb : client->preeditfeedback));
+
+	    if (data->text_length > 0) {
+		TRACE(("\tsending string via event\n"));
+		sendClientMessage8(client, data->text, data->text_length);
+	    }
+	}
+    }
+    else {
+	long atoms[3];
+	atoms[0] = data->caret;
+	atoms[1] = data->chg_first;
+	atoms[2] = data->chg_length;
+	TRACE(("\tsending preedit data via property\n"));
+	XChangeProperty(xd, xw, client->preeditdata,
+			xpw->ximp.ximpPreeditDrawDataAtom, 32, PropModeAppend,
+			(unsigned char *)atoms, 3);
+	TRACE(("\tsending string via property\n"));
+	XChangeProperty(xd, xw, client->preedittext,
+			data->encoding, data->format, PropModeAppend,
+			(unsigned char *)data->text, data->text_length);
+	TRACE(("\tsending feedbacks via property\n"));
+	XChangeProperty(xd, xw, client->preeditfeedback,
+			xpw->ximp.ximpFeedbacksAtom, 32, PropModeAppend,
+			(unsigned char *)feedbacks, data->attrs_length);
+	if (!client->resetting) {
+	    TRACE(("\tsending XIMP_PREEDITDRAW message\n"));
+	    sendClientMessage32(client, XIMP_PREEDITDRAW, client->id,
+				client->preeditdata, client->preedittext,
+				client->preeditfeedback);
+	}
+    }
+#undef MAX_BYTES_IN_A_EVENT
+}
+
+/*- preeditCaret: do actual preedit caret -*/
+static void
+preeditCaret(client, caret)
+ConvClient *client;
+int caret;
+{
+    XimpProtocolWidget xpw = (XimpProtocolWidget)client->protocolwidget;
+
+    TRACE(("\tsending XIMP_PREEDITCARET message\n"));
+    if (!(client->ximstyle & XIMPreeditCallbacks))
+	return;
+    sendClientMessage32(client, XIMP_PREEDITCARET, client->id,
+			caret, (long)XIMAbsolutePosition, (long)XIMPrimary);
+}
+
+/*- statusStart: do status start -*/
+static void
+statusStart(client)
+ConvClient *client;
+{
+    TRACE(("statusStart(reqwin=0x%lx)\n", client->reqwin));
+    if (!(client->ximstyle & XIMStatusCallbacks))
+	return;
+    if (!client->in_status) {
+	TRACE(("\tsending XIMP_STATUSSTART message\n"));
+	sendClientMessage32(client, XIMP_STATUSSTART, client->id, 0L, 0L, 0L);
+	client->in_status = True;
+    }
+}
+
+/*- statusDone: do status done -*/
+static void
+statusDone(client)
+ConvClient *client;
+{
+    TRACE(("statusDone(reqwin=0x%lx)\n", client->reqwin));
+    if (!(client->ximstyle & XIMStatusCallbacks))
+	return;
+    if (client->in_status) {
+	TRACE(("\tsending XIMP_STATUSDONE message\n"));
+	sendClientMessage32(client, XIMP_STATUSDONE, client->id, 0L, 0L, 0L);
+	client->in_status = False;
+    }
+}
+
+/*- statusDraw: do actual status draw -*/
+static void
+statusDraw(client, data)
+ConvClient *client;
+OCCPreeditDrawArg *data;
+{
+    XimpProtocolWidget xpw = (XimpProtocolWidget)client->protocolwidget;
+    Display *xd = XtDisplay((Widget)xpw);
+    Window xw = XtWindow((Widget)xpw);
+    int type = 0; /* text type */
+
+    if (!(client->ximstyle & XIMStatusCallbacks))
+	return;
+
+    statusStart(client);
+
+    /* check encoding and format */
+    if (data->encoding != xpw->ximp.ctextAtom || data->format != 8) {
+	/*
+	 * since every conversion object must support COMPOUND_TEXT,
+	 * it is a serious error.
+	 */
+	String params[2];
+	Cardinal num_params;
+
+	params[0] = XtClass((Widget)xpw)->core_class.class_name;
+	params[1] = xpw->ximp.inputObjClass->core_class.class_name;
+	num_params = 2;
+
+	XtAppErrorMsg(XtWidgetToApplicationContext(client->protocolwidget),
+		      "encodingError", "statusString", "WidgetError",
+		      "%s: encoding of the status string is not COMPOUND_STRING. check inputObject %s",
+		      params, &num_params);
+    }
+
+#define MAX_BYTES_IN_A_EVENT	(20 - 4 - 1)
+    if (data->text_length <= MAX_BYTES_IN_A_EVENT) {
+	int feedback = 0;
+	if (!client->resetting) {
+	    TRACE(("\tsending XIMP_STATUSDRAW_CM message\n"));
+	    sendClientMessage32(client, XIMP_STATUSDRAW_CM, client->id,
+				type, feedback, 0L);
+	    TRACE(("\tsending string via event\n"));
+	    sendClientMessage8(client, data->text, data->text_length);
+	}
+    }
+    else {
+	int i;
+	int *feedbacks = (int *)XtMalloc(data->attrs_length * sizeof(int));
+	for (i = 0; i < data->attrs_length; i++) feedbacks[i] = 0;
+	TRACE(("\tsending string via property\n"));
+	XChangeProperty(xd, xw, client->statustext,
+			data->encoding, data->format, PropModeAppend,
+			(unsigned char *)data->text, data->text_length);
+	TRACE(("\tsending feedbacks via property\n"));
+	XChangeProperty(xd, xw, client->statusfeedback,
+			xpw->ximp.ximpFeedbacksAtom, 32, PropModeAppend,
+			(unsigned char *)feedbacks, data->attrs_length);
+	if (!client->resetting) {
+	    TRACE(("\tsending XIMP_STATUSDRAW message\n"));
+	    sendClientMessage32(client, XIMP_STATUSDRAW, client->id,
+				type, client->statustext,
+				      client->statusfeedback);
+	}
+	/* feedbacks $B$r(B free $B$7$F$*$/(B */
+	XtFree((char *)feedbacks);
+    }
+#undef MAX_BYTES_IN_A_EVENT
+}
+
+
+#endif /* defined(XlibSpecificationRelease) && XlibSpecificationRelease >= 5 */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/Xsj3clib/Imakefile	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,43 @@
+#include "../../Kinput2.conf"
+
+             SRCS = buffer.c \
+                    candidate.c \
+                    code.c \
+                    connect.c \
+                    conv.c \
+                    dict.c \
+                    func.c \
+                    libif.c \
+                    mode.c \
+                    segment.c \
+                    sj3ctype.c \
+                    sjrc.c \
+                    symbol.c \
+                    table.c \
+                    util.c
+
+             OBJS = buffer.o \
+                    candidate.o \
+                    code.o \
+                    connect.o \
+                    conv.o \
+                    dict.o \
+                    func.o \
+                    libif.o \
+                    mode.o \
+                    segment.o \
+                    sj3ctype.o \
+                    sjrc.o \
+                    symbol.o \
+                    table.o \
+                    util.o
+
+          SJ3INCS = -I$(SJ3SRC)/sj3lib -I$(SJ3SRC)
+   LOCAL_INCLUDES = -I../../include
+         INCLUDES = $(LOCAL_INCLUDES) $(SJ3INCS)
+
+          DEFINES = -DSJ3DEFPATH=\"$(SJ3DEF_DIR)/\" -DTHROUGH_CONT
+
+NormalLibraryObjectRule()
+NormalLibraryTarget(Xsj3clib,$(OBJS))
+DependTarget()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/Xsj3clib/buffer.c	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,904 @@
+#ifndef lint
+static char *rcsid = "$Header: /net/sras32/mnt3/home/mgr/ishisone/lib/cvsroot/kinput2/src/lib/Xsj3clib/buffer.c,v 2.7 1998/07/21 09:21:15 ishisone Exp $";
+#endif
+/*
+ * Copyright 1991 Sony Corporation
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Sony not be used in advertising or
+ * publicity pertaining to distribution of the software without specific,
+ * written prior permission.  Sony makes no representations about the
+ * suitability of this software for any purpose.  It is provided "as is"
+ * without express or implied warranty.
+ *
+ * SONY DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL SONY
+ * BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
+ * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN 
+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+/*
+ * Author: Naoshi Suzuki, SONY Corporation.  (nao@sm.sony.co.jp)
+ */
+
+#include <X11/keysym.h>
+#include <stdio.h>
+#include <ctype.h>
+#include "common.h"
+#include "util.h"
+#include "func.h"
+#include "segment.h"
+#include "table.h"
+
+Xsj3cBuf                    Xsj3cCreateBuffer();
+void                        Xsj3cFreeBuffer();
+void                        Xsj3cClearBuffer();
+void                        Xsj3cFixBuffer();
+void                        Xsj3cFlushBuffer();
+
+int                         _Xsj3cSetKeyTable();
+extern int                  _Xsj3cSetGuide();
+
+static void                 _Xsj3cFreeModeStr();
+static Xsj3cKeyTable       *_Xsj3cAllocKeyTable();
+static Xsj3cKeyTable       *_Xsj3cGetFreeKeyTable();
+static void                 _Xsj3cAddFreeKeyTable();
+static void                 _Xsj3cFreeAllKeyTable();
+static int                  _Xsj3cSetKeySym();
+static long                 _Xsj3cGetModMask();
+
+static Xsj3cKeyTable       *keynowtp = NULL,   *keymaxtp = NULL;
+static Xsj3cKeyTable       *firstkeytp = NULL, *freekeytp = NULL;
+static int                  refcount = 0;
+
+static struct _sjrcdeftable {
+    char    *key[2];
+    char    *value[10];
+} def_guide_table[] = {
+    "guide",    "hiragana",  /* $B$+$J(B  */ "\202\251\202\310",
+    "", "", "", "", "", "", "", "", "",
+    "guide",    "zkatakana", /* $BA4%+%J(B*/ "\221\123\203\112\203\151",
+    "", "", "", "", "", "", "", "", "",
+    "guide",    "hkatakana", /* $BH>%+%J(B*/ "\224\274\203\112\203\151",
+    "", "", "", "", "", "", "", "", "",
+    "guide",    "halpha",/* ABC       */ "\101\102\103",
+    "", "", "", "", "", "", "", "", "",
+    "guide",    "zalpha",/* $B#A#B#C(B    */ "\202\140\202\141\202\142",
+    "", "", "", "", "", "", "", "", "",
+    "guide",    "sjis",  /* Shift-JIS */ "\123\150\151\146\164\55\112\111\123",
+    "", "", "", "", "", "", "", "", "",
+    "guide",    "euc",   /* $B#E#U#C(B    */ "\202\144\202\164\202\142",
+    "", "", "", "", "", "", "", "", "",
+    "guide",    "jis",   /* $B#J#I#S(B    */ "\202\151\202\150\202\162",
+    "", "", "", "", "", "", "", "", "",
+    "guide",    "kuten", /* $B6hE@(B      */ "\213\346\223\137",
+    "", "", "", "", "", "", "", "", "",
+    "guide",    "toroku",   /* $BEPO?(B   */ "\223\157\230\136",
+    "", "", "", "", "", "", "", "", "",
+    "guide",    "syoukyo",  /* $B>C5n(B   */ "\217\301\213\216",
+    "", "", "", "", "", "", "", "", "",
+    "guide",    "kanji", /* $B4A;z(B      */ "\212\277\216\232",
+    "", "", "", "", "", "", "", "", "",
+    "guide",    "edit",  /* $BJT=8(B      */ "\225\322\217\127",
+    "", "", "", "", "", "", "", "", "",
+    "guide",    "candidate",/* $B0lMw(B      */ "\210\352\227\227",
+    "", "", "", "", "", "", "", "", "",
+    "guide",    "symbol",/* $B5-9f(B      */ "\213\114\215\206",
+    "", "", "", "", "", "", "", "", "",
+    "guide",    "hinsi", /* $BIJ;l(B      */ "\225\151\216\214",
+    "", "", "", "", "", "", "", "", "",
+    "guide",    "quote", /* $B0zMQ(B      */ "\210\370\227\160",
+    "", "", "", "", "", "", "", "", "",
+};
+
+static Xsj3cKeyTable defkeys[] = {
+    "henkan",   XK_Select,  FlushModeMask,  _Xsj3cConvert,      NONE,NULL,NULL,
+    "convert",  XK_Select,  FlushModeMask,  _Xsj3cConvert,      NONE,NULL,NULL,
+    "muhen",    XK_Cancel,  ConvedModeMask|ShiftMask,
+                                            _Xsj3cUnConvert,    NONE,NULL,NULL,
+    "unconvert",XK_Cancel,  ConvedModeMask|ShiftMask,
+                                            _Xsj3cUnConvert,    NONE,NULL,NULL,
+    "fix",      XK_Execute, FlushModeMask|DictModeMask,    
+                                            _Xsj3cFix,          NONE,NULL,NULL,
+    "kettei",   XK_KP_Enter,FlushModeMask,  _Xsj3cFix,          NONE,NULL,NULL,
+    "flush",    XK_Escape,  FlushModeMask,  _Xsj3cFix,          NONE,NULL,NULL,
+    "return",   XK_Return,  AllModeMask,    _Xsj3cReturn,       NONE,NULL,NULL,
+    "halpha",   XK_F6,      AllModeMask,    _Xsj3cModeHAlpha,   NONE,NULL,NULL,
+    "zalpha",   XK_F7,      AllModeMask,    _Xsj3cModeZAlpha,   NONE,NULL,NULL,
+    "hkatakana",XK_F8,      AllModeMask,    _Xsj3cModeHKata,    NONE,NULL,NULL,
+    "zkatakana",XK_F9,      AllModeMask,    _Xsj3cModeZKata,    NONE,NULL,NULL,
+    "hiragana", XK_F10,     AllModeMask,    _Xsj3cModeHira,     NONE,NULL,NULL,
+    "tohalpha", XK_F16,     FlushModeMask|ShiftMask,
+                                            _Xsj3cToHAlpha,     NONE,NULL,NULL,
+    "tozalpha", XK_F17,     FlushModeMask|ShiftMask,
+                                            _Xsj3cToZAlpha,     NONE,NULL,NULL,
+    "tohkatakana",XK_F18,   FlushModeMask|ShiftMask,
+                                            _Xsj3cToHKata,      NONE,NULL,NULL,
+    "tozkatakana",XK_F19,   FlushModeMask|ShiftMask,
+                                            _Xsj3cToZKata,      NONE,NULL,NULL,
+    "tohiragana",XK_F20,    FlushModeMask|ShiftMask,
+                                            _Xsj3cToHira,       NONE,NULL,NULL,
+    "zenkaku",  XK_F4,      FlushModeMask,  _Xsj3cZenkaku,      NONE,NULL,NULL,
+    "hankaku",  XK_F3,      FlushModeMask,  _Xsj3cHankaku,      NONE,NULL,NULL,
+    "toupper",  XK_u,       FlushModeMask|ControlMask,
+                                            _Xsj3cToUpper,      NONE,NULL,NULL,
+    "tolower",  XK_l,       FlushModeMask|ControlMask,
+                                            _Xsj3cToLower,      NONE,NULL,NULL,
+    "sjis",     XK_F15,     NoInputModeMask|FlushModeMask|ShiftMask,
+                                            _Xsj3cModeSJIS,     NONE,NULL,NULL,
+    "euc",      XK_F14,     NoInputModeMask|FlushModeMask|ShiftMask,
+                                            _Xsj3cModeEUC,      NONE,NULL,NULL,
+    "jis",      XK_F13,     NoInputModeMask|FlushModeMask|ShiftMask,
+                                            _Xsj3cModeJIS,      NONE,NULL,NULL,
+    "kuten",    XK_F12,     NoInputModeMask|FlushModeMask|ShiftMask,
+                                            _Xsj3cModeKuten,    NONE,NULL,NULL,
+    "code",     XK_F5,      NoInputModeMask|FlushModeMask,
+                                            _Xsj3cCodeRollDown, NONE,NULL,NULL,
+    "toggle",   XK_Tab,     AllModeMask,    _Xsj3cModeRollDown, NONE,NULL,NULL,
+    "modedown", XK_Tab,     AllModeMask,    _Xsj3cModeRollDown, NONE,NULL,NULL,
+    "toggleback",XK_Tab,    AllModeMask|ShiftMask,
+                                            _Xsj3cModeRollUp,   NONE,NULL,NULL,
+    "modeup",   XK_Tab,     AllModeMask|ShiftMask,
+                                            _Xsj3cModeRollUp,   NONE,NULL,NULL,
+    "nextmode", XK_Tab,     FlushModeMask|ControlMask,
+                                            _Xsj3cNextMode,     NONE,NULL,NULL,
+    "prevmode", XK_Tab,     FlushModeMask|ControlMask|ShiftMask,
+                                            _Xsj3cPrevMode,     NONE,NULL,NULL,
+    "muhenkan", XK_Cancel,  NoInputModeMask|FlushModeMask,
+                                            _Xsj3cModeToggle,   NONE,NULL,NULL,
+    "right",    XK_Right,   AllModeMask,    _Xsj3cForward,      NONE,NULL,NULL,
+    "forward",  XK_Right,   AllModeMask,    _Xsj3cForward,      NONE,NULL,NULL,
+    "left",     XK_Left,    AllModeMask,    _Xsj3cBackward,     NONE,NULL,NULL,
+    "backward", XK_Left,    AllModeMask,    _Xsj3cBackward,     NONE,NULL,NULL,
+    "top",      XK_a,       FlushModeMask|DictModeMask|ControlMask,
+                                            _Xsj3cTop,          NONE,NULL,NULL,
+    "end",      XK_e,       FlushModeMask|DictModeMask|ControlMask,
+                                            _Xsj3cEnd,          NONE,NULL,NULL,
+    "bottom",   XK_e,       FlushModeMask|DictModeMask|ControlMask,
+                                            _Xsj3cEnd,          NONE,NULL,NULL,
+    "up",       XK_Up,      SelectModeMask, _Xsj3cUp,           NONE,NULL,NULL,
+    "down",     XK_Down,    SelectModeMask, _Xsj3cDown,         NONE,NULL,NULL,
+    "first",    XK_Up,      OutputModeMask|ControlMask,
+                                            _Xsj3cFirst,        NONE,NULL,NULL,
+    "last",     XK_Down,    OutputModeMask|ControlMask,
+                                            _Xsj3cLast,         NONE,NULL,NULL,
+    "nextp",    XK_Select,  SelectModeMask, _Xsj3cNextPage,     NONE,NULL,NULL,
+    "prevp",    XK_Cancel,  SelectModeMask, _Xsj3cPrevPage,     NONE,NULL,NULL,
+    "wrap",     XK_Down,    ConvedModeMask|ShiftMask,
+                                            _Xsj3cNext,         NONE,NULL,NULL,
+    "next",     XK_Down,    ConvedModeMask|ShiftMask,
+                                            _Xsj3cNext,         NONE,NULL,NULL,
+    "wrapback", XK_Up,      ConvedModeMask|ShiftMask,
+                                            _Xsj3cPrev,         NONE,NULL,NULL,
+    "prev",     XK_Up,      ConvedModeMask|ShiftMask,
+                                            _Xsj3cPrev,         NONE,NULL,NULL,
+    "select",   XK_Execute, SelectModeMask, _Xsj3cSelect,       NONE,NULL,NULL,
+    "cancel",   XK_Escape,  SelectModeMask|DictModeMask,
+                                            _Xsj3cCancel,       NONE,NULL,NULL,
+    "cancel",   XK_Cancel,  FlushModeMask|ShiftMask,
+                                            _Xsj3cCancel,       NONE,NULL,NULL,
+    "kakucyou", XK_Up,      FlushModeMask|DictModeMask,
+                                            _Xsj3cExpand,       NONE,NULL,NULL,
+    "expand",   XK_Up,      FlushModeMask|DictModeMask,
+                                            _Xsj3cExpand,       NONE,NULL,NULL,
+    "syukusyou",XK_Down,    FlushModeMask|DictModeMask,
+                                            _Xsj3cShrink,       NONE,NULL,NULL,
+    "shrink",   XK_Down,    FlushModeMask|DictModeMask,
+                                            _Xsj3cShrink,       NONE,NULL,NULL,
+    "backspace",XK_BackSpace,FlushModeMask|SelectModeMask|DictModeMask,
+                                            _Xsj3cBackSpace,    NONE,NULL,NULL,
+    "delete",   XK_Delete,  FlushModeMask|SelectModeMask|DictModeMask,
+                                            _Xsj3cDelete,       NONE,NULL,NULL,
+    "delafter", XK_k,       FlushModeMask|ControlMask,
+                                            _Xsj3cDelAfter,     NONE,NULL,NULL,
+    "start",    XK_Kanji,   AllModeMask|ShiftMask,
+                                            _Xsj3cStart,        NONE,NULL,NULL,
+    "reconnect",XK_Kanji,   AllModeMask|ShiftMask|Mod1Mask, 
+                                            _Xsj3cReConnect,    NONE,NULL,NULL,
+    "saihenkan",XK_Select,  NoInputModeMask|ControlMask,
+                                            _Xsj3cReConvert,    NONE,NULL,NULL,
+    "recovert", XK_Select,  NoInputModeMask|ControlMask,
+                                            _Xsj3cReConvert,    NONE,NULL,NULL,
+    "edit",     XK_Select,  ConvedModeMask|Mod1Mask,
+                                            _Xsj3cEdit,         NONE,NULL,NULL,
+    "toroku",   XK_F1,      ConvedModeMask, _Xsj3cDRegBegin,    NONE,NULL,NULL,
+    "register", XK_F1,      ConvedModeMask, _Xsj3cDRegBegin,    NONE,NULL,NULL,
+    "syoukyo",  XK_F2,      ConvedModeMask, _Xsj3cDClearBegin,  NONE,NULL,NULL,
+    "eliminate",XK_F2,      ConvedModeMask, _Xsj3cDClearBegin,  NONE,NULL,NULL,
+    "symbol",   XK_Escape,  NoInputModeMask|FlushModeMask|ShiftMask, 
+                                            _Xsj3cSymbolBegin,  NONE,NULL,NULL,
+    "quote",    XK_q,       NoInputModeMask|FlushModeMask|ControlMask,
+                                            _Xsj3cQuote,        NONE,NULL,NULL,
+    "flushbefore",NoSymbol, NULL,           _Xsj3cFlushBefore,  NONE,NULL,NULL,
+    "bell",     NoSymbol,   NULL,           _Xsj3cBell,         NONE,NULL,NULL,
+    "sjrc",     NoSymbol,   NULL,           _Xsj3cSjrc,         NONE,NULL,NULL,
+    "kill",     NoSymbol,   NULL,           _Xsj3cKill,         NONE,NULL,NULL,
+    "kana",     NoSymbol,   NULL,           _Xsj3cKana,         NONE,NULL,NULL,
+    "null",     NoSymbol,   NULL,           _Xsj3cNull,         NONE,NULL,NULL,
+    "ignore",   NoSymbol,   NULL,           _Xsj3cIgnore,       NONE,NULL,NULL,
+    NULL,       NULL,       NULL,           NULL,               NONE,NULL,NULL
+};
+
+#define KEYTBMAX    (BUFSIZ/sizeof(Xsj3cKeyTable) - 1)
+
+/*
+ * _Xsj3cAllocKeyTable()
+ *  Allocate memmory for key-function conversion table.
+ */
+static Xsj3cKeyTable *
+_Xsj3cAllocKeyTable()
+{
+    register Xsj3cKeyTable  *keytp;
+
+    if (keynowtp == NULL || keynowtp > keymaxtp) {
+        keytp = (Xsj3cKeyTable *)malloc(BUFSIZ);
+        if (keytp == NULL)
+            return (NULL);
+        else
+            bzero((char *)keytp, BUFSIZ);
+        if (!firstkeytp)
+            firstkeytp = keytp;
+        keynowtp = keytp;
+        keymaxtp = keynowtp + KEYTBMAX;
+        keynowtp++;
+    } else {
+        keytp = keynowtp;
+        keynowtp++;
+    }
+    keytp->keyword = NULL;
+    keytp->ksym = NoSymbol;
+    keytp->func = NULL;
+    keytp->inputsame = 0;
+    keytp->prev = NULL;
+    keytp->next = NULL;
+    return (keytp);
+}
+
+/*
+ * _Xsj3cAddFreeKeyTable()
+ *  Add key-function conversion table to free list.
+ */
+static void
+_Xsj3cAddFreeKeyTable(keytp)
+    register Xsj3cKeyTable  *keytp;
+{
+    if (!keytp)
+        return;
+    if (freekeytp)
+        keytp->prev = freekeytp;
+    else
+        keytp->prev = NULL;
+    freekeytp = keytp;
+    keytp->keyword = NULL;
+    keytp->ksym = NoSymbol;
+    keytp->func = NULL;
+    keytp->inputsame = 0;
+    keytp->next = NULL;
+}
+
+/*
+ * _Xsj3cGetFreeKeyTable()
+ *  Get key-function conversion table from free list.
+ */
+static Xsj3cKeyTable *
+_Xsj3cGetFreeKeyTable()
+{
+    register Xsj3cKeyTable  *keytp;
+
+    if (keytp = freekeytp)
+        freekeytp = keytp->prev;
+    return (keytp);
+}
+
+static void
+_Xsj3cFreeAllKeyTable()
+{
+    register Xsj3cKeyTable  *keytp, *keytq;
+
+    keytq = firstkeytp;
+    while (keytq) {
+        keytp = keytq;
+        keytq = keytp + KEYTBMAX;
+        if (keytq);
+            keytq = keytq->next;
+        free(keytp);
+    }
+    firstkeytp = NULL;
+    freekeytp = NULL;
+}
+
+/*
+ * _Xsj3cSetKeyTable()
+ *  Read sjrc's .key.[function] entry and set key-function conversion table.
+ */
+int
+_Xsj3cSetKeyTable(buf, table)
+    Xsj3cBuf                    buf;
+    Sjrctable                   table;
+{
+    register Xsj3cKeyTable     *keytp, *keytq, *keytr;
+    Xsj3cKeyTable              *keytf,  dummy;
+    KeySym                      ksym;
+    Xsj3ccMode                  modmask;
+    Xsj3cFlag                   inputsame;
+
+    if (!_Xsj3cSetKeySym(table->value, &ksym, &modmask, &inputsame)) 
+        return 0;
+    keytp = &dummy;
+    keytp->next= buf->key;
+    while (keytp->next != NULL) {
+        keytp = keytp->next;
+        if (keytp->ksym == NoSymbol ||(keytp->ksym == ksym &&
+            (keytp->modmask & ~AllModeMask) == (modmask & ~AllModeMask)
+            && ((keytp->modmask & AllModeMask) & modmask))) {
+            keytq = keytp->next;
+            keytf = keytp;
+            if (keytp == buf->key) {    /* top of list  */
+                buf->key = keytq;
+                keytq->prev = NULL;
+            } else if (!keytq) {        /* last of list */
+                keytp = keytp->prev;
+                keytp->next = NULL;
+            } else {
+                keytp = keytp->prev;
+                keytp->next = keytq;
+                keytq->prev = keytp;
+            }
+            _Xsj3cAddFreeKeyTable(keytf);
+        } 
+    }
+    if (!table->key[1])
+        return 0;
+    else if (ksym == NoSymbol || _Xsj3cCmp(table->key[1], "ignore"))
+        return 1;
+
+    keytr = keytp;
+    keytq = defkeys;
+    while (keytq->keyword != NULL) {
+        if (_Xsj3cCmp(table->key[1], keytq->keyword)) {
+            if (!(keytp = _Xsj3cGetFreeKeyTable())) {
+                if (!(keytp = _Xsj3cAllocKeyTable())) {
+                    Xsj3cWarning("can't allocate keysym to func table");
+                    return 0;
+                }
+            }
+            keytr->next = keytp;
+            keytp->prev = keytr;
+            keytp->keyword = keytq->keyword;
+            keytp->ksym = ksym;
+            keytp->modmask = modmask;
+            keytp->func = keytq->func;
+            keytp->inputsame = inputsame;
+            keytr = keytp;
+            keytp->next = NULL;
+            if (keytp->keyword == NULL) {
+                Xsj3cWarning("keyword %s is not supported",table->key[1]);
+                return 0;
+            }
+        } 
+        keytq++;
+    }
+    return 1;
+}
+
+/*
+ * _Xsj3cSetKeySym()
+ *  Read values of the .key.[function] entry and set keysym
+ * and modifier/conversion-mode mask.
+ */
+static int
+_Xsj3cSetKeySym(string, ksym, modmask, inputsame)
+    char          **string;
+    KeySym         *ksym;
+    Xsj3ccMode     *modmask;
+    Xsj3cFlag      *inputsame;
+{
+    register char  *p;
+    int             sub,    ret;
+
+    *modmask = 0;
+    *ksym = NoSymbol;
+    p = *string;
+
+    /* ModMask and KeySym field   */
+    if (p) {
+        if(*p == '^') { /* sj2/sj3 control keybind compatibility   */
+            if (++p) {
+                if (isupper(*p)) {
+                    sub = *p - 'A';
+                    *ksym = XK_a + sub;
+                } else if (islower(*p)) {
+                    sub = *p - 'a';
+                    *ksym = XK_a + sub;
+                } else if (*p >= '\\' && *p <= '_') {
+                    sub = *p - '\\';
+                    *ksym = XK_backslash + sub;
+                } else if (*p >= '!' && *p <= '>') {
+                    sub = *p - '!';
+                    *ksym = XK_exclam + sub;
+                } else {
+                    Xsj3cWarning("wrong keybind in sjrc file");
+                }
+                *modmask = ControlMask|AllModeMask;
+            }
+        } else if(*p == 'X') { /* sjx keybind compatibility   */
+            if (!strncmp(p, "XK_", 3)) {
+                p += 3;
+                *modmask = AllModeMask;
+                *ksym = XStringToKeysym(p);
+            } else {
+                *modmask = AllModeMask;
+                Xsj3cWarning("wrong keybind in sjrc file");
+            }
+        } else if(*p == '\033') { /* escape keybind compatibility   */
+            *ksym = XK_Escape;
+            *modmask = AllModeMask;
+        } else if(*p == '\177') { /* delete keybind compatibility   */
+            *ksym = XK_Delete;
+            *modmask = AllModeMask;
+        } else if ((ret = _Xsj3cGetModMask(*string)) >= 0) {
+            *modmask = ret;
+            if (++string)
+                *ksym = XStringToKeysym(*string);
+            else
+                Xsj3cWarning("wrong keybind in sjrc file");
+        } else {
+            Xsj3cWarning("wrong keybind in sjrc file");
+        }
+    } else {
+        *modmask = AllModeMask;
+    }
+
+    /* Through function field   */
+    p = *(++string);
+    if (p) {
+        if (_Xsj3cCmp(p, "off"))
+            *inputsame = OFF;
+        else if (_Xsj3cCmp(p, "on"))
+            *inputsame = ON;
+        else
+            *inputsame = NONE;
+    } else {
+        *inputsame = NONE;
+    }
+    return 1;
+}
+
+/*
+ * _Xsj3cGetModMask()
+ *  Read strings and convert to modifier/conversion-mode mask.
+ */
+static long
+_Xsj3cGetModMask(p)
+    register char  *p;
+{
+    char            mode[256];
+    register char  *q;
+    int             ret = AllModeMask,  mask = AllModeMask;
+    Xsj3ccMode      conversion = 0;
+
+    while (*p != '\0') {
+        q = mode;
+        while (*p != '\0' && *p != '|') {
+            *q++ = *p++;
+        }
+        if (*p != '\0')
+            p++;
+        *q = '\0';
+        q = mode; 
+        if (*q == 'n') {
+            continue;
+        } else if (*q == 's') {
+            ret |= ShiftMask;
+            continue;
+        } else if (*q == 'c') {
+            ret |= ControlMask;
+            continue;
+        } else if (*q == 'm') {
+            if (*(++q) != '\0') {
+                while (*q != '\0')
+                    q++;
+                switch(*(--q)) {
+                case '1':
+                    ret |= Mod1Mask;
+                    break;
+                case '2':
+                    ret |= Mod2Mask;
+                    break;
+                case '3':
+                    ret |= Mod3Mask;
+                    break;
+                case '4':
+                    ret |= Mod4Mask;
+                    break;
+                case '5':
+                    ret |= Mod5Mask;
+                    break;
+                default:
+                    ret |= Mod1Mask;
+                    break;
+                }
+            } else 
+                ret |= Mod1Mask;
+            continue;
+        } else if (*q == 'l') {
+            ret |= LockMask;
+            continue;
+        } else if (*q == 'k') {
+            ret |= KanaMask;
+            continue;
+        } else if (*q == 'N') {
+            conversion |= NoInputModeMask;
+            continue;
+        } else if (*q == 'I') { 
+            conversion |= InputModeMask;
+            continue;
+        } else if (*q == 'i') { /* for compatibility    */
+            conversion |= InputModeMask;
+            continue;
+        } else if (*q == 'u') { /* for compatibility    */
+            conversion |= ConvedModeMask;
+            continue;
+        } else if (*q == 'U') { /* for compatibility    */
+            conversion |= ConvedModeMask;
+            continue;
+        } else if (*q == 'C') {
+            conversion |= ConvedModeMask;
+            continue;
+        } else if (*q == 'v') { /* for compatibility    */
+            conversion |= SelectModeMask;
+            continue;
+        } else if (*q == 'V') { /* for compatibility    */
+            conversion |= SelectModeMask;
+            continue;
+        } else if (*q == 'S') {
+            conversion |= SelectModeMask;
+            continue;
+        } else if (*q == 'o') { /* for compatibility    */
+            conversion |= OutputModeMask;
+            continue;
+        } else if (*q == 'O') {
+            conversion |= OutputModeMask;
+            continue;
+        } else if (*q == 'd') { /* for compatibility    */
+            conversion |= DictModeMask;
+            continue;
+        } else if (*q == 'D') {
+            conversion |= DictModeMask;
+            continue;
+        } else if (*q == 'f') { /* for compatibility    */
+            conversion |= FlushModeMask;
+            continue;
+        } else if (*q == 'F') {
+            conversion |= FlushModeMask;
+            continue;
+        } else if (*q == 'a') { /* for compatibility    */
+            conversion |= AllModeMask;
+            continue;
+        } else if (*q == 'A') {
+            conversion |= AllModeMask;
+            continue;
+        } else {
+            Xsj3cWarning("Ilegal keybind modmask %s in sjrc file",mode);
+            ret = -1;
+        }
+    }
+    if (conversion) {
+        ret &= ~mask;
+        ret |= conversion;
+    }
+    return ret;
+}
+
+/*
+ * Xsj3cCreateBuffer()
+ * Allocate Xsj3cBuf type structure and initialize all flags and buffers.
+ */
+Xsj3cBuf
+Xsj3cCreateBuffer()
+{
+    Xsj3cBuf            buf;
+    Xsj3cKeyTable      *keytp, *keytq, *keytr;
+    register int        i,      back_lang;
+
+    /*  Allocate buffer fields  */
+
+    if ((buf = (Xsj3cBuf)malloc(sizeof(Xsj3cBufRec))) == NULL) {
+        return (Xsj3cBuf)NULL;
+    }
+    bzero(buf, sizeof(Xsj3cBufRec));
+
+    /* Default definition for uninitialized field */
+
+    buf->convmode = NoInputModeMask;
+    buf->server = SERVER_SJ3;
+    if ((buf->input = (Xsj3cSeg *)calloc(BUNBUFSIZ, sizeof(Xsj3cSeg)))
+                == NULL) {
+        return (Xsj3cBuf)NULL;
+    }
+    bzero(buf->input, BUNBUFSIZ * sizeof(Xsj3cSeg));
+    buf->backup = NULL;
+    buf->current = NULL;
+    buf->segnum = 0;
+    buf->backsegnum = 0;
+    buf->curseg = 0;
+    buf->convedsegnum = 0;
+
+    buf->inputmode = MODE_HIRA;
+    buf->dispmode = MODE_HIRA;
+    
+    buf->dict = NULL;
+
+    buf->candidate = NULL;
+    buf->hinsi = NULL;
+    buf->symbol = NULL;
+
+    buf->candnum = 0;
+    buf->curcand = 0;
+    buf->cursymbol = 0;
+    buf->curhinsi = 0;
+    buf->selectstatus = SELECT_CAND;
+    buf->n_select = 0;
+    buf->candseg = 0;
+
+    buf->rktable = NULL;
+    buf->hktable = NULL;
+    buf->zhtable = NULL;
+    buf->plosive = NULL;
+    buf->rkdouble = NULL;
+
+    /* Initialize common (with sj2/sj3/sjx) flags area */
+    /* Make keysym to function hash table  */
+    for (keytp = defkeys, i = 0; keytp->keyword != NULL; keytp++) {
+        if (!(keytq = _Xsj3cGetFreeKeyTable())) {
+            if (!(keytq = _Xsj3cAllocKeyTable())) {
+                Xsj3cWarning("can't allocate keysym to func table");
+                return (Xsj3cBuf)NULL;
+            }
+        }
+        if (!i++) {
+            buf->key = keytq;
+            keytq->prev = NULL;
+        } else {
+            keytr->next = keytq;
+            keytq->prev = keytr;
+        }
+        keytq->keyword = keytp->keyword;
+        keytq->ksym = keytp->ksym;
+        keytq->modmask = keytp->modmask;
+        keytq->func = keytp->func;
+        keytq->inputsame = keytp->inputsame;
+        keytr = keytq;
+    }
+    keytq->next = NULL;
+
+    for (i = 0; i < MODE_INROT_NUM; i++) 
+        buf->inmoderot[i]= i;
+    buf->inmoderotnum = MODE_INROT_NUM;
+    for (i = 0; i < MODE_OUTROT_NUM; i++) 
+        buf->outmoderot[i]= i;
+    buf->outmoderotnum = MODE_OUTROT_NUM;
+    for (i = 0; i < MODE_CODE_NUM; i++) 
+        buf->defcode[i]= MODE_SJIS + i;
+    buf->coderotnum = MODE_CODE_NUM;
+    buf->muhenmode = MODE_HALPHA;
+    buf->togglemode = MODE_HIRA;
+    buf->dotoggle = ON;
+    buf->throughflg = 0;
+
+    buf->rcfile = NULL;
+    back_lang = in_lang;
+    in_lang = JP_SJIS;
+    for (i = 0; i < MODE_STR_NUM; i++) {
+        _Xsj3cSetGuide(buf, &def_guide_table[i]);
+    }
+    in_lang = back_lang;
+
+    buf->gakusyuu = ON;
+    buf->rkbell = OFF;
+    buf->flushaconv = OFF;
+    buf->sj3serv = NULL;
+    buf->setnormal = NULL;
+    buf->throughnext = NULL;
+
+    /* Initialize Xsj3clib original flags area   */
+    buf->sj3serv2 = NULL;
+    buf->alphaconv = OFF;
+    buf->backdisplay = OFF;
+    buf->beginlastseg = ON;
+    buf->expandkconv = SEG_CONVED;
+    buf->shrinkkconv = SEG_CONVED;
+    buf->expandmconv = SEG_NOCONV;
+    buf->shrinkmconv = SEG_NOCONV;
+    buf->shrinkall = OFF;
+    buf->flushiconv = ON;
+    buf->flushsconv = NONE;
+    buf->flusheconv = ON;
+    buf->henkanseg = ALL;
+    buf->muhenseg = ONE;
+    buf->delchange = ONE;
+    buf->flushchange = ONE;
+    for ( i = 0; i < MODE_CONV_NUM; i++) 
+        buf->modeconv[i] = SEG_CONVED;
+    buf->moveloop = OFF;
+    buf->movebyseg = SEG_CONVED;
+    buf->jumpbyseg = SEG_CONVED;
+    buf->delbyseg = SEG_CONVED;
+    buf->killbyseg = SEG_CONVED;
+    buf->muhencurlast = OFF;
+    buf->editcurlast = OFF;
+    buf->flushcurlast = OFF;
+    buf->convedunderline = ON;
+    buf->dispmodechange = OFF;
+    buf->dellastmove = ON;
+    buf->kanaonly = OFF;
+    buf->inputsame = ON;
+    buf->cntrlsame = OFF;
+    buf->selectconv = ON;
+    buf->beforeconv = OFF;
+    buf->lastdoubleconv = OFF;
+    buf->selectcount = 0;
+    buf->selectback = OFF;
+    buf->candpadding = OFF;
+
+    refcount++;
+    return (buf);
+}
+
+/*
+ * _Xsj3cFreeModeStr()
+ *  Free memory of mode guide strings.
+ */
+static void
+_Xsj3cFreeModeStr(buf)
+    Xsj3cBuf                buf;
+{
+    register int            i;
+
+    for (i = 0; i < MODE_STR_NUM; i++) {
+        if (buf->modestr[i])
+            free(buf->modestr[i]);
+        buf->modestr[i] = NULL;
+    }
+}
+
+/*
+ * Xsj3cFreeBuffer()
+ *  Free all data buffers.
+ */
+void
+Xsj3cFreeBuffer(buf)
+    Xsj3cBuf            buf;
+{
+    register int        i;
+
+    _Xsj3cFreeModeStr(buf);
+    if (!refcount)
+        _Xsj3cFreeAllKeyTable();
+    if (buf->input) {
+        for (i = 0; i < buf->segnum + 1; i++) {
+            Xsj3cFreeSegment(buf->input[i]);
+            buf->input[i] = NULL;
+        }
+        free(buf->input);
+        buf->input = NULL;
+    }
+    if (buf->backup) {
+        for (i = 0; i < buf->backsegnum + 1; i++) {
+            Xsj3cFreeSegment(buf->backup[i]);
+            buf->backup[i] = NULL;
+        }
+        free(buf->backup);
+        buf->backup = NULL;
+    }
+    free(buf);
+}
+
+/*
+ * Xsj3cClearBuffer()
+ *  Clear buffers.
+ */
+void
+Xsj3cClearBuffer(buf)
+    Xsj3cBuf            buf;
+{
+    register int        i;
+
+    for (i = 0; i < buf->segnum + 1; i++) {
+        Xsj3cFreeSegment(buf->input[i]);
+        buf->input[i] = NULL;
+    }
+    buf->convmode = InputModeMask;
+    buf->curseg = 0;
+    buf->segnum = 0;
+    buf->convedsegnum = 0;
+    buf->dispmode = buf->inputmode;
+}
+
+/*
+ * Xsj3cFixBuffer()
+ *  Fix and backup buffers.
+ */
+void
+Xsj3cFixBuffer(buf)
+    Xsj3cBuf            buf;
+{
+    register int        i;
+    int                 j;
+
+    if (buf->backup) {
+        for (i = 0; i < buf->backsegnum + 1; i++) {
+            Xsj3cFreeSegment(buf->backup[i]);
+            buf->backup[i] = NULL;
+        }
+        free(buf->backup);
+        buf->backup = NULL;
+    }
+    if (buf->convmode & InputModeMask) {
+        j = buf->input[buf->curseg]->cur - 1;
+        if (j >= 0 && buf->input[buf->curseg]->yomi[j] < 256 &&
+                iscntrl((unsigned char)buf->input[buf->curseg]->yomi[j])) {
+            unsigned char   tmp[RBUFSIZ];
+
+            _Xsj3cExtractChar(buf, buf->input[buf->curseg], tmp, 1);
+            _Xsj3cStoreYomi(buf, buf->input[buf->curseg], j);
+            if (!buf->input[buf->curseg]->num) {
+                buf->segnum--;
+                Xsj3cFreeSegment(buf->input[buf->curseg]);
+                buf->input[buf->curseg] = NULL;
+                for (i = buf->curseg; i < buf->segnum; i++) {
+                    buf->input[i] = buf->input[i + 1];
+                }
+                buf->input[buf->segnum] = NULL;
+            }
+        }
+        buf->convmode = NoInputModeMask;
+    } else if (buf->convmode & ~NoInputModeMask) {
+        j = buf->input[buf->curseg]->dnum - 1;
+        if (j >= 0 && buf->input[buf->curseg]->disp[j] < 256 &&
+            iscntrl((unsigned char)buf->input[buf->curseg]->disp[j])) {
+            buf->input[buf->curseg]->dnum--;
+            buf->input[buf->curseg]->disp[j] = '\0';
+        } 
+        if (buf->convmode != SelectModeMask) /* For symbol input    */
+            buf->convmode = NoInputModeMask;
+    }
+    buf->backup = buf->input;
+    buf->backsegnum = buf->segnum;
+    buf->input = NULL;
+    if ((buf->input = (Xsj3cSeg *)calloc(BUNBUFSIZ,
+            sizeof(Xsj3cSeg))) == NULL) {
+        Xsj3cError("Cannot allocate for input buffers");
+    }
+    buf->curseg = 0;
+    buf->segnum = 0;
+    buf->convedsegnum = 0;
+    buf->dispmode = buf->inputmode;
+}
+
+/*
+ * Xsj3cFlushBuffer()
+ *  Flush and backup buffers.
+ */
+void
+Xsj3cFlushBuffer(buf)
+    Xsj3cBuf            buf;
+{
+    register int        tmpsegnum;
+    register Xsj3cSeg  *segp;
+
+    segp = buf->backup;
+    buf->backup = buf->input;
+    buf->input = segp;
+    tmpsegnum = buf->backsegnum;
+    buf->backsegnum = buf->segnum;
+    buf->segnum = tmpsegnum;
+    buf->curseg = 0;
+    buf->convmode = InputModeMask;
+    buf->convedsegnum = 0;
+    buf->dispmode = buf->inputmode;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/Xsj3clib/candidate.c	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,321 @@
+#ifndef lint
+static char *rcsid = "$Id: candidate.c,v 2.2 1992/03/18 09:44:48 nao Exp $";
+#endif
+/*
+ * Copyright 1991 Sony Corporation
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Sony not be used in advertising or
+ * publicity pertaining to distribution of the software without specific,
+ * written prior permission.  Sony makes no representations about the
+ * suitability of this software for any purpose.  It is provided "as is"
+ * without express or implied warranty.
+ *
+ * SONY DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL SONY
+ * BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
+ * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN 
+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+/*
+ * Author: Naoshi Suzuki, SONY Corporation.  (nao@sm.sony.co.jp)
+ */
+
+#include "common.h"
+#include "util.h"
+
+extern Xsj3cCVServerIF      serverIF[SERVER_NUM];
+
+Xsj3cCand                   _Xsj3cCandidateInit();
+int                         Xsj3cGetCandidateNum();
+Xsj3cCand                   Xsj3cGetCandidates();
+wchar                      *Xsj3cGetCandidate();
+int                         Xsj3cSetCandidate();
+void                        Xsj3cEndCandidate();
+
+/*
+ * _Xsj3cCandidateInit()
+ *  Initialize candidate list of current segment.
+ * No alloca() used.
+ */
+Xsj3cCand
+_Xsj3cCandidateInit(buf)
+    Xsj3cBuf    buf;
+{
+    register int        i,  j,  num,    padnum;
+    Xsj3csMode          padmode[2];
+    unsigned char      *knjbuf;
+    SJ3_DOUON          *mbcand;
+
+    if (buf->candidate) {
+        return (buf->candidate);
+    }
+    i = 0;
+    buf->curcand = 0;
+    if ((knjbuf = (unsigned char *)
+        malloc(buf->input[buf->curseg]->size * sizeof(wchar))) == NULL) {
+        Xsj3cWarning("Cannot allocate for candidate yomi buffer");
+        return (NULL);
+    }
+    _Xsj3cwPStomPS(buf, knjbuf, buf->input[buf->curseg]->yomi);
+    num = buf->candnum = serverIF[buf->server].func[FUNC_CANDNUM](knjbuf);
+    if (num < 0) {
+        Xsj3cWarning("sj3serv is down. reconnect please");
+        if (buf->convmode & SelectModeMask)
+            buf->convmode = ConvedModeMask;
+        free(knjbuf);
+        return ((Xsj3cCand)NULL);
+    } else if (num > 0) {
+        mbcand = (SJ3_DOUON *)calloc(num, sizeof(SJ3_DOUON));
+        if (!mbcand) {
+            Xsj3cWarning("Cannot allocate memory for candidate list");
+            if (buf->convmode & SelectModeMask) 
+                buf->convmode = ConvedModeMask;
+            free(knjbuf);
+            return ((Xsj3cCand)NULL);
+        }
+        num = buf->candnum
+                = serverIF[buf->server].func[FUNC_CANDIDATE](knjbuf, mbcand);
+        if (num <= 0) {
+            if (num < 0) {
+                Xsj3cWarning("sj3serv is down. reconnect please.");
+            } else  {
+                Xsj3cWarning("There is no candidate.");
+                goto candpad;
+            }
+            if (buf->convmode & SelectModeMask) 
+                buf->convmode = ConvedModeMask;
+            free(mbcand);
+            free(knjbuf);
+            return ((Xsj3cCand)NULL);
+        } else {
+            if ((buf->candidate = (Xsj3cCand)
+                calloc(num, sizeof(Xsj3cCandRec))) == NULL) {
+                Xsj3cWarning("Cannot allocate memory for candidate list");
+                if (buf->convmode & SelectModeMask)
+                    buf->convmode = ConvedModeMask;
+                free(knjbuf);
+                free(mbcand);
+                buf->candnum = -1;
+                return ((Xsj3cCand)NULL);
+            }
+            while (i < num) {
+                buf->candidate[i].len = _Xsj3cmPStowOUT(buf,
+                    buf->candidate[i].data, mbcand[i].ddata);
+                buf->candidate[i].dcid = mbcand[i].dcid;
+                i++;
+            }
+            if (buf->candnum > 1) {
+                serverIF[buf->server].func[FUNC_LOCK]();
+                locked[buf->server]++;
+            } else {
+                bzero(&buf->candidate[0].dcid,
+                        sizeof(buf->candidate[0].dcid));
+            }
+        }
+        free(mbcand);
+        if (buf->candpadding)
+            goto candpad;
+        else
+            free(knjbuf);
+    } else {
+candpad:
+        if (buf->input[buf->curseg]->num > CANDBUFSIZ - 1) {
+            free(knjbuf);
+            return (buf->candidate);
+        }
+        switch(buf->input[buf->curseg]->cursegmode) {
+        case MODE_HIRA:
+            padnum = 1;
+            padmode[0] = MODE_ZKATA;
+            break;
+        case MODE_ZKATA:
+            padnum = 1;
+            padmode[0] = MODE_HIRA;
+            break;
+        default:
+            padnum = 2;
+            padmode[0] = MODE_HIRA;
+            padmode[1] = MODE_ZKATA;
+            break;
+        }
+        if (buf->candnum != 1
+                || buf->input[buf->curseg]->cursegmode == MODE_HIRA)
+            num += (padnum + 1);
+        else 
+            num += padnum;
+        if (buf->candidate)
+            buf->candidate = (Xsj3cCand)realloc(buf->candidate,
+                    num * sizeof(Xsj3cCandRec));
+        else 
+            buf->candidate = (Xsj3cCand)calloc(num, sizeof(Xsj3cCandRec));
+        if (!buf->candidate) {
+            Xsj3cWarning("Cannot allocate memory for candidate list");
+            free(knjbuf);
+            buf->candnum = -1;
+            return ((Xsj3cCand)NULL);
+        }
+        if (buf->candnum > 1
+                || buf->input[buf->curseg]->cursegmode == MODE_HIRA) {
+            _Xsj3cwPStowOUT(buf, buf->candidate[i].data,
+                    buf->input[buf->curseg]->yomi);
+            buf->candidate[i].len = buf->input[buf->curseg]->num;
+            bzero(&buf->candidate[i].dcid, sizeof(buf->candidate[i].dcid));
+            i++;
+        } else if (!buf->candnum) {
+            _Xsj3cWcpy(buf->candidate[i].data, buf->input[buf->curseg]->disp);
+            buf->candidate[i].len = buf->input[buf->curseg]->dnum;
+            bzero(&buf->candidate[i].dcid, sizeof(buf->candidate[i].dcid));
+            i++;
+        }
+        for (j = 0; j < padnum; i++, j++) {
+            Xsj3cModeConv(buf, knjbuf, padmode[j],
+                    buf->input[buf->curseg]->size);
+            buf->candidate[i].len
+                    = _Xsj3cmPStowOUT(buf, buf->candidate[i].data, knjbuf);
+            bzero(&buf->candidate[i].dcid,
+                    sizeof(buf->candidate[i].dcid));
+        }
+        free(knjbuf);
+        buf->candnum = num;
+    }
+    buf->candseg = buf->curseg;
+    return (buf->candidate);
+}
+
+/*
+ * Xsj3cGetCandidateNum()
+ * If list is already initialized, return candidate number,
+ * else initialize list and return candidate number
+ * when it succeeded in initializing list.
+ * If sj3serv is down or failed to allocate memory, return -1.
+ */
+int
+Xsj3cGetCandidateNum(buf, cur)
+    Xsj3cBuf            buf;
+    int                *cur;
+{
+    if (!buf->candidate) {
+        buf->candidate = _Xsj3cCandidateInit(buf);
+    }
+    *cur = buf->curcand;
+    return (buf->candnum);
+}
+
+/*
+ * Xsj3cGetCandidates()
+ *  Return candidate data.
+ */
+Xsj3cCand
+Xsj3cGetCandidates(buf)
+    Xsj3cBuf            buf;
+{
+    if (!buf->candidate) {
+        buf->candidate = _Xsj3cCandidateInit(buf);
+    }
+    return (buf->candidate);
+}
+
+/*
+ * Xsj3cGetCandidate()
+ *  Return the appointed (by 2nd argument) candidate.
+ */
+wchar *
+Xsj3cGetCandidate(buf, n, len)
+    Xsj3cBuf            buf;
+    int                 n;
+    int                *len;
+{
+    if (!buf->candidate) {
+        buf->candidate = _Xsj3cCandidateInit(buf);
+    }
+    *len = buf->candidate[n].len;
+    return (buf->candidate[n].data);
+}
+
+/*
+ * Xsj3cSetCandidate()
+ *  Set the selected candidate strings to the buffers.
+ */
+int
+Xsj3cSetCandidate(buf, sel_candidate, changed, flush)
+    Xsj3cBuf    buf;
+    int         sel_candidate;
+    int        *changed;
+    int        *flush;
+{
+    register wchar      *p, *q;
+    register i,         same = 1;
+
+    *flush = OFF;
+    *changed = OFF;
+    if (sel_candidate >= buf->candnum)
+        return -1;
+    p = buf->candidate[sel_candidate].data;
+    q = buf->input[buf->curseg]->disp;
+    i = buf->input[buf->curseg]->dnum;
+    while (i--) {
+        if (*p++ != *q++) {
+            same = 0;
+            break;
+        }
+    }
+    if ((!same || buf->curcand != sel_candidate) &&
+        buf->candseg < buf->segnum && buf->input[buf->candseg]) {
+        buf->input[buf->candseg]->dnum
+                = buf->candidate[sel_candidate].len;
+        _Xsj3cWcpy(buf->input[buf->candseg]->disp,
+                buf->candidate[sel_candidate].data);
+        *changed = ON;
+        if (buf->gakusyuu)
+            buf->input[buf->candseg]->change = ON;
+        buf->curcand = sel_candidate;
+    } else {
+        *changed = OFF;
+    }
+    return 0;
+}
+
+/*
+ * Xsj3cEndCandidate()
+ *  SelectMode: End candidate select mode(SelectMode) and back to ConvedMode.
+ *  ConvedModeMask: Free buffer of candidates and unlock sj3serv.
+ */
+void
+Xsj3cEndCandidate(buf, sync)
+    Xsj3cBuf    buf;
+    int         sync;
+{
+    if (!((buf->convmode & SelectModeMask)
+            && buf->selectstatus == SELECT_CAND)) {
+        if (buf->candnum > 1) {
+            if (sync) {
+                if ((serverIF[buf->server].func[FUNC_STUDY]
+                        (&buf->candidate[buf->curcand].dcid)) < 0) {
+                    Xsj3cWarning("sj3serv is down. reconnect please");
+                }
+            }
+            if (locked[buf->server] > 0) {
+                if (!(--locked[buf->server]))
+                    serverIF[buf->server].func[FUNC_UNLOCK]();
+            }
+        }
+        free (buf->candidate);
+        buf->candidate = NULL;
+        buf->curcand = 0;
+        buf->candnum = 0;
+    } else {
+        if ((buf->flushsconv == OFF) && buf->input[buf->segnum] &&
+            buf->input[buf->segnum]->num) {
+            buf->curseg = buf->segnum;
+            buf->segnum++;
+            buf->convmode = InputModeMask;
+        } else {
+            buf->convmode = ConvedModeMask;
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/Xsj3clib/code.c	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,126 @@
+#ifndef lint
+static char *rcsid = "$Id: code.c,v 2.1 1993/09/21 09:43:46 nao Exp $";
+#endif
+/*
+ * Copyright 1991 Sony Corporation
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Sony not be used in advertising or
+ * publicity pertaining to distribution of the software without specific,
+ * written prior permission.  Sony makes no representations about the
+ * suitability of this software for any purpose.  It is provided "as is"
+ * without express or implied warranty.
+ *
+ * SONY DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL SONY
+ * BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
+ * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN 
+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+/*
+ * Author: Naoshi Suzuki, SONY Corporation.  (nao@sm.sony.co.jp)
+ */
+
+#include "common.h"
+
+#define WMASK   0x7f7f
+#define WMSB    0x8080
+
+wchar _Xsj3csjis2euc();
+wchar _Xsj3ceuc2sjis();
+wchar _Xsj3csjis2jis();
+wchar _Xsj3cjis2sjis();
+wchar _Xsj3cjis2euc();
+wchar _Xsj3ceuc2jis();
+
+wchar
+_Xsj3csjis2euc (c)
+    register wchar          c;
+{
+    register int            high, low;
+
+    if (c >= 0xf040)
+        return 0;
+    high = (c >> 8) & 0xff;
+    low = c & 0xff;
+    if (high > 0x9f)
+        high -= 0x40;
+    if (low > 0x9e)
+        return (((high << 9) | low) - 0x5ffe);
+    if (low > 0x7f)
+        low--;
+    return (((high << 9) | low) - 0x609f);
+}
+
+wchar
+_Xsj3ceuc2sjis (c)
+    register wchar          c;
+{
+    register int            high, low;
+
+    high = (c >> 8) & 0xff;
+    low = c & 0xff;
+    if (!(high & 1))
+        low -= 0x02;
+    else if (low < 0xe0)
+        low -= 0x61;
+    else
+        low -= 0x60;
+    high = ((high - 0xa1) >> 1) + (high < 0xdf ? 0x81 : 0xc1);
+    return ((high << 8) | low);
+}
+
+wchar
+_Xsj3csjis2jis (c)
+    register wchar          c;
+{
+    register int            high, low;
+
+    if (c >= 0xf040)
+        return 0;
+    high = (c >> 8) & 0xff;
+    low = c & 0xff;
+    if (high > 0x9f)
+        high -= 0x40;
+    if (low > 0x9e)
+        return (((high << 9) | low) - 0xe07e);
+    if (low > 0x7f)
+        low--;
+    return (((high << 9) | low) - 0xe11f);
+}
+
+wchar
+_Xsj3cjis2sjis (c)
+    register wchar          c;
+{
+    register int            high, low;
+
+    high = (c >> 8) & 0xff;
+    low = c & 0xff;
+    if (!(high & 1))
+        low += 0x7e;
+    else if (low < 0x60)
+        low += 0x1f;
+    else 
+        low += 0x20;
+    high = ((high - 0x21) >> 1) + (high < 0x5f ? 0x81 : 0xc1);
+    return ((high << 8) | low);
+}
+
+wchar
+_Xsj3cjis2euc (c)
+    register wchar          c;
+{
+    return (c | WMSB);
+}
+
+wchar
+_Xsj3ceuc2jis (c)
+    register wchar          c;
+{
+    return (c & WMASK);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/Xsj3clib/common.h	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,189 @@
+/* $Id: common.h,v 2.2 1993/09/21 14:31:39 nao Exp $ */
+/*
+ * Copyright 1991 Sony Corporation
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Sony not be used in advertising or
+ * publicity pertaining to distribution of the software without specific,
+ * written prior permission.  Sony makes no representations about the
+ * suitability of this software for any purpose.  It is provided "as is"
+ * without express or implied warranty.
+ *
+ * SONY DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL SONY
+ * BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
+ * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN 
+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+/*
+ * Author: Naoshi Suzuki, SONY Corporation.  (nao@sm.sony.co.jp)
+ */
+
+#include "Xsj3clib.h"
+#include <X11/Xlib.h>
+#if defined(XlibSpecificationRelease) && XlibSpecificationRelease > 4
+#include <X11/Xfuncs.h>
+#endif
+
+/*
+ * define for conversion server
+ */
+#define SERVER_SJ3              0
+#define SERVER_NUM              1
+
+/*
+ * define for conversion mode
+ */
+#define NoInputModeMask         (1<<16)
+#define InputModeMask           (1<<17)
+#define ConvedModeMask          (1<<18)
+#define SelectModeMask          (1<<19)
+#define DictModeMask            (1<<20)
+#define AllModeMask             (InputModeMask|ConvedModeMask|SelectModeMask \
+                                |DictModeMask|NoInputModeMask)
+#define OutputModeMask          (ConvedModeMask|SelectModeMask)
+#define FlushModeMask           (InputModeMask|ConvedModeMask)
+
+/*
+ * Define for segment status InputMode/ConvedMode
+ */
+#define SEG_NOCONV              (1L<<0)
+#define SEG_CONVED              (1L<<1)
+
+/*
+ * Define for permittion to edit(input)
+ */
+#define SEG_EDIT                (1L<<0)
+#define SEG_NOEDIT              (1L<<1)
+
+/*
+ * define for maximum size
+ */
+#define INPUT_YOMI_MAX          255
+#define DICT_YOMI_MAX           31
+
+/*
+ * define for result of conversion
+ */
+#define CONV_FAILED             -1
+#define CONV_UNFIXED            0
+#define CONV_FIXED              1
+
+/*
+ * define for flags on/off
+ */
+#undef OFF
+#define OFF                     0L
+#undef ON
+#define ON                      (1L<<0)
+#define ONE                     (1L<<0)
+#define THROUGH                 (1L<<0)
+#define ALL                     (1L<<1)
+#define NONE                    (1L<<1)
+#define QUOTE                   (1L<<1)
+#define AFTER                   (1L<<2)
+#define EDIT                    (1L<<2)
+
+/*
+ * define for mode of dictionary handling
+ */
+#define REG_STATE               (1L<<0)
+#define CLR_STATE               (1L<<1)
+
+/*
+ * define for message in DictMode(sj3)
+ */
+#define SJ3_DICT_INPUT          128
+#define SJ3_DICT_YOMI           129
+#define SJ3_DICT_HINSI          130
+#define SJ3_DICT_CONFIRM        131
+#define SJ3_TOUROKU_SUCCESSED   132
+#define SJ3_SYOUKYO_SUCCESSED   133
+#define SJ3_NO_YOMI_STR         134
+#define SJ3_LONG_YOMI_STR       135
+
+/*
+ * Define for SelectMode status
+ */
+#define SELECT_CAND             0
+#define SELECT_SYMBOL           1
+#define SELECT_HINSI            2
+
+/*
+ * Define for status of dictionary handling
+ */
+#define DICT_INPUT              0
+#define DICT_HINSI              1
+#define DICT_CONFIRM            2
+#define DICT_END                3
+
+/*
+ * Define for DictMode messages
+ */
+#define DICT_STR_MODE           0
+#define DICT_STR_MSG1           1
+#define DICT_STR_YOMI           2
+#define DICT_STR_MSG2           3
+#define DICT_STR_HINSI          4
+#define DICT_STR_MSG3           5
+#define DICT_STR_NUM            6
+
+/*
+ * Define for NULL
+ */
+#ifndef NULL
+#define NULL                    0
+#endif
+
+/*
+ * define for reading set-up file.
+ */
+#define OPEN_FAILED             1
+#define READ_FAILED             -1
+#define ALLOC_FAILED            -2
+#define OK                      0
+
+#define SKIP(p)         { while (*p == '\t' || *p == ' ') p++; }
+#define CHECK_END(p)    { if (*p == '\n' || *p == '#') return (READ_FAILED); }
+
+/*
+ * define for reading set-up files.
+ */
+#define SO                      0x0e
+#define SI                      0x0f
+#define ESC                     0x1b
+#define SS2                     0x8e
+#define SS3                     0x8f
+#define MASK                    0x7f
+#define MSB                     0x80
+
+/*
+ * define for conversion interface function.
+ */
+#define FUNC_OPEN               0
+#define FUNC_CLOSE              1
+#define FUNC_CONV               2
+#define FUNC_CANDNUM            3
+#define FUNC_CANDIDATE          4
+#define FUNC_REGISTER           5
+#define FUNC_CLEAR              6
+#define FUNC_STUDY              7
+#define FUNC_STUDY2             8
+#define FUNC_LOCK               9
+#define FUNC_UNLOCK             10
+
+#define FUNC_NUM                11
+
+typedef struct _sjrctable {
+    unsigned char   *key[2];
+    unsigned char   *value[10];
+} SjrcRec,  *Sjrctable;
+
+typedef struct _Xsj3cCVServerIF {
+    int             lang;
+    int             (*func[FUNC_NUM])();
+} Xsj3cCVServerIF;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/Xsj3clib/connect.c	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,232 @@
+#ifndef lint
+static char *rcsid = "$Id: connect.c,v 2.0 1992/02/13 18:33:14 nao Exp $";
+#endif
+/*
+ * Copyright 1991 Sony Corporation
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Sony not be used in advertising or
+ * publicity pertaining to distribution of the software without specific,
+ * written prior permission.  Sony makes no representations about the
+ * suitability of this software for any purpose.  It is provided "as is"
+ * without express or implied warranty.
+ *
+ * SONY DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL SONY
+ * BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
+ * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN 
+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+/*
+ * Author: Naoshi Suzuki, SONY Corporation.  (nao@sm.sony.co.jp)
+ */
+
+#include "common.h"
+#include "util.h"
+
+extern Xsj3cCVServerIF      serverIF[SERVER_NUM];
+
+int                         Xsj3cOpen();
+void                        Xsj3cClose();
+void                        Xsj3cConnect();
+
+static void                 _Xsj3cOpenError();
+static void                 _Xsj3cCloseError();
+
+static int                  connected[SERVER_NUM]= {0};
+
+/*
+ * Xsj3cOpen()
+ *  Connect to sj3serv(kana-kanji conversion server).
+ */
+int
+Xsj3cOpen(buf, host, user, force, second)
+    Xsj3cBuf    buf;
+    char       *host;
+    char       *user;
+    int         force;
+    int         second;
+{
+    extern char        *getenv();
+    char               *p;
+    char                hostname[SERVER_NUM][32];
+    int                 value;
+    
+    if (connected[buf->server] && !force) {
+        return CONNECT_OK;
+    }
+    if (host) {
+        if (user) {
+            if ((value = serverIF[buf->server].func[FUNC_OPEN](host, user))
+                    != SJ3_NORMAL_END) {
+                _Xsj3cOpenError(value);
+                if (value == SJ3_SERVER_DEAD || value == SJ3_CONNECT_ERROR)
+                    return CONNECT_FAIL;
+            }
+        } else {
+            Xsj3cError("can't connect sj3serv by null user");
+            return CONNECT_FAIL;
+        }
+    } else {
+        if (user) {
+            hostname[buf->server][0] = '\0';
+            if (buf->server == SERVER_SJ3) {
+                if (!second) {
+                    if ((p = getenv("SJ3SERV")) && *p != '\0') {
+                        strcpy(hostname[buf->server], p);
+                    } else if (buf->sj3serv) {
+                        strcpy(hostname[buf->server], buf->sj3serv);
+                    }
+                } else {
+                    if ((p = getenv("SJ3SERV2")) && *p != '\0') {
+                        strcpy(hostname[buf->server], p);
+                    } else if (buf->sj3serv2) {
+                        strcpy(hostname[buf->server], buf->sj3serv2);
+                    }
+                }
+            }
+            if ((value = serverIF[buf->server].func[FUNC_OPEN](hostname, user))
+                    != SJ3_NORMAL_END) {
+                _Xsj3cOpenError(value);
+                if (value == SJ3_SERVER_DEAD || value == SJ3_CONNECT_ERROR)
+                    return CONNECT_FAIL;
+            }
+        } else {
+            Xsj3cError("can't connect sj3serv by null user");
+            return CONNECT_FAIL;
+        }
+    }
+    locked[buf->server] = 0;
+    connected[buf->server] = 1;
+    return CONNECT_OK;
+}
+
+/*
+ * Xsj3cConnect()
+ *  Disconnect to sj3serv and reonnect to sj3serv.
+ */
+void
+Xsj3cConnect(buf, host, host2, user)
+    Xsj3cBuf    buf;
+    char       *host;
+    char       *host2;
+    char       *user;
+{
+    serverIF[buf->server].func[FUNC_UNLOCK]();
+    Xsj3cClose(buf, ON);
+    if ((Xsj3cOpen(buf, host, user, OFF, OFF)) != CONNECT_OK) {
+        Xsj3cWarning("Failed to connect first server. try to second server");
+        if ((Xsj3cOpen(buf, host2, user, OFF, ON)) != CONNECT_OK) {
+            Xsj3cError("Failed to connect seconON server.");
+        }
+    }
+}
+
+/*
+ * Xsj3cClose()
+ *  Disconnect to sj3serv.
+ */
+void
+Xsj3cClose(buf, force)
+    Xsj3cBuf    buf;
+    int         force;
+{
+    int         value;
+
+    if (connected[buf->server]) {
+        if ((value = serverIF[buf->server].func[FUNC_CLOSE]())
+                != SJ3_NORMAL_END && !force) {
+            _Xsj3cCloseError(value);
+        }
+        connected[buf->server] = 0;
+    }
+}
+
+/*
+ * _Xsj3cOpenError()
+ *  Print error messages for connecting to sj3serv.
+ */
+static void
+_Xsj3cOpenError(error)
+    int error;
+{
+    switch (error) {
+        case SJ3_SERVER_DEAD:
+            Xsj3cWarning("sj3_open: server died in connecting");
+            break;
+        case SJ3_CONNECT_ERROR:
+            Xsj3cWarning("sj3_open: connected to server error");
+            break;
+        case SJ3_ALREADY_CONNECTED:
+            Xsj3cWarning("sj3_open: already connected to server");
+            break;
+        case SJ3_CANNOT_OPEN_MDICT:
+            Xsj3cWarning("sj3_open: can't open main dictionaries");
+            break;
+        case SJ3_CANNOT_OPEN_UDICT:
+            Xsj3cWarning("sj3_open: can't open user dictionaries");
+            break;
+        case SJ3_CANNOT_OPEN_STUDY:
+            Xsj3cWarning("sj3_open: can't open files for study");
+            break;
+        case SJ3_CANNOT_MAKE_UDIR:
+            Xsj3cWarning("sj3_open: can't make directries for user");
+            break;
+        case SJ3_CANNOT_MAKE_UDICT:
+            Xsj3cWarning("sj3_open: can't make user dictionaries");
+            break;
+        case SJ3_CANNOT_MAKE_STUDY:
+            Xsj3cWarning("sj3_open: can't make files for study");
+            break;
+        default:
+            Xsj3cWarning("sj3_open: unknown error");
+            break;
+    }
+}
+
+/*
+ * _Xsj3cCloseError()
+ *  Print error messages for disconnecting to sj3serv.
+ */
+static void
+_Xsj3cCloseError(error)
+    int error;
+{
+    switch (error) {
+        case SJ3_SERVER_DEAD:
+            Xsj3cWarning("sj3_close: server died in disconnecting");
+            break;
+        case SJ3_DISCONNECT_ERROR:
+            Xsj3cWarning("sj3_close: server internal error");
+            break;
+        case SJ3_NOT_CONNECTED:
+            Xsj3cWarning("sj3_close: already disconnected to server");
+            break;
+        case SJ3_NOT_OPENED_MDICT:
+            Xsj3cWarning("sj3_close: main dictionaries are not opend");
+            break;
+        case SJ3_NOT_OPENED_UDICT:
+            Xsj3cWarning("sj3_close: user dictionaries are not opend");
+            break;
+        case SJ3_NOT_OPENED_STUDY:
+            Xsj3cWarning("sj3_close: files for study are not opend");
+            break;
+        case SJ3_CLOSE_MDICT_ERROR:
+            Xsj3cWarning("sj3_close: can't close main dictionaries");
+            break;
+        case SJ3_CLOSE_UDICT_ERROR:
+            Xsj3cWarning("sj3_close: can't close user dictionaries");
+            break;
+        case SJ3_CLOSE_STUDY_ERROR:
+            Xsj3cWarning("sj3_close: can't close files for study");
+            break;
+        default:
+            Xsj3cWarning("sj3_close: unknown error");
+            break;
+    }
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/Xsj3clib/conv.c	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,1365 @@
+#ifndef lint
+static char *rcsid = "$Id: conv.c,v 2.12 1993/09/21 09:43:15 nao Exp $";
+#endif
+/*
+ * Copyright 1991 Sony Corporation
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Sony not be used in advertising or
+ * publicity pertaining to distribution of the software without specific,
+ * written prior permission.  Sony makes no representations about the
+ * suitability of this software for any purpose.  It is provided "as is"
+ * without express or implied warranty.
+ *
+ * SONY DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL SONY
+ * BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
+ * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN 
+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+/*
+ * Author: Naoshi Suzuki, SONY Corporation.  (nao@sm.sony.co.jp)
+ */
+
+#include <ctype.h>
+#include "common.h"
+#include "sj3ctype.h"
+#include "util.h"
+#include "segment.h"
+#include "mode.h"
+#include "func.h"
+
+extern Xsj3cCVServerIF      serverIF[SERVER_NUM];
+
+unsigned char              *Xsj3cGetPreeditArea();
+Xsj3cEvent                  Xsj3cKeyConv();
+
+int                         _Xsj3cRomaConv();
+int                         _Xsj3cKanaConv();
+
+static Xsj3cEvent           _Xsj3cStrConv();
+static Xsj3cEvent           _Xsj3cCtrlConv();
+static Xsj3cEvent           _Xsj3cThrough();
+static Xsj3cEvent           _Xsj3cDirect();
+static int                  _Xsj3cCodeConv();
+
+/*
+ *  Xsj3cGetPreeditArea()
+ * Get area for pre-edit string.
+ */
+unsigned char *
+Xsj3cGetPreeditArea(buf, len)
+    register Xsj3cBuf       buf;
+    register int           *len;
+{
+    register Xsj3cSeg       seg;
+
+    if (buf->convmode == DictModeMask) {
+        /* $B<-=q%b!<%I$N>l9g$O<-=qFI$_MQ$NF~NO$r9T$&(B */
+        seg = buf->dict->seg;
+    } else if (buf->convmode != SelectModeMask) {
+        if (buf->input[buf->curseg]
+                && buf->input[buf->curseg]->status == SEG_CONVED) {
+            /* $B8=J8@a$,JQ49:Q$_$N>l9g(B                   */
+
+            buf->convmode = ConvedModeMask;
+            switch (buf->flushiconv) {
+            case ON:
+                /* FlushInConversion on $B$N;~$O8=:_JQ49Cf$N(B  */
+                /* $BJ8$r3NDj$7$F?75,$NJ8$NF~NO$r9T$&(B         */
+
+                if (!buf->backup) {
+                    if ((buf->backup = (Xsj3cSeg *)calloc(BUNBUFSIZ,
+                            sizeof(Xsj3cSeg))) == NULL) {
+                        Xsj3cError("Cannot allocate for backup buffers");
+                    }
+                }
+                if (seg = buf->backup[0]) {
+                    *seg->str = '\0';
+                    seg->sp = seg->str;
+                    *seg->oldstr = '\0';
+                    seg->oldlen = 0;
+                    seg->n_roma = 0;
+                    seg->n_kana = -1;
+                } else
+                    seg = buf->backup[0] = (Xsj3cSeg)Xsj3cCreateSegment(buf);
+                break;
+            case EDIT:
+                /* FlushInConversion edit $B$N;~$O%+%l%s%H(B    */
+                /* $BJ8@a$X$NF~NO$r9T$&(B                       */
+
+                if (!(seg = buf->input[buf->curseg])) {
+                    seg = buf->input[buf->curseg]
+                            = (Xsj3cSeg)Xsj3cCreateSegment(buf);
+                } else {
+                    *seg->str = '\0';
+                    seg->sp = seg->str;
+                    *seg->oldstr = '\0';
+                    seg->oldlen = 0;
+                    seg->n_roma = 0;
+                    seg->n_kana = -1;
+                }
+                break;
+            case OFF:
+            case NONE:
+            default:
+                /* FlushInConversion none/off $B$N>l9g!"?7$?$J(B*/
+                /* $BJ8@a$NFI$_J8;zNs$NF~NO$r9T$&(B             */
+
+                if (seg = buf->input[buf->segnum]) {
+                    Xsj3cClearSegment(buf, buf->input[buf->segnum]);
+                } else {
+                    seg = buf->input[buf->segnum]
+                            = (Xsj3cSeg)Xsj3cCreateSegment(buf);
+                }
+                break;
+            }
+        } else if (buf->segnum > 0) {
+            /* $B8=J8@a$,L$JQ49$GF~NOJ8;z$,$"$k>l9g(B   */
+
+            buf->convmode = InputModeMask;
+            if (buf->input[buf->curseg]
+                    && (buf->input[buf->curseg]->edit & SEG_NOEDIT)) {
+                /* $BJ8;zF~NO$r5v$5$l$F$$$J$$J8@a$N>l9g(B */
+                switch (buf->flushiconv) {
+                case ON:
+                    /* FlushInConversion on $B$N;~$O8=:_JQ49Cf$N(B  */
+                    /* $BJ8$r3NDj$7$F?75,$NJ8$NF~NO$r9T$&(B         */
+
+                    if (!buf->backup) {
+                        if ((buf->backup = (Xsj3cSeg *)calloc(BUNBUFSIZ,
+                                sizeof(Xsj3cSeg))) == NULL) {
+                            Xsj3cError("Cannot allocate for backup buffers");
+                        }
+                    }
+                    if (seg = buf->backup[0]) {
+                        *seg->str = '\0';
+                        seg->sp = seg->str;
+                        *seg->oldstr = '\0';
+                        seg->oldlen = 0;
+                        seg->n_roma = 0;
+                        seg->n_kana = -1;
+                    } else
+                        seg = buf->backup[0]
+                                = (Xsj3cSeg)Xsj3cCreateSegment(buf);
+                    break;
+                case EDIT:
+                    if (!(seg = buf->input[buf->curseg]))
+                        seg = buf->input[buf->curseg]
+                                = (Xsj3cSeg)Xsj3cCreateSegment(buf);
+                    break;
+                case OFF:
+                case NONE:
+                default:
+                    if (seg = buf->input[buf->segnum]) {
+                        Xsj3cClearSegment(buf, buf->input[buf->segnum]);
+                    } else 
+                        seg = buf->input[buf->segnum]
+                                = (Xsj3cSeg)Xsj3cCreateSegment(buf);
+                }
+            } else {
+                /* $B%+%l%s%HJ8@a$X$NF~NO$r9T$&(B               */
+
+                if (!(seg = buf->input[buf->curseg]))
+                    seg = buf->input[buf->curseg]
+                            = (Xsj3cSeg)Xsj3cCreateSegment(buf);
+            }
+        } else {
+            /* $BF~NOJ8;z$,$J$$>l9g(B   */
+
+            buf->convmode = NoInputModeMask;
+            /* New segment(first segment)   */
+            if (seg = buf->input[buf->curseg])
+                Xsj3cClearSegment(buf, buf->input[buf->curseg]);
+            else 
+                seg = buf->input[buf->curseg]
+                        = (Xsj3cSeg)Xsj3cCreateSegment(buf);
+        }
+    } else {
+        /* SelectMode   */
+        switch (buf->selectstatus) {
+        case SELECT_CAND:
+            /* $B8uJdA*Br$N>l9g(B */
+
+            switch (buf->flushsconv) {
+            case ON:
+                /* FlushSelectConversion on $B$N;~$O8=:_JQ49(B  */
+                /* $BCf$NJ8$r3NDj$7$F?75,$NJ8$NF~NO$r9T$&(B     */
+
+                if (!buf->backup) {
+                    if ((buf->backup = (Xsj3cSeg *)calloc(BUNBUFSIZ,
+                            sizeof(Xsj3cSeg))) == NULL) {
+                        Xsj3cError("Cannot allocate for backup buffers");
+                    }
+                } 
+                if (seg = buf->backup[0]) {
+                    *seg->str = '\0';
+                    seg->sp = seg->str;
+                    *seg->oldstr = '\0';
+                    seg->oldlen = 0;
+                    seg->n_roma = 0;
+                    seg->n_kana = -1;
+                } else {
+                    seg = buf->backup[0] = (Xsj3cSeg)Xsj3cCreateSegment(buf);
+                }
+                break;
+            case EDIT:
+                /* FlushSelectConversion edit $B$N>l9g!"L5(B    */
+                /* $BJQ49>uBV$K$7$F%+%l%s%HJ8@a$X$NF~NO$r9T$&(B */
+
+                if (!(seg = buf->input[buf->curseg])) {
+                    seg = buf->input[buf->curseg]
+                            = (Xsj3cSeg)Xsj3cCreateSegment(buf);
+                } else {
+                    *seg->str = '\0';
+                    seg->sp = seg->str;
+                    *seg->oldstr = '\0';
+                    seg->oldlen = 0;
+                    seg->n_roma = 0;
+                    seg->n_kana = -1;
+                }
+                break;
+            case OFF:
+            case NONE:
+            default:
+                /* FlushSelectConversion none/off $B$N>l9g!"(B  */
+                /* $B?7$?$JJ8@a$NFI$_J8;zNs$NF~NO$r9T$&(B       */
+
+                if (seg = buf->input[buf->segnum]) {
+                    Xsj3cClearSegment(buf, buf->input[buf->segnum]);
+                } else {
+                    seg = buf->input[buf->segnum]
+                            = (Xsj3cSeg)Xsj3cCreateSegment(buf);
+                }
+                break;
+            }
+            break;
+        case SELECT_HINSI:
+            /* $BIJ;lA*Br$N>l9g(B */
+
+            seg = buf->dict->seg;
+            break;
+        case SELECT_SYMBOL: 
+        default: 
+            /* $B5-9fA*Br$N>l9g(B */
+
+            if (seg = buf->input[buf->segnum]) {
+                Xsj3cClearSegment(buf, buf->input[buf->segnum]);
+            } else {
+                seg = buf->input[buf->segnum]
+                        = (Xsj3cSeg)Xsj3cCreateSegment(buf);
+            }
+            break;
+        }
+    }
+    *len = RBUFSIZ - (seg->sp - seg->str);
+    buf->current = seg;
+    return (seg->sp);
+}
+
+#define IsKanaKey(ks)   ((unsigned)(ks) < 0xff00 && ((unsigned)(ks) & 0x0400))
+#define IsLatin1Key(ks) ((unsigned)(ks) < 0x0100)
+
+/*
+ *  Xsj3cKeyConv()
+ * Convert string or keysym and do function.
+ */
+Xsj3cEvent
+Xsj3cKeyConv(buf, n, mod, ks)
+    Xsj3cBuf                buf;
+    int                     n;
+    unsigned long           mod;
+    KeySym                  ks;
+{
+    register Xsj3cKeyTable *keytp;
+    Xsj3cSeg                seg = buf->current;
+    Xsj3cEvent              ret = KEY_NULL;
+    unsigned char          *tmpsp;
+    register int            i,  doflg;
+
+    /* KeySym/Modifier$B!"8=:_$NJQ49%b!<%I$H3F%U%!%s%/%7%g%s(B  */
+    /* $B$NBP1~%F!<%V%k$r%5!<%A$7$F9gCW$9$k$b$N$,$"$l$P%U%!%s(B */
+    /* $B%/%7%g%s$r<B9T$9$k!#(B                                 */
+    for (keytp = buf->key, doflg = 0; keytp != NULL; keytp = keytp->next) {
+                                    /* KeySym */
+        if (ks == keytp->ksym &&
+                                    /* Modifier Key */
+                (keytp->modmask & ~AllModeMask) == mod &&
+                                    /* Conversion mode */
+                (keytp->modmask & buf->convmode) == buf->convmode) {
+                                    /* Do function  */
+            doflg++;
+
+            /* .key.func $B$NBh#3%U%#!<%k%I$,(B off $B$N;~$O%U%!%s%/%7%g%s(B    */
+            /* $B$N$_<B9T$7!"(Bnone $B$N;~$O(B .InputSameTime $B$N;XDj$K0MB8$9$k(B  */
+            /* InputSameTime off $B$N;~$O%U%!%s%/%7%g%s<B9T$9$k(B           */
+            if (!buf->inputsame) {
+                if (keytp->inputsame != ON)
+                    goto dofunc;
+            } else {
+                if (!keytp->inputsame)
+                    goto dofunc;
+            }
+            break;
+        }
+    }
+
+    /* LookupString $B$N7k2L$O(B NULL terminate */
+    /* $B$7$F$$$J$$$N$G(B NULL terminate $B$5$;$k(B */
+    tmpsp = seg->sp;
+    i = n;
+    while(i--) {
+        if (iscntrl(*tmpsp)) {
+            if (buf->throughflg == QUOTE) {
+                ret |= KEY_CONTROL;
+                tmpsp++;
+                continue;
+            }
+            /* ControlSameTime off $B$N>l9g$O(B   */
+            /* $B%U%!%s%/%7%g%s$N$_<B9T(B         */
+            if (doflg && !buf->cntrlsame)
+                goto dofunc;
+            else {
+                ret = _Xsj3cCtrlConv(buf, *tmpsp);
+                if (buf->cntrlsame)
+                    goto dofunc;
+                else
+                    return (ret);
+            }
+        }
+        tmpsp++;
+    }
+    *tmpsp = '\0';
+
+    if (!n || !(IsKanaKey(ks)||(IsLatin1Key(ks)))) {
+        /* $B%F%-%9%H$KJQ49$G$-$J$+$C$?>l9g$O(B */
+        /* $B%U%!%s%/%7%g%s$N$_<B9T(B           */
+        goto dofunc;
+    }
+
+    switch (buf->convmode) {
+    case SelectModeMask:
+
+        switch (buf->selectstatus) {
+        case SELECT_CAND:
+            /* $B8uJdA*Br$N>l9g(B */
+
+            switch (buf->flushsconv) {
+            case ON:
+                ret |= (KEY_SELECT_END|KEY_TEXT_CHANGE);
+                for (i = 1; i < buf->backsegnum + 1; i++) {
+                    Xsj3cFreeSegment(buf->backup[i]);
+                    buf->backup[i] = NULL;
+                }
+                seg->yomi[0] = '\0';
+                seg->disp[0] = '\0';
+                seg->num = 0;
+                seg->cur = 0;
+                seg->dnum = 0;
+                seg->status = SEG_NOCONV;
+                seg->cursegmode = buf->inputmode;
+                seg->change = OFF;
+                seg->edit = SEG_NOEDIT;
+                bzero(&seg->dcid, sizeof(seg->dcid));
+                buf->backsegnum = 1;
+                ret |= KEY_TEXT_FLUSH;
+                if (buf->dispmodechange) {
+                    buf->dispmode = buf->inputmode;
+                    ret |= KEY_MODE_CHANGE;
+                }
+                break;
+            case EDIT:
+                ret |= (KEY_SELECT_END|KEY_TEXT_CHANGE);
+                if (buf->curseg == buf->segnum)
+                    buf->segnum++;
+                else {
+                    ret |= _Xsj3cUnConvSeg(buf, ONE, buf->editcurlast);
+                    _Xsj3cStoreYomi(buf, buf->input[buf->curseg], 0);
+                }
+                break;
+            case OFF:
+                ret |= (KEY_SELECT_END|KEY_TEXT_CHANGE);
+                if (buf->dispmodechange) {
+                    buf->dispmode = buf->convedsegnum ? MODE_EDIT :
+                            buf->inputmode;
+                    ret |= KEY_MODE_CHANGE;
+                }
+                break;
+            case NONE:
+            default:
+                goto dofunc;
+            }
+            break;
+        case SELECT_HINSI:
+            /* $BIJ;lA*Br$N>l9g(B */
+
+            ret |= (KEY_DICT_CHANGE|KEY_SELECT_ABORT);
+            buf->dict->status = DICT_INPUT;
+            if (buf->dispmodechange) {
+                buf->dispmode =
+                    (buf->dict->mode == REG_STATE ? MODE_TOROKU : MODE_SYOUKYO);
+                ret |= KEY_MODE_CHANGE;
+            }
+            break;
+        case SELECT_SYMBOL:
+        default:
+            /* $B5-9fA*Br$N>l9g(B */
+            goto dofunc;
+        }
+        break;
+    case DictModeMask:
+        if (buf->dict->status != DICT_INPUT) {
+            /* $B<-=qEPO?!?>C5n%b!<%I$G$h$_F~NO;~$G$J$$(B   */
+            /* $B$H$-$O$rJV$7$F$J$K$b$7$J$$!#(B       */
+            goto dofunc;
+        }
+        ret |= KEY_DICT_CHANGE;
+        seg->edit = SEG_EDIT;
+        ret = _Xsj3cStrConv(buf, seg, ks, n, ret);
+        _Xsj3cFlushDictMsg(buf);
+        goto dofunc;
+    case ConvedModeMask:
+        ret |= KEY_TEXT_CHANGE;
+        if (buf->candidate)
+            Xsj3cEndCandidate(buf, ON);
+        switch (buf->flushiconv) {
+        case ON:
+            for (i = 1; i < buf->backsegnum + 1; i++) {
+                Xsj3cFreeSegment(buf->backup[i]);
+                buf->backup[i] = NULL;
+            }
+            seg->yomi[0] = '\0';
+            seg->disp[0] = '\0';
+            seg->num = 0;
+            seg->cur = 0;
+            seg->dnum = 0;
+            seg->status = SEG_NOCONV;
+            seg->cursegmode = buf->inputmode;
+            seg->change = OFF;
+            seg->edit = SEG_NOEDIT;
+            bzero(&seg->dcid, sizeof(seg->dcid));
+            buf->backsegnum = 1;
+            ret |= KEY_TEXT_FLUSH;
+            if (buf->dispmodechange) {
+                buf->dispmode = buf->inputmode;
+                ret |= KEY_MODE_CHANGE;
+            }
+            break;
+        case OFF:
+            buf->curseg = buf->segnum;
+            buf->segnum++;
+            if (buf->dispmodechange) {
+                buf->dispmode = 
+                    (buf->convedsegnum ? MODE_EDIT : buf->inputmode);
+                ret |= KEY_MODE_CHANGE;
+            }
+            break;
+        case EDIT:
+            if (buf->curseg == buf->segnum)
+                buf->segnum++;
+            else {
+                ret |= _Xsj3cUnConvSeg(buf, ONE, buf->editcurlast);
+                _Xsj3cStoreYomi(buf, seg, 0);
+            }
+            break;
+        case NONE:
+        default:
+            goto dofunc;
+        }
+        break;
+    case InputModeMask:
+        ret |= KEY_TEXT_CHANGE;
+        if (buf->input[buf->curseg]->edit & SEG_NOEDIT) {
+            switch (buf->flushiconv) {
+            case ON:
+                for (i = 1; i < buf->backsegnum + 1; i++) {
+                    Xsj3cFreeSegment(buf->backup[i]);
+                    buf->backup[i] = NULL;
+                }
+                seg->yomi[0] = '\0';
+                seg->disp[0] = '\0';
+                seg->num = 0;
+                seg->cur = 0;
+                seg->dnum = 0;
+                seg->status = SEG_NOCONV;
+                seg->cursegmode = buf->inputmode;
+                seg->change = OFF;
+                seg->edit = SEG_NOEDIT;
+                bzero(&seg->dcid, sizeof(seg->dcid));
+                buf->backsegnum = 1;
+                ret |= KEY_TEXT_FLUSH;
+                break;
+            case OFF:
+                buf->curseg = buf->segnum;
+                buf->segnum++;
+                if (buf->dispmodechange) {
+                    buf->dispmode = buf->convedsegnum ? MODE_EDIT :
+                            buf->inputmode;
+                    ret |= KEY_MODE_CHANGE;
+                }
+                break;
+            case EDIT:
+                if (buf->curseg == buf->segnum)
+                    buf->segnum++;
+                break;
+            case NONE:
+            default:
+                goto dofunc;
+            }
+        } else if (buf->curseg == buf->segnum)
+            buf->segnum++;
+        break;
+    case NoInputModeMask:
+        if (buf->curseg == buf->segnum)
+            buf->segnum++;
+        if (buf->throughflg == THROUGH) {
+            ret |= _Xsj3cThrough(buf, seg, n);
+            buf->throughflg = OFF;
+            goto dofunc;
+        }
+        ret |= KEY_TEXT_CHANGE;
+        break;
+    default:
+        Xsj3cWarning ("Unknown conversion mode");
+        goto dofunc;
+    }
+
+    seg->edit = SEG_EDIT;
+    ret = _Xsj3cStrConv(buf, seg, ks, n, ret);
+
+dofunc:
+    if (doflg && !(ret & KEY_TEXT_FLUSH)) {
+        ret |= ((*(keytp->func))(buf));
+        if (!buf->cntrlsame)
+            ret |= KEY_FUNC;
+    }
+    return (ret);
+}
+
+/*
+ *  _Xsj3cStrConv()
+ *   Convert pre-edit strings and store results to yomi/disp buffer.
+ */
+static Xsj3cEvent
+_Xsj3cStrConv(buf, seg, ks, n, ret)
+    Xsj3cBuf                buf;
+    Xsj3cSeg                seg;
+    KeySym                  ks;
+    int                     n;
+    Xsj3cEvent              ret;
+{
+    register unsigned char *tmpsp;
+    unsigned char           tmp1[YBUFSIZ];
+    unsigned char           tmp2[YBUFSIZ];
+    unsigned char           kanabuf[YBUFSIZ];
+    wchar                   wcs[RBUFSIZ];
+    register int            i;
+    int                     change_pos;
+    int                     change_roma = 0;
+
+    if (buf->throughflg == QUOTE) {
+        ret |= _Xsj3cDirect(buf, seg, n);
+        buf->throughflg = OFF;
+        return (ret);
+    }
+    if (seg->num > seg->size - YBUFSIZ)
+        Xsj3cResizeSegment(seg, seg->size + KANABUFSIZ);
+
+    switch (buf->inputmode) {
+    case MODE_HIRA:
+    case MODE_ZKATA:
+    case MODE_HKATA:
+        /* $B$R$i$,$J!?A43Q%+%?%+%J!?H>3Q%+%?%+%JF~NO%b!<%I$N>l9g(B */
+        if (IsKanaKey(ks) || (IsLatin1Key(ks) && buf->kanaonly)) {
+
+            /* $B$+$JF~NO$N>l9g(B */
+            int             len;
+
+            if (seg->n_roma) {
+
+                /* $B$+$J%P%C%U%!(B(seg->str)$B$K%m!<%^;zF~NO;~$N(B  */
+                /* $BJ8;zNs$,;D$C$F$$$k>l9g$O$=$l$r:o=|$9$k(B   */
+                i = n;
+                tmpsp = seg->sp;
+                while (i--) {
+                    *(tmpsp - seg->n_roma) = *tmpsp;
+                    tmpsp++;
+                }
+                *(tmpsp - seg->n_roma) = '\0';
+                seg->sp = seg->sp - seg->n_roma;
+                seg->n_roma = 0;
+            }
+            if (buf->inputmode == MODE_HKATA) {
+
+                /* $BH>3Q%+%?%+%JF~NO%b!<%I$N$H$-$O(B       */
+                /* $BJQ49$r9T$o$J$$$GFI$_%P%C%U%!$K%3%T!<(B */
+                if (IsKanaKey(ks))
+                    strcpy(tmp1, seg->sp);
+                else
+                    _Xsj3cHAlphaToHKata(buf, tmp1, seg->sp);
+                seg->sp = seg->str;
+                *seg->oldstr= '\0';
+                seg->n_kana = -1;
+                change_pos = seg->cur;
+                _Xsj3cInsertChar(buf, seg, tmp1, strlen(tmp1));
+
+            } else {
+                /* $B$R$i$,$J!?A43Q%+%?%+%JF~NO%b!<%I$N;~$OH>3Q(B   */
+                /* $B%+%?%+%J"*$R$i$,$J!?A43Q%+%?%+%JJQ49$r9T$&(B   */
+                if (IsLatin1Key(ks)) {
+                    strcpy(tmp2, seg->sp);
+                    _Xsj3cHAlphaToHKata(buf, seg->sp, tmp2);
+                }
+                if ((seg->value = _Xsj3cKanaConv(buf, seg, seg->str,
+                        tmp1, buf->inputmode)) > 0) {
+
+                    /* $BH>3Q%+%?%+%J"*$R$i$,$JJQ49$,@.8y$7$?>l9g(B */
+                    /* $BBy2;!?H>By2;$N>l9g(B                       */
+                    seg->sp = seg->str;
+                    if (seg->n_kana > 0) {
+                        _Xsj3cExtractChar(buf, seg, tmp2, seg->n_kana);
+                        strcpy(seg->oldstr, seg->str);
+                        tmpsp = seg->oldstr;
+                        while(*tmpsp != '\0')
+                            tmpsp++;
+                        *(tmpsp - seg->n_kana) = '\0';
+                    } else {
+                        *seg->oldstr = '\0';
+                    }
+                    seg->n_kana = 0;
+                } else if (seg->value == 0) {
+
+                    /* $BH>3Q%+%?%+%J"*$R$i$,$J!?A43Q%+%?%+%J(B */
+                    /* $BJQ49$N7k2L$,ITDj$N>l9g(B               */
+                    if (seg->n_kana > 0)
+                        _Xsj3cExtractChar(buf, seg, tmp2, seg->n_kana);
+                    tmpsp = seg->sp + n - 1;
+                    seg->sp = seg->str;
+                    *seg->sp = *tmpsp;
+                    *(++seg->sp) = '\0';
+                    seg->n_kana = 1;
+                    *seg->oldstr = '\0';
+                } else {
+
+                    /* $BH>3Q%+%?%+%J"*$R$i$,$JJQ49$,@.8y$7$?>l9g(B */
+                    /* $BBy2;!?H>By2;$G$J$$>l9g(B                   */
+                    if (seg->n_kana > 0)
+                        _Xsj3cExtractChar(buf, seg, tmp2, seg->n_kana);
+                    seg->sp = seg->str;
+                    *seg->oldstr = '\0';
+                    seg->n_kana = 0;
+                }
+                change_pos = seg->cur;
+                len = _Xsj3cmPStowPS(buf, wcs, tmp1);
+                _Xsj3cInsertWchar(seg, wcs, len);
+            }
+            seg->n_roma = 0;
+
+        } else if (IsLatin1Key(ks)) {
+
+            /* $B%m!<%^;zF~NO$N>l9g(B */
+
+            if (seg->n_kana > 0) {
+
+                /* $B%m!<%^;z%P%C%U%!(B(seg->str)$B$K$+$JF~NO;~$N(B */
+                /* $BJ8;zNs$,;D$C$F$$$k>l9g$O$=$l$r:o=|$9$k(B */
+                i = n;
+                tmpsp = seg->sp;
+                while (i--) {
+                    *(tmpsp - seg->n_kana) = *tmpsp;
+                    tmpsp++;
+                }
+                *(tmpsp - seg->n_kana) = '\0';
+                seg->sp = seg->sp - seg->n_kana;
+                seg->n_kana = -1;
+            }
+
+            /* $BF~NO%b!<%I$K4X78$J$/$+$JJQ49$r9T$&(B  */
+
+            if ((seg->value = _Xsj3cRomaConv(buf->rktable, 
+                        seg->str, kanabuf)) > 0) {
+
+                /* ROMA->$B$+$J(B $BJQ49$,@.8y$7$?>l9g(B    */
+                if (buf->alphaconv) {
+                    /* AlphabetConversion $B%j%=!<%9$,(B on   */
+                    /* $B$@$C$?$iA43Q$rH>3Q$KJQ49$9$k(B     */
+
+                    _Xsj3cExtractChar(buf, seg, tmp1, seg->n_roma);
+                    _Xsj3cZAlphaToHAlpha(buf, seg->oldstr, tmp1);
+                } else {
+                    _Xsj3cExtractChar(buf, seg, seg->oldstr, seg->n_roma);
+                }
+                change_pos = seg->cur;
+                if (buf->inputmode == MODE_HIRA) {
+
+                    /* $B$R$i$,$JF~NO%b!<%I$N$H$-$O$=$N$^$^(B */
+                    /* $BFI$_%P%C%U%!$K%3%T!<(B  */
+                    seg->oldlen = _Xsj3cmPStowPS(buf, wcs, kanabuf);
+                } else if (buf->inputmode == MODE_ZKATA) {
+
+                    /* $BA43Q%+%?%+%JF~NO%b!<%I$N$H$-$O(B */
+                    /* $B$R$i$,$J$rA43Q%+%?%+%J$KJQ49(B    */
+                    _Xsj3cHiraToZKata(buf, tmp1, kanabuf);
+                    seg->oldlen = _Xsj3cmPStowPS(buf, wcs, tmp1);
+                } else {
+
+                    /* $BH>3Q%+%?%+%JF~NO%b!<%I$N;~$O$R$i$,$J(B */
+                    /* $B!?A43Q%+%?%+%J$rH>3Q%+%?%+%J$KJQ49(B   */
+                    _Xsj3cZKanaToHKata(buf, tmp1, kanabuf);
+                    seg->oldlen = _Xsj3cmPStowPS(buf, wcs, tmp1);
+                }
+                _Xsj3cInsertWchar(seg, wcs, seg->oldlen);
+                seg->n_roma = 0;
+
+                /* $BJQ49$G$-$J$$J8;z$,%m!<%^;z%P%C%U%!$K;D$C$F(B   */
+                /* $B$$$?$i!JNc!V$C!W$KJQ49$5$l$k>l9gEy!K(B         */
+                /* $B$+$J%P%C%U%!$N:G8e$K$=$NJ8;z$rIUM?$9$k(B       */
+                if (*seg->str != '\0') {
+                    _Xsj3cInsertChar(buf, seg, seg->str, strlen(seg->str));
+                    seg->sp = seg->str;
+                    while (*seg->sp != '\0') {
+                        seg->sp++;
+                        seg->n_roma++;
+                    }
+                    change_roma = seg->n_roma;
+                } else {
+                    seg->sp = seg->str;
+                }
+
+            } else if (seg->value == 0) {
+
+                /* ROMA$B"*$+$JJQ49$N7k2L$,ITDj$N>l9g(B */
+                change_pos = seg->cur;
+                _Xsj3cInsertChar(buf, seg, seg->sp, n);
+                i = n;
+                while (i--) {
+                    seg->sp++;
+                    seg->n_roma++;
+                }
+                change_roma = n;
+
+            } else {
+                /* ROMA$B"*$+$J(B $BJQ49$N7k2L$,IT@.8y$N>l9g(B  */
+                /* $B:G8e$NF~NO$,%m!<%^$+$JJQ49$N8uJd$H(B   */
+                /* $B$7$FM-8z$+$I$&$+D4$Y$k(B               */
+
+                change_pos = seg->cur;
+                if ((seg->value = _Xsj3cRomaConv(buf->rktable, seg->sp,
+                        kanabuf)) > 0) {
+                    /* $B:G8e$NF~NO$,%m!<%^$+$JJQ49$N8uJd$H$7$F(B   */
+                    /* $BM-8z$J>l9g(B                               */
+
+                    if (buf->inputmode == MODE_HIRA) {
+
+                        /* $B$R$i$,$JF~NO%b!<%I$N$H$-$O$=$N$^$^(B */
+                        /* $BFI$_%P%C%U%!$K%3%T!<(B  */
+                        seg->oldlen = _Xsj3cmPStowPS(buf, wcs, kanabuf);
+                    } else if (buf->inputmode == MODE_ZKATA) {
+
+                        /* $BA43Q%+%?%+%JF~NO%b!<%I$N$H$-$O(B */
+                        /* $B$R$i$,$J$rA43Q%+%?%+%J$KJQ49(B    */
+                        _Xsj3cHiraToZKata(buf, tmp1, kanabuf);
+                        seg->oldlen = _Xsj3cmPStowPS(buf, wcs, tmp1);
+                    } else {
+
+                        /* $BH>3Q%+%?%+%JF~NO%b!<%I$N;~$O$R$i$,$J(B */
+                        /* $B!?A43Q%+%?%+%J$rH>3Q%+%?%+%J$KJQ49(B   */
+                        _Xsj3cZKanaToHKata(buf, tmp1, kanabuf);
+                        seg->oldlen = _Xsj3cmPStowPS(buf, wcs, tmp1);
+                    }
+                    _Xsj3cInsertWchar(seg, wcs, seg->oldlen);
+                    seg->n_roma = 0;
+
+                    /* $BJQ49$G$-$J$$J8;z$,%m!<%^;z%P%C%U%!$K;D$C$F(B   */
+                    /* $B$$$?$i!JNc!V$C!W$KJQ49$5$l$k>l9gEy!K(B         */
+                    /* $B$+$J%P%C%U%!$N:G8e$K$=$NJ8;z$rIUM?$9$k(B       */
+                    if (*seg->str != '\0') {
+                        _Xsj3cInsertChar(buf, seg, seg->str, strlen(seg->str));
+                        seg->sp = seg->str;
+                        while (*seg->sp != '\0') {
+                            seg->sp++;
+                            seg->n_roma++;
+                        }
+                        change_roma = seg->n_roma;
+                    } else {
+                        seg->sp = seg->str;
+                    }
+                } else if (seg->value == 0) {
+                    /* $B%m!<%^$+$JJQ49$N8uJd$H$7$FL$Dj$N>l9g(B */
+                    /* $B:G8e$NF~NOJ8;z$r%m!<%^"*$+$JJQ49MQ$N(B */
+                    /* $B%P%C%U%!(B(seg->str)$B$K;D$9(B             */
+
+                    change_pos = seg->cur;
+                    _Xsj3cInsertChar(buf, seg, seg->sp, n);
+                    *seg->oldstr = '\0';
+                    tmpsp = seg->str;
+                    *seg->str = *seg->sp;
+                    seg->sp = seg->str;
+                    i = n;
+                    while (i--)
+                        *tmpsp++ = *seg->sp++;
+                    *tmpsp = '\0';
+                    seg->n_roma = n;
+                    change_roma = seg->n_roma;
+                } else {
+                    /* $B%m!<%^$+$JJQ49$N8uJd$H$7$FL58z$J>l9g(B */
+
+                    _Xsj3cInsertChar(buf, seg, seg->sp, n);
+                    *seg->oldstr = '\0';
+                    seg->n_roma = 0;
+                    *seg->str = '\0';
+                    seg->sp = seg->str;
+
+                    /* rkbell $B%j%=!<%9$,(B on $B$K@_Dj$5$l$F(B    */
+                    /* $B$$$k>l9g%Y%k$rLD$i$9(B                 */
+                    if (buf->rkbell)
+                        ret |= KEY_BELL;
+                    change_roma = n;
+                }
+            }
+
+            /* AlphabetConversion $B%j%=!<%9$,(B on     */
+            /* $B$@$C$?$iH>3Q%m!<%^;z$rA43Q%m!<%^;z$KJQ49$9$k(B */
+            if (buf->alphaconv && buf->inputmode != MODE_HKATA
+                    && change_roma) {
+                _Xsj3cExtractChar(buf, seg, tmp1, change_roma);
+                _Xsj3cHAlphaToZKana(buf, tmp2, tmp1);
+                _Xsj3cInsertChar(buf, seg, tmp2, change_roma); 
+            } 
+            /* $B$+$JF~NO%b!<%I$G$J$$$H$-$O(B -1  */
+            seg->n_kana = -1;
+        } else {
+            return (KEY_NULL);
+        }
+        break;
+
+    case MODE_HALPHA:
+
+        /* $BH>3Q%"%k%U%!%Y%C%H(B $BF~NO%b!<%I$N>l9g(B */
+        if (IsKanaKey(ks)) 
+            return (KEY_BELL);
+        change_pos = seg->cur;
+        _Xsj3cInsertChar(buf, seg, seg->sp, n); 
+        seg->sp = seg->str;
+        seg->n_roma = 0;
+        seg->n_kana = -1;
+        break;
+
+    case MODE_ZALPHA:
+
+        /* $BA43Q%"%k%U%!%Y%C%H(B $BF~NO%b!<%I$N>l9g(B */
+        if (IsKanaKey(ks)) 
+            return (KEY_BELL);
+        _Xsj3cHAlphaToZAlpha(buf, tmp1, seg->sp);
+        seg->sp = seg->str;
+        change_pos = seg->cur;
+        _Xsj3cInsertChar(buf, seg, tmp1, n); 
+        seg->n_roma = 0;
+        seg->n_kana = -1;
+        break;
+
+    case MODE_SJIS:
+    case MODE_EUC:
+    case MODE_JIS:
+    case MODE_KUTEN:
+
+        /* $B%3!<%IF~NO%b!<%I$N>l9g(B */
+        tmpsp = seg->str;
+        while (*tmpsp != '\0') {
+            if (!isxdigit(*tmpsp)
+                || (buf->inputmode == MODE_KUTEN && !isdigit(*tmpsp)))
+                return (KEY_BELL);
+            tmpsp++;
+        }
+
+        /* $B%3!<%I"*$R$i$,$J!?A43Q%+%?%+%J!?5-9f!?4A;z$NJQ49$r9T$&(B */
+        if ((seg->value = _Xsj3cCodeConv(buf, seg->str, 
+                kanabuf, buf->inputmode)) > 0) {
+
+            /* $B%3!<%IJQ49$K@.8y$7$?>l9g(B */
+            if (buf->alphaconv) {
+                /* AlphabetConversion $B%j%=!<%9$,(B on $B$@$C$?$i(B */
+                /* $BA43Q?t;z$rH>3Q?t;z$KJQ49$9$k(B              */
+                _Xsj3cExtractChar(buf, seg, tmp1, seg->n_roma);
+                _Xsj3cZAlphaToHAlpha(buf, seg->oldstr, tmp1);
+            } else {
+                _Xsj3cExtractChar(buf, seg, seg->oldstr, seg->n_roma);
+            }
+            change_pos = seg->cur;
+            seg->oldlen = (strlen(kanabuf) + 1)/ sizeof(wchar);
+            _Xsj3cInsertChar(buf, seg, kanabuf, seg->oldlen);
+            seg->cursegmode = MODE_HIRA;
+            seg->n_roma = 0;
+            seg->sp = seg->str;
+        } else if (seg->value == 0) {
+
+            /* $B%3!<%IJQ49$N7k2L$,ITDj$N>l9g(B */
+            change_pos = seg->cur;
+            if (buf->alphaconv) {
+                /* AlphabetConversion $B%j%=!<%9$,(B on $B$@$C$?$i(B */
+                /* $BH>3Q?t;z$rA43Q?t;z$KJQ49$9$k(B              */
+                _Xsj3cHAlphaToZKana(buf, tmp1, seg->sp);
+                _Xsj3cInsertChar(buf, seg, tmp1, n); 
+            } else {
+                _Xsj3cInsertChar(buf, seg, seg->sp, n);
+            }
+            i = n;
+            while (i--) {
+                seg->n_roma++;
+                seg->sp++;
+            }
+        } else {
+
+            /* $B%3!<%IJQ49$N7k2L$,<:GT$N>l9g(B */
+            _Xsj3cExtractChar(buf, seg, tmp1, seg->n_roma);
+            change_pos = seg->cur;
+            seg->sp = seg->str;
+            seg->n_roma = 0;
+            if (seg->num == 0 && buf->convmode != DictModeMask) {
+                Xsj3cFreeSegment(seg);
+                seg = NULL;
+                buf->segnum--;
+                for (i = buf->curseg; i < buf->segnum; i++) {
+                    buf->input[i] = buf->input[i + 1];
+                }
+                buf->input[buf->segnum] = NULL;
+                return ret;
+            }
+            if (buf->rkbell)
+                ret |= KEY_BELL;
+        }
+        seg->n_kana = -1;
+        break;
+
+    default:
+        Xsj3cWarning("Illegal current mode");
+        return (KEY_BELL);
+    }
+
+    /* $BI=<(MQJ8;zNs$X%3%T!<$9$k(B        */
+    _Xsj3cStoreYomi(buf, seg, change_pos);
+    return ret;
+}
+
+/*
+ * _Xsj3cKanaConv()
+ *  Kana input mode dispatch routine.
+ */
+int
+_Xsj3cKanaConv(buf, seg, hkana, zkana, mode)
+    Xsj3cBuf        buf;
+    Xsj3cSeg        seg;
+    unsigned char  *hkana, *zkana;
+    Xsj3csMode      mode;
+{
+    register int             len,   zlen;
+    register wchar           s;
+
+    if (mode == MODE_HIRA) {
+        if (buf->alphaconv)
+            _Xsj3cHankakuToHira(buf, zkana, hkana);
+        else
+            _Xsj3cHKataToHira(buf, zkana, hkana);
+    } else {
+        if (buf->alphaconv)
+            _Xsj3cHankakuToZKata(buf, zkana, hkana);
+        else
+            _Xsj3cHKataToZKata(buf, zkana, hkana);
+    }
+    len = 0;
+    while (*hkana != '\0') {
+        hkana++;
+        len++;
+    }
+    if (isdakuon(*(hkana - 1))) {
+        return 0;
+    } else {
+        zlen = 0;
+        while (*zkana != '\0') {
+            zkana++;
+            zlen++;
+        }
+        if (zlen > 1) {
+            s = (*(zkana - 2) << 8) + (*(zkana - 1) & 0xff);
+            if (seg->n_kana && (iszdakuten(s, serverIF[buf->server].lang)
+                    || !isdakuten(*(hkana - 1))))
+                return -1; 
+            else 
+                return len; 
+        } else {
+            return -1; 
+        }
+    }
+}
+
+/*
+ * _Xsj3cCodeConv()
+ *  Code input mode dispatch routine.
+ */
+static int
+_Xsj3cCodeConv(buf, code, kanji, mode)
+    Xsj3cBuf                    buf;
+    register unsigned char     *code;
+    register unsigned char     *kanji;
+    Xsj3csMode                  mode;
+{
+    register int            i,  j,  len;
+    register wchar          k,  (*conv)();
+    register unsigned char  c1, c2;
+    unsigned char           kbuf[4];
+
+    if ((len = strlen(code)) < 4 && (mode == MODE_EUC || mode == MODE_KUTEN))
+        return CONV_UNFIXED;
+    else if ((len < 2 || len == 3) && (mode == MODE_SJIS || mode == MODE_JIS))
+        return CONV_UNFIXED;
+
+    k = 0;  
+    for (j = 0; j < 4 && *code != '\0'; code++, j++) {
+        if (isdigit(*code))
+            i = *code - '0';
+        else if (islower(*code))
+            i = 10 + *code - 'a';
+        else if (isupper(*code))
+            i = 10 + *code - 'A';
+        else
+            return CONV_FAILED;
+        kbuf[j] = i;
+        k += i << ((3 - j) * 4);
+    }
+    switch (mode) {
+    case MODE_SJIS:
+        if (len == 4 && issjis1(c1 = (k >> 8)) && issjis2(c2 = (k & 0xff))) {
+            if (conv = CodeConvFunc[JP_SJIS][serverIF[buf->server].lang]) {
+                k = conv(k);
+                *kanji++ = k >> 8;
+                *kanji++ = k & 0xff;
+                *kanji = '\0';
+            } else {
+                *kanji++ = c1;
+                *kanji++ = c2;
+                *kanji = '\0';
+            }
+        } else if (iskana(k >> 8)) {
+            *kanji++ = k >> 8;
+            *kanji = '\0';
+        } else {
+            if (len < 4)
+                return CONV_UNFIXED;
+            else 
+                return CONV_FAILED;
+        }
+        break;
+    case MODE_EUC:
+        if (iseuc(k >> 8) && iseuc(k & 0xff)) {
+            if (conv = CodeConvFunc[JP_EUC][serverIF[buf->server].lang])
+                k = conv(k);
+            *kanji++ = k >> 8;
+            *kanji++ = k & 0xff;
+            *kanji = '\0';
+        } else if (iseuckana(k >> 8) && iskana2(k & 0xff)) {
+            *kanji++ = k & 0xff;
+            *kanji = '\0';
+        } else {
+            return CONV_FAILED;
+        }
+        break;
+    case MODE_JIS:
+        if (len == 4 && isjis(c1 = (k >> 8)) && isjis(c2 = (k & 0xff))) {
+            if (conv = CodeConvFunc[JP_JIS8][serverIF[buf->server].lang]) {
+                k = conv(k);
+                *kanji++ = k >> 8;
+                *kanji++ = k & 0xff;
+                *kanji = '\0';
+            } else {
+                *kanji++ = c1;
+                *kanji++ = c2;
+                *kanji = '\0';
+            }
+        } else if (iskana(k >> 8)) {
+            *kanji++ = k >> 8;
+            *kanji = '\0';
+        } else {
+            if (len < 4)
+                return CONV_UNFIXED;
+            else 
+                return CONV_FAILED;
+        }
+        break;
+    case MODE_KUTEN:
+        conv = CodeConvFunc[JP_JIS8][serverIF[buf->server].lang];
+        c1 = kbuf[0] * 10 + kbuf[1];
+        c2 = kbuf[2] * 10 + kbuf[3];
+        k = (c1 << 8) + c2;
+        k = conv(k + 0x2020);
+        if (iskan1(c1 = (k >> 8), serverIF[buf->server].lang)
+                && iskan2(c2 = (k & 0xff), serverIF[buf->server].lang)) {
+            *kanji++ = c1;
+            *kanji++ = c2;
+            *kanji = '\0';
+        } else {
+            return CONV_FAILED;
+        }
+        break;
+    default:
+        Xsj3cWarning("Illegal mode");
+        return CONV_FAILED;
+    }   
+        
+    return CONV_FIXED;
+}
+
+#define MATCH           0
+#define NOT             1
+
+/*
+ *  _Xsj3cRomaConv()
+ *   Get roman characters from the second argument and put back hiragana or
+ *  katakana characters to the third argument in conversion table.
+ *   If roman characters (third argument) mach with the "roma" entry in table, 
+ *  put back the "str" entry to the third argument and the "yomi" entry
+ *  to the third argument, then it returns number of converted roman
+ *  characters.
+ *   If not but any letters of roman characters is match with the "roma"
+ *  entry in table and the number of roman characters is less than
+ *  the number of the letters of "roma" entry, put back the same to
+ *  the third argument and nothing to the third argument, then it returns
+ *  zero.
+ *   Then last (not converted case) it returns minus 1.
+ *   Any arguments must be null('\0') terminated.
+ *   First argument is pointer to conversion table;
+ */ 
+int
+_Xsj3cRomaConv(rktable, roma, yomi)
+    Xsj3cRKTable               *rktable;
+    register unsigned char     *roma;
+    register unsigned char     *yomi;
+{
+    Xsj3cRKTable               *rktp;
+    register unsigned char     *p,     *q;
+    unsigned char               tmp[RBUFSIZ];
+    int                         match, result = CONV_FAILED;                    
+    register int                len;
+
+    if (!roma || (len = strlen(roma)) == 0)
+        return (CONV_FAILED);
+    for (rktp = rktable; rktp != NULL; rktp = rktp->next) {
+        if (!rktp->roma) {
+            continue;
+        }
+        p = roma;
+        q = rktp->roma;
+        if (len > rktp->rlen) {
+            if (*q++ == *p++) {
+                match = MATCH;
+                while (*q != '\0') {
+                    if (*q != *p) {
+                        match = NOT;
+                        break;
+                    }
+                    q++;
+                    p++;
+                }
+                if (match == NOT) {
+                    continue;
+                }
+                if (result < 0) {
+                    result = rktp->rlen;
+                    strcpy(yomi, rktp->yomi);
+                    strcpy(tmp, p);
+                } else {
+                    continue;
+                }
+            } else {
+                continue;
+            }
+        } else {
+            if (*p++ == *q++) {
+                match = MATCH;
+                while (*p != '\0') {
+                    if (*p++ != *q++) {
+                        match = NOT;
+                        break;
+                    }
+                }
+                if (match == NOT) {
+                    continue;
+                }
+                if (*q != '\0') {
+                    result = CONV_UNFIXED;
+                    continue;
+                } else if (result == CONV_UNFIXED) {
+                    continue;
+                } else {
+                    result = rktp->rlen;
+                    strcpy(yomi, rktp->yomi);
+                    strcpy(tmp, rktp->str);
+                }
+            } else {
+                continue;
+            }
+        }
+    }
+    if (result > 0)
+        strcpy(roma, tmp);
+    return (result);
+}
+
+/*
+ * _Xsj3cCtrlConv()
+ *
+ * <NoInputMode> Through all control events.
+ * <InputMode> Put the control code (now only HT & NL) after current position,
+ *   then fix all segments.
+ * <ConvedMode> Put the control code (now only HT & NL) after current segment,
+ *   then fix all segments and end convertion.
+ * <SelectMode/DictMode> Does Nothing.
+ *
+ * DisplayModeChange on: Change the display mode string.  
+ * ThroughNext code: 
+ * SetNormal code: 
+ */
+static Xsj3cEvent
+_Xsj3cCtrlConv(buf, code)
+    Xsj3cBuf                buf;
+    unsigned char           code;
+{
+    unsigned char           ch[2];
+    register unsigned char *c;
+    int                     change_pos;
+    register int            i;
+
+    if (code == '\t' || code == '\n')
+        goto compound_text;
+    if (buf->throughnext) {
+        c = buf->throughnext;
+        while (*c != '\0') {
+            if (*c == code) {
+                buf->throughflg = THROUGH;
+                if (buf->dispmodechange) {
+                    buf->dispmode = buf->inputmode;
+#ifdef THROUGH_CONT
+                    return (KEY_TEXT_CLEAR|KEY_CONTROL|KEY_MODE_CHANGE);
+                } else {
+                    return (KEY_TEXT_CLEAR|KEY_CONTROL);
+#else /* THROUGH_CONT */
+                    return (KEY_NULL);
+                } else {
+                    return (KEY_NULL);
+#endif /* THROUGH_CONT */
+                }
+            }
+            c++;
+        }
+    }
+    if (buf->setnormal) {
+        c = buf->setnormal;
+        while (*c != '\0') {
+            if (*c == code) {
+                if (buf->dispmodechange) {
+                    buf->dispmode = buf->inputmode;
+#ifdef THROUGH_CONT
+                    return (KEY_TEXT_FIXED|KEY_CONTROL|KEY_HENKAN_END
+                            |KEY_MODE_CHANGE);
+                } else {
+                    return (KEY_TEXT_FIXED|KEY_CONTROL|KEY_HENKAN_END);
+#else /* THROUGH_CONT */
+                    return (KEY_NULL);
+                } else {
+                    return (KEY_NULL);
+#endif /* THROUGH_CONT */
+                }
+            }
+            c++;
+        }
+    }
+    /* Through all control events by XtNunusedEventCallback */
+    return (KEY_NULL);
+
+    /* Push by compound text */
+compound_text:
+    switch (buf->convmode) {
+    case NoInputModeMask:
+        buf->convmode = InputModeMask;
+    case InputModeMask:
+        if (buf->segnum == buf->curseg)
+            buf->segnum++;
+        ch[0] = code;
+        ch[1] = '\0';
+        change_pos = buf->input[buf->curseg]->cur;
+        _Xsj3cInsertChar(buf, buf->input[buf->curseg], ch, 1);
+        _Xsj3cStoreYomi(buf, buf->input[buf->curseg], change_pos);
+        if (buf->dispmodechange) {
+            buf->dispmode = buf->inputmode;
+            return (KEY_TEXT_FIXED|KEY_TEXT_CHANGE|KEY_MODE_CHANGE);
+        } else
+            return (KEY_TEXT_FIXED|KEY_TEXT_CHANGE);
+    case ConvedModeMask:
+        i = buf->input[buf->curseg]->dnum;
+        buf->input[buf->curseg]->disp[i++] = code;
+        buf->input[buf->curseg]->disp[i] = '\0';
+        buf->input[buf->curseg]->dnum++;
+        if (buf->dispmodechange) {
+            buf->dispmode = buf->inputmode;
+            return (KEY_TEXT_FIXED|KEY_TEXT_CHANGE|KEY_MODE_CHANGE);
+        } else
+            return (KEY_TEXT_FIXED|KEY_TEXT_CHANGE);
+    case DictModeMask:
+    case SelectModeMask:
+    default:
+        return (KEY_NULL);
+    }
+}
+
+/*
+ *  _Xsj3cThrough()
+ * Store characters to yomi/disp buffer and fix.
+ */
+static Xsj3cEvent
+_Xsj3cThrough(buf, seg, n)
+    Xsj3cBuf                buf;
+    Xsj3cSeg                seg;
+    int                     n;
+{
+    int                     change_pos;
+
+    change_pos = seg->cur;
+    _Xsj3cInsertChar(buf, seg, seg->str, n);
+    _Xsj3cStoreYomi(buf, seg, change_pos);
+    return (KEY_TEXT_FIXED);
+}
+
+/*
+ *  _Xsj3cDirect()
+ * Store characters to yomi/disp buffer.
+ *
+ * DisplayModeChange on: Change the display mode string.  
+ */
+static Xsj3cEvent
+_Xsj3cDirect(buf, seg, n)
+    Xsj3cBuf                buf;
+    Xsj3cSeg                seg;
+    int                     n;
+{
+    Xsj3cEvent              ret = KEY_TEXT_CHANGE;
+    int                     change_pos;
+
+    change_pos = seg->cur;
+    _Xsj3cInsertChar(buf, seg, seg->str, n);
+    _Xsj3cStoreYomi(buf, seg, change_pos);
+    *seg->str = '\0';
+    seg->sp = seg->str;
+    *seg->oldstr = '\0';
+    seg->oldlen = 0;
+    seg->n_roma = 0;
+    seg->n_kana = -1;
+    if (buf->dispmodechange) {
+        buf->dispmode = (buf->convedsegnum == buf->segnum ? MODE_KANJI :
+                (buf->convedsegnum ? MODE_EDIT : buf->inputmode));
+        ret |= KEY_MODE_CHANGE;
+    }
+    return (ret);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/Xsj3clib/dict.c	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,674 @@
+#ifndef lint
+static char *rcsid = "$Id: dict.c,v 2.0 1992/02/13 18:33:19 nao Exp $";
+#endif
+/*
+ * Copyright 1991 Sony Corporation
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Sony not be used in advertising or
+ * publicity pertaining to distribution of the software without specific,
+ * written prior permission.  Sony makes no representations about the
+ * suitability of this software for any purpose.  It is provided "as is"
+ * without express or implied warranty.
+ *
+ * SONY DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL SONY
+ * BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
+ * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN 
+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+/*
+ * Author: Naoshi Suzuki, SONY Corporation.  (nao@sm.sony.co.jp)
+ */
+
+#include "common.h"
+#include "util.h"
+#include "segment.h"
+
+extern Xsj3cCVServerIF      serverIF[SERVER_NUM];
+extern wchar               *_Xsj3cStoreWchar();
+
+void                        _Xsj3cFlushDictMsg();
+Xsj3cDictData               _Xsj3cCreateDictData();
+void                        _Xsj3cFreeDictData();
+
+int                         Xsj3cGetDictMsgNum();
+Xsj3cDictMsg                Xsj3cGetDictMsgs();
+wchar                      *Xsj3cGetDictMsg();
+void                        Xsj3cDictRegister();
+void                        Xsj3cDictClear();
+void                        Xsj3cEndDict();
+
+Xsj3cHinsi                  _Xsj3cHinsiInit();
+int                         Xsj3cGetHinsiNum();
+Xsj3cHinsi                  Xsj3cGetHinsis();
+wchar                      *Xsj3cGetHinsi();
+int                         Xsj3cSetHinsi();
+void                        Xsj3cEndHinsi();
+
+static Xsj3cDictMsg         _Xsj3cDictMsgInit();
+static void                 _Xsj3cSetDictMsg();
+
+static Xsj3cDictMsg         dictmsglist[SERVER_NUM] = {NULL};
+static int                  dictmsgnum[SERVER_NUM] = {0};
+
+static Xsj3cHinsi           hinsilist[SERVER_NUM] = {NULL};
+static int                  hinsinum[SERVER_NUM] = {0};
+
+typedef struct _dict_hinsi {
+    int             code;
+    char           *string;
+} Sj3HinsiRec, *Sj3HinsiPtr;
+
+static Sj3HinsiRec sj3_hinsi_list[] = {
+    SJ3_H_NRMNOUN,      "\225\201\222\312\226\274\216\214",
+    SJ3_H_PRONOUN,      "\221\343\226\274\216\214",
+    SJ3_H_LNAME,        "\225\143\216\232",
+    SJ3_H_FNAME,        "\226\274\221\117",
+    SJ3_H_LOCNAME,      "\222\156\226\274",
+    SJ3_H_PREFIC,       "\214\247\201\136\213\346\226\274",
+    SJ3_H_RENTAI,       "\230\101\221\314\216\214",
+    SJ3_H_CONJUNC,      "\220\332\221\261\216\214",
+    SJ3_H_SUBNUM,       "\217\225\220\224\216\214",
+    SJ3_H_NUMERAL,      "\220\224\216\214",
+    SJ3_H_PREFIX,       "\220\332\223\252\214\352",
+    SJ3_H_POSTFIX,      "\220\332\224\366\214\352",
+    SJ3_H_ADVERB,       "\225\233\216\214",
+    SJ3_H_ADJECT,       "\214\140\227\145\216\214",
+    SJ3_H_ADJVERB,      "\214\140\227\145\223\256\216\214",
+    SJ3_H_SILVERB,      "\203\124\225\317\223\256\216\214",
+    SJ3_H_ZILVERB,      "\203\125\225\317\223\256\216\214",
+    SJ3_H_ONEVERB,      "\210\352\222\151\223\256\216\214",
+    SJ3_H_KAVERB,       "\203\112\215\163\214\334\222\151\223\256\216\214",
+    SJ3_H_GAVERB,       "\203\113\215\163\214\334\222\151\223\256\216\214",
+    SJ3_H_SAVERB,       "\203\124\215\163\214\334\222\151\223\256\216\214",
+    SJ3_H_TAVERB,       "\203\136\215\163\214\334\222\151\223\256\216\214",
+    SJ3_H_NAVERB,       "\203\151\215\163\214\334\222\151\223\256\216\214",
+    SJ3_H_BAVERB,       "\203\157\215\163\214\334\222\151\223\256\216\214",
+    SJ3_H_MAVERB,       "\203\175\215\163\214\334\222\151\223\256\216\214",
+    SJ3_H_RAVERB,       "\203\211\215\163\214\334\222\151\223\256\216\214",
+    SJ3_H_WAVERB,       "\203\217\215\163\214\334\222\151\223\256\216\214",
+    SJ3_H_SINGLE,       "\222\120\212\277\216\232",
+};
+
+typedef struct _dict_status {
+    Xsj3cdMode      state;
+    Xsj3cdMode      value;
+    char            *string;
+} Sj3DictStatusRec, *Sj3DictStatusPtr;
+
+static Sj3DictStatusRec sj3_dict_status[] = {
+    REG_STATE|CLR_STATE,    SJ3_DICT_INPUT,
+    " \224\315\210\315\216\167\222\350/\223\307\202\335\223\374\227\
+\315:[\223\307\202\335]",
+    /* $BHO0O;XDj(B/$BFI$_F~NO(B:[$BFI$_(B] */
+    REG_STATE|CLR_STATE,    SJ3_DICT_YOMI,
+    " [\223\307\202\335]",
+    /* [$BFI$_(B] */
+    REG_STATE|CLR_STATE,    SJ3_DICT_HINSI,
+    " [\225\151\216\214]",
+    /* [$BIJ;l(B] */
+    REG_STATE|CLR_STATE,    SJ3_DICT_CONFIRM,
+    " [ok ?]",
+    /* [ok ?] */
+    REG_STATE,              SJ3_TOUROKU_SUCCESSED,
+    ":\223\157\230\136\202\265\202\334\202\265\202\275",
+    /* $BEPO?$7$^$7$?(B */
+    CLR_STATE,              SJ3_SYOUKYO_SUCCESSED,
+    ":\217\301\213\216\202\265\202\334\202\265\202\275",
+    /* $B>C5n$7$^$7$?(B */
+    REG_STATE|CLR_STATE,    SJ3_NO_YOMI_STR,
+    ":\223\307\202\335\225\266\216\232\227\361\202\252\202\240\202\350\
+\202\334\202\271\202\361",
+    /* $BFI$_J8;zNs$,$"$j$^$;$s(B */
+    REG_STATE|CLR_STATE,    SJ3_LONG_YOMI_STR,
+    ":\223\307\202\335\225\266\216\232\227\361\202\252\222\267\202\267\
+\202\254\202\334\202\267",
+    /* $BFI$_J8;zNs$,D9$9$.$^$9(B */
+    REG_STATE|CLR_STATE,    SJ3_DICT_ERROR,
+    ":\216\253\217\221\202\326\202\314\217\221\202\253\215\236\202\335\
+\202\252\217\157\227\210\202\334\202\271\202\361",
+    /* $B<-=q$X$N=q$-9~$_$,=PMh$^$;$s(B */
+    REG_STATE|CLR_STATE,    SJ3_DICT_LOCKED,
+    ":\216\253\217\221\202\252\203\215\203\142\203\116\202\263\202\352\
+\202\304\202\242\202\334\202\267",
+    /* $B<-=q$,%m%C%/$5$l$F$$$^$9(B */
+    REG_STATE|CLR_STATE,    SJ3_BAD_YOMI_STR,
+    ":\223\307\202\335\225\266\216\232\227\361\202\311\225\163\220\263\
+\202\310\225\266\216\232\202\252\212\334\202\334\202\352\202\304\202\242\
+\202\334\202\267",
+    /* $BFI$_J8;zNs$KIT@5$JJ8;z$,4^$^$l$F$$$^$9(B */
+    REG_STATE|CLR_STATE,    SJ3_BAD_KANJI_STR,
+    ":\212\277\216\232\225\266\216\232\227\361\202\311\225\163\220\263\
+\202\310\225\266\216\232\202\252\212\334\202\334\202\352\202\304\202\242\
+\202\351\202\251\222\267\202\267\202\254\202\334\202\267",
+    /* $B4A;zJ8;zNs$KIT@5$JJ8;z$,4^$^$l$F$$$k$+D9$9$.$^$9(B */
+    REG_STATE|CLR_STATE,    SJ3_BAD_HINSI_CODE,
+    ":\225\151\216\214\203\122\201\133\203\150\202\252\225\163\220\263\
+\202\305\202\267",
+    /* $BIJ;l%3!<%I$,IT@5$G$9(B */
+    REG_STATE,              SJ3_WORD_EXIST,
+    ":\223\157\230\136\215\317\202\314\217\156\214\352\202\305\202\267",
+    /* $BEPO?:Q$N=O8l$G$9(B */
+    CLR_STATE,              SJ3_WORD_NOT_EXIST,
+    ":\217\156\214\352\202\252\223\157\230\136\202\263\202\352\202\304\
+\202\242\202\334\202\271\202\361",
+    /* $B=O8l$,EPO?$5$l$F$$$^$;$s(B */
+    REG_STATE,              SJ3_DOUON_FULL,
+    ":\202\261\202\352\210\310\217\343\223\257\211\271\214\352\202\360\
+\223\157\230\136\202\305\202\253\202\334\202\271\202\361",
+    /* $B$3$l0J>eF12;8l$rEPO?$G$-$^$;$s(B */
+    REG_STATE,              SJ3_DICT_FULL,
+    ":\202\261\202\352\210\310\217\343\216\253\217\221\202\311\223\157\
+\230\136\202\305\202\253\202\334\202\271\202\361",
+    /* $B$3$l0J>e<-=q$KEPO?$G$-$^$;$s(B */
+    REG_STATE,              SJ3_INDEX_FULL,
+    ":\202\261\202\352\210\310\217\343 INDEX \202\311\223\157\230\136\202\
+\305\202\253\202\334\202\271\202\361",
+    /* $B$3$l0J>e(B INDEX $B$KEPO?$G$-$^$;$s(B */
+    REG_STATE,              SJ3_TOUROKU_FAILED,
+    ":\216\253\217\221\202\326\202\314\223\157\230\136\202\311\216\270\
+\224\163\202\265\202\334\202\265\202\275",
+    /* $B<-=q$X$NEPO?$K<:GT$7$^$7$?(B */
+    CLR_STATE,              SJ3_SYOUKYO_FAILED,
+    ":\216\253\217\221\202\251\202\347\202\314\217\301\213\216\202\311\
+\216\270\224\163\202\265\202\334\202\265\202\275",
+    /* $B<-=q$+$i$N>C5n$K<:GT$7$^$7$?(B */
+};
+
+/*
+ * _Xsj3cCreateDictData()
+ */
+Xsj3cDictData
+_Xsj3cCreateDictData(buf, mode)
+    Xsj3cBuf            buf;
+    Xsj3cdMode          mode;
+{
+    register Xsj3cDictData  dict;
+
+    if (buf->dict)
+        return buf->dict;
+    if ((dict = (Xsj3cDictData)malloc(sizeof(Xsj3cDictDataRec))) == NULL)
+        Xsj3cError("Failed to allocate data for DictMode.");
+    if ((dict->seg = (Xsj3cSeg)Xsj3cCreateSegment(buf)) == NULL)
+        Xsj3cError("Failed to allocate segment for dictionary.");
+    if ((dict->msg = (Xsj3cDictMsg)
+            calloc(DICT_STR_NUM, sizeof(Xsj3cDictMsgRec))) == NULL)
+        Xsj3cError("Failed to allocate message buffer for dictionary.");
+    dict->mode = mode;
+    dict->status = DICT_INPUT;
+    dict->value = SJ3_DICT_INPUT;
+    dict->n_dict = 0;
+    return (dict);
+}
+
+/*
+ * _Xsj3cFreeDictData()
+ */
+void
+_Xsj3cFreeDictData(buf)
+    Xsj3cBuf            buf;
+{
+    if (!buf->dict)
+        return ;
+    Xsj3cFreeSegment(buf->dict->seg);
+    buf->dict->seg = NULL;
+    free (buf->dict->msg);
+    free (buf->dict);
+    buf->dict = NULL;
+}
+
+/*
+ * _Xsj3cDictMsgInit()
+ */
+static Xsj3cDictMsg
+_Xsj3cDictMsgInit(buf)
+    Xsj3cBuf            buf;
+{
+    wchar               data[KANABUFSIZ];
+    register int        i;
+
+    if (dictmsglist[buf->server]) {
+        return (dictmsglist[buf->server]);
+    }
+    switch(buf->server) {
+    case SERVER_SJ3:
+    default:
+        dictmsgnum[SERVER_SJ3]
+                = sizeof(sj3_dict_status)/sizeof(Sj3DictStatusRec);
+        break;
+    }
+    if ((dictmsglist[buf->server] =
+            (Xsj3cDictMsg)calloc(dictmsgnum[buf->server],
+            sizeof(Sj3DictStatusRec))) == NULL) {
+        Xsj3cError("Failed to allocate hinsi data");
+    }
+    switch(buf->server) {
+    case SERVER_SJ3:
+    default:
+        for (i = 0; i < dictmsgnum[SERVER_SJ3]; i++) {
+            dictmsglist[buf->server][i].len = _Xsj3cmPStowOUT(buf, data,
+                    (unsigned char *)sj3_dict_status[i].string);
+            dictmsglist[buf->server][i].data
+                = _Xsj3cStoreWchar(data, dictmsglist[buf->server][i].len + 1);
+            dictmsglist[buf->server][i].attr = SEG_NORMAL;
+            if (!dictmsglist[buf->server][i].data)
+                Xsj3cError("Failed to allocate hinsi data");
+        }
+        break;
+    }
+    return (dictmsglist[buf->server]);
+}
+
+/*
+ * Xsj3cGetDictMsgNum()
+ */
+int
+Xsj3cGetDictMsgNum(buf)
+    Xsj3cBuf      buf;
+{
+    switch (buf->dict->status) {
+    case DICT_INPUT:
+    case DICT_HINSI:
+        if (buf->dict->seg->num > 0)
+            return (DICT_STR_YOMI + 1);
+        else 
+            return (DICT_STR_MSG1 + 1);
+    case DICT_CONFIRM:
+        if (buf->dict->mode == REG_STATE)
+            return (DICT_STR_NUM);
+        else 
+            return (DICT_STR_MSG2 + 1);
+    case DICT_END:
+        if (buf->dict->seg->num > 0) {
+            if (buf->curhinsi < 0) 
+                return (DICT_STR_MSG2 + 1);
+            else 
+                return (DICT_STR_NUM);
+        } else {
+            return (DICT_STR_MSG1 + 1);
+        }
+    default:
+        return (NULL);
+    }
+}
+
+/*
+ * _Xsj3cFlushDictMsg()
+ */
+void
+_Xsj3cFlushDictMsg(buf)
+    Xsj3cBuf      buf;
+{
+    if (!dictmsglist[buf->server]) {
+        dictmsglist[buf->server] = _Xsj3cDictMsgInit(buf);
+    }
+
+    switch (buf->dict->status) {
+    case DICT_INPUT:
+    case DICT_HINSI:
+        if (buf->dict->seg->num > 0) {
+            _Xsj3cSetDictMsg(buf, DICT_STR_YOMI);
+        } else {
+            _Xsj3cSetDictMsg(buf, DICT_STR_MODE);
+            _Xsj3cSetDictMsg(buf, DICT_STR_MSG1);
+        }
+        break;
+    case DICT_CONFIRM:
+        if (buf->dict->mode == REG_STATE) {
+            _Xsj3cSetDictMsg(buf, DICT_STR_MSG1);
+            _Xsj3cSetDictMsg(buf, DICT_STR_MSG2);
+            _Xsj3cSetDictMsg(buf, DICT_STR_HINSI);
+            _Xsj3cSetDictMsg(buf, DICT_STR_MSG3);
+        } else {
+            _Xsj3cSetDictMsg(buf, DICT_STR_MSG1);
+            _Xsj3cSetDictMsg(buf, DICT_STR_MSG2);
+        }
+        break;
+    case DICT_END:
+        if (buf->dict->seg->num > 0) {
+            if (buf->dict->seg->num > DICT_YOMI_MAX) {
+                _Xsj3cSetDictMsg(buf, DICT_STR_MSG2);
+            } else {
+                if (buf->dict->mode == REG_STATE) {
+                    _Xsj3cSetDictMsg(buf, DICT_STR_MSG1);
+                    _Xsj3cSetDictMsg(buf, DICT_STR_MSG3);
+                } else {
+                    if (buf->curhinsi < 0) {
+                        _Xsj3cSetDictMsg(buf, DICT_STR_MSG2);
+                    } else {
+                        _Xsj3cSetDictMsg(buf, DICT_STR_MSG1);
+                        _Xsj3cSetDictMsg(buf, DICT_STR_MSG2);
+                        _Xsj3cSetDictMsg(buf, DICT_STR_HINSI);
+                        _Xsj3cSetDictMsg(buf, DICT_STR_MSG3);
+                    }
+                }
+            }
+        } else {
+            _Xsj3cSetDictMsg(buf, DICT_STR_MSG1);
+        }
+        break;
+    default:
+        break;
+    }
+}
+
+/*
+ * Xsj3cGetDictMsgs()
+ */
+Xsj3cDictMsg
+Xsj3cGetDictMsgs(buf)
+    Xsj3cBuf    buf;
+{
+    return (buf->dict->msg);
+}
+
+/*
+ * Xsj3cGetDictMsg()
+ */
+wchar *
+Xsj3cGetDictMsg(buf, n, len, attr)
+    Xsj3cBuf    buf;
+    int         n;
+    int         *len;
+    int         *attr;
+{
+    *attr = buf->dict->msg[n].attr;
+    *len = buf->dict->msg[n].len;
+    return (buf->dict->msg[n].data);
+}
+
+static void
+_Xsj3cSetDictMsg(buf, n)
+    Xsj3cBuf    buf;
+    Xsj3cdMode  n;
+{
+    Xsj3csMode      mode;
+    register int    i;
+    int             value;
+
+    switch (n) {
+    case DICT_STR_MODE:
+        mode = (buf->dict->mode == REG_STATE ? MODE_TOROKU : MODE_SYOUKYO);
+        buf->dict->msg[DICT_STR_MODE].data = buf->modestr[mode];
+        buf->dict->msg[DICT_STR_MODE].len = buf->modelen[mode];
+        buf->dict->msg[DICT_STR_MODE].attr = SEG_REVERSED;
+        return;
+    case DICT_STR_MSG1:
+        if (buf->dict->status == DICT_INPUT) {
+            value = SJ3_DICT_INPUT;
+        } else {
+            if (buf->dict->seg->num > 0) 
+                value = SJ3_DICT_YOMI;
+            else
+                value = buf->dict->value;
+        }
+        break;
+    case DICT_STR_YOMI:
+        buf->dict->msg[DICT_STR_YOMI].data = buf->dict->seg->disp;
+        buf->dict->msg[DICT_STR_YOMI].len = buf->dict->seg->dnum;
+        buf->dict->msg[DICT_STR_YOMI].attr = SEG_UNDER_LINE;
+        return;
+    case DICT_STR_MSG2:
+        if (buf->dict->mode == CLR_STATE && buf->dict->status == DICT_CONFIRM) {
+            value = SJ3_DICT_CONFIRM;
+        } else {
+            if (buf->curhinsi < 0)
+                value = buf->dict->value;
+            else
+                value = SJ3_DICT_HINSI;
+        }
+        break;
+    case DICT_STR_HINSI:
+        buf->dict->msg[DICT_STR_HINSI].data = buf->hinsi[buf->curhinsi].data;
+        buf->dict->msg[DICT_STR_HINSI].len = buf->hinsi[buf->curhinsi].len;
+        buf->dict->msg[DICT_STR_HINSI].attr = SEG_NORMAL;
+        return;
+    case DICT_STR_MSG3:
+        if (buf->dict->mode == REG_STATE && buf->dict->status == DICT_CONFIRM) {
+            value = SJ3_DICT_CONFIRM;
+        } else {
+            value = buf->dict->value;
+        }
+        break;
+    default:
+        value = buf->dict->value;
+        break;
+    }
+
+    switch(buf->server) {
+    case SERVER_SJ3:
+    default:
+        for (i = 0; i < dictmsgnum[SERVER_SJ3]; i++) {
+            if ((buf->dict->mode & sj3_dict_status[i].state) &&
+                    value == sj3_dict_status[i].value)
+                break;
+        }
+        break;
+    }
+    if (i >= dictmsgnum[buf->server])
+        Xsj3cError("Cannot find message for now status %s.",_Xsj3cItoa(value));
+    else
+        buf->dict->msg[n] = dictmsglist[buf->server][i];
+}
+
+void
+Xsj3cDictRegister(buf)
+    Xsj3cBuf        buf;
+{
+    wchar           disp[KANABUFSIZ];
+    unsigned char   kana[KANJIBUFSIZ],  kanji[KANJIBUFSIZ];
+    register int    i;
+
+    disp[0] = '\0';
+    for (i = buf->curseg; i <= buf->curseg + buf->dict->n_dict; i++) {
+        _Xsj3cWcat(disp, buf->input[i]->disp);
+    }
+    buf->dict->n_dict = 0;
+    _Xsj3cwOUTtomPS(buf, kanji, disp);
+    if (buf->gakusyuu)
+        _Xsj3cClearDcid(buf);
+    _Xsj3cwPStomPS(buf, kana, buf->dict->seg->yomi);
+
+    switch (buf->server) {
+    case SERVER_SJ3:
+    default:
+        if ((buf->dict->value
+                = serverIF[buf->server].func[FUNC_REGISTER](kana, kanji,
+                sj3_hinsi_list[buf->curhinsi].code)) == 0) {
+            buf->dict->value = SJ3_TOUROKU_SUCCESSED;
+        } else if (buf->dict->value  < 0) {
+            Xsj3cWarning("sj3serv is down. reconnect please");
+            buf->dict->value = SJ3_TOUROKU_FAILED;
+        }
+        break;
+    }
+    _Xsj3cFlushDictMsg(buf);
+}
+
+void
+Xsj3cDictClear(buf)
+    Xsj3cBuf        buf;
+{
+    wchar           disp[KANABUFSIZ];
+    unsigned char   kana[KANJIBUFSIZ],  kanji[KANJIBUFSIZ];
+    register int    i;
+    Sj3HinsiPtr     hp;
+
+    disp[0] = '\0';
+    for (i = buf->curseg; i <= buf->curseg + buf->dict->n_dict; i++) {
+        _Xsj3cWcat(disp, buf->input[i]->disp);
+    }
+    buf->dict->n_dict = 0;
+    _Xsj3cwOUTtomPS(buf, kanji, disp);
+    if (buf->gakusyuu)
+        _Xsj3cClearDcid(buf);
+    _Xsj3cwPStomPS(buf, kana, buf->dict->seg->yomi);
+
+    switch (buf->server) {
+    case SERVER_SJ3:
+    default:
+        for (hp = sj3_hinsi_list, i = 0; hp->code > 0; hp++, i++) {
+            if ((buf->dict->value
+                    = serverIF[buf->server].func[FUNC_CLEAR](kana, kanji,
+                    hp->code)) == 0) {
+                buf->dict->value = SJ3_SYOUKYO_SUCCESSED;
+                buf->curhinsi = i;
+                _Xsj3cFlushDictMsg(buf);
+                return;
+            } else if (buf->dict->value < 0) {
+                Xsj3cWarning("sj3serv is down. reconnect please");
+                buf->dict->value = SJ3_SYOUKYO_FAILED;
+                buf->curhinsi = -1;
+                _Xsj3cFlushDictMsg(buf);
+                return;
+            } else if (buf->dict->value != SJ3_WORD_NOT_EXIST) {
+                buf->curhinsi = -1;
+                _Xsj3cFlushDictMsg(buf);
+                return;
+            }
+        }
+        break;
+    }
+
+    buf->curhinsi = -1;
+    _Xsj3cFlushDictMsg(buf);
+    return;
+}
+
+/*
+ * Xsj3cEndDict()
+ *  End dictionary mode(DictMode) and back to ConvedMode.
+ */
+void
+Xsj3cEndDict(buf)
+    Xsj3cBuf      buf;
+{
+    _Xsj3cFreeDictData(buf);
+    buf->convmode = ConvedModeMask;
+}
+
+/*
+ * _Xsj3cHinsiInit()
+ *  Initialize hinsi data.
+ */
+Xsj3cHinsi
+_Xsj3cHinsiInit(buf)
+    Xsj3cBuf      buf;
+{
+    wchar               data[KANABUFSIZ];
+    register int        i;
+
+    if (hinsilist[buf->server]) {
+        return(hinsilist[buf->server]);
+    }
+
+    switch (buf->server) {
+    case SERVER_SJ3:
+    default:
+        hinsinum[SERVER_SJ3]= sizeof(sj3_hinsi_list)/sizeof(Sj3HinsiRec);
+        break;
+    }
+
+    if ((hinsilist[buf->server]
+            = (Xsj3cHinsi)calloc(hinsinum[buf->server], sizeof(Xsj3cHinsiRec)))
+            == NULL) {
+        Xsj3cError("Failed to allocate hinsi data");
+    }
+
+    switch (buf->server) {
+    case SERVER_SJ3:
+    default:
+        for (i = 0; i < hinsinum[buf->server]; i++) {
+            hinsilist[buf->server][i].len = _Xsj3cmPStowOUT(buf, data,
+                    (unsigned char *)sj3_hinsi_list[i].string);
+            hinsilist[buf->server][i].data
+                = _Xsj3cStoreWchar(data, hinsilist[buf->server][i].len + 1);
+            if (!hinsilist[buf->server][i].data)
+                Xsj3cError("Failed to allocate hinsi data");
+        }
+        break;
+    }
+
+    return (hinsilist[buf->server]);
+}
+
+/*
+ * Xsj3cGetHinsiNum()
+ *  Return hinsi data total number.
+ */
+int
+Xsj3cGetHinsiNum(buf, cur)
+    Xsj3cBuf            buf;
+    int                *cur;
+{
+    if (!buf->hinsi) {
+        buf->hinsi = _Xsj3cHinsiInit(buf);
+    }
+    *cur = 0;
+    return (hinsinum[buf->server]);
+}
+
+/*
+ * Xsj3cGetHinsis()
+ *  Return hinsi data structure.
+ */
+Xsj3cHinsi
+Xsj3cGetHinsis(buf)
+    Xsj3cBuf            buf;
+{
+    if (!buf->hinsi) {
+        buf->hinsi = _Xsj3cHinsiInit(buf);
+    }
+    return (buf->hinsi);
+}
+
+/*
+ * Xsj3cGetHinsi()
+ *  Set the appointed (by 1st argument) hinsi to 2nd argument.
+ */
+wchar *
+Xsj3cGetHinsi(buf, n, len)
+    Xsj3cBuf            buf;
+    int                 n;
+    int                *len;
+{
+    if (!buf->hinsi) {
+        buf->hinsi = _Xsj3cHinsiInit(buf);
+    }
+    *len = buf->hinsi[n].len;
+    return (buf->hinsi[n].data);
+}
+
+/*
+ * Xsj3cSetHinsi()
+ *  Set the selected hinsi.
+ */
+int
+Xsj3cSetHinsi(buf, sel_hinsi, changed, flush)
+    Xsj3cBuf    buf;
+    int         sel_hinsi;
+    int         *changed;
+    int         *flush;
+{
+    buf->curhinsi = sel_hinsi;
+    _Xsj3cFlushDictMsg(buf);
+    *changed = OFF;
+    *flush = OFF;
+    return 0;
+}
+
+/*
+ * Xsj3cEndHinsi()
+ *  End hinsi select mode(SelectMode) and back to ConvedMode.
+ */
+void
+Xsj3cEndHinsi(buf)
+    Xsj3cBuf    buf;
+{
+    buf->convmode = DictModeMask;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/Xsj3clib/func.c	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,3968 @@
+#ifndef lint
+static char *rcsid = "$Id: func.c,v 2.3 1993/09/21 09:42:57 nao Exp $";
+#endif
+/*
+ * Copyright 1991 Sony Corporation
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Sony not be used in advertising or
+ * publicity pertaining to distribution of the software without specific,
+ * written prior permission.  Sony makes no representations about the
+ * suitability of this software for any purpose.  It is provided "as is"
+ * without express or implied warranty.
+ *
+ * SONY DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL SONY
+ * BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
+ * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN 
+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+/*
+ * Author: Naoshi Suzuki, SONY Corporation.  (nao@sm.sony.co.jp)
+ */
+
+#include <ctype.h>
+#include "common.h"
+#include "sj3ctype.h"
+#include "util.h"
+#include "func.h"
+
+extern Xsj3cCVServerIF  serverIF[SERVER_NUM];
+extern void             Xsj3cRCInit();
+extern int              _Xsj3cRomaConv();
+extern int              _Xsj3cKanaConv();
+extern Xsj3cCand        _Xsj3cCandidateInit();
+extern void             _Xsj3cFlushDictMsg();
+extern Xsj3cDictData    _Xsj3cCreateDictData();
+
+Xsj3cEvent              _Xsj3cConvert();
+Xsj3cEvent              _Xsj3cUnConvert();
+Xsj3cEvent              _Xsj3cFix();
+Xsj3cEvent              _Xsj3cReturn();
+
+Xsj3cEvent              _Xsj3cModeHAlpha();
+Xsj3cEvent              _Xsj3cModeZAlpha();
+Xsj3cEvent              _Xsj3cModeHKata();
+Xsj3cEvent              _Xsj3cModeZKata();
+Xsj3cEvent              _Xsj3cModeHira();
+Xsj3cEvent              _Xsj3cToHAlpha();
+Xsj3cEvent              _Xsj3cToZAlpha();
+Xsj3cEvent              _Xsj3cToHKata();
+Xsj3cEvent              _Xsj3cToZKata();
+Xsj3cEvent              _Xsj3cToHira();
+Xsj3cEvent              _Xsj3cZenkaku();
+Xsj3cEvent              _Xsj3cHankaku();
+Xsj3cEvent              _Xsj3cToUpper();
+Xsj3cEvent              _Xsj3cToLower();
+Xsj3cEvent              _Xsj3cModeSJIS();
+Xsj3cEvent              _Xsj3cModeEUC();
+Xsj3cEvent              _Xsj3cModeJIS();
+Xsj3cEvent              _Xsj3cModeKuten();
+Xsj3cEvent              _Xsj3cCodeRollDown();
+Xsj3cEvent              _Xsj3cModeRollDown();
+Xsj3cEvent              _Xsj3cModeRollUp();
+Xsj3cEvent              _Xsj3cNextMode();
+Xsj3cEvent              _Xsj3cPrevMode();
+Xsj3cEvent              _Xsj3cModeToggle();
+
+Xsj3cEvent              _Xsj3cForward();
+Xsj3cEvent              _Xsj3cBackward();
+Xsj3cEvent              _Xsj3cTop();
+Xsj3cEvent              _Xsj3cEnd();
+Xsj3cEvent              _Xsj3cUp();
+Xsj3cEvent              _Xsj3cDown();
+Xsj3cEvent              _Xsj3cFirst();
+Xsj3cEvent              _Xsj3cLast();
+Xsj3cEvent              _Xsj3cNextPage();
+Xsj3cEvent              _Xsj3cPrevPage();
+Xsj3cEvent              _Xsj3cNext();
+Xsj3cEvent              _Xsj3cPrev();
+Xsj3cEvent              _Xsj3cSelect();
+Xsj3cEvent              _Xsj3cCancel();
+
+Xsj3cEvent              _Xsj3cExpand();
+Xsj3cEvent              _Xsj3cShrink();
+
+Xsj3cEvent              _Xsj3cBackSpace();
+Xsj3cEvent              _Xsj3cDelete();
+Xsj3cEvent              _Xsj3cDelAfter();
+
+Xsj3cEvent              _Xsj3cStart();
+Xsj3cEvent              _Xsj3cReConnect();
+Xsj3cEvent              _Xsj3cReConvert();
+Xsj3cEvent              _Xsj3cEdit();
+
+Xsj3cEvent              _Xsj3cDRegBegin();
+Xsj3cEvent              _Xsj3cDClearBegin();
+
+Xsj3cEvent              _Xsj3cSymbolBegin();
+
+Xsj3cEvent              _Xsj3cQuote();
+Xsj3cEvent              _Xsj3cBell();
+Xsj3cEvent              _Xsj3cKana();
+Xsj3cEvent              _Xsj3cSjrc();
+Xsj3cEvent              _Xsj3cKill();
+Xsj3cEvent              _Xsj3cNull();
+Xsj3cEvent              _Xsj3cIgnore();
+
+Xsj3cEvent              _Xsj3cUnConvSeg();
+
+static Xsj3cEvent       _Xsj3cDeleteSeg();
+static Xsj3cEvent       _Xsj3cDeleteChar();
+static Xsj3cEvent       _Xsj3cBackSpaceChar();
+static Xsj3cEvent       _Xsj3cExpandNoConv();
+static Xsj3cEvent       _Xsj3cShrinkNoConv();
+
+/*
+ * _Xsj3cConvert() [henkan/convert]
+ *
+ * <InputMode> Do kana-kanji conversion.
+ * <ConvedMode> If character mode of current segment is zenkaku-hiragana,
+ *   pop up candidate panel, else convert to zenkaku-hiragana.
+ * <NoInputMode/SelectMode/DictMode> Rings bell.
+ *
+ * BeginConversionLast none: Set current segment out of segments. 
+ * BeginConversionLast off: Set current segment to the first segment.
+ * BeginConversionLast on: Set current segment to the last segment.
+ * DisplayModeChange on: Change the display mode string.  
+ * HenkanSegment all: Convert all segments.
+ * HenkanSegment after: Convert segments after current segment.
+ * HenkanSegment one: Convert current segment.
+ * BeforeSelectConversion on: Convert current segment to hiragana
+ *   and need one more step to display candidates.
+ * BeforeConversion on: Convert current segment to hiragana before
+ *   Kana-Kanji conversion.
+ * BeforeSelectCount: Work like "next/wrap" before popup candidate panel
+ *   at [ConvedMode].
+ * LastDoubleConversion on: Before Kana-Kanji conversion, convert current
+ *   segment to current character mode.
+ */
+Xsj3cEvent
+_Xsj3cConvert(buf)
+    Xsj3cBuf  buf;
+{
+    unsigned char               knjbuf[KANJIBUFSIZ];
+    unsigned char               kanabuf[KANJIBUFSIZ];
+    Xsj3cEvent                  ret = KEY_NULL;
+    SJ3_BUNSETU                 bun[BUNBUFSIZ];
+    int                         i,  value;
+    register int                conved, begin,  end;
+
+    if (buf->segnum && buf->curseg >= buf->segnum) {
+        buf->curseg = buf->segnum - 1;
+        if (buf->input[buf->curseg] &&
+                (buf->input[buf->curseg]->status & SEG_CONVED))
+            buf->convmode = ConvedModeMask;
+        else 
+            buf->convmode = InputModeMask;
+        ret = KEY_TEXT_CHANGE;
+    }
+    if ((buf->convmode & (InputModeMask|ConvedModeMask))
+            && buf->curseg < buf->segnum) {
+        if (buf->convmode & ConvedModeMask) {
+            if (buf->selectconv &&
+                    buf->input[buf->curseg]->cursegmode != MODE_HIRA) {
+                ret |= _Xsj3cModeChange(buf, MODE_HIRA, ON);
+                buf->convedsegnum--;
+                buf->input[buf->curseg]->status = SEG_NOCONV;
+            } else {
+                if (buf->selectcount > 0) {
+                    int     cur;
+                    if (!buf->candidate)
+                        Xsj3cGetCandidateNum(buf, &cur);
+                    if (buf->selectcount < buf->candnum) {
+                        if (buf->n_select < buf->selectcount) {
+                            buf->n_select++;
+                            return(_Xsj3cNext(buf));
+                        }
+                    }
+                }
+                buf->convmode = SelectModeMask;
+                ret |= KEY_CAND_START;
+                if (buf->dispmodechange) {
+                    buf->dispmode = MODE_CAND;
+                    ret |= KEY_MODE_CHANGE;
+                }
+                buf->selectstatus = SELECT_CAND;
+                buf->n_select = 0;
+                return (ret);
+            }
+        } else if (buf->beforeconv) {
+            register wchar  *p;
+            p = buf->input[buf->curseg]->yomi;
+            while (*p != '\0') {
+                if (!ishira(*p, serverIF[buf->server].lang)) {
+                    ret |= _Xsj3cModeChange(buf, MODE_HIRA, ON);
+                    break;
+                }
+                p++;
+            }
+        } else if (buf->lastdoubleconv && *buf->rkdouble != '\0') {
+            register unsigned char  *p, q;
+            i = buf->input[buf->curseg]->num - 1;
+            q = buf->input[buf->curseg]->yomi[i] & 0xff;
+            p = buf->rkdouble;
+            while (*p != '\0') {
+                if (*p == q) {
+                    ret |= _Xsj3cModeChange(buf,
+                        buf->input[buf->curseg]->cursegmode, ON);
+                    break;
+                }
+                p++;
+            }
+        }
+        ret |= KEY_TEXT_CHANGE;
+        switch (buf->henkanseg) {
+        case ALL:
+            begin = 0;
+            end = buf->segnum;
+            break;
+        case AFTER:
+            begin = buf->curseg;
+            end = buf->segnum;
+            break;
+        case ONE:
+        default:
+            begin = buf->curseg;
+            end = buf->curseg + 1;
+            break;
+        }
+
+        conved = buf->convedsegnum;
+        if (!buf->input[begin]->num) {
+            return (ret);
+        }
+        for (i = begin; i < end; i += value) {
+            if (buf->input[i]->status == SEG_CONVED) {
+                value = 1;
+                continue;
+            }
+            if (buf->input[i]->num > INPUT_YOMI_MAX || !buf->input[i]->num) {
+                Xsj3cWarning("Too long or short segment[%d].", i);
+                ret |= KEY_BELL;
+                value = 1;
+                continue;
+            }
+            buf->input[i]->n_roma = 0;
+            buf->input[i]->n_kana = -1;
+            *buf->input[i]->str = '\0';
+            buf->input[i]->sp = buf->input[i]->str;
+            *buf->input[i]->oldstr = '\0';
+            _Xsj3cwPStomPS(buf, kanabuf, buf->input[i]->yomi);
+            value = serverIF[buf->server].func[FUNC_CONV]
+                    (kanabuf, bun, knjbuf, KANJIBUFSIZ);
+            if (value  <= 0) {
+                if (value  < 0) 
+                    Xsj3cWarning("sj3serv is down. reconnect please");
+                else 
+                    Xsj3cWarning("Too long segment[%d]. Could not convert.", i);
+                ret |= KEY_BELL;
+                value = 1;
+                continue;
+            }
+            _Xsj3cStoreKanji(buf, bun, i, value, OFF);
+            buf->convedsegnum += value;
+            buf->segnum += (--value);
+        }
+        if (buf->henkanseg != ONE || !conved) {
+            switch (buf->beginlastseg) {
+            case NONE:
+                buf->curseg = buf->segnum;
+                break;
+            case ON:
+                buf->curseg = buf->segnum - 1;
+                break;
+            case OFF:
+                buf->curseg = 0;
+                break;
+            default:
+                buf->curseg = 0;
+                break;
+            }
+        }
+        if (buf->dispmodechange) {
+            buf->dispmode = (buf->convedsegnum == buf->segnum ? MODE_KANJI :
+                (buf->convedsegnum ? MODE_EDIT : buf->inputmode));
+            ret |= KEY_MODE_CHANGE;
+        }
+        return ret;
+    } else {
+#ifdef THROUGH_CONT
+        return (KEY_BELL);
+#else /* THROUGH_CONT */
+        if (buf->cntrlsame)
+            return (KEY_BELL);
+        else 
+            return (KEY_TEXT_CHANGE|KEY_BELL);  /* dummy */
+#endif /* THROUGH_CONT */
+    }
+}
+
+/*
+ * _Xsj3cUnConvert() [muhen/unconvert]
+ *
+ * <InputMode/ConvedMode> Unconvert segments.
+ * <SelectMode> pop down the panel candidate(symbol/hinsi) panel and
+ *   unconvert segments.
+ * <DictMode> Pop down Auxpanel and unconvert segments.
+ * <NoInputMode> Does nothing.
+ *
+ * DisplayModeChange on: Change the display mode string.  
+ * MuhenkanCursorLast on: Set cursor position to bottom of segment.
+ * MuhenkanCursorLast off: Set cursor position to top of segment.
+ * MuhenkanSegment all: Unconvert all segments.
+ * MuhenkanSegment after: Unconvert segments after current segment.
+ * MuhenkanSegment one: Unconvert current segment.
+ */
+Xsj3cEvent
+_Xsj3cUnConvert(buf)
+    Xsj3cBuf            buf;
+{
+    Xsj3cEvent          ret = KEY_NULL;
+
+    if (buf->convmode & SelectModeMask) {
+        ret |= KEY_SELECT_ABORT;
+        if (buf->selectstatus == SELECT_HINSI) {
+            ret |= KEY_DICT_END;
+        }
+    } else if (buf->convmode & DictModeMask) {
+        ret |= KEY_DICT_END;
+    } else if (buf->convmode & NoInputModeMask) {
+#ifdef THROUGH_CONT
+        return (KEY_NULL);
+#else /* THROUGH_CONT */
+        if (buf->cntrlsame)
+            return (KEY_NULL);
+        else 
+            return (KEY_TEXT_CHANGE);   /* dummy */
+#endif /* THROUGH_CONT */
+    }
+    buf->convmode = InputModeMask;
+    ret |= _Xsj3cUnConvSeg(buf, buf->muhenseg, buf->muhencurlast);
+    _Xsj3cStoreYomi(buf, buf->input[buf->curseg], 0);
+    return (ret);
+}
+
+/*
+ * _Xsj3cUnConvSeg()
+ *  Change current segment back to non converted
+ * and set converion mode to InputMode.
+ */
+Xsj3cEvent
+_Xsj3cUnConvSeg(buf, muhenseg, muhencurlast)
+    Xsj3cBuf            buf;
+    Xsj3cFlag           muhenseg,   muhencurlast;
+{
+    register int        i,  begin,  end,    unconved = 0;
+    Xsj3cEvent          ret = KEY_TEXT_CHANGE;
+
+    buf->n_select = 0;
+    if (buf->candidate) 
+        Xsj3cEndCandidate(buf, OFF);
+    switch (muhenseg) {
+    case ALL:
+        begin = 0;
+        end = buf->segnum;
+        break;
+    case AFTER:
+        begin = buf->curseg;
+        end = buf->segnum;
+        break;
+    case ONE:
+    default:
+        begin = buf->curseg;
+        end = buf->curseg + 1;
+        break;
+    }
+    for (i = begin; i < end; i++) {
+        if (buf->input[begin]->status == SEG_NOCONV)
+            unconved++;
+        else
+            break;
+    }
+    if (unconved == (end - begin)) {
+#ifdef THROUGH_CONT
+        return (KEY_NULL);
+#else /* THROUGH_CONT */
+        if (buf->cntrlsame)
+            return (KEY_NULL);
+        else 
+            return (KEY_TEXT_CHANGE);   /* dummy */
+#endif /* THROUGH_CONT */
+    }
+    for (i = begin + 1; i < end; i++) {
+        _Xsj3cWcat(buf->input[begin]->yomi, buf->input[i]->yomi);
+        buf->input[begin]->num += buf->input[i]->num;
+    }
+    buf->input[begin]->cur = buf->input[begin]->num;
+    for (i = begin + 1; i < end; i++) {
+        Xsj3cFreeSegment(buf->input[i]);
+        buf->input[i] = NULL;
+    }
+    Xsj3cFreeSegment(buf->input[buf->segnum]);
+    buf->input[buf->segnum] = NULL;
+    buf->segnum -= (end - begin - 1);
+    buf->curseg = begin;
+    buf->convedsegnum -= (end - begin);
+    if (!buf->convedsegnum) {
+        if (buf->gakusyuu) 
+            _Xsj3cClearDcid(buf);
+        if (buf->dispmodechange) {
+            buf->dispmode = buf->inputmode;
+            ret |= KEY_MODE_CHANGE;
+        }
+    } else if (buf->dispmodechange) {
+        buf->dispmode = ((buf->segnum
+            && buf->convedsegnum == buf->segnum) ? MODE_KANJI :
+            (buf->convedsegnum ? MODE_EDIT : buf->inputmode));
+        ret |= KEY_MODE_CHANGE;
+    }
+    buf->input[begin]->change = OFF;
+    buf->input[begin]->status = SEG_NOCONV;
+    if (!(buf->movebyseg & SEG_NOCONV))
+        buf->input[begin]->edit = SEG_EDIT;
+    if (muhencurlast)
+        buf->input[begin]->cur = buf->input[begin]->num;
+    else
+        buf->input[begin]->cur = 0;
+    return (ret);
+}
+
+/*
+ * _Xsj3cFix() [kettei/flush/fix]
+ *
+ * <InputMode/ConvedMode> Fix all segments.
+ *    the candidate(symbol) panel.
+ * <SelectMode> Select reversed candidate(symbol/hinsi)
+ *   in the candidate(symbol/hinsi) panel and pop down the panel.
+ * <DictMode> (DICT_INPUT) Decide current yomi character string.
+ *            (DICT_CONFIRM) Confirm to register/eliminate word.
+ *            (DICT_END) Pop down Auxpanel
+ * <NoInputMode> Does nothing.
+ *
+ * DisplayModeChange on: Change the display mode string.  
+ */
+Xsj3cEvent
+_Xsj3cFix(buf)
+    Xsj3cBuf    buf;
+{
+    switch (buf->convmode) {
+    case SelectModeMask:
+        if (buf->selectstatus == SELECT_HINSI) {
+            buf->dict->status = DICT_CONFIRM;
+            if (buf->dispmodechange) {
+                buf->dispmode =
+                    (buf->dict->mode == REG_STATE ? MODE_TOROKU : MODE_SYOUKYO);
+                return (KEY_SELECT_END|KEY_DICT_CHANGE|KEY_MODE_CHANGE);
+            } else
+                return (KEY_SELECT_END|KEY_DICT_CHANGE);
+        } else {
+            if (buf->dispmodechange) {
+                buf->dispmode = buf->inputmode;
+                return (KEY_TEXT_FIXED|KEY_TEXT_CHANGE
+                    |KEY_SELECT_END|KEY_MODE_CHANGE);
+            } else
+                return (KEY_TEXT_FIXED|KEY_TEXT_CHANGE|KEY_SELECT_END);
+        }
+    case DictModeMask:
+        switch (buf->dict->status) {
+        case DICT_INPUT:
+            if (buf->dict->seg->num > 0) {
+                if (buf->dict->seg->num > DICT_YOMI_MAX) {
+                    buf->dict->status = DICT_END;
+                    buf->curhinsi = -1;
+                    buf->dict->value = SJ3_LONG_YOMI_STR;
+                    _Xsj3cFlushDictMsg(buf);
+                    return(KEY_DICT_CHANGE);
+                } else {
+                    if (buf->dict->mode == REG_STATE) {
+                        buf->dict->status = DICT_HINSI;
+                        buf->selectstatus = SELECT_HINSI;
+                        buf->convmode = SelectModeMask;
+                        _Xsj3cFlushDictMsg(buf);
+                        if (buf->dispmodechange) {
+                            buf->dispmode = MODE_HINSI;
+                            return (KEY_HINSI_START|KEY_MODE_CHANGE);
+                        } else 
+                            return (KEY_HINSI_START);
+                    } else {
+                        buf->dict->status = DICT_CONFIRM;
+                        _Xsj3cFlushDictMsg(buf);
+                        return (KEY_DICT_CHANGE);
+                    }
+                }
+            } else {
+                buf->dict->status = DICT_END;
+                buf->curhinsi = -1;
+                buf->dict->value = SJ3_NO_YOMI_STR;
+                _Xsj3cFlushDictMsg(buf);
+                return(KEY_DICT_CHANGE);
+            }
+        case DICT_CONFIRM:
+            buf->dict->status = DICT_END;
+            return (buf->dict->mode == REG_STATE ?
+                    KEY_DICT_REGISTER : KEY_DICT_CLEAR);
+        case DICT_END:
+            if (buf->dispmodechange) {
+                buf->dispmode
+                    = (buf->convedsegnum == buf->segnum ? MODE_KANJI :
+                    (buf->convedsegnum ? MODE_EDIT : buf->inputmode));
+                return(KEY_DICT_END|KEY_TEXT_CHANGE|KEY_MODE_CHANGE);
+            } else 
+                return(KEY_DICT_END|KEY_TEXT_CHANGE);
+        default:
+#ifdef THROUGH_CONT
+            return (KEY_BELL);
+#else /* THROUGH_CONT */
+            if (buf->cntrlsame)
+                return (KEY_BELL);
+            else 
+                return (KEY_TEXT_CHANGE|KEY_BELL);  /* dummy */
+#endif /* THROUGH_CONT */
+        }
+    case NoInputModeMask:
+#ifdef THROUGH_CONT
+        return (KEY_NULL);
+#else /* THROUGH_CONT */
+        if (buf->cntrlsame)
+            return (KEY_NULL);
+        else 
+            return (KEY_TEXT_CHANGE);   /* dummy */
+#endif /* THROUGH_CONT */
+    case InputModeMask:
+    case ConvedModeMask:
+    default:
+        if (buf->dispmodechange) {
+            buf->dispmode = buf->inputmode;
+            return (KEY_TEXT_FIXED|KEY_TEXT_CHANGE|KEY_MODE_CHANGE);
+        } else 
+            return (KEY_TEXT_FIXED|KEY_TEXT_CHANGE);
+    }
+}
+
+/*
+ * _Xsj3cReturn() [return]
+ *
+ * <NoInputMode/InputMode> Put the carriage return after current position
+ *   and fix all segments.
+ * <ConvedMode> Put the carriage return after current segment
+ *   and fix all segments.
+ * <SelectMode> Select reversed candidate(symbol/hinsi)
+ *   in the candidate(symbol/hinsi) panel and pop down the panel.
+ * <DictMode> (DICT_INPUT) Decide current yomi character string.
+ *            (DICT_CONFIRM) Confirm to register/eliminate word.
+ *            (DICT_END) Pop down Auxpanel
+ *
+ * DisplayModeChange on: Change the display mode string.  
+ */
+Xsj3cEvent
+_Xsj3cReturn(buf)
+    Xsj3cBuf        buf;
+{
+    unsigned char   ch[2];
+    int             change_pos;
+    register int    i;
+
+    switch (buf->convmode) {
+    case NoInputModeMask:
+        buf->convmode = InputModeMask;
+    case InputModeMask:
+        if (buf->segnum == buf->curseg)
+            buf->segnum++;
+        ch[0] = '\r';
+        ch[1] = '\0';
+        change_pos = buf->input[buf->curseg]->cur;
+        _Xsj3cInsertChar(buf, buf->input[buf->curseg], ch, 1);
+        _Xsj3cStoreYomi(buf, buf->input[buf->curseg], change_pos);
+        if (buf->dispmodechange) {
+            buf->dispmode = buf->inputmode;
+            return (KEY_TEXT_FIXED|KEY_TEXT_CHANGE|KEY_MODE_CHANGE);
+        } else
+            return (KEY_TEXT_FIXED|KEY_TEXT_CHANGE);
+    case ConvedModeMask:
+        i = buf->input[buf->curseg]->dnum;
+        buf->input[buf->curseg]->disp[i++] = '\n';
+        buf->input[buf->curseg]->disp[i] = '\0';
+        buf->input[buf->curseg]->dnum++;
+        if (buf->dispmodechange) {
+            buf->dispmode = buf->inputmode;
+            return (KEY_TEXT_FIXED|KEY_TEXT_CHANGE|KEY_MODE_CHANGE);
+        } else
+            return (KEY_TEXT_FIXED|KEY_TEXT_CHANGE);
+    case DictModeMask:
+        switch (buf->dict->status) {
+        case DICT_INPUT:
+            if (buf->dict->seg->num) {
+                if (buf->dict->seg->num > DICT_YOMI_MAX) {
+                    buf->dict->status = DICT_END;
+                    buf->curhinsi = -1;
+                    buf->dict->value = SJ3_LONG_YOMI_STR;
+                    _Xsj3cFlushDictMsg(buf);
+                    return(KEY_DICT_CHANGE);
+                } else {
+                    if (buf->dict->mode == REG_STATE) {
+                        buf->dict->status = DICT_HINSI;
+                        buf->selectstatus = SELECT_HINSI;
+                        buf->convmode = SelectModeMask;
+                        _Xsj3cFlushDictMsg(buf);
+                        if (buf->dispmodechange) {
+                            buf->dispmode = MODE_HINSI;
+                            return (KEY_HINSI_START|KEY_MODE_CHANGE);
+                        } else 
+                            return (KEY_HINSI_START);
+                    } else {
+                        buf->dict->status = DICT_CONFIRM;
+                        _Xsj3cFlushDictMsg(buf);
+                        return (KEY_DICT_CHANGE);
+                    }
+                }
+            } else {
+                buf->dict->status = DICT_END;
+                buf->curhinsi = -1;
+                buf->dict->value = SJ3_NO_YOMI_STR;
+                _Xsj3cFlushDictMsg(buf);
+                return(KEY_DICT_CHANGE);
+            }
+        case DICT_CONFIRM:
+            buf->dict->status = DICT_END;
+            return (buf->dict->mode == REG_STATE ?
+                    KEY_DICT_REGISTER : KEY_DICT_CLEAR);
+        case DICT_END:
+            if (buf->dispmodechange) {
+                buf->dispmode
+                    = (buf->convedsegnum == buf->segnum ? MODE_KANJI :
+                    (buf->convedsegnum ? MODE_EDIT : buf->inputmode));
+                return(KEY_DICT_END|KEY_TEXT_CHANGE|KEY_MODE_CHANGE);
+            } else 
+                return(KEY_DICT_END|KEY_TEXT_CHANGE);
+        default:
+#ifdef THROUGH_CONT
+            return (KEY_BELL);
+#else /* THROUGH_CONT */
+            if (buf->cntrlsame)
+                return (KEY_BELL);
+            else 
+                return (KEY_TEXT_CHANGE|KEY_BELL);  /* dummy */
+#endif /* THROUGH_CONT */
+        }
+    case SelectModeMask:
+        if (buf->selectstatus == SELECT_HINSI) {
+            buf->dict->status = DICT_CONFIRM;
+            if (buf->dispmodechange) {
+                buf->dispmode =
+                    (buf->dict->mode == REG_STATE ? MODE_TOROKU : MODE_SYOUKYO);
+                return (KEY_SELECT_END|KEY_DICT_CHANGE|KEY_MODE_CHANGE);
+            } else
+                return (KEY_SELECT_END|KEY_DICT_CHANGE);
+        } else {
+            if (buf->dispmodechange) {
+                buf->dispmode = (buf->convedsegnum == buf->segnum ? MODE_KANJI :
+                    (buf->convedsegnum ? MODE_EDIT : buf->inputmode));
+                return (KEY_SELECT_END|KEY_MODE_CHANGE);
+            } else
+                return (KEY_SELECT_END);
+        }
+    default:
+#ifdef THROUGH_CONT
+        return (KEY_BELL);
+#else /* THROUGH_CONT */
+        if (buf->cntrlsame)
+            return (KEY_BELL);
+        else 
+            return (KEY_TEXT_CHANGE|KEY_BELL);  /* dummy */
+#endif /* THROUGH_CONT */
+    }
+}
+
+/*
+ * _Xsj3cModeHAlpha() [halpha]
+ *
+ * <NoInputMode/InputMode/ConvedMode/DictMode> Change character mode
+ *   to "hankaku-ascii".
+ * <SelectMode> Ring bell.
+ *
+ * ModeConversion on: Convert character mode of current segment
+ *   to "hankaku-ascii".
+ * ModeConversion off: Change character mode of input mode.
+ */
+Xsj3cEvent
+_Xsj3cModeHAlpha(buf)
+    Xsj3cBuf    buf;
+{
+    Xsj3cFlag   conv;
+
+    if (!buf->segnum) {
+        if (buf->modeconv[MODE_HALPHA] >> 2) {
+#ifdef THROUGH_CONT
+            return (KEY_NULL);
+#else /* THROUGH_CONT */
+            if (buf->cntrlsame)
+                return (KEY_NULL);
+            else 
+                return (KEY_TEXT_CHANGE);   /* dummy */
+#endif /* THROUGH_CONT */
+        } else
+            conv = OFF;
+    } else if (buf->input[buf->curseg] &&
+            buf->input[buf->curseg]->status & buf->modeconv[MODE_HALPHA]) {
+        conv = ON;
+    } else {
+        conv = OFF;
+    }
+    return (_Xsj3cModeChange(buf, MODE_HALPHA, conv));
+}
+
+/*
+ * _Xsj3cModeZAlpha()  [zalpha]
+ *
+ * <NoInputMode/InputMode/ConvedMode/DictMode> Change character mode
+ *   to "zenkaku-ascii".
+ * <SelectMode> Ring bell.
+ *
+ * ModeConversion on: Convert character mode of current segment
+ *   to "zenkaku-ascii".
+ * ModeConversion off: Change character mode of input mode.
+ */
+Xsj3cEvent
+_Xsj3cModeZAlpha(buf)
+    Xsj3cBuf    buf;
+{
+    Xsj3cFlag   conv;
+
+    if (!buf->segnum) {
+        if (buf->modeconv[MODE_ZALPHA] >> 2) {
+#ifdef THROUGH_CONT
+            return (KEY_NULL);
+#else /* THROUGH_CONT */
+            if (buf->cntrlsame)
+                return (KEY_NULL);
+            else 
+                return (KEY_TEXT_CHANGE);   /* dummy */
+#endif /* THROUGH_CONT */
+        } else
+            conv = OFF;
+    } else if (buf->input[buf->curseg] &&
+            buf->input[buf->curseg]->status & buf->modeconv[MODE_ZALPHA]) {
+        conv = ON;
+    } else {
+        conv = OFF;
+    }
+    return (_Xsj3cModeChange(buf, MODE_ZALPHA, conv));
+}
+
+/*
+ * _Xsj3cModeHKata() [hkatakana]
+ *
+ * <NoInputMode/InputMode/ConvedMode/DictMode> Change character mode
+ *   to "hankaku-katakana".
+ * <SelectMode> Ring bell.
+ *
+ * ModeConversion on: Convert character mode of current segment
+ *   to "hankaku-katakana".
+ * ModeConversion off: Change character mode of input mode.
+ */
+Xsj3cEvent
+_Xsj3cModeHKata(buf) 
+    Xsj3cBuf    buf;
+{
+    Xsj3cFlag   conv;
+
+    if (!buf->segnum) {
+        if (buf->modeconv[MODE_HKATA] >> 2) {
+#ifdef THROUGH_CONT
+            return (KEY_NULL);
+#else /* THROUGH_CONT */
+            if (buf->cntrlsame)
+                return (KEY_NULL);
+            else 
+                return (KEY_TEXT_CHANGE);   /* dummy */
+#endif /* THROUGH_CONT */
+        } else
+            conv = OFF;
+    } else if (buf->input[buf->curseg] &&
+            buf->input[buf->curseg]->status & buf->modeconv[MODE_HKATA]) {
+        conv = ON;
+    } else {
+        conv = OFF;
+    }
+    return (_Xsj3cModeChange(buf, MODE_HKATA, conv));
+}
+
+/*
+ * _Xsj3cModeZKata() [zkatakana]
+ *
+ * <NoInputMode/InputMode/ConvedMode/DictMode> Change character mode
+ *   to "zenkaku-katakana".
+ * <SelectMode> Ring bell.
+ *
+ * ModeConversion on: Convert character mode of current segment
+ *   to "zenkaku-katakana".
+ * ModeConversion off: Change character mode of input mode.
+ */
+Xsj3cEvent
+_Xsj3cModeZKata(buf)
+    Xsj3cBuf    buf;
+{
+    Xsj3cFlag   conv;
+
+    if (!buf->segnum) {
+        if (buf->modeconv[MODE_ZKATA] >> 2) {
+#ifdef THROUGH_CONT
+            return (KEY_NULL);
+#else /* THROUGH_CONT */
+            if (buf->cntrlsame)
+                return (KEY_NULL);
+            else 
+                return (KEY_TEXT_CHANGE);   /* dummy */
+#endif /* THROUGH_CONT */
+        } else
+            conv = OFF;
+    } else if (buf->input[buf->curseg] &&
+            buf->input[buf->curseg]->status & buf->modeconv[MODE_ZKATA]) {
+        conv = ON;
+    } else {
+        conv = OFF;
+    }
+    return (_Xsj3cModeChange(buf, MODE_ZKATA, conv));
+}
+
+
+/*
+ * _Xsj3cModeHira() [hiragana]
+ *
+ * <NoInputMode/InputMode/ConvedMode/DictMode> Change character mode
+ *   to "hiragana".
+ * <SelectMode> Ring bell.
+ *
+ * ModeConversion on: Convert character mode of current segment to "hiragana".
+ * ModeConversion off: Change character mode of input mode.
+ */
+Xsj3cEvent
+_Xsj3cModeHira(buf)
+    Xsj3cBuf    buf;
+{
+    Xsj3cFlag   conv;
+
+    if (!buf->segnum) {
+        if (buf->modeconv[MODE_HIRA] >> 2) {
+#ifdef THROUGH_CONT
+            return (KEY_NULL);
+#else /* THROUGH_CONT */
+            if (buf->cntrlsame)
+                return (KEY_NULL);
+            else 
+                return (KEY_TEXT_CHANGE);   /* dummy */
+#endif /* THROUGH_CONT */
+        } else
+            conv = OFF;
+    } else if (buf->input[buf->curseg] &&
+            buf->input[buf->curseg]->status & buf->modeconv[MODE_HIRA]) {
+        conv = ON;
+    } else {
+        conv = OFF;
+    }
+    return (_Xsj3cModeChange(buf, MODE_HIRA, conv));
+}
+
+/*
+ * _Xsj3cToHAlpha() [tohalpha]
+ *
+ * <NoInputTo/InputMode/ConvedMode/DictMode> Convert character mode
+ *   to "hankaku-ascii".
+ * <SelectTo> Ring bell.
+ */
+Xsj3cEvent
+_Xsj3cToHAlpha(buf)
+    Xsj3cBuf    buf;
+{
+    return (_Xsj3cModeChange(buf, MODE_HALPHA, ON));
+}
+
+/*
+ * _Xsj3cToZAlpha()  [tozalpha]
+ *
+ * <NoInputTo/InputMode/ConvedMode/DictMode> Convert character mode
+ *   to "zenkaku-ascii".
+ * <SelectTo> Ring bell.
+ */
+Xsj3cEvent
+_Xsj3cToZAlpha(buf)
+    Xsj3cBuf    buf;
+{
+    return (_Xsj3cModeChange(buf, MODE_ZALPHA, ON));
+}
+
+/*
+ * _Xsj3cToHKata() [tohkatakana]
+ *
+ * <NoInputTo/InputMode/ConvedMode/DictMode> Convert character mode
+ *   to "hankaku-katakana".
+ * <SelectTo> Ring bell.
+ */
+Xsj3cEvent
+_Xsj3cToHKata(buf) 
+    Xsj3cBuf    buf;
+{
+    return (_Xsj3cModeChange(buf, MODE_HKATA, ON));
+}
+
+/*
+ * _Xsj3cToZKata() [tozkatakana]
+ *
+ * <NoInputTo/InputMode/ConvedMode/DictMode> Convert character mode
+ *   to "zenkaku-katakana".
+ * <SelectTo> Ring bell.
+ */
+Xsj3cEvent
+_Xsj3cToZKata(buf)
+    Xsj3cBuf    buf;
+{
+    return (_Xsj3cModeChange(buf, MODE_ZKATA, ON));
+}
+
+
+/*
+ * _Xsj3cToHira() [tohiragana]
+ *
+ * <NoInputTo/InputMode/ConvedMode/DictMode> Convert character mode
+ *   to "hiragana".
+ * <SelectTo> Ring bell.
+ */
+Xsj3cEvent
+_Xsj3cToHira(buf)
+    Xsj3cBuf    buf;
+{
+    return (_Xsj3cModeChange(buf, MODE_HIRA, ON));
+}
+
+/*
+ * _Xsj3cToZenkaku() [zenkaku]
+ *
+ * <NoInputTo/InputMode/ConvedMode/DictMode> Convert current segment
+ *   character mode to zenkaku.
+ * <SelectTo> Ring bell.
+ */
+Xsj3cEvent
+_Xsj3cZenkaku(buf)
+    Xsj3cBuf    buf;
+{
+    return (_Xsj3cModeChange(buf, MODE_ZENKAKU, ON));
+}
+
+/*
+ * _Xsj3cToHankaku() [zenkaku]
+ *
+ * <NoInputTo/InputMode/ConvedMode/DictMode> Convert current segment
+ *   character mode to hankaku.
+ * <SelectTo> Ring bell.
+ */
+Xsj3cEvent
+_Xsj3cHankaku(buf)
+    Xsj3cBuf    buf;
+{
+    return (_Xsj3cModeChange(buf, MODE_HANKAKU, ON));
+}
+
+/*
+ * _Xsj3cToUpper() [toupper]
+ *
+ * <NoInputTo/InputMode/ConvedMode/DictMode> Convert current segment
+ *   character mode to upper case.
+ * <SelectTo> Ring bell.
+ */
+Xsj3cEvent
+_Xsj3cToUpper(buf)
+    Xsj3cBuf    buf;
+{
+    return (_Xsj3cModeChange(buf, MODE_UPPER, ON));
+}
+
+/*
+ * _Xsj3cToLower() [tolower]
+ *
+ * <NoInputTo/InputMode/ConvedMode/DictMode> Convert current segment
+ *   character mode to lower case.
+ * <SelectTo> Ring bell.
+ */
+Xsj3cEvent
+_Xsj3cToLower(buf)
+    Xsj3cBuf    buf;
+{
+    return (_Xsj3cModeChange(buf, MODE_LOWER, ON));
+}
+
+/*
+ * _Xsj3cModeSJIS() [sjis]
+ *
+ * <NoInputMode/InputMode/ConvedMode/DictMode> If now input
+ *   code is not "Shift-JIS", change to Shift-JIS code input mode,
+ *   else change to initialized input mode.
+ * <SelectMode> Ring bell.
+ */
+Xsj3cEvent
+_Xsj3cModeSJIS(buf)
+    Xsj3cBuf    buf;
+{
+    if (buf->convmode & SelectModeMask) 
+        return (KEY_BELL);
+    if (buf->inputmode != MODE_SJIS) {
+        buf->dispmode = buf->inputmode = MODE_SJIS;
+        return (_Xsj3cModeClear(buf));
+    } else {
+        buf->dispmode = buf->inputmode = buf->inmoderot[0];
+        return (_Xsj3cModeClear(buf));
+    }
+}
+
+/*
+ * _Xsj3cModeEUC() [euc]
+ *
+ * <NoInputMode/InputMode/ConvedMode/DictMode> If now input code is not "EUC",
+ *   change to EUC code input mode, else change to initialized input mode.
+ * <SelectMode> Ring bell.
+ */
+Xsj3cEvent
+_Xsj3cModeEUC(buf)
+    Xsj3cBuf    buf;
+{
+    if (buf->convmode & SelectModeMask) 
+        return (KEY_BELL);
+    if (buf->inputmode != MODE_EUC) {
+        buf->dispmode = buf->inputmode = MODE_EUC;
+        return (_Xsj3cModeClear(buf));
+    } else {
+        buf->dispmode = buf->inputmode = buf->inmoderot[0];
+        return (_Xsj3cModeClear(buf));
+    }
+}
+
+/*
+ * _Xsj3cModeJIS() [jis]
+ *
+ * <NoInputMode/InputMode/ConvedMode/DictMode> If now input code is not "JIS",
+ *   change to JIS code input mode, else change to initialized input mode.
+ * <SelectMode> Ring bell.
+ */
+Xsj3cEvent
+_Xsj3cModeJIS(buf)
+    Xsj3cBuf    buf;
+{
+    if (buf->convmode & SelectModeMask) 
+        return (KEY_BELL);
+    if (buf->inputmode != MODE_JIS) {
+        buf->dispmode = buf->inputmode = MODE_JIS;
+        return (_Xsj3cModeClear(buf));
+    } else {
+        buf->dispmode = buf->inputmode = buf->inmoderot[0];
+        return (_Xsj3cModeClear(buf));
+    }
+}
+
+/*
+ * _Xsj3cModeKuten() [kuten]
+ *
+ * <NoInputMode/InputMode/ConvedMode/DictMode> If now input code is not "kuten",
+ *   change to kuten code input mode, else change to initialized input mode.
+ * <SelectMode> Ring bell.
+ */
+Xsj3cEvent
+_Xsj3cModeKuten(buf)
+    Xsj3cBuf    buf;
+{
+    if (buf->convmode & SelectModeMask) 
+        return (KEY_BELL);
+    if (buf->inputmode != MODE_KUTEN) {
+        buf->dispmode = buf->inputmode = MODE_KUTEN;
+        return (_Xsj3cModeClear(buf));
+    } else {
+        buf->dispmode = buf->inputmode = buf->inmoderot[0];
+        return (_Xsj3cModeClear(buf));
+    }
+}
+
+/*
+ * _Xsj3cCodeRollDown() [code]
+ *
+ * <NoInputMode/InputMode/ConvedMode/DictMode> Rotate down input code.
+ * <SelectMode> Ring bell.
+ */
+Xsj3cEvent
+_Xsj3cCodeRollDown(buf)
+    Xsj3cBuf        buf;
+{
+    register int    i;
+
+    if (buf->convmode & ~SelectModeMask) {
+        i = 0;
+        while (i < buf->coderotnum) {
+            if (buf->inputmode == buf->defcode[i++]) {
+                buf->dispmode = buf->inputmode = buf->defcode[i];
+                break;
+            }
+        }
+        if (i >= buf->coderotnum) {
+            buf->dispmode = buf->inputmode = buf->defcode[0];
+        }
+        return (_Xsj3cModeClear(buf));
+    } else {
+        return (KEY_BELL);
+    }
+}
+
+/*
+ * _Xsj3cModeRollDown() [toggle/modedown]
+ *
+ * <NoInputMode/InputMode/ConvedMode/DictMode>
+ *   Rotate down character mode to next mode.
+ * <SelectMode> Ring bell.
+ *
+ * ModeConversion on: Convert character mode of current segment to next.
+ * ModeConversion off: Rotate character mode of input mode.
+ */
+Xsj3cEvent
+_Xsj3cModeRollDown(buf)
+    Xsj3cBuf        buf;
+{
+    register int    i;
+    Xsj3csMode      premode,    postmode;
+    Xsj3cFlag       conv;
+
+    if (!buf->segnum) {
+        if (buf->modeconv[MODE_ROLLDOWN] >> 2) {
+#ifdef THROUGH_CONT
+            return (KEY_NULL);
+#else /* THROUGH_CONT */
+            if (buf->cntrlsame)
+                return (KEY_NULL);
+            else 
+                return (KEY_TEXT_CHANGE);   /* dummy */
+#endif /* THROUGH_CONT */
+        } else
+            conv = OFF;
+    } else if (buf->input[buf->curseg] &&
+            buf->input[buf->curseg]->status & buf->modeconv[MODE_ROLLDOWN]) {
+        conv = ON;
+    } else {
+        conv = OFF;
+    }
+    if (conv) {
+        return (_Xsj3cNextMode(buf));
+    } else {
+        premode = buf->inputmode;
+        i = 0;
+        while (i < buf->inmoderotnum) {
+            if (premode == buf->inmoderot[i++]) {
+                postmode = buf->inmoderot[i];
+                break;
+            }
+        }
+        if (i >= buf->inmoderotnum)
+            postmode = buf->inmoderot[0];
+        return(_Xsj3cModeChange(buf, postmode, OFF));
+    }
+}
+
+/*
+ * _Xsj3cModeRollUp() [toggleback/modeup]
+ *
+ * <NoInputMode/InputMode/ConvedMode/DictMode>
+ *   Rotate up character mode to previous mode.
+ * <SelectMode> Ring bell.
+ *
+ * ModeConversion on: Convert character mode of current segment to next.
+ * ModeConversion off: Rotate character mode of input mode.
+ */
+Xsj3cEvent
+_Xsj3cModeRollUp(buf)
+    Xsj3cBuf        buf;
+{
+    register int    i;
+    Xsj3csMode      premode,    postmode;
+    Xsj3cFlag       conv;
+
+    if (!buf->segnum) {
+        if (buf->modeconv[MODE_ROLLDOWN] >> 2) {
+#ifdef THROUGH_CONT
+            return (KEY_NULL);
+#else /* THROUGH_CONT */
+            if (buf->cntrlsame)
+                return (KEY_NULL);
+            else 
+                return (KEY_TEXT_CHANGE);   /* dummy */
+#endif /* THROUGH_CONT */
+        } else
+            conv = OFF;
+    } else if (buf->input[buf->curseg] &&
+            buf->input[buf->curseg]->status & buf->modeconv[MODE_ROLLDOWN]) {
+        conv = ON;
+    } else {
+        conv = OFF;
+    }
+    if (conv) {
+        return (_Xsj3cPrevMode(buf));
+    } else {
+        premode = buf->inputmode;
+        i = buf->inmoderotnum - 1;
+        while (i < buf->inmoderotnum) {
+            if (premode == buf->inmoderot[i--]) {
+                postmode = buf->inmoderot[i];
+                break;
+            }
+        }
+        if (i < 0)
+            postmode = buf->inmoderot[buf->inmoderotnum - 1];
+        return(_Xsj3cModeChange(buf, postmode, OFF));
+    }
+}
+
+/*
+ * _Xsj3cNextMode() [nextmode]
+ *
+ * <NoInputMode/InputMode/ConvedMode/DictMode>
+ *   Change current segment character mode to next mode.
+ * <SelectMode> Ring bell.
+ */
+Xsj3cEvent
+_Xsj3cNextMode(buf)
+    Xsj3cBuf        buf;
+{
+    register int    i;
+    Xsj3csMode      premode,    postmode,   aftermode = MODE_HIRA;
+    Xsj3cEvent      ret;
+
+    if (buf->convmode & NoInputModeMask) {
+#ifdef THROUGH_CONT
+        return (KEY_NULL);
+#else /* THROUGH_CONT */
+        if (buf->cntrlsame)
+            return (KEY_NULL);
+        else 
+            return (KEY_TEXT_CHANGE);   /* dummy */
+#endif /* THROUGH_CONT */
+    }
+    premode = buf->input[buf->curseg]->cursegmode;
+    i = 0;
+    while (i < buf->outmoderotnum) {
+        if (premode == buf->outmoderot[i++]) {
+            postmode = buf->outmoderot[i];
+            break;
+        }
+    }
+    if (i >= buf->outmoderotnum) {
+        aftermode = premode;
+        premode = _Xsj3cCheckMode(buf, buf->input[buf->curseg]);
+        i = 0;
+        while (i < buf->outmoderotnum) {
+            if (premode == buf->outmoderot[i++]) {
+                postmode = buf->outmoderot[i];
+                break;
+            }
+        }
+        if (i >= buf->outmoderotnum)
+            postmode = buf->outmoderot[0];
+    }
+    ret = _Xsj3cModeChange(buf, postmode, ON);
+    if ((aftermode == MODE_UPPER || aftermode == MODE_LOWER)
+        && (postmode == MODE_ZALPHA || postmode == MODE_HALPHA)) {
+        ret |= _Xsj3cModeChange(buf, aftermode, ON);
+    }
+    return (ret);
+}
+
+/*
+ * _Xsj3cPrevMode() [prevmode]
+ *
+ * <NoInputMode/InputMode/ConvedMode/DictMode>
+ *   Change current segment character mode to previous mode.
+ * <SelectMode> Ring bell.
+ */
+Xsj3cEvent
+_Xsj3cPrevMode(buf)
+    Xsj3cBuf        buf;
+{
+    register int    i;
+    Xsj3csMode      premode,    postmode,   aftermode = MODE_HIRA;
+    Xsj3cEvent      ret;
+
+    if (buf->convmode & NoInputModeMask) {
+#ifdef THROUGH_CONT
+        return (KEY_NULL);
+#else /* THROUGH_CONT */
+        if (buf->cntrlsame)
+            return (KEY_NULL);
+        else 
+            return (KEY_TEXT_CHANGE);   /* dummy */
+#endif /* THROUGH_CONT */
+    }
+    premode = buf->input[buf->curseg]->cursegmode;
+    i = buf->outmoderotnum - 1;
+    while (i >= 0) {
+        if (premode == buf->outmoderot[i--]) {
+            postmode = buf->outmoderot[i];
+            break;
+        }
+    }
+    if (i < 0) {
+        aftermode = premode;
+        premode = _Xsj3cCheckMode(buf, buf->input[buf->curseg]);
+        i = buf->outmoderotnum - 1;
+        while (i >= 0) {
+            if (premode == buf->outmoderot[i--]) {
+                postmode = buf->outmoderot[i];
+                break;
+            }
+        }
+        if (i < 0)
+            postmode = buf->outmoderot[buf->outmoderotnum - 1];
+    }
+    ret = _Xsj3cModeChange(buf, postmode, ON);
+    if ((aftermode == MODE_UPPER || aftermode == MODE_LOWER)
+        && (postmode == MODE_ZALPHA || postmode == MODE_HALPHA)) {
+        ret |= _Xsj3cModeChange(buf, aftermode, ON);
+    }
+    return(ret);
+}
+
+/*
+ * _Xsj3cModeToggle() [muhenkan]
+ *
+ * Emulating of sj2/sj3/sjx's muhenkan stroke.
+ * <NoInputMode/InputMode> Change input character mode to "MuhenkanMode".
+ * <ConvedMode/DictMode> Converts current segment character input mode first to
+ *   hiragana, second to zenkaku-katakana , third to "MuhenkanInEdit".
+ * <SelectMode> Does nothing.
+ *
+ * MuhenkanMode mode: Mode of toggling in InputMode after input chacter mode
+ *   is changed to hiragana.
+ * MuhenkanInEdit mode: Mode of toggling in ConvedMode after segment is
+ *   converted to hiragana and zenkaku-katakana.
+ * MuhenkanToggle off: Stop toggling in InputMode.
+ */
+Xsj3cEvent
+_Xsj3cModeToggle(buf)
+    Xsj3cBuf        buf;
+{
+    register int    i;
+    register wchar  (*conv)();
+    unsigned char  *mbs;
+    Xsj3cEvent      ret;
+    Xsj3cSeg        seg = buf->input[buf->curseg];
+
+    if (buf->convmode & ~(SelectModeMask|DictModeMask)) {
+        if (buf->convmode & ConvedModeMask ||((buf->convmode & InputModeMask)
+                && (seg->edit & SEG_NOEDIT))) {
+            if ((mbs = (unsigned char *)malloc(seg->size * 2 * sizeof(wchar)))
+                    == NULL)
+                Xsj3cError("Cannot allocate for mode conversion buffer");
+
+            switch (seg->cursegmode) {
+            case MODE_HIRA:
+                if (seg->num != seg->dnum) {
+                    ret = _Xsj3cModeChange(buf, MODE_HIRA, ON);
+                } else {
+                    if (conv =
+                        CodeConvFunc[serverIF[buf->server].lang][out_lang]) {
+                        register wchar  w1, w2;
+                        for (i = 0;i < seg->dnum; i++) {
+                            w1 = seg->yomi[i];
+                            if (iskan1(w1 >> 8, serverIF[buf->server].lang) &&
+                                iskan2(w1 & 0xff, serverIF[buf->server].lang))
+                                w2 = conv(w1);
+                            else 
+                                w2 = w1;
+                            if (w2 != seg->disp[i])
+                                break;
+                        }
+                    } else {
+                        for (i = 0;i < seg->dnum;i++) {
+                            if (seg->disp[i] != seg->yomi[i])
+                                break;
+                        }
+                    }
+                    if (i < seg->dnum)
+                        ret = _Xsj3cModeChange(buf, MODE_HIRA, ON);
+                    else {
+                        ret = _Xsj3cModeChange(buf, MODE_ZKATA, ON);
+                    }
+                }
+                break;
+            case MODE_ZKATA:
+                ret = _Xsj3cModeChange(buf, buf->togglemode, ON);
+                break;
+            default:
+                ret = _Xsj3cModeChange(buf, MODE_HIRA, ON);
+                break;
+            }
+            free(mbs);
+            return(ret);
+        } else {
+            if (buf->inputmode == MODE_HIRA)
+                return (_Xsj3cModeChange(buf, buf->muhenmode, OFF));
+            else if (buf->dotoggle)
+                return (_Xsj3cModeChange(buf, MODE_HIRA, OFF));
+            else {
+#ifdef THROUGH_CONT
+                return (KEY_NULL);
+#else /* THROUGH_CONT */
+                if (buf->cntrlsame)
+                    return (KEY_NULL);
+                else 
+                    return (KEY_TEXT_CHANGE);   /* dummy */
+#endif /* THROUGH_CONT */
+            }
+        }
+    } else {
+        return (KEY_BELL);
+    }
+}
+
+/*
+ * _Xsj3cForward() [right/forward]
+ *
+ * <InputMode/ConvedMode> Move to next segment or next character position.
+ * <DictMode> Move reversed segment to next segment if not expanded.
+ * <SelectMode> Move to right candidate(symbol/hinsi)
+ *   in the candidate(symbol/hinsi) panel.
+ * <NoInputMode> Does nothing.
+ *
+ * MovebySegment on: Move by segment.
+ * MovebySegment off: Move by character.
+ * BeginConversionLast none: Allow to move out of segments. 
+ * MoveSegmentLoop on: Loop back to the first segment.
+ */
+Xsj3cEvent
+_Xsj3cForward(buf)
+    Xsj3cBuf    buf;
+{
+    Xsj3cEvent  ret = KEY_TEXT_CHANGE;
+
+    switch (buf->convmode) {
+    case ConvedModeMask:
+        buf->n_select = 0;
+        if (buf->candidate) 
+            Xsj3cEndCandidate(buf, ON);
+    case InputModeMask:
+        buf->input[buf->curseg]->n_roma = 0;
+        buf->input[buf->curseg]->n_kana = -1;
+        *buf->input[buf->curseg]->oldstr = '\0';
+        *buf->input[buf->curseg]->str = '\0';
+        buf->input[buf->curseg]->sp = buf->input[buf->curseg]->str;
+        if (buf->input[buf->curseg]->status & buf->movebyseg
+            && (buf->input[buf->curseg]->edit & SEG_NOEDIT)) {
+            if (buf->beginlastseg == NONE) {
+                if (buf->curseg < buf->segnum)
+                    buf->curseg++;
+                else if (buf->moveloop)
+                    buf->curseg = 0;
+            } else {
+                if (buf->curseg < buf->segnum - 1)
+                    buf->curseg++;
+                else if (buf->moveloop)
+                    buf->curseg = 0;
+            }
+        } else {
+            if (buf->curseg < buf->segnum
+                    && buf->input[buf->curseg]->status == SEG_CONVED)
+                ret |= _Xsj3cUnConvSeg(buf, ONE, OFF);
+                _Xsj3cStoreYomi(buf, buf->input[buf->curseg], 0);
+            if (buf->input[buf->curseg]->cur < buf->input[buf->curseg]->num) {
+                buf->input[buf->curseg]->cur++;
+            } else {
+                if (buf->beginlastseg == NONE) {
+                    if (buf->curseg < buf->segnum) {
+                        buf->curseg++;
+                        if (buf->curseg < buf->segnum)
+                            buf->input[buf->curseg]->cur = 0;
+                    } else if (buf->moveloop) {
+                        buf->curseg = 0;
+                        buf->input[buf->curseg]->cur = 0;
+                    }
+                } else {
+                    if (buf->curseg < buf->segnum - 1) {
+                        buf->curseg++;
+                        buf->input[buf->curseg]->cur = 0;
+                    } else if (buf->moveloop) {
+                        buf->curseg = 0;
+                        buf->input[buf->curseg]->cur = 0;
+                    }
+                }
+            }
+        }
+        return ret;
+    case DictModeMask:
+        if (buf->dict->n_dict) {
+            return (KEY_BELL);
+        } else {
+            if (buf->curseg < buf->segnum - 1 )
+                buf->curseg++;
+            else 
+                buf->curseg = buf->segnum - 1;
+            return (ret);
+        }
+    case SelectModeMask:
+        return (KEY_SELECT_RIGHT);
+    case NoInputModeMask:
+    default:
+#ifdef THROUGH_CONT
+        return (KEY_NULL);
+#else /* THROUGH_CONT */
+        if (buf->cntrlsame)
+            return (KEY_NULL);
+        else 
+            return (KEY_TEXT_CHANGE);   /* dummy */
+#endif /* THROUGH_CONT */
+    }
+}
+
+/*
+ * _Xsj3cBackward() [left/backward]
+ *
+ * <InputMode/ConvedMode> Move to previous segment or
+ *   previous character position.
+ * <DictMode> Move reversed segment to previous segment if not expanded.
+ * <SelectMode> Move to left candidate(symbol/hinsi)
+ *   in the candidate(symbol/hinsi) panel.
+ * <NoInputMode> Does nothing.
+ *
+ * MovebySegment on: Move by segment.
+ * MovebySegment off: Move by character.
+ * MoveSegmentLoop on: Loop back to the last segment.
+ */
+Xsj3cEvent
+_Xsj3cBackward(buf)
+    Xsj3cBuf    buf;
+{
+    Xsj3cEvent  ret = KEY_TEXT_CHANGE;
+
+    switch (buf->convmode) {
+    case ConvedModeMask:
+        buf->n_select = 0;
+        if (buf->candidate) 
+            Xsj3cEndCandidate(buf, ON);
+    case InputModeMask:
+        if (buf->curseg < buf->segnum) {
+            buf->input[buf->curseg]->n_roma = 0;
+            buf->input[buf->curseg]->n_kana = -1;
+            *buf->input[buf->curseg]->oldstr = '\0';
+            *buf->input[buf->curseg]->str = '\0';
+            buf->input[buf->curseg]->sp = buf->input[buf->curseg]->str;
+            if (buf->input[buf->curseg]->status & buf->movebyseg
+                    && (buf->input[buf->curseg]->edit & SEG_NOEDIT)) {
+                if (buf->curseg > 0)
+                    buf->curseg--;
+                else if (buf->moveloop) {
+                    if (buf->beginlastseg == NONE)
+                        buf->curseg = buf->segnum;
+                    else 
+                        buf->curseg = buf->segnum - 1;
+                }
+            } else {
+                if (buf->curseg < buf->segnum
+                        && buf->input[buf->curseg]->status == SEG_CONVED)
+                    ret |= _Xsj3cUnConvSeg(buf, ONE, ON);
+                    _Xsj3cStoreYomi(buf, buf->input[buf->curseg], 0);
+                if (buf->input[buf->curseg]->cur > 0) {
+                    buf->input[buf->curseg]->cur--;
+                } else {
+                    if (buf->curseg > 0) {
+                        buf->curseg--;
+                        buf->input[buf->curseg]->cur
+                                = buf->input[buf->curseg]->num;
+                    } else if (buf->moveloop) {
+                        if (buf->beginlastseg == NONE)
+                            buf->curseg = buf->segnum;
+                        else {
+                            buf->curseg = buf->segnum - 1;
+                            buf->input[buf->curseg]->cur
+                                    = buf->input[buf->curseg]->num;
+                        }
+                    }
+                }
+            }
+            return (ret);
+        } else if (buf->curseg > 0) {
+            buf->curseg--;
+            return (ret);
+        } else {
+            return (KEY_NULL);
+        }
+    case DictModeMask:
+        if (buf->dict->n_dict) {
+            return (KEY_BELL);
+        } else {
+            if (buf->curseg > 0)
+                buf->curseg--;
+            else 
+                buf->curseg = 0;
+            return (ret);
+        }
+    case SelectModeMask:
+        return (KEY_SELECT_LEFT);
+    case NoInputModeMask:
+    default:
+#ifdef THROUGH_CONT
+        return (KEY_NULL);
+#else /* THROUGH_CONT */
+        if (buf->cntrlsame)
+            return (KEY_NULL);
+        else 
+            return (KEY_TEXT_CHANGE);   /* dummy */
+#endif /* THROUGH_CONT */
+    }
+}
+
+/*
+ * _Xsj3cTop() [top]
+ *
+ * <InputMode/ConvedMode> Move to the first segment or top of current segment.
+ * <DictMode> Move reversed segment to the first segment if not expanded.
+ * <SelectMode> Move to first candidate(symbol/hinsi)
+ *   in popuped candidate(symbol/hinsi) panel.
+ * <NoInputMode> Does nothing.
+ *
+ * JumpbySegment on: Move by segment.
+ * JumpbySegment off: Move by character.
+ */
+Xsj3cEvent
+_Xsj3cTop(buf)
+    Xsj3cBuf    buf;
+{
+    switch (buf->convmode) {
+    case ConvedModeMask:
+        buf->n_select = 0;
+        if (buf->candidate) 
+            Xsj3cEndCandidate(buf, ON);
+    case InputModeMask:
+        if (buf->curseg < buf->segnum) {
+            buf->input[buf->curseg]->n_roma = 0;
+            buf->input[buf->curseg]->n_kana = -1;
+            *buf->input[buf->curseg]->oldstr = '\0';
+            *buf->input[buf->curseg]->str = '\0';
+            buf->input[buf->curseg]->sp = buf->input[buf->curseg]->str;
+            if (buf->input[buf->curseg]->status & buf->jumpbyseg
+                    && (buf->input[buf->curseg]->edit & SEG_NOEDIT)) {
+                buf->curseg = 0;
+            } else if (buf->curseg < buf->segnum) {
+                buf->input[buf->curseg]->cur = 0;
+            }
+            return KEY_TEXT_CHANGE;
+        } else if (buf->segnum > 0) {
+            buf->curseg = 0;
+            return KEY_TEXT_CHANGE;
+        } else {
+            return KEY_NULL;
+        }
+    case DictModeMask:
+        if (buf->dict->n_dict) {
+            return (KEY_BELL);
+        } else {
+            buf->curseg = 0;
+            return (KEY_TEXT_CHANGE);
+        }
+    case SelectModeMask:
+        return (KEY_SELECT_LEFTMOST);
+    case NoInputModeMask:
+    default:
+#ifdef THROUGH_CONT
+        return (KEY_NULL);
+#else /* THROUGH_CONT */
+        if (buf->cntrlsame)
+            return (KEY_NULL);
+        else 
+            return (KEY_TEXT_CHANGE);   /* dummy */
+#endif /* THROUGH_CONT */
+    }
+}
+
+/*
+ * _Xsj3cEnd() [end]
+ *
+ * <InputMode/ConvedMode> Move to the last segment or top of current segment.
+ * <DictMode> Move reversed segment to the last segment if not expanded.
+ * <SelectMode> Move to last candidate(symbol/hinsi)
+ *   in popuped candidate(symbol/hinsi) panel.
+ * <NoInputMode> Does nothing.
+ *
+ * JumpbySegment on: Move by segment.
+ * JumpbySegment off: Move by character.
+ * BeginConversionLast none: Allow to move out of segments. 
+ */
+Xsj3cEvent
+_Xsj3cEnd(buf)
+    Xsj3cBuf    buf;
+{
+    switch (buf->convmode) {
+    case ConvedModeMask:
+        buf->n_select = 0;
+        if (buf->candidate) 
+            Xsj3cEndCandidate(buf, ON);
+    case InputModeMask:
+        if (buf->curseg >= buf->segnum)
+            return KEY_NULL;
+        buf->input[buf->curseg]->n_roma = 0;
+        buf->input[buf->curseg]->n_kana = -1;
+        *buf->input[buf->curseg]->oldstr = '\0';
+        *buf->input[buf->curseg]->str = '\0';
+        buf->input[buf->curseg]->sp = buf->input[buf->curseg]->str;
+        if (buf->input[buf->curseg]->status & buf->jumpbyseg
+                    && (buf->input[buf->curseg]->edit & SEG_NOEDIT)) {
+            if (buf->beginlastseg == NONE)
+                buf->curseg = buf->segnum;
+            else 
+                buf->curseg = buf->segnum - 1;
+        } else {
+            buf->input[buf->curseg]->cur = buf->input[buf->curseg]->num;
+        }
+        return KEY_TEXT_CHANGE;
+    case DictModeMask:
+        if (buf->dict->n_dict) {
+            return (KEY_BELL);
+        } else {
+            buf->curseg = buf->segnum - 1;
+            return (KEY_TEXT_CHANGE);
+        }
+    case SelectModeMask:
+        return (KEY_SELECT_RIGHTMOST);
+    case NoInputModeMask:
+    default:
+#ifdef THROUGH_CONT
+        return (KEY_NULL);
+#else /* THROUGH_CONT */
+        if (buf->cntrlsame)
+            return (KEY_NULL);
+        else 
+            return (KEY_TEXT_CHANGE);   /* dummy */
+#endif /* THROUGH_CONT */
+    }
+}
+
+/*
+ * _Xsj3cUp() [up]
+ *
+ * <SelectMode> Move to above candidate(symbol/hinsi)
+ *   in the candidate(symbol/hinsi) panel.
+ * <NoInputMode/InputMode/ConvedMode/DictMode> Rings bell.
+ */
+Xsj3cEvent
+_Xsj3cUp(buf)
+    Xsj3cBuf    buf;
+{
+    if (buf->convmode & SelectModeMask)
+        return (KEY_SELECT_UP);
+    else
+#ifdef THROUGH_CONT
+        return (KEY_BELL);
+#else /* THROUGH_CONT */
+        if (buf->cntrlsame)
+            return (KEY_BELL);
+        else 
+            return (KEY_TEXT_CHANGE|KEY_BELL);  /* dummy */
+#endif /* THROUGH_CONT */
+}
+
+/*
+ * _Xsj3cDown() [down]
+ *
+ * <SelectMode> Move to below candidate(symbol/hinsi)
+ *   in the candidate(symbol/hinsi) panel.
+ * <NoInputMode/InputMode/ConvedMode/DictMode> Rings bell.
+ */
+Xsj3cEvent
+_Xsj3cDown(buf)
+    Xsj3cBuf    buf;
+{
+    if (buf->convmode & SelectModeMask)
+        return (KEY_SELECT_DOWN);
+    else
+#ifdef THROUGH_CONT
+        return (KEY_BELL);
+#else /* THROUGH_CONT */
+        if (buf->cntrlsame)
+            return (KEY_BELL);
+        else 
+            return (KEY_TEXT_CHANGE|KEY_BELL);  /* dummy */
+#endif /* THROUGH_CONT */
+}
+
+/*
+ * _Xsj3cFirst() [first]
+ *
+ * <ConvedMode> Set top candidate the current segment.
+ * <SelectMode> Move to first candidate(symbol/hinsi)
+ *   in all candidate(symbol/hinsi) pages.
+ * <NoInputMode/InputMode/DictMode> Rings bell.
+ */
+Xsj3cEvent
+_Xsj3cFirst(buf)
+    Xsj3cBuf    buf;
+{
+    int         changed,    flush;
+
+    if (buf->convmode & ConvedModeMask) {
+        if (!buf->candidate)
+            if ((buf->candidate = _Xsj3cCandidateInit(buf)) == NULL)
+                return (KEY_NULL);
+        Xsj3cSetCandidate(buf, 0, &changed, &flush);
+        return KEY_TEXT_CHANGE;
+    } else if (buf->convmode & SelectModeMask) {
+        return (KEY_SELECT_FIRST);
+    } else {
+#ifdef THROUGH_CONT
+        return (KEY_BELL);
+#else /* THROUGH_CONT */
+        if (buf->cntrlsame)
+            return (KEY_BELL);
+        else 
+            return (KEY_TEXT_CHANGE|KEY_BELL);  /* dummy */
+#endif /* THROUGH_CONT */
+    }
+}
+
+/*
+ * _Xsj3cLast() [last]
+ *
+ * <ConvedMode> Set bottom candidate the current segment.
+ * <SelectMode> Move to last candidate(symbol/hinsi)
+ *   in all candidate(symbol/hinsi) pages.
+ * <NoInputMode/InputMode/DictMode> Rings bell.
+ */
+Xsj3cEvent
+_Xsj3cLast(buf)
+    Xsj3cBuf    buf;
+{
+    int         changed,    flush;
+
+    if (buf->convmode & ConvedModeMask) {
+        if (!buf->candidate)
+            if ((buf->candidate = _Xsj3cCandidateInit(buf)) == NULL)
+                return (KEY_NULL);
+        Xsj3cSetCandidate(buf, buf->candnum - 1, &changed, &flush);
+        return (KEY_TEXT_CHANGE);
+    } else if (buf->convmode & SelectModeMask) {
+        return (KEY_SELECT_LAST);
+    } else {
+#ifdef THROUGH_CONT
+        return (KEY_BELL);
+#else /* THROUGH_CONT */
+        if (buf->cntrlsame)
+            return (KEY_BELL);
+        else 
+            return (KEY_TEXT_CHANGE|KEY_BELL);  /* dummy */
+#endif /* THROUGH_CONT */
+    }
+}
+
+/*
+ * _Xsj3cNextPage() [nextp]
+ * <SelectMode> Change contents of the candidate(symbol/hinsi) panel
+ *   to the next page.
+ * <NoInputMode/InputMode/ConvedMode/DictMode> Rings bell.
+ */
+Xsj3cEvent
+_Xsj3cNextPage(buf)
+    Xsj3cBuf    buf;
+{
+    if (buf->convmode & SelectModeMask)
+        return (KEY_SELECT_NEXTP);
+    else
+#ifdef THROUGH_CONT
+        return (KEY_BELL);
+#else /* THROUGH_CONT */
+        if (buf->cntrlsame)
+            return (KEY_BELL);
+        else 
+            return (KEY_TEXT_CHANGE|KEY_BELL);  /* dummy */
+#endif /* THROUGH_CONT */
+}
+
+/*
+ * _Xsj3cPrevPage() [prevp]
+ * <SelectMode> Change contents of the candidate(symbol/hinsi) panel
+ *   to the previous page.
+ * <NoInputMode/InputMode/ConvedMode/DictMode> Rings bell.
+ */
+Xsj3cEvent
+_Xsj3cPrevPage(buf)
+    Xsj3cBuf    buf;
+{
+    if (buf->convmode & SelectModeMask)
+        return (KEY_SELECT_PREVP);
+    else
+#ifdef THROUGH_CONT
+        return (KEY_BELL);
+#else /* THROUGH_CONT */
+        if (buf->cntrlsame)
+            return (KEY_BELL);
+        else 
+            return (KEY_TEXT_CHANGE|KEY_BELL);  /* dummy */
+#endif /* THROUGH_CONT */
+}
+
+/*
+ * _Xsj3cNext() [next]
+ *
+ * <ConvedMode> Set next candidate the current segment.
+ * <SelectMode> Move to right(next) candidate(symbol/hinsi)
+ *   in the candidate(symbol/hinsi) panel.
+ * <NoInputMode/InputMode/DictMode> Rings bell.
+ */
+Xsj3cEvent
+_Xsj3cNext(buf)
+    Xsj3cBuf    buf;
+{
+    int         changed,    flush;
+
+    if (buf->convmode & ConvedModeMask) {
+        if (!buf->candidate)
+            if ((buf->candidate = _Xsj3cCandidateInit(buf)) == NULL)
+                return (KEY_NULL);
+        if (buf->curcand == buf->candnum - 1)
+            Xsj3cSetCandidate(buf, 0, &changed, &flush);
+        else 
+            Xsj3cSetCandidate(buf, buf->curcand + 1, &changed, &flush);
+        return KEY_TEXT_CHANGE;
+    } else if (buf->convmode & SelectModeMask) {
+        return (KEY_SELECT_RIGHT);
+    } else {
+#ifdef THROUGH_CONT
+        return (KEY_BELL);
+#else /* THROUGH_CONT */
+        if (buf->cntrlsame)
+            return (KEY_BELL);
+        else 
+            return (KEY_TEXT_CHANGE|KEY_BELL);  /* dummy */
+#endif /* THROUGH_CONT */
+    }
+}
+
+/*
+ * _Xsj3cPrev() [prev]
+ *
+ * <ConvedMode> Set previous candidate the current segment.
+ * <SelectMode> Move to left(previous) candidate(symbol/hinsi)
+ *   in the candidate(symbol/hinsi) panel.
+ * <NoInputMode/InputMode/DictMode> Rings bell.
+ */
+Xsj3cEvent
+_Xsj3cPrev(buf)
+    Xsj3cBuf    buf;
+{
+    int         changed,    flush;
+
+    if (buf->convmode & ConvedModeMask) {
+        if (!buf->candidate)
+            if ((buf->candidate = _Xsj3cCandidateInit(buf)) == NULL)
+                return (KEY_NULL);
+        if (!buf->curcand)
+            Xsj3cSetCandidate(buf, buf->candnum - 1, &changed, &flush);
+        else 
+            Xsj3cSetCandidate(buf, buf->curcand - 1, &changed, &flush);
+        return KEY_TEXT_CHANGE;
+    } else if (buf->convmode & SelectModeMask) {
+        return (KEY_SELECT_LEFT);
+    } else {
+#ifdef THROUGH_CONT
+        return (KEY_BELL);
+#else /* THROUGH_CONT */
+        if (buf->cntrlsame)
+            return (KEY_BELL);
+        else 
+            return (KEY_TEXT_CHANGE|KEY_BELL);  /* dummy */
+#endif /* THROUGH_CONT */
+    }
+}
+
+/*
+ * _Xsj3cSelect() [select]
+ *
+ * <SelectMode> Select reversed candidate(symbol/hinsi)
+ *   in the candidate(symbol/hinsi) panel and pop down the panel.
+ * <NoInputMode/InputMode/ConvedMode/DictMode> Rings bell.
+ *  Select now selected candidate(symbol) in the candidate(symbol) panel.
+ */
+Xsj3cEvent
+_Xsj3cSelect(buf)
+    Xsj3cBuf    buf;
+{
+    if (buf->convmode & SelectModeMask) {
+        if (buf->selectstatus == SELECT_HINSI) {
+            buf->dict->status = DICT_CONFIRM;
+            if (buf->dispmodechange) {
+                buf->dispmode =
+                    (buf->dict->mode == REG_STATE ? MODE_TOROKU : MODE_SYOUKYO);
+                return (KEY_SELECT_END|KEY_DICT_CHANGE|KEY_MODE_CHANGE);
+            } else
+                return (KEY_SELECT_END|KEY_DICT_CHANGE);
+        } else {
+            if (buf->dispmodechange) {
+                buf->dispmode = (buf->convedsegnum == buf->segnum ? MODE_KANJI :
+                    (buf->convedsegnum ? MODE_EDIT : buf->inputmode));
+                return (KEY_SELECT_END|KEY_MODE_CHANGE);
+            } else
+                return (KEY_SELECT_END);
+        }
+    } else if (buf->convmode & DictModeMask) {
+        if (buf->dict->status == DICT_CONFIRM) {
+            buf->dict->status = DICT_END;
+            _Xsj3cFlushDictMsg(buf);
+            if (buf->dict->mode == REG_STATE)
+                return(KEY_DICT_REGISTER);
+            else
+                return(KEY_DICT_CLEAR);
+        } else {
+            return (KEY_BELL);
+        }
+    } else {
+#ifdef THROUGH_CONT
+        return (KEY_BELL);
+#else /* THROUGH_CONT */
+        if (buf->cntrlsame)
+            return (KEY_BELL);
+        else 
+            return (KEY_TEXT_CHANGE|KEY_BELL);  /* dummy */
+#endif /* THROUGH_CONT */
+    }
+}
+
+/*
+ * _Xsj3cCancel() [cancel]
+ *
+ * <InputMode/ConvedMode> Clear all segments.
+ * <SelectMode> Pop down candidate(symbol/hinsi) panel.
+ * <DictMode> (DICT_INPUT) Pop down Auxpanel.
+ *            (DICT_CONFIRM/DICT_END) Return back to DICT_INPUT status.
+ * <NoInputMode> Does nothing.
+ *
+ * DisplayModeChange on: Change the display mode string.  
+ */
+Xsj3cEvent
+_Xsj3cCancel(buf)
+    Xsj3cBuf    buf;
+{
+    int         i;
+
+    switch (buf->convmode) {
+    case ConvedModeMask:
+        buf->n_select = 0;
+        if (buf->candidate) 
+            Xsj3cEndCandidate(buf, OFF);
+    case InputModeMask:
+        if (buf->gakusyuu)
+            _Xsj3cClearDcid(buf);
+        buf->convedsegnum = 0;
+        for (i = 1; i < buf->segnum + 1; i++) {
+            Xsj3cFreeSegment(buf->input[i]);
+            buf->input[i] = NULL;
+        }
+        if (buf->input[0])
+            Xsj3cClearSegment(buf, buf->input[0]);
+        buf->convedsegnum = 0;
+        buf->segnum = 0;
+        buf->curseg = 0;
+        if (buf->dispmodechange) {
+            buf->dispmode = buf->inputmode;
+            return (KEY_TEXT_CHANGE|KEY_MODE_CHANGE);
+        } else
+            return (KEY_TEXT_CHANGE);
+    case SelectModeMask:
+        if (buf->selectstatus == SELECT_HINSI) {
+            buf->dict->status = DICT_INPUT;
+            _Xsj3cFlushDictMsg(buf);
+            if (buf->dispmodechange) {
+                buf->dispmode = (buf->dict->mode == REG_STATE ?
+                    MODE_TOROKU : MODE_SYOUKYO);
+                return (KEY_SELECT_ABORT|KEY_MODE_CHANGE);
+            } else
+                return (KEY_SELECT_ABORT);
+        } else {
+            if (buf->dispmodechange) {
+                buf->dispmode = (buf->convedsegnum == buf->segnum ? MODE_KANJI :
+                    (buf->convedsegnum ? MODE_EDIT : buf->inputmode));
+                return (KEY_SELECT_ABORT|KEY_MODE_CHANGE);
+            } else
+                return (KEY_SELECT_ABORT);
+        }
+    case DictModeMask:
+        if (buf->dict->status == DICT_CONFIRM
+                || buf->dict->status == DICT_END) {
+            buf->dict->status = DICT_INPUT;
+            _Xsj3cFlushDictMsg(buf);
+            return(KEY_DICT_CHANGE);
+        } else {
+            if (buf->dispmodechange) {
+                buf->dispmode = (buf->convedsegnum == buf->segnum ? MODE_KANJI:
+                    (buf->convedsegnum ? MODE_EDIT : buf->inputmode));
+                return (KEY_DICT_END|KEY_TEXT_CHANGE|KEY_MODE_CHANGE);
+            } else {
+                return (KEY_DICT_END|KEY_TEXT_CHANGE);
+            }
+        }
+    case NoInputModeMask:
+#ifdef THROUGH_CONT
+        return (KEY_NULL);
+#else /* THROUGH_CONT */
+        if (buf->cntrlsame)
+            return (KEY_NULL);
+        else 
+            return (KEY_TEXT_CHANGE);   /* dummy */
+#endif /* THROUGH_CONT */
+    default:
+        return (KEY_TEXT_CHANGE);
+    }
+}
+
+/*
+ * _Xsj3cExpand() [kakucyou/expand]
+ *
+ * <InputMode/ConvedMode> Expand the current segment by getting in
+ *   the first character of the next segment.
+ * <DictMode> Increase the reversed segments by adding the next segment.
+ * <NoInputMode/SelectMode> Rings bell.  
+ *   
+ * ExpandModeConversion on: Change the expanded segment's character mode.
+ * ExpandKanjiConversion on: Do kana-kanji conversion for current
+ *   and next segment.
+ */
+Xsj3cEvent
+_Xsj3cExpand(buf)
+    Xsj3cBuf                buf;
+{
+    int                     nextseg = buf->curseg + 1,  value = 0;
+    Xsj3cFlag               conv = 0,   modematch = 0;
+    register int            i;
+    unsigned char           tmp[YBUFSIZ];
+    unsigned char          *kanabuf;
+    unsigned char           knjbuf[KANJIBUFSIZ];
+    SJ3_BUNSETU             bun[BUNBUFSIZ];
+
+    if (buf->convmode & DictModeMask) {
+        return (_Xsj3cExpandNoConv(buf));
+    } else if ((buf->convmode & SelectModeMask) || nextseg >= buf->segnum
+            || !buf->input[nextseg]->num) {
+        /* $B8=J8@a$,:G8e$NJ8@a$N;~$O3HD%$G$-$J$$!#(B */
+#ifdef THROUGH_CONT
+        return (KEY_BELL);
+#else /* THROUGH_CONT */
+        if (buf->cntrlsame)
+            return (KEY_BELL);
+        else 
+            return (KEY_TEXT_CHANGE|KEY_BELL);  /* dummy */
+#endif /* THROUGH_CONT */
+    } else if (buf->convmode & ConvedModeMask) {
+        buf->n_select = 0;
+        if (buf->candidate)
+            Xsj3cEndCandidate(buf, OFF);
+    } else if (buf->convmode & ~InputModeMask) {
+#ifdef THROUGH_CONT
+        return (KEY_BELL);
+#else /* THROUGH_CONT */
+        if (buf->cntrlsame)
+            return (KEY_BELL);
+        else 
+            return (KEY_TEXT_CHANGE|KEY_BELL);  /* dummy */
+#endif /* THROUGH_CONT */
+    }
+
+    /* temporary $B$N%P%C%U%!$r:n@.$9$k(B   */
+    if ((kanabuf = (unsigned char *)
+            malloc(buf->input[buf->curseg]->size * sizeof(wchar))) == NULL)
+        Xsj3cError("Cannot allocate for temporary buffer");
+
+    /* $B<!J8@a$NF,$N#1J8;z$r8:$8!"0l;~%P%C%U%!$K%3%T!<$9$k(B   */
+    buf->input[nextseg]->cur = 1;
+    _Xsj3cExtractChar(buf, buf->input[nextseg], tmp, 1);
+    if (buf->input[nextseg]->status & SEG_CONVED)
+        buf->convedsegnum--;
+
+    if (buf->input[nextseg]->cursegmode == buf->input[buf->curseg]->cursegmode)
+        modematch++;
+    if (!buf->input[nextseg]->num) {
+
+        /* $B<!J8@a$,#1J8;z$7$+$J$+$C$?>l9g!"J8@a?t$r#1$D8:$8(B */
+        /*  $B99$K!"<!J8@a$NNN0h$r2rJ|$9$k!#(B                  */
+        Xsj3cFreeSegment(buf->input[buf->segnum]);
+        buf->input[buf->segnum] = NULL;
+        buf->segnum--;
+        Xsj3cFreeSegment(buf->input[nextseg]);
+        buf->input[nextseg] = NULL;
+        if (nextseg < buf->segnum) {
+            for ( i = nextseg; i < buf->segnum; i++) {
+                buf->input[i] = buf->input[i + 1];
+            }
+        } 
+        buf->input[buf->segnum] = NULL;
+    } else {
+
+        /* $B<!J8@a$,#2J8;z0J>e$"$C$?>l9g(B ExpandKanjiConversion   */
+        /* on $B$N;~$O:FEY$+$J4A;zJQ49JQ49$9$k(B                    */
+        if (buf->expandkconv & buf->input[nextseg]->status) {
+            if (buf->input[nextseg]->num < INPUT_YOMI_MAX) {
+                _Xsj3cwPStomPS(buf, kanabuf, buf->input[nextseg]->yomi);
+                value = serverIF[buf->server].func[FUNC_CONV]
+                        (kanabuf, bun, knjbuf, KANJIBUFSIZ);
+            } else {
+                Xsj3cWarning("Too long segment[num = %d]",nextseg);
+            }
+            if (value > 0) {
+                _Xsj3cStoreKanji(buf, bun, nextseg, value, ON);
+                buf->segnum += (value - 1);
+                buf->convedsegnum += value;
+            } else {
+                if (value < 0) 
+                    Xsj3cWarning("sj3serv is down. reconnect please");
+                _Xsj3cStoreYomi(buf, buf->input[nextseg], 0);
+                buf->input[nextseg]->status = SEG_NOCONV;
+                if (!(buf->movebyseg & SEG_NOCONV))
+                    buf->input[nextseg]->edit = SEG_EDIT;
+            }
+        } else {
+            _Xsj3cStoreYomi(buf, buf->input[nextseg], 0);
+            buf->input[nextseg]->status = SEG_NOCONV;
+            if (!(buf->movebyseg & SEG_NOCONV))
+                buf->input[nextseg]->edit = SEG_EDIT;
+        }
+        if (buf->gakusyuu)
+            buf->input[nextseg]->change = ON;
+    }
+
+    /* $B%+%l%s%HJ8@a$N:G8e$K<!J8@a$N#1J8;z$rB-$9(B */
+    buf->input[buf->curseg]->cur = buf->input[buf->curseg]->num;
+    _Xsj3cInsertChar(buf, buf->input[buf->curseg], tmp, 1);
+
+    if (buf->input[buf->curseg]->status & SEG_CONVED)
+        buf->convedsegnum--;
+
+    /* ExpandModeConversion on $B$N;~$O9g$o$;$?ItJ,$N(B */
+    /* $BJ8;z<o$r8=J8@a$NI=<(J8;z<o$KJQ49$9$k(B         */
+    if ((buf->expandmconv & buf->input[buf->curseg]->status) && !modematch) {
+        Xsj3cSeg        seg = buf->input[buf->curseg];
+
+        conv++;
+        _Xsj3cwPStomPS(buf, kanabuf, seg->yomi);
+        Xsj3cModeConv(buf, kanabuf, seg->cursegmode, seg->size);
+        seg->num = _Xsj3cmPStowPSn(buf, seg->yomi, kanabuf, seg->size);
+        if (seg->num > seg->size - YBUFSIZ) {
+            Xsj3cResizeSegment(seg, seg->size * 2);
+            seg->num = _Xsj3cmPStowPS(buf, seg->yomi, kanabuf);
+        }
+        seg->cur = seg->num;
+    }
+
+    /* ExpandKanjiConversion on $B$N;~$O%+%l%s%H(B  */
+    /* $BJ8@a$r:FEY$+$J4A;zJQ49JQ49$9$k(B           */
+    if (buf->expandkconv & buf->input[buf->curseg]->status) {
+        value = 0;
+        if (!conv)
+            _Xsj3cwPStomPS(buf, kanabuf, buf->input[buf->curseg]->yomi);
+        if (buf->input[buf->curseg]->num < INPUT_YOMI_MAX) {
+            value = serverIF[buf->server].func[FUNC_CONV]
+                    (kanabuf, bun, knjbuf, KANJIBUFSIZ);
+        } else {
+            Xsj3cWarning("Too long segment[num = %d]",buf->curseg);
+        }
+        if (value > 0) {
+            buf->convedsegnum++;
+            buf->input[buf->curseg]->status = SEG_CONVED;
+            buf->input[buf->curseg]->edit = SEG_NOEDIT;
+            buf->input[buf->curseg]->dnum
+                = _Xsj3cmPStowOUT(buf, buf->input[buf->curseg]->disp, knjbuf);
+            if (buf->gakusyuu)
+                buf->input[buf->curseg]->dcid = bun[0].dcid;
+            if (value > 1) {
+                int         changed,    flush;
+                if ((buf->candidate = _Xsj3cCandidateInit(buf)) == NULL) {
+                    Xsj3cWarning("sj3serv maybe down, or any trouble");
+                } else {
+                    Xsj3cSetCandidate(buf, 0, &changed, &flush);
+                }
+            }
+        } else  {
+            if (value < 0) 
+                Xsj3cWarning("sj3serv is down. reconnect please");
+            _Xsj3cStoreYomi(buf, buf->input[buf->curseg], 0);
+            buf->input[buf->curseg]->status = SEG_NOCONV;
+            if (!(buf->movebyseg & SEG_NOCONV))
+                buf->input[buf->curseg]->edit = SEG_EDIT;
+        }
+    } else {
+        value = 1;
+        _Xsj3cStoreYomi(buf, buf->input[buf->curseg], 0);
+        buf->input[buf->curseg]->status = SEG_NOCONV;
+        if (!(buf->movebyseg & SEG_NOCONV))
+            buf->input[buf->curseg]->edit = SEG_EDIT;
+    }
+
+    /* temporary $B$N%P%C%U%!$r3+J|$9$k(B   */
+    free(kanabuf);
+
+    /* $BJ8@aD93X=,$N$?$a$N%U%i%0$rN)$F$k(B */
+    if (buf->gakusyuu)
+        buf->input[buf->curseg]->change = ON;
+
+    if (value > 0)
+        return KEY_TEXT_CHANGE;
+    else 
+        return (KEY_TEXT_CHANGE|KEY_BELL);
+}
+
+/*
+ * _Xsj3cExpandNoConv()
+ *  Expand current segment by adding next segment.
+ */
+static Xsj3cEvent
+_Xsj3cExpandNoConv(buf)
+    Xsj3cBuf    buf;
+{
+    if (buf->curseg + buf->dict->n_dict < buf->segnum - 1) {
+        buf->dict->n_dict++;
+        return KEY_TEXT_CHANGE;
+    } else {
+        return KEY_BELL;
+    }
+}
+
+/*
+ * _Xsj3cShrink()
+ *
+ * <InputMode/ConvedMode> Shrink the current segment by pushing 
+ *   the last character to the next segment.
+ * <DictMode> Decrease reversed segments by getting off the last segment.
+ * <NoInputMode/SelectMode> Rings bell.  
+ *   
+ * ShrinkModeConversion on: Change the next segment's character mode.
+ * ShrinkKanjiConversion on: Do kana-kanji conversion for
+ *   current and next segments.
+ * ShrinkAll on: When there is only one character in current segment,
+ *   combine with the previous segment
+ *   unless current segment is the first segment.
+ * ShrinkAll off: When there is only one character in current segment,
+ *    ring bell.
+ */
+Xsj3cEvent
+_Xsj3cShrink(buf)
+    Xsj3cBuf                buf;
+{
+    int                     nextseg = buf->curseg + 1;
+    int                     prevseg = buf->curseg - 1, value = 0;
+    Xsj3cFlag               conv1 = 0,  conv2 = 0;
+    register int            i,  size;
+    unsigned char           tmp[YBUFSIZ];
+    unsigned char          *kanabuf1,  *kanabuf2;
+    unsigned char           knjbuf[KANJIBUFSIZ];
+    SJ3_BUNSETU             bun[BUNBUFSIZ];
+    Xsj3cFlag               erase_seg_flg = 0;
+
+    if (buf->convmode & DictModeMask)
+        return (_Xsj3cShrinkNoConv(buf));
+    else if ((buf->convmode & (SelectModeMask|NoInputModeMask))
+            || nextseg > buf->segnum)
+#ifdef THROUGH_CONT
+        return (KEY_BELL);
+#else /* THROUGH_CONT */
+        if (buf->cntrlsame)
+            return (KEY_BELL);
+        else 
+            return (KEY_TEXT_CHANGE|KEY_BELL);  /* dummy */
+#endif /* THROUGH_CONT */
+    else if (buf->input[buf->curseg]->num > 1 || (buf->shrinkall
+            && buf->input[buf->curseg]->num > 0 && buf->curseg)) {
+        /* $B%+%l%s%HJ8@a$,#2J8;z0J>e$"$k>l9g!"$^$?$O#1J8;z(B   */
+        /* $B$"$k>l9g$G(B .ShrinkAll on $B$G8=J8@a$,:G=i$NJ8@a$G(B  */
+        /* $B$J$$>l9g!"%+%l%s%HJ8@a$N:G8e$N#1J8;z$r<h$j=P$9(B   */
+
+        buf->n_select = 0;
+        if (buf->candidate) 
+            Xsj3cEndCandidate(buf, OFF);
+        buf->input[buf->curseg]->cur = buf->input[buf->curseg]->num;
+        _Xsj3cExtractChar(buf, buf->input[buf->curseg], tmp, 1);
+
+        /* .ShrinkAll on $B$G8=J8@a$,#1J8;z$7$+$J$+$C$?>l9g(B   */
+        /* $BA0J8@a$H9g@a$9$k$3$H$r;X<($9$k%U%i%0$r(B ON $B$K$9$k(B */
+        if (!buf->input[buf->curseg]->num)
+            erase_seg_flg++;
+    } else {
+#ifdef THROUGH_CONT
+        return (KEY_BELL);
+#else /* THROUGH_CONT */
+        if (buf->cntrlsame)
+            return (KEY_BELL);
+        else 
+            return (KEY_TEXT_CHANGE|KEY_BELL);  /* dummy */
+#endif /* THROUGH_CONT */
+    }
+
+    /* temporary $B$N%P%C%U%!$r:n@.$9$k(B   */
+    if (buf->input[nextseg])
+        size = buf->input[nextseg]->size;
+    else 
+        size = KANABUFSIZ;
+    if ((kanabuf2 = (unsigned char *)malloc(size * sizeof(wchar))) == NULL)
+        Xsj3cError("Cannot allocate for temporary buffer");
+
+    if (buf->curseg)
+        size = buf->input[prevseg]->size;
+    else 
+        size = KANABUFSIZ;
+    if ((kanabuf1 = (unsigned char *)malloc(size * sizeof(wchar))) == NULL)
+        Xsj3cError("Cannot allocate for temporary buffer");
+
+
+    if (buf->input[buf->curseg]->status & SEG_CONVED)
+        buf->convedsegnum--;
+    if (buf->shrinkall && buf->curseg && erase_seg_flg) {
+        /* .ShrinkAll on $B$GA0J8@a$H9g@a$9$k$3$H$r;X<($9$k(B   */
+        /* $B%U%i%0$,(B ON $B$N;~!"%+%l%s%HJ8@a$+$i<h$j=P$7$?(B     */
+        /* $B#1J8;z$rA0J8@a$N:G8e$KA^F~$9$k(B                   */
+        
+        buf->input[prevseg]->cur = buf->input[prevseg]->num;
+        _Xsj3cInsertChar(buf, buf->input[prevseg], tmp, 1);
+
+        /* ShrinkModeConversion on $B$N;~$O9g$o$;$?ItJ,$N(B */
+        /* $BJ8;z<o$rA0J8@a$NI=<(J8;z<o$KJQ49$9$k(B         */
+        if ((buf->shrinkmconv & buf->input[prevseg]->status)
+                && buf->input[prevseg]->cursegmode
+                != buf->input[buf->curseg]->cursegmode) {
+            Xsj3cSeg        seg = buf->input[prevseg];
+
+            conv1++;
+            _Xsj3cwPStomPS(buf, kanabuf1, seg->yomi);
+            Xsj3cModeConv(buf, kanabuf1, seg->cursegmode, seg->size);
+            seg->num = _Xsj3cmPStowPSn(buf, seg->yomi, kanabuf1, seg->size);
+            if (seg->num > buf->input[buf->curseg - 1]->size - YBUFSIZ) {
+                Xsj3cResizeSegment(seg, seg->size * 2);
+                seg->num = _Xsj3cmPStowPS(buf, seg->yomi, kanabuf1);
+            }
+            seg->cur = seg->num;
+        }
+
+        /* $BJ8@a?t$r8:$8%+%l%s%HJ8@a$NNN0h$r3+J|$9$k(B         */
+        Xsj3cFreeSegment(buf->input[buf->segnum]);
+        buf->input[buf->segnum] = NULL;
+        buf->segnum--;
+        Xsj3cFreeSegment(buf->input[buf->curseg]);
+        buf->input[buf->curseg] = NULL;
+        if (nextseg <= buf->segnum) {
+            for ( i = buf->curseg; i < buf->segnum; i++) {
+                buf->input[i] = buf->input[i + 1];
+            }
+        }
+        buf->input[buf->segnum] = NULL;
+        buf->curseg--;
+    } else {
+        /* $B%+%l%s%HJ8@a$,#2J8;z0J>e$@$C$?>l9g(B   */
+
+        if (nextseg < buf->segnum) {
+            /* $B%+%l%s%HJ8@a$,:G8e$NJ8@a$G$J$$;~!"(B       */
+            /* $B<h$j=P$7$?#1J8;z$r<!J8@a$N@hF,$KA^F~$9$k(B */
+
+            buf->input[nextseg]->cur = 0;
+            _Xsj3cInsertChar(buf, buf->input[nextseg], tmp, 1);
+            if (buf->input[nextseg]->status & SEG_CONVED)
+                buf->convedsegnum--;
+
+            /* ShrinkModeConversion on $B$N;~$OJ,N%$7$?(B       */
+            /* $BItJ,$NJ8;z<o$r<!J8@a$NI=<(J8;z<o$KJQ49$9$k(B   */
+            if ((buf->shrinkmconv & buf->input[nextseg]->status)
+                    && buf->input[nextseg]->cursegmode
+                    != buf->input[buf->curseg]->cursegmode) {
+                Xsj3cSeg        seg = buf->input[nextseg];
+
+                conv2++;
+                _Xsj3cwPStomPS(buf, kanabuf2, seg->yomi);
+                Xsj3cModeConv(buf, kanabuf2, seg->cursegmode, seg->size);
+                seg->num = _Xsj3cmPStowPSn(buf, seg->yomi, kanabuf2, seg->size);
+                if (seg->num > seg->size - YBUFSIZ) {
+                    Xsj3cResizeSegment(seg, seg->size * 2);
+                    seg->num = _Xsj3cmPStowPS(buf, seg->yomi, kanabuf2);
+                }
+                seg->cur = seg->num;
+            }
+        } else {
+            /* $B%+%l%s%HJ8@a$,:G8e$NJ8@a$N;~!"J8@a$r#1$DA}$d$7$F(B */
+            /* $B<!J8@a$r:n@.$7!"<h$j=P$7$?#1J8;z$r%3%T!<$7$F(B     */
+            /* $B%+%l%s%HJ8@a$NB0@-$r<!J8@a$K%3%T!<$9$k(B           */
+
+            if (!buf->input[nextseg]) {
+                if ((buf->input[nextseg]
+                        = (Xsj3cSeg)Xsj3cCreateSegment(buf)) == NULL) {
+                    Xsj3cError("Failed to allocate segment");
+                }
+            } else
+                Xsj3cClearSegment(buf, buf->input[nextseg]);
+            _Xsj3cInsertChar(buf, buf->input[nextseg], tmp, 1);
+            buf->input[nextseg]->change = OFF;
+            buf->input[nextseg]->edit = buf->input[buf->curseg]->edit;
+            buf->input[nextseg]->status = buf->input[buf->curseg]->status;
+            if (buf->input[nextseg]->status & SEG_CONVED)
+                buf->convedsegnum--;
+            buf->segnum++;
+            buf->input[nextseg]->cursegmode
+                = buf->input[buf->curseg]->cursegmode;
+            buf->input[nextseg]->dcid = buf->input[buf->curseg]->dcid;
+        }
+
+        /* ShrinkKanjiConversion on $B$N;~$OJ,N%$7$?(B      */
+        /* $BItJ,$r9g$o$;$F<!J8@a$r:FEY$+$J4A;zJQ49$9$k(B   */
+        if (buf->shrinkkconv & buf->input[nextseg]->status) {
+            if (!conv2)
+                _Xsj3cwPStomPS(buf, kanabuf2, buf->input[nextseg]->yomi);
+            if (buf->input[nextseg]->num < INPUT_YOMI_MAX) {
+                value = serverIF[buf->server].func[FUNC_CONV]
+                        (kanabuf2, bun, knjbuf, KANJIBUFSIZ);
+            } else {
+                Xsj3cWarning("Too long segment[num = %d]",nextseg);
+            }
+            if (value > 0) {
+                _Xsj3cStoreKanji(buf, bun, nextseg, value, ON);
+                buf->segnum += (value - 1);
+                buf->convedsegnum += value;
+            } else {
+                if (value < 0) 
+                    Xsj3cWarning("sj3serv is down. reconnect please");
+                _Xsj3cStoreYomi(buf, buf->input[nextseg], 0);
+                buf->input[nextseg]->status = SEG_NOCONV;
+                if (!(buf->movebyseg & SEG_NOCONV))
+                    buf->input[nextseg]->edit = SEG_EDIT;
+            }
+        } else {
+            _Xsj3cStoreYomi(buf, buf->input[nextseg], 0);
+            buf->input[nextseg]->status = SEG_NOCONV;
+            if (!(buf->movebyseg & SEG_NOCONV))
+                buf->input[nextseg]->edit = SEG_EDIT;
+        }
+        if (buf->gakusyuu)
+            buf->input[nextseg]->change = ON;
+    }
+
+    /* ExpandKanjiConversion on $B$N;~$O%+%l%s%H(B  */
+    /* $BJ8@a$r:FEY$+$J4A;zJQ49JQ49$9$k(B           */
+    if (buf->shrinkkconv & buf->input[buf->curseg]->status) {
+        value = 0;
+        if (!conv1)
+            _Xsj3cwPStomPS(buf, kanabuf1, buf->input[buf->curseg]->yomi);
+        if (buf->input[buf->curseg]->num < INPUT_YOMI_MAX) {
+            value = serverIF[buf->server].func[FUNC_CONV]
+                    (kanabuf1, bun, knjbuf, KANJIBUFSIZ);
+        } else {
+            Xsj3cWarning("Too long segment[num = %d]",buf->curseg);
+        }
+        if (value > 0) {
+            buf->convedsegnum++;
+            buf->input[buf->curseg]->status = SEG_CONVED;
+            buf->input[buf->curseg]->edit = SEG_NOEDIT;
+            buf->input[buf->curseg]->dnum
+                = _Xsj3cmPStowOUT(buf, buf->input[buf->curseg]->disp, knjbuf);
+            if (buf->gakusyuu)
+                buf->input[buf->curseg]->dcid = bun[0].dcid;
+        } else {
+            if (value < 0)
+                Xsj3cWarning("sj3serv is down. reconnect please");
+            _Xsj3cStoreYomi(buf, buf->input[buf->curseg], 0);
+            buf->input[buf->curseg]->status = SEG_NOCONV;
+            if (!(buf->movebyseg & SEG_NOCONV))
+                buf->input[buf->curseg]->edit = SEG_EDIT;
+        }
+    } else {
+        value = 1;
+        _Xsj3cStoreYomi(buf, buf->input[buf->curseg], 0);
+        buf->input[buf->curseg]->status = SEG_NOCONV;
+        if (!(buf->movebyseg & SEG_NOCONV))
+            buf->input[buf->curseg]->edit = SEG_EDIT;
+    }
+
+    /* temporary $B$N%P%C%U%!$r3+J|$9$k(B   */
+    free(kanabuf1);
+    free(kanabuf2);
+
+    /* $BJ8@aD93X=,$N$?$a$N%U%i%0$rN)$F$k(B */
+    if (buf->gakusyuu)
+        buf->input[buf->curseg]->change = ON;
+
+    if (value > 0)
+        return KEY_TEXT_CHANGE;
+    else 
+        return (KEY_TEXT_CHANGE|KEY_BELL);
+}
+
+/*
+ * _Xsj3cShrinkNoConv()
+ *  Shrink current segment by reducing last segment.
+ */
+static Xsj3cEvent
+_Xsj3cShrinkNoConv(buf)
+    Xsj3cBuf    buf;
+{
+    if (buf->dict->n_dict) {
+        buf->dict->n_dict--;
+        return KEY_TEXT_CHANGE;
+    } else {
+        return (KEY_BELL);
+    }
+}
+
+/*
+ * _Xsj3cBackSpace()
+ *
+ * <InputMode/ConvedMode> Delete previous segment or character.
+ * <DictMode> Delete previous character for yomi.
+ * <SelectMode> Popdown the panel and delete previous segment or character.
+ * <NoInputMode> Does nothing.
+ *
+ * DeleteBySegment on: Delete previous segment.
+ * DeleteBySegment off: Delete previous character.
+ * DeleteChangeSegment all: Unconvert all segments when "DeleteBySegment"
+ *   is off.
+ * DeleteChangeSegment one: Unconvert segments after previous segment 
+ *   when "DeleteBySegment" is off.
+ * DeleteChangeSegment after: Unconvert previous segment
+ *   when "DeleteBySegment" is off.
+ * SelectBackSpaceMove on: Move target segment to current segment.
+ */
+Xsj3cEvent
+_Xsj3cBackSpace(buf)
+    Xsj3cBuf        buf;
+{
+    Xsj3cEvent      ret = KEY_NULL;
+
+    if (buf->convmode & SelectModeMask) {
+        /* SelectMode $B$N;~$O8uJdA*Br!?5-9fA*Br(B    */
+        /* $B%&%#%s%I%&$r%]%C%W%@%&%s(B             */
+        ret |= KEY_SELECT_ABORT;
+        if (buf->selectstatus == SELECT_HINSI) {
+            buf->convmode = DictModeMask;
+            buf->dict->status = DICT_INPUT;
+        } else if (buf->selectstatus == SELECT_CAND) {
+            buf->convmode = ConvedModeMask;
+            if (buf->selectback)
+                buf->curseg++;
+        } else {
+            buf->convmode = InputModeMask;
+            if (!buf->segnum)
+                return(ret);
+        }
+    } else if (buf->convmode & NoInputModeMask) {
+        /* $BJ8@a(B(segement)$B?t$,(B 0$B$N$H$-$OL5;k$9$k(B */
+#ifdef THROUGH_CONT
+        return (KEY_NULL);
+#else /* THROUGH_CONT */
+        if (buf->cntrlsame)
+            return (KEY_NULL);
+        else 
+            return (KEY_TEXT_CHANGE);   /* dummy */
+#endif /* THROUGH_CONT */
+    }
+
+    switch(buf->convmode) {
+    case InputModeMask:
+        if ((buf->input[buf->curseg]->edit & SEG_NOEDIT) && 
+                (buf->delbyseg & buf->input[buf->curseg]->status)) {
+            if (buf->curseg > 0) {
+                buf->curseg--;
+                return(_Xsj3cDeleteSeg(buf, ret, buf->dellastmove));
+            } else {
+                return (KEY_BELL);
+            }
+        } else {
+            if (buf->input[buf->curseg]->cur == 0 && buf->curseg > 0) {
+                buf->curseg--;
+                if ((buf->input[buf->curseg]->edit & SEG_NOEDIT) &&
+                        buf->delbyseg & buf->input[buf->curseg]->status)
+                    return(_Xsj3cDeleteSeg(buf, ret, buf->dellastmove));
+                else {
+                    ret |= _Xsj3cUnConvSeg(buf, buf->delchange, ON);
+                    _Xsj3cStoreYomi(buf, buf->input[buf->curseg], 0);
+                }
+            }
+            return(_Xsj3cBackSpaceChar(buf, buf->input[buf->curseg], ret)
+                    & ~KEY_DICT_CHANGE);
+        }
+    case ConvedModeMask:
+        if (buf->curseg > 0) {
+            buf->curseg--;
+        } else {
+            return (KEY_BELL);
+        }
+        if (buf->delbyseg & buf->input[buf->curseg]->status) {
+            return(_Xsj3cDeleteSeg(buf, ret, buf->dellastmove));
+        } else {
+            ret |= _Xsj3cUnConvSeg(buf, buf->delchange, ON);
+            _Xsj3cStoreYomi(buf, buf->input[buf->curseg], 0);
+            return(_Xsj3cBackSpaceChar(buf, buf->input[buf->curseg], ret)
+                    & ~KEY_DICT_CHANGE);
+        }
+    case DictModeMask:
+        /* DictMode $B$N;~(B  */
+        if (buf->dict->status == DICT_INPUT) {
+            ret = _Xsj3cBackSpaceChar(buf, buf->dict->seg, ret)
+                & ~KEY_TEXT_CHANGE;
+            _Xsj3cFlushDictMsg(buf);
+            return(ret);
+        } else {
+            return(KEY_NULL);
+        }
+    default:
+        return(ret);
+    }
+}
+
+/*
+ * _Xsj3cDelete()
+ *
+ * <InputMode/ConvedMode> Delete current segment or character.
+ * <DictMode> Delete the character of current position.
+ * <SelectMode> Popdown the panel and delete current segment or character.
+ * <NoInputMode> Rings bell.
+ *
+ * DeleteBySegment on: Delete current segment.
+ * DeleteBySegment off: Delete current character.
+ * DeleteChangeSegment all: Unconvert all segments when "DeleteBySegment"
+ *   is off.
+ * DeleteChangeSegment one: Unconvert segments after current segment 
+ *   when "DeleteBySegment" is off.
+ * DeleteChangeSegment after: Unconvert current segment
+ *   when "DeleteBySegment" is off.
+ * DeleteLastMove on: Move current segment to previous
+ *   after deleting last segment. 
+ */
+Xsj3cEvent
+_Xsj3cDelete(buf)
+    Xsj3cBuf        buf;
+{
+    Xsj3cEvent      ret = KEY_NULL;
+
+    if (buf->convmode & SelectModeMask) {
+        ret |= KEY_SELECT_ABORT;
+        if (buf->selectstatus == SELECT_HINSI) {
+            buf->convmode = DictModeMask;
+            buf->dict->status = DICT_INPUT;
+        } else if (buf->selectstatus == SELECT_CAND) {
+            buf->convmode = ConvedModeMask;
+        } else {
+            buf->convmode = InputModeMask;
+            if (buf->curseg >= buf->segnum) {
+                return (ret);
+            }
+        }
+        /* SelectMode $B$N;~$O8uJdA*Br!?5-9fA*Br(B    */
+        /* $B%&%#%s%I%&$r%]%C%W%@%&%s(B             */
+    } else if (buf->convmode & NoInputModeMask) {
+#ifdef THROUGH_CONT
+        return (KEY_NULL);
+#else /* THROUGH_CONT */
+        if (buf->cntrlsame)
+            return (KEY_NULL);
+        else 
+            return (KEY_TEXT_CHANGE);   /* dummy */
+#endif /* THROUGH_CONT */
+    } else if (buf->curseg >= buf->segnum) {
+        /* $B$"$k$$$O%+%l%s%HJ8@aHV9f$,J8@a?t$h$j(B */
+        /* $B>.$5$/$J$$;~$O%Y%k$rLD$i$9(B           */
+#ifdef THROUGH_CONT
+        return (KEY_BELL);
+#else /* THROUGH_CONT */
+        if (buf->cntrlsame)
+            return (KEY_BELL);
+        else 
+            return (KEY_TEXT_CHANGE|KEY_BELL);  /* dummy */
+#endif /* THROUGH_CONT */
+    }
+
+    switch(buf->convmode) {
+    case InputModeMask:
+        if ((buf->input[buf->curseg]->edit & SEG_NOEDIT) && 
+                (buf->delbyseg & buf->input[buf->curseg]->status)) {
+            return(_Xsj3cDeleteSeg(buf, ret, buf->dellastmove));
+        } else {
+            if (buf->input[buf->curseg]->num == buf->input[buf->curseg]->cur
+                    && buf->curseg < buf->segnum - 1) {
+                buf->curseg++;
+                if ((buf->input[buf->curseg]->edit & SEG_NOEDIT) &&
+                        buf->delbyseg & buf->input[buf->curseg]->status)
+                    return(_Xsj3cDeleteSeg(buf, ret, buf->dellastmove));
+                else {
+                    ret |= _Xsj3cUnConvSeg(buf, buf->delchange, OFF);
+                    _Xsj3cStoreYomi(buf, buf->input[buf->curseg], 0);
+                }
+            }
+            return(_Xsj3cDeleteChar(buf, buf->input[buf->curseg], ret)
+                    & ~KEY_DICT_CHANGE);
+        }
+    case ConvedModeMask:
+        if (buf->delbyseg & buf->input[buf->curseg]->status) {
+            return(_Xsj3cDeleteSeg(buf, ret, buf->dellastmove));
+        } else {
+            ret |= _Xsj3cUnConvSeg(buf, buf->delchange, OFF);
+            _Xsj3cStoreYomi(buf, buf->input[buf->curseg], 0);
+            return(_Xsj3cDeleteChar(buf, buf->input[buf->curseg], ret)
+                    & ~KEY_DICT_CHANGE);
+        }
+    case DictModeMask:
+        /* DictMode $B$N;~(B  */
+        if (buf->dict->status == DICT_INPUT) {
+            ret = _Xsj3cDeleteChar(buf, buf->dict->seg, ret)
+                & ~KEY_TEXT_CHANGE;
+            _Xsj3cFlushDictMsg(buf);
+            return(ret);
+        } else {
+            return(KEY_NULL);
+        }
+    default:
+        return(ret);
+    }
+}
+
+/*
+ * _Xsj3cBackSpaceChar()
+ *  Delete last character of string buffers.
+ */
+static Xsj3cEvent
+_Xsj3cBackSpaceChar(buf, seg, ret)
+    Xsj3cBuf                buf;
+    Xsj3cSeg                seg;
+    Xsj3cEvent              ret;
+{
+    unsigned char           tmp[YBUFSIZ];
+    wchar                   wcs[RBUFSIZ];
+    int                     change_pos, len;
+    register int            i;
+
+    if (seg->cur > 0) {
+        /* $B%+!<%=%k0LCV$h$jA0$KI=<(J8;zNs$,B8:_$9$k$H$-(B */
+
+        if (buf->backdisplay) {
+
+            /* .BackDisplay  on $B$N;~(B    */
+
+            change_pos = seg->cur - 1;
+            if (seg->n_roma) {
+                /* $B$R$i$,$J!?A43Q%+%?%+%J!?H>3Q%+%?%+%JF~NO%b!<%I$N(B */
+                /* $B$H$-$G%m!<%^;z%P%C%U%!$KJ8;z$,;D$C$F$$$k$H$-(B     */
+                /* $B$^$:0lJ8;z:o=|$9$k(B                               */
+                _Xsj3cExtractChar(buf, seg, tmp, 1);
+                change_pos = seg->cur;
+                if (*seg->oldstr != '\0' && seg->value < 0) {
+                    /* $BB`Hr%P%C%U%!$KJ8;z$,$"$C$FD>A0$N%m!<%^;z$+$J(B */
+                    /* $BJQ49$N7k2L$,JQ49ITG=$N>l9g$OB`Hr%P%C%U%!$N(B   */
+                    /* $BJ8;z$r%m!<%^;z%P%C%U%!$K%3%T!<$9$k(B           */
+                    strcpy(seg->str, seg->oldstr);
+                    seg->n_roma = strlen(seg->oldstr);
+                    seg->sp = seg->str;
+                    seg->sp += seg->n_roma;
+                    *(seg->sp) = '\0';
+                    *seg->oldstr = '\0';
+                } else {
+                    /* $B%m!<%^;zF~NO$GD>A0$NJQ497k2L>uBV$,ITDj$N$H$-(B */
+                    /* $B$O$H$-$O%m!<%^;z%P%C%U%!$NH>3Q%"%k%U%!%Y%C%H(B */
+                    /* $B$r#1J8;z:o=|$7!"FI$_%P%C%U%!$dI=<(%P%C%U%!$N(B */
+                    /* $B%"%k%U%!%Y(B $B%C%H$b#1J8;z>C5n$9$k(B      */
+                    seg->sp--;
+                    *seg->sp = '\0';
+                    seg->n_roma--;
+                }
+            } else if (seg->n_kana > 0) {
+                /* $B$+$JF~NO$G$R$i$,$J!?A43Q%+%?%+%JF~NO%b!<%I$N;~$G(B */
+                /* $B$+$J%P%C%U%!$KJ8;z$,;D$C$F$$$k;~$O$+$J%P%C%U%!Cf(B */
+                /* $B$N%+%J$HFI$_%P%C%U%!!"I=<(%P%C%U%!Cf$N$R$i$,$JA4(B */
+                /* $B3Q%+%?%+%J$r#1J8;z>C5n$7!"99$K$b$&#1J8;zA0$NA43Q(B */
+                /* $B$+$J$rH>3Q%+%?%+%J$KJQ49$7$F$+$J%P%C%U%!$KF~$l$k(B */
+                _Xsj3cExtractChar(buf, seg, tmp, 1);
+                change_pos = seg->cur;
+                seg->sp = seg->str;
+                *seg->str = '\0';
+                if (seg->cur > 0 &&
+                (ishira(seg->yomi[seg->cur - 1], serverIF[buf->server].lang) ||
+                iskata(seg->yomi[seg->cur - 1], serverIF[buf->server].lang))) {
+                    wcs[0] = seg->yomi[seg->cur - 1];
+                    wcs[1] = '\0';
+                    _Xsj3cwPStomPS(buf, tmp, wcs);
+                    _Xsj3cZKanaToHKata(buf, seg->str, tmp);
+                    if (isdakuon(*seg->str)
+                            && strlen(seg->str) == 1) {
+                        *(++seg->sp) = '\0';
+                        seg->n_kana = 1;
+                    } else {
+                        seg->n_kana = 0;
+                    }
+                } else {
+                    seg->n_kana = 0;
+                }
+            } else  {
+                /* $B%m!<%^;zF~NO;~$N%m!<%^;z%P%C%U%!$d$+$JF~NO;~$N(B   */
+                /* $B$+$J%P%C%U%!$KJ8;z$,;D$C$F$$$J$$$H$-(B             */
+                if (*seg->oldstr != '\0' &&
+                iskan1(seg->yomi[seg->cur - 1] >> 8, serverIF[buf->server].lang)
+                    && iskan2(seg->yomi[seg->cur - 1] & 0xff,
+                    serverIF[buf->server].lang)) {
+                    /* $BB`Hr%P%C%U%!$KJ8;z$,$"$C$F:o=|$9$k:G8e$N(B */
+                    /* $BJ8;z$,A43QJ8;z$N$H$-(B                     */
+                    if (seg->n_kana < 0) {
+                        /* $B%m!<%^;zF~NO!?%3!<%IF~NO$N>l9g!"#1J8;z:o(B */
+                        /* $B=|$7$FB`Hr%P%C%U%!$NJ8;z$r%3%T!<$9$k(B     */
+                        strcpy(seg->str, seg->oldstr);
+                        seg->n_roma = strlen(seg->oldstr);
+                        _Xsj3cExtractChar(buf, seg, tmp, seg->oldlen);
+                        change_pos = seg->cur;
+                        if (buf->alphaconv && buf->inputmode != MODE_HKATA) {
+                            _Xsj3cHAlphaToZKana(buf, tmp, seg->oldstr);
+                            _Xsj3cInsertChar(buf, seg, tmp, seg->n_roma);
+                        } else {
+                            _Xsj3cInsertChar(buf, seg, seg->oldstr,
+                                    seg->n_roma);
+                        }
+                        seg->sp = seg->str;
+                        seg->sp += seg->n_roma;
+                    } else {
+                        /* $B$+$JF~NO$N>l9g#1J8;z:o=|$7$FB`Hr%P%C%U%!(B */
+                        /* $BJ8;z$r%3%T!<$7$=$NJ8;z$r:FEY$+$JJQ49$9$k(B */
+                        _Xsj3cExtractChar(buf, seg, tmp, 1);
+                        change_pos = seg->cur;
+                        seg->sp = seg->str;
+                        strcpy(seg->str, seg->oldstr);
+                        if ((seg->value = _Xsj3cKanaConv(buf, seg, seg->str,
+                                tmp, buf->inputmode)) > 0) {
+                            seg->n_kana = 0;
+                        } else if (seg->value == 0) {
+                            seg->n_kana = 1;
+                            *(++seg->sp) = '\0';
+                            len = _Xsj3cmPStowPS(buf, wcs, tmp);
+                            _Xsj3cInsertWchar(seg, wcs, len);
+                        } else {
+                            seg->n_kana = 0;
+                        }
+                    }
+                    *seg->oldstr = '\0';
+                    seg->oldlen = 0;
+                } else if (*seg->oldstr != '\0') {
+                    /* $B%3!<%IF~NO$GH>3Q$KJQ49$5$l$k;~(B   */
+                    /* $B$^$?$OH>%+%J%b!<%I$N;~(B           */
+                    strcpy(seg->str, seg->oldstr);
+                    seg->n_roma = strlen(seg->oldstr);
+                    _Xsj3cExtractChar(buf, seg, tmp, seg->oldlen);
+                    change_pos = seg->cur;
+                    if (buf->alphaconv && buf->inputmode != MODE_HKATA) {
+                        _Xsj3cHAlphaToZKana(buf, tmp, seg->oldstr);
+                        _Xsj3cInsertChar(buf, seg, tmp, seg->n_roma);
+                    } else {
+                        _Xsj3cInsertChar(buf, seg, seg->oldstr,
+                                seg->n_roma);
+                    }
+                    seg->sp = seg->str;
+                    seg->sp += seg->n_roma;
+                    *seg->oldstr = '\0';
+                    seg->oldlen = 0;
+                } else {
+                    /* $BB`Hr%P%C%U%!$KJ8;z$,;D$C$F$$$J$$$H$-(B     */
+                    _Xsj3cExtractChar(buf, seg, tmp, 1);
+                    change_pos = seg->cur;
+                    *seg->str = '\0';
+                    seg->sp = seg->str;
+                    if (seg->n_kana >= 0) {
+                        if (seg->cur > 0 && (ishira(seg->yomi[seg->cur - 1],
+                                serverIF[buf->server].lang) ||
+                                iskata(seg->yomi[seg->cur - 1],
+                                serverIF[buf->server].lang))) {
+                            /* $B$+$JF~NO$N$H$-$O99$K#1J8;zA0(B */
+                            /* $B$NA43Q$+$J$rH>3Q%+%?%+%J$KJQ(B */
+                            /* $B49$7$F$+$J%P%C%U%!$KF~$l$k(B   */
+                            wcs[0] = seg->yomi[seg->cur - 1];
+                            wcs[1] = '\0';
+                            _Xsj3cwPStomPS(buf, tmp, wcs);
+                            _Xsj3cZKanaToHKata(buf, seg->str, tmp);
+                            if (isdakuon(*seg->str)
+                                    && strlen(seg->str) == 1) {
+                                *(++seg->sp) = '\0';
+                                seg->n_kana = 1;
+                            } else {   
+                                seg->n_kana = 0;
+                                *seg->str = '\0';
+                            }
+                        } else {
+                            seg->n_kana = 0;
+                        }
+                    } else {
+                        seg->n_kana = -1;
+                    }
+                }
+            }
+        } else {
+            /* .BackDisplay  off $B$N;~(B   */
+
+            _Xsj3cExtractChar(buf, seg, tmp, 1);
+            change_pos = seg->cur;
+            if (seg->n_roma) {
+                /* $B%m!<%^;zF~NO$G%m!<%^;z%P%C%U%!$KJ8;z$,$"$k>l9g(B  */
+                seg->sp--;
+                *seg->sp = '\0';
+                seg->n_roma--;
+            } else if (seg->n_kana >= 0) {
+                /* $B$+$JF~NO$N$H$-$O99$K#1J8;zA0$NA43Q$+$J(B   */
+                /* $B$rH>3Q%+%?%+%J$KJQ49$7$F!"$=$l$,By2;(B     */
+                /* $B8uJd$@$C$?$i$+$J%P%C%U%!$KF~$l$k(B         */
+                *seg->str = '\0';
+                seg->sp = seg->str;
+                if (seg->cur > 0 && (ishira(seg->yomi[seg->cur - 1],
+                        serverIF[buf->server].lang) ||
+                        iskata(seg->yomi[seg->cur - 1],
+                        serverIF[buf->server].lang))) {
+                    wcs[0] = seg->yomi[seg->cur - 1];
+                    wcs[1] = '\0';
+                    _Xsj3cwPStomPS(buf, tmp, wcs);
+                    _Xsj3cZKanaToHKata(buf, seg->str, tmp);
+                    if (isdakuon(*seg->str)
+                            && strlen(seg->str) == 1) {
+                        *(++seg->sp) = '\0';
+                        seg->n_kana = 1;
+                    } else {   
+                        seg->n_kana = 0;
+                        *seg->str = '\0';
+                    }
+                } else {
+                    seg->n_kana = 0;
+                }
+            } else {
+                *seg->str = '\0';
+                seg->sp = seg->str;
+                seg->n_kana = -1;
+            }
+        }
+        _Xsj3cStoreYomi(buf, seg, change_pos);
+        if (seg->num < seg->size - KANABUFSIZ - YBUFSIZ) 
+            Xsj3cResizeSegment(seg, seg->size - KANABUFSIZ);
+        if (seg->num == 0 && (buf->convmode & ~DictModeMask)) {
+            Xsj3cFreeSegment(buf->input[buf->segnum]);
+            buf->input[buf->segnum] = NULL;
+            buf->segnum--;
+            Xsj3cFreeSegment(seg);
+            seg = NULL;
+            for (i = buf->curseg; i < buf->segnum; i++) {
+                buf->input[i] = buf->input[i + 1];
+            }
+            buf->input[buf->segnum] = NULL;
+        }
+        if (buf->dispmodechange) {
+            buf->dispmode = ((buf->segnum &&
+                buf->convedsegnum == buf->segnum) ? MODE_KANJI :
+                (buf->convedsegnum ? MODE_EDIT : buf->inputmode));
+            ret |= KEY_MODE_CHANGE;
+        }
+        if (buf->curseg && buf->curseg == buf->segnum && buf->dellastmove)
+            buf->curseg--;
+
+        return(ret|KEY_TEXT_CHANGE|KEY_DICT_CHANGE);
+    } else {
+        /* $B%+!<%=%k0LCV$h$jA0$KI=<(J8;zNs$,$J$$$H$-(B */
+#ifdef THROUGH_CONT
+        return (KEY_BELL);
+#else /* THROUGH_CONT */
+        if (buf->cntrlsame)
+            return (KEY_BELL);
+        else 
+            return (KEY_TEXT_CHANGE|KEY_BELL);  /* dummy */
+#endif /* THROUGH_CONT */
+    }
+}
+
+/*
+ * _Xsj3cDeleteChar()
+ *  Delete next character of string buffers.
+ */
+static Xsj3cEvent
+_Xsj3cDeleteChar(buf, seg, ret)
+    Xsj3cBuf                buf;
+    Xsj3cSeg                seg;
+    Xsj3cEvent              ret;
+{
+    unsigned char           tmp[YBUFSIZ];
+    int                     change_pos;
+    register int            i;
+
+    if (seg->cur < seg->num) {
+        /* $B%+!<%=%k0LCV$h$j8e$m$KI=<(J8;zNs$,B8:_$9$k$H$-(B */
+
+        change_pos = seg->cur;
+        seg->cur++;
+        _Xsj3cExtractChar(buf, seg, tmp, 1);
+        _Xsj3cStoreYomi(buf, seg, change_pos);
+        if (seg->num < seg->size - KANABUFSIZ - YBUFSIZ) 
+            Xsj3cResizeSegment(seg, seg->size - KANABUFSIZ);
+        if (seg->num == 0 && (buf->convmode & ~DictModeMask)) {
+            Xsj3cFreeSegment(buf->input[buf->segnum]);
+            buf->input[buf->segnum] = NULL;
+            buf->segnum--;
+            Xsj3cFreeSegment(seg);
+            seg = NULL;
+            for (i = buf->curseg; i < buf->segnum; i++) {
+                buf->input[i] = buf->input[i + 1];
+            }
+            buf->input[buf->segnum] = NULL;
+            if (buf->dispmodechange) {
+                buf->dispmode = ((buf->segnum &&
+                    buf->convedsegnum == buf->segnum) ? MODE_KANJI :
+                    (buf->convedsegnum ? MODE_EDIT : buf->inputmode));
+                ret |= KEY_MODE_CHANGE;
+            }
+            if (buf->curseg && buf->curseg == buf->segnum && buf->dellastmove)
+                buf->curseg--;
+        }
+        return(ret|KEY_TEXT_CHANGE|KEY_DICT_CHANGE);
+    } else {
+        /* $B%+!<%=%k0LCV$h$j8e$m$KI=<(J8;zNs$,$J$$$H$-(B */
+
+        return(KEY_NULL);
+    }
+}
+
+/*
+ * _Xsj3cDeleteSeg()
+ *  Delete current segment.
+ */
+static Xsj3cEvent
+_Xsj3cDeleteSeg(buf, ret, move)
+    Xsj3cBuf                buf;
+    Xsj3cEvent              ret;
+    Xsj3cFlag               move;
+{
+    register int            i;
+
+    buf->n_select = 0;
+    if ((buf->convmode & ConvedModeMask) && buf->candidate) 
+        Xsj3cEndCandidate(buf, OFF);
+    if (buf->segnum <= buf->curseg) {
+        return (ret);
+    }
+    Xsj3cFreeSegment(buf->input[buf->segnum]);
+    buf->input[buf->segnum] = NULL;
+    buf->segnum--;
+    if (!buf->segnum) {
+        /* $BJ8@a?t$,(B 0 $B$K$J$C$?$H$-$OJQ49MQJ8;z(B   */
+        /* $B%P%C%U%!$r%/%j%"$7$F(B InputMode $B$K$9$k(B */
+
+        buf->convedsegnum = 0;
+        buf->curseg = 0;
+        Xsj3cClearSegment(buf, buf->input[0]);
+    } else if (buf->curseg == buf->segnum) {
+
+        if (buf->input[buf->curseg]->status & SEG_CONVED) {
+            buf->convedsegnum--;
+            if (!buf->convedsegnum && buf->gakusyuu) {
+                _Xsj3cClearDcid(buf);
+            }
+        }
+        Xsj3cFreeSegment(buf->input[buf->curseg]);
+        buf->input[buf->curseg] = NULL;
+        /* $BJQ49Cf$NJ8>O$N:G8e$NJ8@a$N;~$O8=J8@a$r$R$H$DA0$K$:$i$9(B */
+        if (move)
+            buf->curseg--;
+    } else if (buf->curseg < buf->segnum) {
+        /* $B:G8e$NJ8@a$G$J$$$N;~$O0J9_$NJ8@a$r(B   */
+        /* $B$R$H$D$:$DA0$K$:$i$9(B                 */
+
+        if (buf->input[buf->curseg]->status & SEG_CONVED) {
+            buf->convedsegnum--;
+            if (!buf->convedsegnum && buf->gakusyuu) {
+                _Xsj3cClearDcid(buf);
+            }
+        }
+        Xsj3cFreeSegment(buf->input[buf->curseg]);
+        buf->input[buf->curseg] = NULL;
+        for (i = buf->curseg; i < buf->segnum; i++) {
+            buf->input[i] = buf->input[i + 1];
+        }
+        buf->input[buf->segnum] = NULL;
+    }
+    if (buf->dispmodechange) {
+        buf->dispmode = ((buf->segnum &&
+            buf->convedsegnum == buf->segnum) ? MODE_KANJI :
+            (buf->convedsegnum ? MODE_EDIT : buf->inputmode));
+        ret |= KEY_MODE_CHANGE;
+    }
+    ret |= KEY_TEXT_CHANGE;
+    return(ret);
+}
+
+/*
+ * _Xsj3cDelAfter()
+ *
+ * <InputMode/ConvedMode> Delete current segment and all segments after
+ *   current segment or cursor position.
+ * <DictMode> Delete all yomi strings.
+ * <SelectMode> Popdown the panel and delete strings after current segment
+ *  or cursor position.
+ * <NoInputMode> Rings bell.
+ *
+ * DeleteBySegment on: Delete current segment and all segments after current.
+ * DeleteBySegment off: Delete strings after current cursor position
+ *   in current segment.
+ * DeleteLastMove on: Move current segment to previous
+ *   after deleting last segment. 
+ */
+Xsj3cEvent
+_Xsj3cDelAfter(buf)
+    Xsj3cBuf            buf;
+{
+    Xsj3cEvent          ret = KEY_NULL;
+    register int        i,  begin;
+    int                 del_num;
+    unsigned char      *tmp;
+
+    if (buf->convmode & SelectModeMask) {
+        if (buf->selectstatus == SELECT_HINSI || buf->curseg >= buf->segnum) {
+            if (buf->selectstatus == SELECT_HINSI)
+                buf->dict->status = DICT_INPUT;
+            if (buf->dispmodechange) {
+                buf->dispmode =
+                    (buf->dict->mode == REG_STATE ? MODE_TOROKU : MODE_SYOUKYO);
+                return (KEY_SELECT_ABORT|KEY_MODE_CHANGE);
+            } else
+                return (KEY_SELECT_ABORT);
+        } else {
+            ret |= KEY_SELECT_ABORT;
+        }
+        /* SelectMode $B$N;~$O8uJdA*Br!?5-9fA*Br(B    */
+        /* $B%&%#%s%I%&$r%]%C%W%@%&%s(B             */
+    } else if (buf->convmode & (NoInputModeMask|DictModeMask)) {
+#ifdef THROUGH_CONT
+        return (KEY_NULL);
+#else /* THROUGH_CONT */
+        if (buf->cntrlsame)
+            return (KEY_NULL);
+        else 
+            return (KEY_TEXT_CHANGE);   /* dummy */
+#endif /* THROUGH_CONT */
+    } else if (buf->curseg >= buf->segnum) {
+        /* $B$"$k$$$O%+%l%s%HJ8@aHV9f$,J8@a?t$h$j(B */
+        /* $B>.$5$/$J$$;~$O%Y%k$rLD$i$9(B           */
+#ifdef THROUGH_CONT
+        return (KEY_BELL);
+#else /* THROUGH_CONT */
+        if (buf->cntrlsame)
+            return (KEY_BELL);
+        else 
+            return (KEY_TEXT_CHANGE|KEY_BELL);  /* dummy */
+#endif /* THROUGH_CONT */
+    }
+
+    ret |= KEY_TEXT_CHANGE;
+    if (buf->killbyseg & buf->input[buf->curseg]->status) {
+        if (buf->input[buf->curseg]->edit & SEG_NOEDIT) {
+            begin = buf->curseg;
+        } else {
+            if (!buf->input[buf->curseg]->cur) {
+                begin = buf->curseg;
+            } else {
+                begin = buf->curseg + 1;
+                if (buf->input[buf->curseg]->cur
+                        < buf->input[buf->curseg]->num) {
+                    del_num = buf->input[buf->curseg]->num
+                            - buf->input[buf->curseg]->cur;
+                    buf->input[buf->curseg]->cur = buf->input[buf->curseg]->num;
+                    if ((tmp = (unsigned char *)
+                            malloc(buf->input[buf->curseg]->size
+                            * sizeof(wchar))) == NULL)
+                        Xsj3cError("Cannot allocate for temporary buffer");
+                    _Xsj3cExtractChar(buf, buf->input[buf->curseg], tmp, del_num);
+                    free(tmp);
+                    _Xsj3cStoreYomi(buf, buf->input[buf->curseg],
+                            buf->input[buf->curseg]->cur);
+                }
+            }
+        }
+        for (i = begin; i < buf->segnum + 1; i++) {
+            if (buf->input[i]->status & SEG_CONVED)
+                buf->convedsegnum--;
+            Xsj3cFreeSegment(buf->input[i]);
+            buf->input[i] = NULL;
+        }
+        buf->segnum = begin;
+        if (begin == buf->curseg && buf->dellastmove && buf->curseg) 
+            buf->curseg--;
+        if (buf->dispmodechange) {
+            buf->dispmode = ((buf->segnum &&
+                buf->convedsegnum == buf->segnum) ? MODE_KANJI :
+                (buf->convedsegnum ? MODE_EDIT : buf->inputmode));
+            ret |= KEY_MODE_CHANGE;
+        }
+        if (buf->gakusyuu && !buf->convedsegnum) 
+            _Xsj3cClearDcid(buf);
+    } else {
+        if (buf->input[buf->curseg]->edit & SEG_NOEDIT
+                || !buf->input[buf->curseg]->cur) {
+            ret |= _Xsj3cDeleteSeg(buf, ret, buf->dellastmove);
+        } else {
+            if (buf->input[buf->curseg]->cur
+                    < buf->input[buf->curseg]->num) {
+                del_num = buf->input[buf->curseg]->num
+                        - buf->input[buf->curseg]->cur;
+                buf->input[buf->curseg]->cur = buf->input[buf->curseg]->num;
+                if ((tmp = (unsigned char *)
+                        malloc(buf->input[buf->curseg]->size
+                        * sizeof(wchar))) == NULL)
+                    Xsj3cError("Cannot allocate for temporary buffer");
+                _Xsj3cExtractChar(buf, buf->input[buf->curseg], tmp, del_num);
+                free(tmp);
+                _Xsj3cStoreYomi(buf, buf->input[buf->curseg],
+                        buf->input[buf->curseg]->cur);
+            }
+        }
+    }
+
+    return(ret);
+}
+
+/*
+ * _Xsj3cStart()
+ *
+ * <NoInputMode/InputMode/ConvedMode/DictMode/SelectMode> If now on converting,
+ *   fix all segments, then end kana-kanji converting.
+ *
+ * FlushEndConversion on: Flush converting strings before ending.  
+ * DisplayModeChange on: Change the display mode string.  
+ */
+Xsj3cEvent
+_Xsj3cStart(buf)
+    Xsj3cBuf            buf;
+{
+    Xsj3cEvent          ret = KEY_HENKAN_END;
+    register int        i;
+
+    if (buf->dispmodechange) {
+        buf->dispmode = buf->inputmode;
+    }
+    switch(buf->convmode) {
+    case ConvedModeMask:
+        buf->n_select = 0;
+        if (buf->candidate) 
+            Xsj3cEndCandidate(buf, OFF);
+    case InputModeMask:
+        break;
+    case SelectModeMask:
+        if (buf->flusheconv)
+            ret |= KEY_SELECT_END;
+        else 
+            ret |= KEY_SELECT_ABORT;
+        if (buf->candidate) 
+            Xsj3cEndCandidate(buf, OFF);
+        buf->n_select = 0;
+        break;
+    case DictModeMask:
+        ret |= KEY_DICT_END;
+        break;
+    case NoInputModeMask:
+        return (KEY_HENKAN_END);
+    default:
+        /* Not supported    */
+        return (KEY_HENKAN_START);
+    }
+    if (buf->flusheconv) {
+        ret |= KEY_TEXT_FIXED;
+    } else {
+        for (i = 1; i < buf->segnum + 1; i++) {
+            Xsj3cFreeSegment(buf->input[i]);
+            buf->input[i] = NULL;
+        }
+        if (buf->input[0])
+            Xsj3cClearSegment(buf, buf->input[0]);
+        buf->segnum = 0;
+        buf->convedsegnum = 0;
+        buf->curseg = 0;
+    }
+    return ret;
+}
+
+/*
+ * _Xsj3cReConnect()
+ *
+ * <NoInputMode/InputMode/ConvedMode/DictMode/SelectMode> Popdown the panel
+ *   and clear all segments, then reonnect to sj3serv.
+ *  
+ * FlushEndConversion on: Flush converting strings before reconnecting.  
+ * DisplayModeChange on: Change the display mode string.  
+ */
+Xsj3cEvent
+_Xsj3cReConnect(buf)
+    Xsj3cBuf    buf;
+{
+    Xsj3cEvent  ret = KEY_TEXT_CHANGE;
+
+    if (buf->gakusyuu) {
+        _Xsj3cClearDcid(buf);
+    }
+    switch (buf->convmode) {
+    case ConvedModeMask:
+        buf->n_select = 0;
+        if (buf->candidate) 
+            Xsj3cEndCandidate(buf, OFF);
+    case InputModeMask:
+    case NoInputModeMask:
+        ret = KEY_RECONNECT;
+        break;
+    case SelectModeMask:
+        ret = KEY_SELECT_ABORT|KEY_RECONNECT;
+        buf->n_select = 0;
+        if (buf->candidate) 
+            Xsj3cEndCandidate(buf, OFF);
+        break;
+    case DictModeMask:
+        ret = KEY_DICT_END|KEY_RECONNECT;
+        break;
+    default:
+        ret = KEY_RECONNECT;
+        break;
+    }
+    if (buf->dispmodechange) {
+        buf->dispmode = buf->inputmode;
+        ret |= KEY_MODE_CHANGE;
+    }
+    return ret;
+}
+
+/*
+ * _Xsj3cReConvert()
+ *
+ * <NoInputMode> If there is no string in input buffer,
+ *   copy from backup buffer which saved last fixed or flushed.
+ *   But there is any strings in input buffer or backup buffer is null,
+ *   ring bell.
+ * <InputMode/UnputMode/SelectMode/DictMode> Ring bell.
+ *
+ * BeginConversionLast on: Set current segment to the last one. 
+ * BeginConversionLast none: Allow to move out of segments. 
+ */
+Xsj3cEvent
+_Xsj3cReConvert(buf)
+    Xsj3cBuf            buf;
+{
+    register int        i,  conved;
+
+    if ((buf->convmode & NoInputModeMask) && buf->backup) {
+        buf->segnum = buf->backsegnum;
+        if (!buf->segnum)
+#ifdef THROUGH_CONT
+            return (KEY_NULL);
+#else /* THROUGH_CONT */
+            if (buf->cntrlsame)
+                return (KEY_NULL);
+            else 
+                return (KEY_TEXT_CHANGE);   /* dummy */
+#endif /* THROUGH_CONT */
+        for (i = 0, conved = 0; i < buf->segnum; i++) {
+            if (!buf->input[i]) {
+                if ((buf->input[i]
+                        = (Xsj3cSeg)Xsj3cCreateSegment(buf)) == NULL) {
+                    Xsj3cError("Failed to allocate segment");
+                }
+            } else {
+                *buf->input[i]->oldstr = '\0';
+                buf->input[i]->oldlen = 0;
+                *buf->input[i]->str = '\0';
+                buf->input[i]->sp = buf->input[i]->str;
+                buf->input[i]->change = OFF;
+                buf->input[i]->n_roma = 0;
+                buf->input[i]->n_kana = -1;
+                buf->input[i]->value = 0;
+            }
+            _Xsj3cWcpy(buf->input[i]->yomi, buf->backup[i]->yomi);
+            buf->input[i]->num = buf->backup[i]->num;
+            buf->input[i]->cur = buf->backup[i]->cur;
+            _Xsj3cWcpy(buf->input[i]->disp, buf->backup[i]->disp);
+            buf->input[i]->dnum = buf->backup[i]->dnum;
+            buf->input[i]->dcid = buf->backup[i]->dcid;
+            buf->input[i]->edit = buf->backup[i]->edit;
+            buf->input[i]->cursegmode = buf->backup[i]->cursegmode;
+            if ((buf->input[i]->status = buf->backup[i]->status) == SEG_CONVED)
+                conved++;
+            buf->input[i]->size = buf->backup[i]->size;
+        }
+        buf->convedsegnum = conved;
+        switch (buf->beginlastseg) {
+        case NONE:
+            buf->curseg = buf->segnum;
+            break;
+        case ON:
+            buf->curseg = buf->segnum - 1;
+            break;
+        case OFF:
+            buf->curseg = 0;
+            break;
+        default:
+            buf->curseg = 0;
+            break;
+        }
+        return (KEY_TEXT_CHANGE);
+    } else {
+        return KEY_NULL;
+    }
+}
+
+/*
+ * _Xsj3cEdit() [edit]
+ *
+ * <InputMode/ConvedMode> Unconvert segments.
+ * <SelectMode> pop down the panel candidate(symbol/hinsi) panel and
+ *   unconvert current segment.
+ * <DictMode> Pop down Auxpanel and unconvert current segment.
+ * <NoInputMode> Does nothing.
+ *
+ * DisplayModeChange on: Change the display mode string.  
+ * EditCursorLast on: Set cursor position to bottom of segment.
+ * EditCursorLast off: Set cursor position to top of segment.
+ */
+Xsj3cEvent
+_Xsj3cEdit(buf)
+    Xsj3cBuf            buf;
+{
+    Xsj3cEvent          ret = KEY_NULL;
+
+    if (buf->convmode & SelectModeMask) {
+        ret |= KEY_SELECT_ABORT;
+        if (buf->selectstatus == SELECT_HINSI) {
+            ret |= KEY_DICT_END;
+        }
+    } else if (buf->convmode & DictModeMask) {
+        ret |= KEY_DICT_END;
+    } else if (buf->convmode & NoInputModeMask) {
+#ifdef THROUGH_CONT
+        return (KEY_NULL);
+#else /* THROUGH_CONT */
+        if (buf->cntrlsame)
+            return (KEY_NULL);
+        else 
+            return (KEY_TEXT_CHANGE);   /* dummy */
+#endif /* THROUGH_CONT */
+    }
+    ret |= _Xsj3cUnConvSeg(buf, ONE, buf->editcurlast);
+    _Xsj3cStoreYomi(buf, buf->input[buf->curseg], 0);
+    buf->input[buf->curseg]->edit = SEG_EDIT;
+    return (ret);
+}
+
+/*
+ * _Xsj3cDRegBegin()
+ *
+ * <InputMode/ConvedMode> Begin to registr the word in the dictionary.
+ * <NoInputMode/DictMode/SelectMode> Rings bell.
+ *  
+ * DisplayModeChange on: Change the display mode string.  
+ */
+Xsj3cEvent
+_Xsj3cDRegBegin(buf)
+    Xsj3cBuf    buf;
+{
+    if (buf->convmode & (ConvedModeMask|InputModeMask)) {
+        buf->n_select = 0;
+        if (buf->candidate) 
+            Xsj3cEndCandidate(buf, ON);
+        buf->dict = _Xsj3cCreateDictData(buf, REG_STATE);
+        buf->convmode = DictModeMask;
+        _Xsj3cFlushDictMsg(buf);
+        if (buf->dispmodechange) {
+            buf->dispmode = MODE_TOROKU;
+            return (KEY_DICT_START|KEY_MODE_CHANGE);
+        } else
+            return (KEY_DICT_START);
+    } else {
+#ifdef THROUGH_CONT
+        return (KEY_BELL);
+#else /* THROUGH_CONT */
+        if (buf->cntrlsame)
+            return (KEY_BELL);
+        else 
+            return (KEY_TEXT_CHANGE|KEY_BELL);  /* dummy */
+#endif /* THROUGH_CONT */
+    }
+}
+
+/*
+ * _Xsj3cDClearBegin()
+ *
+ * <InputMode/ConvedMode> Begin to eliminate the word in the dictionary.
+ * <NoInputMode/DictMode/SelectMode> Rings bell.
+ *  
+ * DisplayModeChange on: Change the display mode string.  
+ */
+Xsj3cEvent
+_Xsj3cDClearBegin(buf)
+    Xsj3cBuf    buf;
+{
+    if (buf->convmode & (ConvedModeMask|InputModeMask)) {
+        buf->n_select = 0;
+        if (buf->candidate) 
+            Xsj3cEndCandidate(buf, OFF);
+        buf->dict = _Xsj3cCreateDictData(buf, CLR_STATE);
+        buf->convmode = DictModeMask;
+        _Xsj3cFlushDictMsg(buf);
+        if (buf->dispmodechange) {
+            buf->dispmode = MODE_SYOUKYO;
+            return (KEY_DICT_START|KEY_MODE_CHANGE);
+        } else
+            return (KEY_DICT_START);
+    } else {
+#ifdef THROUGH_CONT
+        return (KEY_BELL);
+#else /* THROUGH_CONT */
+        if (buf->cntrlsame)
+            return (KEY_BELL);
+        else 
+            return (KEY_TEXT_CHANGE|KEY_BELL);  /* dummy */
+#endif /* THROUGH_CONT */
+    }
+}
+
+/*
+ * _Xsj3cSymbolBegin()
+ *
+ * <NoInputMode/InputMode/ConvedMode> Begin symbol selecting
+ *   and popup the panel.
+ * <DictMode/SelectMode> Ring bell.
+ *  
+ * DisplayModeChange on: Change the display mode string.  
+ */
+Xsj3cEvent
+_Xsj3cSymbolBegin(buf)
+    Xsj3cBuf        buf;
+{
+    Xsj3cEvent      ret = KEY_SYMBOL_START;
+
+    if (buf->convmode & (InputModeMask|NoInputModeMask|ConvedModeMask)) {
+        if (buf->dispmodechange) {
+            buf->dispmode = MODE_SYMBOL;
+            ret |= KEY_MODE_CHANGE;
+        }
+        buf->selectstatus = SELECT_SYMBOL;
+        buf->convmode = SelectModeMask;
+        return (ret);
+    } else {
+        return (KEY_BELL);
+    }
+}
+
+/*
+ * _Xsj3cFlushBefore()
+ *
+ * <InputMode/ConvedMode> Delete current segment and all segments after
+ *   current segment or cursor position.
+ * <DictMode> Delete all yomi strings.
+ * <SelectMode> Popdown the panel and delete strings after current segment
+ *  or cursor position.
+ * <NoInputMode> Does nothing.
+ *
+ * FlushChangeSegment off: Fix strings before current cursor position
+ * FlushChangeSegment one: Fix strings before current cursor position
+ *   and unconvert one segment.
+ * FlushChangeSegment all: Fix strings before current cursor position
+ *   and unconvert all segments.
+ * FlushCursorLast on: Set cursor position to bottom of segment.
+ * FlushCursorLast off: Set cursor position to top of segment.
+ */
+Xsj3cEvent
+_Xsj3cFlushBefore(buf)
+    Xsj3cBuf        buf;
+{
+    Xsj3cEvent      ret = KEY_NULL;
+    register int    i,  j;
+    int             store_num;
+    unsigned char  *tmp;
+    
+    if (buf->convmode & SelectModeMask) {
+        if (buf->selectstatus == SELECT_HINSI || buf->curseg >= buf->segnum) {
+            if (buf->selectstatus == SELECT_HINSI)
+                buf->dict->status = DICT_INPUT;
+            if (buf->dispmodechange) {
+                buf->dispmode =
+                    (buf->dict->mode == REG_STATE ? MODE_TOROKU : MODE_SYOUKYO);
+                return (KEY_SELECT_ABORT|KEY_MODE_CHANGE);
+            } else
+                return (KEY_SELECT_ABORT);
+        } else {
+            ret |= KEY_SELECT_END;
+        }
+        /* SelectMode $B$N;~$O8uJdA*Br!?5-9fA*Br(B    */
+        /* $B%&%#%s%I%&$r%]%C%W%@%&%s(B             */
+    } else if (buf->convmode & (NoInputModeMask|DictModeMask)) {
+#ifdef THROUGH_CONT
+        return (KEY_NULL);
+#else /* THROUGH_CONT */
+        if (buf->cntrlsame)
+            return (KEY_NULL);
+        else 
+            return (KEY_TEXT_CHANGE);   /* dummy */
+#endif /* THROUGH_CONT */
+    } else if (buf->curseg >= buf->segnum) {
+        /* $B$"$k$$$O%+%l%s%HJ8@aHV9f$,J8@a?t$h$j(B */
+        /* $B>.$5$/$J$$;~$O%Y%k$rLD$i$9(B           */
+#ifdef THROUGH_CONT
+        return (KEY_BELL);
+#else /* THROUGH_CONT */
+        if (buf->cntrlsame)
+            return (KEY_BELL);
+        else 
+            return (KEY_TEXT_CHANGE|KEY_BELL);  /* dummy */
+#endif /* THROUGH_CONT */
+    }
+
+    if (!buf->backup) {
+        if ((buf->backup = (Xsj3cSeg *)calloc(BUNBUFSIZ,
+                sizeof(Xsj3cSeg))) == NULL) {
+            Xsj3cError("Cannot allocate for backup buffers");
+        }
+    } else { 
+        for (i = 0; i < buf->backsegnum + 1; i++) {
+            Xsj3cFreeSegment(buf->backup[i]);
+            buf->backup[i] = NULL;
+        }
+    }
+
+    switch(buf->flushchange) {
+    case ONE:
+        ret |= _Xsj3cUnConvSeg(buf, ONE, buf->flushcurlast);
+        _Xsj3cStoreYomi(buf, buf->input[buf->curseg], 0);
+        break;
+    case ALL:
+        ret |= _Xsj3cUnConvSeg(buf, AFTER, buf->flushcurlast);
+        _Xsj3cStoreYomi(buf, buf->input[buf->curseg], 0);
+        buf->input[buf->curseg]->edit = SEG_EDIT;
+        break;
+    case OFF:
+    default:
+        break;
+    }
+
+    ret |= (KEY_TEXT_CHANGE|KEY_TEXT_FLUSH);
+    for (i = buf->curseg, j = 0; i < buf->segnum; i++, j++) {
+        buf->backup[j] = buf->input[i];
+        buf->input[i] = NULL;
+    }
+    buf->backsegnum = j;
+    Xsj3cFreeSegment(buf->input[buf->segnum]);
+    buf->input[buf->segnum] = NULL;
+    buf->segnum = buf->curseg;
+    for (i = 0; i < buf->curseg; i++)
+        if (buf->input[i]->status & SEG_CONVED)
+            buf->convedsegnum--;
+
+    if (buf->flushchange == OFF && (buf->backup[0]->edit & SEG_EDIT)
+        && (buf->backup[0]->cur < buf->backup[0]->num) 
+        && buf->backup[0]->cur) {
+        /* .FlushChangeSegment $B$,(B off $B$G%+!<%=%k$,C<$K$J$$$H$-(B */
+
+        buf->backup[0]->cur = buf->backup[0]->num;
+        if ((tmp = (unsigned char *)malloc(buf->backup[0]->size
+                * sizeof(wchar))) == NULL)
+            Xsj3cError("Cannot allocate for temporary buffer");
+        store_num = buf->backup[0]->cur;
+        _Xsj3cExtractChar(buf, buf->backup[0], tmp, buf->backup[0]->cur);
+        _Xsj3cStoreYomi(buf, buf->backup[0], 0);
+        if (!buf->input[buf->segnum]) {
+            if ((buf->input[buf->segnum]
+                    = (Xsj3cSeg)Xsj3cCreateSegment(buf)) == NULL) {
+                Xsj3cError("Failed to allocate segment.");
+            }
+        } else
+            Xsj3cClearSegment(buf, buf->input[buf->segnum]);
+        _Xsj3cInsertChar(buf, buf->input[buf->segnum], tmp, store_num);
+        _Xsj3cStoreYomi(buf, buf->input[buf->segnum], 0);
+        buf->segnum++;
+        free(tmp);
+    }
+
+    if (buf->gakusyuu && !buf->convedsegnum) 
+        _Xsj3cClearDcid(buf);
+    if (buf->dispmodechange) {
+        buf->dispmode = ((buf->segnum &&
+            buf->convedsegnum == buf->segnum) ? MODE_KANJI :
+            (buf->convedsegnum ? MODE_EDIT : buf->inputmode));
+        ret |= KEY_MODE_CHANGE;
+    }
+    return(ret);
+}
+
+/*
+ * _Xsj3cQuote()
+ *
+ * <NoInputMode/InputMode/ConvedMode/DictMode/SelectMode> Set "through flag"
+ *    and input next character unconditionally.
+ */
+Xsj3cEvent
+_Xsj3cQuote(buf)
+    Xsj3cBuf        buf;
+{
+    Xsj3cEvent      ret = KEY_NULL;
+    
+    buf->throughflg = QUOTE;
+    if (buf->dispmodechange) {
+        buf->dispmode = MODE_QUOTE;
+        ret |= KEY_MODE_CHANGE;
+    }
+#ifndef THROUGH_CONT
+    if (!buf->cntrlsame)
+        ret |= KEY_TEXT_CHANGE;     /* dummy    */
+#endif /* THROUGH_CONT */
+    return (ret);
+}
+
+/*
+ * _Xsj3cBell()
+ *
+ * <NoInputMode/InputMode/ConvedMode/DictMode/SelectMode> Rings bell.
+ */
+Xsj3cEvent
+_Xsj3cBell(buf)
+    Xsj3cBuf    buf;
+{
+#ifdef THROUGH_CONT
+    return (KEY_BELL);
+#else /* THROUGH_CONT */
+    if (buf->cntrlsame)
+        return (KEY_BELL);
+    else 
+        return (KEY_TEXT_CHANGE|KEY_BELL);  /* dummy */
+#endif /* THROUGH_CONT */
+}
+
+/*
+ * _Xsj3cKana()
+ *
+ * <NoInputMode/InputMode/ConvedMode/DictMode/SelectMode> 
+ *   Toggle keyboard input mode between ASCII and Kana.
+ *
+ * KanaInputOnly on: Set toggle on in initializing.
+ */
+Xsj3cEvent
+_Xsj3cKana(buf)
+    Xsj3cBuf    buf;
+{
+    Xsj3cEvent  ret = KEY_NULL;
+
+    if ((buf->convmode & DictModeMask)||((buf->convmode & SelectModeMask)
+            && buf->selectstatus == SELECT_HINSI)) {
+        buf->dict->seg->n_roma = 0;
+        buf->dict->seg->n_kana = -1;
+        *buf->dict->seg->oldstr = '\0';
+        *buf->dict->seg->str = '\0';
+        buf->dict->seg->sp = buf->dict->seg->str;
+    }
+    if (buf->convmode & ~NoInputModeMask) {
+        buf->input[buf->curseg]->n_roma = 0;
+        buf->input[buf->curseg]->n_kana = -1;
+        *buf->input[buf->curseg]->oldstr = '\0';
+        *buf->input[buf->curseg]->str = '\0';
+        buf->input[buf->curseg]->sp = buf->input[buf->curseg]->str;
+    }
+    if (buf->kanaonly)
+        buf->kanaonly = OFF;
+    else 
+        buf->kanaonly = ON;
+#ifndef THROUGH_CONT
+    if (!buf->cntrlsame)
+        ret |= KEY_TEXT_CHANGE;     /* dummy    */
+#endif /* THROUGH_CONT */
+    return ret;
+}
+
+/*
+ * _Xsj3cSjrc()
+ *
+ * <NoInputMode/InputMode/ConvedMode/DictMode/SelectMode> Reset customize.
+ *
+ * NextRCFile filename: Set file name to read next.
+ */
+Xsj3cEvent
+_Xsj3cSjrc(buf)
+    Xsj3cBuf            buf;
+{
+    Xsj3cEvent          ret = (KEY_TEXT_CHANGE|KEY_MODE_CHANGE);
+    register int        i;
+
+    if (buf->dispmodechange) {
+        ret |= KEY_MODE_CHANGE;
+        buf->dispmode = buf->inputmode;
+    }
+    switch(buf->convmode) {
+    case ConvedModeMask:
+        buf->n_select = 0;
+        if (buf->candidate) 
+            Xsj3cEndCandidate(buf, OFF);
+    case InputModeMask:
+        break;
+    case SelectModeMask:
+        buf->n_select = 0;
+        if (buf->flusheconv)
+            ret |= KEY_SELECT_END;
+        else 
+            ret |= KEY_SELECT_ABORT;
+        if (buf->candidate) 
+            Xsj3cEndCandidate(buf, OFF);
+        break;
+    case DictModeMask:
+        ret |= KEY_DICT_END;
+        break;
+    case NoInputModeMask:
+    default:
+        break;
+    }
+    if (buf->flusheconv) {
+        ret |= KEY_TEXT_FIXED;
+        if (buf->gakusyuu)
+            _Xsj3cFlushDcid(buf);
+    } else {
+        for (i = 1; i < buf->segnum + 1; i++) {
+            Xsj3cFreeSegment(buf->input[i]);
+            buf->input[i] = NULL;
+        }
+        if (buf->input[0])
+            Xsj3cClearSegment(buf, buf->input[0]);
+        buf->segnum = 0;
+        buf->curseg = 0;
+    }
+    if (buf->setnormal) {
+        free(buf->setnormal);
+        buf->setnormal = NULL;
+    }
+    if (buf->throughnext) {
+        free(buf->throughnext);
+        buf->throughnext = NULL;
+    }
+    Xsj3cRCInit(buf, NULL, NULL);
+    return ret;
+}
+
+/*
+ * _Xsj3cKill()
+ *
+ * <NoInputMode/InputMode/ConvedMode/DictMode/SelectMode> Exit.
+ */
+Xsj3cEvent
+_Xsj3cKill(buf)
+    Xsj3cBuf    buf;
+{
+    /* Not Yet  */
+    return (KEY_NULL);
+}
+
+/*
+ * _Xsj3cNull()
+ *
+ * <NoInputMode/InputMode/ConvedMode/DictMode/SelectMode> Does nothing.
+ */
+Xsj3cEvent
+_Xsj3cNull(buf)
+    Xsj3cBuf    buf;
+{
+    return (KEY_NULL|KEY_CONTROL);
+}
+
+/*
+ * _Xsj3cIgnore()
+ *
+ * <NoInputMode/InputMode/ConvedMode/DictMode/SelectMode> Does nothing.
+ */
+Xsj3cEvent
+_Xsj3cIgnore(buf)
+    Xsj3cBuf    buf;
+{
+    return (KEY_NULL|KEY_CONTROL);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/Xsj3clib/func.h	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,97 @@
+/* $Id: func.h,v 2.0 1992/02/13 18:33:24 nao Exp $ */
+/*
+ * Copyright 1991 Sony Corporation
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Sony not be used in advertising or
+ * publicity pertaining to distribution of the software without specific,
+ * written prior permission.  Sony makes no representations about the
+ * suitability of this software for any purpose.  It is provided "as is"
+ * without express or implied warranty.
+ *
+ * SONY DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL SONY
+ * BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
+ * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN 
+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+/*
+ * Author: Naoshi Suzuki, SONY Corporation.  (nao@sm.sony.co.jp)
+ */
+
+extern Xsj3cEvent       _Xsj3cConvert();
+extern Xsj3cEvent       _Xsj3cUnConvert();
+extern Xsj3cEvent       _Xsj3cFix();
+extern Xsj3cEvent       _Xsj3cReturn();
+
+extern Xsj3cEvent       _Xsj3cModeHAlpha();
+extern Xsj3cEvent       _Xsj3cModeZAlpha();
+extern Xsj3cEvent       _Xsj3cModeHKata();
+extern Xsj3cEvent       _Xsj3cModeZKata();
+extern Xsj3cEvent       _Xsj3cModeHira();
+extern Xsj3cEvent       _Xsj3cToHAlpha();
+extern Xsj3cEvent       _Xsj3cToZAlpha();
+extern Xsj3cEvent       _Xsj3cToHKata();
+extern Xsj3cEvent       _Xsj3cToZKata();
+extern Xsj3cEvent       _Xsj3cToHira();
+extern Xsj3cEvent       _Xsj3cZenkaku();
+extern Xsj3cEvent       _Xsj3cHankaku();
+extern Xsj3cEvent       _Xsj3cToUpper();
+extern Xsj3cEvent       _Xsj3cToLower();
+extern Xsj3cEvent       _Xsj3cModeSJIS();
+extern Xsj3cEvent       _Xsj3cModeEUC();
+extern Xsj3cEvent       _Xsj3cModeJIS();
+extern Xsj3cEvent       _Xsj3cModeKuten();
+extern Xsj3cEvent       _Xsj3cCodeRollDown();
+extern Xsj3cEvent       _Xsj3cModeRollDown();
+extern Xsj3cEvent       _Xsj3cModeRollUp();
+extern Xsj3cEvent       _Xsj3cNextMode();
+extern Xsj3cEvent       _Xsj3cPrevMode();
+extern Xsj3cEvent       _Xsj3cModeToggle();
+
+extern Xsj3cEvent       _Xsj3cForward();
+extern Xsj3cEvent       _Xsj3cBackward();
+extern Xsj3cEvent       _Xsj3cTop();
+extern Xsj3cEvent       _Xsj3cEnd();
+extern Xsj3cEvent       _Xsj3cUp();
+extern Xsj3cEvent       _Xsj3cDown();
+extern Xsj3cEvent       _Xsj3cFirst();
+extern Xsj3cEvent       _Xsj3cLast();
+extern Xsj3cEvent       _Xsj3cNextPage();
+extern Xsj3cEvent       _Xsj3cPrevPage();
+extern Xsj3cEvent       _Xsj3cPrev();
+extern Xsj3cEvent       _Xsj3cNext();
+extern Xsj3cEvent       _Xsj3cSelect();
+extern Xsj3cEvent       _Xsj3cCancel();
+
+extern Xsj3cEvent       _Xsj3cExpand();
+extern Xsj3cEvent       _Xsj3cShrink();
+
+extern Xsj3cEvent       _Xsj3cBackSpace();
+extern Xsj3cEvent       _Xsj3cDelete();
+extern Xsj3cEvent       _Xsj3cDelAfter();
+
+extern Xsj3cEvent       _Xsj3cStart();
+extern Xsj3cEvent       _Xsj3cReConnect();
+extern Xsj3cEvent       _Xsj3cReConvert();
+extern Xsj3cEvent       _Xsj3cEdit();
+
+extern Xsj3cEvent       _Xsj3cDRegBegin();
+extern Xsj3cEvent       _Xsj3cDClearBegin();
+
+extern Xsj3cEvent       _Xsj3cSymbolBegin();
+
+extern Xsj3cEvent       _Xsj3cQuote();
+extern Xsj3cEvent       _Xsj3cFlushBefore();
+extern Xsj3cEvent       _Xsj3cBell();
+extern Xsj3cEvent       _Xsj3cKana();
+extern Xsj3cEvent       _Xsj3cSjrc();
+extern Xsj3cEvent       _Xsj3cKill();
+extern Xsj3cEvent       _Xsj3cNull();
+extern Xsj3cEvent       _Xsj3cIgnore();
+
+extern Xsj3cEvent       _Xsj3cUnConvSeg();
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/Xsj3clib/libif.c	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,59 @@
+#ifndef lint
+static char *rcsid = "$Id: libif.c,v 2.0 1992/02/13 18:33:26 nao Exp $";
+#endif
+/*
+ * Copyright 1991 Sony Corporation
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Sony not be used in advertising or
+ * publicity pertaining to distribution of the software without specific,
+ * written prior permission.  Sony makes no representations about the
+ * suitability of this software for any purpose.  It is provided "as is"
+ * without express or implied warranty.
+ *
+ * SONY DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL SONY
+ * BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
+ * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN 
+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+/*
+ * Author: Naoshi Suzuki, SONY Corporation.  (nao@sm.sony.co.jp)
+ */
+
+#include "common.h"
+
+extern int      sj3_open();
+extern int      sj3_close();
+extern int      sj3_getkan();
+extern int      sj3_douoncnt();
+extern int      sj3_getdouon();
+extern int      sj3_touroku();
+extern int      sj3_syoukyo();
+extern int      sj3_gakusyuu();
+extern int      sj3_gakusyuu2();
+extern int      sj3_lockserv();
+extern int      sj3_unlockserv();
+
+Xsj3cCVServerIF     serverIF[SERVER_NUM] = {
+    {
+        JP_SJIS,
+        {
+            sj3_open,
+            sj3_close,
+            sj3_getkan,
+            sj3_douoncnt,
+            sj3_getdouon,
+            sj3_touroku,
+            sj3_syoukyo,
+            sj3_gakusyuu,
+            sj3_gakusyuu2,
+            sj3_lockserv,
+            sj3_unlockserv
+        }
+    }
+};
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/Xsj3clib/mode.c	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,1194 @@
+#ifndef lint
+static char *rcsid = "$Id: mode.c,v 2.6 1993/01/06 10:58:18 nao Exp $";
+#endif
+/*
+ * Copyright 1991 Sony Corporation
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Sony not be used in advertising or
+ * publicity pertaining to distribution of the software without specific,
+ * written prior permission.  Sony makes no representations about the
+ * suitability of this software for any purpose.  It is provided "as is"
+ * without express or implied warranty.
+ *
+ * SONY DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL SONY
+ * BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
+ * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN 
+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+/*
+ * Author: Naoshi Suzuki, SONY Corporation.  (nao@sm.sony.co.jp)
+ */
+
+#include <ctype.h>
+#include "common.h"
+#include "sj3ctype.h"
+#include "util.h"
+
+extern Xsj3cCVServerIF      serverIF[SERVER_NUM];
+
+Xsj3cEvent                  _Xsj3cModeChange();
+Xsj3cEvent                  _Xsj3cModeClear();
+Xsj3cEvent                  Xsj3cModeConv();
+
+void                        _Xsj3cHiraToZKata();
+void                        _Xsj3cHankakuToHira();
+void                        _Xsj3cHankakuToZKata();
+void                        _Xsj3cHKataToHira();
+void                        _Xsj3cHKataToZKata();
+void                        _Xsj3cZKanaToHKata();
+void                        _Xsj3cZKataToHira();
+void                        _Xsj3cHAlphaToZAlpha();
+void                        _Xsj3cHAlphaToZKana();
+void                        _Xsj3cHAlphaToHKata();
+void                        _Xsj3cZAlphaToHAlpha();
+
+static void                 _Xsj3cLowerToUpper();
+static void                 _Xsj3cUpperToLower();
+static void                 _Xsj3cRKConvs();
+static void                 _Xsj3cKRConvs();
+
+/*
+ * _Xsj3cModeChange()
+ *
+ * Change current character mode to apointed mode(secound argument)
+ */
+Xsj3cEvent
+_Xsj3cModeChange(buf, mode, conv)
+    Xsj3cBuf        buf;
+    Xsj3csMode      mode;
+    Xsj3cFlag       conv;
+{
+    Xsj3cEvent      ret;
+    unsigned char  *mbs;
+
+    if (buf->convmode != SelectModeMask) {
+        if (conv) {
+            Xsj3cSeg        seg = buf->input[buf->curseg];
+
+            if ((mbs = (unsigned char *)
+                    malloc(seg->size * 2 * sizeof(wchar))) == NULL)
+                Xsj3cError("Cannot allocate for mode conversion buffer");
+            _Xsj3cwPStomPS(buf, mbs, seg->yomi);
+            if ((ret = Xsj3cModeConv(buf, mbs, mode, seg->size))
+                    & KEY_TEXT_CHANGE) {
+                seg->num = _Xsj3cmPStowPSn(buf, seg->yomi, mbs, seg->size);
+                if (seg->num > seg->size - YBUFSIZ) {
+                    Xsj3cResizeSegment(seg, seg->size * 2);
+                    seg->num = _Xsj3cmPStowPS(buf, seg->yomi, mbs);
+                }
+                seg->cur = seg->num;
+                _Xsj3cStoreYomi(buf, seg, 0);
+                seg->change = OFF;
+                seg->cursegmode = mode;
+            }
+            free(mbs);
+        } else {
+            if (buf->inputmode != mode) {
+                buf->dispmode = buf->inputmode = mode;
+                return (_Xsj3cModeClear(buf));
+            } else {
+#ifdef THROUGH_CONT
+                return (KEY_NULL);
+#else /* THROUGH_CONT */
+                if (buf->cntrlsame)
+                    return (KEY_NULL);
+                else
+                    return (KEY_TEXT_CHANGE); /* dummy  */
+#endif /* THROUGH_CONT */
+            }
+        }
+        return ret;
+    } else {
+        return (KEY_BELL);
+    }
+}
+
+/*
+ * _Xsj3cModeClear() 
+ *  Clear romaji/kana buffer after changing mode.
+ */
+Xsj3cEvent
+_Xsj3cModeClear(buf)
+    Xsj3cBuf            buf;
+{
+    register Xsj3cSeg   seg = buf->input[buf->curseg];
+
+    if (!seg)
+        return (KEY_MODE_CHANGE);
+    *seg->str = '\0';
+    seg->sp = seg->str;
+    seg->n_roma = 0;
+    seg->n_kana = -1;
+    *seg->oldstr = '\0';
+    seg->oldlen = 0;
+    seg->value = 0;
+    seg->change = OFF;
+    seg->cursegmode = MODE_HIRA;
+    if (buf->flushaconv)
+        return (KEY_MODE_CHANGE|KEY_TEXT_CLEAR);
+    else
+        return (KEY_MODE_CHANGE);
+}
+
+/*
+ * Xsj3cModeConv()
+ *  Convert current segment to appointed character mode.
+ */
+Xsj3cEvent
+Xsj3cModeConv(buf, string, postmode, size)
+    Xsj3cBuf        buf;
+    unsigned char  *string;
+    Xsj3csMode      postmode;
+    int             size;
+{
+    Xsj3cEvent      ret = KEY_NULL;
+    unsigned char   *tmp1,   *tmp2;
+
+    if ((tmp1 = (unsigned char *)malloc(size * 2 * sizeof(wchar))) == NULL)
+        Xsj3cError("Cannot allocate for mode conversion buffer");
+    if ((tmp2 = (unsigned char *)malloc(size * 2 * sizeof(wchar))) == NULL)
+        Xsj3cError("Cannot allocate for mode conversion buffer");
+
+    switch (postmode) {
+    case MODE_HIRA:
+        _Xsj3cZKanaToHKata(buf, tmp2, string);
+        _Xsj3cHKataToHira(buf, tmp1, tmp2);
+        _Xsj3cKRConvs(buf, tmp2, tmp1);
+        _Xsj3cRKConvs(buf, tmp1, tmp2);
+        if (buf->alphaconv)
+            _Xsj3cHankakuToHira(buf, string, tmp1);
+        else
+            _Xsj3cZKataToHira(buf, string, tmp1);
+        ret = KEY_TEXT_CHANGE;
+        break;
+
+    case MODE_ZKATA:
+        _Xsj3cZKanaToHKata(buf, tmp2, string);
+        _Xsj3cHKataToHira(buf, tmp1, tmp2);
+        _Xsj3cKRConvs(buf, tmp2, tmp1);
+        _Xsj3cRKConvs(buf, tmp1, tmp2);
+        if (buf->alphaconv) {
+            _Xsj3cHiraToZKata(buf, tmp2, tmp1);
+            _Xsj3cHAlphaToZAlpha(buf, string, tmp2);
+        } else
+            _Xsj3cHiraToZKata(buf, string, tmp1);
+        ret = KEY_TEXT_CHANGE;
+        break;
+
+    case MODE_HKATA:
+        _Xsj3cHKataToHira(buf, tmp1, string);
+        _Xsj3cKRConvs(buf, tmp2, tmp1);
+        _Xsj3cRKConvs(buf, tmp1, tmp2);
+        _Xsj3cZKanaToHKata(buf, string, tmp1);
+        ret = KEY_TEXT_CHANGE;
+        break;
+
+    case MODE_HALPHA:
+        _Xsj3cZAlphaToHAlpha(buf, tmp2, string);
+        _Xsj3cRKConvs(buf, tmp1, tmp2);
+        _Xsj3cZKanaToHKata(buf, tmp2, tmp1);
+        _Xsj3cHKataToHira(buf, tmp1, tmp2);
+        _Xsj3cKRConvs(buf, string, tmp1);
+        ret = KEY_TEXT_CHANGE;
+        break;
+
+    case MODE_ZALPHA:
+        _Xsj3cZAlphaToHAlpha(buf, tmp2, string);
+        _Xsj3cRKConvs(buf, tmp1, tmp2);
+        _Xsj3cZKanaToHKata(buf, tmp2, tmp1);
+        _Xsj3cHKataToHira(buf, tmp1, tmp2);
+        _Xsj3cKRConvs(buf, tmp2, tmp1);
+        _Xsj3cHAlphaToZAlpha(buf, string, tmp2);
+        ret = KEY_TEXT_CHANGE;
+        break;
+
+    case MODE_HANKAKU:
+        _Xsj3cZKanaToHKata(buf, tmp1, string);
+        strcpy(string, tmp1);
+        ret = KEY_TEXT_CHANGE;
+        break;
+
+    case MODE_ZENKAKU:
+        _Xsj3cHankakuToZKata(buf, tmp1, string);
+        strcpy(string, tmp1);
+        ret = KEY_TEXT_CHANGE;
+        break;
+
+    case MODE_UPPER:
+        _Xsj3cLowerToUpper(buf, string);
+        ret = KEY_TEXT_CHANGE;
+        break;
+
+    case MODE_LOWER:
+        _Xsj3cUpperToLower(buf, string);
+        ret = KEY_TEXT_CHANGE;
+        break;
+
+    default:
+        ret = KEY_BELL;
+        break;
+    }
+    free(tmp1);
+    free(tmp2);
+    return (ret);
+}
+
+/*
+ * _Xsj3cRKConvs()
+ *  Convert romaji to kana in 3rd argument and set to 2nd argument.
+ */
+static void
+_Xsj3cRKConvs(buf, yomi, alpha)
+    Xsj3cBuf                buf;
+    unsigned char          *yomi;
+    unsigned char          *alpha;
+{
+    unsigned char          *p;
+    register unsigned char *q,     *yp,     *t;
+    register int            i = 0,  rlen = 0,       tflg = 0,   value;
+    unsigned char           rbuf[RBUFSIZ];      
+    unsigned char           ybuf[YBUFSIZ];  
+    
+    yp = yomi;
+    p = rbuf;
+    rlen = 0;
+
+    while (*alpha != '\0') {
+        if (iskan1(*alpha, serverIF[buf->server].lang)
+                && iskan2(*(alpha + 1), serverIF[buf->server].lang)) {
+            *yp++ = *alpha++;
+            *yp++ = *alpha++;
+            i++;
+            continue;
+        } else if (!isascii(*alpha)) {
+            *yp++ = *alpha++;
+            i++;
+            continue;
+        }
+        if (i) {
+            rlen = 0;
+            p = rbuf;
+            i = 0;
+        } 
+
+        *p = *alpha++;
+        *(p + 1) = '\0';
+        if (*alpha == '\0') {
+            t = buf->rkdouble;
+            while (*t != '\0') {
+                if (p > rbuf && *(p - 1) == *t) {
+                    break;
+                } else if (*t == *p) {
+                    *(p + 1) = *p;
+                    *(p + 2) = '\0';
+                    tflg++;
+                    break;
+                }
+                t++;
+            }
+        }
+        if ((value = _Xsj3cRomaConv(buf->rktable, rbuf, ybuf)) > 0) {
+            q = ybuf;
+            yp -= rlen;
+            while (*q != '\0') {
+                *yp++ = *q++;
+            }
+            p = rbuf;
+            rlen = 0;
+            while (*p != '\0' && !tflg) {
+                *yp++ = *p++;
+                rlen++;
+            }
+        } else if (value < 0) {
+            if ((value = _Xsj3cRomaConv(buf->rktable, p, ybuf)) > 0) {
+                q = ybuf;
+                while (*q != '\0') {
+                    *yp++ = *q++;
+                }
+                rlen = 0;
+                while (*p != '\0' && !tflg) {
+                    *yp++ = *p++;
+                    rlen++;
+                }
+            } else if (value < 0) {
+                *yp++ = *p;
+                rlen = 0;
+                p = rbuf;
+            } else {
+                *yp++ = *p;
+                q = rbuf;
+                *q++ = *p++;
+                *q = '\0';
+                rlen = 1;
+            }
+        } else {
+            *yp++ = *p++;
+            if (rlen++ > 3) { /* non-convert limit = 4: you can change this */
+                rlen = 0;
+                p = rbuf;
+            }
+        }
+    }
+    *yp = '\0';
+}
+
+static void
+_Xsj3cKRConvs(buf, roma, kana)
+    Xsj3cBuf                buf;
+    register unsigned char *roma;
+    register unsigned char *kana;
+{
+    register unsigned char  c,  *p, *q, *r, *sp, *t, *d;
+    register wchar          s;
+    register Xsj3cRKTable  *rktp;
+    register Xsj3cHKTable  *hktp;
+    register Xsj3cZHTable  *zhtp;
+    register int            ylen,   plen,   rlen,   i,  cont = 0;
+    register int            zenflg = 0, plosflg = 0;
+    unsigned char           tyomi[KANABUFSIZ];
+    unsigned char           tmp[RBUFSIZ];
+
+    p = tyomi;
+    while ((c = *kana++) != '\0') {
+        if (iskan1(c, serverIF[buf->server].lang)
+                && iskan2(*kana, serverIF[buf->server].lang)) {
+            s = (c << 8) + *kana;
+            if (iskata(s, serverIF[buf->server].lang)) {
+                for (hktp = buf->hktable; hktp != NULL; hktp = hktp->next) {
+                    if (c == *hktp->zkata)
+                        if (*kana == *(hktp->zkata + 1))
+                            break;
+                }
+                if (hktp != NULL) {
+                    *p++ = *hktp->hira;
+                    *p++ = *(hktp->hira + 1);
+                } else {
+                    *p++ = c;
+                    *p++ = *kana;
+                    Xsj3cWarning("wrong sjhk table");
+                }
+
+            } else if (!ishira(s, serverIF[buf->server].lang)) {
+                for (zhtp = buf->zhtable; zhtp != NULL; zhtp = zhtp->next) {
+                    if (c == *zhtp->zkana) 
+                        if (*kana == *(zhtp->zkana + 1))
+                            break;
+                }
+                if (zhtp != NULL) {
+                    *p++ = *zhtp->halpha;
+                } else {
+                    for (zhtp = buf->zhtable; zhtp != NULL; zhtp = zhtp->next) {
+                        if (c == *zhtp->zalpha) {
+                            if (*kana == *(zhtp->zalpha + 1))
+                                break;
+                        }
+                    }
+                    if (zhtp != NULL) {
+                        *p++ = *zhtp->halpha;
+                    } else {
+                        Xsj3cWarning("can't convert to halpha %#x",s);
+                        *p++ = c;
+                        *p++ = *kana;
+                    }
+                }
+            } else {
+                *p++ = c;
+                *p++ = *kana;
+            }
+            kana++;
+        } else {
+            *p++ = c;
+        }
+    }
+    *p = '\0';
+    p = tyomi;
+    plen = strlen(tyomi);
+
+    while ((c = *p) != '\0') {
+        if (iskan1(c, serverIF[buf->server].lang)
+                && iskan2(*(p + 1), serverIF[buf->server].lang)) {
+            /* Multi-byte character */
+            q = tmp;
+            *q = '\0';
+            ylen = 0;
+            for (rktp = buf->rktable; rktp->next != NULL; rktp = rktp->next) {
+                if (ylen < rktp->ylen) {
+                    if (plen >= rktp->ylen
+                            && !strncmp(rktp->yomi, p, rktp->ylen)) {
+                        ylen = rktp->ylen;
+                        plosflg = 0;
+                        if (*(sp = rktp->str) != '\0') {
+                            /* Leaving any character case */
+                            if (t = buf->plosive) {
+                                while (*t != '\0') {
+                                    if (*t++ == *sp) {
+                                        plosflg = 1;
+                                        break;
+                                    }
+                                }
+                                if (plosflg) {
+                                    if (*(p + 2) == '\0') {
+                                        /* Last of the segment: */
+                                        /* continue to search   */
+                                        plosflg = 0;
+                                        ylen = 0;
+                                        continue;
+                                    } else if (iskan1(*(p + 2),
+                                            serverIF[buf->server].lang)
+                                            && iskan2(*(p + 3),
+                                            serverIF[buf->server].lang)) {
+                                        /* Next character is zvowel: */
+                                        /* continue to search        */
+                                        if (iszvowel((*(p + 2) << 8) | *(p + 3),
+                                                serverIF[buf->server].lang)){
+                                            plosflg = 0;
+                                            ylen = 0;
+                                            continue;
+                                        }
+                                    } else if (isvowel(*(p + 2))) {
+                                        /* Next character is vowel:  */
+                                        /* continue to search        */
+                                        plosflg = 0;
+                                        ylen = 0;
+                                        continue;
+                                    }
+                                }
+                            }
+                            strcpy(tmp, rktp->roma);
+                            /* Reduce leaved character */
+                            i = 1;
+                            while (*(++sp) != '\0')
+                                i++;
+                            r = (q + rktp->rlen);
+                            while (*(--sp) == *(--r) && (--i));
+                            *r = '\0';  
+                        } else if (d = buf->rkdouble) {
+                            /* Double defined by a same character case */
+                            strcpy(tmp, rktp->roma);
+                            while (*d != '\0') {
+                                if (*d++ == *q) {
+                                    if (*q == *(q + 1)) {
+                                        /* Last of the segment */
+                                        if (*(p + 2) == '\0')
+                                            *(q + 1) = '\0';
+                                    } else if (*(q + 1) == '\0') {
+                                        /* Single case: continue to search */
+                                        ylen = 0;
+                                    }
+                                    break;
+                                }
+                            }
+                        } else {
+                            strcpy(tmp, rktp->roma);
+                        }
+                    }
+                } 
+            }
+            if (ylen > 0) {
+                /* Succeeded in converting.    */
+                if (!zenflg && !plosflg && !isvowel(*q)
+                        && p > tyomi && (t = buf->plosive)) {
+                    /* Same as plosive table first character */
+                    if (*t == *(p - 1))
+                        cont++;
+                }
+                if (plosflg) {
+                    cont++;
+                } else if (cont && !isvowel(*q)) {
+                    /* Correct consonant character of previous plosive */
+                    sp = roma;
+                    while (cont--)
+                        *(--sp) = *q;
+                    cont = 0;
+                } else if (cont) {
+                    cont = 0;
+                }
+                /* Copy characters to output string */
+                plen -= ylen;
+                p += ylen;
+                while (*q != '\0') 
+                    *roma++ = *q++;
+            } else {
+                /* Failed to convert.       */
+                cont = 0;
+                /* Normal japanese character(except gaiji) is 2byte. */
+                *roma++ = *p++;
+                *roma++ = *p++;
+                plen -= 2;
+            }
+            zenflg++;
+        } else {
+            /* Non multi-byte character */
+            sp = p;
+            while (*sp != '\0' && !(iskan1(*sp, serverIF[buf->server].lang)
+                    && iskan2(*(sp + 1), serverIF[buf->server].lang))) {
+                sp++;
+            }
+            ylen = sp - p;
+            i = 0;
+            for (rktp = buf->rktable; rktp->next != NULL; rktp = rktp->next) {
+                if (rktp->rlen > i) {
+                    r = p;
+                    t = rktp->roma;
+                    while (r < sp && *r++ == *t++)
+                        ;
+                    if ((rlen = r - p) > i)
+                        i = rlen;
+                }
+            }
+            if (i > 0) {
+                if (!zenflg && !plosflg && !isvowel(*p) && p > tyomi
+                        && (t = buf->plosive)) {
+                    /* Same as plosive table first character */
+                    if (*t == *(p - 1))
+                        cont++;
+                }
+                if (cont && !isvowel(*p)) {
+                    /* Correct consonant character of previous plosive */
+                    sp = roma;
+                    while (cont--)
+                        *(--sp) = *p;
+                    cont = 0;
+                } else if (cont) {
+                    cont = 0;
+                }
+            } 
+            /* Copy characters to output string */
+            plen -= ylen;
+            while (ylen--)
+                *roma++ = *p++;
+            zenflg = 0;
+            plosflg = 0;
+        }
+    }
+    *roma = '\0';
+
+    if (!zenflg && (r = buf->plosive)) {
+        p--;
+        while (*r != '\0') {
+            if (*r == *p) {
+                t = buf->plosive;
+                while (*t != '\0') {
+                    if (p > tyomi && *t == *p && *t == *(p - 1)) {
+                        cont++;
+                        break;
+                    }
+                    t++;
+                }
+                break;
+            }
+            r++;
+        }
+        if (*r != '\0') {
+            /* Correct consonant character of previous plosive */
+            sp = (--roma);
+            while (cont--)
+                *(--sp) = *p;
+        }
+    } else if (zenflg && cont && plosflg) {
+        q = tmp;
+        if (*q != '\0') {
+            /* Correct consonant character of previous plosive */
+            sp = (--roma);
+            while (cont--) {
+                if (!isvowel(*(--sp)))
+                    *sp = *q;
+            }
+        }
+    }
+}
+
+void
+_Xsj3cHiraToZKata(buf, dest, src)
+    Xsj3cBuf                    buf;
+    register unsigned char     *dest,  *src;
+{
+    register wchar              s;
+    register unsigned char      c;
+    register Xsj3cHKTable      *hktp;
+    register Xsj3cZHTable      *zhtp;
+
+    while ((c = *src++) != '\0') {
+        if (iskan1(c, serverIF[buf->server].lang)
+                && iskan2(*src, serverIF[buf->server].lang)) {
+            s = (c << 8) + *src;
+            if (ishira(s, serverIF[buf->server].lang)) {
+                for (hktp = buf->hktable; hktp != NULL; hktp = hktp->next) {
+                    if (c == *hktp->hira)
+                        if (*src == *(hktp->hira + 1))
+                            break;
+                }
+                if (hktp != NULL) {
+                    *dest++ = *hktp->zkata;
+                    *dest++ = *(hktp->zkata + 1);
+                } else {
+                    *dest++ = c;
+                    *dest++ = *src;
+                    Xsj3cWarning("wrong sjhk table");
+                }
+            } else {
+                *dest++ = c;
+                *dest++ = *src;
+            }
+            src++;
+        } else if (isdakuten(c)) {
+            for (zhtp = buf->zhtable; zhtp != NULL; zhtp = zhtp->next) {
+                if (c == *zhtp->hkata)
+                    break;
+            }
+            if (zhtp != NULL) {
+                *dest++ = *zhtp->zkana;
+                *dest++ = *(zhtp->zkana + 1);
+            } else {
+                *dest++ = c;
+            }
+        } else {
+            *dest++ = c;
+        }
+    }
+    *dest = '\0';
+}
+
+void
+_Xsj3cHankakuToHira(buf, dest, src)
+    Xsj3cBuf                    buf;
+    register unsigned char     *dest,  *src;
+{
+    register unsigned char      c;
+    register Xsj3cHKTable      *hktp;
+    register Xsj3cZHTable      *zhtp;
+    register int                len;
+    unsigned char               tmp[RBUFSIZ];
+
+    while ((c = *src++) != '\0') {
+        if (iskan1(c, serverIF[buf->server].lang)
+                && iskan2(*src, serverIF[buf->server].lang)) {
+            *dest++ = c;
+            *dest++ = *src++;
+            continue;
+        }
+        if (iskana(c)) {
+            len = 0;
+            for (hktp = buf->hktable; hktp != NULL; hktp = hktp->next) {
+                if (len < hktp->hlen && c == *hktp->hkata) {
+                    if (hktp->hlen > 1) {
+                        if (iskana(*src) && *src == *(hktp->hkata + 1)) {
+                            src++;
+                            len = hktp->hlen;
+                            strcpy(tmp, hktp->hira);
+                        }
+                    } else {
+                        len = 1;
+                        strcpy(tmp, hktp->hira);
+                    }
+                }
+            }
+            if (len) {
+                strcpy(dest, tmp);
+                dest += strlen(tmp);
+            } else {
+                for (zhtp = buf->zhtable; zhtp != NULL; zhtp = zhtp->next) {
+                    if (c == *zhtp->hkata)
+                        break;
+                }
+                if (zhtp != NULL) {
+                    *dest++ = *zhtp->zkana;
+                    *dest++ = *(zhtp->zkana + 1);
+                } else {
+                    *dest++ = c;
+                }
+            }
+        } else {
+            for (zhtp = buf->zhtable; zhtp != NULL; zhtp = zhtp->next) {
+                if (c == *zhtp->hkata)
+                    break;
+            }
+            if (zhtp != NULL) {
+                *dest++ = *zhtp->zkana;
+                *dest++ = *(zhtp->zkana + 1);
+            } else {
+                *dest++ = c;
+            }
+        }
+    }
+    *dest = '\0';
+}
+
+void
+_Xsj3cHankakuToZKata(buf, dest, src)
+    Xsj3cBuf                    buf;
+    register unsigned char     *dest,  *src;
+{
+    register unsigned char      c;
+    register Xsj3cHKTable      *hktp;
+    register Xsj3cZHTable      *zhtp;
+    register int                len;
+    unsigned char               tmp[RBUFSIZ];
+
+    while ((c = *src++) != '\0') {
+        if (iskan1(c, serverIF[buf->server].lang)
+                && iskan2(*src, serverIF[buf->server].lang)) {
+            *dest++ = c;
+            *dest++ = *src++;
+            continue;
+        }
+        if (iskana(c)) {
+            len = 0;
+            for (hktp = buf->hktable; hktp != NULL; hktp = hktp->next) {
+                if (len < hktp->hlen && c == *hktp->hkata) {
+                    if (hktp->hlen > 1) {
+                        if (iskana(*src) && *src == *(hktp->hkata + 1)) {
+                            src++;
+                            strcpy(tmp, hktp->zkata);
+                            len = hktp->hlen;
+                        }
+                    } else {
+                        strcpy(tmp, hktp->zkata);
+                        len = hktp->hlen;
+                    }
+                }
+            }
+            if (len) {
+                strcpy(dest, tmp);
+                dest += strlen(tmp);
+            } else {
+                for (zhtp = buf->zhtable; zhtp != NULL; zhtp = zhtp->next) {
+                    if (c == *zhtp->hkata)
+                        break;
+                }
+                if (zhtp != NULL) {
+                    *dest++ = *zhtp->zkana;
+                    *dest++ = *(zhtp->zkana + 1);
+                } else {
+                    *dest++ = c;
+                }
+            }
+        } else {
+            for (zhtp = buf->zhtable; zhtp != NULL; zhtp = zhtp->next) {
+                if (c == *zhtp->hkata)
+                    break;
+            }
+            if (zhtp != NULL) {
+                *dest++ = *zhtp->zkana;
+                *dest++ = *(zhtp->zkana + 1);
+            } else {
+                *dest++ = c;
+            }
+        }
+    }
+    *dest = '\0';
+}
+
+void
+_Xsj3cHKataToHira(buf, dest, src)
+    Xsj3cBuf                    buf;
+    register unsigned char     *dest,  *src;
+{
+    register unsigned char      c;
+    register Xsj3cHKTable      *hktp;
+    register Xsj3cZHTable      *zhtp;
+    register int                len;
+    unsigned char               tmp[RBUFSIZ];
+
+    while ((c = *src++) != '\0') {
+        if (iskan1(c, serverIF[buf->server].lang)
+                && iskan2(*src, serverIF[buf->server].lang)) {
+            *dest++ = c;
+            *dest++ = *src++;
+            continue;
+        }
+        if (iskana(c)) {
+            len = 0;
+            for (hktp = buf->hktable; hktp != NULL; hktp = hktp->next) {
+                if (len < hktp->hlen && c == *hktp->hkata) {
+                    if (hktp->hlen > 1) {
+                        if (iskana(*src) && *src == *(hktp->hkata + 1)) {
+                            src++;
+                            len = hktp->hlen;
+                            strcpy(tmp, hktp->hira);
+                        }
+                    } else {
+                        len = 1;
+                        strcpy(tmp, hktp->hira);
+                    }
+                }
+            }
+            if (len) {
+                strcpy(dest, tmp);
+                dest += strlen(tmp);
+            } else {
+                for (zhtp = buf->zhtable; zhtp != NULL; zhtp = zhtp->next) {
+                    if (c == *zhtp->hkata)
+                        break;
+                }
+                if (zhtp != NULL) {
+                    *dest++ = *zhtp->zkana;
+                    *dest++ = *(zhtp->zkana + 1);
+                } else {
+                    *dest++ = c;
+                }
+            }
+        } else {
+            *dest++ = c;
+        }
+    }
+    *dest = '\0';
+}
+
+void
+_Xsj3cHKataToZKata(buf, dest, src)
+    Xsj3cBuf                    buf;
+    register unsigned char     *dest,  *src;
+{
+    register unsigned char      c;
+    register Xsj3cHKTable      *hktp;
+    register Xsj3cZHTable      *zhtp;
+    register int                len;
+    unsigned char               tmp[RBUFSIZ];
+
+    while ((c = *src++) != '\0') {
+        if (iskan1(c, serverIF[buf->server].lang)
+                && iskan2(*src, serverIF[buf->server].lang)) {
+            *dest++ = c;
+            *dest++ = *src++;
+            continue;
+        }
+        if (iskana(c)) {
+            len = 0;
+            for (hktp = buf->hktable; hktp != NULL; hktp = hktp->next) {
+                if (len < hktp->hlen && c == *hktp->hkata) {
+                    if (hktp->hlen > 1) {
+                        if (iskana(*src) && *src == *(hktp->hkata + 1)) {
+                            src++;
+                            strcpy(tmp, hktp->zkata);
+                            len = hktp->hlen;
+                        }
+                    } else {
+                        strcpy(tmp, hktp->zkata);
+                        len = hktp->hlen;
+                    }
+                }
+            }
+            if (len) {
+                strcpy(dest, tmp);
+                dest += strlen(tmp);
+            } else {
+                for (zhtp = buf->zhtable; zhtp != NULL; zhtp = zhtp->next) {
+                    if (c == *zhtp->hkata)
+                        break;
+                }
+                if (zhtp != NULL) {
+                    *dest++ = *zhtp->zkana;
+                    *dest++ = *(zhtp->zkana + 1);
+                } else {
+                    *dest++ = c;
+                }
+            }
+        } else {
+            *dest++ = c;
+        }
+    }
+    *dest = '\0';
+}
+
+
+void
+_Xsj3cZKanaToHKata(buf, dest, src)
+    Xsj3cBuf                    buf;
+    register unsigned char     *dest,  *src;
+{
+    register unsigned char      c;
+    register wchar              s;
+    register Xsj3cHKTable      *hktp;
+    register Xsj3cZHTable      *zhtp;
+
+    while ((c = *src++) != '\0') {
+        if (iskan1(c, serverIF[buf->server].lang)
+                && iskan2(*src, serverIF[buf->server].lang)) {
+            s = (c << 8) + *src;
+            if (ishira(s, serverIF[buf->server].lang)) {
+                for (hktp = buf->hktable; hktp != NULL; hktp = hktp->next) {
+                    if (c == *hktp->hira)
+                        if (*src == *(hktp->hira + 1))
+                            break;
+                }
+                if (hktp != NULL) {
+                    *dest++ = *hktp->hkata;
+                    if (hktp->hlen > 1)
+                        *dest++ = *(hktp->hkata + 1);
+                } else {
+                    *dest++ = c;
+                    *dest++ = *src;
+                    Xsj3cWarning("wrong sjhk table");
+                }
+            } else if (iskata(s, serverIF[buf->server].lang)) {
+                for (hktp = buf->hktable; hktp != NULL; hktp = hktp->next) {
+                    if (c == *hktp->zkata)
+                        if (*src == *(hktp->zkata + 1))
+                            break;
+                }
+                if (hktp != NULL) {
+                    *dest++ = *hktp->hkata;
+                    if (hktp->hlen > 1)
+                        *dest++ = *(hktp->hkata + 1);
+                } else {
+                    *dest++ = c;
+                    *dest++ = *src;
+                    Xsj3cWarning("wrong sjhk table");
+                }
+            } else {
+                for (zhtp = buf->zhtable; zhtp != NULL; zhtp = zhtp->next) {
+                    if (c == *zhtp->zkana)
+                        if (*src == *(zhtp->zkana + 1))
+                            break;
+                }
+                if (zhtp != NULL) {
+                    *dest++ = *zhtp->hkata;
+                } else {
+                    for (zhtp = buf->zhtable; zhtp != NULL; zhtp = zhtp->next) {
+                        if (c == *zhtp->zalpha)
+                            if (*src == *(zhtp->zalpha + 1))
+                                break;
+                    }
+                    if (zhtp != NULL) {
+                        *dest++ = *zhtp->hkata;
+                    } else {
+                        *dest++ = c;
+                        *dest++ = *src;
+                    }
+                }
+            }
+            src++;
+        } else {
+            *dest++ = c;
+        }
+    }
+    *dest = '\0';
+}
+
+void
+_Xsj3cZKataToHira(buf, dest, src)
+    Xsj3cBuf                    buf;
+    register unsigned char     *dest,  *src;
+{
+    register wchar              s;
+    register unsigned char      c;
+    register Xsj3cHKTable      *hktp;
+    register Xsj3cZHTable      *zhtp;
+
+    while ((c = *src++) != '\0') {
+        if (iskan1(c, serverIF[buf->server].lang)
+                && iskan2(*src, serverIF[buf->server].lang)) {
+            s = (c << 8) + *src;
+            if (iskata(s, serverIF[buf->server].lang)) {
+                for (hktp = buf->hktable; hktp != NULL; hktp = hktp->next) {
+                    if (c == *hktp->zkata)
+                        if (*src == *(hktp->zkata + 1))
+                            break;
+                }
+                if (hktp != NULL) {
+                    *dest++ = *hktp->hira;
+                    *dest++ = *(hktp->hira + 1);
+                } else {
+                    *dest++ = c;
+                    *dest++ = *src;
+                    Xsj3cWarning("wrong sjhk table");
+                }
+            } else {
+                *dest++ = c;
+                *dest++ = *src;
+            }
+            src++;
+        } else if (isdakuten(c)) {
+            for (zhtp = buf->zhtable; zhtp != NULL; zhtp = zhtp->next) {
+                if (c == *zhtp->hkata)
+                    break;
+            }
+            if (zhtp != NULL) {
+                *dest++ = *zhtp->zkana;
+                *dest++ = *(zhtp->zkana + 1);
+            } else {
+                *dest++ = c;
+            }
+        } else {
+            *dest++ = c;
+        }
+    }
+    *dest = '\0';
+}
+
+void
+_Xsj3cHAlphaToZAlpha(buf, dest, src)
+    Xsj3cBuf                    buf;
+    register unsigned char     *dest,  *src;
+{
+    register unsigned char      c;
+    register Xsj3cZHTable      *zhtp;
+
+    while ((c = *src++) != '\0') {
+        if (iskan1(c, serverIF[buf->server].lang)
+                && iskan2(*src, serverIF[buf->server].lang)) {
+            *dest++ = c;
+            *dest++ = *src++;
+            continue;
+        }
+        for (zhtp = buf->zhtable; zhtp != NULL; zhtp = zhtp->next) {
+            if (c == *zhtp->halpha)
+                break;
+        }
+        if (zhtp != NULL) {
+            *dest++ = *zhtp->zalpha;
+            *dest++ = *(zhtp->zalpha + 1);
+        } else {
+            *dest++ = c;
+        }
+    }
+    *dest = '\0';
+}
+
+void
+_Xsj3cHAlphaToZKana(buf, dest, src)
+    Xsj3cBuf                    buf;
+    register unsigned char     *dest,  *src;
+{
+    register unsigned char      c;
+    register Xsj3cZHTable      *zhtp;
+
+    while ((c = *src++) != '\0') {
+        if (iskan1(c, serverIF[buf->server].lang)
+                && iskan2(*src, serverIF[buf->server].lang)) {
+            *dest++ = c;
+            *dest++ = *src++;
+            continue;
+        }
+        for (zhtp = buf->zhtable; zhtp != NULL; zhtp = zhtp->next) {
+            if (c == *zhtp->halpha)
+                break;
+        }
+        if (zhtp != NULL) {
+            *dest++ = *zhtp->zkana;
+            *dest++ = *(zhtp->zkana + 1);
+        } else {
+            *dest++ = c;
+        }
+    }
+    *dest = '\0';
+}
+
+void
+_Xsj3cHAlphaToHKata(buf, dest, src)
+    Xsj3cBuf                    buf;
+    register unsigned char     *dest,  *src;
+{
+    register unsigned char      c;
+    register Xsj3cHKTable      *hktp;
+
+    while ((c = *src++) != '\0') {
+        if (iskan1(c, serverIF[buf->server].lang)
+                && iskan2(*src, serverIF[buf->server].lang)) {
+            *dest++ = c;
+            *dest++ = *src++;
+            continue;
+        }
+        for (hktp = buf->hktable; hktp != NULL; hktp = hktp->next) {
+            if (c == *hktp->halpha)
+                break;
+        }
+        if (hktp != NULL) {
+            *dest++ = *hktp->hkata;
+        } else {
+            *dest++ = c;
+        }
+    }
+    *dest = '\0';
+}
+
+void
+_Xsj3cZAlphaToHAlpha(buf, dest, src)
+    Xsj3cBuf                    buf;
+    register unsigned char     *dest,  *src;
+{
+    register unsigned char      c;
+    register Xsj3cZHTable      *zhtp;
+
+    while ((c = *src++) != '\0') {
+        if (iskan1(c, serverIF[buf->server].lang)
+                && iskan2(*src, serverIF[buf->server].lang)) {
+            for (zhtp = buf->zhtable; zhtp != NULL; zhtp = zhtp->next) {
+                if (c == *zhtp->zalpha)
+                    if (*src == *(zhtp->zalpha + 1))
+                        break;
+            }
+            if (zhtp != NULL) {
+                *dest++ = *zhtp->halpha;
+            } else {
+                *dest++ = c;
+                *dest++ = *src;
+            }
+            src++;
+        } else {
+            *dest++ = c;
+        }
+    }
+    *dest = '\0';
+}
+
+static void
+_Xsj3cLowerToUpper(buf, str)
+    Xsj3cBuf                    buf;
+    register unsigned char     *str;
+{
+    register unsigned char      c;
+    register wchar              s;
+
+    while ((c = *str++) != '\0') {
+        if (iskan1(c, serverIF[buf->server].lang)
+                && iskan2(*str, serverIF[buf->server].lang)) {
+            s = (c << 8) + *str;
+            if (iszlower(s, serverIF[buf->server].lang)) {
+                s -= 0x21;
+                *(str - 1) = (s >> 8);
+                *str++ = (s & 0xff);
+            } else {
+                str++;
+            }
+            continue;
+        }
+        if (islower(c)) {
+            *(str - 1) = toupper(c);
+        }
+    }
+}
+
+static void
+_Xsj3cUpperToLower(buf, str)
+    Xsj3cBuf                    buf;
+    register unsigned char     *str;
+{
+    register unsigned char      c;
+    register wchar              s;
+
+    while ((c = *str++) != '\0') {
+        if (iskan1(c, serverIF[buf->server].lang)
+                && iskan2(*str, serverIF[buf->server].lang)) {
+            s = (c << 8) + *str;
+            if (iszupper(s, serverIF[buf->server].lang)) {
+                s += 0x21;
+                *(str - 1) = (s >> 8);
+                *str++ = (s & 0xff);
+            } else {
+                str++;
+            }
+            continue;
+        }
+        if (isupper(c)) {
+            *(str - 1) = tolower(c);
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/Xsj3clib/mode.h	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,38 @@
+/* $Id: mode.h,v 2.0 1992/02/13 18:33:30 nao Exp $ */
+/*
+ * Copyright 1991 Sony Corporation
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Sony not be used in advertising or
+ * publicity pertaining to distribution of the software without specific,
+ * written prior permission.  Sony makes no representations about the
+ * suitability of this software for any purpose.  It is provided "as is"
+ * without express or implied warranty.
+ *
+ * SONY DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL SONY
+ * BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
+ * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN 
+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+/*
+ * Author: Naoshi Suzuki, SONY Corporation.  (nao@sm.sony.co.jp)
+ */
+
+extern Xsj3cEvent           _Xsj3cModeChange();
+extern Xsj3cEvent           _Xsj3cModeClear();
+extern Xsj3cEvent           Xsj3cModeConv();
+
+extern void                 _Xsj3cHiraToZKata();
+extern void                 _Xsj3cHKataToHira();
+extern void                 _Xsj3cHKataToZKata();
+extern void                 _Xsj3cZKanaToHKata();
+extern void                 _Xsj3cZKataToHira();
+extern void                 _Xsj3cHAlphaToZAlpha();
+extern void                 _Xsj3cHAlphaToZKana();
+extern void                 _Xsj3cHAlphaToHKata();
+extern void                 _Xsj3cZAlphaToHAlpha();
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/Xsj3clib/segment.c	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,301 @@
+#ifndef lint
+static char *rcsid = "$Id: segment.c,v 2.0 1992/02/13 18:33:33 nao Exp $";
+#endif
+/*
+ * Copyright 1991 Sony Corporation
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Sony not be used in advertising or
+ * publicity pertaining to distribution of the software without specific,
+ * written prior permission.  Sony makes no representations about the
+ * suitability of this software for any purpose.  It is provided "as is"
+ * without express or implied warranty.
+ *
+ * SONY DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL SONY
+ * BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
+ * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN 
+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+/*
+ * Author: Naoshi Suzuki, SONY Corporation.  (nao@sm.sony.co.jp)
+ */
+
+#include "common.h"
+#include "util.h"
+
+Xsj3cSeg                    Xsj3cCreateSegment();
+void                        Xsj3cFreeSegment();
+void                        Xsj3cResizeSegment();
+void                        Xsj3cClearSegment();
+
+int                         Xsj3cGetSegNum();
+int                         Xsj3cGetPosition();
+wchar                      *Xsj3cGetModeStr();
+wchar                      *Xsj3cGetSeg();
+wchar                      *Xsj3cGetConvertedStr();
+int                         Xsj3cGetConvertedLength();
+
+/*
+ * Xsj3cCreateSegment()
+ *  Allocate Xsj3cSeg type structure and initialize all flags and buffers.
+ */
+Xsj3cSeg
+Xsj3cCreateSegment(buf)
+    Xsj3cBuf    buf;
+{
+    Xsj3cSeg    seg;
+
+    if (!(seg = (Xsj3cSeg)malloc(sizeof(Xsj3cSegRec)))) {
+        return (Xsj3cSeg)NULL;
+    }
+    bzero (seg, sizeof(Xsj3cSegRec));
+    if (!(seg->str = (unsigned char *)malloc(RBUFSIZ))) {
+        return (Xsj3cSeg)NULL;
+    }
+    *seg->str = '\0';
+    seg->sp = seg->str;
+    if (!(seg->oldstr = (unsigned char *)malloc(RBUFSIZ))) {
+        return (Xsj3cSeg)NULL;
+    }
+    *seg->oldstr = '\0';
+    seg->size = 0;
+    seg->yomi = NULL;
+    seg->disp = NULL;
+    Xsj3cResizeSegment(seg, KANABUFSIZ);
+    seg->n_roma = 0;
+    seg->n_kana = -1;
+    seg->value = 0;
+    seg->oldlen = 0;
+    seg->num = 0;
+    seg->cur = 0;
+    seg->status = SEG_NOCONV;
+    seg->cursegmode = buf->inputmode;
+    seg->change = OFF;
+    seg->edit = SEG_NOEDIT;
+    bzero(&seg->dcid, sizeof(seg->dcid));
+    return(seg);
+}
+
+/*
+ * Xsj3cFreeSegment()
+ *  Free Xsj3cSeg type structure.
+ */
+void
+Xsj3cFreeSegment(seg)
+    Xsj3cSeg    seg;
+{
+    if (!seg)
+        return;
+    if (seg->str)
+        free(seg->str);
+    seg->str = NULL;
+    if (seg->oldstr)
+        free(seg->oldstr);
+    seg->oldstr = NULL;
+    if (seg->yomi) {
+        free(seg->yomi);
+        seg->yomi = NULL;
+    }
+    if (seg->disp) {
+        free(seg->disp);
+        seg->disp = NULL;
+    }
+    seg->size = 0;
+    free(seg);
+}
+
+/*
+ * Xsj3cResizeSegment()
+ *  Allocate segment buffers.
+ */
+void
+Xsj3cResizeSegment(seg, size)
+    Xsj3cSeg    seg;
+    int         size;
+{
+    if (seg->size != size) {
+        if (seg->yomi) {
+            if (!(seg->yomi = (wchar *)realloc(seg->yomi,
+                    seg->size * sizeof(wchar)))) {
+                Xsj3cError("Failed to reallocate yomi buffer");
+            }
+        } else {
+            if (!(seg->yomi = (wchar *)calloc(KANABUFSIZ, sizeof(wchar)))) {
+                Xsj3cError("Failed to allocate yomi buffer");
+            }
+        }
+        if (seg->disp) {
+            if (!(seg->disp = (wchar *)realloc(seg->disp,
+                    seg->size * sizeof(wchar)))) {
+                Xsj3cError("Failed to reallocate display buffer");
+            }
+        } else {
+            if (!(seg->disp = (wchar *)calloc(KANABUFSIZ, sizeof(wchar)))) {
+                Xsj3cError("Failed to allocate display buffer");
+            }
+        }
+        seg->size = size;
+    }
+}
+
+/*
+ * Xsj3cClearSegment()
+ *  Clear segment.
+ */
+void
+Xsj3cClearSegment(buf, seg)
+    Xsj3cBuf    buf;
+    Xsj3cSeg    seg;
+{
+    *seg->str = '\0';
+    seg->sp = seg->str;
+    *seg->oldstr = '\0';
+    seg->oldlen = 0;
+    Xsj3cResizeSegment(seg, KANABUFSIZ);
+    *seg->yomi = '\0';
+    *seg->disp = '\0';
+    seg->cur = 0;
+    seg->num = 0;
+    seg->value = 0;
+    seg->n_roma = 0;
+    seg->n_kana = -1;
+    seg->dnum = 0;
+    seg->status = SEG_NOCONV;
+    seg->cursegmode = buf->inputmode;
+    seg->change = OFF;
+    seg->edit = SEG_NOEDIT;
+    bzero(&seg->dcid, sizeof(seg->dcid));
+}
+
+/*
+ * Xsj3cGetModeStr()
+ *  Return the strings of current mode guide.
+ */
+wchar *
+Xsj3cGetModeStr(buf, len)
+    Xsj3cBuf    buf;
+    int        *len;
+{
+    *len = buf->modelen[buf->dispmode];
+    return(buf->modestr[buf->dispmode]);
+}
+
+#define CURSOR_VISIBLE      1
+#define CURSOR_UNVISIBLE    0
+
+/*
+ * Xsj3cGetPosition()
+ *  Set current segment number to 2nd argument
+ * and cursor position to 3rd argument.
+ */
+int
+Xsj3cGetPosition(buf, curseg, pos)
+    Xsj3cBuf    buf;
+    int        *curseg;
+    int        *pos;
+{
+    if (buf->curseg < buf->segnum) {
+        *curseg = buf->curseg;
+        *pos = buf->input[buf->curseg]->cur;
+        if (buf->input[buf->curseg]->status & SEG_CONVED)
+            return CURSOR_UNVISIBLE;
+        else
+            return CURSOR_VISIBLE;
+    } else if (buf->curseg > 0) {
+        *curseg = buf->curseg - 1;
+        *pos = buf->input[buf->curseg - 1]->dnum;
+        return CURSOR_VISIBLE;
+    } else {
+        *curseg = 0;
+        *pos = 0;
+        return CURSOR_UNVISIBLE;
+    }
+}
+
+/*
+ * Xsj3cGetSegNum()
+ *  Return the number of segments.
+ */
+int
+Xsj3cGetSegNum(buf)
+    Xsj3cBuf  buf;
+{
+    return(buf->segnum);
+}
+
+/*
+ * Xsj3cGetSeg()
+ *  Return the appointed segment in buffers.
+ */
+wchar *
+Xsj3cGetSeg(buf, n, len, attr)
+    Xsj3cBuf    buf;
+    int         n;
+    int        *len;
+    int        *attr;
+{
+    if (buf->convmode & DictModeMask) {
+        if (n >= buf->curseg && n <= buf->curseg + buf->dict->n_dict)
+            *attr = SEG_REVERSED;
+        else if (buf->convedunderline)
+            *attr = SEG_UNDER_LINE;
+        else
+            *attr = SEG_NORMAL;
+    } else {
+        if (n == buf->curseg) {
+            if (SEG_NOEDIT & buf->input[n]->edit) {
+                *attr = SEG_REVERSED;
+            } else {
+                *attr = SEG_UNDER_LINE;
+            }
+        } else {
+            if (buf->input[n]->status & SEG_NOCONV || buf->convedunderline) {
+                *attr = SEG_UNDER_LINE;
+            } else {
+                *attr = SEG_NORMAL;
+            }
+        }
+    }
+    *len = buf->input[n]->dnum;
+    return (buf->input[n]->disp);
+}
+
+/*
+ * Xsj3cGetConvertedStr()
+ *  Set converted strings in buffer.
+ */
+wchar *
+Xsj3cGetConvertedStr(buf, data)
+    Xsj3cBuf                buf;
+    wchar                  *data;
+{
+    register int            i;
+
+    _Xsj3cFlushDcid(buf);
+    if (buf->candidate) 
+        Xsj3cEndCandidate(buf, ON);
+    *data = '\0';
+    for (i = 0; i < buf->segnum ; i++)
+        _Xsj3cWcat(data, buf->input[i]->disp);
+    return (data);
+}
+
+/*
+ * Xsj3cGetConvertedLength()
+ *  Return length of converted strings.
+ */
+int
+Xsj3cGetConvertedLength(buf)
+    Xsj3cBuf                buf;
+{
+    register int            i,  len;
+
+    for (i = 0, len = 0; i < buf->segnum ; i++)
+        len += buf->input[i]->dnum;
+    return len;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/Xsj3clib/segment.h	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,29 @@
+/* $Id: segment.h,v 2.0 1992/02/13 18:33:35 nao Exp $ */
+/*
+ * Copyright 1991 Sony Corporation
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Sony not be used in advertising or
+ * publicity pertaining to distribution of the software without specific,
+ * written prior permission.  Sony makes no representations about the
+ * suitability of this software for any purpose.  It is provided "as is"
+ * without express or implied warranty.
+ *
+ * SONY DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL SONY
+ * BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
+ * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN 
+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+/*
+ * Author: Naoshi Suzuki, SONY Corporation.  (nao@sm.sony.co.jp)
+ */
+
+extern Xsj3cSeg             Xsj3cCreateSegment();
+extern void                 Xsj3cFreeSegment();
+extern void                 Xsj3cResizeSegment();
+extern void                 Xsj3cClearSegment();
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/Xsj3clib/sj3ctype.c	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,82 @@
+#ifndef lint
+static char *rcsid = "$Id: sj3ctype.c,v 2.2 1993/01/21 10:54:39 nao Exp $";
+#endif
+/*
+ * Copyright 1991 Sony Corporation
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Sony not be used in advertising or
+ * publicity pertaining to distribution of the software without specific,
+ * written prior permission.  Sony makes no representations about the
+ * suitability of this software for any purpose.  It is provided "as is"
+ * without express or implied warranty.
+ *
+ * SONY DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL SONY
+ * BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
+ * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN 
+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+/*
+ * Author: Naoshi Suzuki, SONY Corporation.  (nao@sm.sony.co.jp)
+ */
+
+#include "common.h"
+
+unsigned char kan1[4][4] = {
+    0x81,   0x9f,   0xe0,   0xfc,
+    0xa1,   0xfe,   0xa1,   0xfe,
+    NULL,   NULL,   NULL,   NULL,
+    NULL,   NULL,   NULL,   NULL
+};
+
+unsigned char kan2[4][4] = {
+    0x40,   0x7e,   0x80,   0xfc,
+    0xa1,   0xfe,   0xa1,   0xfe,
+    NULL,   NULL,   NULL,   NULL,
+    NULL,   NULL,   NULL,   NULL
+};
+
+wchar hira[2][2] = {
+    0x829f, 0x82f1,
+    0xa4a1, 0xa4f3
+};
+
+wchar kata[2][3] = {
+    0x8340, 0x8396, 0x837f,
+    0xa5a1, 0xa5f6, NULL
+};
+
+wchar zalpha[2][2] = {
+    0x8260, 0x829a,
+    0xa3c1, 0xa3fa
+};
+
+wchar zupper[2][2] = {
+    0x8260, 0x8279,
+    0xa3c1, 0xa3da
+};
+
+wchar zlower[2][2] = {
+    0x8281, 0x829a,
+    0xa3e1, 0xa3fa
+};
+
+wchar zplosive[2][2] = {
+    0x82c1, 0x8362,
+    0xa4c3, 0xa5c3
+};
+
+wchar zdakuten[2][2] = {
+    0x814a, 0x814b,
+    0xa1ab, 0xa1ac
+};
+
+wchar zvowel[2][4] = {
+    0x829f, 0x82a8, 0x8340, 0x8349,
+    0xa4a1, 0xa4aa, 0xa5a1, 0xa5aa
+};
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/Xsj3clib/sj3ctype.h	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,109 @@
+/* $Id: sj3ctype.h,v 2.2 1992/10/20 08:50:46 nao Exp $ */
+/*
+ * Copyright 1991 Sony Corporation
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Sony not be used in advertising or
+ * publicity pertaining to distribution of the software without specific,
+ * written prior permission.  Sony makes no representations about the
+ * suitability of this software for any purpose.  It is provided "as is"
+ * without express or implied warranty.
+ *
+ * SONY DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL SONY
+ * BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
+ * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN 
+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+/*
+ * Author: Naoshi Suzuki, SONY Corporation.  (nao@sm.sony.co.jp)
+ */
+
+#ifndef _sj3ctype_h
+#define _sj3ctype_h
+
+extern unsigned char        kan1[4][4];
+extern unsigned char        kan2[4][4];
+extern wchar                hira[2][2];
+extern wchar                kata[2][3];
+extern wchar                zalpha[2][2];
+extern wchar                zupper[2][2];
+extern wchar                zlower[2][2];
+extern wchar                zplosive[2][2];
+extern wchar                zdakuten[2][2];
+extern wchar                zvowel[2][10];
+
+#ifndef iskan1
+#define iskan1(c, l)       ((kan1[l][0]<=(c) && (c)<=kan1[l][1]) \
+                                || (kan1[l][2]<=(c) && (c)<=kan1[l][3]))
+#endif
+#ifndef iskan2
+#define iskan2(c, l)        ((kan2[l][0]<=(c) && (c)<=kan2[l][1]) \
+                                || (kan2[l][2]<=(c) && (c)<=kan2[l][3]))
+#endif
+#ifndef ishira
+#define ishira(c, l)        (hira[l][0]<=(c) && (c)<=hira[l][1])
+#endif
+#ifndef iskata
+#define iskata(c, l)        (kata[l][0]<=(c) && (c)<=kata[l][1]\
+                                && (c)!=kata[l][2])
+#endif
+#ifndef iszalpha
+#define iszalpha(c, l)      (zalpha[l][0]<=(c) && (c)<=zalpha[l][1])
+#endif
+#ifndef iszupper
+#define iszupper(c, l)      (zupper[l][0]<=(c) && (c)<=zupper[l][1])
+#endif
+#ifndef iszlower
+#define iszlower(c, l)      (zlower[l][0]<=(c) && (c)<=zlower[l][1])
+#endif
+#ifndef isplosive
+#define isplosive(c, l)     ((c)==zplosive[l][0] || (c)==zplosive[l][1])
+#endif
+#ifndef iszdakuten
+#define iszdakuten(c, l)    ((c)==zdakuten[l][0] || (c)==zdakuten[l][1])
+#endif
+#ifndef iszvowel
+#define iszvowel(c, l)      ((zvowel[l][0]<=(c) && (c)<=zvowel[l][1]) || \
+                            (zvowel[l][2]<=(c) && (c)<=zvowel[l][3]))
+#endif
+
+#ifndef issjis1
+#define issjis1(x)  ((0x81<=(x) && (x)<=0x9f) || (0xe0<=(x) && (x)<=0xfc))
+#endif
+#ifndef issjis2
+#define issjis2(x)  ((0x40<=(x) && (x)<=0x7e) || (0x80<=(x) && (x)<=0xfc))
+#endif
+#ifdef iskana
+#undef iskana
+#endif
+#define iskana(x)   (0xa1<=(x) && (x)<=0xdf)
+#ifndef iskana2
+#define iskana2(x)  (0xa1<=(x) && (x)<=0xdf)
+#endif
+#ifndef iseuc
+#define iseuc(x)    (0xa1<=(x) && (x)<=0xfe)
+#endif
+#ifndef iseuckana
+#define iseuckana(x)    ((x)==0x8e)
+#endif
+#ifndef isjis
+#define isjis(x)   (0x21<=(x) && (x)<=0x7e)
+#endif
+
+#ifndef isvowel
+#define isvowel(x)  ((x)==0x61 || (x)==0x65 || (x)==0x69 || (x)==0x6f || \
+    (x)==0x75 || (x)==0x41 || (x)==0x45 || (x)==0x49 || (x)==0x4f || (x)==0x55)
+#endif
+#ifndef isdakuten
+#define isdakuten(x)  (0xde<=(x) && (x)<=0xdf)
+#endif
+#ifndef isdakuon
+#define isdakuon(x) (((x)>=0xb6 && (x)<=0xc4) || ((x)>=0xca && (x)<=0xce))
+#endif
+
+#endif /* _sj3ctype_h */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/Xsj3clib/sjrc.c	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,1678 @@
+#ifndef lint
+static char *rcsid = "$Id: sjrc.c,v 2.3 1993/01/06 10:56:56 nao Exp $";
+#endif
+/*
+ * Copyright 1991 Sony Corporation
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Sony not be used in advertising or
+ * publicity pertaining to distribution of the software without specific,
+ * written prior permission.  Sony makes no representations about the
+ * suitability of this software for any purpose.  It is provided "as is"
+ * without express or implied warranty.
+ *
+ * SONY DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL SONY
+ * BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
+ * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN 
+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+/*
+ * Author: Naoshi Suzuki, SONY Corporation.  (nao@sm.sony.co.jp)
+ */
+
+#include <stdio.h>
+#include <ctype.h>
+#include "common.h"
+#include "sj3ctype.h"
+#include "util.h"
+#include "table.h"
+
+void                        Xsj3cRCInit();
+
+static int                  _Xsj3cReadRC();
+
+extern int                  _Xsj3cSetKeyTable();
+static int                  _Xsj3cSetInputMode();
+static int                  _Xsj3cSetPrintMode();
+static int                  _Xsj3cSetDefCode();
+static int                  _Xsj3cSetMuhenkan();
+static int                  _Xsj3cSetMuEdit();
+static int                  _Xsj3cSetMToggle();
+int                         _Xsj3cSetGuide();
+static int                  _Xsj3cSetBStudy();
+static int                  _Xsj3cSetRkeBell();
+static int                  _Xsj3cSetFlushAfterConv();
+static int                  _Xsj3cSetSj3Serv();
+static int                  _Xsj3cSetNormal();
+static int                  _Xsj3cSetThroughNext();
+
+static int                  _Xsj3cSetSj3Serv2();
+static int                  _Xsj3cSetFlushInConv();
+static int                  _Xsj3cSetFlushSelectConv();
+static int                  _Xsj3cSetFlushEndConv();
+static int                  _Xsj3cSetAlphaConv();
+static int                  _Xsj3cSetBackDisplay();
+static int                  _Xsj3cSetSegLast();
+static int                  _Xsj3cSetExpandMConv();
+static int                  _Xsj3cSetShrinkMConv();
+static int                  _Xsj3cSetExpandKConv();
+static int                  _Xsj3cSetShrinkKConv();
+static int                  _Xsj3cSetShrinkAll();
+static int                  _Xsj3cSetConvSeg();
+static int                  _Xsj3cSetUnconvSeg();
+static int                  _Xsj3cSetDelChange();
+static int                  _Xsj3cSetFlushChange();
+static int                  _Xsj3cSetModeConv();
+static int                  _Xsj3cSetMoveLoop();
+static int                  _Xsj3cSetModeBySeg();
+static int                  _Xsj3cSetJumpBySeg();
+static int                  _Xsj3cSetDelBySeg();
+static int                  _Xsj3cSetKillBySeg();
+static int                  _Xsj3cSetMuhenCursorLast();
+static int                  _Xsj3cSetEditCursorLast();
+static int                  _Xsj3cSetFlushCursorLast();
+static int                  _Xsj3cSetUnderLine();
+static int                  _Xsj3cSetDispMChange();
+static int                  _Xsj3cSetDelLastMove();
+static int                  _Xsj3cSetKanaInput();
+static int                  _Xsj3cSetInputSame();
+static int                  _Xsj3cSetCntrlSame();
+static int                  _Xsj3cSetSelectConv();
+static int                  _Xsj3cSetBeforeConv();
+static int                  _Xsj3cSetLastDoubleConv();
+static int                  _Xsj3cSetSelectCount();
+static int                  _Xsj3cSetSelectBackMove();
+static int                  _Xsj3cSetCandidatePad();
+static int                  _Xsj3cSetNextRCFile();
+static int                  _Xsj3cSetIncludeRCFile();
+
+static struct functable {
+    char   *keyword;
+    int     (*func)();
+} funcs[] = {
+    "key",                          _Xsj3cSetKeyTable,
+    "escape",                       _Xsj3cSetKeyTable,
+    "sjxkey",                       _Xsj3cSetKeyTable,
+    "ki2key",                       _Xsj3cSetKeyTable,
+    "initialmode",                  _Xsj3cSetInputMode,
+    "defaultcode",                  _Xsj3cSetDefCode,
+    "muhenkanmode",                 _Xsj3cSetMuhenkan,
+    "muhenkaninedit",               _Xsj3cSetMuEdit,
+    "muhenkantoggle",               _Xsj3cSetMToggle,
+    "guide",                        _Xsj3cSetGuide,
+    "bstudy",                       _Xsj3cSetBStudy,
+    "rkerrbell",                    _Xsj3cSetRkeBell,
+    "flushafterconversion",         _Xsj3cSetFlushAfterConv,
+    "server",                       _Xsj3cSetSj3Serv,
+    "sj3serv",                      _Xsj3cSetSj3Serv,
+    "setnormal",                    _Xsj3cSetNormal,
+    "throughnext",                  _Xsj3cSetThroughNext,
+    "sj3serv2",                     _Xsj3cSetSj3Serv2,
+    "flushinconversion",            _Xsj3cSetFlushInConv,
+    "flushselectconversion",        _Xsj3cSetFlushSelectConv,
+    "flushendconversion",           _Xsj3cSetFlushEndConv,
+    "alphabetconversion",           _Xsj3cSetAlphaConv,
+    "backdisplay",                  _Xsj3cSetBackDisplay,
+    "beginconversionlast",          _Xsj3cSetSegLast,
+    "expandmodeconversion",         _Xsj3cSetExpandMConv,
+    "shrinkmodeconversion",         _Xsj3cSetShrinkMConv,
+    "expandkanjiconversion",        _Xsj3cSetExpandKConv,
+    "shrinkkanjiconversion",        _Xsj3cSetShrinkKConv,
+    "shrinkall",                    _Xsj3cSetShrinkAll,
+    "henkansegment",                _Xsj3cSetConvSeg,
+    "muhenkansegment",              _Xsj3cSetUnconvSeg,
+    "deletechangesegment",          _Xsj3cSetDelChange,
+    "flushchangesegment",           _Xsj3cSetFlushChange,
+    "modeconversion",               _Xsj3cSetModeConv,
+    "moveloop",                     _Xsj3cSetMoveLoop,
+    "movebysegment",                _Xsj3cSetModeBySeg,
+    "jumpbysegment",                _Xsj3cSetJumpBySeg,
+    "deletebysegment",              _Xsj3cSetDelBySeg,
+    "killbysegment",                _Xsj3cSetKillBySeg,
+    "muhenkancursorlast",           _Xsj3cSetMuhenCursorLast,
+    "editkancursorlast",            _Xsj3cSetEditCursorLast,
+    "flushkancursorlast",           _Xsj3cSetFlushCursorLast,
+    "convertedunderline",           _Xsj3cSetUnderLine,
+    "displaymodechange",            _Xsj3cSetDispMChange,
+    "deletelastmove",               _Xsj3cSetDelLastMove,
+    "kanainputonly",                _Xsj3cSetKanaInput,
+    "inputsametime",                _Xsj3cSetInputSame,
+    "controlsametime",              _Xsj3cSetCntrlSame,
+    "printmode",                    _Xsj3cSetPrintMode,
+    "beforeselectconversion",       _Xsj3cSetSelectConv,
+    "beforeconversion",             _Xsj3cSetBeforeConv,
+    "lastdoubleconversion",         _Xsj3cSetLastDoubleConv,
+    "beforeselectcount",            _Xsj3cSetSelectCount,
+    "selectbackspacemove",          _Xsj3cSetSelectBackMove,
+    "candidatepadding",             _Xsj3cSetCandidatePad,
+    "nextrcfile",                   _Xsj3cSetNextRCFile,
+    "include",                      _Xsj3cSetIncludeRCFile,
+    NULL,                           NULL
+};
+
+static int          inc_cnt;
+
+#define END         -1
+#define COMMENT     0
+#define NORMAL      1
+#define BAD         2
+#define OTHERS      3
+#define SERIAL      "nwp511"
+#define SERIAL2     "nwp517"
+#define SERIAL3     "nwp-511"
+
+/*
+ * Xsj3cRCInit()
+ *  Decide sjrc file to read, then read it and set resources.
+ */
+void
+Xsj3cRCInit(buf, sjrc, home)
+    Xsj3cBuf            buf;
+    char               *sjrc;
+    char               *home;
+{
+    extern char        *getenv();
+    register char      *p;
+    SjrcRec             rctable;
+    struct functable   *functp;
+    FILE               *fp;
+    register int        line;
+    int                 status;
+
+    if (!buf->rcfile) {
+        if ((buf->rcfile = (char *)malloc(BUFSIZ)) == NULL)
+            Xsj3cError("Can't allocate sjrc file");
+        *buf->rcfile = '\0';
+
+        /*  Get sjrc file and open */
+        if (sjrc) {
+            if ((fp = fopen(sjrc, "r")) == NULL)
+                Xsj3cError("can't open sjrc file %s", sjrc);
+            strcpy(buf->rcfile, sjrc);
+        } else {
+            if ((p = getenv("SJRC")) && *p != '\0') {
+                if (*p != '/') {
+                    if (home)
+                        strcpy(buf->rcfile, home);
+                    strcat(buf->rcfile, "/");
+                }
+                strcat(buf->rcfile, p);
+            } else if (home) {
+                strcpy(buf->rcfile, home);
+                strcat(buf->rcfile, "/.sjrc");
+            } else {
+                strcpy(buf->rcfile, SJ3DEFPATH);
+                strcat(buf->rcfile, DEF_SJRC_FILE);
+            }
+            if ((fp = fopen(buf->rcfile, "r")) == NULL) {
+                strcpy(buf->rcfile, SJ3DEFPATH);
+                strcat(buf->rcfile, DEF_SJRC_FILE);
+                if ((fp = fopen(buf->rcfile, "r")) == NULL) {
+                    Xsj3cError("can't open sjrc file %s", buf->rcfile);
+                }
+            }
+        }
+    } else {
+        if ((fp = fopen(buf->rcfile, "r")) == NULL) {
+            Xsj3cWarning("can't open sjrc file %s", buf->rcfile);
+            return;
+        }
+    }
+
+    /*  Read sjrc file and set buffer fields    */
+    inc_cnt = 0;
+    for (line = 0; (status = 
+            _Xsj3cReadRC(fp, &rctable)) != END; line++)  {
+        functp = funcs;
+        if (status == NORMAL) {
+            while (functp->keyword != NULL) {
+                if (_Xsj3cCmp(rctable.key[0], functp->keyword)) {
+                    if (!(*(functp->func))(buf, &rctable))
+                        Xsj3cWarning("wrong format in sjrc file. %s:%d",
+                                buf->rcfile, line + 1);
+                    break;
+                }
+                functp++;
+            }
+        } else if (status == COMMENT || status == OTHERS) {
+            continue;
+        } else {
+            Xsj3cWarning("bad line in sjrc file. %s:%d", buf->rcfile, line);
+            continue;
+        }
+    }
+    fclose(fp);
+}
+
+/*
+ * _Xsj3cReadRC()
+ *  Read sjrc file. (Non memory copy version)
+ */
+static int
+_Xsj3cReadRC(fp, rctable)
+    FILE               *fp;
+    Sjrctable           rctable;
+{
+    static unsigned char        buf[256];
+    register int                i,  j,  k,  end,    byte2 = 0,  kana = 0;
+
+    if ((fgets (buf, sizeof(buf), fp)) == NULL) 
+        return END;
+    
+    if (buf[0] == '\n' || buf[0] == '#' || buf[0] == '\0' )
+        return COMMENT;
+
+    for (i = 0, k = 0, end = 0; buf[i] !=  ' ' && buf[i] != '\t' && 
+        buf[i] != '#' && buf[i] != '\n';) {
+        for (j = i; buf[i] != ' ' && buf[i] != '\t'
+                && buf[i] != '#' && buf[i] != '\n' && buf[i] != '.'; i++);
+        if (j == i && buf[i] == '.' ) {
+            i++;
+            continue;
+        }
+        if (buf[i] == '#' || buf[i] == '\n' )
+            return BAD;
+        if (buf[i] == '\t' || buf[i] == ' ' )
+            end++;
+        buf[i++] = '\0';
+        if (!strcmp(&buf[j],SERIAL) || !strcmp(&buf[j],SERIAL2)
+            || !strcmp(&buf[j],SERIAL3))
+            return OTHERS;
+        rctable->key[k++] =  &buf[j];
+        if (end)
+            break;
+    }
+    if ( k < 1) 
+        return BAD;
+    for (; k < 2;)
+        rctable->key[k++] = NULL;
+    while(buf[i] == ' ' || buf[i] == '\t') i++;
+    if (in_lang == JP_SJIS || in_lang == JP_EUC) {
+        for (k = 0, end = 0; buf[i] != '\n';) {
+            for (j = i; buf[i] != '\n' ; i+=2) {
+                if (iskan1(buf[i], in_lang)) {
+                    if (iskan2(buf[i + 1], in_lang))
+                        continue;
+                    else if (buf[i + 1] == '#' || buf[i + 1] == ' '
+                            || buf[i + 1] == '\t'|| buf[i + 1] == '\n') {
+                        i++;
+                        break;
+                    } else
+                        continue;
+                } else if (buf[i] == '#' || buf[i] == ' ' || buf[i] == '\t') {
+                    break;
+                } else if (buf[i] == '.') {
+                    if (i > 0 && buf[i - 1] == '\\') {
+                        continue;
+                    } else
+                        break;
+                } else if (buf[i + 1] == '#' || buf[i + 1] == ' '
+                        || buf[i + 1] == '\t' || buf[i + 1] == '\n') {
+                    i++;
+                    break;
+                } else if (buf[i + 1] == '.') {
+                    if (buf[i] == '\\') {
+                        continue;
+                    } else {
+                        i++;
+                        break;
+                    }
+                } else 
+                    continue;
+            }
+            if (buf[i] == '#' || buf[i] == '\n' )
+                end++;
+            buf[i++] = '\0';
+            rctable->value[k++] = &buf[j];
+            if (end)
+                break;
+            while(buf[i] == ' ' || buf[i] == '\t') i++;
+        }
+    } else {
+        for (k = 0, end = 0; buf[i] != '\n';) {
+            for (j = i; buf[i] != '\n'; i++) {
+                if (buf[i] == ESC) {
+                    if (buf[i + 1] == '#' || buf[i + 1] == ' ' ||
+                            buf[i + 1] == '\t'|| buf[i + 1] == '.' ||
+                            buf[i + 1] == '\n') {
+                        i++;
+                        break;
+                    } else if (byte2)
+                        byte2 = 0;
+                    else
+                        byte2++;
+                    i += 2;
+                    continue;
+                } else if (buf[i] == SO || buf[i] == SI) {
+                    if (buf[i + 1] == '#' || buf[i + 1] == ' ' ||
+                            buf[i + 1] == '\t'|| buf[i + 1] == '.' ||
+                            buf[i + 1] == '\n') {
+                        i++;
+                        break;
+                    } else if (buf[i] == SI)
+                        kana = 0;
+                    else
+                        kana++;
+                    continue;
+                } else if (byte2 || kana)
+                    continue;
+                if (buf[i] == '#' || buf[i] == ' ' || buf[i] == '\t') {
+                    break;
+                } else if (buf[i] == '.') {
+                    if (i > 0 && buf[i - 1] == '\\') {
+                        continue;
+                    } else
+                        break;
+                } else 
+                    continue;
+            }
+            if (buf[i] == '#' || buf[i] == '\n' )
+                end++;
+            buf[i++] = '\0';
+            rctable->value[k++] = &buf[j];
+            if (end)
+                break;
+            while(buf[i] == ' ' || buf[i] == '\t') i++;
+        }
+    }
+    if ( k < 1) 
+        return BAD;
+    for (; k < 10;)
+        rctable->value[k++] = NULL;
+    return NORMAL;
+}
+
+/*
+ * _Xsj3cSetInputMode()
+ *  Set a parameter by .initialmode entry.
+ */
+static int
+_Xsj3cSetInputMode(buf, table)
+    Xsj3cBuf            buf;
+    Sjrctable           table;
+{
+    register int    i,  j;
+
+    for (i = 0, j = 0; i < MODE_INROT_NUM; i++, j++) {
+        if (table->value[j]) {
+            if (_Xsj3cCmp(table->value[j], "hiragana")) {
+                buf->inmoderot[i] = MODE_HIRA;
+            } else if (_Xsj3cCmp(table->value[j], "zkatakana")) {
+                buf->inmoderot[i] = MODE_ZKATA;
+            } else if (_Xsj3cCmp(table->value[j], "hkatakana")) {
+                buf->inmoderot[i] = MODE_HKATA;
+            } else if (_Xsj3cCmp(table->value[j], "halpha")) {
+                buf->inmoderot[i] = MODE_HALPHA;
+            } else if (_Xsj3cCmp(table->value[j], "zalpha")) {
+                buf->inmoderot[i] = MODE_ZALPHA;
+            } else if (_Xsj3cCmp(table->value[j], "jis")) {
+                buf->inmoderot[i] = MODE_JIS;
+            } else if (_Xsj3cCmp(table->value[j], "sjis")) {
+                buf->inmoderot[i] = MODE_SJIS;
+            } else if (_Xsj3cCmp(table->value[j], "kuten")) {
+                buf->inmoderot[i] = MODE_KUTEN;
+            } else if (_Xsj3cCmp(table->value[j], "euc")) {
+                buf->inmoderot[i] = MODE_EUC;
+            } else {
+                if (!_Xsj3cCmp(table->value[j], "unbuff") 
+                        && !_Xsj3cCmp(table->value[j], "buffer")
+                        && !_Xsj3cCmp(table->value[j], "unbuffer")
+                        && !_Xsj3cCmp(table->value[j], "direct"))
+                    Xsj3cWarning("Unknown input mode \"%s\"",table->value[j]);
+                i--;
+                continue;
+            }
+        } else {
+            break;
+        }
+    }
+    if ((buf->inmoderotnum = i) > 0)
+        return 1;
+    else
+        return 0;
+}
+
+/*
+ * _Xsj3cSetPrintMode()
+ *  Set a parameter by .PrintMode entry.
+ */
+static int
+_Xsj3cSetPrintMode(buf, table)
+    Xsj3cBuf            buf;
+    Sjrctable           table;
+{
+    register int    i,  j;
+
+    for (i = 0, j = 0; i < MODE_OUTROT_NUM; i++, j++) {
+        if (table->value[j]) {
+            if (_Xsj3cCmp(table->value[j], "hiragana")) {
+                buf->outmoderot[i] = MODE_HIRA;
+            } else if (_Xsj3cCmp(table->value[j], "zkatakana")) {
+                buf->outmoderot[i] = MODE_ZKATA;
+            } else if (_Xsj3cCmp(table->value[j], "hkatakana")) {
+                buf->outmoderot[i] = MODE_HKATA;
+            } else if (_Xsj3cCmp(table->value[j], "halpha")) {
+                buf->outmoderot[i] = MODE_HALPHA;
+            } else if (_Xsj3cCmp(table->value[j], "zalpha")) {
+                buf->outmoderot[i] = MODE_ZALPHA;
+            } else if (_Xsj3cCmp(table->value[j], "hankaku")) {
+                buf->outmoderot[i] = MODE_HANKAKU;
+            } else if (_Xsj3cCmp(table->value[j], "zenkaku")) {
+                buf->outmoderot[i] = MODE_ZENKAKU;
+            } else if (_Xsj3cCmp(table->value[j], "upper")) {
+                buf->outmoderot[i] = MODE_UPPER;
+            } else if (_Xsj3cCmp(table->value[j], "lower")) {
+                buf->outmoderot[i] = MODE_LOWER;
+            } else {
+                    Xsj3cWarning("Unknown print mode \"%s\"",table->value[j]);
+                i--;
+                continue;
+            }
+        } else {
+            break;
+        }
+    }
+    if ((buf->outmoderotnum = i) > 0)
+        return 1;
+    else
+        return 0;
+}
+
+/*
+ * _Xsj3cSetDefCode()
+ *  Set a parameter by .defaultcode entry.
+ */
+static int
+_Xsj3cSetDefCode(buf, table)
+    Xsj3cBuf            buf;
+    Sjrctable           table;
+{
+    register int    i;
+
+    for (i = 0; i < MODE_CODE_NUM; i++) {
+        if (table->value[i]) {
+            if (_Xsj3cCmp(table->value[i], "jis")) {
+                buf->defcode[i] = MODE_JIS;
+            } else if (_Xsj3cCmp(table->value[i], "sjis")) {
+                buf->defcode[i] = MODE_SJIS;
+            } else if (_Xsj3cCmp(table->value[i], "kuten")) {
+                buf->defcode[i] = MODE_KUTEN;
+            } else if (_Xsj3cCmp(table->value[i], "euc")) {
+                buf->defcode[i] = MODE_EUC;
+            } else {
+                Xsj3cWarning("Unknown input code");
+                break;
+            }
+        } else {
+            break;
+        }
+    }
+    if ((buf->coderotnum = i) > 0)
+        return 1;
+    else
+        return 0;
+}
+
+/*
+ * _Xsj3cSetMuhenkan()
+ *  Set a parameter by .MuhenkanMode entry.
+ */
+static int
+_Xsj3cSetMuhenkan(buf, table)
+    Xsj3cBuf            buf;
+    Sjrctable           table;
+{
+    if (table->value[0]) {
+        if (_Xsj3cCmp(table->value[0], "hiragana")) {
+            buf->muhenmode = MODE_HIRA;
+        } else if (_Xsj3cCmp(table->value[0], "zkatakana")) {
+            buf->muhenmode = MODE_ZKATA;
+        } else if (_Xsj3cCmp(table->value[0], "hkatakana")) {
+            buf->muhenmode = MODE_HKATA;
+        } else if (_Xsj3cCmp(table->value[0], "halpha")) {
+            buf->muhenmode = MODE_HALPHA;
+        } else if (_Xsj3cCmp(table->value[0], "zalpha")) {
+            buf->muhenmode = MODE_ZALPHA;
+        } else if (_Xsj3cCmp(table->value[0], "jis")) {
+            buf->muhenmode = MODE_JIS;
+        } else if (_Xsj3cCmp(table->value[0], "sjis")) {
+            buf->muhenmode = MODE_SJIS;
+        } else if (_Xsj3cCmp(table->value[0], "kuten")) {
+            buf->muhenmode = MODE_KUTEN;
+        } else if (_Xsj3cCmp(table->value[0], "euc")) {
+            buf->muhenmode = MODE_EUC;
+        } else {
+            Xsj3cWarning("Invalid muhenkan mode \"%s\"",table->value[0]);
+        }
+    }
+    return 1;
+}
+
+/*
+ * _Xsj3cSetMuEdit()
+ *  Set a parameter by .MuhenkanInEdit entry.
+ */
+static int
+_Xsj3cSetMuEdit(buf, table)
+    Xsj3cBuf            buf;
+    Sjrctable           table;
+{
+    if (table->value[0]) {
+        if (_Xsj3cCmp(table->value[0], "hiragana")) {
+            buf->togglemode = MODE_HIRA;
+        } else if (_Xsj3cCmp(table->value[0], "zkatakana")) {
+            buf->togglemode = MODE_ZKATA;
+        } else if (_Xsj3cCmp(table->value[0], "hkatakana")) {
+            buf->togglemode = MODE_HKATA;
+        } else if (_Xsj3cCmp(table->value[0], "halpha")) {
+            buf->togglemode = MODE_HALPHA;
+        } else if (_Xsj3cCmp(table->value[0], "zalpha")) {
+            buf->togglemode = MODE_ZALPHA;
+        } else if (_Xsj3cCmp(table->value[0], "jis")) {
+            buf->togglemode = MODE_JIS;
+        } else if (_Xsj3cCmp(table->value[0], "sjis")) {
+            buf->togglemode = MODE_SJIS;
+        } else if (_Xsj3cCmp(table->value[0], "kuten")) {
+            buf->togglemode = MODE_KUTEN;
+        } else if (_Xsj3cCmp(table->value[0], "euc")) {
+            buf->togglemode = MODE_EUC;
+        } else {
+            Xsj3cWarning("Unknown toggle mode");
+        }
+    }
+
+    return 1;
+}
+
+/*
+ * _Xsj3cSetMToggle()
+ *  Set a parameter by .MuhenkanToggle entry.
+ */
+static int
+_Xsj3cSetMToggle(buf, table)
+    Xsj3cBuf            buf;
+    Sjrctable           table;
+{
+    if (!table->value[0]) 
+        return 0;
+    if (_Xsj3cCmp(table->value[0],"on"))
+        buf->dotoggle = ON;
+    else
+        buf->dotoggle = OFF;
+    return 1;
+}
+
+/*
+ * _Xsj3cSetGuide()
+ *  Set a parameter by .guide entry.
+ */
+int
+_Xsj3cSetGuide(buf, table)
+    Xsj3cBuf            buf;
+    Sjrctable           table;
+{
+    Xsj3csMode          mode;
+    wchar               data[KANABUFSIZ];
+
+    if (table->key[1] && table->value[0]) {
+        if (_Xsj3cCmp(table->key[1], "hiragana")) {
+            mode = MODE_HIRA;
+        } else if (_Xsj3cCmp(table->key[1], "zkatakana")) {
+            mode = MODE_ZKATA;
+        } else if (_Xsj3cCmp(table->key[1], "hkatakana")) {
+            mode = MODE_HKATA;
+        } else if (_Xsj3cCmp(table->key[1], "halpha")) {
+            mode = MODE_HALPHA;
+        } else if (_Xsj3cCmp(table->key[1], "zalpha")) {
+            mode = MODE_ZALPHA;
+        } else if (_Xsj3cCmp(table->key[1], "jis")) {
+            mode = MODE_JIS;
+        } else if (_Xsj3cCmp(table->key[1], "sjis")) {
+            mode = MODE_SJIS;
+        } else if (_Xsj3cCmp(table->key[1], "kuten")) {
+            mode = MODE_KUTEN;
+        } else if (_Xsj3cCmp(table->key[1], "euc")) {
+            mode = MODE_EUC;
+        } else if (_Xsj3cCmp(table->key[1], "toroku")) {
+            mode = MODE_TOROKU;
+        } else if (_Xsj3cCmp(table->key[1], "register")) {
+            mode = MODE_TOROKU;
+        } else if (_Xsj3cCmp(table->key[1], "syoukyo")) {
+            mode = MODE_SYOUKYO;
+        } else if (_Xsj3cCmp(table->key[1], "eliminate")) {
+            mode = MODE_SYOUKYO;
+        } else if (_Xsj3cCmp(table->key[1], "kanji")) {
+            mode = MODE_KANJI;
+        } else if (_Xsj3cCmp(table->key[1], "edit")) {
+            mode = MODE_EDIT;
+        } else if (_Xsj3cCmp(table->key[1], "candidate")) {
+            mode = MODE_CAND;
+        } else if (_Xsj3cCmp(table->key[1], "symbol")) {
+            mode = MODE_SYMBOL;
+        } else if (_Xsj3cCmp(table->key[1], "hinsi")) {
+            mode = MODE_HINSI;
+        } else if (_Xsj3cCmp(table->key[1], "quote")) {
+            mode = MODE_QUOTE;
+        } else {
+            Xsj3cWarning("Unknown display mode key \"%s\"",table->key[1]);
+            return 0;
+        }
+        _Xsj3cmINtowOUT(buf->rcfile, table->value[0], data,
+                &buf->modelen[mode]);
+        if (!buf->modestr[mode]) {
+            if (!(buf->modestr[mode]
+                = (wchar *)malloc((buf->modelen[mode] + 1) * sizeof(wchar))))
+                Xsj3cError("Cannot allocate for mode string");
+        } else {
+            if (!(buf->modestr[mode] = (wchar *)realloc(buf->modestr[mode],
+                    (buf->modelen[mode] + 1) * sizeof(wchar))))
+                Xsj3cError("Cannot reallocate for mode string");
+        }
+        _Xsj3cWcpy(buf->modestr[mode], data);
+        return 1;
+    } else {
+        return 0;
+    }
+}
+
+/*
+ * _Xsj3cSetBStudy()
+ *  Set a parameter by .bstudy entry.
+ */
+static int
+_Xsj3cSetBStudy(buf, table)
+    Xsj3cBuf            buf;
+    Sjrctable           table;
+{
+    if (!table->value[0]) 
+        return 0;
+    if (_Xsj3cCmp(table->value[0],"on"))
+        buf->gakusyuu = ON;
+    else
+        buf->gakusyuu = OFF;
+    return 1;
+}
+
+/*
+ * _Xsj3cSetFlushAfterConv()
+ *  Set a parameter by .flushafterconversion entry.
+ */
+static int
+_Xsj3cSetFlushAfterConv(buf, table)
+    Xsj3cBuf            buf;
+    Sjrctable           table;
+{
+    if (!table->value[0]) 
+        return 0;
+    if (_Xsj3cCmp(table->value[0],"on"))
+        buf->flushaconv = ON;
+    else
+        buf->flushaconv = OFF;
+    return 1;
+}
+
+/*
+ * _Xsj3cSetFlushInConv()
+ *  Set a parameter by .FlushInConversion entry.
+ */
+static int
+_Xsj3cSetFlushInConv(buf, table)
+    Xsj3cBuf            buf;
+    Sjrctable           table;
+{
+    if (!table->value[0]) 
+        return 0;
+    if (_Xsj3cCmp(table->value[0],"on"))
+        buf->flushiconv = ON;
+    else if (_Xsj3cCmp(table->value[0],"off"))
+        buf->flushiconv = OFF;
+    else if (_Xsj3cCmp(table->value[0],"edit"))
+        buf->flushiconv = EDIT;
+    else
+        buf->flushiconv = NONE;
+    return 1;
+}
+
+/*
+ * _Xsj3cSetFlushSelectConv()
+ *  Set a parameter by .FlushSelectConversion entry.
+ */
+static int
+_Xsj3cSetFlushSelectConv(buf, table)
+    Xsj3cBuf            buf;
+    Sjrctable           table;
+{
+    if (!table->value[0]) 
+        return 0;
+    if (_Xsj3cCmp(table->value[0],"on"))
+        buf->flushsconv = ON;
+    else if (_Xsj3cCmp(table->value[0],"off"))
+        buf->flushsconv = OFF;
+    else if (_Xsj3cCmp(table->value[0],"edit"))
+        buf->flushsconv = EDIT;
+    else
+        buf->flushsconv = NONE;
+    return 1;
+}
+
+/*
+ * _Xsj3cSetFlushEndConv()
+ *  Set a parameter by .FlushEndConversion entry.
+ */
+static int
+_Xsj3cSetFlushEndConv(buf, table)
+    Xsj3cBuf            buf;
+    Sjrctable           table;
+{
+    if (!table->value[0]) 
+        return 0;
+    if (_Xsj3cCmp(table->value[0],"on"))
+        buf->flusheconv = ON;
+    else
+        buf->flusheconv = OFF;
+    return 1;
+}
+
+/*
+ * _Xsj3cSetRkeBell()
+ *  Set a parameter by .rkerrbell entry.
+ */
+static int
+_Xsj3cSetRkeBell(buf, table)
+    Xsj3cBuf            buf;
+    Sjrctable           table;
+{
+    if (!table->value[0]) 
+        return 0;
+    if (_Xsj3cCmp(table->value[0],"on"))
+        buf->rkbell = ON;
+    else
+        buf->rkbell = OFF;
+    return 1;
+}
+
+/*
+ * _Xsj3cSetSj3Serv()
+ *  Set a parameter by .server entry.
+ */
+static int
+_Xsj3cSetSj3Serv(buf, table)
+    Xsj3cBuf            buf;
+    Sjrctable           table;
+{
+    if (table->value[0]) {
+        static char hostname1[32];
+        _Xsj3cReadAscii(buf->rcfile, table->value[0], hostname1);
+        buf->sj3serv = hostname1;
+        return 1;
+    }
+    return 0;
+}
+
+/*
+ * _Xsj3cSetNormal()
+ *  Set a parameter by .SetNormal entry.
+ */
+static int
+_Xsj3cSetNormal(buf, table)
+    Xsj3cBuf            buf;
+    Sjrctable           table;
+{
+    if (table->value[0] && iscntrl(*table->value[0])) {
+        register unsigned char  *c;
+        register int             len;
+        if (buf->setnormal) {
+            c = buf->setnormal;
+            while (*c != '\0') {
+                if (*c == *table->value[0])
+                    return 1;   /* same code */
+                c++;
+            }
+            len = c - buf->setnormal;
+            buf->setnormal = (unsigned char *)realloc(buf->setnormal, len + 2);
+            *(buf->setnormal + len) = *table->value[0];
+            *(buf->setnormal + len + 1) = '\0';
+        } else {
+            buf->setnormal = (unsigned char *)malloc(2);
+            c = buf->setnormal;
+            *c++ = *table->value[0];
+            *c = '\0';
+        }
+        return 1;
+    }
+    return 0;
+}
+
+/*
+ * _Xsj3cSetThroughNext()
+ *  Set a parameter by .ThroughtNext entry.
+ */
+static int
+_Xsj3cSetThroughNext(buf, table)
+    Xsj3cBuf            buf;
+    Sjrctable           table;
+{
+    if (table->value[0] && iscntrl(*table->value[0])) {
+        register unsigned char  *c;
+        int                      len;
+        if (buf->throughnext) {
+            c = buf->throughnext;
+            while (*c != '\0') {
+                if (*c == *table->value[0])
+                    return 1;   /* same code */
+                c++;
+            }
+            len = c - buf->throughnext;
+            buf->throughnext
+                    = (unsigned char *)realloc(buf->throughnext, len + 2);
+            *(buf->throughnext + len) = *table->value[0];
+            *(buf->throughnext + len + 1) = '\0';
+        } else {
+            buf->throughnext = (unsigned char *)malloc(2);
+            c = buf->throughnext;
+            *c++ = *table->value[0];
+            *c = '\0';
+        }
+        return 1;
+    }
+    return 0;
+}
+
+/*
+ * _Xsj3cSetSj3Serv2()
+ *  Set a parameter by .sj3serv2 entry.
+ */
+static int
+_Xsj3cSetSj3Serv2(buf, table)
+    Xsj3cBuf            buf;
+    Sjrctable           table;
+{
+    if (table->value[0]) {
+        static char hostname2[32];
+        _Xsj3cReadAscii(buf->rcfile, table->value[0], hostname2);
+        buf->sj3serv2 = hostname2;
+        return 1;
+    }
+    return 0;
+}
+
+/*
+ * _Xsj3cSetAlphaConv()
+ *  Set a parameter by .AlphabetConversion entry.
+ */
+static int
+_Xsj3cSetAlphaConv(buf, table)
+    Xsj3cBuf            buf;
+    Sjrctable           table;
+{
+    if (!table->value[0]) 
+        return 0;
+    if (_Xsj3cCmp(table->value[0],"on"))
+        buf->alphaconv = ON;
+    else
+        buf->alphaconv = OFF;
+    return 1;
+}
+
+/*
+ * _Xsj3cSetBackDisplay()
+ *  Set a parameter by .BackDisplay entry.
+ */
+static int
+_Xsj3cSetBackDisplay(buf, table)
+    Xsj3cBuf            buf;
+    Sjrctable           table;
+{
+    if (!table->value[0]) 
+        return 0;
+    if (_Xsj3cCmp(table->value[0],"on"))
+        buf->backdisplay = ON;
+    else
+        buf->backdisplay = OFF;
+    return 1;
+}
+
+/*
+ * _Xsj3cSetSegLast()
+ *  Set a parameter by .BeginConversionLast entry.
+ */
+static int
+_Xsj3cSetSegLast(buf, table)
+    Xsj3cBuf            buf;
+    Sjrctable           table;
+{
+    if (!table->value[0]) 
+        return 0;
+    if (_Xsj3cCmp(table->value[0],"on"))
+        buf->beginlastseg = ON;
+    else if (_Xsj3cCmp(table->value[0],"off"))
+        buf->beginlastseg = OFF;
+    else 
+        buf->beginlastseg = NONE;
+    return 1;
+}
+
+/*
+ * _Xsj3cSetShrinkAll()
+ *  Set a parameter by .ShrinkAll entry.
+ */
+static int
+_Xsj3cSetShrinkAll(buf, table)
+    Xsj3cBuf            buf;
+    Sjrctable           table;
+{
+    if (!table->value[0]) 
+        return 0;
+    if (_Xsj3cCmp(table->value[0],"on"))
+        buf->shrinkall = ON;
+    else
+        buf->shrinkall = OFF;
+    return 1;
+}
+
+/*
+ * _Xsj3cSetDelChange()
+ *  Set a parameter by .DeleteChangeSegment entry.
+ */
+static int
+_Xsj3cSetDelChange(buf, table)
+    Xsj3cBuf            buf;
+    Sjrctable           table;
+{
+    if (!table->value[0]) 
+        return 0;
+    if (_Xsj3cCmp(table->value[0],"all"))
+        buf->delchange = ALL;
+    else if (_Xsj3cCmp(table->value[0],"after"))
+        buf->delchange = AFTER;
+    else
+        buf->delchange = ONE;
+    return 1;
+}
+
+/*
+ * _Xsj3cSetFlushChange()
+ *  Set a parameter by .FlushChangeSegment entry.
+ */
+static int
+_Xsj3cSetFlushChange(buf, table)
+    Xsj3cBuf            buf;
+    Sjrctable           table;
+{
+    if (!table->value[0]) 
+        return 0;
+    if (_Xsj3cCmp(table->value[0],"all"))
+        buf->flushchange = ALL;
+    else
+        buf->flushchange = ONE;
+    return 1;
+}
+
+/*
+ * _Xsj3cSetExpandKConv()
+ *  Set a parameter by .ExpandKanjiConversion entry.
+ */
+static int
+_Xsj3cSetExpandKConv(buf, table)
+    Xsj3cBuf            buf;
+    Sjrctable           table;
+{
+    Xsj3cFlag           input, conved;
+
+    if (!(table->value[0] && table->value[1])) 
+        return 0;
+    if (_Xsj3cCmp(table->value[0],"on"))
+        input = ON;
+    else
+        input = OFF;
+    if (_Xsj3cCmp(table->value[1],"on"))
+        conved = ON;
+    else
+        conved = OFF;
+    buf->expandkconv = (conved << 1) + input;
+    return 1;
+}
+
+/*
+ * _Xsj3cSetShrinkKConv()
+ *  Set a parameter by .ShrinkKanjiConversion entry.
+ */
+static int
+_Xsj3cSetShrinkKConv(buf, table)
+    Xsj3cBuf            buf;
+    Sjrctable           table;
+{
+    Xsj3cFlag           input, conved;
+
+    if (!(table->value[0] && table->value[1])) 
+        return 0;
+    if (_Xsj3cCmp(table->value[0],"on"))
+        input = ON;
+    else
+        input = OFF;
+    if (_Xsj3cCmp(table->value[1],"on"))
+        conved = ON;
+    else
+        conved = OFF;
+    buf->shrinkkconv = (conved << 1) + input;
+    return 1;
+}
+
+/*
+ * _Xsj3cSetExpandMConv()
+ *  Set a parameter by .ExpandModeConversion entry.
+ */
+static int
+_Xsj3cSetExpandMConv(buf, table)
+    Xsj3cBuf            buf;
+    Sjrctable           table;
+{
+    Xsj3cFlag           input, conved;
+
+    if (!(table->value[0] && table->value[1])) 
+        return 0;
+    if (_Xsj3cCmp(table->value[0],"on"))
+        input = ON;
+    else
+        input = OFF;
+    if (_Xsj3cCmp(table->value[1],"on"))
+        conved = ON;
+    else
+        conved = OFF;
+    buf->expandmconv = (conved << 1) + input;
+    return 1;
+}
+
+/*
+ * _Xsj3cSetShrinkMConv()
+ *  Set a parameter by .ShrinkModeConversion entry.
+ */
+static int
+_Xsj3cSetShrinkMConv(buf, table)
+    Xsj3cBuf            buf;
+    Sjrctable           table;
+{
+    Xsj3cFlag           input, conved;
+
+    if (!(table->value[0] && table->value[1])) 
+        return 0;
+    if (_Xsj3cCmp(table->value[0],"on"))
+        input = ON;
+    else
+        input = OFF;
+    if (_Xsj3cCmp(table->value[1],"on"))
+        conved = ON;
+    else
+        conved = OFF;
+    buf->shrinkmconv = (conved << 1) + input;
+    return 1;
+}
+
+/*
+ * _Xsj3cSetMoveLoop()
+ *  Set a parameter by .MoveLoop entry.
+ */
+static int
+_Xsj3cSetMoveLoop(buf, table)
+    Xsj3cBuf            buf;
+    Sjrctable           table;
+{
+    if (!table->value[0]) 
+        return 0;
+    if (_Xsj3cCmp(table->value[0],"on"))
+        buf->moveloop = ON;
+    else
+        buf->moveloop = OFF;
+    return 1;
+}
+
+/*
+ * _Xsj3cSetJumpBySeg()
+ *  Set a parameter by .JumpBySegment entry.
+ */
+static int
+_Xsj3cSetJumpBySeg(buf, table)
+    Xsj3cBuf            buf;
+    Sjrctable           table;
+{
+    Xsj3cFlag       input, conved;
+
+    if (!(table->value[0] && table->value[1])) 
+        return 0;
+    if (_Xsj3cCmp(table->value[0],"on"))
+        input = ON;
+    else
+        input = OFF;
+    if (_Xsj3cCmp(table->value[1],"on"))
+        conved = ON;
+    else
+        conved = OFF;
+    buf->jumpbyseg = (conved << 1) + input;
+    return 1;
+}
+
+/*
+ * _Xsj3cSetModeBySeg()
+ *  Set a parameter by .MoveBySegment entry.
+ */
+static int
+_Xsj3cSetModeBySeg(buf, table)
+    Xsj3cBuf            buf;
+    Sjrctable           table;
+{
+    Xsj3cFlag           input, conved;
+
+    if (!(table->value[0] && table->value[1])) 
+        return 0;
+    if (_Xsj3cCmp(table->value[0],"on"))
+        input = ON;
+    else
+        input = OFF;
+    if (_Xsj3cCmp(table->value[1],"on"))
+        conved = ON;
+    else
+        conved = OFF;
+    buf->movebyseg = (conved << 1) + input;
+    return 1;
+}
+
+/*
+ * _Xsj3cSetDelBySeg()
+ *  Set a parameter by .DeleteBySegment entry.
+ */
+static int
+_Xsj3cSetDelBySeg(buf, table)
+    Xsj3cBuf            buf;
+    Sjrctable           table;
+{
+    Xsj3cFlag           input, conved;
+
+    if (!(table->value[0] && table->value[1])) 
+        return 0;
+    if (_Xsj3cCmp(table->value[0],"on"))
+        input = ON;
+    else
+        input = OFF;
+    if (_Xsj3cCmp(table->value[1],"on"))
+        conved = ON;
+    else
+        conved = OFF;
+    buf->delbyseg = (conved << 1) + input;
+    return 1;
+}
+
+/*
+ * _Xsj3cSetKillBySeg()
+ *  Set a parameter by .KillBySegment entry.
+ */
+static int
+_Xsj3cSetKillBySeg(buf, table)
+    Xsj3cBuf            buf;
+    Sjrctable           table;
+{
+    Xsj3cFlag           input, conved;
+
+    if (!(table->value[0] && table->value[1])) 
+        return 0;
+    if (_Xsj3cCmp(table->value[0],"on"))
+        input = ON;
+    else
+        input = OFF;
+    if (_Xsj3cCmp(table->value[1],"on"))
+        conved = ON;
+    else
+        conved = OFF;
+    buf->killbyseg = (conved << 1) + input;
+    return 1;
+}
+
+/*
+ * _Xsj3cSetMuhenCursorLast()
+ *  Set a parameter by .MuhenkanCursorLast entry.
+ */
+static int
+_Xsj3cSetMuhenCursorLast(buf, table)
+    Xsj3cBuf            buf;
+    Sjrctable           table;
+{
+    if (!table->value[0]) 
+        return 0;
+    if (_Xsj3cCmp(table->value[0],"on"))
+        buf->muhencurlast = ON;
+    else
+        buf->muhencurlast = OFF;
+    return 1;
+}
+
+/*
+ * _Xsj3cSetEditCursorLast()
+ *  Set a parameter by .EditCursorLast entry.
+ */
+static int
+_Xsj3cSetEditCursorLast(buf, table)
+    Xsj3cBuf            buf;
+    Sjrctable           table;
+{
+    if (!table->value[0]) 
+        return 0;
+    if (_Xsj3cCmp(table->value[0],"on"))
+        buf->editcurlast = ON;
+    else
+        buf->editcurlast = OFF;
+    return 1;
+}
+
+/*
+ * _Xsj3cSetFlushCursorLast()
+ *  Set a parameter by .FlushCursorLast entry.
+ */
+static int
+_Xsj3cSetFlushCursorLast(buf, table)
+    Xsj3cBuf            buf;
+    Sjrctable           table;
+{
+    if (!table->value[0]) 
+        return 0;
+    if (_Xsj3cCmp(table->value[0],"on"))
+        buf->flushcurlast = ON;
+    else
+        buf->flushcurlast = OFF;
+    return 1;
+}
+
+/*
+ * _Xsj3cSetUnconvSeg()
+ *  Set a parameter by .MuhenkanSegment entry.
+ */
+static int
+_Xsj3cSetUnconvSeg(buf, table)
+    Xsj3cBuf            buf;
+    Sjrctable           table;
+{
+    if (!table->value[0]) 
+        return 0;
+    if (_Xsj3cCmp(table->value[0],"all"))
+        buf->muhenseg = ALL;
+    else if (_Xsj3cCmp(table->value[0],"after"))
+        buf->muhenseg = AFTER;
+    else
+        buf->muhenseg = ONE;
+    return 1;
+}
+
+/*
+ * _Xsj3cSetConvSeg()
+ *  Set a parameter by .HenkanSegment entry.
+ */
+static int
+_Xsj3cSetConvSeg(buf, table)
+    Xsj3cBuf            buf;
+    Sjrctable           table;
+{
+    if (!table->value[0]) 
+        return 0;
+    if (_Xsj3cCmp(table->value[0],"all"))
+        buf->henkanseg = ALL;
+    else if (_Xsj3cCmp(table->value[0],"after"))
+        buf->henkanseg = AFTER;
+    else
+        buf->henkanseg = ONE;
+    return 1;
+}
+
+/*
+ * _Xsj3cSetModeConv()
+ *  Set a parameter by .ModeConversion entry.
+ */
+static int
+_Xsj3cSetModeConv(buf, table)
+    Xsj3cBuf            buf;
+    Sjrctable           table;
+{
+    Xsj3csMode          mode;
+    Xsj3cFlag           input, conved,  noinput;
+
+    if (table->key[1] && table->value[0] && table->value[1] &&
+            table->value[2]) {
+        if (_Xsj3cCmp(table->key[1], "hiragana")) {
+            mode = MODE_HIRA;
+        } else if (_Xsj3cCmp(table->key[1], "zkatakana")) {
+            mode = MODE_ZKATA;
+        } else if (_Xsj3cCmp(table->key[1], "hkatakana")) {
+            mode = MODE_HKATA;
+        } else if (_Xsj3cCmp(table->key[1], "halpha")) {
+            mode = MODE_HALPHA;
+        } else if (_Xsj3cCmp(table->key[1], "zalpha")) {
+            mode = MODE_ZALPHA;
+        } else if (_Xsj3cCmp(table->key[1], "rollup")) {
+            mode = MODE_ROLLUP;
+        } else if (_Xsj3cCmp(table->key[1], "rolldown")) {
+            mode = MODE_ROLLDOWN;
+        } else {
+            Xsj3cWarning("Unknown conversion mode");
+        }
+        if (_Xsj3cCmp(table->value[0],"on"))
+            input = ON;
+        else
+            input = OFF;
+        if (_Xsj3cCmp(table->value[1],"on"))
+            conved = ON;
+        else
+            conved = OFF;
+        if (_Xsj3cCmp(table->value[2],"on"))
+            noinput = ON;
+        else
+            noinput = OFF;
+        buf->modeconv[mode] = (noinput << 2) + (conved << 1) + input;
+        return 1;
+    } else {
+        return 0;
+    }
+}
+
+/*
+ * _Xsj3cSetUnderLine()
+ *  Set a parameter by .ConvertedUnderLine entry.
+ */
+static int
+_Xsj3cSetUnderLine(buf, table)
+    Xsj3cBuf            buf;
+    Sjrctable           table;
+{
+    if (!table->value[0]) 
+        return 0;
+    if (_Xsj3cCmp(table->value[0],"on"))
+        buf->convedunderline = ON;
+    else
+        buf->convedunderline = OFF;
+    return 1;
+}
+
+/*
+ * _Xsj3cSetDispMChange()
+ *  Set a parameter by .DisplayModeChange entry.
+ */
+static int
+_Xsj3cSetDispMChange(buf, table)
+    Xsj3cBuf            buf;
+    Sjrctable           table;
+{
+    if (!table->value[0]) 
+        return 0;
+    if (_Xsj3cCmp(table->value[0],"on"))
+        buf->dispmodechange = ON;
+    else
+        buf->dispmodechange = OFF;
+    return 1;
+}
+
+/*
+ * _Xsj3cSetDelLastMove()
+ *  Set a parameter by .DeleteLastMove entry.
+ */
+static int
+_Xsj3cSetDelLastMove(buf, table)
+    Xsj3cBuf            buf;
+    Sjrctable           table;
+{
+    if (!table->value[0]) 
+        return 0;
+    if (_Xsj3cCmp(table->value[0],"on"))
+        buf->dellastmove = ON;
+    else
+        buf->dellastmove = OFF;
+    return 1;
+}
+
+/*
+ * _Xsj3cSetKanaInput()
+ *  Set a parameter by .KanaInputOnly entry.
+ */
+static int
+_Xsj3cSetKanaInput(buf, table)
+    Xsj3cBuf            buf;
+    Sjrctable           table;
+{
+    if (!table->value[0]) 
+        return 0;
+    if (_Xsj3cCmp(table->value[0],"on"))
+        buf->kanaonly = ON;
+    else
+        buf->kanaonly = OFF;
+    return 1;
+}
+
+/*
+ * _Xsj3cSetInputSame()
+ *  Set a parameter by .InputSameTime entry.
+ */
+static int
+_Xsj3cSetInputSame(buf, table)
+    Xsj3cBuf            buf;
+    Sjrctable           table;
+{
+    if (!table->value[0]) 
+        return 0;
+    if (_Xsj3cCmp(table->value[0],"on"))
+        buf->inputsame = ON;
+    else
+        buf->inputsame = OFF;
+    return 1;
+}
+
+/*
+ * _Xsj3cSetCntrlSame()
+ *  Set a parameter by .CntrlSameTime entry.
+ */
+static int
+_Xsj3cSetCntrlSame(buf, table)
+    Xsj3cBuf            buf;
+    Sjrctable           table;
+{
+    if (!table->value[0]) 
+        return 0;
+    if (_Xsj3cCmp(table->value[0],"on"))
+        buf->cntrlsame = ON;
+    else
+        buf->cntrlsame = OFF;
+    return 1;
+}
+
+/*
+ * _Xsj3cSetSelectConv()
+ *  Set a parameter by .BeforeSelectConversion entry.
+ */
+static int
+_Xsj3cSetSelectConv(buf, table)
+    Xsj3cBuf            buf;
+    Sjrctable           table;
+{
+    if (!table->value[0]) 
+        return 0;
+    if (_Xsj3cCmp(table->value[0],"on"))
+        buf->selectconv = ON;
+    else
+        buf->selectconv = OFF;
+    return 1;
+}
+
+/*
+ * _Xsj3cSetBeforeConv()
+ *  Set a parameter by .BeforeConversion entry.
+ */
+static int
+_Xsj3cSetBeforeConv(buf, table)
+    Xsj3cBuf            buf;
+    Sjrctable           table;
+{
+    if (!table->value[0]) 
+        return 0;
+    if (_Xsj3cCmp(table->value[0],"on"))
+        buf->beforeconv = ON;
+    else
+        buf->beforeconv = OFF;
+    return 1;
+}
+
+/*
+ * _Xsj3cSetLastDoubleConv()
+ *  Set a parameter by .BeforeConversion entry.
+ */
+static int
+_Xsj3cSetLastDoubleConv(buf, table)
+    Xsj3cBuf            buf;
+    Sjrctable           table;
+{
+    if (!table->value[0]) 
+        return 0;
+    if (_Xsj3cCmp(table->value[0],"on"))
+        buf->lastdoubleconv = ON;
+    else
+        buf->lastdoubleconv = OFF;
+    return 1;
+}
+
+/*
+ * _Xsj3cSetSelectCount()
+ *  Set a parameter by .SelectCount entry.
+ */
+static int
+_Xsj3cSetSelectCount(buf, table)
+    Xsj3cBuf            buf;
+    Sjrctable           table;
+{
+    register unsigned char     *p;
+
+    if (!table->value[0]) 
+        return 0;
+    p = table->value[0];
+    while (*p != '\0') {
+        if (!isdigit(*p++))
+            return 0;
+    }
+    buf->selectcount = atoi(table->value[0]);
+    return 1;
+}
+
+/*
+ * _Xsj3cSetSelectBackMove()
+ *  Set a parameter by .SelectBackSpaceMove entry.
+ */
+static int
+_Xsj3cSetSelectBackMove(buf, table)
+    Xsj3cBuf            buf;
+    Sjrctable           table;
+{
+    if (!table->value[0]) 
+        return 0;
+    if (_Xsj3cCmp(table->value[0],"on"))
+        buf->selectback = ON;
+    else
+        buf->selectback = OFF;
+    return 1;
+}
+
+/*
+ * _Xsj3cSetCandidatePad()
+ *  Set a parameter by .CandidatePadding entry.
+ */
+static int
+_Xsj3cSetCandidatePad(buf, table)
+    Xsj3cBuf            buf;
+    Sjrctable           table;
+{
+    if (!table->value[0]) 
+        return 0;
+    if (_Xsj3cCmp(table->value[0],"on"))
+        buf->candpadding = ON;
+    else
+        buf->candpadding = OFF;
+    return 1;
+}
+
+/*
+ * _Xsj3cSetNextRCFile()
+ *  Set a parameter by .NextRCFile entry.
+ */
+static int
+_Xsj3cSetNextRCFile(buf, table)
+    Xsj3cBuf            buf;
+    Sjrctable           table;
+{
+    char                file[BUFSIZ];
+
+    if (table->value[0]) {
+        strcpy (file, buf->rcfile);
+        _Xsj3cReadAscii(file, table->value[0], buf->rcfile);
+        return 1;
+    }
+    return 0;
+}
+
+/*
+ * _Xsj3cSetIncludeRCFile()
+ *  Set a parameter by .include entry.
+ */
+static int
+_Xsj3cSetIncludeRCFile(buf, table)
+    Xsj3cBuf            buf;
+    Sjrctable           table;
+{
+    char                file[BUFSIZ],   name[BUFSIZ];
+    SjrcRec             rctable;
+    struct functable   *functp;
+    FILE               *fp;
+    register int        line;
+    int                 status;
+
+    inc_cnt++;
+    if (inc_cnt > SJRC_INCLUDE_MAX) {
+        Xsj3cWarning("sjrc include nesting too deep");
+        return 0;
+    }
+    if (table->value[0]) {
+        /*  Get include file and open */
+        _Xsj3cReadAscii(table->value[0], table->value[0], name);
+        strcpy(file, name);
+        if ((fp = fopen(file, "r")) == NULL) {
+            strcpy(file, SJ3DEFPATH);
+            strcat(file, name);
+            if ((fp = fopen(file, "r")) == NULL) {
+                Xsj3cWarning("can't open include sjrc file %s", file);
+                return 0;
+            }
+        }
+    } else {
+        return 0;
+    }
+
+    /*  Read sjrc file and set buffer fields    */
+    for (line = 0; (status = 
+            _Xsj3cReadRC(fp, &rctable)) != END; line++)  {
+        functp = funcs;
+        if (status == NORMAL) {
+            while (functp->keyword != NULL) {
+                if (_Xsj3cCmp(rctable.key[0], functp->keyword)) {
+                    if (!(*(functp->func))(buf, &rctable))
+                        Xsj3cWarning("wrong format in include sjrc file. %s:%d",
+                                file, line + 1);
+                    break;
+                }
+                functp++;
+            }
+        } else if (status == COMMENT || status == OTHERS) {
+            continue;
+        } else {
+            Xsj3cWarning("bad line in sjrc include file. %s:%d",
+                    file, line + 1);
+            continue;
+        }
+    }
+    fclose(fp);
+    return 1;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/Xsj3clib/symbol.c	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,310 @@
+#ifndef lint
+static char *rcsid = "$Id: symbol.c,v 2.0 1992/02/13 18:33:43 nao Exp $";
+#endif
+/*
+ * Copyright 1991 Sony Corporation
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Sony not be used in advertising or
+ * publicity pertaining to distribution of the software without specific,
+ * written prior permission.  Sony makes no representations about the
+ * suitability of this software for any purpose.  It is provided "as is"
+ * without express or implied warranty.
+ *
+ * SONY DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL SONY
+ * BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
+ * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN 
+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+/*
+ * Author: Naoshi Suzuki, SONY Corporation.  (nao@sm.sony.co.jp)
+ */
+
+#include <stdio.h>
+#include "common.h"
+#include "util.h"
+#include "func.h"
+#include "table.h"
+
+Xsj3cSymbol                 _Xsj3cSymbolInit();
+int                         Xsj3cGetSymbolNum();
+Xsj3cSymbol                 Xsj3cGetSymbols();
+wchar                      *Xsj3cGetSymbol();
+int                         Xsj3cSetSymbol();
+void                        Xsj3cEndSymbol();
+
+static int                  _Xsj3cReadSymbol();
+
+static Xsj3cSymbol          symbollist = NULL;
+static int                  symbolnum = 0;
+
+/*
+ * _Xsj3cSymbolInit()
+ *  Decide sjsb file to read, then read it and make table for symbles.
+ */
+Xsj3cSymbol
+_Xsj3cSymbolInit(sjsb, home)
+    char               *sjsb;
+    char               *home;
+{
+    extern char        *getenv();
+    register char      *p;
+    char                sbfile[BUFSIZ];
+    int                 value;
+
+    if (symbollist) {
+        return(symbollist);
+    }
+    if (sjsb) {
+        if ((value = _Xsj3cReadSymbol(sjsb)) > 0)
+            Xsj3cError("can't open sjsb file %s", sjsb);
+        else if ( value < 0 )
+            Xsj3cError("read failed sjsb file %s", sjsb);
+    } else {
+        sbfile[0] = '\0';
+        if ((p = getenv("SJSB")) && *p != '\0') {
+            if (*p != '/') {
+                if (home)
+                    strcpy(sbfile, home);
+                strcat(sbfile, "/");
+            }
+            strcat(sbfile, p);
+        } else if (home) {
+            strcpy(sbfile, home);
+            strcat(sbfile, "/.sjsb");
+        } else  {
+            strcpy(sbfile, SJ3DEFPATH);
+            strcat(sbfile, DEF_SJSB_FILE);
+        }
+        if ((value = _Xsj3cReadSymbol(sbfile)) > 0) {
+            strcpy(sbfile, SJ3DEFPATH);
+            strcat(sbfile, DEF_SJSB_FILE);
+            if ((value = _Xsj3cReadSymbol(sbfile)) > 0) {
+                Xsj3cError("can't open sjsb file %s", sbfile);
+            } else if ( value < 0 ) {
+                Xsj3cError("read failed sjsb file %s", sbfile);
+            }
+        } else if ( value < 0 ) {
+            Xsj3cError("read failed sjsb file %s", sbfile);
+        }
+    }
+    return(symbollist);
+}
+
+/*
+ *  _Xsj3cReadSymbol()
+ *   Read sjsb file that is symbol table file.
+ *  Make symbol table and return it.
+ */
+static int
+_Xsj3cReadSymbol(file)
+    char                   *file;
+{
+    FILE                   *fp;
+    unsigned char           line[256];
+    unsigned char          *p;
+    int                     len;
+    wchar                   data[RBUFSIZ];
+    register int            i,  j;
+
+    if ((fp = fopen(file, "r")) == NULL) {
+        return (OPEN_FAILED);
+    }
+
+    i = 0;
+    while (fgets(line, sizeof(line), fp) != NULL) {
+        if (line[0] != '#' && line[0] != '\n')
+            i++;
+    }
+    
+    symbolnum = i;
+    if ((symbollist = (Xsj3cSymbol)calloc(i, sizeof(Xsj3cSymbolRec))) == NULL) {
+        return (ALLOC_FAILED);
+    }
+
+    rewind(fp);
+    
+    j = 0;
+    while (fgets(line, sizeof(line), fp) != NULL && j < i) {
+        p = line;
+        while (*p != '\n' && *p != '#') {
+            p += _Xsj3cmINtowOUT(file, p, data, &len);
+            SKIP(p);
+            if (data[0] == '\0')
+                break;
+            symbollist[j].data = _Xsj3cStoreWchar(data, len + 1);
+            symbollist[j].len = len;
+            if (!symbollist[j].data)
+                return (ALLOC_FAILED);
+            j++;
+        }
+    }
+    fclose(fp);
+    return (OK);
+}
+
+/*
+ * Xsj3cGetSymbolNum()
+ *  Set the appointed (by 2nd argument) symbol to 3rd argument.
+ */
+int
+Xsj3cGetSymbolNum(buf, cur)
+    Xsj3cBuf            buf;
+    int                *cur;
+{
+    if (!buf->symbol) {
+        buf->symbol = _Xsj3cSymbolInit(NULL, NULL);
+    }
+    *cur = buf->cursymbol;
+    return (symbolnum);
+}
+
+/*
+ * Xsj3cGetSymbols()
+ *  Set the appointed (by 2nd argument) symbol to 3rd argument.
+ */
+Xsj3cSymbol
+Xsj3cGetSymbols(buf)
+    Xsj3cBuf            buf;
+{
+    if (!buf->symbol) {
+        buf->symbol = _Xsj3cSymbolInit(NULL, NULL);
+    }
+    return (buf->symbol);
+}
+
+/*
+ * Xsj3cGetSymbol()
+ *  Set the appointed (by 2nd argument) symbol to 3rd argument.
+ */
+wchar *
+Xsj3cGetSymbol(buf, n, len)
+    Xsj3cBuf            buf;
+    int                 n;
+    int                *len;
+{
+    if (!buf->symbol) {
+        buf->symbol = _Xsj3cSymbolInit(NULL, NULL);
+    }
+    *len = buf->symbol[n].len;
+    return (buf->symbol[n].data);
+}
+
+/*
+ * Xsj3cSetSymbol()
+ *  Set the selected symbol to the buffers.
+ */
+int
+Xsj3cSetSymbol(buf, sel_symbol, changed, flush)
+    Xsj3cBuf            buf;
+    int                 sel_symbol;
+    int                *changed;
+    int                *flush;
+{
+    Xsj3cSeg            seg;
+    int                 change_pos;
+    register int        i;
+    wchar               symbol[RBUFSIZ];
+
+    if (buf->segnum && buf->input[buf->curseg]
+            && (buf->input[buf->curseg]->edit & SEG_NOEDIT)) {
+        /* $B8=J8@a$,JQ49:Q$_$N>l9g(B   */
+        if (buf->candidate) 
+            Xsj3cEndCandidate(buf, ON);
+        /* FlushInConverion on $B$N;~$O3NDj$9$k(B */
+        switch (buf->flushiconv) {
+        case ON:
+            for (i = 1; i < buf->backsegnum + 1; i++) {
+                Xsj3cFreeSegment(buf->backup[i]);
+                buf->backup[i] = NULL;
+            }
+            if (!buf->backup) {
+                if ((buf->backup = (Xsj3cSeg *)calloc(BUNBUFSIZ,
+                        sizeof(Xsj3cSeg))) == NULL) {
+                    Xsj3cError("Cannot allocate for backup buffers");
+                }
+            }
+            if (seg = buf->backup[0]) {
+                Xsj3cClearSegment(buf, seg);
+            } else
+                seg = buf->backup[0] = (Xsj3cSeg)Xsj3cCreateSegment(buf);
+            buf->backsegnum = 1;
+            *flush = ON;
+            break;
+        case EDIT:
+            if (!(seg = buf->input[buf->curseg]))
+                seg = buf->input[buf->curseg]
+                        = (Xsj3cSeg)Xsj3cCreateSegment(buf);
+            *seg->str = '\0';
+            seg->sp = seg->str;
+            *seg->oldstr = '\0';
+            seg->oldlen = 0;
+            seg->n_roma = 0;
+            seg->n_kana = -1;
+            if (buf->curseg == buf->segnum)
+                buf->segnum++;
+            else {
+                _Xsj3cUnConvSeg(buf, ONE, buf->muhencurlast);
+                _Xsj3cStoreYomi(buf, seg, 0);
+            }
+            *flush = OFF;
+            break;
+        case OFF:
+            if (seg = buf->input[buf->segnum]) {
+                Xsj3cClearSegment(buf, seg);
+            } else {
+                seg = buf->input[buf->segnum]
+                        = (Xsj3cSeg)Xsj3cCreateSegment(buf);
+            }
+            buf->curseg = buf->segnum;
+            buf->segnum++;
+            *flush = OFF;
+            break;
+        case NONE:
+        default:
+            *flush = OFF;
+            *changed = OFF;
+            return 0;
+        }
+    } else {
+        seg = buf->input[buf->curseg];
+        if (buf->curseg == buf->segnum) {
+            buf->segnum++;
+        }
+        if (!seg) {
+            seg = buf->input[buf->curseg] = (Xsj3cSeg)Xsj3cCreateSegment(buf);
+        } else {
+            *seg->str = '\0';
+            seg->sp = seg->str;
+            seg->n_roma = 0;
+            seg->n_kana = -1;
+            *seg->oldstr = '\0';
+            seg->oldlen = 0;
+        }
+    }
+    seg->edit = SEG_EDIT;
+    change_pos = seg->cur;
+    _Xsj3cwOUTtowPS(buf, symbol, buf->symbol[sel_symbol].data);
+    _Xsj3cInsertWchar(seg, symbol, buf->symbol[sel_symbol].len);
+    _Xsj3cStoreYomi(buf, seg, change_pos);
+    buf->cursymbol = sel_symbol;
+    *changed = ON;
+
+    return 0;
+}
+
+/*
+ * Xsj3cEndSymbol()
+ *  End symbol input mode(SelectMode) and back to InputMode.
+ */
+void
+Xsj3cEndSymbol(buf)
+    Xsj3cBuf            buf;
+{
+    buf->convmode = InputModeMask;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/Xsj3clib/table.c	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,897 @@
+#ifndef lint
+static char *rcsid = "$Id: table.c,v 2.3 1993/09/21 09:42:45 nao Exp $";
+#endif
+/*
+ * Copyright 1991 Sony Corporation
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Sony not be used in advertising or
+ * publicity pertaining to distribution of the software without specific,
+ * written prior permission.  Sony makes no representations about the
+ * suitability of this software for any purpose.  It is provided "as is"
+ * without express or implied warranty.
+ *
+ * SONY DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL SONY
+ * BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
+ * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN 
+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+/*
+ * Author: Naoshi Suzuki, SONY Corporation.  (nao@sm.sony.co.jp)
+ */
+
+#include <stdio.h>
+#include <ctype.h>
+#include "common.h"
+#include "sj3ctype.h"
+#include "util.h"
+
+extern Xsj3cCVServerIF      serverIF[SERVER_NUM];
+extern Xsj3cSymbol          _Xsj3cSymbolInit();
+extern Xsj3cHinsi           _Xsj3cHinsiInit();
+
+Xsj3cRKTable               *_Xsj3cRKInit();
+Xsj3cHKTable               *_Xsj3cHKInit();
+Xsj3cZHTable               *_Xsj3cZHInit();
+unsigned char              *_Xsj3cSetPlosive();
+unsigned char              *_Xsj3cSetDouble();
+void                        Xsj3cInitializeTables();
+
+int                         _Xsj3cmINtowOUT();
+int                         _Xsj3cReadAscii();
+wchar                      *_Xsj3cStoreWchar();
+
+static Xsj3cRKTable        *_Xsj3cAllocRKTable();
+static Xsj3cHKTable        *_Xsj3cAllocHKTable();
+static Xsj3cZHTable        *_Xsj3cAllocZHTable();
+
+static unsigned char       *_Xsj3cStoreChar();
+
+static int                  _Xsj3cmINtomPS();
+
+static int                  _Xsj3cReadRK();
+static int                  _Xsj3cReadHK();
+static int                  _Xsj3cReadZH();
+
+static unsigned char       *chnowp = NULL,     *chmaxp = NULL;
+static wchar               *wnowp = NULL,      *wmaxp = NULL;
+
+static Xsj3cRKTable        *rktable[2] = {NULL, NULL};
+static Xsj3cHKTable        *hktable[2] = {NULL, NULL};
+static Xsj3cZHTable        *zhtable[2] = {NULL, NULL};
+static unsigned char       *plosive[2] = {NULL, NULL};
+static unsigned char       *rkdouble[2] = {NULL, NULL};
+
+static Xsj3cRKTable        *rknowtp = NULL, *rkmaxtp = NULL;
+static Xsj3cHKTable        *hknowtp = NULL, *hkmaxtp = NULL;
+static Xsj3cZHTable        *zhnowtp = NULL, *zhmaxtp = NULL;
+
+static unsigned char *
+_Xsj3cStoreChar(ch, len)
+    unsigned char  *ch;
+    int             len;
+{
+    register unsigned char  *chp;
+
+    if (chnowp == NULL || chnowp + len > chmaxp) {
+        chp = (unsigned char *)malloc(BUFSIZ);
+        if (chp == NULL)
+            return (NULL);
+        chnowp = chp;
+        chmaxp = chnowp + (BUFSIZ/sizeof(unsigned char));
+        strcpy (chp, ch);
+        chnowp += len;
+        return (chp);
+    } else {
+        chp = chnowp;
+        strcpy (chp, ch);
+        chnowp += len;
+        return (chp);
+    }
+}
+
+wchar *
+_Xsj3cStoreWchar(wch, len)
+    wchar          *wch;
+    int             len;
+{
+    register wchar  *wp;
+
+    if (wnowp == NULL || wnowp + len > wmaxp) {
+        wp = (wchar *)malloc(BUFSIZ);
+        if (wp == NULL)
+            return (NULL);
+        wnowp = wp;
+        wmaxp = wnowp + (BUFSIZ/sizeof(wchar));
+        (void)_Xsj3cWcpy (wp, wch);
+        wnowp += len;
+        return (wp);
+    } else {
+        wp = wnowp;
+        (void)_Xsj3cWcpy (wp, wch);
+        wnowp += len;
+        return (wp);
+    }
+}
+
+static int
+_Xsj3cmINtomPS(buf, file, src, dest)
+    Xsj3cBuf                buf;
+    char                   *file;
+    register unsigned char *src,   *dest;
+{
+    register unsigned char  c;
+    register wchar          s,     (*conv)();
+    register int            i = 0,  kanji = OFF, kana = OFF;
+
+    conv = CodeConvFunc[in_lang][serverIF[buf->server].lang];
+    while ((*src != '\t' && *src != '\n'
+            && *src != ' ' && *src != '#')||(kanji || kana)) {
+        c = *src++;
+        switch (c) {
+        case ESC:
+            c = *src++;
+            if (c == '$') {
+                c = *src++;
+                i++;
+                if (c == 'B' || c == '@') {
+                    kanji++;
+                    i++;
+                } else
+                    goto badcode;
+            } else if (c == '(') {
+                c = *src++;
+                i++;
+                if (c == 'J' || c == 'B' || c == 'H') {
+                    kanji = OFF;
+                    i++;
+                } else if (c == '$' && *src == 'B') {
+                    src++;
+                    kanji++;
+                    i++;
+                } else 
+                    goto badcode;
+            } else if (c == '&' && !strcmp("@\033$B", src)) {
+                src += 4;
+                i += 5;
+                kanji++;
+            } else
+                goto badcode;
+            break;
+        case SI:
+            kana = OFF;
+            break;
+        case SO:
+            kana++;
+            break;
+        case '\\':
+            if (!kanji & !kana) {
+                *dest++ = *src++;
+                i++;
+                break;
+            }
+        default:
+            if (kanji) {
+                s = (c << 8) + (*src++ & 0x7f);
+                s = conv(s);
+                *dest++ = (s >> 8) & 0xff;
+                *dest++ = s & 0xff;
+                i++;
+            } else if (iskan1(c, in_lang) && iskan2(*src, in_lang)) {
+                if (conv) {
+                    s = (c << 8) + (*src++ & 0xff);
+                    s = conv(s);
+                    *dest++ = (s >> 8) & 0xff;
+                    *dest++ = s & 0xff;
+                } else {
+                    *dest++ = c;
+                    *dest++ = *src++;
+                }
+                i++;
+            } else if (iskana(c)) {
+                if (in_lang == JP_SJIS || in_lang == JP_JIS8)
+                    *dest++ = c;
+                else if (in_lang == JP_EUC && iseuckana(c) && iskana2(*src)) {
+                    *dest++ = *src++;
+                    i++;
+                } else 
+                    goto badcode;
+            } else if (iseuckana(c) && iskana2(*src)) {
+                if (in_lang == JP_EUC)
+                    *dest++ = *src++;
+                else 
+                    goto badcode;
+                i++;
+            } else if (kana) {
+                *dest++ = (c | MSB);
+            } else if (isascii(c)) {
+                *dest++ = c;
+            } else {
+badcode:
+                Xsj3cError("There is bad code %s in %s",_Xsj3cXtoa(c),file);
+            }
+            break;
+        }
+        i++;
+    }
+    *dest = '\0';
+    return (i);
+}
+
+int
+_Xsj3cReadAscii(file, src, dest)
+    char                   *file;
+    register unsigned char *src,   *dest;
+{
+    register int            i = 0,  kana = OFF;
+
+    while ((*src != '\t' && *src != ' '
+            && *src != '\0' && *src != '\n' && *src != '#')|| kana) {
+        if (kana) {
+            *dest++ = (*src++ | MSB);
+        } if (*src == '\\') {
+            src++;
+            i++;
+            *dest++ = *src++;
+        } else if (isascii(*src)) {
+            *dest++ = *src++;
+        } else if (isdakuten(*src)) {
+            *dest++ = *src++;
+        } else if (iseuckana(*src) && isdakuten(*(src + 1))) {
+            src++;
+            i++;
+            *dest++ = *src++;
+        } else if (*src == SO) {
+            src++;
+            kana++;
+        } else if (*src == SI) {
+            src++;
+            kana = OFF;
+        } else {
+            int             n = *src;
+            Xsj3cError("There is bad code %s in %s",_Xsj3cXtoa(n),file);
+        }
+        i++;
+    }
+    *dest = '\0';
+    return (i);
+}
+
+int
+_Xsj3cmINtowOUT(file, src, dest, len)
+    char                   *file;
+    register unsigned char *src;
+    register wchar         *dest;
+    register int           *len;
+{
+    register unsigned char  c;
+    register int            i = 0,  kanji = OFF, kana = OFF;
+    register wchar          (*conv)();
+
+    *len = 0;
+    conv = CodeConvFunc[in_lang][out_lang];
+    while ((*src != '\t' && *src != ' ' && *src != '\0'
+            && *src != '\n' && *src != '#')||(kanji || kana)) {
+        c = *src++;
+        switch (c) {
+        case ESC:
+            c = *src++;
+            if (c == '$') {
+                c = *src++;
+                i++;
+                if (c == 'B' || c == '@') {
+                    kanji++;
+                    i++;
+                } else
+                    goto badcode;
+            } else if (c == '(') {
+                c = *src++;
+                i++;
+                if (c == 'J' || c == 'B' || c == 'H') {
+                    kanji = OFF;
+                    i++;
+                } else if (c == '$' && *src == 'B') {
+                    src++;
+                    kanji++;
+                    i++;
+                } else
+                    goto badcode;
+            } else if (c == '&' && !strcmp("@\033$B", src)) {
+                src += 4;
+                i += 5;
+                kanji++;
+            } else
+                goto badcode;
+            break;
+        case SI:
+            kana = OFF;
+            break;
+        case SO:
+            kana++;
+            break;
+        case '\\':
+            if (!kanji && !kana) {
+                *dest++ = *src++;
+                i++;
+                break;
+            }
+        default:
+            if (kanji || (iskan1(c, in_lang) && iskan2(*src, in_lang))) {
+                if (conv) 
+                    *dest++ = conv((c << 8) + (*src++ & 0xff));
+                else
+                    *dest++ = (c << 8) + (*src++ & 0xff);
+                i++;
+            } else if (iskana(c)) {
+                if (in_lang == JP_SJIS || in_lang == JP_JIS8)
+                    *dest++ = c;
+                else if (in_lang == JP_EUC && iseuckana(c) && iskana2(*src)) {
+                    *dest++ = *src++;
+                    i++;
+                } else 
+                    goto badcode;
+            } else if (iseuckana(c) && iskana2(*src)) {
+                if (in_lang == JP_EUC)
+                    *dest++ = *src++;
+                else 
+                    goto badcode;
+                i++;
+            } else if (kana) {
+                *dest++ = (c | MSB);
+            } else if (isascii(c)) {
+                *dest++ = c;
+            } else {
+badcode:
+                Xsj3cError("There is bad code %s in %s",_Xsj3cXtoa(c),file);
+            }
+            (*len)++;
+            break;
+        }
+        i++;
+    }
+    *dest = '\0';
+    return (i);
+}
+
+/*
+ * Xsj3cInitializeTables()
+ *  Read definition files and initialize conversion tables.
+ */
+void
+Xsj3cInitializeTables(buf, home, sjrk, sjhk, sjzh, sjsb)
+    Xsj3cBuf            buf;
+    char               *home;
+    char               *sjrk,   *sjhk,  *sjzh,  *sjsb;
+{
+    buf->rktable = _Xsj3cRKInit(buf, sjrk, home);
+    buf->hktable = _Xsj3cHKInit(buf, sjhk, home);
+    buf->zhtable = _Xsj3cZHInit(buf, sjzh, home);
+    buf->symbol = _Xsj3cSymbolInit(sjsb, home);
+    buf->plosive = _Xsj3cSetPlosive(buf);
+    buf->rkdouble = _Xsj3cSetDouble(buf);
+    buf->hinsi = _Xsj3cHinsiInit(buf);
+}
+
+/*
+ * _Xsj3cRKInit()
+ *  Decide sjrk file to read, then read it and make table for roman-kana
+ * conversion table.
+ */
+Xsj3cRKTable *
+_Xsj3cRKInit(buf, sjrk, home)
+    Xsj3cBuf            buf;
+    char               *sjrk;
+    char               *home;
+{
+    extern char        *getenv();
+    register char      *p;
+    char                rkfile[BUFSIZ];
+    int                 value,  error;
+
+    if (rktable[serverIF[buf->server].lang])
+        return (rktable[serverIF[buf->server].lang]);
+
+    if (sjrk) {
+        if ((value = _Xsj3cReadRK(buf, sjrk, &error)) > 0 )
+            Xsj3cError("can't open sjrk file %s", sjrk);
+        else if (value < 0)
+            Xsj3cError("read failed line %s sjrk file %s",
+                    _Xsj3cItoa(error), sjrk);
+    } else {
+        rkfile[0] = '\0';
+        if ((p = getenv("SJRK")) && *p != '\0') {
+            if (*p != '/') {
+                if (home)
+                    strcpy(rkfile, home);
+                strcat(rkfile, "/");
+            }
+            strcat(rkfile, p);
+        } else if (home) {
+            strcpy(rkfile, home);
+            strcat(rkfile, "/.sjrk");
+        } else {
+            strcpy(rkfile, SJ3DEFPATH);
+            strcat(rkfile, DEF_SJRK_FILE);
+        }
+        if ((value = _Xsj3cReadRK(buf, rkfile, &error)) > 0 ) {
+            strcpy(rkfile, SJ3DEFPATH);
+            strcat(rkfile, DEF_SJRK_FILE);
+            if ((value = _Xsj3cReadRK(buf, rkfile, &error)) > 0 ) {
+                Xsj3cError("can't open sjrk file %s", rkfile);
+            } else if (value < 0) {
+                Xsj3cError("read failed line %s sjrk file %s",
+                        _Xsj3cItoa(error), rkfile);
+            }
+        } else if (value < 0) {
+            Xsj3cError("read failed line %s sjrk file %s",
+                    _Xsj3cItoa(error), rkfile);
+        }
+    }
+    return (rktable[serverIF[buf->server].lang]);
+}
+
+#define RKTBMAX (BUFSIZ/sizeof(Xsj3cRKTable))
+
+static Xsj3cRKTable *
+_Xsj3cAllocRKTable()
+{
+    register Xsj3cRKTable  *rktp;
+
+    if (rknowtp == NULL || rknowtp > rkmaxtp) {
+        rktp = (Xsj3cRKTable *)malloc(sizeof(Xsj3cRKTable) * RKTBMAX);
+        if (rktp == NULL)
+            return (NULL);
+        rknowtp = rktp;
+        rkmaxtp = rknowtp + RKTBMAX - 1;
+        rknowtp++;
+    } else {
+        rktp = rknowtp;
+        rknowtp++;
+    }
+    rktp->roma = NULL;
+    rktp->yomi = NULL;
+    rktp->str = NULL;
+    rktp->rlen = 0;
+    rktp->ylen = 0;
+    rktp->next = NULL;
+    return (rktp);
+}
+
+/*
+ *  _Xsj3cReadRK()
+ *   Read sjrk file like a format sj3's roman-kana conversion file,
+ *  and make conversion table.
+ *   But this routine distinguishes upper-case and lower-case.
+ *  It's a big difference.
+ */
+static int
+_Xsj3cReadRK(buf, file, error)
+    Xsj3cBuf                buf;
+    register char          *file;
+    register int           *error;
+{
+    register FILE          *fp;
+    unsigned char           line[256];
+    unsigned char          *p;
+    unsigned char           roma[RBUFSIZ],  yomi[YBUFSIZ],  str[RBUFSIZ];
+    register int            begin = 0,  rlen,   ylen;
+    register Xsj3cRKTable  *rktp,  *rktq,  *rktr;
+
+    if ((fp = fopen(file, "r")) == NULL)
+        return (OPEN_FAILED);
+    
+    *error = 1;
+    rktp = rktable[serverIF[buf->server].lang] = _Xsj3cAllocRKTable();
+    while (fgets(line, sizeof(line), fp) != NULL) {
+        p = line;
+        while (*p != '\n' && *p != '#') {
+            p += _Xsj3cReadAscii(file, p, roma);
+            CHECK_END(p);
+            SKIP(p);
+            p += _Xsj3cmINtomPS(buf, file, p, yomi);
+            SKIP(p);
+            p += _Xsj3cReadAscii(file, p, str);
+            if (roma[0] == '\0' || yomi[0] == '\0')
+                break;
+            if (begin++) {
+                rktr = _Xsj3cAllocRKTable();
+                if (!rktr) {
+                    Xsj3cWarning("can't allocate roman-kana conversion table");
+                    return (ALLOC_FAILED);
+                }
+                rktp = rktq->next = rktr;
+            }
+            rktp->roma = _Xsj3cStoreChar(roma, (rlen  = strlen(roma)) + 1);
+            rktp->yomi = _Xsj3cStoreChar(yomi, (ylen  = strlen(yomi)) + 1);
+            rktp->str = _Xsj3cStoreChar(str, strlen(str) + 1);
+            if (!rktp->roma || !rktp->yomi || !rktp->str) {
+                Xsj3cWarning("can't allocate roman-kana conversion table");
+                return(ALLOC_FAILED);
+            }
+            rktp->rlen = rlen;
+            rktp->ylen = ylen;
+            rktq = rktp;
+        }
+        (*error)++;
+    }
+    rktp->next = NULL;
+    fclose(fp);
+    return (OK);
+}
+
+/*
+ * _Xsj3cHKInit()
+ *  Decide sjhk file to read, then read it and make hiragana-katakana
+ * conversion table.
+ */
+Xsj3cHKTable *
+_Xsj3cHKInit(buf, sjhk, home)
+    Xsj3cBuf            buf;
+    char               *sjhk;
+    char               *home;
+{
+    extern char        *getenv();
+    register char      *p;
+    char                hkfile[BUFSIZ];
+    int                 value,  error;
+
+    if (hktable[serverIF[buf->server].lang])
+        return (hktable[serverIF[buf->server].lang]);
+
+    if (sjhk) {
+        if ((value = _Xsj3cReadHK(buf, sjhk, &error)) > 0 )
+            Xsj3cError("can't open sjhk file %s", sjhk);
+        else if (value < 0)
+            Xsj3cError("read failed line %s sjhk file %s",
+                    _Xsj3cItoa(error), sjhk);
+    } else {
+        hkfile[0] = '\0';
+        if ((p = getenv("SJHK")) && *p != '\0') {
+            if (*p != '/') {
+                if (home)
+                    strcpy(hkfile, home);
+                strcat(hkfile, "/");
+            }
+            strcat(hkfile, p);
+        } else if (home) {
+            strcpy(hkfile, home);
+            strcat(hkfile, "/.sjhk");
+        } else  {
+            strcpy(hkfile, SJ3DEFPATH);
+            strcat(hkfile, DEF_SJHK_FILE);
+        }
+        if ((value = _Xsj3cReadHK(buf, hkfile, &error)) > 0 ) {
+            strcpy(hkfile, SJ3DEFPATH);
+            strcat(hkfile, DEF_SJHK_FILE);
+            if ((value = _Xsj3cReadHK(buf, hkfile, &error)) > 0 ) {
+                Xsj3cError("can't open sjhk file %s", hkfile);
+            } else if (value < 0) {
+                Xsj3cError("read failed line %s sjhk file %s",
+                        _Xsj3cItoa(error), hkfile);
+            }
+        } else if (value < 0) {
+            Xsj3cError("read failed line %s sjhk file %s",
+                    _Xsj3cItoa(error), hkfile);
+        }
+    }
+    return (hktable[serverIF[buf->server].lang]);
+}
+
+#define HKTBMAX (BUFSIZ/sizeof(Xsj3cHKTable))
+
+static Xsj3cHKTable *
+_Xsj3cAllocHKTable()
+{
+    register Xsj3cHKTable  *hktp;
+
+    if (hknowtp == NULL || hknowtp > hkmaxtp) {
+        hktp = (Xsj3cHKTable *)malloc(sizeof(Xsj3cHKTable) * HKTBMAX);
+        if (hktp == NULL)
+            return (NULL);
+        hknowtp = hktp;
+        hkmaxtp = hknowtp + HKTBMAX - 1;
+        hknowtp++;
+    } else {
+        hktp = hknowtp;
+        hknowtp++;
+    }
+    hktp->hira = NULL;
+    hktp->zkata = NULL;
+    hktp->hkata = NULL;
+    hktp->halpha = NULL;
+    hktp->hlen = 0;
+    hktp->next = NULL;
+    return (hktp);
+}
+
+static int
+_Xsj3cReadHK(buf, file, error)
+    Xsj3cBuf                buf;
+    register char          *file;
+    register int           *error;
+{
+    register FILE          *fp;
+    unsigned char           line[256];
+    unsigned char          *p;
+    unsigned char           zhira[RBUFSIZ],  zkata[YBUFSIZ];
+    unsigned char           hkata[RBUFSIZ], halpha[RBUFSIZ];
+    register int            begin = 0,      hkata_len,      halpha_len;
+    register Xsj3cHKTable  *hktp,  *hktq,  *hktr;
+
+    if ((fp = fopen(file, "r")) == NULL)
+        return (OPEN_FAILED);
+    
+    *error = 1;
+    hktp = hktable[serverIF[buf->server].lang] = _Xsj3cAllocHKTable();
+    while (fgets(line, sizeof(line), fp) != NULL) {
+        p = line;
+        while (*p != '\n' && *p != '#') {
+            p += _Xsj3cmINtomPS(buf, file, p, zhira);
+            CHECK_END(p);
+            SKIP(p);
+            p += _Xsj3cmINtomPS(buf, file, p, zkata);
+            CHECK_END(p);
+            SKIP(p);
+            p += _Xsj3cmINtomPS(buf, file, p, hkata);
+            CHECK_END(p);
+            SKIP(p);
+            p += _Xsj3cReadAscii(file, p, halpha);
+            if (zhira[0] == '\0' || zkata[0] == '\0'
+                    || hkata[0] == '\0' || halpha[0] == '\0')
+                break;
+            if (begin++) {
+                hktr = _Xsj3cAllocHKTable();
+                if (!hktr) {
+            Xsj3cWarning("can't allocate hiragana-katakana conversion table");
+                    return (ALLOC_FAILED);
+                }
+                hktp = hktq->next = hktr;
+            }
+            hktp->hira = _Xsj3cStoreChar(zhira, strlen(zhira) + 1);
+            hktp->zkata = _Xsj3cStoreChar(zkata, strlen(zkata) + 1);
+            hktp->hkata = _Xsj3cStoreChar(hkata, 
+                    (hkata_len = strlen(hkata)) + 1);
+            hktp->halpha = _Xsj3cStoreChar(halpha, 
+                    (halpha_len = strlen(halpha)) + 1);
+            if (!hktp->hira || !hktp->zkata || !hktp->hkata || !hktp->halpha) {
+            Xsj3cWarning("can't allocate hiragana-katakana conversion table");
+                return(ALLOC_FAILED);
+            }
+            hktp->hlen = hkata_len;
+            if (hkata_len != halpha_len)
+                return (READ_FAILED);
+            hktq = hktp;
+        }
+        (*error)++;
+    }
+    hktp->next = NULL;
+    fclose(fp);
+    return (OK);
+}
+
+/*
+ * _Xsj3cZHInit()
+ *  Decide sjzh file to read, then read it and make hankaku-zenkaku
+ * conversion table.
+ */
+Xsj3cZHTable *
+_Xsj3cZHInit(buf, sjzh, home)
+    Xsj3cBuf            buf;
+    char               *sjzh;
+    char               *home;
+{
+    extern char        *getenv();
+    register char      *p;
+    char                zhfile[BUFSIZ];
+    int                 value,  error;
+
+    if (zhtable[serverIF[buf->server].lang])
+        return (zhtable[serverIF[buf->server].lang]);
+
+    if (sjzh) {
+        if ((value = _Xsj3cReadZH(buf, sjzh, &error)) > 0 )
+            Xsj3cError("can't open sjzh file %s", sjzh);
+        else if (value < 0)
+            Xsj3cError("read failed line %s sjzk file %s",
+                    _Xsj3cItoa(error), sjzh);
+    } else {
+        zhfile[0] = '\0';
+        if ((p = getenv("SJZH")) && *p != '\0') {
+            if (*p != '/') {
+                if (home)
+                    strcpy(zhfile, home);
+                strcat(zhfile, "/");
+            }
+            strcat(zhfile, p);
+        } else if (home) {
+            strcpy(zhfile, home);
+            strcat(zhfile, "/.sjzh");
+        } else {
+            strcpy(zhfile, SJ3DEFPATH);
+            strcat(zhfile, DEF_SJZH_FILE);
+        }
+        if ((value = _Xsj3cReadZH(buf, zhfile, &error)) > 0 ) {
+            strcpy(zhfile, SJ3DEFPATH);
+            strcat(zhfile, DEF_SJZH_FILE);
+            if ((value = _Xsj3cReadZH(buf, zhfile, &error)) > 0 ) {
+                Xsj3cError("can't open sjzh file %s", zhfile);
+            } else if (value < 0) {
+                Xsj3cError("read failed line %s sjzk file %s",
+                        _Xsj3cItoa(error), zhfile);
+            }
+        } else if (value < 0) {
+            Xsj3cError("read failed line %s sjzk file %s",
+                    _Xsj3cItoa(error), zhfile);
+        }
+    }
+    return (zhtable[serverIF[buf->server].lang]);
+}
+
+#define ZHTBMAX (BUFSIZ/sizeof(Xsj3cZHTable))
+
+static Xsj3cZHTable *
+_Xsj3cAllocZHTable()
+{
+    register Xsj3cZHTable  *zhtp;
+
+    if (zhnowtp == NULL || zhnowtp > zhmaxtp) {
+        zhtp = (Xsj3cZHTable *)malloc(sizeof(Xsj3cZHTable) * ZHTBMAX);
+        if (zhtp == NULL)
+            return (NULL);
+        zhnowtp = zhtp;
+        zhmaxtp = zhnowtp + ZHTBMAX - 1;
+        zhnowtp++;
+    } else {
+        zhtp = zhnowtp;
+        zhnowtp++;
+    }
+    zhtp->zkana = NULL;
+    zhtp->hkata = NULL;
+    zhtp->halpha = NULL;
+    zhtp->zalpha = NULL;
+    zhtp->next = NULL;
+    return (zhtp);
+}
+
+static int
+_Xsj3cReadZH(buf, file, error)
+    Xsj3cBuf        buf;
+    char           *file;
+    register int   *error;
+{
+    register FILE          *fp;
+    unsigned char           line[256];
+    unsigned char          *p;
+    unsigned char           hanalpha[RBUFSIZ],    zenalpha[YBUFSIZ];
+    unsigned char           zkana[RBUFSIZ],     hkata[RBUFSIZ];
+    register int            begin = 0;
+    register Xsj3cZHTable  *zhtp,  *zhtq,  *zhtr;
+
+    if ((fp = fopen(file, "r")) == NULL)
+        return (OPEN_FAILED);
+    
+    *error = 1;
+    zhtp = zhtable[serverIF[buf->server].lang] = _Xsj3cAllocZHTable();
+    while (fgets(line, sizeof(line), fp) != NULL) {
+        p = line;
+        while (*p != '\n' && *p != '#') {
+            p += _Xsj3cReadAscii(file, p, hanalpha);
+            CHECK_END(p);
+            SKIP(p);
+            p += _Xsj3cmINtomPS(buf, file, p, zenalpha);
+            CHECK_END(p);
+            SKIP(p);
+            p += _Xsj3cmINtomPS(buf, file, p, zkana);
+            CHECK_END(p);
+            SKIP(p);
+            p += _Xsj3cmINtomPS(buf, file, p, hkata);
+            if (hanalpha[0] == '\0' || zenalpha[0] == '\0'
+                    || zkana[0] == '\0' || hkata[0] == '\0')
+                break;
+            if (begin++) {
+                zhtr = _Xsj3cAllocZHTable();
+                if (!zhtr) {
+                    Xsj3cWarning("can't allocate zen/hankaku conversion table");
+                    return (ALLOC_FAILED);
+                }
+                zhtp = zhtq->next = zhtr;
+            }
+            zhtp->halpha = _Xsj3cStoreChar(hanalpha, strlen(hanalpha) + 1);
+            zhtp->zalpha = _Xsj3cStoreChar(zenalpha, strlen(zenalpha) + 1);
+            zhtp->zkana = _Xsj3cStoreChar(zkana, strlen(zkana) + 1);
+            zhtp->hkata = _Xsj3cStoreChar(hkata, strlen(hkata) + 1);
+            if (!zhtp->halpha || !zhtp->zalpha
+                    || !zhtp->zkana || !zhtp->hkata) {
+                Xsj3cWarning("can't allocate zen/han-kaku conversion table");
+                return(ALLOC_FAILED);
+            }
+            zhtq = zhtp;
+        }
+        (*error)++;
+    }
+    zhtp->next = NULL;
+    fclose(fp);
+    return (OK);
+}
+
+/*
+ * _Xsj3cSetPlosive()
+ * Set roman-kana plosive conversion data.
+ */
+unsigned char *
+_Xsj3cSetPlosive(buf)
+    Xsj3cBuf                buf;
+{
+    register Xsj3cRKTable  *rktp;
+    register int            i;
+    register wchar          s;
+    unsigned char           tmp[KANABUFSIZ];
+    
+    if (plosive[serverIF[buf->server].lang])
+        return(plosive[serverIF[buf->server].lang]);
+    if (!rktable[serverIF[buf->server].lang])
+        Xsj3cError("Null roman-kana conversion table");
+    i = 0;
+    for (rktp = rktable[serverIF[buf->server].lang];
+            rktp->next != NULL; rktp = rktp->next) {
+        if (*rktp->str != '\0') {
+            s = (*rktp->yomi << 8) + *(rktp->yomi + 1);
+            if (isplosive(s, serverIF[buf->server].lang)) {
+                tmp[i] = *rktp->str;
+                i++;
+            }
+        }
+    }
+    tmp[i] = '\0';
+    if ((plosive[serverIF[buf->server].lang]
+            = _Xsj3cStoreChar(tmp, strlen(tmp) + 1)) == NULL)
+        Xsj3cError("can't allocate for roma-kana plosive conversion table");
+    return(plosive[serverIF[buf->server].lang]);
+}
+
+/*
+ * _Xsj3cSetDouble()
+ * Set roman-kana double conversion data.
+ */
+unsigned char *
+_Xsj3cSetDouble(buf)
+    Xsj3cBuf                buf;
+{
+    register Xsj3cRKTable  *rktp,   *rktp2;
+    register int            i;
+    unsigned char           tmp[KANABUFSIZ];
+    
+    if (rkdouble[serverIF[buf->server].lang])
+        return(rkdouble[serverIF[buf->server].lang]);
+    if (!rktable[serverIF[buf->server].lang])
+        Xsj3cError("Null roman-kana conversion table");
+    i = 0;
+    for (rktp = rktable[serverIF[buf->server].lang];
+            rktp->next != NULL; rktp = rktp->next) {
+        if (rktp->rlen == 1) {
+            if (isvowel(*rktp->roma))
+                continue;
+            tmp[i] = *rktp->roma;
+            for (rktp2 = rktable[serverIF[buf->server].lang];
+                    rktp2->next != NULL; rktp2 = rktp2->next) {
+                if (rktp2->rlen == 2 && *(rktp2->roma + 1) == tmp[i]
+                        && *(rktp2->roma) == tmp[i]) {
+                    if (!strcmp(rktp->yomi, rktp2->yomi)) {
+                        i++;
+                        break;
+                    }
+                }
+            }
+        }
+    }
+    tmp[i] = '\0';
+    if ((rkdouble[serverIF[buf->server].lang]
+            = _Xsj3cStoreChar(tmp, strlen(tmp) + 1)) == NULL)
+        Xsj3cError("can't allocate for roma-kana double conversion table");
+    return(rkdouble[serverIF[buf->server].lang]);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/Xsj3clib/table.h	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,34 @@
+/* $Id: table.h,v 2.0 1992/02/13 18:33:47 nao Exp $ */
+/*
+ * Copyright 1991 Sony Corporation
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Sony not be used in advertising or
+ * publicity pertaining to distribution of the software without specific,
+ * written prior permission.  Sony makes no representations about the
+ * suitability of this software for any purpose.  It is provided "as is"
+ * without express or implied warranty.
+ *
+ * SONY DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL SONY
+ * BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
+ * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN 
+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+/*
+ * Author: Naoshi Suzuki, SONY Corporation.  (nao@sm.sony.co.jp)
+ */
+
+extern int                  _Xsj3cmINtowOUT();
+extern int                  _Xsj3cReadAscii();
+extern wchar               *_Xsj3cStoreWchar();
+
+extern Xsj3cRKTable        *_Xsj3cRKInit();
+extern Xsj3cHKTable        *_Xsj3cHKInit();
+extern Xsj3cZHTable        *_Xsj3cZHInit();
+extern unsigned char       *_Xsj3cSetPlosive();
+extern unsigned char       *_Xsj3cSetDouble();
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/Xsj3clib/util.c	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,814 @@
+#ifndef lint
+static char *rcsid = "$Id: util.c,v 2.2 1993/09/21 09:42:34 nao Exp $";
+#endif
+/*
+ * Copyright 1991 Sony Corporation
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Sony not be used in advertising or
+ * publicity pertaining to distribution of the software without specific,
+ * written prior permission.  Sony makes no representations about the
+ * suitability of this software for any purpose.  It is provided "as is"
+ * without express or implied warranty.
+ *
+ * SONY DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL SONY
+ * BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
+ * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN 
+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+/*
+ * Author: Naoshi Suzuki, SONY Corporation.  (nao@sm.sony.co.jp)
+ */
+
+#include <ctype.h>
+#include <stdio.h>
+#include "common.h"
+#include "sj3ctype.h"
+#include "segment.h"
+
+extern Xsj3cCVServerIF      serverIF[SERVER_NUM];
+
+int                         in_lang = JP_EUC;
+int                         out_lang = JP_EUC;
+int                         locked[SERVER_NUM] = {0};
+Xsj3ccMode                  KanaMask = 0;
+
+void                        Xsj3cSetInLang();
+void                        Xsj3cSetOutLang();
+void                        Xsj3cError();
+void                        Xsj3cWarning();
+
+int                         _Xsj3cwPStowOUT();
+int                         _Xsj3cwOUTtowPS();
+int                         _Xsj3cmPStowPS();
+int                         _Xsj3cmPStowOUT();
+int                         _Xsj3cmPStowPSn();
+int                         _Xsj3cmPStowOUTn();
+void                        _Xsj3cwPStomPS();
+void                        _Xsj3cwOUTtomPS();
+
+int                         _Xsj3cCmp();
+int                         _Xsj3cWcpy();
+void                        _Xsj3cWcat();
+int                         _Xsj3cWlen();
+char                       *_Xsj3cItoa();
+char                       *_Xsj3cXtoa();
+
+void                        _Xsj3cInsertChar();
+void                        _Xsj3cInsertWchar();
+void                        _Xsj3cExtractChar();
+void                        _Xsj3cStoreYomi();
+int                         _Xsj3cStoreKanji();
+
+void                        _Xsj3cFlushDcid();
+void                        _Xsj3cClearDcid();
+
+Xsj3csMode                  _Xsj3cCheckMode();
+
+extern wchar                _Xsj3csjis2euc();
+extern wchar                _Xsj3csjis2jis();
+extern wchar                _Xsj3ceuc2sjis();
+extern wchar                _Xsj3ceuc2jis();
+extern wchar                _Xsj3cjis2sjis();
+extern wchar                _Xsj3cjis2euc();
+
+wchar (*CodeConvFunc[4][4])() = {
+    NULL,            _Xsj3csjis2euc,  _Xsj3csjis2jis,  _Xsj3csjis2jis,
+    _Xsj3ceuc2sjis,  NULL,            _Xsj3ceuc2jis,   _Xsj3ceuc2jis,
+    _Xsj3cjis2sjis,  _Xsj3cjis2euc,   NULL,            NULL,
+    _Xsj3cjis2sjis,  _Xsj3cjis2euc,   NULL,            NULL
+};
+
+/*
+ * Xsj3cSetInLang()
+ *  Set input LANG
+ */
+void
+Xsj3cSetInLang(lang)
+    int     lang;
+{
+    in_lang = lang;
+}
+
+/*
+ * Xsj3cSetOutLang()
+ *  Set output LANG
+ */
+void
+Xsj3cSetOutLang(lang)
+    int     lang;
+{
+    out_lang = lang;
+}
+
+/*
+ * Xsj3cSetKanaMod()
+ *  Set output LANG
+ */
+void
+Xsj3cSetKanaMod(mod)
+    unsigned long   mod;
+{
+    KanaMask = mod;
+}
+
+/*
+ * Xsj3cWarning()
+ *  Print warning messages. (limit of 10 args)
+ */
+/*VARARGS1*/
+void
+Xsj3cWarning(message, s0, s1, s2, s3, s4, s5, s6, s7, s8, s9)
+    char   *message;
+    char   *s0, *s1, *s2, *s3, *s4, *s5, *s6, *s7, *s8, *s9;
+{
+    (void)fprintf(stderr, "Xsj3cWarning: ");
+    if (message && *message) {
+       (void)fprintf(stderr, message, s0, s1, s2, s3, s4, s5, s6, s7, s8, s9);
+       (void)fprintf(stderr, "\n");
+    }
+    return;
+}
+
+/*
+ * Xsj3cError()
+ *  Print error messages and exit. (limit of 10 args)
+ */
+/*VARARGS1*/
+void
+Xsj3cError(message, s0, s1, s2, s3, s4, s5, s6, s7, s8, s9)
+    char   *message;
+    char   *s0, *s1, *s2, *s3, *s4, *s5, *s6, *s7, *s8, *s9;
+{
+    (void)fprintf(stderr, "Xsj3cError: ");
+    if (message && *message) {
+       (void)fprintf(stderr, message, s0, s1, s2, s3, s4, s5, s6, s7, s8, s9);
+       (void)fprintf(stderr, "\n");
+    }
+    exit(1);
+}
+
+/*
+ * _Xsj3cwPStowOUT()
+ *  Convert string(unsigned short) code from process code to out_lang.
+ */
+int
+_Xsj3cwPStowOUT(buf, p, q)
+    Xsj3cBuf                buf;
+    register wchar         *p, *q;
+{
+    register int            i = 0;
+    register wchar          (*conv)();
+
+    if (p == NULL)
+        return i;
+    if (conv = CodeConvFunc[serverIF[buf->server].lang][out_lang]) {
+        while (*q != '\0') {
+            i++;
+            if (iskan1(*q >> 8, serverIF[buf->server].lang)
+                    && iskan2(0xff & *q, serverIF[buf->server].lang)) {
+                *p++ = conv(*q++);
+                continue;
+            } else if (iseuckana(*q >> 8)) {
+                *p++ = 0xff & *q++;
+                continue;
+            }
+            *p++ = *q++;
+        }
+    } else {
+        while (*p++ = *q++) i++;
+        return i;
+    }
+    *p = '\0';
+    return i;
+}
+
+/*
+ * _Xsj3cwOUTtowPS()
+ *  Convert string(unsigned short) code from out_lang to process code.
+ */
+int
+_Xsj3cwOUTtowPS(buf, p, q)
+    Xsj3cBuf                buf;
+    register wchar         *p, *q;
+{
+    register int            i = 0;
+    register wchar          (*conv)();
+
+    if (p == NULL)
+        return i;
+    if (conv = CodeConvFunc[out_lang][serverIF[buf->server].lang]) {
+        while (*q != '\0') {
+            i++;
+            if (*q & 0xff00) {
+                *p++ = conv(*q++);
+                continue;
+            }
+            *p++ = *q++;
+        }
+    } else {
+        while (*p++ = *q++) i++;
+        return i;
+    }
+    *p = '\0';
+    return i;
+}
+
+/*
+ * _Xsj3cCmp()
+ *  Compare 2 words in lower and if they are matched, return True(1).
+ * Unless they are matched, return False(0).
+ */
+int
+_Xsj3cCmp(s1, s2)
+    register char  *s1, *s2;
+{
+    register char   c1, c2;
+
+    while (*s1 != '\0') {
+        c1 = *s1++;
+        c2 = *s2++;
+        if (tolower(c1) != tolower(c2))
+            return 0;
+    } 
+    if (s2 && *s2 != '\0')
+        return 0;
+    return 1;
+}
+
+/*
+ * _Xsj3cmPStowPS()
+ *  Multi bytes character(2nd arg.) to wide character(1st arg.)
+ * conversion routine. (Only for Shift-JIS code)
+ */
+int
+_Xsj3cmPStowPS(buf, w, m)
+    Xsj3cBuf                    buf;
+    register wchar             *w;
+    register unsigned char     *m;
+{
+    register unsigned char      c;
+    register int                i = 0;
+
+    while ((c = *m++) != '\0') {
+        if (iskan1(c, serverIF[buf->server].lang)
+                && iskan2(*m, serverIF[buf->server].lang)) {
+            *w++ = (c << 8) + *m++;
+        } else {
+            *w++ = 0xff & c;
+        }
+        i++;
+    }
+    *w = '\0';
+    return i;
+}
+
+/*
+ * _Xsj3cmPStowOUT()
+ *  Multi bytes character(2nd arg.) to wide character(1st arg.)
+ * conversion routine.
+ */
+int
+_Xsj3cmPStowOUT(buf, w, m)
+    Xsj3cBuf                    buf;
+    register wchar             *w;
+    register unsigned char     *m;
+{
+    register unsigned char      c;
+    register int                i = 0;
+    register wchar              (*conv)();
+
+    if (conv = CodeConvFunc[serverIF[buf->server].lang][out_lang]) {
+        while ((c = *m++) != '\0') {
+            if (iskan1(c, serverIF[buf->server].lang)
+                    && iskan2(*m, serverIF[buf->server].lang)) {
+                *w++ = conv((c << 8) + *m++);
+            } else {
+                *w++ = 0xff & c;
+            }
+            i++;
+        }
+    } else {
+        while ((c = *m++) != '\0') {
+            if (iskan1(c, serverIF[buf->server].lang)
+                    && iskan2(*m, serverIF[buf->server].lang)) {
+                *w++ = (c << 8) + *m++;
+            } else {
+                *w++ = 0xff & c;
+            }
+            i++;
+        }
+    }
+    *w = '\0';
+    return i;
+}
+
+/*
+ * _Xsj3cmPStowPSn()
+ *  Multi bytes character(2nd arg.) to wide character(1st arg.)
+ * conversion routine. (Maximum n(3rd arg.) bytes)
+ */
+int
+_Xsj3cmPStowPSn(buf, w, m, n)
+    Xsj3cBuf                    buf;
+    register wchar             *w;
+    register unsigned char     *m;
+    register int                n;
+{
+    register unsigned char      c;
+    register int                i = 0;
+
+    while ((c = *m++) != '\0' && n--) {
+        if (iskan1(c, serverIF[buf->server].lang)
+                && iskan2(*m, serverIF[buf->server].lang)) {
+            *w++ = (c << 8) + *m++;
+            n--;
+        } else {
+            *w++ = 0xff & c;
+        }
+        i++;
+    }
+    *w = '\0';
+    return i;
+}
+
+/*
+ * _Xsj3cmPStowOUTn()
+ *  Multi bytes character(2nd arg.) to wide character(1st arg.)
+ * conversion routine. (Maximum n(3rd arg.) bytes)
+ */
+int
+_Xsj3cmPStowOUTn(buf, w, m, n)
+    Xsj3cBuf                    buf;
+    register wchar             *w;
+    register unsigned char     *m;
+    register int                n;
+{
+    register unsigned char      c;
+    register int                i = 0;
+    register wchar              (*conv)();
+
+    if (conv = CodeConvFunc[serverIF[buf->server].lang][out_lang]) {
+        while ((c = *m++) != '\0' && n--) {
+            if (iskan1(c, serverIF[buf->server].lang)
+                    && iskan2(*m, serverIF[buf->server].lang)) {
+                *w++ = conv((c << 8) + *m++);
+                n--;
+            } else {
+                *w++ = 0xff & c;
+            }
+            i++;
+        }
+    } else {
+        while ((c = *m++) != '\0' && n--) {
+            if (iskan1(c, serverIF[buf->server].lang)
+                    && iskan2(*m, serverIF[buf->server].lang)) {
+                *w++ = (c << 8) + *m++;
+                n--;
+            } else {
+                *w++ = 0xff & c;
+            }
+            i++;
+        }
+    }
+    *w = '\0';
+    return i;
+}
+
+/*
+ * _Xsj3cwPStomPS()
+ *  Convert wide character(2nd arg.) to multi bytes characters(1st arg.).
+ * (Only for Shift-JIS code)
+ */
+void
+_Xsj3cwPStomPS(buf, m, w)
+    Xsj3cBuf                    buf;
+    register unsigned char     *m;
+    register wchar             *w;
+{
+    register unsigned char      c1,   c2;
+
+    while (*w != '\0') {
+        c1 = *w >> 8;
+        c2 = *w & 0xff;
+        if (iskan1(c1, serverIF[buf->server].lang)
+                    && iskan2(c2, serverIF[buf->server].lang)) {
+            *m++ = c1;
+            *m++ = c2;
+        } else {
+            *m++ = c2;
+        }
+        w++;
+    }
+    *m = '\0';
+}
+
+/*
+ * _Xsj3cwOUTtomPS()
+ *  Convert wide character(2nd arg.) to multi bytes characters(1st arg.).
+ */
+void
+_Xsj3cwOUTtomPS(buf, m, w)
+    Xsj3cBuf                    buf;
+    register unsigned char     *m;
+    register wchar             *w;
+{
+    register wchar              (*conv)();
+    register wchar              s;
+
+    if (conv = CodeConvFunc[out_lang][serverIF[buf->server].lang]) {
+        while (*w != '\0') {
+            if (*w & 0xff00) {
+                s = conv(*w);
+                *m++ = s >> 8;
+                *m++ = s & 0xff;
+            } else {
+                *m++ = (*w & 0xff);
+            }
+            w++;
+        }
+    } else {
+        while (*w != '\0') {
+            if (*w & 0xff00) {
+                *m++ = *w >> 8;
+                *m++ = *w & 0xff;
+            } else {
+                *m++ = *w & 0xff;
+            }
+            w++;
+        }
+    }
+    *m = '\0';
+}
+
+/*
+ * _Xsj3cWcpy()
+ *  Copy wide characters(2nd arg.) to wide characters(1st arg.)
+ */
+int
+_Xsj3cWcpy(w1, w2)
+    register wchar             *w1,    *w2;
+{
+    register int                i = 0;
+
+    while (*w1++ = *w2++) i++;
+    return i;
+}
+
+/*
+ * _Xsj3cWcat()
+ *  Appends a copy of  wide character(2nd arg.) to
+ * the end of wide character(1st arg.).
+ */
+void
+_Xsj3cWcat(w1, w2)
+    register wchar             *w1,    *w2;
+{
+    while (*w1++);
+    w1--;
+    while (*w1++ = *w2++);
+}
+
+/*
+ * _Xsj3cWlen()
+ *  Returns the number of characters in 1st arg.
+ */
+int
+_Xsj3cWlen(w)
+    register wchar             *w;
+{
+    register int                i = 0;
+
+    while (*w++)
+        i++;
+    return i;
+}
+
+/*
+ * _Xsj3cItoa()
+ *  Converts digit number to string type and returns it.
+ */
+char *
+_Xsj3cItoa(num)
+    register int                num;
+{
+    register int                i,  bnum;
+    static char                 ch[24];
+
+    i = 20;
+    ch[i]= '\0';
+    while (num > 9) {
+        bnum = num;
+        num /= 10;
+        ch[--i] = bnum - num * 10 + '0';
+    }
+    ch[--i] = num + '0';
+    return (&ch[i]);
+}
+
+/*
+ * _Xsj3cXtoa()
+ *  Converts hex number to string type and returns it.
+ */
+char *
+_Xsj3cXtoa(num)
+    register int                num;
+{
+    register int                i,  bnum,   anum;
+    static char                 ch[20];
+
+    i = 18;
+    ch[i]= '\0';
+    while (num) {
+        bnum = num;
+        num >>= 4;
+        if ((anum = (bnum - (num << 4))) > 9)
+            ch[--i] = anum + 'W';
+        else
+            ch[--i] = anum + '0';
+    }
+    ch[--i] = 'x';
+    ch[--i] = '0';
+    return (&ch[i]);
+}
+
+/*
+ * _Xsj3cInsertChar()
+ *  Convert multi bytes characters(2nd arg.) to wide characters and 
+ * insert them (n characters) to yomi buffer after current position.
+ * (Only for Shift-JIS code)
+ */
+void
+_Xsj3cInsertChar(buf, seg, m, n)
+    Xsj3cBuf                    buf;
+    register Xsj3cSeg           seg;
+    register unsigned char     *m;
+    register int                n;
+{
+    register unsigned char      c;
+    register int                i = seg->num;
+
+    while (i >= seg->cur) {
+        seg->yomi[i + n] = seg->yomi[i];
+        i--;
+    }
+    
+    i = n;
+    while ((c = *m++) != '\0'&& i--) {
+        if (iskan1(c, serverIF[buf->server].lang)
+                && iskan2(*m, serverIF[buf->server].lang)) {
+            seg->yomi[seg->cur++] = (c << 8) + *m++;
+        } else {
+            seg->yomi[seg->cur++] = 0xff & c;
+        }
+    }
+    seg->num += n;
+}
+
+/*
+ * _Xsj3cInsertWchar()
+ * insert wide characters to yomi buffer after current position.
+ * (Only for Shift-JIS code)
+ */
+void
+_Xsj3cInsertWchar(seg, w, n)
+    register Xsj3cSeg           seg;
+    register wchar             *w;
+    register int                n;
+{
+    register int                i = seg->num;
+
+    while (i >= seg->cur) {
+        seg->yomi[i + n] = seg->yomi[i];
+        i--;
+    }
+    
+    i = n;
+    while (*w != '\0' && i--) {
+        seg->yomi[seg->cur++] = *w++;
+    }
+    seg->num += n;
+}
+
+/*
+ * _Xsj3cExtractChar()
+ *  Extract n characters before current postsion from yomi buffer
+ * and convert them to multi bytes character(1st arg.).
+ * (Only for Shift-JIS code)
+ */
+void
+_Xsj3cExtractChar(buf, seg, m, n)
+    Xsj3cBuf                    buf;
+    register Xsj3cSeg           seg;
+    register unsigned char     *m;
+    register int                n;
+{
+    register int                i = seg->cur - n,    j = n;
+    register unsigned char      c1,   c2;
+
+    while ((seg->yomi[i]) != '\0' && j--) {
+        c1 = seg->yomi[i] >> 8;
+        c2 = seg->yomi[i] & 0xff;
+        if (iskan1(c1, serverIF[buf->server].lang)
+                && iskan2(c2, serverIF[buf->server].lang)) {
+            *m++ = c1;
+            *m++ = c2;
+        } else {
+            *m++ = c2;
+        }
+        i++;
+    }
+    *m = '\0';
+    seg->cur -= n;
+    j = seg->cur;
+    while (i < seg->num) {
+        seg->yomi[j++] = seg->yomi[i++];
+    }
+    seg->yomi[j] = '\0';
+    seg->num -= n;
+}
+
+/*
+ * _Xsj3cStoreYomi()
+ *  Convert code of internal yomi buffer from Shift-JIS to EUC
+ * and put it to display yomi buffer.
+ */
+void
+_Xsj3cStoreYomi(buf, seg, pos)
+    Xsj3cBuf                    buf;
+    register Xsj3cSeg           seg;
+    register int                pos;
+{
+    register int                i;
+    register wchar              (*conv)();
+
+    if (conv = CodeConvFunc[serverIF[buf->server].lang][out_lang]) {
+        for (i = pos; i < seg->num; i++) {
+            if (seg->yomi[i] & 0xff00)
+                seg->disp[i] = conv(seg->yomi[i]);
+            else
+                seg->disp[i] = seg->yomi[i];
+        }
+    } else {
+        for (i = pos; i < seg->num; i++)
+            seg->disp[i] = seg->yomi[i];
+    }
+    seg->disp[i] = '\0';
+    seg->dnum = seg->num;
+}
+
+/*
+ * _Xsj3cStoreKanji()
+ *  Store converted strings to converted display buffers.
+ * (src-buffer and dest-buffer)
+ */
+int
+_Xsj3cStoreKanji(buf, bun, cur, num, change)
+    Xsj3cBuf                buf;
+    SJ3_BUNSETU            *bun;
+    int                     cur,    num,    change;
+{
+    register int            i,  j;
+
+    if (num > 1) {
+        for (i = buf->segnum - 1; i > cur; i--) {
+            j = i + num - 1;
+            buf->input[j] = buf->input[i];
+        }
+        for (i = cur + 1; i < cur + num; i++)
+            buf->input[i] = NULL;
+    }
+    for (i = cur; i < cur + num; i++, bun++) {
+        if (!buf->input[i]) 
+            buf->input[i] = (Xsj3cSeg)Xsj3cCreateSegment(buf);
+        else 
+            Xsj3cResizeSegment(buf->input[i], KANABUFSIZ);
+        buf->input[i]->num = _Xsj3cmPStowPSn(buf, buf->input[i]->yomi,
+                bun->srcstr, bun->srclen);
+        if (bun->deststr && bun->destlen) {
+            buf->input[i]->dnum = _Xsj3cmPStowOUTn(buf, buf->input[i]->disp,
+                    bun->deststr, bun->destlen);
+        } else {
+            _Xsj3cStoreYomi(buf, buf->input[i], 0);
+        }
+        buf->input[i]->status = SEG_CONVED;
+        buf->input[i]->cur = 0;
+        buf->input[i]->change = change;
+        buf->input[i]->edit = SEG_NOEDIT;
+        buf->input[i]->dcid = bun->dcid;
+        buf->input[i]->cursegmode = _Xsj3cCheckMode(buf, buf->input[i]);
+    }
+    if (buf->gakusyuu && buf->convmode == InputModeMask) {
+        serverIF[buf->server].func[FUNC_LOCK]();
+        locked[buf->server]++;
+    } else if (!buf->gakusyuu) {
+        for (i = cur; i < num; i++) 
+            bzero(&(buf->input[i]->dcid), sizeof(buf->input[i]->dcid));
+    }
+}
+
+/*
+ * _Xsj3cCheckMode()
+ *  Check character mode of the yomi buffer of segment.
+ */
+Xsj3csMode
+_Xsj3cCheckMode(buf, seg)
+    Xsj3cBuf                    buf;
+    register Xsj3cSeg           seg;
+{
+    register unsigned char      c1, c2;
+
+    c1 = seg->yomi[0] >> 8;
+    c2 = seg->yomi[0] & 0xff;
+    if (c2 != '\0') {
+        if (iskan1(c1, serverIF[buf->server].lang)
+                && iskan2(c2, serverIF[buf->server].lang)) {
+            if (iskata(seg->yomi[0], serverIF[buf->server].lang))
+                return (MODE_ZKATA);
+            else if (iszalpha(seg->yomi[0], serverIF[buf->server].lang))
+                return (MODE_ZALPHA);
+            else
+                return (MODE_HIRA);
+        } else {
+            if (iskana(c2))
+                return (MODE_HKATA);
+            else
+                return (MODE_HALPHA);
+        }
+    } else {
+        return (MODE_HIRA);
+    }
+}
+
+/*
+ * _Xsj3cFlushDcid()
+ *  Flush dictionary-id.
+ */
+void
+_Xsj3cFlushDcid(buf)
+    Xsj3cBuf        buf;
+{
+    register int    i;
+    unsigned char   mbs[2][KANJIBUFSIZ];
+
+    if (buf->gakusyuu) {
+        for (i = 0; i < buf->segnum; i++) {
+            if (buf->input[i]->change) {
+                if (i < buf->segnum - 1) {
+                    _Xsj3cwPStomPS(buf, mbs[0], buf->input[i]->yomi);
+                    _Xsj3cwPStomPS(buf, mbs[1], buf->input[i + 1]->yomi);
+                    if ((serverIF[buf->server].func[FUNC_STUDY2]
+            (mbs[0], mbs[1], &buf->input[i + 1]->dcid)) < 0) {
+                        Xsj3cWarning("sj3serv is down. reconnect please");
+                    }
+                }
+                if (i) {
+                    if (i == buf->segnum - 1)
+                        _Xsj3cwPStomPS(buf, mbs[0], buf->input[i]->yomi);
+                    _Xsj3cwPStomPS(buf, mbs[1], buf->input[i - 1]->yomi);
+                    if ((serverIF[buf->server].func[FUNC_STUDY2]
+            (mbs[1], mbs[0], &buf->input[i]->dcid)) < 0) {
+                        Xsj3cWarning("sj3serv is down. reconnect please");
+                    }
+                } else if (buf->segnum == 1) {
+                    _Xsj3cwPStomPS(buf, mbs[0], buf->input[0]->yomi);
+                    if ((serverIF[buf->server].func[FUNC_STUDY2]
+            (mbs[0], mbs[0], &buf->input[0]->dcid)) < 0) {
+                        Xsj3cWarning("sj3serv is down. reconnect please");
+                    }
+                }
+                buf->input[i]->change = OFF;
+            }
+        }
+        buf->convedsegnum = 0;
+        if (locked[buf->server] > 0) {
+            if (!(--locked[buf->server]))
+            serverIF[buf->server].func[FUNC_UNLOCK]();
+        }
+    }
+}
+
+/*
+ * _Xsj3cClearDcid()
+ *  Clear dictionary-id.
+ */
+void
+_Xsj3cClearDcid(buf)
+    Xsj3cBuf        buf;
+{
+    register int    i;
+
+    for (i = 0; i < buf->segnum; i++) {
+        buf->input[i]->change = OFF;
+        bzero(&(buf->input[i]->dcid), sizeof(buf->input[i]->dcid));
+    }
+    if (locked[buf->server] > 0) {
+        if (!(--locked[buf->server]))
+        serverIF[buf->server].func[FUNC_UNLOCK]();
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/Xsj3clib/util.h	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,60 @@
+/* $Id: util.h,v 2.1 1993/09/21 09:41:39 nao Exp $ */
+/*
+ * Copyright 1991 Sony Corporation
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Sony not be used in advertising or
+ * publicity pertaining to distribution of the software without specific,
+ * written prior permission.  Sony makes no representations about the
+ * suitability of this software for any purpose.  It is provided "as is"
+ * without express or implied warranty.
+ *
+ * SONY DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL SONY
+ * BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
+ * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN 
+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+/*
+ * Author: Naoshi Suzuki, SONY Corporation.  (nao@sm.sony.co.jp)
+ */
+
+extern void                 Xsj3cError();
+extern void                 Xsj3cWarning();
+
+extern int                  _Xsj3cwPStowOUT();
+extern int                  _Xsj3cwOUTtowPS();
+extern int                  _Xsj3cmPStowPS();
+extern int                  _Xsj3cmPStowOUT();
+extern int                  _Xsj3cmPStowPSn();
+extern int                  _Xsj3cmPStowOUTn();
+extern void                 _Xsj3cwPStomPS();
+extern void                 _Xsj3cwOUTtomPS();
+
+extern int                  _Xsj3cCmp();
+extern int                  _Xsj3cWcpy();
+extern void                 _Xsj3cWcat();
+extern int                  _Xsj3cWlen();
+extern char                *_Xsj3cItoa();
+extern char                *_Xsj3cXtoa();
+
+extern void                 _Xsj3cInsertChar();
+extern void                 _Xsj3cInsertWchar();
+extern void                 _Xsj3cExtractChar();
+extern void                 _Xsj3cStoreYomi();
+extern int                  _Xsj3cStoreKanji();
+
+extern void                 _Xsj3cFlushDcid();
+extern void                 _Xsj3cClearDcid();
+
+extern Xsj3ccMode           _Xsj3cCheckMode();
+
+extern int                  in_lang,    out_lang;
+extern int                  locked[SERVER_NUM];
+extern unsigned long        KanaMask;
+
+extern wchar                (*CodeConvFunc[4][4])();
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/asyncerr.c	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,275 @@
+#ifndef lint
+static char *rcsid = "$Id: asyncerr.c,v 1.6 1994/08/08 01:20:52 ishisone Exp $";
+#endif
+/*
+ * Copyright (C) 1992, 1994  Software Research Associates, Inc.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted, provided
+ * that the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Software Research Associates not be
+ * used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission.  Software Research
+ * Associates makes no representations about the suitability of this software
+ * for any purpose.  It is provided "as is" without express or implied
+ * warranty.
+ *
+ * Author:  Makoto Ishisone, Software Research Associates, Inc., Japan
+ */
+
+/*
+ *	X asyncronous error handler
+ */
+
+#include <X11/Xlib.h>
+#include <X11/Xfuncproto.h>
+#include "AsyncErr.h"
+
+#ifdef __STDC__
+#include <stdlib.h>
+#else
+extern char *malloc();
+#endif
+
+#ifndef NULL
+#define NULL 0
+#endif
+
+#undef XSetErrorHandler
+
+typedef struct fe_errdesc_ {
+    struct fe_errdesc_ *prev;
+    struct fe_errdesc_ *next;
+    Display *dpy;
+    unsigned long from;		/* range of the sequence numbers */
+    unsigned long to;		/* which this handler covers */
+    int (*handler)();		/* async handler */
+    void (*destroy)();
+    XPointer client_data;
+} ErrDesc;
+
+static ErrDesc esentinel = {
+    &esentinel,
+    &esentinel,
+};
+
+#define EHEAD	(esentinel.next)
+#define ETAIL	(esentinel.prev)
+#define EEND(p)	((p) == &esentinel)
+
+static int (*original_handler)();
+
+/*
+ * Some useful handlers
+ */
+
+/* ARGSUSED */
+static int
+ignoreErrors(dpy, eev, cldata)
+Display *dpy;
+XErrorEvent *eev;
+XPointer cldata;
+{
+    /*
+     * Just ignore any errors.
+     */
+    return 0;
+}
+
+/* ARGSUSED */
+static int
+recordErrors(dpy, eev, cldata)
+Display *dpy;
+XErrorEvent *eev;
+XPointer cldata;
+{
+    /*
+     * Record the type of the error.
+     * It assumes that the client data is a pointer to
+     * an unsigned long int.  If error occurs, it does:
+     *   + if the error code is less than 32, set the 'error code'th bit.
+     *   + otherwise (i.e. extension defined error) set the bit 0.
+     */
+    unsigned long *errorbitsp = (unsigned long *)cldata;
+
+    if (eev->error_code < 32) {
+	*errorbitsp |= (1 << eev->error_code);
+    } else {
+	/* other errors */
+	*errorbitsp |= 1;
+    }
+
+    /* don't invoke global handler */
+    return 0;
+}
+
+static ErrDesc *
+newErrDesc()
+{
+    return (ErrDesc *)malloc(sizeof(ErrDesc));
+}
+
+static void
+eremove(edp)
+ErrDesc *edp;
+{
+    edp->prev->next = edp->next;
+    edp->next->prev = edp->prev;
+}
+
+static void
+eappend(edp)
+ErrDesc *edp;
+{
+    edp->prev = esentinel.prev;
+    edp->next = &esentinel;
+    (esentinel.prev)->next = edp;
+    esentinel.prev = edp;
+}
+
+static void
+removeHandler(edp)
+ErrDesc *edp;
+{
+    if (edp->destroy != NULL) (*edp->destroy)(edp->dpy, edp->client_data);
+    eremove(edp);
+    (void)free((char *)edp);
+}
+
+static int
+callHandlers(dpy, eev)
+Display *dpy;
+XErrorEvent *eev;
+{
+    ErrDesc *edp = EHEAD;
+    int found = 0;
+    int call_original = 0;
+
+    while (!EEND(edp)) {
+	if (edp->dpy == dpy && edp->from <= eev->serial &&
+	    (eev->serial < edp->to || edp->from == edp->to)) {
+	    found = 1;
+	    if ((*edp->handler)(dpy, eev, edp->client_data)) call_original = 1;
+	}
+	edp = edp->next;
+    }
+    return !found || call_original;
+}
+
+static void
+removeHandlers(dpy)
+Display *dpy;
+{
+    /*
+     * Remove obsolete (out of date) handlers.
+     */
+    ErrDesc *edp = EHEAD;
+    unsigned long last = LastKnownRequestProcessed(dpy);
+
+    while (!EEND(edp)) {
+	ErrDesc *next = edp->next;
+
+	if (edp->dpy == dpy && edp->to <= last && edp->from != edp->to) {
+	    removeHandler(edp);
+	}
+	edp = next;
+    }
+}
+
+/*
+ * public functions
+ */
+
+int
+XAEHandler(dpy, eev)
+Display *dpy;
+XErrorEvent *eev;
+{
+    if (callHandlers(dpy, eev) && original_handler != NULL) {
+	(void)original_handler(dpy, eev);
+    }
+    removeHandlers(dpy);
+    return 0;	/* for lint */
+}
+
+void
+XAEInit()
+{
+    int (*oldhandler)() = XSetErrorHandler(XAEHandler);
+
+    if (oldhandler != XAEHandler) original_handler = oldhandler;
+}
+
+XErrorHandler
+XAESetErrorHandler(handler)
+XErrorHandler handler;
+{
+    int (*oldhandler)();
+
+    oldhandler = original_handler;
+    original_handler = handler;
+    return oldhandler;
+}
+
+XAEHandle
+XAESet(dpy, handler, destroy, client_data)
+Display *dpy;
+int (*handler)();
+void (*destroy)();
+XPointer client_data;
+{
+    ErrDesc *e;
+
+    /*
+     * First, remove out-of-date handlers.
+     */
+    removeHandlers(dpy);
+
+    /*
+     * Allocate new ErrDesc structure.
+     */
+    e = newErrDesc();
+    if (e == NULL) return NULL;
+
+    e->dpy = dpy;
+    e->from = NextRequest(dpy);
+    e->to = e->from;
+    e->handler = handler;
+    e->destroy = destroy;
+    e->client_data = client_data;
+
+    eappend(e);
+
+    return e;
+}
+
+void
+XAEUnset(handle)
+XAEHandle handle;
+{
+    Display *dpy = handle->dpy;
+
+    if (handle != NULL && handle->from == handle->to) {
+	handle->to = NextRequest(dpy);
+	if (handle->to <= handle->from) removeHandler(handle);
+    }
+    removeHandlers(dpy);
+}
+
+XAEHandle
+XAESetIgnoreErrors(dpy)
+Display *dpy;
+{
+    return XAESet(dpy, ignoreErrors, (void (*)())NULL, (XPointer)NULL);
+}
+
+XAEHandle
+XAESetRecordErrors(dpy, errorbitsp)
+Display *dpy;
+unsigned long *errorbitsp;
+{
+    *errorbitsp = 0L;		/* clear all bits */
+    return XAESet(dpy, recordErrors,
+		  (void (*)())NULL, (XPointer)errorbitsp);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/cachedatom.c	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,210 @@
+#ifndef lint
+static char *rcsid = "$Id: cachedatom.c,v 1.9 1994/05/17 04:48:01 ishisone Rel $";
+#endif
+/*
+ * Copyright (c) 1991  Software Research Associates, Inc.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted, provided
+ * that the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Software Research Associates not be
+ * used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission.  Software Research
+ * Associates makes no representations about the suitability of this software
+ * for any purpose.  It is provided "as is" without express or implied
+ * warranty.
+ *
+ * Author:  Makoto Ishisone, Software Research Associates, Inc., Japan
+ *
+ *  neither R5 Xlib nor Xmu doesn't do what I want, so I wrote one myself.
+ */
+
+#include <X11/Intrinsic.h>
+#include "CachedAtom.h"
+
+#define DEBUG_VAR debug_cachedatom
+#include "DebugPrint.h"
+
+typedef struct _atomrec_ {
+    Atom atom;				/* atom number */
+    Display *dpy;
+    String name;			/* for obtaining atom name */
+    struct _atomrec_ *nextOfName;	/* next element of atom name list */
+    struct _atomrec_ *nextOfNumber;	/* next element of atom number list */
+} CachedAtomRec;
+
+typedef struct _cAtomNameRec_ {
+    String name;			/* atom name */
+    CachedAtomRec atomrec;		/* caution: not a pointer! */
+    struct _cAtomNameRec_ *next;	/* next entry of the same hash value */
+} CachedAtomNameRec;
+
+#define NAMEHASHSIZE	128
+#define NUMBERHASHSIZE	128
+
+static CachedAtomNameRec *nameHash[NAMEHASHSIZE];
+					/* for searching by name */
+static CachedAtomRec *numberHash[NUMBERHASHSIZE];
+					/* for searching by number */
+
+
+/*
+ * iternal functions
+ */
+
+static int
+nameHashFunc(s)
+String s;
+{
+    register String sp = s;
+    register int c, sum;
+
+    sum = 0;
+    while ((c = *sp++) != '\0') sum += c;
+
+    return (sum ^ (sp - s)) % NAMEHASHSIZE;
+}
+
+#define numberHashFunc(atom)	((int)((atom) % NUMBERHASHSIZE))
+
+static CachedAtomRec *
+newAtomRec(dpy, atom, arp, nrp)
+Display *dpy;
+Atom atom;
+CachedAtomRec *arp;	/* NULL (create new rec) or &nrp->atomrec */
+CachedAtomNameRec *nrp;
+{
+    int hashvalue;
+
+    if (arp == NULL) arp = XtNew(CachedAtomRec);
+    arp->atom = atom;
+    arp->dpy = dpy;
+    arp->name = nrp->name;
+
+    if (arp == &(nrp->atomrec)) {
+	arp->nextOfName = NULL;
+    } else {
+	arp->nextOfName = nrp->atomrec.nextOfName;
+	nrp->atomrec.nextOfName = arp;
+    }
+
+    /* insert it in numberHash */
+    hashvalue = numberHashFunc(atom);
+    arp->nextOfNumber = numberHash[hashvalue];
+    numberHash[numberHashFunc(atom)] = arp;
+
+    return arp;
+}
+
+static CachedAtomNameRec *
+newNameRec(name, hashvalue)
+String name;
+int hashvalue;
+{
+    CachedAtomNameRec *nrp = XtNew(CachedAtomNameRec);
+
+    nrp->name = XtNewString(name);
+    nrp->next = nameHash[hashvalue];
+    nameHash[hashvalue] = nrp;
+    return nrp;
+}
+    
+/*
+ * public functions
+ */
+
+Atom
+CachedInternAtom(dpy, name, exists)
+Display *dpy;
+char *name;
+Bool exists;
+{
+    int hashvalue = nameHashFunc(name);
+    CachedAtomNameRec *nrp = nameHash[hashvalue];
+    Atom atom;
+
+    TRACE(("CachedInternAtom(name:%s)...  ", name));
+    while (nrp != NULL) {
+	if (!strcmp(nrp->name, name)) {
+	    CachedAtomRec *arp = &(nrp->atomrec);
+
+	    do {
+		if (arp->dpy == dpy) {
+		    TRACE(("found in the cache (%ld)\n", arp->atom));
+		    return arp->atom;
+		}
+		arp = arp->nextOfName;
+	    } while (arp != NULL);
+
+	    TRACE(("not in the cache\n"));
+	    if ((atom = XInternAtom(dpy, name, exists)) == None) return None;
+	    (void)newAtomRec(dpy, atom, (CachedAtomRec *)NULL, nrp);
+	    return atom;
+	}
+	nrp = nrp->next;
+    }
+
+    TRACE(("not in the cache\n"));
+    if ((atom = XInternAtom(dpy, name, exists)) == None) return None;
+    nrp = newNameRec(name, hashvalue);
+    (void)newAtomRec(dpy, atom, &(nrp->atomrec), nrp);
+
+    return atom;
+}
+
+String
+CachedGetAtomName(dpy, atom)
+Display *dpy;
+Atom atom;
+{
+    int hashvalue = numberHashFunc(atom);
+    CachedAtomRec *arp = numberHash[hashvalue];
+    CachedAtomNameRec *nrp;
+    String name;
+
+    TRACE(("CachedGetAtomName(atom=%ld)...  ", atom));
+    while (arp != NULL) {
+	if (arp->atom == atom && arp->dpy == dpy) {
+	    TRACE(("found in the cache (%s)\n", arp->name));
+	    return arp->name;
+	}
+	arp = arp->nextOfNumber;
+    }
+    TRACE(("not in the cache\n"));
+    if ((name = XGetAtomName(dpy, atom)) == NULL) return NULL;
+    hashvalue = nameHashFunc(name);
+    nrp = newNameRec(name, hashvalue);
+    XFree(name);
+    (void)newAtomRec(dpy, atom, &(nrp->atomrec), nrp);
+    return nrp->name;
+}
+
+#ifdef DEBUG
+void
+dumpAtomCache()
+{
+    int i;
+
+    for (i = 0; i < NAMEHASHSIZE; i++) {
+	CachedAtomNameRec *nrp = nameHash[i];
+	int n = 0;
+
+	while (nrp != NULL) {
+	    n++;
+	    nrp = nrp->next;
+	}
+	printf("nameHash[%3d]: %d\n", i, n);
+    }
+    for (i = 0; i < NUMBERHASHSIZE; i++) {
+	CachedAtomRec *arp = numberHash[i];
+	int n = 0;
+
+	while (arp != NULL) {
+	    n++;
+	    arp = arp->nextOfNumber;
+	}
+	printf("numberHash[%3d]: %d\n", i, n);
+    }
+}
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/cachedfont.c	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,271 @@
+#ifndef lint
+static char *rcsid = "$Id: cachedfont.c,v 1.13 1994/05/17 10:51:54 ishisone Rel $";
+#endif
+/*
+ * Copyright (c) 1991  Software Research Associates, Inc.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted, provided
+ * that the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Software Research Associates not be
+ * used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission.  Software Research
+ * Associates makes no representations about the suitability of this software
+ * for any purpose.  It is provided "as is" without express or implied
+ * warranty.
+ *
+ * Author:  Makoto Ishisone, Software Research Associates, Inc., Japan
+ */
+
+#include <X11/Intrinsic.h>
+#include <X11/Xatom.h>
+#include <X11/Xmu/CharSet.h>
+#include "CachedAtom.h"
+#include "CachedFont.h"
+#include "AsyncErr.h"
+
+#define DEBUG_VAR debug_cachedfont
+#include "DebugPrint.h"
+
+typedef struct _fontrec_ {
+    Display *dpy;
+    String *names;		/* full name or aliases... (in lower case) */
+    Cardinal num_names;
+    Atom fontprop;		/* 'FONT' property value */
+    XFontStruct *font;
+    int refcnt;
+    struct _fontrec_ *next;
+} FontRec;
+
+static FontRec	*FRP = NULL;
+
+static FontRec *
+LookupByAtom(dpy, atom)
+Display *dpy;
+Atom atom;
+{
+    register FontRec *frp;
+
+    for (frp = FRP; frp != NULL; frp = frp->next) {
+	if (frp->dpy == dpy && frp->fontprop == atom) return frp;
+    }
+    return NULL;
+}
+
+static FontRec *
+LookupByName(dpy, name)
+Display *dpy;
+String name;
+{
+    register FontRec *frp;
+    register String *names;
+    register Cardinal i;
+
+    for (frp = FRP; frp != NULL; frp = frp->next) {
+	if (frp->dpy != dpy) continue;
+
+	for (i = frp->num_names, names = frp->names; i > 0; i--, names++) {
+	    if (!strcmp(*names, name)) return frp;
+	}
+    }
+    return NULL;
+}
+
+static void
+AddName(frp, name)
+register FontRec *frp;
+String name;
+{
+    String dup = XtNewString(name);
+
+    if (frp->num_names++ == 0) {
+	frp->names = (String *)XtMalloc(sizeof(String));
+    } else {
+	frp->names = (String *)XtRealloc((char *)frp->names,
+					 sizeof(String) * frp->num_names);
+    }
+    frp->names[frp->num_names - 1] = dup;
+}
+
+static void
+LoadFont(frp)
+register FontRec *frp;
+{
+    if (frp->font->fid == None) {
+	frp->font->fid = XLoadFont(frp->dpy, frp->names[0]);
+	frp->refcnt = 0;	/* reset */
+    }
+}
+
+static XFontStruct *
+AddFont(dpy, name)
+Display *dpy;
+char *name;
+{
+    FontRec *frp;
+    XFontStruct *font;
+    Atom fontprop;
+
+    font = XLoadQueryFont(dpy, name);
+    if (font == NULL) return NULL;
+
+    if (!XGetFontProperty(font, XA_FONT, (unsigned long *)&fontprop)) {
+	/* well, make it by myself */
+	DPRINT(("AddFont(): %s doesn't have FONT property\n", name));
+	fontprop = CachedInternAtom(dpy, name, False);
+    }
+
+    if ((frp = LookupByAtom(dpy, fontprop)) != NULL) {
+	/* already loaded. use it */
+	TRACE(("\tfound in the cache (alias name?)\n"));
+	AddName(frp, name);
+	frp->refcnt++;
+	if (frp->font->fid == None) {
+	    frp->font->fid = font->fid;
+	    XFreeFontInfo((char **)NULL, font, 1);
+	} else {
+	    XFreeFont(dpy, font);
+	}
+	return frp->font;
+    }
+
+    TRACE(("\tnot found in the cache\n"));
+    frp = XtNew(FontRec);
+    frp->dpy = dpy;
+    frp->num_names = 0;
+    AddName(frp, name);
+    frp->fontprop = fontprop;
+    frp->font = font;
+    frp->refcnt = 1;
+    frp->next = FRP;
+    FRP = frp;
+
+    return frp->font;
+}
+
+
+/*
+ *	Public functions
+ */
+
+XFontStruct *
+CachedLoadQueryFontByName(dpy, name)
+Display *dpy;
+String name;
+{
+    FontRec *frp;
+    XFontStruct *font;
+    char buf[256];
+    char *loweredname = buf;
+    int len = strlen(name) + 1;
+
+    if (len > sizeof(buf)) loweredname = XtMalloc(len);
+
+    XmuCopyISOLatin1Lowered(loweredname, name);
+
+    TRACE(("CachedLoadQueryFontByName(name=%s)\n", name));
+    if ((frp = LookupByName(dpy, loweredname)) != NULL) {
+	TRACE(("\tfound in the cache\n"));
+	LoadFont(frp);
+	frp->refcnt++;
+	if (loweredname != buf) XtFree(loweredname);
+	return frp->font;
+    }
+
+    font = AddFont(dpy, loweredname);
+    if (loweredname != buf) XtFree(loweredname);
+    return font;
+}
+
+XFontStruct *
+CachedLoadQueryFontByProp(dpy, atom)
+Display *dpy;
+Atom atom;
+{
+    FontRec *frp;
+    XFontStruct *font;
+    String name;
+    XAEHandle h;
+
+    TRACE(("CachedLoadQueryFontByProp(atom=%ld)\n", atom));
+    if ((frp = LookupByAtom(dpy, atom)) != NULL) {
+	TRACE(("\tfound in the cache\n"));
+	LoadFont(frp);
+	frp->refcnt++;
+	return frp->font;
+    }
+
+    /* get fontname */
+    /* make it safe... */
+    h = XAESetIgnoreErrors(dpy);
+    name = CachedGetAtomName(dpy, atom);
+    XAEUnset(h);
+
+    TRACE(("\tnot found. got font name: %s\n", name ? name : "<null>"));
+
+    if (name == NULL) {
+	font = NULL;
+    } else {
+	char buf[256];
+	char *loweredname = buf;
+	int len = strlen(name) + 1;
+
+	if (len > sizeof(buf)) loweredname = XtMalloc(len);
+	XmuCopyISOLatin1Lowered(loweredname, name);
+	font = AddFont(dpy, loweredname);
+	if (loweredname != buf) XtFree(loweredname);
+    }
+    return font;
+}
+
+/* ARGSUSED */
+XFontStruct *
+CachedLoadFontByFontStruct(dpy, font)
+Display *dpy;
+XFontStruct *font;
+{
+    register FontRec *frp;
+
+    TRACE(("CachedLoadFontByFontStruct(fid=%08lx)\n", font->fid));
+    for (frp = FRP; frp != NULL; frp = frp->next) {
+	if (frp->font == font) {
+	    if (frp->refcnt++ == 0) {
+		/* load it */
+		TRACE(("\trefcnt == 0. loading %s again...\n", frp->names[0]));
+		frp->font->fid = XLoadFont(frp->dpy, frp->names[0]);
+	    }
+	    return font;
+	}
+    }
+
+    /* not found */
+    TRACE(("\tfont not found in the cache\n"));
+    return NULL;
+}
+
+/* ARGSUSED */
+void
+CachedFreeFont(dpy, font)
+Display *dpy;
+XFontStruct *font;
+{
+    register FontRec *frp;
+
+    TRACE(("CachedFreeFont(fid=%08lx)\n", font->fid));
+    for (frp = FRP; frp != NULL; frp = frp->next) {
+	if (frp->font == font) {
+	    if (--frp->refcnt == 0) {
+		/* unload it, but not free its structure for later use */
+		TRACE(("\trefcnt == 0. unloading...\n"));
+		XUnloadFont(frp->dpy, frp->font->fid);
+		frp->font->fid = None;
+	    }
+	    return;
+	}
+    }
+
+    /* not found. free anyway... */
+    TRACE(("\tfont not found in the cache. free anyway...\n"));
+    XFreeFont(dpy, font);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/cconv.c	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,2777 @@
+/*
+ *	cconv.c -- $BF~NOJ8;zJQ49%i%$%V%i%j(B (for X11)
+ *		ver 10.8
+ */
+
+/*
+ * Copyright (C) 1988  Software Research Associates, Inc.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted, provided
+ * that the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Software Research Associates not be
+ * used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission.  Software Research
+ * Associates makes no representations about the suitability of this software
+ * for any purpose.  It is provided "as is" without express or implied
+ * warranty.
+ *
+ * Author:  Makoto Ishisone, Software Research Associates, Inc., Japan
+ *		ishisone@sra.co.jp
+ */
+
+/*
+ * $B35MW(B
+ *
+ * $BF~NOJ8;zJQ49$O!"$+$J4A;zJQ49$NA0CJ3,$G$"$j!"$=$NL\E*$O%-!<%\!<%I$+$i(B
+ * $BF~NO$5$l$?%-!<%3!<%I$r2r<a$9$k$3$H$G$"$k!#(B
+ * $B=>$C$F!"Bg$-$/J,$1$k$H<!$N(B2$B$D$N5!G=$r;}$D$3$H$K$J$k!#(B
+ *
+ * 1. $B%m!<%^;z$+$JJQ49$J$IF~NO$5$l$?J8;z$rJL$NJ8;z$KJQ$($k5!G=(B
+ * 2. $B%-!<$NF~NO$K$h$j!"$+$J4A;zJQ49$G;H$o$l$k!VJQ49!W!"!V3NDj!W$J$I$N(B
+ *    $B3F<o5!G=$r8F$S=P$95!G=(B
+ *
+ * $B$3$N(B cconv $B%i%$%V%i%j$O(B X Window version 11 $B$N$b$H$G;H$o$l$k$3$H$r(B
+ * $BA[Dj$7$F$$$k!#(B
+ */
+
+/*
+ * $B%a%b(B
+ *
+ * version 6.0	88/06/05
+ *	$B$@$$$?$$$G$-$?(B
+ * version 6.1	88/06/06
+ *	$B%3%a%s%HF~$l(B
+ * version 6.2	88/06/07
+ *	$B$3$l$@$1F~$l$l$P%^%K%e%"%k=q$+$J$/$F$bBg>fIW$@$m$&(B
+ * version 6.4	88/09/05
+ *	$B2CF#;a(B@$BEl9)Bg$N0U8+$K$h$j(B redo $B5!G=$rF~$l$k(B
+ *	$B$D$$$G$K(B static function $B$N@k8@$r$D$1$k(B
+ *	$B$$$/$D$+$N4X?t$r(B external $B$+$i(B static $B$KJQ$($k(B
+ * version 6.5	88/09/07
+ *	function $B$,J#?t=q$1$k$h$&$K$7$?(B
+ *	$B$=$N$?$a%G!<%?9=B$$rJQ99$9$k(B
+ * version 6.6	88/10/07
+ *	$B$J$s$H(B readRuleFile() $B$G%*!<%W%s$7$?%U%!%$%k$r(B
+ *	$BJD$8$k$N$rK:$l$F$$$?(B -- $B$"!<$O$:$+$7$$(B
+ *	$B=>$C$F(B wterm $B$G2?2s$b(B KanjiConvert $B$N(B on/off $B$r7+$jJV$9$H(B
+ *	$B=i4|2=$K<:GT$9$k(B
+ * version 6.7	88/12/19
+ *	wstrlen() $B$O$3$N%i%$%V%i%j$GDj5A$9$k$Y$-$b$N$G$O$J$$$N$G30$9(B
+ * version 6.8	89/07/21
+ *	$B1F;3;a(B@$B>>2<EE4o$+$i%-!<%3!<%II=5-$,$&$^$/F0$+$J$$$H$NO"Mm$r<u$1$k(B
+ *	getKey() $B$G(B XKEY $BI=5-$N>l9g!"(B#0x$B#1#6?J?t(B $B$NFI$_$H$j$K%P%0$,(B
+ *	$B$"$k$3$H$,H=L@(B
+ * version 7.0	89/08/16
+ *	jclib $B$N(B Wnn version4 $BBP1~$K$h$j!"JQ49%P%C%U%!$,J#?t;}$F$k$h$&$K(B
+ *	$B$J$C$?(B
+ *	$B$=$l$K9g$o$;$F!"(Bcconv $B$b%P%C%U%!$,J#?t;}$F$k$h$&$K$7$J$1$l$P(B
+ *	$B$J$i$J$$(B
+ *	$B7k6IH>J,0J>e=q$-49$($F$7$^$C$?$h$&$@(B
+ * version 7.1	89/08/17
+ *	$B%P%0%U%#%C%/%9(B
+ *	$B%b!<%IJQ99DLCNMQ$N%3!<%k%P%C%/$rDI2C$9$k(B
+ * version 7.2	89/08/23
+ *	$B%U%!%s%/%7%g%s%F!<%V%k$O!"$d$O$j(B ccParseRule() $B$G$O$J$/!"(B
+ *	ccCreateBuf() $B$G;XDj$9$k$Y$-$b$N$J$N$G!"$=$N$h$&$KJQ99$9$k(B
+ * version 7.3 89/08/25
+ *	lint $B$G7Y9p$,=P$J$$$h$&$K=$@5(B
+ *	dumpAllRules() $B$G$A$c$s$HJQ49%k!<%k$,%@%s%W$5$l$k$h$&$K=$@5(B
+ * version 7.4 89/08/26
+ *	ccParseRule() $B$G!"JQ49Dj5A%U%!%$%k$,A0$HF1$8$G$"$l$P(B
+ *	$B%k!<%k$r6&MQ$9$k$h$&$KJQ99(B
+ *	ccParseRule/ccFreeRule $B$G$N(B memory leak $B$N=$@5(B
+ * version 7.5 89/09/26
+ *	$BJQ49Dj5A%U%!%$%k$G(B include $B$,;H$($k$h$&$K=$@5(B
+ * version 7.6 89/09/27
+ *	include $B$N@bL@$r=q$/$N$rK:$l$F$$$?$N$G$=$l$rDI2C(B
+ * version 7.7 89/10/26
+ *	getKey() $B$G(B #$B?t;z(B $B7?$NI=5-$r$7$?;~$K$^$@%P%0$,$"$C$?$N$G=$@5(B
+ *	$B$=$b$=$b$3$NJ}<0$NI=5-$G$O%^%9%/$,;XDj$G$-$J$$$H$$$&:,K\E*$J(B
+ *	$BLdBj$,$"$k$,!"$^$"$3$l$O$$$$$3$H$K$7$F!#(B
+ * version 8.0 89/10/27
+ *	R4 contrib $B8~$1$N(B Release $B$K$"$?$C$F%P!<%8%g%sHV9f$r=$@5(B
+ * version 8.1 89/12/25
+ *	include $B%U%!%$%k$,$J$+$C$?;~$K%3%"%@%s%W$9$k%P%0$r=$@5(B
+ * version 8.2 90/02/15
+ *	X11R4 keyboard group support $BDI2C(B
+ * version 8.3 90/02/16
+ *	keyboard group support $B$N7k2L!"Nc$($P(B
+ *		"" shift-Right "" foo
+ *		"" Right       "" bar
+ *	$B$H$$$&%k!<%k$,$"$C$?;~!"(Bshift-Right $B$r2!$7$?$K$b$+$+$o$i$:(B
+ *	$B$7$?$N%k!<%k$K%^%C%A$7$F$7$^$&$H$$$&%P%0$r=$@5(B
+ *	$BDj5A%U%!%$%k(B (include $B%U%!%$%k$b4^$`(B) $B$N%5!<%A%Q%9$H$7$F(B
+ *	$B4D6-JQ?t(B CC_DEF_PATH $B$r;H$&$h$&$K=$@5(B
+ * version 8.4 90/04/17
+ *	keyboard group support $B$N%3!<%I$N%1%"%l%9%_%9$r=$@5(B
+ *	$BJQ?tL>(B ks1 $B$H(B ks2 $B$r4V0c$($?(B
+ * version 8.5 90/05/31
+ *	keyboard group support $B$NIT6q9g$r=$@5(B
+ *	$BL1ED;a(B@$B%"%9%F%C%/$+$i$N%l%]!<%H(B
+ * version 8.6 91/03/20
+ *	$B$I$N%k!<%k$K$b%^%C%A$7$J$+$C$?;~$K$O%G%U%)%k%H%"%/%7%g%s$,8F$P$l$k$,!"(B
+ *	$B$3$N=hM}$G(B
+ *		+ $B0z?t$,4V0c$C$F$$$?(B
+ *		+ XLookupString() $B$N%j%?!<%s%P%j%e!<$,(B 0 $B$N$H$-(B ($B$D$^$j(B
+ *		  $B%-!<%$%Y%s%H$KBP1~$9$kJ8;zNs$,$J$+$C$?;~(B) $B$K%G%U%)%k%H(B
+ *		  $B%"%/%7%g%s$,8F$P$l$J$+$C$?(B
+ *	$B$H$$$&LdBj$r=$@5(B
+ *	$B%G%U%)%k%H%"%/%7%g%s$,(B NULL $B$N;~!"$I$N%k!<%k$K$b%^%C%A$7$J$1$l$P(B
+ *	ccConvchar() $B$,(B -1 $B$rJV$9$h$&$K=$@5(B
+ * version 8.7 91/03/25
+ *	$BA0$N%P!<%8%g%s$N=$@5$K$h$j!"C1$K%7%U%H%-!<$d%3%s%H%m!<%k%-!<$r(B
+ *	$B2!$7$?$@$1$G%G%U%)%k%H%"%/%7%g%s$,8F$P$l$k$h$&$K$J$C$?$,!"$3$l$O(B
+ *	$B%f!<%6$N4|BT$9$kF0:n$G$O$J$$$h$&$J5$$,$9$k$N$G!"(BXLookupString() $B$N(B
+ *	$B%j%?!<%s%P%j%e!<$,(B 0 $B$N;~$K$O%G%U%)%k%H%"%/%7%g%s$r8F$P$J$$$h$&$K(B
+ *	$B:F=$@5(B
+ *	$B$^$?!"%G%U%)%k%H%"%/%7%g%s$,(B NULL $B$G$+$D%k!<%k$K%^%C%A$7$J$$;~$K(B
+ *	ccConvchar() $B$,(B -1 $B$rJV$9$h$&$K$7$?$,!"%G%U%)%k%H%"%/%7%g%s$NCM$K(B
+ *	$B$h$C$F%j%?!<%s%P%j%e!<$,JQ$o$k$N$OJQ$@$7!"(B-1 $B$rJV$9$N$O%(%i!<$,(B
+ *	$B5/$3$C$?$_$?$$$J$N$G!"7k6I%G%U%)%k%H%"%/%7%g%s$,(B NULL $B$G$"$k$+(B
+ *	$B$I$&$+$K4X$o$i$:%^%C%A$7$?;~$O(B 1$B!"%^%C%A$7$J$$;~$O(B 0 $B$rJV$9(B
+ *	$B$h$&$K=$@5(B
+ *	$B$3$NJQ99$K$h$j(B ccConvchar() $B$N%j%?!<%s%P%j%e!<$,(B 0 $B$+$I$&$+%A%'%C%/(B
+ *	$B$7$F$$$?%"%W%j%1!<%7%g%s$OF0$+$J$/$J$k$,!":#$^$G(B ccConvchar() $B$N(B
+ *	$B%j%?!<%s%P%j%e!<$ODj5A$7$F$$$J$+$C$?$N$G$3$l$O$=$N%"%W%j%1!<%7%g%s$N(B
+ *	$B@UG$(B
+ * version 9.0 91/08/15
+ *	$BJ8;z$N%G!<%?7?$H$7$F:#$^$G$:$C$H(B wchar_t $B$r;H$C$F$$$?$,!"(Bwchar_t $B$N(B
+ *	$BDj5A$,5!<o$K$h$C$F0[$J$k$?$a!"(Bwchar $B$H$$$&7?$KJQ99$9$k!#K\Ev$O(B
+ *	Wnn $B$N<!4|%P!<%8%g%s$K9g$o$;$?$$$N$G8e$G:F$SJQ99$9$k2DG=@-$,$"$k(B
+ * version 9.1 91/09/18
+ *	Files $B9=B$BN$N(B index $B$H$$$&L>A0$N%U%#!<%k%I$,!"(BSystemV $B7O$N%^%7%s(B
+ *	$B$@$H(B strchr $B$KJQ$o$C$F$7$^$&$N$G(B findex $B$H$$$&L>A0$KJQ99(B
+ * version 9.2 91/09/23
+ *	DEBUG $B$,Dj5A$5$l$F$$$k$HJQ49%k!<%k$,%@%s%W$5$l$F$7$^$&$N$O(B kinput2
+ *	$B$G;HMQ$9$k>l9g:$$k$N$G!"(BDEBUG $B$r(B DEBUG_CCONV $B$KJQ99(B
+ * version 10.0 91/10/01
+ *	R5 contrib $B8~$1$N%j%j!<%9$K$"$?$C$F%P!<%8%g%sHV9f$r=$@5(B
+ * version 10.1 92/06/05
+ *	Display $B9=B$BN$N(B mode_switch $B$r;2>H$7$F$$$?$,!"(BDisplay $B9=B$BN$O(B
+ *	$BK\Mh(B opaque $B$G$"$j!"Cf$N%a%s%P!<$rD>@\%"%/%;%9$9$k$N$O$^$:$$$N$G(B
+ *	mode_switch $B$NCM$r<+J,$G7W;;$9$k$h$&$KJQ99(B
+ * version 10.2 94/04/21
+ *	$B4X?t(B eproc $B$O(B varargs.h/stdarg.h $B$r;H$o$:$K=q$+$l$F$$$?$,!"(B
+ *	$B0\?"@-$KLdBj$,$"$k(B (int $B$H(B long $B$N%5%$%:$,0[$J$k%^%7%s$J$I(B)
+ *	$B$N$G=$@5(B
+ * version 10.3 97/09/17
+ *	$B$J$f$?$5$s(B@$BElBg$K$h$k5!G=3HD%%Q%C%A(B ($B%U%!%s%/%7%g%s%G%#%9%Q%C%A%c$N(B
+ *	$BJV$jCM$G;D$j$N4X?t$N<B9T$r%9%-%C%W$G$-$k(B) $B$N<h$j9~$_(B
+ * version 10.4 97/11/20
+ *	$BF1$8%U%!%$%k$KBP$7$F(B fclose $B$rJ#?t2s8F$s$G$$$F!"(Blibc $B$N<BAu$K(B
+ *	$B$h$C$F$O%3%"%@%s%W$9$k$H$$$&%P%0$r=$@5!#$D$$$G$KDj5A%U%!%$%k$N(B
+ *	$BFI$_9~$_ESCf$G%(%i!<$K$J$C$?;~$K%/%m!<%:$7K:$l$F$$$?$N$G9g$o$;$F(B
+ *	$B=$@5!#(B
+ * version 10.5 98/12/28
+ *	$B$J$f$?$5$s(B@$BElBg$K$h$k$5$i$J$k5!G=3HD%%Q%C%A(B ($B<+F03NDj5!G=(B) $B$N<h$j9~$_(B
+ * version 10.6 99/01/07
+ *	$B%=!<%9$N4A;z%3!<%I$r(B SJIS $B$+$i(B EUC $B$KJQ49!#$?$@$7$3$l$OFbIt$N(B
+ *	$B4IM}>e$NOC$G!"G[I[MQ%=!<%9$O85!9(B JIS $B%3!<%I$K$J$C$F$$$k!#(B
+ * version 10.7 99/04/02
+ *	$B=i4|2=;~$N%(%i!<%A%'%C%/$N6/2=!"$H$$$&$+%P%0=$@5!#JQ49%k!<%kDj5A(B
+ *	$B%U%!%$%k$K%k!<%k$,Dj5A$5$l$F$$$J$+$C$?>l9g(B ($B$D$^$j4V0c$C$FA4A3(B
+ *	$BJL$N%U%!%$%k$rFI$_9~$s$G$7$^$C$?>l9g(B) $B$K%(%i!<$K$9$k!#(B
+ * version 10.8 99/05/07
+ *	$B<+F03NDj5!G=$,!"JQ49%k!<%kDj5A%U%!%$%k$G$N;XDj$K4X$o$i$:(B
+ *	$B>o$K%*%s$K$J$C$F$7$^$&$H$$$&%P%0$r=$@5!#(B
+ */
+
+/*
+ * $B;HMQK!(B
+ *
+ * $B;HMQK!$O3d9g4JC1$G$"$k!#:G=i$KJQ49%k!<%kDj5A%U%!%$%k$rFI$_9~$`$?$a$K(B
+ * ccParseRule() $B$r%3!<%k$9$k!#(B
+ * $B<!$KJQ49%P%C%U%!$r:n$k$?$a$K(B ccCreateBuf() $B$r8F$S!"%P%C%U%!$r:n$k!#(B
+ * $B$3$N;~$K!";HMQ$9$k%k!<%k$d<o!9$N%3!<%k%P%C%/4X?t$r;XDj$9$k!#(B
+ * $BJQ49%k!<%k$HJQ49%P%C%U%!$OJ#?t;}$D$3$H$,$G$-$k!#(B
+ * $B$^$?!"A0$N%P!<%8%g%s$H$N8_49@-$N$?$a$K!"JQ49%k!<%k$NFI$_9~$_$H(B
+ * $BJQ49%P%C%U%!$N:n@.$rF1;~$K9T$J$&!"(BccInit() $B$H$$$&4X?t$bMQ0U$5$l$F$$$k!#(B
+ *
+ * $B$"$H$O%-!<%W%l%9$N%$%Y%s%H$,Mh$?$i(B ccConvchar() $B$r8F$V$@$1$G$"$k!#(B
+ * $B$3$N%U%!%s%/%7%g%s$,JQ49$r9T$J$$!"E,Ev$J%3!<%k%P%C%/%k!<%A%s$r8F$V!#(B
+ *
+ * $B8e$OI,MW$K1~$8$FMQ0U$5$l$F$$$k$=$NB>$N%U%!%s%/%7%g%s$r8F$Y$P$h$$!#(B
+ */
+
+/*
+ * $BJQ49$N;EAH$_(B
+ *
+ * $B$3$NF~NOJ8;zJQ49$N;EAH$_$rM}2r$9$k$?$a$N%-!<%o!<%I$O<!$N(B3$B$D$G$"$k!#(B
+ *	$B!&%b!<%I(B
+ *	$B!&JQ49%k!<%k(B
+ *	$B!&%3%s%F%-%9%H(B
+ *
+ * $B!&%b!<%I(B
+ *	$BF~NOJ8;zJQ49$K$O!V%b!<%I!W$,$"$k!#$3$l$ONc$($P!"(B
+ *	$B!V%m!<%^;z2>L>JQ49$r$7$F$+$J$rF~NO$9$k%b!<%I!W$H$+(B
+ *	$B!V%"%k%U%!%Y%C%H$rF~NO$9$k%b!<%I!W$H$$$C$?$b$N$G$"$k!#(B
+ *	$B%b!<%I$4$H$K0[$J$kJQ49%k!<%k$,@_Dj$G$-$k!#EvA3%b!<%I$N@ZBX$($b(B
+ *	$BJQ49%k!<%k$H$7$F5-=R$G$-$k!#(B
+ * 
+ * $B!&JQ49%k!<%k(B
+ *	$BJQ49%k!<%k$O(B4$B$D$N9`L\$+$i9=@.$5$l$k!#(B
+ *		$BF~NO%-!<(B
+ *		$B%3%s%F%-%9%HJ8;zNs(B
+ *		$BJQ497k2LJ8;zNs(B
+ *		$B%U%!%s%/%7%g%s(B
+ *	$B$3$N$&$A!"F~NO%-!<$H%3%s%F%-%9%HJ8;zNs$,%k!<%k$N%^%C%A%s%0$K;H$o$l$k!#(B
+ * 
+ *	$BF~NO%-!<$O%-!<%3!<%I$r;XDj$9$k$b$N$G!"(BX $B$N%-!<%$%Y%s%H%3!<%I$G(B
+ *	$B;XDj$9$kJ}K!$H!"$=$l$r(B XLookupString $B$7$?7k2L$N%-%c%i%/%?%3!<%I$G(B
+ *	$B;XDj$9$kJ}K!$H$N(B2$BDL$j$,$"$k!#(B
+ *
+ *	$B%3%s%F%-%9%HJ8;zNs$O!"$=$l$^$G$K$I$N$h$&$JJ8;z$,F~NO$5$l$?$+$r(B
+ *	$B;XDj$9$k$b$N$G$"$k!#(B
+ *
+ *	$BJQ497k2LJ8;zNs$O$=$NL>$NDL$j!"JQ497k2L$N;XDj$G!"%^%C%A$7$?(B
+ *	$B%3%s%F%-%9%H$,$3$NJQ497k2L$KCV$-$+$o$k!#(B
+ *
+ *	$B%U%!%s%/%7%g%s$O%k!<%k$,%^%C%A$7$?$H$-$K<B9T$5$l$k%U%!%s%/%7%g%s(B 
+ *	("$BJQ49(B" $B$H$+(B "$B3NDj(B" $B$H$+(B) $B$N;XDj$G$"$k!#%U%!%s%/%7%g%s$OJ#?t(B
+ *	$B;XDj$9$k$3$H$b$G$-$k!#(B
+ * 
+ *	$BNc$r$"$2$k$H!"(B
+ *	$B!V(B"ky" $B$HF~$C$F$$$k$H$3$m$G(B 'a' $B$H$$$&%-!<$,2!$5$l$?$i(B
+ *	"$B$-$c$C(B!" $B$HJQ49$7!"%Y%k$rLD$i$9!W(B
+ *	$B$H$$$&%k!<%k(B ($B$"$s$^$j0UL#$J$$$1$I(B) $B$G!"(B
+ *		'a' $B$,F~NO%-!<!"(B
+ *		"ky" $B$,%3%s%F%-%9%H!"(B
+ *		"$B$-$c$C(B!" $B$,JQ497k2L!"(B
+ *		<$B%Y%k$rLD$i$9(B> $B$,%U%!%s%/%7%g%s(B
+ *	$B$H$$$&$3$H$K$J$k!#(B
+ *
+ * $B!&%3%s%F%-%9%H(B
+ *	$B0J>e$N$h$&$K!"%3%s%F%-%9%H$H$$$&$N$O$=$l$^$G$K$I$N$h$&$JJ8;z$,(B
+ *	$BF~NO$5$l$F$$$J$1$l$P$J$i$J$$$+$r;XDj$9$k$b$N$G$"$k!#(B
+ *	$B$=$l$HF1;~$K$=$NJ8;z$rJQ497k2L$HCV$-JQ$($k$3$H$r;XDj$9$k$b$N(B
+ *	$B$G$b$"$k!#(B
+ *
+ *	$B%3%s%F%-%9%H$O6uJ8;zNs$G$b$h$$!#$=$N$H$-$K$O$=$l$^$G$K$I$N$h$&$J(B
+ *	$BJ8;z$,F~NO$5$l$?$+$K$+$+$o$i$:!"%^%C%A%s%0$,5/$3$k!#(B
+ *
+ *	$B%3%s%F%-%9%H$OH>3Q$N>l9gBgJ8;z>.J8;z$r6hJL$7$J$$!#(B
+ *	$B$I$A$i$K$b%^%C%A$9$k!#$?$@$7!"(Bcasesensitive $B$r;XDj$9$k$3$H$G(B
+ *	$BBgJ8;z>.J8;z$r6hJL$9$k$h$&$K$9$k$3$H$b$G$-$k!#(B
+ *
+ *	autofix $B$r;XDj$9$k$H!"%3%s%F%-%9%H$,$J$$>uBV$G%3%s%F%-%9%H$KJ8(B
+ *	$B;z$,DI2C$5$l$kD>A0$K<+F03NDj%U%!%s%/%7%g%s$,8F$P$l$k!#(B
+ *
+ * $B!&JQ49$N<B:](B
+ *	$B$5$F!"$I$N$h$&$K$7$FJQ49$,9T$J$o$l$k$N$+$r4JC1$K=q$$$F$_$k!#(B
+ *
+ *	$B%-!<%W%l%9%$%Y%s%H$r0z?t$K$7$F(B ccConvchar() $B$,8F$P$l$k!#(B
+ *	$B$9$k$H!"$^$:$O%$%Y%s%H%3!<%I$G%+%l%s%H%b!<%I$GDj5A$5$l$F$$$k(B
+ *	$BJQ49%k!<%k$NCf$+$i%^%C%A$9$k$b$N$rC5$9!#C5:w$O%k!<%k$N5-=R=g$K(B
+ *	$B9T$J$o$l!":G=i$K%^%C%A$7$?$b$N$,A*$P$l$k!#(B
+ *	$B$b$7%^%C%A$9$k%k!<%k$,$J$1$l$P!":#EY$O%$%Y%s%H%3!<%I$r(B
+ *	XLookupString() $B$GJQ49$7$?%-%c%i%/%?%3!<%I$G!"%^%C%A$9$k$b$N$rC5$9!#(B
+ *
+ *	$B$=$l$G$b%^%C%A$9$k%k!<%k$,8+$D$+$i$J$+$C$?$H$-$K$O!"%G%U%)%k%H(B
+ *	$B%"%/%7%g%s$N%3!<%k%P%C%/%k!<%A%s$,8F$P$l$k!#(B
+ *
+ *	$B%^%C%A$9$k%k!<%k$,8+$D$+$l$P!"JQ497k2LJ8;zNs$X$NCV$-49$($r9T$J$&!#(B
+ *	$B$D$^$j!"$^$:%k!<%k$K5-=R$5$l$F$$$k%3%s%F%-%9%HJ8;zNs$NJ8;z?tJ,$@$1(B
+ *	1$BJ8;z:o=|MQ$N%3!<%k%P%C%/%k!<%A%s$,8F$P$l!"$=$N8eJQ497k2LJ8;zNs$,(B
+ *	1$BJ8;zF~NOMQ$N%3!<%k%P%C%/%k!<%A%s$r8F$s$GF~NO$5$l$k!#$=$N:]$K(B
+ *	$B%3%s%F%-%9%H$,6u$G$"$C$?>l9g$O!"<+F03NDjMQ$N%3!<%k%P%C%/%k!<%A%s$,(B
+ *	$B8F$P$l$k!#(B
+ *	$B$=$N%k!<%k$K%U%!%s%/%7%g%s$,;XDj$5$l$F$$$l$P%G%#%9%Q%C%AMQ$N(B
+ *	$B%3!<%k%P%C%/%k!<%A%s$,8F$S=P$5$l$k!#(B
+ *
+ *	$B%U%!%s%/%7%g%s$,B>$N%b!<%I$X$N@ZBX$($@$C$?>l9g$K$O>/$7J#;($G$"$k!#(B
+ *	$B$=$N$H$-$K$O!"$^$:(B EXITMODE $B$H$$$&5?;w%-!<$r0z?t$K$7$F(B ccConvchar()
+ *	$B$,8F$P$l$k!#$3$l$O$"$k%b!<%I$+$iH4$1$k:]$K2?$+=hM}$r$7$?$$!"(B
+ *	$B$H$$$&$H$-$N$?$a$K$"$k!#$=$N8e%+%l%s%H%b!<%I$r?7$7$$%b!<%I$K$7$F!"(B
+ *	$B:#EY$O(B ENTERMODE $B$H$$$&5?;w%-!<$r0z?t$K$7$F(B ccConvchar $B$,8F$P$l$k!#(B
+ *	$B$3$l$K$h$C$F$"$k%b!<%I$KF~$C$?$H$-$N=hM}$r$9$k$3$H$,$G$-$k!#(B
+ *	$B$=$N8e!"%3%s%F%-%9%H$,%/%j%"$5$l!":G8e$K!"%b!<%IJQ99DLCNMQ$N(B
+ *	$B%3!<%k%P%C%/4X?t$,;XDj$5$l$F$$$l$P$=$l$,8F$P$l$k!#(B
+ */
+
+/*
+ * ccdef $B%U%!%$%k$N=q$-J}(B
+ *
+ * $BF~NOJ8;zJQ49Dj5A%U%!%$%k(B (ccdef $B%U%!%$%k$H>JN,$9$k(B) $B$N=q$-J}$r4JC1$K5-$9!#(B
+ *
+ * ccdef $B%U%!%$%k$O<!$N(B3$B$D$N%Q!<%H$+$i9=@.$5$l$k!#(B
+ * $B$3$l$i$O$3$N=g$KJB$s$G$$$J$1$l$P$J$i$J$$!#(B
+ *
+ *	<$B%b!<%I@k8@(B>
+ *	<$B=i4|%b!<%I@k8@(B>
+ *	<$B3F%b!<%I$NJQ49%k!<%k5-=R(B>
+ *
+ * <$B%b!<%I@k8@(B> $B$O;HMQ$9$k%b!<%IL>$r@k8@$9$k$b$N$G!"%U%)!<%^%C%H$O<!$NDL$j!#(B
+ *	defmode Mode1 Mode2 Mode3...
+ * $B;HMQ$9$k%b!<%I$O$9$Y$F$3$3$G@k8@$7$F$*$+$J$/$F$O$J$i$J$$!#(B
+ *
+ * <$B=i4|%b!<%I@k8@(B> $B$O(B cconv $B$,=i4|2=$5$l$?$H$-$N%b!<%I$r;XDj$9$k$b$N$G$"$k!#(B
+ * $B%U%)!<%^%C%H$O<!$NDL$j!#(B
+ *	initialmode Mode3
+ *
+ *
+ * <$B3F%b!<%I$NJQ49%k!<%k5-=R(B> $B$,<B:]$NJQ49%k!<%k$r5-=R$9$kItJ,$G$"$k!#(B
+ * 1$B$D$N%b!<%I$KBP$9$k5-=R7A<0$O<!$NDL$j!#(B
+ *
+ *	mode <$B%b!<%IL>(B> "<$B%W%m%s%W%H(B>" [fallthrough <$B%b!<%IL>(B>]
+ *		"<$B%3%s%F%-%9%H(B>" <$B%-!<(B> "<$BJQ497k2L(B>" [<$B%U%!%s%/%7%g%s(B>...]
+ *			:
+ *			:
+ *	endmode
+ *
+ * <$B%b!<%IL>(B> $B$O(B <$B%b!<%I@k8@(B> $B$G@k8@$7$?%b!<%IL>$G$"$k!#(B
+ *
+ * <$B%W%m%s%W%H(B> $B$O%b!<%I$rI=$9J8;zNs$G$"$k!#$3$l$O%+%l%s%H%b!<%I$rI=<($9$k(B
+ * $B:]$K;HMQ$5$l$k$b$N$G!"4A;z$G$b$h$$!#D9$5$O<+M3$G$"$k$,!"M>$jD9$$$H(B
+ * $B$9$Y$FI=<($5$l$k$+$I$&$+5?Ld$G$"$k!#(B
+ * $B$=$N8e$N!"(B[ ] $B$K$/$k$^$l$?ItJ,$O>JN,2DG=$J$3$H$r<($9!#(B
+ * $B$b$7$"$l$P!"$3$N%b!<%I$G%^%C%A$9$k%k!<%k$,$J$+$C$?$H$-$K$O(B fallthrough $B$G(B
+ * $B;XDj$5$l$k%b!<%I$N%k!<%k$,0z$-B3$$$FC5$5$l$k!#(B
+ *
+ * mode $B$H(B endmode $B$K$O$5$^$l$?ItJ,$,8D!9$NJQ49%k!<%k$G$"$k!#(B
+ * <$B%3%s%F%-%9%H(B> $B$,%3%s%F%-%9%HJ8;zNs$G$"$k!#$3$3$G$O(B '^' $B$H(B '\' $B$,FC<l(B
+ * $B%-%c%i%/%?$H$7$F;HMQ$G$-$k!#(B"^C" $B$H=q$1$P$=$l$O(B $B%3%s%H%m!<%k(B-C $B$rI=$9!#(B
+ * $B%P%C%/%9%i%C%7%e(B '\' $B$O<!$NJ8;z$NFC<lJ8;z$H$7$F$N0UL#$r$J$/$9!#(B
+ * '^' $B<+?H$r;H$$$?$1$l$P(B "\^" $B$H%(%9%1!<%W$9$k!#F1MM$K(B '\' $B<+?H$r;H$$$?$1$l$P(B
+ * "\\" $B$H=E$M$l$P$h$$!#(B
+ *
+ * <$B%-!<(B> $B$OF~NO$5$l$?%-!<$G!"(BX $B$N%-!<%$%Y%s%H!"%-%c%i%/%?%3!<%I!"(B
+ * $B%a%?%-%c%i%/%?!"5?;w%-!<$N$$$:$l$+$G;XDj$9$k!#(B
+ *
+ * X $B$N%-!<%$%Y%s%H$O!"4pK\E*$K!"(B
+ *	$B%b%G%#%U%!%$%"(B-Keysym$BL>(B
+ * $B$GI=$9!#Nc$($P!"(B
+ *	Tab
+ *	control-a
+ *	shift-control-space
+ * $B$J$I$G$"$k!#(B
+ *
+ * $B%-%c%i%/%?%3!<%I$r=q$/$K$O!"%7%s%0%k%/%)!<%H$r;HMQ$9$k!#Nc$($P(B
+ *	'a'
+ *	'^['
+ *	'\''
+ * $B$J$I$G$"$k!#$o$+$k$H;W$&$,!"(B2$BHVL\$O(B ESCAPE$B!"(B3$BHVL\$O%7%s%0%k%/%)!<%H(B
+ * $B$=$N$b$N$r<($9!#(B
+ *
+ * $B%a%?%-%c%i%/%?$O<!$N(B10$B<oN`$,;HMQ$G$-$k!#(B
+ *  $B%-!<%$%Y%s%H$G$b%-%c%i%/%?%3!<%I$G$b%^%C%A$9$k$b$N(B
+ *	@any		- $B2?$K$G$b%^%C%A$9$k(B
+ *  $B%-!<%$%Y%s%H$K%^%C%A$9$k$b$N(B
+ *	@raw		- $B%-!<%$%Y%s%H$J$i2?$K$G$b%^%C%A(B
+ *	@func		- $B%U%!%s%/%7%g%s%-!<$K%^%C%A(B
+ *	@cursor		- $B%+!<%=%k%-!<$K%^%C%A(B
+ *	@keypad		- $B%F%s%-!<%Q%C%I$N%-!<$K%^%C%A(B
+ *	@modifier	- $B%b%G%#%U%!%$%"(B (shift, control $B$J$I(B) $B$K%^%C%A(B
+ *	@non-ascii	- $B%-!<%$%Y%s%H$N$&$A!"(BXLookupString() $B$N7k2L$,(B
+ *			  $BD9$5(B0$B!"$D$^$jBP1~$9$k%"%9%-!<J8;z$,$J$$$b$N$K%^%C%A(B
+ *  $B%-%c%i%/%?%3!<%I$K%^%C%A$9$k$b$N(B
+ *	@ascii		- $B%-%c%i%/%?%3!<%I$J$i2?$K$G$b%^%C%A(B
+ *	@printable	- $B0u;z2DG=J8;z(B (0x20 $B!e(B c $B!e(B 0x7e) $B$K%^%C%A(B
+ *	@control	- $B%3%s%H%m!<%kJ8;z(B (0x00 $B!e(B c $B!e(B 0x1f) $B$K%^%C%A(B
+ *
+ * $B5?;w%-!<$OK\Ev$N%-!<F~NO$G$O$J$$!#$3$l$K$O(B2$B<oN`$"$k!#(B
+ *	ENTERMODE	- $B$"$k%b!<%I$KF~$C$?$H$-$K2>A[E*$KF~NO$5$l$k%-!<(B
+ *	EXITMODE	- $B$"$k%b!<%I$+$iH4$1$k$H$-$K2>A[E*$KF~NO$5$l$k%-!<(B
+ *
+ * <$BJQ497k2L(B> $B$OJQ497k2L$r;XDj$9$k!#$3$3$G$O(B '&'$B!"(B'/'$B!"(B'^'$B!"(B'\' $B$N(B4$B<oN`$N(B
+ * $BFC<lJ8;z$,;HMQ$G$-$k!#(B'^' $B$H(B '\' $B$K$D$$$F$O(B <$B%3%s%F%-%9%H(B> $B$HF1$8$G$"$k!#(B
+ * '&' $B$O(B $B%^%C%A$7$?(B <$B%-!<(B> $B$HCV$-49$($i$l$k!#(B<$B%-!<(B> $B$,%$%Y%s%H$N>l9g$K$O(B
+ * $B$=$N%$%Y%s%H$r(B XLookupString() $B$7$?7k2L$NJ8;zNs$GCV$-49$o$k!#(B
+ * '/' $B$,=P$F$/$k$H!"$=$3$G%3%s%F%-%9%H$O%/%j%"$5$l$k!#(B
+ *
+ * <$B%U%!%s%/%7%g%s(B> $B$O$J$/$F$b$h$$!#$"$l$PJQ49$N8e!"%U%!%s%/%7%g%s$,(B
+ * $B<B9T$5$l$k!#%U%!%s%/%7%g%s$rJ#?t;XDj$9$k$3$H$b$G$-!"$=$N>l9g$K$O(B
+ * $B;XDj$5$l$?=g=x$G<B9T$5$l$k!#%U%!%s%/%7%g%s$N6h@Z$j$O6uGrJ8;z$G$"$k!#(B
+ *	func1 func2 func3
+ * $B$N$h$&$K;XDj$9$k!#(B
+ * $B%U%!%s%/%7%g%s$H$7$F%+%l%s%H%b!<%I$NJQ99$r;XDj$9$k$3$H$b$G$-$k!#(B
+ *	goto <$B%b!<%IL>(B>
+ * $B$G%+%l%s%H%b!<%I$,JQ$o$k!#$3$N%b!<%IL>$H$7$F(B "PREV" $B$,;HMQ$G$-$k!#(B
+ * $B$3$l$O0l$DA0$N%b!<%I$rI=$9!#(B
+ * $B$^$?!":FJQ49$r;XDj$9$k$3$H$b$G$-$k!#(B<$B%U%!%s%/%7%g%s(B>$B$H$7$F(B
+ *	redo
+ * $B$H=q$/$H!"$b$&0lEY%^%C%A$9$k%k!<%k$r:G=i$+$iC5$7$K$$$/!#$?$@$7$=$NA0$K(B
+ * <$B%3%s%F%-%9%H(B> $B$,(B <$BJQ497k2L(B> $B$KCV$-49$($i$l$F$$$k$3$H$KCm0U!#$3$N5!G=$r(B
+ * $B;H$&;~$K$OL58B%k!<%W$K4Y$i$J$$$h$&$KCm0U$7$F%k!<%k$r=q$+$J$1$l$P$J$i$J$$!#(B
+ * $B0l1~0BA4:v$H$7$F(B redo $B$,(B MAXREDO (=20) $B2s8F$P$l$k$H<:GT$9$k$h$&$K(B
+ * $B$J$C$F$$$k!#(B
+ * $BCm0U(B: goto $B$H(B redo $B$N$"$H$K;XDj$5$l$?%U%!%s%/%7%g%s$O<B9T$5$l$J$$!#(B
+ * $B$D$^$j!"(B
+ *	func1 goto XX func2
+ * $B$@$H!":G=i$K(B func1 $B$,<B9T$5$l!"<!$K%+%l%s%H%b!<%I$,(B XX $B$KJQ99$5$l$k$,(B
+ * func2 $B$O<B9T$5$l$J$$!#(B
+ * $B$^$?!"<!$KF~NO$7$?%-!<$K%b%G%#%U%!%$%d$rDI2C$9$k$3$H$b$G$-$k!#(B<$B%U%!(B
+ * $B%s%/%7%g%s(B>$B$H$7$F!"(B
+ *	add-modifier-shift
+ *	add-modifier-control
+ *	add-modifier-lock
+ *	add-modifier-mod1
+ *	add-modifier-mod2
+ *	add-modifier-mod3
+ *	add-modifier-mod4
+ *	add-modifier-mod5
+ * $B$r=q$/$H<!$KF~NO$7$?%-!<$K%b%G%#%U%!%$%d$rDI2C$9$k!#Nc$($P!"(B
+ *	""	'^['		""	add-modifier-mod1
+ *	""	mod1-i		""	shrink-s
+ * $B$H=q$$$F$*$/$H!"(Bmod1-i $B$HF~NO$7$F$b!"(B^[ i $B$HF~NO$7$F$b(B shrink-s $B$,(B
+ * $B<B9T$5$l$k!#(B
+ *
+ * $B:G8e$K=EMW$JCm0U$r0l$D!#(Bccdef $B%U%!%$%k$O(B EUC $B%3!<%I$G=q$+$l$F$$$J$1$l$P(B
+ * $B$J$i$J$$!#(B
+ *
+ * $B$J$*!"=q$-K:$l$?$,(B '#' $B$G;O$^$k9T$O%3%a%s%H9T$G$"$k!#(B
+ *
+ * $B$^$?!"B>$N%U%!%$%k$r(B include $BJ8$r;H$C$F%$%s%/%k!<%I$9$k$3$H$,$G$-$k!#(B
+ * $B=q<0$O(B
+ *	include	$B%U%!%$%kL>(B
+ * $B$G$"$k!#%U%!%$%kL>Cf$K6uGrJ8;z$,4^$^$l$k;~$K$O(B ' $B$+(B " $B$G0O$a$P$h$$!#(B
+ * $B%U%!%$%kL>$,AjBP%Q%9L>$N;~$K$O$^$:%+%l%s%H%G%#%l%/%H%j$,C5$5$l!"$J$1$l$P(B
+ * $B4D6-JQ?t(B CC_DEF_PATH $B$,Dj5A$5$l$F$$$l$P$=$l$K;XDj$5$l$?%G%#%l%/%H%j(B
+ * (':' $B$G6h@Z$C$FJ#?t;XDj$9$k$3$H$,$G$-$k(B) $B$N2<$,C5$5$l!"$=$l$G$b$J$1$l$P(B
+ * CCDEFPATH (/usr/lib/X11/ccdef/) $B$N2<$,C5$5$l$k!#(B
+ */
+
+/*
+ * $B%$%s%?!<%U%'%$%9!&%U%!%s%/%7%g%s(B 
+ *
+ * - $BJQ49%k!<%kFI$_9~$_(B -
+ *
+ * ccRule ccParseRule(char *deffile, void (*errprint)())
+ *	$BF~NOJ8;zJQ49%U%!%$%k$rFI$_9~$`!#(B
+ *	deffile $B$G;XDj$5$l$k%U%!%$%k$+$iJQ49%k!<%k$rFI$_9~$`!#$b$7$b(B
+ *	deffile $B$,(B NULL $B$N;~$O!"4D6-JQ?t(B CC_DEF $B$NCM$,;HMQ$5$l$k!#(B
+ *	deffile $B$,AjBP%Q%9L>$N;~$K$O$^$:%+%l%s%H%G%#%l%/%H%j$N2<$,C5$5$l!"(B
+ *	$B$J$1$l$P!"4D6-JQ?t(B CC_DEF_PATH $B$G;XDj$5$l$?%G%#%l%/%H%j$N2<$,(B
+ *	$BC5$5$l$k!#(BCC_DEF_PATH $B$K$O4D6-JQ?t(B PATH $B$J$I$HF1$8$/J#?t$N(B
+ *	$B%G%#%l%/%H%j$r(B ':' $B$G6h@Z$C$F;XDj$9$k$3$H$,$G$-$k!#(B
+ *	$B$J$1$l$P(B CCDEFPATH (/usr/lib/X11/ccdef) $B$N2<$,C5$5$l$k!#(B
+ *	$BF1$8JQ49%U%!%$%k$KBP$7$FJ#?t2s(B ccParseRule() $B$r9T$J$C$F$b!"(B
+ *	$B<B:]$KFI$_9~$^$l$k$N$O:G=i$N0l2s$@$1$G$"$k!#(B
+ *	errprint $B$O%(%i!<I=<(MQ$N%U%!%s%/%7%g%s$G$"$k$,!"(B NULL $B$N>l9g$K$O(B
+ *	stderr $B$X(B fprintf() $B$r;HMQ$7$F=PNO$5$l$k!#(B
+ *	$B@.8y;~$K$OJQ49%k!<%k$r!"<:GT;~$K$O(B NULL $B$rJV$9!#(B
+ *
+ * void ccFreeRule(ccRule rule)
+ *	$B;HMQ$7$J$/$J$C$?JQ49%k!<%k$G;H$o$l$F$$$?NN0h$r2rJ|$9$k!#(B
+ *
+ *
+ * - $BJQ49%P%C%U%!:n@.(B -
+ *
+ * ccBuf ccCreateBuf(ccRule rule, int contextsize,
+ *		     char *functable[], int functablesize,
+ *		     void (*default_action)(), void (*insert_char)(),
+ *		     void (*delete_char)(), int (*function_dispatch)(),
+ *		     void (*mode_notify)(), void (*auto_fix)(), 
+ *		     caddr_t client_data);
+ *	$BJQ49%P%C%U%!$r:n$j!"$=$l$rJV$9!#(B
+ *	rule $B$G!"$I$NJQ49%k!<%k$r;HMQ$9$k$+;XDj$9$k!#(B
+ *	contextsize $B$K$O%3%s%F%-%9%H$r2?J8;zJ];}$9$k$+$r;XDj$9$k!#(B
+ *	$B$h$[$IFC<l$J%k!<%k$,$J$$8B$j!"IaDL$O?tJ8;z$GB-$j$k$O$:$G$"$k!#(B
+ *	functable $B$O%U%!%s%/%7%g%sL>$N0lMwI=!"(Bfunctablesize $B$O$=$N%5%$%:(B
+ *	$B$G$"$k!#(B
+ *	default_action $B$O!"F~NO$5$l$?%-!<$,$I$N%k!<%k$K$b%^%C%A$7$J$+$C$?(B
+ *	$B$H$-$K8F$P$l$k%U%!%s%/%7%g%s$G$"$k!#(BNULL $B$r;XDj$9$k$H!"%^%C%A(B
+ *	$B$7$J$+$C$?$H$-$K$O2?$b5/$3$i$J$$!#(B
+ *	insert_char, delete_char $B$O$=$l$>$l(B 1$BJ8;zA^F~(B / 1$BJ8;z:o=|MQ$N(B
+ *	$B%U%!%s%/%7%g%s$G$"$k!#(B
+ *	function_dispatch $B$K$O%U%!%s%/%7%g%s%3!<%k$N$?$a$N%G%#%9%Q%C%A(B
+ *	$B%k!<%A%s$r;XDj$9$k!#%G%#%9%Q%C%A4X?t$,(B True $B$rJV$;$P<!$N%U%!%s%/%7%g(B
+ *	$B%s$r8F$V$,!"(BFalse $B$rJV$;$P(B goto $B$N$h$&$KB3$/4X?t$OL5;k$9$k!#(B
+ *	auto_fix $B$O!"<+F03NDj$N$?$a$N%k!<%A%s$r;XDj$9$k!#(BNULL $B$r;XDj$9$k$H(B
+ *	$B<+F03NDj$O$5$l$J$$!#(B
+ *	mode_notify $B$O!"%b!<%I$,JQ$o$C$?;~$K8F$S=P$5$l$k%U%!%s%/%7%g%s$G$"$k!#(B
+ *	$B%3!<%k%P%C%/$NI,MW$,$J$$$H$-$O(B NULL $B$r;XDj$7$F$*$1$P$h$$!#(B
+ *	client_data $B$O!"%3!<%k%P%C%/;~$K0z?t$H$7$FEO$5$l$k%G!<%?$G$"$k!#(B
+ *	$B@.8y;~$K$O%P%C%U%!$r!"%(%i!<$N;~$K$O(B NULL $B$,JV$5$l$k!#(B
+ *
+ *
+ * void ccDestroyBuf(ccBuf buf)
+ *	$B;HMQ$7$J$/$J$C$?JQ49%P%C%U%!$G;H$o$l$F$$$?NN0h$r2rJ|$9$k!#(B
+ *
+ *
+ * - $BJQ49(B -
+ *
+ * int ccConvchar(ccBuf buf, XKeyPressedEvent *event)
+ *	X11 $B$N%-!<%\!<%I$N%W%l%9%$%Y%s%H$r<u$1<h$j!"JQ49$r9T$J$&!#(B
+ *	$B9T$J$C$?7k2L!"J8;z$NA^F~!&:o=|$O(B ccCreateBuf() $B$G;XDj$5$l$?(B
+ *	insert_char, delete_char $B$,8F$S=P$5$l!"%U%!%s%/%7%g%s$K$D$$$F$O(B
+ *	$BF1$8$/(B ccCreateBuf() $B$G;XDj$5$l$k(B function_dispatch $B$,%G%#%9%Q%C%A$N(B
+ *	$B$?$a$K8F$P$l$k!#(B
+ *	$B$I$N%k!<%k$K$b%^%C%A$7$J$1$l$P!"(Bdefault_action $B$,8F$P$l$k!#(B
+ *	$B$I$N%k!<%k$K$b%^%C%A$7$J$+$C$?;~$K$O(B 0$B!"%^%C%A$7$?;~$K$O(B 1 $B$,(B
+ *	$BJV$5$l$k!#(B
+ *
+ *
+ * - $B%+%l%s%H%b!<%I(B -
+ *
+ * int ccGetMode(ccBuf buf)
+ *	$B%+%l%s%H%b!<%IHV9f$,JV$5$l$k!#(B
+ *
+ * wchar *ccGetModePrompt(ccBuf buf)
+ *	$B%+%l%s%H%b!<%IL>$,(B EUC$B%W%m%;%9%3!<%I$GJV$5$l$k!#(B
+ *
+ *
+ * - $B%P%C%U%!$N;HMQ$7$F$$$k%k!<%k(B -
+ *
+ * ccRule ccGetRule(ccBuf buf)
+ *	$B;XDj$5$l$?JQ49%P%C%U%!$,;HMQ$7$F$$$kJQ49%k!<%k$rJV$9!#(B
+ *
+ *
+ * - $B%3%s%F%-%9%H(B -
+ *
+ * $B%3%s%F%-%9%H$X$NJ8;z$NDI2C$d:o=|$O!"%k!<%k$K%^%C%A$7$?$H$-$K$O(B
+ * $B<+F0E*$K9T$J$o$l$k!#$^$?!"%+%l%s%H%b!<%I$NJQ99$K$H$b$J$C$F(B
+ * $B%3%s%F%-%9%H$O<+F0E*$K%/%j%"$5$l$k!#(B
+ * $B=>$C$FIaDL$O%f!<%6$,$3$l$i$N%U%!%s%/%7%g%s$r8F$VI,MW$O$J$$!#(B
+ * $B$?$@$7!"%^%C%A$7$J$+$C$?J8;z$r(B default_action $B$,A^F~$9$k$H$+!"(B
+ * $B%P%C%/%9%Z!<%9$N=hM}$r9T$J$&!"$J$I$N>l9g$K$O%f!<%6$,(B explicit $B$K(B
+ * $B8F$VI,MW$,$"$k!#(B
+ *
+ * void ccContextAppend(ccBuf buf, int c)
+ *	$B%3%s%F%-%9%H$N:G8e$KJ8;z(B c (EUC $B%W%m%;%9%3!<%I(B)$B$rIU$12C$($k!#(B
+ *
+ * void ccContextDelete(ccBuf buf)
+ *	$B%3%s%F%-%9%H$N:G8e$N(B1$BJ8;z$r:o=|$9$k!#(B
+ *
+ * void ccContextClear(ccBuf buf)
+ *	$B%3%s%F%-%9%H$r%/%j%"$9$k!#(B
+ *
+ * void ccContextSet(ccBuf buf, wchar *cstr)
+ *	$B%3%s%F%-%9%HJ8;zNs$r%;%C%H$9$k!#J8;zNs$O(B null $B%?!<%_%M!<%H$5$l$?(B
+ *	EUC $B%W%m%;%9%3!<%I$G$J$1$l$P$J$i$J$$!#(B
+ *	$BJ8;zNs$ND9$5$,(B ccCreateBuf() $B$G;XDj$5$l$?(B contextsize $B$h$j(B
+ *	$BD9$$$H$-$K$O!":G8e$N(B contextsize $BJ8;z$,%;%C%H$5$l$k!#(B
+ *
+ * void ccContextGet(ccBuf buf, wchar *cstr)
+ *	$B8=:_$N%3%s%F%-%9%HJ8;zNs$rJV$9!#J8;zNs$O(B null $B%?!<%_%M!<%H$5$l$?(B
+ *	EUC $B%W%m%;%9%3!<%I$G$"$k!#(B
+ */
+
+/*
+ * $B%3!<%k%P%C%/%U%!%s%/%7%g%s$H$=$N0z?t(B
+ *
+ *	$B%G%#%9%Q%C%A%U%!%s%/%7%g%s(B:
+ *	    function_dispatch(int func, unsigned char *str, int nbytes,
+ *			      caddr_t client_data)
+ *		$B%^%C%A$7$?%k!<%k$K%U%!%s%/%7%g%s$,=q$+$l$F$$$?$H$-$K(B
+ *		$B8F$S=P$5$l$k!#(B
+ *		$B0z?t(B func $B$O!"%U%!%s%/%7%g%sHV9f$G$"$k!#$3$l$O(B
+ *		ccParseRule() $B$N0z?t$H$7$FEO$5$l$?!"(Bfunctable[] $B$N(B
+ *		$B%$%s%G%C%/%9$G$"$k!#(Bstr, nbytes $B$O$3$N(B
+ *		$B%U%!%s%/%7%g%s$r0z$-5/$3$7$?%-!<$NI=$9J8;zNs!#(B
+ *		client_data $B$O(B ccCreateBuf() $B$N;~$K;XDj$5$l$?%G!<%?$G$"$k!#(B
+ *
+ *	$B%G%U%)%k%H%"%/%7%g%sMQ%U%!%s%/%7%g%s(B:
+ *	    default_action(unsigned char *str, int nbytes, caddr_t client_data)
+ *		$B2!$5$l$?%-!<$KBP$7$F%^%C%A$9$k%k!<%k$,$J$+$C$?$H$-$K(B
+ *		$B8F$S=P$5$l$k!#(B
+ *		str, nbytes $B$O%-!<$NI=$9J8;zNs!#(B
+ *		client_data $B$O(B ccCreateBuf() $B$N;~$K;XDj$5$l$?%G!<%?!#(B
+ *
+ *	$BJ8;zA^F~%U%!%s%/%7%g%s(B:
+ *	    insert_char(wchar c, caddr_t client_data)
+ *		$BJQ497k2L$NJ8;z$r%"%W%j%1!<%7%g%s$KEO$9$N$K;HMQ$5$l$k!#(B
+ *		c $B$O(B EUC $B%W%m%;%9%3!<%I$G$"$k!#$3$N%U%!%s%/%7%g%s$O(B
+ *		1$BJ8;z$4$H$K8F$P$l$k!#(B
+ *		client_data $B$O(B ccCreateBuf() $B$N;~$K;XDj$5$l$?%G!<%?!#(B
+ *
+ *	$BJ8;z:o=|%U%!%s%/%7%g%s(B:
+ *	    delete_char(caddr_t client_data)
+ *		$BJQ497k2L$K$7$?$,$C$F:o=|$9$kJ8;z$,$"$l$P$=$NJ8;z?tJ,(B
+ *		$B$3$N%U%!%s%/%7%g%s$,8F$P$l$k!#(B
+ *		client_data $B$O(B ccCreateBuf() $B$N;~$K;XDj$5$l$?%G!<%?!#(B
+ *
+ *	$B<+F03NDj%U%!%s%/%7%g%s(B:
+ *	    auto_fix(caddr_t client_data)
+ *		$B%3%s%F%-%9%H$,$J$$>uBV$G%3%s%F%-%9%H$KJ8;z$,DI2C$5$l$k(B
+ *		$BD>A0$K8F$P$l$k!#(B
+ *		client_data $B$O(B ccCreateBuf() $B$N;~$K;XDj$5$l$?%G!<%?!#(B
+ *
+ *	$B%b!<%IJQ99%U%!%s%/%7%g%s(B:
+ *	    mode_notify(int newmode, int oldmode, caddr_t client_data)
+ *		$B%+%l%s%H%b!<%I$,JQ99$5$l$?;~$K$3$N%U%!%s%/%7%g%s$,(B
+ *		$B8F$P$l$k!#(Bnewmode $B$,?7$7$$%+%l%s%H%b!<%I!"(Boldmode $B$,(B
+ *		$BA0$N%+%l%s%H%b!<%IHV9f$G$"$k!#(B
+ *
+ *	$B%(%i!<I=<(%U%!%s%/%7%g%s(B:
+ *	    error_handler(char *errstr)
+ *		ccParseRule() $BCf$G!"%(%i!<$,H/@8$7$?;~$K8F$S=P$5$l$k!#(B
+ */
+
+#ifndef lint
+static char	*rcsid = "$Id: cconv.c,v 10.10 1999/08/09 03:17:57 ishisone Exp $";
+#endif
+
+#include	<stdio.h>
+#include	<X11/Xlib.h>
+#include	<X11/keysym.h>
+#include	<X11/Xutil.h>
+#include	<X11/Xos.h>
+#include	"cconv.h"
+
+#define uchar	unsigned char
+#define ushort	unsigned short
+#define ulong	unsigned long
+
+#define Malloc(size)		malloc((unsigned int)(size))
+#define Realloc(p, size)	realloc((char *)(p), (unsigned int)(size))
+#define Free(p)			{ if (p) (void)free((char *)(p)); }
+
+#define Strcmp(s1, s2)		strcmp((char *)(s1), (char *)(s2))
+#define Strncmp(s1, s2, n)	strncmp((char *)(s1), (char *)(s2), n)
+#define Strcpy(s1, s2)		strcpy((char *)(s1), (char *)(s2))
+#define Strcat(s1, s2)		strcat((char *)(s1), (char *)(s2))
+#define Strlen(s)		strlen((char *)(s))
+
+#define EPROC2(efunc, format, a) { \
+	char tmp[1024]; \
+	(void)sprintf(tmp, format, a); \
+	eproc(efunc, tmp); }
+
+/* $B%-!<%3!<%I$N%(%s%3!<%IJ}K!(B */
+#define RAWKEY	(1L<<31)
+#define PSEUDO	(1L<<30)
+#define METAC	(1L<<29)
+#define META_ASCII	1	/* any ascii character (not useful) */
+#define META_CONTROL	2	/* any control character */
+#define META_RAW	3	/* any key event (not useful) */
+#define META_ANY	4	/* anything (character or event) */
+#define META_FUNC	5	/* any function key event */
+#define META_CURSOR	6	/* any cursor key event */
+#define META_KEYPAD	7	/* any keypad key event */
+#define META_MODIFIER	8	/* any modifier key event */
+#define META_PRINTABLE	9	/* any printable character */
+#define META_NONASCII	10	/* key event that has no ascii interpretation */
+
+/* pseudo key code */
+#define ENTERMODE	(ulong)(PSEUDO|1)
+#define EXITMODE	(ulong)(PSEUDO|2)
+
+/* function code */
+#define ENDFUNC		0xffff
+#define MODECHANGE	0x8000
+#define REDO		0x7fff
+#define PREVMODE	(MODECHANGE|0x1000)
+#define FUNC_MODIFIER_SHIFT		0x7ff0
+#define FUNC_MODIFIER_CONTROL	0x7ff1
+#define FUNC_MODIFIER_LOCK		0x7ff2
+#define FUNC_MODIFIER_MOD1		0x7ff3
+#define FUNC_MODIFIER_MOD2		0x7ff4
+#define FUNC_MODIFIER_MOD3		0x7ff5
+#define FUNC_MODIFIER_MOD4		0x7ff6
+#define FUNC_MODIFIER_MOD5		0x7ff7
+#define FUNC_MODIFIER_start		FUNC_MODIFIER_SHIFT
+#define FUNC_MODIFIER_end		FUNC_MODIFIER_MOD5
+
+#define MAXREDO		20
+
+/* key encoding */
+#define ccEncodeKey(ev) ((ulong)XLookupKeysym(ev, 0) | (ulong)RAWKEY)
+#define ccEncodeMask(ev) ((int)((ev)->state & 0xff))
+
+#define ccEncodeChar(c)	((ulong)(c))
+
+#define NOMODE		0xffff
+
+#define MATCHED_CHAR	0x8080	/* $B$3$l$O(B EUC $B$H$7$F$O(B illegal $B$J%3!<%I$J$N$G(B
+				 * $BFCJL$JL\E*$KMQ$$$k(B */
+#define CCLEAR_CHAR	0x8081	/* $B>e$KF1$8(B */
+
+#define CANONIC(c)	(((c) >= 'A' && (c) <= 'Z') ? c += ('a' - 'A') : c)
+
+/* $B%G!<%?9=B$(B */
+/* $BJQ49%k!<%k(B */
+typedef struct convdesc {
+	ulong	key;		/* $BF~NO%-!<(B */
+	ushort	mask;		/* modifier mask (of X KeyEvent) */
+	ushort	context;	/* context$BJ8;zNs(B ($B5U=g$K3JG<$5$l$k(B) */
+	ushort	result;		/* $BJQ497k2LJ8;zNs(B */
+	ushort	function;	/* function $B%Y%/%?$N%$%s%G%C%/%9(B */
+} ConvDesc;
+
+/* $B%b!<%I$4$H$N%F!<%V%k(B */
+typedef struct {
+	char		*name;		/* $B%b!<%IL>(B */
+	int		nrule;		/* $B%k!<%k$N?t(B */
+	ConvDesc	*cdbuf;		/* $B%k!<%k(B */
+	wchar		*prompt;	/* $B%W%m%s%W%HJ8;zNs(B */
+	ushort		fallthrough;
+} ModeTable;
+
+/* ccParseRule() $B$GFbItI=8=$KJQ49$5$l$?%k!<%k(B */
+typedef struct _ccRule {
+	char		*rulefile;	/* $BDj5A%U%!%$%kL>(B */
+	ccRule		next;		/* $B%k!<%k%j%9%H$N<!$NMWAG(B */
+	int		refcnt;		/* $B;2>H?t(B */
+	int		nmode;		/* $B%b!<%I$N?t(B */
+	int		initialmode;	/* $B=i4|%b!<%I(B */
+	ModeTable	*modes;		/* $B%b!<%I%F!<%V%k(B */
+	wchar		*strbuf;	/* $B%9%H%j%s%0%P%C%U%!(B */
+	ushort		*funcbuf;	/* $B%U%!%s%/%7%g%s%P%C%U%!(B */
+	int		nfunc;		/* $B%U%!%s%/%7%g%s$N?t(B */
+	char		*funcnamebuf;	/* $B%U%!%s%/%7%g%sL>$N%P%C%U%!(B */
+	void		(*errorfunc)();	/* $B%(%i!<%3!<%k%P%C%/(B */
+	int		casesensitive;	/* $BBgJ8;z>.J8;z$r6hJL$9$k$+$I$&$+(B */
+	int		autofix;	/* $B<+F03NDj$r$9$k$+$I$&$+(B */
+} ccRuleRec;
+
+static ccRule	ccrules;	/* $BJQ49%k!<%k$N%j%9%H(B */
+
+/* ccCreateBuf() $B$G:n$i$l$kJQ49%P%C%U%!(B */
+typedef struct _ccBuf {
+	ccRule	rule;			/* $BJQ49%k!<%k(B */
+	short	*functbl;
+	void	(*defaultaction)();	/* callback functions */
+	void	(*insertchar)();
+	void	(*deletechar)();
+	int	(*executefunction)();	/* True $B$rJV$;$P=>Mh$I$*$j<!$N%U%!%s%/(B
+					   $B%7%g%s$r8F$V$,!"(BFalse $B$rJV$;$P!"(B
+					   goto $B$N$h$&$K<!$N4X?t$OL5;k$9$k(B */
+	void	(*autofix)();
+	void	(*modenotify)();
+	caddr_t	client_data;
+	int	currentmode;		/* $B8=:_$N%b!<%I(B */
+	int	previousmode;		/* $B0l$DA0$N%b!<%I(B */
+	wchar	*context;
+	wchar	*contextend;
+	int	contextsize;
+	unsigned int modifier;	/* $B<!$NF~NO%-!<$r%b%G%#%U%!%$%d$D$-$K$9$k(B */
+} ccBufRec;
+
+#define STRSIZE		200
+#define MORESTRSIZE	100
+typedef struct {
+	wchar	*strbuf;
+	wchar	*strend;
+	wchar	*strp;
+} _strbufRec;
+
+#define	CDSIZE		10
+#define	MORECDSIZE	30
+typedef struct {
+	ConvDesc	*cdbuf;		/* ConvDesc $B%"%l%$(B */
+	ConvDesc	*cdend;
+	ConvDesc	*cdp;
+} _cdbufRec;
+
+#define FUNCSIZE	20
+#define MOREFUNCSIZE	20
+typedef struct {
+	ushort	*funcbuf;	/* $B%U%!%s%/%7%g%s%Y%/%?(B */
+	ushort	*funcend;
+	ushort	*funcp;
+} _funcbufRec;
+
+#define MAXFUNC			1024	/* $B%U%!%s%/%7%g%s$N<oN`$N>e8B(B */
+#define FUNCNAMESIZE		100
+#define MOREFUNCNAMESIZE	50
+typedef struct {
+	int	nfunc;
+	ushort	funcnames[MAXFUNC];
+	char	*funcnamebuf;
+	char	*funcnameend;
+	char	*funcnamep;
+	int	funcsize;
+} _funcnameRec;
+
+/* $BDj5A%U%!%$%k(B (for include directive) */
+#define MAXINC		10
+typedef struct {
+	int	findex;
+	FILE	*fp[MAXINC];
+} Files;
+
+#ifdef __STDC__
+static int wstrlen(wchar *);
+static wchar *wrev(wchar *);
+static void eproc(void (*)(), char *);
+static wchar *promptsave(wchar *);
+static int parseLine(uchar *, uchar **, int);
+static FILE *openfile(char *);
+static int doinclude(uchar *, Files *, void (*)());
+static uchar *getline(uchar *, int, Files *, void (*)());
+static int readRuleFile(ccRule, char *);
+static int registMode(ccRule, int, uchar **);
+static int newMode(ccRule, Files *, _strbufRec *, _funcbufRec *,
+		   _funcnameRec *, int, uchar **);
+static int getDesc(ccRule, uchar *, _funcbufRec *, _funcnameRec *,
+		   ulong *, int *, wchar *, wchar *, int *);
+static int getMode(ccRule, uchar *);
+static uchar *getQuote(uchar *, wchar *, int);
+static int getKey(uchar *, ulong *, int *);
+static int getmask(uchar *);
+static char *strinc(char *, char *);
+static ulong getcode(uchar *);
+static int getFunc(ccRule, _funcbufRec *, _funcnameRec *, int, uchar **);
+static ccRule findRule(char *);
+static void addRule(ccRule);
+static void deleteRule(ccRule);
+static int wstrsave(_strbufRec *, wchar *);
+static int wstralloc(_strbufRec *, int);
+static void wstradjust(_strbufRec *);
+static ConvDesc *cdalloc(_cdbufRec *);
+static void cdadjust(_cdbufRec *);
+static int funcalloc(_funcbufRec *, int);
+static void funcadjust(_funcbufRec *);
+static int funcsearch(_funcnameRec *, char *);
+static void funcnameadjust(_funcnameRec *);
+static int convchar(ccBuf, ulong, int, char *, int);
+static int cconvert(ccBuf, int, ulong, int, int *, char *, int);
+static int metamatch(ulong, ulong, int);
+static int contextMatch(ccBuf, wchar *);
+static void substStr(ccBuf, wchar *, wchar *, char *, int);
+#else
+static int wstrlen();
+static wchar *wrev();
+static void eproc();
+static wchar *promptsave();
+static int parseLine();
+static int readRuleFile();
+static int registMode();
+static int newMode();
+static int getDesc();
+static int getMode();
+static uchar *getQuote();
+static int getKey();
+static int getmask();
+static char *strinc();
+static ulong getcode();
+static int getFunc();
+static int wstrsave();
+static int wstralloc();
+static void wstradjust();
+static ConvDesc *cdalloc();
+static void cdadjust();
+static int funcalloc();
+static void funcadjust();
+static int funcsearch();
+static void funcnameadjust();
+static int convchar();
+static int cconvert();
+static int metamatch();
+static int contextMatch();
+static void substStr();
+#endif
+
+/*
+ *	Private Functions
+ */
+
+static int wstrlen(str)
+wchar *str;
+{
+	int	len = 0;
+
+	while (*str++)
+		len++;
+	return len;
+}
+
+static wchar *wrev(s)
+wchar *s;
+{
+	wchar	*str = s;
+	wchar	*end = str;
+	int	c;
+
+	while (*end++)
+		;
+	end -= 2;
+	while (str < end) {
+		c = *str;
+		*str++ = *end;
+		*end-- = c;
+	}
+	return s;
+}
+
+static void eproc(efunc, msg)
+void (*efunc)();
+char *msg;
+{
+	if (efunc == NULL) {
+		/* stderr $B$K%W%j%s%H(B */
+		(void)fprintf(stderr, "%s\n", msg);
+	} else {
+		/* $B%(%i!<%O%s%I%i$r8F$V(B */
+		(*efunc)(msg);
+	}
+}
+
+static wchar *promptsave(str)
+wchar *str;
+{
+	int	len = (wstrlen(str) + 1) * sizeof(wchar);
+	wchar	*p = (wchar *)Malloc(len);
+
+	if (p != NULL) {
+		wchar	*q = p;
+		while (*q++ = *str++)
+			;
+	}
+	return p;
+}
+
+static int parseLine(line, argv, argvsize)
+uchar *line;
+uchar **argv;
+int argvsize;
+{
+	int	c, qc;
+	int	argc;
+	int	state;
+#define IN_WORD		1	/* $B%o!<%I$NCf(B */
+#define IN_QUOTE	2	/* $B%o!<%I$NCf$G$5$i$K%/%)!<%H$NCf(B */
+
+	qc = 0;		/* not necessary, but for lint */
+	argc = 0;
+	state = 0;	/* $B%o!<%I$N30(B */
+	while (c = *line) {
+		/* $B%/%)!<%H$5$l$F$$$J$$6uGrJ8;z$O!"%o!<%I$r=*$i$;$k(B */
+		if (state != IN_QUOTE && (c == ' ' || c == '\t' || c == '\n')) {
+			/* NULL $B%?!<%_%M!<%H$5$;$k(B */
+			*line++ = '\0';
+			state = 0;
+			continue;
+		}
+		/* $B%o!<%I$N30$N6uGr0J30$NJ8;z$O!"%o!<%I$N;O$^$j$K$J$k(B */
+		if (state == 0) {
+			if (argc >= argvsize)
+				return argc;
+			argv[argc++] = line;
+			state = IN_WORD;
+		}
+		/* $B%P%C%/%9%i%C%7%e$O!"<!$NJ8;z$r%9%-%C%W$5$;$k(B */
+		if (c == '\\') {
+			/* $B$H$O$$$C$F$b<!$,(B Nul $BJ8;z$J$iOC$OJL(B */
+			if (*++line == '\0') {
+				*--line = '\0';
+				break;
+			}
+		} else if (state == IN_QUOTE) {
+			/* $B%/%)!<%H$O;O$^$j$HF1$8J8;z$G=*$k(B */
+			if (c == qc)
+				state = IN_WORD;
+		} else if (c == '\'' || c == '"') {
+			/* $B%/%)!<%H$N30$K%/%)!<%HJ8;z$,$"$l$P%/%)!<%H$N;O$^$j(B */
+			state = IN_QUOTE;
+			qc = c;
+		}
+		line++;
+	}
+
+	/* $B:G8e$N%/%)!<%H$,JD$8$F$$$J$$$+$b$7$l$J$$(B */
+	return state != IN_QUOTE ? argc : argc - 1;
+}
+
+/* openfile -- $BDj5A%U%!%$%k$r%*!<%W%s$9$k(B */
+static FILE *openfile(file)
+char *file;
+{
+	FILE	*fp;
+	char	filename[1024];
+	FILE	*fopen();
+	char	*getenv();
+
+	if ((fp = fopen(file, "r")) == NULL && *file != '/') {
+		char	*p, *q;
+		/* $B4D6-JQ?t(B CC_DEF_PATH $B$,$"$l$P$=$N%Q%9$N2<$r(B
+		 * $B%5!<%A$9$k(B
+		 */
+		if ((p = getenv("CC_DEF_PATH")) != NULL) {
+			while (*p != '\0') {
+				q = filename;
+				while (*p != '\0' && *p != ':')
+					*q++ = *p++;
+				if (*p == ':') p++;
+				if (q == filename) continue;
+				*q++ = '/';
+				*q = '\0';
+				(void)Strcat(filename, file);
+				if ((fp = fopen(filename, "r")) != NULL)
+					return fp;
+			}
+		}
+		/* $B%G%U%)%k%H$N%5!<%A%Q%9(B CCDEFPATH(/usr/lib/X11/ccdef) $B$N(B
+		 * $B2<$r%5!<%A$9$k(B
+		 */
+		(void)Strcpy(filename, CCDEFPATH);
+		(void)Strcat(filename, file);
+		fp = fopen(filename, "r");
+	}
+	return fp;
+}
+
+/* doinclude -- include $B9T$N=hM}$r$9$k(B */
+static int doinclude(line, files, efunc)
+uchar *line;
+Files *files;
+void (*efunc)();
+{
+	int	argc;
+	uchar	*argv[2];
+	char	*name;
+
+	argc = parseLine(line, argv, 2);
+	if (files->findex > MAXINC - 2) {
+		eproc(efunc, "include nesting too deep");
+		return -1;
+	}
+	if (argc < 2) {
+		eproc(efunc, "missing include filename");
+		return -1;
+	}
+	name = (char *)argv[1];
+	if (*name == '\'' || *name == '"') {
+		name++;
+		name[strlen(name) - 1] = '\0';
+	}
+	if ((files->fp[++files->findex] = openfile(name)) == NULL) {
+		EPROC2(efunc, "can't open %s", name);
+		--files->findex;
+		return -1;
+	}
+	return 0;
+}
+
+/* getline -- 1$B9TFI$_9~$`(B ($B$=$N:](B include $B$N=hM}$r9T$J$&(B) */
+static uchar *getline(line, linesize, files, efunc)
+uchar *line;
+int linesize;
+Files *files;
+void (*efunc)();
+{
+ redo:
+	if (fgets((char *)line, linesize, files->fp[files->findex])) {
+		register uchar	*p = line;
+		while (*p == ' ' || *p == '\t')
+			p++;
+		if (!Strncmp(p, "include", 7)) {
+			if (doinclude(p, files, efunc) < 0) {
+				return NULL;
+			} else {
+				goto redo;
+			}
+		}
+		return line;
+	}
+	(void)fclose(files->fp[files->findex]);
+	files->findex--;
+
+	if (files->findex >= 0) {
+		goto redo;
+	}
+
+	return NULL;
+}
+
+/* readRuleFile -- $BJQ49%k!<%kDj5A%U%!%$%k$rFI$_9~$`(B */
+static int readRuleFile(rule, file)
+ccRule rule;
+char *file;
+{
+	FILE		*fp;
+	int		moderegistered;
+	uchar	line[256], tmp[256];
+	uchar	*argv[20];
+	int		argc;
+	_strbufRec	strrec;
+	_funcbufRec	funcrec;
+	_funcnameRec	fnrec;
+	Files		files;
+	void		(*efunc)() = rule->errorfunc;
+	int		err = 0;
+
+	if ((fp = openfile(file)) == NULL) {
+		EPROC2(efunc, "can't open file %s", file);
+		return -1;
+	}
+	files.findex = 0;
+	files.fp[0] = fp;
+
+	moderegistered = 0;
+
+	strrec.strbuf = NULL;
+	funcrec.funcbuf = NULL;
+	fnrec.nfunc = 0;
+	fnrec.funcnamebuf = NULL;
+
+	rule->nmode = 0;
+	rule->initialmode = -1;
+
+	while (getline(line, sizeof(line), &files, efunc)) {
+		(void)Strcpy(tmp, line);
+		if ((argc = parseLine(tmp, argv, 20)) == 0)
+			continue;
+
+		/* '#' $B$G;O$^$k9T$O%3%a%s%H(B */
+		if (*line == '\0' || *line == '\n' || *line == '#') {
+			continue;
+		} else if (!moderegistered && argc > 1 &&
+			   !Strcmp(argv[0], "defmode")) {
+			/* $B%b!<%IDj5A9T(B */
+			if (registMode(rule, argc, argv) < 0) {
+				err++;
+				break;
+			}
+			moderegistered++;
+		} else if (!Strcmp(argv[0], "mode") && argc > 2) {
+			/* $B$"$k%b!<%I$KBP$9$kJQ49Dj5A(B */
+			if (!moderegistered) {
+				eproc(efunc, "'mode' before 'defmode'");
+				err++;
+				break;
+			}
+			if (newMode(rule, &files, &strrec, &funcrec, &fnrec,
+				    argc, argv) < 0) {
+				err++;
+				break;
+			}
+		} else if (!Strcmp(argv[0], "initialmode") &&
+			   argc > 1) {
+			if (!moderegistered) {
+				eproc(efunc, "'initialmode' before 'defmode'");
+				err++;
+				break;
+			}
+			rule->initialmode = getMode(rule, argv[1]);
+		} else if (!Strcmp(argv[0], "casesensitive")) {
+			rule->casesensitive = True;
+		} else if (!Strcmp(argv[0], "caseinsensitive")) {
+			rule->casesensitive = False;
+		} else if (!Strcmp(argv[0], "autofix")) {
+			rule->autofix = True;
+		} else if (!Strcmp(argv[0], "noautofix")) {
+			rule->autofix = False;
+		} else {
+			EPROC2(efunc, "syntax error - %s", line);
+		}
+	}
+
+	/* Close all opened files. */
+	while (files.findex >= 0) {
+		(void)fclose(files.fp[files.findex--]);
+	}
+
+	if (err) {
+		return -1;
+	}
+	if (rule->nmode == 0) {
+		eproc(efunc, "no modes defined");
+		return -1;
+	}
+	if (!moderegistered) {
+		eproc(efunc, "'defmode' required");
+		return -1;
+	}
+	if (rule->initialmode < 0) {
+		eproc(efunc, "'initialmode' required");
+		return -1;
+	}
+
+	wstradjust(&strrec);
+	funcadjust(&funcrec);
+	funcnameadjust(&fnrec);
+
+	rule->strbuf = strrec.strbuf;
+	rule->funcbuf = funcrec.funcbuf;
+	rule->funcnamebuf = fnrec.funcnamebuf;
+	rule->nfunc = fnrec.nfunc;
+#ifdef DEBUG_CCONV
+	dumpAllRules(rule);
+#endif
+
+	return 0;
+}
+
+static int registMode(rule, ac, av)
+ccRule rule;
+int ac;
+uchar **av;
+{
+	int		nmode;
+	ModeTable	*modes;
+	int		i;
+
+	ac--, av++;
+
+	nmode = ac;
+	modes = (ModeTable *)Malloc(nmode * sizeof(ModeTable));
+	if (modes == NULL) {
+		eproc(rule->errorfunc, "can't alloc memory");
+		return -1;
+	}
+	rule->modes = modes;
+
+	for (i = 0; i < nmode; i++) {
+		if ((modes[i].name = Malloc(Strlen(av[i]) + 1)) == NULL) {
+			eproc(rule->errorfunc, "can't alloc memory");
+			Free(modes);
+			return -1;
+		}
+		(void)Strcpy(modes[i].name, av[i]);
+		modes[i].nrule = 0;
+		modes[i].cdbuf = NULL;
+		modes[i].prompt = NULL;
+		modes[i].fallthrough = NOMODE;
+	}
+
+	rule->nmode = nmode;
+	return 0;
+}
+
+/* newMode -- $B$"$k%b!<%I$K$D$$$F$N%k!<%k$rFI$_9~$`(B */
+static int newMode(rule, files, srec, frec, fnrec, ac, av)
+ccRule rule;
+Files *files;
+_strbufRec *srec;
+_funcbufRec *frec;
+_funcnameRec *fnrec;
+int ac;
+uchar **av;
+{
+	uchar	line[256];
+	int		mode;
+	ulong		inkey;
+	int		modmask;
+	wchar		prompt[30], context[100], result[100];
+	int		func;
+	int		ndesc = 0;
+	ModeTable	*mp;
+	ConvDesc	*cdp;
+	_cdbufRec	cdbuf;
+	void		(*efunc)() = rule->errorfunc;
+
+	/* $B%U%)!<%^%C%H$O(B
+	 * "mode <$B%b!<%IL>(B> <"$B%W%m%s%W%HJ8;zNs(B"> [fallthrough <$B%b!<%IL>(B>]
+	 */
+	/* $B%b!<%I$N%A%'%C%/(B */
+	if ((mode = getMode(rule, av[1])) < 0) {
+		EPROC2(efunc, "illegal modename: %s", av[1]);
+		return -1;	/* No Such Mode */
+	}
+	mp = &rule->modes[mode];
+
+	if (getQuote(av[2], prompt, 0) == NULL) {
+		EPROC2(efunc, "illegal prompt: %s", av[2]);
+		return -1;
+	}
+	mp->prompt = promptsave(prompt);
+	mp->nrule = 0;
+	
+	if (ac > 4 && !Strcmp(av[3], "fallthrough")) {
+		mp->fallthrough = getMode(rule, av[4]);
+	} else {
+		mp->fallthrough = NOMODE;
+	}
+
+	cdbuf.cdbuf = NULL;
+
+	/* $B%k!<%k$rFI$s$G%9%H%"$9$k(B */
+	while (getline(line, sizeof(line), files, efunc)) {
+		/* '#' $B$G;O$^$k9T$O%3%a%s%H(B */
+		if (*line == '\0' || *line == '\n' || *line == '#')
+			continue;
+		if (!Strncmp(line, "endmode", 6))
+			break;
+		if (getDesc(rule, line, frec, fnrec, &inkey, &modmask,
+			    context, result, &func)) {
+			if ((cdp = cdalloc(&cdbuf)) == NULL) {
+				return -1;
+			}
+
+			/* $B%k!<%k$N%9%H%"(B */
+			cdp->key = inkey;
+			cdp->mask = modmask;
+			cdp->context = *context ? wstrsave(srec, wrev(context)) : 0;
+			cdp->result = *result ? wstrsave(srec, result) : 0;
+			cdp->function = func;
+			ndesc++;
+		} else
+			EPROC2(efunc, "illegal description - %s", line);
+	}
+
+	/* $B%k!<%k$,#1$D$b$J$1$l$P%(%i!<$K$9$Y$-$@$m$&(B */
+	/* $B$H;W$C$?$,Nc$($P(B ASCII $B%b!<%I$N$H$-$K$O%k!<%k$,#1$D$b$J$$$3$H$,(B
+	 * $B$"$j$&$k(B
+	 */
+
+	cdadjust(&cdbuf);
+
+	mp->nrule = ndesc;
+	mp->cdbuf = cdbuf.cdbuf;
+
+	return 0;
+}
+
+static int getDesc(rule, line, frec, fnrec, keyp, maskp, context, result, funcp)
+ccRule rule;
+uchar *line;
+_funcbufRec *frec;
+_funcnameRec *fnrec;
+ulong *keyp;
+int *maskp;
+wchar *context;
+wchar *result;
+int *funcp;
+{
+	uchar	tmp[256];
+	uchar	*av[20];
+	int		ac;
+	void		(*efunc)() = rule->errorfunc;
+
+	/* valid description format is:
+		"context"	key	"result"	[function...]
+	*/
+
+	(void)Strcpy(tmp, line);
+	ac = parseLine(tmp, av, 20);
+	if (ac < 3) {
+		EPROC2(efunc, "syntax error - %s", line);
+		return 0;
+	}
+
+	/* context $B$NFI$_9~$_(B */
+	if (getQuote(av[0], context, 0) == NULL)
+		return 0;
+
+	/* $B%-!<%3!<%I$rFI$_9~$s$G(B */
+	if (getKey(av[1], keyp, maskp) < 0) {
+		EPROC2(efunc, "no such key (%s)", av[1]);
+		return 0;
+	}
+
+	/* result $B$rFI$_9~$s$G(B */
+	if (getQuote(av[2], result, 1) == NULL)
+		return 0;
+
+	/* $B%U%!%s%/%7%g%s$N5-=R$,$"$l$P$=$l$rFI$_9~$`(B */
+	/* $B$b$7AjEv$9$k%U%!%s%/%7%g%s$,$J$/$F$b%(%i!<$K$7$J$$(B */
+	if (ac > 3) {
+		*funcp =  getFunc(rule, frec, fnrec, ac - 3, &av[3]);
+	} else {
+		*funcp = 0;
+	}
+
+	return 1;
+}
+
+static int getMode(rule, str)
+ccRule rule;
+uchar *str;
+{
+	ModeTable	*modes = rule->modes;
+	int	i;
+
+	for (i = 0; i < rule->nmode; i++) {
+		if (!Strcmp(str, modes[i].name))
+			return i;
+	}
+	EPROC2(rule->errorfunc, "undefined mode %s", str);
+	return -1;
+}
+
+/* getQuote -- $B%/%)!<%F!<%7%g%s5-9f$G0O$^$l$?J8;zNs$rFI$s$G(B wchar $B$K$9$k(B */
+static uchar *getQuote(line, str, metaf)
+uchar	*line;
+wchar		*str;
+int		metaf;	/* '&' $B$H(B '/' $B$r%a%?!&%-%c%i%/%?$H$9$k$+$I$&$+(B */
+{
+	int	c;
+	int	quote;		/* quote flag */
+	int	qc = *line++;	/* quote character */
+#define SS2	0x8e
+#define SS3	0x8f
+
+	if (qc != '\'' && qc != '"')
+		return((uchar *)NULL);
+	
+	quote = 0;
+	while ((c = *line++) && c != qc) {
+		if (c == '\\' && !quote) {
+			quote = 1;
+			continue;
+		}
+			
+		if (c == '^' && !quote) {
+			if (c = *line++)
+				*str++ = c - '@';
+			else
+				break;
+		} else if (metaf && c == '&' && !quote)
+			*str++ = MATCHED_CHAR;
+		else if (metaf && c == '/' && !quote)
+			*str++ = CCLEAR_CHAR;
+		else if (c < 0x80)
+			*str++ = c;
+		else if (c == SS2)
+			*str++ = *line++ | 0x80;
+		else if (c == SS3) {
+			c = *line++;
+			*str++ = (c << 8) | (*line++ & 0x7f) | 0x8000;
+		} else {
+			*str++ = (c << 8) | *line++ | 0x8080;
+		}
+	}
+	*str = 0;
+
+	return((c == qc) ? line : (uchar *)NULL);
+}
+
+/* getKey -- $B%-!<%3!<%I$rFI$`(B */
+static int getKey(line, keyp, maskp)
+uchar *line;
+ulong *keyp;
+int *maskp;
+{
+	/*
+	 * $B%-!<%3!<%I$N5-=RK!$O#2DL$j(B
+	 * 1. ASCII $BI=5-(B
+	 *	'a'
+	 *	'^H'
+	 *	'\033'
+	 *	'\xff'
+	 *
+	 * 2. XKEY $BI=5-(B
+	 *	#124
+	 *	#0132
+	 *	#0x58
+	 *	shift-A
+	 *	shift-control-meta-HENKAN
+	 *
+	 * pseudo code
+	 *	ENTERMODE
+	 *	EXITMODE
+	 *
+	 * wild character
+	 *	@ascii
+	 *	@control
+	 *	@raw
+	 *	@any
+	 */
+
+	int	key = 0;
+
+	*maskp = 0;
+
+	if (*line == '\'') {	/* $B%7%s%0%k%/%)!<%H$G;O$^$k$N$G(B ASCII $BI=5-(B */
+		if (*++line == '\\') {
+			/* '\'' $B$N>l9g(B($B%7%s%0%k%/%)!<%H<+?H(B)$B!"(B
+			 * '\\' $B$N>l9g(B($B%P%C%/%9%i%C%7%e(B)
+			 * '\033' $B$N$h$&$J#8?JI=5-$N>l9g$H(B
+			 * '\x27' $B$N$h$&$J#1#6?JI=5-$N>l9g$,$"$k(B
+			 */
+			if (*++line == '\'')	/* '\'' */
+				key = '\'';
+			else if (*line == '\\')	/* '\\' */
+				key = '\\';
+			else if (*line == 'x')	/* hexadecimal */
+				(void)sscanf((char *)++line, "%x", &key);
+			else			/* octal */
+				(void)sscanf((char *)line, "%o", &key);
+			key &= 0xff;
+		} else if (*line == '^') {
+			/* '^' ($B%+%l%C%H<+?H(B) $B$^$?$O%3%s%H%m!<%k%3!<%I(B */
+			if (*++line == '\'')
+				key = '^';
+			else
+				key = *line - '@';
+		} else {
+			key = *line;
+		}
+		*keyp = key;
+	} else if (*line == '#') {	/* event code */
+		if (*++line == '0') {	/* octal or hexadecimal */
+			if (*(line + 1) == 'x')	/* hexadecimal */
+				(void)sscanf((char *)line + 2, "%x", &key);
+			else			/* octal */
+				(void)sscanf((char *)line, "%o", &key);
+		} else {
+			key = atoi((char *)line);
+		}
+		*keyp = (ulong)key | (ulong)RAWKEY;
+	} else if (!Strcmp(line, "ENTERMODE")) {
+		*keyp = ENTERMODE;
+	} else if (!Strcmp(line, "EXITMODE")) {
+		*keyp = EXITMODE;
+	} else if (*line == '@') {
+		/* $B%o%$%k%I!&%-%c%i%/%?(B */
+		line++;
+		if (!Strcmp(line, "ascii"))
+			key = META_ASCII;
+		else if (!Strcmp(line, "printable"))
+			key = META_PRINTABLE;
+		else if (!Strcmp(line, "control"))
+			key = META_CONTROL;
+		else if (!Strcmp(line, "raw"))
+			key = META_RAW;
+		else if (!Strcmp(line, "any"))
+			key = META_ANY;
+		else if (!Strcmp(line, "func"))
+			key = META_FUNC;
+		else if (!Strcmp(line, "cursor"))
+			key = META_CURSOR;
+		else if (!Strcmp(line, "keypad"))
+			key = META_KEYPAD;
+		else if (!Strcmp(line, "modifier"))
+			key = META_MODIFIER;
+		else if (!Strcmp(line, "non-ascii"))
+			key = META_NONASCII;
+		else
+			return -1;
+		*keyp = (ulong)key | (ulong)METAC;
+	} else {
+		if ((key = getcode(line)) == 0)
+			return -1;
+		*keyp = (ulong)key | (ulong)RAWKEY;
+		*maskp = getmask(line);
+	}
+	return 0;
+}
+
+/* getmask -- $B%b%G%#%U%!%$%"!&%^%9%/$rJV$9(B */
+static int getmask(s)
+uchar *s;
+{
+	int	mask = 0;
+	char	buf[256];
+	uchar	*p;
+
+	if ((p = (uchar *)rindex((char *)s, '-')) == NULL)
+		return 0;
+	(void)strncpy(buf, (char *)s, p - s);
+	buf[p - s] = '\0';
+	
+	if (strinc(buf, "shift"))
+		mask |= ShiftMask;
+	if (strinc(buf, "control"))
+		mask |= ControlMask;
+	if (strinc(buf, "lock"))
+		mask |= LockMask;
+	if (strinc(buf, "mod1"))
+		mask |= Mod1Mask;
+	if (strinc(buf, "mod2"))
+		mask |= Mod2Mask;
+	if (strinc(buf, "mod3"))
+		mask |= Mod3Mask;
+	if (strinc(buf, "mod4"))
+		mask |= Mod4Mask;
+	if (strinc(buf, "mod5"))
+		mask |= Mod5Mask;
+	return mask;
+}
+
+static char *strinc(s, k)
+char *s;
+char *k;
+{
+	register int	len = Strlen(k);
+
+	while (s = index(s, *k))
+		if (!Strncmp(s, k, len))
+			return s;
+		else
+			s++;
+	return NULL;
+}
+
+
+/* getcode -- KeySym $B$rJV$9(B */
+static ulong getcode(s)
+uchar *s;
+{
+	register uchar	*t;
+	KeySym			keysym;
+	KeySym			XStringToKeysym();
+
+	if ((t = (uchar *)rindex((char *)s, '-')) == NULL)
+		t = s;
+	else
+		t++;
+	keysym = XStringToKeysym((char *)t);
+	if (keysym == NoSymbol)
+		return (ulong)0;
+	else
+		return (ulong)keysym;
+}
+
+static int getFunc(rule, frec, fnrec, n, args)
+ccRule rule;
+_funcbufRec *frec;
+_funcnameRec *fnrec;
+int	n;
+uchar	**args;
+{
+	int	i, j;
+	uchar	*func;
+	uchar	*arg;
+	ushort	*fp;
+	int	findex;
+	void	(*efunc)() = rule->errorfunc;
+
+	findex = funcalloc(frec, n + 1);
+	fp = frec->funcbuf + findex;
+
+	j = 0;
+	while (n > 0) {
+		func = *args++;
+		if (!Strcmp(func, "goto")) {
+			/* $B%b!<%I$NJQ99(B */
+			if (n < 2)
+			    break;	/* $B%b!<%IL>$,=q$$$F$J$$(B */
+			arg = *args++;
+			--n;
+			if (!Strcmp(arg, "PREV")) {
+				fp[j++] = PREVMODE;
+				break;
+			}
+			if ((i = getMode(rule, arg)) < 0) {
+				break;
+			}
+			fp[j++] = MODECHANGE | i;
+			break;
+		} else if (!Strcmp(func, "redo")) {
+			fp[j++] = REDO;
+			break;
+		} else if (!Strncmp(func, "add-modifier-",
+							sizeof("add-modifier-") - 1)) {
+			/* $B<!$NF~NO%-!<$r%b%G%#%U%!%$%d$D$-$K$9$k(B */
+			char *mod = func + sizeof("add-modifier-") - 1;
+			if      (!Strcmp(mod, "shift"  )) fp[j++] = FUNC_MODIFIER_SHIFT;
+			else if (!Strcmp(mod, "control")) fp[j++] = FUNC_MODIFIER_CONTROL;
+			else if (!Strcmp(mod, "lock"   )) fp[j++] = FUNC_MODIFIER_LOCK;
+			else if (!Strcmp(mod, "mod1"   )) fp[j++] = FUNC_MODIFIER_MOD1;
+			else if (!Strcmp(mod, "mod2"   )) fp[j++] = FUNC_MODIFIER_MOD2;
+			else if (!Strcmp(mod, "mod3"   )) fp[j++] = FUNC_MODIFIER_MOD3;
+			else if (!Strcmp(mod, "mod4"   )) fp[j++] = FUNC_MODIFIER_MOD4;
+			else if (!Strcmp(mod, "mod5"   )) fp[j++] = FUNC_MODIFIER_MOD5;
+			break;
+		} else {
+			/* $B%U%!%s%/%7%g%sI=$N8!:w(B */
+			int	fnum;
+			if ((fnum = funcsearch(fnrec, (char *)func)) < 0) {
+				EPROC2(efunc, "too many functions (> %d)", MAXFUNC);
+			} else {
+				fp[j++] = fnum;
+			}
+		}
+		--n;
+	}
+	fp[j++] = ENDFUNC;
+	frec->funcp = fp + j;	/* kludge */
+	return findex;
+}
+
+static ccRule
+findRule(rulefile)
+char *rulefile;
+{
+	ccRule	rule = ccrules;
+
+	while (rule) {
+		if (rule->rulefile && !strcmp(rulefile, rule->rulefile)) {
+			return rule;
+		}
+		rule = rule->next;
+	}
+	return NULL;
+}
+
+static void
+addRule(rule)
+ccRule rule;
+{
+	rule->refcnt = 1;
+	rule->next = ccrules;
+	ccrules = rule;
+}
+
+static void
+deleteRule(rule)
+ccRule	rule;
+{
+	ccRule	rp = ccrules;
+	ccRule	rp0 = NULL;
+
+	while (rp) {
+		if (rule == rp) {
+			if (rp0 == NULL) {
+				ccrules = rp->next;
+			} else {
+				rp0->next = rp->next;
+			}
+			return;
+		}
+		rp0 = rp;
+		rp = rp->next;
+	}
+}
+
+static int wstrsave(srec, str)
+_strbufRec *srec;
+wchar *str;
+{
+	int	len = wstrlen(str);
+	int	pos;
+	wchar	*p;
+
+	pos = wstralloc(srec, len + 1);
+	if (pos > 0) {
+		p = srec->strbuf + pos;
+		while (len-- > 0) {
+			*p++ = *str++;
+		}
+		*p = 0;
+	}
+	return pos;
+}
+
+/* $B%P%C%U%!%"%m%1!<%H%U%!%s%/%7%g%s(B */
+
+static int wstralloc(srec, len)
+_strbufRec *srec;
+int len;
+{
+	int	ret;
+
+	if (srec->strbuf == NULL) {
+		/* allocate srec->strbuf */
+		srec->strbuf = (wchar *)Malloc(STRSIZE * sizeof(wchar));
+		if (srec->strbuf == NULL)
+			return 0;
+		srec->strend = srec->strbuf + STRSIZE;
+		srec->strp = srec->strbuf;
+		*srec->strp++ = 0;	/* dummy */
+	}
+	if (srec->strp + len > srec->strend) {
+		/* allocate more memory */
+		int	size = (srec->strp + len) - srec->strend;
+		int	offset = srec->strp - srec->strbuf;
+		wchar	*wp;
+
+		if (size < MORESTRSIZE)
+			size = MORESTRSIZE;
+		size += srec->strend - srec->strbuf;
+		wp = (wchar *)Realloc(srec->strbuf, size * sizeof(wchar));
+		if (wp == NULL)
+			return 0;
+		srec->strp = wp + offset;
+		srec->strbuf = wp;
+		srec->strend = wp + size;
+	}
+
+	ret = srec->strp - srec->strbuf;
+	srec->strp += len;
+
+	return ret;
+}
+
+static void wstradjust(srec)
+_strbufRec *srec;
+{
+	int	size = srec->strp - srec->strbuf;
+	wchar	*wp;
+
+	if (size == 0) return;
+	wp = (wchar *)Realloc(srec->strbuf, size * sizeof(wchar));
+	if (wp != NULL) {
+		srec->strbuf = wp;
+		srec->strp = srec->strend = wp + size;
+	}
+}
+
+static ConvDesc *cdalloc(crec)
+_cdbufRec *crec;
+{
+	ConvDesc	*ret;
+
+	if (crec->cdbuf == NULL) {
+		crec->cdbuf = (ConvDesc *)Malloc(CDSIZE * sizeof(ConvDesc));
+		if (crec->cdbuf == NULL)
+			return NULL;
+		crec->cdend = crec->cdbuf + CDSIZE;
+		crec->cdp = crec->cdbuf;
+	}
+	if (crec->cdp >= crec->cdend) {
+		int	size = crec->cdend - crec->cdbuf + MORECDSIZE;
+		int	offset = crec->cdp - crec->cdbuf;
+		ConvDesc	*cdp;
+
+		cdp = (ConvDesc *)Realloc(crec->cdbuf, size * sizeof(ConvDesc));
+		if (cdp == NULL) {
+			return NULL;
+		}
+		crec->cdp = cdp + offset;
+		crec->cdbuf = cdp;
+		crec->cdend = cdp + size;
+	}
+
+	ret = crec->cdp++;
+	return ret;
+}
+
+static void cdadjust(crec)
+_cdbufRec *crec;
+{
+	int		size = crec->cdp - crec->cdbuf;
+	ConvDesc	*cdp;
+
+	if (size == 0) return;
+	cdp = (ConvDesc *)Realloc(crec->cdbuf, size * sizeof(ConvDesc));
+	if (cdp != NULL) {
+		crec->cdbuf = cdp;
+		crec->cdp = crec->cdend = cdp + size;
+	}
+}
+
+static int funcalloc(frec, n)
+_funcbufRec *frec;
+int n;
+{
+	int	ret;
+
+	if (frec->funcbuf == NULL) {
+		/* allocate funcbuf */
+		frec->funcbuf = (ushort *)Malloc(FUNCSIZE * sizeof(ushort));
+		if (frec->funcbuf == NULL)
+			return 0;
+		frec->funcend = frec->funcbuf + FUNCSIZE;
+		frec->funcp = frec->funcbuf;
+		*(frec->funcp)++ = ENDFUNC;	/* dummy */
+	}
+	if (frec->funcp + n > frec->funcend) {
+		/* allocate more memory */
+		int	size = (frec->funcp + n) - frec->funcend;
+		int	offset = frec->funcp - frec->funcbuf;
+		ushort	*up;
+
+		if (size < MOREFUNCSIZE)
+			size = MOREFUNCSIZE;
+		size += frec->funcend - frec->funcbuf;
+		up = (ushort *)Realloc(frec->funcbuf, size * sizeof(ushort));
+		if (up == NULL)
+			return 0;
+		frec->funcp = up + offset;
+		frec->funcbuf = up;
+		frec->funcend = up + size;
+	}
+
+	ret = frec->funcp - frec->funcbuf;
+	frec->funcp += n;
+
+	return ret;
+}
+
+static void funcadjust(frec)
+_funcbufRec *frec;
+{
+	int	size = frec->funcp - frec->funcbuf;
+	ushort	*fp;
+
+	if (size == 0) return;
+	fp = (ushort *)Realloc(frec->funcbuf, size * sizeof(ushort));
+	if (fp != NULL) {
+		frec->funcbuf = fp;
+		frec->funcp = frec->funcend = fp + size;
+	}
+}
+
+static int funcsearch(fnrec, funcname)
+_funcnameRec *fnrec;
+char *funcname;
+{
+	int	nfunc = fnrec->nfunc;
+	ushort	*fnames = fnrec->funcnames;
+	char	*fnbuf = fnrec->funcnamebuf;
+	int	i;
+	int	len;
+
+	for (i = 0; i < nfunc; i++) {
+		if (!strcmp(funcname, fnbuf + *fnames++))
+			return i;
+	}
+
+	if (nfunc >= MAXFUNC)
+		return -1;
+
+	len = strlen(funcname) + 1;
+
+	/* add new function */
+	if (fnrec->funcnamebuf == NULL) {
+		/* allocate funcnamebuf */
+		if ((fnrec->funcnamebuf = Malloc(FUNCNAMESIZE)) == NULL)
+			return -1;
+		fnrec->funcnameend = fnrec->funcnamebuf + FUNCNAMESIZE;
+		fnrec->funcnamep = fnrec->funcnamebuf;
+	}
+	if (fnrec->funcnamep + len > fnrec->funcnameend) {
+		/* allocate more memory */
+		int	size = (fnrec->funcnamep + len) - fnrec->funcnameend;
+		int	offset = fnrec->funcnamep - fnrec->funcnamebuf;
+		char	*cp;
+
+		if (size < MOREFUNCNAMESIZE)
+			size = MOREFUNCNAMESIZE;
+		size += fnrec->funcnameend - fnrec->funcnamebuf;
+		if ((cp = Realloc(fnrec->funcnamebuf, size)) == NULL)
+			return 0;
+		fnrec->funcnamep = cp + offset;
+		fnrec->funcnamebuf = cp;
+		fnrec->funcnameend = cp + size;
+	}
+
+	(void)strcpy(fnrec->funcnamep, funcname);
+	fnrec->funcnames[nfunc] = fnrec->funcnamep - fnrec->funcnamebuf;
+	fnrec->funcnamep += len;
+
+	return fnrec->nfunc++;
+}
+
+static void funcnameadjust(fnrec)
+_funcnameRec *fnrec;
+{
+	int	size = fnrec->funcnamep - fnrec->funcnamebuf;
+	char	*cp;
+
+	if (size == 0) return;
+	if (cp = Realloc(fnrec->funcnamebuf, size)) {
+		fnrec->funcnamebuf = cp;
+		fnrec->funcnamep = fnrec->funcnameend = cp + size;
+	}
+}
+
+static int convchar(buf, key, mask, str, len)
+ccBuf buf;
+ulong key;	/* keysym (RAWKEY) or ascii code */
+int mask;	/* modifier mask */
+char *str;	/* ascii interpretation */
+int len;	/* length of str */
+{
+	int	r;
+	int	func;
+	int	redocount = 0;
+	ushort	*fp;
+	ccRule	rule = buf->rule;
+
+ redo:
+	/* $B$^$:$O8=:_$N%b!<%I$N%k!<%k$GJQ49$7$F$_$k(B */
+	r = cconvert(buf, buf->currentmode, key, mask, &func, str, len);
+	if (r < 0) {
+		/* $B%^%C%A$9$k%k!<%k$,8+$D$+$i$J$+$C$?$N$G(B
+		 * fallthrough $B$G;XDj$5$l$k%b!<%I$N%k!<%k$rC5$9(B
+		 */
+		int	tmpmode = rule->modes[buf->currentmode].fallthrough;
+
+		while (tmpmode != NOMODE) {
+			r = cconvert(buf, tmpmode, key, mask, &func, str, len);
+			if (r >= 0)	/* $B%^%C%A$7$?(B */
+				break;
+			tmpmode = rule->modes[tmpmode].fallthrough;
+		}
+	}
+
+	if (r < 0)
+		return -1;	/* $B$I$l$K$b%^%C%A$7$J$+$C$?(B */
+
+	if (func == 0)
+		return 0;	/* $B2?$b$7$J$$(B */
+
+	fp = rule->funcbuf + func;
+	while ((func = *fp++) != ENDFUNC) {
+		if (func == REDO) {
+			if (redocount++ > MAXREDO)
+			    return -1;	/* $B$?$V$sL58B%k!<%W(B */
+			else
+			    goto redo;	/* redo -- $B$b$&0lEY(B */
+		} else if (func & MODECHANGE) {	/* $B%+%l%s%H%b!<%I$NJQ99(B */
+			int	tmpmode = buf->currentmode;
+			
+			/* pseudo-key $B$NF~NO(B */
+			(void)convchar(buf, EXITMODE, 0, (char *)NULL, 0);
+			
+			if (func == PREVMODE) {
+				buf->currentmode = buf->previousmode;
+			} else {
+				buf->currentmode = func & ~MODECHANGE;
+			}
+			buf->previousmode = tmpmode;
+			
+			/* pseudo-key $B$NF~NO(B */
+			(void)convchar(buf, ENTERMODE, 0, (char *)NULL, 0);
+			
+			/* $B%b!<%I$,JQ$o$C$?;~$K$O%3%s%F%-%9%H$r%/%j%"$9$k(B */
+			ccContextClear(buf);
+
+			/* $B%b!<%IJQ99%3!<%k%P%C%/$,$"$l$P8F$S=P$9(B */
+			if (buf->modenotify) {
+				(*buf->modenotify)(buf->currentmode,
+						  buf->previousmode,
+						  buf->client_data);
+			}
+			break;
+		} else if (FUNC_MODIFIER_start <= func &&
+				   func <= FUNC_MODIFIER_end) {
+			/* $B<!$NF~NO%-!<$r%b%G%#%U%!%$%d$D$-$K$9$k(B */
+		  switch (func) {
+		  case FUNC_MODIFIER_SHIFT:   buf->modifier |= ShiftMask; break;
+		  case FUNC_MODIFIER_CONTROL: buf->modifier |= ControlMask; break;
+		  case FUNC_MODIFIER_LOCK:    buf->modifier |= LockMask; break;
+		  case FUNC_MODIFIER_MOD1:    buf->modifier |= Mod1Mask; break;
+		  case FUNC_MODIFIER_MOD2:    buf->modifier |= Mod2Mask; break;
+		  case FUNC_MODIFIER_MOD3:    buf->modifier |= Mod3Mask; break;
+		  case FUNC_MODIFIER_MOD4:    buf->modifier |= Mod4Mask; break;
+		  case FUNC_MODIFIER_MOD5:    buf->modifier |= Mod5Mask; break;
+		  }
+		} else {
+			int	truefunc = buf->functbl[func];
+			/* $B%G%#%9%Q%C%A!&%k!<%A%s$r8F$V(B */
+			if (truefunc >= 0) {
+				if (!(*buf->executefunction)(truefunc, str, len,
+							buf->client_data))
+					break;
+			}
+		}
+	}
+	return 0;
+}
+
+static int cconvert(buf, mode, inkey, mask, func, str, len)
+ccBuf buf;
+int mode;	/* current mode */
+ulong inkey;	/* input key (raw/mapped) */
+int mask;
+int *func;	/* function */
+char *str;
+int len;
+{
+	ccRule		rule = buf->rule;
+	ConvDesc	*entry;
+	ulong		key;
+	int		n;
+	ModeTable	*modep;
+
+	if (mode < 0 || mode >= rule->nmode)
+		return -1;	/* No Such Mode */
+
+	modep = &rule->modes[mode];
+
+	if ((n = modep->nrule) <= 0)
+		return -1;	/* No Rules */
+
+	for (entry = modep->cdbuf; --n >= 0; entry++) {
+		key = entry->key;
+		if (key & (ulong)METAC) {
+			/* $B%o%$%k%I%+!<%IJ8;z$N%^%C%A%s%0(B */
+			if (!metamatch(key, inkey, len == 0))
+				continue;
+		} else if (key & (ulong)RAWKEY && mask != entry->mask) {
+			continue;
+		} else if (key != inkey) {
+			continue;
+		}
+
+		/* $B%-!<$,%^%C%A$7$?(B */
+		if (contextMatch(buf, rule->strbuf + entry->context)) {
+			substStr(buf, rule->strbuf + entry->context,
+				 rule->strbuf + entry->result, str, len);
+			*func = entry->function;
+			return 0;
+		}
+	}
+
+	return -1;	/* No Match */
+}
+
+static int metamatch(rkey, inkey, nonascii)
+ulong rkey;
+ulong inkey;
+int nonascii;
+{
+	int	type = (int)(rkey & 0xff);
+
+	switch (type) {
+	case META_ASCII:
+		return !(inkey & (ulong)(RAWKEY|PSEUDO));
+	case META_PRINTABLE:
+		return (0x20 <= inkey && inkey < 0x7f);
+	case META_CONTROL:
+		return inkey < 0x20;
+	case META_RAW:
+		return inkey & (ulong)RAWKEY;
+	case META_ANY:
+		return 1;
+	case META_FUNC:
+		return (inkey & (ulong)RAWKEY) && IsFunctionKey(inkey & 0xffff);
+	case META_CURSOR:
+		return (inkey & (ulong)RAWKEY) && IsCursorKey(inkey & 0xffff);
+	case META_KEYPAD:
+		return (inkey & (ulong)RAWKEY) && IsKeypadKey(inkey & 0xffff);
+	case META_MODIFIER:
+		return (inkey & (ulong)RAWKEY) && IsModifierKey(inkey & 0xffff);
+	case META_NONASCII:
+		return (inkey & (ulong)RAWKEY) && nonascii;
+	default:
+		return 0;
+	}
+	/* NOTREACHED */
+}
+
+static int contextMatch(buf, context)
+ccBuf buf;
+wchar *context;
+{
+	wchar	*c0 = buf->contextend;
+	wchar	*c1 = buf->context;
+	int	cs = buf->rule->casesensitive;
+
+	if (context == 0 || *context == 0)
+		return 1;	/* $BL5>r7o%^%C%A(B */
+	if (c0 - c1 < wstrlen(context))	/* $BD9$5$N%A%'%C%/(B */
+		return 0;	/* matching fail */
+	c0--;
+	while (*context) {
+		if ((!cs && CANONIC(*c0) == CANONIC(*context)) ||
+		    (cs && *c0 == *context))
+			c0--, context++;
+		else
+			return 0;	/* fail */
+	}
+	return 1;
+}
+
+static void substStr(buf, context, result, str, len)
+ccBuf buf;
+wchar *context;
+wchar *result;
+char *str;
+int len;
+{
+	register int	c;
+	int		nbytes;
+	uchar	*bufp;
+
+	/* $B%3%s%F%-%9%H$NJ,$r>C$9(B */
+	while (*context++) {
+		ccContextDelete(buf);
+		(*buf->deletechar)(buf->client_data);
+	}
+
+	while (c = *result++) {
+		if (c == MATCHED_CHAR) {
+			nbytes = len;
+			bufp = (uchar *)str;
+			while (nbytes-- > 0) {
+				c = *bufp++;
+				/* bufp $B$NCf?H$O(B ASCII $B$+(B $B%+%J$J$N$G(B
+				 * EUC $B%W%m%;%9%3!<%I$X$NJQ49$r$o$6$o$6(B
+				 * $B$d$kI,MW$O$J$$(B
+				 */
+				ccContextAppend(buf, c);
+				(*buf->insertchar)(c, buf->client_data);
+			}
+			continue;
+		} else if (c == CCLEAR_CHAR) {
+			/* $B%3%s%F%-%9%H$r%/%j%"$9$k(B */
+			ccContextClear(buf);
+			continue;
+		}
+		ccContextAppend(buf, c);
+		(*buf->insertchar)(c, buf->client_data);
+	}
+}
+
+/* getModeSwitchMask -- mode-switch $B$N%b%G%#%U%!%$%"%^%9%/$rD4$Y$k(B */
+int getModeSwitchMask(dpy)
+Display *dpy;
+{
+	KeyCode	modeswkey;
+	struct modesw {
+		Display		*dpy;
+		int		mode_switch;
+		struct modesw	*next;
+	} *msp;
+	static struct modesw	*modeswlist;
+
+	for (msp = modeswlist; msp != NULL; msp = msp->next) {
+		if (dpy == msp->dpy) return msp->mode_switch;
+	}
+	msp = (struct modesw *)Malloc(sizeof(struct modesw));
+	msp->dpy = dpy;
+	msp->next = modeswlist;
+	modeswlist = msp;
+
+	msp->mode_switch = 0;
+
+	if ((modeswkey = XKeysymToKeycode(dpy, XK_Mode_switch)) != 0) {
+		XModifierKeymap	*map = XGetModifierMapping(dpy);
+		int	keypermod = map->max_keypermod;
+		int	modbit;
+		int	i;
+
+		for (modbit = 3; modbit < 8; modbit++) {
+			for (i = 0; i < keypermod; i++) {
+				if (map->modifiermap[keypermod * modbit + i] == modeswkey) {
+					msp->mode_switch = 1 << modbit;
+					goto found;
+				}
+			}
+		}
+	found:
+		XFreeModifiermap(map);
+	}
+
+	return msp->mode_switch;
+}
+
+/*
+ *	Public Functions
+ */
+
+/* ccParseRule -- $BJQ49Dj5A%U%!%$%k$rFI$_9~$`(B */
+ccRule ccParseRule(deffile, errprint)
+char *deffile;		/* $BF~NOJ8;zJQ49Dj5A%U%!%$%k(B */
+void (*errprint)();	/* $B%(%i!<%a%C%;!<%8I=<(MQ%3!<%k%P%C%/(B */
+{
+	ccRule		rule;
+	extern char	*getenv();
+
+	/* $BJQ49Dj5A%U%!%$%k$NFI$_9~$_(B */
+	if (deffile == NULL) {
+		/* $B4D6-JQ?t(B CC_DEF $B$rD4$Y$k(B */
+		if ((deffile = getenv("CC_DEF")) == NULL) {
+			return (ccRule)NULL;
+		}
+	}
+
+	if (rule = findRule(deffile)) {
+		/* same rule found */
+		rule->refcnt++;
+		return rule;
+	}
+
+	/* ccRuleRec $B$N%"%m%1!<%H(B */
+	if ((rule = (ccRule)Malloc(sizeof(ccRuleRec))) == NULL) {
+		return (ccRule)NULL;
+	}
+
+	rule->errorfunc = errprint;
+	rule->rulefile = Malloc(Strlen(deffile) + 1);
+	if (rule->rulefile) {
+		(void)Strcpy(rule->rulefile, deffile);
+	}
+	rule->casesensitive = False;
+	rule->autofix = False;
+
+	if (readRuleFile(rule, deffile) < 0) {
+		Free(rule);
+		return (ccRule)NULL;
+	}
+
+	addRule(rule);
+
+	return rule;
+}
+
+/* ccCreateBuf -- $BJQ49%P%C%U%!$r:n$k(B */
+ccBuf ccCreateBuf(rule, csize, functable, nfunc,
+		  def_action, insert, delete, execute, autofix, modenotify,
+		  data)
+ccRule rule;		/* $B;HMQ$9$kF~NOJ8;zJQ49%k!<%k(B */
+int csize;		/* context size ($BJ8;z?t(B) */
+char *functable[];	/* $B%U%!%s%/%7%g%s!&%F!<%V%k(B */
+int nfunc;		/* functable $B$N%(%s%H%j?t(B */
+void (*def_action)();	/* $B%G%U%)%k%H!&%"%/%7%g%s!&%3!<%k%P%C%/(B */
+void (*insert)();	/* $BJ8;zF~NO%3!<%k%P%C%/(B */
+void (*delete)();	/* $BJ8;z:o=|%3!<%k%P%C%/(B */
+int (*execute)();	/* $B%U%!%s%/%7%g%s<B9T%3!<%k%P%C%/(B */
+void (*autofix)();	/* $B<+F03NDj%3!<%k%P%C%/(B */
+void (*modenotify)();	/* $B%b!<%IJQ99DLCN%3!<%k%P%C%/(B */
+caddr_t data;		/* callback $B%G!<%?(B */
+{
+	ccBuf	buf;
+	char	*funcnamep;
+	short	*functblp;
+	int	i, j;
+
+	/* ccBuf $B$N%"%m%1!<%H(B */
+	if ((buf = (ccBuf)Malloc(sizeof(ccBufRec))) == NULL) {
+		return (ccBuf)NULL;
+	}
+
+	buf->rule = rule;
+
+	/* context $B%P%C%U%!$N%"%m%1!<%H(B */
+	if (csize <= 0) csize = 1;
+	buf->context = (wchar *)Malloc(csize * sizeof(wchar));
+	if (buf->context == NULL) {
+		Free(buf);
+		return (ccBuf)NULL;
+	}
+	buf->contextend = buf->context;
+	buf->contextsize = csize;
+
+	/* function $B%3%s%P!<%H%F!<%V%k$N%"%m%1!<%H(B */
+	buf->functbl = (short *)Malloc(rule->nfunc * sizeof(short));
+	if (buf->functbl == NULL) {
+		Free(buf->context);
+		Free(buf);
+		return (ccBuf)NULL;
+	}
+	/* ccRule $B$KF~$C$F$$$k%U%!%s%/%7%g%sI=$H!"0z?t$GM?$($i$l$?(B
+	 * $B%U%!%s%/%7%g%sI=$+$i!"(BccRule $BFbIt$N%U%!%s%/%7%g%sHV9f$H(B
+	 * $B:#M?$($i$l$?%U%!%s%/%7%g%sHV9f$H$NBP1~I=$r:n$k(B
+	 */
+	funcnamep = rule->funcnamebuf;
+	functblp = buf->functbl;
+	for (i = rule->nfunc, functblp = buf->functbl; i > 0; i--, functblp++) {
+		for (j = 0; j < nfunc; j++) {
+			if (!strcmp(functable[j], funcnamep)) {
+				*functblp = j;
+				break;
+			}
+		}
+		if (j >= nfunc) *functblp = -1;
+
+		while (*funcnamep++)
+			;
+	}
+
+	buf->defaultaction = def_action;
+	buf->insertchar = insert;
+	buf->deletechar = delete;
+	buf->executefunction = execute;
+	buf->modenotify = modenotify;
+	buf->autofix = autofix;
+	buf->client_data = data;
+
+	/* $B%+%l%s%H%b!<%I$N@_Dj(B */
+	buf->previousmode = buf->currentmode = rule->initialmode;
+
+	buf->modifier = 0;
+
+	return buf;
+}
+
+/* ccFreeRule -- $B%k!<%k$r<N$F$k(B */
+void ccFreeRule(rule)
+ccRule rule;
+{
+	ModeTable	*modep;
+	int		i;
+
+	if (rule == NULL) return;
+	if (--rule->refcnt > 0) return;
+
+	deleteRule(rule);
+
+	for (modep = rule->modes, i = 0; i < rule->nmode; modep++, i++) {
+		Free(modep->name);
+		Free(modep->cdbuf);
+		Free(modep->prompt);
+	}
+	Free(rule->rulefile);
+	Free(rule->modes);
+	Free(rule->strbuf);
+	Free(rule->funcbuf);
+	Free(rule->funcnamebuf);
+	Free(rule);
+}
+
+/* ccDestroyBuf -- $BJQ49%P%C%U%!$r<N$F$k(B */
+void ccDestroyBuf(buf)
+ccBuf buf;
+{
+	if (buf == NULL) return;
+	Free(buf->context);
+	Free(buf->functbl);
+	Free(buf);
+}
+
+/* ccConvchar -- $BJQ49MQ%U%!%s%/%7%g%s(B */
+int ccConvchar(buf, event)
+ccBuf buf;
+XKeyPressedEvent *event;	/* $B%-!<%$%Y%s%H(B */
+{
+	int	r;
+	char	str[256];
+	char	*p;
+	int	nbytes;
+	int	n;
+	KeySym	ks1, ks2;
+	int	mask;
+
+	/* $B$H$j$"$($:(B LookupString $B$7$F$*$/(B */
+	nbytes = XLookupString(event, str, sizeof(str), &ks2, 0);
+
+	/* $BF~NO%-!<$r%b%G%#%U%!%$%d$D$-$K$9$k(B */
+	if (buf->modifier) {
+		if (!IsModifierKey(ks2)) {
+			event->state |= buf->modifier;
+			buf->modifier = 0;
+			nbytes = XLookupString(event, str, sizeof(str), &ks2, 0);
+		}
+	}
+
+	/* $B$^$:$O%$%Y%s%H%3!<%I$GJQ49$7$F$_$k(B */
+	r = -1;
+	mask = ccEncodeMask(event);
+
+	/* $B$^$:$O%b%G%#%U%!%$%"$r0l:]9MN8$7$J$$(B KeySym $B$r(B
+	 * $B%3!<%I$H$7$FJQ49$7$F$_$k(B
+	 */
+	ks1 = (ulong)XLookupKeysym(event, 0);
+	if (ks1 != NoSymbol) {
+		r = convchar(buf, (ulong)ks1 | (ulong)RAWKEY,
+			     mask, str, nbytes);
+	}
+
+	/* $B>e$,%^%C%A$7$J$1$l$P!"(BShift, Lock, ModeSwitch $B$r(B
+	 * $B9MN8$7$?(B KeySym ($B$D$^$j(B XLookupString() $B$,JV$9(B KeySym) $B$,(B
+	 * NoSymbol $B$G$J$1$l$P$=$N%3!<%I$GJQ49$7$F$_$k(B
+	 */
+	if (r < 0 && ks2 != NoSymbol) {
+		int	msw = getModeSwitchMask(event->display);
+
+		if (mask & (ShiftMask | LockMask | msw)) {
+			mask &= ~(ShiftMask | LockMask | msw);
+			r = convchar(buf, (ulong)ks2 | (ulong)RAWKEY,
+				     mask, str, nbytes);
+		}
+	}
+
+	if (r < 0) {
+		int	match = 0;
+
+		if (nbytes == 0) return 0;
+
+		/* ASCII $BI=5-$GJQ49$7$F$_$k(B */
+		p = str;
+		n = nbytes;
+		while (n-- > 0) {
+			r = convchar(buf, ccEncodeChar(*p), 0, p, 1);
+			if (r >= 0) match = 1;
+			p++;
+		}
+		if (!match) {
+			/* default action $B$N%U%!%s%/%7%g%s$r$h$V(B */
+			if (buf->defaultaction != NULL) {
+				(void)(*buf->defaultaction)(str, nbytes, buf->client_data);
+			}
+			return 0;
+		}
+	}
+	return 1;
+}
+
+/* ccGetMode -- $B8=:_$N%b!<%IHV9f$rJV$9(B */
+int ccGetMode(buf)
+ccBuf buf;
+{
+	return buf->currentmode;
+}
+
+/* ccGetModePrompt -- $B8=:_$N%b!<%I$N%W%m%s%W%HJ8;zNs$rJV$9(B */
+wchar *ccGetModePrompt(buf)
+ccBuf buf;
+{
+	return buf->rule->modes[buf->currentmode].prompt;
+}
+
+/* ccGetRule -- $BJQ49%P%C%U%!$G;H$o$l$F$$$kJQ49%k!<%k$rJV$9(B */
+ccRule ccGetRule(buf)
+ccBuf buf;
+{
+	return buf->rule;
+}
+
+/* ccContextAppend -- $B%3%s%F%-%9%H$K(B1$BJ8;z2C$($k(B */
+void ccContextAppend(buf, c)
+ccBuf buf;
+int c;
+{
+	wchar	*p;
+
+	/* $B<+F03NDj(B */
+	if (buf->context == buf->contextend &&
+	    buf->rule->autofix && buf->autofix) {
+		buf->autofix(buf->client_data);
+	}
+
+	/* $B%3%s%F%-%9%HJ8;zNs$KA^F~(B */
+	if (buf->contextend - buf->context < buf->contextsize) {
+		*buf->contextend++ = c;
+	} else {
+		/* $B%3%s%F%-%9%HJ8;zNs$,0lGU$J$N$G(B
+		 * $B@hF,$N#1J8;z$r<N$F$F$D$a$k(B
+		 */
+		p = buf->context + 1;
+		while (p < buf->contextend) {
+			*(p - 1) = *p;
+			p++;
+		}
+		/* $B$"$$$?=j$KA^F~(B */
+		*--p = c;
+	}
+}
+
+/* ccContextDelete -- $B%3%s%F%-%9%H$r(B1$BJ8;z:o=|$9$k(B */
+void ccContextDelete(buf)
+ccBuf buf;
+{
+	if (buf->contextend > buf->context)
+		buf->contextend--;
+}
+
+/* ccContextClear -- $B%3%s%F%-%9%H$r%/%j%"$9$k(B */
+void ccContextClear(buf)
+ccBuf buf;
+{
+	/* $B%b!<%I$,JQ$o$C$?;~$K$O<+F0E*$K%/%j%"$5$l$k$,$=$l0J30$K(B
+	 * $B8=:_$N%3%s%F%-%9%H$r6/@)E*$K%/%j%"$7$?$$>l9g$KMQ$$$k(B
+	 */
+	buf->contextend = buf->context;
+}
+
+/* ccContextSet -- $B%3%s%F%-%9%H$r%;%C%H$9$k(B */
+void ccContextSet(buf, cstr)
+ccBuf buf;
+wchar *cstr;
+{
+	int	len = wstrlen(cstr);
+	wchar	*p = buf->context;
+
+	if (len > buf->contextsize) {
+		cstr += len - buf->contextsize;
+		len = buf->contextsize;
+	}
+	while (len-- > 0) {
+		*p++ = *cstr++;
+	}
+}
+
+/* ccContextGet -- $B8=:_$N%3%s%F%-%9%H$rJV$9(B */
+void ccContextGet(buf, cstr)
+ccBuf buf;
+wchar	*cstr;
+{
+	register wchar	*wp = buf->context;
+
+	while (wp < buf->contextend)
+		*cstr++ = *wp++;
+	*cstr = 0;
+}
+
+
+/*
+ *	Obsolete Functions
+ */
+
+/* ccInit -- $BJQ49%k!<%k$rFI$_9~$s$G%P%C%U%!$r:n$k(B */
+ccBuf ccInit(deffile, contextsize, defactfunc, insertfunc, deletefunc, dofunc,
+	     errprint, functable, functablesize)
+char *deffile;
+int contextsize;
+void (*defactfunc)();
+void (*insertfunc)();
+void (*deletefunc)();
+int (*dofunc)();
+void (*errprint)();
+char *functable[];
+int functablesize;
+{
+	ccRule	rule;
+
+	if ((rule = ccParseRule(deffile, errprint)) == NULL) {
+		return (ccBuf)NULL;
+	}
+
+	return ccCreateBuf(rule, contextsize, functable, functablesize,
+			   defactfunc, insertfunc, deletefunc, dofunc,
+			   (void (*)())NULL, (void (*)())NULL, (caddr_t)NULL);
+}
+
+/* ccTerminate -- $BF~NOJ8;zJQ49$r=*N;$9$k(B */
+void ccTerminate(buf)
+ccBuf buf;
+{
+	ccFreeRule(buf->rule);
+	ccDestroyBuf(buf);
+}
+
+
+#ifdef DEBUG_CCONV
+/*
+ *	Debug Functions
+ */
+
+static void putws(s)
+wchar *s;
+{
+	unsigned char	line[256];
+
+	(void)convJWStoSJIS(s, line);
+	fputs(line, stdout);
+}
+
+static void puteuc(s)
+uchar *s;
+{
+	wchar	tmp[256];
+
+	(void)convEUCtoJWS(s, tmp);
+	putws(tmp);
+}
+
+void dumpRules(rule, mode)
+ccRule rule;
+int mode;
+{
+	int	nkey;
+	ModeTable	*modep;
+	ConvDesc	*cdp;
+	wchar		*strbuf = rule->strbuf;
+	ushort		*funcbuf = rule->funcbuf;
+	char		**funcnames;
+	wchar		*p, *q;
+	wchar		restmp[256];
+	ushort		*funcp;
+	int	i, j;
+
+	funcnames = (char **)__builtin_alloca(rule->nfunc * sizeof(char *));
+{	char	*cp, **fnp;
+	cp = rule->funcnamebuf;
+	fnp = funcnames;
+	for (i = 0; i < rule->nfunc; i++) {
+		*fnp++ = cp;
+		while (*cp++)
+			;
+	}
+}
+
+	if (mode < 0 || mode >= rule->nmode) {
+		printf("No such mode %d\n", mode);
+		return;
+	}
+	modep = &rule->modes[mode];
+
+	printf("mode: %s (%d) prompt: ", modep->name, mode);
+	putws(modep->prompt);
+	if (modep->fallthrough != NOMODE) {
+		printf(" fallthrough: %d", modep->fallthrough);
+	}
+	putchar('\n');
+	cdp = modep->cdbuf;
+	for (i = 0; i < modep->nrule; i++) {
+		printf("rule[%d]: \"", i);
+		putws(strbuf + cdp->context);
+		printf("\"\t");
+		if (cdp->key & RAWKEY) {
+			ulong	key = cdp->key & ~RAWKEY;
+			int	mask = cdp->mask;
+			char	*keysymname;
+			if (mask & ShiftMask) printf("shift-");
+			if (mask & ControlMask) printf("control-");
+			if (mask & LockMask) printf("lock-");
+			if (mask & Mod1Mask) printf("mod1-");
+			if (mask & Mod2Mask) printf("mod2-");
+			if (mask & Mod3Mask) printf("mod3-");
+			if (mask & Mod4Mask) printf("mod4-");
+			if (mask & Mod5Mask) printf("mod5-");
+			keysymname = XKeysymToString((KeySym)key);
+			printf(keysymname ? keysymname : "<illegal keysym>");
+		} else if (cdp->key & METAC) {
+			switch (cdp->key & ~METAC) {
+			case META_ASCII:	printf("@ascii"); break;
+			case META_CONTROL:	printf("@control"); break;
+			case META_RAW:		printf("@raw"); break;
+			case META_ANY:		printf("@any"); break;
+			case META_FUNC:		printf("@func"); break;
+			case META_CURSOR:	printf("@cursor"); break;
+			case META_KEYPAD:	printf("@keypad"); break;
+			case META_MODIFIER:	printf("@modifier"); break;
+			case META_NONASCII:	printf("@non-ascii"); break;
+			case META_PRINTABLE:	printf("@printable"); break;
+			default:		printf("<illegal meta>");
+			}
+		} else if (cdp->key & PSEUDO) {
+			switch (cdp->key) {
+			case ENTERMODE:	printf("ENTERMODE"); break;
+			case EXITMODE:	printf("EXITMODE"); break;
+			default:	printf("<illegal pseudo>");
+			}
+		} else {
+			putchar('\'');
+			if (cdp->key >= 0x80) {
+				printf("\\x%x", cdp->key);
+			} else if (cdp->key < 0x20) {
+				putchar('^');
+				putchar(cdp->key + '@');
+			} else if (cdp->key == 0x7f) {
+				printf("^?");
+			} else {
+				putchar(cdp->key);
+			}
+			putchar('\'');
+		}
+		printf("\t\"");
+		p = restmp;
+		q = strbuf + cdp->result;
+		while (*q) {
+			if (*q == MATCHED_CHAR) {
+				*p++ = '&';
+			} else if (*q == CCLEAR_CHAR) {
+				*p++ = '/';
+			} else {
+				*p++ = *q;
+			}
+			q++;
+		}
+		*p = 0;
+		putws(restmp);
+		printf("\"\t");
+		funcp = funcbuf + cdp->function;
+		while (*funcp != ENDFUNC) {
+			if (*funcp == REDO) {
+				printf("redo ");
+			} else if (*funcp == PREVMODE) {
+				printf("goto prev ");
+			} else if (*funcp & MODECHANGE) {
+				int	gotomode = *funcp & ~MODECHANGE;
+				if (gotomode < 0 || gotomode >= rule->nmode) {
+					printf("<illegal goto>");
+				} else {
+					printf("goto %s ",
+					       rule->modes[gotomode].name);
+				}
+			} else {
+				if (*funcp >= rule->nfunc) {
+					printf("<illegal function> ");
+				} else {
+					printf("%s ", funcnames[*funcp]);
+				}
+			}
+			funcp++;
+		}
+		putchar('\n');
+		cdp++;
+	}
+	putchar('\n');
+}
+
+void dumpAllRules(rule)
+ccRule rule;
+{
+	int	i;
+
+	printf("** RULE DUMP **\n");
+	printf("number of modes: %d  initialmode: %s (%d)\n\n",
+	       rule->nmode,
+	       rule->modes[rule->initialmode].name,
+	       rule->initialmode);
+	for (i = 0; i < rule->nmode; i++) {
+		dumpRules(rule, i);
+	}
+	fflush(stdout);
+}
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/ctext.c	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,457 @@
+/*
+ * ctext.c -- Compound Text <-> Japanese Wide Character String converter
+ */
+
+/******************************************************************************
+
+$B!&;X<((B (designation)
+		1byte			multi-byte
+		94char      96char	94char       96char
+	-------------------------------------------------------
+	G0  :	ESC ( F	 |  -none-	ESC $ ( F  |  -none-
+	G1  :	ESC ) F  |  ESC - F	ESC $ ) F  |  ESC $ - F
+
+$B!&=*C<J8;z(B F
+	1byte
+	    94chars
+		B	ASCII
+		I	JIS KANA
+		J	JIS-ROMAN
+	    96chars
+		A	8859/1 right half
+		B	8859/2 right half
+		C	8859/3 right half
+		D	8859/4 right half
+		F	8859/7 right half
+		G	8859/6 right half
+		H	8859/8 right half
+		M	8859/9 (DIS) right half
+	multi-byte
+	    94chars ^ 2
+		A	GB Hanzi
+		B	JIS Kanji 1983
+		C	KS Hangul/Hanja
+
+-------------------------------------------------------------------------------
+COMPOUND_TEXT $B$N;EMM(B (Comopund Text Encoding Version 1 -- MIT X Consortium Standard)
+$B!&(BG0 G1 $B$N$_$r;HMQ$9$k!#(BG2 G3 $B$O;HMQ$7$J$$!#(B
+$B!&(BG0 $B$,(B GL$B!"(BG1 $B$,(B GR $B$K8F$S=P$5$l$F$*$j!"$=$l$rJQ99$9$k$3$H$O$G$-$J$$!#(B
+  $B$D$^$j!"(BLocking Shift $B$*$h$S(B Single Shift $B$O;HMQ$7$J$$!#(B
+$B!&=i4|@_Dj$H$7$F(B ISO Latin-1 $B$,(B G0/G1 $B$K;X<($5$l$F$$$k!#(B
+$B!&%^%k%A%P%$%H$NJ8;z$r(B G0 $B$K;X<($9$k$N$K!"(BESC-$-F $B$O;HMQ$7$J$$!#(B
+  ESC-$-(-F $B$r;HMQ$9$k!#(B
+$B!&;HMQ$G$-$k=*C<J8;z$O!">e$K=q$+$l$?DL$j!#(B
+$B!&(BC0 $B$G;HMQ$G$-$kJ8;z$O!"(BNL TAB ESC $B$N$_$H$9$k!#(B
+$B!&(BC1 $B$G;HMQ$G$-$kJ8;z$O(B CSI $B$N$_$H$9$k!#(B
+$B!&%F%-%9%H$NIA2hJ}8~$N%7!<%1%s%9$,4^$^$l$k!#(B
+	$B:8$+$i1&(B
+	$B1&$+$i:8(B
+	$B85$NJ}8~$KLa$k(B
+******************************************************************************/
+
+/*
+ * Copyright (c) 1989  Software Research Associates, Inc.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted, provided
+ * that the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Software Research Associates not be
+ * used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission.  Software Research
+ * Associates makes no representations about the suitability of this software
+ * for any purpose.  It is provided "as is" without express or implied
+ * warranty.
+ *
+ * Author:  Makoto Ishisone, Software Research Associates, Inc., Japan
+ *		ishisone@sra.co.jp
+ */
+
+#ifndef lint
+static char *rcsid = "$Id: ctext.c,v 2.6 1999/03/10 08:55:15 ishisone Exp $";
+#endif
+
+typedef unsigned short	wchar;
+
+#define NULL	0
+
+#define CS96	0x100	/* 96chars CS */
+#define MBCS	0x200	/* Multibyte CS */
+
+/* convJWStoCT -- Japanese Wide Character String -> COMPOUND_TEXT */
+int
+convJWStoCT(wstr, xstr, jisroman)
+register wchar *wstr;
+register unsigned char *xstr;
+int jisroman;	/* true $B$J$i$P(B G0 $B$N%-%c%i%/%?%;%C%H$H$7$F(B JIS ROMAN $B$r!"(B
+		 * false $B$J$i$P(B ASCII $B$r;HMQ$9$k(B
+		 */
+/* Wide Character string wstr $B$r(B COMPOUND_TEXT xstr $B$KJQ49$7!"(B
+ * $BJQ498e$N%P%$%H?t$rJV$9(B($B:G8e$N(B null byte $B$O4^$^$J$$(B)$B!#$b$7(B xstr $B$,(B
+ * NULL $B$J$i$PJQ49$O$;$:!"J8;z?t$N$_$rJV$9!#(B
+ */
+{
+	register int	c;
+	register int	g0, g1;
+	register int	n = 0;
+	int		g0cs;
+	
+	g0cs = jisroman ? 'J' : 'B';
+
+	g0 = 'B';
+	g1 = CS96|'A';
+	
+	/*
+	 * G0, G1 $B$O<!$N$h$&$K;H$$J,$1$k(B
+	 *  G0: ASCII / JIS-ROMAN
+	 *  G1: $B4A;z(B / $B$+$J(B
+	 */
+	
+	while (c = *wstr++) {
+		switch (c & 0x8080) {
+		case 0:		/* ASCII or C0 or DEL */
+			if (g0 != g0cs) {
+				if (xstr) {
+					*xstr++ = '\033';
+					*xstr++ = '(';
+					*xstr++ = g0cs;
+				}
+				n += 3;
+				g0 = g0cs;
+				/*
+				 * We have to invalidate G1 here,
+				 * which is unnecessary if Xlib
+				 * implementation is sane.
+				 */
+				g1 = g0cs;
+			}
+			/*
+			 * Of course it isn't necessary to disignate
+			 * ASCII to G0 before a control character, but
+			 * someone reported certain version of Xlib needs
+			 * this. sigh.
+			 */
+			if (c < ' ' || c == 0x7f) {
+				/* C0 or DEL */
+				if (c == '\t' || c == '\n') {
+					if (xstr) *xstr++ = c;
+					n++;
+				}
+				break;
+			}
+			if (xstr) *xstr++ = c & 0x7f;
+			n++;
+			break;
+		case 0x80:	/* $B$+$J(B or C1 */
+			if (0x80 <= c && c <= 0x9f) break;
+			if (g1 != 'I') {
+				if (xstr) {
+					*xstr++ = '\033';
+					*xstr++ = ')';
+					*xstr++ = 'I';
+				}
+				n += 3;
+				g1 = 'I';
+				g0 = 'I';	/* invalidate G0. see below */
+			}
+			if (xstr) *xstr++ = c & 0xff;
+			n++;
+			break;
+		case 0x8080:	/* $B4A;z(B */
+			if (g1 != (MBCS|'B')) {
+				if (xstr) {
+					*xstr++ = '\033';
+					*xstr++ = '$';
+					*xstr++ = ')';
+					*xstr++ = 'B';
+				}
+				n += 4;
+				g1 = MBCS|'B';
+				/*
+				 * We have to invalidate G0 here,
+				 * which is unnecessary if Xlib
+				 * implementation is sane.
+				 */
+				g0 = MBCS|'B';
+			}
+			if (xstr) {
+				*xstr++ = (c >> 8) & 0xff;
+				*xstr++ = c & 0xff;
+			}
+			n += 2;
+			break;
+		default:
+			/* $BL5;k$9$k(B */
+			break;
+		}
+	}
+	if (xstr) *xstr = '\0';
+	return n;
+}
+
+static unsigned char *
+getesc(str, len)
+unsigned char *str;
+int len;
+{
+	register int	c;
+
+	/* $B%(%9%1!<%W%7!<%1%s%9$N!"%(%9%1!<%W$KB3$/(B
+	 * $BCf4VJ8;z$H=*C<J8;z$rD4$Y$k(B
+	 */
+	/* $BCf4VJ8;z$O(B 02/00 $B$+$i(B 02/15 $B$^$G(B */
+	while (len > 0) {
+		c = *str;
+		if (c < 0x20 || 0x2f < c)
+			break;
+		len--, str++;
+	}
+	/* $B=*C<J8;z$O(B 03/00 $B$+$i(B 07/14 $B$^$G(B */
+	if (--len < 0 || (c = *str++) < 0x30 || 0x7e < c)
+		return (unsigned char *)NULL;
+
+	return str;
+}
+
+static unsigned char *
+getcsi(str, len)
+unsigned char *str;
+int len;
+{
+	register int	c;
+
+	/* CSI $B%7!<%1%s%9$N!"(BCSI $B$KB3$/(B
+	 * $B%Q%i%a%?J8;z!&Cf4VJ8;z$H=*C<J8;z$rD4$Y$k(B
+	 */
+	/* $B%Q%i%a%?$O(B 03/00 $B$+$i(B 03/15 $B$^$G(B */
+	while (len > 0) {
+		c = *str;
+		if (c < 0x30 || 0x3f < c)
+			break;
+		len--, str++;
+	}
+	/* $BCf4VJ8;z$O(B 02/00 $B$+$i(B 02/15 $B$^$G(B */
+	while (len > 0) {
+		c = *str;
+		if (c < 0x20 || 0x2f < c)
+			break;
+		len--, str++;
+	}
+	/* $B=*C<J8;z$O(B 04/00 $B$+$i(B 07/14 $B$^$G(B */
+	if (--len < 0 || (c = *str++) < 0x40 || 0x7e < c)
+		return (unsigned char *)NULL;
+
+	return str;
+}
+
+/* convCTtoJWS -- COMPOUND_TEXT -> Japanese Wide Character String */
+int
+convCTtoJWS(xstr, len, wstr)
+register unsigned char *xstr;
+int len;
+wchar *wstr;
+/* COMPOUND_TEXT xstr $B$r(B Wide Character string wstr $B$KJQ49$7!"(B
+ * $BJQ498e$NJ8;z?t$rJV$9(B($B:G8e$N(B null $BJ8;z$O4^$^$J$$(B)$B!#$b$7(B wstr $B$,(B
+ * NULL $B$J$i$PJQ49$O$;$:!"J8;z?t$N$_$rJV$9!#(B
+ */
+{
+	register int	c;
+	int	nskip;
+	int	n = 0;
+	int	g0, g1, gs;
+	unsigned char	*xstr1;
+
+	/*
+	 * Compound Text $BCf$K$O(B null octet $B$,4^$^$l$k2DG=@-$,$"$k(B
+	 * $B$=$3$GJ8;zNs$ND9$5(B len $B$r0z?t$G;XDj$G$-$k$h$&$K$7$F$"$k$N$@$,!"(B
+	 * 0 $B$"$k$$$OIi$N;~$K$O(B (null octet $B$O$J$$$b$N$H$7$F(B) strlen() $B$G(B
+	 * $BD9$5$rD4$Y$k(B
+	 */
+	if (len <= 0) {
+		len = strlen((char *)xstr);
+	}
+
+	/* $B=i4|>uBV$O!"(BISO 8859/1 $B$,(B G0/G1 $B$KF~$C$F$$$k(B */
+	g0 = 'B';	/* ASCII -> G0 */
+	g1 = CS96|'A';	/* Latin/1 right hand part -> G1 */
+
+	while (len-- > 0) {
+		switch (c = *xstr++) {
+		case '\n':	/* NEWLINE */
+		case '\t':	/* TAB */
+			if (wstr) *wstr++ = c;
+			n++;
+			break;
+		case 0x9b:	/* CSI */
+			/*
+			 * CSI $B$N0lHL7A$O(B
+			 *	CSI {P} {I} F
+			 * $B%Q%i%a%?(B P $B$O(B 03/00 $B$+$i(B 03/15$B!"(B
+			 * $BCf4VJ8;z(B I $B$O(B 02/00 $B$+$i(B 02/15$B!"(B
+			 * $B=*C<J8;z(B F $B$O(B 04/00 $B$+$i(B 07/14 $B$NHO0O(B
+			 */
+			/*
+			 * $B8=:_Dj5A$5$l$F$$$k$N$O(B directionality $B$@$1$G!"(B
+			 * $B$=$l$O(B
+			 *	CSI-1-]		begin left-to-right text
+			 *	CSI-2-]		begin right-to-left text
+			 *	CSI-]		end of string
+			 * $B$G$"$k(B
+			 * $B$,$H$j$"$($::#$O$3$l$rL5;k$9$k$N$G!"(BCSI $B$N(B
+			 * $B%7!<%1%s%9$O$9$Y$FL5;k!"$H$$$&$3$H$K$J$k(B
+			 */
+			xstr1 = getcsi(xstr, len);
+			if (xstr1 == NULL)
+				return -1;
+			len -= xstr1 - xstr;
+			xstr = xstr1;
+			break;
+		case '\033':	/* ESC */
+			/*
+			 * $B%(%9%1!<%W%7!<%1%s%9$N0lHL7A$O(B
+			 *	ESC {I} F
+			 * $BCf4VJ8;z(B I $B$O(B 02/00 $B$+$i(B 02/15 $B$G!"(B
+			 * $B=*C<J8;z(B F $B$O(B 03/00 $B$+$i(B 07/14 $B$NHO0O(B
+			 */
+			/*
+			 * $B8=:_Dj5A$5$l$F$$$k$N$O!"(B
+			 *   $B%9%?%s%@!<%I%-%c%i%/%?%;%C%H(B
+			 *	ESC-(-F
+			 *	ESC-$-(-F
+			 *	ESC-)-F
+			 *	ESC---F
+			 *	ESC-$-)-F
+			 *   $B%N%s%9%?%s%@!<%I%-%c%i%/%?%;%C%H(B
+			 *	ESC-%-/-[0123]
+			 * $B%9%?%s%@!<%I$J%-%c%i%/%?%;%C%H$O@5$7$/2r<a(B
+			 * $B$7$J$/$F$O$J$i$J$$$7!"%N%s%9%?%s%@!<%I$J$b$N$O(B
+			 * $BL5;k$9$k$1$l$I$b%G!<%?$r%9%-%C%W$9$kI,MW$,$"$k(B
+			 */
+			xstr1 = getesc(xstr, len);
+			if (xstr1 == NULL)
+				return -1;
+			len -= xstr1 - xstr;
+			switch (xstr1 - xstr) {
+			case 2:		/* ESC - I - F */
+				switch (*xstr++) {
+				case '(':	/* 94chars CS -> G0 */
+					g0 = *xstr;
+					break;
+				case ')':	/* 94chars CS -> G1 */
+					g1 = *xstr;
+					break;
+				case '-':	/* 96chars CS -> G1 */
+					g1 = *xstr | CS96;
+					break;
+				default:	/* ignore */
+					break;
+				}
+				break;
+			case 3:		/* ESC - I - I - F */
+				switch (*xstr++) {
+				case '$':
+					switch (*xstr++) {
+					case '(':	/* 94chars MBCS -> G0 */
+						g0 = *xstr | MBCS;
+						break;
+					case ')':	/* 94chars MBCS -> G1 */
+						g1 = *xstr | MBCS;
+						break;
+					case '-':	/* 96chars MBCS -> G1 */
+						g1 = *xstr | CS96 | MBCS;
+						break;
+					default:	/* ignore */
+						break;
+					}
+					break;
+				case '%':
+					if (*xstr++ != '/') {
+						/* unknown sequence */
+						break;
+					}
+					/*
+					 * $B%W%i%$%Y!<%H%(%s%3!<%G%#%s%0(B
+					 * $B40A4$KL5;k$9$k(B
+					 * $B$?$@$7$=$N$"$H$KB3$/%G!<%?$r(B
+					 * $B%9%-%C%W$9$kI,MW$,$"$k(B
+					 *	ESC-%-/-F-M-L
+					 */
+					len -= 2;
+					if (len < 0)
+						return -1;
+					nskip = (*xstr1 & 0x7f) * 128 +
+					    (*(xstr1 + 1) & 0x7f);
+					if ((len -= nskip) < 0)
+						return -1;
+					xstr1 += nskip + 2;
+					break;
+				default:
+					break;
+				}
+				break;
+			default:
+				break;
+			}
+			xstr = xstr1;
+			break;
+		default:
+			if (!(c & 0x60)) {
+				/*
+				 * NL/TAB/ESC/CSI $B0J30$N(B C0 or C1
+				 * $B$3$l$OL@$i$+$K%(%i!<(B
+				 */
+				return -1;
+			}
+			gs = (c & 0x80) ? g1 : g0;
+			c &= 0x7f;
+			if (gs & MBCS) {
+				switch (gs & 0x70) {
+				case 0x70:	/* 4byte/char */
+					if (--len < 0) return -1;
+					c = (c << 8) | (*xstr++ & 0x7f);
+				case 0x60:	/* 3byte/char */
+					if (--len < 0) return -1;
+					c = (c << 8) | (*xstr++ & 0x7f);
+				case 0x50:	/* 2byte/char */
+				case 0x40:	/* 2byte/char */
+					if (--len < 0) return -1;
+					c = (c << 8) | (*xstr++ & 0x7f);
+					break;
+				default:
+					return -1;
+				}
+			}
+			if (wstr) {
+				switch (gs) {
+				case 'B':
+				case 'J':
+					*wstr++ = c;
+					n++;
+					break;
+				case 'I':
+					*wstr++ = 0x80 | c;
+					n++;
+					break;
+				case MBCS|'B':
+					*wstr++ = 0x8080 | c;
+					n++;
+					break;
+				}
+			} else {
+				switch (gs) {
+				case 'B':
+				case 'J':
+				case 'I':
+					n++;
+					break;
+				case MBCS|'B':
+					n++;
+					break;
+				}
+			}
+			break;
+		}
+	}
+	if (wstr) *wstr = 0;
+	return n;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/dispatch.c	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,268 @@
+#ifndef lint
+static char *rcsid = "$Id: dispatch.c,v 1.14 1994/05/31 07:48:42 ishisone Rel $";
+#endif
+
+/*
+ * a very simple event dispatch library for non-widget windows
+ *
+ *	'non-widget window' means windows that have no associated widget,
+ *	e.g. windows created by Xlib directly.
+ */
+
+/*
+ * Copyright (c) 1990  Software Research Associates, Inc.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted, provided
+ * that the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Software Research Associates not be
+ * used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission.  Software Research
+ * Associates makes no representations about the suitability of this software
+ * for any purpose.  It is provided "as is" without express or implied
+ * warranty.
+ *
+ * Author:  Makoto Ishisone, Software Research Associates, Inc., Japan
+ */
+
+#include <X11/Intrinsic.h>
+#include "MyDispatch.h"
+#include "AsyncErr.h"
+
+#define DEBUG_VAR debug_dispatch
+#include "DebugPrint.h"
+
+typedef struct _handler_ {
+    int			type;		/* event type */
+    unsigned long	mask;		/* event mask */
+    void		(*handler)();
+    XtPointer		data;
+    struct _handler_	*next;
+} HandlerRec;
+
+typedef struct {
+    Boolean		dispatching;	/* now dispatching */
+    Boolean		toberemoved;	/* this list is to be removed later */
+    unsigned long	mask;		/* event mask */
+    HandlerRec		*handlers;
+} WindowRec;
+
+static int Initialized = 0;
+static XContext Context;
+
+static void
+initialize()
+{
+    Context = XUniqueContext();
+    Initialized = 1;
+}
+
+static void
+resetEventMask(dpy, window, wp)
+Display *dpy;
+Window window;
+WindowRec *wp;
+{
+    register HandlerRec *hp = wp->handlers;
+    register unsigned long mask = 0L;
+
+    while (hp != NULL) {
+	mask |= hp->mask;
+	hp = hp->next;
+    }
+
+    if (mask != wp->mask) {
+	XAEHandle h = XAESetIgnoreErrors(dpy);	/* keep the operation safe */
+	XSelectInput(dpy, window, mask);
+	XAEUnset(h);
+	wp->mask = mask;
+    }
+}
+
+static void
+removeAll(dpy, window, wp)
+Display *dpy;
+Window window;
+WindowRec *wp;
+{
+    register HandlerRec *hp = wp->handlers;
+
+    while (hp != NULL) {
+	register HandlerRec *hp0 = hp;
+	hp = hp->next;
+	XtFree((char *)hp0);
+    }
+
+    if (wp->mask != 0L) {
+	XAEHandle h = XAESetIgnoreErrors(dpy);
+
+	/* keep it safe (because the window might not exist any more) */
+	XSelectInput(dpy, window, 0L);
+	XAEUnset(h);
+    }
+
+    XtFree((char *)wp);
+    (void)XDeleteContext(dpy, window, Context);
+}
+
+static void
+doDispatch(event, list)
+XEvent *event;
+register HandlerRec *list;
+{
+    void (*handler)();
+    XtPointer data;
+    register int type = event->type;
+
+    /*
+     * we must be careful here. the invoked handler might remove
+     * itself, or remove other handler to be invoked next.
+     * so we use this somewhat strange recursive call.
+     */
+    while (list != NULL) {
+	if (list->type == type) {
+	    handler = list->handler;
+	    data = list->data;
+	    doDispatch(event, list->next);
+	    (*handler)(event, data);
+	    return;
+	}
+	list = list->next;
+    }
+}
+
+void
+MyDispatchEvent(event)
+XEvent *event;
+{
+    caddr_t data;
+
+    if (!Initialized) initialize();
+
+    if (!XFindContext(event->xany.display, event->xany.window,
+		      Context, &data)) {
+	WindowRec *wrec = (WindowRec *)data;
+
+	wrec->dispatching = True;
+	wrec->toberemoved = False;
+
+	doDispatch(event, wrec->handlers);
+
+	wrec->dispatching = False;
+	if (wrec->toberemoved) {
+	    removeAll(event->xany.display, event->xany.window, wrec);
+	}
+    }
+}
+
+void
+MyAddEventHandler(dpy, window, type, mask, func, data)
+Display *dpy;
+Window window;
+int type;
+unsigned long mask;
+void (*func)();
+XtPointer data;
+{
+    WindowRec *wp;
+    HandlerRec *hp;
+    caddr_t cdata;
+
+    TRACE(("MyAddEventHandler(window=%08lx,type=%d)\n", window, type));
+    if (!Initialized) initialize();
+
+    hp = XtNew(HandlerRec);
+    hp->type = type;
+    hp->mask = mask;
+    hp->handler = func;
+    hp->data = data;
+    hp->next = NULL;
+
+    if (!XFindContext(dpy, window, Context, &cdata)) {
+	wp = (WindowRec *)cdata;
+	hp->next = wp->handlers;
+	wp->handlers = hp;
+    } else {
+	wp = XtNew(WindowRec);
+	wp->mask = 0L;
+	wp->dispatching = False;
+	wp->handlers = hp;
+	(void)XSaveContext(dpy, window, Context, (caddr_t)wp);
+    }
+    resetEventMask(dpy, window, wp);
+}
+
+void
+MyRemoveEventHandler(dpy, window, type, func, data)
+Display *dpy;
+Window window;
+int type;
+void (*func)();
+XtPointer data;
+{
+    caddr_t cdata;
+    WindowRec *wp;
+    HandlerRec *hp, *hp0;
+
+    TRACE(("MyRemoveEventHandler(window=%08lx,type=%d)\n", window, type));
+    if (!Initialized) initialize();
+    if (XFindContext(dpy, window, Context, &cdata) || cdata == NULL) return;
+
+    wp = (WindowRec *)cdata; 
+    hp0 = NULL;
+    hp = wp->handlers;
+
+    while (hp != NULL) {
+	if (hp->type == type && hp->handler == func && hp->data == data) {
+	    HandlerRec *tmp = hp;
+
+	    hp = hp->next;
+	    if (hp0 == NULL) {
+		wp->handlers = hp;
+	    } else {
+		hp0->next = hp;
+	    }
+	    XtFree((char *)tmp);
+	} else {
+	    hp0 = hp;
+	    hp = hp->next;
+	}
+    }
+
+    resetEventMask(dpy, window, wp);
+    
+    if (wp->handlers == NULL) {
+	if (wp->dispatching) {
+	    /* now dispatching. we just mark it to be removed later. */
+	    wp->toberemoved = True;
+	} else {
+	    XtFree((char *)wp);
+	    (void)XDeleteContext(dpy, window, Context);
+	}
+    }
+}
+
+void
+MyRemoveAllEventHandler(dpy, window)
+Display *dpy;
+Window window;
+{
+    caddr_t cdata;
+    WindowRec *wp;
+
+    TRACE(("MyRemoveAllEventHandler(window=%08lx)\n", window));
+    if (!Initialized) initialize();
+
+    if (XFindContext(dpy, window, Context, &cdata) || cdata == NULL) return;
+
+    wp = (WindowRec *)cdata;
+
+    if (wp->dispatching) {
+	/* now dispatching. we just mark it to be removed later. */
+	wp->toberemoved = True;
+	return;
+    } else {
+	removeAll(dpy, window, wp);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/fontbank.c	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,323 @@
+#ifndef lint
+static char *rcsid = "$Id: fontbank.c,v 1.4 1994/05/17 10:52:15 ishisone Rel $";
+#endif
+/*
+ * Copyright (c) 1991, 1994  Software Research Associates, Inc.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted, provided
+ * that the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Software Research Associates not be
+ * used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission.  Software Research
+ * Associates makes no representations about the suitability of this software
+ * for any purpose.  It is provided "as is" without express or implied
+ * warranty.
+ *
+ * Author:  Makoto Ishisone, Software Research Associates, Inc., Japan
+ */
+
+#include <X11/Xos.h>
+#include <X11/Intrinsic.h>
+#include "CachedFont.h"
+#include "KIFontSet.h"
+#include "FontBank.h"
+
+#define DEBUG_VAR debug_fontbank
+#include "DebugPrint.h"
+
+#define FC_HASH_SIZE	8
+
+typedef struct _font_cache_ {
+    int sum;
+    char *name;
+    XFontStruct **fonts;
+    int num_fonts;
+    struct _font_cache_ *next;
+} FontCache;
+
+typedef struct _fb_info_ {
+    char *language;
+    KICharSet *charsets;
+    int num_charsets;
+} FBInfo;
+
+typedef struct _fb_rec_ {
+    Display *dpy;
+    struct _fb_rec_ *next;
+    FBInfo *info;
+    int reference_count;
+    FontCache *hash[FC_HASH_SIZE];
+} FBRec;
+    
+static FontBank fontBankList = NULL;
+
+/*
+ * Language information:
+ * The FBInfo structure holds information about the character sets
+ * required for a specific language.  Currently, this infomation
+ * is provided only for Japanese.
+ */
+
+static KICharSetSpec asciiCharSets[] = {
+    { "iso8859-1", NULL },		/* preferable */
+    { "jisx0201.1976-0", NULL },	/* alternative */
+    { "iso8859-*", NULL },		/* alternative */
+};
+static KICharSetSpec kanaCharSets[] = {
+    { "jisx0201.1976-0", NULL },
+};
+static KICharSetSpec kanjiCharSets[] = {
+    { "jisx0208.1983-0", NULL },
+    { "jisx0208.1983-1", NULL },
+    { "jisx0208.1990-0", NULL },
+    { "jisx0208.1990-1", NULL },
+    { "jisx0208.1976-0", NULL },
+    { "jisx0208.1976-1", NULL },
+};
+static KICharSet jpCharSets[3] = {
+    { asciiCharSets, XtNumber(asciiCharSets) },
+    { kanaCharSets, XtNumber(kanaCharSets) },
+    { kanjiCharSets, XtNumber(kanjiCharSets) },
+};
+
+static FBInfo fontBankInfo[] = {
+    { "ja_JP", jpCharSets, XtNumber(jpCharSets) },
+    { NULL }
+};
+
+static int
+getsum(s)
+char *s;
+{
+    unsigned char *p = (unsigned char *)s;
+    int sum = 0;
+
+    while (*p != '\0') sum += *p++;
+    return sum;
+}
+
+static FBInfo *
+getInfo(lang)
+char *lang;
+{
+    FBInfo *fip;
+
+    for (fip = fontBankInfo; fip->language != NULL; fip++) {
+	if (!strcmp(fip->language, lang)) return fip;
+    }
+    DPRINT(("fonbank: language %s not supported\n", lang));
+    return NULL;
+}
+
+static XFontStruct **
+lookupCacheFonts(bank, fontset, num_fontsp)
+FontBank bank;
+char *fontset;
+int *num_fontsp;
+{
+    FontCache *fc;
+    int i;
+    int sum;
+
+    sum = getsum(fontset);
+    fc = bank->hash[sum % FC_HASH_SIZE];
+
+    /* lookup cache */
+    while (fc != NULL) {
+	if (fc->sum == sum && !strcmp(fc->name, fontset)) {
+	    /* found */
+	    *num_fontsp = fc->num_fonts;
+	    for (i = 0; i < *num_fontsp; i++) {
+		(void)CachedLoadFontByFontStruct(bank->dpy, fc->fonts[i]);
+	    }
+	    return fc->fonts;
+	}
+	fc = fc->next;
+    }
+    *num_fontsp = 0;
+    return NULL;
+}
+
+static void
+cacheFonts(bank, fontset, fonts, num_fonts)
+FontBank bank;
+char *fontset;
+XFontStruct **fonts;
+int num_fonts;
+{
+    FontCache *fc;
+    int sum;
+
+    fc = XtNew(FontCache);
+    fontset = XtNewString(fontset);
+    sum = getsum(fontset);
+
+    fc->sum = sum;
+    fc->name = fontset;
+    fc->fonts = fonts;
+    fc->num_fonts = num_fonts;
+    fc->next = bank->hash[sum % FC_HASH_SIZE];
+    bank->hash[sum % FC_HASH_SIZE] = fc;
+}
+
+static XFontStruct **
+extractFonts(dpy, fontset, charsets, ncharsets, nfontsp)
+Display *dpy;
+char *fontset;
+KICharSet *charsets;
+int ncharsets;
+int *nfontsp;
+{
+    KICharSetFont *kifonts;
+    KICharSetFont buf[10];
+    XFontStruct **fonts, **fp;
+
+    if (ncharsets > 10) {
+	kifonts = (KICharSetFont *)XtMalloc(ncharsets * sizeof(KICharSetFont));
+    } else {
+	kifonts = buf;
+    }
+    *nfontsp = ExtractFontsFromFontSet(dpy, fontset, charsets,
+				       kifonts, ncharsets);
+    fonts = NULL;
+    if (*nfontsp > 0) {
+	int i;
+
+	fonts = (XFontStruct **)XtMalloc(*nfontsp * sizeof(XFontStruct *));
+	for (i = 0, fp = fonts; i < ncharsets; i++) {
+	    if (kifonts[i].font != NULL) *fp++ = kifonts[i].font;
+	}
+    }
+    if (kifonts != buf) XtFree((char *)kifonts);
+    return fonts;
+}
+
+static void
+freeCache(bank)
+FontBank bank;
+{
+    FontCache *fc;
+    int i;
+
+    for (i = 0; i < FC_HASH_SIZE; i++) {
+	fc = bank->hash[i];
+	while (fc != NULL) {
+	    FontCache *next = fc->next;
+
+	    XtFree(fc->name);
+	    XtFree((char *)fc->fonts);
+	    XtFree((char *)fc);
+	    fc = next;
+	}
+    }
+}
+
+
+/*
+ * Public functions
+ */
+
+FontBank
+FontBankCreate(dpy, language)
+Display *dpy;
+char *language;
+{
+    FontBank fb;
+    FBInfo *info;
+    int i;
+
+    TRACE(("FontBankCreate(language:%s)\n", language));
+
+    if ((info = getInfo(language)) == NULL) return NULL;
+
+    for (fb = fontBankList; fb != NULL; fb = fb->next) {
+	if (fb->dpy == dpy && fb->info == info) {
+	    TRACE(("\tfontbank for %s already exists\n", language));
+	    fb->reference_count++;
+	    return fb;
+	}
+    }
+
+    TRACE(("\tcreate fontbank for %s...\n", language));
+    fb = XtNew(FBRec);
+    fb->dpy = dpy;
+    fb->info = info;
+    fb->reference_count = 1;
+    for (i = 0; i < FC_HASH_SIZE; i++) {
+	fb->hash[i] = NULL;
+    }
+    fb->next = fontBankList;
+    fontBankList = fb;
+    return fb;
+}
+
+void
+FontBankDestroy(bank)
+FontBank bank;
+{
+    TRACE(("FontBankDestroy()\n"));
+
+    if (--(bank->reference_count) <= 0) {
+	FontBank fb, fb0;
+
+	TRACE(("\tfreeing fontbank...\n"));
+	fb = fontBankList;
+	fb0 = NULL;
+	while (fb != NULL) {
+	    if (fb == bank) {
+		if (fb0 == NULL) {
+		    fontBankList = fb->next;
+		} else {
+		    fb0->next = fb->next;
+		}
+		freeCache(fb);
+		XtFree((char *)fb);
+		return;
+	    }
+	    fb0 = fb;
+	    fb = fb->next;
+	}
+    }
+}
+
+XFontStruct **
+FontBankGet(bank, fontset, num_fontsp)
+FontBank bank;
+char *fontset;
+int *num_fontsp;
+{
+    XFontStruct **fpp;
+
+    TRACE(("FontBankGet(fontset:%s)\n", fontset));
+
+    if ((fpp = lookupCacheFonts(bank, fontset, num_fontsp)) != NULL) {
+	TRACE(("\tfontset found in fontbank (numfonts=%d)\n",
+	       *num_fontsp));
+	return fpp;
+    }
+
+    fpp = extractFonts(bank->dpy, fontset, bank->info->charsets,
+		       bank->info->num_charsets, num_fontsp);
+
+    /* enter cache */
+    TRACE(("\tcaching fontset (numfonts=%d)\n", *num_fontsp));
+    cacheFonts(bank, fontset, fpp, *num_fontsp);
+    return fpp;
+}
+
+void
+FontBankFreeFonts(bank, fonts, num_fonts)
+FontBank bank;
+XFontStruct **fonts;
+int num_fonts;
+{
+    int i;
+
+    TRACE(("FontBankFreeFonts()\n"));
+
+    for (i = 0; i < num_fonts; i++) {
+	CachedFreeFont(bank->dpy, fonts[i]);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/fontset.c	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,372 @@
+#ifndef lint
+static char *rcsid = "$Id: fontset.c,v 1.9 1994/06/02 04:59:23 ishisone Rel $";
+#endif
+/*
+ * Copyright (c) 1991  Software Research Associates, Inc.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted, provided
+ * that the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Software Research Associates not be
+ * used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission.  Software Research
+ * Associates makes no representations about the suitability of this software
+ * for any purpose.  It is provided "as is" without express or implied
+ * warranty.
+ *
+ * Author:  Makoto Ishisone, Software Research Associates, Inc., Japan
+ *
+ *  a FontSet handler for kinput2.
+ */
+
+#include <X11/Intrinsic.h>
+#include <X11/Xatom.h>
+#include <X11/Xmu/CharSet.h>
+#include "CachedAtom.h"
+#include "CachedFont.h"
+#include "KIFontSet.h"
+
+#define DEBUG_VAR debug_fontset
+#include "DebugPrint.h"
+
+typedef struct {
+    String name;
+    String xlfdname;
+} FSFontName;
+
+static char noname[] = "no";
+
+static int match();
+static Cardinal parseFontSet();
+static Boolean tryCharSet();
+static XFontStruct *csSuppliedMatchFont();
+static XFontStruct *exactMatchFont();
+static XFontStruct *csReplacedMatchFont();
+static String getXLFDName();
+
+
+/*- match: returns 1 if the specified string matches the pattern -*/
+static int
+match(s, p)
+register char *s;	/* string */
+register char *p;	/* pattern */
+{
+    register int tmp;
+
+    while ((tmp = *p++) != '\0') {
+	switch (tmp) {
+	case '?':
+	    if (*s++ == '\0') return 0;
+	    continue;
+	case '*':
+	    while ((tmp = match(s, p)) == 0) {
+		if (*s++ == '\0') return -1;
+	    }
+	    return tmp;
+	default:
+	    if (*s++ != tmp) return 0;
+	    continue;
+	}
+    }
+    return (*s == '\0');
+}
+
+/*- countCommas: count number of commas in the string -*/
+static Cardinal
+countCommas(s)
+String s;
+{
+    int n = 0;
+
+    while (*s != '\0') {
+	if (*s++ == ',') n++;
+    }
+    return n;
+}
+
+/*- parseFontSet: separate each font in a font name list -*/
+static Cardinal
+parseFontSet(spec, basenames)
+String spec;		/* IN */
+FSFontName *basenames;	/* OUT */
+{
+    register char *p, *q;
+    Cardinal nnames;
+    int c;
+
+    nnames = 0;
+    p = spec;
+    for (;;) {
+	/* skip leading blanks */
+	while ((c = *p) != '\0' && (c == ' ' || c == '\t' || c == '\n')) p++;
+	if (c == '\0') break;
+
+	basenames[nnames++].name = p;
+
+	/* find comma or NUL char */
+	for (q = p; (c = *q) != '\0' && c != ','; q++) ;
+
+	/* omit trailing blanks */
+	p = q - 1;
+	while ((c = *p) == ' ' || c == '\t' || c == '\n') *p-- = '\0';
+
+	if (*q == '\0') break;
+	*q = '\0';
+	p = q + 1;
+    }
+
+#ifdef DEBUG
+    if (DDEBUG_CONDITION(10)) {
+	if (nnames == 0) {
+	    printf("\tparse error\n");
+	} else {
+	    int i;
+	    printf("\t%d elements\n", nnames);
+	    for (i = 0; i < nnames; i++) printf("\t\t%s\n", basenames[i].name);
+	}
+    }
+#endif
+
+    return nnames;
+}
+
+/*- tryCharSet: apply specified function to the fontnames for getting appropriate font for given character set -*/
+static Boolean
+tryCharSet(dpy, cset, extfont, namelist, numlist, func)
+Display *dpy;
+KICharSet *cset;
+KICharSetFont *extfont;
+FSFontName *namelist;
+Cardinal numlist;
+XFontStruct *(*func)();
+{
+    KICharSetSpec *specs;
+    Cardinal i;
+    XFontStruct *font;
+
+    for (i = 0, specs = cset->specs; i < cset->num_specs; i++, specs++) {
+	font = (*func)(dpy, specs->pattern, namelist, numlist);
+	if (font != NULL) {
+	    extfont->charset = specs->pattern;
+	    extfont->cldata = specs->cldata;
+	    extfont->font = font;
+	    return True;
+	}
+    }
+    return False;
+}
+
+static XFontStruct *
+exactMatchFont(dpy, csetstr, namelist, numlist)
+Display *dpy;
+String csetstr;
+FSFontName *namelist;
+Cardinal numlist;
+{
+    XFontStruct *font;
+
+    while (numlist-- > 0) {
+	String name = (namelist++)->name;
+	String p;
+	int namelen;
+	int hyphen;
+	
+	if (*name != '-' && *name != '+') continue;	/* not an XLFD name */
+	
+	namelen = strlen(name);
+	for (p = name + namelen - 1, hyphen = 0; p > name; p--) {
+	    if (*p == '-') hyphen++;
+	    if (hyphen == 2) goto found;
+	}
+	continue;	/* doesn't contain charset part */
+
+    found:
+	p++;		/* now p points the charset part of the fontname */
+	if (match(p, csetstr) > 0 &&
+	    (font = CachedLoadQueryFontByName(dpy, name)) != NULL) {
+	    TRACE(("\tmatched in exactMatchFont()\n"));
+	    TRACE(("\t\tcset=%s, font=%s\n", csetstr, name));
+	    return font;
+	}
+    }
+    return NULL;
+}
+
+static XFontStruct *
+csSuppliedMatchFont(dpy, csetstr, namelist, numlist)
+Display *dpy;
+String csetstr;
+FSFontName *namelist;
+Cardinal numlist;
+{
+    XFontStruct *font;
+
+    while (numlist-- > 0) {
+	String name = (namelist++)->name;
+	char namebuf[512];
+
+	if (*name != '-' && *name != '+') continue;	/* not an XLFD name */
+
+	(void)strcpy(namebuf, name);
+	(void)strcat(namebuf, "-");
+	(void)strcat(namebuf, csetstr);
+
+	if ((font = CachedLoadQueryFontByName(dpy, namebuf)) != NULL) {
+	    TRACE(("\tmatched in csSuppliedMatchFont()\n"));
+	    TRACE(("\t\tcset=%s, font=%s\n", csetstr, namebuf));
+	    return font;
+	}
+    }
+    return NULL;
+}
+
+static XFontStruct *
+csReplacedMatchFont(dpy, csetstr, namelist, numlist)
+Display *dpy;
+String csetstr;
+FSFontName *namelist;
+Cardinal numlist;
+{
+    XFontStruct *font;
+
+    while (numlist-- > 0) {
+	String name = namelist->name;
+	char namebuf[512];
+	String p;
+	int namelen;
+	int hyphen;
+	
+	if (*name != '-' && *name != '+') {	/* non XLFD name */
+	    if (namelist->xlfdname == NULL ||
+		(namelist->xlfdname == noname &&
+		(namelist->xlfdname = getXLFDName(dpy, name)) == NULL)) {
+		/* this font doesn't have XLFD name */
+		namelist++;
+		continue;
+	    }
+	    name = namelist->xlfdname;
+	}
+	namelist++;
+
+	(void)strcpy(namebuf, name);
+	namelen = strlen(namebuf);
+
+	/* find charset part of the font name */
+	for (p = namebuf + namelen - 1, hyphen = 0; p > namebuf; p--) {
+	    if (*p == '-') hyphen++;
+	    if (hyphen == 2) goto found;
+	}
+	continue;	/* doesn't contain charset part */
+
+    found:
+	p++;		/* now p points the charset part of the fontname */
+
+	/* replace charset part */
+	(void)strcpy(p, csetstr);
+
+	if ((font = CachedLoadQueryFontByName(dpy, namebuf)) != NULL) {
+	    TRACE(("\tmatched in csReplacedMatchFont()\n"));
+	    TRACE(("\t\tcset=%s, font=%s\n", csetstr, namebuf));
+	    return font;
+	}
+    }
+    return NULL;
+}
+
+/*- getXLFDName: obtain XLFD font name from a non XLFD font name -*/
+static String
+getXLFDName(dpy, nonxlfdname)
+Display *dpy;
+String nonxlfdname;
+{
+    XFontStruct *font;
+    Atom fontprop;
+    String name;
+
+    TRACE(("getXLFDName(%s)\n", nonxlfdname));
+    font = CachedLoadQueryFontByName(dpy, nonxlfdname);
+    if (font == NULL) {
+	DPRINT(("getXLFDName(%s):CachedLoadQueryFontByName() failed\n",
+		nonxlfdname));
+	return NULL;
+    }
+    if (!XGetFontProperty(font, XA_FONT, (unsigned long *)&fontprop)) {
+	/* can't get 'FONT' property. so XLFD name cannot be obtained */
+	DPRINT(("getXLFDName(%s): can't get FONT property\n",
+		nonxlfdname));
+	CachedFreeFont(dpy, font);
+	return NULL;
+    }
+
+    CachedFreeFont(dpy, font);
+    name = CachedGetAtomName(dpy, fontprop);
+    TRACE(("\tgot %s\n", name));
+    return (*name == '-' || *name == '+') ? name : NULL;
+}
+
+
+/*
+ * public functions
+ */
+
+int
+ExtractFontsFromFontSet(dpy, fontset, charsets, exfonts, numcsets)
+Display *dpy;
+String fontset;
+KICharSet *charsets;
+KICharSetFont *exfonts;
+Cardinal numcsets;
+{
+    Cardinal nfonts;
+    String fsp;
+    char fsbuf[1024];
+    FSFontName *fnp;
+    FSFontName fnbuf[20];
+    int nfound;
+    int i;
+
+    TRACE(("ExtractFontsFromFontSet(fontset=%s)\n", fontset));
+    for (i = 0; i < numcsets; i++) {
+	exfonts[i].font = NULL;
+	exfonts[i].charset = NULL;
+	exfonts[i].cldata = NULL;
+    }
+
+    if (strlen(fontset) >= sizeof(fsbuf)) {
+	fsp = XtMalloc((unsigned int)(strlen(fontset) + 1));
+    } else {
+	fsp = fsbuf;
+    }
+    XmuCopyISOLatin1Lowered(fsp, fontset);
+
+    if ((nfonts = countCommas(fsp) + 1) >= XtNumber(fnbuf)) {
+	fnp = (FSFontName *)XtMalloc(nfonts * sizeof(FSFontName));
+    } else {
+	fnp = fnbuf;
+    }
+    for (i = 0; i < nfonts; i++) fnp[i].xlfdname = noname;
+
+    if ((nfonts = parseFontSet(fsp, fnp)) == 0) {
+	if (fsp != fsbuf) XtFree(fsp);
+	if (fnp != fnbuf) XtFree((char *)fnp);
+	return 0;
+    }
+
+    nfound = 0;
+    for (i = 0; i < numcsets; i++) {
+	KICharSet *cp = charsets + i;
+	KICharSetFont *fp = exfonts + i;
+
+	TRACE(("\tfor charset #%d\n", i));
+	if (tryCharSet(dpy, cp, fp, fnp, nfonts, exactMatchFont) ||
+	    tryCharSet(dpy, cp, fp, fnp, nfonts, csSuppliedMatchFont) ||
+	    tryCharSet(dpy, cp, fp, fnp, nfonts, csReplacedMatchFont)) {
+	    nfound++;
+	}
+    }
+    if (fsp != fsbuf) XtFree(fsp);
+    if (fnp != fnbuf) XtFree((char *)fnp);
+
+    return nfound;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/imlib/Imakefile	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,20 @@
+#include "../../Kinput2.conf"
+
+             SRCS = imattr.c imbuf.c imconv.c imdata.c imdispatch.c \
+		    imic.c improto.c imrequest.c imxport.c
+             OBJS = imattr.o imbuf.o imconv.o imdata.o imdispatch.o \
+		    imic.o improto.o imrequest.o imxport.o
+
+   LOCAL_INCLUDES = -I../../include -I.
+         INCLUDES = $(LOCAL_INCLUDES)
+
+          DEFINES = $(TRANSPORTDEFS) -DXIM_BC	/* XIM bug compatibility */
+
+NormalLibraryObjectRule()
+NormalLibraryTarget(im,$(OBJS))
+DependTarget()
+
+#ifdef IHaveSubdirs
+MakeSubdirs($(SUBDIRS))
+DependSubdirs($(SUBDIRS))
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/imlib/im.h	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,269 @@
+/* $Id: im.h,v 1.13 2002/01/27 11:33:06 ishisone Exp $ */
+/*
+ * Copyright (c) 1994  Software Research Associates, Inc.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted, provided
+ * that the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Software Research Associates not be
+ * used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission.  Software Research
+ * Associates makes no representations about the suitability of this software
+ * for any purpose.  It is provided "as is" without express or implied
+ * warranty.
+ *
+ * Author:  Makoto Ishisone, Software Research Associates, Inc., Japan
+ */
+
+#ifndef _im_h
+#define _im_h
+
+#include <stdio.h>
+#include <X11/IntrinsicP.h>
+#include <X11/StringDefs.h>
+#include <X11/Xos.h>
+#include <X11/Xfuncs.h>
+
+/* macros defined in the system header file cause problem... */
+#undef major
+#undef minor
+
+#define EXT_DEBUG_VAR	debug_IMProtocol
+#include "DebugPrint.h"
+#include "AsyncErr.h"
+#include "FontBank.h"
+#include "ConvCtrl.h"
+
+#include "imprtype.h"
+#include "imbuf.h"
+#include "imxport.h"
+#include "imconst.h"
+
+/*
+ * Restrictions of attributes
+ */
+
+#define MIN_LINE_SPACING	2
+#define MIN_AREA_WIDTH		16
+#define MIN_AREA_HEIGHT		10
+
+/*
+ * IMDispatcher -- request dispatcher
+ */
+
+typedef int (*IMDispatcher)();
+
+
+/*
+ * IMConnection
+ */
+
+typedef struct _im_connection_ {
+    /* protocol information */
+    int major_protocol_version;
+    int minor_protocol_version;
+#ifdef XIM_BC
+    int has_length_bug;
+#endif
+    int serial;				/* connection serial # (for debug) */
+    Widget proto_widget;		/* protocol handler widget */
+
+    /* transport information */
+    IMTransport transport;
+
+    int byte_order;			/* byte order of the client */
+#define ORDER_UNKNOWN	0		/* order is yet unknown */
+#define ORDER_BIG	1		/* big endian */
+#define ORDER_LITTLE	2		/* little endian */
+
+    /* communication buffer */
+    IMBuffer in_buf;			/* input buffer */
+    IMBuffer out_buf;			/* output buffer */
+#define IM_INBUF(conn)	(&(conn)->in_buf)
+#define IM_OUTBUF(conn)	(&(conn)->out_buf)
+
+    IMDispatcher dispatcher;		/* request dispatch procedure */
+
+    struct _im_im_ *im_list;		/* list of IMs on this connection */
+
+#ifdef notyet
+    /* authentication information */
+    IMAuth *server_auth;		/* server authentication data */
+    IMAuth *client_auth;		/* client authentication data */
+#endif /* notyet */
+
+    /* scheduler */
+    int schedule;			/* type of operation to be performed */
+#define SCHED_WRITE	1		/* flush output buffer */
+#define SCHED_CLOSE	2		/* close down connection gently */
+#define SCHED_SHUTDOWN	4		/* force shut down */
+    struct _im_connection_ *queue_next;	/* output/close/shutdown queue */
+
+    struct _im_connection_ *next;
+} IMConnection;
+
+
+/*
+ * IMConverter -- information on the conversion engine
+ */
+typedef struct {
+    char **supported_locales;		/* list of supported locales */
+    int num_locales;
+    WidgetClass input_object_class;
+    WidgetClass display_object_class;
+} IMConverter;
+
+
+/*
+ * IMTriggerKey -- conversion trigger key specification
+ */
+typedef struct {
+    KeySym keysym;
+    long modifiers;
+    long check_modifiers;
+} IMTriggerKey;
+
+
+/*
+ * IMExtensionMask -- bit mask of enabled extensions
+ */
+typedef unsigned long IMExtensionMask;	/* holds up to 32 extensions */
+
+
+/*
+ * IMIM -- per-IM structure
+ */
+
+typedef struct _im_im_ {
+    unsigned int id;			/* input-method ID */
+    IMConnection *connection;		/* connection this IM is on */
+    struct _im_im_ *next;
+    struct _im_im_ *hash_next;		/* for hash table */
+    IMConverter *converter;		/* conversion engine */
+    IMExtensionMask mask;		/* enabled extensions */
+    struct _im_ic_ *ic_list;		/* list of all ICs belonging to this IM */
+} IMIM;
+
+
+/*
+ * IMAttributes and IMPSAttributes -- IC attributes structure
+ */
+
+typedef struct {
+    unsigned long set_mask;		/* shows attrs that have been set */
+    unsigned long change_mask;		/* shows attrs that have changed */
+#define ATTR_MASK_INPUT_STYLE	(1<<0)
+#define ATTR_MASK_CLIENT	(1<<1)
+#define ATTR_MASK_FOCUS		(1<<2)
+#define ATTR_MASK_PREEDIT_STATE	(1<<3)
+#define ATTR_MASK_RESET_STATE	(1<<4)
+    XIMStyle input_style;
+    Window client;			/* client window */
+    Window focus;			/* focus window */
+    unsigned long preedit_state;
+    unsigned long reset_state;
+} IMCommonAttributes;
+
+typedef struct {
+    unsigned long set_mask;		/* shows attrs that have been set */
+    unsigned long change_mask;		/* shows attrs that have changed */
+#define ATTR_MASK_AREA		(1<<0)
+#define ATTR_MASK_FOREGROUND	(1<<1)
+#define ATTR_MASK_BACKGROUND	(1<<2)
+#define ATTR_MASK_COLORMAP	(1<<3)
+#define ATTR_MASK_STD_COLORMAP	(1<<4)
+#define ATTR_MASK_BG_PIXMAP	(1<<5)
+#define ATTR_MASK_LINESPACE	(1<<6)
+#define ATTR_MASK_CURSOR	(1<<7)
+#define ATTR_MASK_AREA_NEEDED	(1<<8)
+#define ATTR_MASK_FONT_SET	(1<<9)
+#define ATTR_MASK_SPOT_LOCATION	(1<<10)
+    XRectangle area;
+    Pixel foreground, background;
+    Colormap colormap;
+    Atom std_colormap;
+    Pixmap bg_pixmap;
+    Position line_space;
+    Cursor cursor;
+    XRectangle area_needed;		/* width/height member are unused */
+    String font_set;
+    XPoint spot_location;		/* not used by status attr. */
+} IMPSAttributes;
+
+
+/*
+ * IMPendingEvent -- record of delayed processing event
+ */
+
+typedef struct _im_pending_event_ {
+    struct _im_ic_ *ic;
+    int synchronous;
+    XEvent event;
+    struct _im_pending_event_ *next;
+} IMPendingEvent;
+
+
+/*
+ * IMWindowProfile -- information about window
+ */
+
+typedef struct {
+    Dimension width;
+    Dimension height;
+    Window root;
+} IMWindowProfile;
+
+
+/*
+ * IMIC -- per-IC structure
+ */
+
+typedef struct _im_ic_ {
+    unsigned int id;			/* input-context ID */
+    IMIM *im;				/* IM this IC belongs to */
+    Widget conversion;			/* conversion widget attached
+					 * to this IC */
+    struct _im_ic_ *next;
+    struct _im_ic_ *hash_next;		/* for hash list */
+    int state;				/* current IC state */
+#define IC_SYNCING	0x01		/* waiting for SYNC_REPLY message */
+#define IC_CONVERTING	0x02		/* in conversion mode */
+#define IC_RESETTING	0x04		/* in resetting */
+#define IC_FORWARDING	0x08		/* in forward event */
+#define IC_IN_PREEDIT	0x10		/* in preedit (on-the-spot only) */
+#define IC_IN_STATUS	0x20		/* in status (on-the-spot only) */
+#define IC_DESTROYING	0x40		/* in process of IC destruction */
+    IMPendingEvent *pending_events;	/* pending events */
+    int style;				/* input style */
+#define IMSTYLE_SEPARATE	0	/* root window style */
+#define IMSTYLE_OVER_THE_SPOT	1	/* over-the-spot style */
+#define IMSTYLE_OFF_THE_SPOT	2	/* off-the-spot style */
+#define IMSTYLE_ON_THE_SPOT	3	/* on-the-spot style */
+    IMCommonAttributes common_attr;	/* general attributes */
+    IMPSAttributes preedit_attr;	/* preedit specific attributes */
+    IMPSAttributes status_attr;		/* status specific attributes */
+    IMWindowProfile client_profile;	/* client widow profile */
+    IMWindowProfile focus_profile;	/* focus window profile */
+    XFontStruct **fonts;
+    int num_fonts;
+    XFontStruct **status_fonts;
+    int num_status_fonts;
+} IMIC;
+
+
+/*
+ * IM and IC hash table size
+ */
+
+#define IM_HASH_SIZE	32
+#define IC_HASH_SIZE	128
+
+
+/*
+ * Public function declarations
+ */
+
+#include "imfuncs.h"
+
+#endif /* _im_h */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/imlib/imattr.c	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,2711 @@
+#ifndef lint
+static char *rcsid = "$Id: imattr.c,v 1.18 2002/01/10 15:04:05 ishisone Exp $";
+#endif
+/*
+ * Copyright (c) 1994  Software Research Associates, Inc.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted, provided
+ * that the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Software Research Associates not be
+ * used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission.  Software Research
+ * Associates makes no representations about the suitability of this software
+ * for any purpose.  It is provided "as is" without express or implied
+ * warranty.
+ *
+ * Author:  Makoto Ishisone, Software Research Associates, Inc., Japan
+ */
+
+#include "im.h"
+
+#ifndef XNSeparatorofNestedList
+#define XNSeparatorofNestedList "separatorofNesttedList"
+#endif
+#ifndef XNPreeditState
+#define XNPreeditState		"preeditState"
+#endif
+#ifndef XIMPreeditEnable
+#define XIMPreeditEnable	1L
+#define XIMPreeditDisable	2L
+#endif
+#ifndef XNResetState
+#define XNResetState		"resetState"
+#endif
+#ifndef XIMInitialState
+#define XIMInitialState		1L
+#define XIMPreserveState	2L
+#endif
+
+#define PAD4(n)	((((n) + 3) / 4) * 4)
+
+/*
+ * List of supported input styles.
+ */
+
+typedef struct {
+    XIMStyle xim_style;		/* X11R5 spec. */
+    int conversion_style;	/* kinput2 spec. */
+} InputStyle;
+
+static InputStyle styles[] = {
+    { XIMPreeditPosition|XIMStatusArea, IMSTYLE_OVER_THE_SPOT },
+    { XIMPreeditPosition|XIMStatusNothing, IMSTYLE_OVER_THE_SPOT },
+    { XIMPreeditArea|XIMStatusArea, IMSTYLE_OFF_THE_SPOT },
+    { XIMPreeditCallbacks|XIMStatusCallbacks, IMSTYLE_ON_THE_SPOT },
+    { XIMPreeditCallbacks|XIMStatusNothing, IMSTYLE_ON_THE_SPOT },
+    { XIMPreeditNothing|XIMStatusNothing, IMSTYLE_SEPARATE },
+    { 0 },
+};
+
+#define NEST_NONE	0
+#define NEST_PREEDIT	1
+#define NEST_STATUS	2
+
+#define CHECK_ICATTR_SIZE(validsize, code) \
+	if (len != validsize) { badSizeError(icp, code); return -1; }
+
+#undef OP_C
+#undef OP_S
+#undef OP_G
+
+#define OP_C	1	/* Create */
+#define OP_S	2	/* SetValues */
+#define OP_G	4	/* GetValues */
+
+typedef struct {
+    char *name;		/* attribute name */
+    int type;		/* type of attribute value */
+    int valid_ops;	/* valid operations for this attribute */
+    int (*set_proc) _Pt_((IMIM *, char *, int));
+    int (*get_proc) _Pt_((IMIM *, unsigned int, int));
+} IMAttribute;
+
+typedef struct {
+    char *name;		/* attribute name */
+    int type;		/* type of attribute value */
+    int valid_ops;	/* valid operations for this attribute */
+    int (*set_proc) _Pt_((IMIC *, char *, int, int, int, int));
+    int (*get_proc) _Pt_((IMIC *, unsigned int, int, int, char *, int));
+} ICAttribute;
+
+
+/*
+ * IM attributes
+ */
+
+static int getQueryInputStyle _Pt_((IMIM *imp, unsigned int id, int offset));
+
+static IMAttribute imAttributes[] = {
+    { XNQueryInputStyle, TYPE_XIM_STYLES, OP_G,
+	  NULL, getQueryInputStyle },
+};
+
+static int numImAttributes = XtNumber(imAttributes);
+
+
+/*
+ * IC attributes
+ */
+
+static int setInputStyle _Pt_((IMIC *, char *, int, int, int, int));
+static int setClientWindow _Pt_((IMIC *, char *, int, int, int, int));
+static int setFocusWindow _Pt_((IMIC *, char *, int, int, int, int));
+static int setPreeditAttributes _Pt_((IMIC *, char *, int, int, int, int));
+static int setStatusAttributes _Pt_((IMIC *, char *, int, int, int, int));
+static int setArea _Pt_((IMIC *, char *, int, int, int, int));
+static int setAreaNeeded _Pt_((IMIC *, char *, int, int, int, int));
+static int setForeground _Pt_((IMIC *, char *, int, int, int, int));
+static int setBackground _Pt_((IMIC *, char *, int, int, int, int));
+static int setColormap _Pt_((IMIC *, char *, int, int, int, int));
+static int setBgPixmap _Pt_((IMIC *, char *, int, int, int, int));
+static int setLineSpace _Pt_((IMIC *, char *, int, int, int, int));
+static int setCursor _Pt_((IMIC *, char *, int, int, int, int));
+static int setSpotLocation _Pt_((IMIC *, char *, int, int, int, int));
+static int setStdColormap _Pt_((IMIC *, char *, int, int, int, int));
+static int setFontSet _Pt_((IMIC *, char *, int, int, int, int));
+static int setPreeditState _Pt_((IMIC *, char *, int, int, int, int));
+static int setResetState _Pt_((IMIC *, char *, int, int, int, int));
+
+static int getPreeditAttributes _Pt_((IMIC *, unsigned int, int, int, char *, int));
+static int getStatusAttributes _Pt_((IMIC *, unsigned int, int, int, char *, int));
+static int getInputStyle _Pt_((IMIC *, unsigned int, int, int, char *, int));
+static int getClientWindow _Pt_((IMIC *, unsigned int, int, int, char *, int));
+static int getFocusWindow _Pt_((IMIC *, unsigned int, int, int, char *, int));
+static int getFilterEvents _Pt_((IMIC *, unsigned int, int, int, char *, int));
+static int getArea _Pt_((IMIC *, unsigned int, int, int, char *, int));
+static int getAreaNeeded _Pt_((IMIC *, unsigned int, int, int, char *, int));
+static int getSpotLocation _Pt_((IMIC *, unsigned int, int, int, char *, int));
+static int getColormap _Pt_((IMIC *, unsigned int, int, int, char *, int));
+static int getStdColormap _Pt_((IMIC *, unsigned int, int, int, char *, int));
+static int getForeground _Pt_((IMIC *, unsigned int, int, int, char *, int));
+static int getBackground _Pt_((IMIC *, unsigned int, int, int, char *, int));
+static int getBgPixmap _Pt_((IMIC *, unsigned int, int, int, char *, int));
+static int getFontSet _Pt_((IMIC *, unsigned int, int, int, char *, int));
+static int getLineSpace _Pt_((IMIC *, unsigned int, int, int, char *, int));
+static int getCursor _Pt_((IMIC *, unsigned int, int, int, char *, int));
+static int getPreeditState _Pt_((IMIC *, unsigned int, int, int, char *, int));
+static int getResetState _Pt_((IMIC *, unsigned int, int, int, char *, int));
+
+static ICAttribute icAttributes[] = {
+    { XNInputStyle, TYPE_CARD32, OP_C|OP_G,
+	  setInputStyle, getInputStyle },
+    { XNClientWindow, TYPE_WINDOW, OP_C|OP_S|OP_G,
+	  setClientWindow, getClientWindow },
+    { XNFocusWindow, TYPE_WINDOW, OP_C|OP_S|OP_G,
+	  setFocusWindow, getFocusWindow },
+    { XNFilterEvents, TYPE_CARD32, OP_G,
+	  NULL, getFilterEvents },
+    { XNPreeditAttributes, TYPE_NESTED_LIST, OP_C|OP_S|OP_G,
+	  setPreeditAttributes, getPreeditAttributes },
+    { XNStatusAttributes, TYPE_NESTED_LIST, OP_C|OP_S|OP_G,
+	  setStatusAttributes, getStatusAttributes },
+    { XNArea, TYPE_XRECTANGLE, OP_C|OP_S|OP_G,
+	  setArea, getArea },
+    { XNAreaNeeded, TYPE_XRECTANGLE, OP_C|OP_S|OP_G,
+	  setAreaNeeded, getAreaNeeded },
+    { XNSpotLocation, TYPE_XPOINT, OP_C|OP_S|OP_G,
+	  setSpotLocation, getSpotLocation },
+    { XNColormap, TYPE_CARD32, OP_C|OP_S|OP_G,
+	  setColormap, getColormap },
+    { XNStdColormap, TYPE_CARD32, OP_C|OP_S|OP_G,
+	  setStdColormap, getStdColormap },
+    { XNForeground, TYPE_CARD32, OP_C|OP_S|OP_G,
+	  setForeground, getForeground },
+    { XNBackground, TYPE_CARD32, OP_C|OP_S|OP_G,
+	  setBackground, getBackground },
+    { XNBackgroundPixmap, TYPE_CARD32, OP_C|OP_S|OP_G,
+	  setBgPixmap, getBgPixmap },
+    { XNFontSet, TYPE_XFONTSET, OP_C|OP_S|OP_G,
+	  setFontSet, getFontSet },
+    { XNLineSpace, TYPE_CARD16, OP_C|OP_S|OP_G,	  /* should be TYPE_INT16 */
+	  setLineSpace, getLineSpace },
+    { XNCursor, TYPE_CARD32, OP_C|OP_S|OP_G,
+	  setCursor, getCursor },
+    { XNSeparatorofNestedList, TYPE_SEPARATOR, OP_G,
+	  NULL, NULL },
+    { XNPreeditState, TYPE_CARD32, OP_C|OP_S|OP_G,
+      setPreeditState, getPreeditState },
+    { XNResetState, TYPE_CARD32, OP_C|OP_S|OP_G,
+      setResetState, getResetState },
+};
+
+static int numIcAttributes = XtNumber(icAttributes);
+
+
+static unsigned int getC16 _Pt_((char *data, int order));
+static int getI16 _Pt_((char *data, int order));
+static unsigned long getC32 _Pt_((char *data, int order));
+static int validateClientWindow _Pt_((IMIC *icp));
+static int validateFocusWindow _Pt_((IMIC *icp));
+static void badSizeError _Pt_((IMIC *icp, int code));
+static void unnestedError _Pt_((IMIC *icp));
+static IMPSAttributes *getPSPtr _Pt_((IMIC *icp, int type));
+static int getIMValues _Pt_((IMIM *imp, char *data, int len, int offset));
+static int getICValues _Pt_((IMIC *icp, char *data, int len, int nest,
+			     int offset, int *sepp));
+static int setICValues _Pt_((IMIC *icp, char *data, int len,
+			     int major, int op));
+static int getPSAttributes _Pt_((IMIC *icp, unsigned int id, int nest,
+				 int offset, char *data, int len));
+static void changeFonts _Pt_((IMIC *icp, int preedit));
+static void fillCommonDefault _Pt_((IMIC *icp, unsigned long mask));
+static int getNaturalLineSpace _Pt_((IMIC *icp, int preedit));
+static void fillPSDefault _Pt_((IMIC *icp, int type, unsigned long mask));
+static int validateCommonAttr _Pt_((IMIC *icp, int checkonly));
+static int validatePSAttr _Pt_((IMIC *icp, int type, int checkonly));
+static void changeConversionAttributes _Pt_((IMIC *icp));
+static void computeAreaNeeded _Pt_((IMIC *icp));
+static void computeAreaForQuery _Pt_((IMIC *icp));
+
+
+/*
+ * Functions reading out numbers from byte buffer
+ */
+
+static unsigned int
+getC16(data, order)
+char *data;
+int order;
+{
+    unsigned char *p = (unsigned char *)data;
+    unsigned int x;
+
+    x = (order == ORDER_BIG) ? ((p[0] << 8) | p[1]) : (p[0] | p[1] << 8);
+    return x;
+}
+
+static int
+getI16(data, order)
+char *data;
+int order;
+{
+    unsigned char *p = (unsigned char *)data;
+    long l;
+
+    l = (order == ORDER_BIG) ? ((p[0] << 8) | p[1]) : (p[0] | p[1] << 8);
+    return (l < 32768) ? (int)l : (int)(l - 65536L);
+}
+
+static unsigned long
+getC32(data, order)
+char *data;
+int order;
+{
+    unsigned char *p = (unsigned char *)data;
+    unsigned long x;
+
+    if (order == ORDER_BIG) {
+	x = (p[0]<<24) | (p[1]<<16) | (p[2]<<8) | p[3];
+    } else {
+	x = p[0] | (p[1]<<8) | (p[2]<<16) | (p[3]<<24);
+    }
+    return x;
+}
+
+
+/*
+ * Functions that check the validity of resources.
+ */
+
+static int
+validateClientWindow(icp)
+IMIC *icp;
+{
+    return IMValidateWindow(XtDisplay(icp->im->connection->proto_widget),
+			    icp->common_attr.client, &icp->client_profile);
+}
+
+static int
+validateFocusWindow(icp)
+IMIC *icp;
+{
+    IMCommonAttributes *ap = &icp->common_attr;
+
+    /*
+     * This function assumes that the client window has already
+     * been validated.
+     */
+    if ((ap->set_mask & ATTR_MASK_CLIENT) && ap->focus == ap->client) {
+	icp->focus_profile = icp->client_profile;
+	return 1;
+    } else {
+	return IMValidateWindow(XtDisplay(icp->im->connection->proto_widget),
+				icp->common_attr.focus, &icp->focus_profile);
+    }
+}
+
+
+/*
+ * Functions submit errors
+ */
+
+static void
+badSizeError(icp, code)
+IMIC *icp;
+int code;
+{
+    DPRINT(("bad size error for IC #%d\n", icp->id));
+    IMSendError(icp->im->connection, code, icp->im->id, icp->id,
+		"invalid size of attribute value");
+}
+
+static void
+unnestedError(icp)
+IMIC *icp;
+{
+    DPRINT(("unnested error for IC #%d\n", icp->id));
+    IMSendError(icp->im->connection, IMBadSomething, icp->im->id, icp->id,
+		"either preedit or status specification required");
+}
+
+
+/*
+ * Functions getting IM attributes
+ */
+
+static IMPSAttributes *
+getPSPtr(icp, type)
+IMIC *icp;
+int type;
+{
+    switch (type) {
+    case NEST_PREEDIT: return &icp->preedit_attr;
+    case NEST_STATUS: return &icp->status_attr;
+    default: return NULL;
+    }
+}
+
+static int
+getIMValues(imp, data, len, offset)
+IMIM *imp;
+char *data;
+int len;
+int offset;		/* request offset */
+{
+    unsigned int id;		/* attribute ID */
+    IMAttribute *attrp;
+    IMConnection *conn = imp->connection;
+    int byte_order = conn->byte_order;
+
+    while (len >= 2) {
+	id = getC16(data, byte_order);
+	data += 2;
+	len -= 2;
+
+	if (id > numImAttributes) {
+	    /* invalid attribute ID */
+	    IMCancelRequest(conn, offset);
+	    IMSendError(conn, IMBadSomething, imp->id, 0,
+			"invalid IM attribute ID");
+	    return -1;
+	}
+
+	attrp = &imAttributes[id];
+	if (!(attrp->valid_ops & OP_G)) {
+	    IMCancelRequest(conn, offset);
+	    IMSendError(conn, IMBadSomething, imp->id, 0,
+			"invalid operation (IMGetValues) for this attribute");
+	    return -1;
+	}
+
+	if ((*attrp->get_proc)(imp, id, offset) < 0) return -1;
+    }
+    return 0;
+}
+
+/* ARGSUSED */
+static int
+getQueryInputStyle(imp, id, offset)
+IMIM *imp;
+unsigned int id;
+int offset;
+{
+    IMConnection *conn = imp->connection;
+    unsigned int num_styles, num_bytes;
+    InputStyle *stp;
+
+    TRACE(("imlib:getQueryInputStyle()\n"));
+
+    for (num_styles = 0, stp = styles; stp->xim_style != 0; stp++) {
+	num_styles++;
+    }
+    num_bytes = num_styles * 4 + 4;
+    IMPutC16(conn, id);
+    IMPutC16(conn, num_bytes);
+    IMPutC16(conn, num_styles);
+    IMPutC16(conn, 0);
+    for (stp = styles; stp->xim_style != 0; stp++) {
+	IMPutC32(conn, stp->xim_style);
+    }
+    return 0;
+}
+
+
+/*
+ * Functions setting IC attributes
+ */
+
+static int
+setICValues(icp, data, len, nest, op)
+IMIC *icp;
+char *data;
+int len;
+int nest;
+int op;
+{
+    IMConnection *conn = icp->im->connection;
+    unsigned int imid = icp->im->id;
+    unsigned int icid = icp->id;
+    unsigned int id;
+    unsigned int value_len;
+    unsigned int attr_len;
+    char *value;
+    ICAttribute *attrp;
+    int byte_order = icp->im->connection->byte_order;
+
+    TRACE(("imlib:setICValues()\n"));
+
+    while (len > 0) {
+	if (len < 4) {
+	    DPRINT(("attribute data length < 4\n"));
+	    IMSendError(conn, IMBadSomething, imid, icid, "Bad attribute data");
+	    return -1;
+	}
+	id = getC16(data, byte_order);
+	value_len = getC16(data + 2, byte_order);
+	attr_len = PAD4(4 + value_len);
+
+	if (attr_len > len) {
+	    DPRINT(("attribute data length > request length\n"));
+	    IMSendError(conn, IMBadSomething, imid, icid,
+			"Bad attribute length");
+	    return -1;
+	}
+	value = data + 4;
+
+	if (id > numIcAttributes) {
+	    DPRINT(("invalid IC attribute ID %d\n", id));
+	    IMSendError(conn, IMBadSomething, imid, icid,
+			"invalid IC attribute ID");
+	    return -1;
+	}
+	attrp = &icAttributes[id];
+	if (!(attrp->valid_ops & op)) {
+	    DPRINT(("invalid operation (%s) for IC attr %d\n",
+		    op == OP_C ? "create" : "set", id));
+	    IMSendError(conn, IMBadSomething, imid, icid,
+			"invalid operation for this attribute");
+	    return -1;
+	}
+
+	/*
+	 * Call attribute set procedure.
+	 */
+	if ((*attrp->set_proc)(icp, value, (int)value_len, byte_order, nest, op) < 0) {
+	    /*
+	     * Error has occured.  The set procedure has already sent
+	     * appropriate error message, so just return here.
+	     */
+	    return -1;
+	}
+
+	data += attr_len;
+	len -= attr_len;
+    }
+    return 0;
+}
+
+/* ARGSUSED */
+static int
+setInputStyle(icp, value, len, order, nest, op)
+IMIC *icp;
+char *value;
+int len;
+int order;
+int nest;
+int op;
+{
+    TRACE(("imlib:setInputStyle()\n"));
+
+    CHECK_ICATTR_SIZE(4, IMBadStyle);
+
+    /*
+     * InputStyle must be set with CreateIC.
+     */
+    if (op != OP_C) {
+	DPRINT(("trying to change input style through SetICValues\n"));
+	IMSendError(icp->im->connection, IMBadStyle,
+		    icp->im->id, icp->id,
+		    "InputStyle cannot be changed by SetICValues");
+	return -1;
+    }
+
+    icp->common_attr.input_style = (XIMStyle)getC32(value, order);
+    icp->common_attr.set_mask |= ATTR_MASK_INPUT_STYLE;
+    icp->common_attr.change_mask |= ATTR_MASK_INPUT_STYLE;
+    TRACE(("\tinput style: %ld\n", icp->common_attr.input_style));
+    return 0;
+}
+
+/* ARGSUSED */
+static int
+setClientWindow(icp, value, len, order, nest, op)
+IMIC *icp;
+char *value;
+int len;
+int order;
+int nest;
+int op;
+{
+    TRACE(("imlib:setClientWindow()\n"));
+
+    CHECK_ICATTR_SIZE(4, IMBadClientWindow);
+
+    /*
+     * ClientWindow cannot be changed.
+     */
+    if (icp->common_attr.set_mask & ATTR_MASK_CLIENT) {
+	DPRINT(("client window already specified\n"));
+	IMSendError(icp->im->connection, IMBadClientWindow,
+		    icp->im->id, icp->id, "ClientWindow already set");
+	return -1;
+    }
+
+    icp->common_attr.client = (Window)getC32(value, order);
+    TRACE(("\tclient window: %08lx\n", icp->common_attr.client));
+
+    icp->common_attr.set_mask |= ATTR_MASK_CLIENT;
+    icp->common_attr.change_mask |= ATTR_MASK_CLIENT;
+
+    return 0;
+}
+
+/* ARGSUSED */
+static int
+setFocusWindow(icp, value, len, order, nest, op)
+IMIC *icp;
+char *value;
+int len;
+int order;
+int nest;
+int op;
+{
+    Window focus;
+
+    TRACE(("imlib:setFocusWindow()\n"));
+
+    CHECK_ICATTR_SIZE(4, IMBadFocusWindow);
+
+    focus = (Window)getC32(value, order);
+    TRACE(("\tfocus window: %08lx\n", focus));
+
+    if (!(icp->common_attr.set_mask & ATTR_MASK_FOCUS) ||
+	focus != icp->common_attr.focus) {
+	icp->common_attr.change_mask |= ATTR_MASK_FOCUS;
+    }
+    icp->common_attr.focus = focus;
+    icp->common_attr.set_mask |= ATTR_MASK_FOCUS;
+    return 0;
+}
+
+/* ARGSUSED */
+static int
+setPreeditAttributes(icp, value, len, order, nest, op)
+IMIC *icp;
+char *value;
+int len;
+int order;
+int nest;
+int op;
+{
+    TRACE(("imlib:setPreeditAttributes()\n"));
+    return setICValues(icp, value, len, NEST_PREEDIT, op);
+}
+
+/* ARGSUSED */
+static int
+setStatusAttributes(icp, value, len, order, nest, op)
+IMIC *icp;
+char *value;
+int len;
+int order;
+int nest;
+int op;
+{
+    TRACE(("imlib:setStatusAttributes()\n"));
+    return setICValues(icp, value, len, NEST_STATUS, op);
+}
+
+/* ARGSUSED */
+static int
+setArea(icp, value, len, order, nest, op)
+IMIC *icp;
+char *value;
+int len;
+int order;
+int nest;
+int op;
+{
+    IMPSAttributes *ap;
+    XRectangle area;
+
+    TRACE(("imlib:setArea()\n"));
+
+    CHECK_ICATTR_SIZE(8, IMBadArea);
+
+    if ((ap = getPSPtr(icp, nest)) == NULL) {
+	unnestedError(icp);
+	return -1;
+    }
+
+    area.x = getI16(value, order);
+    area.y = getI16(value + 2, order);
+    area.width = getC16(value + 4, order);
+    area.height = getC16(value + 6, order);
+    TRACE(("\tarea: %d, %d, %d, %d\n",
+	   area.x, area.y, area.width, area.height));
+
+    if (!(ap->set_mask & ATTR_MASK_AREA) ||
+	area.x != ap->area.x ||
+	area.y != ap->area.y ||
+	area.width != ap->area.width ||
+	area.height != ap->area.height) {
+	ap->change_mask |= ATTR_MASK_AREA;
+    }
+
+    ap->area.x = area.x;
+    ap->area.y = area.y;
+    ap->area.width = area.width;
+    ap->area.height = area.height;
+    ap->set_mask |= ATTR_MASK_AREA;
+
+    return 0;
+}
+
+/* ARGSUSED */
+static int
+setAreaNeeded(icp, value, len, order, nest, op)
+IMIC *icp;
+char *value;
+int len;
+int order;
+int nest;
+int op;
+{
+    IMPSAttributes *ap;
+    XRectangle area;
+
+    TRACE(("imlib:setAreaNeeded()\n"));
+
+    CHECK_ICATTR_SIZE(8, IMBadArea);
+
+    if ((ap = getPSPtr(icp, nest)) == NULL) {
+	unnestedError(icp);
+	return -1;
+    }
+
+    area.width = getC16(value + 4, order);
+    area.height = getC16(value + 6, order);
+    TRACE(("\tarea needed: %d, %d\n", area.width, area.height));
+
+    if (!(ap->set_mask & ATTR_MASK_AREA_NEEDED) ||
+	area.width != ap->area_needed.width ||
+	area.height != ap->area_needed.height) {
+	ap->change_mask |= ATTR_MASK_AREA_NEEDED;
+    }
+
+    ap->area_needed.width = area.width;
+    ap->area_needed.height = area.height;
+    ap->set_mask |= ATTR_MASK_AREA_NEEDED;
+
+    return 0;
+}
+
+/* ARGSUSED */
+static int
+setForeground(icp, value, len, order, nest, op)
+IMIC *icp;
+char *value;
+int len;
+int order;
+int nest;
+int op;
+{
+    IMPSAttributes *ap;
+    Pixel fore;
+
+    TRACE(("imlib:setForeground()\n"));
+
+    CHECK_ICATTR_SIZE(4, IMBadForeground);
+
+    if ((ap = getPSPtr(icp, nest)) == NULL) {
+	unnestedError(icp);
+	return -1;
+    }
+
+    fore = getC32(value, order);
+    TRACE(("\tforeground: %ld\n", fore));
+
+    if (!(ap->set_mask & ATTR_MASK_FOREGROUND) || fore != ap->foreground) {
+	ap->change_mask |= ATTR_MASK_FOREGROUND;
+    }
+    ap->foreground = fore;
+    ap->set_mask |= ATTR_MASK_FOREGROUND;
+    return 0;
+}
+
+/* ARGSUSED */
+static int
+setBackground(icp, value, len, order, nest, op)
+IMIC *icp;
+char *value;
+int len;
+int order;
+int nest;
+int op;
+{
+    IMPSAttributes *ap;
+    Pixel back;
+
+    TRACE(("imlib:setBackground()\n"));
+
+    CHECK_ICATTR_SIZE(4, IMBadBackground);
+
+    if ((ap = getPSPtr(icp, nest)) == NULL) {
+	unnestedError(icp);
+	return -1;
+    }
+
+    back = getC32(value, order);
+    TRACE(("\tbackground: %ld\n", back));
+
+    if (!(ap->set_mask & ATTR_MASK_BACKGROUND) || back != ap->background) {
+	ap->change_mask |= ATTR_MASK_BACKGROUND;
+    }
+    ap->background = back;
+    ap->set_mask |= ATTR_MASK_BACKGROUND;
+    return 0;
+}
+
+/* ARGSUSED */
+static int
+setColormap(icp, value, len, order, nest, op)
+IMIC *icp;
+char *value;
+int len;
+int order;
+int nest;
+int op;
+{
+    IMPSAttributes *ap;
+    Colormap cmap;
+
+    TRACE(("imlib:setColormap()\n"));
+
+    CHECK_ICATTR_SIZE(4, IMBadColormap);
+
+    if ((ap = getPSPtr(icp, nest)) == NULL) {
+	unnestedError(icp);
+	return -1;
+    }
+
+    cmap = getC32(value, order);
+    TRACE(("\tcolormap: %08lx\n", cmap));
+
+    if (!(ap->set_mask & ATTR_MASK_COLORMAP) || cmap != ap->colormap) {
+	ap->change_mask |= ATTR_MASK_COLORMAP;
+    }
+    ap->colormap = cmap;
+    ap->set_mask |= ATTR_MASK_COLORMAP;
+    return 0;
+}
+
+/* ARGSUSED */
+static int
+setBgPixmap(icp, value, len, order, nest, op)
+IMIC *icp;
+char *value;
+int len;
+int order;
+int nest;
+int op;
+{
+    IMPSAttributes *ap;
+    Pixmap pixmap;
+
+    TRACE(("imlib:setBgPixmap()\n"));
+
+    CHECK_ICATTR_SIZE(4, IMBadPixmap);
+
+    if ((ap = getPSPtr(icp, nest)) == NULL) {
+	unnestedError(icp);
+	return -1;
+    }
+
+    pixmap = getC32(value, order);
+    TRACE(("\tbackground pixmap: %08lx\n", pixmap));
+
+    if (!(ap->set_mask & ATTR_MASK_BG_PIXMAP) || pixmap != ap->bg_pixmap) {
+	ap->change_mask |= ATTR_MASK_BG_PIXMAP;
+    }
+
+    ap->bg_pixmap = pixmap;
+    ap->set_mask |= ATTR_MASK_BG_PIXMAP;
+
+    return 0;
+}
+
+/* ARGSUSED */
+static int
+setLineSpace(icp, value, len, order, nest, op)
+IMIC *icp;
+char *value;
+int len;
+int order;
+int nest;
+int op;
+{
+    IMPSAttributes *ap;
+    int line_space;
+
+    TRACE(("imlib:setLineSpace()\n"));
+
+    CHECK_ICATTR_SIZE(2, IMBadSomething);
+
+    if ((ap = getPSPtr(icp, nest)) == NULL) {
+	unnestedError(icp);
+	return -1;
+    }
+
+    line_space = getI16(value, order);	/* ??? linespacing is 'int' */
+    TRACE(("\tline space: %d\n", line_space));
+
+    if (!(ap->set_mask & ATTR_MASK_LINESPACE) ||
+	line_space != ap->line_space) {
+	ap->change_mask |= ATTR_MASK_LINESPACE;
+    }
+    ap->line_space = line_space;
+    ap->set_mask |= ATTR_MASK_LINESPACE;
+    return 0;
+}
+
+/* ARGSUSED */
+static int
+setCursor(icp, value, len, order, nest, op)
+IMIC *icp;
+char *value;
+int len;
+int order;
+int nest;
+int op;
+{
+    IMPSAttributes *ap;
+    Cursor cursor;
+
+    TRACE(("imlib:setCursor()\n"));
+
+    CHECK_ICATTR_SIZE(4, IMBadCursor);
+
+    if ((ap = getPSPtr(icp, nest)) == NULL) {
+	unnestedError(icp);
+	return -1;
+    }
+
+    cursor = getC32(value, order);
+    TRACE(("\tcursor: %08lx\n", cursor));
+
+    if (!(ap->set_mask & ATTR_MASK_CURSOR) || cursor != ap->cursor) {
+	ap->change_mask |= ATTR_MASK_CURSOR;
+    }
+    ap->cursor = cursor;
+    ap->set_mask |= ATTR_MASK_CURSOR;
+    return 0;
+}
+
+/* ARGSUSED */
+static int
+setSpotLocation(icp, value, len, order, nest, op)
+IMIC *icp;
+char *value;
+int len;
+int order;
+int nest;
+int op;
+{
+    IMPSAttributes *ap;
+    XPoint spot;
+
+    TRACE(("imlib:setSpotLocation()\n"));
+
+    CHECK_ICATTR_SIZE(4, IMBadSpotLocation);
+
+    if (nest == NEST_STATUS) {
+	DPRINT(("spot location specified in a status attribute list\n"));
+	IMSendError(icp->im->connection, IMBadSpotLocation,
+		    icp->im->id, icp->id,
+		    "spot location isn't a status attribute");
+	return -1;
+    }
+
+    ap = &icp->preedit_attr;
+
+    spot.x = getI16(value, order);
+    spot.y = getI16(value + 2, order);
+    TRACE(("\tspot location: %d, %d\n", spot.x, spot.y));
+
+    if (!(ap->set_mask & ATTR_MASK_SPOT_LOCATION) ||
+	spot.x != ap->spot_location.x || spot.y != ap->spot_location.y) {
+	ap->change_mask |= ATTR_MASK_SPOT_LOCATION;
+    }
+    ap->spot_location.x = spot.x;
+    ap->spot_location.y = spot.y;
+    ap->set_mask |= ATTR_MASK_SPOT_LOCATION;
+    return 0;
+}
+
+/* ARGSUSED */
+static int
+setStdColormap(icp, value, len, order, nest, op)
+IMIC *icp;
+char *value;
+int len;
+int order;
+int nest;
+int op;
+{
+    IMPSAttributes *ap;
+    Atom colormap_name;
+    XStandardColormap *stdcolormaps;
+    Widget w = icp->im->connection->proto_widget;
+    Display *dpy = XtDisplay(w);
+    int ncolormaps;
+    Window root;
+    XAEHandle h;
+    int status;
+
+    TRACE(("imlib:setStdColormap()\n"));
+
+    CHECK_ICATTR_SIZE(4, IMBadAtom);
+
+    if ((ap = getPSPtr(icp, nest)) == NULL) {
+	unnestedError(icp);
+	return -1;
+    }
+
+    colormap_name = getC32(value, order);
+    if (icp->common_attr.set_mask & ATTR_MASK_CLIENT) {
+	root = icp->client_profile.root;
+    } else if (icp->common_attr.set_mask & ATTR_MASK_FOCUS) {
+	root = icp->focus_profile.root;
+    } else {
+	/*
+	 * Client has not specified client window yet.
+	 * Reading standard colormap property should been deffered
+	 * until the window is set, but for now...
+	 */
+	DDPRINT(2, ("std colormap specified, leaving client window unspecified\n"));
+	root = RootWindowOfScreen(XtScreen(w));
+    }
+
+    h = XAESetIgnoreErrors(dpy);
+    status = XGetRGBColormaps(dpy, root,
+			      &stdcolormaps, &ncolormaps, colormap_name);
+    XAEUnset(h);
+    if (!status || ncolormaps < 0) {
+	DPRINT(("can't get standard colormap (%ld)\n", colormap_name));
+	IMSendError(icp->im->connection, IMBadName, icp->im->id, icp->id,
+		"invalid standard colormap name");
+	return -1;
+    }
+
+    if (!(ap->set_mask & ATTR_MASK_STD_COLORMAP) ||
+	colormap_name != ap->std_colormap) {
+	ap->change_mask |= ATTR_MASK_STD_COLORMAP;
+    }
+    ap->std_colormap = colormap_name;
+    ap->colormap = stdcolormaps[0].colormap;
+    TRACE(("\tstandard colormap: %ld (colormap=%08lx)\n",
+	   colormap_name, ap->colormap));
+
+    ap->set_mask |= ATTR_MASK_STD_COLORMAP | ATTR_MASK_COLORMAP;
+    XFree((char *)stdcolormaps);
+    return 0;
+}
+
+/* ARGSUSED */
+static int
+setFontSet(icp, value, len, order, nest, op)
+IMIC *icp;
+char *value;
+int len;
+int order;
+int nest;
+int op;
+{
+    IMPSAttributes *ap;
+    unsigned int name_list_len;
+    char *name_list;
+
+    TRACE(("imlib:setFontSet()\n"));
+
+    if (len < 2) {
+	badSizeError(icp, IMBadName);
+	return -1;
+    }
+    name_list_len = getC16(value, order);
+    if (2 + name_list_len > len) {
+	badSizeError(icp, IMBadName);
+	return -1;
+    }
+
+    if ((ap = getPSPtr(icp, nest)) == NULL) {
+	unnestedError(icp);
+	return -1;
+    }
+
+    name_list = XtMalloc(name_list_len + 1);
+    bcopy(value + 2, name_list, name_list_len);
+    name_list[name_list_len] = '\0';
+    TRACE(("\tfontset: %s\n", name_list));
+
+    if (ap->set_mask & ATTR_MASK_FONT_SET) {
+	if (!strcmp(name_list, ap->font_set)) {
+	    XtFree(name_list);
+	} else {
+	    ap->change_mask |= ATTR_MASK_FONT_SET;
+	    if (ap->font_set != IMDefaultFontSet(icp->im)) {
+		XtFree(ap->font_set);
+	    }
+	    ap->font_set = name_list;
+	}
+    } else {
+	ap->font_set = name_list;
+	ap->set_mask |= ATTR_MASK_FONT_SET;
+	ap->change_mask |= ATTR_MASK_FONT_SET;
+    }
+    return 0;
+}
+
+/* ARGSUSED */
+static int
+setPreeditState(icp, value, len, order, nest, op)
+IMIC *icp;
+char *value;
+int len;
+int order;
+int nest;
+int op;
+{
+    IMCommonAttributes *ap = &icp->common_attr;
+    unsigned long preedit_state;
+
+    TRACE(("imlib:setPreeditState()\n"));
+
+    CHECK_ICATTR_SIZE(4, IMBadSomething);
+
+    if (nest == NEST_STATUS) {
+	DPRINT(("preedit state specified in a status attribute list\n"));
+	IMSendError(icp->im->connection, IMBadSomething,
+		    icp->im->id, icp->id,
+		    "preedit state isn't a status attribute");
+	return -1;
+    }
+
+    preedit_state = getC32(value, order);
+
+    ap->set_mask |= ATTR_MASK_PREEDIT_STATE;
+    ap->change_mask |= ATTR_MASK_PREEDIT_STATE;
+    ap->preedit_state = preedit_state;
+    return 0;
+}
+
+/* ARGSUSED */
+static int
+setResetState(icp, value, len, order, nest, op)
+IMIC *icp;
+char *value;
+int len;
+int order;
+int nest;
+int op;
+{
+    IMCommonAttributes *ap = &icp->common_attr;
+    unsigned long reset_state;
+
+    TRACE(("imlib:setResetState()\n"));
+
+    CHECK_ICATTR_SIZE(4, IMBadSomething);
+
+    reset_state = getC32(value, order);
+
+    ap->set_mask |= ATTR_MASK_RESET_STATE;
+    ap->change_mask |= ATTR_MASK_RESET_STATE;
+    ap->reset_state = reset_state;
+    return 0;
+}
+
+
+/*
+ * Functions getting IC attributes
+ */
+
+static int
+getICValues(icp, data, len, nest, offset, sepp)
+IMIC *icp;
+char *data;
+int len;
+int nest;		/* NEST_NONE, NEST_PREEDIT or NEST_STATUS */
+int offset;		/* request offset */
+int *sepp;		/* Out: true if ended with a nested list separator */
+{
+    unsigned int id;		/* attribute ID */
+    ICAttribute *attrp;
+    IMConnection *conn = icp->im->connection;
+    int byte_order = conn->byte_order;
+    char *org_data = data;
+    int r;
+
+    TRACE(("imlib:getICValues()\n"));
+
+    while (len >= 2) {
+	id = getC16(data, byte_order);
+	data += 2;
+	len -= 2;
+
+	if (id > numIcAttributes) {
+	    /* invalid attribute ID */
+	    DPRINT(("invalid IC attribute ID (%d) specified\n", id));
+	    IMCancelRequest(conn, offset);
+	    IMSendError(conn, IMBadSomething, icp->im->id, icp->id,
+			"invalid IC attribute ID");
+	    return -1;
+	}
+
+	attrp = &icAttributes[id];
+	if (attrp->type == TYPE_SEPARATOR) {
+	    /* nested list separator */
+	    *sepp = 1;
+	    return data - org_data;
+	}
+
+	if (!(attrp->valid_ops & OP_G)) {
+	    DPRINT(("invalid operation (get) for IC attr %d\n", id));
+	    IMCancelRequest(conn, offset);
+	    IMSendError(conn, IMBadSomething, icp->im->id, icp->id,
+			"invalid operation (ICGetValues) for this attribute");
+	    return -1;
+	}
+
+	r = (*attrp->get_proc)(icp, id, nest, offset, data, len);
+	/*
+	 * The return value of get_proc is usually 0, indicating success.
+	 * If it is less than 0, there are some errors.
+	 * If it is greater than 0,
+	 */
+	if (r < 0) return -1;
+
+	data += r;		/* r is extra offset */
+	len -= r;
+    }
+    *sepp = 0;
+    return data - org_data;
+}
+
+/* ARGSUSED */
+static int
+getPSAttributes(icp, id, nest, offset, data, len)
+IMIC *icp;
+unsigned int id;
+int nest;
+int offset;
+char *data;
+int len;
+{
+    IMConnection *conn = icp->im->connection;
+    unsigned int length;
+    int length_offset;
+    int attr_offset;
+    int nested_separator;
+    int r;
+
+    IMPutC16(conn, id);
+
+    length_offset = IMWritePos(conn);
+    IMPutC16(conn, 0);		/* dummy -- overwritten afterwards */
+
+    attr_offset = IMWritePos(conn);
+
+    r = getICValues(icp, data, len, nest, offset, &nested_separator);
+    if (r < 0) return -1;
+    if (!nested_separator) {
+	/* there's no nested list separator */
+	DPRINT(("nested list doesn't end with separator\n"));
+	/*
+	 * X11R6 Xlib sends nested attribute list which has no
+	 * separator at its end.  In order to accommodate to it,
+	 * don't send error for that.
+	 */
+#ifdef notdef
+	IMCancelRequest(conn, offset);
+	IMSendError(conn, IMBadSomething, icp->im->id, icp->id,
+		    "corrupted nested list");
+	return -1;
+#endif
+    }
+
+    /*
+     * Nested list is written on the output buffer.
+     * Calculate the length of the list.
+     */
+    length = IMWritePos(conn) - attr_offset;
+
+    /* rewrite attribute length field */
+    IMRewriteC16(conn, length_offset, length);
+    IMPutPad(conn);
+
+    return r;
+}
+
+/* ARGSUSED */
+static int
+getPreeditAttributes(icp, id, nest, offset, data, len)
+IMIC *icp;
+unsigned int id;
+int nest;		/* unused */
+int offset;
+char *data;
+int len;
+{
+    TRACE(("imlib:getPreeditAttributes()\n"));
+    return getPSAttributes(icp, id, NEST_PREEDIT, offset, data, len);
+}
+
+/* ARGSUSED */
+static int
+getStatusAttributes(icp, id, nest, offset, data, len)
+IMIC *icp;
+unsigned int id;
+int nest;		/* unused */
+int offset;
+char *data;
+int len;
+{
+    TRACE(("imlib:getStatusAttributes()\n"));
+    return getPSAttributes(icp, id, NEST_STATUS, offset, data, len);
+}
+
+/* ARGSUSED */
+static int
+getInputStyle(icp, id, nest, offset, data, len)
+IMIC *icp;
+unsigned int id;
+int nest;
+int offset;
+char *data;
+int len;
+{
+    IMConnection *conn = icp->im->connection;
+
+    TRACE(("imlib:getInputStyle()\n"));
+
+    /*
+     * Input style must have been specified, (and validated)
+     * at IC creation.  No need for checking.
+     */
+    IMPutC16(conn, id);		/* attribute ID */
+    IMPutC16(conn, 4);		/* value length */
+    IMPutC32(conn, icp->common_attr.input_style);
+    return 0;
+}
+
+/* ARGSUSED */
+static int
+getClientWindow(icp, id, nest, offset, data, len)
+IMIC *icp;
+unsigned int id;
+int nest;
+int offset;
+char *data;
+int len;
+{
+    IMConnection *conn = icp->im->connection;
+
+    TRACE(("imlib:getClientWindow()\n"));
+
+    if (icp->common_attr.set_mask & ATTR_MASK_CLIENT) {
+	IMPutC16(conn, id);		/* attribute ID */
+	IMPutC16(conn, 4);		/* value length */
+	IMPutC32(conn, icp->common_attr.client);
+	return 0;
+    } else {
+	/* no default is available */
+	DPRINT(("getClientWindow without setting client window previously\n"));
+	IMCancelRequest(conn, offset);
+	IMSendError(conn, IMBadClientWindow, icp->im->id, icp->id,
+		    "client window not specified yet");
+	return -1;
+    }
+}
+
+/* ARGSUSED */
+static int
+getFocusWindow(icp, id, nest, offset, data, len)
+IMIC *icp;
+unsigned int id;
+int nest;
+int offset;
+char *data;
+int len;
+{
+    IMConnection *conn = icp->im->connection;
+
+    TRACE(("imlib:getFocusWindow()\n"));
+
+    if (!(icp->common_attr.set_mask & ATTR_MASK_FOCUS)) {
+	/* fill default value */
+	fillCommonDefault(icp, (unsigned long)ATTR_MASK_FOCUS);
+    }
+
+    if (icp->common_attr.set_mask & ATTR_MASK_FOCUS) {
+	IMPutC16(conn, id);		/* attribute ID */
+	IMPutC16(conn, 4);		/* value length */
+	IMPutC32(conn, icp->common_attr.focus);
+	return 0;
+    } else {
+	/*
+	 * Couldn't get the default value.  That is, neither
+	 * focus window nor client window is specified yet.
+	 */
+	DPRINT(("getFocusWindow without setting focus/client window previously\n"));
+	IMCancelRequest(conn, offset);
+	IMSendError(conn, IMBadFocusWindow, icp->im->id, icp->id,
+		    "neither of client/focus window not specified yet");
+	return -1;
+    }
+}
+
+/* ARGSUSED */
+static int
+getFilterEvents(icp, id, nest, offset, data, len)
+IMIC *icp;
+unsigned int id;
+int nest;
+int offset;
+char *data;
+int len;
+{
+    IMConnection *conn = icp->im->connection;
+
+    TRACE(("imlib:getFilterEvents()\n"));
+
+    /* We need only Key events */
+    IMPutC16(conn, id);		/* attribute ID */
+    IMPutC16(conn, 4);		/* value length */
+    IMPutC32(conn, KeyPressMask | KeyReleaseMask);
+    return 0;
+}
+
+/* ARGSUSED */
+static int
+getArea(icp, id, nest, offset, data, len)
+IMIC *icp;
+unsigned int id;
+int nest;
+int offset;
+char *data;
+int len;
+{
+    IMConnection *conn = icp->im->connection;
+    IMPSAttributes *ap;
+
+    TRACE(("imlib:getArea()\n"));
+
+    if ((ap = getPSPtr(icp, nest)) == NULL) {
+	IMCancelRequest(conn, offset);
+	unnestedError(icp);
+	return -1;
+    }
+
+    if (!(ap->set_mask & ATTR_MASK_AREA)) {
+	fillPSDefault(icp, nest, (unsigned long)ATTR_MASK_AREA);
+    }
+
+    IMPutC16(conn, id);		/* attribute ID */
+    IMPutC16(conn, 8);		/* value length */
+    IMPutI16(conn, ap->area.x);
+    IMPutI16(conn, ap->area.y);
+    IMPutC16(conn, ap->area.width);
+    IMPutC16(conn, ap->area.height);
+    return 0;
+}
+
+/* ARGSUSED */
+static int
+getAreaNeeded(icp, id, nest, offset, data, len)
+IMIC *icp;
+unsigned int id;
+int nest;
+int offset;
+char *data;
+int len;
+{
+    IMConnection *conn = icp->im->connection;
+    IMPSAttributes *ap;
+
+    TRACE(("imlib:getAreaNeeded()\n"));
+
+    if ((ap = getPSPtr(icp, nest)) == NULL) {
+	IMCancelRequest(conn, offset);
+	unnestedError(icp);
+	return -1;
+    }
+
+    /*
+     * Always call fillPSDefault to get appropriate AreaNeeded value.
+     */
+    fillPSDefault(icp, nest, (unsigned long)ATTR_MASK_AREA_NEEDED);
+
+    TRACE(("\tarea needed: %d, %d, %d, %d\n",
+	   ap->area_needed.x, ap->area_needed.y,
+	   ap->area_needed.width, ap->area_needed.height));
+
+    IMPutC16(conn, id);		/* attribute ID */
+    IMPutC16(conn, 8);		/* value length */
+    IMPutI16(conn, ap->area_needed.x);
+    IMPutI16(conn, ap->area_needed.y);
+    IMPutC16(conn, ap->area_needed.width);
+    IMPutC16(conn, ap->area_needed.height);
+    return 0;
+}
+
+/* ARGSUSED */
+static int
+getSpotLocation(icp, id, nest, offset, data, len)
+IMIC *icp;
+unsigned int id;
+int nest;
+int offset;
+char *data;
+int len;
+{
+    IMConnection *conn = icp->im->connection;
+    IMPSAttributes *ap = &icp->preedit_attr;
+
+    TRACE(("imlib:getSpotLocation()\n"));
+
+    if (nest == NEST_STATUS) {
+	IMCancelRequest(conn, offset);
+	IMSendError(conn, IMBadSomething, icp->im->id, icp->id,
+		    "spot location isn't a status attribute");
+	return -1;
+    }
+
+    if (!(ap->set_mask & ATTR_MASK_SPOT_LOCATION)) {
+	fillPSDefault(icp, NEST_PREEDIT,
+		      (unsigned long)ATTR_MASK_SPOT_LOCATION);
+    }
+
+    IMPutC16(conn, id);		/* attribute ID */
+    IMPutC16(conn, 4);		/* value length */
+    IMPutI16(conn, ap->spot_location.x);
+    IMPutI16(conn, ap->spot_location.y);
+    return 0;
+}
+
+/* ARGSUSED */
+static int
+getColormap(icp, id, nest, offset, data, len)
+IMIC *icp;
+unsigned int id;
+int nest;
+int offset;
+char *data;
+int len;
+{
+    IMConnection *conn = icp->im->connection;
+    IMPSAttributes *ap;
+
+    TRACE(("imlib:getColormap()\n"));
+
+    if ((ap = getPSPtr(icp, nest)) == NULL) {
+	IMCancelRequest(conn, offset);
+	unnestedError(icp);
+	return -1;
+    }
+
+    if (!(ap->set_mask & ATTR_MASK_COLORMAP)) {
+	fillPSDefault(icp, nest, (unsigned long)ATTR_MASK_COLORMAP);
+    }
+
+    IMPutC16(conn, id);		/* attribute ID */
+    IMPutC16(conn, 4);		/* value length */
+    IMPutC32(conn, ap->colormap);
+    return 0;
+}
+
+/* ARGSUSED */
+static int
+getStdColormap(icp, id, nest, offset, data, len)
+IMIC *icp;
+unsigned int id;
+int nest;
+int offset;
+char *data;
+int len;
+{
+    IMConnection *conn = icp->im->connection;
+    IMPSAttributes *ap;
+    Atom colormap_name;
+
+    TRACE(("imlib:getStdColormap()\n"));
+
+    if ((ap = getPSPtr(icp, nest)) == NULL) {
+	IMCancelRequest(conn, offset);
+	unnestedError(icp);
+	return -1;
+    }
+
+    if (ap->set_mask & ATTR_MASK_STD_COLORMAP) {
+	colormap_name = ap->std_colormap;
+    } else {
+	/* what to do? */
+	colormap_name = None;
+	DPRINT(("client asks standard colormap, but not specified\n"));
+    }
+
+    IMPutC16(conn, id);		/* attribute ID */
+    IMPutC16(conn, 4);		/* value length */
+    IMPutC32(conn, colormap_name);
+    return 0;
+}
+
+/* ARGSUSED */
+static int
+getForeground(icp, id, nest, offset, data, len)
+IMIC *icp;
+unsigned int id;
+int nest;
+int offset;
+char *data;
+int len;
+{
+    IMConnection *conn = icp->im->connection;
+    IMPSAttributes *ap;
+
+    TRACE(("imlib:getForeground()\n"));
+
+    if ((ap = getPSPtr(icp, nest)) == NULL) {
+	IMCancelRequest(conn, offset);
+	unnestedError(icp);
+	return -1;
+    }
+
+    if (!(ap->set_mask & ATTR_MASK_FOREGROUND)) {
+	fillPSDefault(icp, nest, (unsigned long)ATTR_MASK_FOREGROUND);
+    }
+
+    IMPutC16(conn, id);		/* attribute ID */
+    IMPutC16(conn, 4);		/* value length */
+    IMPutC32(conn, ap->foreground);
+    return 0;
+}
+
+/* ARGSUSED */
+static int
+getBackground(icp, id, nest, offset, data, len)
+IMIC *icp;
+unsigned int id;
+int nest;
+int offset;
+char *data;
+int len;
+{
+    IMConnection *conn = icp->im->connection;
+    IMPSAttributes *ap;
+
+    TRACE(("imlib:getBackground()\n"));
+
+    if ((ap = getPSPtr(icp, nest)) == NULL) {
+	IMCancelRequest(conn, offset);
+	unnestedError(icp);
+	return -1;
+    }
+
+    if (!(ap->set_mask & ATTR_MASK_BACKGROUND)) {
+	fillPSDefault(icp, nest, (unsigned long)ATTR_MASK_BACKGROUND);
+    }
+
+    IMPutC16(conn, id);		/* attribute ID */
+    IMPutC16(conn, 4);		/* value length */
+    IMPutC32(conn, ap->background);
+    return 0;
+}
+
+/* ARGSUSED */
+static int
+getBgPixmap(icp, id, nest, offset, data, len)
+IMIC *icp;
+unsigned int id;
+int nest;
+int offset;
+char *data;
+int len;
+{
+    IMConnection *conn = icp->im->connection;
+    IMPSAttributes *ap;
+
+    TRACE(("imlib:getBgPixmap()\n"));
+
+    if ((ap = getPSPtr(icp, nest)) == NULL) {
+	IMCancelRequest(conn, offset);
+	unnestedError(icp);
+	return -1;
+    }
+
+    if (!(ap->set_mask & ATTR_MASK_BG_PIXMAP)) {
+	fillPSDefault(icp, nest, (unsigned long)ATTR_MASK_BG_PIXMAP);
+    }
+
+    IMPutC16(conn, id);		/* attribute ID */
+    IMPutC16(conn, 4);		/* value length */
+    IMPutC32(conn, ap->bg_pixmap);
+    return 0;
+}
+
+/* ARGSUSED */
+static int
+getFontSet(icp, id, nest, offset, data, len)
+IMIC *icp;
+unsigned int id;
+int nest;
+int offset;
+char *data;
+int len;
+{
+    IMConnection *conn = icp->im->connection;
+    IMPSAttributes *ap;
+    int name_len;
+
+    TRACE(("imlib:getFontSet()\n"));
+
+    if ((ap = getPSPtr(icp, nest)) == NULL) {
+	IMCancelRequest(conn, offset);
+	unnestedError(icp);
+	return -1;
+    }
+
+    if (!(ap->set_mask & ATTR_MASK_FONT_SET)) {
+	fillPSDefault(icp, nest, (unsigned long)ATTR_MASK_FONT_SET);
+    }
+
+    name_len = strlen(ap->font_set);
+
+    IMPutC16(conn, id);		/* attribute ID */
+
+    IMPutC16(conn, (unsigned int)name_len);	/* value length */
+    IMPutString(conn, ap->font_set, name_len);
+    IMPutPad(conn);
+    return 0;
+}
+
+/* ARGSUSED */
+static int
+getLineSpace(icp, id, nest, offset, data, len)
+IMIC *icp;
+unsigned int id;
+int nest;
+int offset;
+char *data;
+int len;
+{
+    IMConnection *conn = icp->im->connection;
+    IMPSAttributes *ap;
+
+    TRACE(("imlib:getLineSpace()\n"));
+
+    if ((ap = getPSPtr(icp, nest)) == NULL) {
+	IMCancelRequest(conn, offset);
+	unnestedError(icp);
+	return -1;
+    }
+
+    if (!(ap->set_mask & ATTR_MASK_LINESPACE)) {
+	fillPSDefault(icp, nest, (unsigned long)ATTR_MASK_LINESPACE);
+    }
+
+    IMPutC16(conn, id);		/* attribute ID */
+    IMPutC16(conn, 4);	/* value length */
+    IMPutC32(conn, (unsigned long)ap->line_space);
+    return 0;
+}
+
+/* ARGSUSED */
+static int
+getCursor(icp, id, nest, offset, data, len)
+IMIC *icp;
+unsigned int id;
+int nest;
+int offset;
+char *data;
+int len;
+{
+    IMConnection *conn = icp->im->connection;
+    IMPSAttributes *ap;
+
+    TRACE(("imlib:getCursor()\n"));
+
+    if ((ap = getPSPtr(icp, nest)) == NULL) {
+	IMCancelRequest(conn, offset);
+	unnestedError(icp);
+	return -1;
+    }
+
+    if (!(ap->set_mask & ATTR_MASK_CURSOR)) {
+	fillPSDefault(icp, nest, (unsigned long)ATTR_MASK_CURSOR);
+    }
+
+    IMPutC16(conn, id);		/* attribute ID */
+    IMPutC16(conn, 4);		/* value length */
+    IMPutC32(conn, ap->cursor);
+    return 0;
+}
+
+/* ARGSUSED */
+static int
+getPreeditState(icp, id, nest, offset, data, len)
+IMIC *icp;
+unsigned int id;
+int nest;
+int offset;
+char *data;
+int len;
+{
+    IMConnection *conn = icp->im->connection;
+
+    TRACE(("imlib:getPreeditState()\n"));
+
+    if (nest == NEST_STATUS) {
+	IMCancelRequest(conn, offset);
+	IMSendError(conn, IMBadSomething, icp->im->id, icp->id,
+		    "preedit state isn't a status attribute");
+	return -1;
+    }
+
+    IMPutC16(conn, id);		/* attribute ID */
+    IMPutC16(conn, 4);		/* value length */
+    IMPutC32(conn,
+	     (icp->state & IC_CONVERTING) ?
+	     XIMPreeditEnable : XIMPreeditDisable);
+    return 0;
+}
+
+/* ARGSUSED */
+static int
+getResetState(icp, id, nest, offset, data, len)
+IMIC *icp;
+unsigned int id;
+int nest;
+int offset;
+char *data;
+int len;
+{
+    IMConnection *conn = icp->im->connection;
+
+    TRACE(("imlib:getResetState()\n"));
+
+    IMPutC16(conn, id);		/* attribute ID */
+    IMPutC16(conn, 4);		/* value length */
+    IMPutC32(conn, icp->common_attr.reset_state);
+    return 0;
+}
+
+static void
+changeFonts(icp, preedit)
+IMIC *icp;
+int preedit;
+{
+    FontBank bank = IMFontBank(icp->im);
+    String font_set;
+    XFontStruct ***fontsp;
+    int *num_fontsp;
+
+    TRACE(("imlib:changeFonts()\n"));
+
+    if (preedit) {
+	font_set = icp->preedit_attr.font_set;
+	fontsp = &icp->fonts;
+	num_fontsp = &icp->num_fonts;
+    } else {
+	font_set = icp->status_attr.font_set;
+	fontsp = &icp->status_fonts;
+	num_fontsp = &icp->num_status_fonts;
+    }
+
+    /*
+     * Unload previous fonts.
+     */
+    if (*num_fontsp > 0) {
+	FontBankFreeFonts(bank, *fontsp, *num_fontsp);
+    }
+
+    /*
+     * Load new fonts and store them in the IC structure.
+     */
+    *fontsp = FontBankGet(bank, font_set, num_fontsp);
+}
+
+
+/*
+ * Functions computing default attribute values
+ */
+
+static void
+fillCommonDefault(icp, mask)
+IMIC *icp;
+unsigned long mask;
+{
+    IMCommonAttributes *ap = &icp->common_attr;
+
+    TRACE(("imlib:fillCommonDefault()\n"));
+
+    /*
+     * Don't bother with the attributes which have been set.
+     */
+    mask &= ~ap->set_mask;
+
+    /*
+     * The attributes that have default value are FocusWindow,
+     * PreeditState and ResetState.
+     */
+    if (mask & ATTR_MASK_FOCUS) {
+	/* if ClientWindow is not set... no way */
+	if (mask & ATTR_MASK_CLIENT) {
+	    ap->focus = ap->client;
+	    ap->set_mask |= ATTR_MASK_FOCUS;
+	    icp->focus_profile = icp->client_profile;
+	    TRACE(("\tdefault focus window: %08lx\n", ap->focus));
+	}
+    }
+    if (mask & ATTR_MASK_PREEDIT_STATE) {
+	/* unless the client specified, we should start with disabled state. */
+	ap->set_mask |= ATTR_MASK_PREEDIT_STATE;
+	ap->reset_state = XIMPreeditDisable;
+    }
+    if (mask & ATTR_MASK_RESET_STATE) {
+	/* the default reset state must be the initial state. */
+	ap->set_mask |= ATTR_MASK_RESET_STATE;
+	ap->reset_state = XIMInitialState;
+    }
+}
+
+static int
+getNaturalLineSpace(icp, preedit)
+IMIC *icp;
+int preedit;
+{
+    XFontStruct **fonts;
+    int num_fonts;
+    int max_ascent = 0, max_descent = 0;
+    int i;
+
+    changeFonts(icp, preedit);
+    if (preedit) {
+	fonts = icp->fonts;
+	num_fonts = icp->num_fonts;
+    } else {
+	fonts = icp->status_fonts;
+	num_fonts = icp->num_status_fonts;
+    }
+
+    for (i = 0; i < num_fonts; i++) {
+	XFontStruct *font = fonts[i];
+	if (max_ascent < font->ascent) max_ascent = font->ascent;
+	if (max_descent < font->descent) max_descent = font->descent;
+    }
+
+    if (max_ascent + max_descent < MIN_LINE_SPACING) {
+	return MIN_LINE_SPACING;
+    } else {
+	return max_ascent + max_descent;
+    }
+}
+
+static void
+fillPSDefault(icp, type, mask)
+IMIC *icp;
+int type;	/* NEST_PREEDIT or NEST_STATUS */
+unsigned long mask;
+{
+    IMPSAttributes *ap;
+    IMConnection *conn = icp->im->connection;
+    Widget pw = conn->proto_widget;
+    int preedit;
+#ifdef DEBUG
+    char *typename = (type == NEST_PREEDIT) ? "preedit" : "status";
+#endif
+
+    TRACE(("imlib:fillPSDefault(%s)\n", typename));
+
+    preedit = (type == NEST_PREEDIT);
+    ap = preedit ? &icp->preedit_attr : &icp->status_attr;
+
+    /*
+     * Don't bother with the attributes which have been set.
+     * But area_needed needs to be computed each time (to get
+     * correct X and Y coordinates).
+     */
+    mask &= ~ap->set_mask | ATTR_MASK_AREA_NEEDED;
+
+    if (mask & ATTR_MASK_AREA) {
+	computeAreaForQuery(icp);
+	ap->set_mask |= ATTR_MASK_AREA;
+	DDPRINT(5, ("\tdefault %s area: %d,%d,%d,%d\n", typename,
+		    ap->area.x, ap->area.y, ap->area.width, ap->area.height));
+    }
+    if (mask & ATTR_MASK_FOREGROUND) {
+	ap->foreground = IMDefaultForeground(pw);
+	ap->set_mask |= ATTR_MASK_FOREGROUND;
+	DDPRINT(5, ("\tdefault %s foreground: %ld\n",
+		    typename, ap->foreground));
+    }
+    if (mask & ATTR_MASK_BACKGROUND) {
+	ap->background = IMDefaultBackground(pw);
+	ap->set_mask |= ATTR_MASK_BACKGROUND;
+	DDPRINT(5, ("\tdefault %s background: %ld\n",
+		    typename, ap->background));
+    }
+    if (mask & ATTR_MASK_COLORMAP) {
+	ap->colormap = pw->core.colormap;
+	ap->set_mask |= ATTR_MASK_COLORMAP;
+	DDPRINT(5, ("\tdefault %s colormap: %08lx\n",
+		    typename, ap->colormap));
+    }
+    if (mask & ATTR_MASK_STD_COLORMAP) {
+	/* you can't fill default. what to do? */
+	DDPRINT(5, ("\tdefault %s std colormap: N/A\n", typename));
+    }
+    if (mask & ATTR_MASK_BG_PIXMAP) {
+	ap->bg_pixmap = None;
+	ap->set_mask |= ATTR_MASK_BG_PIXMAP;
+	DDPRINT(5, ("\tdefault %s background pixmap: None\n", typename));
+    }
+    if (mask & ATTR_MASK_LINESPACE) {
+	if (!(ap->set_mask & ATTR_MASK_FONT_SET)) {
+	    fillPSDefault(icp, type, (unsigned long)ATTR_MASK_FONT_SET);
+	}
+	ap->line_space = getNaturalLineSpace(icp, type == NEST_PREEDIT);
+	ap->set_mask |= ATTR_MASK_LINESPACE;
+	DDPRINT(5, ("\tdefault line space: %d\n", ap->line_space));
+    }
+    if (mask & ATTR_MASK_CURSOR) {
+	ap->cursor = None;
+	ap->set_mask |= ATTR_MASK_CURSOR;
+	DDPRINT(5, ("\tdefault %s cursor: None\n", typename));
+    }
+    if (mask & ATTR_MASK_AREA_NEEDED) {
+	computeAreaNeeded(icp);
+	DDPRINT(5, ("\t%s area_needed: %d,%d,%d,%d\n", typename,
+		    ap->area_needed.x, ap->area_needed.y,
+		    ap->area_needed.width, ap->area_needed.height));
+    }
+    if (mask & ATTR_MASK_FONT_SET) {
+	ap->font_set = IMDefaultFontSet(icp->im);
+	ap->set_mask |= ATTR_MASK_FONT_SET;
+	DDPRINT(5, ("\tdefault %s fontset: %s\n", typename, ap->font_set));
+    }
+    if (mask & ATTR_MASK_SPOT_LOCATION) {
+	ap->spot_location.x = ap->spot_location.y = 0;
+	ap->set_mask |= ATTR_MASK_SPOT_LOCATION;
+	DDPRINT(5, ("\tdefault spot location: %d, %d\n",
+		    ap->spot_location.x, ap->spot_location.y));
+    }
+}
+
+/*
+ * Function validating attribute values
+ */
+
+static int
+validateCommonAttr(icp, checkonly)
+IMIC *icp;
+int checkonly;
+{
+    IMCommonAttributes *ap = &icp->common_attr;
+    IMConnection *conn = icp->im->connection;
+    unsigned long mask = ap->change_mask;
+    int ret = 0;
+
+    TRACE(("imlib:validateCommonAttr()\n"));
+
+    mask &= ap->set_mask;
+
+#define SENDERROR(code, msg) \
+    if (!checkonly && ret == 0) { \
+	IMSendError(conn, code, icp->im->id, icp->id, msg); ret = -1; \
+    }
+
+    if (mask & ATTR_MASK_INPUT_STYLE) {
+	XIMStyle xstyle = icp->common_attr.input_style;
+	InputStyle *isp = styles;
+
+	while (isp->xim_style != 0) {
+	    if (isp->xim_style == xstyle) break;
+	    isp++;
+	}
+	if (isp->xim_style == 0) {
+	    DPRINT(("unsupported input style\n"));
+	    ap->set_mask &= ~ATTR_MASK_INPUT_STYLE;
+	    SENDERROR(IMBadStyle, "unsupported input style");
+	} else {
+	    icp->style = isp->conversion_style;
+	}
+    }
+    if (mask & ATTR_MASK_CLIENT) {
+	if (!validateClientWindow(icp)) {
+	    DPRINT(("invalid client window ID\n"));
+	    ap->set_mask &= ~ATTR_MASK_CLIENT;
+	    SENDERROR(IMBadClientWindow, "invalid client window ID");
+	}
+    }
+    if (mask & ATTR_MASK_FOCUS) {
+	if (!validateFocusWindow(icp)) {
+	    DPRINT(("invalid focus window ID\n"));
+	    ap->set_mask &= ~ATTR_MASK_FOCUS;
+	    SENDERROR(IMBadFocusWindow, "invalid focus window ID");
+	}
+    }
+    if (mask & ATTR_MASK_PREEDIT_STATE) {
+	unsigned long preedit_state = ap->preedit_state;
+
+	if (preedit_state != XIMPreeditEnable &&
+	    preedit_state != XIMPreeditDisable) {
+	    DPRINT(("invalid preedit state\n"));
+	    ap->set_mask &= ~ATTR_MASK_PREEDIT_STATE;
+	    SENDERROR(IMBadSomething, "invalid preedit state");
+	}
+    }
+    if (mask & ATTR_MASK_RESET_STATE) {
+	unsigned long reset_state = ap->reset_state;
+
+	if (reset_state != XIMInitialState &&
+	    reset_state != XIMPreserveState) {
+	    /*
+	     * Xlib document says invalid values should be interpreted as
+	     * XIMInitialState.
+	     */
+	    DPRINT(("invalid reset state -- forcing initial state\n"));
+	    ap->reset_state = XIMInitialState;
+	}
+    }
+
+    return ret;
+#undef SENDERROR
+}
+
+static int
+validatePSAttr(icp, type, checkonly)
+IMIC *icp;
+int type;
+int checkonly;
+{
+    /*
+     * Check validity of preedit/status attribute values.
+     * 'type' is either NEST_PREEDIT or NEST_STATUS, indicating
+     * whether preedit or status attributes are to be checked.
+     * 'mask' is the attribute mask to be checked.
+     * If all the attributes are valid, this function return 0.
+     * Otherwise it issues an error message for the first invalid
+     * value detected, and returns -1.
+     */
+    IMPSAttributes *ap;
+    IMConnection *conn = icp->im->connection;
+    unsigned long mask;
+    int preedit;
+    int ret = 0;
+
+    TRACE(("imlib:validatePSAttr()\n"));
+
+    preedit = (type == NEST_PREEDIT);
+    ap = preedit ? &icp->preedit_attr : &icp->status_attr;
+
+    /* do not check unset attributes */
+    mask = ap->change_mask & ap->set_mask;
+
+#define SENDERROR(code, msg) \
+    if (!checkonly && ret == 0) { \
+	IMSendError(conn, code, icp->im->id, icp->id, msg); ret = -1; \
+    }
+
+    if (mask & ATTR_MASK_AREA) {
+	if (ap->area.width == 0 || ap->area.height == 0) {
+	    ap->set_mask &= ~ATTR_MASK_AREA;
+	    DPRINT(("zero area width/height\n"));
+	    SENDERROR(IMBadArea, "invalid area width/height");
+	}
+    }
+
+#ifdef notdef
+    if (mask & ATTR_MASK_COLORMAP) {
+    }
+
+    if (mask & ATTR_MASK_BG_PIXMAP) {
+    }
+#endif
+
+    if (mask & ATTR_MASK_LINESPACE) {
+	if (ap->line_space < MIN_LINE_SPACING) {
+	    ap->set_mask &= ~ATTR_MASK_LINESPACE;
+	    /*
+	     * we don't send error message in this case, because
+	     * there exist some applications which send invalid line
+	     * spacing and we don't want to break them.
+	     */
+	    DPRINT(("line space too small %d\n", ap->line_space));
+	}
+    }
+
+#ifdef notdef
+    if (mask & ATTR_MASK_CURSOR) {
+	/* How should we check it? */
+    }
+#endif
+
+    if (mask & ATTR_MASK_AREA_NEEDED) {
+    }
+#ifdef notdef
+    if (mask & ATTR_MASK_FONT_SET) {
+    }
+    if (mask & ATTR_MASK_SPOT_LOCATION) {
+    }
+#endif
+
+    return ret;
+#undef SENDERROR
+}
+
+
+/*
+ * Functions to extract necessary attributes and make conversion argument
+ */
+
+static void
+changeConversionAttributes(icp)
+IMIC *icp;
+{
+    unsigned long mask;
+    ConversionAttributes attr;
+
+    TRACE(("imlib:changeConversionAttributes()\n"));
+    mask = IMMakeConvAttributes(icp, &attr);
+    CControlChangeAttributes(icp->conversion, mask, &attr);
+}
+
+static void
+computeAreaNeeded(icp)
+IMIC *icp;
+{
+    IMPSAttributes *pattr = &icp->preedit_attr;
+    IMPSAttributes *sattr = &icp->status_attr;
+    IMWindowProfile *cpr = &icp->client_profile;
+    int width, height;
+    int min_width, min_height;
+    int default_status_width;
+    int font_height;
+
+    TRACE(("computeAreaNeeded()\n"));
+
+    if (icp->style == IMSTYLE_SEPARATE) return;
+
+    /*
+     * Get the current dimension of the client window.
+     */
+    (void)validateClientWindow(icp);
+
+    /*
+     * Compute the dimensions of the status region.
+     */
+    fillPSDefault(icp, NEST_STATUS, (unsigned long)ATTR_MASK_LINESPACE);
+    font_height = sattr->line_space + 2;
+    width = height = 0;
+    if (sattr->set_mask & ATTR_MASK_AREA_NEEDED) {
+	width = sattr->area_needed.width;
+	height = sattr->area_needed.height;
+	TRACE(("\tstatus areaNeeded was: (%d,%d)\n", width, height));
+    }
+
+    min_width = font_height * 3;
+    min_height = font_height;
+    if (min_width < MIN_AREA_WIDTH) min_width = MIN_AREA_WIDTH;
+    if (min_height < MIN_AREA_HEIGHT) min_height = MIN_AREA_HEIGHT;
+
+    if (width == 0) {
+	default_status_width =
+	    IMStatusWidth(icp->im->connection->proto_widget);
+	if (default_status_width > 0) {
+	    width = default_status_width;
+	} else {
+	    width = cpr->width / 5;		/* wild guess */
+	}
+    }
+    
+    if (width < min_width) width = min_width;
+    if (height < min_height) height = min_height;
+    
+    sattr->area_needed.x = 0;
+    sattr->area_needed.y = cpr->height - height;
+    sattr->area_needed.width = width;
+    sattr->area_needed.height = height;
+    TRACE(("\tstatus areaNeeded is now: (%d, %d, %d, %d)\n",
+	    sattr->area_needed.x, sattr->area_needed.y, width, height));
+
+    /*
+     * Compute the dimensions of the pre-edit region.
+     */
+    if (icp->style != IMSTYLE_OFF_THE_SPOT) return;
+
+    fillPSDefault(icp, NEST_PREEDIT, (unsigned long)ATTR_MASK_LINESPACE);
+    font_height = pattr->line_space + 2;
+    width = height = 0;
+    if (pattr->set_mask & ATTR_MASK_AREA_NEEDED) {
+	width = pattr->area_needed.width;
+	height = pattr->area_needed.height;
+	TRACE(("\tpreedit areaNeeded was: (%d,%d)\n",
+		width, height));
+    }
+
+    min_width = (cpr->width - sattr->area_needed.width) / 2;
+    min_height = font_height;
+    if (min_width < MIN_AREA_WIDTH) min_width = MIN_AREA_WIDTH;
+    if (min_height < MIN_AREA_HEIGHT) min_height = MIN_AREA_HEIGHT;
+
+    if (width < min_width) width = min_width;
+    if (height < min_height) height = min_height;
+
+    pattr->area_needed.x = sattr->area_needed.width;
+    pattr->area_needed.y = cpr->height - height;
+    pattr->area_needed.width = width;
+    pattr->area_needed.height = height;
+    TRACE(("\tpreedit areaNeeded is now: (%d, %d, %d, %d)\n",
+	    pattr->area_needed.x, pattr->area_needed.y, width, height));
+}
+
+static void
+computeAreaForQuery(icp)
+IMIC *icp;
+{
+    IMPSAttributes *pattr = &icp->preedit_attr;
+    IMPSAttributes *sattr = &icp->status_attr;
+
+    TRACE(("computeAreaForQuery()\n"));
+
+    if (icp->style == IMSTYLE_SEPARATE) return;
+
+    computeAreaNeeded(icp);
+
+    if (!(pattr->set_mask & ATTR_MASK_AREA)) {
+	if (icp->style == IMSTYLE_OVER_THE_SPOT) {
+	    IMWindowProfile *fpr = &icp->focus_profile;
+
+	    pattr->area.x = 0;
+	    pattr->area.y = 0;
+	    pattr->area.width = fpr->width;
+	    pattr->area.height = fpr->height;
+	} else {	/* IMSTYLE_OFF_THE_SPOT */
+	    pattr->area = pattr->area_needed;
+	}
+    }
+
+    if (!(sattr->set_mask & ATTR_MASK_AREA)) {
+	sattr->area = sattr->area_needed;
+    }
+}
+
+
+/*
+ * Public functions
+ */
+
+/*- IMPutIMAttrList: write list of supported IM attributes to output buffer -*/
+void
+IMPutIMAttrList(imp)
+IMIM *imp;
+{
+    IMConnection *conn = imp->connection;
+    IMAttribute *iap;
+    int offset, list_start, list_end;
+    int n;
+
+    TRACE(("IMPutIMAttrList()\n"));
+
+    offset = IMWritePos(conn);
+    IMPutC16(conn, 0);		/* dummy. overwritten afterwards */
+
+    list_start = IMWritePos(conn);
+    for (n = 0, iap = imAttributes; n < numImAttributes; n++, iap++) {
+	int length;
+
+	IMPutC16(conn, (unsigned int)n);
+	IMPutC16(conn, (unsigned int)iap->type);
+	length = strlen(iap->name);
+	IMPutC16(conn, (unsigned int)length);
+	IMPutString(conn, iap->name, length);
+	IMPutPad(conn);
+    }
+    list_end = IMWritePos(conn);
+    IMRewriteC16(conn, offset, (unsigned int)(list_end - list_start));
+}
+
+/*- IMPutICAttrList: write list of supported IC attributes to output buffer -*/
+void
+IMPutICAttrList(imp)
+IMIM *imp;
+{
+    IMConnection *conn = imp->connection;
+    ICAttribute *iap;
+    int offset, list_start, list_end;
+    int n;
+
+    TRACE(("IMPutICAttrList()\n"));
+
+    offset = IMWritePos(conn);
+    IMPutC16(conn, 0);		/* dummy. overwritten afterwards */
+    IMPutC16(conn, 0);		/* unused */
+
+    list_start = IMWritePos(conn);
+    for (n = 0, iap = icAttributes; n < numIcAttributes; n++, iap++) {
+	int length;
+
+	IMPutC16(conn, (unsigned int)n);
+	IMPutC16(conn, (unsigned int)iap->type);
+	length = strlen(iap->name);
+	IMPutC16(conn, (unsigned int)length);
+	IMPutString(conn, iap->name, length);
+	IMPutPad(conn);
+    }
+    list_end = IMWritePos(conn);
+    IMRewriteC16(conn, offset, (unsigned int)(list_end - list_start));
+}
+
+/* ARGSUSED */
+int
+IMSetIMValues(imp, data, len, major)
+IMIM *imp;
+char *data;
+int len;
+int major;
+{
+    TRACE(("IMSetIMValues(): not supported yet\n"));
+    /* not supported yet */
+
+    IMSendError(imp->connection, IMBadProtocol, imp->id, 0,
+		"this protocol is not supported yet");
+    return -1;
+}
+
+int
+IMGetIMValues(imp, data, len, offset)
+IMIM *imp;
+char *data;
+int len;
+int offset;		/* request offset */
+{
+    IMConnection *conn = imp->connection;
+    int pos, list_start, list_end;
+
+    TRACE(("IMGetIMValues()\n"));
+
+    pos = IMWritePos(conn);
+    IMPutC16(conn, 0);		/* length of the list. to be overwritten. */
+
+    list_start = IMWritePos(conn);
+
+    if (getIMValues(imp, data, len, offset) < 0) return -1;
+
+    list_end = IMWritePos(conn);
+    IMRewriteC16(conn, pos, (unsigned int)(list_end - list_start));
+    return 0;
+}
+
+int
+IMSetICValues(icp, data, len, major)
+IMIC *icp;
+char *data;
+int len;
+int major;
+{
+    int r1, r2, r3;
+
+    TRACE(("IMSetICValues()\n"));
+
+    /* clear change mask */
+    icp->common_attr.change_mask = 0;
+    icp->preedit_attr.change_mask = 0;
+    icp->status_attr.change_mask = 0;
+
+    /* read the specified data and set attributes */
+    r1 = setICValues(icp, data, len, 0,
+		     (major == XIM_CREATE_IC) ? OP_C : OP_S);
+
+    /* validate attributes */
+    r2 = IMValidateICAttributes(icp, (r1 < 0));
+
+    /*
+     * If the operation is CREATE_IC, input style attribute must be set.
+     */
+    if (major == XIM_CREATE_IC &&
+	!(icp->common_attr.set_mask & ATTR_MASK_INPUT_STYLE) &&
+	r1 == 0 && r2 == 0) {
+	DPRINT(("input style not specified by CreateIC\n"));
+	IMSendError(icp->im->connection, IMBadSomething, icp->im->id, icp->id,
+		    "inputStyle resource must be set");
+	r3 = -1;
+    } else {
+	r3 = 0;
+    }
+
+    if (r1 == 0 && r2 == 0) {
+	/* if conversion is taking place... */
+	if (icp->state & IC_CONVERTING) {
+	    changeConversionAttributes(icp);
+	}
+
+	/* if preedit state is specified... */
+	if (icp->common_attr.change_mask & ATTR_MASK_PREEDIT_STATE) {
+	    TRACE(("changing preedit state to %s\n",
+		   (icp->common_attr.preedit_state == XIMPreeditEnable) ?
+		   "enabled" : "disabled"));
+	    if (icp->common_attr.preedit_state == XIMPreeditEnable) {
+		IMStartConversion(icp);
+	    } else {
+		IMStopConversion(icp);
+	    }
+	}
+    }
+
+    return (r1 < 0 || r2 < 0 || r3 < 0) ? -1 : 0;
+}
+
+int
+IMGetICValues(icp, data, len, offset)
+IMIC *icp;
+char *data;
+int len;
+int offset;		/* request offset */
+{
+    int nested_separator;
+    int r;
+    IMConnection *conn = icp->im->connection;
+    int pos, list_start, list_end;
+
+    TRACE(("IMGetICValues()\n"));
+
+    pos = IMWritePos(conn);
+    IMPutC16(conn, 0);		/* dummy. overwritten afterwards */
+    IMPutC16(conn, 0);		/* unused */
+
+    list_start = IMWritePos(conn);
+
+    r = getICValues(icp, data, len, NEST_NONE, offset, &nested_separator);
+    if (r < 0) return -1;
+
+    list_end = IMWritePos(conn);
+    IMRewriteC16(conn, pos, (unsigned int)(list_end - list_start));
+
+    if (nested_separator) {
+	/*
+	 * There must have been some unbalanced NestedListSeparator.
+	 */
+	DPRINT(("getICvalues: unmatched separator\n"));
+	IMCancelRequest(icp->im->connection, offset);
+	IMSendError(icp->im->connection, IMBadSomething, icp->im->id, icp->id,
+		    "corrupted nested list");
+	return -1;
+    }
+    return 0;
+}
+
+void
+IMFillDefault(icp, common_mask, preedit_mask, status_mask)
+IMIC *icp;
+unsigned long common_mask;
+unsigned long preedit_mask;
+unsigned long status_mask;
+{
+    TRACE(("IMFillDefault()\n"));
+
+    if (common_mask != 0) fillCommonDefault(icp, common_mask);
+    if (preedit_mask != 0) fillPSDefault(icp, NEST_PREEDIT, preedit_mask);
+    if (status_mask != 0) fillPSDefault(icp, NEST_STATUS, status_mask);
+}
+
+int
+IMValidateWindow(dpy, win, profilep)
+Display *dpy;
+Window win;
+IMWindowProfile *profilep;
+{
+    Window root;
+    int x, y;
+    unsigned int width, height, border, depth;
+    XAEHandle h;
+    int s;
+
+    TRACE(("IMValidateWindow(win: %08lx)\n", win));
+
+    h = XAESetIgnoreErrors(dpy);
+    s = XGetGeometry(dpy, win, &root, &x, &y,
+		     &width, &height, &border, &depth);
+    XAEUnset(h);
+
+    if (profilep != NULL && s) {
+	profilep->width = width;
+	profilep->height = width;
+	profilep->root = root;
+    }
+    return s;
+}
+
+int
+IMValidateICAttributes(icp, checkonly)
+IMIC *icp;
+int checkonly;
+{
+    int error_occured;
+    int r;
+
+    TRACE(("IMValidateICAttributes()\n"));
+
+    /*
+     * Be careful not to send multiple error messages.
+     */
+
+    error_occured = 0;
+
+    r = validateCommonAttr(icp, checkonly);
+    if (r < 0) error_occured = 1;
+
+    r = validatePSAttr(icp, NEST_PREEDIT, (checkonly && error_occured));
+    if (r < 0) error_occured = 1;
+
+    r = validatePSAttr(icp, NEST_STATUS, (checkonly && error_occured));
+    if (r < 0) error_occured = 1;
+
+    return error_occured ? -1 : 0;
+}
+
+void
+IMFreeICAttributes(icp)
+IMIC *icp;
+{
+    IMPSAttributes *pattr = &icp->preedit_attr;
+    IMPSAttributes *sattr = &icp->status_attr;
+    FontBank bank = IMFontBank(icp->im);
+
+    TRACE(("IMFreeICAttributes()\n"));
+
+    if (pattr->set_mask & ATTR_MASK_FONT_SET) XtFree(pattr->font_set);
+    if (sattr->set_mask & ATTR_MASK_FONT_SET) XtFree(sattr->font_set);
+
+    if (icp->num_fonts > 0) {
+	FontBankFreeFonts(bank, icp->fonts, icp->num_fonts);
+    }
+    if (icp->num_status_fonts > 0) {
+	FontBankFreeFonts(bank, icp->status_fonts, icp->num_status_fonts);
+    }
+}
+
+unsigned long
+IMMakeConvAttributes(icp, attr)
+IMIC *icp;
+ConversionAttributes *attr;
+{
+    IMCommonAttributes *cattr;
+    IMPSAttributes *pattr, *sattr;
+    unsigned long cmask;		/* changed attributes */
+    unsigned long mask;			/* attributes to be set */
+
+    TRACE(("IMMakeConvAttributes()\n"));
+    mask = 0L;
+
+    cattr = &icp->common_attr;
+    pattr = &icp->preedit_attr;
+    sattr = &icp->status_attr;
+
+    /*
+     * Check changes of common attributes.
+     */
+    cmask = cattr->change_mask;
+
+    /* focus window */
+    if (cmask & ATTR_MASK_FOCUS) {
+	attr->focuswindow = cattr->focus;
+	mask |= CAFocusWindow;
+    }
+
+    /*
+     * Check changes of preedit attributes.
+     */
+    cmask = pattr->change_mask;
+
+    /* client area */
+    if (cmask & ATTR_MASK_AREA) {
+	attr->clientarea.x = pattr->area.x;
+	attr->clientarea.y = pattr->area.y;
+	attr->clientarea.width = pattr->area.width;
+	attr->clientarea.height = pattr->area.height;
+	mask |= CAClientArea;
+    }
+
+    /* foreground/background */
+    if (cmask & ATTR_MASK_FOREGROUND) {
+	attr->foreground = pattr->foreground;
+	mask |= CAColor;
+    }
+    if (cmask & ATTR_MASK_BACKGROUND) {
+	attr->background = pattr->background;
+	mask |= CAColor;
+    }
+
+    /* colormap */
+    if (cmask & ATTR_MASK_COLORMAP) {
+	attr->colormap = pattr->colormap;
+	mask |= CAColormap;
+    }
+
+    /* background pixmap */
+    if (cmask & ATTR_MASK_BG_PIXMAP) {
+	attr->background_pixmap = pattr->bg_pixmap;
+	mask |= CABackgroundPixmap;
+    }
+
+    /* line spacing */
+    if (cmask & ATTR_MASK_LINESPACE) {
+	attr->linespacing = pattr->line_space;
+	mask |= CALineSpacing;
+    }
+
+    /* cursor */
+    if (cmask & ATTR_MASK_CURSOR) {
+	attr->cursor = pattr->cursor;
+	mask |= CACursor;
+    }
+
+    /* font */
+    if (cmask & ATTR_MASK_FONT_SET) {
+	changeFonts(icp, 1);
+	attr->fonts = icp->fonts;
+	attr->num_fonts = icp->num_fonts;
+	mask |= CAFonts;
+    }
+
+    /* spot location */
+    if ((cmask & ATTR_MASK_SPOT_LOCATION) &&
+	icp->style == IMSTYLE_OVER_THE_SPOT) {
+	attr->spotx = pattr->spot_location.x;
+	attr->spoty = pattr->spot_location.y;
+	mask |= CASpotLocation;
+    }
+
+    /*
+     * Check changes of status attributes.
+     */
+    cmask = sattr->change_mask;
+
+    /* status area */
+    if (cmask & ATTR_MASK_AREA) {
+	attr->statusarea.x = sattr->area.x;
+	attr->statusarea.y = sattr->area.y;
+	attr->statusarea.width = sattr->area.width;
+	attr->statusarea.height = sattr->area.height;
+	mask |= CAStatusArea;
+    }
+
+    /* font */
+    if (cmask & ATTR_MASK_FONT_SET) {
+	changeFonts(icp, 0);
+	attr->status_fonts = icp->status_fonts;
+	attr->num_status_fonts = icp->num_status_fonts;
+	mask |= CAStatusFonts;
+    }
+
+    return mask;
+}
+
+void
+IMMoveLocation(icp, x, y)
+IMIC *icp;
+int x;
+int y;
+{
+    TRACE(("IMMoveLocation()\n"));
+
+    icp->preedit_attr.spot_location.x = x;
+    icp->preedit_attr.spot_location.y = y;
+    icp->preedit_attr.set_mask |= ATTR_MASK_SPOT_LOCATION;
+    icp->preedit_attr.change_mask = ATTR_MASK_SPOT_LOCATION;
+    if (icp->state & IC_CONVERTING) {
+	changeConversionAttributes(icp);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/imlib/imbuf.c	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,152 @@
+#ifndef lint
+static char *rcsid = "$Id: imbuf.c,v 1.7 1994/05/30 10:26:28 ishisone Exp $";
+#endif
+/*
+ * Copyright (c) 1994  Software Research Associates, Inc.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted, provided
+ * that the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Software Research Associates not be
+ * used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission.  Software Research
+ * Associates makes no representations about the suitability of this software
+ * for any purpose.  It is provided "as is" without express or implied
+ * warranty.
+ *
+ * Author:  Makoto Ishisone, Software Research Associates, Inc., Japan
+ */
+
+#include <X11/Intrinsic.h>
+#include <X11/Xfuncs.h>
+#include "imbuf.h"
+
+static void
+allocIMBuf(ibp, len)
+IMBuffer *ibp;
+int len;
+{
+    int newsize;
+
+    if (ibp->size >= len) return;
+    newsize = ibp->size * 2;
+    if (newsize < len) newsize = len;
+    if (ibp->buf == ibp->internal) {
+	ibp->buf = XtMalloc(newsize);
+	bcopy(ibp->internal, ibp->buf, ibp->size);
+    } else {
+	ibp->buf = XtRealloc(ibp->buf, newsize);
+    }
+    ibp->size = newsize;
+}
+
+void
+IMBufInit(ibp)
+IMBuffer *ibp;
+{
+    ibp->buf = ibp->internal;
+    IMBufClear(ibp);
+}
+
+void
+IMBufClear(ibp)
+IMBuffer *ibp;
+{
+    if (ibp->buf != NULL && ibp->buf != ibp->internal) XtFree(ibp->buf);
+    ibp->buf = ibp->internal;
+    ibp->size = sizeof(ibp->internal);
+    ibp->start = ibp->end = 0;
+}
+
+void
+IMBufAdd(ibp, data, len)
+IMBuffer *ibp;
+char *data;
+int len;
+{
+    allocIMBuf(ibp, ibp->end + len);
+    (void)bcopy(data, ibp->buf + ibp->end, len);
+    ibp->end += len;
+}
+
+void
+IMBufOverwrite(ibp, offset, data, len)
+IMBuffer *ibp;
+int offset;
+char *data;
+int len;
+{
+    int dend;
+
+    dend = ibp->start + offset + len;
+    allocIMBuf(ibp, dend);
+    (void)bcopy(data, ibp->buf + ibp->start + offset, len);
+    if (ibp->end < dend) ibp->end = dend;
+}
+
+char *
+IMBufAlloc(ibp, len)
+IMBuffer *ibp;
+int len;
+{
+    char *p;
+
+    allocIMBuf(ibp, ibp->end + len);
+    p = ibp->buf + ibp->end;
+    ibp->end += len;
+    return p;
+}
+
+void
+IMBufDiscard(ibp, len)
+IMBuffer *ibp;
+int len;
+{
+    if (len > 0) {
+	/* discard top of the data */
+	ibp->start += len;
+    } else {
+	/* discard end of the data */
+	ibp->end += len;
+    }
+    if (ibp->start >= ibp->end) IMBufClear(ibp);
+}
+
+void
+IMBufDiscardNUL(ibp)
+IMBuffer *ibp;
+{
+    while (ibp->start < ibp->end) {
+	if ((ibp->buf)[ibp->start] != 0) break;
+	ibp->start++;
+    }
+    if (ibp->start >= ibp->end) IMBufClear(ibp);
+}
+
+void
+IMBufCompact(ibp)
+IMBuffer *ibp;
+{
+
+    if (ibp->buf != ibp->internal) {
+	int length = IMBUFLEN(ibp);
+
+	if (length <= sizeof(ibp->internal)) {
+	    bcopy(ibp->buf + ibp->start, ibp->internal, length);
+	    XtFree(ibp->buf);
+	    ibp->buf = ibp->internal;
+	    ibp->size = sizeof(ibp->internal);
+	} else {
+	    bcopy(ibp->buf + ibp->start, ibp->buf, length);
+	}
+	ibp->start = 0;
+	ibp->end = length;
+    } else if (ibp->start != 0) {
+	int length = IMBUFLEN(ibp);
+
+	bcopy(ibp->buf + ibp->start, ibp->buf, length);
+	ibp->start = 0;
+	ibp->end = length;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/imlib/imbuf.h	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,50 @@
+/* $Id: imbuf.h,v 1.4 1994/05/12 09:01:05 ishisone Exp $ */
+/*
+ * Copyright (c) 1994  Software Research Associates, Inc.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted, provided
+ * that the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Software Research Associates not be
+ * used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission.  Software Research
+ * Associates makes no representations about the suitability of this software
+ * for any purpose.  It is provided "as is" without express or implied
+ * warranty.
+ *
+ * Author:  Makoto Ishisone, Software Research Associates, Inc., Japan
+ */
+
+#ifndef _imbuf_h
+#define _imbuf_h
+
+#include "imprtype.h"
+
+/*
+ * IMBuffer -- variable length buffer
+ */
+
+#define IMBUF_INT_SIZE	256
+typedef struct {
+    char *buf;			/* pointer to the buffer */
+    int size;			/* size of the buffer */
+    int start;			/* start offset of the data */
+    int end;			/* end offset of the data */
+    char internal[IMBUF_INT_SIZE]; /* internal data buffer */
+} IMBuffer;
+
+#define IMBUFLEN(ibp)	((ibp)->end - (ibp)->start)
+#define IMBUFDATA(ibp)	((ibp)->buf + (ibp)->start)
+
+extern void IMBufInit _Pt_((IMBuffer *ibp));
+extern void IMBufClear _Pt_((IMBuffer *ibp));
+extern void IMBufAdd _Pt_((IMBuffer *ibp, char *data, int len));
+extern void IMBufOverwrite _Pt_((IMBuffer *ibp, int offset,
+				 char *data, int len));
+extern char *IMBufAlloc _Pt_((IMBuffer *ibp, int len));
+extern void IMBufDiscard _Pt_((IMBuffer *ibp, int len));
+extern void IMBufDiscardNUL _Pt_((IMBuffer *ibp));
+extern void IMBufCompact _Pt_((IMBuffer *ibp));
+
+#endif /* _imbuf_h */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/imlib/imconst.h	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,144 @@
+/* $Id: imconst.h,v 1.4 1994/06/02 05:01:17 ishisone Exp $ */
+
+#ifndef _imconst_h
+#define _imconst_h
+
+/*
+ * Constants defined by the prototol spec.
+ */
+
+/* Protocol version number */
+#define XIM_MAJOR_PROTOCOL_VERSION	1
+#define XIM_MINOR_PROTOCOL_VERSION	0
+
+/* Major code for the core requests */
+#define XIM_CONNECT			1
+#define XIM_CONNECT_REPLY		2
+#define XIM_DISCONNECT			3
+#define XIM_DISCONNECT_REPLY		4
+#define XIM_AUTH_REQUIRED		10
+#define XIM_AUTH_REPLY			11
+#define XIM_AUTH_NEXT			12
+#define XIM_AUTH_SETUP			13
+#define XIM_AUTH_NG			14
+#define XIM_ERROR			20
+#define XIM_OPEN			30
+#define XIM_OPEN_REPLY			31
+#define XIM_CLOSE			32
+#define XIM_CLOSE_REPLY			33
+#define XIM_REGISTER_TRIGGERKEYS	34
+#define XIM_TRIGGER_NOTIFY		35
+#define XIM_TRIGGER_NOTIFY_REPLY	36
+#define XIM_SET_EVENT_MASK		37
+#define XIM_ENCODING_NEGOTIATION	38
+#define XIM_ENCODING_NEGOTIATION_REPLY	39
+#define XIM_QUERY_EXTENSION		40
+#define XIM_QUERY_EXTENSION_REPLY	41
+#define XIM_SET_IM_VALUES		42
+#define XIM_SET_IM_VALUES_REPLY		43
+#define XIM_GET_IM_VALUES		44
+#define XIM_GET_IM_VALUES_REPLY		45
+#define XIM_CREATE_IC			50
+#define XIM_CREATE_IC_REPLY		51
+#define XIM_DESTROY_IC			52
+#define XIM_DESTROY_IC_REPLY		53
+#define XIM_SET_IC_VALUES		54
+#define XIM_SET_IC_VALUES_REPLY		55
+#define XIM_GET_IC_VALUES		56
+#define XIM_GET_IC_VALUES_REPLY		57
+#define XIM_SET_IC_FOCUS		58
+#define XIM_UNSET_IC_FOCUS		59
+#define XIM_FORWARD_EVENT	       	60
+#define XIM_SYNC			61
+#define XIM_SYNC_REPLY			62
+#define XIM_COMMIT			63
+#define XIM_RESET_IC			64
+#define XIM_RESET_IC_REPLY		65
+#define XIM_GEOMETRY			70
+#define XIM_STR_CONVERSION		71
+#define XIM_STR_CONVERSION_REPLY	72
+#define XIM_PREEDIT_START		73
+#define XIM_PREEDIT_START_REPLY		74
+#define XIM_PREEDIT_DRAW		75
+#define XIM_PREEDIT_CARET		76
+#define XIM_PREEDIT_CARET_REPLY		77
+#define XIM_PREEDIT_DONE		78
+#define XIM_STATUS_START		79
+#define XIM_STATUS_DRAW			80
+#define XIM_STATUS_DONE			81
+#define XIM_PREEDITSTATE		82
+
+/* Data representation type */
+#define TYPE_SEPARATOR			0
+#define TYPE_CARD8			1
+#define TYPE_CARD16			2
+#define TYPE_CARD32			3
+#define TYPE_CHAR			4
+#define TYPE_WINDOW			5
+#define TYPE_XIM_STYLES			10
+#define TYPE_XRECTANGLE			11
+#define TYPE_XPOINT			12
+#define TYPE_XFONTSET			13
+#define TYPE_XIM_OPTIONS		14
+#define TYPE_XIM_HOT_KEY_TRIGGERS	15
+#define TYPE_XIM_HOT_KEY_STATE		16
+#define TYPE_XIM_STRING_CONVERSION	17
+#define TYPE_XIM_PREEDIT_STATE		18
+#define TYPE_XIM_RESET_STATE		19
+#define TYPE_XIM_RESET_RETURN		20
+#define TYPE_XIM_STRING_TEXT		21
+#define TYPE_NESTED_LIST		0x7fff
+
+/* Error code */
+#define IMBadAlloc			1
+#define IMBadStyle			2
+#define IMBadClientWindow		3
+#define IMBadFocusWindow		4
+#define IMBadArea			5
+#define IMBadSpotLocation		6
+#define IMBadColormap			7
+#define IMBadAtom			8
+#define IMBadPixel			9
+#define IMBadPixmap			10
+#define IMBadName			11
+#define IMBadCursor			12
+#define IMBadProtocol			13
+#define IMBadForeground			14
+#define IMBadBackground			15
+#define IMLocaleNotSupported		16
+#define IMBadSomething			999
+
+/* common flag */
+#define XIM_FLAG_SYNCHRONOUS		1
+
+/* XIM_FORWARD_EVENT flags */
+#define XIM_FLAG_REQUEST_FILTERING	2
+#define XIM_FLAG_REQUEST_LOOKUPSTRING	4
+
+/* XIM_COMMIT flags */
+#define XIM_FLAG_X_LOOKUP_CHARS		2
+#define XIM_FLAG_X_LOOKUP_KEYSYM	4
+
+
+/*
+ * Constants defined by this implementaion
+ */
+
+/* Major code for extension requests (> 128) */
+#define XIM_EXT_SET_EVENT_MASK		129
+#define XIM_EXT_FORWARD_KEYEVENT	130
+#define XIM_EXT_MOVE			131
+
+/* Extension mask */
+#define XIM_EXT_SET_EVENT_MASK_MASK	1
+#define XIM_EXT_FORWARD_KEYEVENT_MASK	2
+#define XIM_EXT_MOVE_MASK		4
+
+
+/* Transport status code */
+#define TRANSPORT_OK			0
+#define TRANSPORT_EOF			1
+#define TRANSPORT_PARTIAL		2
+#define TRANSPORT_ERROR			3
+
+#endif /* _imconst_h */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/imlib/imconv.c	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,1011 @@
+#ifndef lint
+static char *rcsid = "$Id: imconv.c,v 1.25 2002/01/24 09:07:19 ishisone Exp $";
+#endif
+/*
+ * Copyright (c) 1991, 1994  Software Research Associates, Inc.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted, provided
+ * that the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Software Research Associates not be
+ * used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission.  Software Research
+ * Associates makes no representations about the suitability of this software
+ * for any purpose.  It is provided "as is" without express or implied
+ * warranty.
+ *
+ * Author:  Makoto Ishisone, Software Research Associates, Inc., Japan
+ */
+
+#define COMMIT_SYNC
+#define STATUS_SYNC
+#include "im.h"
+#include "ConvMgr.h"
+#include "OverConv.h"
+#include "OffConv.h"
+#include "OnConv.h"
+#include "InputConv.h"
+
+static void fillDefaultAttributesForStartup _Pt_((IMIC *icp));
+static unsigned long makeConvAttributesForStartup _Pt_((IMIC *icp,
+							ConversionAttributes *attrp));
+static void commitString _Pt_((IMIC *icp, char *str, int len, int sync));
+static void fixCallback _Pt_((Widget w, XtPointer client_data,
+			      XtPointer call_data));
+static void detachConverter _Pt_((IMIC *icp));
+static void endCallback _Pt_((Widget w, XtPointer client_data,
+			      XtPointer call_data));
+static void unusedEventCallback _Pt_((Widget w, XtPointer client_data,
+				      XtPointer call_data));
+static void preeditStartCallback _Pt_((Widget w, XtPointer client_data,
+				       XtPointer call_data));
+static void preeditDoneCallback _Pt_((Widget w, XtPointer client_data,
+				      XtPointer call_data));
+static void preeditDrawCallback _Pt_((Widget w, XtPointer client_data,
+				      XtPointer call_data));
+static void preeditCaretCallback _Pt_((Widget w, XtPointer client_data,
+				       XtPointer call_data));
+static void statusStartCallback _Pt_((Widget w, XtPointer client_data,
+				      XtPointer call_data));
+static void statusDoneCallback _Pt_((Widget w, XtPointer client_data,
+				     XtPointer call_data));
+static void statusDrawCallback _Pt_((Widget w, XtPointer client_data,
+				     XtPointer call_data));
+static void preeditStart _Pt_((IMIC *icp));
+static void preeditDone _Pt_((IMIC *icp));
+static void preeditDraw _Pt_((IMIC *icp, OCCPreeditDrawArg *data));
+static void preeditCaret _Pt_((IMIC *icp, int caret));
+static void statusStart _Pt_((IMIC *icp));
+static void statusDone _Pt_((IMIC *icp));
+static void statusDraw _Pt_((IMIC *icp, OCCPreeditDrawArg *data));
+static void setEventMask _Pt_((IMIC *icp, unsigned long forward_mask,
+			       unsigned long synchronous_mask));
+
+
+/*- fillDefaultAttributesForStartup: put default necessary for conv. start -*/
+static void
+fillDefaultAttributesForStartup(icp)
+IMIC *icp;
+{
+    unsigned long cmask, pmask, smask;
+
+    cmask = ATTR_MASK_FOCUS | ATTR_MASK_PREEDIT_STATE | ATTR_MASK_RESET_STATE;
+
+    switch (icp->style) {
+    case IMSTYLE_OVER_THE_SPOT:
+	pmask = ATTR_MASK_FOREGROUND | ATTR_MASK_BACKGROUND |
+	    ATTR_MASK_FONT_SET;
+	smask = 0;
+	break;
+    case IMSTYLE_OFF_THE_SPOT:
+	pmask = ATTR_MASK_FOREGROUND | ATTR_MASK_BACKGROUND |
+	    ATTR_MASK_FONT_SET | ATTR_MASK_AREA;
+	smask = ATTR_MASK_AREA;
+	break;
+    case IMSTYLE_ON_THE_SPOT:
+	pmask = 0;
+	smask = 0;
+	break;
+    default:
+	pmask = 0;
+	smask = 0;
+    }
+    IMFillDefault(icp, cmask, pmask, smask);
+}
+
+/*- makeConvAttributesForStartup: get conv. attrs needed for startup -*/
+static unsigned long
+makeConvAttributesForStartup(icp, attrp)
+IMIC *icp;
+ConversionAttributes *attrp;
+{
+    icp->common_attr.change_mask = icp->common_attr.set_mask;
+    icp->preedit_attr.change_mask = icp->preedit_attr.set_mask;
+    icp->status_attr.change_mask = icp->status_attr.set_mask;
+    return IMMakeConvAttributes(icp, attrp);
+}
+
+/*- commitString: commmit converted string to client -*/
+static void
+commitString(icp, str, len, sync)
+IMIC *icp;
+char *str;
+int len;
+int sync;
+{
+    int offset;
+    IMConnection *conn = icp->im->connection;
+    unsigned int flag;
+
+    TRACE(("imlib:commitString()\n"));
+
+    if (DDEBUG_CONDITION(5)) {
+	unsigned char *p = (unsigned char *)str;
+	int i;
+
+	/*
+	 * Dump commiting string.
+	 */
+	printf("* commit string:\n\t");
+	for (i = 0; i < len; i++, p++) {
+	    if (*p == '\033') {
+		printf("ESC ");
+	    } else if (*p < ' ') {
+		printf("^%c ", *p + '@');
+	    } else if (*p == ' ') {
+		printf("sp ");
+	    } else if (*p >= 0x7f) {
+		printf("%x ", *p);
+	    } else {
+		printf("%c ", *p);
+	    }
+	}
+	printf("\n");
+    }
+
+    flag = XIM_FLAG_X_LOOKUP_CHARS;
+    if (sync) flag |= XIM_FLAG_SYNCHRONOUS;
+
+    offset = IMPutHeader(conn, XIM_COMMIT, 0, 0);
+    IMPutC16(conn, icp->im->id);
+    IMPutC16(conn, icp->id);
+    IMPutC16(conn, flag);
+    IMPutC16(conn, (unsigned int)len);
+    IMPutString(conn, str, len);
+    IMFinishRequest(conn, offset);
+}
+
+/*- fixCallback: fix callback -*/
+/* ARGSUSED */
+static void
+fixCallback(w, client_data, call_data)
+Widget w;
+XtPointer client_data;
+XtPointer call_data;
+{
+    IMIC *icp = (IMIC *)client_data;
+    IMConnection *conn = icp->im->connection;
+    Widget proto = conn->proto_widget;
+    Atom ctext = IMCtextAtom(proto);
+    CCTextCallbackArg *arg = (CCTextCallbackArg *)call_data;
+
+    TRACE(("imlib:fixCallback()\n"));
+
+    /* check encoding and format */
+    if (arg->encoding != ctext || arg->format != 8) {
+	/*
+	 * since every conversion object must support COMPOUND_TEXT,
+	 * it is a serious error.
+	 */
+	String params[2];
+	Cardinal num_params;
+	WidgetClass ioc = icp->im->converter->input_object_class;
+
+	params[0] = XtClass(proto)->core_class.class_name;
+	params[1] = ioc->core_class.class_name;
+	num_params = 2;
+
+	XtAppErrorMsg(XtWidgetToApplicationContext(proto),
+		      "encodingError", "convertedString", "WidgetError",
+		      "%s: encoding of the converted string is not COMPOUND_STRING. check inputObject %s",
+		      params, &num_params);
+    }
+
+    /*
+     * Send fixed string via XIM_COMMIT message.
+     * Since kinput2 uses full-synchronous mode,
+     * synchronous flag must be turned off.
+     */
+    commitString(icp, arg->text, arg->length, 0);
+
+#ifdef COMMIT_SYNC
+    /*
+     * Send XIM_SYNC_REPLY so that synchronize with clients here.
+     */
+    if (icp->state & IC_FORWARDING) {
+	icp->state &= ~IC_FORWARDING;
+	IMSendRequestWithIC(conn, XIM_SYNC_REPLY, 0, icp);
+    }
+#endif /* COMMIT_SYNC */
+}
+
+/*- detachConverter: detach conversion widget from specified IC -*/
+static void
+detachConverter(icp)
+IMIC *icp;
+{
+    Widget conv;
+
+    TRACE(("imlib:detachConverter()\n"));
+
+    conv = icp->conversion;
+    XtRemoveCallback(conv, XtNtextCallback, fixCallback, (XtPointer)icp);
+    XtRemoveCallback(conv, XtNendCallback, endCallback, (XtPointer)icp);
+    XtRemoveCallback(conv, XtNunusedEventCallback, unusedEventCallback, (XtPointer)icp);
+    if (icp->style == IMSTYLE_ON_THE_SPOT) {
+	XtRemoveCallback(conv, XtNpreeditStartCallback, preeditStartCallback,
+			 (XtPointer)icp);
+	XtRemoveCallback(conv, XtNpreeditDoneCallback, preeditDoneCallback,
+			 (XtPointer)icp);
+	XtRemoveCallback(conv, XtNpreeditDrawCallback, preeditDrawCallback,
+			 (XtPointer)icp);
+	XtRemoveCallback(conv, XtNpreeditCaretCallback, preeditCaretCallback,
+			 (XtPointer)icp);
+	XtRemoveCallback(conv, XtNstatusStartCallback, statusStartCallback,
+			 (XtPointer)icp);
+	XtRemoveCallback(conv, XtNstatusDoneCallback, statusDoneCallback,
+			 (XtPointer)icp);
+	XtRemoveCallback(conv, XtNstatusDrawCallback, statusDrawCallback,
+			 (XtPointer)icp);
+    }
+
+    CMReleaseConverter(XtParent(icp->im->connection->proto_widget), conv);
+    icp->conversion = NULL;
+}
+
+/*- endCallback: conversion end callback -*/
+/* ARGSUSED */
+static void
+endCallback(w, client_data, call_data)
+Widget w;
+XtPointer client_data;
+XtPointer call_data;
+{
+    IMIC *icp = (IMIC *)client_data;
+
+    TRACE(("imlib:endCallback()\n"));
+
+    if (icp->state & IC_CONVERTING) {
+	detachConverter(icp);
+	icp->state &= ~IC_CONVERTING;
+    }
+}
+
+/*- unusedEventCallback: unused key event callback -*/
+/* ARGSUSED */
+static void
+unusedEventCallback(w, client_data, call_data)
+Widget w;
+XtPointer client_data;
+XtPointer call_data;
+{
+    IMIC *icp = (IMIC *)client_data;
+    IMConnection *conn = icp->im->connection;
+    XKeyEvent *ev = (XKeyEvent *)call_data;
+    int offset;
+
+    TRACE(("imlib:unusedEventCallback()\n"));
+
+    if (icp->im->mask & XIM_EXT_FORWARD_KEYEVENT_MASK) {
+	offset = IMPutHeader(conn, XIM_EXT_FORWARD_KEYEVENT, 0, 0);
+	IMPutC16(conn, icp->im->id);
+	IMPutC16(conn, icp->id);
+	IMPutC16(conn, 0);
+	IMPutC16(conn, (unsigned int)(ev->serial & 0xffff));
+	IMPutC8(conn, ev->type);
+	IMPutC8(conn, (int)ev->keycode);
+	IMPutC16(conn, (unsigned int)ev->state);
+	IMPutC32(conn, ev->time);
+	IMPutC32(conn, ev->window);
+	IMFinishRequest(conn, offset);
+    } else {
+	offset = IMPutHeader(conn, XIM_FORWARD_EVENT, 0, 0);
+	IMPutC16(conn, icp->im->id);
+	IMPutC16(conn, icp->id);
+	IMPutC16(conn, 0);	/* ?? */
+	IMPutC16(conn, (unsigned int)((ev->serial >> 16) & 0xffff));
+
+	IMPutC8(conn, ev->type);
+	IMPutC8(conn, (int)ev->keycode);
+	IMPutC16(conn, (unsigned int)(ev->serial & 0xffff));
+	IMPutC32(conn, ev->time);
+	IMPutC32(conn, ev->root);
+	IMPutC32(conn, ev->window);
+	IMPutC32(conn, ev->subwindow);
+	IMPutI16(conn, ev->x_root);
+	IMPutI16(conn, ev->y_root);
+	IMPutI16(conn, ev->x);
+	IMPutI16(conn, ev->y);
+	IMPutC16(conn, ev->state);
+	IMPutC8(conn, ev->same_screen);
+
+	IMFinishRequest(conn, offset);
+    }
+}
+
+/*- preeditStartCallback: preedit start -*/
+/* ARGSUSED */
+static void
+preeditStartCallback(w, client_data, call_data)
+Widget w;
+XtPointer client_data;
+XtPointer call_data;
+{
+    IMIC *icp = (IMIC *)client_data;
+
+    TRACE(("preeditStartCallback(icp=0x%lx)\n", icp));
+
+    if (!(icp->common_attr.input_style & XIMPreeditCallbacks))
+	return;
+
+    preeditStart(icp);
+}
+
+/*- preeditDoneCallback: preedit done -*/
+/* ARGSUSED */
+static void
+preeditDoneCallback(w, client_data, call_data)
+Widget w;
+XtPointer client_data;
+XtPointer call_data;
+{
+    IMIC *icp = (IMIC *)client_data;
+
+    TRACE(("preeditDoneCallback(icp=0x%lx)\n", icp));
+
+    if (!(icp->common_attr.input_style & XIMPreeditCallbacks))
+	return;
+
+    preeditDone(icp);
+}
+
+/*- preeditDrawCallback: preedit draw -*/
+/* ARGSUSED */
+static void
+preeditDrawCallback(w, client_data, call_data)
+Widget w;
+XtPointer client_data;
+XtPointer call_data;
+{
+    IMIC *icp = (IMIC *)client_data;
+    OCCPreeditDrawArg *arg = (OCCPreeditDrawArg *)call_data;
+    IMConnection *conn = icp->im->connection;
+    Widget proto = conn->proto_widget;
+    Atom ctext = IMCtextAtom(proto);
+
+    TRACE(("preeditDrawCallback(icp=0x%lx, length=%d)\n",icp,arg->text_length));
+
+    if (!(icp->common_attr.input_style & XIMPreeditCallbacks))
+	return;
+
+    /* check encoding and format */
+    if (arg->encoding != ctext || arg->format != 8) {
+	/*
+	 * since every conversion object must support COMPOUND_TEXT,
+	 * it is a serious error.
+	 */
+	String params[2];
+	Cardinal num_params;
+	WidgetClass ioc = icp->im->converter->input_object_class;
+
+	params[0] = XtClass(proto)->core_class.class_name;
+	params[1] = ioc->core_class.class_name;
+	num_params = 2;
+
+	XtAppErrorMsg(XtWidgetToApplicationContext(proto),
+		      "encodingError", "preeditString", "WidgetError",
+		      "%s: encoding of the preedit string is not COMPOUND_STRING. check inputObject %s",
+		      params, &num_params);
+    }
+
+    preeditDraw(icp, arg);
+}
+
+/*- preeditCaretCallback: preedit caret -*/
+/* ARGSUSED */
+static void
+preeditCaretCallback(w, client_data, call_data)
+Widget w;
+XtPointer client_data;
+XtPointer call_data;
+{
+    IMIC *icp = (IMIC *)client_data;
+    int caret = (int)call_data;
+
+    TRACE(("preeditCaretCallback(icp=0x%lx, caret=%d)\n", icp, caret));
+
+    if (!(icp->common_attr.input_style & XIMPreeditCallbacks))
+	return;
+
+    preeditCaret(icp, caret);
+}
+
+/*- statusStartCallback: status start -*/
+/* ARGSUSED */
+static void
+statusStartCallback(w, client_data, call_data)
+Widget w;
+XtPointer client_data;
+XtPointer call_data;
+{
+    IMIC *icp = (IMIC *)client_data;
+
+    TRACE(("statusStartCallback(icp=0x%lx)\n", icp));
+
+    if (!(icp->common_attr.input_style & XIMStatusCallbacks))
+	return;
+
+    statusStart(icp);
+}
+
+/*- statusDoneCallback: status done -*/
+/* ARGSUSED */
+static void
+statusDoneCallback(w, client_data, call_data)
+Widget w;
+XtPointer client_data;
+XtPointer call_data;
+{
+    IMIC *icp = (IMIC *)client_data;
+
+    TRACE(("statusDoneCallback(icp=0x%lx)\n", icp));
+
+    if (!(icp->common_attr.input_style & XIMStatusCallbacks))
+	return;
+
+    statusDone(icp);
+}
+
+/*- statusDrawCallback: status draw -*/
+/* ARGSUSED */
+static void
+statusDrawCallback(w, client_data, call_data)
+Widget w;
+XtPointer client_data;
+XtPointer call_data;
+{
+    IMIC *icp = (IMIC *)client_data;
+    OCCPreeditDrawArg *arg = (OCCPreeditDrawArg *)call_data;
+    IMConnection *conn = icp->im->connection;
+    Widget proto = conn->proto_widget;
+    Atom ctext = IMCtextAtom(proto);
+
+    TRACE(("statusDrawCallback(icp=0x%lx, length=%d)\n", icp,arg->text_length));
+
+    if (!(icp->common_attr.input_style & XIMStatusCallbacks))
+	return;
+
+    /* check encoding and format */
+    if (arg->encoding != ctext || arg->format != 8) {
+	/*
+	 * since every conversion object must support COMPOUND_TEXT,
+	 * it is a serious error.
+	 */
+	String params[2];
+	Cardinal num_params;
+	WidgetClass ioc = icp->im->converter->input_object_class;
+
+	params[0] = XtClass(proto)->core_class.class_name;
+	params[1] = ioc->core_class.class_name;
+	num_params = 2;
+
+	XtAppErrorMsg(XtWidgetToApplicationContext(proto),
+		      "encodingError", "statusString", "WidgetError",
+		      "%s: encoding of the status string is not COMPOUND_STRING. check inputObject %s",
+		      params, &num_params);
+    }
+
+    statusDraw(icp, arg);
+}
+
+/*- preeditStart: do preedit start -*/
+static void
+preeditStart(icp)
+IMIC *icp;
+{
+    if (!(icp->state & IC_IN_PREEDIT)) {
+	int offset;
+	IMConnection *conn = icp->im->connection;
+
+	TRACE(("imlib:preeditStart()\n"));
+
+	offset = IMPutHeader(conn, XIM_PREEDIT_START, 0, 0);
+	IMPutC16(conn, icp->im->id);
+	IMPutC16(conn, icp->id);
+	IMFinishRequest(conn, offset);
+	icp->state |= IC_IN_PREEDIT;
+    }
+}
+
+/*- preeditDone: do preedit done -*/
+static void
+preeditDone(icp)
+IMIC *icp;
+{
+    if (icp->state & IC_IN_PREEDIT) {
+	int offset;
+	IMConnection *conn = icp->im->connection;
+
+	TRACE(("imlib:preeditDone()\n"));
+
+	offset = IMPutHeader(conn, XIM_PREEDIT_DONE, 0, 0);
+	IMPutC16(conn, icp->im->id);
+	IMPutC16(conn, icp->id);
+	IMFinishRequest(conn, offset);
+	icp->state &= ~IC_IN_PREEDIT;
+    }
+}
+
+/*- preeditDraw: do actual preedit draw -*/
+static void
+preeditDraw(icp, data)
+IMIC *icp;
+OCCPreeditDrawArg *data;
+{
+    IMConnection *conn = icp->im->connection;
+    int offset;
+    unsigned int status;
+    XIMFeedback feedback;
+    int i;
+
+    if (icp->state & IC_RESETTING) return;
+
+    preeditStart(icp);
+
+    TRACE(("imlib:preeditDraw()\n"));
+
+    if (DDEBUG_CONDITION(5)) {
+	unsigned char *p = (unsigned char *)data->text;
+
+	/*
+	 * Dump preedit string.
+	 */
+	printf("* preedit string:\n\t");
+	for (i = 0; i < data->text_length; i++, p++) {
+	    if (*p == '\033') {
+		printf("ESC ");
+	    } else if (*p < ' ') {
+		printf("^%c ", *p + '@');
+	    } else if (*p == ' ') {
+		printf("sp ");
+	    } else if (*p >= 0x7f) {
+		printf("%x ", *p);
+	    } else {
+		printf("%c ", *p);
+	    }
+	}
+	printf("\n");
+    }
+
+    offset = IMPutHeader(conn, XIM_PREEDIT_DRAW, 0, 0);
+    IMPutC16(conn, icp->im->id);
+    IMPutC16(conn, icp->id);
+    IMPutC32(conn, data->caret);
+    IMPutC32(conn, data->chg_first);
+    IMPutC32(conn, data->chg_length);
+    status = 0;
+    if (data->text_length == 0)  status |= 0x1; /* no string */
+    if (data->attrs_length == 0) status |= 0x2; /* no feedback */
+    IMPutC32(conn, status);
+    IMPutC16(conn, (unsigned int)data->text_length);
+    if (data->text_length > 0) {
+	IMPutString(conn, data->text, data->text_length);
+    }
+    IMPutPad(conn);
+    IMPutC16(conn, (unsigned int)(data->attrs_length * 4));
+    IMPutC16(conn, 0L); /* unused */
+    if (data->attrs_length > 0) {
+	for (i = 0; i < data->attrs_length; i++) {
+	    IMPutC32(conn, data->attrs[i]);
+	}
+    }
+    IMFinishRequest(conn, offset);
+}
+
+/*- preeditCaret: do actual preedit caret -*/
+static void
+preeditCaret(icp, caret)
+IMIC *icp;
+int caret;
+{
+    IMConnection *conn = icp->im->connection;
+    int offset;
+
+    if (icp->state & IC_RESETTING) return;
+
+    preeditStart(icp);
+
+    TRACE(("imlib:preeditCaret()\n"));
+
+    offset = IMPutHeader(conn, XIM_PREEDIT_CARET, 0, 0);
+    IMPutC16(conn, icp->im->id);
+    IMPutC16(conn, icp->id);
+    IMPutC32(conn, caret);
+    IMPutC32(conn, (long)XIMAbsolutePosition);
+    IMPutC32(conn, (long)XIMPrimary);
+    IMFinishRequest(conn, offset);
+}
+
+/*- statusStart: do status start -*/
+static void
+statusStart(icp)
+IMIC *icp;
+{
+    if (!(icp->state & IC_IN_STATUS)) {
+	int offset;
+	IMConnection *conn = icp->im->connection;
+
+	TRACE(("imlib:statusStart()\n"));
+
+	offset = IMPutHeader(conn, XIM_STATUS_START, 0, 0);
+	IMPutC16(conn, icp->im->id);
+	IMPutC16(conn, icp->id);
+	IMFinishRequest(conn, offset);
+	icp->state |= IC_IN_STATUS;
+#ifdef STATUS_SYNC
+        IMFlush(conn);
+#endif /* STATUS_SYNC */
+    }
+}
+
+/*- statusDone: do status done -*/
+static void
+statusDone(icp)
+IMIC *icp;
+{
+    if (icp->state & IC_IN_STATUS) {
+	int offset;
+	IMConnection *conn = icp->im->connection;
+
+	TRACE(("imlib:statusDone()\n"));
+
+	offset = IMPutHeader(conn, XIM_STATUS_DONE, 0, 0);
+	IMPutC16(conn, icp->im->id);
+	IMPutC16(conn, icp->id);
+	IMFinishRequest(conn, offset);
+	icp->state &= ~IC_IN_STATUS;
+#ifdef STATUS_SYNC
+        IMFlush(conn);
+#endif /* STATUS_SYNC */
+    }
+}
+
+/*- statusDraw: do actual status draw -*/
+static void
+statusDraw(icp, data)
+IMIC *icp;
+OCCPreeditDrawArg *data;
+{
+    IMConnection *conn = icp->im->connection;
+    int offset;
+    unsigned int status;
+
+    if (icp->state & IC_RESETTING) return;
+
+    statusStart(icp);
+
+    TRACE(("imlib:statusDraw()\n"));
+
+    offset = IMPutHeader(conn, XIM_STATUS_DRAW, 0, 0);
+    IMPutC16(conn, icp->im->id);
+    IMPutC16(conn, icp->id);
+    IMPutC32(conn, 0L); /* text type */
+    status = 0;
+    if (data->text_length == 0)  status |= 0x1; /* no string */
+    if (data->attrs_length == 0) status |= 0x2; /* no feedback */
+    IMPutC32(conn, status);
+    IMPutC16(conn, (unsigned int)data->text_length);
+    if (data->text_length > 0) {
+	IMPutString(conn, data->text, data->text_length);
+    }
+    IMPutPad(conn);
+    IMPutC16(conn, (unsigned int)(data->attrs_length * 32));
+    IMPutC16(conn, 0L); /* unused */
+    if (data->attrs_length > 0) {
+	int i;
+	for (i = 0; i < data->attrs_length; i++) {
+	    IMPutC32(conn, 0L);
+	}
+    }
+    IMFinishRequest(conn, offset);
+#ifdef STATUS_SYNC
+    IMFlush(conn);
+#endif /* STATUS_SYNC */
+}
+
+/*- setEventMask: put XIM_SET_EVENT_MASK request on the output stream -*/
+static void
+setEventMask(icp, forward_mask, synchronous_mask)
+IMIC *icp;
+unsigned long forward_mask;
+unsigned long synchronous_mask;
+{
+    IMConnection *conn = icp->im->connection;
+
+    (void)IMPutHeader(conn, XIM_SET_EVENT_MASK, 0, 12);
+    IMPutC16(conn, icp->im->id);
+    IMPutC16(conn, icp->id);
+    IMPutC32(conn, forward_mask);
+    IMPutC32(conn, synchronous_mask);
+    IMSchedule(conn, SCHED_WRITE);
+}
+
+
+/*
+ * Public functions
+ */
+
+int
+IMStartConversion(icp)
+IMIC *icp;
+{
+    IMIM *imp = icp->im;
+    Widget proto = imp->connection->proto_widget;
+    Widget converter;
+    WidgetClass class;
+    unsigned long attrmask;
+    ConversionAttributes attrs;
+
+    TRACE(("IMStartConversion()\n"));
+
+    if (icp->state & IC_CONVERTING) return 0;
+
+    /*
+     * Check required attributes i.e. client window.
+     */
+    if (!(icp->common_attr.set_mask & ATTR_MASK_CLIENT)) {
+	IMSendError(icp->im->connection, IMBadSomething, icp->im->id, icp->id,
+		    "client window required");
+	return -1;
+    }
+
+    /*
+     * Fill in default values for unspecified attributes.
+     */
+    fillDefaultAttributesForStartup(icp);
+
+    /*
+     * Get appropriate converter class.
+     */
+    if (icp->style == IMSTYLE_OVER_THE_SPOT) {
+	class = overTheSpotConversionWidgetClass;
+    } else if (icp->style == IMSTYLE_OFF_THE_SPOT) {
+	class = offTheSpotConversionWidgetClass;
+    } else if (icp->style == IMSTYLE_ON_THE_SPOT) {
+	class = onTheSpotConversionWidgetClass;
+    } else {
+	class = separateConversionWidgetClass;
+    }
+
+    /*
+     * Compute conversion attributes to be passed to the converter.
+     */
+    attrmask = makeConvAttributesForStartup(icp, &attrs);
+
+    icp->state &= ~IC_RESETTING;
+
+    /*
+     * Attach converter to this IC.
+     */
+    converter = CMGetConverter(XtParent(proto),
+			       icp->common_attr.client, class,
+			       imp->converter->input_object_class,
+			       imp->converter->display_object_class);
+    if (converter == NULL) {
+	IMSendError(imp->connection, IMBadSomething, imp->id, icp->id,
+		    "can't attach converter to this IC");
+	return -1;
+    }
+    icp->conversion = converter;
+
+    /*
+     * Add callback functions.
+     */
+    XtAddCallback(converter, XtNtextCallback, fixCallback, (XtPointer)icp);
+    XtAddCallback(converter, XtNendCallback, endCallback, (XtPointer)icp);
+    XtAddCallback(converter, XtNunusedEventCallback, unusedEventCallback, (XtPointer)icp);
+    if (icp->style == IMSTYLE_ON_THE_SPOT) {
+	XtAddCallback(converter, XtNpreeditStartCallback, preeditStartCallback,
+		      (XtPointer)icp);
+	XtAddCallback(converter, XtNpreeditDoneCallback, preeditDoneCallback,
+		      (XtPointer)icp);
+	XtAddCallback(converter, XtNpreeditDrawCallback, preeditDrawCallback,
+		      (XtPointer)icp);
+	XtAddCallback(converter, XtNpreeditCaretCallback, preeditCaretCallback,
+		      (XtPointer)icp);
+	XtAddCallback(converter, XtNstatusStartCallback, statusStartCallback,
+		      (XtPointer)icp);
+	XtAddCallback(converter, XtNstatusDoneCallback, statusDoneCallback,
+		      (XtPointer)icp);
+	XtAddCallback(converter, XtNstatusDrawCallback, statusDrawCallback,
+		      (XtPointer)icp);
+    }
+
+    /*
+     * Start conversion
+     */
+    /* !!! if front-end method is used, ESMethodSelectFocus should be used */
+    XtVaSetValues(converter, XtNeventSelectMethod, ESMethodNone, NULL);
+    CControlStartConversion(converter, icp->common_attr.client,
+			    attrmask, &attrs);
+
+    icp->state |= IC_CONVERTING;
+
+    if (icp->common_attr.input_style & XIMPreeditCallbacks)
+	preeditStart(icp);
+
+    /*
+     * Send XIM_SET_EVENT_MASK to let the client forward the key events.
+     */
+    IMStartForwarding(icp);
+
+    return 0;
+}
+
+void
+IMStopConversion(icp)
+IMIC *icp;
+{
+    TRACE(("IMStopConversion()\n"));
+
+    if (!(icp->state & IC_CONVERTING)) return;
+
+    /*
+     * Terminate conversion.
+     */
+    CControlEndConversion(icp->conversion);
+
+    if (icp->common_attr.input_style & XIMPreeditCallbacks)
+	preeditDone(icp);
+    IMStatusDone(icp);
+
+    /*
+     * Detach converter.
+     */
+    detachConverter(icp);
+
+    /*
+     * Stop forwarding key events unless this IC is being destroyed.
+     */
+    if (!(icp->state & IC_DESTROYING)) {
+	IMStopForwarding(icp);
+    }
+
+    icp->state &= ~IC_CONVERTING;
+}
+
+int
+IMResetIC(icp, preedit_strp)
+IMIC *icp;
+char **preedit_strp;
+{
+    int num_bytes = 0;
+
+    TRACE(("IMResetIC()\n"));
+
+    *preedit_strp = NULL;
+
+    if (icp->state & IC_CONVERTING) {
+	/*
+	 * get input object by asking conversion widget of XtNinputObject
+	 * resource. however, it is not recommended since protocol widget
+	 * should interact with input object only through conversion
+	 * widget.
+	 */
+	CCTextCallbackArg arg;
+	Widget input_obj;
+	Widget w = icp->im->connection->proto_widget;
+
+	XtVaGetValues(icp->conversion, XtNinputObject, &input_obj, NULL);
+	arg.encoding = IMCtextAtom(w);
+#ifdef notdef
+	if (ICGetConvertedString(input_obj, &arg.encoding, &arg.format,
+				 &arg.length, &arg.text) >= 0) {
+	    num_bytes = arg.length;
+	    *preedit_strp = (char *)arg.text;
+	}
+#else
+	/*
+	 * Canna seems to have some problem with ICGetConvertedString().
+	 * Use ICGetPreeditString instead.
+	 */
+	if (ICGetPreeditString(input_obj, 0, 0, &arg.encoding, &arg.format,
+			       &arg.length, &arg.text) >= 0) {
+	    num_bytes = arg.length;
+	    *preedit_strp = (char *)arg.text;
+	}
+#endif
+	ICClearConversion(input_obj);
+	TRACE(("\twas converting. %d bytes left\n", num_bytes));
+
+	if (icp->common_attr.reset_state == XIMInitialState) {
+	    /* Force to end the conversion. */
+	    TRACE(("\tback to the initial state\n"));
+	    IMStopConversion(icp);
+	}
+    }
+    return num_bytes;
+}
+
+void
+IMForwardEvent(icp, ev)
+IMIC *icp;
+XEvent *ev;
+{
+    TRACE(("IMForwardEvent()\n"));
+
+    if (icp->conversion == NULL) return;
+    XtCallActionProc(icp->conversion, "to-inputobj", ev,
+		     (String *)NULL, (Cardinal)0);
+}
+
+/* ARGSUSED */
+void
+IMSetFocus(icp)
+IMIC *icp;
+{
+    TRACE(("IMSetFocus(ic%d)\n", icp->id));
+    if (icp->conversion != NULL) {
+	CControlChangeFocus(icp->conversion, 1);
+    }
+}
+
+/* ARGSUSED */
+void
+IMUnsetFocus(icp)
+IMIC *icp;
+{
+    TRACE(("IMUnsetFocus(ic%d)\n", icp->id));
+    if (icp->conversion != NULL) {
+	CControlChangeFocus(icp->conversion, 0);
+    }
+}
+
+/* ARGSUSED */
+void
+IMStatusStart(icp)
+IMIC *icp;
+{
+    TRACE(("IMStatusStart(ic%d)\n", icp->id));
+    if (!(icp->common_attr.input_style & XIMStatusCallbacks))
+	return;
+    statusStart(icp);
+}
+
+/* ARGSUSED */
+void
+IMStatusDone(icp)
+IMIC *icp;
+{
+    TRACE(("IMStatusDone(ic%d)\n", icp->id));
+    if (!(icp->common_attr.input_style & XIMStatusCallbacks))
+	return;
+    statusDone(icp);
+}
+
+void
+IMStartForwarding(icp)
+IMIC *icp;
+{
+    /*
+     * Make the client forward key events to us.
+     */
+    TRACE(("IMStartForwarding(ic%d)\n", icp->id));
+
+#define FORWARD_MASK (KeyPressMask|KeyReleaseMask)
+
+#ifdef notdef
+    if (synchronous) {
+	setEventMask(icp, FORWARD_MASK, FORWARD_MASK);
+    } else {
+	setEventMask(icp, FORWARD_MASK, NoEventMask);
+    }
+#else
+    /* using full-synchronous method */
+    setEventMask(icp, FORWARD_MASK, FORWARD_MASK);
+#endif
+
+#undef FORWARD_MASK
+}
+
+void
+IMStopForwarding(icp)
+IMIC *icp;
+{
+    /*
+     * Make the client stop sending key events.
+     */
+    TRACE(("IMStopForwarding(ic%d)\n", icp->id));
+    setEventMask(icp, NoEventMask, NoEventMask);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/imlib/imdata.c	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,348 @@
+#ifndef lint
+static char *rcsid = "$Id: imdata.c,v 1.7 1994/06/02 02:20:23 ishisone Exp $";
+#endif
+/*
+ * Copyright (c) 1994  Software Research Associates, Inc.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted, provided
+ * that the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Software Research Associates not be
+ * used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission.  Software Research
+ * Associates makes no representations about the suitability of this software
+ * for any purpose.  It is provided "as is" without express or implied
+ * warranty.
+ *
+ * Author:  Makoto Ishisone, Software Research Associates, Inc., Japan
+ */
+
+#include "im.h"
+
+#define B_GET16(p)	(((p)[0]<<8) + (p)[1])
+#define B_GET32(p)	(((p)[0]<<24) + ((p)[1]<<16) + ((p)[2]<<8) + (p)[3])
+#define L_GET16(p)	((p)[0] + ((p)[1]<<8))
+#define L_GET32(p)	((p)[0] + ((p)[1]<<8) + ((p)[2]<<16) + ((p)[3] << 24))
+
+#define B_PUT16(x, p)	(p)[0] = ((x)>>8) & 0xff; (p)[1] = (x) & 0xff
+#define B_PUT32(x, p)	(p)[0] = ((x)>>24) & 0xff; (p)[1] = ((x)>>16) & 0xff; \
+			(p)[2] = ((x)>>8) & 0xff; (p)[3] = (x) & 0xff
+#define L_PUT16(x, p)	(p)[0] = (x) & 0xff; (p)[1] = ((x)>>8) & 0xff
+#define L_PUT32(x, p)	(p)[0] = (x) & 0xff; (p)[1] = ((x)>>8) & 0xff; \
+			(p)[2] = ((x)>>16) & 0xff; (p)[3] = ((x)>>24) & 0xff;
+
+int
+IMGetC8(conn, offset)
+IMConnection *conn;
+int offset;
+{
+    IMBuffer *ibp = IM_INBUF(conn);
+    int x;
+
+    x = *((unsigned char *)IMBUFDATA(ibp) + offset);
+    return x;
+}
+
+unsigned int
+IMGetC16(conn, offset)
+IMConnection *conn;
+int offset;
+{
+    IMBuffer *ibp = IM_INBUF(conn);
+    unsigned char *p = (unsigned char *)IMBUFDATA(ibp) + offset;
+    unsigned int x;
+
+    if (conn->byte_order == ORDER_BIG) {
+	x = B_GET16(p);
+    } else {
+	x = L_GET16(p);
+    }
+
+    return x;
+}
+
+int
+IMGetI16(conn, offset)
+IMConnection *conn;
+int offset;
+{
+    long x;
+
+    x = (long)IMGetC16(conn, offset);
+    return (x < 32768) ? (int)x : (int)(x - 65536L);
+}
+
+unsigned long
+IMGetC32(conn, offset)
+IMConnection *conn;
+int offset;
+{
+    IMBuffer *ibp = IM_INBUF(conn);
+    unsigned char *p = (unsigned char *)IMBUFDATA(ibp) + offset;
+    unsigned long x;
+
+    if (conn->byte_order == ORDER_BIG) {
+	x = B_GET32(p);
+    } else {
+	x = L_GET32(p);
+    }
+
+    return x;
+}
+
+void
+IMGetString(conn, offset, buf, len)
+IMConnection *conn;
+int offset;
+char *buf;
+int len;
+{
+    IMBuffer *ibp = IM_INBUF(conn);
+    char *p = IMBUFDATA(ibp) + offset;
+
+    bcopy(p, buf, len);
+    buf[len] = '\0';
+}
+
+void
+IMPutC8(conn, x)
+IMConnection *conn;
+int x;
+{
+    IMBuffer *ibp = IM_OUTBUF(conn);
+    unsigned char c = (unsigned char)x;
+
+    IMBufAdd(ibp, (char *)&c, 1);
+}
+
+void
+IMPutC16(conn, x)
+IMConnection *conn;
+unsigned int x;
+{
+    IMBuffer *ibp = IM_OUTBUF(conn);
+    unsigned char *p = (unsigned char *)IMBufAlloc(ibp, 2);
+
+    if (conn->byte_order == ORDER_BIG) {
+	B_PUT16(x, p);
+    } else {
+	L_PUT16(x, p);
+    }
+}
+
+void
+IMPutC32(conn, x)
+IMConnection *conn;
+unsigned long x;
+{
+    IMBuffer *ibp = IM_OUTBUF(conn);
+    unsigned char *p = (unsigned char *)IMBufAlloc(ibp, 4);
+
+    if (conn->byte_order == ORDER_BIG) {
+	B_PUT32(x, p);
+    } else {
+	L_PUT32(x, p);
+    }
+}
+
+void
+IMPutI16(conn, x)
+IMConnection *conn;
+int x;
+{
+    IMBuffer *ibp = IM_OUTBUF(conn);
+    unsigned char *p = (unsigned char *)IMBufAlloc(ibp, 2);
+
+    if (conn->byte_order == ORDER_BIG) {
+	B_PUT16(x, p);
+    } else {
+	L_PUT16(x, p);
+    }
+}
+
+void
+IMPutString(conn, s, len)
+IMConnection *conn;
+char *s;
+int len;
+{
+    if (len < 0) len = strlen(s);
+    IMBufAdd(&conn->out_buf, s, len);
+}
+
+void
+IMPutPad(conn)
+IMConnection *conn;
+{
+    int remainder;
+    int npad;
+    static char padding[] = { 0, 0, 0, 0 };
+
+    if ((remainder = IMBUFLEN(&conn->out_buf) % 4) != 0) {
+	npad = 4 - remainder;
+	IMBufAdd(IM_OUTBUF(conn), padding, npad);
+    }
+}
+
+void
+IMRewriteC16(conn, pos, x)
+IMConnection *conn;
+int pos;
+unsigned int x;
+{
+    IMBuffer *ibp = IM_OUTBUF(conn);
+    unsigned char p[2];
+
+    if (conn->byte_order == ORDER_BIG) {
+	B_PUT16(x, p);
+    } else {
+	L_PUT16(x, p);
+    }
+    IMBufOverwrite(ibp, pos, (char *)p, 2);
+}
+
+int
+IMWritePos(conn)
+IMConnection *conn;
+{
+    IMBuffer *ibp = IM_OUTBUF(conn);
+
+    return IMBUFLEN(ibp);
+}
+
+int
+IMPutHeader(conn, major, minor, arglen)
+IMConnection *conn;
+int major;
+int minor;
+int arglen;
+{
+    int offset;
+
+    offset = IMBUFLEN(&conn->out_buf);
+    arglen = (arglen + 3) / 4;
+#ifdef XIM_BC
+    if (conn->has_length_bug) arglen *= 4;
+#endif
+    IMPutC8(conn, major);
+    IMPutC8(conn, minor);
+    IMPutC16(conn, (unsigned int)arglen);
+    return offset;
+}
+
+void
+IMFinishRequest(conn, offset)
+IMConnection *conn;
+int offset;
+{
+    IMBuffer *ibp = IM_OUTBUF(conn);
+    unsigned int arglen;
+
+    /*
+     * Append padding bytes, if needed.
+     */
+    IMPutPad(conn);
+
+    /*
+     * Offset points the beginning of the request.
+     * Following is a Request header which is 4-byte long.
+     */
+    arglen = (unsigned int)((IMBUFLEN(ibp) - offset - 4) / 4);
+#ifdef XIM_BC
+    if (conn->has_length_bug) arglen *= 4;
+#endif
+
+    /*
+     * rewrite the length field of the request header.
+     */
+    IMRewriteC16(conn, offset + 2, arglen);
+
+    IMSchedule(conn, SCHED_WRITE);
+}
+
+void
+IMCancelRequest(conn, offset)
+IMConnection *conn;
+int offset;
+{
+    IMBuffer *ibp = IM_OUTBUF(conn);
+
+    IMBufDiscard(ibp, offset - IMBUFLEN(ibp));
+}
+
+void
+IMSendSimpleRequest(conn, major, minor)
+IMConnection *conn;
+int major;
+int minor;
+{
+    IMPutC8(conn, major);
+    IMPutC8(conn, minor);
+    /*
+     * This function (IMSendSimpleRequest) might be called when
+     * client's byte order is yet unknown, so usually it is unwise to
+     * call IMPutC16().  But in this particular case where the value
+     * to be put is zero, it is perfectly ok.
+     */
+    IMPutC16(conn, 0);
+    IMSchedule(conn, SCHED_WRITE);
+}
+
+void
+IMSendRequestWithIC(conn, major, minor, icp)
+IMConnection *conn;
+int major;
+int minor;
+IMIC *icp;
+{
+    (void)IMPutHeader(conn, major, minor, 4);
+    IMPutC16(conn, icp->im->id);
+    IMPutC16(conn, icp->id);
+    IMSchedule(conn, SCHED_WRITE);
+}
+
+void
+IMSendError(conn, code, imid, icid, msg)
+IMConnection *conn;
+int code;
+unsigned int imid;
+unsigned int icid;
+char *msg;
+{
+    int offset;
+    int msg_len;
+    unsigned int valid_flag = 0;
+
+    msg_len = strlen(msg);
+
+    if (imid != 0) valid_flag |= 1;
+    if (icid != 0) valid_flag |= 2;
+
+    offset = IMPutHeader(conn, XIM_ERROR, 0, 0);
+    IMPutC16(conn, imid);
+    IMPutC16(conn, icid);
+    IMPutC16(conn, valid_flag);
+    IMPutC16(conn, (unsigned int)code);
+    IMPutC16(conn, (unsigned int)msg_len);
+    IMPutC16(conn, 0);
+    IMPutString(conn, msg, msg_len);
+    IMFinishRequest(conn, offset);
+}
+
+void
+IMSendBadProtocol(conn, msg)
+IMConnection *conn;
+char *msg;
+{
+    IMSendError(conn, IMBadProtocol, 0, 0, msg);
+}
+
+void
+IMSendBadLength(conn, imid, icid)
+IMConnection *conn;
+unsigned int imid;
+unsigned int icid;
+{
+    IMSendError(conn, IMBadSomething, imid, icid, "Bad request length");
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/imlib/imdispatch.c	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,484 @@
+#ifndef lint
+static char *rcsid = "$Id: imdispatch.c,v 1.9 1994/06/02 10:36:07 ishisone Exp $";
+#endif
+/*
+ * Copyright (c) 1994  Software Research Associates, Inc.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted, provided
+ * that the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Software Research Associates not be
+ * used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission.  Software Research
+ * Associates makes no representations about the suitability of this software
+ * for any purpose.  It is provided "as is" without express or implied
+ * warranty.
+ *
+ * Author:  Makoto Ishisone, Software Research Associates, Inc., Japan
+ */
+
+#include "im.h"
+#include "imreq.h"
+
+static int checkRequest _Pt_((IMConnection *conn,
+			      int *majorp, int *minorp, int *arglenp));
+static void ServerAuthPhase _Pt_((IMConnection *conn));
+static void CommunicationPhase _Pt_((IMConnection *conn));
+static int initialDispatcher _Pt_((IMConnection *conn));
+static int mainDispatcher _Pt_((IMConnection *conn));
+
+/*- checkRequest: read and examine request header -*/
+static int
+checkRequest(conn, majorp, minorp, arglenp)
+IMConnection *conn;
+int *majorp;
+int *minorp;
+int *arglenp;
+{
+    IMBuffer *ibp = IM_INBUF(conn);
+    int len;
+
+    /* check if there is enough data for the request header */
+    if (IMBUFLEN(ibp) < 4) return 0;
+
+#ifdef XIM_BC
+    if (conn->has_length_bug) {
+	len = (int)IMGetC16(conn, 2);
+    } else {
+	len = (int)IMGetC16(conn, 2) * 4;
+    }
+#else /* XIM_BC */
+    len = (int)IMGetC16(conn, 2) * 4;
+#endif /* XIM_BC */
+
+    TRACE(("checkRequest(): length=%d, buflen=%d\n", len, IMBUFLEN(ibp)));
+
+    if (IMBUFLEN(ibp) >= len + 4) {
+	/*
+	 * All the request data is in the buffer.
+	 * Retrieve the request header, and discard it.
+	 */
+	*majorp = IMGetC8(conn, 0);
+	*minorp = IMGetC8(conn, 1);
+	*arglenp = len;
+	IMBufDiscard(ibp, 4);
+	return 1;
+    } else {
+	return 0;
+    }
+}
+
+#ifdef XIM_BC
+/*- countConnectRequestLen: count length of XIM_CONNECT request -*/
+int
+countConnectRequestLen(conn)
+IMConnection *conn;
+{
+    IMBuffer *ibp = IM_INBUF(conn);
+    int data_length = IMBUFLEN(ibp);
+    int num_proto_names;
+    int offset;
+    int i;
+
+    /*
+     * Encoding of XIM_CONNECT request is:
+     *
+     *	4		request header
+     *	1  CARD8	byte order
+     *	1		unused
+     *  2  CARD16	major protocol version
+     *  2  CARD16	minor protocol version
+     *	2  CARD16	number of auth protocol names
+     *  N  LISTofSTRING	auth protocol names
+     *
+     * where STRING is:
+     *  2  CARD16	length (N)
+     *  N  LISTofChar	string
+     *  p		pad, p = Pad(2+N)
+     */
+
+    /* skip request header */
+    data_length -= 4;
+    offset = 4;
+
+    if (data_length < 8) return 0;	/* incomplete data */
+
+    /* get the number of auth protocol names */
+    num_proto_names = (int)IMGetC16(conn, offset + 6);
+
+    /* skip fixed part */
+    data_length -= 8;
+    offset += 8;
+
+    /* count variable (i.e. list of string) part */
+    for (i = 0; i < num_proto_names; i++) {
+	int str_len, pad_len;
+
+	if (data_length < 2) return 0;	/* incomplete data */
+	str_len = (int)IMGetC16(conn, offset);
+	pad_len = (4 - ((2 + str_len) % 4)) % 4;
+	data_length -= 2 + str_len + pad_len;
+	offset += 2 + str_len + pad_len;
+	if (data_length < 0) return 0;	/* incomplete data */
+    }
+
+    return offset - 4;		/* 4 for the header */
+}
+#endif /* XIM_BC */
+
+/*
+ * Phase shifters
+ */
+
+/*- ServerAuthPhase: move to server authentication phase -*/
+static void
+ServerAuthPhase(conn)
+IMConnection *conn;
+{
+    /* not yet implemented */
+    IMSendSimpleRequest(conn, XIM_AUTH_NG, 0);
+    IMSchedule(conn, SCHED_CLOSE);
+}
+
+/*- CommunicationPhase: move to comunication (i.e. main) phase -*/
+static void
+CommunicationPhase(conn)
+IMConnection *conn;
+{
+    IMPutHeader(conn, XIM_CONNECT_REPLY, 0, 4);
+    IMPutC16(conn, XIM_MAJOR_PROTOCOL_VERSION);
+    IMPutC16(conn, XIM_MINOR_PROTOCOL_VERSION);
+    IMSchedule(conn, SCHED_WRITE);
+
+    conn->dispatcher = mainDispatcher;
+}
+
+/*
+ * Request dispatchers
+ */
+
+/*- initialDispatcher: the initial dispatcher -*/
+static int
+initialDispatcher(conn)
+IMConnection *conn;
+{
+    IMBuffer *ibp = IM_INBUF(conn);
+    int major, minor, arglen;
+    int major_protocol, minor_protocol;
+    int num_auth;
+#ifdef XIM_BC
+    int counted_len;
+    int field_len;
+#endif /* XIM_BC */
+
+    TRACE(("imlib:initialDispatcher(#%d)\n", conn->serial));
+
+    /*
+     * The first request must be 'XIM_CONNECT'.
+     */
+    if (conn->byte_order == ORDER_UNKNOWN) {
+	char *p = IMBUFDATA(ibp);
+
+	/*
+	 * Check the byte-order first.
+	 * In order to do it, we need at least 5 bytes of data.
+	 */
+	if (IMBUFLEN(ibp) < 5) return 0;
+
+	/*
+	 * Check the byte-order byte (5th byte of the data).
+	 */
+	switch (p[4]) {
+	case 0x42:	/* 'B' -- big endian */
+	    conn->byte_order = ORDER_BIG;
+	    TRACE(("\tbyte order is big endian\n"));
+	    break;
+	case 0x6c:	/* 'l' -- little endian */
+	    conn->byte_order = ORDER_LITTLE;
+	    TRACE(("\tbyte order is little endian\n"));
+	    break;
+	default:	/* invalid request */
+	    /*
+	     * what can we do here?  since we don't know the byte order
+	     * of the client, we cannot send error reply. but we can
+	     * send XIM_AUTH_NG, because this request does not have
+	     * byte order dependency.
+	     */
+	    DDPRINT(2, ("invalid byte order field (%c)\n", p[4]));
+	    goto send_ng;
+	}
+    }
+
+#ifdef XIM_BC
+    /*
+     * Xlib implementation of early X11R6 has a bug in the
+     * length field of request header.  The field should
+     * represent the length of request data as the number
+     * of 4byte units, but the buggy Xlib puts number of
+     * bytes instead.
+     */
+
+    /* length of data by examining contents */
+    counted_len = countConnectRequestLen(conn);	/* in bytes */
+    if (counted_len == 0) return 0;		/* incomplete */
+    /* length of data by reading length field */
+    field_len = IMGetC16(conn, 2);		/* num of 4byte element */
+
+    /*
+     * If the request packet comforms to the specification,
+     *    field_len * 4 == counted_len
+     * but in case of buggy Xlib implementation,
+     *    field_len == counted_len
+     */
+    if (counted_len == field_len * 4) {
+	conn->has_length_bug = 0;
+    } else if (counted_len == field_len) {
+	/* buggy Xlib implementation */
+	DPRINT(("connection #%d has length field bug\n", conn->serial));
+	conn->has_length_bug = 1;
+    } else {
+	/* totally broken */
+	DPRINT(("connection #%d is broken\n", conn->serial));
+	goto send_ng;
+    }
+#endif
+
+    /*
+     * See if the entire data of the request is ready.
+     */
+    if (!checkRequest(conn, &major, &minor, &arglen)) return 0;
+
+    /*
+     * Check the arguments...
+     */
+    if (major != XIM_CONNECT || minor != 0 || arglen < 8) {
+	DPRINT(("invalid initial request (major=%d, minor=%d, arglen=%d\n",
+		major, minor, arglen));
+	goto send_ng;
+    }
+
+    major_protocol = (int)IMGetC16(conn, 2);
+    minor_protocol = (int)IMGetC16(conn, 4);
+    TRACE(("\tprototol version: major=%d, minor=%d\n",
+	   major_protocol, minor_protocol));
+    conn->major_protocol_version = major_protocol;
+    conn->minor_protocol_version = minor_protocol;
+
+    num_auth = (int)IMGetC16(conn, 6);
+    TRACE(("\tnumber of auth protocols: %d\n", num_auth));
+
+    if (major_protocol > XIM_MAJOR_PROTOCOL_VERSION ||
+	(major_protocol == XIM_MAJOR_PROTOCOL_VERSION &&
+	 minor_protocol > XIM_MINOR_PROTOCOL_VERSION)) {
+	DPRINT(("unsupported protocol (%d,%d)\n",
+		major_protocol, minor_protocol));
+	goto send_ng;
+    }
+
+    if (num_auth > 0) {
+	ServerAuthPhase(conn);
+#ifdef notdef
+    } else if (do_client_authentication) {
+	ClientAuthPhase(conn);
+#endif
+    } else {
+	CommunicationPhase(conn);
+    }
+
+    IMBufDiscard(ibp, arglen);
+
+    return 1;
+
+ send_ng:
+    DDPRINT(2, ("send XIM_AUTH_NG to #%d\n", conn->serial));
+    IMSendSimpleRequest(conn, XIM_AUTH_NG, 0);
+    IMSchedule(conn, SCHED_SHUTDOWN);
+    return 0;
+}
+
+/*- mainDispatcher: main dispatcher -*/
+static int
+mainDispatcher(conn)
+IMConnection *conn;
+{
+    IMBuffer *ibp = IM_INBUF(conn);
+    int major, minor, arglen;
+    IMRequest *req;
+
+    TRACE(("imlib:mainDispatcher(#%d)\n", conn->serial));
+
+    /*
+     * When X transport is used, NUL bytes might appear between
+     * requests.  So discard them first.
+     */
+    IMBufDiscardNUL(ibp);
+
+    /*
+     * Check if the entire request data is on the input buffer.
+     */
+    if (!checkRequest(conn, &major, &minor, &arglen)) return 0;
+
+    /*
+     * Check major opcode.
+     */
+    req = IMMainDispatchTable[major];
+    if (req == NULL) {
+	DDPRINT(2, ("bad major opcode(%d)\n", major));
+	IMSendBadProtocol(conn, "Invalid major opcode");
+	goto ret;
+    }
+
+    /*
+     * Then, check minor opcode.
+     */
+    while (req != NULL) {
+	if (req->minor == minor) break;
+	req = req->next;
+    }
+    if (req == NULL) {
+	DDPRINT(2, ("bad minor opcode(%d,%d)\n", major, minor));
+	IMSendBadProtocol(conn, "Invalid minor opcode");
+	goto ret;
+    }
+
+    /*
+     * Opcode is valid. Call the request processing routine.
+     */
+    DDPRINT(2, ("** processing %s request...\n", req->name));
+    (*req->proc)(conn, major, minor, arglen);
+
+ ret:
+    /*
+     * Discard the argument portion.
+     */
+    IMBufDiscard(ibp, arglen);
+
+    return 1;
+}
+
+/*
+ * Public functions
+ */
+
+void
+IMSetInitialDispatcher(conn)
+IMConnection *conn;
+{
+    TRACE(("IMSetInitialDispatcher(#%d)\n", conn->serial));
+    conn->dispatcher = initialDispatcher;
+}
+
+void
+IMDispatch(conn, cond)
+IMConnection *conn;
+int cond;
+{
+    TRACE(("IMDispatch(#%d)\n", conn->serial));
+
+    switch (cond) {
+    case TRANSPORT_OK:
+	/*
+	 * Call dispatcher while data is ready.
+	 */
+	while ((*conn->dispatcher)(conn))
+	    /* empty body */;
+
+	/*
+	 * Do compaction to the input buffer.
+	 */
+	IMBufCompact(IM_INBUF(conn));
+	break;
+
+    case TRANSPORT_ERROR:
+	DDPRINT(2, ("transport error\n"));
+	IMSchedule(conn, SCHED_SHUTDOWN);
+	break;
+
+    case TRANSPORT_EOF:
+	DDPRINT(2, ("transport EOF\n"));
+	IMSchedule(conn, SCHED_CLOSE);
+	break;
+    }
+
+    /*
+     * If there's something to be done (i.e. scheduled),
+     * do it.
+     */
+    if (!IMQueueEmpty(conn->proto_widget)) {
+	IMProcessQueue(conn->proto_widget);
+    }
+}
+
+void
+IMSchedule(conn, type)
+IMConnection *conn;
+int type;
+{
+    TRACE(("IMSchedule(#%d, %d)\n", conn->serial, type));
+
+    if (conn->schedule & type) return;	/* already scheduled */
+
+    if (conn->schedule == 0) {
+	TRACE(("insert into the queue\n"));
+	IMPushQueue(conn);
+    }
+    conn->schedule |= type;
+}
+
+void
+IMProcessQueue(w)
+Widget w;
+{
+    IMConnection *conn;
+    IMConnection *tmp = NULL;
+
+    TRACE(("IMProcessQueue()\n"));
+
+    while ((conn = IMPopQueue(w)) != NULL) {
+	int schedule;
+
+	schedule = conn->schedule;
+	conn->schedule = 0;
+
+	if (schedule & SCHED_SHUTDOWN) {
+	    /*
+	     * This connection is dead.  Don't need to
+	     * flush output before closing.
+	     */
+	    IMCloseConnection(conn);
+	} else {
+	    if (schedule & SCHED_WRITE) {
+		/*
+		 * Flush output buffer.
+		 */
+		int ret;
+
+		ret = IMFlush(conn);
+		switch (ret) {
+		case TRANSPORT_ERROR:
+		    IMCloseConnection(conn);
+		    continue;
+		case TRANSPORT_PARTIAL:
+		    /* to be queued again */
+		    conn->schedule = schedule;
+		    conn->queue_next = tmp;
+		    tmp = conn;
+		    continue;
+		}
+	    }
+	    if (schedule & SCHED_CLOSE) {
+		IMCloseConnection(conn);
+	    }
+	}
+    }
+
+    /* reschedule */
+    while (tmp != NULL) {
+	IMConnection *next = tmp->queue_next;
+
+	TRACE(("reschedule #%d\n", tmp->serial));
+	IMPushQueue(tmp);
+	tmp = next;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/imlib/imfuncs.h	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,157 @@
+/* $Id: imfuncs.h,v 1.11 2002/01/07 15:34:14 ishisone Exp $ */
+/*
+ * Copyright (c) 1994  Software Research Associates, Inc.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted, provided
+ * that the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Software Research Associates not be
+ * used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission.  Software Research
+ * Associates makes no representations about the suitability of this software
+ * for any purpose.  It is provided "as is" without express or implied
+ * warranty.
+ *
+ * Author:  Makoto Ishisone, Software Research Associates, Inc., Japan
+ */
+
+#ifndef _imfuncs_h
+#define _imfuncs_h
+
+#include "imprtype.h"
+
+/*
+ * Functions to get/put data (defined in imdata.c)
+ */
+extern int IMGetC8 _Pt_((IMConnection *conn, int offset));
+extern unsigned int IMGetC16 _Pt_((IMConnection *conn, int offset));
+extern int IMGetI16 _Pt_((IMConnection *conn, int offset));
+extern unsigned long IMGetC32 _Pt_((IMConnection *conn, int offset));
+extern void IMGetString _Pt_((IMConnection *conn,
+			       int offset, char *buf, int len));
+
+extern void IMPutC8 _Pt_((IMConnection *conn, int x));
+extern void IMPutC16 _Pt_((IMConnection *conn, unsigned int x));
+extern void IMPutC32 _Pt_((IMConnection *conn, unsigned long x));
+extern void IMPutI16 _Pt_((IMConnection *conn, int x));
+extern void IMPutString _Pt_((IMConnection *conn, char *s, int len));
+extern void IMPutPad _Pt_((IMConnection *conn));
+extern void IMRewriteC16 _Pt_((IMConnection *conn, int pos, unsigned int x));
+
+extern int IMWritePos _Pt_((IMConnection *conn));
+
+extern int IMPutHeader _Pt_((IMConnection *conn,
+			     int major, int minor, int arglen));
+extern void IMFinishRequest _Pt_((IMConnection *conn, int offset));
+extern void IMCancelRequest _Pt_((IMConnection *conn, int offset));
+extern void IMSendSimpleRequest _Pt_((IMConnection *conn,
+				      int major, int minor));
+extern void IMSendRequestWithIC _Pt_((IMConnection *conn,
+				      int major, int minor, IMIC *icp));
+
+extern void IMSendError _Pt_((IMConnection *conn, int code,
+			      unsigned int imid, unsigned int icid,
+			      char *msg));
+extern void IMSendBadProtocol _Pt_((IMConnection *conn, char *msg));
+extern void IMSendBadLength _Pt_((IMConnection *conn,
+				  unsigned int imid, unsigned int icid));
+
+/*
+ * Transport layer functions (defined in imxport.c)
+ */
+extern int IMCreateTCPService _Pt_((int *portp));
+extern IMConnection *IMTCPConnection _Pt_((Widget protocol, int socket));
+extern int IMCreateUnixService _Pt_((char *path));
+extern IMConnection *IMUnixConnection _Pt_((Widget protocol, int socket));
+extern IMConnection *IMXConnection _Pt_((Widget protocol, XEvent *ev));
+extern int IMFlush _Pt_((IMConnection *conn));
+extern void IMShutdown _Pt_((IMConnection *conn));
+extern void IMCloseConnection _Pt_((IMConnection *conn));
+
+/*
+ * Request dispatch functions (defined in imdispatch.c)
+ */
+extern void IMSetInitialDispatcher _Pt_((IMConnection *conn));
+extern void IMDispatch _Pt_((IMConnection *conn, int cond));
+extern void IMSchedule _Pt_((IMConnection *conn, int type));
+extern void IMProcessQueue _Pt_((Widget w));
+
+/*
+ * Function to compile request dispatch table (defined in imrequest.c)
+ */
+extern void IMCompileReq _Pt_((void));
+
+/*
+ * Functions handling IM/IC creation/destruction/lookup (defined in imic.c)
+ */
+extern IMIM *IMGetIM _Pt_((IMConnection *conn, int arglen));
+extern IMIC *IMGetIC _Pt_((IMConnection *conn, int arglen));
+extern IMIM *IMCreateIM _Pt_((IMConnection *conn, IMConverter *converter));
+extern IMIC *IMCreateIC _Pt_((IMIM *imp));
+extern void IMDestroyIM _Pt_((IMIM *imp));
+extern void IMDestroyIC _Pt_((IMIC *imp));
+
+/*
+ * Functions handling conversion start/stop/etc. (defined in imconv.c)
+ */
+extern int IMStartConversion _Pt_((IMIC *icp));
+extern void IMStopConversion _Pt_((IMIC *icp));
+extern int IMResetIC _Pt_((IMIC *icp, char **preedit_strp));
+extern void IMForwardEvent _Pt_((IMIC *icp, XEvent *ev));
+extern void IMSetFocus _Pt_((IMIC *icp));
+extern void IMUnsetFocus _Pt_((IMIC *icp));
+extern void IMStatusStart _Pt_((IMIC *icp));
+extern void IMStatusDone _Pt_((IMIC *icp));
+extern void IMStartForwarding _Pt_((IMIC *icp));
+extern void IMStopForwarding _Pt_((IMIC *icp));
+
+/*
+ * Functions dealing with IM/IC attributes (defined in imattr.c)
+ */
+extern void IMPutIMAttrList _Pt_((IMIM *imp));
+extern void IMPutICAttrList _Pt_((IMIM *imp));
+extern int IMSetIMValues _Pt_((IMIM *imp, char *data, int len, int major));
+extern int IMGetIMValues _Pt_((IMIM *imp, char *data, int len, int offset));
+extern int IMSetICValues _Pt_((IMIC *icp, char *data, int len, int major));
+extern int IMGetICValues _Pt_((IMIC *icp, char *data, int len, int offset));
+extern void IMFillDefault _Pt_((IMIC *icp,
+				unsigned long common_mask,
+				unsigned long preedit_mask,
+				unsigned long status_mask));
+extern int IMValidateWindow _Pt_((Display *dpy, Window win,
+				  IMWindowProfile *profilep));
+extern int IMValidateICAttributes _Pt_((IMIC *icp, int checkonly));
+extern void IMFreeICAttributes _Pt_((IMIC *icp));
+extern unsigned long IMMakeConvAttributes _Pt_((IMIC *icp,
+						ConversionAttributes *attr));
+extern void IMMoveLocation _Pt_((IMIC *icp, int x, int y));
+
+/*
+ * Functions interfacing imlib and IMProtocol widget (defined in improto.c)
+ */
+extern void IMRegisterConnection _Pt_((IMConnection *conn));
+extern void IMUnregisterConnection _Pt_((IMConnection *conn));
+extern IMConnection *IMConnectionList _Pt_((Widget w));
+extern void IMPushQueue _Pt_((IMConnection *conn));
+extern IMConnection *IMPopQueue _Pt_((Widget w));
+extern int IMQueueEmpty _Pt_((Widget w));
+extern Pixel IMDefaultForeground _Pt_((Widget w));
+extern Pixel IMDefaultBackground _Pt_((Widget w));
+extern char *IMDefaultFontSet _Pt_((IMIM *imp));
+extern FontBank IMFontBank _Pt_((IMIM *imp));
+extern int IMStatusWidth _Pt_((Widget w));
+extern void IMInitHash _Pt_((Widget w));
+extern IMIM **IMIMHash _Pt_((Widget w));
+extern IMIC **IMICHash _Pt_((Widget w));
+extern unsigned int IMNextIMID _Pt_((Widget w));
+extern unsigned int IMNextICID _Pt_((Widget w));
+extern Atom IMCtextAtom _Pt_((Widget w));
+extern Atom IMKi2CommAtom _Pt_((Widget w));
+extern Atom IMXConnectAtom _Pt_((Widget w));
+extern Atom IMProtocolAtom _Pt_((Widget w));
+extern Atom IMMoreDataAtom _Pt_((Widget w));
+extern IMTriggerKey *IMTriggerKeys _Pt_((IMIM *imp, int *num_triggersp));
+extern IMConverter *IMGetConverter _Pt_((Widget w, char *locale));
+
+#endif /* _imfuncs_h */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/imlib/imic.c	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,396 @@
+#ifndef lint
+static char *rcsid = "$Id: imic.c,v 1.12 2002/01/24 09:07:20 ishisone Exp $";
+#endif
+/*
+ * Copyright (c) 1994  Software Research Associates, Inc.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted, provided
+ * that the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Software Research Associates not be
+ * used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission.  Software Research
+ * Associates makes no representations about the suitability of this software
+ * for any purpose.  It is provided "as is" without express or implied
+ * warranty.
+ *
+ * Author:  Makoto Ishisone, Software Research Associates, Inc., Japan
+ */
+
+#include "im.h"
+
+#define IMHASHVAL(imp)	((imp)->id % IM_HASH_SIZE)
+#define ICHASHVAL(icp)	((icp)->id % IC_HASH_SIZE)
+
+static IMIM *id2IM _Pt_((IMConnection *conn, unsigned int id));
+static IMIC *id2IC _Pt_((IMIM *imp, unsigned int id));
+static unsigned int newIMID _Pt_((IMConnection *conn));
+static unsigned int newICID _Pt_((IMIM *imp));
+static void registerIM _Pt_((IMIM *imp));
+static void registerIC _Pt_((IMIC *icp));
+static int unregisterIM _Pt_((IMIM *imp));
+static int unregisterIC _Pt_((IMIC *icp));
+static int removeIM _Pt_((IMIM *imp));
+static int removeIC _Pt_((IMIC *icp));
+
+/*- id2IM: input-method ID to IM converter -*/
+static IMIM *
+id2IM(conn, id)
+IMConnection *conn;
+unsigned int id;
+{
+    IMIM **imHash = IMIMHash(conn->proto_widget);
+    IMIM *imp;
+
+    imp = imHash[id % IM_HASH_SIZE];
+    while (imp != NULL) {
+	if (imp->id == id) return imp;
+	imp = imp->hash_next;
+    }
+    return NULL;
+}
+
+/*- id2IC: input-context ID to IC converter -*/
+static IMIC *
+id2IC(imp, id)
+IMIM *imp;
+unsigned int id;
+{
+    IMIC **icHash = IMICHash(imp->connection->proto_widget);
+    IMIC *icp;
+
+    icp = icHash[id % IC_HASH_SIZE];
+    while (icp != NULL) {
+	if (icp->id == id) return icp;
+	icp = icp->hash_next;
+    }
+    return NULL;
+}
+
+/*- newIMID: return unused input-method ID -*/
+static unsigned int
+newIMID(conn)
+IMConnection *conn;
+{
+    Widget w = conn->proto_widget;
+    unsigned int id, id_start;
+
+    id = id_start = IMNextIMID(w);
+    do {
+	if (id2IM(conn, id) == NULL) return id;	/* unused ID */
+    } while ((id = IMNextIMID(w)) != id_start);
+    return 0;
+}
+
+/*- newICID: return unused input-context ID -*/
+static unsigned int
+newICID(imp)
+IMIM *imp;
+{
+    Widget w = imp->connection->proto_widget;
+    unsigned int id, id_start;
+
+    id = id_start = IMNextICID(w);
+    do {
+	if (id2IC(imp, id) == NULL) return id;	/* unused ID */
+    } while ((id = IMNextICID(w)) != id_start);
+    return 0;
+}
+
+/*- registerIM: register IM to hash table -*/
+static void
+registerIM(imp)
+IMIM *imp;
+{
+    IMIM **imHash = IMIMHash(imp->connection->proto_widget);
+
+    imp->hash_next = imHash[IMHASHVAL(imp)];
+    imHash[IMHASHVAL(imp)] = imp;
+}
+
+/*- registerIC: register IC to hash table -*/
+static void
+registerIC(icp)
+IMIC *icp;
+{
+    IMIC **icHash = IMICHash(icp->im->connection->proto_widget);
+
+    icp->hash_next = icHash[ICHASHVAL(icp)];
+    icHash[ICHASHVAL(icp)] = icp;
+}
+
+/*- unregisterIM: remove IM from hash table -*/
+static int
+unregisterIM(imp)
+IMIM *imp;
+{
+    IMIM **imHash = IMIMHash(imp->connection->proto_widget);
+    IMIM *p, *q;
+
+    p = imHash[IMHASHVAL(imp)];
+    q = NULL;
+
+    while (p != NULL && p != imp) {
+	q = p;
+	p = p->hash_next;
+    }
+    if (p == NULL) return 0;
+
+    if (q != NULL) {
+	q->hash_next = p->hash_next;
+    } else {
+	imHash[IMHASHVAL(imp)] = p->hash_next;
+    }
+    return 1;
+}
+
+/*- unregisterIC: remove IC from hash table -*/
+static int
+unregisterIC(icp)
+IMIC *icp;
+{
+    IMIC **icHash = IMICHash(icp->im->connection->proto_widget);
+    IMIC *p, *q;
+
+    p = icHash[ICHASHVAL(icp)];
+    q = NULL;
+
+    while (p != NULL && p != icp) {
+	q = p;
+	p = p->hash_next;
+    }
+    if (p == NULL) return 0;
+
+    if (q != NULL) {
+	q->hash_next = p->hash_next;
+    } else {
+	icHash[ICHASHVAL(icp)] = p->hash_next;
+    }
+    return 1;
+}
+
+/* removeIM: remove IM from IM list which connection holds */
+static int
+removeIM(imp)
+IMIM *imp;
+{
+    IMConnection *conn = imp->connection;
+    IMIM *p, *q;
+
+    p = conn->im_list;
+    q = NULL;
+    while (p != NULL) {
+	if (p == imp) break;
+	q = p;
+	p = p->next;
+    }
+
+    if (p == NULL) return 0;
+
+    if (q == NULL) {
+	conn->im_list = p->next;
+    } else {
+	q->next = p->next;
+    }
+    return 1;
+}
+
+/* removeIC: remove IC from IC list which IM holds */
+static int
+removeIC(icp)
+IMIC *icp;
+{
+    IMIM *imp = icp->im;
+    IMIC *p, *q;
+
+    p = imp->ic_list;
+    q = NULL;
+    while (p != NULL) {
+	if (p == icp) break;
+	q = p;
+	p = p->next;
+    }
+
+    if (p == NULL) return 0;
+
+    if (q == NULL) {
+	imp->ic_list = p->next;
+    } else {
+	q->next = p->next;
+    }
+    return 1;
+}
+
+/*
+ * Public functions
+ */
+
+IMIM *
+IMGetIM(conn, arglen)
+IMConnection *conn;
+int arglen;
+{
+    unsigned int id;
+    IMIM *imp;
+
+    /* Check argument length */
+    if (arglen < 2) {
+	IMSendError(conn, IMBadSomething, 0, 0, "input-method ID expected");
+	return NULL;
+    }
+
+    id = IMGetC16(conn, 0);
+    imp = id2IM(conn, id);
+    if (imp != NULL && imp->connection == conn)	return imp;
+    IMSendError(conn, IMBadSomething, 0, 0, "invalid input-method ID");
+    return NULL;
+}
+
+IMIC *
+IMGetIC(conn, arglen)
+IMConnection *conn;
+int arglen;
+{
+    unsigned int imid, icid;
+    IMIM *imp;
+    IMIC *icp;
+
+    /* Check argument length */
+    if (arglen < 4) {
+	IMSendError(conn, IMBadSomething, 0, 0, "input-method ID expected");
+	return NULL;
+    } else if (arglen < 4) {
+	IMSendError(conn, IMBadSomething, 0, 0, "input-context ID expected");
+	return NULL;
+    }
+
+    imid = IMGetC16(conn, 0);
+    icid = IMGetC16(conn, 2);
+
+    if ((imp = id2IM(conn, imid)) == NULL || imp->connection != conn) {
+	IMSendError(conn, IMBadSomething, 0, 0, "invalid input-method ID");
+	return NULL;
+    }
+    if ((icp = id2IC(imp, icid)) == NULL || icp->im != imp) {
+	IMSendError(conn, IMBadSomething, 0, 0, "invalid input-context ID");
+	return NULL;
+    }
+    return icp;
+}
+
+IMIM *
+IMCreateIM(conn, converter)
+IMConnection *conn;
+IMConverter *converter;
+{
+    IMIM *imp;
+
+    imp = XtNew(IMIM);
+
+    imp->id = newIMID(conn);
+    imp->connection = conn;
+    imp->converter = converter;
+    imp->mask = 0;
+    imp->ic_list = NULL;
+
+    registerIM(imp);
+    imp->next = conn->im_list;
+    conn->im_list = imp;
+
+    return imp;
+}
+
+
+IMIC *
+IMCreateIC(imp)
+IMIM *imp;
+{
+    IMIC *icp;
+
+    icp = XtNew(IMIC);
+
+    icp->id = newICID(imp);
+
+    /*
+     * Initialize data
+     */
+    icp->im = imp;
+    icp->conversion = NULL;
+    icp->state = 0;
+    icp->pending_events = NULL;
+    icp->style = IMSTYLE_SEPARATE;
+    icp->common_attr.set_mask = icp->common_attr.change_mask = 0;
+    icp->preedit_attr.set_mask = icp->preedit_attr.change_mask = 0;
+    icp->status_attr.set_mask = icp->status_attr.change_mask = 0;
+    icp->fonts = NULL;
+    icp->num_fonts = 0;
+    icp->status_fonts = NULL;
+    icp->num_status_fonts = 0;
+
+    registerIC(icp);
+    icp->next = imp->ic_list;
+    imp->ic_list = icp;
+
+    return icp;
+}
+
+void
+IMDestroyIM(imp)
+IMIM *imp;
+{
+    IMIC *icp = imp->ic_list;
+    IMIC *icp_next;
+
+    /*
+     * Destroy all the ICs belonging to this IM.
+     */
+    while (icp != NULL) {
+	icp_next = icp->next;
+	IMDestroyIC(icp);
+	icp = icp_next;
+    }
+
+    (void)unregisterIM(imp);
+    (void)removeIM(imp);
+
+    XtFree((char *)imp);
+}
+
+void
+IMDestroyIC(icp)
+IMIC *icp;
+{
+    IMPendingEvent *pending;
+
+    if (icp->state & IC_DESTROYING) return;
+    icp->state |= IC_DESTROYING;
+
+    /*
+     * Stop conversion.
+     */
+    if (icp->state & IC_CONVERTING) {
+	IMStopConversion(icp);
+    }
+
+    /*
+     * Free pending event queue.
+     */
+    pending = icp->pending_events;
+    while (pending != NULL) {
+	IMPendingEvent *next = pending->next;
+
+	XtFree((char *)pending);
+	pending = next;
+    }
+
+    /*
+     * Free IC attributes.
+     */
+    IMFreeICAttributes(icp);
+
+    (void)unregisterIC(icp);
+    (void)removeIC(icp);
+
+    XtFree((char *)icp);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/imlib/improto.c	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,289 @@
+#ifndef lint
+static char *rcsid = "$Id: improto.c,v 1.5 1994/05/31 07:54:04 ishisone Exp $";
+#endif
+/*
+ * Copyright (c) 1994  Software Research Associates, Inc.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted, provided
+ * that the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Software Research Associates not be
+ * used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission.  Software Research
+ * Associates makes no representations about the suitability of this software
+ * for any purpose.  It is provided "as is" without express or implied
+ * warranty.
+ *
+ * Author:  Makoto Ishisone, Software Research Associates, Inc., Japan
+ */
+
+#include "im.h"
+#include "IMProtoP.h"
+
+/*
+ * This library contains interface functions between imlib and
+ * IMProtocol widget.
+ */
+
+/*- IMRegisterConnection: register connection to the protocol widget -*/
+void
+IMRegisterConnection(conn)
+IMConnection *conn;
+{
+    IMProtocolWidget ipw = (IMProtocolWidget)conn->proto_widget;
+    
+    conn->next = ipw->imp.connection_list;
+    ipw->imp.connection_list = conn;
+}
+
+/*- IMUnregisterConnection: unregister connection from the protocol widget -*/
+void
+IMUnregisterConnection(conn)
+IMConnection *conn;
+{
+    IMProtocolWidget ipw = (IMProtocolWidget)conn->proto_widget;
+    IMConnection *p, *q;
+
+    p = ipw->imp.connection_list;
+    q = NULL;
+    while (p != NULL) {
+	if (p == conn) {
+	    if (q == NULL) {
+		ipw->imp.connection_list = p->next;
+	    } else {
+		q->next = p->next;
+	    }
+	    /*
+	     * If there are no connections, and the no-more-connections
+	     * flag is set to true, destroy the protocol widget.
+	     */
+	    if (ipw->imp.connection_list == NULL &&
+		ipw->imp.no_more_connections == True) {
+		DPRINT(("IMProtocolWidget no longer necessary. killing..\n"));
+		XtDestroyWidget((Widget)ipw);
+	    }
+	    return;
+	}
+	q = p;
+	p = p->next;
+    }
+}
+
+/*- IMConnectionList: get connection list -*/
+IMConnection *
+IMConnectionList(w)
+Widget w;
+{
+    IMProtocolWidget ipw = (IMProtocolWidget)w;
+
+    return ipw->imp.connection_list;
+}
+
+/*- IMPushQueue: push connection to the scheduler queue -*/
+void
+IMPushQueue(conn)
+IMConnection *conn;
+{
+    Widget w = conn->proto_widget;
+
+    conn->queue_next = IM_QUEUE(w);
+    IM_QUEUE(w) = conn;
+}
+
+/*- IMPopQueue: pop connection from the scheduler queue */
+IMConnection *
+IMPopQueue(w)
+Widget w;
+{
+    IMConnection *conn;
+
+    conn = IM_QUEUE(w);
+    if (conn != NULL) {
+	IM_QUEUE(w) = conn->queue_next;
+	conn->queue_next = NULL;
+    }
+    return conn;
+}
+
+/*- IMQueueEmpty: returns true if the scheduler queue is empty -*/
+int
+IMQueueEmpty(w)
+Widget w;
+{
+    return(IM_QUEUE(w) == NULL);
+}
+
+/*- IMDefaultForeground: get default foreground color -*/
+Pixel
+IMDefaultForeground(w)
+Widget w;
+{
+    IMProtocolWidget ipw = (IMProtocolWidget)w;
+
+    return ipw->imp.foreground;
+}
+
+/*- IMDefaultBackground: get default background color -*/
+Pixel
+IMDefaultBackground(w)
+Widget w;
+{
+    IMProtocolWidget ipw = (IMProtocolWidget)w;
+
+    return ipw->core.background_pixel;
+}
+
+/*- IMDefaultFontSet: get default font set -*/
+char *
+IMDefaultFontSet(imp)
+IMIM *imp;
+{
+    IMProtocolWidget ipw = (IMProtocolWidget)imp->connection->proto_widget;
+
+    return ipw->imp.default_fontlist;
+}
+
+/*- IMFontBank: get font bank for the specified IM -*/
+FontBank
+IMFontBank(imp)
+IMIM *imp;
+{
+    IMProtocolWidget ipw = (IMProtocolWidget)imp->connection->proto_widget;
+
+    return ipw->imp.font_bank;
+}
+
+/*- IMStatusWidth: get default status width -*/
+int
+IMStatusWidth(w)
+Widget w;
+{
+    IMProtocolWidget ipw = (IMProtocolWidget)w;
+
+    return ipw->imp.status_width;
+}
+
+/*- IMInitHash: initialize IM/IC hash table -*/
+void
+IMInitHash(w)
+Widget w;
+{
+    IMIM **impp;
+    IMIC **icpp;
+    int i;
+
+    impp = IM_IMHASH(w);
+    icpp = IM_ICHASH(w);
+    for (i = 0; i < IM_HASH_SIZE; i++) impp[i] = NULL;
+    for (i = 0; i < IC_HASH_SIZE; i++) icpp[i] = NULL;
+    IM_LASTIMID(w) = IM_LASTICID(w) = 0;
+}
+
+/*- IMIMHash: get IM hash table -*/
+IMIM **
+IMIMHash(w)
+Widget w;
+{
+    return IM_IMHASH(w);
+}
+
+/*- IMICHash: get IC hash table -*/
+IMIC **
+IMICHash(w)
+Widget w;
+{
+    return IM_ICHASH(w);
+}
+
+/*- IMNextIMID: return next IMID (it might be used, though) -*/
+unsigned int
+IMNextIMID(w)
+Widget w;
+{
+    long id = IM_LASTIMID(w) + 1;	/* use long int to avoid overflow */
+
+    if (id > 65535L) id = 1;
+    IM_LASTIMID(w) = (unsigned int)id;
+    return (unsigned int)id;
+}
+
+/*- IMNextICID: return next ICID (it might be used, though) -*/
+unsigned int
+IMNextICID(w)
+Widget w;
+{
+    long id = IM_LASTICID(w) + 1;	/* use long int to avoid overflow */
+
+    if (id > 65535L) id = 1;
+    IM_LASTICID(w) = (unsigned int)id;
+    return (unsigned int)id;
+}
+
+/*- IMCtextAtom: get COMPOUND_TEXT atom -*/
+Atom
+IMCtextAtom(w)
+Widget w;
+{
+    return ATOM_CTEXT(w);
+}
+
+/*- IMKi2CommAtom: get _KINPUT2_COMM atom -*/
+Atom
+IMKi2CommAtom(w)
+Widget w;
+{
+    return ATOM_KI2COMM(w);
+}
+
+/*- IMXConnectAtom: get _XIM_XCONNECT atom -*/
+Atom
+IMXConnectAtom(w)
+Widget w;
+{
+    return ATOM_XCONNECT(w);
+}
+
+/*- IMProtocolAtom: get _XIM_PROTOCOL atom -*/
+Atom
+IMProtocolAtom(w)
+Widget w;
+{
+    return ATOM_PROTOCOL(w);
+}
+
+/*- IMMoreDataAtom: get _XIM_MOREDATA atom -*/
+Atom
+IMMoreDataAtom(w)
+Widget w;
+{
+    return ATOM_MOREDATA(w);
+}
+
+/*- IMTriggerKeys: get trigger key list -*/
+IMTriggerKey *
+IMTriggerKeys(imp, num_triggersp)
+IMIM *imp;
+int *num_triggersp;
+{
+    IMProtocolWidget ipw = (IMProtocolWidget)imp->connection->proto_widget;
+
+    *num_triggersp = ipw->imp.num_trigger_keys;
+    return ipw->imp.trigger_keys;
+}
+
+/*- getConverter: look up converter for the specified locale -*/
+IMConverter *
+IMGetConverter(w, locale)
+Widget w;
+char *locale;
+{
+    IMProtocolWidget ipw = (IMProtocolWidget)w;
+    IMConverter *conv = &ipw->imp.converter;
+    int i;
+
+    for (i = 0; i < conv->num_locales; i++) {
+	if (!strcmp(conv->supported_locales[i], locale)) return conv;
+    }
+    return NULL;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/imlib/imprtype.h	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,30 @@
+/* $Id: imprtype.h,v 1.2 1994/05/12 08:56:14 ishisone Exp $ */
+/*
+ * Copyright (c) 1994  Software Research Associates, Inc.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted, provided
+ * that the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Software Research Associates not be
+ * used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission.  Software Research
+ * Associates makes no representations about the suitability of this software
+ * for any purpose.  It is provided "as is" without express or implied
+ * warranty.
+ *
+ * Author:  Makoto Ishisone, Software Research Associates, Inc., Japan
+ */
+
+#ifndef _imprtype_h
+#define _imprtype_h
+
+#include <X11/Xfuncproto.h>
+
+#if NeedFunctionPrototypes
+#define _Pt_(args)	args
+#else
+#define _Pt_(args)	()
+#endif
+
+#endif /* _imprtype_h */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/imlib/imreq.h	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,40 @@
+/* $Id: imreq.h,v 1.1 1994/05/16 02:45:36 ishisone Exp $ */
+/*
+ * Copyright (c) 1994  Software Research Associates, Inc.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted, provided
+ * that the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Software Research Associates not be
+ * used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission.  Software Research
+ * Associates makes no representations about the suitability of this software
+ * for any purpose.  It is provided "as is" without express or implied
+ * warranty.
+ *
+ * Author:  Makoto Ishisone, Software Research Associates, Inc., Japan
+ */
+
+#ifndef _imreq_h
+#define _imreq_h
+
+typedef struct _im_request_ {
+    char *name;			/* name of request. 
+				 * for extension requests, this is the name of
+				 * the extension.
+				 */
+    int major;			/* major opcode */
+    int minor;			/* minor opcode */
+    void (*proc)();		/* request handler proc.
+				 * NULL means clients don't send this
+				 * request to servers
+				 * (i.e. server->client request).
+				 */
+    IMExtensionMask mask;	/* required extension mask */
+    struct _im_request_ *next;	/* for dispatch table */
+} IMRequest;
+
+extern IMRequest *IMMainDispatchTable[];
+
+#endif /* _imreq_h */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/imlib/imrequest.c	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,1452 @@
+#ifndef lint
+static char *rcsid = "$Id: imrequest.c,v 1.19 2002/01/27 11:33:37 ishisone Exp $";
+#endif
+/*
+ * Copyright (c) 1994  Software Research Associates, Inc.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted, provided
+ * that the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Software Research Associates not be
+ * used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission.  Software Research
+ * Associates makes no representations about the suitability of this software
+ * for any purpose.  It is provided "as is" without express or implied
+ * warranty.
+ *
+ * Author:  Makoto Ishisone, Software Research Associates, Inc., Japan
+ */
+
+/* in order to include xEvent definition */
+#define NEED_EVENTS
+#include <X11/Xproto.h>
+
+#include "im.h"
+#include "imreq.h"
+
+/*
+ * Request handle functions
+ */
+static void ximDisconnectProc _Pt_((IMConnection *, int, int, int));
+static void ximErrorProc _Pt_((IMConnection *, int, int, int));
+static void ximOpenProc _Pt_((IMConnection *, int, int, int));
+static void ximCloseProc _Pt_((IMConnection *, int, int, int));
+static void ximTriggerNotifyProc _Pt_((IMConnection *, int, int, int));
+static void ximEncodingNegotiationProc _Pt_((IMConnection *, int, int, int));
+static void ximQueryExtensionProc _Pt_((IMConnection *, int, int, int));
+static void ximSetIMValuesProc _Pt_((IMConnection *, int, int, int));
+static void ximGetIMValuesProc _Pt_((IMConnection *, int, int, int));
+static void ximCreateICProc _Pt_((IMConnection *, int, int, int));
+static void ximDestroyICProc _Pt_((IMConnection *, int, int, int));
+static void ximSetICValuesProc _Pt_((IMConnection *, int, int, int));
+static void ximGetICValuesProc _Pt_((IMConnection *, int, int, int));
+static void ximSetICFocusProc _Pt_((IMConnection *, int, int, int));
+static void ximUnsetICFocusProc _Pt_((IMConnection *, int, int, int));
+static void ximForwardEventProc _Pt_((IMConnection *, int, int, int));
+static void ximExtForwardKeyeventProc _Pt_((IMConnection *, int, int, int));
+static void ximSyncProc _Pt_((IMConnection *, int, int, int));
+static void ximSyncReplyProc _Pt_((IMConnection *, int, int, int));
+static void ximResetICProc _Pt_((IMConnection *, int, int, int));
+static void ximExtMoveProc _Pt_((IMConnection *, int, int, int));
+
+static void ximAlreadyConnectedProc _Pt_((IMConnection *, int, int, int));
+static void ximShouldNotBeSentProc _Pt_((IMConnection *, int, int, int));
+static void ximAuthPhaseProc _Pt_((IMConnection *, int, int, int));
+static void ximNopProc _Pt_((IMConnection *, int, int, int));
+
+/*
+ * Core request table
+ */
+static IMRequest coreRequestTbl[] = {
+    { "CONNECT", XIM_CONNECT, 0, ximAlreadyConnectedProc },
+    { "CONNECT-REPLY", XIM_CONNECT_REPLY, 0, ximShouldNotBeSentProc },
+    { "DISCONNECT", XIM_DISCONNECT, 0, ximDisconnectProc },
+    { "DISCONNECT-REPLY", XIM_DISCONNECT_REPLY, 0, ximShouldNotBeSentProc },
+    { "AUTH-REQUIRED", XIM_AUTH_REQUIRED, 0, ximAuthPhaseProc },
+    { "AUTH-REPLY", XIM_AUTH_REPLY, 0, ximAuthPhaseProc },
+    { "AUTH-NEXT", XIM_AUTH_NEXT, 0, ximAuthPhaseProc },
+    { "AUTH-SETUP", XIM_AUTH_SETUP, 0, ximShouldNotBeSentProc },
+    { "AUTH-NG", XIM_AUTH_NG, 0, ximAuthPhaseProc },
+    { "ERROR", XIM_ERROR, 0, ximErrorProc },
+    { "OPEN", XIM_OPEN, 0, ximOpenProc },
+    { "OPEN-REPLY", XIM_OPEN_REPLY, 0, ximShouldNotBeSentProc },
+    { "CLOSE", XIM_CLOSE, 0, ximCloseProc },
+    { "CLOSE-REPLY", XIM_CLOSE_REPLY, 0, ximShouldNotBeSentProc },
+    { "SET-EVENT-MASK", XIM_SET_EVENT_MASK, 0, ximShouldNotBeSentProc },
+    { "REGISTER-TRIGGERKEYS", XIM_REGISTER_TRIGGERKEYS, 0,
+	  ximShouldNotBeSentProc },
+    { "TRIGGER-NOTIFY", XIM_TRIGGER_NOTIFY, 0, ximTriggerNotifyProc },
+    { "TRIGGER-NOTIFY-REPLY", XIM_TRIGGER_NOTIFY_REPLY, 0,
+	  ximShouldNotBeSentProc },
+    { "ENCODING-NEGOTIATION", XIM_ENCODING_NEGOTIATION, 0,
+	  ximEncodingNegotiationProc },
+    { "ENCODING-NEGOTIATION-REPLY", XIM_ENCODING_NEGOTIATION_REPLY, 0,
+	  ximShouldNotBeSentProc },
+    { "QUERY-EXTENSION", XIM_QUERY_EXTENSION, 0, ximQueryExtensionProc },
+    { "QUERY-EXTENSION-REPLY", XIM_QUERY_EXTENSION_REPLY, 0,
+	  ximShouldNotBeSentProc },
+    { "SET-IM-VALUES", XIM_SET_IM_VALUES, 0, ximSetIMValuesProc },
+    { "SET-IM-VALUES-REPLY", XIM_SET_IM_VALUES_REPLY, 0,
+	  ximShouldNotBeSentProc },
+    { "GET-IM-VALUES", XIM_GET_IM_VALUES, 0, ximGetIMValuesProc },
+    { "GET-IM-VALUES-REPLY", XIM_GET_IM_VALUES_REPLY, 0,
+	  ximShouldNotBeSentProc },
+    { "CREATE-IC", XIM_CREATE_IC, 0, ximCreateICProc },
+    { "CREATE-IC-REPLY", XIM_CREATE_IC_REPLY, 0, ximShouldNotBeSentProc },
+    { "DESTROY-IC", XIM_DESTROY_IC, 0, ximDestroyICProc },
+    { "DESTROY-IC-REPLY", XIM_DESTROY_IC_REPLY, 0, ximShouldNotBeSentProc },
+    { "SET-IC-VALUES", XIM_SET_IC_VALUES, 0, ximSetICValuesProc },
+    { "SET-IC-VALUES-REPLY", XIM_SET_IC_VALUES_REPLY, 0,
+	  ximShouldNotBeSentProc },
+    { "GET-IC-VALUES", XIM_GET_IC_VALUES, 0, ximGetICValuesProc },
+    { "GET-IC-VALUES-REPLY", XIM_GET_IC_VALUES_REPLY, 0,
+	  ximShouldNotBeSentProc },
+    { "SET-IC-FOCUS", XIM_SET_IC_FOCUS, 0, ximSetICFocusProc },
+    { "UNSET-IC-FOCUS", XIM_UNSET_IC_FOCUS, 0, ximUnsetICFocusProc },
+    { "FORWARD-EVENT", XIM_FORWARD_EVENT, 0, ximForwardEventProc },
+    { "SYNC", XIM_SYNC, 0, ximSyncProc },
+    { "SYNC-REPLY", XIM_SYNC_REPLY, 0, ximSyncReplyProc },
+    { "COMMIT", XIM_COMMIT, 0, ximShouldNotBeSentProc },
+    { "RESET-IC", XIM_RESET_IC, 0, ximResetICProc },
+    { "RESET-IC-REPLY", XIM_RESET_IC_REPLY, 0, ximShouldNotBeSentProc },
+    { "GEOMETRY", XIM_GEOMETRY, 0, ximShouldNotBeSentProc },
+    { "STR-CONVERSION", XIM_STR_CONVERSION, 0, ximShouldNotBeSentProc },
+    { "STR-CONVERSION-REPLY", XIM_STR_CONVERSION_REPLY, 0,
+	  ximShouldNotBeSentProc },
+    { "PREEDIT-START", XIM_PREEDIT_START, 0, ximShouldNotBeSentProc },
+    { "PREEDIT-START-REPLY", XIM_PREEDIT_START_REPLY, 0,
+	  ximNopProc },
+    { "PREEDIT-DRAW", XIM_PREEDIT_DRAW, 0, ximShouldNotBeSentProc },
+    { "PREEDIT-CARET", XIM_PREEDIT_CARET, 0, ximShouldNotBeSentProc },
+    { "PREEDIT-CARET-REPLY", XIM_PREEDIT_CARET_REPLY, 0,
+	  ximNopProc },
+    { "PREEDIT-DONE", XIM_PREEDIT_DONE, 0, ximShouldNotBeSentProc },
+    { "PREEDITSTATE", XIM_PREEDITSTATE, 0, ximShouldNotBeSentProc },
+    { "STATUS-START", XIM_STATUS_START, 0, ximShouldNotBeSentProc },
+    { "STATUS-DRAW", XIM_STATUS_DRAW, 0, ximShouldNotBeSentProc },
+    { "STATUS-DONE", XIM_STATUS_DONE, 0, ximShouldNotBeSentProc },
+    { NULL, 0, 0, NULL },
+};
+
+/*
+ * Extension request table
+ */
+static IMRequest extRequestTbl[] = {
+    { "XIM_EXT_SET_EVENT_MASK", XIM_EXT_SET_EVENT_MASK, 0,
+	  ximShouldNotBeSentProc, XIM_EXT_SET_EVENT_MASK_MASK },
+    { "XIM_EXT_FORWARD_KEYEVENT", XIM_EXT_FORWARD_KEYEVENT, 0,
+	  ximExtForwardKeyeventProc, XIM_EXT_FORWARD_KEYEVENT_MASK },
+    { "XIM_EXT_MOVE", XIM_EXT_MOVE, 0,
+	  ximExtMoveProc, XIM_EXT_MOVE_MASK },
+    { NULL, 0, 0, NULL },
+};
+
+/*
+ * Request dispatch table (global)
+ */
+IMRequest *IMMainDispatchTable[256];
+
+
+static void compileTbl _Pt_((IMRequest *req));
+static char *ecode2str _Pt_((int code));
+static void putTriggerkeyList _Pt_((IMIM *imp));
+static int findCtext _Pt_((IMConnection *conn, int arglen));
+static IMRequest *getExtension _Pt_((char *name));
+static void putExtension _Pt_((IMConnection *conn, IMRequest *req));
+static void swapData _Pt_((char *data, char *format));
+static int getEvent _Pt_((IMConnection *conn, unsigned int serial,
+			  int offset, XEvent *ev));
+static void postponeEvent _Pt_((IMIC *icp, int synchronous, XEvent *ev));
+static void handleForwardedEvent _Pt_((IMIC *icp, int synchronous, XEvent *ev));
+static void processPendingEvents _Pt_((IMIC *icp,
+				       IMPendingEvent *pending_event));
+
+
+/*- compileTbl: assemble IMMainDispatchTbl -*/
+static void
+compileTbl(req)
+IMRequest *req;
+{
+    while (req->name != NULL) {
+	req->next = IMMainDispatchTable[req->major];
+	IMMainDispatchTable[req->major] = req;
+	req++;
+    }
+}
+
+/*- ximDisconnectProc: handle XIM_DISCONNECT request -*/
+/* ARGSUSED */
+static void
+ximDisconnectProc(conn, major, minor, arglen)
+IMConnection *conn;
+int major;
+int minor;
+int arglen;
+{
+    IMIM *imp = conn->im_list;
+    IMIM *imp_next;
+
+    TRACE(("ximDisconnectProc(#%d)\n", conn->serial));
+
+    if (arglen != 0) {
+	DPRINT(("ximDisconnectProc: arglen != 0\n"));
+	IMSendBadLength(conn, 0, 0);
+	return;
+    }
+
+    while (imp != NULL) {
+	imp_next = imp->next;
+	IMDestroyIM(imp);
+	imp = imp_next;
+    }
+    IMSendSimpleRequest(conn, XIM_DISCONNECT_REPLY, 0);
+    IMSchedule(conn, SCHED_CLOSE);
+}
+
+/*- ecode2str: error code to error name string converter -*/
+static char *
+ecode2str(code)
+int code;
+{
+    char *s;
+
+    switch (code) {
+    case IMBadAlloc:		s = "BadAlloc"; break;
+    case IMBadStyle:		s = "BadStyle"; break;
+    case IMBadClientWindow:	s = "BadClientWindow"; break;
+    case IMBadFocusWindow:	s = "BadFocusWindow"; break;
+    case IMBadArea:		s = "BadArea"; break;
+    case IMBadSpotLocation:	s = "BadSpotLocation"; break;
+    case IMBadColormap:		s = "BadColormap"; break;
+    case IMBadAtom:		s = "BadAtom"; break;
+    case IMBadPixel:		s = "BadPixel"; break;
+    case IMBadPixmap:		s = "BadPixmap"; break;
+    case IMBadName:		s = "BadName"; break;
+    case IMBadCursor:		s = "BadCursor"; break;
+    case IMBadProtocol:		s = "BadProtocol"; break;
+    case IMBadForeground:	s = "BadForeground"; break;
+    case IMBadBackground:	s = "BadBackground"; break;
+    case IMLocaleNotSupported:	s = "LocaleNotSupported"; break;
+    case IMBadSomething:	s = "BadSomething"; break;
+    default:			s = "? (undefined error code)"; break;
+    }
+    return s;
+}
+
+/*- ximErrorProc: handle XIM_Error messsage -*/
+/* ARGSUSED */
+static void
+ximErrorProc(conn, major, minor, arglen)
+IMConnection *conn;
+int major;
+int minor;
+int arglen;
+{
+    unsigned int imid, icid;
+    int flag;
+    int code;
+    int msg_len;
+    char msg[256 + 1];
+
+    TRACE(("ximErrorProc(#%d)\n", conn->serial));
+
+    if (arglen < 10) {
+	DPRINT(("corrupted XIM_ERROR message (arglen < 10) received\n"));
+	return;
+    }
+    imid = IMGetC16(conn, 0);
+    icid = IMGetC16(conn, 2);
+    flag = IMGetC16(conn, 4);
+    code = IMGetC16(conn, 6);
+    msg_len = IMGetC16(conn, 8);
+    if (msg_len > 0) {
+	if (msg_len + 12 > arglen) {
+	    DPRINT(("corrupted XIM_ERROR message (message too long) received\n"));
+	    return;
+	}
+	if (msg_len > 256) msg_len = 256;
+	IMGetString(conn, 12, msg, msg_len);
+    }
+    if (DEBUG_CONDITION) {
+	printf("** XIM_ERROR message received:\n");
+	if (flag & 1) {
+	    printf("\t input-method ID: %d\n", imid);
+	} else {
+	    printf("\t input-method ID: N/A\n");
+	}
+	if (flag & 2) {
+	    printf("\tinput-context ID: %d\n", icid);
+	} else {
+	    printf("\tinput-context ID: N/A\n");
+	}
+	printf("\t      error code: %s\n", ecode2str(code));
+	printf("\t   error message: %s\n", msg);
+    }
+}
+
+/*- putTriggerkeyList: put trigger key list on the output stream -*/
+static void
+putTriggerkeyList(imp)
+IMIM *imp;
+{
+    IMConnection *conn = imp->connection;
+    IMTriggerKey *triggers;
+    int num_triggers;
+    int i;
+
+    triggers = IMTriggerKeys(imp, &num_triggers);
+
+    IMPutC32(conn, (unsigned long)(12 * num_triggers));
+    for (i = 0; i < num_triggers; i++) {
+	IMPutC32(conn, triggers[i].keysym);
+	IMPutC32(conn, (unsigned long)triggers[i].modifiers);
+	IMPutC32(conn, (unsigned long)triggers[i].check_modifiers);
+    }
+}
+
+/*- ximOpenProc: handle XIM_OPEN request -*/
+/* ARGSUSED */
+static void
+ximOpenProc(conn, major, minor, arglen)
+IMConnection *conn;
+int major;
+int minor;
+int arglen;
+{
+    int locale_len;
+    char localename[256 + 1];
+    int offset;
+    IMConverter *icp;
+    IMIM *imp;
+
+    TRACE(("ximOpenProc(#%d)\n", conn->serial));
+
+    if (arglen < 1) {
+	DPRINT(("ximOpenProc: arglen < 1\n"));
+	IMSendBadLength(conn, 0, 0);
+	return;
+    }
+
+    locale_len = IMGetC8(conn, 0);
+    if (arglen < locale_len + 1) {
+	DPRINT(("ximOpenProc: locale too long\n"));
+	IMSendBadLength(conn, 0, 0);
+	return;
+    }
+
+    bcopy(IMBUFDATA(IM_INBUF(conn)) + 1, localename, locale_len);
+    localename[locale_len] = '\0';
+    TRACE(("\tlocalename: %s\n", localename));
+
+    if ((icp = IMGetConverter(conn->proto_widget, localename)) == NULL) {
+	DPRINT(("ximOpenProc: unsupported locale %s\n", localename));
+	IMSendError(conn, IMLocaleNotSupported, 0, 0, "unknown locale");
+	return;
+    }
+
+    imp = IMCreateIM(conn, icp);
+
+    /*
+     * Send open reply message.
+     */
+    offset = IMPutHeader(conn, XIM_OPEN_REPLY, 0, 0);
+    IMPutC16(conn, imp->id);
+    IMPutIMAttrList(imp);
+    IMPutICAttrList(imp);
+    IMFinishRequest(conn, offset);
+
+    /*
+     * Notify conversion trigger keys.
+     *
+     * Note:
+     * The spec says that XIM_REGISTER_TRIGGERKEYS message should
+     * be sent to the client bofore XIM_OPEN_REPLY message, in
+     * order to use dynamic event flow model.  However, this
+     * does not work with current Xlib implementation.  So we
+     * send XIM_REGISTER_TRIGGERKEYS just after XIM_OPEN_REPLY,
+     * which works fine.
+     */
+    offset = IMPutHeader(conn, XIM_REGISTER_TRIGGERKEYS, 0, 0);
+    IMPutC16(conn, imp->id);
+    IMPutC16(conn, 0);
+    putTriggerkeyList(imp);
+    IMFinishRequest(conn, offset);
+}
+
+/*- ximCloseProc: handle XIM_CLOSE request -*/
+/* ARGSUSED */
+static void
+ximCloseProc(conn, major, minor, arglen)
+IMConnection *conn;
+int major;
+int minor;
+int arglen;
+{
+    IMIM *imp;
+
+    TRACE(("ximCloseProc(#%d)\n", conn->serial));
+
+    if ((imp = IMGetIM(conn, arglen)) == NULL) return;
+    if (arglen != 4) {
+	DPRINT(("ximCloseProc: arglen != 4\n"));
+	IMSendBadLength(conn, imp->id, 0);
+	return;
+    }
+
+    IMPutHeader(conn, XIM_CLOSE_REPLY, 0, 4);
+    IMPutC16(conn, imp->id);
+    IMPutPad(conn);
+    IMSchedule(conn, SCHED_WRITE);
+
+    IMDestroyIM(imp);
+}
+
+/*- ximTriggerNotifyProc: handle XIM_TRIGGER_NOTIFY request -*/
+/* ARGSUSED */
+static void
+ximTriggerNotifyProc(conn, major, minor, arglen)
+IMConnection *conn;
+int major;
+int minor;
+int arglen;
+{
+    IMIC *icp;
+    int flag;
+    int key_index;
+    int num_triggers;
+
+    TRACE(("ximTriggerNotifyProc(#%d)\n", conn->serial));
+
+    if ((icp = IMGetIC(conn, arglen)) == NULL) return;
+
+    if (arglen != 16) {
+	DPRINT(("ximTriggerNotifyProc: arglen != 16\n"));
+	IMSendBadLength(conn, icp->im->id, icp->id);
+	return;
+    }
+
+    flag = (int)IMGetC32(conn,  4);
+    key_index = (int)IMGetC32(conn, 8);
+    TRACE(("\tflag=%d, index=%d\n", flag, key_index));
+
+    /*
+     * Check flag and index.  Since kinput2 does not
+     * specifiy off-keys, any off-key notifications
+     * are invalid.
+     * The current Xlib implementation (as of pl4)
+     * specifies incorrect key_index, so index check
+     * is turned off until the bug is fixed.
+     */
+
+    (void)IMTriggerKeys(icp->im, &num_triggers);
+    if (flag != 0
+#ifndef XIM_BC
+	 || key_index >= num_triggers
+#endif /* XIM_BC */
+	) {
+	/* invalid parameter */
+	DPRINT(("ximTriggerNotifyProc: invalid trigger spec.\n"));
+	IMSendError(conn, IMBadSomething, icp->im->id, icp->id,
+		    "invalid trigger key specification");
+	return;
+    }
+
+    /*
+     * If we are already in conversion mode, do nothing special.
+     */
+    if (!(icp->state & IC_CONVERTING)) {
+	/*
+	 * Start conversion.
+	 */
+	if (IMStartConversion(icp) < 0) return;
+    }
+
+    /*
+     * Send XIM_TRIGGER_NOTIFY_REPLY request.
+     */
+    (void)IMPutHeader(conn, XIM_TRIGGER_NOTIFY_REPLY, 0, 4);
+    IMPutC16(conn, icp->im->id);
+    IMPutC16(conn, icp->id);
+    IMSchedule(conn, SCHED_WRITE);
+}
+
+/*- findCtext: look up COMPOUND_TEXT from encoding list -*/
+static int
+findCtext(conn, arglen)
+IMConnection *conn;
+int arglen;
+{
+    int offset, name_end;
+    int encoding_index;
+    unsigned int name_bytes;
+
+    offset = 2;
+    name_bytes = IMGetC16(conn, offset);
+    offset += 2;
+    name_end = offset + name_bytes;
+    if (name_end > arglen) return -2;
+
+    /*
+     * Examine encodings listed by name.
+     */
+    encoding_index = 0;
+    while (offset < name_end) {
+	char str_buf[256 + 1];
+	int str_len;
+
+	str_len = IMGetC8(conn, offset++);
+	IMGetString(conn, offset, str_buf, str_len);
+	if (!strcmp(str_buf, "COMPOUND_TEXT")) {
+	    return encoding_index;
+	}
+	offset += str_len;
+	encoding_index++;
+    }
+
+    /*
+     * Encodings listed by detailed data follow, but
+     * I have no idea what they are.
+     */
+    return -1;
+}
+
+/*- ximEncodingNegotiationProc: handle XIM_ENCODING_NEGOTIATION request -*/
+/* ARGSUSED */
+static void
+ximEncodingNegotiationProc(conn, major, minor, arglen)
+IMConnection *conn;
+int major;
+int minor;
+int arglen;
+{
+    IMIM *imp;
+    int encoding_index;
+
+    TRACE(("ximEncodingNegotiationProc(#%d)\n", conn->serial));
+
+    if ((imp = IMGetIM(conn, arglen)) == NULL) return;
+
+    if (arglen < 8) {
+	DPRINT(("ximEncodingNegotiationProc: arglen < 8\n"));
+	IMSendBadLength(conn, imp->id, 0);
+	return;
+    }
+
+    /*
+     * Always use COMPOUND_TEXT.
+     */
+    if ((encoding_index = findCtext(conn, arglen)) < -1) {
+	/* bad argument error */
+	DPRINT(("ximEncodingNegotiationProc: encoding list corrupted\n"));
+	IMSendError(conn, IMBadSomething, imp->id, 0,
+		    "corrupted argument");
+	return;
+    }
+    TRACE(("\tselected encoding index: %d\n", encoding_index));
+
+    (void)IMPutHeader(conn, XIM_ENCODING_NEGOTIATION_REPLY, 0, 8);
+    IMPutC16(conn, imp->id);
+    IMPutC16(conn, 0);
+    IMPutI16(conn, encoding_index);
+    IMPutPad(conn);
+    IMSchedule(conn, SCHED_WRITE);
+}
+
+/*- getExtension: search named extension -*/
+static IMRequest *
+getExtension(name)
+char *name;
+{
+    IMRequest *req = extRequestTbl;
+
+    while (req->name != NULL) {
+	if (!strcmp(req->name, name)) return req;
+	req++;
+    }
+    return NULL;
+}
+
+/*- putExtension: put extension information on the output stream -*/
+static void
+putExtension(conn, req)
+IMConnection *conn;
+IMRequest *req;
+{
+    int text_length;
+
+    text_length = strlen(req->name);
+    IMPutC8(conn, req->major);
+    IMPutC8(conn, req->minor);
+    IMPutC16(conn, (unsigned int)text_length);
+    IMPutString(conn, req->name, text_length);
+    IMPutPad(conn);
+}
+
+/*- ximQueryExtensionProc: handle XIM_QUERY_EXTENSION request -*/
+/* ARGSUSED */
+static void
+ximQueryExtensionProc(conn, major, minor, arglen)
+IMConnection *conn;
+int major;
+int minor;
+int arglen;
+{
+    IMIM *imp;
+    int ext_len;
+    int cur_off;
+    int req_offset;
+    int size_offset;
+    int list_start, list_end;
+
+    TRACE(("ximQueryExtensionProc(#%d)\n", conn->serial));
+
+    if ((imp = IMGetIM(conn, arglen)) == NULL) return;
+    if (arglen < 4) {
+	DPRINT(("ximQueryExtensionProc: arglen < 4\n"));
+	IMSendBadLength(conn, imp->id, 0);
+	return;
+    }
+    ext_len = IMGetC16(conn, 2);
+    if (4 + ext_len > arglen) {
+	DPRINT(("ximQueryExtensionProc: extension list too long\n"));
+	IMSendBadLength(conn, imp->id, 0);
+	return;
+    }
+    cur_off = 4;
+
+    req_offset = IMPutHeader(conn, XIM_QUERY_EXTENSION_REPLY, 0, 0);
+    IMPutC16(conn, imp->id);
+    size_offset = IMWritePos(conn);
+    IMPutC16(conn, 0);		/* dummy. overwritten afterwards */
+
+    list_start = IMWritePos(conn);
+
+    if (ext_len == 0) {
+	IMRequest *ext_req = extRequestTbl;
+
+	while (ext_req->name != NULL) {
+	    putExtension(conn, ext_req);
+	    ext_req++;
+	}
+
+    } else {
+	IMRequest *ext_req;
+
+	while (ext_len > 1) {
+	    int str_len;
+	    char ext_name[256 + 1];
+
+	    str_len = IMGetC8(conn, cur_off);
+	    cur_off++;
+
+	    if (str_len + 1 > ext_len) {
+		DPRINT(("ximQueryExtensionProc: extension name too long\n"));
+		IMCancelRequest(conn, req_offset);
+		/* BadString */
+		IMSendBadLength(conn, imp->id, 0);
+		return;
+	    }
+
+	    IMGetString(conn, cur_off, ext_name, str_len);
+	    TRACE(("\tclient queries %s extension\n", ext_name));
+
+	    if ((ext_req = getExtension(ext_name)) != NULL) {
+		putExtension(conn, ext_req);
+		imp->mask |= ext_req->mask;
+	    }
+	    cur_off += str_len;
+	    ext_len -= str_len + 1;
+	}
+    }
+
+    list_end = IMWritePos(conn);
+    IMRewriteC16(conn, size_offset, (unsigned int)(list_end - list_start));
+
+    IMFinishRequest(conn, req_offset);
+}
+
+/*- ximSetIMValuesProc: handle XIM_SET_IM_VALUES request -*/
+/* ARGSUSED */
+static void
+ximSetIMValuesProc(conn, major, minor, arglen)
+IMConnection *conn;
+int major;
+int minor;
+int arglen;
+{
+    IMIM *imp;
+    char *attr;
+    int attr_len;
+
+    TRACE(("ximSetIMValuesProc(#%d)\n", conn->serial));
+
+    if ((imp = IMGetIM(conn, arglen)) == NULL) return;
+    if (arglen < 4) {
+	DPRINT(("ximSetIMValuesProc: arglen < 4\n"));
+	IMSendBadLength(conn, imp->id, 0);
+	return;
+    }
+
+    attr_len = IMGetC16(conn, 2);
+    attr = IMBUFDATA(IM_INBUF(conn)) + 4;
+
+    if (arglen < attr_len + 4) {
+	DPRINT(("ximSetIMValuesProc: attribute len too long\n"));
+	IMSendBadLength(conn, imp->id, 0);
+	return;
+    }
+
+    if (IMSetIMValues(imp, attr, attr_len, major) < 0) return;
+
+    (void)IMPutHeader(conn, XIM_SET_IM_VALUES_REPLY, 0, 4);
+    IMPutC16(conn, imp->id);
+    IMPutPad(conn);
+    IMSchedule(conn, SCHED_WRITE);
+}
+
+/*- ximGetIMValuesProc: handle XIM_GET_IM_VALUES request -*/
+/* ARGSUSED */
+static void
+ximGetIMValuesProc(conn, major, minor, arglen)
+IMConnection *conn;
+int major;
+int minor;
+int arglen;
+{
+    IMIM *imp;
+    char *attr;
+    int attr_len;
+    int offset;
+
+    TRACE(("ximGetIMValuesProc(#%d)\n", conn->serial));
+
+    if ((imp = IMGetIM(conn, arglen)) == NULL) return;
+    if (arglen < 4) {
+	DPRINT(("ximGetIMValuesProc: arglen < 4\n"));
+	IMSendBadLength(conn, imp->id, 0);
+	return;
+    }
+
+    attr_len = IMGetC16(conn, 2);
+    attr = IMBUFDATA(IM_INBUF(conn)) + 4;
+    if (arglen < attr_len + 4 || attr_len % 2 == 1) {
+	DPRINT(("ximGetIMValuesProc: attr_len too long or an odd number\n"));
+	IMSendBadLength(conn, imp->id, 0);
+	return;
+    }
+
+    offset = IMPutHeader(conn, XIM_GET_IM_VALUES_REPLY, 0, 0);
+    IMPutC16(conn, imp->id);
+
+    if (IMGetIMValues(imp, attr, attr_len, offset) < 0) return;
+
+    IMFinishRequest(conn, offset);
+}
+
+/*- ximCreateICProc: handle XIM_CREATE_IC request -*/
+/* ARGSUSED */
+static void
+ximCreateICProc(conn, major, minor, arglen)
+IMConnection *conn;
+int major;
+int minor;
+int arglen;
+{
+    IMIM *imp;
+    IMIC *icp;
+    char *attr_data;
+    int attr_len;
+
+    TRACE(("ximCreateICProc(#%d)\n", conn->serial));
+
+    if ((imp = IMGetIM(conn, arglen)) == NULL) return;
+    if (arglen < 4) {
+	/* BadArglen */
+	DPRINT(("ximCreateICProc: arglen < 4\n"));
+	IMSendBadLength(conn, imp->id, 0);
+	return;
+    }
+
+    attr_len = IMGetC16(conn, 2);
+    attr_data = IMBUFDATA(IM_INBUF(conn)) + 4;
+    if (arglen < attr_len + 4) {
+	DPRINT(("ximCreateICProc: attr_len too long\n"));
+	IMSendBadLength(conn, imp->id, 0);
+	return;
+    }
+    icp = IMCreateIC(imp);
+    if (IMSetICValues(icp, attr_data, attr_len, major) < 0) {
+	IMDestroyIC(icp);
+	return;
+    }
+    IMSendRequestWithIC(conn, XIM_CREATE_IC_REPLY, 0, icp);
+
+    IMStatusStart(icp);
+}
+
+/*- ximDestroyICProc: handle XIM_DESTROY_IC request -*/
+/* ARGSUSED */
+static void
+ximDestroyICProc(conn, major, minor, arglen)
+IMConnection *conn;
+int major;
+int minor;
+int arglen;
+{
+    IMIC *icp;
+    unsigned int imid, icid;
+
+    TRACE(("ximDestroyICProc(#%d)\n", conn->serial));
+
+    if ((icp = IMGetIC(conn, arglen)) == NULL) return;
+    if (arglen != 4) {
+	DPRINT(("ximDestroyICProc: arglen != 4\n"));
+	IMSendBadLength(conn, icp->im->id, icp->id);
+	return;
+    }
+
+    /* Save ID of IM/IC before IMDestroyIC()     */
+    imid = icp->im->id;
+    icid = icp->id;
+
+    IMStatusDone(icp);
+
+    IMDestroyIC(icp);
+
+    /* IMSendRequestWithIC(conn, XIM_DESTROY_IC_REPLY, 0, icp); */
+    IMPutHeader(conn, XIM_DESTROY_IC_REPLY, 0, 4);
+    IMPutC16(conn, imid);
+    IMPutC16(conn, icid);
+    IMSchedule(conn, SCHED_WRITE);
+}
+
+/*- ximSetICValuesProc: handle XIM_SET_IC_VALUES request -*/
+/* ARGSUSED */
+static void
+ximSetICValuesProc(conn, major, minor, arglen)
+IMConnection *conn;
+int major;
+int minor;
+int arglen;
+{
+    IMIC *icp;
+    char *attr;
+    int attr_len;
+
+    TRACE(("ximSetICValuesProc(#%d)\n", conn->serial));
+
+    if ((icp = IMGetIC(conn, arglen)) == NULL) return;
+    if (arglen < 8) {
+	DPRINT(("ximSetICValuesProc: arglen < 8\n"));
+	IMSendBadLength(conn, icp->im->id, icp->id);
+	return;
+    }
+
+    attr_len = IMGetC16(conn, 4);
+    attr = IMBUFDATA(IM_INBUF(conn)) + 8;
+
+    if (arglen < attr_len + 8) {
+	DPRINT(("ximSetICValuesProc: attr_len too long\n"));
+	IMSendBadLength(conn, icp->im->id, icp->id);
+	return;
+    }
+
+    if (IMSetICValues(icp, attr, attr_len, major) < 0) return;
+
+    IMSendRequestWithIC(conn, XIM_SET_IC_VALUES_REPLY, 0, icp);
+}
+
+/*- ximGetICValuesProc: handle XIM_GET_IC_VALUES request -*/
+/* ARGSUSED */
+static void
+ximGetICValuesProc(conn, major, minor, arglen)
+IMConnection *conn;
+int major;
+int minor;
+int arglen;
+{
+    IMIC *icp;
+    char *attr;
+    int attr_len;
+    int offset;
+
+    TRACE(("ximGetICValuesProc(#%d)\n", conn->serial));
+
+    if ((icp = IMGetIC(conn, arglen)) == NULL) return;
+    if (arglen < 6) {
+	DPRINT(("ximGetICValuesProc: arglen < 6\n"));
+	IMSendBadLength(conn, icp->im->id, icp->id);
+	return;
+    }
+
+    attr_len = IMGetC16(conn, 4);
+    attr = IMBUFDATA(IM_INBUF(conn)) + 6;
+    if (arglen < attr_len + 6 || attr_len % 2 == 1) {
+	DPRINT(("ximGetICValuesProc: attr_len too long or an odd number\n"));
+	IMSendBadLength(conn, icp->im->id, icp->id);
+	return;
+    }
+
+    offset = IMPutHeader(conn, XIM_GET_IC_VALUES_REPLY, 0, 0);
+    IMPutC16(conn, icp->im->id);
+    IMPutC16(conn, icp->id);
+
+    if (IMGetICValues(icp, attr, attr_len, offset) < 0) return;
+
+    IMFinishRequest(conn, offset);
+}
+
+/*- ximSetICFocusProc: handle XIM_SET_IC_FOCUS request -*/
+/* ARGSUSED */
+static void
+ximSetICFocusProc(conn, major, minor, arglen)
+IMConnection *conn;
+int major;
+int minor;
+int arglen;
+{
+    IMIC *icp;
+
+    TRACE(("ximSetICFocusProc(#%d)\n", conn->serial));
+
+    if ((icp = IMGetIC(conn, arglen)) == NULL) return;
+    if (arglen != 4) {
+	DPRINT(("ximSetICFocusProc: arglen != 4\n"));
+	IMSendBadLength(conn, icp->im->id, icp->id);
+	return;
+    }
+    IMStatusStart(icp);
+    IMSetFocus(icp);
+}
+
+/*- ximUnsetICFocusProc: handle XIM_UNSET_IC_FOCUS request -*/
+/* ARGSUSED */
+static void
+ximUnsetICFocusProc(conn, major, minor, arglen)
+IMConnection *conn;
+int major;
+int minor;
+int arglen;
+{
+    IMIC *icp;
+
+    TRACE(("ximUnsetICFocusProc(#%d)\n", conn->serial));
+
+    if ((icp = IMGetIC(conn, arglen)) == NULL) return;
+    if (arglen != 4) {
+	DPRINT(("ximUnsetICFocusProc: arglen != 4\n"));
+	IMSendBadLength(conn, icp->im->id, icp->id);
+	return;
+    }
+    IMUnsetFocus(icp);
+    IMStatusDone(icp);
+}
+
+/*- swapData: do byte swapping -*/
+static void
+swapData(data, format)
+char *data;
+char *format;
+{
+    unsigned char *p = (unsigned char *)data;
+    int x;
+    int f;
+
+#define SWAPB(b1, b2)	x = b1; b1 = b2; b2 = x
+    while ((f = *format++) != '\0') {
+	switch (f) {
+	case 'x':
+	    p++;
+	    break;
+	case 'l':
+	    SWAPB(p[0], p[3]);
+	    SWAPB(p[1], p[2]);
+	    p += 4;
+	    break;
+	case 's':
+	    SWAPB(p[0], p[1]);
+	    p += 2;
+	    break;
+	}
+    }
+#undef SWAPB
+}
+
+
+/*- getEvent: read a wire event and convert it to XEvent format -*/
+static int
+getEvent(conn, serial, offset, ev)
+IMConnection *conn;
+unsigned int serial;
+int offset;
+XEvent *ev;
+{
+    IMBuffer *ibp = IM_INBUF(conn);
+    xEvent wire_event;
+    int swap_needed;
+    int one = 1;
+    char *onep = (char *)&one;
+
+    /*
+     * Get wire event from input buffer.
+     */
+    bcopy(IMBUFDATA(ibp) + offset, (char *)&wire_event, sizeof(wire_event));
+
+    /*
+     * Do we need byte swapping?
+     */
+    if (*onep == 0) {	/* big endian */
+	swap_needed = (conn->byte_order == ORDER_LITTLE);
+    } else {		/* little endian */
+	swap_needed = (conn->byte_order == ORDER_BIG);
+    }
+
+#define SWAPEV(format)	if (swap_needed) swapData((char *)&wire_event, format)
+
+    /*
+     * Get common part of the wire event.
+     */
+    SWAPEV("xxs");
+    ev->type = wire_event.u.u.type & 0x7f;
+    ev->xany.serial = (serial << 16) | wire_event.u.u.sequenceNumber;
+    ev->xany.display = XtDisplay(conn->proto_widget);
+    ev->xany.send_event = wire_event.u.u.type > 127;
+
+    /*
+     * Convert wire format to XEvent format.
+     */
+    switch (ev->type) {
+    case KeyPress:
+    case KeyRelease:
+	SWAPEV("xxxxllllsssssxx");
+#define WIRE	wire_event.u.keyButtonPointer
+	ev->xkey.window = WIRE.event;
+	ev->xkey.root = WIRE.root;
+	ev->xkey.subwindow = WIRE.child;
+	ev->xkey.time =  WIRE.time;
+	ev->xkey.x = cvtINT16toInt(WIRE.eventX);
+	ev->xkey.y = cvtINT16toInt(WIRE.eventY);
+	ev->xkey.x_root = cvtINT16toInt(WIRE.rootX);
+	ev->xkey.y_root = cvtINT16toInt(WIRE.rootY);
+	ev->xkey.state = WIRE.state;
+	ev->xkey.keycode = wire_event.u.u.detail;
+	ev->xkey.same_screen = WIRE.sameScreen;
+#undef WIRE
+	break;
+    case ButtonPress:
+    case ButtonRelease:
+	SWAPEV("xxxxllllsssssxx");
+#define WIRE	wire_event.u.keyButtonPointer
+	ev->xbutton.window = WIRE.event;
+	ev->xbutton.root = WIRE.root;
+	ev->xbutton.subwindow = WIRE.child;
+	ev->xbutton.time = WIRE.time;
+	ev->xbutton.x = cvtINT16toInt(WIRE.eventX);
+	ev->xbutton.y = cvtINT16toInt(WIRE.eventY);
+	ev->xbutton.x_root = cvtINT16toInt(WIRE.rootX);
+	ev->xbutton.y_root = cvtINT16toInt(WIRE.rootY);
+	ev->xbutton.state = WIRE.state;
+	ev->xbutton.button = wire_event.u.u.detail;
+	ev->xbutton.same_screen = WIRE.sameScreen;
+#undef WIRE
+	break;
+    case MotionNotify:
+	SWAPEV("xxxxllllsssssxx");
+#define WIRE	wire_event.u.keyButtonPointer
+	ev->xmotion.window = WIRE.event;
+	ev->xmotion.root = WIRE.root;
+	ev->xmotion.subwindow = WIRE.child;
+	ev->xmotion.time = WIRE.time;
+	ev->xmotion.x = cvtINT16toInt(WIRE.eventX);
+	ev->xmotion.y = cvtINT16toInt(WIRE.eventY);
+	ev->xmotion.x_root = cvtINT16toInt(WIRE.rootX);
+	ev->xmotion.y_root = cvtINT16toInt(WIRE.rootY);
+	ev->xmotion.state = WIRE.state;
+	ev->xmotion.is_hint = wire_event.u.u.detail;
+	ev->xmotion.same_screen = WIRE.sameScreen;
+#undef WIRE
+	break;
+    default:
+	/*
+	 * For now, this function deals only Key/Pointer events.
+	 */
+	return 0;
+    }
+#undef SWAPEV
+
+    return 1;		/* success */
+}
+
+/*- postponeEvent: record events for delayed processing -*/
+static void
+postponeEvent(icp, synchronous, ev)
+IMIC *icp;
+int synchronous;
+XEvent *ev;
+{
+    IMPendingEvent *pending;
+
+    pending = XtNew(IMPendingEvent);
+    pending->ic = icp;
+    pending->synchronous = synchronous;
+    bcopy((char *)ev, (char *)&pending->event, sizeof(XEvent));
+    pending->next = icp->pending_events;
+    icp->pending_events = pending;
+}
+
+/*- handleForwardedEvent: deal with forwarded events -*/
+static void
+handleForwardedEvent(icp, synchronous, ev)
+IMIC *icp;
+int synchronous;
+XEvent *ev;
+{
+    IMConnection *conn = icp->im->connection;
+
+    TRACE(("handleForwardedEvent()\n"));
+
+    icp->state |= IC_FORWARDING;
+
+    if (icp->state & IC_SYNCING) {
+	/*
+	 * We are waiting for SYNC_REPLY message.
+	 * Postpone event processing.
+	 */
+	DDPRINT(2, ("forward event processing suspended\n"));
+	postponeEvent(icp, synchronous, ev);
+	return;
+    }
+
+    IMForwardEvent(icp, ev);
+
+#ifdef notyet
+    if (synchronous) {
+	if (!(icp->state & IC_CONVERTING)) {
+	    /*
+	     * Stop forwarding key events.
+	     */
+	    IMStopForwarding(icp);
+	}
+	/*
+	 * All the processing is done.  Send XIM_SYNC_REPLY.
+	 */
+	IMSendRequestWithIC(conn, XIM_SYNC_REPLY, 0, icp);
+    } else {
+	int cur_pos2;
+
+	cur_pos2 = IMWritePos(conn);
+	if (!(icp->state & IC_CONVERTING)) {
+	    /*
+	     * Stop forwarding key events.
+	     */
+	    IMStopForwarding(icp);
+	    /*
+	     * Put dummy commit request (for setting sync flag).
+	     */
+	}
+    }
+#else
+    /*
+     * Currently, kinput2 supports only full synchronous method.
+     */
+    if (!(icp->state & IC_CONVERTING)) {
+	/*
+	 * Stop forwarding key events.
+	 */
+	IMStopForwarding(icp);
+    }
+    /*
+     * All the processing is done.  Send XIM_SYNC_REPLY.
+     */
+    if (icp->state & IC_FORWARDING) {
+	icp->state &= ~IC_FORWARDING;
+	IMSendRequestWithIC(conn, XIM_SYNC_REPLY, 0, icp);
+    }
+#endif
+}
+
+/*- ximForwardEventProc: handle XIM_FORWARD_EVENT request -*/
+/* ARGSUSED */
+static void
+ximForwardEventProc(conn, major, minor, arglen)
+IMConnection *conn;
+int major;
+int minor;
+int arglen;
+{
+    IMIC *icp;
+    int synchronous;
+    unsigned int serial;
+    XEvent event;
+
+    TRACE(("ximForwardEventProc(#%d)\n", conn->serial));
+
+    if ((icp = IMGetIC(conn, arglen)) == NULL) return;
+    if (arglen != 40) {
+	DPRINT(("ximForwardEventProc: arglen != 40\n"));
+	IMSendBadLength(conn, icp->im->id, icp->id);
+	return;
+    }
+
+    synchronous = IMGetC16(conn, 4) & 1;
+    serial = IMGetC16(conn, 6);
+ 
+    if (getEvent(conn, serial, 8, &event)) {
+	handleForwardedEvent(icp, synchronous, &event);
+    }
+}
+
+/*- ximExtForwardKeyeventProc: handle XIM_EXT_FORWARD_KEYEVENT_MASK request -*/
+/* ARGSUSED */
+static void
+ximExtForwardKeyeventProc(conn, major, minor, arglen)
+IMConnection *conn;
+int major;
+int minor;
+int arglen;
+{
+    IMIC *icp;
+    int synchronous;
+    int type;
+    unsigned int serial;
+    XEvent event;
+
+    TRACE(("ximExtForwardKeyeventProc(#%d)\n", conn->serial));
+
+    if ((icp = IMGetIC(conn, arglen)) == NULL) return;
+
+    if (!(icp->im->mask & XIM_EXT_FORWARD_KEYEVENT_MASK)) {
+	DPRINT(("ximExtForwardKeyeventProc: ext_forward_keyevent disabled\n"));
+	IMSendBadProtocol(conn, "ext_forward_keyevent extension not enabled");
+	return;
+    }
+
+    if (arglen != 16) {
+	DPRINT(("ximExtForwardKeyeventProc: arglen != 16\n"));
+	IMSendBadLength(conn, icp->im->id, icp->id);
+	return;
+    }
+
+    synchronous = IMGetC16(conn, 4) & 1;
+    serial = IMGetC16(conn, 6);
+    type = IMGetC8(conn, 8);
+    if (type != KeyPress && type != KeyRelease) {
+	/* Badtype */
+	IMSendError(conn, IMBadSomething, icp->im->id, icp->id,
+		    "forwarded event is invalid type");
+	return;
+    }
+
+    event.type = type;
+    event.xkey.serial = serial;			/* ??? */
+    event.xkey.keycode = IMGetC8(conn, 9);
+    event.xkey.state = IMGetC16(conn, 10);
+    event.xkey.time =  IMGetC32(conn, 12);
+    event.xkey.window = IMGetC32(conn, 16);
+    event.xkey.root = icp->client_profile.root;
+    event.xkey.subwindow = None;
+    event.xkey.x = 0;
+    event.xkey.y = 0;
+    event.xkey.x_root = 0;
+    event.xkey.y_root = 0;
+    event.xkey.same_screen = True;
+
+    handleForwardedEvent(icp, synchronous, &event);
+}
+
+/*- ximSyncProc: handle XIM_SYNC request -*/
+/* ARGSUSED */
+static void
+ximSyncProc(conn, major, minor, arglen)
+IMConnection *conn;
+int major;
+int minor;
+int arglen;
+{
+    IMIC *icp;
+
+    TRACE(("ximSyncProc(#%d)\n", conn->serial));
+
+    if ((icp = IMGetIC(conn, arglen)) == NULL) return;
+    if (arglen != 4) {
+	DPRINT(("ximSyncProc: arglen != 4\n"));
+	IMSendBadLength(conn, icp->im->id, icp->id);
+	return;
+    }
+    IMSendRequestWithIC(conn, XIM_SYNC_REPLY, 0, icp);
+}
+
+/*- processPendingEvents: process pending events forwarded by the client -*/
+static void
+processPendingEvents(icp, pending_event)
+IMIC *icp;
+IMPendingEvent *pending_event;
+{
+    /*
+     * Pending events list is in reverse order.
+     * Processing is done from the tail of the list, using
+     * recursive call.
+     */
+    if (pending_event == NULL) return;
+    processPendingEvents(icp, pending_event->next);
+    pending_event->next = NULL;
+    handleForwardedEvent(icp, pending_event->synchronous,
+			 &pending_event->event);
+    XtFree((char *)pending_event);
+}
+
+/*- ximSyncReplyProc: handle XIM_SYNC_REPLY message -*/
+/* ARGSUSED */
+static void
+ximSyncReplyProc(conn, major, minor, arglen)
+IMConnection *conn;
+int major;
+int minor;
+int arglen;
+{
+    IMIC *icp;
+
+    TRACE(("ximSyncReplyProc(#%d)\n", conn->serial));
+
+    if ((icp = IMGetIC(conn, arglen)) == NULL) return;
+    if (arglen != 4) {
+	DPRINT(("ximSyncReplyProc: arglen != 4\n"));
+	return;
+    }
+    if (icp->state & IC_SYNCING) {
+	icp->state &= ~IC_SYNCING;
+	processPendingEvents(icp, icp->pending_events);
+    }
+}
+
+/*- ximResetICProc: handle XIM_RESET_IC message -*/
+/* ARGSUSED */
+static void
+ximResetICProc(conn, major, minor, arglen)
+IMConnection *conn;
+int major;
+int minor;
+int arglen;
+{
+    IMIC *icp;
+    char *text = NULL;
+    int offset;
+    int text_length;
+
+    TRACE(("ximResetICProc(#%d)\n", conn->serial));
+
+    if ((icp = IMGetIC(conn, arglen)) == NULL) return;
+    if (arglen != 4) {
+	DPRINT(("ximResetICProc: arglen != 4\n"));
+	IMSendBadLength(conn, icp->im->id, icp->id);
+	return;
+    }
+    icp->state |= IC_RESETTING;
+    text_length = IMResetIC(icp, &text);
+
+    offset = IMPutHeader(conn, XIM_RESET_IC_REPLY, 0, 0);
+    IMPutC16(conn, icp->im->id);
+    IMPutC16(conn, icp->id);
+    IMPutC16(conn, (unsigned int)text_length);
+    if (text_length > 0) IMPutString(conn, text, text_length);
+    IMFinishRequest(conn, offset);
+    if (text != NULL) XtFree(text);
+    icp->state &= ~IC_RESETTING;
+}
+
+/*- ximExtMoveProc: handle XIM_EXT_MOVE request -*/
+/* ARGSUSED */
+static void
+ximExtMoveProc(conn, major, minor, arglen)
+IMConnection *conn;
+int major;
+int minor;
+int arglen;
+{
+    IMIC *icp;
+    int x, y;
+
+    TRACE(("ximExtMoveProc(#%d)\n", conn->serial));
+
+    if ((icp = IMGetIC(conn, arglen)) == NULL) return;
+    x = IMGetI16(conn, 4);
+    y = IMGetI16(conn, 6);
+    IMMoveLocation(icp, x, y);
+}
+
+/*- ximAlreadyConnectedProc: handle duplicate XIM_CONNECT request -*/
+/* ARGSUSED */
+static void
+ximAlreadyConnectedProc(conn, major, minor, arglen)
+IMConnection *conn;
+int major;
+int minor;
+int arglen;
+{
+    TRACE(("ximAlreadyConnectedProc(#%d)\n", conn->serial));
+
+    DPRINT(("connection #%d sent multiple XIM_CONNECT request\n",
+	    conn->serial));
+    IMSendBadProtocol(conn, "duplicate XIM_CONNECT message");
+}
+
+/*- ximShouldNotBeSentProc: handle requests which clients should not send -*/
+/* ARGSUSED */
+static void
+ximShouldNotBeSentProc(conn, major, minor, arglen)
+IMConnection *conn;
+int major;
+int minor;
+int arglen;
+{
+    TRACE(("ximShouldNotBeSentProc(#%d)\n", conn->serial));
+
+    DPRINT(("connection #%d sent invalid request\n", conn->serial))
+    IMSendBadProtocol(conn, "Clients should not send this request");
+}
+
+/*- ximAuthPhaseProc: handle requests for authentication -*/
+/* ARGSUSED */
+static void
+ximAuthPhaseProc(conn, major, minor, arglen)
+IMConnection *conn;
+int major;
+int minor;
+int arglen;
+{
+    TRACE(("ximAuthPhaseProc(#%d)\n", conn->serial));
+
+    DPRINT(("connection #%d sends auth-related request\n", conn->serial));
+    IMSendBadProtocol(conn, "not authentication phase");
+}
+
+/*- ximNopProc: nop -*/
+/* ARGSUSED */
+static void
+ximNopProc(conn, major, minor, arglen)
+IMConnection *conn;
+int major;
+int minor;
+int arglen;
+{
+    TRACE(("ximNopProc(#%d)\n", conn->serial));
+
+    /* do nothing */
+}
+
+/*
+ * Public Function
+ */
+
+/*- IMCompileReq: initialize IMMainDispatchTable -*/
+void
+IMCompileReq()
+{
+    static int compiled = 0;
+
+    if (compiled) return;
+    compileTbl(coreRequestTbl);
+    compileTbl(extRequestTbl);
+    compiled = 1;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/imlib/imxport.c	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,672 @@
+#ifndef lint
+static char *rcsid = "$Id: imxport.c,v 1.11 1999/05/04 05:44:11 ishisone Exp $";
+#endif
+/*
+ * Copyright (c) 1994  Software Research Associates, Inc.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted, provided
+ * that the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Software Research Associates not be
+ * used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission.  Software Research
+ * Associates makes no representations about the suitability of this software
+ * for any purpose.  It is provided "as is" without express or implied
+ * warranty.
+ *
+ * Author:  Makoto Ishisone, Software Research Associates, Inc., Japan
+ */
+
+#include "im.h"
+
+#include "MyDispatch.h"
+
+#include <X11/Xatom.h>
+
+#if (defined(IM_UNIX_TRANSPORT) || defined(IM_TCP_TRANSPORT))
+#include <sys/types.h>
+#include <sys/socket.h>
+#endif
+
+#ifdef IM_UNIX_TRANSPORT
+#include <sys/un.h>
+#endif
+
+#ifdef IM_TCP_TRANSPORT
+#include <netinet/in.h> 
+#endif
+
+extern int errno;
+
+/*
+ * X transport version number
+ *   This implementation uses:
+ *	+ ClientMessage (both single and multiple)
+ *	+ Property with notification by ClientMessage
+ *   So the major version is 0, minor version is 2.
+ *
+ * X transport dividing size
+ *   This size is the threshold between ClientMessage transfer
+ *   and Property transfer.  If the data to be sent is small,
+ *   transfer via ClientMessage is faster.  But since single
+ *   ClientMessage can transfer only 20bytes, there must be a
+ *   certain size above which the transfer via Property is
+ *   faster.
+ */
+#define ServerMajorTransportVersion	0
+#define ServerMinorTransportVersion	2
+#define XTransportDividingSize		(20 * 5)
+
+
+static int dummyDispatcher _Pt_((IMConnection *conn));
+static void dumpBuf _Pt_((IMBuffer *ibp, char *title));
+static Window communicationWindow _Pt_((Widget w));
+static IMConnection *newConnection _Pt_((Widget protocol));
+
+#if defined(IM_TCP_TRANSPORT) || defined(IM_UNIX_TRANSPORT)
+static void socketinput _Pt_((XtPointer cldata, int *fdp, XtInputId *idp));
+static int socketFlush _Pt_((IMConnection *conn));
+static void socketShutdown _Pt_((IMConnection *conn));
+
+static IMTransportOps SocketTransportOps = {
+    socketFlush,
+    socketShutdown,
+};
+#endif /* IM_TCP_TRANSPORT || IM_UNIX_TRANSPORT */
+
+#ifdef IM_X_TRANSPORT
+static void xinput _Pt_((XEvent *ev, XtPointer cldata));
+static void xdestroy _Pt_((XEvent *ev, XtPointer cldata));
+static int xBrokenPipe _Pt_((Display *dpy, XErrorEvent *eev,
+			     XPointer client_data));
+static int xFlush _Pt_((IMConnection *conn));
+static void xShutdown _Pt_((IMConnection *conn));
+
+static IMTransportOps XTransportOps = {
+    xFlush,
+    xShutdown,
+};
+#endif /* IM_X_TRANSPORT */
+
+
+/*- dummyDispatcher: dummy dispatcher routine -*/
+/* ARGSUSED */
+static int
+dummyDispatcher(conn)
+IMConnection *conn;
+{
+#ifdef DEBUG
+    printf("dummyDispatcher -- this function should not be called!\n");
+#endif
+    return 0;	/* for lint */
+}
+
+/*- dumpBuf: dump input/output buffer (for debug) -*/
+static void
+dumpBuf(ibp, title)
+IMBuffer *ibp;
+char *title;
+{
+    int len = IMBUFLEN(ibp);
+    unsigned char *data = (unsigned char *)IMBUFDATA(ibp);
+    int i;
+
+    printf("%s (%d bytes)", title, len);
+    for (i = 0; i < len; i++) {
+	if (i % 16 == 0) printf("\n\t");
+	printf("%02x ", *data++);
+    }
+    printf("\n");
+}
+
+/*- communicationWindow: create a window for communication with client -*/
+static Window
+communicationWindow(w)
+Widget w;
+{
+    return XCreateSimpleWindow(XtDisplay(w), XtWindow(w), 0, 0, 1, 1, 0, 0, 0);
+}
+
+/*- newConnection: allocate IMConnection structure and initialize -*/
+static IMConnection *
+newConnection(protocol)
+Widget protocol;
+{
+    IMConnection *conn;
+    static int connection_serial_number = 0;
+
+    conn = (IMConnection *)XtMalloc(sizeof(IMConnection));
+
+    conn->serial = ++connection_serial_number;		/* start from 1 */
+    conn->dispatcher = dummyDispatcher;
+
+    IMBufInit(&conn->in_buf);
+    IMBufInit(&conn->out_buf);
+
+    conn->byte_order = ORDER_UNKNOWN;
+    conn->im_list = NULL;
+    conn->proto_widget = protocol;
+
+    conn->schedule = 0;
+    conn->queue_next = NULL;
+
+    conn->next = NULL;
+
+    return conn;
+}
+
+#if defined(IM_TCP_TRANSPORT) || defined(IM_UNIX_TRANSPORT)
+/*- socketinput: handler for input from TCP/Unix socket -*/
+/* ARGSUSED */
+static void
+socketinput(cldata, fdp, idp)
+XtPointer cldata;
+int *fdp;
+XtInputId *idp;
+{
+    IMConnection *conn = (IMConnection *)cldata;
+    int fd = conn->transport.priv.sock.fd;
+    char buf[4096];
+    int n;
+    int cond;
+
+    if ((n = read(fd, buf, sizeof(buf))) < 0) {
+	cond = TRANSPORT_ERROR;
+    } else if (n == 0) {
+	cond = TRANSPORT_EOF;
+    } else {
+	IMBufAdd(&conn->in_buf, buf, n);
+	cond = TRANSPORT_OK;
+    }
+
+    if (DDEBUG_CONDITION(100)) dumpBuf(IM_INBUF(conn), "** input buffer");
+
+    IMDispatch(conn, cond);
+}
+
+/*- socketFlush: output to socket -*/
+static int
+socketFlush(conn)
+IMConnection *conn;
+{
+    int fd = conn->transport.priv.sock.fd;
+    IMBuffer *ibp = IM_OUTBUF(conn);
+    int n;
+
+    if ((n = write(fd, ibp->buf, IMBUFLEN(ibp))) < 0) {
+	return TRANSPORT_ERROR;
+    } else {
+	IMBufDiscard(ibp, n);
+	return (IMBUFLEN(ibp) == 0) ? TRANSPORT_OK : TRANSPORT_PARTIAL;
+    }
+}
+
+/*- socketShutdown: close socket and stop input callback associate with it -*/
+static void
+socketShutdown(conn)
+IMConnection *conn;
+{
+    int fd = conn->transport.priv.sock.fd;
+
+    (void)shutdown(fd, 2);
+    (void)close(fd);
+    XtRemoveInput(conn->transport.priv.sock.id);
+}
+#endif /* IM_TCP_TRANSPORT || IM_UNIX_TRANSPORT */
+
+#ifdef IM_X_TRANSPORT
+/*- xinput: handler for input via X inter-client communication -*/
+static void
+xinput(ev, cldata)
+XEvent *ev;
+XtPointer cldata;
+{
+    XClientMessageEvent *event = (XClientMessageEvent *)ev;
+    IMConnection *conn = (IMConnection *)cldata;
+    int cond;
+    Atom msg_type;
+
+    TRACE(("imlib:xinput()\n"));
+
+    if (event->type != ClientMessage ||
+	event->window != conn->transport.priv.x.server) {
+	return;
+    }
+
+    msg_type = event->message_type;
+
+    if (event->format == 32) {
+	/*
+	 * indirect reference -- data resides in a property,
+	 * whose name is stored in the event.
+	 */
+	Atom propatom = event->data.l[1];
+	long offset = 0;
+	unsigned long remain;
+
+	if (msg_type != IMProtocolAtom(conn->proto_widget)) return;
+
+	do {
+	    Atom actualtype;
+	    int actualformat;
+	    unsigned long nitems;
+	    char *data = NULL;
+
+	    XGetWindowProperty(event->display, event->window, propatom,
+			       offset, 1000, True, AnyPropertyType,
+			       &actualtype, &actualformat, &nitems,
+			       &remain, (unsigned char **)&data);
+	    if (data == NULL) return;
+	    if (actualformat != 8) {
+		cond = TRANSPORT_ERROR;
+	    } else {
+		IMBufAdd(&conn->in_buf, data, (int)nitems);
+		offset += nitems;
+		cond = TRANSPORT_OK;
+	    }
+	    XFree(data);
+	} while (remain > 0);
+    } else if (event->format == 8) {
+	if (msg_type != IMProtocolAtom(conn->proto_widget) &&
+	    msg_type != IMMoreDataAtom(conn->proto_widget)) {
+	    return;
+	}
+	IMBufAdd(&conn->in_buf, event->data.b, 20);
+	cond = TRANSPORT_OK;
+    } else {
+	return;
+    }
+
+    if (DDEBUG_CONDITION(100)) dumpBuf(IM_INBUF(conn), "** input buffer");
+
+    IMDispatch(conn, cond);
+}
+
+/*- xdestroy: handler for client comm. window destruction -*/
+static void
+xdestroy(ev, cldata)
+XEvent *ev;
+XtPointer cldata;
+{
+    XDestroyWindowEvent *event = (XDestroyWindowEvent *)ev;
+    IMConnection *conn = (IMConnection *)cldata;
+
+    TRACE(("imlib:xdestroy()\n"));
+
+    if (event->type != DestroyNotify ||
+	event->window != conn->transport.priv.x.client) {
+	return;
+    }
+    /*
+     * Call IMDispatch with TRANSPORT_ERROR, in order to
+     * shutdown connection and process queued operations.
+     */
+    IMDispatch(conn, TRANSPORT_ERROR);
+}
+
+/*- xBrokenPipe: asyncronous BadWindow error handler -*/
+/* ARGSUSED */
+static int
+xBrokenPipe(dpy, eev, client_data)
+Display *dpy;
+XErrorEvent *eev;
+XPointer client_data;
+{
+    TRACE(("xBrokenPipe()\n"));
+
+    if (eev->error_code == BadWindow) {
+	/*
+	 * Search for the connection using window that caused the error.
+	 * Note that we cannot pass the connection via client_data,
+	 * Since the connection might be already destroyed by a previous
+	 * error.
+	 */
+	Window bad_win = (Window)eev->resourceid;
+	IMConnection *conn;
+
+	conn = IMConnectionList((Widget)client_data);
+	while (conn != NULL) {
+	    if (bad_win == conn->transport.priv.x.client) {
+		DPRINT(("BadWindow on connection #%d\n", conn->serial));
+		IMDispatch(conn, TRANSPORT_ERROR);
+		break;
+	    }
+	    conn = conn->next;
+	}
+	return 0;
+    } else {
+	return 1;
+    }
+}
+
+/*- xFlush: output via X inter-client communication mechanism -*/
+static int
+xFlush(conn)
+IMConnection *conn;
+{
+    IMBuffer *ibp = IM_OUTBUF(conn);
+    XClientMessageEvent repl;
+    Widget w = conn->proto_widget;
+    Window client_win = conn->transport.priv.x.client;
+    Display *dpy = XtDisplay(w);
+    int length;
+    XAEHandle handle;
+
+    if ((length = IMBUFLEN(ibp)) == 0) return TRANSPORT_OK;
+
+    repl.type = ClientMessage;
+    repl.window = client_win;
+
+    handle = XAESet(dpy, xBrokenPipe, (void (*)())NULL, (XPointer)w);
+
+    if (IMBUFLEN(ibp) < XTransportDividingSize) {
+	char *data = IMBUFDATA(ibp);
+
+	repl.format = 8;
+	repl.message_type = IMMoreDataAtom(w);
+	while (length > 20) {
+	    bcopy(data, repl.data.b, 20);
+	    XSendEvent(dpy, client_win, False, NoEventMask, (XEvent *)&repl);
+	    data += 20;
+	    length -= 20;
+	}
+	repl.message_type = IMProtocolAtom(w);
+	bzero(repl.data.b, 20);
+	bcopy(data, repl.data.b, length);
+	XSendEvent(dpy, client_win, False, NoEventMask, (XEvent *)&repl);
+    } else {
+	repl.format = 32;
+	repl.message_type = IMProtocolAtom(w);
+	repl.data.l[0] = length;
+	repl.data.l[1] = IMKi2CommAtom(w);
+	XChangeProperty(dpy, client_win, IMKi2CommAtom(w), XA_STRING,
+			8, PropModeAppend,
+			(unsigned char *)IMBUFDATA(ibp), IMBUFLEN(ibp));
+	XSendEvent(dpy, client_win, False, NoEventMask, (XEvent *)&repl);
+    }
+
+    XFlush(dpy);
+    XAEUnset(handle);
+
+    IMBufClear(ibp);
+    return TRANSPORT_OK;
+}
+
+/*- xShutdown: close communication channel by destroying comm. window -*/
+static void
+xShutdown(conn)
+IMConnection *conn;
+{
+    Display *dpy = XtDisplay(conn->proto_widget);
+    MyRemoveAllEventHandler(dpy, conn->transport.priv.x.client);
+    MyRemoveAllEventHandler(dpy, conn->transport.priv.x.server);
+    XDestroyWindow(dpy, conn->transport.priv.x.server);
+}
+#endif /* IM_X_TRANSPORT */
+
+
+/*
+ * Public functions
+ */
+
+#ifdef IM_TCP_TRANSPORT
+int
+IMCreateTCPService(portp)
+int *portp;
+{
+    struct sockaddr_in addr;
+    int optval = 1;
+    int sock;
+
+    TRACE(("IMCreateTCPService(port=%d)\n", *portp));
+
+    if ((sock = socket(PF_INET, SOCK_STREAM, 0)) < 0) {
+	DPRINT(("socket(PF_INET) failed with %d\n", errno));
+	return -1;
+    }
+
+#ifdef SO_REUSEADDR
+    (void)setsockopt(sock, SOL_SOCKET, SO_REUSEADDR,
+		     (char *)&optval, sizeof(optval));
+#endif /* SO_REUSEADDR */
+
+    bzero((char *)&addr, sizeof(addr));
+    addr.sin_family = AF_INET;
+    addr.sin_port = htons(*portp);
+
+    if (bind(sock, (struct sockaddr *)&addr, sizeof(addr)) < 0) {
+	DPRINT(("bind() failed with %d\n", errno));
+	return -1;
+    }
+    if (*portp == 0) {
+	int addr_len = sizeof(addr);
+
+	if (getsockname(sock, (struct sockaddr *)&addr, &addr_len) < 0) {
+	    DPRINT(("getsockname() failed with %d\n", errno));
+	    return -1;
+	}
+	*portp = ntohs(addr.sin_port);
+	TRACE(("\tport=%d\n", *portp));
+    }
+    if (listen(sock, 4) < 0) {
+	DPRINT(("listen() failed with %d\n", errno));
+	return -1;
+    }
+    return sock;
+}
+
+IMConnection *
+IMTCPConnection(protocol, wellknownfd)
+Widget protocol;
+int wellknownfd;
+{
+    IMConnection *conn;
+    int fd;
+    struct sockaddr_in addr;
+    int addrlen = sizeof(addr);
+    XtInputId id;
+
+    TRACE(("IMTCPConnection()\n"));
+
+    if ((fd = accept(wellknownfd, (struct sockaddr *)&addr, &addrlen)) < 0) {
+	DPRINT(("accept() failed with %d\n", errno));
+	return NULL;
+    }
+    conn = newConnection(protocol);
+    conn->transport.ops = &SocketTransportOps;
+    conn->transport.priv.sock.fd = fd;
+    DDPRINT(2, ("new connection #%d: transport=TCP socket=%d\n",
+		conn->serial, fd));
+
+    id = XtAppAddInput(XtWidgetToApplicationContext(protocol), fd,
+		       (XtPointer)XtInputReadMask, socketinput,
+		       (XtPointer)conn);
+    conn->transport.priv.sock.id = id;
+
+    return conn;
+}
+#endif /* IM_TCP_TRANSPORT */
+
+#ifdef IM_UNIX_TRANSPORT
+int
+IMCreateUnixService(path)
+char *path;
+{
+    struct sockaddr_un addr;
+    int sock;
+
+    TRACE(("IMCreateUnixService(%s)\n", path));
+    if ((sock = socket(PF_UNIX, SOCK_STREAM, 0)) < 0) {
+	DPRINT(("socket(PF_UNIX) failed with %d\n", errno));
+	return -1;
+    }
+
+    bzero((char *)&addr, sizeof(addr));
+    addr.sun_family = AF_UNIX;
+    (void)strcpy(addr.sun_path, path);
+
+    /*
+     * Remove socket which is created by the previous process.
+     */
+    (void)unlink(path);
+
+    if (bind(sock, (struct sockaddr *)&addr, strlen(path) + 2) < 0) {
+	DPRINT(("bind() failed with %d\n", errno));
+	return -1;
+    }
+    if (listen(sock, 4) < 0) {
+	DPRINT(("listen() failed with %d\n", errno));
+	return -1;
+    }
+    return sock;
+}
+
+IMConnection *
+IMUnixConnection(protocol, wellknownfd)
+Widget protocol;
+int wellknownfd;
+{
+    IMConnection *conn;
+    int fd;
+    struct sockaddr_un addr;
+    int addrlen = sizeof(addr);
+    XtInputId id;
+
+    TRACE(("IMUnixConnection()\n"));
+
+    if ((fd = accept(wellknownfd, (struct sockaddr *)&addr, &addrlen)) < 0) {
+	DPRINT(("accept() failed with %d\n", errno));
+	return NULL;
+    }
+    conn = newConnection(protocol);
+    conn->transport.ops = &SocketTransportOps;
+    conn->transport.priv.sock.fd = fd;
+    DDPRINT(2, ("new connection #%d: transport=UNIX socket=%d\n",
+		conn->serial, fd));
+
+    id = XtAppAddInput(XtWidgetToApplicationContext(protocol), fd,
+		       (XtPointer)XtInputReadMask, socketinput,
+		       (XtPointer)conn);
+    conn->transport.priv.sock.id = id;
+
+    return conn;
+}
+#endif /* IM_UNIX_TRANSPORT */
+
+#ifdef IM_X_TRANSPORT
+IMConnection *
+IMXConnection(protocol, xev)
+Widget protocol;
+XEvent *xev;
+{
+    XClientMessageEvent *event = (XClientMessageEvent *)xev;
+    XClientMessageEvent repl;
+    Display *dpy = XtDisplay(protocol);
+    Window client_window;
+    IMConnection *conn;
+    XAEHandle h;
+
+    TRACE(("IMXConnection()\n"));
+
+    if (event->type != ClientMessage ||
+	event->display != dpy ||
+	event->window != XtWindow(protocol) ||
+	event->message_type != IMXConnectAtom(protocol) ||
+	event->format != 32) {
+	TRACE(("\tinvalid event\n"));
+#ifdef DEBUG
+	if (event->type != ClientMessage) printf("not ClientMessage\n");
+	if (event->display != dpy) printf("wrong display\n");
+	if (event->window != XtWindow(protocol)) printf("wrong window\n");
+	if (event->message_type != IMXConnectAtom(protocol)) {
+	    printf("wrong message type (%ld should be %ld)\n",
+		   event->message_type, IMXConnectAtom(protocol));
+	}
+	if (event->format != 32) printf("wrong format\n");
+#endif
+	return NULL;
+    }
+    client_window = event->data.l[0];
+    if (!IMValidateWindow(dpy, client_window, (IMWindowProfile *)NULL)) {
+	DPRINT(("client window %08lx does not exist\n", client_window));
+	return NULL;
+    }
+    conn = newConnection(protocol);
+    conn->transport.ops = &XTransportOps;
+    conn->transport.priv.x.client = client_window;
+    conn->transport.priv.x.server = communicationWindow(protocol);
+    DDPRINT(2, ("new connection #%d: transport=X client=%08lx\n",
+		conn->serial, client_window));
+    TRACE(("\ttransport version: %ld.%ld\n",
+	   event->data.l[1], event->data.l[2]));
+
+    repl.type = ClientMessage;
+    repl.window = client_window;
+    repl.message_type = IMXConnectAtom(protocol);
+    repl.format = 32;
+    repl.data.l[0] = conn->transport.priv.x.server;
+    repl.data.l[1] = ServerMajorTransportVersion;
+    repl.data.l[2] = ServerMinorTransportVersion;
+    repl.data.l[3] = XTransportDividingSize;
+    /* make it safe... */
+    h = XAESetIgnoreErrors(dpy);
+    XSendEvent(dpy, client_window, False, NoEventMask, (XEvent *)&repl);
+    MyAddEventHandler(dpy, client_window, DestroyNotify, StructureNotifyMask,
+		      xdestroy, (XtPointer)conn);
+    XAEUnset(h);
+
+    MyAddEventHandler(dpy, conn->transport.priv.x.server,
+		      ClientMessage, NoEventMask, xinput, (XtPointer)conn);
+
+    return conn;
+}
+#endif /* IM_X_TRANSPORT */
+
+int
+IMFlush(conn)
+IMConnection *conn;
+{
+    TRACE(("IMFlush(#%d)\n", conn->serial));
+
+    if (DDEBUG_CONDITION(100)) dumpBuf(IM_OUTBUF(conn), "** output buffer");
+
+    return (*conn->transport.ops->flush)(conn);
+}
+
+void
+IMShutdown(conn)
+IMConnection *conn;
+{
+    TRACE(("IMShutdown(#%d)\n", conn->serial));
+    (*conn->transport.ops->shutdown)(conn);
+}
+
+void
+IMCloseConnection(conn)
+IMConnection *conn;
+{
+    IMIM *imp;
+
+    DDPRINT(2, ("IMCloseConnection(#%d)\n", conn->serial));
+
+    imp = conn->im_list;
+    while (imp != NULL) {
+	IMIM *next = imp->next;
+
+	IMDestroyIM(imp);
+	imp = next;
+    }
+
+    IMBufClear(&conn->in_buf);
+    IMBufClear(&conn->out_buf);
+#ifdef notdef
+    destroyAuth(conn->server_auth);
+    destroyAuth(conn->client_auth);
+#endif
+    IMShutdown(conn);
+
+    IMUnregisterConnection(conn);
+
+    XtFree((char *)conn);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/imlib/imxport.h	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,66 @@
+/* $Id: imxport.h,v 1.3 1994/05/13 08:34:17 ishisone Exp $ */
+/*
+ * Copyright (c) 1994  Software Research Associates, Inc.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted, provided
+ * that the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Software Research Associates not be
+ * used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission.  Software Research
+ * Associates makes no representations about the suitability of this software
+ * for any purpose.  It is provided "as is" without express or implied
+ * warranty.
+ *
+ * Author:  Makoto Ishisone, Software Research Associates, Inc., Japan
+ */
+
+#ifndef _imxport_h
+#define _imxport_h
+
+#include "imprtype.h"
+
+/*
+ * Supported tranport definitions
+ */
+#ifndef NO_UNIX_TRANSPORT
+#define IM_UNIX_TRANSPORT
+#endif
+
+#ifndef NO_TCP_TRANSPORT
+#define IM_TCP_TRANSPORT
+#endif
+
+#ifndef NO_X_TRANSPORT
+#define IM_X_TRANSPORT
+#endif
+
+
+/*
+ * IMTransport -- transport information
+ */
+
+typedef struct _im_connection_ _tmp_IMConnection;
+typedef struct {
+    int (*flush) _Pt_((_tmp_IMConnection *conn));
+    void (*shutdown) _Pt_((_tmp_IMConnection *conn));
+} IMTransportOps;
+
+typedef union {
+    struct {
+	int fd;			/* socket file descriptor */
+	XtInputId id;		/* input ID */
+    } sock;
+    struct {
+	Window server;		/* server communication window */
+	Window client;		/* client window */
+    } x;
+} IMTransportPriv;
+
+typedef struct {
+    IMTransportOps *ops;
+    IMTransportPriv priv;
+} IMTransport;
+
+#endif /* _imxport_h */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/ioecall.c	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,113 @@
+#ifndef lint
+static char *rcsid = "$Id: ioecall.c,v 1.2 1996/09/30 09:19:52 ishisone Exp $";
+#endif
+/*
+ * Copyright (C) 1994  Software Research Associates, Inc.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted, provided
+ * that the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Software Research Associates not be
+ * used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission.  Software Research
+ * Associates makes no representations about the suitability of this software
+ * for any purpose.  It is provided "as is" without express or implied
+ * warranty.
+ *
+ * Author:  Makoto Ishisone, Software Research Associates, Inc., Japan
+ */
+
+/*
+ *	X I/O error callback
+ */
+
+#include <stdio.h>
+#include <X11/Xlib.h>
+#include <X11/Xfuncproto.h>
+#include "IOECall.h"
+
+#ifndef NULL
+#define NULL	0
+#endif
+
+typedef struct ioe_cb_desc_ {
+    void (*callback)();
+    XPointer client_data;
+    struct ioe_cb_desc_ *next;
+} CBDesc;
+
+static CBDesc *cb_list;
+
+static int (*original_handler)();
+
+static int
+XIOEHandler(dpy)
+Display *dpy;
+{
+    CBDesc *cb;
+
+    cb = cb_list;
+    while (cb != NULL) {
+	(*cb->callback)(cb->client_data);
+	cb = cb->next;
+    }
+    return (*original_handler)(dpy);
+}
+
+void
+XIOEInit()
+{
+    int (*oldhandler)() = XSetIOErrorHandler(XIOEHandler);
+
+    if (oldhandler != XIOEHandler) original_handler = oldhandler;
+}
+
+XIOEHandle
+XIOESet(handler, client_data)
+void (*handler)();
+XPointer client_data;
+{
+    CBDesc *cb;
+
+    cb = (CBDesc *)malloc(sizeof(CBDesc));
+    if (cb == NULL) return NULL;
+
+    cb->callback = handler;
+    cb->client_data = client_data;
+    cb->next = NULL;
+
+    if (cb_list == NULL) {
+	cb_list = cb;
+    } else {
+	CBDesc *p = cb_list;
+
+	while (p->next != NULL) p = p->next;
+	p->next = cb;
+    }
+
+    return cb;
+}
+
+void
+XIOEUnset(handle)
+XIOEHandle handle;
+{
+    CBDesc *cb, *cb0;
+
+    cb = cb_list;
+    cb0 = NULL;
+
+    while (cb != NULL) {
+	if (cb == handle) {
+	    if (cb0 == NULL) {
+		cb_list = cb->next;
+	    } else {
+		cb0->next = cb->next;
+	    }
+	    (void)free((char *)cb);
+	    return;
+	}
+	cb = cb->next;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/parsekey.c	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,156 @@
+#ifndef lint
+static char *rcsid = "$Id: parsekey.c,v 1.1 1994/05/16 05:42:30 ishisone Rel $";
+#endif
+/*- 
+ * Copyright (c) 1991, 1994  Software Research Associates, Inc.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted, provided
+ * that the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Software Research Associates not be
+ * used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission.  Software Research
+ * Associates makes no representations about the suitability of this software
+ * for any purpose.  It is provided "as is" without express or implied
+ * warranty.
+ *
+ * Author:  Makoto Ishisone, Software Research Associates, Inc., Japan
+ */
+
+#include <X11/Xos.h>
+#include <X11/IntrinsicP.h>
+#include "ParseKey.h"
+
+/*- parseModifiers: parse modifier list -*/
+static void
+parseModifiers(s, modp, chkmodp)
+String s;
+long *modp;		/* RETURN: modifiers which must be set */
+long *chkmodp;		/* RETURN: modifiers to be checked */
+{
+    String p;
+    int i;
+    int c;
+    static struct _moddesc_ {
+	String modname;		/* modifier name */
+	long modmask;		/* modifier mask */
+    } mods[] = {
+	{ "Shift",	ShiftMask },
+	{ "Lock",	LockMask },
+	{ "Ctrl",	ControlMask },
+	{ "Meta",	Mod1Mask },
+	{ "Alt",	Mod1Mask },
+	{ "Mod1",	Mod1Mask },
+	{ "Mod2",	Mod2Mask },
+	{ "Mod3",	Mod3Mask },
+	{ "Mod4",	Mod4Mask },
+	{ "c",		ControlMask },
+	{ "s",		ShiftMask },
+	{ "l",		LockMask },
+	{ "m",		Mod1Mask },
+	{ "a",		Mod1Mask },
+    };
+
+    *modp = *chkmodp = 0L;
+
+#define SKIPBLANK \
+    while ((c = *s) == ' ' || c == '\t' || c == '\n') s++; \
+    if (c == '\0') return;
+#define SEARCHBLANK \
+    p = s; while ((c = *p) != '\0' && c != ' ' && c != '\t' && c != '\n') p++;
+
+    while (*s != '\0') {
+	int tilde = 0;
+
+	SKIPBLANK;
+	if (c == '~') {
+	    tilde = 1;
+	    s++;
+	    SKIPBLANK;
+	}
+	SEARCHBLANK;
+	*p = '\0';
+	for (i = 0; i < XtNumber(mods); i++) {
+	    if (!strcmp(s, mods[i].modname)) {
+		*chkmodp |= mods[i].modmask;
+		if (!tilde) *modp |= mods[i].modmask;
+		break;
+	    }
+	}
+	if (c == '\0') break;
+	s = p + 1;
+    }
+#undef SKIPBLANK
+#undef SEARCHBLANK
+}
+
+/*- mystrstr: not-so-good implementaion of ANSI strstr() -*/
+static char *
+mystrstr(s1, s2)
+char *s1;
+char *s2;
+{
+    register char *p, *q;
+
+    while (*(p = s1++) != '\0') {
+	q = s2;
+	do {
+	    if (*q == '\0') return s1 - 1;
+	} while (*p++ == *q++);
+    }
+    return NULL;
+}
+
+
+/*
+ * Public function
+ */
+
+int
+ParseKeyEvent(s, keysymp, modp, chkmodp)
+String s;		/* IN: keyevent description */
+KeySym *keysymp;	/* OUT: keysym */
+long *modp;		/* OUT: mask of modifiers which must be pressed */
+long *chkmodp;		/* OUT: mask of modifiers of interest */
+{
+    String key;
+    String p;
+    KeySym keysym;
+
+    /*
+     * keyevent description (stored in  argument 's') must be of the
+     * following format (subset of Xt translation table syntax):
+     *		modifier-list<Key>keysym
+     * modifier-list is a combination of:
+     *		Ctrl, Shift, Lock, Meta, Alt, Mod1, Mod2, Mod3, Mod4, Mod5
+     * if '~' is prepended before a modifier, it means the modifier key should
+     * not be pressed.
+     */
+
+    /* find "<Key>" */
+    if ((p = mystrstr(s, "<Key>")) != NULL) {
+	key = p + 5;	/* p + strlen("<Key>") */
+    } else if ((p = mystrstr(s, "<KeyPress>")) != NULL) {
+	key = p + 10;	/* p + strlen("<KeyPress>") */
+    } else if ((p = mystrstr(s, "<KeyDown>")) != NULL) {
+	key = p + 9;	/* p + strlen("<KeyDown>") */
+    } else {
+	return 0;
+    }
+    *p = '\0';
+    while (*key == ' ' || *key == '\t') key++;
+    p = key;
+    while (*p != '\0' && *p != ' ' && *p != '\t') p++;
+    *p = '\0';
+
+    /* get modifier mask */
+    parseModifiers(s, modp, chkmodp);
+
+    /* get keycode */
+    if ((keysym = XStringToKeysym(key)) == NoSymbol) return 0;
+
+    *keysymp = keysym;
+
+    return 1;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/wnnlib.c	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,3695 @@
+/*
+ *	wnnlib -- $B$+$J4A;zJQ49MQ%i%$%V%i%j(B (jllib $BBP1~HG(B)
+ *
+ *	$B$3$N%i%$%V%i%j$O!"(Bkinput V2 $B$KIUB0$7$F$$$?!"(BSRA $B$N@PA>:,$5$s$N(B
+ *	jclib 5.2 $B$r%Y!<%9$K:n@.$7$^$7$?!#(B
+ *
+ *                                                        $B?9It(B $B1QG7(B
+ */
+
+/*
+ * Copyright (c) 1989  Software Research Associates, Inc.
+ * Copyright (c) 1998  MORIBE, Hideyuki
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted, provided
+ * that the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Software Research Associates not be
+ * used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission.  Software Research
+ * Associates makes no representations about the suitability of this software
+ * for any purpose.  It is provided "as is" without express or implied
+ * warranty.
+ *
+ * Author:  Makoto Ishisone, Software Research Associates, Inc., Japan
+ *		ishisone@sra.co.jp
+ *          MORIBE, Hideyuki
+ */
+
+/*
+ * Portability issue:
+ *
+ *	+ define SYSV, SVR4 or USG if you don't have bcopy() or bzero().
+ *
+ *	  if you define USG (which should be defined if your OS is based
+ *	  on System V Rel 2) or SYSV (in case of System V Rel 3),
+ *	  memchr() is used for bzero(), and my own version of bcopy()
+ *	  is used in order to handle overlapping regions.
+ *
+ *	  if you define SVR4 (yes, System V Rel4), memmove() is used for
+ *	  bcopy(), and memchr() is used for bzero().
+ *
+ *	+ wnnlib assumes bcopy() can handle overlapping data blocks.
+ *	  If your bcopy() can't, you should define OVERLAP_BCOPY,
+ *	  which force to use my own bcopy() rather than the one
+ *	  in libc.a.
+ */
+
+/*
+ * $B35MW(B
+ *
+ * wnnlib $B$O(B Wnn6 $B$K$bBP1~$7$?(B kinput $B$N(B CcWnn $B%*%V%8%'%/%H8~$1$N9b%l%Y%k(B
+ * $B$+$J4A;zJQ49%i%$%V%i%j$G$"$k!#(B
+ *
+ * $B=>Mh$N(B Kinput $B$K$*$$$F$O!"(BWnn $B$H$N%$%s%?%U%'!<%9$O!"(Bjslib $B%Y!<%9$N(B
+ * jilib $B$H(B jclib $B$G$"$C$?!#$H$3$m$,!"(BWnn6 $B$G3HD%$5$l$?5!G=$r;HMQ$7$?$/$F(B
+ * $B$b!"(Bjslib $B%l%Y%k$N;EMM$,$[$H$s$IH=$i$J$+$C$?!#$3$N$?$a!"(Bmule $B$N(B egg $B%$(B
+ * $B%s%?%U%'!<%9$G;HMQ$7$F$$$k(B jllib $B$rMQ$$$F!"=>Mh$N(B jilib $B$H(B jclib $B$N%$(B
+ * $B%s%?%U%'!<%9$r$G$-$k$@$1JQ99$7$J$$$h$&$K$7$F!"?7$?$K(B wnnlib $B$H$7$F=q$-(B
+ * $B49$($?!#(B
+ *
+ * wnnlib $B$O!"(BWnn6 $B$@$1$G$J$/!"$=$l0JA0$N(B Wnn4 $B$K$bBP1~$7$F$$$k$O$:$G(B
+ * $B$"$k$,%F%9%H$O$7$F$$$J$$!#(B
+ *
+ * wnnlib $B$O!"=>Mh$N(B jclib $B$HF1MM$K!"$+$J%P%C%U%!$HI=<(%P%C%U%!$H$$$&#2$D(B
+ * $B$N%P%C%U%!$r;}$D!#$+$J%P%C%U%!$K$OFI$_J8;zNs$,F~$j!"I=<(%P%C%U%!$K$OJQ(B
+ * $B497k2L(B($BI=<(J8;zNs(B)$B$,F~$k!#$+$J%P%C%U%!$H8@$&8F$SJ}$O$"$^$j@53N$G$O$J$$!#(B
+ * Wnn Version 4 $B0J9_$G$O4A;z$+$JJQ49$b$G$-$k$+$i$G$"$k!#(B
+ *
+ * $B%I%C%H$H%+%l%s%HJ8@a$H$$$&35G0$r;}$A!"J8;z$NA^F~(B / $B:o=|$O%I%C%H$N0LCV$K(B
+ * $BBP$7$F9T$J$o$l!"JQ49$=$NB>$NA`:n$O%+%l%s%HJ8@a$KBP$7$F9T$J$o$l$k!#(B
+ * Wnn Version 4 $B0J9_$G$OBgJ8@a$H>.J8@a$H$$$&#2<oN`$NJ8@a$N35G0$,$"$k$,!"(B
+ * $B$=$l$KBP1~$7$F(B wnnlib $B$bEvA3$3$N#2<oN`$r07$&$3$H$,$G$-$k!#(B
+ *
+ * $B$3$N%i%$%V%i%j$O<!$N$h$&$J5!G=$rDs6!$9$k!#(B
+ *	$B!&$+$J%P%C%U%!$X$NJ8;z$NA^F~(B / $B:o=|(B
+ *	$B!&$+$J4A;zJQ49(B / $B:FJQ49(B / $BL5JQ49(B
+ *	$B!&$R$i$,$J"N%+%?%+%JJQ49(B
+ *	$B!&3NDj(B
+ *	$B!&J8@a$N3HBg(B / $B=L>.(B
+ *	$B!&%+%l%s%HJ8@a(B / $B%I%C%H$N0\F0(B
+ *	$B!&<!8uJd(B/$BA08uJdCV$-49$((B
+ *	$B!&8uJd<h$j=P$7(B / $BA*Br(B
+ *	$B!&%P%C%U%!$N%/%j%"(B
+ *
+ * $BJ8;z%3!<%I$H$7$F$O(B Wnn $B$HF1$8$/(B EUC $BFbIt%3!<%I(B (process code) $B$r;HMQ$9$k!#(B
+ */
+
+/*
+ * Wnn Version 6 (FI Wnn) $BBP1~$K$"$?$C$F(B
+ *
+ * $B=>Mh$N(B Kinput2 $B$G$O!"(BWnn $B$H$N%$%s%?!<%U%'!<%9$O!"(Bjslib $B$r%Y!<%9$K(B
+ * $B$7$?(Bjilib $B$H(B jclib $B$G!"$b$H$b$H(B Wnn Version 3 $B$N(B libjd $B$N>e$K:n$i(B
+ * $B$l$?%i%$%V%i%j$G$"$k!#(B
+ *
+ * Wnn Version 6 $BBP1~$K$"$?$C$F!"(Bjslib $B%l%Y%k$NDI2C5!G=$d>\:Y%$%s%?%U%'!<(B
+ * $B%9$,H=$i$J$+$C$?$?$a!"(Bjslib $B$NBe$o$j$K(B mule $B$N(B egg $B%$%s%?%U%'!<%9$G;H(B
+ * $BMQ$5$l$F$$$k(B jllib $B$r%Y!<%9$K$7$F!"(Bjilib $B$H(B jclib $B$r?7$?$K(B wnnlib $B$H$7(B
+ * $B$F=q$-49$($k$3$H$K$7$?!#=q$-49$($O!"0J2<$NJ}?K$G9T$C$?!#(B
+ *
+ * 1. $B%G!<%?9=B$!"%$%s%?%U%'!<%9(B ($B4X?tL>$dJQ?tL>$b(B) $B$r$J$k$Y$/=>Mh$N(B
+ * jclib$B$HF1$8$K$9$k!#(B
+ *
+ * 2. $B$+$J%P%C%U%!$HI=<(%P%C%U%!$NFs$D$NJ8;z%P%C%U%!$r;}$A!"(B
+ * $B$+$J%P%C%U%!$K$OFI$_!"I=<(%P%C%U%!$K$OJQ497k2L$,F~$k$H$+(B
+ * $BMM!9$JA`:n$O%+%l%s%HJ8@a$H8F$P$l$kJ8@a$KBP$7$F9T$J$o$l$k$H$+$$$C$?(B
+ * $B4pK\E*$J%3%s%;%W%H$OJQ$($J$$!#(B
+ *
+ * 3. $B=>Mh$N%i%$%V%i%j$r;H$C$?%"%W%j%1!<%7%g%s$,?7$7$$%i%$%V%i%j$K(B
+ * $B0\9T$7$d$9$$$h$&$K!"4X?t%$%s%?!<%U%'%$%9$b$G$-$k$@$1;w$?$b$N$K$9$k!#(B
+ *
+ * 4. 1,2,3 $B$NJ}?K$r$G$-$k$@$1<i$j$D$D!"(BWnn6 $B$GF3F~$5$l$?<!$N$h$&$J(B
+ * $B5!G=$r%5%]!<%H$9$k!#(B
+ *	$B!&(BFI $BJQ49(B/$B3X=,(B
+ *	$B!&L5JQ493X=,(B
+ *
+ * 5. 1 $B$+$i(B 4 $B$^$G$NJ}?K$K=>$$$D$D!"%/%$%C%/!&%O%C%/$9$k!#(B
+ */
+
+/*
+ * $B%a%b(B ($BCm(B: $B:G=i$NItJ,$O!"@PA>:,$5$s$N(B jclib $B:n@.%a%b(B)
+ *
+ * ver 0.0	89/07/21
+ *	$B$H$j$"$($::n$j$O$8$a$k(B
+ * ver 0.1	89/08/02
+ *	$BH>J,$/$i$$$+$1$?(B
+ *	$B<!8uJd4XO"$,$^$@$G$-$F$$$J$$(B
+ * ver 0.2	89/08/04
+ *	jcInsertChar() / jcDeleteChar() $B$r:n@.(B
+ * ver 0.3	89/08/07
+ *	$B0l1~$G$-$?(B
+ *	$B$^$@$$$/$D$+5?LdE@$,$"$k$1$l$I(B
+ * ver 0.4	89/08/08
+ *	$B:#;H$C$?$h%S%C%H$N07$$$r;D$7$F!"$[$\$G$-$?$N$G$O$J$$$+$H(B
+ *	$B;W$o$l$k(B
+ *	$B:Y$+$$%P%0$r$+$J$j=$@5(B
+ * ver 0.5	89/08/09
+ *	$BN)LZ$5$s(B@KABA $B$K<ALd$7$?=j!":#;H$C$?$h%S%C%H$rMn$9$N$b(B
+ *	$B%/%i%$%"%s%HB&$N@UG$$G$"$k$3$H$,$o$+$k(B
+ *	$B$3$l$X$NBP1~(B
+ *	$B$D$$$G$K%G!<%?9=B$$N@bL@$rDI2C(B
+ *	$B%U%!%$%k$N%5%$%:$,(B 80KB $B$r1[$($F$7$^$C$?(B
+ *	$B%3%a%s%H$r$H$l$P$+$J$j>.$5$/$J$k$s$@$1$I(B
+ * ver 0.6	89/08/22
+ *	jcDeleteChar() $B$rA4LLE*$K=q$-D>$9(B
+ *	$B$3$l$G0l1~@5$7$/F0:n$9$k$h$&$K$J$C$?(B
+ *	jcInsertChar() $B$G:G8e$N(B clauseInfo $B$N@_Dj$,4V0c$C$F$$$?$N$G(B
+ *	$B$=$l$r=$@5(B
+ *	jcPrintDetail() $B$K4JC1$J(B clauseInfo $B%G!<%?$N(B consistency check $B$r(B
+ *	$BF~$l$k(B
+ * ver 0.7	89/08/26
+ *	jcExpand() $B$N%P%0=$@5(B
+ *	$B>.J8@a$NC1J8@aJQ49$r>/$7=$@5(B
+ * ver 0.8	89/08/30
+ *	changecinfo() $B$G(B conv $B%U%i%0$r%;%C%H$9$k$N$rK:$l$F$$$?(B
+ *	moveKBuf()/moveDBuf()/moveCInfo() $B$r>/$7=$@5(B
+ *	SYSV $B$,(B define $B$5$l$F$$$l$P(B bcopy()/bzero() $B$NBe$o$j$K(B
+ *	memcpy()/memset() $B$r;H$&$h$&$K=$@5(B
+ * ver 0.9	89/09/22
+ *	setLCandData() $B$G<!8uJd%P%C%U%!$N8uJd?t$K%+%l%s%HBgJ8@a$N(B
+ *	$BJ,$r2C$($k$N$rK:$l$F$$$?(B
+ * ver 0.10	89/10/16
+ *	wnn-4.0.1 $B$G(B commonheader.h -> commonhd.h $B$K$J$C$?$N$G(B
+ *	$B$=$l$N=$@5(B
+ * ver 0.11	89/10/18
+ *	USG $B$,(B define $B$5$l$F$$$F$b(B memcpy()/memset() $B$r;H$&$h$&$K=$@5(B
+ * ver 0.12	89/10/19
+ *	resizeBuffer() $B$G%I%C%H$N:F@_Dj$rK:$l$F$$$k$H$$$&=EBg$J%P%0$r=$@5(B
+ * ver 4.0	89/10/27
+ *	$B%P!<%8%g%sHV9f$r=$@5$7$F(B 4.0 $B$K$9$k!#(B
+ * --- kinput $B$r(B R4 $B$K(B contribute ---
+ * ver 4.1	90/06/04
+ *	$B%/%i%$%"%s%HB&$K$"$k<-=q!&IQEY%U%!%$%k$N%;!<%V$,$G$-$J$$$H$$$&(B
+ *	$B=EBg$J%P%0$r=$@5(B
+ * ver 4.2	90/06/15
+ *	$B<-=q$,EPO?2DG=$+$I$&$+$NH=Dj$,4V0c$C$F$$$F!"5UJQ492DG=<-=q$N(B
+ *	$B%;!<%V$,$G$-$J$$$H$$$&$^$?$^$?=EBg$J%P%0$r=$@5(B
+ *	$B:#$N$H$3$m(B kinput/wterm $B$H$bC18lEPO?5!G=$,$D$$$F$J$$$N$G(B
+ *	$B<B32$O$J$+$C$?$,(B
+ * ver 4.3	91/08/15
+ *	$BJ8;z%G!<%?7?$H$7$F(B wchar_t $B$G$O$J$/!"(Bwchar $B$r;H$&$h$&$K$9$k(B
+ *	$B:G=*E*$K$O(B Wnn $B$N<!4|%P!<%8%g%s$N7?$K9g$o$;$k$D$b$j(B
+ * ver 4.4	91/09/18
+ *	SYSV $B$^$?$O(B USG $B$,Dj5A$5$l$F$$$k>l9g$K$O<+F0E*$K(B OVERLAP_BCOPY
+ *	$B$bDj5A$9$k$h$&$K$7$?(B
+ *	SVR4 $B$,Dj5A$5$l$F$$$k>l9g$K$O(B bcopy $B$NBe$o$j$K(B memmove() $B$r;HMQ(B
+ *	$B$9$k$h$&$K$7$?(B
+ * ver 4.5	91/09/23
+ *	DEBUG $B$r(B DEBUG_JCLIB $B$KJQ99(B
+ * ver 5.0	91/10/01
+ *	kinput2 $B%j%j!<%98~$1$K%P!<%8%g%sHV9f$r=$@5$7$F(B 5.0 $B$K$9$k!#(B
+ * --- kinput2 $B$r(B R5 $B$K(B contribute ---
+ * ver 5.1	92/02/07
+ *	John Yates $B$5$s(B (yates@bldrsoft.com) $B$+$i(B getLCandDataLen() $B$G(B
+ *	$BJ8;z?t$r?t$(4V0c$($F$$$?$N$r;XE&$5$l$?$N$G$=$l$N=$@5(B
+ * ver 5.2	92/12/24
+ *	jcInsertChar() $B$G%G!<%?$N=i4|2=$r$7$F$$$J$+$C$?ItJ,$,$"$C$?(B
+ *	$B$N$G=$@5(B ($BCM$,BeF~$5$l$k$^$G;HMQ$5$l$J$$$N$G%P%0$G$O$J$$$N$@$,(B
+ *	$B$A$g$C$H5$;}$A$o$k$$$N$G(B)
+ *
+ * ---  wnnlib $B:n@.%a%b(B ---
+ *
+ * ver 0.1	98/03/12
+ *	$B$H$j$"$($:!"(Bjllib $B%$%s%?%U%'!<%9$K=q49$($r;O$a$k!#(B
+ * ver 0.2	98/03/16
+ *	$B$^$@$$$/$D$+7|G0;v9`$O$"$k$b$N$N!"4pK\E*$J=q49$($,=*$o$C$?$N$G!"(B
+ *	$B%G%P%C%0$r;O$a$k!#$=$l$J$j$K!"F0$$$F$$$kMM;R!#(B
+ * ver 0.3	98/03/18
+ *	$B$$$/$+%P%0$,8+$D$+$C$?(B ($B%3%"!&%@%s%W$7$?(B) $B$N$G!"$=$l$i$r=$@5!#(B
+ *	$B$^$@!"(BWnn6 $B$N5!G=$,M-8z$K$J$C$F$$$k$+NI$/$o$+$i$J$$!#(B
+ * ver 0.4	98/07/01
+ *	$B0JA0$+$i5$$K$J$C$F$$$?%k!<%W$K4Y$k8=>]$N860x$,$d$C$HH=$C$?!#(B
+ *	$B860x$O!"JQ49$N(B cancel $B$N1dD9$G8F$P$l$k(B expandOrShrink $B$NCf$G!"(B
+ *	$BL5JQ49;XDj$N;~$G$b(B ltop ($BBgJ8@a(B) $B%U%i%C%0$r%j%;%C%H$7$F$$$J$+$C(B
+ *	$B$?$?$a$G!"$=$l$r=$@5$7$?!#(B
+ * ver 0.5	98/10/15
+ *	$B:G8e$N=$@5$+$iLs(B 3 $B%v7n4V!";HMQ$7$?$,FC$KLdBj$,$J$+$C$?$N$G!"(B
+ *	kinput2-fix5 $B$N(B alpha $BHG$,$G$?$N$r5!2q$K!"(Bkinput2 $B%a!<%j%s%0!&(B
+ *      $B%j%9%H$XEj9F!#(B
+ * ver 0.6	98/12/03
+ *	$B@PA>:,$5$s$h$j!"J8@a3HBg$N$G$N%P%0$NJs9p$,$"$C$?$N$G(B (kinput2
+ *      $B%a!<%j%s%0!&%j%9%H(B 2106 $B!A(B 2118 $B;2>H(B)$B!"$=$l$r=$@5!#(B
+ *
+ * --- kinput2-fix-alpha2 $B$K<h$j9~$^$l$k(B ---
+ *
+ * ver 0.7	98/12/23
+ *	doKantanSCConvert() $B$G>.J8@a$H$7$FC1J8@aJQ49$7$J$1$l$P$$$1$J$$(B
+ *	$B$H$3$m$r!"BgJ8@a$H$7$FJQ49$7$F$$$?%P%0$r=$@5!#(B
+ *
+ * ver 0.8	99/01/06
+ *	kinput2-fix5-alpha4 $B$,$G$?$N$r5!2q$K!"%I%C%H0J9_$r:o=|$9$kJT=8(B
+ *	$B5!G=(B (kill-line) $B$r<B8=$9$k(B jcKillLine() $B$rDI2C$9$k(B ($B<B$O!"(Bwnnlib
+ *	$B:n@.;~$+$i<B8=$7$h$&$H;W$C$F$$$F!"%@%_!<4X?t$@$1$O(B wnnlib $B$KB8(B
+ *	$B:_$7$F$$$?(B)$B!#$3$l$N%G%P%C%0Cf$K!">e$N(B ver 0.4 $B$G=$@5$7$?$O$:$N(B
+ *	$B%P%0$,:F8=!#(B
+ *
+ * ver 0.9	99/01/18
+ *	$B$d$O$j!"(Bcancel $B$N1dD9$N=hM}$,$&$^$/$J$$$3$H$,H=L@!#$D$^$j!"J8(B
+ *	$B@a3HBg$K$h$k(B cancel $B=hM}$G$O!"J8@a>pJs$,(B CcWnn $B$,4|BT$9$k$b$N(B
+ *	$B$H0[$C$F$$$k$?$a(B ($B$3$l$,!"(Bjclib $B$H(B wnnlib $B$N0c$$(B)$B!"8mF0:n$r$7(B
+ *	$B$?!#$3$N$?$a!"FHN)$7$?(B cancel $B=hM}$r(B jcCancel() $B%U%!%s%/%7%g%s(B
+ *	$B$H$7$F<B8=$9$k$3$H$K$7$?!#$G$b!"(Bexpand-noconv $B$d(B shrink-noconv
+ *	$B$J$I$G$OF1MM$NLdBj$,B8:_$9$k$N$G!"(Bjclib $B$H$N8_49$rJ]$D0UL#$G!"(B
+ *	expandOrShrink $B$NCf$GFCJL07$$$9$k$3$H$K$7$?(B ($B;H$&?M$O!"$$$J$$(B
+ *	$B$H;W$&$,!#(Bdoc/ccdef $B;2>H(B)$B!#(B
+ *	$B$^$?!"(BgetHint() $B$H(B forceStudy() $B$N=hM}$r<c43$N8+D>$7$?!#(B
+ *
+ * ver 0.99	99/03/05
+ *	$BA02s$N(B getHint() $B$N=hM}$NI{:nMQ$G!"(BsetCandiate() $B$G<!8uJd<h$j=P$7(B
+ *	$B8e$NBgJ8@a>pJs$NJQ99J}K!$K$"$C$?@x:_%P%0$r=$@5!#(B
+ *
+ * ver ?.??	99/03/29				ishisone
+ *	$BA0$K<h$j=P$7$?8uJd0lMw$r:FMxMQ$9$k$+$I$&$+$NH=Dj$rJQ99!#(B
+ *	$B:FMxMQ$N>r7o$r$-$D$/$9$k!#$^$?(B Wnn4 $B$N(B jl $B%i%$%V%i%j$NIT6q9g(B
+ *	($B;EMM$+$b(B) $B$N2sHr:v$NAH$_9~$_!#(B
+ *
+ * ver ?.??	99/04/12				ishisone
+ *	jcOpen() $B$K2C$($F(B jcOpen2() $B$r<BAu!#$3$l$O(B Wnn4 $B$H(B Wnn6 $B$=$l$>$l$N(B
+ *	$B=i4|2=%U%!%$%k$r;XDj$9$k$3$H$,$G$-!"<B:]$K@\B3$7$?%5!<%P$N(B
+ *	$B%P!<%8%g%s$r%A%'%C%/$7$F!"$I$A$i$r;HMQ$9$k$+7h$a$k$H$$$&$b$N!#(B
+ *
+ * ver ?.??	99/05/07				ishisone
+ *	$B!VL5NLBg?t!WLdBj$N2sHr:v$N<BAu!#$H$O$$$C$F$bJ8@a?-=L$N:]$N(B
+ *	$BA0J8@a$H$N@\B3$r$d$a$k$@$1!#!VL5NLBg?t!WLdBj$K$D$$$F$O(B
+ *	expandOrShrink() $B$N%3%a%s%H;2>H!#(B
+ *
+ * ver ?.??	99/05/25				ishisone
+ *	config.h $B$r%$%s%/%k!<%I$7$J$$$h$&$K$9$k!#I,MW$J$N$O(B LIBDIR $B$@$1(B
+ *	$B$@$7!"(Bconfig.h $B$N(B LIBDIR $B$NCM$,@5$7$$$H$$$&J]>Z$b$J$$$?$a!#(B
+ *	/usr/local/lib/wnn $B$K7h$a$&$A!#(B($B%*!<%P!<%i%$%I$9$k$3$H$O$G$-$k(B)
+ *
+ * --- kinput2 version 3.0 $B%j%j!<%9(B ---
+ *
+ * ver ?.??	01/01/10
+ *	Wnn7 $BBP1~!#$H$O$$$C$F$b:G>.8B$NBP1~$G!"(BWnn7 $B$N?7$7$$5!G=$r(B
+ *	$BMxMQ$G$-$k$o$1$G$O$J$$!#(B
+ *	$B;HMQ$5$l$F$$$J$$JQ?t$r:o=|!#(B
+ */
+
+/*
+ * $B%U%!%s%/%7%g%s(B
+ *
+ * struct wnn_buf jcOpen(char *servername, char *envname,
+ *			 char *rcfilename, int override,
+ *			 void (*errmsgfunc)(), int (*confirmfunc)(),
+ *			 int timeout)
+ *	jl_open $B$"$k$$$O(B jl_open_lang $B$KBP1~$7$?(B wnnlib $B$N%$%s%?%U%'!<(B
+ *	$B%9$G!"$3$N4X?t$NCf$G<B:]$K(B jl_open $B$"$k$$$O(B jl_open_lang $B$r8F(B
+ * 	$B$S=P$9!#(Boverride $B$,(B True $B$N>l9g!"4{$K4D6-$,%5!<%PB&$K$"$C$F$b!"(B
+ *	$B4D6-$r:F=i4|2=$9$k!#(B
+ *
+ * int jcClose(struct wnn_buf *wnnbuf)
+ *	jl_close $B$r8F$S=P$7!"(BjcOpen $B$G3MF@$7$?(B wnnbuf $B$N2rJ|$H%5!<%P$H(B
+ *	$B$N@\B3$r@Z$k!#(B
+ *
+ * int jcIsConnect(struct wnn_buf *wnnbuf)
+ *	$B%5!<%P$H$N@\B3>uBV$r(B jl_isconnect $B$GD4$Y$k!#(Bwnnbuf $B$,(B NULL$B!"(B
+ *	$B4D6-$,:n@.$5$l$F$$$J$$!"$"$k$$$O%5!<%P$H@\B3$5$l$F$$$J$$>l9g$K$O(B 0$B!#(B
+ *	wnnbuf $B$,%5!<%P$H@\B3$5$l$F$$$l$P!"(B1 $B$rJV$9!#(B
+ *
+ * jcConvBuf *jcCreateBuffer(struct wnn_env *env, int nclause, int buffersize)
+ *	$B;XDj$5$l$?4D6-$r;H$C$FJQ49$N%P%C%U%!$r:n@.$9$k!#%P%C%U%!$O(B
+ *	$BJ#?t:n$k$3$H$,$G$-$k!#0l$D$N%P%C%U%!$G$OF1;~$KJ#?t$NJ8$r(B
+ *	$BJQ49$9$k$3$H$O$G$-$J$$$N$G!"J#?t$NJ8$rJB9T$7$FJQ49$7$?$$>l9g$K$O(B
+ *	$B4v$D$+$N%P%C%U%!$rMQ0U$7$J$/$F$O$J$i$J$$!#(B
+ *	$B4D6-$N@_Dj$^$G$rM=$a$d$C$F$*$/I,MW$,$"$k!#$D$^$j%5!<%P$H$N@\B3!"(B
+ *	$B4D6-$N@8@.!"<-=q$N@_Dj$J$I$O(B jcOpen $B$G9T$C$F$*$/I,MW$,$"$k!#(B
+ *	$B0z?t$N(B nclause $B$H(B buffersize $B$G!"$=$l$>$l=i4|2=;~$K%"%m%1!<%H$9$k(B
+ *	$BJ8@a>pJs$*$h$S$+$J(B/$BI=<(%P%C%U%!$NBg$-$5$,;XDj$G$-$k!#(B
+ *	$B$?$@$7$3$l$i$O!"%5%$%:$,B-$j$J$/$J$l$PI,MW$K1~$8$F<+F0E*$K(B
+ *	$BA}$d$5$l$k$?$a!"$3$3$K;XDj$7$?0J>e$N?t$NJ8@a$d!"J8;zNs$,JQ49$G$-$J$$(B
+ *	$B$o$1$G$O$J$$!#$=$l$>$l(B 0 $B$^$?$OIi$NCM$r;XDj$9$k$H!"%G%U%)%k%H$N(B
+ *	$B%5%$%:$G%"%m%1!<%H$5$l$k!#=>$C$FDL>o$O(B nclause/buffersize $B$H$b(B
+ *	0 $B$r;XDj$7$F$*$1$P$h$$!#(B
+ *	$B%j%?!<%s%P%j%e!<$H$7$F%P%C%U%!$rJV$9!#%(%i!<$N;~$K$O(B NULL $B$,(B
+ *	$BJV$5$l$k!#(B
+ *
+ * int jcDestroyBuffer(jcConvBuf *buf, int savedic)
+ *	$B%P%C%U%!$N;HMQ$r=*N;$9$k!#4D6-$r>C$7$?$j!"%5!<%P$H$N@\B3$r@Z$C$?$j(B
+ *	$B$9$k$3$H$O!"(BjcClose $B$G9T$&!#(B
+ *	$B0z?t(B savedic $B$,(B 0 $B$G$J$1$l$P!"4D6-Cf$G;HMQ$5$l$F$$$kA4$F$N<-=q$r(B
+ *	$B%;!<%V$9$k!#(B
+ *
+ * int jcClear(jcConvBuf *buf)
+ *	$B%P%C%U%!$r%/%j%"$9$k!#?7$?$KJQ49$r;O$a$k:]$K$O:G=i$K$3$N(B
+ *	$B%U%!%s%/%7%g%s$r8F$P$J$1$l$P$J$i$J$$!#(B
+ *
+ * int jcInsertChar(jcConvBuf *buf, int c)
+ *	$B%I%C%H$K#1J8;zA^F~$9$k!#(B
+ *	$B%+%l%s%HJ8@a$,4{$KJQ49$5$l$F$$$l$PL5JQ49$N>uBV$KLa$k!#(B
+ *	$B%+%l%s%HJ8@a$OBgJ8@a$G$"$k!#(B
+ *
+ * int jcDeleteChar(jcConvBuf *buf, int prev)
+ *	$B%I%C%H$NA0Kt$O8e$m$N#1J8;z$r:o=|$9$k!#(B
+ *	$B%+%l%s%HJ8@a$,4{$KJQ49$5$l$F$$$l$PL5JQ49$N>uBV$KLa$k!#(B
+ *	$B%+%l%s%HJ8@a$OBgJ8@a$G$"$k!#(B
+ *
+ * int jcConvert(jcConvBuf *buf, int small, int tan, int jump)
+ *	$B%+%l%s%HJ8@a$+$i8e$m$rJQ49$9$k!#(B
+ *	$B0z?t(B tan $B$,(B 0 $B$J$iO"J8@aJQ49!"$=$&$G$J$1$l$P%+%l%s%HJ8@a$r(B
+ *	$BC1J8@aJQ49$7!"$=$N$"$H$rO"J8@aJQ49$9$k!#(B
+ *	$B0z?t(B small $B$,(B 0 $B$G$J$1$l$P>.J8@a$,!"$=$&$G$J$1$l$PBgJ8@a$,(B
+ *	$B%+%l%s%HJ8@a$H$7$F;H$o$l$k!#(B
+ *	$B0z?t(B jump $B$G!"JQ498e$N%+%l%s%HJ8@a$N0LCV$,7h$^$k!#(Bjump $B$,(B
+ *	0 $B$J$i%+%l%s%HJ8@a$N0LCV$OJQ49$7$F$bJQ$o$i$J$$(B ($B$?$@$7(B
+ *	$B%+%l%s%HJ8@a$H$7$FBgJ8@a$r;XDj$7$?>l9g!"JQ498e$N%+%l%s%H(B
+ *	$B>.J8@a$O%+%l%s%HBgJ8@a$N:G=i$N>.J8@a$K$J$k(B) $B$,!"(B0 $B$G$J$1$l$P(B
+ *	$B:G8e$NJ8@a$N<!(B ($B6uJ8@a(B) $B$K0\F0$9$k!#C`<!JQ49$7$F$$$/$h$&$J(B
+ *	$B%"%W%j%1!<%7%g%s$G$O$3$l$r(B 1 $B$K$9$k$H$h$$$@$m$&!#(B
+ *
+ * int jcUnconvert(jcConvBuf *buf)
+ *	$B%+%l%s%HBgJ8@a$rL5JQ49$N>uBV$KLa$9!#(B
+ *	$B%+%l%s%HBgJ8@a$,$$$/$D$+$N>.J8@a$+$i$G$-$F$$$?>l9g!"$3$l$i$N(B
+ *	$B>.J8@a$O$^$H$a$i$l!"0l$D$NL5JQ49>uBV$NJ8@a$K$J$k!#(B
+ *	$B%+%l%s%H>.J8@a$rL5JQ49$KLa$95!G=$OMQ0U$7$J$$!#$J$<$+$H$$$&$H!"(B
+ *	$BBgJ8@a$NCf$N(B 1 $B>.J8@a$N$_$,L5JQ49$K$J$C$F$7$^$&$H!"$=$NJ8@a$K(B
+ *	$B4X$7$F(B jcMove() $B$G0\F0$r9T$J$C$?;~!"$I$&0\F0$9$l$P$h$$$N$+(B
+ *	$B$h$/$o$+$i$J$$!"$D$^$j0\F0$N%;%^%s%F%#%/%9$,ITL@3N$K$J$C$F$7$^$&(B
+ *	$B$+$i$G$"$k!#(B
+ *
+ * int jcKana(jcConvBuf *buf, int small, int kind)
+ *	$B%+%l%s%HJ8@a$r$+$J$K$9$k!#(B
+ *	$B0z?t(B kind $B$,!"(BJC_HIRAGANA $B$J$i$R$i$,$J!"(BJC_KATAKANA $B$J$i%+%?%+%J$K(B
+ *	$BJQ$o$k!#J8@a$NJQ49>uBV$OJQ2=$7$J$$!#$D$^$jJQ49$5$l$F$$$l$P(B
+ *	$BJQ49>uBV$N$^$^!"L$JQ49$N>uBV$J$iL$JQ49$N$^$^$G$"$k!#(B
+ *	$B0z?t(B small $B$,(B 0 $B$G$J$1$l$P%+%l%s%H>.J8@a$,!"$=$&$G$J$1$l$P(B
+ *	$B%+%l%s%HBgJ8@a$,JQ$o$k!#(B
+ *	$B%+%l%s%HBgJ8@a$r$+$J$K$9$k>l9g!"$=$NCf$N>.J8@a$O0l$D$K$^$H$a$i$l$k!#(B
+ *
+ * int jcFix(jcConvBuf *buf)
+ *	$B8=:_!"%P%C%U%!$K$O$$$C$F$$$kJQ49J8;zNs$r3NDj$5$;$k!#(B
+ *
+ * int jcFix1(jcConvBuf *buf)
+ *	$B8=:_!"%P%C%U%!$K$O$$$C$F$$$kJQ49J8;zNs$N@hF,0lJ8;z$@$1$r3NDj$5$;$k!#(B
+ *
+ * int jcExpand(jcConvBuf *buf, int small, int convf)
+ *	$B%+%l%s%HJ8@a$ND9$5$r#1J8;z?-$P$9!#0z?t(B convf $B$,(B 0 $B$G$J$1$l$P(B
+ *	$B?-$P$7$?$"$H:FJQ49$9$k!#(B
+ *	$B0z?t(B small $B$,(B 0 $B$G$J$1$l$P>.J8@a$,!"$=$&$G$J$1$l$PBgJ8@a$,(B
+ *	$B%+%l%s%HJ8@a$H$7$F;H$o$l$k!#(B
+ *
+ * int jcShrink(jcConvBuf *buf, int small, int convf)
+ *	$B%+%l%s%HJ8@a$ND9$5$r#1J8;z=L$a$k!#0z?t(B convf $B$,(B 0 $B$G$J$1$l$P(B
+ *	$B=L$a$?$"$H:FJQ49$9$k!#(B
+ *	$B0z?t(B small $B$,(B 0 $B$G$J$1$l$P>.J8@a$,!"$=$&$G$J$1$l$PBgJ8@a$,(B
+ *	$B%+%l%s%HJ8@a$H$7$F;H$o$l$k!#(B
+ *
+ * int jcNext(jcConvBuf *buf, int small, int prev)
+ *	$B%+%l%s%HJ8@a$r<!8uJdKt$OA08uJd$GCV$-49$($k!#(B
+ *	$B0z?t(B small $B$,(B 0 $B$G$J$1$l$P>.J8@a$,!"$=$&$G$J$1$l$PBgJ8@a$,(B
+ *	$B%+%l%s%HJ8@a$H$7$F;H$o$l$k!#(B
+ *
+ * int jcCandidateInfo(jcConvBuf *buf, int small, int *ncandp, int *curcandp)
+ *	$B<!8uJd$N>pJs$rJV$9!#(B
+ *	$B<!8uJd0lMw$r=P$9$?$a$K$O:G=i$K$3$N4X?t$r8F$V$H$h$$!#(B
+ *
+ * int jcGetCandidate(jcConvBuf *buf, int n, wchar *candstr)
+ *	$B;XDj$5$l$?8uJdHV9f$NJ8;zNs$rJV$9!#%+%l%s%H8uJdHV9f$O$3$NHV9f$K(B
+ *	$BJQ$o$k!#I=<(%P%C%U%!$OJQ2=$7$J$$!#(B
+ *	$BBg@N$N(B wnnlib $B$O<!8uJd$,MQ0U$5$l$F$$$J$1$l$PMQ0U$7$?$,!"$3$N%P!<%8%g%s(B
+ *	$B$G$O%(%i!<$K$J$k!#(BjcNext $B$d(B jcCandidateInfo $B$r@h$K8F$s$G$*$+$J$1$l$P(B
+ *	$B$J$i$J$$!#(B
+ *
+ * int jcSelect(jcConvBuf *buf, int n)
+ *	$B;XDj$5$l$?HV9f$N8uJd$GI=<(%P%C%U%!$rCV$-49$($k!#(B
+ *	$B%+%l%s%H8uJdHV9f$O$3$NHV9f$KJQ$o$k!#(B
+ *
+ * int jcDotOffset(jcConvBuf *buf)
+ *	$BBgJ8@a$N@hF,$+$i$N%I%C%H$N%*%U%;%C%H$rJV$9!#(B
+ *	$BNc$($P(B 0 $B$J$i%I%C%H$,%+%l%s%HJ8@a$N@hF,$K$"$k$3$H$K$J$k!#(B
+ *
+ * int jcIsConverted(jcConvBuf *buf, int cl)
+ *	$B;XDj$5$l$?J8@a$,JQ49$5$l$F$$$k$+$I$&$+$rJV$9(B
+ *	0 $B$J$iL5JQ49>uBV(B
+ *	1 $B$J$iJQ49>uBV(B
+ *	-1 $B$J$i(B $B%(%i!<(B
+ *
+ * int jcMove(jcConvBuf *buf, int small, int dir)
+ *	$B%I%C%H!&%+%l%s%HJ8@a$r0\F0$9$k!#(B
+ *	$B%+%l%s%HJ8@a$,JQ49:Q$_$G$"$l$PJ8@a0\F0$7!"$=$&$G$J$1$l$P(B
+ *	$B%I%C%H$N$_$,0\F0$9$k!#(B
+ *	$BJ8@a0\F0;~$K!"0z?t(B small $B$,(B 0 $B$G$J$1$l$P>.J8@aC10L$G0\F0$7!"(B
+ *	$B$=$&$G$J$1$l$PBgJ8@aC10L$K0\F0$9$k!#(B
+ *
+ * int jcTop(jcConvBuf *buf)
+ *	$B%I%C%H!&%+%l%s%HJ8@a$rJ8$N@hF,$K0\F0$9$k!#%+%l%s%H>.J8@a!&(B
+ *	$B%+%l%s%HBgJ8@a$H$b$K0\F0$9$k!#(B
+ *
+ * int jcBottom(jcConvBuf *buf)
+ *	$B%I%C%H!&%+%l%s%HJ8@a$rJ8$N:G8e$K0\F0$9$k!#%+%l%s%H>.J8@a!&(B
+ *	$B%+%l%s%HBgJ8@a$H$b$K0\F0$9$k!#(B
+ *	$B$b$7!":G8e$NJ8@a$,L5JQ49>uBV$G$"$l$P%+%l%s%HJ8@a$O$=$NJ8@a$K$J$j!"(B
+ *	$B%I%C%H$O$=$NJ8@a$N:G8e$KMh$k!#$=$&$G$J$1$l$P%+%l%s%HJ8@a$O(B
+ *	$B:G8e$NJ8@a$N<!(B ($B$D$^$j6u$NJ8@a(B) $B$KMh$k!#(B
+ *
+ * int jcChangeClause(jcConvBuf *buf, wchar *str)
+ *	$B%+%l%s%HBgJ8@a$r;XDj$5$l$?J8;zNs$GF~$l49$($k!#(B
+ *	$BI=<(%P%C%U%!$@$1$G$O$J$/!"$+$J%P%C%U%!$NFbMF$b(B
+ *	$BCV$-49$o$k!#J8@a$OL5JQ49>uBV$K$J$k!#(B
+ *
+ * int jcSaveDic(jcConvBuf *buf)
+ *	$B;HMQCf$N4D6-$G;H$o$l$F$$$kA4$F$N<-=qJB$S$KIQEY%U%!%$%k$r(B
+ *	$B%;!<%V$9$k!#(B
+ *	$B$3$N%U%!%s%/%7%g%s$O>o$K(B 0 $B$rJV$9!#K\Ev$K%;!<%V$5$l$?$+$N(B
+ *	$B%A%'%C%/$O$7$J$$!#(B
+ *
+ * int jcCancel(jcConvBuf *buf)
+ *      $B8=:_F~NOCf$N$9$Y$F$NJ8;zNs$r!"JQ49:Q$_$N$b$N$r4^$a$F!"$9$Y$FL$(B
+ *      $BJQ49>uBV$K$9$k!#%*%j%8%J%k$N(B CcWnn $B$H(B jclib $B%$%s%?%U%'!<%9$G$O!"(B
+ *	$B@hF,J8@a$rA4F~NOJ8;zNs$ND9$5$^$G3HD%$9$k$3$H$G!"$3$N=hM}$r9T$J$C(B
+ *	$B$F$$$?$,!"$3$N=hM}$H(B jllib $B$H$N%$%s%?%U%'!<%9$,$&$^$/9g$o$:!"(B
+ *	wnnlib $B$G$OFHN)$7$?%U%!%s%/%7%g%s$H$7$?!#(B
+ *
+ * int jcKillLine(jcConvBuf *buf)
+ *      $B8=:_$N%I%C%H$"$k$$$O%+%l%s%HJ8@a0J9_$r:o=|$9$k!#%I%C%H$,$"$kJ8(B
+ *      $B@a$,4{$KJQ49$5$l$F$$$l$P!"$=$NJ8@a!"$D$^$j%+%l%s%HJ8@a$r4^$a$F(B
+ *      $B:o=|$9$k!#%I%C%H$"$k$$$O%+%l%s%HJ8@a$,@hF,$G$"$l$P!"(BjcClear()
+ *      $B$HF1$8F0:n$r$9$k!#$D$^$j!"(BjcClear() $B<+BN$OITMW$K$J$k$N$@$,!"5l(B
+ *      $B%$%s%?%U%'!<%9$r9MN8$7$F!"(BjcClear() $B$O$=$N$^$^;D$9!#(B
+ *      $B$J$*!":o=|8e$N%I%C%H$H%+%l%s%HJ8@a$O!"A4JQ49BP>]J8;zNs$NKvHx!"(B
+ *      $B$"$k$$$O:G=*J8@a$NKvHx$K$"$k6uJ8@a$K$J$k!#(B
+ *
+ * $B$3$l$i$N%U%!%s%/%7%g%s$OFC$K=q$+$l$F$$$J$1$l$P@.8y$N>l9g$K$O(B 0,
+ * $B%(%i!<$N>l9g$K$O(B -1 $B$rJV$9!#(B
+ *
+ */
+
+/*
+ * $B%0%m!<%P%kJQ?t(B
+ *
+ * wnnlib $B$G;H$o$l$k%0%m!<%P%kJQ?t$O(B jcErrno $B$?$@0l$D$G$"$k!#(B
+ *
+ * extern int jcErrno
+ *	$B%(%i!<$N:]$K!"%(%i!<%3!<%I$,BeF~$5$l$k!#%(%i!<%3!<%I$O(B wnnlib.h $B$G(B
+ *	$BDj5A$5$l$F$$$k!#(B
+ */
+
+/*
+ * $B%G!<%?9=B$(B
+ *
+ * wnnlib $B$N;}$D%G!<%?$G!"%"%W%j%1!<%7%g%s$+$iD>@\%"%/%;%9$7$F$h$$$N$O(B
+ * $BJQ49%P%C%U%!(B jcConvBuf $B7?$N(B public member $B$H=q$+$l$?ItJ,$N$_$G$"$k!#(B
+ * $BD>@\%"%/%;%9$7$F$h$$$H$$$C$F$b!"CM$r;2>H$9$k$@$1$G!"CM$rJQ99$9$k$3$H$O(B
+ * $B5v$5$l$J$$!#%"%W%j%1!<%7%g%s$,>!<j$KCM$rJQ99$7$?>l9g$N(B wnnlib $B$NF0:n$O(B
+ * $BJ]>Z$5$l$J$$!#(B
+ *
+ * <$BJQ49%P%C%U%!(B>
+ *
+ * jcConvBuf $B7?$O(B wnnlib.h $B$G<!$N$h$&$KDj5A$5$l$F$$$k!#(B
+ *
+ * typedef struct {
+ *    /-* public member *-/
+ *	int		nClause;	$BJ8@a?t(B
+ *	int		curClause;	$B%+%l%s%HJ8@aHV9f(B
+ *	int		curLCStart;	$B%+%l%s%HBgJ8@a3+;OJ8@aHV9f(B
+ *	int		curLCEnd;	$B%+%l%s%HBgJ8@a=*N;J8@aHV9f(B
+ *	wchar		*kanaBuf;	$B$+$J%P%C%U%!$N@hF,(B
+ *	wchar		*kanaEnd;	$B$+$J%P%C%U%!$NKvHx(B
+ *	wchar		*displayBuf;	$BI=<(%P%C%U%!$N@hF,(B
+ *	wchar		*displayEnd;	$BI=<(%P%C%U%!$NKvHx(B
+ *	jcClause	*clauseInfo;	$BJ8@a>pJs(B
+ *	struct wnn_env	*env;
+ *    /-* private member *-/
+ *	[ $B>JN,(B ]
+ * } jcConvBuf;
+ *
+ * nClause $B$O8=:_$NJ8@a?t$rI=$9!#$3$l$O>.J8@a$N?t$G$"$k!#(B
+ * curClause $B$O%+%l%s%H>.J8@a$NHV9f$G$"$k!#(B
+ * curLCStart $B$H(B curLCEnd $B$O%+%l%s%HBgJ8@a$NHO0O$r<($9!#(BcurLCStart $B$+$i(B
+ * curLCEnd-1 $B$NHO0O$NJ8@a$,%+%l%s%HBgJ8@a$G$"$k!#$D$^$j!"(BcurLCEnd $B$O(B
+ * $B<!$NBgJ8@a$N@hF,$NHV9f$G$"$k!#(B
+ *
+ * kanaBuf $B$H(B displayBuf $B$,$+$J%P%C%U%!$HI=<(%P%C%U%!$G$"$k!#(B
+ * jcInsertChar() $BEy$r;H$C$FF~NO$5$l$?FI$_$O$+$J%P%C%U%!$HI=<(%P%C%U%!$KF~$k!#(B
+ * $B$3$l$rJQ49$9$k$H!"I=<(%P%C%U%!$NJ}$@$1$,4A;z$NJ8;zNs$K$J$k!#(B
+ * kanaEnd $B$*$h$S(B displayEnd $B$O$=$l$>$l$N%P%C%U%!$KF~$l$i$l$?J8;zNs$N:G8e(B
+ * $B$NJ8;z$N<!$r;X$7$F$$$k!#$+$J%P%C%U%!!&I=<(%P%C%U%!$O$I$A$i$b(B NULL $B%?!<%_(B
+ * $B%M!<%H$5$l$J$$!#(B
+ *
+ * clauseInfo $B$OJ8@a>pJs$NF~$C$?G[Ns$G$"$k!#$3$l$O$"$H$G@bL@$9$k!#(B
+ *
+ * env $B$O$3$NJQ49%P%C%U%!$N;HMQ$9$k4D6-$G$"$k!#(B
+ *
+ * <$BJ8@a>pJs(B>
+ *
+ * $B3FJ8@a$N>pJs$O(B clauseInfo $B$H$$$&L>A0$N(B jcClause $B7?$NG[Ns$KF~$C$F$$$k!#(B
+ * jcClause $B7?$O(B wnnlib.h $B$G<!$N$h$&$KDj5A$5$l$F$$$k!#(B
+ *
+ * typedef struct {
+ *	wchar	*kanap;		$BFI$_J8;zNs(B ($B$+$J%P%C%U%!$NCf$r;X$9(B)
+ *	wchar	*dispp;		$BI=<(J8;zNs(B ($BI=<(%P%C%U%!$NCf$r;X$9(B)
+ *	char	conv;		$BJQ49:Q$_$+(B
+ *				0: $BL$JQ49(B 1: $BJQ49:Q(B -1: wnnlib $B$G5?;wJQ49(B
+ *	char	ltop;		$BBgJ8@a$N@hF,$+(B?
+ * } jcClause;
+ *
+ * kanap $B$O!"$+$J%P%C%U%!>e$N!"$=$NJ8@a$NFI$_$N;O$^$j$N0LCV$r<($9%]%$%s%?(B
+ * $B$G$"$k!#$^$?!"(Bdispp $B$O!"I=<(%P%C%U%!(B $B>e$G!"$=$NJ8@a$N;O$^$j$N0LCV$r<($9!#(B
+ * $B=>$C$F!"(Bn $BHV$NJ8@a$O!"(B
+ *	$B$h$_(B:	clauseInfo[n].kanap $B$+$i(B clauseInfo[n+1].kanap $B$NA0$^$G(B
+ *	$B4A;z(B:	clauseInfo[n].dispp $B$+$i(B clauseInfo[n+1].dispp $B$NA0$^$G(B
+ * $B$H$J$k!#$3$N$h$&$K(B n $BHVL\$NJ8@a$NHO0O$r<($9$N$K(B n+1 $BHVL\$N(B clauseInfo $B$,(B
+ * $BI,MW$J$?$a!"(BclauseInfo $B$NG[Ns$NMWAG$O>o$K@hF,$+$iJ8@a?t(B+1$B8D$,M-8z$G$"$k!#(B
+ * $B$J$*!"@hF,J8@a$O(B 0 $BHVL\$+$i;O$^$k$b$N$H$9$k!#(B
+ *
+ * conv $B$O$=$NJ8@a$NJQ49>uBV$rI=$9!#(B0 $B$J$iL$JQ49>uBV!"(B1 $B$J$iJQ49>uBV!"(B
+ * -1 $B$J$i(B jcKana() $B$K$h$C$F5?;wJQ49$5$l$?$3$H$r<($9!#$3$l$O!"JQ49$N3X=,$H(B
+ * $BIQEY>pJs$N99?7$N$?$a$K;HMQ$9$k!#(B
+ *
+ * ltop $B$,(B 0 $B$G$J$1$l$P$=$NJ8@a$,BgJ8@a$N@hF,$G$"$k$3$H$r<($9!#(Bimabit $B$O(B
+ * $B$=$NJ8@a$N448l$N:#;H$C$?$h%S%C%H$,F~$C$F$$$k!#(B
+ *
+ * kanap, dispp $BEy$G!"(Bn $BHVL\$NJ8@a$NHO0O$r<($9$N$K(B n+1 $BHVL\$NJ8@a>pJs$,(B
+ * $BI,MW$J$?$a!"(BclauseInfo $B$NG[Ns$NMWAG$O>o$K@hF,$+$iJ8@a?t(B+1$B8D$,M-8z$G$"$k!#(B
+ * $BJ8@a?t(B+1 $B8DL\$NJ8@a>pJs(B (clauseInfo[nClause]) $B$O(B
+ *	kanap, dispp: $B$=$l$>$l(B kanaEnd, displayEnd $B$KEy$7$$(B
+ *	conv: 0 ($BL$JQ49>uBV(B)
+ *	ltop: 1
+ * $B$G$"$k!#(B
+ *
+ * $BJ8@a>pJs$N(B kanap, dispp $B$rNc$r;H$C$F<($7$F$*$/!#(B
+ *
+ * $BNcJ8(B: $B$3$l$O%G!<%?9=B$$r<($9$?$a$NNcJ8$G$9(B ($BJ8@a?t(B 6)
+ *
+ * kanap:   $B#0(B    $B#1(B    $B#2(B        $B#3(B    $B#4(B    $B#5(B          $B#6(B(=kanaEnd)
+ *	    $B"-(B    $B"-(B    $B"-(B        $B"-(B    $B"-(B    $B"-(B          $B"-(B
+ * kanaBuf: $B$3$l$O$G!<$?$3$&$>$&$r$7$a$9$?$a$N$l$$$V$s$G$9(B
+ *
+ * dispp:      $B#0(B    $B#1(B    $B#2(B    $B#3(B  $B#4(B    $B#5(B      $B#6(B(=displayEnd)
+ *	       $B"-(B    $B"-(B    $B"-(B    $B"-(B  $B"-(B    $B"-(B      $B"-(B
+ * displayBuf: $B$3$l$O%G!<%?9=B$$r<($9$?$a$NNcJ8$G$9(B
+ */
+
+#ifndef lint
+static char	*rcsid = "$Id: wnnlib.c,v 10.18 2002/01/10 15:51:47 ishisone Exp $";
+#endif
+
+#ifdef DEBUG_WNNLIB
+#include	<stdio.h>
+#endif
+#include	"wnnlib.h"
+#include	"WStr.h"
+#include	<string.h>
+#include	<pwd.h>
+#include	<X11/Xos.h>
+
+#ifndef LIBDIR
+#define LIBDIR	"/usr/local/lib/wnn"
+#endif
+
+#ifndef NULL
+#define NULL	0
+#endif
+
+/*
+ * Wnn7 $B$G$OBgC@$K$b$$$/$D$+$N(B API $B4X?t$K%P%C%U%!%5%$%:$r;XDj$9$k(B
+ * $B0z?t$rDI2C$7$F$$$k$?$a!"%P!<%8%g%s$rD4$Y!"$=$l$K$h$C$F0z?t$r(B
+ * $BJQ99$7$J$1$l$P$J$i$J$$!#$H$j$"$($:K\%W%m%0%i%`$G$O(B Wnn7 $B$N0z?t$K9g$o$;$k!#(B
+ */
+
+/* Wnn7 $B$+$I$&$+$NH=Dj(B */
+#ifdef WNN_RENSOU
+#define WNN7
+#endif
+
+#ifdef WNN7
+#define ki2_jl_get_yomi			jl_get_yomi
+#define ki2_jl_get_kanji		jl_get_kanji
+#define ki2_jl_get_zenkouho_kanji	jl_get_zenkouho_kanji
+#define ki2_jl_fuzokugo_get		jl_fuzokugo_get
+#else
+#define ki2_jl_get_yomi(a, b, c, d, sz)		jl_get_yomi(a, b, c, d)
+#define ki2_jl_get_kanji(a, b, c, d, sz)	jl_get_kanji(a, b, c, d)
+#define ki2_jl_get_zenkouho_kanji(a, b, c, sz)	jl_get_zenkouho_kanji(a, b, c)
+#define ki2_jl_fuzokugo_get(a, b, sz)		jl_fuzokugo_get(a, b)
+#endif /* WNN7 */
+
+#ifdef DEBUG_WNNLIB
+#ifdef __STDC__
+static void showBuffers(jcConvBuf *, char *);
+static void printBuffer(wchar *start, wchar *end);
+#else
+static void showBuffers();
+static void printBuffer();
+#endif
+#define	TRACE(f, m)	fprintf(stderr, "%s: %s\n", (f), (m));
+#else
+#define	TRACE(f, m)
+#endif
+
+#define CHECKFIXED(buf)	\
+	{ if ((buf)->fixed) { jcErrno = JE_ALREADYFIXED; return -1; } }
+#define Free(p)		{if (p) free((char *)(p));}
+#define DotSet(buf)	(buf)->dot = (buf)->clauseInfo[(buf)->curLCStart].kanap
+
+#define KANABEG	0xa4a1	/* '$B$!(B' */
+#define KANAEND	0xa4f3	/* '$B$s(B' */
+#define KATAOFFSET	0x100	/* $B%+%?%+%J$H$R$i$,$J$N%3!<%I!&%*%U%;%C%H(B */
+
+/* 1$BJ8@a$NFI$_!&4A;z$r<h$j=P$9%P%C%U%!$N%5%$%:(B */
+#define CL_BUFSZ	512
+
+/* $B%G%U%)%k%H$N%P%C%U%!%5%$%:(B */
+#define DEF_BUFFERSIZE	100	/* 100 $BJ8;z(B */
+#define DEF_CLAUSESIZE	20	/* 20 $BJ8@a(B */
+#define DEF_CANDSIZE	1024	/* 1K $B%P%$%H(B */
+#define DEF_RESETSIZE	10	/* 10 $BC18l(B */
+
+/* buf->candKind $B$NCM(B */
+#define CAND_SMALL	0	/* $B>.J8@a8uJd(B */
+#define CAND_LARGE	1	/* $BBgJ8@a8uJd(B */
+
+#define MAXFZK	LENGTHBUNSETSU
+
+#ifdef SVR4
+#define bcopy(p, q, l)	memmove(q, p, l)
+#define bzero(p, l)	memset(p, 0, l)
+#else
+#if defined(SYSV) || defined(USG)
+#define OVERLAP_BCOPY
+extern char	*memset();
+#define bzero(p, l)	memset(p, 0, l)
+#endif
+#endif
+
+#ifdef __STDC__
+/* $B%U%!%s%/%7%g%s%W%m%H%?%$%W@k8@(B */
+static void moveKBuf(jcConvBuf *, int, int);
+static void moveDBuf(jcConvBuf *, int, int);
+static void moveCInfo(jcConvBuf *, int, int);
+static int resizeBuffer(jcConvBuf *, int);
+static int resizeCInfo(jcConvBuf *, int);
+static void setCurClause(jcConvBuf *, int);
+static int getHint(jcConvBuf *, int, int);
+static int renConvert(jcConvBuf *, int);
+static int tanConvert(jcConvBuf *, int);
+static int doKanrenConvert(jcConvBuf *, int);
+static int doKantanDConvert(jcConvBuf *, int, int);
+static int doKantanSConvert(jcConvBuf *, int);
+static int unconvert(jcConvBuf *, int, int);
+static int expandOrShrink(jcConvBuf *, int, int, int);
+static int makeConverted(jcConvBuf *, int);
+static int getCandidates(jcConvBuf *, int);
+static int setCandidate(jcConvBuf *, int);
+static void checkCandidates(jcConvBuf *, int, int);
+static int forceStudy(jcConvBuf *, int);
+#else
+static void moveKBuf();
+static void moveDBuf();
+static void moveCInfo();
+static int resizeBuffer();
+static int resizeCInfo();
+static void setCurClause();
+static int getHint();
+static int renConvert();
+static int tanConvert();
+static int doKanrenConvert();
+static int doKantanDConvert();
+static int doKantanSConvert();
+static int unconvert();
+static int expandOrShrink();
+static int makeConverted();
+static int getCandidates();
+static int setCandidate();
+static void checkCandidates();
+static int forceStudy();
+#endif
+
+/* $B%(%i!<HV9f(B */
+int	jcErrno;
+
+/*
+ *	portability $B$N$?$a$N%U%!%s%/%7%g%s(B
+ */
+
+#ifdef OVERLAP_BCOPY
+#undef bcopy
+static
+bcopy(from, to, n)
+register char *from;
+register char *to;
+register int n;
+{
+	if (n <= 0 || from == to) return;
+
+	if (from < to) {
+		from += n;
+		to += n;
+		while (n-- > 0)
+			*--to = *--from;
+	} else {
+		while (n-- > 0)
+			*to++ = *from++;
+	}
+}
+#endif
+
+/*
+ *	wnnlib $BFbIt$G;H$o$l$k%U%!%s%/%7%g%s(B
+ */
+
+/* moveKBuf -- $B$+$J%P%C%U%!$N;XDj$5$l$?J8@a$N@hF,$+$i$"$H$rF0$+$9(B */
+static void
+moveKBuf(buf, cl, move)
+jcConvBuf *buf;
+int cl;
+int move;
+{
+	jcClause	*clp = buf->clauseInfo + cl;
+	jcClause	*clpend;
+	int		movelen;
+
+	TRACE("moveKBuf", "Enter")
+
+	if (move == 0) return;
+
+	if ((movelen = buf->kanaEnd - clp->kanap) > 0) {
+		/* $B$+$J%P%C%U%!$NFbMF$rF0$+$9(B */
+		(void)bcopy((char *)clp->kanap, (char *)(clp->kanap + move),
+			    movelen * sizeof(wchar));
+	}
+
+	/* $B$+$J%P%C%U%!$NJQ99$K9g$o$;$F(B clauseInfo $B$r%"%C%W%G!<%H$9$k(B */
+	clpend = buf->clauseInfo + buf->nClause;
+	while (clp <= clpend) {
+		clp->kanap += move;
+		clp++;
+	}
+
+	/* kanaEnd $B$N%"%C%W%G!<%H(B */
+	buf->kanaEnd += move;
+}
+
+/* moveDBuf -- $BI=<(%P%C%U%!$N;XDj$5$l$?J8@a$N@hF,$+$i$"$H$rF0$+$9(B */
+static void
+moveDBuf(buf, cl, move)
+jcConvBuf *buf;
+int cl;
+int move;
+{
+	jcClause	*clp = buf->clauseInfo + cl;
+	jcClause	*clpend;
+	int		movelen;
+
+	TRACE("moveDBuf", "Enter")
+
+	if (move == 0) return;
+
+	if ((movelen = buf->displayEnd - clp->dispp) > 0) {
+		/* $BI=<(%P%C%U%!$NFbMF$rF0$+$9(B */
+		(void)bcopy((char *)clp->dispp, (char *)(clp->dispp + move),
+			    movelen * sizeof(wchar));
+	}
+
+	/* $BI=<(%P%C%U%!$NJQ99$K9g$o$;$F(B clauseInfo $B$r(B
+	 * $B%"%C%W%G!<%H$9$k(B
+	 */
+	clpend = buf->clauseInfo + buf->nClause;
+	while (clp <= clpend) {
+		clp->dispp += move;
+		clp++;
+	}
+
+	/* displayEnd $B$N%"%C%W%G!<%H(B */
+	buf->displayEnd += move;
+}
+
+/* moveCInfo -- ClauseInfo $B$N;XDj$5$l$?J8@a$N@hF,$+$i$"$H$rF0$+$9(B */
+static void
+moveCInfo(buf, cl, move)
+jcConvBuf *buf;
+int cl;
+int move;
+{
+	jcClause	*clp = buf->clauseInfo + cl;
+	int		len;
+
+	TRACE("moveCInfo", "Enter")
+
+	/* move $B$K@5$N?t$r;XDj$9$l$PJ8@a$NA^F~!"Ii$J$iJ8@a$N:o=|$K$J$k(B */
+
+	if (move == 0) return;
+
+	if ((len = buf->nClause + 1 - cl) > 0) {
+		(void)bcopy((char *)clp, (char *)(clp + move),
+			    len * sizeof(jcClause));
+	}
+	buf->nClause += move;
+	
+	/* 
+	 * $B8uJd$r<h$j=P$7$F$$$kJ8@a$,$"$l$P!"L58z$K$7$F$*$/!#(B
+	 *
+	 * $B$?$@$7!"8uJd$r<h$j=P$7$?7k2L!"J8@a?t$,JQ2=$7$?>l9g$K$O!"(B
+	 * setCandidate() $B$NCf$G@_Dj$7$J$*$5$l$k!"$^$?!"(Bjllib $BFb$G$b(B
+	 * $BF1$8J8@a$KBP$9$kA48uJd<h$j=P$7$,$"$C$?>l9g$N9MN8$,$"$k!#(B
+	 * $B$H$$$&$3$H$G!"$3$3$O0BA4%5%$%I$G$$$/!#(B
+	 */
+	if (buf->candClause >= 0) {
+		buf->candClause = -1;
+		buf->candClauseEnd = -1;
+	}
+}
+
+/* resizeBuffer -- $B$+$J(B/$BI=<(%P%C%U%!$NBg$-$5$rJQ$($k(B */
+static int
+resizeBuffer(buf, len)
+jcConvBuf *buf;
+int len;
+{
+	wchar	*kbufold, *dbufold;
+	wchar	*kbufnew, *dbufnew;
+	int	allocsize;
+	jcClause	*clp, *clpend;
+
+	TRACE("resizeBuffer", "Enter")
+
+	kbufold = buf->kanaBuf;
+	dbufold = buf->displayBuf;
+
+	/* realloc $B$9$k(B */
+	allocsize = (len + 1) * sizeof(wchar);
+	kbufnew = (wchar *)realloc((char *)kbufold, allocsize);
+	dbufnew = (wchar *)realloc((char *)dbufold, allocsize);
+
+	if (kbufnew == NULL || dbufnew == NULL) {
+		Free(kbufnew);
+		Free(dbufnew);
+		jcErrno = JE_NOCORE;
+		return -1;
+	}
+
+	buf->bufferSize = len;
+
+	if (kbufnew == kbufold && dbufnew == dbufold) {
+		/* $B%]%$%s%?$OA0$HJQ$o$C$F$$$J$$(B */
+		return 0;
+	}
+
+	/* $B3F<o%]%$%s%?$r$D$1JQ$($k(B */
+
+	buf->kanaBuf = kbufnew;
+	buf->kanaEnd = kbufnew + (buf->kanaEnd - kbufold);
+	buf->displayBuf = dbufnew;
+	buf->displayEnd = dbufnew + (buf->displayEnd - dbufold);
+
+	buf->dot = kbufnew + (buf->dot - kbufold);
+
+	clp = buf->clauseInfo;
+	clpend = clp + buf->nClause;
+	while (clp <= clpend) {
+		clp->kanap = kbufnew + (clp->kanap - kbufold);
+		clp->dispp = dbufnew + (clp->dispp - dbufold);
+		clp++;
+	}
+
+	return 0;
+}
+
+/* resizeCInfo -- clauseInfo $B%P%C%U%!$NBg$-$5$rJQ$($k(B */
+static int
+resizeCInfo(buf, size)
+jcConvBuf *buf;
+int size;
+{
+	jcClause	*cinfonew;
+
+	TRACE("resizeCInfo", "Enter")
+
+	/* realloc $B$9$k(B */
+	cinfonew = (jcClause *)realloc((char *)buf->clauseInfo,
+				       (size + 1) * sizeof(jcClause));
+	if (cinfonew == NULL) {
+		jcErrno = JE_NOCORE;
+		return -1;
+	}
+
+	buf->clauseSize = size;
+	buf->clauseInfo = cinfonew;
+	return 0;
+}
+
+/* setCurClause -- $B%+%l%s%HJ8@a$r@_Dj$9$k(B */
+static void
+setCurClause(buf, cl)
+jcConvBuf *buf;
+int cl;		/* $B%+%l%s%H>.J8@aHV9f(B */
+{
+	jcClause	*clp = buf->clauseInfo;
+	int		i;
+
+	TRACE("setCurClause", "Enter")
+
+	/* $B%+%l%s%H>.J8@a(B */
+	buf->curClause = cl;
+
+	/* $B%+%l%s%HBgJ8@a3+;OJ8@a(B */
+	for (i = cl; i > 0 && !clp[i].ltop; i--)
+		;
+	buf->curLCStart = i;
+
+	/* $B%+%l%s%HBgJ8@a=*N;J8@a(B ($B$N<!(B) */
+	for (i = cl + 1; i <= buf->nClause && !clp[i].ltop; i++)
+		;
+	buf->curLCEnd = i;
+}
+
+/* getHint -- $BJ8@a$NA08e$N@\B3>pJs$rF@$k(B */
+static int
+getHint(buf, start, end)
+jcConvBuf *buf;
+int start;
+int end;
+{
+	jcClause *cinfo = buf->clauseInfo;
+	int hint = 0;
+
+	TRACE("getHint", "Enter")
+
+	/*
+	 * $B:G=i$NJ8@a$ND>A0$NJ8@a$,JQ49$5$l$F$$$l$P!"A0$NJ8@a$H@\B3$r$9$k(B
+	 */
+	if (start > 0 && cinfo[start - 1].conv == 1)
+		hint |= WNN_USE_MAE;
+
+	/*
+	 * $B:G8e$NJ8@a$ND>8e$,JQ49$5$l$F$$$F$$$l$P!"8e$NJ8@a$H@\B3$r$9$k(B
+	 */
+	if (end > 0 && end < jl_bun_suu(buf->wnn) && cinfo[end].conv == 1)
+		hint |= WNN_USE_ATO;
+
+	return hint;
+}
+
+
+/* renConvert -- $B%+%l%s%HJ8@a$+$i8e$m$rO"J8@aJQ49$9$k(B */
+static int
+renConvert(buf, small)
+jcConvBuf *buf;
+int small;
+{
+	TRACE("renConvert", "Enter")
+
+	/* $BO"J8@aJQ49$9$k(B */
+	if (doKanrenConvert(buf,
+			    small ? buf->curClause : buf->curLCStart) < 0) {
+		return -1;
+	}
+
+	/*
+	 * $B%+%l%s%HJ8@a$N@_Dj(B
+	 * small $B$,(B 0 $B$J$i!"(B
+	 *	$B%+%l%s%HBgJ8@a$N@hF,$O(B buf->curLCStart $B$GJQ$o$i$:(B
+	 *	$B%+%l%s%HBgJ8@a=*$j$O(B ltop $B%U%i%0$r%5!<%A$7$FC5$9(B
+	 *	$B%+%l%s%H>.J8@a$O%+%l%s%HBgJ8@a@hF,$K0\F0(B
+	 * small $B$,(B 0 $B$G$J$$$J$i!"(B
+	 *	$B%+%l%s%H>.J8@a$O(B buf->curClause $B$GJQ$o$i$:(B
+	 *	$B%+%l%s%HBgJ8@a$N@hF,$*$h$S=*$j$O!"%+%l%s%H>.J8@a$N(B
+	 *	$BA08e$r(B ltop $B%U%i%0$r%5!<%A$7$FC5$9(B
+	 */
+	setCurClause(buf, small ? buf->curClause : buf->curLCStart);
+
+	/* $B%I%C%H$N@_Dj(B */
+	DotSet(buf);
+
+	return 0;
+}
+
+/* tanConvert -- $B%+%l%s%HJ8@a$rC1J8@aJQ49$9$k(B */
+static int
+tanConvert(buf, small)
+jcConvBuf *buf;
+int small;
+{
+	TRACE("tanConvert", "Enter")
+
+	/*
+	 * $BC1J8@aJQ49$N>l9g!"4pK\E*$K(B 2 $BCJ3,$N=hM}$r9T$J$&$3$H$K$J$k(B
+	 * $B$^$:!"%+%l%s%HJ8@a$rC1J8@aJQ49(B
+	 * $B<!$K!"$=$N$"$H$rO"J8@aJQ49(B
+	 */
+
+	if (small) {
+		/* $B$^$:C1J8@aJQ49$9$k(B */
+		if (doKantanSConvert(buf, buf->curClause) < 0)
+			return -1;
+
+		/* $B%+%l%s%HJ8@a$N@_Dj(B
+		 *	$B%+%l%s%H>.J8@a$O(B buf->curClause $B$GJQ$o$i$:(B
+		 *	$B%+%l%s%HBgJ8@a$N@hF,$H:G8e$O%+%l%s%H>.J8@a$N(B
+		 *	$BA08e$K(B ltop $B%U%i%0$r%5!<%A$7$FC5$9(B
+		 */
+		setCurClause(buf, buf->curClause);
+		/* $B%I%C%H$N@_Dj(B */
+		DotSet(buf);
+
+		/* $BO"J8@aJQ49(B */
+		if (buf->curClause + 1 < buf->nClause &&
+		    buf->clauseInfo[buf->curClause + 1].conv == 0) {
+			/* $B>.J8@a$NC1J8@aJQ49%b!<%I$G!"<!$NJ8@a$,(B
+			 * $BL5JQ49$@$C$?>l9g!"(Bltop $B%U%i%0$r(B 0 $B$K$7$F(B
+			 * $BA0$H@\B3$G$-$k$h$&$K$9$k(B
+			 */
+			buf->clauseInfo[buf->curClause + 1].ltop = 0;
+		}
+		if (doKanrenConvert(buf, buf->curClause + 1) < 0)
+			return -1;
+
+		/* $B$b$&0lEY%+%l%s%HJ8@a$N@_Dj(B
+		 * $BO"J8@aJQ49$N7k2L$K$h$C$F$O%+%l%s%HBgJ8@a$N:G8e$,(B
+		 * $B0\F0$9$k$3$H$,$"$k(B
+		 */
+		setCurClause(buf, buf->curClause);
+
+		/* $B%I%C%H$O0\F0$7$J$$$N$G:F@_Dj$7$J$/$F$h$$(B */
+	} else {
+		/* $B$^$:C1J8@aJQ49$9$k(B */
+		if (doKantanDConvert(buf, buf->curLCStart, buf->curLCEnd) < 0)
+			return -1;
+
+		/* $B%+%l%s%HJ8@a$N@_Dj(B
+		 *	$B%+%l%s%HBgJ8@a$N@hF,$O(B buf->curLCStart $B$GJQ$o$i$:(B
+		 *	$B%+%l%s%HBgJ8@a=*$j$O(B ltop $B%U%i%0$r%5!<%A$7$FC5$9(B
+		 *	$B%+%l%s%H>.J8@a$O%+%l%s%HBgJ8@a@hF,$K0\F0(B
+		 */
+		setCurClause(buf, buf->curLCStart);
+		DotSet(buf);
+
+		/* $BO"J8@aJQ49(B */
+		if (doKanrenConvert(buf, buf->curLCEnd) < 0)
+			return -1;
+		/* $B$3$A$i$O(B small $B$N;~$H0c$C$FO"J8@aJQ49$N7k2L%+%l%s%HJ8@a$,(B
+		 * $B0\F0$9$k$3$H$O$J$$(B
+		 */
+	}
+
+	return 0;
+}
+
+/* doKanrenConvert -- $B;XDj$5$l$?J8@a$+$i8e$m$rO"J8@aJQ49$9$k(B */
+static int
+doKanrenConvert(buf, cl)
+jcConvBuf *buf;
+int cl;
+{
+	jcClause	*clp;
+	wchar	*kanap, *dispp;
+	wchar	savechar;
+	int	nsbun;
+	int	len, n;
+
+	TRACE("doKanrenConvert", "Enter")
+
+	/*
+	 * $B;XDj$5$l$?J8@a$+$i8e$m$rO"J8@aJQ49$9$k(B
+	 * $B%+%l%s%HJ8@a$N:F@_Dj$J$I$O$7$J$$(B
+	 */
+
+	if (cl >= buf->nClause) {
+		/* $B;XDj$5$l$?J8@a$O$J$$(B
+		 * $B%(%i!<$K$O$7$J$$(B
+		 * $B6u$NJ8@a$rJQ49$7$h$&$H$7$?;~$K!"$=$l$r;vA0$K%A%'%C%/$7$F(B
+		 * $B%(%i!<$K$9$k$N$O>e0L$N4X?t$N@UG$$G$"$k(B
+		 */
+		return 0;
+	}
+
+	/*
+	 * $BJQ49$9$kA0$K!">/$J$/$H$b;XDj$5$l$?J8@a$ND>A0$^$G$,JQ49$5$l$F(B
+         * $B$$$k$3$H$rJ]>Z$9$k(B
+	 */
+	if (makeConverted(buf, cl) < 0)
+		return -1;
+
+	clp = buf->clauseInfo + cl;
+
+	/* $B$+$J%P%C%U%!$r(B NULL $B%?!<%_%M!<%H$5$;$F$*$/(B */
+	*(buf->kanaEnd) = 0;
+
+	/* $BO"J8@aJQ49$9$k(B */
+#ifdef WNN6
+	nsbun = jl_fi_ren_conv(buf->wnn, clp->kanap,
+				 cl, -1, getHint(buf, cl, -1));
+#else
+	nsbun = jl_ren_conv(buf->wnn, clp->kanap,
+				 cl, -1, getHint(buf, cl, -1));
+#endif
+
+	if (nsbun < 0) {
+		jcErrno = JE_WNNERROR;
+		return -1;
+	}
+
+	/* clauseInfo $B$N%5%$%:$N%A%'%C%/(B */
+	if (nsbun > buf->clauseSize) {
+		if (resizeCInfo(buf, cl + nsbun) < 0)
+			return -1;
+	}
+
+	/* $B<!$KJQ49J8;zNs$ND9$5$N%A%'%C%/(B */
+	clp = buf->clauseInfo + cl;
+	len = (clp->dispp - buf->displayBuf) + jl_kanji_len(buf->wnn, cl, -1);
+
+	if (len > buf->bufferSize) {
+		if (resizeBuffer(buf, len) < 0)
+			return -1;
+	}
+
+	buf->nClause = nsbun;
+
+	/* $B$G$O(B clauseInfo $B$KJQ497k2L$rF~$l$F$$$/(B */
+	clp = buf->clauseInfo + cl;
+	kanap = clp->kanap;
+	dispp = clp->dispp;
+	while (cl < buf->nClause) {
+		n = cl + 1;
+
+		/* $BJ8@a>pJs$N@_Dj(B */
+		clp->conv = 1;
+		clp->kanap = kanap;
+		clp->dispp = dispp;
+		clp->ltop = jl_dai_top(buf->wnn, cl);
+
+		/* $BI=<(%P%C%U%!$XJQ49J8;zNs$r%3%T!<$9$k(B */
+		/* jl_get_kanji $B$O!"(BNULL $B$^$G%3%T!<$9$k$N$GCm0U(B */
+		len = jl_kanji_len(buf->wnn, cl, n);
+		savechar = dispp[len];
+		(void)ki2_jl_get_kanji(buf->wnn, cl, n, dispp, len);
+		dispp[len] = savechar;
+		dispp += len;
+
+		/* $B$+$J%P%C%U%!$N0LCV$rJ8@a$N:G8e$K$9$k(B */
+		kanap += jl_yomi_len(buf->wnn, cl, n);
+
+		/* $B%+%l%s%HJ8@a$N99?7(B */
+		cl = n;
+		clp++;
+	}
+
+	/* $B:G8e$N(B clauseInfo $B$N@_Dj(B */
+	clp->kanap = buf->kanaEnd;
+	clp->dispp = buf->displayEnd = dispp;
+	clp->conv = 0;
+	clp->ltop = 1;
+
+#ifdef DEBUG_WNNLIB
+	showBuffers(buf, "after doKanrenConvert");
+#endif
+
+	return 0;
+}
+
+/* doKantanDConvert -- $B;XDj$5$l$?HO0O$NJ8@a$rBgJ8@a$H$7$FC1J8@aJQ49$9$k(B */
+static int
+doKantanDConvert(buf, cls, cle)
+jcConvBuf *buf;
+int cls;
+int cle;
+{
+	jcClause	*clps, *clpe;
+	int	len, diff, newlen;
+	int	cldiff, nclausenew;
+	wchar	*kanap, *dispp;
+	wchar	savechar;
+	wchar	*savep;
+	int	nsbunnew, nsbunold;
+	int	i, n;
+
+	TRACE("doKantanDConvert", "Enter")
+
+	/*
+	 * $BJQ49$9$kA0$K!">/$J$/$H$b;XDj$5$l$?J8@a$ND>A0$^$G$,JQ49$5$l$F(B
+         * $B$$$k$3$H$rJ]>Z$9$k(B
+	 */
+	if (makeConverted(buf, cls) < 0)
+		return -1;
+
+	/*
+	 * $B;XDj$5$l$?HO0O$NJ8@a$rBgJ8@a$H$7$FC1J8@aJQ49$9$k(B
+	 * $B%+%l%s%HJ8@a$N:F@_Dj$J$I$O$7$J$$(B
+	 */
+
+	clps = buf->clauseInfo + cls;
+	clpe = buf->clauseInfo + cle;
+	nsbunold = jl_bun_suu(buf->wnn);
+	if (nsbunold < 0) {
+		jcErrno = JE_WNNERROR;
+		return -1;
+	}
+
+	/*
+	 * $BFI$_$r(B NULL $B%?!<%_%M!<%H$9$k(B
+	 * $BC1$K(B 0 $B$rF~$l$k$H<!$NJ8@a$,2u$l$k$N$G!"$=$NA0$K%;!<%V$7$F$*$/(B
+	 */
+	savep = clpe->kanap;
+	savechar = *savep;
+	*savep = 0;
+
+	/* $BC1J8@aJQ49$9$k(B */
+	nsbunnew = jl_tan_conv(buf->wnn, clps->kanap, cls, cle,
+				 getHint(buf, cls, cle), WNN_DAI);
+
+	/* $B$9$+$5$:%;!<%V$7$F$"$C$?J8;z$r$b$H$KLa$9(B */
+	*savep = savechar;
+
+	if (nsbunnew < 0) {
+		jcErrno = JE_WNNERROR;
+		return -1;
+	}
+
+	cldiff = (cle - cls) - (nsbunold - nsbunnew);
+	nclausenew = buf->nClause + cldiff;
+	/* clauseInfo $B$N%5%$%:$N%A%'%C%/(B */
+	if (nclausenew > buf->clauseSize) {
+		if (resizeCInfo(buf, nclausenew) < 0)
+			return -1;
+	}
+
+	/* $BJQ49J8;zNs$ND9$5$N%A%'%C%/(B */
+	len = jl_kanji_len(buf->wnn, cls, cle + cldiff);
+	diff = len - (clpe->dispp - clps->dispp);
+	newlen = (buf->displayEnd - buf->displayBuf) + diff;
+	if (newlen > buf->bufferSize) {
+		if (resizeBuffer(buf, newlen) < 0)
+			return -1;
+	}
+
+	/*
+	 * $BJ8@a$rA^F~$9$k$N$G!"I=<(%P%C%U%!$NFbMF$r0\F0$5$;$k!#(B
+	 *
+	 * $B$I$&$;$"$H$+$iO"J8@aJQ49$9$k$+$i$$$$$G$O$J$$$+$H$$$&9M$(J}$b$"$k$,!"(B
+	 * $B$I$3$G%(%i!<$,5/$3$C$F$b0l1~$N(B consistency $B$,J]$?$l$k$h$&$K(B
+	 * $B$9$k$H$$$&$N$,L\I8$G$"$k(B
+	 */
+	moveDBuf(buf, cle, diff);
+
+	/* clauseInfo $B$rF0$+$9(B ($BF1;~$K(B nClause $B$b%"%C%W%G!<%H$5$l$k(B) */
+	moveCInfo(buf, cle, cldiff);
+
+	/* $B$G$O(B clauseInfo $B$KJQ497k2L$rF~$l$k(B */
+	clps = buf->clauseInfo + cls;
+	kanap = clps->kanap;
+	dispp = clps->dispp;
+	cldiff += (cle - cls);
+	for (i = 0; i < cldiff; i++) {
+		n = cls + 1;
+
+		/* $BJ8@a>pJs$r@_Dj$9$k(B */
+		clps->conv = 1;
+		clps->ltop = jl_dai_top(buf->wnn, cls);
+		clps->kanap = kanap;
+		clps->dispp = dispp;
+
+		/* $BI=<(%P%C%U%!$X$NJQ49J8;zNs$N%3%T!<(B */
+		/* jl_get_kanji $B$O!"(BNULL $B$^$G%3%T!<$9$k$N$GCm0U(B */
+		len = jl_kanji_len(buf->wnn, cls, n);
+		savechar = dispp[len];
+		(void)ki2_jl_get_kanji(buf->wnn, cls, n, dispp, len);
+		dispp[len] = savechar;
+		dispp += len;
+
+		/* $B$+$J%P%C%U%!$N0LCV$r99?7(B */
+		kanap += jl_yomi_len(buf->wnn, cls, n);
+
+		/* $B<!$NJ8@a>pJs$N99?7(B */
+		cls = n;
+		clps++;
+	}
+
+	/* $B<!$N(B clauseInfo $B$N@_Dj(B */
+	if (cls < jl_bun_suu(buf->wnn))
+		clps->ltop = jl_dai_top(buf->wnn, cls);
+	else
+		clps->ltop = 1;
+
+	return 0;
+}
+
+/* doKantanSConvert -- $B;XDj$5$l$?J8@a$r>.J8@a$H$7$FC1J8@aJQ49$9$k(B */
+static int
+doKantanSConvert(buf, cl)
+jcConvBuf *buf;
+int cl;
+{
+	int	next = cl + 1;
+	jcClause	*clp;
+	int	len, newlen, diff;
+	wchar	savechar;
+	wchar	*savep;
+	int	nsbun;
+
+	TRACE("doKantanSConvert", "Enter")
+
+	/*
+	 * $BJQ49$9$kA0$K!">/$J$/$H$b;XDj$5$l$?J8@a$ND>A0$^$G$,JQ49$5$l$F(B
+         * $B$$$k$3$H$rJ]>Z$9$k(B
+	 */
+	if (makeConverted(buf, cl) < 0)
+		return -1;
+
+	/*
+	 * $B;XDj$5$l$?J8@a$r>.J8@a$H$7$FC1J8@aJQ49$9$k(B
+	 * $B%+%l%s%HJ8@a$N:F@_Dj$J$I$O$7$J$$(B
+	 */
+
+	clp = buf->clauseInfo + cl;
+
+	/*
+	 * $BFI$_$r(B NULL $B%?!<%_%M!<%H$9$k(B
+	 * $BC1$K(B 0 $B$rF~$l$k$H<!$NJ8@a$,2u$l$k$N$G!"$=$NA0$K%;!<%V$7$F$*$/(B
+	 */
+	savep = (clp + 1)->kanap;
+	savechar = *savep;
+	*savep = 0;
+
+	/* $BC1J8@aJQ49$9$k(B */
+	nsbun = jl_tan_conv(buf->wnn, clp->kanap, cl, next,
+				getHint(buf, cl, next), WNN_SHO);
+
+
+	/* $B$9$+$5$:%;!<%V$7$F$"$C$?J8;z$r$b$H$KLa$9(B */
+	*savep = savechar;
+
+	if (nsbun < 0) {
+		jcErrno = JE_WNNERROR;
+		return -1;
+	}
+
+	/* $BJQ49J8;zNs$ND9$5$N%A%'%C%/(B */
+	clp = buf->clauseInfo + cl;
+	len = jl_kanji_len(buf->wnn, cl);
+	diff = len - ((clp + 1)->dispp - clp->dispp);
+	newlen = (buf->displayEnd - buf->displayBuf) + diff;
+	if (newlen > buf->bufferSize) {
+		if (resizeBuffer(buf, newlen) < 0)
+			return -1;
+	}
+
+	/* $BJ8@a$rA^F~$9$k$N$G!"I=<(%P%C%U%!$NFbMF$r0\F0$5$;$k(B */
+	/* $B$I$&$;$"$H$+$iO"J8@aJQ49$9$k$+$i$$$$$G$O$J$$$+$H$$$&9M$(J}$b$"$k$,!"(B
+	 * $B$I$3$G%(%i!<$,5/$3$C$F$b0l1~$N(B consistency $B$,J]$?$l$k$h$&$K(B
+	 * $B$9$k$H$$$&$N$,L\I8$G$"$k(B
+	 */
+	moveDBuf(buf, next, diff);
+
+	/* $B$G$O(B clauseInfo $B$KJQ497k2L$rF~$l$k(B */
+	clp = buf->clauseInfo + cl;
+	clp->conv = 1;
+	clp->ltop = jl_dai_top(buf->wnn, cl);
+
+	/* $BI=<(%P%C%U%!$XJQ49J8;zNs$r%3%T!<(B */
+	/* jl_get_kanji $B$G$O!":G8e$N(B NULL $B$b%3%T!<$5$l$k$N$GCm0U(B */
+	savechar = clp->dispp[len];
+	(void)ki2_jl_get_kanji(buf->wnn, cl, next, clp->dispp, len);
+	clp->dispp[len] = savechar;
+
+	/* $B<!$N(B clauseInfo $B$N@_Dj(B */
+	if (next < jl_bun_suu(buf->wnn))
+		(clp + 1)->ltop = jl_dai_top(buf->wnn, next);
+
+	return 0;
+}
+
+
+/* makeConverted -- $B;XDj$5$l$?J8@a$ND>A0$^$G$,(B jllib $B$GJQ49$5$l$F$$$k(B
+   $B$3$H$rJ]>Z$9$k(B */
+static int
+makeConverted(buf, cl)
+jcConvBuf *buf;
+int cl;
+{
+	int	nsbun;
+	int	next;
+	int	status;
+	wchar	savechar;
+	jcClause	*clpc, *clpn;
+
+	TRACE("makeConverted", "Enter")
+
+#ifdef DEBUG_WNNLIB
+	showBuffers(buf, "before makeConverted");
+#endif
+
+	/* $B4{$KJQ49$5$l$F$$$k$+%A%'%C%/$9$k(B */
+	nsbun = jl_bun_suu(buf->wnn);
+	if (cl <= nsbun)
+		return 0;
+
+	/* $BJQ49$5$l$F$$$J$$J8@a$rEPO?$9$k(B */
+	clpc = buf->clauseInfo + nsbun;
+	for (; nsbun < cl; nsbun = next, clpc = clpn) {
+		clpn = clpc + 1;
+		next = nsbun + 1;
+
+		/* $B4{$KEPO?$5$l$F$$$l$P!"2?$b$7$J$$(B */
+		if (clpc->conv == 1)
+			continue;
+
+		/* $BI=<(J8;zNs$r(B NULL $B%?!<%_%M!<%H$9$k(B */
+		savechar = *clpn->dispp;
+		*clpn->dispp = 0;
+
+		/*
+		 * jllib $B$K$OL5JQ49$NJ8@a$rEPO?$9$k5!G=$,$J$$$N$G!"(B
+		 * $B$H$j$"$($:A08e$N@\B3$J$7$GC1J8@aJQ49$9$k$3$H$K$9$k(B
+		 */
+		status = jl_tan_conv(buf->wnn, clpc->dispp,
+					nsbun, next, WNN_NO_USE, WNN_SHO);
+
+		/* $B%;!<%V$7$?J8;z$rLa$9(B */
+		*clpn->dispp = savechar;
+
+		if (status < 0) {
+			jcErrno = JE_WNNERROR;
+			return -1;
+		}
+	}
+
+#ifdef DEBUG_WNNLIB
+	showBuffers(buf, "after makeConverted");
+#endif
+
+	return 0;
+}
+
+/* unconvert -- $B;XDj$5$l$?HO0O$NJ8@a$r0l$D$NL5JQ49$NJ8@a$K$9$k(B */
+static int
+unconvert(buf, start, end)
+jcConvBuf *buf;
+int start;
+int end;
+{
+	jcClause	*clps, *clpe;
+	int	diff, len;
+	wchar	savechar;
+
+	TRACE("unconvert", "Enter")
+
+	if (end <= start)
+		return 0;
+
+	if (start >= buf->nClause)
+		return 0;
+
+#ifdef DEBUG_WNNLIB
+	showBuffers(buf, "before unconvert");
+#endif
+
+	clps = buf->clauseInfo + start;
+	clpe = buf->clauseInfo + end;
+
+	/*
+	 * $BI=<(%P%C%U%!$NFbMF$r$+$J%P%C%U%!$NFbMF$GCV$-49$($k(B
+	 * $B!D$H$$$C$F$b<B:]$NF0:n$O$=$l$[$I4JC1$G$O$J$$(B
+	 *
+	 * $B!&$^$:!"CV$-49$($?7k2L!"I=<(%P%C%U%!$,$"$U$l$J$$$+D4$Y!"(B
+	 *   $B$"$U$l$k$h$&$J$i%P%C%U%!$N%5%$%:$rBg$-$/$9$k(B
+	 * $B!&I=<(%P%C%U%!$K!"$+$J%P%C%U%!$+$i%G!<%?$r0\$9(B
+	 * $B!&(BclauseInfo $B$r=q$-49$($F!"(Bstart $B$+$i(B end-1 $B$^$G$NJ8@a$r(B
+	 *   $B0l$D$NL5JQ49$NJ8@a$K$^$H$a$k(B
+	 * $B!&$b$A$m$s(B nClause $B$bJQ$($k(B
+	 * $B!&(Bstart+1 $B$+$i:G8e$^$G$NJ8@a$N(B clauseInfo $B$N(B dispp $B$r(B
+	 *   $BI=<(%P%C%U%!$N$:$l$K1~$8$FD4@0$9$k(B
+	 *
+	 * $B$=$NB>$K<!$N$3$H$b9T$J$&I,MW$,$"$k$,!"$3$N4X?t$G$O$d$i$J$$(B
+	 * $B>e0L$N4X?t$G@_Dj$9$k$3$H(B
+	 * $B!&BgJ8@a%U%i%0(B (ltop) $B$N@_Dj(B
+	 * $B!&%+%l%s%HJ8@a!"$*$h$S<!8uJdJ8@a$N0\F0(B
+	 *   $B<!8uJdJ8@a$,L5JQ49$NJ8@a$K$J$C$F$7$^$C$?;~$N=hM}(B
+	 * $B!&%I%C%H$N0\F0(B
+	 */
+
+	/* $BFI$_$ND9$5$H4A;z$ND9$5$N:9$rD4$Y$k(B */
+	diff = (clpe->kanap - clps->kanap) - (clpe->dispp - clps->dispp);
+	/* $BCV$-49$($?>l9g$NI=<(%P%C%U%!$ND9$5(B */
+	len = (buf->displayEnd - buf->displayBuf) + diff;
+	/* $B%P%C%U%!$N%5%$%:$,B-$j$J$1$l$P%5%$%:$rBg$-$/$9$k(B */
+	if (len > buf->bufferSize) {
+		if (resizeBuffer(buf, len) < 0) {
+			/* $B%5%$%:$,JQ$($i$l$J$+$C$?(B */
+			return -1;
+		}
+	}
+
+	/* $BCV$-49$((B */
+	/* $B$^$:8e$m$NItJ,$rF0$+$7$F$+$i(B */
+	moveDBuf(buf, end, diff);
+	/* $BFI$_$rF~$l$k(B */
+	(void)bcopy((char *)clps->kanap, (char *)clps->dispp,
+		    (clpe->kanap - clps->kanap) * sizeof(wchar));
+
+	/*
+	 * start $B$+$i(B end $B$^$G$NJ8@a$r0l$D$K$^$H$a$k(B
+	 */
+
+	/* $BL5JQ49>uBV$K$J$C$?J8@a$N(B clauseInfo $B$N@_Dj(B */
+	clps->conv = 0;
+
+	/* end $B$+$i$"$H$N(B clauseInfo $B$r(B'$B$D$a$k(B' */
+	moveCInfo(buf, end, start + 1 - end);
+
+	/* $BJ8@a$rEPO?$9$k(B */
+	/* $BEPO?$5$l$F$$$kJ8@a$ND9$5$r%A%'%C%/(B */
+	if (jl_bun_suu(buf->wnn) < end)
+		end = -1;
+
+	/* $BEPO?$9$kA0$K!"FI$_$r(B NULL $B%?!<%_%M!<%H$7$F$*$/(B */
+	clpe = clps + 1;
+	savechar = *clpe->kanap;
+	*clpe->kanap = 0;
+
+	/* $BL5JQ49$GEPO?$7$?$$$,$G$-$J$$$N$G!"A08e$N@\B3$J$7$G!"C1J8@a(B
+	 * $BJQ49$9$k(B
+	 */
+
+	len = jl_tan_conv(buf->wnn, clps->kanap,
+				 start, end, WNN_NO_USE, WNN_SHO);
+
+	/* $BFI$_$r85$K!"La$7$F$*$/(B */
+	*clpe->kanap = savechar;
+
+#ifdef DEBUG_WNNLIB
+	showBuffers(buf, "after unconvert");
+#endif
+
+	/* $BEPO?$G$-$?$+$r!"%A%'%C%/(B */
+	if (len < 0) {
+		jcErrno = JE_WNNERROR;
+		return -1;
+	}
+
+	return 0;
+}
+
+static int
+expandOrShrink(buf, small, expand, convf)
+jcConvBuf *buf;
+int small;
+int expand;
+int convf;
+{
+	jcClause	*clp, *clpe;
+	wchar	*kanap, *dispp;
+	int	start, end;
+	int	len;
+	int	nsbun;
+
+	TRACE("expandOrShrink", "Enter")
+
+	start = small ? buf->curClause : buf->curLCStart;
+	end = small ? start + 1 : buf->curLCEnd;
+
+	clp = buf->clauseInfo + start;
+	clpe = buf->clauseInfo + end;
+
+	/*
+	 * $B?-$S=L$_$G$-$k$+$N%A%'%C%/(B
+	 */
+	if (expand) {
+		/*
+		 * $B%+%l%s%HJ8@a$,:G8e$NJ8@a$N;~$K$O(B
+		 * $B$b$&9-$2$i$l$J$$(B
+		 */
+		if (end >= buf->nClause) {
+			jcErrno = JE_CANTEXPAND;
+			return -1;
+		}
+		len = 1;
+	} else {
+		if (buf->curClause == buf->nClause ||
+		    clpe->kanap - clp->kanap <= 1) {
+			/* $B%+%l%s%HJ8@a$,6u$+!"$"$k$$$OD9$5$,#10J2<(B */
+			jcErrno = JE_CANTSHRINK;
+			return -1;
+		}
+		len = -1;
+	}
+
+	/* $BA48uJdJ8@a$,%+%l%s%HBgJ8@a$+$=$l0J9_$K$"$l$PL58z$K$9$k(B */
+	checkCandidates(buf, start, buf->nClause);
+
+	/* jclib $B$H8_49$rJ]$D$?$a!":FJQ49;XDj$G$J$$>l9g$O!"FCJL$K=hM}$9$k(B */
+	if (!convf) {
+		/* jclib $B$HF1MM$K(B unconvert() $B$r;H$C$F!"=hM}$r$7$F$bNI$$$N(B
+		 * $B$@$,!"L5BL$,$"$k$N$GFH<+$N=hM}$H$9$k(B
+		 */
+		int ksize;
+		int dsize;
+
+		/* jllib $B$N>pJs$,$"$l$P!"%+%l%s%HJ8@a0J9_$rL58z$K$9$k(B */
+		if (start < jl_bun_suu(buf->wnn))
+			jl_kill(buf->wnn, start, -1);
+
+		/* $B%+%l%s%HJ8@a0J9_$NI=<(%P%C%U%!$NFbMF$r!"$+$J%P%C%U%!(B
+		 * $B$NFbMF$GCV49$($k(B (unconvert() $B;2>H(B)
+		 */
+
+		clp = buf->clauseInfo + start;
+
+		/* $B$^$:!"I=<(%P%C%U%!$NBg$-$5$rD4$Y!"I,MW$J$i$P%P%C%U%!(B
+		 * $B$r3HD%$9$k(B
+		 */
+		ksize = buf->kanaEnd - clp->kanap;
+		dsize = ksize + (clp->dispp - buf->displayBuf);
+		if (dsize > buf->bufferSize) {
+			if (resizeBuffer(buf, dsize))
+				return -1;
+		}
+
+		/* $BI=<(%P%C%U%!$NFbMF$r!"$+$J%P%C%U%!$NFbMF$GCV49$($k(B */
+		bcopy(clp->kanap, clp->dispp, ksize * sizeof (wchar));
+
+		/* $BI=<(%P%C%U%!$N=*$j$r@_Dj$9$k(B */
+		buf->displayEnd = clp->dispp + ksize;
+
+		/* $B%+%l%s%HJ8@a$r@_Dj$9$k(B
+		 */
+		buf->curClause = buf->curLCStart = start;
+		buf->dot = clp->kanap;
+		clp->conv = 0;
+		clp->ltop = 1;
+
+		/* $B?-=L$7$?7k2L!"J8@a?t$O(B start + 1 ($B%+%l%s%HJ8@a$ND9(B
+		 * $B$5$,(B 1 $B$G$"$C$?;~!"=L$a$?7k2L%+%l%s%HJ8@a$,$J$/$J$k!#(B
+		 * $B$^$?$O!"%+%l%s%HJ8@a$N8e$K$R$H$D$NJ8@a$7$+$J$/!"$=(B
+		 * $B$NJ8@a$ND9$5$,(B 1 $B$G$"$C$?>l9g!"?-$P$7$?7k2L%+%l%s%H(B
+		 * $BJ8@a$h$j8e$NJ8@a$,$J$/$J$k(B) $B$+(B start + 2 $B$K$J$k(B
+		 */
+		 
+		/* $B$^$:!"?-=L8e$N%+%l%s%HJ8@a$ND9$5$r7W;;$9$k(B */
+		ksize = buf->clauseInfo[end].kanap - clp->kanap + len;
+
+		/* $B$=$7$F!"%+%l%s%HJ8@a$N8e$K$"$kJ8@a$r@_Dj$9$k(B */
+		if (ksize == 0 || buf->displayEnd == clp->dispp + ksize) {
+			/* $B=L$a$?7k2L%+%l%s%HJ8@a$,$J$/$J$C$?$+!"(B
+			 * $B?-$P$7$?7k2L%+%l%s%HJ8@a$N8e$NJ8@a$,$J$/$J$C$?(B
+			 *
+			 * $B$3$l$i$N>l9g$O!"A0$N%+%l%s%HJ8@a0J9_$r$R$H(B
+			 * $B$^$H$a(B ($B$R$H$D$NBgJ8@a(B) $B$K$7$F!"$=$l$r%+%l(B
+			 * $B%s%HJ8@a(B ($BBgJ8@a(B) $B$H$7$F$7$^$&(B
+			 *
+			 * $B$3$N;~!"(BclauseInfo $B$NBg$-$5$O!"I,$:(B start + 1
+			 * $B$h$jBg$-$$$3$H$,J]>Z$5$l$F$$$k(B
+			 */
+			buf->nClause = buf->curLCEnd = start + 1;
+
+			/* $BKvHxJ8@a$r%]%$%s%H$5$;$k(B */
+			clp++;
+		} else if (start + 2 > buf->clauseSize
+				&& resizeCInfo(buf, start + 1) < 0) {
+			/* $B=L$a$h$&$H$9$kJ8@a$,:G8e$NJ8@a$@$C$?>l9g!"(B
+			 * $BD9$5$,(B 1 $B$NJ8@a$,A}$($k$3$H$K$J$k!#(B
+			 * $B$,!"(BclauseInfo $B$NBg$-$5$r%A%'%C%/$7!"$=$l$r(B
+			 * $BA}$d$;$J$+$C$?$N$G!"%+%l%s%HJ8@a0J9_$rA4It$R(B
+			 * $B$H$^$H$a$K$9$k(B ($B%P%C%U%!$N@09g@-$rJ]$D$?$a(B)
+			 */
+			buf->nClause = buf->curLCEnd = start + 1;
+			clp++;
+			clp->kanap = buf->kanaEnd;
+			clp->dispp = buf->displayEnd;
+			clp->conv = 0;
+			clp->ltop = 1;
+
+			/* $B$G$b!"%(%i!<$O%(%i!<$J$N$G!"%(%i!<$H$7$FJV$9(B */
+#ifdef DEBUG_WNNLIB
+			showBuffers(buf,
+				"after expandOrShrink [noconv, error]");
+#endif
+			return -1;
+		} else {
+			/* $B?-=L$G$-$?$N$G!"%+%l%s%HJ8@a$N8e$NJ8@a$r@_Dj$9$k(B
+			 * ($B$"$^$j!"0UL#$O$J$$$H$O;W$&$,!">.J8@a$N?-=L8e$N(B
+			 *  $BBgJ8@a$N@_Dj$O!"(Bjclib $B$N@_Dj$HF1$8$K$7$F$*$/(B)
+			 */
+			buf->curLCEnd = start + (small ? 2 : 1);
+			buf->nClause = start + 2;
+			clpe = clp + 1;
+			clpe->kanap = clp->kanap + ksize;
+			clpe->dispp = clp->dispp + ksize;
+			clpe->conv = 0;
+			clpe->ltop = small ? 0 : 1;
+
+			/* $BKvHxJ8@a$r%]%$%s%H$5$;$k(B */
+			clp += 2;
+		}
+
+		/* $BKvHxJ8@a$N>pJs$r@_Dj$9$k(B */
+		clp->kanap = buf->kanaEnd;
+		clp->dispp = buf->displayEnd;
+		clp->conv = 0;
+		clp->ltop = 1;
+
+#ifdef DEBUG_WNNLIB
+		showBuffers(buf, "after expandOrShrink [noconv]");
+#endif
+		return 0;
+	}
+
+	/* $B$9$Y$F$NJ8@a$,JQ49$5$l$F$$$k$3$H$rJ]>Z$9$k(B */
+	makeConverted(buf, buf->nClause);
+
+	/* 
+	 * $BJ8@a$ND9$5$rJQ99$9$k!#$3$N;~!"A0J8@a$K@\B32DG=$K$7$F$*$/$H(B
+	 * $B:$$k$3$H$,$"$k!#Nc$($P!VL5NLBg?t!W$HF~NO$7$h$&$H$7$F!"(B
+	 *   a) "$B$`$j$g$&$?$$$9$&(B" $B$rJQ49$9$k$H(B"$BL5NA(B $BBP?t(B" $B$H$J$k!#(B
+	 *   b) "$BL5NA(B" $B$r(B "$BL5NL(B" $B$KD>$9!#(B
+	 *   c) "$BBP?t(B" $B$r(B "$BBg?t(B" $B$KD>$=$&$H;W$C$?$,8uJd$K$J$$$N$G(B2$BJ8;zJ,(B
+	 *      $BJ8@a$r=L$a$F(B "$BBg(B $B?t(B" $B$KJ,$1$h$&$H$9$k!#(B
+	 *   d) $B$H$3$m$,(B "$B$?$$(B" $B$,A08uJd$K@\B3$7$F$7$^$$!"(B"$BL5NLBN(B $B?t(B" $B$K$J$k!#(B
+	 *   e) "$BL5NLBg(B" $B$H$$$&8uJd$O$J$$$N$G!";EJ}$J$/(B2$BJ8;zJ8@a$r=L$a$k$H(B
+	 *      "$BL5NA(B $BBP?t(B" $B$K$J$C$F$7$^$C$?!#(B
+	 *   f) b) $B$KLa$k!#(B
+	 * ($B$^!"$3$N>l9g$K$O$O$8$a$+$i!VL5NLBg?t!W$rEPO?$7$F$*$1$P$$$$$N$@$,(B)
+	 */
+       len += jl_yomi_len(buf->wnn, start, end);
+#ifdef WNN6
+	nsbun = jl_fi_nobi_conv(buf->wnn, start, len, -1, 0,
+					small ? WNN_SHO : WNN_DAI);
+#else
+	nsbun = jl_nobi_conv(buf->wnn, start, len, -1, 0,
+				small ? WNN_SHO : WNN_DAI);
+#endif
+
+	if (nsbun < 0) {
+		jcErrno = JE_WNNERROR;
+		return -1;
+	}
+
+	/* clauseInfo $B$N%5%$%:$N%A%'%C%/$7$F!"I,MW$J$i$PA}$d$9(B */
+	if (nsbun > buf->clauseSize) {
+		if (resizeCInfo(buf, nsbun) < 0)
+			return -1;
+	}
+	buf->nClause = nsbun;
+
+	/* $BI=<(%P%C%U%!$NBg$-$5$r%A%'%C%/$7$F!"I,MW$J$i$PA}$d$9(B */
+	clp = buf->clauseInfo + start;
+	len = clp->dispp - buf->displayBuf + jl_kanji_len(buf->wnn, start, -1);
+	if (len > buf->bufferSize) {
+		if (resizeBuffer(buf, len) < 0)
+			return -1;
+	}
+
+	/* $B%+%l%s%HJ8@a$r3P$($F$*$/(B */
+	buf->curClause = start;
+
+	/* $BJQ497k2L$r!"I=<(%P%C%U%!$KF~$l$F$$$/(B */
+	clp = buf->clauseInfo + start;
+	kanap = clp->kanap;
+	dispp = clp->dispp;
+	while (start < nsbun) {
+		end = start + 1;
+
+		/* $BJ8@a>pJs$N@_Dj(B */
+		clp->kanap = kanap;
+		clp->dispp = dispp;
+
+		/* $BI=<(%P%C%U%!$KJQ49J8;zNs$r%3%T!<(B
+		 * jl_get_kanji $B$O:G8e$N(B NULL $B$^$G%3%T!<$5$l$k$N$GCm0U(B
+		 */
+		{
+			int i = jl_kanji_len(buf->wnn, start, end);
+			wchar c = dispp[i];
+
+			(void)ki2_jl_get_kanji(buf->wnn, start, end, dispp, i);
+			dispp[i] = c;	/* $B85$KLa$9(B */
+			dispp += i;	/* $B0LCV$N99?7(B */
+			clp->conv = 1;
+			clp->ltop = jl_dai_top(buf->wnn, start);
+		}
+
+		/* $B$+$J%P%C%U%!$N0LCV$r99?7(B */
+		kanap += jl_yomi_len(buf->wnn, start, end);
+
+		/* $B<!$NJ8@a$X(B */
+		start = end;
+		clp++;
+	}
+
+	/* $B:G8e$N(B clauseInfo $B$N@_Dj(B */
+	clp->kanap = buf->kanaEnd;
+	clp->dispp = buf->displayEnd = dispp;
+	clp->conv = 0;
+	clp->ltop = 1;
+
+	/* $B%+%l%s%HJ8@a$r:F@_Dj$9$k(B */
+	setCurClause(buf, buf->curClause);
+
+	/* $B%I%C%H$N:F@_Dj(B */
+	DotSet(buf);
+
+#ifdef DEBUG_WNNLIB
+	showBuffers(buf, "after expand_or_shrink");
+#endif
+	return 0;
+}
+
+/* getCandidates -- $BA48uJd$r<h$j=P$9!#$?$@$7!"4{$K<h$j=P$7:Q$_$J$i2?$b$7$J$$(B */
+static int
+getCandidates(buf, small)
+jcConvBuf *buf;
+int small;
+{
+	int start, end;
+	
+	TRACE("getCandidates", "Enter")
+
+	/*
+	 * $B4{$K8uJd$,<h$j=P$5$l$F$$$k>l9g!"%+%l%s%HJ8@a$H8uJdJ8@a$,0lCW(B
+	 * $B$7$J$$$3$H$b$"$k$,!"8uJdJ8@a$N@_Dj$rM%@h$9$k$3$H$K$9$k!#$3$N(B
+	 * $B>l9g!"8uJdJ8@a$O!"I,$:%+%l%s%HJ8@a$KEy$7$$$+$=$l$K4^$^$l$F$$(B
+	 * $B$k$O$:!#(B
+	 */
+	if (small) {
+		/* $B8uJd$,<h$j=P$7:Q$_$J$i!"2?$b$7$J$$(B */
+		if (buf->candKind == CAND_SMALL &&
+		    buf->candClause == buf->curClause)
+			return 0;
+					    
+		/* $B%+%l%s%H>.J8@a$N8uJd$r<h$j=P$9(B */
+		start = buf->curClause;
+		end = start + 1;
+		if (jl_zenkouho(buf->wnn,
+				 start,
+				 getHint(buf, start, end) & WNN_USE_MAE,
+				 WNN_UNIQ) < 0) {
+			buf->candClause = -1;
+			jcErrno = JE_WNNERROR;
+			return -1;
+		}
+	} else {
+		/* $B8uJd$,<h$j=P$7:Q$_$J$i!"2?$b$7$J$$(B */
+#if 0
+		if (buf->candKind == CAND_LARGE &&
+		    buf->candClause >= buf->curLCStart &&
+		    buf->candClauseEnd <= buf->curLCEnd)
+			return 0;
+#else
+		if (buf->candKind == CAND_LARGE &&
+		    buf->candClause >= buf->curLCStart &&
+		    buf->candClauseEnd <= buf->curLCEnd &&
+		    buf->candClause <= buf->curClause &&
+		    buf->candClauseEnd > buf->curClause)
+			return 0;
+#endif
+
+		/* $B%+%l%s%HBgJ8@a$N8uJd$r<h$j=P$9(B */
+		start = buf->curLCStart;
+		end = buf->curLCEnd;
+#ifndef WNN6
+		/*
+		 * jl $B%i%$%V%i%j$N8uJd%P%C%U%!FbMF$rGK4~$9$k!#(B
+		 * curLCStart $B$,0JA0$HF1$8$G$+$D(B curLCEnd $B$,(B
+		 * $B0[$J$k>l9g(B ($B$D$^$j%+%l%s%HBgJ8@a$,8e$m$K?-$S$?>l9g(B)$B!"(B
+		 * $B$3$&$7$J$$$H(B Wnn4 $B$N(B jl $B%i%$%V%i%j$O8uJd$r:F<hF@(B
+		 * $B$7$F$/$l$J$$!#(B
+		 */
+		jl_kill(buf->wnn, 0, 0);
+#endif
+		if (jl_zenkouho_dai(buf->wnn,
+					start,
+					end,
+					getHint(buf, start, end),
+					WNN_UNIQ) < 0) {
+			buf->candClause = -1;
+			jcErrno = JE_WNNERROR;
+			return -1;
+		}
+	}
+
+	/* $B<!8uJd$N<h$j=P$7$N$?$a$N>pJs$r3P$($F$*$/(B */
+	buf->candKind = small ? CAND_SMALL : CAND_LARGE;
+	buf->candClause = start;
+	buf->candClauseEnd = end;
+	return 0;
+}
+
+/* setCandidate -- $B;XDj$5$l$?8uJd$G%P%C%U%!$rCV$-49$($k(B */
+static int
+setCandidate(buf, n)
+jcConvBuf *buf;
+int n;
+{
+	int	start = buf->candClause;
+	int 	end = buf->candClauseEnd;
+	int	oldlen, newlen, bdiff;
+	int	oldclen, newclen, cdiff;
+	int	newend;
+	jcClause	*clp;
+
+	TRACE("setCandidate", "Enter")
+#ifdef DEBUG_WNNLIB
+	fprintf(stderr, "setCandidate for %d as %s\n",
+		n, buf->candKind == CAND_SMALL ? "small" : "large");
+	showBuffers(buf, "setCandiate (before)");
+#endif
+	
+	clp = buf->clauseInfo + start;
+	oldlen = (buf->clauseInfo + end)->dispp - clp->dispp;
+	oldclen = jl_bun_suu(buf->wnn);
+	
+	if (buf->candKind == CAND_SMALL) {
+		/* $B%+%l%s%H>.J8@a$r!";XDj8uJd$GCV$-49$($k(B */
+		if (jl_set_jikouho(buf->wnn, n) < 0) {
+			jcErrno = JE_WNNERROR;
+			return -1;
+		}
+	} else {
+		/* $B%+%l%s%HBgJ8@a$r!";XDj8uJd$GCV$-49$($k(B */
+		if (jl_set_jikouho_dai(buf->wnn, n) < 0) {
+			jcErrno = JE_WNNERROR;
+			return -1;
+		}
+	}
+	
+	/* $BJQ498e$NJ8@a?t$N%A%'%C%/$9$k(B */
+	newclen = jl_bun_suu(buf->wnn);
+	if (newclen < 0) {
+		jcErrno = JE_WNNERROR;
+		return -1;
+	}
+	cdiff = newclen - oldclen;
+	newend = end + cdiff;
+	
+	/* $BJQ498e$N%G%#%9%W%l%$%P%C%U%!$N%5%$%:$r%A%'%C%/$9$k(B */
+	newlen = jl_kanji_len(buf->wnn, start, newend);
+	if (newlen <= 0) {
+		jcErrno = JE_WNNERROR;
+		return -1;
+	}
+	bdiff = newlen - oldlen;
+
+#ifdef DEBUG_WNNLIB
+	{
+		wchar	candstr[1024];
+		
+		fprintf(stderr, "Candidate[%s]: '",
+			buf->candKind == CAND_SMALL ? "small" : "large");
+		if (newlen >= 1024) {
+			fprintf(stderr,
+				 "* candidate string is too large [%d] *",
+				 newlen);
+		} else {
+			candstr[0] = 0;
+			ki2_jl_get_zenkouho_kanji(buf->wnn, n, candstr, 1024);
+			printBuffer (candstr, candstr + newlen);
+		}
+		fprintf(stderr, "'\n");
+	}
+#endif
+
+	/*
+	 * $B%G%#%9%W%l%$%P%C%U%!$r:F@_Dj$9$k(B
+	 *
+	 * $B:G=i$K!"=<J,$J%G%#%9%W%l%$%P%C%U%!$NBg$-$5$r3NJ]$7$F$*$/!#(B
+	 * $B<!$K!"CV$-49$(8e$N8uJdJ8;zNs$N$?$a$N>l=j$r3NJ]$9$k!#:G8e$K!"(B
+	 * $BCV$-49$($k8uJdJ8;zNs$r%G%#%9%W%l%$%P%C%U%!$KA^F~$9$k!#(B
+	 */
+	{
+		int	buflen = (buf->displayEnd - buf->displayBuf) + bdiff;
+		wchar	*dispp = clp->dispp;
+		wchar	tmp;
+	
+		if (buflen > buf->bufferSize
+		    && resizeBuffer(buf, buflen) < 0) {
+			return -1;
+		}
+		
+		moveDBuf(buf, end, bdiff);
+	
+		/*
+		 * $B8uJdJ8;zNs$NA^F~$O!"(Bjl_get_kanji() $B$rMQ$$$k$N$G!"(B
+		 * $B$=$l$,@_Dj$9$k:G8e$N(B NUL $BJ8;z$KCm0U!#(B
+		 */
+		tmp = dispp[newlen];
+		if (ki2_jl_get_kanji(buf->wnn, start, newend,
+				     dispp, newlen) <= 0) {
+			jcErrno = JE_WNNERROR;
+			return -1;
+		}
+		dispp[newlen] = tmp;
+	}
+
+
+	/*
+	 * clauseInfo$B$r:F@_Dj$9$k(B
+	 *
+	 * $B:G=i$K!"=<J,$J(B clauseInfo $B$NBg$-$5$r3NJ]$7$F$*$/!#<!$K!"(B
+	 * $B8uJdCV$-49$(8e$NJ8@a>pJs$N$?$a$N>l=j$r3NJ]$9$k!#:G8e$K!"(B
+	 * $BCV$-49$($?8uJd$N%P%C%U%!>pJs$r@_Dj$9$k!#(B
+	 */
+	{
+		wchar	*kanap, *dispp;
+		int	i, j;
+		
+		if (buf->nClause + cdiff > buf->clauseSize
+        	    && resizeCInfo(buf, buf->nClause + cdiff) < 0) {
+			return -1;
+		}
+	
+		moveCInfo(buf, end, cdiff);
+
+		kanap = clp->kanap;
+		dispp = clp->dispp;
+		for (i = start; i < newend; i = j) {
+			clp->kanap = kanap;
+			clp->dispp = dispp;
+			clp->conv = 1;
+			clp->ltop = jl_dai_top(buf->wnn, i);
+			j = i + 1;
+			kanap += jl_yomi_len(buf->wnn, i, j);
+			dispp += jl_kanji_len(buf->wnn, i, j);
+			clp++;
+		}
+
+		/*
+		 * $B8uJd$N<h$j=P$7$K$h$C$F!"A08e$NBgJ8@a$,JQ99$K$J$C$F(B
+		 * $B$$$k$+$b$7$l$J$$$N$G!"$=$l$i$r:F@_Dj$9$k!#D>8e$NJ8(B
+		 * $B@a$@$1$GNI$$$O$:$@$,!"G0$N$?$a!"$9$Y$F$r%A%'%C%/$9(B
+		 * $B$k$3$H$K$9$k!#(B
+		 */
+		for (i = 0; i < start; i++)
+			buf->clauseInfo[i].ltop = jl_dai_top(buf->wnn, i);
+		for (i = newend; i < newclen; i++)	
+			buf->clauseInfo[i].ltop = jl_dai_top(buf->wnn, i);
+	}
+
+	/*
+	 * $B<!8uJd$GCV$-49$($?7k2L!"CV$-49$(BP>]J8@a$H$=$NA08e$NBgJ8@a(B
+	 * $B$,0\F0$7$F$$$k$+$b$7$l$J$$$N$G!"%+%l%s%HJ8@a$r:F@_Dj$9$k!#(B
+	 */
+	setCurClause(buf, start);
+
+	/*
+	 * $BJ8@a$N0\F0$KH<$$!"8uJdJ8@a$b0\F0$7$F$$$k$O$:$J$N$G!":F@_Dj(B
+	 * $B$7$F$*$/(B (moveCInfo() $B;2>H(B)
+	 */
+	buf->candClause = start;
+	buf->candClauseEnd = end + cdiff;
+
+#ifdef DEBUG_WNNLIB
+	showBuffers(buf, "setCandiate (after)");
+#endif
+	return 0;
+}
+
+/* checkCandidates -- $BA48uJd$,M-8z$+%A%'%C%/$7$F!"I,MW$J=hM}$r9T$J$&(B */
+static void
+checkCandidates(buf, cls, cle)
+jcConvBuf *buf;
+int cls;
+int cle;
+{
+	/* $BJ8@aHV9f(B cls $B$+$i(B cle - 1 $B$^$G$NJ8@a$,JQ99$5$l$k(B
+	 * $B<!8uJd%P%C%U%!$K$O$$$C$F$$$k8uJdJ8@a$,$3$NCf$K4^$^$l$F$$$l$P(B
+	 * $B<!8uJd%P%C%U%!$NFbMF$rL58z$K$7$J$/$F$O$J$i$J$$(B
+	 *
+	 * $B$I$N$h$&$J>l9g$+$H$$$&$H!"(B
+	 * 1. buf->candKind $B$,(B CAND_SMALL $B$G!"(B
+	 *      cls <= buf->candClause < cle
+	 * 2. buf->candKind $B$,(B CAND_LARGE $B$G!"(B
+	 *      buf->candClause < cle $B$+$D(B cls < buf->candClauseEnd
+         */
+	if (buf->candKind == CAND_SMALL)
+		buf->candClauseEnd = buf->candClause + 1; /* $BG0$N$?$a(B */
+        if (buf->candClause < cle && cls < buf->candClauseEnd) {
+		/* $BL58z$K$9$k(B */
+		buf->candClause = buf->candClauseEnd = -1;
+	}
+}
+
+
+/* forceStudy -- $BL$JQ49$*$h$S5?;wJQ49J8@a$N3X=,(B */
+static int
+forceStudy(buf, n)
+jcConvBuf *buf;
+int n;
+{
+	int i, j, k;
+	int status;
+	wchar yomi[CL_BUFSZ], kanji[CL_BUFSZ];
+
+	TRACE("forceStudy", "Enter")
+
+#ifdef DEBUG_WNNLIB
+	showBuffers(buf, "forceStudy");
+#endif
+
+	if (n < 0 || n > buf->nClause)
+		n = buf->nClause;
+
+	/* $B$3$3$G$$$&3X=,$H$O!"IQEY>pJs$N99?7$H9M$($F$h$$(B */
+
+	/*
+	 * Wnn6 $B$G$O!"L5JQ493X=,5!G=$,$"$j!"(Bwnnlib $B$K$h$k5?;wJQ49$dL$(B
+	 * $BJQ49$NJ8@a$r3X=,$5$;$k$3$H$,$G$-$k!#$?$@$7!"L$JQ49$NJ8@a$K(B
+	 * $BBP$7$FC1=c$KIQEY$N99?7$O$G$-$J$$$N$GCm0U(B
+	 */
+
+	/*
+	 * $B:G=i$K!"JQ49:Q$_$NJ8@a?t$rD4$Y$k!#F~NO$5$l$?J8@a$,$9$Y$FJQ(B
+	 * $B49:Q$_(B (conv == 1) $B$G$"$l$P!"A4J8@a$r$NJ8@a$NIQEY>pJs$r$^$H(B
+	 * $B$a$F99?7$9$k!#JQ49:Q$_$G$J$$J8@a$,$"$C$?>l9g!"$H$j$"$($:JQ(B
+	 * $B49$7$F!"JQ497k2L$,I=<(%P%C%U%!$NFbMF$H0lCW$7$F$$$l$P!"IQEY(B
+	 * $B>pJs$r99?7$9$k$3$H$K$9$k(B
+	 */
+	status = 0;
+	for (i = 0; i < n; i++) {
+		if (buf->clauseInfo[i].conv == 1)
+			status++;
+	}
+
+	/* $B$9$Y$F$NJ8@a$,JQ49$5$l$F$$$?$i!"A4$F$NJ8@a$NIQEY$r99?7$9$k(B */
+	if (status == n) {
+#ifdef WNN6
+		status = jl_optimize_fi(buf->wnn, 0, -1);
+#else
+		status = jl_update_hindo(buf->wnn, 0, -1);
+#endif
+		if (status < 0) {
+			jcErrno = JE_WNNERROR;
+			return -1;
+		}
+		return 0;
+	}
+
+	/*
+	 * $BJ8@aC10L$GIQEY>pJs$r99?7$9$k(B
+	 * $BL$JQ49$NJ8@a$,$"$l$P!"L$JQ49$H$7$FIQEY>pJs$r99?7$9$k(B (Wnn6
+	 * $B$NL5JQ493X=,5!G=(B)
+	 */
+
+	/* $BIQEY>pJs$r99?7$9$kA0$K!"A4J8@a$rJQ49$7$F$*$/(B */
+	if (makeConverted(buf, n) < 0)
+		return -1;
+
+	for (i = 0; i < n; i = j) {
+		j = i + 1;
+		/*
+		 * $BJQ49:Q$_$NJ8@a$G$"$l$P!"$=$N$^$^IQEY>pJs$r99?7$9$k(B
+		 */
+		if (buf->clauseInfo[i].conv == 1) {
+#ifdef WNN6
+			status = jl_optimize_fi(buf->wnn, i, j);
+#else
+			status = jl_update_hindo(buf->wnn, i, j);
+#endif
+			if (status < 0) {
+				jcErrno = JE_WNNERROR;
+				return -1;
+			}
+			continue;
+		}
+
+		/*
+		 * $BL$JQ49$H5?;wJQ49$NJ8@a$KBP$7$F$O!"FI$_$r3X=,$9$k(B
+		 * $BL$JQ49$H5?;wJQ49$N>l9g$G$b!"(Bwnnlib $B$G$OI=<(%P%C%U%!$H$+(B
+		 * $B$J%P%C%U%!$NN>J}$,0lCW$7$F$$$k$N$G(B (jcKana() $B;2>H(B)$B!"(B
+		 * $B$3$3$G$O(B jllib $B$NFI$_%G!<%?$r;HMQ$9$k(B
+		 */
+
+		/* $BFI$_J8;zNs$HJQ49:QJ8;zNs$ND9$5%A%'%C%/(B */
+		if (jl_yomi_len(buf->wnn, i, j) >= CL_BUFSZ ||
+		    jl_kanji_len(buf->wnn, i, j) >= CL_BUFSZ) {
+			/* $B%P%C%U%!%*!<%P%U%m!<$rHr$1$k(B */
+			continue;
+		}
+
+		/* $BFI$_J8;zNs$N<h$j=P$7(B */
+		if (ki2_jl_get_yomi(buf->wnn, i, j, yomi, CL_BUFSZ) < 0) {
+			jcErrno = JE_WNNERROR;
+			return -1;
+		}
+		/* $BJQ49:Q$_J8;zNs$r<h$j=P$9(B */
+		if (ki2_jl_get_kanji(buf->wnn, i, j, kanji, CL_BUFSZ) < 0) {
+			jcErrno = JE_WNNERROR;
+			return -1;
+		}
+
+		/*
+		 * $BFI$_$HJQ498e$,0lCW$7$F$$$l$P!"3X=,:Q$_$H$_$J$7$F!"(B
+		 * $B$=$N$^$^IQEY>pJs$r99?7$9$k(B
+		 */
+		if (wstrcmp (yomi, kanji) == 0) {
+#ifdef WNN6
+			status = jl_optimize_fi(buf->wnn, i, j);
+#else
+			status = jl_update_hindo(buf->wnn, i, j);
+#endif
+			if (status < 0) {
+				jcErrno = JE_WNNERROR;
+				return -1;
+			}
+			continue;
+		}
+
+		/*
+		 * $BFI$_$HJQ498e$,0lCW$7$J$$$N$G!"A48uJd$NCf$+$iC5$9(B
+		 * $B$b$7!"0lCW$9$k$b$N$,$"$l$P!"IQEY>pJs$r99?7$7!"$=$&(B
+		 * $B$G$J$1$l$PIQEY>pJs$O99?7$7$J$$(B
+		 */
+		if (jl_zenkouho(buf->wnn, i,
+			 	getHint(buf, -1, -1), WNN_UNIQ) < 0) {
+			jcErrno = JE_WNNERROR;
+			return -1;
+		}
+		status = jl_zenkouho_suu(buf->wnn);
+		if (status < 0) {
+			jcErrno = JE_WNNERROR;
+			return -1;
+		}
+		for (k = 0; k < status; k++) {
+			ki2_jl_get_zenkouho_kanji(buf->wnn, k, kanji,
+						  CL_BUFSZ);
+			/* $BI,$:(B NUL $B%?!<%_%M!<%H$5$l$k$h$&$K$7$F$*$/(B */
+			kanji[CL_BUFSZ - 1] = 0;
+			if (wstrcmp(yomi, kanji) != 0)
+				continue;
+			if (jl_set_jikouho(buf->wnn, k) < 0) {
+				jcErrno = JE_WNNERROR;
+				return -1;
+			}
+#ifdef WNN6
+			status = jl_optimize_fi(buf->wnn, i, j);
+#else
+			status = jl_update_hindo(buf->wnn, i, j);
+#endif
+			if (status < 0) {
+				jcErrno = JE_WNNERROR;
+				return -1;
+			}
+			break;
+		}
+	}
+
+	return 0;
+}
+
+
+/*
+ *	$B$3$3$+$i(B Public $B$J%U%!%s%/%7%g%s(B
+ */
+
+/* jcCreateBuf -- $BJQ49%P%C%U%!$N:n@.(B */
+jcConvBuf *
+jcCreateBuffer(wnn, nclause, buffersize)
+struct wnn_buf *wnn;
+int nclause;
+int buffersize;
+{
+	jcConvBuf	*buf;
+
+	TRACE("jcCreateBuffer", "Enter")
+
+	/* $B$^$:(B jcConvBuf $B$N3NJ](B */
+	if ((buf = (jcConvBuf *)malloc(sizeof(jcConvBuf))) == NULL) {
+		jcErrno = JE_NOCORE;
+		return NULL;
+	}
+	(void)bzero((char *)buf, sizeof(jcConvBuf));
+	buf->wnn = wnn;
+
+	/* $B<!$K3F<o%P%C%U%!$N3NJ](B */
+
+	/* $B$^$:!"$+$J%P%C%U%!$HI=<(%P%C%U%!(B */
+	buf->bufferSize = (buffersize <= 0) ? DEF_BUFFERSIZE : buffersize;
+	/* $B%P%C%U%!$N:G8e$r(B NULL $B%?!<%_%M!<%H$9$k$3$H$,$"$k$N$G!"(B
+	 * 1$BJ8;zJ8Bg$-$/$7$F$*$/(B
+	 */
+	buf->kanaBuf = (wchar *)malloc((buf->bufferSize + 1) *
+					 sizeof(wchar));
+	buf->displayBuf = (wchar *)malloc((buf->bufferSize + 1) *
+					    sizeof(wchar));
+
+	/* $B<!$K(B clauseInfo $B%P%C%U%!(B */
+	buf->clauseSize = (nclause <= 0) ? DEF_CLAUSESIZE : nclause;
+	/* clauseInfo $B%P%C%U%!$O(B nclause + 1 $B8D%"%m%1!<%H$9$k(B
+	 * $B$J$<$+$H$$$&$H(B clauseinfo $B$O%G%j%_%?$H$7$FMWAG$r(B
+	 * 1$B8D;H$&$N$G(B nclause $B8D$NJ8@a$r07$&$?$a$K$O(B nclause + 1 $B8D$N(B
+	 * $BBg$-$5$r;}$?$J$1$l$P$J$i$J$$$+$i$G$"$k(B
+	 */
+	buf->clauseInfo = (jcClause *)malloc((buf->clauseSize + 1)
+					     * sizeof(jcClause));
+
+	if (buf->kanaBuf == NULL || buf->displayBuf == NULL ||
+	    buf->clauseInfo == NULL) {
+		/* malloc() $B$G$-$J$+$C$?(B */
+		Free(buf->kanaBuf);
+		Free(buf->displayBuf);
+		Free(buf->clauseInfo);
+		Free(buf);
+		jcErrno = JE_NOCORE;
+		return NULL;
+	}
+
+	(void)jcClear(buf);
+	return buf;
+}
+
+/* jcDestroyBuffer -- $BJQ49%P%C%U%!$N>C5n(B */
+int
+jcDestroyBuffer(buf, savedic)
+jcConvBuf *buf;
+int savedic;
+{
+	TRACE("jcDestroyBuffer", "Enter")
+
+	if (buf == NULL)
+		return 0;
+
+	/* $B%"%m%1!<%H$7$?%a%b%j$N2rJ|(B */
+	Free(buf->kanaBuf);
+	Free(buf->displayBuf);
+	Free(buf->clauseInfo);
+
+	/* savedic $B$,(B 0 $B$G$J$1$l$P!"4D6-$K%m!<%I$5$l$F$$$kA4$F$N%U%!%$%k$r(B
+	 * save $B$9$k(B
+	 */
+	if (savedic && jl_dic_save_all(buf->wnn) < 0) {
+		jcErrno = JE_WNNERROR;
+		return -1;
+	}
+
+	Free(buf);
+
+	return 0;
+}
+
+/* jcClear -- wnnlib $B$N=i4|2=(B ($B?7$?$JJQ49$r;O$a$kKh$K8F$P$J$1$l$P$J$i$J$$(B) */
+int
+jcClear(buf)
+jcConvBuf *buf;
+{
+	TRACE("jcClear", "Enter")
+
+	/* $B=i4|CM$N@_Dj(B */
+	buf->nClause = buf->curClause = buf->curLCStart = 0;
+	buf->curLCEnd = 1;
+	buf->candClause = buf->candClauseEnd = -1;
+	buf->kanaEnd = buf->kanaBuf;
+	buf->displayEnd = buf->displayBuf;
+	buf->clauseInfo[0].kanap = buf->kanaBuf;
+	buf->clauseInfo[0].dispp = buf->displayBuf;
+	buf->clauseInfo[0].conv = 0;
+	buf->clauseInfo[0].ltop = 1;
+	buf->dot = buf->kanaBuf;
+	buf->fixed = 0;
+	jcErrno = JE_NOERROR;
+
+	if (jl_bun_suu(buf->wnn) > 0)
+		jl_kill(buf->wnn, 0, -1);
+
+	return 0;
+}
+
+/* jcConvert -- $B%+%l%s%HJ8@a0J9_$r$+$J4A;zJQ49$9$k(B */
+int
+jcConvert(buf, small, tan, jump)
+jcConvBuf *buf;
+int small;
+int tan;
+int jump;
+{
+	int	ret;
+
+	TRACE("jcConvert", "Enter")
+
+	CHECKFIXED(buf);
+
+	if (buf->curClause == buf->nClause) {
+		/* $B%+%l%s%HJ8@a$,:G8e$NJ8@a$G$7$+$b6u(B */
+		jcErrno = JE_CLAUSEEMPTY;
+		return -1;
+	}
+
+	/* $BA48uJdJ8@a$,%+%l%s%HBgJ8@a$+$=$l0J9_$K$"$l$PL58z$K$9$k(B */
+	checkCandidates(buf,
+			small ? buf->curClause : buf->curLCStart,
+			buf->nClause);
+
+	if (tan) {
+		ret = tanConvert(buf, small);
+	} else {
+		ret = renConvert(buf, small);
+	}
+
+	if (ret < 0)
+		return ret;
+
+	if (jump) {
+		/* $B%I%C%H$H%+%l%s%HJ8@a$rJ8$N:G8e$K0\F0$5$;$k(B */
+		buf->curClause = buf->curLCStart = buf->nClause;
+		buf->curLCEnd = buf->nClause + 1;
+		buf->dot = buf->kanaEnd;
+	}
+	return 0;
+}
+
+/* jcUnconvert -- $B%+%l%s%HBgJ8@a$rL5JQ49$N>uBV$KLa$9(B */
+int
+jcUnconvert(buf)
+jcConvBuf *buf;
+{
+	jcClause	*clp = buf->clauseInfo + buf->curClause;
+
+	TRACE("jcUnconvert", "Enter")
+
+	CHECKFIXED(buf);
+
+	if (buf->curClause == buf->nClause) {
+		/* $B%+%l%s%HJ8@a$,:G8e$NJ8@a$G$7$+$b6u(B */
+		jcErrno = JE_CLAUSEEMPTY;
+		return -1;
+	}
+
+	if (!clp->conv) {
+		/* $B%+%l%s%HJ8@a$OJQ49$5$l$F$$$J$$(B */
+		/* $BL5JQ49$NJ8@a$O(B wnnlib $BFbIt$G$O>o$KBgJ8@a$H$7$F(B
+		 * $B07$o$l$k$N$G!"%+%l%s%H>.J8@a$NJQ49>uBV$r8+$F!"(B
+		 * $B$=$l$,JQ49>uBV$J$i%+%l%s%HBgJ8@aFb$N(B
+		 * $BA4$F$N>.J8@a$OJQ49>uBV!"$=$&$G$J$1$l$PL5JQ49>uBV!"(B
+		 * $B$K$J$k(B
+		 */
+		jcErrno = JE_NOTCONVERTED;
+		return -1;
+	}
+
+	/* $BA48uJdJ8@a$,%+%l%s%HBgJ8@a$+$=$l0J9_$K$"$l$PL58z$K$9$k(B */
+	checkCandidates(buf, buf->curLCStart, buf->nClause);
+
+	/* $BL5JQ49>uBV$K$9$k(B */
+	if (unconvert(buf, buf->curLCStart, buf->curLCEnd) < 0)
+		return -1;
+
+	/* $BBgJ8@a$N@_Dj(B */
+	clp = buf->clauseInfo + buf->curLCStart;
+	clp->ltop = 1;
+	(++clp)->ltop = 1;
+
+	/* $B%+%l%s%HJ8@a$N:F@_Dj(B */
+	buf->curClause = buf->curLCStart;
+	buf->curLCEnd = buf->curLCStart + 1;
+
+	/* $B%I%C%H$N@_Dj(B */
+	DotSet(buf);
+
+	return 0;
+}
+
+/* jcCancel -- $BF~NOCf$NA4J8@a$rL5JQ49>uBV$K$9$k(B */
+int
+jcCancel(buf)
+jcConvBuf *buf;
+{
+	TRACE("jcCancel", "Enter")
+
+	CHECKFIXED(buf);
+
+	if (buf->nClause <= 0)
+		return 0;
+
+	/*
+	 * $BI=<(%P%C%U%!$NFbMF$r$+$J%P%C%U%!$NFbMF$GCV49$($k(B
+	 * $B$3$N:]!"%P%C%U%!$NBg$-$5$O5$$K$9$kI,MW$,L5$$!#$J$<$J$i!"I=(B
+	 * $B<(%P%C%U%!$H$+$J%P%C%U%!$NBg$-$5$O>o$KF1$8$@$+$i(B
+	 */
+	bcopy(buf->kanaBuf, buf->displayBuf, buf->bufferSize * sizeof (wchar));
+
+	/*
+	 * $B:#$"$kA4J8@a$r0l$D$NL5JQ49>uBV$NBgJ8@a$K$9$k(B
+	 * $B$3$N:]$b!"J8@a?t$r5$$K$9$kI,MW$O$J$$!#$J$<$J$i!">/$/$H$b0l$D(B
+	 * $B$NJ8@a$O$"$C$?$O$:$@$+$i(B
+	 */
+	buf->curClause = buf->curLCStart = 0;
+	buf->nClause = buf->curLCEnd = 1;
+	buf->displayEnd = buf->displayBuf + (buf->kanaEnd - buf->kanaBuf);
+	buf->clauseInfo[0].conv = 0;
+	buf->clauseInfo[0].ltop = 1;
+	buf->clauseInfo[1].kanap = buf->kanaEnd;
+	buf->clauseInfo[1].dispp = buf->displayEnd;
+	buf->clauseInfo[1].conv = 0;
+	buf->clauseInfo[1].ltop = 1;
+
+	/* $BA48uJdJ8@a$bL58z$K$9$k(B */
+	buf->candClause = buf->candClauseEnd = -1;
+
+	/* jllib $B$NJQ49>uBV$bL58z$K$9$k(B */
+	if (jl_bun_suu(buf->wnn) > 0)
+		jl_kill(buf->wnn, 0, -1);
+
+	return 0;
+}
+
+/* jcExpand -- $B%+%l%s%HJ8@a$r#1J8;z9-$2$k(B */
+int
+jcExpand(buf, small, convf)
+jcConvBuf *buf;
+int small;
+int convf;
+{
+	TRACE("jcExpand", "Enter")
+
+	CHECKFIXED(buf);
+
+	return expandOrShrink(buf, small, 1, convf);
+}
+
+/* jcShrink -- $B%+%l%s%HJ8@a$r#1J8;z=L$a$k(B */
+int
+jcShrink(buf, small, convf)
+jcConvBuf *buf;
+int small;
+int convf;
+{
+	TRACE("jcShrink", "Enter")
+
+	CHECKFIXED(buf);
+
+	return expandOrShrink(buf, small, 0, convf);
+}
+
+/* jcKana -- $B%+%l%s%HJ8@a$r$+$J$K$9$k(B */
+int
+jcKana(buf, small, kind)
+jcConvBuf *buf;
+int small;
+int kind;
+{
+	jcClause	*clp;
+	wchar		*kanap, *kanaendp, *dispp;
+	int		start, end;
+	int		conv;
+	int		c;
+
+	TRACE("jcKana", "Enter")
+
+	CHECKFIXED(buf);
+
+	/* $BJ8@aHV9f$N%A%'%C%/(B */
+	if (buf->curClause >= buf->nClause) {
+		/* $B%+%l%s%HJ8@a$,:G8e$NJ8@a$G$7$+$b6u$@$C$?>l9g(B
+		 * $B$3$N>l9g%(%i!<$K$7$F$b$h$$$,(B...
+		 */
+		return 0;
+	}
+
+	/*
+	 * $B%+%l%s%HJ8@a$,JQ49$5$l$F$$$l$P$$$C$?$sL5JQ49$K$9$k(B
+	 */
+
+	/* $B$"$H$GJQ49>uBV$r$b$H$KLa$9$?$a!"JQ49>uBV$r%;!<%V$7$F$*$/(B */
+	conv = buf->clauseInfo[buf->curClause].conv;
+
+	if (small) {
+		start = buf->curClause;
+		end = start + 1;
+	} else {
+		start = buf->curLCStart;
+		end = buf->curLCEnd;
+	}
+
+	/* $BA48uJdJ8@a$N%A%'%C%/(B */
+	checkCandidates(buf, start, end);
+
+	/* $BL5JQ49>uBV$K$9$k(B */
+	if (unconvert(buf, start, end) < 0) {
+		return -1;
+	}
+
+	/*
+	 * small $B$,(B 0$B!"$D$^$j%+%l%s%HJ8@a$H$7$FBgJ8@a$rA*Br$7$?>l9g!"(B
+	 * $B$=$NCf$N>.J8@a$O0l$D$K$^$H$a$i$l$k$N$G!"(BcurClause $B$H(B
+	 * curLCEnd $B$rJQ$($kI,MW$,$"$k(B
+	 */
+	if (!small) {
+		buf->curClause = buf->curLCStart;
+		buf->curLCEnd = buf->curLCStart + 1;
+	}
+
+	/*
+	 * $B$+$JJQ49$9$k(B
+	 *
+	 * $BI=<(%P%C%U%!$@$1$G$O$J$/!"$+$J%P%C%U%!$bJQ49$9$k(B
+	 *
+	 * $B$3$l$K$O$5$7$?$kM}M3$O$J$$$,!"$^$"!"(BVer3 $BHG$N(B jclib $B$,(B
+	 * $B$=$&$@$C$?$N$G!D(B
+	 */
+	clp = buf->clauseInfo + buf->curClause;
+	kanap = clp->kanap;
+	kanaendp = (clp + 1)->kanap;
+	dispp = clp->dispp;
+
+	if (kind == JC_HIRAGANA) {	/* $B%+%?%+%J"*$R$i$,$J(B */
+		/* $B%+%?%+%J$r$R$i$,$J$KJQ49$9$k:]$K$O$R$i$,$J$K$J$$;z(B
+		 * "$B%t%u%v(B" $B$,$"$k$N$G$$$-$*$$$GJQ49$7$F$7$^$o$J$$$h$&$K(B
+		 * $B5$$rIU$1$J$1$l$P$J$i$J$$(B
+		 * ($B$^$"<B:]$O5$$r$D$1$k$H$$$&$[$I$N$b$N$G$O$J$$$,(B)
+		 */
+		while (kanap < kanaendp) {
+			c = *kanap;
+			if ((KANABEG + KATAOFFSET) <= c &&
+					c <= (KANAEND + KATAOFFSET)) {
+				*kanap = *dispp = c - KATAOFFSET;
+			}
+			kanap++, dispp++;
+		}
+	} else {	/* $B$R$i$,$J"*%+%?%+%J(B */
+		while (kanap < kanaendp) {
+			c = *kanap;
+			if (KANABEG <= c && c <= KANAEND) {
+				*kanap = *dispp = c + KATAOFFSET;
+			}
+			kanap++, dispp++;
+		}
+	}
+
+	/*
+	 * $BJQ49>uBV$r$b$H$KLa$7$F$*$/(B
+	 */
+
+	/* $B$H$O$$$C$F$b4{$KJQ49$5$l$?J8@a$N>l9g!"$3$l$NIQEY>pJs$r(B
+	 * $B%5!<%P$KAw$k$H$^$:$$$N$G!"$"$H$G$+$JJQ49$7$?$3$H$,$o$+$k$h$&$K(B
+	 * jcClause.conv $B$O(B -1 $B$K%;%C%H$9$k(B
+	 */
+	clp->conv = conv ? -1 : 0;
+
+	return 0;
+}
+
+/* jcFix -- $B3NDj$9$k(B */
+int
+jcFix(buf)
+jcConvBuf *buf;
+{
+	TRACE("jcFix", "Enter")
+
+	if (buf->fixed) {
+		/* $B4{$K3NDj$5$l$F$$$k(B
+		 * $B%(%i!<$K$7$F$b$h$$$,!D(B
+		 */
+		return 0;
+	}
+
+	if (forceStudy(buf, buf->nClause) < 0)
+		return -1;
+
+	/* $B3NDj%U%i%0$rN)$F$k(B */
+	buf->fixed = 1;
+
+	return 0;
+}
+
+
+/* jcFix1 -- $B:G=i$N0lJ8;z$@$1$r3NDj$9$k(B */
+int
+jcFix1(buf)
+jcConvBuf *buf;
+{
+	TRACE("jcFix1", "Enter")
+
+	if (buf->fixed) {
+		/* $B4{$K3NDj$5$l$F$$$k(B
+		 * $B%(%i!<$K$7$F$b$h$$$,!D(B
+		 */
+		return 0;
+	}
+
+	if (buf->nClause >= 1) {
+		/* $B:G=i$NJ8@a$@$1$r3X=,$9$k(B */
+		if (forceStudy(buf, 1) < 0)
+			return -1;
+
+		/* $B:G=i$NJ8@a$N0lJ8;z$@$1$K$9$k(B */
+		buf->nClause = 1;
+		buf->curClause = buf->curLCStart = 0;
+		buf->curLCEnd = 1;
+		buf->kanaEnd = buf->kanaBuf + 1; /* $B%@%_!<(B */
+		buf->displayEnd = buf->displayBuf + 1;
+		buf->clauseInfo[0].kanap = buf->kanaBuf;
+		buf->clauseInfo[0].dispp = buf->displayBuf;
+		buf->clauseInfo[0].ltop = 1;
+		buf->clauseInfo[1].kanap = buf->kanaBuf + 1;  /* $B%@%_!<(B */
+		buf->clauseInfo[1].dispp = buf->displayBuf + 1;
+		buf->clauseInfo[1].ltop = 1;
+		buf->dot = buf->kanaBuf + 1;
+		buf->candClause = buf->candClauseEnd = -1;
+	}
+
+
+	/* $B3NDj%U%i%0$rN)$F$k(B */
+	buf->fixed = 1;
+
+	return 0;
+}
+
+/* jcNext -- $B%+%l%s%HJ8@a$r<!8uJd(B/$BA08uJd$GCV$-49$($k(B */
+int
+jcNext(buf, small, prev)
+jcConvBuf *buf;
+int small;
+int prev;
+{
+	int	n;
+
+	TRACE("jcNext", "Enter")
+
+	CHECKFIXED(buf);
+
+	if (!buf->clauseInfo[buf->curClause].conv) {
+		/* $B$^$@JQ49$5$l$F$$$J$$(B */
+		jcErrno = JE_NOTCONVERTED;
+		return -1;
+	}
+
+	/* $BA48uJd$,F@$i$l$F$$$J$1$l$P!"A48uJd$rF@$k(B */
+	if (getCandidates(buf, small) < 0)
+		return -1;
+
+	n = jl_zenkouho_suu(buf->wnn);
+	if (n <= 1) {
+		/* $B<!8uJd$,$J$$(B */
+		jcErrno = n < 0 ? JE_WNNERROR : JE_NOCANDIDATE;
+		return -1;
+	}
+
+	/* $B<!8uJdHV9f$rF@$k(B */
+	n = jl_c_zenkouho(buf->wnn) + (prev ? -1 : 1);
+	if (n < 0) {
+		n = jl_zenkouho_suu(buf->wnn) - 1;
+	} else if (n >= jl_zenkouho_suu(buf->wnn)) {
+		n = 0;
+	}
+
+	if (setCandidate(buf, n) < 0) {
+		/* $B<!8uJd$,F@$i$l$J$+$C$?(B */
+		jcErrno = JE_WNNERROR;
+		return -1;
+	}
+
+	return 0;
+}
+
+/* jcCandidateInfo -- $B<!8uJd$N?t$H8=:_$N8uJdHV9f$rD4$Y$k(B
+ *		      $B$b$7<!8uJd$,$^$@%P%C%U%!$KF~$C$F$$$J$1$l$PMQ0U$9$k(B
+ */
+int
+jcCandidateInfo(buf, small, ncandp, curcandp)
+jcConvBuf *buf;
+int small;
+int *ncandp;
+int *curcandp;
+{
+	int 	cand, ncand;
+
+	TRACE("jcCandidateInfo", "Enter")
+
+	CHECKFIXED(buf);
+
+	if (!buf->clauseInfo[buf->curClause].conv) {
+		/* $B$^$@JQ49$5$l$F$$$J$$(B */
+		jcErrno = JE_NOTCONVERTED;
+		return -1;
+	}
+
+	/* $BA48uJd$,F@$i$l$F$$$J$1$l$P!"A48uJd$rF@$k(B */
+	if (getCandidates(buf, small) < 0)
+		return -1;
+
+	ncand = jl_zenkouho_suu(buf->wnn);
+	if (ncand <= 1) {
+		/* $B8uJd$,$J$$(B */
+		jcErrno = (ncand < 0) ? JE_WNNERROR : JE_NOCANDIDATE;
+		return -1;
+	}
+
+	/* $B8=:_$N8uJdHV9f$rF@$k(B */
+	cand = jl_c_zenkouho(buf->wnn);
+	if (cand < 0) {
+		/* $B8uJd$,F@$i$l$J$$(B */
+		jcErrno = JE_WNNERROR;
+		return -1;
+	}
+
+	if (ncandp != NULL) *ncandp = ncand;
+	if (curcandp != NULL) *curcandp = cand;
+
+	return 0;
+}
+
+/* jcGetCandidate -- $B;XDj$5$l$?HV9f$N8uJd$r<h$j=P$9(B */
+int
+jcGetCandidate(buf, n, candstr)
+jcConvBuf *buf;
+int n;
+wchar *candstr;
+{
+	wchar	tmp[CL_BUFSZ];
+
+	TRACE("jcGetCandidate", "Enter")
+
+	CHECKFIXED(buf);
+
+	/* $BJ8@a$N%A%'%C%/(B */
+	if (buf->candClause < 0) {
+		jcErrno = JE_NOCANDIDATE;
+		return -1;
+	}
+
+	/* $B8uJdHV9f$N%A%'%C%/(B */
+	if (n < 0 || n >= jl_zenkouho_suu(buf->wnn)) {
+		jcErrno = JE_NOSUCHCANDIDATE;
+		return -1;
+	}
+
+	/* $BJ8;zNs$r%3%T!<(B */
+	ki2_jl_get_zenkouho_kanji(buf->wnn, n, tmp, CL_BUFSZ);
+	tmp[CL_BUFSZ - 1] = 0;
+	wstrcpy(candstr, tmp);
+
+	return 0;
+}
+
+/* jcSelect -- $BI=<(%P%C%U%!$r;XDj$5$l$?8uJd$HCV$-49$($k(B */
+int
+jcSelect(buf, n)
+jcConvBuf *buf;
+int n;
+{
+	TRACE("jcSelect", "Enter")
+
+	CHECKFIXED(buf);
+
+#ifdef DEBUG_WNNLIB
+	fprintf(stderr,
+		"Select: %d [%s for %d - %d]\n",
+		n,
+		buf->candKind == CAND_SMALL ? "small" : "large",
+		buf->candClause,
+		buf->candClauseEnd);
+#endif
+
+	/* $BJ8@a$N%A%'%C%/(B */
+	if (buf->candClause < 0) {
+		jcErrno = JE_NOCANDIDATE;
+		return -1;
+	}
+
+	/* $B8uJdHV9f$N%A%'%C%/(B */
+	if (n < 0 || n >= jl_zenkouho_suu(buf->wnn)) {
+		jcErrno = JE_NOSUCHCANDIDATE;
+		return -1;
+	}
+
+	/* $B8uJd$,%;%C%H$5$l$F$$$J$1$l$P!"%;%C%H$9$k(B */
+	if (jl_c_zenkouho(buf->wnn) != n && setCandidate(buf, n) < 0)
+		return -1;
+
+	return 0;
+}
+
+/* jcDotOffset -- $BBgJ8@a$N@hF,$+$i$N%I%C%H$N%*%U%;%C%H$rJV$9(B */
+int
+jcDotOffset(buf)
+jcConvBuf *buf;
+{
+	TRACE("jcDotOffset", "Enter")
+
+	return buf->dot - buf->clauseInfo[buf->curLCStart].kanap;
+}
+
+/* jcIsConverted -- $B;XDj$5$l$?J8@a$,JQ49$5$l$F$$$k$+$I$&$+$rJV$9(B */
+int
+jcIsConverted(buf, cl)
+jcConvBuf *buf;
+int cl;
+{
+	TRACE("jcIsConverted", "Enter")
+
+	if (cl < 0 || cl > buf->nClause) {
+		/* cl == jcNClause $B$N$H$-$r%(%i!<$K$7$F$b$$$$$N$@$1$l$I(B
+		 * $B%+%l%s%HJ8@a$,(B jcNClause $B$N$H$-$,$"$k$N$G(B
+		 * $B%(%i!<$H$O$7$J$$$3$H$K$7$?(B
+		 */
+		return -1;
+	}
+	return (buf->clauseInfo[cl].conv != 0);
+}
+
+/* jcMove -- $B%I%C%H!&%+%l%s%HJ8@a$r0\F0$9$k(B */
+int
+jcMove(buf, small, dir)
+jcConvBuf *buf;
+int small;
+int dir;
+{
+	jcClause	*clp = buf->clauseInfo + buf->curClause;
+	int		i;
+
+	TRACE("jcMove", "Enter")
+
+	if (!clp->conv) {
+		/* $B%+%l%s%HJ8@a$,JQ49$5$l$F$$$J$$$N$G!"%I%C%H$N0\F0$K$J$k(B */
+		if (dir == JC_FORWARD) {
+			if (buf->curClause == buf->nClause) {
+				/* $B$9$G$K0lHV:G8e$K$$$k(B */
+				jcErrno = JE_CANTMOVE;
+				return -1;
+			} else if (buf->dot == (clp + 1)->kanap) {
+				/* $B%I%C%H$,%+%l%s%HJ8@a$N:G8e$K$"$k$N$G(B
+				 * $BJ8@a0\F0$9$k(B
+				 */
+				goto clausemove;
+			} else {
+				buf->dot++;
+			}
+		} else {
+			if (buf->dot == clp->kanap) {
+				/* $B%I%C%H$,%+%l%s%HJ8@a$N@hF,$K$"$k$N$G(B
+				 * $BJ8@a0\F0$9$k(B
+				 */
+				goto clausemove;
+			} else
+				buf->dot--;
+		}
+		return 0;
+	}
+
+clausemove:	/* $BJ8@a0\F0(B */
+	clp = buf->clauseInfo;
+
+	if (small) {
+		/* $B>.J8@aC10L$N0\F0(B */
+		if (dir == JC_FORWARD) {
+			if (buf->curClause == buf->nClause) {
+				jcErrno = JE_CANTMOVE;
+				return -1;
+			}
+			buf->curClause++;
+			if (buf->curClause >= buf->curLCEnd) {
+				/* $BBgJ8@a$b0\F0$9$k(B */
+				buf->curLCStart = buf->curLCEnd;
+				for (i = buf->curLCStart + 1;
+				     i <= buf->nClause && !clp[i].ltop; i++)
+					;
+				buf->curLCEnd = i;
+			}
+		} else {	/* JC_BACKWARD */
+			if (buf->curClause == 0) {
+				jcErrno = JE_CANTMOVE;
+				return -1;
+			}
+			buf->curClause--;
+			if (buf->curClause < buf->curLCStart) {
+				/* $BBgJ8@a$b0\F0$9$k(B */
+				buf->curLCEnd = buf->curLCStart;
+				for (i = buf->curClause; !clp[i].ltop; i--)
+					;
+				buf->curLCStart = i;
+			}
+		}
+	} else {
+		/* $BBgJ8@aC10L$N0\F0(B */
+		if (dir == JC_FORWARD) {
+			if (buf->curLCStart == buf->nClause) {
+				jcErrno = JE_CANTMOVE;
+				return -1;
+			}
+			buf->curLCStart = buf->curClause = buf->curLCEnd;
+			for (i = buf->curLCStart + 1;
+			     i <= buf->nClause && !clp[i].ltop; i++)
+				;
+			buf->curLCEnd = i;
+		} else {
+			if (buf->curLCStart == 0) {
+				jcErrno = JE_CANTMOVE;
+				return -1;
+			}
+			buf->curLCEnd = buf->curLCStart;
+			for (i = buf->curLCEnd - 1; !clp[i].ltop; i--)
+				;
+			buf->curLCStart = buf->curClause = i;
+		}
+	}
+
+	/* $BJ8@a0\F0$7$?$i%I%C%H$O$=$NJ8@a$N@hF,$K0\F0$9$k(B */
+	buf->dot = clp[buf->curClause].kanap;
+
+	return 0;
+}
+
+/* jcTop -- $B%I%C%H!&%+%l%s%HJ8@a$rJ8$N@hF,$K0\F0$9$k(B */
+int
+jcTop(buf)
+jcConvBuf *buf;
+{
+	TRACE("jcTop", "Enter")
+
+	/* $B%+%l%s%HJ8@a$r(B 0 $B$K$7$F%I%C%H$r@hF,$K;}$C$F$/$k(B */
+	setCurClause(buf, 0);
+	buf->dot = buf->kanaBuf;
+
+	return 0;
+}
+
+/* jcBottom -- $B%I%C%H!&%+%l%s%HJ8@a$rJ8$N:G8e$K0\F0$9$k(B */
+int
+jcBottom(buf)
+jcConvBuf *buf;
+{
+	TRACE("jcBottom", "Enter")
+
+	/*
+	 * Ver3 $BBP1~$N(B jclib $B$G$O!"%+%l%s%HJ8@a$r(B jcNClause $B$K$7$F(B
+	 * $B%I%C%H$r:G8e$K;}$C$F$/$k$@$1$@$C$?(B
+	 * $B$3$l$@$H!":G8e$NJ8@a$K$+$J$rF~$l$F$$$F!"%+!<%=%k$rF0$+$7$F(B
+	 * jcBottom() $B$G85$KLa$C$F:F$S$+$J$rF~$l$k$H!"JL$NJ8@a$K(B
+	 * $B$J$C$F$7$^$&(B
+	 * $B$=$3$G!":G8e$NJ8@a$,L5JQ49>uBV$N;~$K$O!"%+%l%s%HJ8@a$O(B
+	 * buf->nClause $B$G$O$J$/!"(Bbuf->nClause - 1 $B$K$9$k$3$H$K$9$k(B
+	 */
+	if (buf->nClause > 0 && !buf->clauseInfo[buf->nClause - 1].conv) {
+		buf->curClause = buf->curLCStart = buf->nClause - 1;
+		buf->curLCEnd = buf->nClause;
+	} else {
+		buf->curClause = buf->curLCStart = buf->nClause;
+		buf->curLCEnd = buf->nClause + 1;
+	}
+	buf->dot = buf->kanaEnd;
+	return 0;
+}
+
+/* jcInsertChar -- $B%I%C%H$N0LCV$K0lJ8;zA^F~$9$k(B */
+int
+jcInsertChar(buf, c)
+jcConvBuf *buf;
+int c;
+{
+	jcClause	*clp;
+	wchar	*dot, *dispdot;
+	int	ksizenew, dsizenew;
+
+	TRACE("jcInsertChar", "Enter")
+
+	CHECKFIXED(buf);
+
+	/* $BA48uJdJ8@a$,%+%l%s%HBgJ8@a$K$"$l$PL58z$K$9$k(B */
+	checkCandidates(buf, buf->curLCStart, buf->curLCEnd);
+
+	/*
+	 * $B!&%+%l%s%HJ8@aHV9f$,(B buf->nClause $B$G$"$k>l9g(B
+	 *	- $B$3$l$O%I%C%H$,:G8e$NJ8@a$N<!$K$"$k$H$$$&$3$H$J$N$G(B
+	 *	  $B?7$7$$J8@a$r:n$k(B
+	 * $B!&JQ49:Q$_$NJ8@a$N>l9g(B
+	 *	- $BL5JQ49$N>uBV$KLa$7$F$+$iA^F~(B
+	 * $B!&$=$NB>(B
+	 *	- $BC1$KA^F~$9$l$P$h$$(B
+	 */
+	clp = buf->clauseInfo + buf->curLCStart;
+	if (buf->curLCStart == buf->nClause) {
+		/* $B?7$?$KJ8@a$r:n$k(B */
+		/* clauseInfo $B$N%5%$%:$N%A%'%C%/(B */
+		if (buf->nClause >= buf->clauseSize &&
+		    resizeCInfo(buf, buf->nClause + 1) < 0) {
+			return -1;
+		}
+		/* buf->nClause $B$N%"%C%W%G!<%H$H(B clauseInfo $B$N@_Dj(B */
+		buf->nClause += 1;
+		clp = buf->clauseInfo + buf->nClause;
+		clp->conv = 0;
+		clp->ltop = 1;
+		clp->kanap = buf->kanaEnd;
+		clp->dispp = buf->displayEnd;
+	} else if (clp->conv) {
+		/* $BL5JQ49>uBV$K$9$k(B */
+		if (unconvert(buf, buf->curLCStart, buf->curLCEnd) < 0)
+			return -1;
+		buf->curClause = buf->curLCStart;
+		buf->curLCEnd = buf->curLCStart + 1;
+		DotSet(buf);
+	}
+
+	clp = buf->clauseInfo + buf->curLCStart;
+
+	/* $B%P%C%U%!$NBg$-$5$N%A%'%C%/(B */
+	ksizenew = (buf->kanaEnd - buf->kanaBuf) + 1;
+	dsizenew = (buf->displayEnd - buf->displayBuf) + 1;
+	if ((ksizenew > buf->bufferSize || dsizenew > buf->bufferSize) &&
+	    resizeBuffer(buf, ksizenew > dsizenew ? ksizenew : dsizenew) < 0) {
+		    return -1;
+	}
+
+	/* $B$+$J%P%C%U%!$r%"%C%W%G!<%H(B */
+	dot = buf->dot;
+	/* $B%+%l%s%HJ8@a$N8e$m$r0lJ8;z$:$i$9(B */
+	moveKBuf(buf, buf->curLCStart + 1, 1);
+	/* $B%+%l%s%HJ8@aFb$N%I%C%H0J9_$r0lJ8;z$:$i$9(B */
+	(void)bcopy((char *)dot, (char *)(dot + 1),
+		    ((clp + 1)->kanap - dot) * sizeof(wchar));
+	/* $BA^F~(B */
+	*dot = c;
+
+	/* $BI=<(%P%C%U%!$r%"%C%W%G!<%H(B */
+	dispdot = clp->dispp + (dot - clp->kanap);
+	/* $B%+%l%s%HJ8@a$N8e$m$r0lJ8;z$:$i$9(B */
+	moveDBuf(buf, buf->curLCStart + 1, 1);
+	/* $B%+%l%s%HJ8@aFb$N%I%C%H0J9_$r0lJ8;z$:$i$9(B */
+	(void)bcopy((char *)dispdot, (char *)(dispdot + 1),
+	      ((clp + 1)->dispp - dispdot) * sizeof(wchar));
+	/* $BA^F~(B */
+	*dispdot = c;
+
+	/* $B%I%C%H$r99?7(B */
+	buf->dot++;
+
+	return 0;
+}
+
+/* jcDeleteChar -- $B%I%C%H$NA0$^$?$O8e$m$N0lJ8;z$r:o=|$9$k(B */
+int
+jcDeleteChar(buf, prev)
+jcConvBuf *buf;
+int prev;
+{
+	jcClause	*clp;
+	wchar		*dot, *dispdot;
+
+	TRACE("jcDeleteChar", "Enter")
+
+	CHECKFIXED(buf);
+
+	clp = buf->clauseInfo;
+	if (buf->nClause == 0) {
+		/* $BJ8@a?t$,(B 0$B!"$D$^$j2?$bF~$C$F$$$J$$;~(B:
+		 *	- $B%(%i!<(B
+		 */
+		jcErrno = JE_CANTDELETE;
+		return -1;
+	} else if (buf->curClause >= buf->nClause) {
+		/* $B%+%l%s%HJ8@a$,:G8e$NJ8@a$N<!$K$"$k;~(B:
+		 *	- prev $B$G$"$l$P!"A0$NJ8@a$N:G8e$NJ8;z$r:o=|(B
+		 *	  $B%+%l%s%HJ8@a$OA0$NJ8@a$K0\F0$9$k(B
+		 *	  $BI,MW$J$i$PA0$NJ8@a$rL5JQ49$KLa$7$F$+$i:o=|$9$k(B
+		 *	  $BA0$NJ8@a$,$J$$$3$H$O$"$jF@$J$$(B
+		 *	- !prev $B$J$i$P%(%i!<(B
+		 */
+		if (!prev) {
+			jcErrno = JE_CANTDELETE;
+			return -1;
+		}
+		(void)jcMove(buf, 0, JC_BACKWARD);
+	} else if (clp[buf->curLCStart].conv) {
+		/* $B%+%l%s%HJ8@a$,JQ49$5$l$F$$$k;~(B:
+		 *	- prev $B$G$"$l$PA0$NJ8@a$N:G8e$NJ8;z$r:o=|(B
+		 *	  $B%+%l%s%HJ8@a$OA0$NJ8@a$K0\F0$9$k(B
+		 *	  $BI,MW$J$i$PA0$NJ8@a$rL5JQ49$KLa$7$F$+$i:o=|$9$k(B
+		 *	  $B%+%l%s%HJ8@a$,@hF,$J$i$P%(%i!<(B
+		 *	- !prev $B$J$i%+%l%s%HJ8@a$rL5JQ49$KLa$7$F!"J8@a$N(B
+		 *	  $B:G=i$NJ8;z$r:o=|(B
+		 */
+		if (prev) {
+			if (buf->curLCStart == 0) {
+				jcErrno = JE_CANTDELETE;
+				return -1;
+			}
+			(void)jcMove(buf, 0, JC_BACKWARD);
+		}
+	} else {
+		/* $B%+%l%s%HJ8@a$,JQ49$5$l$F$$$J$$;~(B:
+		 *	- prev $B$G$"$l$P%I%C%H$NA0$NJ8;z$r:o=|(B
+		 *	  $B$?$@$7%I%C%H$,J8@a$N@hF,$K$"$l$PA0$NJ8@a$N(B
+		 *	  $B:G8e$NJ8;z$r:o=|(B
+		 *	  $B$=$N;~$K$O%+%l%s%HJ8@a$OA0$NJ8@a$K0\F0$9$k(B
+		 *	  $BI,MW$J$i$PA0$NJ8@a$rL5JQ49$KLa$7$F$+$i:o=|$9$k(B
+		 *	  $B%+%l%s%HJ8@a$,@hF,$J$i$P%(%i!<(B
+		 *	- !prev $B$J$i%I%C%H$N<!$NJ8;z$r:o=|(B
+		 *	  $B%I%C%H$,J8@a$N:G8e$NJ8;z$N<!$K$"$l$P%(%i!<(B
+		 */
+		if (prev) {
+			if (buf->dot == clp[buf->curLCStart].kanap) {
+				if (buf->curLCStart == 0) {
+					jcErrno = JE_CANTDELETE;
+					return -1;
+				}
+				(void)jcMove(buf, 0, JC_BACKWARD);
+			}
+		} else {
+			if (buf->dot == clp[buf->curLCEnd].kanap) {
+				jcErrno = JE_CANTDELETE;
+				return -1;
+			}
+		}
+	}
+
+	if (buf->clauseInfo[buf->curLCStart].conv) {
+		/* $B%+%l%s%HJ8@a$,JQ49:Q$_$G$"$l$PL5JQ49$KLa$9(B */
+		if (jcUnconvert(buf) < 0)
+			return -1;
+		/* prev $B$G$"$l$PJ8@a$N:G8e$NJ8;z!"$=$&$G$J$1$l$PJ8@a$N(B
+		 * $B@hF,$NJ8;z$r:o=|$9$k(B
+		 */
+		if (prev) {
+			buf->dot = buf->clauseInfo[buf->curLCEnd].kanap - 1;
+		} else {
+			buf->dot = buf->clauseInfo[buf->curLCStart].kanap;
+		}
+	} else {
+		/* prev $B$J$i%I%C%H$r#1J8;zLa$7$F$*$/(B
+		 * $B$3$&$9$l$P%I%C%H$N8e$m$NJ8;z$r:o=|$9$k$3$H$K$J$k(B
+		 * $B:o=|$7=*$o$C$?$H$-$K%I%C%H$rF0$+$9I,MW$b$J$$(B
+		 */
+		if (prev)
+			buf->dot--;
+	}
+
+	clp = buf->clauseInfo + buf->curLCStart;
+
+	/* $B$+$J%P%C%U%!$r%"%C%W%G!<%H(B */
+	dot = buf->dot;
+	/* $B%+%l%s%HJ8@aFb$N%I%C%H0J9_$r0lJ8;z$:$i$9(B */
+	(void)bcopy((char *)(dot + 1), (char *)dot,
+		    ((clp + 1)->kanap - (dot + 1)) * sizeof(wchar));
+	/* $B%+%l%s%HJ8@a$N8e$m$r0lJ8;z$:$i$9(B */
+	moveKBuf(buf, buf->curLCEnd, -1);
+
+	/* $BI=<(%P%C%U%!$r%"%C%W%G!<%H(B */
+	dispdot = clp->dispp + (dot - clp->kanap);
+	/* $B%+%l%s%HJ8@aFb$N%I%C%H0J9_$r0lJ8;z$:$i$9(B */
+	(void)bcopy((char *)(dispdot + 1), (char *)dispdot,
+		   ((clp + 1)->dispp - (dispdot + 1)) * sizeof(wchar));
+	/* $B%+%l%s%HJ8@a$N8e$m$r0lJ8;z$:$i$9(B */
+	moveDBuf(buf, buf->curLCEnd, -1);
+
+	/* $B%+%l%s%HJ8@a$ND9$5$,#1$@$C$?>l9g$K$OJ8@a$,#18:$k$3$H$K$J$k(B */
+	if (clp->kanap == (clp + 1)->kanap) {
+		/* $BJ8@a$,$J$/$J$C$F$7$^$C$?(B */
+		moveCInfo(buf, buf->curLCEnd, -1);
+		setCurClause(buf, buf->curLCStart);
+		DotSet(buf);
+	}
+
+	return 0;
+}
+
+/* jcKillLine -- $B%I%C%H0J9_$r:o=|$9$k(B */
+int
+jcKillLine(buf)
+jcConvBuf *buf;
+{
+	int cc = buf->curClause;
+
+	TRACE("jcKillLine", "Enter")
+
+	CHECKFIXED(buf);
+
+	/* $BF~NOCf$NJ8@a$,$J$$$+!"%I%C%H$,:G8e$NJ8@a$N<!$K$"$l$P!"%(%i!<(B */
+	if (buf->nClause <= 0 || cc >= buf->nClause) {
+		jcErrno = JE_CANTDELETE;
+		return -1;
+	}
+
+#ifdef DEBUG_WNNLIB
+        showBuffers(buf, "before jcKillLine");
+#endif
+
+	/* $B%I%C%H$,F~NO$N@hF,$G$"$l$P!"(BjcClear $B$r8F=P$7$F=*$j(B */
+	if (buf->dot == buf->kanaBuf)
+		return jcClear(buf);
+
+	/*
+	 * $B%I%C%H0J9_$r:o=|$9$k(B
+	 * $B$H$$$C$F$b!"C1$KJ8@a>pJs$H%]%$%s%?$rJQ99$9$l$PNI$$(B
+	 */
+	checkCandidates(buf, cc, buf->nClause);
+	if (buf->clauseInfo[cc].conv) {
+		/* $BJQ49$5$l$F$$$l$P!"%+%l%s%HJ8@a$r4^$a$F:o=|(B */
+		buf->kanaEnd = buf->dot = buf->clauseInfo[cc].kanap;
+		buf->displayEnd = buf->clauseInfo[cc].dispp;
+
+		/* $B%+%l%s%HJ8@a$rKvHxJ8@a$K0\$9(B */
+		buf->nClause = buf->curClause = buf->curLCStart = cc;
+		buf->curLCEnd = cc + 1;
+	} else {
+		/* $BL$JQ49$J$i$P!"%I%C%H0J9_$r:o=|(B */
+		buf->kanaEnd = buf->dot;
+		buf->displayEnd = buf->clauseInfo[cc].dispp
+				+ (buf->dot - buf->clauseInfo[cc].kanap);
+
+		/* $B%+%l%s%HJ8@a$O$=$N$^$^$G!"KvHx$@$1$r5$$K$9$l$P$h$$(B */
+		cc++;
+		buf->nClause = buf->curLCEnd = cc;
+	}
+
+	/* $B6u$NKvHxJ8@a$N@_Dj$r$9$k(B */
+	buf->clauseInfo[cc].kanap = buf->kanaEnd;
+	buf->clauseInfo[cc].dispp = buf->displayEnd;
+	buf->clauseInfo[cc].conv = 0;
+	buf->clauseInfo[cc].ltop = 1;
+
+	/* $B%+%l%s%HJ8@a$H$=$l0J9_$N(B jllib $B$NJ8@a>pJs$bL58z$K$9$k(B */
+	if (jl_bun_suu(buf->wnn) > cc)
+		jl_kill(buf->wnn, cc, -1);
+
+#ifdef DEBUG_WNNLIB
+        showBuffers(buf, "after jcKillLine");
+#endif
+	return 0;
+}
+
+/* jcChangeClause -- $B%+%l%s%HBgJ8@a$r;XDj$5$l$?J8;zNs$GCV$-49$($k(B */
+int
+jcChangeClause(buf, str)
+jcConvBuf *buf;
+wchar *str;
+{
+	jcClause	*clps, *clpe;
+	wchar	*p;
+	int	newlen;
+	int	oklen, odlen;
+	int	ksize, dsize;
+
+	TRACE("jcChangeClause", "Enter")
+
+	CHECKFIXED(buf);
+
+	clps = buf->clauseInfo + buf->curLCStart;
+	clpe = buf->clauseInfo + buf->curLCEnd;
+
+	newlen = 0;
+	p = str;
+	while (*p++)
+		newlen++;
+
+	/* $B$+$J%P%C%U%!$HI=<(%P%C%U%!$N%5%$%:$rD4$Y$F!"(B
+	 * $BF~$i$J$+$C$?$iBg$-$/$9$k(B
+	 */
+	if (buf->curLCStart < buf->nClause) {
+		oklen = clpe->kanap - clps->kanap;
+		odlen = clpe->dispp - clps->dispp;
+	} else {
+		oklen = odlen = 0;
+	}
+	ksize = (buf->kanaEnd - buf->kanaBuf) + newlen - oklen;
+	dsize = (buf->displayEnd - buf->displayBuf) + newlen - odlen;
+	if (ksize > buf->bufferSize || dsize > buf->bufferSize) {
+		if (resizeBuffer(buf, ksize > dsize ? ksize : dsize) < 0)
+			return -1;
+	}
+
+	/* curLCStart $B$,(B nClause $B$KEy$7$$;~$@$1!"?7$?$KJ8@a$,:n$i$l$k(B */
+	if (buf->curLCStart == buf->nClause) {
+		/* clauseInfo $B$NBg$-$5$rD4$Y$k(B*/
+		if (buf->nClause + 1 > buf->clauseSize) {
+			if (resizeCInfo(buf, buf->nClause + 1) < 0)
+				return -1;
+		}
+		/* $B?7$?$K$G$-$?(B clauseInfo $B$K$O!"(BnClause $BHVL\(B
+		 * ($B$D$^$j:G8e$N(B clauseInfo) $B$NFbMF$r%3%T!<$7$F$*$/(B
+		 */
+		clpe = buf->clauseInfo + buf->nClause + 1;
+		*clpe = *(clpe - 1);
+
+		buf->nClause++;
+	}
+
+	clps = buf->clauseInfo + buf->curLCStart;
+	clpe = buf->clauseInfo + buf->curLCEnd;
+
+	/* $B$+$J%P%C%U%!$NJQ99(B */
+	/* $B$^$:$O8e$m$r0\F0$5$;$k(B */
+	moveKBuf(buf, buf->curLCEnd, newlen - oklen);
+	/* str $B$r%3%T!<(B */
+	(void)bcopy((char *)str, (char *)clps->kanap,
+		    newlen * sizeof(wchar));
+	/* $BI=<(%P%C%U%!$NJQ99(B */
+	/* $B$^$:$O8e$m$r0\F0$5$;$k(B */
+	moveDBuf(buf, buf->curLCEnd, newlen - odlen);
+	/* str $B$r%3%T!<(B */
+	(void)bcopy((char *)str, (char *)clps->dispp,
+		    newlen * sizeof(wchar));
+
+	/* clauseInfo $B$NJQ99(B */
+	/* $B$^$:$O8e$m$r0\F0$5$;$k(B */
+	if (clpe > clps + 1) {
+		(void)bcopy((char *)clpe, (char *)(clps + 1),
+			    (buf->nClause + 1 - buf->curLCEnd) *
+			    sizeof(jcClause));
+	}
+	clps->conv = 0;
+	clps->ltop = 1;
+	(clps + 1)->ltop = 1;
+
+	return 0;
+}
+
+/* jcSaveDic -- $B<-=q!&IQEY%U%!%$%k$r%;!<%V$9$k(B */
+int
+jcSaveDic(buf)
+jcConvBuf *buf;
+{
+	TRACE("jcSaveDic", "Enter")
+
+	return jl_dic_save_all(buf->wnn);
+}
+
+/* $B%5!<%P$H$N@\B3$N$?$a$N4X?t72(B */
+
+struct wnn_buf *
+jcOpen(server, envname, override, rcfile, errmsg, confirm, timeout)
+char *server;
+char *envname;
+int override;
+char *rcfile;
+void (*errmsg)();
+int (*confirm)();
+int timeout;
+{
+    return jcOpen2(server, envname, override, rcfile, rcfile, errmsg, confirm, timeout);
+}
+
+struct wnn_buf *
+jcOpen2(server, envname, override, rcfile4, rcfile6, errmsg, confirm, timeout)
+char *server;
+char *envname;
+int override;
+char *rcfile4;		/* wnnenvrc for Wnn4 */
+char *rcfile6;		/* wnnenvrc for Wnn6 */
+void (*errmsg)();
+int (*confirm)();
+int timeout;
+{
+    struct wnn_buf *wnnbuf;
+    struct wnn_env *wnnenv;
+    char *rcfile;
+    int env_exists;
+    int wnn_version;
+    extern char *getenv();
+
+    TRACE("jcOpen2", "Enter")
+
+    /* $B%5!<%PL>$,(B NULL $B$^$?$O6uJ8;zNs$@$C$?>l9g$O4D6-JQ?t(B JSERVER $B$r;HMQ$9$k(B */
+    if (server == NULL || server[0] == '\0') {
+	server = getenv("JSERVER");
+    }
+
+    /* $B4D6-L>$,6uJ8;zNs$@$C$?>l9g$O!"%f!<%6L>$r;HMQ$9$k(B */
+    if (envname != NULL && *envname == 0) {
+        struct passwd *p = getpwuid(getuid());
+
+	if (p != NULL) envname = p->pw_name;
+    }
+
+    /*
+     * jserver $B$N%P!<%8%g%s$K$h$C$F(B wnnrc $B$rJQ$($?$$$N$@$,!"(B
+     * $B%P!<%8%g%s$rD4$Y$k$?$a$K$O$^$:@\B3$7$J$/$F$O$J$i$J$$!#(B
+     * $B$=$3$G(B wnnrc $B0z?t$r(B NULL $B$K$7$F@\B3$9$k!#(B
+     */
+#if JSERVER_VERSION > 0x4030
+    wnnbuf = jl_open_lang(envname, server, "ja_JP",
+    				NULL, confirm, errmsg, timeout);
+#else
+    wnnbuf = jl_open(envname, server, NULL, confirm, errmsg, timeout);
+#endif
+
+    /*
+     * $B!&%P%C%U%!$,:n$l$J$+$C$?(B
+     * $B!&(Bjserver $B$K@\B3$G$-$J$+$C$?(B
+     * $B!&(Bwnnrc $B%U%!%$%k$N;XDj$,$J$$(B ($B$D$^$j=i4|2=$7$J$$(B)
+     * $B>l9g$K$O$3$l$G=*$j!#(B
+     */
+    if (wnnbuf == NULL ||
+	!jl_isconnect(wnnbuf) ||
+	(rcfile4 == NULL && rcfile6 == NULL)) {
+	return wnnbuf;
+    }
+
+    wnnenv = jl_env_get(wnnbuf);
+
+    /*
+     * $B0JA0$+$i4D6-$,B8:_$7$F$$$?$+$I$&$+$H!"%5!<%P$N%P!<%8%g%s$rD4$Y$k!#(B
+     * $B4D6-$,B8:_$7$F$$$?$+$I$&$+$O(B jl_fuzokugo_get $B$G(B ($B$D$^$jIUB08l(B
+     * $B<-=q$,@_Dj$5$l$F$$$k$+$I$&$+$G(B) $BH=CG$9$k!#(Bjl_open_lang $B$O4D6-$,(B
+     * $B$J$1$l$P:n$C$F$7$^$&$?$a!"(Bjs_env_exist $B$O;H$($J$$!#(B
+     */
+    {
+	char fzk[1024];
+	int serv_ver, lib_ver;
+
+	if (ki2_jl_fuzokugo_get(wnnbuf, fzk, 1024) != -1) {
+	    env_exists = 1;
+	    TRACE("jcOpen2", "env exists");
+	} else {
+	    env_exists = 0;
+	    TRACE("jcOpen2", "no env");
+	}
+	if (js_version(wnnenv->js_id, &serv_ver, &lib_ver) != -1 &&
+	    serv_ver >= 0x4f00) {
+	    wnn_version = 6;
+	    TRACE("jcOpen2", "Wnn6");
+	} else {
+	    wnn_version = 4;
+	    TRACE("jcOpen2", "Wnn4");
+	}
+    }
+
+    /* wnnrc $B$NA*Br(B */
+    rcfile = (wnn_version == 4) ? rcfile4 : rcfile6;
+
+    /*
+     * $B4D6-$,$9$G$KB8:_$7$+$D4D6-$N>e=q$-$,;XDj$5$l$F$$$J$$!"$"$k$$$O(B
+     * rcfile $B$,(B NULL $B$N>l9g$K$O$3$l$G=*$j!#(B
+     */
+    if ((env_exists && !override) || rcfile == NULL) return wnnbuf;
+
+    /*
+     * wnnrc $B$,6uJ8;zNs$@$C$?>l9g$O!"%G%U%)%k%H$r;HMQ$9$k!#(B
+     * 1. $B4D6-JQ?t(B WNNENVRC4 $B$^$?$O(B WNNENVRC6
+     * 2. $B4D6-JQ?t(B WNNENVRC
+     * 3. $B%7%9%F%`$N%G%U%)%k%H(B
+     * $B$N=g$G8!:w$9$k!#:G8e$N$O$A$g$C$H$$$$$+$2$s!#(B
+     */
+    if (*rcfile == '\0') {
+	rcfile = getenv((wnn_version == 4) ? "WNNENVRC4" : "WNNENVRC6");
+	if (rcfile == NULL || access(rcfile, R_OK) != 0) {
+	    rcfile = getenv("WNNENVRC");
+	}
+	if (rcfile == NULL || access(rcfile, R_OK) != 0) {
+	    if (wnn_version == 6) {
+#ifdef WNN6
+		rcfile = "@DEFAULT";
+#else
+		rcfile = "wnnenvrc";
+#endif
+	    } else {
+#if defined(LIBDIR) && JSERVER_VERSION > 0x4030
+		static char envrc[256];
+		rcfile = envrc;
+		(void)sprintf(rcfile, "%s/ja_JP/wnnenvrc", LIBDIR);
+		if (access(rcfile, R_OK) != 0)
+		    (void) sprintf(rcfile, "%s/wnnenvrc", LIBDIR);
+#else
+		rcfile = "wnnenvrc";
+#endif
+	    }
+        }
+    }
+
+    /* $B4D6-@_Dj$9$k(B */
+    (void)jl_set_env_wnnrc(wnnenv, rcfile, confirm, errmsg);
+
+    return wnnbuf;
+}
+
+int
+jcClose(wnnbuf)
+struct wnn_buf *wnnbuf;
+{
+    TRACE("jcClose", "Enter")
+
+    if (wnnbuf != NULL)
+	jl_close(wnnbuf);
+    return 0;
+}
+
+int
+jcIsConnect(wnnbuf)
+struct wnn_buf *wnnbuf;
+{
+    TRACE("jcIsConnect", "Enter")
+
+    if (wnnbuf == NULL)
+        return 0;
+    return jl_isconnect(wnnbuf);
+}
+
+#ifdef DEBUG_WNNLIB
+static void
+printBuffer(start, end)
+wchar *start;
+wchar *end;
+{
+	wchar wc;
+
+	while (start < end) {
+		wc = *start++;
+		if (wc >= 0200) {
+			putc((wc >> 8) & 0xff, stderr);
+			wc &= 0xff;
+		} else if (wc < 040 || wc == 0177) {
+			putc('^', stderr);
+			wc ^= 0100;
+		} else if (wc == '^' || wc == '\\') {
+			putc('\\', stderr);
+		}
+		putc(wc, stderr);
+	}
+}
+
+static void
+showBuffers(buf, tag)
+jcConvBuf *buf;
+char *tag;
+{
+	int i;
+	jcClause *clp = buf->clauseInfo;
+	wchar ws[512];
+
+	fprintf(stderr, "Buffer Info [%s]\n", tag);
+	fprintf(stderr, "nClause = %d, curClause = %d [%d, %d], ",
+		 buf->nClause, buf->curClause, buf->curLCStart, buf->curLCEnd);
+
+	if (buf->dot < buf->kanaBuf) {
+		fprintf(stderr, "dot < 0\n");
+	} else if (buf->dot > buf->kanaEnd) {
+		fprintf(stderr, "dot > 0\n");
+	} else if (buf->nClause == 0) {
+		fprintf(stderr, "dot == 0\n");
+	} else {
+		for (i = 0; i < buf->nClause; i++) {
+			if (buf->dot <= clp[i].kanap)
+				break;
+		}
+		if (buf->dot < clp[i].kanap)
+			i--;
+		fprintf(stderr, "dot = %d.%d\n", i, buf->dot - clp[i].kanap);
+	}
+
+	for (i = 0; i < buf->nClause; i++) {
+		fprintf(stderr,
+			"clause[%d]: conv = %d, ltop = %d",
+			i, clp->conv, clp->ltop);
+		if (clp->conv == 1) {
+			fprintf(stderr, " [%d]", jl_dai_top(buf->wnn, i));
+		}
+		fprintf(stderr, "\n");
+		fprintf(stderr, "clause[%d]: Kana = '", i);
+		printBuffer(clp->kanap, (clp + 1)->kanap);
+		fprintf(stderr, "'\n");
+		if (clp->conv == 1) {
+			fprintf(stderr, "clause[%d]: Yomi = '", i);
+			(void)ki2_jl_get_yomi(buf->wnn, i, i + 1, ws, 512);
+			printBuffer(ws, ws + jl_yomi_len(buf->wnn, i, i + 1));
+			fprintf(stderr, "'\n");
+		}
+		fprintf(stderr, "clause[%d]: Disp = '", i);
+		printBuffer(clp->dispp, (clp + 1)->dispp);
+		fprintf(stderr, "'\n");
+		if (clp->conv == 1) {
+			fprintf(stderr, "clause[%d]: Conv = '", i);
+			(void)ki2_jl_get_kanji(buf->wnn, i, i + 1, ws, 512);
+			printBuffer(ws, ws + jl_kanji_len(buf->wnn, i, i + 1));
+			fprintf(stderr, "'\n");
+		}
+		clp++;
+	}
+}
+#endif /* DEBUG_WNNLIB */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/wstring.c	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,157 @@
+/*
+ *	wstring.c  -- BSD string(3) for wchar
+ */
+
+/*
+ * Copyright (c) 1989  Software Research Associates, Inc.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted, provided
+ * that the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Software Research Associates not be
+ * used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission.  Software Research
+ * Associates makes no representations about the suitability of this software
+ * for any purpose.  It is provided "as is" without express or implied
+ * warranty.
+ *
+ * Author:  Makoto Ishisone, Software Research Associates, Inc., Japan
+ *		ishisone@sra.co.jp
+ */
+
+/* $Id: wstring.c,v 2.2 1994/06/06 05:20:40 ishisone Rel $ */
+
+#include "WStr.h"
+
+wchar *
+wstrcat(s1, s2)
+wchar *s1, *s2;
+{
+	wchar	*ret = s1;
+
+	while (*s1++)
+		;
+	s1--;
+
+	while (*s1++ = *s2++)
+		;
+
+	return ret;
+}
+
+wchar *
+wstrncat(s1, s2, n)
+wchar *s1, *s2;
+int n;
+{
+	wchar	*ret = s1;
+
+	while (*s1++)
+		;
+	s1--;
+
+	while (n-- > 0 && (*s1++ = *s2++))
+		;
+	if (n < 0)
+		*s1 = 0;
+
+	return ret;
+}
+
+int
+wstrcmp(s1, s2)
+wchar *s1, *s2;
+{
+	while (*s1 && *s1 == *s2)
+		s1++, s2++;
+	return (int)(*s1 - *s2);
+}
+
+int
+wstrncmp(s1, s2, n)
+wchar *s1, *s2;
+int n;
+{
+	while (n-- > 0 && *s1 && *s1 == *s2)
+		s1++, s2++;
+	if (n < 0)
+		return 0;
+	return (int)(*s1 - *s2);
+}
+
+wchar *
+wstrcpy(s1, s2)
+wchar *s1, *s2;
+{
+	wchar	*ret = s1;
+
+	while (*s1++ = *s2++)
+		;
+
+	return ret;
+}
+
+wchar *
+wstrncpy(s1, s2, n)
+wchar *s1, *s2;
+int n;
+{
+	wchar	*ret = s1;
+
+	while (n-- > 0 && (*s1++ = *s2++))
+		;
+	while (n-- > 0)
+		*s1++ = 0;
+
+	return ret;
+}
+
+int
+wstrlen(s)
+wchar *s;
+{
+	int	n = 0;
+
+	while (*s++)
+	    n++;
+	return n;
+}
+
+wchar *
+#if __STDC__ == 1
+windex(wchar *s, wchar c)
+#else
+windex(s, c)
+wchar *s, c;
+#endif
+{
+	int	x;
+
+	while (x = *s++) {
+		if (x == c)
+			return s - 1;
+	}
+
+	return 0;
+}
+
+wchar *
+#if __STDC__ == 1
+wrindex(wchar *s, wchar c)
+#else
+wrindex(s, c)
+wchar *s, c;
+#endif
+{
+	wchar	*r = 0;
+	int	x;
+
+	while (x = *s++) {
+		if (x == c)
+			r = s - 1;
+	}
+
+	return r;
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/xtwstr.c	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,110 @@
+/*
+ *	xtwstr.c
+ */
+
+/*
+ * Copyright (c) 1989  Software Research Associates, Inc.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted, provided
+ * that the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Software Research Associates not be
+ * used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission.  Software Research
+ * Associates makes no representations about the suitability of this software
+ * for any purpose.  It is provided "as is" without express or implied
+ * warranty.
+ *
+ * Author:  Makoto Ishisone, Software Research Associates, Inc., Japan
+ *		ishisone@sra.co.jp
+ */
+
+#ifndef lint
+static char	*rcsid = "$Id: xtwstr.c,v 2.3 1991/10/02 04:27:04 ishisone Rel $";
+#endif
+
+#include <X11/Intrinsic.h>
+#include "WStr.h"
+#include "XWStr.h"
+
+#define IS2B(f)	(((f)->max_byte1 > 0) || ((f)->max_char_or_byte2 > 255))
+
+XWSGC
+XtWSGetGCSet(w, mask, values, fontG0, fontG1, fontG2, fontG3)
+Widget w;
+unsigned long mask;
+XGCValues *values;
+XFontStruct *fontG0;
+XFontStruct *fontG1;
+XFontStruct *fontG2;
+XFontStruct *fontG3;
+{
+	XGCValues	gcval;
+	XWSGC		gcset;
+	int		i;
+
+	gcset = (XWSGC)XtMalloc(sizeof(XWSGCSet));
+	gcset->fe[0].font = fontG0;
+	gcset->fe[1].font = fontG1;
+	gcset->fe[2].font = fontG2;
+	gcset->fe[3].font = fontG3;
+
+	gcval = *values;
+	mask |= GCFont;
+	for (i = 0; i < 4; i++) {
+		if (gcset->fe[i].font != NULL) {
+			gcval.font = (gcset->fe[i].font)->fid;
+			gcset->fe[i].gc = XtGetGC(w, mask, &gcval);
+			gcset->fe[i].flag = GCCREAT;
+			if (IS2B(gcset->fe[i].font))
+				gcset->fe[i].flag |= TWOB;
+		} else {
+			gcset->fe[i].gc = NULL;
+		}
+	}
+
+	return gcset;
+}
+
+void
+XtWSDestroyGCSet(gcset)
+XWSGC gcset;
+{
+	int	i;
+	int	flag;
+
+	for (i = 0; i < 4; i++) {
+		if (gcset->fe[i].gc == NULL)
+			continue;
+		flag = gcset->fe[i].flag;
+		if (flag & GCCREAT)
+			XtDestroyGC(gcset->fe[i].gc);
+		/* can't free XFontStruct data allocated by XWSSetGCSet()
+		 * because I can't figure out which display is used.
+		 * if (flag & FONTQUERY)
+		 *	XFreeFont(???, gcset->fe[i].font);
+		 */
+	}
+	XtFree((char *)gcset);
+}
+
+void
+XtWSReleaseGCSet(w, gcset)
+Widget w;
+XWSGC gcset;
+{
+	int	i;
+	int	flag;
+
+	for (i = 0; i < 4; i++) {
+		if (gcset->fe[i].gc == NULL)
+			continue;
+		flag = gcset->fe[i].flag;
+		if (flag & GCCREAT)
+			XtReleaseGC(w, gcset->fe[i].gc);
+		if (flag & FONTQUERY)
+			XFreeFont(XtDisplay(w), gcset->fe[i].font);
+	}
+	XtFree((char *)gcset);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/xwstr.c	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,500 @@
+/*
+ *	xwstr.c
+ */
+
+/*
+ * Copyright (c) 1989  Software Research Associates, Inc.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted, provided
+ * that the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Software Research Associates not be
+ * used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission.  Software Research
+ * Associates makes no representations about the suitability of this software
+ * for any purpose.  It is provided "as is" without express or implied
+ * warranty.
+ *
+ * Author:  Makoto Ishisone, Software Research Associates, Inc., Japan
+ *		ishisone@sra.co.jp
+ */
+
+/*
+ * wide character string $B$rMQ$$$F%F%-%9%H$rI=<($9$k$?$a$N%i%$%V%i%j(B
+ *
+ * wide character $B$NFCD9$r@8$+$7!":GBgF1;~$K(B 4 $B<oN`$N%U%)%s%H$r(B
+ * $B07$&$3$H$,$G$-$k!#(B
+ *
+ *	GSet	bit $BI=8=(B		UJIS $B$G$N3d$jEv$F(B
+ *	----------------------------------------------
+ *	G0	0xxxxxxx0xxxxxxx	ASCII
+ *	G1	1xxxxxxx1xxxxxxx	$B4A;z(B
+ *	G2	0xxxxxxx1xxxxxxx	$BH>3Q$+$J(B
+ *	G3	1xxxxxxx0xxxxxxx	$B30;z(B
+ *
+ * XWSGC XWSSetGCSet(GC gc0, GC gc1, GC gc2, GC gc3)
+ *	$B;XDj$5$l$?(B 4$B$D$N(B GC $B$rAH$_9g$o$;$F(B XWSGC $B$r:n$k!#(B
+ *	G0, G1, G2, G3 $B$NJ8;z$KBP$7$F$=$l$>$l(B gc0, gc1, gc2, gc3 $B$,(B
+ *	$B;H$o$l$k!#0z?t(B gc? $B$K$O(B NULL $B$r;XDj$7$F$b$h$$!#$=$N>l9g$K$O(B
+ *	$BBP1~$9$k%-%c%i%/%?%;%C%H$NJ8;z$O=q$+$l$J$$!#(B
+ *	$B$J$*(B Xt $B$NCf$G;HMQ$9$k;~$K$O!"(Bxtwstr.c $B$NCf$N(B XtWSGetGCSet()
+ *	$B$r;H$&J}$,$h$$$@$m$&!#(B
+ *
+ * void XWSSetMapping(XWSGC gcset, int g0map, int g1map, int g2map, int g3map)
+ *	G0, G1, G2, G3 $B$NJ8;z$rIA2h$9$k;~$K%U%)%s%H$N(B GL / GR $B$N$I$A$i$r(B
+ *	$B;HMQ$9$k$+$r@_Dj$9$k!#(B0 $B$r;XDj$9$k$H(B GL $B$,;HMQ$5$l!"(B1 $B$r;XDj$9$k$H(B
+ *	GR $B$,;HMQ$5$l$k!#(B-1 $B$,;XDj$5$l$?>l9g$K$OA0$N@_Dj$,$=$N$^$^;H$o$l$k!#(B
+ *	$B%G%U%)%k%H$N@_Dj(B ($B$D$^$j(B XWSSetGCSet() $B$^$?$O(B XtWSGetGCSet() $B$G(B
+ *	gcset $B$,:n$i$l$?;~(B) $B$O$9$Y$F(B GL $B$r;HMQ$9$k$h$&$K$J$C$F$$$k!#(B
+ *
+ * int XWSDrawString(Display *d, Drawable w, XWSGC gcset,
+ *		      int x, int y, wchar *wstr, int len)
+ * int XWSDrawImageString(Display *d, Drawable w, XWSGC gcset,
+ *		   int x, int y, wchar *wstr, int len)
+ *	$B$=$l$>$l!"(BXlib $B$N(B XDrawString() / XDrawImageString() $B$K(B
+ *	$BBP1~$9$k4X?t!#;XDj$5$l$?0LCV$K;XDj$5$l$?(B GC $B%;%C%H$rMQ$$$F(B
+ *	$B%F%-%9%H$r=q$/!#0z?t(B len $B$OJ8;zNs(B wstr $B$NJ8;z?t$G$"$k!#(B
+ *	$B%P%$%H?t$G$O$J$$$3$H$KCm0U!#(B
+ *	$B$J$*!"(BXDrawString() $B$J$I$H$O0[$J$j!"%j%?!<%s%P%j%e!<$H$7$F(B
+ *	$B=q$$$?J8;z$NI}$rJV$9!#(B
+ *
+ * int XWSTextWidth(XWSGC gcset, wchar *wstr, int len)
+ * void XWSTextExtents(XWSGC gcset, wchar *wstr, int len,
+ *			int *ascent, int *descent, XCharStruct *overall)
+ *	$B$=$l$>$l!"(BXlib $B$N(B XTextWidth() / XTextExtents() $B$KBP1~$9$k(B
+ *	$B4X?t!#;XDj$5$l$?J8;zNs$NI}!&Bg$-$5$rJV$9!#(B
+ *
+ * void XWSFontHeight(XWSGC gcset, wchar *wstr, int len,
+ *			int *ascent, int *descent)
+ *	$B0z?t(B wstr $B$G;XDj$5$l$?J8;z$KBP1~$9$k%U%)%s%H$N(B ascent/descent $B$N(B
+ *	$B:GBgCM$rJV$9!#(Bwstr $B$K(B NULL $B$r;XDj$9$k$H!"(BXWSGC $B$K%;%C%H$5$l$?(B
+ *	$B$9$Y$F$N%U%)%s%H$N(B ascent/descent $B$N:GBgCM$rJV$9!#(B
+ */
+
+#ifndef lint
+static char	*rcsid = "$Id: xwstr.c,v 2.9 1999/01/07 03:13:03 ishisone Exp $";
+#endif
+
+#include <X11/Xlib.h>
+#if defined(XlibSpecificationRelease) && XlibSpecificationRelease > 4
+#include <X11/Xfuncs.h>
+#endif
+#include "WStr.h"
+#include "XWStr.h"
+
+#ifdef __STDC__
+#include <stdlib.h>
+#else
+extern char *malloc();
+#endif
+
+#define G0MASK	0x0000
+#define G1MASK	0x8080
+#define G2MASK	0x0080
+#define G3MASK	0x8000
+
+#define IS2B(f)	(((f)->max_byte1 > 0) || ((f)->max_char_or_byte2 > 255))
+#define MIN(a, b)	((a) > (b) ? (b) : (a))
+#define MAX(a, b)	((a) > (b) ? (a) : (b))
+
+#ifndef NULL
+#define NULL	0
+#endif
+
+#define bufsize	256
+
+#ifdef __STDC__
+/* static function prototype */
+static int flushstr(Display *, Drawable,  FontEnt *, int, int,
+		    XChar2b *, XChar2b *, int);
+static int wsdrawstring(Display *, Drawable, XWSGC, int, int,
+			wchar *, int, int);
+#else
+static int flushstr();
+static int wsdrawstring();
+#endif
+
+XWSGC
+XWSSetGCSet(dpy, gc0, gc1, gc2, gc3)
+Display *dpy;
+GC gc0;
+GC gc1;
+GC gc2;
+GC gc3;
+{
+	XWSGC	gcset;
+	int	i;
+
+	gcset = (XWSGC)malloc(sizeof(XWSGCSet));
+	if (gcset == NULL)
+		return (XWSGC)NULL;
+
+	gcset->fe[0].gc = gc0;
+	gcset->fe[1].gc = gc1;
+	gcset->fe[2].gc = gc2;
+	gcset->fe[3].gc = gc3;
+
+	for (i = 0; i < 4; i++) {
+		if (gcset->fe[i].gc == NULL) {
+			gcset->fe[i].font = NULL;
+		} else {
+			XFontStruct	*font;
+			gcset->fe[i].font = font = XQueryFont(dpy, XGContextFromGC(gcset->fe[i].gc));
+			gcset->fe[i].flag = FONTQUERY;
+			if (IS2B(font))
+				gcset->fe[i].flag = TWOB;
+		}
+	}
+
+	return gcset;
+}
+
+void
+XWSSetMapping(gcset, g0map, g1map, g2map, g3map)
+XWSGC gcset;
+int g0map;
+int g1map;
+int g2map;
+int g3map;
+{
+	int	map[4];
+	int	i;
+
+	map[0] = g0map; map[1] = g1map; map[2] = g2map; map[3] = g3map;
+	for (i = 0; i < 4; i++) {
+		if (map[i] < 0)
+			continue;
+		else if (map[i] == 0)
+			gcset->fe[i].flag &= ~GRMAPPING;
+		else
+			gcset->fe[i].flag |= GRMAPPING;
+	}
+}
+
+int
+XWSDrawString(d, w, gcset, x, y, wstr, len)
+Display *d;
+Drawable w;
+XWSGC gcset;
+int x;
+int y;
+wchar *wstr;
+int len;
+{
+	return wsdrawstring(d, w, gcset, x, y, wstr, len, 0);
+}
+
+int
+XWSDrawImageString(d, w, gcset, x, y, wstr, len)
+Display *d;
+Drawable w;
+XWSGC gcset;
+int x;
+int y;
+wchar *wstr;
+int len;
+{
+	return wsdrawstring(d, w, gcset, x, y, wstr, len, 1);
+}
+
+void
+XWSFontHeight(gcset, wstr, len, ascent, descent)
+XWSGC gcset;
+wchar *wstr;
+int len;
+int *ascent;
+int *descent;
+{
+	FontEnt	*fep = &(gcset->fe[0]);
+	int	i;
+	int	asc = 0;
+	int	dsc = 0;
+
+	if (wstr) {
+		while (len-- > 0) {
+			i = GSET(*wstr++);
+			if (fep[i].font) {
+				if ((fep[i].font)->ascent > asc)
+					asc = (fep[i].font)->ascent;
+				if ((fep[i].font)->descent > dsc)
+					dsc = (fep[i].font)->descent;
+			}
+		}
+	} else {
+		for (i = 0; i < 4; i++) {
+			if (fep[i].font) {
+				if ((fep[i].font)->ascent > asc)
+					asc = (fep[i].font)->ascent;
+				if ((fep[i].font)->descent > dsc)
+					dsc = (fep[i].font)->descent;
+			}
+		}
+	}
+	*ascent = asc;
+	*descent = dsc;
+}
+
+int
+XWSTextWidth(gcset, wstr, len)
+XWSGC gcset;
+wchar *wstr;
+int len;
+{
+	XChar2b			buf[bufsize];
+	XChar2b			*cp;
+	wchar			*wstr1 = wstr + len;
+	XChar2b			*cpend = buf + bufsize;
+	int			c;
+	int			width = 0;
+	int			gmask, gset;
+	FontEnt			*fe;
+	int			is2b;
+	int			grmap;
+
+	while (wstr < wstr1) {
+		gmask = *wstr & 0x8080;
+
+		switch (gmask) {
+		case G0MASK:
+			gset = 0;
+			break;
+		case G1MASK:
+			gset = 1;
+			break;
+		case G2MASK:
+			gset = 2;
+			break;
+		case G3MASK:
+			gset = 3;
+			break;
+		}
+
+		fe = &gcset->fe[gset];
+		is2b = fe->flag & TWOB;
+		grmap = (fe->flag & GRMAPPING) ? 0x80 : 0;
+		cp = buf;
+
+		if (fe->font == NULL) {
+			while (wstr < wstr1 && (*wstr & 0x8080) == gmask)
+				wstr++;
+			continue;
+		}
+
+		while (wstr < wstr1 && ((c = *wstr) & 0x8080) == gmask) {
+			if (cp >= cpend - 1) {
+				/* flush */
+				width += XTextWidth16(fe->font, buf, cp - buf);
+				cp = buf;
+			}
+			if (is2b)
+				cp->byte1 = ((c >> 8) & 0x7f) | grmap;
+			else
+				cp->byte1 = 0;
+			cp->byte2 = (c & 0x7f) | grmap;
+			cp++;
+			wstr++;
+		}
+
+		if (cp == buf)
+			continue;
+
+		/* flush */
+		width += XTextWidth16(fe->font, buf, cp - buf);
+	}
+
+	return width;
+}
+
+void
+XWSTextExtents(gcset, wstr, len, ascent, descent, overall)
+XWSGC gcset;
+wchar *wstr;
+int len;
+int *ascent;
+int *descent;
+XCharStruct *overall;
+{
+	XChar2b			buf[bufsize];
+	XChar2b			*cp;
+	wchar			*wstr1 = wstr + len;
+	XChar2b			*cpend = buf + bufsize;
+	int			c;
+	int			gmask, gset;
+	FontEnt			*fe;
+	int			is2b;
+	int			grmap;
+	int			dir, as, ds;
+	XCharStruct		oa;
+
+	*ascent = *descent = 0;
+	(void)bzero(overall, sizeof(XCharStruct));
+
+	while (wstr < wstr1) {
+		gmask = *wstr & 0x8080;
+
+		switch (gmask) {
+		case G0MASK:
+			gset = 0;
+			break;
+		case G1MASK:
+			gset = 1;
+			break;
+		case G2MASK:
+			gset = 2;
+			break;
+		case G3MASK:
+			gset = 3;
+			break;
+		}
+
+		fe = &gcset->fe[gset];
+		is2b = fe->flag & TWOB;
+		grmap = (fe->flag & GRMAPPING) ? 0x80 : 0;
+		cp = buf;
+
+		if (fe->font == NULL) {
+			while (wstr < wstr1 && (*wstr & 0x8080) == gmask)
+				wstr++;
+			continue;
+		}
+
+		while (wstr < wstr1 && ((c = *wstr) & 0x8080) == gmask) {
+			if (cp >= cpend - 1) {
+				/* flush */
+				XTextExtents16(fe->font, buf, cp - buf,
+					       &dir, &as, &ds, &oa);
+				cp = buf;
+				*ascent = MAX(*ascent, as);
+				*descent = MAX(*descent, ds);
+				overall->lbearing = MIN(overall->lbearing,
+							overall->width + oa.lbearing);
+				overall->rbearing = MAX(overall->rbearing,
+							overall->width + oa.rbearing);
+				overall->width += oa.width;
+				overall->ascent = MAX(overall->ascent, oa.ascent);
+				overall->descent = MAX(overall->descent, oa.descent);
+			}
+			if (is2b)
+				cp->byte1 = ((c >> 8) & 0x7f) | grmap;
+			else
+				cp->byte1 = 0;
+			cp->byte2 = (c & 0x7f) | grmap;
+			cp++;
+			wstr++;
+		}
+
+		if (cp == buf)
+			continue;
+
+		/* flush */
+		XTextExtents16(fe->font, buf, cp - buf, &dir, &as, &ds, &oa);
+		*ascent = MAX(*ascent, as);
+		*descent = MAX(*descent, ds);
+		overall->lbearing = MIN(overall->lbearing,
+					overall->width + oa.lbearing);
+		overall->rbearing = MAX(overall->rbearing,
+					overall->width + oa.rbearing);
+		overall->width += oa.width;
+		overall->ascent = MAX(overall->ascent, oa.ascent);
+		overall->descent = MAX(overall->descent, oa.descent);
+	}
+}
+
+
+/*
+ * private functions
+ */
+
+static int
+wsdrawstring(d, w, gcset, x, y, wstr, len, image)
+Display *d;
+Drawable w;
+XWSGC gcset;
+int x;
+int y;
+wchar *wstr;
+int len;
+int image;
+{
+	XChar2b			buf[bufsize];
+	XChar2b			*cp;
+	wchar			*wstr1 = wstr + len;
+	XChar2b			*cpend = buf + bufsize;
+	int			c;
+	int			sx = x;
+	int			gmask, gset;
+	FontEnt			*fe;
+	int			is2b;
+	int			grmap;
+
+	while (wstr < wstr1) {
+		gmask = *wstr & 0x8080;
+
+		switch (gmask) {
+		case G0MASK:
+			gset = 0;
+			break;
+		case G1MASK:
+			gset = 1;
+			break;
+		case G2MASK:
+			gset = 2;
+			break;
+		case G3MASK:
+			gset = 3;
+			break;
+		}
+
+		fe = &gcset->fe[gset];
+		is2b = fe->flag & TWOB;
+		grmap = (fe->flag & GRMAPPING) ? 0x80 : 0;
+		cp = buf;
+
+		if (fe->gc == NULL) {
+			while (wstr < wstr1 && (*wstr & 0x8080) == gmask)
+				wstr++;
+			continue;
+		}
+		while (wstr < wstr1 && ((c = *wstr) & 0x8080) == gmask) {
+			if (cp >= cpend - 1) {
+				/* flush */
+				x += flushstr(d, w, fe, x, y, buf, cp, image);
+				cp = buf;
+			}
+			if (is2b)
+				cp->byte1 = ((c >> 8) & 0x7f) | grmap;
+			else
+				cp->byte1 = 0;
+			cp->byte2 = (c & 0x7f) | grmap;
+			cp++;
+			wstr++;
+		}
+		/* flush */
+		x += flushstr(d, w, fe, x, y, buf, cp, image);
+		cp = buf;
+	}
+
+	return x - sx;
+}
+
+static int
+flushstr(d, w, fe, x, y, cp0, cp1, image)
+Display *d;
+Drawable w;
+FontEnt *fe;
+int x;
+int y;
+XChar2b *cp0;
+XChar2b *cp1;
+int image;
+{
+	if (cp0 >= cp1 || fe->gc == NULL)
+		return 0;
+
+	if (image)
+		XDrawImageString16(d, w, fe->gc, x, y, cp0, cp1 - cp0);
+	else
+		XDrawString16(d, w, fe->gc, x, y, cp0, cp1 - cp0);
+	return XTextWidth16(fe->font, cp0, cp1 - cp0);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/patchlevel.h	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,3 @@
+#define KINPUT2_VERSION "version 3.1"
+#define DATE "$Date: 2002/10/03 09:31:24 $"
+#define PATCHLEVEL 0
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sj3def/Imakefile	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,41 @@
+#include "../Kinput2.conf"
+
+SJ3DEF_FILES =  sjhk sjrc sjrk sjsb sjzh
+
+OBJS = jcode.o ../lib/Xsj3clib/code.o
+SRCS = jcode.c
+
+DEPLIBS = $(DEPXLIB)
+LOCAL_LIBRARIES = $(XLIB)
+
+#ifdef UseSj3
+INCLUDES = -I../include -I../lib/Xsj3clib -I$(SJ3SRC)/sj3lib -I$(SJ3SRC)
+
+#define SjdefTarget(file)	@@\
+file: file.EUC			@@\
+	rm -f $@		@@\
+	./jcode file.EUC > file 
+
+all:: jcode $(SJ3DEF_FILES)
+install:: $(SJ3DEF_FILES)
+
+SjdefTarget(sjhk)
+SjdefTarget(sjrc)
+SjdefTarget(sjrk)
+SjdefTarget(sjsb)
+SjdefTarget(sjzh)
+SingleProgramTarget(jcode,$(OBJS),$(XLIB),)
+MakeDirectories(install,$(SJ3DEF_DIR))
+InstallMultipleFlags($(SJ3DEF_FILES),$(SJ3DEF_DIR),$(INSTDATFLAGS))
+
+clean::
+	$(RM) $(SJ3DEF_FILES)
+
+DependTarget()
+
+#else
+all::
+clean::
+install::
+depend::
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sj3def/jcode.c	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,173 @@
+#ifndef lint
+static char *rcsid = "$Id: jcode.c,v 2.3 1993/09/22 11:04:10 nao Exp $";
+#endif
+/*
+ * Copyright 1991 Sony Corporation
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Sony not be used in advertising or
+ * publicity pertaining to distribution of the software without specific,
+ * written prior permission.  Sony makes no representations about the
+ * suitability of this software for any purpose.  It is provided "as is"
+ * without express or implied warranty.
+ *
+ * SONY DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL SONY
+ * BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
+ * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN 
+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+/*
+ * Author: Naoshi Suzuki, SONY Corporation.  (nao@sm.sony.co.jp)
+ */
+
+#include <stdio.h>
+#ifdef X_LOCALE
+#include <X11/Xlocale.h>
+#else /* X_LOCALE */
+#include <locale.h>
+#endif /* X_LOCALE */
+#include "common.h"
+
+int code,   kana;
+enum { ASCII, KANJI, GAIJI } g0;
+
+main(argc, argv)
+    int     argc;
+    char  **argv;
+{
+    char           *locale;
+    register FILE  *in,    *out;
+    unsigned char   ibuf[BUFSIZ],   obuf[BUFSIZ];
+
+#ifdef X_LOCALE
+    if (locale = _Xsetlocale(LC_CTYPE, ""))
+#else /* X_LOCALE */
+    if (locale = setlocale(LC_CTYPE, ""))
+#endif /* X_LOCALE */
+        if (!strcmp(locale, "ja_JP.SJIS")||!strcmp(locale, "ja_JP.mscode"))
+            code = JP_SJIS;
+        else if (!strcmp(locale, "ja_JP.jis7")) code = JP_JIS7;
+        else if (!strcmp(locale, "ja_JP.jis8")) code = JP_JIS8;
+        else code = JP_EUC;
+    else code = JP_EUC;
+#ifdef FORCE_SJIS
+    code = JP_SJIS;
+#endif
+#ifdef FORCE_JIS8
+    code = JP_JIS8;
+#endif
+#ifdef FORCE_JIS7
+    code = JP_JIS7;
+#endif
+    if (argc < 2) {
+        in = stdin;
+        out = stdout;
+    } else {
+        if ((in = fopen (*(++argv), "r")) == NULL) {
+            perror (*argv);
+            exit (1);
+        }
+        out = stdout;
+    }
+    if (code == JP_EUC)
+        while (fgets((char *)ibuf, BUFSIZ, in) != NULL)
+            fputs((char *)ibuf, out);
+    else {
+        g0 = ASCII;
+        kana = OFF;
+        while (fgets((char *)ibuf, BUFSIZ, in) != NULL) {
+            conv(ibuf, obuf);
+            fputs((char *)obuf, out);
+            putc('\n', out);
+        }
+    }
+    exit(0);
+}
+
+int
+conv(p, q)
+    register unsigned char *p, *q;
+{
+    wchar                   c;
+
+    while (*p != '\n' && *p != '\0') {
+        if (*p & 0x80) {
+            if (*p == SS2) {
+                p++;
+                if (code != JP_SJIS && g0 != ASCII) {
+                    g0 = ASCII;
+                    *q++ = ESC; *q++ = '('; *q++ = 'J';
+                }
+                if (code == JP_JIS7) {
+                    if (!kana) {
+                        *q++ = SO;
+                        kana++;
+                    }
+                    *q++ = *p++ & MASK;
+                } else {
+                    *q++ = *p++;
+                }
+            } else if (*p == SS3) {
+                if (code == JP_JIS7 && kana) {
+                    *q++ = SI;
+                    kana = OFF;
+                }
+                if (code != JP_SJIS) {
+                    if (g0 != GAIJI) {
+                        g0 = GAIJI;
+                        *q++ = ESC; *q++ = '$'; *q++ = '('; *q++ = 'D';
+                    }
+                    *q++ = (*p++ & MASK); *q++ = (*p++ & MASK);
+                } else {
+                    if (*p < 0x3b) {
+                        c = (*p << 8) | *(p + 1); p += 2;
+                        c = _Xsj3ceuc2sjis(c);
+                        *q++ = (c >> 8) + 0x6f; *q++ = c & 0xff;
+                    } else {
+                        *q++ = 0xfc; *q++ = 0xfc;
+                    }
+                }
+            } else {
+                if (code == JP_JIS7 && kana) {
+                    *q++ = SI;
+                    kana = OFF;
+                }
+                if (code != JP_SJIS) {
+                    if (g0 != KANJI) {
+                        g0 = KANJI;
+                        *q++ = ESC; *q++ = '$'; *q++ = 'B';
+                    }
+                    *q++ = (*p++ & MASK); *q++ = (*p++ & MASK);
+                } else {
+                    c = (*p << 8) | *(p + 1); p += 2;
+                    c = _Xsj3ceuc2sjis(c);
+                    *q++ = c >> 8; *q++ = c & 0xff;
+                }
+            }
+        } else {
+            if (code == JP_JIS7 && kana) {
+                *q++ = SI;
+                kana = OFF;
+            }
+            if (code != JP_SJIS && g0 != ASCII) {
+                    g0 = ASCII;
+                    *q++ = ESC; *q++ = '('; *q++ = 'J';
+            }
+            *q++ = *p++;
+        }
+    }
+    if (code == JP_JIS7 && kana) {
+        *q++ = SI;
+        kana = OFF;
+    }
+    if (code != JP_SJIS && g0 != ASCII) {
+        g0 = ASCII;
+        *q++ = ESC; *q++ = '('; *q++ = 'J';
+    }
+    *q = '\0';
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sj3def/sjhk.EUC	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,102 @@
+#
+# $Id: sjhk.EUC,v 2.0 1992/02/13 21:00:23 nao Exp $
+#
+#	ひらがな/カタカナ変換規則定義ファイル
+#
+#	(区切りは space か htab)
+#[zhira]	[zkata]		[hkata]		[ascii]
+ぁ		ァ		ァ		\#
+あ		ア		ア		3
+ぃ		ィ		ィ		E
+い		イ		イ		e
+ぅ		ゥ		ゥ		$
+う		ウ		ウ		4
+ぇ		ェ		ェ		%
+え		エ		エ		5
+ぉ		ォ		ォ		^
+お		オ		オ		6
+か		カ		カ		t
+が		ガ		ガ		t[
+き		キ		キ		g
+ぎ		ギ		ギ		g[
+く		ク		ク		h
+ぐ		グ		グ		h[
+け		ケ		ケ		'
+げ		ゲ		ゲ		'[
+こ		コ		コ		b
+ご		ゴ		ゴ		b[
+さ		サ		サ		x
+ざ		ザ		ザ		x[
+し		シ		シ		d
+じ		ジ		ジ		d[
+す		ス		ス		r
+ず		ズ		ズ		r[
+せ		セ		セ		p
+ぜ		ゼ		ゼ		p[
+そ		ソ		ソ		c
+ぞ		ゾ		ゾ		c[
+た		タ		タ		q
+だ		ダ		ダ		q[
+ち		チ		チ		a
+ぢ		ヂ		ヂ		a[
+っ		ッ		ッ		Z
+つ		ツ		ツ		z
+づ		ヅ		ヅ		z[
+て		テ		テ		w
+で		デ		デ		w[
+と		ト		ト		s
+ど		ド		ド		s[
+な		ナ		ナ		u
+に		ニ		ニ		i
+ぬ		ヌ		ヌ		1
+ね		ネ		ネ		,
+の		ノ		ノ		k
+は		ハ		ハ		f
+ば		バ		バ		f[
+ぱ		パ		パ		f]
+ひ		ヒ		ヒ		v
+び		ビ		ビ		v[
+ぴ		ピ		ピ		v]
+ふ		フ		フ		2
+ぶ		ブ		ブ		2[
+ぷ		プ		プ		2]
+へ		ヘ		ヘ		=
+べ		ベ		ベ		=[
+ぺ		ペ		ペ		=]
+ほ		ホ		ホ		-
+ぼ		ボ		ボ		-[
+ぽ		ポ		ポ		-]
+ま		マ		マ		j
+み		ミ		ミ		n
+む		ム		ム		`
+め		メ		メ		/
+も		モ		モ		m
+ゃ		ャ		ャ		&
+や		ヤ		ヤ		7
+ゅ		ュ		ュ		*
+ゆ		ユ		ユ		8
+ょ		ョ		ョ		(
+よ		ヨ		ヨ		9
+ら		ラ		ラ		o
+り		リ		リ		l
+る		ル		ル		\.
+れ		レ		レ		;
+ろ		ロ		ロ		_
+わ		ワ		ワ		0
+ゎ		ヮ		ワ		+
+ゐ		ヰ		ィ		E
+ゑ		ヱ		エ		%
+を		ヲ		ヲ		)
+ん		ン		ン		y
+ぶ		ヴ		ヴ		$[
+か		ヵ		カ		T
+け		ヶ		ケ		"
+゛		゛		゙		[
+゜		゜		゚		]
+「		「		「		}
+」		」		」		~
+ー		ー		ー		\\
+ろ		ろ		ロ		|
+、		、		、		<
+。		。		。		>
+・		・		・		?
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sj3def/sjrc.EUC	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,333 @@
+#
+# $Id: sjrc.EUC,v 2.5 1993/01/28 09:58:43 nao Exp $
+#
+#	CcWnn エミュレート用 sjrc
+#
+#   93/01/18	support for Kana Keyboard
+#			minmin@astec.co.jp
+#
+#command		modemask	keysym		input same
+.ki2key.jis		n		F5
+.ki2key.jis		kana		F5
+.ki2key.jis		m		5		off
+.ki2key.jis		kana|m		kana_E		off
+.ki2key.kuten		n		F6
+.ki2key.kuten		kana		F6
+.ki2key.kuten		m		6		off
+.ki2key.kuten		kana|m		kana_O		off
+.ki2key.convert		c|F		j
+.ki2key.convert		kana|c|F	kana_MA		off
+.ki2key.convert		c|F		c
+.ki2key.convert		kana|c|F	kana_SO		off
+#.ki2key.convert	F		period		# for roma input
+#.ki2key.convert	s|F		greater		# for kana input
+.ki2key.convert		s|F		Kanji
+.ki2key.convert		kana|s|F	Kanji
+.ki2key.convert		F		Kanji
+.ki2key.convert		kana|F		Kanji
+.ki2key.next		c|C		n
+.ki2key.next		kana|c|C	kana_MI		off
+.ki2key.next		C		Down
+.ki2key.next		kana|C		Down
+.ki2key.up 		c|S		p
+.ki2key.up		kana|c|S	kana_SE		off
+.ki2key.down		c|S		n
+.ki2key.down		kana|c|S	kana_MI		off
+.ki2key.prev		c|C		p
+.ki2key.prev		kana|c|C	kana_SE		off
+.ki2key.prev		C		Up
+.ki2key.prev		kana|C		Up
+.ki2key.unconvert	c|C		g
+.ki2key.unconvert	kana|c|C	kana_KI		off
+.ki2key.forward		c|F|S		f
+.ki2key.forward		kana|c|F|S	kana_HA		off
+.ki2key.forward		F|S		Right
+.ki2key.forward		kana|F|S	Right		off
+.ki2key.forward		c|S		j
+.ki2key.forward		kana|c|S	kana_MA		off
+.ki2key.forward		S		Kanji
+.ki2key.forward		kana|S		Kanji
+.ki2key.forward		c|S		c
+.ki2key.forward		kana|c|S	kana_SO		off
+.ki2key.backward	c|F|S		b
+.ki2key.backward	kana|c|F|S	kana_KO		off
+.ki2key.backward	F|S		Left
+.ki2key.backward	kana|F|S	Left		off
+.ki2key.top		c|F|S		a
+.ki2key.top		kana|c|F|S	kana_CHI	off
+.ki2key.bottom		c|F|S		e
+.ki2key.bottom		kana|c|F|S	kana_I		off
+.ki2key.expand		s|F|S|D		Right
+.ki2key.expand		kana|s|F|S|D	Right		off
+.ki2key.shrink		s|F|S|D		Left
+.ki2key.shrink		kana|s|F|S|D	Left		off
+.ki2key.backspace	c|F|S|D		h
+.ki2key.backspace	kana|c|F|S|D	kana_KU		off
+.ki2key.backspace	kana|F|S|D	BackSpace
+.ki2key.delete		kana|F|S|D	Delete
+.ki2key.fix		c|F|S|D		l
+.ki2key.fix		kana|c|F|S|D	kana_RI		off
+.ki2key.fix		kana|F|S|D	Execute
+.ki2key.cancel		c|F		u
+.ki2key.cancel		kana|c|F	kana_NA		off
+.ki2key.return		c|F|S|D		m
+.ki2key.return		kana|c|F|S|D	kana_MO		off
+.ki2key.return		kana|A		Return
+.ki2key.start		s|A		space		off
+.ki2key.start		kana|s|A	space		off
+.ki2key.start		c|A		Kanji
+.ki2key.start		kana|c|A	Kanji
+.ki2key.zkatakana	F|S|D		F1
+.ki2key.zkatakana	kana|F|S|D	F1
+.ki2key.zkatakana	m|F|S|D		1		off
+.ki2key.zkatakana	kana|m|F|S|D	kana_NU		off
+.ki2key.hiragana	F|S|D		F2
+.ki2key.hiragana	kana|F|S|D	F2
+.ki2key.hiragana	m|F|S|D		2		off
+.ki2key.hiragana	kana|m|F|S|D	kana_FU		off
+.ki2key.hankaku		F|S|D		F3
+.ki2key.hankaku		kana|F|S|D	F3
+.ki2key.hankaku		m|F|S|D		3		off
+.ki2key.hankaku		kana|m|F|S|D	kana_A		off
+.ki2key.zenkaku		F|S|D		F4
+.ki2key.zenkaku		kana|F|S|D	F4
+.ki2key.zenkaku		m|F|S|D		4		off
+.ki2key.zenkaku		kana|m|F|S|D	kana_U		off
+.ki2key.bell		F		Escape
+.ki2key.bell		kana|F		Escape
+.ki2key.kana		c|s		K
+.ki2key.kana		kana|c|s	K		off
+.ki2key.ignore		A		Cancel
+.ki2key.ignore		s|A		Cancel
+.ki2key.ignore		A		Select
+.ki2key.ignore		m|C		Select
+.ki2key.ignore		F		KP_Enter
+.ki2key.ignore		n		F7
+.ki2key.ignore		n		F8
+#.ki2key.ignore		n		F9
+#.ki2key.ignore		n		F10
+.ki2key.ignore		s|N|F		F12
+.ki2key.ignore		s|N|F		F13
+.ki2key.ignore		s|N|F		F14
+.ki2key.ignore		s|N|F		F15
+.ki2key.ignore		s|F		F16
+.ki2key.ignore		s|F		F17
+.ki2key.ignore		s|F		F18
+.ki2key.ignore		s|F		F19
+.ki2key.ignore		s|F		F20
+.ki2key.ignore		c|F		Tab
+.ki2key.ignore		s|c|F		Tab
+.ki2key.cancel		kana|S|D	Escape
+#
+# ss@astec.co.jp/1992.11.25
+#	* 文節伸ばし/縮め、辞書登録/削除、記号を追加した。
+#	* Tabキーでモード切替えだったのをF9にした
+#
+.ki2key.expand		c|F|S|D		o
+.ki2key.expand		kana|c|F|S|D	kana_RA		off
+.ki2key.shrink		c|F|S|D		i
+.ki2key.shrink		kana|c|F|S|D	kana_NI		off
+.ki2key.toroku		c|F		t
+.ki2key.toroku		kana|c|F	kana_KA		off
+.ki2key.syoukyo		c|F		v
+.ki2key.syoukyo		kana|c|F	kana_HI		off
+.ki2key.symbol		c|F		q
+.ki2key.symbol		kana|c|F	kana_TA		off
+.ki2key.symbol		n		F10
+.ki2key.symbol		kana		F10
+.ki2key.modedown	n		F9
+.ki2key.modedown	kana		F9
+.ki2key.modeup		n		F8
+.ki2key.modeup		kana		F8
+.ki2key.ignore		n		Tab
+.ki2key.ignore		s		Tab
+#
+# CcWnn の convert-or-space は
+# .ki2key.convert       F               space
+# fix-or-cr は
+# .ki2key.fix           F               Return
+# .ki2key.return        N|S|D           Return
+# とかすればよい
+#
+#	モード表示文字列
+# ss@astec.co.jp
+#	* .guide.zkatakanaのコメントを外した
+#
+.guide.hiragana		ローマ
+.guide.zkatakana	全カタカナ
+#.guide.hkatakana	半カタカナ
+.guide.zalpha		ABC
+.guide.halpha		ABC
+#.guide.sjis		SJISコード
+#.guide.euc		EUCコード
+.guide.jis		JISコード
+.guide.kuten		区点コード
+#.guide.register	辞書登録
+#.guide.eliminate	辞書抹消
+#.guide.kanji		変換済
+#.guide.edit		編集中
+#.guide.candidate	候補選択
+#.guide.symbol		記号選択
+#.guide.hinsi		品詞選択
+#.guide.quote		直接入力
+#
+#	入力文字種の変更順指定
+# ss@astec.co.jp
+#	* zkatakanaを追加した
+#
+.InitialMode		unbuff.hiragana.zkatakana.direct.halpha.zalpha
+#
+#	入力コードの変更順指定
+#.DefaultCode		jis.kuten
+#
+#	変換前の muhenkan で入力文字種がひらがなのときの変更文字種指定
+#.MuhenkanMode		halpha
+#
+#	変換後の muhenkan での表示文字種のトグル指定
+#.MuhenkanToggle	on
+#
+#	変換後の muhenkan で表示文字種が全角カタカナの時のトグル文字種指定
+#.MuhenkanInEdit	hiragana
+#
+#	ローマ字かな変換出来ないときベルを鳴らすか
+#.rkerrbell		on
+#
+#	入力文字種変更時の確定指定
+#.FlushAfterConversion	off
+#
+#	文節長(文節間)学習機能を使用するか
+#.bstudy		on
+#
+#	first sj3serv のホスト名指定
+#.sj3serv		localhost
+#
+#	アプリケーションに渡すコントロールコードの指定
+#.SetNormal		
+#
+#	指定されたコントロールコードと直後に入力された文字を渡す指定
+.ThroughNext		
+#
+#	second sj3serv のホスト名指定
+#.sj3serv2		localhost
+#
+#	ローマ字かな変換中のアルファベットを全角文字に変換するか
+#.AlphabetConversion	off
+#
+#	文字消去時に変換途中のローマ字(ローマ字入力のとき)や非濁音
+#	(かな入力のとき)を表示するか
+#.BackDisplay		off
+#
+#	一括変換時の注目するセグメントの位置
+# ss@astec.co.jp
+#	* 変換後のカーソル位置をcanna風に先頭にした。
+#.BeginConversionLast	none
+.BeginConversionLast	off
+#
+#	文節拡張時の拡張部分の表示文字種変換動作の指定
+#.ExpandModeConversion	off.off
+#
+#	文節縮小時の縮小部分の表示文字種変換動作の指定
+#.ShrinkModeConversion	off.off
+#
+#	文節拡張時の拡張部分のかな漢字変換動作の指定
+#.ExpandKanjiConversion	off.on
+#
+#	文節縮小時の縮小部分のかな漢字変換動作の指定
+#.ShrinkKanjiConversion	off.on
+#
+#	文節縮小時に1文字しかないときの前文節との合節動作の指定
+#.ShrinkAll	off
+#
+#	ConvedMode で文字入力のキーを押したときの動作の指定
+.FlushInConversion	off
+#
+#	候補選択で文字入力のキーを押したときの動作の指定
+.FlushSelectConversion	off
+#
+#	変換終了操作時の確定動作の指定
+#.FlushEndConversion	on
+#
+#	かな漢字変換を行う文節の指定
+.HenkanSegment		after
+#
+#	無変換状態にする文節の指定
+#.MuhenkanSegment	one
+#
+#	文字消去時に無変換状態にする文節の指定
+#.DeleteChangeSegment	one
+#
+#     部分確定時に無変換状態にする文節の指定
+#.FlushChangeSegment	off
+#
+#	文字種変更ファンクションが呼ばれたときの動作の指定
+.ModeConversion.hiragana	on.on.on
+.ModeConversion.zkatakana	on.on.on
+#
+#	カレント文節/カーソルの前後移動時の移動単位の指定
+#.MoveBySegment		off.on
+#
+#	カレント文節/カーソルが終端にあるときの前後移動時の逆端戻りの動作指定
+#.MoveLoop		off
+#
+#	カレント文節/カーソルの終端移動時の移動単位の指定
+.JumpBySegment		on.on
+#
+#	文字/文節消去の消去単位指定
+.DeleteBySegment	off.off
+#
+#     文末まで消去する場合の消去単位指定
+#.KillBySegment		off.off
+#
+#	無変換状態に移行時のテキストカーソル位置の指定
+#.MuhenkanCursorLast	off
+#
+#	編集開始時のテキストカーソル位置の指定
+#.EditCursorLast	off
+#
+#	部分確定時に無変換状態にするときのテキストカーソル位置の指定
+#.FlushCursorLast	off
+#
+#	変換済み文節のアンダーラインの指定
+.ConvertedUnderLine	off
+#
+#	変換モード変更時のモード表示変更の指定
+#.DisplayModeChange	off
+#
+#	最後の文節を消去したときのカレント文節移動の指定
+.DeleteLastMove		off
+#
+#	かなキーボードでないキーボードでかな入力をする機能の初期指定
+#.KanaInputOnly		off
+#
+#	文字入力動作と同時にファンクションの機能を実行するかどうかの指定
+#.InputSameTime		on
+#
+#	コントロールコード入力とファンクションを同時実行するかどうかの指定
+#.ControlSameTime	off
+#
+#	表示文字種の変更順の指定
+#.PrintMode		hiragana.zkatakana.hankaku.zenkaku
+#
+#	候補選択の前に文字種をひらがなにして再度かな漢字変換するかの指定
+.BeforeSelectConversion	off
+#
+#	かな漢字変換の前に文字種をひらがなにして変換をするかの指定
+#.BeforeConversion	off
+#
+#	かな漢字変換の前に文字種を入力文字種に再変換するかの指定
+#.LastDoubleConversion	off
+#
+#	候補選択の前にカレント文節を次候補に置き換える回数
+#.BeforeSelectCount	0
+#
+#	候補選択で backspace の動作をしたときにカレント文節を消去する指定
+.SelectBackSpaceMove	on
+#
+#	候補選択でひらがな/全角カタカナの候補を出す指定
+.CandidatePadding	on
+#
+#	sjrc ファンクション実行時に読み込まれるファイルの設定
+#.NextRCFile		file_name
+#
+#	include ファイルの設定
+#.Include		file_name
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sj3def/sjrc.iroha.EUC	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,314 @@
+#
+# $Id: sjrc.iroha.EUC,v 2.2 1993/01/06 11:04:24 nao Exp $
+#
+#	Canna version 1.2 エミュレート用 sjrc
+#command		modemask	keysym		input same
+
+# 日本語入力モードとの切り替え
+.ki2key.start		c|N		o
+.ki2key.start		N		Kanji
+.ki2key.start		s|N		Kanji
+.ki2key.start		c|N		Kanji
+.ki2key.start		s|c|N		Kanji
+.ki2key.start		s|A		space
+
+# 記号入力
+.ki2key.symbol		N|I		Insert
+
+# 単語登録
+.ki2key.register	C		Help
+.ki2key.syoukyo		s|C		Help
+
+# 消去
+.ki2key.backspace	I		BackSpace
+.ki2key.unconvert	C		BackSpace
+.ki2key.cancel		S|D		BackSpace
+.ki2key.bell		C		Delete
+
+.ki2key.backspace	c|I		h
+.ki2key.unconvert	c|C		h
+.ki2key.cancel		c|S|D		h
+
+.ki2key.delete		c|I		d
+.ki2key.delafter	c|I		k
+.ki2key.flushbefore	c|C		k
+
+# 変換
+.ki2key.convert		F		space		off
+.ki2key.forward		S		space		off
+.ki2key.convert		F		Kanji		off
+.ki2key.forward		S		Kanji		off
+
+.ki2key.return		N|S|D		Return
+.ki2key.fix		F		Return
+
+.ki2key.return		c|N|S|D		m
+.ki2key.fix		c|F		m
+.ki2key.return		c|N|S|D		j
+.ki2key.fix		c|F		j
+
+# 矢印
+.ki2key.forward		F|S		Right
+.ki2key.modedown	s|I		Right
+.ki2key.expand		s|C		Right
+.ki2key.backward	F|S		Left
+.ki2key.modeup		s|I		Left
+.ki2key.shrink		s|C		Left
+.ki2key.nextmode	I		Down
+.ki2key.next		C		Down
+.ki2key.down		S		Down
+.ki2key.prevmode	I		Up
+.ki2key.prev		C		Up
+.ki2key.up		S		Up
+
+.ki2key.forward		c|F|S		f
+.ki2key.backward	c|F|S		b
+.ki2key.nextmode	c|I		n
+.ki2key.next		c|C		n
+.ki2key.down		c|S		n
+.ki2key.prevmode	c|I		p
+.ki2key.prev		c|C		p
+.ki2key.up 		c|S		p
+
+# その他移動
+.ki2key.top		c|F|S		a
+.ki2key.bottom		c|F|S		e
+
+# 文節
+.ki2key.modedown	I		Tab
+.ki2key.modedown	s|I		Tab
+.ki2key.shrink		C		Tab
+
+.ki2key.modedown	c|I		i
+.ki2key.shrink		c|C		i
+.ki2key.shrink		m|c|I		i		off
+
+.ki2key.modeup		c|I		o
+.ki2key.expand		c|C		o
+.ki2key.expand		m|c|I		o		off
+
+# 取りやめ
+.ki2key.unconvert	c|C		g
+.ki2key.cancel		c|I|S|D		g
+
+# その他
+.ki2key.quote		c|I		q
+.ki2key.convert		c|C		w
+#.ki2key.euc		c|I		y
+.ki2key.edit		c|C		c
+
+# ベルを鳴らすもの
+.ki2key.bell		c|I|S|D		c
+.ki2key.bell		c|C|S|D		d
+.ki2key.bell		c|S		i
+.ki2key.bell		c|S		k
+.ki2key.bell		c|C|S|D		l
+.ki2key.bell		c|S		o
+.ki2key.bell		c|C|S|D		q
+.ki2key.bell		c|A		r
+.ki2key.bell		c|A		s
+.ki2key.bell		c|A		t
+.ki2key.bell		c|C|S|D		u
+.ki2key.bell		c|A		v
+.ki2key.bell		c|S|D		w
+.ki2key.bell		c|A		x
+.ki2key.bell		c|A		y
+.ki2key.bell		c|A		z
+
+# 機能を殺すもの
+.ki2key.ignore		A		Cancel
+.ki2key.ignore		s|A		Cancel
+.ki2key.ignore		A		Select
+.ki2key.ignore		m|C		Select
+
+.ki2key.ignore		F		KP_Enter
+.ki2key.ignore		n		F7
+.ki2key.ignore		n		F8
+.ki2key.ignore		n		F9
+.ki2key.ignore		n		F10
+.ki2key.ignore		s|N|F		F12
+.ki2key.ignore		s|N|F		F13
+.ki2key.ignore		s|N|F		F14
+.ki2key.ignore		s|N|F		F15
+.ki2key.ignore		s|F		F16
+.ki2key.ignore		s|F		F17
+.ki2key.ignore		s|F		F18
+.ki2key.ignore		s|F		F19
+.ki2key.ignore		s|F		F20
+.ki2key.ignore		c|F		Tab
+.ki2key.ignore		s|c|F		Tab
+#
+#
+#	モード表示文字列
+.guide.hiragana		 [あ]
+.guide.zkatakana	 [ア]
+.guide.hkatakana	 [ア]
+.guide.zalpha		 [a]
+.guide.halpha		 [a]
+#.guide.sjis		 [SJIS]
+.guide.euc		 [EUC]
+#.guide.jis		 [JIS]
+#.guide.kuten		 [区点]
+.guide.register		 [登録]
+.guide.eliminate	 [削除]
+.guide.kanji		 [漢字]
+.guide.edit		 [編集]
+.guide.candidate	 [候補]
+.guide.symbol		 [記号]
+.guide.hinsi		 [品詞]
+.guide.quote		 [q]
+#
+#	入力文字種の変更順指定
+.InitialMode		hiragana.zkatakana.hkatakana.zalpha.halpha
+#
+#	入力コードの変更順指定
+#.DefaultCode		jis.kuten
+#
+#	変換前の muhenkan で入力文字種がひらがなのときの変更文字種指定
+#.MuhenkanMode		halpha
+#
+#	変換後の muhenkan での表示文字種のトグル指定
+#.MuhenkanToggle	on
+#
+#	変換後の muhenkan で表示文字種が全角カタカナの時のトグル文字種指定
+#.MuhenkanInEdit	hiragana
+#
+#	ローマ字かな変換出来ないときベルを鳴らすか
+#.rkerrbell		off
+#
+#	入力文字種変更時の確定指定
+#.FlushAfterConversion	off
+#
+#	文節長(文節間)学習機能を使用するか
+#.bstudy		on
+#
+#	first sj3serv のホスト名指定
+#.sj3serv		localhost
+#
+#	アプリケーションに渡すコントロールコードの指定
+#.SetNormal		
+#
+#	指定されたコントロールコードと直後に入力された文字を渡す指定
+#.ThroughNext		
+#
+#	second sj3serv のホスト名指定
+#.sj3serv2		localhost
+#
+#	ローマ字かな変換中のアルファベットを全角文字に変換するか
+#.AlphabetConversion	off
+#
+#	文字消去時に変換途中のローマ字(ローマ字入力のとき)や非濁音
+#	(かな入力のとき)を表示するか
+#.BackDisplay		off
+#
+#	一括変換時の注目するセグメントの位置
+.BeginConversionLast	off
+#
+#	文節拡張時の拡張部分の表示文字種変換動作の指定
+#.ExpandModeConversion	on.off
+#
+#	文節縮小時の縮小部分の表示文字種変換動作の指定
+#.ShrinkModeConversion	on.off
+#
+#	文節拡張時の拡張部分のかな漢字変換動作の指定
+#.ExpandKanjiConversion	off.on
+#
+#	文節縮小時の縮小部分のかな漢字変換動作の指定
+#.ShrinkKanjiConversion	off.on
+#
+#	文節縮小時に1文字しかないときの前文節との合節動作の指定
+#.ShrinkAll	off
+#
+#	ConvedMode で文字入力のキーを押したときの動作の指定
+#.FlushInConversion	on
+#
+#	候補選択で文字入力のキーを押したときの動作の指定
+.FlushSelectConversion	on
+#
+#	変換終了操作時の確定動作の指定
+.FlushEndConversion	off
+#
+#	かな漢字変換を行う文節の指定
+#.HenkanSegment		all
+#
+#	無変換状態にする文節の指定
+.MuhenkanSegment	all
+#
+#	文字消去時に無変換状態にする文節の動作の指定
+#.DeleteChangeSegment	one
+#
+#	部分確定時に無変換状態にする文節のの指定
+.FlushChangeSegment	all
+#
+#	文字種変更ファンクションが呼ばれたときの動作の指定
+#.ModeConversion.hiragana	off.off.off
+#.ModeConversion.zkatakana	off.off.off
+#
+#	カレント文節/カーソルの前後移動時の移動単位の指定
+#.MoveBySegment		off.on
+#
+#	カレント文節/カーソルが終端にあるときの前後移動時の逆端戻りの動作指定
+.MoveLoop		on
+#
+#	カレント文節/カーソルの終端移動時の移動単位の指定
+#.JumpBySegment		off.on
+#
+#	文字/文節消去の消去単位指定
+.DeleteBySegment	off.off
+#
+#	文末まで消去する場合の消去単位指定
+#.KillBySegment	off.off
+#
+#	無変換状態に移行時のテキストカーソル位置の指定
+.MuhenkanCursorLast	on
+#
+#	編集開始時のテキストカーソル位置の指定
+#.EditCursorLast	off
+#
+#	部分確定時に無変換状態にするときのテキストカーソル位置の指定
+#.FlushCursorLast	off
+#
+#	変換済み文節のアンダーラインの指定
+.ConvertedUnderLine	off
+#
+#	変換モード変更時のモード表示変更の指定
+.DisplayModeChange	on
+#
+#	最後の文節を消去したときのカレント文節移動の指定
+.DeleteLastMove		off
+#
+#	かなキーボードでないキーボードでかな入力をする機能の初期指定
+#.KanaInputOnly		off
+#
+#	文字入力動作と同時にファンクションの機能を実行するかどうかの指定
+.InputSameTime		off
+#
+#	コントロールコード入力とファンクションを同時実行するかどうかの指定
+#.ControlSameTime	off
+#
+#	表示文字種の変更順の指定
+.PrintMode		hiragana.zkatakana.hkatakana.zalpha.halpha
+#
+#	候補選択の前に文字種をひらがなにして再度かな漢字変換するかの指定
+.BeforeSelectConversion	off
+#
+#	かな漢字変換の前に文字種をひらがなにして変換をするかの指定
+#.BeforeConversion	off
+#
+#	かな漢字変換の前に文字種を入力文字種に再変換するかの指定
+.LastDoubleConversion	on
+#
+#	候補選択の前にカレント文節を次候補に置き換える回数
+.BeforeSelectCount	1
+#
+#	候補選択で backspace の動作をしたときにカレント文節を消去する指定
+#.SelectBackSpaceMove	off
+#
+#	候補選択でひらがな/全角カタカナの候補を出す指定
+.CandidatePadding	on
+#
+#	sjrc ファンクション実行時に読み込まれるファイルの設定
+#.NextRCFile		file_name
+#
+#	include ファイルの設定
+#.Include		file_name
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sj3def/sjrc.sjx.EUC	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,237 @@
+#
+# $Id: sjrc.sjx.EUC,v 2.2 1993/01/06 11:04:39 nao Exp $
+#
+#	sj3/sjx エミュレート用 sjrc
+#command		modemask	keysym		input same
+.ki2key.edit		I|C		F3
+.ki2key.backspace	I|D		BackSpace
+.ki2key.delete		C		BackSpace
+.ki2key.select		S		Execute
+.ki2key.start		N		Execute
+.ki2key.down		S		Select
+.ki2key.up  		S		Cancel
+.ki2key.halpha		N|F		F6
+.ki2key.zalpha		N|F		F7
+.ki2key.hkatakana	N|F		F8
+.ki2key.zkatakana	N|F		F9
+.ki2key.hiragana	N|F		F10
+.ki2key.bell		D		F1
+.ki2key.symbol		N|F		F4
+.ki2key.cancel		S		F1
+.ki2key.cancel		S		F2
+.ki2key.cancel		S		F3
+.ki2key.cancel		S		F4
+.ki2key.cancel		S		F5
+.ki2key.cancel		S		F6
+.ki2key.cancel		S		F7
+.ki2key.cancel		S		F8
+.ki2key.cancel		S		F9
+.ki2key.cancel		S		F10
+.ki2key.bell		D		F1
+.ki2key.bell		D		F2
+.ki2key.bell		D		F3
+.ki2key.bell		D		F4
+.ki2key.bell		D		F5
+.ki2key.bell		D		F6
+.ki2key.bell		D		F7
+.ki2key.bell		D		F8
+.ki2key.bell		D		F9
+.ki2key.bell		D		F10
+.ki2key.ignore		s|C		Cancel
+.ki2key.ignore		m|C		Select
+.ki2key.ignore		c|F		u
+.ki2key.ignore		c|F		l
+.ki2key.ignore		s|N|F		F12
+.ki2key.ignore		s|N|F		F13
+.ki2key.ignore		s|N|F		F14
+.ki2key.ignore		s|N|F		F15
+.ki2key.ignore		s|F		F16
+.ki2key.ignore		s|F		F17
+.ki2key.ignore		s|F		F18
+.ki2key.ignore		s|F		F19
+.ki2key.ignore		s|F		F20
+.ki2key.ignore		A		Tab
+.ki2key.ignore		s|A		Tab
+.ki2key.ignore		c|F		Tab
+.ki2key.ignore		s|c|F		Tab
+.ki2key.ignore		c|F|D		a
+.ki2key.ignore		c|F|D		e
+.ki2key.ignore		c|O		Up
+.ki2key.ignore		c|O		Down
+#
+#	モード表示文字列
+.guide.hiragana		全ひらがな
+.guide.zkatakana	全カタカナ
+.guide.hkatakana	半カタカナ
+.guide.zalpha		全アルファ
+.guide.halpha		半アルファ
+#.guide.sjis		Shift-JIS
+#.guide.euc		EUC
+#.guide.jis		JIS
+#.guide.kuten		区点
+#.guide.register	登録
+#.guide.eliminate	消去
+#.guide.kanji		変換済
+#.guide.edit		編集
+#.guide.candidate	候補
+#.guide.symbol		記号
+#.guide.hinsi		品詞
+#.guide.quote		直接
+#
+#	入力文字種の変更順指定
+.InitialMode		unbuff.hiragana.direct
+#
+#	入力コードの変更順指定
+#.DefaultCode		sjis.euc.jis.kuten
+#
+#	変換前の muhenkan で入力文字種がひらがなのときの変更文字種指定
+#.MuhenkanMode		halpha
+#
+#	変換後の muhenkan での表示文字種のトグル指定
+#.MuhenkanToggle	on
+#
+#	変換後の muhenkan で表示文字種が全角カタカナの時のトグル文字種指定
+.MuhenkanInEdit	halpha
+#
+#	ローマ字かな変換出来ないときベルを鳴らすか
+#.rkerrbell		on
+#
+#	入力文字種変更時の確定指定
+#.FlushAfterConversion	off
+#
+#	文節長(文節間)学習機能を使用するか
+#.bstudy		on
+#
+#	first sj3serv のホスト名指定
+#.sj3serv		localhost
+#
+#	アプリケーションに渡すコントロールコードの指定
+#.SetNormal		
+#
+#	指定されたコントロールコードと直後に入力された文字を渡す指定
+#.ThroughNext		
+#
+#	second sj3serv のホスト名指定
+#.sj3serv2		localhost
+#
+#	ローマ字かな変換中のアルファベットを全角文字に変換するか
+.AlphabetConversion	on
+#
+#	文字消去時に変換途中のローマ字(ローマ字入力のとき)や非濁音
+#	(かな入力のとき)を表示するか
+.BackDisplay		on
+#
+#	一括変換時の注目するセグメントの位置
+#.BeginConversionLast	on
+#
+#	文節拡張時の拡張部分の表示文字種変換動作の指定
+.ExpandModeConversion	off.on
+#
+#	文節縮小時の縮小部分の表示文字種変換動作の指定
+.ShrinkModeConversion	off.on
+#
+#	文節拡張時の拡張部分のかな漢字変換動作の指定
+#.ExpandKanjiConversion	off.on
+#
+#	文節縮小時の縮小部分のかな漢字変換動作の指定
+#.ShrinkKanjiConversion	off.on
+#
+#	文節縮小時に1文字しかないときの前文節との合節動作の指定
+#.ShrinkAll	off
+#
+#	ConvedMode で文字入力のキーを押したときの動作の指定
+#.FlushInConversion	on
+#
+#	候補選択で文字入力のキーを押したときの動作の指定
+#.FlushSelectConversion	none
+#
+#	変換終了操作時の確定動作の指定
+#.FlushEndConversion	on
+#
+#	かな漢字変換を行う文節の指定
+.HenkanSegment		one
+#
+#	無変換状態にする文節の指定
+#.MuhenkanSegment	one
+#
+#	文字消去時に無変換状態にする文節の指定
+#.DeleteChangeSegment	one
+#
+#	部分確定時に無変換状態にする文節の指定
+#.FlushChangeSegment	off
+#
+#	文字種変更ファンクションが呼ばれたときの動作の指定
+#.ModeConversion.hiragana	off.on.off
+#.ModeConversion.zkatakana	off.on.off
+#.ModeConversion.hkatakana	off.on.off
+#.ModeConversion.halpha		off.on.off
+#.ModeConversion.zalpha		off.on.off
+#
+#	カレント文節/カーソルの前後移動時の移動単位の指定
+.MoveBySegment		on.on
+#
+#	カレント文節/カーソルが終端にあるときの前後移動時の逆端戻りの動作指定
+#.MoveLoop		off
+#
+#	カレント文節/カーソルの終端移動時の移動単位の指定
+#.JumpBySegment		on.on
+#
+#	文字/文節消去の消去単位指定
+.DeleteBySegment	on.on
+#
+#	文末まで消去する場合の消去単位指定
+#.KillBySegment		off.off
+#
+#	無変換状態に移行時のテキストカーソル位置の指定
+#.MuhenkanCursorLast	off
+#
+#	編集開始時のテキストカーソル位置の指定
+#.EditCursorLast	off
+#
+#	部分確定時に無変換状態にするときのテキストカーソル位置の指定
+#.FlushCursorLast	off
+#
+#	変換済み文節のアンダーラインの指定
+#.ConvertedUnderLine	on
+#
+#	変換モード変更時のモード表示変更の指定
+#.DisplayModeChange	off
+#
+#	最後の文節を消去したときのカレント文節移動の指定
+#.DeleteLastMove	on
+#
+#	かなキーボードでないキーボードでかな入力をする機能の初期指定
+#.KanaInputOnly		off
+#
+#	文字入力動作と同時にファンクションの機能を実行するかどうかの指定
+#.InputSameTime		on
+#
+#	コントロールコード入力とファンクションを同時実行するかどうかの指定
+#.ControlSameTime	off
+#
+#	表示文字種の変更順の指定
+#.PrintMode		hiragana.zkatakana.hankaku.zenkaku
+#
+#	候補選択の前にひらがなにして再度かな漢字変換するかの指定
+#.BeforeSelectConversion	on
+#
+#	かな漢字変換の前に文字種をひらがなにして変換をするかの指定
+#.BeforeConversion	off
+#
+#	かな漢字変換の前に文字種を入力文字種に再変換するかの指定
+#.LastDoubleConversion	off
+#
+#	候補選択の前にカレント文節を次候補に置き換える回数
+#.BeforeSelectCount	0
+#
+#	候補選択で backspace の動作をしたときにカレント文節を消去する指定
+#.SelectBackSpaceMove	off
+#
+#	候補選択でひらがな/全角カタカナの候補を出す指定
+#.CandidatePadding	off
+#
+#	sjrc ファンクション実行時に読み込まれるファイルの設定
+#.NextRCFile		file_name
+#
+#	include ファイルの設定
+#.Include		file_name
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sj3def/sjrk.EUC	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,673 @@
+#
+# $Id: sjrk.EUC,v 2.1 1992/12/18 03:54:02 nao Exp $
+#
+#	ローマ字かな変換規則定義ファイル(CcWnn エミュレート用)
+#
+#	(区切りは space か htab)
+#[in_romaji]	[out_kana]	[out_romaji]
+a		あ
+i		い
+u		う
+e		え
+o		お
+
+ka		か
+ki		き
+ku		く
+ke		け
+ko		こ
+ca		か
+ci		き
+cu		く
+ce		せ
+co		こ
+kya		きゃ
+kyi		き
+kyu		きゅ
+kye		きぇ
+kyo		きょ
+qya		くゃ
+qyi		くぃ
+qyu		くゅ
+qye		くぇ
+qyo		くょ
+qwa		くゎ
+qwi		くぃ
+qwu		くぅ
+qwe		くぇ
+qwo		くぉ
+kwa		くぁ
+kwi		くぃ
+kwu		くぅ
+kwe		くぇ
+kwo		くぉ
+
+sa		さ
+si		し
+su		す
+se		せ
+so		そ
+sya		しゃ
+syi		しぃ
+syu		しゅ
+sye		しぇ
+syo		しょ
+sha		しゃ
+shi		し
+shu		しゅ
+she		しぇ
+sho		しょ
+swi		すぃ
+swe		すぇ
+
+ta		た
+ti		ち
+tu		つ
+te		て
+to		と
+tha		てゃ
+thi		てぃ
+thu		てゅ
+the		てぇ
+tho		てょ
+tya		ちゃ
+tyi		ちぃ
+tyu		ちゅ
+tye		ちぇ
+tyo		ちょ
+tsya		ちゃ
+tsyi		ち
+tsyu		ちゅ
+tsye		ちぇ
+tsyo		ちょ
+cha		ちゃ
+chi		ち
+chu		ちゅ
+che		ちぇ
+cho		ちょ
+cya		ちゃ
+cyi		ちぃ
+cyu		ちゅ
+cye		ちぇ
+cyo		ちょ
+tsa		つぁ
+tsi		つぃ
+tsu		つ
+tse		つぇ
+tso		つぉ
+twa		とゎ
+twi		とぃ
+twu		とぅ
+twe		とぇ
+two		とぉ
+
+na		な
+ni		に
+nu		ぬ
+ne		ね
+no		の
+nya		にゃ
+nyi		にぃ
+nyu		にゅ
+nye		にぇ
+nyo		にょ
+
+ha		は
+hi		ひ
+hu		ふ
+he		へ
+ho		ほ
+hya		ひゃ
+hyi		ひぃ
+hyu		ひゅ
+hye		ひぇ
+hyo		ひょ
+hwa		ふゎ
+hwi		ふぃ
+hwe		ふぇ
+hwo		ふぉ
+fa		ふぁ
+fi		ふぃ
+fu		ふ
+fe		ふぇ
+fo		ふぉ
+fya		ふゃ
+fyi		ふぃ
+fyu		ふゅ
+fye		ふぇ
+fyo		ふょ
+fwa		ふゎ
+fwi		ふぃ
+fwu		ふぅ
+fwe		ふぇ
+fwo		ふぉ
+
+ma		ま
+mi		み
+mu		む
+me		め
+mo		も
+mya		みゃ
+myi		みぃ
+myu		みゅ
+mye		みぇ
+myo		みょ
+
+ya		や
+yi		い
+yu		ゆ
+ye		いぇ
+yo		よ
+ra		ら
+ri		り
+ru		る
+re		れ
+ro		ろ
+la		ら
+li		り
+lu		る
+le		れ
+lo		ろ
+rya		りゃ
+ryi		りぃ
+ryu		りゅ
+rye		りぇ
+ryo		りょ
+lya		りゃ
+lyi		りぃ
+lyu		りゅ
+lye		りぇ
+lyo		りょ
+
+wa		わ
+wi		ゐ
+wu		う
+we		ゑ
+wo		を
+
+ga		が
+gi		ぎ
+gu		ぐ
+ge		げ
+go		ご
+gya		ぎゃ
+gyi		ぎぃ
+gyu		ぎゅ
+gye		ぎぇ
+gyo		ぎょ
+gwa		ぐぁ
+gwi		ぐぃ
+gwu		ぐぅ
+gwe		ぐぇ
+gwo		ぐぉ
+
+za		ざ
+zi		じ
+zu		ず
+ze		ぜ
+zo		ぞ
+zya		じゃ
+zyi		じぃ
+zyu		じゅ
+zye		じぇ
+zyo		じょ
+ja		じゃ
+ji		じ
+ju		じゅ
+je		じぇ
+jo		じょ
+jya		じゃ
+jyi		じぃ
+jyu		じゅ
+jye		じぇ
+jyo		じょ
+
+da		だ
+di		ぢ
+du		づ
+dsu		づ
+de		で
+do		ど
+dya		ぢゃ
+dyi		ぢぃ
+dyu		ぢゅ
+dye		ぢぇ
+dyo		ぢょ
+dwa		どゎ
+dwi		どぃ
+dwu		どぅ
+dwe		どぇ
+dwo		どぉ
+dha		でゃ
+dhi		でぃ
+dhu		でゅ
+dhe		でぇ
+dho		でょ
+
+ba		ば
+bi		び
+bu		ぶ
+be		べ
+bo		ぼ
+bya		びゃ
+byi		びぃ
+byu		びゅ
+bye		びぇ
+byo		びょ
+va		ヴァ
+vi		ヴィ
+vu		ヴ			
+ve		ヴェ
+vo		ヴォ
+vya		ヴヮ
+vyi		ヴィ
+vyu		ヴゥ
+vye		ヴェ
+vyo		ヴョ
+
+wha		うゎ
+whi		うぃ
+whu		うぅ
+whe		うぇ
+who		うぉ
+
+pa		ぱ
+pi		ぴ
+pu		ぷ
+pe		ぺ
+po		ぽ
+pya		ぴゃ
+pyi		ぴぃ
+pyu		ぴゅ
+pye		ぴぇ
+pyo		ぴょ
+
+qa		くぁ
+qi		くぃ
+qu		く
+qe		くぇ
+qo		くぉ
+
+nn		ん
+n'		ん
+n		ん
+
+kk		っ		k
+ss		っ		s
+tt		っ		t
+hh		っ		h
+mm		っ		m
+yy		っ		y
+rr		っ		r
+ll		っ		l
+ww		っ		w
+gg		っ		g
+zz		っ		z
+dd		っ		d
+bb		っ		b
+pp		っ		p
+cc		っ		c
+ff		っ		f
+jj		っ		j
+vv		っ		v
+qq		っ		q
+xx		っ		x
+
+xa		ぁ
+xi		ぃ
+xu		ぅ
+xe		ぇ
+xo		ぉ
+xya		ゃ
+xyi		ぃ
+xyu		ゅ
+xye		ぇ
+xyo		ょ
+xtu		っ
+xtsu		っ
+xwa		ゎ
+xwi		ゐ
+xwe		ゑ
+xwo		を
+xka		ヵ
+xca		ヵ
+xke		ヶ
+
+
+x-		-
+-		ー
+_		ー
+x_		_
+,		、
+x,		,
+.		。
+x.		.
+x[		「
+x]		」
+x/		・
+
+A		ア
+I		イ
+U		ウ
+E		エ
+O		オ
+
+KA		カ
+KI		キ
+KU		ク
+KE		ケ
+KO		コ
+CA		カ
+CI		キ
+CU		ク
+CE		セ
+CO		コ
+KYA		キャ
+KYI		キィ
+KYU		キュ
+KYE		キェ
+KYO		キョ
+QYA		クャ
+QYI		クィ
+QYU		クュ
+QYE		クェ
+QYO		クョ
+QWA		クヮ
+QWI		クィ
+QWU		クゥ
+QWE		クェ
+QWO		クォ
+KWA		クァ
+KWI		クィ
+KWU		クゥ
+KWE		クェ
+KWO		クォ
+
+SA		サ
+SI		シ
+SU		ス
+SE		セ
+SO		ソ
+SYA		シャ
+SYI		シィ
+SYU		シュ
+SYE		シェ
+SYO		ショ
+SHA		シャ
+SHI		シ
+SHU		シュ
+SHE		シェ
+SHO		ショ
+SWI		スィ
+SWW		スェ
+
+TA		タ
+TI		チ
+TU		ツ
+TE		テ
+TO		ト
+THA		テャ
+THI		ティ
+THU		テュ
+THE		テェ
+THO		テョ
+TYA		チャ
+TYI		チィ
+TYU		チュ
+TYE		チェ
+TYO		チョ
+TSYA		チャ
+TSYI		チ
+TSYU		チュ
+TSYE		チェ
+TSYO		チョ
+CHA		チャ
+CHI		チ
+CHU		チュ
+CHE		チェ
+CHO		チョ
+CYA		チャ
+CYI		チィ
+CYU		チュ
+CYE		チェ
+CYO		チョ
+TSA		ツァ
+TSI		ツィ
+TSU		ツ
+TSE		ツェ
+TSO		ツォ
+TWA		トヮ
+TWI		トィ
+TWU		トゥ
+TWE		トェ
+TWO		トォ
+
+NA		ナ
+NI		ニ
+NU		ヌ
+NE		ネ
+NO		ノ
+NYA		ニャ
+NYI		ニィ
+NYU		ニュ
+NYE		ニェ
+NYO		ニョ
+
+HA		ハ
+HI		ヒ
+HU		フ
+HE		ヘ
+HO		ホ
+HYA		ヒャ
+HYI		ヒィ
+HYU		ヒュ
+HYE		ヒェ
+HYO		ヒョ
+HWA		フヮ
+HWI		フィ
+HWE		フェ
+HWO		フォ
+FA		ファ
+FI		フィ
+FU		フ
+FE		フェ
+FO		フォ
+FYA		フャ
+FYI		フィ
+FYU		フュ
+FYE		フェ
+FYO		フョ
+FWA		フヮ
+FWI		フィ
+FWU		フゥ
+FWE		フェ
+FWO		フォ
+
+MA		マ
+MI		ミ
+MU		ム
+ME		メ
+MO		モ
+MYA		ミャ
+MYI		ミィ
+MYU		ミュ
+MYE		ミェ
+MYO		ミョ
+
+YA		ヤ
+YI		イ
+YU		ユ
+YE		イェ
+YO		ヨ
+RA		ラ
+RI		リ
+RU		ル
+RE		レ
+RO		ロ
+LA		ラ
+LI		リ
+LU		ル
+LE		レ
+LO		ロ
+RYA		リャ
+RYI		リィ
+RYU		リュ
+RYE		リェ
+RYO		リョ
+LYA		リャ
+LYI		リィ
+LYU		リュ
+LYE		リェ
+LYO		リョ
+
+WA		ワ
+WI		ヰ
+WU		ウ
+WE		ヱ
+WO		ヲ
+
+GA		ガ
+GI		ギ
+GU		グ
+GE		ゲ
+GO		ゴ
+GYA		ギャ
+GYI		ギィ
+GYU		ギュ
+GYE		ギェ
+GYO		ギョ
+GWA		グァ
+GWI		グィ
+GWU		グゥ
+GWE		グェ
+GWO		グォ
+
+ZA		ザ
+ZI		ジ
+ZU		ズ
+ZE		ゼ
+ZO		ゾ
+ZYA		ジャ
+ZYI		ジィ
+ZYU		ジュ
+ZYE		ジェ
+ZYO		ジョ
+JA		ジャ
+JI		ジ
+JU		ジュ
+JE		ジェ
+JO		ジョ
+JYA		ジャ
+JYI		ジィ
+JYU		ジュ
+JYE		ジェ
+JYO		ジョ
+
+DA		ダ
+DI		ヂ
+DU		ヅ
+DSU		ヅ
+DE		デ
+DO		ド
+DYA		ヂャ
+DYI		ヂィ
+DYU		ヂュ
+DYE		ヂェ
+DYO		ヂョ
+DWA		ドヮ
+DWI		ドィ
+DWU		ドゥ
+DWE		ドェ
+DWO		ドォ
+DHA		デャ
+DHI		ディ
+DHU		デュ
+DHO		デョ
+
+BA		バ
+BI		ビ
+BU		ブ
+BE		ベ
+BO		ボ
+BYA		ビャ
+BYI		ビィ
+BYU		ビュ
+BYE		ビェ
+BYO		ビョ
+VA		ヴァ
+VI		ヴィ
+VU		ヴ
+VE		ヴェ
+VO		ヴォ
+VYA		ヴヮ
+VYI		ヴィ
+VYU		ヴゥ
+VYE		ヴェ
+VYO		ヴョ
+
+WHA		ウヮ
+WHI		ウィ
+WHU		ウゥ
+WHE		ウェ
+WHO		ウォ
+
+PA		パ
+PI		ピ
+PU		プ
+PE		ペ
+PO		ポ
+PYA		ピャ
+PYI		ピィ
+PYU		ピュ
+PYE		ピェ
+PYO		ピョ
+
+QA		クァ
+QI		クィ
+QU		ク
+QE		クェ
+QO		クォ
+
+N		ン
+NN		ン
+
+KK		ッ		K
+SS		ッ		S
+TT		ッ		T
+HH		ッ		H
+MM		ッ		M
+YY		ッ		Y
+RR		ッ		R
+LL		ッ		L
+WW		ッ		W
+GG		ッ		G
+ZZ		ッ		Z
+DD		ッ		D
+BB		ッ		B
+PP		ッ		P
+CC		ッ		C
+FF		ッ		F
+JJ		ッ		J
+VV		ッ		V
+QQ		ッ		Q
+XX		ッ		X
+
+XA		ァ
+XI		ィ
+XU		ゥ
+XE		ェ
+XO		ォ
+XYA		ャ
+XYI		ィ
+XYU		ュ
+XYE		ェ
+XYO		ョ
+XTU		ッ
+XTSU		ッ
+XWA		ヮ
+XWI		ヰ
+XWE		ヱ
+XWO		ヲ
+XKA		ヵ
+XCA		ヵ
+XKE		ヶ
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sj3def/sjrk.iroha.EUC	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,348 @@
+#
+# $Id: sjrk.iroha.EUC,v 2.0 1992/02/13 21:00:37 nao Exp $
+#
+#	ローマ字かな変換規則定義ファイル(Iroha エミュレート用)
+#
+#	(区切りは space か htab)
+#[in_romaji]	[out_kana]	[out_romaji]
+0		0
+1		1
+2		2
+3		3
+4		4
+5		5
+6		6
+7		7
+8		8
+9		9
+
+a		あ
+i		い
+u		う
+e		え
+o		お
+
+ka		か
+ki		き
+ku		く
+ke		け
+ko		こ
+ca		か
+cu		く
+co		こ
+kya		きゃ
+kyi		きぃ
+kyu		きゅ
+kye		きぇ
+kyo		きょ
+qwa		くゎ
+qwi		くぃ
+qwu		くぅ
+qwe		くぇ
+qwo		くぉ
+
+sa		さ
+si		し
+su		す
+se		せ
+so		そ
+sya		しゃ
+syi		しぃ
+syu		しゅ
+sye		しぇ
+syo		しょ
+sha		しゃ
+shi		し
+shu		しゅ
+she		しぇ
+sho		しょ
+
+ta		た
+ti		ち
+tu		つ
+te		て
+to		と
+tha		てゃ
+thi		てぃ
+thu		てゅ
+the		てぇ
+tho		てょ
+tya		ちゃ
+tyi		ちぃ
+tyu		ちゅ
+tye		ちぇ
+tyo		ちょ
+tsya		ちゃ
+tsyi		ち
+tsyu		ちゅ
+tsye		ちぇ
+tsyo		ちょ
+cha		ちゃ
+chi		ち
+chu		ちゅ
+che		ちぇ
+cho		ちょ
+cya		ちゃ
+cyi		ちぃ
+cyu		ちゅ
+cye		ちぇ
+cyo		ちょ
+tsa		つぁ
+tsi		つぃ
+tsu		つ
+tse		つぇ
+tso		つぉ
+
+na		な
+ni		に
+nu		ぬ
+ne		ね
+no		の
+nya		にゃ
+nyi		にぃ
+nyu		にゅ
+nye		にぇ
+nyo		にょ
+
+ha		は
+hi		ひ
+hu		ふ
+he		へ
+ho		ほ
+hya		ひゃ
+hyi		ひぃ
+hyu		ひゅ
+hye		ひぇ
+hyo		ひょ
+fa		ふぁ
+fi		ふぃ
+fu		ふ
+fe		ふぇ
+fo		ふぉ
+fya		ふゃ
+fyi		ふぃ
+fyu		ふゅ
+fye		ふぇ
+fyo		ふょ
+fwa		ふゎ
+fwi		ふぃ
+fwu		ふぅ
+fwe		ふぇ
+fwo		ふぉ
+
+ma		ま
+mi		み
+mu		む
+me		め
+mo		も
+mya		みゃ
+myi		みぃ
+myu		みゅ
+mye		みぇ
+myo		みょ
+
+ya		や
+yi		い
+yu		ゆ
+ye		いぇ
+yo		よ
+ra		ら
+ri		り
+ru		る
+re		れ
+ro		ろ
+la		ら
+li		り
+lu		る
+le		れ
+lo		ろ
+rya		りゃ
+ryi		りぃ
+ryu		りゅ
+rye		りぇ
+ryo		りょ
+lya		りゃ
+lyi		りぃ
+lyu		りゅ
+lye		りぇ
+lyo		りょ
+
+wa		わ
+wi		ゐ
+wu		う
+we		ゑ
+wo		を
+
+ga		が
+gi		ぎ
+gu		ぐ
+ge		げ
+go		ご
+gya		ぎゃ
+gyi		ぎぃ
+gyu		ぎゅ
+gye		ぎぇ
+gyo		ぎょ
+gwa		ぐぁ
+gwi		ぐぃ
+gwu		ぐぅ
+gwe		ぐぇ
+gwo		ぐぉ
+
+za		ざ
+zi		じ
+zu		ず
+ze		ぜ
+zo		ぞ
+zya		じゃ
+zyi		じぃ
+zyu		じゅ
+zye		じぇ
+zyo		じょ
+ja		じゃ
+ji		じ
+ju		じゅ
+je		じぇ
+jo		じょ
+jya		じゃ
+jyi		じぃ
+jyu		じゅ
+jye		じぇ
+jyo		じょ
+
+da		だ
+di		ぢ
+du		づ
+de		で
+do		ど
+dya		ぢゃ
+dyi		ぢぃ
+dyu		ぢゅ
+dye		ぢぇ
+dyo		ぢょ
+dha		でゃ
+dhi		でぃ
+dhu		でゅ
+dhe		でぇ
+dho		でょ
+
+ba		ば
+bi		び
+bu		ぶ
+be		べ
+bo		ぼ
+bya		びゃ
+byi		びぃ
+byu		びゅ
+bye		びぇ
+byo		びょ
+va		う゛ぁ
+vi		う゛ぃ
+vu		う゛
+ve		う゛ぇ
+vo		う゛ぉ
+
+pa		ぱ
+pi		ぴ
+pu		ぷ
+pe		ぺ
+po		ぽ
+pya		ぴゃ
+pyi		ぴぃ
+pyu		ぴゅ
+pye		ぴぇ
+pyo		ぴょ
+
+qa		くぁ
+qi		くぃ
+qu		く
+qe		くぇ
+qo		くぉ
+
+nn		ん		n
+n		ん
+n'		ん
+mn		ん
+
+kk		っ		k
+ss		っ		s
+tt		っ		t
+hh		っ		h
+mm		っ		m
+yy		っ		y
+rr		っ		r
+ll		っ		l
+ww		っ		w
+gg		っ		g
+zz		っ		z
+dd		っ		d
+bb		っ		b
+pp		っ		p
+cc		っ		c
+ff		っ		f
+jj		っ		j
+vv		っ		v
+qq		っ		q
+xx		っ		x
+
+xa		ぁ
+xi		ぃ
+xu		ぅ
+xe		ぇ
+xo		ぉ
+xtu		っ
+xtsu		っ
+xwa		ゎ
+xya		ゃ
+xyu		ゅ
+xyo		ょ
+
+@-		−
+-		ー
+,		、
+.		。
+[		「
+]		」
+(		(
+)		)
+{		『
+}		』
+^		^
+<		<
+>		>
+@@		 
+@/		・
+@\\		\
+@		@
+@,		,
+@.		.
+@~		〜
+@||		‖
+@|		|
+@3		…
+@2		‥
+@(		(
+@)		)
+@[		[
+@]		]
+@{		{
+@}		}
+~		 ̄
+?		?
+!		!
+\#		#
+$		$
+"		”
+%		%
+&		&
+'		’
+`		`
++		+
+*		*
+=		=
+|		|
+;		;
+:		:
+_		_
+/		/
+\\		¥
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sj3def/sjrk.sjx.EUC	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,582 @@
+#
+# $Id: sjrk.sjx.EUC,v 2.0 1992/02/13 21:00:39 nao Exp $
+#
+#	ローマ字かな変換規則定義ファイル(sjx エミュレート用)
+#
+#	(区切りは space か htab)
+#[in_romaji]	[out_kana]	[out_romaji]
+a		あ
+i		い
+u		う
+e		え
+o		お
+
+ka		か
+ki		き
+ku		く
+ke		け
+ko		こ
+ca		か
+ci		き
+cu		く
+ce		け
+co		こ
+kya		きゃ
+kyi		き
+kyu		きゅ
+kye		きぇ
+kyo		きょ
+qya		きゃ
+qyi		き
+qyu		きゅ
+qye		きぇ
+qyo		きょ
+
+sa		さ
+si		し
+su		す
+se		せ
+so		そ
+sya		しゃ
+syi		し
+syu		しゅ
+sye		しぇ
+syo		しょ
+sha		しゃ
+shi		し
+shu		しゅ
+she		しぇ
+sho		しょ
+
+ta		た
+ti		ち
+tu		つ
+te		て
+to		と
+tsa		た
+tsi		ち
+tsu		つ
+tse		て
+tso		と
+tha		たぁ
+thi		てぃ
+thu		とぅ
+tya		ちゃ
+tyi		ち
+tyu		ちゅ
+tye		ちぇ
+tyo		ちょ
+tsya		ちゃ
+tsyi		ち
+tsyu		ちゅ
+tsye		ちぇ
+tsyo		ちょ
+cha		ちゃ
+chi		ち
+chu		ちゅ
+che		ちぇ
+cho		ちょ
+cya		ちゃ
+cyi		ち
+cyu		ちゅ
+cye		ちぇ
+cyo		ちょ
+
+na		な
+ni		に
+nu		ぬ
+ne		ね
+no		の
+nya		にゃ
+nyi		に
+nyu		にゅ
+nye		にぇ
+nyo		にょ
+
+ha		は
+hi		ひ
+hu		ふ
+he		へ
+ho		ほ
+hya		ひゃ
+hyi		ひ
+hyu		ひゅ
+hye		ひぇ
+hyo		ひょ
+fa		ふぁ
+fi		ふぃ
+fu		ふ
+fe		ふぇ
+fo		ふぉ
+fya		ふゃ
+fyi		ふぃ
+fyu		ふゅ
+fye		ふぇ
+fyo		ふょ
+
+ma		ま
+mi		み
+mu		む
+me		め
+mo		も
+mya		みゃ
+myi		み
+myu		みゅ
+mye		みぇ
+myo		みょ
+
+ya		や
+yi		い
+yu		ゆ
+ye		いぇ
+yo		よ
+ra		ら
+ri		り
+ru		る
+re		れ
+ro		ろ
+la		ら
+li		り
+lu		る
+le		れ
+lo		ろ
+rya		りゃ
+ryi		り
+ryu		りゅ
+rye		りぇ
+ryo		りょ
+lya		りゃ
+lyi		り
+lyu		りゅ
+lye		りぇ
+lyo		りょ
+
+wa		わ
+wi		うぃ
+wu		う
+we		うぇ
+wo		を
+
+ga		が
+gi		ぎ
+gu		ぐ
+ge		げ
+go		ご
+gya		ぎゃ
+gyi		ぎ
+gyu		ぎゅ
+gye		ぎぇ
+gyo		ぎょ
+
+za		ざ
+zi		じ
+zu		ず
+ze		ぜ
+zo		ぞ
+zya		じゃ
+zyi		じ
+zyu		じゅ
+zye		じぇ
+zyo		じょ
+ja		じゃ
+ji		じ
+ju		じゅ
+je		じぇ
+jo		じょ
+jya		じゃ
+jyi		じ
+jyu		じゅ
+jye		じぇ
+jyo		じょ
+
+da		だ
+di		ぢ
+du		づ
+de		で
+do		ど
+dya		ぢゃ
+dyi		ぢ
+dyu		ぢゅ
+dye		ぢぇ
+dyo		ぢょ
+dha		だぁ
+dhi		でぃ
+dhu		どぅ
+dhyu		でゅ
+
+ba		ば
+bi		び
+bu		ぶ
+be		べ
+bo		ぼ
+bya		びゃ
+byi		び
+byu		びゅ
+bye		びぇ
+byo		びょ
+va		ヴぁ
+vi		ヴぃ
+vu		ヴ			
+ve		ヴぇ
+vo		ヴぉ
+vya		びゃ
+vyi		び
+vyu		びゅ
+vye		びぇ
+vyo		びょ
+
+pa		ぱ
+pi		ぴ
+pu		ぷ
+pe		ぺ
+po		ぽ
+pya		ぴゃ
+pyi		ぴ
+pyu		ぴゅ
+pye		ぴぇ
+pyo		ぴょ
+
+qa		くぁ
+qi		くぃ
+qu		くぅ
+qe		くぇ
+qo		くぉ
+
+nn		ん
+n		ん
+#mb		ん		b
+#mm		ん		m
+#mp		ん		p
+
+kk		っ		k
+ss		っ		s
+tt		っ		t
+hh		っ		h
+mm		っ		m
+yy		っ		y
+rr		っ		r
+ll		っ		l
+ww		っ		w
+gg		っ		g
+zz		っ		z
+dd		っ		d
+bb		っ		b
+pp		っ		p
+cc		っ		c
+ff		っ		f
+jj		っ		j
+vv		っ		v
+qq		っ		q
+xx		っ		x
+#tch		っ		ch
+
+xa		ぁ
+xi		ぃ
+xu		ぅ
+xe		ぇ
+xo		ぉ
+xya		ゃ
+xyi		ぃ
+xyu		ゅ
+xye		ぇ
+xyo		ょ
+xtu		っ
+xtsu		っ
+xwa		ゎ
+xka		ヵ
+xke		ヶ
+
+x,		゛
+x.		゜
+~		〜
+
+-		ー
+,		、
+.		。
+#@		・
+#x@		@
+#[		「
+#]		」
+#Z.		…
+#SONY		ソニー
+
+A		あ
+I		い
+U		う
+E		え
+O		お
+
+KA		か
+KI		き
+KU		く
+KE		け
+KO		こ
+CA		か
+CI		き
+CU		く
+CE		け
+CO		こ
+KYA		きゃ
+KYI		き
+KYU		きゅ
+KYE		きぇ
+KYO		きょ
+QYA		きゃ
+QYI		き
+QYU		きゅ
+QYE		きぇ
+QYO		きょ
+
+SA		さ
+SI		し
+SU		す
+SE		せ
+SO		そ
+SYA		しゃ
+SYI		し
+SYU		しゅ
+SYE		しぇ
+SYO		しょ
+SHA		しゃ
+SHI		し
+SHU		しゅ
+SHE		しぇ
+SHO		しょ
+
+TA		た
+TI		ち
+TU		つ
+TE		て
+TO		と
+TSA		た
+TSI		ち
+TSU		つ
+TSE		て
+TSO		と
+THA		たぁ
+THI		てぃ
+THU		とぅ
+TYA		ちゃ
+TYI		ち
+TYU		ちゅ
+TYE		ちぇ
+TYO		ちょ
+TSYA		ちゃ
+TSYI		ち
+TSYU		ちゅ
+TSYE		ちぇ
+TSYO		ちょ
+CHA		ちゃ
+CHI		ち
+CHU		ちゅ
+CHE		ちぇ
+CHO		ちょ
+CYA		ちゃ
+CYI		ち
+CYU		ちゅ
+CYE		ちぇ
+CYO		ちょ
+
+NA		な
+NI		に
+NU		ぬ
+NE		ね
+NO		の
+NYA		にゃ
+NYI		に
+NYU		にゅ
+NYE		にぇ
+NYO		にょ
+
+HA		は
+HI		ひ
+HU		ふ
+HE		へ
+HO		ほ
+HYA		ひゃ
+HYI		ひ
+HYU		ひゅ
+HYE		ひぇ
+HYO		ひょ
+FA		ふぁ
+FI		ふぃ
+FU		ふ
+FE		ふぇ
+FO		ふぉ
+FYA		ふゃ
+FYI		ふぃ
+FYU		ふゅ
+FYE		ふぇ
+FYO		ふょ
+
+MA		ま
+MI		み
+MU		む
+ME		め
+MO		も
+MYA		みゃ
+MYI		み
+MYU		みゅ
+MYE		みぇ
+MYO		みょ
+
+YA		や
+YI		い
+YU		ゆ
+YE		いぇ
+YO		よ
+RA		ら
+RI		り
+RU		る
+RE		れ
+RO		ろ
+LA		ら
+LI		り
+LU		る
+LE		れ
+LO		ろ
+RYA		りゃ
+RYI		り
+RYU		りゅ
+RYE		りぇ
+RYO		りょ
+LYA		りゃ
+LYI		り
+LYU		りゅ
+LYE		りぇ
+LYO		りょ
+
+WA		わ
+WI		ゐ
+WU		う
+WE		ゑ
+WO		を
+
+GA		が
+GI		ぎ
+GU		ぐ
+GE		げ
+GO		ご
+GYA		ぎゃ
+GYI		ぎ
+GYU		ぎゅ
+GYE		ぎぇ
+GYO		ぎょ
+
+ZA		ざ
+ZI		じ
+ZU		ず
+ZE		ぜ
+ZO		ぞ
+ZYA		じゃ
+ZYI		じ
+ZYU		じゅ
+ZYE		じぇ
+ZYO		じょ
+JA		じゃ
+JI		じ
+JU		じゅ
+JE		じぇ
+JO		じょ
+JYA		じゃ
+JYI		じ
+JYU		じゅ
+JYE		じぇ
+JYO		じょ
+
+DA		だ
+DI		ぢ
+DU		づ
+DE		で
+DO		ど
+DYA		ぢゃ
+DYI		ぢ
+DYU		ぢゅ
+DYE		ぢぇ
+DYO		ぢょ
+DHA		だぁ
+DHI		でぃ
+DHU		どぅ
+DHYU		でゅ
+
+BA		ば
+BI		び
+BU		ぶ
+BE		べ
+BO		ぼ
+BYA		びゃ
+BYI		び
+BYU		びゅ
+BYE		びぇ
+BYO		びょ
+VA		ぶぁ
+VI		ぶぃ
+VU		ぶ
+VE		ぶぇ
+VO		ぶぉ
+VYA		びゃ
+VYI		び
+VYU		びゅ
+VYE		びぇ
+VYO		びょ
+
+PA		ぱ
+PI		ぴ
+PU		ぷ
+PE		ぺ
+PO		ぽ
+PYA		ぴゃ
+PYI		ぴ
+PYU		ぴゅ
+PYE		ぴぇ
+PYO		ぴょ
+
+QA		くぁ
+QI		くぃ
+QU		くぅ
+QE		くぇ
+QO		くぉ
+
+N		ん
+NN		ん
+#MB		ん		B
+#MM		ん		M
+#MP		ん		P
+
+KK		っ		K
+SS		っ		S
+TT		っ		T
+HH		っ		H
+MM		っ		M
+YY		っ		Y
+RR		っ		R
+LL		っ		L
+WW		っ		W
+GG		っ		G
+ZZ		っ		Z
+DD		っ		D
+BB		っ		B
+PP		っ		P
+CC		っ		C
+FF		っ		F
+JJ		っ		J
+VV		っ		V
+QQ		っ		Q
+XX		っ		X
+#TCH		っ		CH
+
+XA		ぁ
+XI		ぃ
+XU		ぅ
+XE		ぇ
+XO		ぉ
+XYA		ゃ
+XYI		ぃ
+XYU		ゅ
+XYE		ぇ
+XYO		ょ
+XTU		っ
+XTSU		っ
+XWA		ゎ
+XKA		ヵ
+XKE		ヶ
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sj3def/sjsb.EUC	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,299 @@
+#
+# $Id: sjsb.EUC,v 2.0 1992/02/13 21:00:41 nao Exp $
+#
+#	記号選択用記号一覧ファイル
+#
+#[data]
+ 
+、
+。
+,
+.
+・
+:
+;
+?
+!
+゛
+゜

+`

+^
+ ̄
+_
+ヽ
+ヾ
+ゝ
+ゞ
+〃
+仝
+々
+〆
+〇
+ー
+―
+‐
+/
+\
+〜
+‖
+|
+…
+‥
+‘
+’
+“
+”
+(
+)
+〔
+〕
+[
+]
+{
+}
+〈
+〉
+《
+》
+「
+」
+『
+』
+【
+】
++
+−



+=
+≠
+<
+>
+≦
+≧
+∞
+∴
+♂
+♀

+′
+″
+℃
+¥
+$


+%
+#
+&
+*
+@

+☆
+★
+○
+●
+◎
+◇
+◆
+□
+■
+△
+▲
+▽
+▼
+※
+〒
+→
+←
+↑
+↓
+〓
+∈
+∋
+⊆
+⊇
+⊂
+⊃
+∪
+∩
+∧
+∨

+⇒
+⇔
+∀
+∃
+∠
+⊥
+⌒
+∂
+∇
+≡
+≒
+≪
+≫
+√
+∽
+∝
+∵
+∫
+∬
+Å
+‰
+♯
+♭
+♪
+†
+‡

+◯






































+ο


























































+п
















+─
+│
+┌
+┐
+┘
+└
+├
+┬
+┤
+┴
+┼
+━
+┃
+┏
+┓
+┛
+┗
+┣
+┳
+┫
+┻
+╋
+┠
+┯
+┨
+┷
+┿
+┝
+┰
+┥
+┸
+╂
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sj3def/sjzh.EUC	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,106 @@
+#
+# $Id: sjzh.EUC,v 2.0 1992/02/13 21:00:43 nao Exp $
+#
+#	全角/半角変換規則定義ファイル
+#
+#	(区切りは space か htab)
+#[halpha]	[zalpha]	[zkana]		[hkana]
+\ 		 		 		\ 
+!		!		!		!
+"		”		”		"
+\#		#		#		\#
+$		$		$		$
+%		%		%		%
+&		&		&		&
+'		’		’		'
+(		(		(		(
+)		)		)		)
+*		*		*		*
++		+		+		+
+,		,		、		、
+-		−		ー		ー
+#-		−		−		-
+.		.		。		。
+#.		.		.		.
+/		/		/		/
+0		0		0		0
+1		1		1		1
+2		2		2		2
+3		3		3		3
+4		4		4		4
+5		5		5		5
+6		6		6		6
+7		7		7		7
+8		8		8		8
+9		9		9		9
+:		:		:		:
+;		;		;		;
+<		<		<		<
+=		=		=		=
+>		>		>		>
+?		?		?		?
+@		@		・		・
+A		A		A		A
+B		B		B		B
+C		C		C		C
+D		D		D		D
+E		E		E		E
+F		F		F		F
+G		G		G		G
+H		H		H		H
+I		I		I		I
+J		J		J		J
+K		K		K		K
+L		L		L		L
+M		M		M		M
+N		N		N		N
+O		O		O		O
+P		P		P		P
+Q		Q		Q		Q
+R		R		R		R
+S		S		S		S
+T		T		T		T
+U		U		U		U
+V		V		V		V
+W		W		W		W
+X		X		X		X
+Y		Y		Y		Y
+Z		Z		Z		Z
+[		[		「		「
+\\		\		¥		\\
+]		]		」		」
+^		^		^		^
+_		_		_		_
+`		‘		‘		`
+a		a		a		a
+b		b		b		b
+c		c		c		c
+d		d		d		d
+e		e		e		e
+f		f		f		f
+g		g		g		g
+h		h		h		h
+i		i		i		i
+j		j		j		j
+k		k		k		k
+l		l		l		l
+m		m		m		m
+n		n		n		n
+o		o		o		o
+p		p		p		p
+q		q		q		q
+r		r		r		r
+s		s		s		s
+t		t		t		t
+u		u		u		u
+v		v		v		v
+w		w		w		w
+x		x		x		x
+y		y		y		y
+z		z		z		z
+{		{		{		{
+|		|		|		|
+}		}		}		}
+~		〜		〜		~
+゙		゛		゛		゙
+゚		゜		゜		゚