% Copyright 1994 NEC Corporation, Tokyo, Japan.
%
% 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 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. 
%
% $Id: proto12.tex,v 1.16 1994/01/27 11:09:17 kuma Exp $

\documentstyle[canna]{jarticle}

\def\reqeini{Type 0}
\def\reqefin{Type E1}
\def\reqedupcx{Type E2}
\def\reqediclis{Type E3}
\def\reqegety{Type E4}
\def\reqegetl{Type E5}
\def\reqestoy{Type E6}
\def\reqeendc{Type E7}
\def\reqenone{Type E8}
\def\reqemndic{Type E9}
\def\reqedefw{Type E10}
\def\reqerndic{Type E11}
\def\reqequery{Type E12}

\def\repeini{Type 0}
\def\repefin{Type E1}
\def\repediclis{Type E2}
\def\repegsta{Type E3}
\def\repegwdic{Type E4}
\def\repesrviN{Type E5}
\def\repesrvi{Type E6}
\def\repehost{Type E7}

\def\reqeInitialize{\reqeini}
\def\reqeFinalize{\reqefin}
\def\reqeCreateContext{\reqefin}
\def\reqeDuplicateContext{\reqedupcx}
\def\reqeCloseContext{\reqedupcx}
\def\reqeDictionaryList{\reqediclis}
\def\reqeGetYomi{\reqegety}
\def\reqeDefineDic{\reqedefw}
\def\reqeDeleteDic{\reqedefw}
\def\reqeGetDirList{\reqediclis}
\def\reqeMountDictionary{\reqemndic}
\def\reqeUmountDictionary{\reqemndic}
\def\reqeRemountDictionary{\reqestoy}
\def\reqeMountList{\reqediclis}
\def\reqeConvert{\reqemndic}
\def\reqeConvertEnd{\reqeendc}
\def\reqeGetKanjiList{\reqegety}
\def\reqeResize{\reqegety}
\def\reqeStoreYomi{\reqestoy}
\def\reqeGetLex{\reqegetl}
\def\reqeGetStat{\reqegety}
\def\reqeServerInfo{\reqefin}
\def\reqeServerInfoN{\reqefin}
\def\reqeHosts{\reqefin}
\def\reqeQueryExt{\reqequery}
\def\reqeCreateDic{\reqemndic}
\def\reqeDestroyDic{\reqemndic}
\def\reqeRenameDic{\reqerndic}
\def\reqeGetWordTextDic{\reqerndic}
\def\reqelsDic{\reqestoy}

\def\repeInitialize{\repeini}
\def\repeFinalize{\repefin}
\def\repeCreateContext{\repefin}
\def\repeDuplicateContext{\repefin}
\def\repeCloseContext{\repefin}
\def\repeDictionaryList{\repediclis}
\def\repeGetYomi{\repediclis}
\def\repeDefineDic{\repefin}
\def\repeDeleteDic{\repefin}
\def\repeGetDirList{\repediclis}
\def\repeMountDictionary{\repefin}
\def\repeUmountDictionary{\repefin}
\def\repeRemountDictionary{\repefin}
\def\repeMountList{\repediclis}
\def\repeConvert{\repediclis}
\def\repeConvertEnd{\repefin}
\def\repeGetKanjiList{\repediclis}
\def\repeResize{\repediclis}
\def\repeStoreYomi{\repediclis}
\def\repeGetLex{\repegsta}
\def\repeGetStat{\repegsta}
\def\repeServerInfo{\repesrvi}
\def\repeServerInfoN{\repesrviN}
\def\repeHosts{\repehost}
\def\repeCreateDic{\repefin}
\def\repeDestroyDic{\repefin}
\def\repeRenameDic{\repefin}
\def\repeGetWordTextDic{\repegwdic}
\def\repelsDic{\repediclis}
\def\repeQueryExt{\repefin}

\begin{document}

\thispagestyle{empty}

\renewcommand{\thepage}{\roman{page}}
\vspace*{\fill}
\begin{center}
\LARGE\dg\bf
日本語入力システム

『かんな』

\vspace{1cm}

かな漢字変換プロトコル仕様書

プロトコルバージョン1.2
\end{center}
\vfill
\begin{center}

1993年10月19日

舩橋~~~~~一司

funahasi@oa2.kb.nec.co.jp

神戸日本電気ソフトウェア

\end{center}
\vfill
\newpage

\newpage
\large
\tableofcontents
\normalsize
\newpage
\setcounter{page}{1}
\renewcommand{\thepage}{\arabic{page}}
\setcounter{section}{0}
%
%
\addcontentsline{toc}{section}{はじめに}
\section*{はじめに}
この仕様書は、クライアントプロセスとサーバプロセスのインタフェースとなるプロトコルの仕様を
定義するものである．
\section{パケットの種類}
かな漢字変換サーバは、クライアントからパケットを受け取り、
そのパケットに示された処理を行い、
その結果を再びパケットに組み立ててクライアントに送り返す。
パケットには以下の2種類がある。
\begin{itemize}
    \item 要求パケット
    \begin{itemize}
	\item クライアントのリクエストを送るパケット。
    \end{itemize}
    \item 応答パケット
    \begin{itemize}
	\item リクエストのあったクライアントにサーバの応答を送るパケット。
    \end{itemize}
\end{itemize}
\newpage

\subsection{プロトコルのタイプ分け}

各プロトコルに関して，リクエストとリプライそれぞれ，12，8 の
タイプに分けることができる．リクエストの12のタイプおよびリプライの 8
のタイプを以下に示す．

\begin{tabular}{|l|l|l l l l l l l|} \hline
\multicolumn{9}{|c|}{リクエスト} \\ \hline
\multicolumn{1}{|c|}{要求型} &
\multicolumn{1}{c|}{例} &
\multicolumn{7}{c|}{リクエストフィールド} \\ \hline
\reqeini & IR\_INIT & I32 & I32 & S8 &&&& \\
\reqefin & IR\_FIN  & C32 &&&&&& \\
\reqedupcx & IR\_DUP\_CON & C32 & C32 &&&&& \\
\reqediclis & IR\_DIC\_LIST & C32 & C32 & C32 &&&& \\
\reqegety & IR\_GET\_YOMI & C32 & C32 & C32 & C32 &&& \\
\reqegetl & IR\_GET\_LEX  & C32 & C32 & C32 & C32 & C32 && \\
\reqestoy & IR\_STO\_YOMI & C32 & C32 & C32 & C32 & S8 && \\
\reqeendc & IR\_CONV\_END & C32 & C32 & C32 &
\multicolumn{4}{l|}{LIST of C32} \\
\reqenone & 未使用 &&&&&&& \\
\reqemndic & IR\_MNT\_DIC & C32 & C32 & C32 & S8 & C32 && \\
\reqedefw & IR\_DEF\_DIC & C32 & C32 & C32 & S8 & C32 & S8 &\\
\reqerndic & IR\_RENAME\_DIC & C32 & C32 & C32 & S8 & C32 & S8 & C32\\
\reqequery & IR\_QUREY\_EXT & C32 & C32 & S8 & C32 &&& \\
\hline \hline
\multicolumn{9}{|c|}{リプライ} \\ \hline
\multicolumn{1}{|c|}{返答型} &
\multicolumn{1}{c|}{例} &
\multicolumn{7}{c|}{リプライフィールド} \\ \hline
\repeini & IR\_INIT & I32 & or & C16 & I16 &&& \\
\repefin & IR\_FIN & I32 &&&&&& \\
\repediclis & IR\_DIC\_LIST & I32 & C32 & 
\multicolumn{5}{l|}{LIST of (C32 + S8)} \\
\repegsta & IR\_GET\_STA & I32 & C32 &
\multicolumn{5}{l|}{LIST of I32} \\
\repegwdic & IR\_GET\_WORD\_DIC & I32 & C32 & C32 & S8 &&& \\
\repesrviN & IR\_SER\_STAT2 & C32 & S8 & C32 & C32 & C32 &
S8 & \ldots \\
\repesrvi & IR\_SER\_STAT & C32 & S8 & C32 & 
\multicolumn{4}{l|}{LIST of C32 \ldots} \\
\repehost & IR\_HOST & C32 & C32 & \multicolumn{5}{l|}{LIST of (C32 S8
C32 LIST of (C32 S8))} \\
\hline
\end{tabular}

\section{かな漢字変換サーバプロトコル仕様}
クライアントがサーバに発する要求パケットは以下の通りである。 \\
\begin{tabular}[t]{|c|c|c|c|c|}
    \hline
    要求名 & 機能 & 要求番号 & 要求型 & 返答型 \\ 
    \hline
    \hline
    IR\_INIT	   & 初期化処理 	& 0x01
& \reqeInitialize & \repeInitialize \\

    IR\_FIN	   & 終了処理		& 0x02
& \reqeFinalize & \repeFinalize \\

    IR\_CRE\_CON   & コンテクスト作成	& 0x03
& \reqeCreateContext & \repeCreateContext \\

    IR\_DUP\_CON   & コンテクスト複写	& 0x04
& \reqeDuplicateContext & \repeDuplicateContext \\

    IR\_CLO\_CON   & コンテクスト削除	& 0x05
& \reqeCloseContext & \repeCloseContext \\

    IR\_DIC\_LIST  & 登録辞書一覧	& 0x06
& \reqeDictionaryList & \repeDictionaryList \\

    IR\_GET\_YOMI  & 読みがな取得	& 0x07
& \reqeGetYomi & \repeGetYomi \\

    IR\_DEF\_DIC   & 単語登録		& 0x08
& \reqeDefineDic & \repeDefineDic \\

    IR\_UNDEF\_DIC & 単語削除		& 0x09
& \reqeDeleteDic & \repeDeleteDic \\

    IR\_DIC\_PATH  & 未使用		& 0x0a &&\\
    IR\_DIR\_LIST  & 辞書リスト一覧	& 0x0b
& \reqeGetDirList & \repeGetDirList \\

    IR\_MNT\_DIC   & 辞書追加		& 0x0c
& \reqeMountDictionary & \repeMountDictionary \\

    IR\_UMNT\_DIC  & 辞書削除		& 0x0d
& \reqeUmountDictionary & \repeUmountDictionary \\

    IR\_RMNT\_DIC  & 辞書変更		& 0x0e
& \reqeRemountDictionary & \repeRemountDictionary \\

    IR\_MNT\_LIST  & マウント辞書一覧	& 0x0f
& \reqeMountList & \repeMountList \\

    IR\_CONVERT    & 変換		& 0x10
& \reqeConvert & \repeConvert \\

    IR\_CONV\_END  & 変換終了		& 0x11
& \reqeConvertEnd & \repeConvertEnd \\

    IR\_KAN\_LST   & 候補一覧		& 0x12
& \reqeGetKanjiList & \repeGetKanjiList \\

    IR\_RESIZE	   & 区切り変更 	& 0x13
& \reqeResize & \repeResize \\

    IR\_STO\_YOMI  & 読みがな変更	& 0x14
& \reqeStoreYomi & \repeStoreYomi \\

    IR\_GET\_LEX   & 形態素情報 	& 0x15
& \reqeGetLex & \repeGetLex \\

    IR\_GET\_STA   & 解析情報		& 0x16
& \reqeGetStat & \repeGetStat \\

    IR\_SER\_STAT  & サーバ情報取得	& 0x17
& \reqeServerInfo & \repeServerInfo \\

    IR\_SER\_STAT2 & サーバ情報取得	& 0x18
& \reqeServerInfoN & \repeServerInfoN \\

    IR\_HOST	     & サーバ使用許可	& 0x19
& \reqeHosts & \repeHosts \\
    IR\_QUREY\_EXT	& 拡張プロトコル問い合わせ	& 0x1a
& \reqeQueryExt & \repeQueryExt \\
    \hline
    IR\_LIST\_DIC	 & 辞書テーブル一覧 & 0x10000
& \reqelsDic & \repelsDic \\
    IR\_CREAT\_DIC 	 & 辞書作成	    & 0x10001
& \reqeCreateDic & \repeCreateDic \\
    IR\_DEST\_DIC	 & 辞書削除	    & 0x10002
& \reqeDestroyDic & \repeDestroyDic \\
    IR\_RENAME\_DIC 	 & 辞書名変更	    & 0x10003
& \reqeRenameDic & \repeRenameDic \\
    IR\_GET\_WORD\_DIC & 単語情報取得     & 0x10004
& \reqeGetWordTextDic & \repeGetWordTextDic \\
    \hline
\end{tabular}
%
\newpage
%
\subsection{初期化処理}
かな漢字変換の環境を設定する。
\begin{verbatim}
int
rkc_initialize( username )
char *username ;
\end{verbatim}
\begin{enumerate}
    \item 引き数 \\
	\begin{tabular}[t]{c l}
	 {\it username} & プロトコルバージョンと利用者名を通知するために用いる文字列 \\
	\end{tabular}
    \item 説明 \\
	かな漢字変換処理の開始のためにサーバ内に環境を設定する。
	この関数を実行するとサーバ側は、{\it username}で表された
	プロトコルバージョンを調べ、{\it username}であらわされた
	利用者用の辞書のアクセスパスなどの設定を行う。
    \item 返却値 \\
	\begin{tabular}[t]{c l}
	    正常： & 0 \\
	    異常： & $-$1 \\
	\end{tabular}
    \item パケット
	\begin{itemize}
	    \item 要求パケット(\reqeInitialize) \\
		\begin{tabular}[t]{|c|c|c|}
		    \hline
		    フィールド & データ長 & 備考 \\
		    \hline
		    \hline
		    IR\_INIT & 4 & \\
		    データ長 & 4 & \\
		    データ & 可変長 & \\
		    \hline
		\end{tabular}
	    \item 応答パケット(\repeInitialize) \\
		\begin{tabular}[t]{|c|c|c|}
		    \hline
		    フィールド & データ長 & 備考 \\
		    \hline
		    \hline
		    終了状態 & 4 & 正常終了時0/エラー終了時$-$1 \\
		    \hline
		\end{tabular}
	\end{itemize}
    \item 注意 \\
	この関数を実行する前に、必ずrkc\_Connect\_Iroha\_Server()で
	サーバに接続していなければならない。
\end{enumerate}
%
\newpage
%
\subsection{終了処理}
かな漢字変換処理を終了させ、サーバ内の環境を解放する。
\begin{verbatim}
int
rkc_finalize()
\end{verbatim}
\begin{enumerate}
    \item 引き数 \\
	なし
    \item 説明	\\
	かな漢字変換処理を終了する。この関数を実行するとサーバ側に確保
	されていたすべての資源が解放される。また、学習内容で辞書に反映
	されていないものがあれば反映される。
    \item 返却値 \\
	\begin{tabular}[t]{c l}
	    正常： & 0 \\
	    異常： & $-$1 \\
	\end{tabular}
    \item パケット
	\begin{itemize}
	    \item 要求パケット(\reqeFinalize) \\
	    \begin{tabular}[t]{|c|c|c|}
		\hline
		フィールド & データ長 & 備考 \\
		\hline
		\hline
		IR\_FIN & 4 & \\
		\hline
	    \end{tabular}
	\item 応答パケット(\repeFinalize) \\
	    \begin{tabular}[t]{|c|c|c|}
		\hline
		フィールド & データ長 & 備考 \\
		\hline
		\hline
		終了状態 & 4 & 正常終了時0/エラー終了時$-$1 \\
		\hline
	    \end{tabular}
	\end{itemize}
\end{enumerate}
\newpage
%
\subsection{コンテクスト作成}
変換コンテクストを作成する。
\begin{verbatim}
int
rkc_create_context()
\end{verbatim}
\begin{enumerate}
    \item 引き数 \\
	なし
    \item 説明 \\
	コンテクストを作成し，そのコンテクストを表すコンテクスト番号を返す。
    \item 返却値 \\
	\begin{tabular}[t]{c l}
	    正常： & 生成したコンテクスト番号 \\
	    異常： & $-$1 \\
	\end{tabular}
    \item パケット
	\begin{itemize}
	    \item 要求パケット(\reqeCreateContext) \\
	    \begin{tabular}[t]{|c|c|c|}
		\hline
		フィールド & データ長 & 備考 \\
		\hline
		\hline
		IR\_CRE\_CON & 4 & \\
		\hline
	    \end{tabular}
	    \item 応答パケット(\repeCreateContext) \\
	    \begin{tabular}[t]{|c|c|c|}
		\hline
		フィールド & データ長 & 備考 \\
		\hline
		\hline
		コンテクスト番号 & 4 & エラー終了時$-$1 \\
		\hline
	    \end{tabular}
	\end{itemize}
\end{enumerate}
%
\newpage
%
\subsection{コンテクスト複写}
コンテクストを複写する。
\begin{verbatim}
int
rkc_duplicate_context( context )
int context ;
\end{verbatim}
\begin{enumerate}
    \item 引き数 \\
	{\it context}\ \ \ 複製の対象となる変換コンテクストを指定する。
    \item 説明 \\
	{\it context}で指定されたコンテクストを複製し，新しいコンテクストを
	生成する。
    \item 返却値 \\
	\begin{tabular}[t]{c l}
	    正常： & 元のコンテクストを複製した結果得られるコンテクストの返す。\\
	    異常： & $-$1 \\
	\end{tabular}
    \item パケット
	\begin{itemize}
	    \item 要求パケット(\reqeDuplicateContext) \\
	    \begin{tabular}[t]{|c|c|c|}
		\hline
		フィールド & データ長 & 備考 \\
		\hline
		\hline
		IR\_DUP\_CON & 4 & \\
		コンテクスト & 4 & \\
		\hline
	    \end{tabular}
	    \item 応答パケット(\repeDuplicateContext) \\
	    \begin{tabular}[t]{|c|c|c|}
		\hline
		フィールド & データ長 & 備考 \\
		\hline
		\hline
		コンテクスト & 4 & エラー終了時$-$1 \\
		\hline
	    \end{tabular}
	\end{itemize}
\end{enumerate}
%
\newpage
%
\subsection{コンテクスト削除}
コンテクストが使用している資源を解放する。その後コンテクストは未定義となる。
\begin{verbatim}
int
rkc_close_context( context )
int context ;
\end{verbatim}
\begin{enumerate}
    \item 引き数 \\
	{\it context}\ \ 変換コンテクストを指定する。
    \item 説明 \\
	指定されたコンテクストを解放する。
	サーバ上で指定されたコンテクストのために確保されている資源を解放する。
    \item 返却値 \\
	\begin{tabular}[t]{c l}
	    正常： & 0 \\
	    異常： & $-$1 \\
	\end{tabular}
    \item パケット
	\begin{itemize}
	    \item 要求パケット(\reqeCloseContext) \\
	    \begin{tabular}[t]{|c|c|c|}
		\hline
		フィールド & データ長 & 備考 \\
		\hline
		\hline
		IR\_CLO\_CON & 4 & \\
		コンテクスト & 4 & \\
		\hline
	    \end{tabular}
	    \item 応答パケット(\repeCloseContext) \\
	    \begin{tabular}[t]{|c|c|c|}
		\hline
		フィールド & データ長 & 備考 \\
		\hline
		\hline
		終了状態 & 4 & 正常終了時0/エラー終了時$-$1 \\
		\hline
	    \end{tabular}
	\end{itemize}
\end{enumerate}
%
\newpage
%
\subsection{登録辞書一覧}
辞書テーブルに登録されている辞書の一覧を取得する。
\begin{verbatim}
int
rkc_dictionary_list( context, dicnames_return, size )
int context, size ;
unsigned char *dicnames_return ;
\end{verbatim}
\begin{enumerate}
    \item 引き数 \\
	\begin{tabular}[t]{l l}
	    {\it context} & 変換コンテクストを指定する \\
	    {\it dicnames\_return} & 辞書リストを格納するためのバッファ \\
	    {\it size} & バッファのサイズ。\\
	\end{tabular}
    \item 説明 \\
	rkc\_dictionary\_listは辞書テーブルに存在する辞書の一覧を返す。
    \item 返却値 \\
	\begin{tabular}[t]{c l}
	    正常： & 辞書名の一覧が{\it dicnames\_return}に格納され，辞書数が返される。\\
	    異常： & $-$1 \\
	\end{tabular}

    \item パケット
	\begin{itemize}
	    \item 要求パケット(\reqeDictionaryList) \\
	    \begin{tabular}[t]{|c|c|c|}
		\hline
		フィールド & データ長 & 備考 \\
		\hline
		\hline
		IR\_DIC\_LIST & 4 & \\
		コンテクスト & 4 & \\
		辞書名リストのバッファサイズ & 4 & \\
		\hline
	    \end{tabular}
	    \item 応答パケット(\repeDictionaryList) \\
	    \begin{tabular}[t]{|c|c|c|}
		\hline
		フィールド & データ長 & 備考 \\
		\hline
		\hline
		辞書数 & 4 & エラー終了時$-1$ \\
		辞書名リスト長 & 4 & \\
		辞書名リスト & 可変長 & （文字列長$+$文字列）の繰り返し \\
		\hline
	    \end{tabular}
	\end{itemize}
\end{enumerate}
%
\newpage
%
\subsection{読みがな取得}
カレント文節の読みがなを取得する。
\begin{verbatim}
int
rkc_get_yomi( cx, yomip )
RkcContext *cx ;
unsigned char **yomip ;
\end{verbatim}
\begin{enumerate}
    \item 引き数 \\
	\begin{tabular}[t]{l l}
	    {\it cx} & RKCライブラリ内部コンテクスト構造体へのポインタ \\
	    {\it yomip} & バッファのポインタを指すポインタ \\
	\end{tabular}
    \item 説明 \\
	rkc\_get\_yomiは{\it cx}で指定したコンテクストでカレント文節の
	読みを{\it yomip}で示されたバッファに格納する。
    \item 返却値 \\
	\begin{tabular}[t]{c l}
	    正常： & 読みの長さ \\
	    異常： & $-$1 \\
	\end{tabular}

    \item パケット
	\begin{itemize}
	    \item 要求パケット (\reqeGetYomi) \\
	    \begin{tabular}[t]{|c|c|c|}
		\hline
		フィールド & データ長 & 備考 \\
		\hline
		\hline
		IR\_GET\_YOMI & 4 & \\
		コンテクスト番号 & 4 & \\
		カレント文節番号 & 4 & \\
		読みのバッファサイズ & 4 & \\
		\hline
	    \end{tabular}
	    \item 応答パケット(\repeGetYomi) \\
	    \begin{tabular}[t]{|c|c|c|}
		\hline
		フィールド & データ長 & 備考 \\
		\hline
		\hline
		読みの長さ & 4 & エラー終了時$-$1 \\
		読みリスト長 & 4 & \\
		読みリスト & 可変長 & 文字列長$+$EUC文字列 \\
		\hline
	    \end{tabular}
	\end{itemize}
\end{enumerate}
%
\newpage
%
\subsection{単語登録}
辞書に新しい単語を追加登録する。
\begin{verbatim}
int
rkc_define_dic( context, dicname, wordrec)
int context ;
unsigned char *dicname ;
unsigned char *wordrec ;
\end{verbatim}
\begin{enumerate}
    \item 引き数 \\
	\begin{tabular}[t]{c l}
	    {\it context} & 変換コンテクストを指定する \\
	    {\it dicname} & 単語を登録する辞書名を指定する。\\
	    {\it wordrec} & 登録する単語情報を指定する。\\
	\end{tabular}
    \item 説明 \\
	{\it dicname}で指定した辞書に{\it wordrec}で指定した単語情報を登録する。
    \item 返却値 \\
	\begin{tabular}[t]{c l}
	    正常： & 0 \\
	    異常： & $-$1 \\
	\end{tabular}
    \item パケット
	\begin{itemize}
	    \item 要求パケット(\reqeDefineDic) \\
	    \begin{tabular}[t]{|c|c|c|}
		\hline
		フィールド & データ長 & 備考 \\
		\hline
		\hline
		IR\_DEF\_DIC & 4 & \\
		コンテクスト & 4 & \\
		辞書名長 & 4 & \\
		辞書名 & 可変長 & \\
		単語情報長 & 4 & \\
		単語情報 & 可変長 & \\
		\hline
	    \end{tabular}
	    \item 応答パケット(\repeDefineDic) \\
	    \begin{tabular}[t]{|c|c|c|}
		\hline
		フィールド & データ長 & 備考 \\
		\hline
		\hline
		終了状態 & 4 & 正常終了時0/エラー終了時$-$1 \\
		\hline
	    \end{tabular}
	\end{itemize}
\end{enumerate}
%
\newpage
%
\subsection{単語削除}
辞書から単語を削除する。
\begin{verbatim}
int
rkc_delete_dic( context, dicname, wordrec)
int context ;
unsigned char *dicname ;
unsigned char *wordrec ;
\end{verbatim}
\begin{enumerate}
    \item 引き数 \\
	\begin{tabular}[t]{l l}
	    {\it context} & 変換コンテクストを指定する \\
	    {\it dicname} & 単語を登録する辞書名を指定する。\\
	    {\it wordrec} & 登録する単語情報を指定する。\\
	\end{tabular}
    \item 説明 \\
	{\it dicname}で指定した辞書から{\it wordrec}で指定した単語情報を削除する。
    \item 返却値 \\
	\begin{tabular}[t]{l l}
	    正常： & 0 \\
	    異常： & $-$1 \\
	\end{tabular}
    \item パケット
	\begin{itemize}
	    \item 要求パケット(\reqeDeleteDic) \\
	    \begin{tabular}[t]{|c|c|c|}
		\hline
		フィールド & データ長 & 備考 \\
		\hline
		\hline
		IR\_UNDEF\_DIC & 4 & \\
		コンテクスト & 4 & \\
		辞書名長 & 4 & \\
		辞書名 & 可変長 & \\
		単語情報長 & 4 & \\
		単語情報 & 可変長 & \\
		\hline
	    \end{tabular}
	    \item 応答パケット(\repeDeleteDic) \\
	    \begin{tabular}[t]{|c|c|c|}
		\hline
		フィールド & データ長 & 備考 \\
		\hline
		\hline
		終了状態 & 4 & 正常終了時0/エラー終了時$-$1 \\
		\hline
	    \end{tabular}
	\end{itemize}
\end{enumerate}
%
\newpage
%
\subsection{辞書リスト一覧}
辞書リストに登録されている辞書名一覧を取得する。
\begin{verbatim}
int
rkc_get_dir_list( context, ddname, maxddname )
int context ;
unsigned char *ddname ;
int maxddname ;
\end{verbatim}
\begin{enumerate}
    \item 引き数 \\
	\begin{tabular}[t]{l l}
	    {\it context} & 変換コンテクストを指定する。 \\
	    {\it ddname} & 辞書リストに登録されている辞書名を入れるバッファ。\\
	    {\it maxddname} & 上記バッファのサイズ \\
	\end{tabular}
    \item 説明 \\
	{\it context}で指定された辞書リストに登録されている辞書名を返す。
    \item 返却値 \\
	\begin{tabular}[t]{c l}
	    正常： & 0 \\
	    異常： & $-$1 \\
	\end{tabular}
    \item パケット
	\begin{itemize}
	    \item 要求パケット(\reqeGetDirList) \\
	    \begin{tabular}[t]{|c|c|c|}
		\hline
		フィールド & データ長 & 備考 \\
		\hline
		\hline
		IR\_DIR\_LIST & 4 & \\
		コンテクスト & 4 & \\
		辞書名リストのバッファサイズ & 4 & \\
		\hline
	    \end{tabular}
	    \item 応答パケット(\repeGetDirList) \\
	    \begin{tabular}[t]{|c|c|c|}
		\hline
		フィールド & データ長 & 備考 \\
		\hline
		\hline
		辞書数 & 4 & エラー終了時$-1$ \\
		辞書名リスト長 & 4 & \\
		辞書名リスト & 可変長 & （文字列長$+$文字列）の繰り返し \\
		\hline
	    \end{tabular}
	\end{itemize}
\end{enumerate}
%
\newpage
%
\subsection{辞書追加}
使用辞書を新しく辞書リストに追加する。
\begin{verbatim}
int
rkc_mount_dictionary( context, dicname, mode )
int context, mode ;
char *dicname ;
\end{verbatim}
\begin{enumerate}
    \item 引き数 \\
	\begin{tabular}[t]{l l}
	    {\it context} & 変換コンテクストを指定する。 \\
	    {\it dicname} & 対象となる辞書名を指定する。\\
	    {\it mode} & リザーブ \\
	\end{tabular}
    \item 説明 \\
	{\it rkc\_mount\_dictionary}は{\it dicname}で指定された辞書を
	{\it context}で指定されたコンテクストの辞書リストの先頭に追加する。
    \item 返却値 \\
	\begin{tabular}[t]{c l}
	    正常： & 0 \\
	    異常： & $-$1 \\
	\end{tabular}
    \item パケット
	\begin{itemize}
	    \item 要求パケット(\reqeMountDictionary) \\
	    \begin{tabular}[t]{|c|c|c|}
		\hline
		フィールド & データ長 & 備考 \\
		\hline
		\hline
		IR\_MNT\_DIC & 4 & \\
		コンテクスト & 4 & \\
		辞書名長 & 4 & \\
		辞書名 & 可変長 & \\
		モード & 4 & \\
		\hline
	    \end{tabular}
	    \item 応答パケット(\repeMountDictionary) \\
	    \begin{tabular}[t]{|c|c|c|}
		\hline
		フィールド & データ長 & 備考 \\
		\hline
		\hline
		終了状態 & 4 & 正常終了時0/エラー終了時$-$1 \\
		\hline
	    \end{tabular}
	\end{itemize}
\end{enumerate}
%
\newpage
%
\subsection{辞書削除}
辞書の使用をやめる。
\begin{verbatim}
int
rkc_umount_dictionary( context, dicname )
int context ;
char *dicname ;
\end{verbatim}
\begin{enumerate}
    \item 引き数 \\
	\begin{tabular}[t]{l l}
	    {\it context} & 変換コンテクストを指定する。\\
	    {\it dicname} & 対象となる辞書名を指定する。\\
	\end{tabular}
    \item 説明 \\
	{\it rkc\_umount\_dictionary}は{\it dicname}で指定された辞書を
	{\it context}で指定されたコンテクストの辞書リストから削除する。
    \item 返却値 \\
	\begin{tabular}[t]{c l}
	    正常： & 0 \\
	    異常： & $-$1 \\
	\end{tabular}
    \item パケット
	\begin{itemize}
	    \item 要求パケット(\reqeUmountDictionary) \\
	    \begin{tabular}[t]{|c|c|c|}
		\hline
		フィールド & データ長 & 備考 \\
		\hline
		\hline
		IR\_UMNT\_DIC & 4 & \\
		コンテクスト & 4 & \\
		辞書名長 & 4 & \\
		辞書名 & 可変長 & \\
		モード & 4 & 0 \\
		\hline
	    \end{tabular}
	    \item 応答パケット(\repeUmountDictionary) \\
	    \begin{tabular}[t]{|c|c|c|}
		\hline
		フィールド & データ長 & 備考 \\
		\hline
		\hline
		終了状態 & 4 & 正常終了時0/エラー終了時$-$1 \\
		\hline
	    \end{tabular}
	\end{itemize}
\end{enumerate}
%
\newpage
%
\subsection{辞書変更}
使用辞書の辞書リストの順番を変更する。
\begin{verbatim}
int
rkc_remount_dictionary( context, dicname, pos )
int context, pos ;
char *dicname ;
\end{verbatim}
\begin{enumerate}
    \item 引き数 \\
	\begin{tabular}[t]{l l}
	    {\it context} & 変換コンテクストを指定する。 \\
	    {\it dicname} & 対象となる辞書名を指定する。\\
	    {\it pos} & 辞書リストの先頭か末尾かを指定する。\\
	\end{tabular}
    \item 説明 \\
	{\it rkc\_remount\_dictionary}は{\it dicname}で指定された辞書を
	{\it context}で指定されたコンテクストの辞書リストの{\it pos}で
	指定された場所にマウントし直す。
    \item 返却値 \\
	\begin{tabular}[t]{c l}
	    正常： & 0 \\
	    異常： & $-$1 \\
	\end{tabular}
    \item パケット
	\begin{itemize}
	    \item 要求パケット(\reqeRemountDictionary) \\
	    \begin{tabular}[t]{|c|c|c|}
		\hline
		フィールド & データ長 & 備考 \\
		\hline
		\hline
		IR\_RMNT\_DIC & 4 & \\
		コンテクスト & 4 & \\
		優先度 & 4 & \\
		辞書名長 & 4 & \\
		辞書名 & 可変長 & \\
		\hline
	    \end{tabular}
	    \item 応答パケット(\repeRemountDictionary) \\
	    \begin{tabular}[t]{|c|c|c|}
		\hline
		フィールド & データ長 & 備考 \\
		\hline
		\hline
		終了状態 & 4 & 正常終了時0/エラー終了時$-$1 \\
		\hline
	    \end{tabular}
	\end{itemize}
\end{enumerate}
%
\newpage
\subsection{マウント辞書一覧}
マウントリストに登録されている辞書名一覧を取得する。
\begin{verbatim}
int
rkc_mount_list( context, dicnames, size)
int context, size ;
unsigned char *dicnames ;
\end{verbatim}
\begin{enumerate}
    \item 引き数 \\
	\begin{tabular}[t]{l l}
	    {\it context} & 変換コンテクストを指定する。 \\
	    {\it dicname} & マウントリストに登録されている辞書名を入れるバッファ。 \\
	    {\it size} & 上記バッファのサイズ。\\
	\end{tabular}
    \item 説明 \\
	rkc\_mount\_listは{\it context}で指定されたコンテクストにマウント
	されている辞書名を全て求め，{\it dicnames}に格納し返す 。
    \item 返却値 \\
	\begin{tabular}[t]{c l}
	    正常： & マウントされている辞書の個数 \\
	    異常： & $-$1 \\
	\end{tabular}
    \item パケット
	\begin{itemize}
	    \item 要求パケット(\reqeMountList) \\
	    \begin{tabular}[t]{|c|c|c|}
		\hline
		フィールド & データ長 & 備考 \\
		\hline
		\hline
		IR\_MNT\_LIST & 4 & \\
		コンテクスト & 4 & \\
		辞書名リストのバッファサイズ & 4 & \\
		\hline
	    \end{tabular}
	    \item 応答パケット(\repeMountList) \\
	    \begin{tabular}[t]{|c|c|c|}
		\hline
		フィールド & データ長 & 備考 \\
		\hline
		\hline
		辞書数 & 4 & エラー終了時$-$1 \\
		辞書名リスト長 & 4 & \\
		辞書名リスト & 可変長 & （文字列長$+$辞書名）の繰り返し \\
		\hline
	    \end{tabular}
	\end{itemize}
\end{enumerate}
%
\newpage
%
\subsection{変換}
サーバに対して送られてきたかな文字列に対し、かな漢字変換を行う。
サーバは、かな漢字変換した結果の文節数と、各文節の
かなでの文字数および最優先候補の漢字文字列などを返す。
\begin{verbatim}
int
rkc_convert( cx, yomi, length, mode )
RkcContext *cx ;
int length ,mode;
unsigned char *yomi ;
\end{verbatim}
\begin{enumerate}
    \item 引き数 \\
	\begin{tabular}[t]{l l}
	    {\it cx} & RKCライブラリ内部コンテクスト構造体へのポインタを指定する \\
	    {\it yomi} & 読みを表す文字列を指定する。 \\
	    {\it length} & 読みの長さを指定する。 \\
	    {\it mode} & コード変換候補を指定する。\\
	\end{tabular}
    \item 説明 \\
	コンテクスト{\it cx}の下で、読み{\it yomi}をかな漢字変換し、
	その結果を文節毎に分け、内部バッファに格納する。
    \item 返却値 \\
	\begin{tabular}[t]{c l}
	    正常： & 文節の数 \\
	    異常： & $-$1 \\
	\end{tabular}
    \item パケット
	\begin{itemize}
	    \item 要求パケット(\reqeConvert) \\
	    \begin{tabular}[t]{|c|c|c|}
		\hline
		フィールド & データ長 & 備考 \\
		\hline
		\hline
		IR\_CONVERT & 4 & \\
		コンテクスト & 4 & \\
		読みのバイト長 & 4 & \\
		読み & 可変長 & EUC文字列 \\
		モード & 4 & \\
		\hline
	    \end{tabular}
	    \item 応答パケット(\repeConvert) \\
	    \begin{tabular}[t]{|c|c|c|}
		\hline
		フィールド & データ長 & 備考 \\
		\hline
		\hline
		文節数 & 4 & エラー終了時$-$1 \\
		各文節の最優先候補のリスト長 & 4 & \\
		各文節の最優先候補のリスト & 可変長 & （文字列長$+$EUC文字列）の繰り返し \\
		\hline
	    \end{tabular}
	\end{itemize}
\end{enumerate}
%
\newpage
%
\subsection{変換終了}
現在の変換作業を終了し、必要に応じて学習を行う。
\begin{verbatim}
int
rkc_convert_end( cx, mode )
RkcContext *cx ;
int mode ;
\end{verbatim}
\begin{enumerate}
    \item 引き数 \\
	\begin{tabular}[t]{l l}
	    {\it cx} & RKCライブラリ内部コンテクスト構造体へのポインタを指定する \\
	    {\it mode} & 学習機能のオン/オフを指定する。 \\
	\end{tabular}
    \item 説明 \\
	コンテクスト{\it cx}の下で、rkc\_convertの処理を終了する。
	終了の際、選択された候補の頻度学習のための情報を付け加える。
	頻度学習する必要がなければ、{\it mode}に0を指定する。
    \item 返却値 \\
	\begin{tabular}[t]{c l}
	    正常： & 0 \\
	    異常： & $-$1 \\
	\end{tabular}
    \item パケット
	\begin{itemize}
	    \item 要求パケット(\reqeConvertEnd) \\
	    \begin{tabular}[t]{|c|c|c|}
		\hline
		フィールド & データ長 & 備考 \\
		\hline
		\hline
		IR\_CONV\_END & 4 & \\
		コンテクスト & 4 & \\
		文節数 & 4 & 0なら学習しない \\
		各文節のカレント候補 & 4×文節数 & \\
		\hline
	    \end{tabular}
	    \item 応答パケット(\repeConvertEnd) \\
	    \begin{tabular}[t]{|c|c|c|}
		\hline
		フィールド & データ長 & 備考 \\
		\hline
		\hline
		終了状態 & 4 & 正常終了時0/エラー終了時$-$1 \\
		\hline
	    \end{tabular}
	\end{itemize}
\end{enumerate}

\newpage
%
\subsection{候補要求}
指定された文節の、すべての候補文字列と読みと候補数を返す。
\begin{verbatim}
int
rkc_get_kanji_list( cx )
RkcContext *cx ;
\end{verbatim}
\begin{enumerate}
    \item 引き数 \\
	\begin{tabular}[t]{l l}
	    {\it cx} & RKCライブラリ内部コンテクスト構造体へのポインタを指定する \\
	\end{tabular}
    \item 説明 \\
	文節番号に対応する文節の全候補を得る。
    \item 返却値 \\
	\begin{tabular}[t]{c l}
	    正常： & 候補の数 \\
	    異常： & $-$1\\
	\end{tabular}
    \item パケット
	\begin{itemize}
	    \item 要求パケット(\reqeGetKanjiList) \\
	    \begin{tabular}[t]{|c|c|c|}
		\hline
		フィールド & データ長 & 備考 \\
		\hline
		\hline
		IR\_KAN\_LST & 4 & \\
		コンテクスト & 4 & \\
		文節番号 & 4 & \\
		バッファサイズ & 4 & \\
		\hline
	    \end{tabular}
	    \item 応答パケット(\repeGetKanjiList) \\
	    \begin{tabular}[t]{|c|c|c|}
		\hline
		フィールド & データ長 & 備考 \\
		\hline
		\hline
		候補数 & 4 & エラー終了時$-$1 \\
		候補文字列のリスト長 & 4 & \\
		候補文字列のリスト & 可変長 & （文字列長$+$EUC文字列）の繰り返し \\
		\hline
	    \end{tabular}
	\end{itemize}
\end{enumerate}
%
\newpage
%
\subsection{区切り変更}
指定された文節を、指定された長さに区切り直して、再度かな漢字変換する。
\begin{verbatim}
int
rkc_resize( cx, yomi_length )
RkcContext *cx ;
int yomi_length ;
\end{verbatim}
\begin{enumerate}
    \item 引き数 \\
	\begin{tabular}[t]{l l}
	    {\it cx} & RKCライブラリ内部コンテクスト構造体へのポインタを指定する \\
	    {\it yomi\_length} & 新しい読みの長さを指定する。\\
	\end{tabular}
    \item 説明 \\
	区切り変更した文節から最後までの文節数と、各文節の、
	かなでの文字数および最優先候補の漢字文字列を返す。
	カレント文節以降の部分は再変換される。
    \item 返却値 \\
	\begin{tabular}[t]{c l}
	    正常： & 文節数 \\
	    異常： & $-$1 \\
	\end{tabular}
    \item パケット
	\begin{itemize}
	    \item 要求パケット(\reqeResize) \\
	    \begin{tabular}[t]{|c|c|c|}
		\hline
		フィールド & データ長 & 備考 \\
		\hline
		\hline
		IR\_RESIZE & 4 & \\
		コンテクスト & 4 & \\
		文節番号 & 4 & \\
		読みの長さ & 4 & \\
		\hline
	    \end{tabular}
	    \item 応答パケット(\repeResize) \\
	    \begin{tabular}[t]{|c|c|c|}
		\hline
		フィールド & データ長 & 備考 \\
		\hline
		\hline
		文節数 & 4 & 文全体の文節数    $/$エラー終了時$-$1 \\
		各文節の最優先候補のリスト長 & 4 & \\
		各文節の最優先候補のリスト & 可変長 & (文字列長$+$EUC文字列)の繰り返し \\
		\hline
	    \end{tabular}
	\end{itemize}
\end{enumerate}
%
\newpage
%
\subsection{読みがな変更}
変換途中で、読みがなが変更されたときに用いる要求。今までの候補選択、
区切り変更などの情報を保持して、新しい読みがなで、再度かな漢字変換を行う。
\begin{verbatim}
int
rkc_store_yomi( cx, yomi, max )
RkcContext *cx ;
unsigned char *yomi ;
int max ;
\end{verbatim}
\begin{enumerate}
    \item 引き数 \\
	\begin{tabular}[t]{l l}
	    {\it cx} & RKCライブラリ内部コンテクスト構造体へのポインタを指定する \\
	    {\it yomi} & 読みを指定する。\\
	    {\it max} & 読みを格納するバッファサイズ。\\
	\end{tabular}
    \item 説明 \\
	指定された文節の読みを{\it yomi}で指定されたものに変更し、
	その文節より後ろを再度連文節変換する。
    \item 返却値 \\
	\begin{tabular}[t]{c l}
	    正常： & 文節数 \\
	    異常： & $-$1 \\
	\end{tabular}
    \item パケット
	\begin{itemize}
	    \item 要求パケット(\reqeStoreYomi) \\
	    \begin{tabular}[t]{|c|c|c|}
		\hline
		フィールド & データ長 & 備考 \\
		\hline
		\hline
		IR\_STO\_YOMI & 4 & \\
		コンテクスト & 4 & \\
		文節番号 & 4 & \\
		読みの長さ & 4 & \\
		読み & 可変長 & EUC文字列 \\
		\hline
	    \end{tabular}
	    \item 応答パケット(\repeStoreYomi) \\
	    \begin{tabular}[t]{|c|c|c|}
		\hline
		フィールド & データ長 & 備考 \\
		\hline
		\hline
		文節数 & 4 & エラー終了時$-$1 \\
		各文節の最優先候補リスト長 & 4 & \\
		各文節の最優先候補リスト & 可変長 & (バイト長$+$候補文字列)の繰り返し \\
		\hline
	    \end{tabular}
	\end{itemize}
\end{enumerate}
%
\newpage
%
\subsection{形態素情報}
カレント文節の形態素情報を取得する。
\begin{verbatim}
rkc_get_lex( cx, max, info_return )
RkcContext *cx ;
int max ;
RkLex *info_return ;
\end{verbatim}
\begin{enumerate}
    \item 引き数 \\
	\begin{tabular}[t]{l l}
	    {\it cx} & RKCライブラリ内部コンテクスト構造体へのポインタを指定する \\
	    {\it info\_return} & 形態素情報を格納するバッファ \\
	    {\it max} & 上記バッファのサイズ \\
	\end{tabular}
    \item 説明 \\
	rkc\_get\_lexは指定された候補の形態素情報を{\it info\_return}に格納し，
	文節を構成する単語数を返す。
    \item 返却値 \\
	\begin{tabular}[t]{c l}
	    正常： & 文節を構成する単語数 \\
	    異常： & $-$1 \\
	\end{tabular}
    \item パケット
	\begin{itemize}
	    \item 要求パケット(\reqeGetLex) \\
	    \begin{tabular}[t]{|c|c|c|}
		\hline
		フィールド & データ長 & 備考 \\
		\hline
		\hline
		IR\_GET\_LEX & 4 & \\
		コンテクスト & 4 & \\
		カレント文節番号 & 4 & \\
		カレント候補番号 & 4 & \\
		バッファ長       & 4 & \\
		\hline
	    \end{tabular}
	    \item 応答パケット(\repeGetLex) \\
	    \begin{tabular}[t]{|c|c|c|}
		\hline
		フィールド & データ長 & 備考 \\
		\hline
		\hline
		単語数 & 4 & 文節を構成する単語数$/$エラー終了時$-$1  \\
		データ長 & 4 & \\
		形態素情報 & 単語数 $\times$ 20 & 一単語の形態素情報は
5 $\times$ 4バイト\\
		\hline
	    \end{tabular}
	\end{itemize}
\end{enumerate}
%
\newpage
%
\subsection{解析情報}
カレント候補に関する解析情報を求める。
\begin{verbatim}
int
rkc_get_stat( cx, stat )
RkcContext *cx ;
RkStat *stat ;
\end{verbatim}
\begin{enumerate}
    \item 引き数 \\
	\begin{tabular}[t]{l l}
	    {\it cx} & RKCライブラリ内部コンテクスト構造体へのポインタを指定する \\
	    {\it stat} & 解析情報を格納するバッファ \\
	\end{tabular}
    \item 説明 \\
	rkc\_get\_statはカレント候補の解析情報を{\it stat}に格納する。
    \item 返却値 \\
	\begin{tabular}[t]{c l}
	    正常： & 0 \\
	    異常： & $-$1 \\
	\end{tabular}
    \item パケット
	\begin{itemize}
	    \item 要求パケット(\reqeGetStat) \\
	    \begin{tabular}[t]{|c|c|c|}
		\hline
		フィールド & データ長 & 備考 \\
		\hline
		\hline
		IR\_GET\_STAT & 4 & \\
		コンテクスト & 4 & \\
		カレント文節番号 & 4 & \\
		カレント候補番号 & 4 & \\
		\hline
	    \end{tabular}
	    \item 応答パケット(\repeGetStat) \\
	    \begin{tabular}[t]{|c|c|c|}
		\hline
		フィールド & データ長 & 備考 \\
		\hline
		\hline
		単語数 & 4 & 正常終了時0/エラー終了時$-$1 \\
		データ長 & 4 & 28 \\
		解析情報 & 28 & 解析情報は 7 $\times$ 4 バイト \\
		\hline
	    \end{tabular}
	\end{itemize}
\end{enumerate}
%
\newpage
%
\section{拡張プロトコル}
%
\subsection{辞書テーブル一覧}
指定した辞書ディレクトリにある辞書テーブルを取得する．
\begin{verbatim}
int
rkc_list_dictionary( cx, dirname, dicnames_return, size )
register RkcContext *cx ;
unsigned char *dirname ;
unsigned char *dicnames_return ;
int size ;
int
\end{verbatim}
\begin{enumerate}
    \item 引き数 \\
	\begin{tabular}[t]{l l}
	    {\it cx} & RKCライブラリ内部コンテクスト構造体へのポインタを
指定する \\
	    {\it dirname} & 辞書ディレクトリ \\
	    {\it dicnames\_return} & 辞書テーブルを格納するバッファ \\
	    {\it size} & バッファサイズ
	\end{tabular}
    \item 説明 \\
	rkc\_list\_dictionaryは{\it dirname}で指定したディレクトリにある辞書
の一覧を{\it dicnames\_return}に格納する。
    \item 返却値 \\
	\begin{tabular}[t]{c l}
	    正常： & 辞書数 \\
	    異常： & $-$1
	\end{tabular}
    \item パケット
	\begin{itemize}
	    \item 要求パケット(\reqelsDic) \\
	    \begin{tabular}[t]{|c|c|c|}
		\hline
		フィールド & データ長 & 備考 \\
		\hline
		\hline
		IR\_LIST\_DIC & 4 & \\
		コンテクスト & 4 & \\
		バッファサイズ & 4 & \\
		ディレクトリ名長 & 4 & \\
		ディレクトリ名 & 可変長 & \\
		\hline
	    \end{tabular}
	    \item 応答パケット(\repelsDic) \\
	    \begin{tabular}[t]{|c|c|c|}
		\hline
		フィールド & データ長 & 備考 \\
		\hline
		\hline
		辞書数 & 4 & エラー終了時$-1$ \\
		辞書リスト長 & 4 & \\
		辞書リスト & 可変長 & \\
		\hline
	    \end{tabular}
	\end{itemize}
\end{enumerate}
%
\newpage
%
\subsection{辞書作成}
テキスト辞書を作成し，dics.dirの内容を更新する．
\begin{verbatim}
int
rkc_create_dictionary( cx, dicname, mode )
register RkcContext *cx ;
unsigned char *dicname ;
int mode ;
\end{verbatim}
\begin{enumerate}
    \item 引き数 \\
	\begin{tabular}[t]{l l}
	    {\it cx} & RKCライブラリ内部コンテクスト構造体へのポインタを
指定する \\
	    {\it dicname} & 作成する辞書名を指定する \\
	    {\it mode} & 辞書のモード \\
	\end{tabular}
    \item 説明 \\
	rkc\_create\_dictionaryは{\it dicname}で指定したテキスト辞書を
作成する．
    \item 返却値 \\
	\begin{tabular}[t]{c l}
	    正常： & 0 \\
	    異常： & $-$1 \\
	\end{tabular}
    \item パケット
	\begin{itemize}
	    \item 要求パケット(\reqeCreateDic) \\
	    \begin{tabular}[t]{|c|c|c|}
		\hline
		フィールド & データ長 & 備考 \\
		\hline
		\hline
		IR\_CREAT\_DIC & 4 & \\
		コンテクスト & 4 & \\
		モード & 4 & \\
		辞書名長 & 4 & \\
		辞書名 & 可変長 & \\
		\hline
	    \end{tabular}
	    \item 応答パケット(\repeCreateDic) \\
	    \begin{tabular}[t]{|c|c|c|}
		\hline
		フィールド & データ長 & 備考 \\
		\hline
		\hline
		終了状態 & 4 & 正常終了時0/エラー終了時$-$1 \\
		\hline
	    \end{tabular}
	\end{itemize}
\end{enumerate}
%
\newpage
%
\subsection{辞書削除}
テキスト辞書を削除し，dics.dirの内容を更新する．
\begin{verbatim}
int
rkc_destroy_dictionary( cx, dicname )
register RkcContext *cx ;
unsigned char *dicname ;
\end{verbatim}
\begin{enumerate}
    \item 引き数 \\
	\begin{tabular}[t]{l l}
	    {\it cx} & RKCライブラリ内部コンテクスト構造体へのポインタを
指定する \\
	    {\it dicname} & 削除する辞書名を指定する
	\end{tabular}
    \item 説明 \\
	rkc\_destroy\_dictionaryは{\it dicname}で指定したテキスト辞書を
削除する．
    \item 返却値 \\
	\begin{tabular}[t]{c l}
	    正常： & 0 \\
	    異常： & $-$1 \\
	\end{tabular}
    \item パケット
	\begin{itemize}
	    \item 要求パケット(\reqeDestroyDic) \\
	    \begin{tabular}[t]{|c|c|c|}
		\hline
		フィールド & データ長 & 備考 \\
		\hline
		\hline
		IR\_DEST\_DIC & 4 & \\
		コンテクスト & 4 & \\
		モード & 4 & \\
		辞書名長 & 4 & \\
		辞書名 & 可変長 & \\
		\hline
	    \end{tabular}
	    \item 応答パケット(\repeDestroyDic) \\
	    \begin{tabular}[t]{|c|c|c|}
		\hline
		フィールド & データ長 & 備考 \\
		\hline
		\hline
		終了状態 & 4 & 正常終了時0/エラー終了時$-$1 \\
		\hline
	    \end{tabular}
	\end{itemize}
\end{enumerate}
%
\newpage
%
\subsection{辞書名変更}
ユーザ辞書の辞書名を変更する．
\begin{verbatim}
int
rkc_rename_dictionary( cx, dicname, newdicname, mode )
register RkcContext *cx ;
unsigned char *dicname ;
unsigned char *newdicname ;
int mode ;
\end{verbatim}
\begin{enumerate}
    \item 引き数 \\
	\begin{tabular}[t]{l l}
	    {\it cx} & RKCライブラリ内部コンテクスト構造体へのポインタを
指定する \\
	    {\it dicname} & 現在の辞書名を指定する \\
	    {\it newdicname} & 新しい辞書名を指定する \\
	    {\it mode} & 辞書のモード
	\end{tabular}
    \item 説明 \\
	rkc\_rename\_dictionaryは{\it dicname}で指定したテキスト辞書を
{\it newdicname}で指定した辞書名に変更する．
    \item 返却値 \\
	\begin{tabular}[t]{c l}
	    正常： & 0 \\
	    異常： & $-$1 \\
	\end{tabular}
    \item パケット
	\begin{itemize}
	    \item 要求パケット(\reqeRenameDic) \\
	    \begin{tabular}[t]{|c|c|c|}
		\hline
		フィールド & データ長 & 備考 \\
		\hline
		\hline
		IR\_RENAME\_DIC & 4 & \\
		コンテクスト & 4 & \\
		現在の辞書名長 & 4 & \\
		現在の辞書名 & 可変長 & \\
		新しい辞書名長 & 4 & \\
		新しい辞書名 & 可変長 & \\
		モード & 4 & \\
		\hline
	    \end{tabular}
	    \item 応答パケット(\repeRenameDic) \\
	    \begin{tabular}[t]{|c|c|c|}
		\hline
		フィールド & データ長 & 備考 \\
		\hline
		\hline
		終了状態 & 4 & 正常終了時0/エラー終了時$-$1 \\
		\hline
	    \end{tabular}
	\end{itemize}
\end{enumerate}
%
\newpage
%
\subsection{単語情報取得}
テキスト辞書の単語情報を取得する．
\begin{verbatim}
int
rkc_get_text_dictionary( cx, dirname, dicname, info, infolen )	
register RkcContext *cx ;
unsigned char *dirname ;
unsigned char *dicname ;
Ushort *info ;
int infolen ;
\end{verbatim}
\begin{enumerate}
    \item 引き数 \\
	\begin{tabular}[t]{l l}
	    {\it cx} & RKCライブラリ内部コンテクスト構造体へのポインタを
指定する \\
	    {\it dirname} & ディレクトリ名を指定する \\
	    {\it dicname} & 辞書名を指定する \\
	    {\it info} & 単語情報を格納するバッファ \\
	    {\it infolen} & 上記バッファのサイズ
	\end{tabular}
    \item 説明 \\
	rkc\_get\_text\_dictionaryは{\it dirname}でしたディレクトリにある
{\it dicname}で指定したテキスト辞書の単語情報を{\it info}に格納する．
    \item 返却値 \\
	\begin{tabular}[t]{c l}
	    正常： & 0 \\
	    異常： & $-$1 \\
	\end{tabular}
    \item パケット
	\begin{itemize}
	    \item 要求パケット(\reqeGetWordTextDic) \\
	    \begin{tabular}[t]{|c|c|c|}
		\hline
		フィールド & データ長 & 備考 \\
		\hline
		\hline
		IR\_GET\_WORD\_DIC & 4 & \\
		コンテクスト & 4 & \\
		ディレクトリ名長 & 4 & \\
		ディレクトリ名 & 可変長 & \\
		辞書名長 & 4 & \\
		辞書名 & 可変長 & \\
		バッファサイズ & 4 & \\
		\hline
	    \end{tabular}
	    \item 応答パケット(\repeGetWordTextDic) \\
	    \begin{tabular}[t]{|c|c|c|}
		\hline
		フィールド & データ長 & 備考 \\
		\hline
		\hline
		終了状態 & 4 & エラー終了時$-1$ \\
		データ長 & 4 & \\
		単語情報長 & 4 & \\
		単語情報 & 可変長 & \\
		\hline
	    \end{tabular}
	\end{itemize}
\end{enumerate}
%
\newpage
%
\section{『RK』ライブラリとの対応}
以上述べたプロトコルのRKライブラリとの対応は以下の通り。\\
\begin{tabular}[t]{|l|c|c|}
    \hline
    RK関数 & プロトコル & 備考 \\
    \hline
    \hline
    RkInitialize       & IR\_INIT	& 初期化処理 \\
    RkFinalize	       & IR\_FIN	& 終了処理 \\	
    RkCreateContext    & IR\_CRE\_CON	& コンテクスト作成 \\
    RkDuplicateContext & IR\_DUP\_CON	& コンテクスト複写 \\
    RkCloseContext     & IR\_CLO\_CON	& コンテクスト削除 \\
    RkGetDicList       & IR\_DIC\_LIST	& 登録辞書一覧 \\
    RkMountDic	       & IR\_MNT\_DIC	& 辞書追加 \\	
    RkUnmountDic       & IR\_UMNT\_DIC	& 辞書削除 \\	
    RkRemountDic       & IR\_RMNT\_DIC	& 辞書変更 \\	
    RkGetMountList     & IR\_MNT\_LIST	& マウント辞書一覧 \\
    RkBgnBun	       & IR\_CONVERT	& 変換 \\	
    RkEndBun	       & IR\_CONV\_END	& 変換終了 \\	
    RkGoTo	       & $-$		& カレント文節移動 \\
    RkLeft	       & $-$		& カレント文節移動 \\
    RkRight	       & $-$		& カレント文節移動 \\
    RkXfer	       & IR\_KAN\_LST	& カレント候補変更 \\
    RkNext	       & IR\_KAN\_LST	& カレント候補変更 \\
    RkPrev	       & IR\_KAN\_LST	& カレント候補変更 \\
    RkNfer	       & IR\_KAN\_LST	& カレント候補変更 \\
    RkResize	       & IR\_RESIZE	& 区切り変更 \\ 
    RkEnlarge	       & IR\_RESIZE	& 区切り変更 \\ 
    RkShorten	       & IR\_RESIZE	& 区切り変更 \\ 
    RkStoreYomi        & IR\_STO\_YOMI	& 読みがな変更 \\
    RkGetYomi	       & IR\_KAN\_LST	& 候補一覧 \\	
    RkGetKanji	       & IR\_KAN\_LST $/$ IR\_CONVERT & 候補一覧 \\
    RkGetKanjiList     & IR\_KAN\_LST	& 候補一覧 \\	
    RkGetStat	       & IR\_GET\_STA	& 解析情報 \\
    RkGetLex	       & IR\_GET\_LEX	& 形態素情報 \\
    RkDefineDic        & IR\_DEF\_DIC	& 単語登録 \\	
    RkDeleteDic        & IR\_UNDEF\_DIC & 単語削除 \\	
    \hline		
    \hline		
    RkListDic	       & IR\_LIST\_DIC & 辞書テーブル一覧 \\
    RkCreateDic        & IR\_CREAT\_DIC & 辞書作成 \\
    RkDestroyDic       & IR\_DEST\_DIC & 辞書削除  \\
    RkRenameDic        & IR\_RENAME\_DIC & 辞書名変更  \\
    RkGetWordTextDic   & IR\_GET\_WORD\_DIC & 単語情報取得 \\
    \hline		
\end{tabular}
%
\newpage
%
\section{その他}
以上，述べてきたプロトコルの他に『RKC』ライブラリには次のプロトコルが
ある。
\subsection{サーバ情報取得(Version 1.0対応)}
サーバに接続しているクライアント数などのサーバ情報を取得する。
\begin{enumerate}
    \item パケット
	\begin{itemize}
	    \item 要求パケット(\reqeServerInfo) \\
	    \begin{tabular}[t]{|c|c|c|}
		\hline
		フィールド & データ長 & 備考 \\
		\hline
		\hline
		IR\_SERVER\_STAT & 4 & \\
		\hline
	    \end{tabular}
	    \item 応答パケット(\repeServerInfo) \\
	    \begin{tabular}[t]{|c|c|c|}
		\hline
		フィールド & データ長 & 備考 \\
		\hline
		\hline
		プロトコルバージョン長 & 4 & \\
		プロトコルバージョン & 可変長 & 文字列 \\
		プロトコル数 & 4 & \\
		プロトコル使用頻度 & 4×プロトコル数 & \\
		クライアント数 & 4 & \\
		サーバが動作しているマシンの現在時刻 & 4 & 1970年1月1日 00:00:00GMT \\
		クライアント情報 & クライアント情報×クライアント数 & \\
		\hline
	    \end{tabular}
	\end{itemize}
\end{enumerate}
%
\newpage
%
\subsection{サーバ情報取得(Version 1.1以降)}
サーバに接続しているクライアント数などのサーバ情報を取得する。
\begin{enumerate}
    \item パケット
	\begin{itemize}
	    \item 要求パケット(\reqeServerInfoN) \\
	    \begin{tabular}[t]{|c|c|c|}
		\hline
		フィールド & データ長 & 備考 \\
		\hline
		\hline
		IR\_SER\_STAT2 & 4 & \\
		\hline
	    \end{tabular}
	    \item 応答パケット(\repeServerInfoN) \\
	    \begin{tabular}[t]{|c|c|c|}
		\hline
		フィールド & データ長 & 備考 \\
		\hline
		\hline
		プロトコルバージョン長 & 4 & \\
		プロトコルバージョン & 可変長 & 文字列 \\
		サーバが動作しているマシンの現在時刻 & 4 & 1970年1月1日 00:00:00GMTからの秒単位 \\
		プロトコル数 & 4 & 認識できるプロトコルの数 \\
		プロトコル名リスト長 & 4 & \\
		プロトコル名リスト & 可変長 & \\
		プロトコル使用頻度 & 4×プロトコル数 & \\
		接続しているクライアント数 & 4 & \\
		クライアント情報リスト長 & 4 & \\
		クライアント情報リスト & 可変長 & (情報長$+$情報)の繰り返し \\
		\hline
	    \end{tabular}

	    各クライアントの情報は以下の通りである。\\
	    \begin{tabular}[t]{|c|c|c|}
		\hline
		フィールド & データ長 & 備考 \\
		\hline
		\hline
		ソケット番号 & 4 & \\
		ユーザ管理番号 & 4 & \\
		ユーザ消費時間 & 4 & 秒単位 \\
		アイドル時間 & 4 & 秒単位 \\
		コネクト時間 & 4 & 秒単位 \\
		プロトコル使用頻度 & 4×プロトコル数 & \\
		ユーザ名長 & 4 & \\
		ユーザ名 & 可変長 & \\
		ホスト名長 & 4 & \\
		ホスト名 & 4 & \\
		コンテクスト管理フラグ長 & 4 & \\
		コンテクスト管理フラグ & 可変長 & \\
		\hline
	    \end{tabular}
	\end{itemize}
\end{enumerate}
%
\newpage
%
\subsection{サーバ使用許可}
サーバの使用許可の参照および設定を行う。
\begin{enumerate}
    \item パケット
	\begin{itemize}
	    \item 要求パケット(\reqeHosts) \\
	    \begin{tabular}[t]{|c|c|c|}
		\hline
		フィールド & データ長 & 備考 \\
		\hline
		\hline
		IR\_SER\_CTL & 4 & \\
		\hline
	    \end{tabular}
	    \item 応答パケット(\repeHosts) \\
	    参照時：\begin{tabular}[t]{|c|c|c|} 			
			\hline						
			フィールド & データ長 & 備考 \\ 		
			\hline						
			\hline						
			ホスト数 & 4 & エラー終了時$-1$ \\		
			ホスト名リスト長 & 4 & \\			
			ホスト名リスト & 可変長 & ホスト名長$+$ホスト
名$+$ユーザ名長$+$ユーザ名 \\	
			\hline						
		    \end{tabular}
	\end{itemize}
\end{enumerate}
%
\newpage
%
\subsection{拡張プロトコル問い合わせ}
接続しているサーバの拡張プロトコルを問い合わせる．
\begin{enumerate}
    \item パケット
	\begin{itemize}
	    \item 要求パケット(\reqeQueryExt) \\
	    \begin{tabular}[t]{|c|c|c|}
		\hline
		フィールド & データ長 & 備考 \\
		\hline
		\hline
		IR\_QUREY\_EXT & 4 & \\
		拡張プロトコルリスト長 & 4 & \\
		拡張プロトコルリスト & 可変長 & \\
		拡張プロトコル数 & 4 & \\
		\hline
	    \end{tabular}
	    \item 応答パケット(\repeQueryExt) \\
	    \begin{tabular}[t]{|c|c|c|}
		\hline
		フィールド & データ長 & 備考 \\
		\hline
		\hline
		終了状態 & 4 & エラー終了時$-1$ \\
		\hline
	    \end{tabular}
	\end{itemize}
\end{enumerate}
%
\newpage
%
\section{エラー時の処理}
\subsection{ライブラリ}
サーバとのコネクションが切れた場合には，errnoにEPIPEを設定して返す。 

\subsection{サーバ}
以下の様な場合に，クライアントとのコネクションを切断する。
\begin{enumerate}
    \item 不正なリクエストの要求があった場合。
    \item クライアントから送られてきたデータの読み込みに失敗した場合。
    \item クライアントにデータを送れなかった場合。
\end{enumerate}
\end{document}
