* Anthy Input ライブラリの使用方法の説明 *

 * 今からアプリケーションを書く場合にはuimの利用をお薦めします。

ライブラリのオプション	-lanthyinput -lanthy -lanthydic
インクルードファイル	anthy/anthy.h anthy/input.h
                          (anthy/anthy.h を先にインクルードすること)

* データ型の概説 *
anthy_input_config  ローマ字変換の設定などに用いる。
ライブラリのユーザは中身をみてはいけない。
anthy_input_context 入力のコンテキストを識別するために用いる。
ライブラリのユーザは中身をみてはいけない。
anthy_input_preedit ライブラリからプリエディットを得るときに用いられる。
プリエディット全体を表す。
anthy_input_segment ライブラリからプリエディットを得るときに用いられる。
候補を得るときにも用いられる。文節を表す。

char * エンコードにはEUC-JPを利用する。

* 関数の概説 *
初期化関数など
 anthy_input_init		ライブラリの初期化
 anthy_input_set_personality	パーソナリティの設定
コンテキストの管理
 anthy_input_create_context	入力コンテキストの作成
 anthy_input_free_context	入力コンテキストの解放
設定
 anthy_input_create_config	デフォルトの設定の作成
 anthy_input_free_config	デフォルトの設定の解放
 anthy_input_edit_toggle_config	英数との一時的トグルに使うキーの変更
 anthy_input_edit_rk_config	キーと文字の対応の変更
 anthy_input_clear_rk_config	キーと文字の対応をデフォルトに戻す
 anthy_input_change_config	設定の変更の通知
コンテキストの操作(直接的な操作)
 anthy_input_str		文字列の追加
 anthy_input_next_candidate	次の候補(選択中の文節に適用)
 anthy_input_prev_candidate	前の候補(選択中の文節に適用)
 anthy_input_quit		変換をキャンセル(1段階)
 anthy_input_erase_prev		カーソル前の文字を削除
 anthy_input_erase_next		カーソル後の文字を削除
 anthy_input_commit		確定
 anthy_input_move		カーソル、選択中文節を移動
 anthy_input_resize		選択中文節の長さを変更
 anthy_input_beginning_of_line  プリエディット先頭に移動
 anthy_input_end_of_line        プリエディット末尾に移動
 anthy_input_cut                文字列の切り取り
コンテキストの操作(キーに対応した動作)
 anthy_input_key		1文字の追加
 anthy_input_space		スペースまたは変換(コンテキスト依存)
コンテキストの操作(その他)
 anthy_input_get_state          現在の状態の取得
 anthy_input_get_preedit	プリエディットを得る
 anthy_input_map_select		ローマ字仮名変換マップの切替え
 anthy_input_get_selected_map   現在のローマ字仮名変換マップの取得
 anthy_input_get_candidate	候補番号を指定して候補を得る
 anthy_input_select_candidate	候補番号を指定して候補を選ぶ
 anthy_input_free_preedit	プリエディットの解放
					(属する文節構造体も同時に解放する)
 anthy_input_free_segment	文節の解放
設定の変更
 anthy_input_map_edit		ローマ字仮名変換マップの編集(未対応)

* 状態 *
 待機状態(1)     プリエディットは存在しない
 編集中状態(2)   ローマ字入力中の状態。
                 カーソル位置の文節に文字列がない。
                 選択中文節はカーソル位置の文節を指している。
 変換中状態(3)   変換中の状態。
 文節伸縮状態(4) 文節伸縮中の状態。
                 選択中文節以降はすべて平仮名になる。
                 選択中文節より後ろは全てまとめて一文節になる。

* 各関数の説明 *
 int anthy_input_init(void);
 引数: 無し
 返り値: 0 なら成功 -1 なら失敗
 ライブラリを初期化する。anthyライブラリも初期化する。

 struct anthy_input_config* anthy_input_create_config(void);
 引数: 無し
 返り値: 設定構造体のポインタ
 設定構造体を得る。設定構造体はデフォルト値で初期化されている。

 void anthy_input_free_config(struct anthy_input_config* cfg);
 引数: 設定構造体のポインタ
 返り値: 無し
 設定構造体を解放する。この設定を共有する全ての入力コンテキ
 ストを事前に解放する事。

 anthy_input_set_personality(char *personality);
 引数: personality パーソナリティの名前
 返り値: 無し

 struct anthy_input_context* 
 anthy_input_create_context(struct anthy_input_config* cfg);
 引数: cfg 設定構造体のポインタ
 返り値: 入力コンテキストのポインタ
 入力コンテキストのポインタを得る。引数に与えた設定構造体に
 適用した操作は、入力コンテキストを作った後にでも、すぐに入
 力コンテキストに反映される。
 コンテキストは待機状態で作成される。

 void anthy_input_free_context(struct anthy_input_context* ictx);
 引数: ictx 入力コンテキスト
 返り値: なし
 入力コンテキストを解放する。

 void anthy_input_str(struct anthy_input_context* ictx, char* str);
 引数: ictx コンテキスト構造体
       str 追加する文字列
 返り値: 無し
 追加する文字列はローマ字(半角)で入力する。
 待機状態と編集中状態ではプリエディットに文字列を追加する。
 変換中状態と文節伸縮状態ではプリエディットをその状態で確定して、
 新たにstrだけを持つプリエディットを作る。
 呼出後は編集中状態になる。

 void anthy_input_next_candidate(struct anthy_input_context* ictx);
 引数: ictx コンテキスト構造体
 返り値: 無し
 編集中状態では全文節を変換し、変換中状態にはいる。
 変換中状態では選択中文節の候補を次の候補にする。
 文節伸縮状態では選択中文節以降を変換し、変換中状態に入る。

 void anthy_input_prev_candidate(struct anthy_input_context* ictx);
 引数: ictx コンテキスト構造体
 返り値: 無し
 編集中状態では全文節を変換し、変換中状態にはいる。
 変換中状態では選択中文節の候補を前の候補にする。
 文節伸縮状態では選択中文節以降を変換し、変換中状態に入る。

 void anthy_input_quit(struct anthy_input_context* ictx);
 引数: ictx コンテキスト構造体
 返り値: 無し
 編集中状態では待機状態になる。
 編集中状態と文節伸縮状態では編集中状態になる。

 void anthy_input_erase_prev(struct anthy_input_context* ictx);
 引数: ictx コンテキスト構造体
 返り値: 無し
 編集中状態だけで有効。
 カーソルの前1文字を消す。
 消した結果プリエディットがなくなれば、待機状態になる。

 void anthy_input_erase_next(struct anthy_input_context* ictx);
 引数: ictx コンテキスト構造体
 返り値: 無し
 編集中状態だけで有効。
 カーソルの後1文字を消す。
 消した結果プリエディットがなくなれば、待機状態になる。

 void anthy_input_commit(struct anthy_input_context* ictx);
 引数: ictx コンテキスト構造体
 返り値: 無し
 現在のプリエディットの状態で確定する。
 待機状態に戻る。

 void anthy_input_move(struct anthy_input_context* ictx, int lr);
 引数: ictx コンテキスト構造体
       lr 移動方向
 返り値: 無し
 編集中状態ではカーソルを移動する。
 変換中状態では選択文節を移動する。
 文節伸縮状態では変換中状態に戻り、選択文節を移動する。
 lr = -1 で左移動、 lr = 1 で右移動。

 void anthy_input_resize(struct anthy_input_context* ictx, int lr);
 引数: ictx コンテキスト構造体
       lr 伸縮方向
 返り値: 無し
 変換中状態では選択文節を伸縮させ、文節伸縮状態になる。
 文節伸縮状態では選択文節を伸縮する。
 lr = -1 で縮小、 lr = 1 で伸長。

 void anthy_input_beginning_of_line(struct anthy_input_context* ictx);
 引数: ictx コンテキスト構造体
 返り値: 無し
 編集中状態だけで有効。
 カーソルをプリエディットの先頭に移動させる。
 
 void anthy_input_end_of_line(struct anthy_input_context* ictx);
 引数: ictx コンテキスト構造体
 返り値: 無し
 編集中状態だけで有効。
 カーソルをプリエディットの末尾に移動させる。
 
 void anthy_input_cut(struct anthy_input_context* ictx);
 引数: ictx コンテキスト構造体
 返り値: 無し
 編集中状態だけで有効。
 カーソル以降の文字列を消す。消した文字列は記憶している。

 void anthy_input_str(struct anthy_input_context* ictx, char c);
 引数: ictx コンテキスト構造体
       c 追加する文字
 返り値: 無し
 anthy_input_key とほぼ同じ。ただし、 1 文字だけ追加する。

 void anthy_input_space(struct anthy_input_context* ictx);
 引数: ictx コンテキスト構造体
 返り値: 無し
 コンテキストに応じて空白の追加、変換のどちらかになる。

 struct anthy_input_preedit*
 anthy_input_get_preedit(struct anthy_input_context* ictx);
 引数: ictx コンテキスト構造体
 返り値: 現在のプリエディット
 現在のプリエディットを得る。得たプリエディットを書き換えてはいけない。
 プリエディットの中身は後述。

 int anthy_input_map_select(struct anthy_input_context* ictx, int map);
 引数: ictx コンテキスト構造体
       map マップ番号
 返り値: 成功 0 失敗 それ以外
 ローマ字からの変換マップを変更する。 map に指定できるのは以下の定数
   MAP_HIRAGANA  ひらがな
   MAP_KATAKANA  かたかな
   MAP_ALPHABET  アルファベット
   MAP_WALPHABET 全角アルファベット

 struct anthy_input_segment* 
 anthy_input_get_candidate(struct anthy_input_context* ictx, int cand_no);
 引数: ictx コンテキスト構造体
       cand_no 候補番号
 返り値: 目的の候補を含んだ文節構造体
 変換中状態でだけ有効。
 選択中文節の指定した番号の候補を得る。
 次に anthy_input_get_candidate でプリエディットを要求した時は、 cand_no
 の次の候補が返される。

 int anthy_input_select_candidate(struct anthy_input_context* ictx, int cand);
 引数: ictx コンテキスト構造体
       cand_no 候補番号
 返り値: 成功 0 失敗 それ以外
 変換中状態でだけ有効。
 選択中文節の指定した番号の候補を選択し、選択中文節を右の文節に移動させる。

 void anthy_input_free_preedit(struct anthy_input_preedit* pedit);
 引数: pedit プリエディット構造体
 返り値: 無し
 プリエディット構造体を解放する。

 void anthy_input_free_segment(struct anthy_input_segment* cand);
 引数: cand 文節構造体。
 返り値: 無し
 文節構造体を解放する。

* データ型の説明 *
struct anthy_input_preedit {
  int state;                                      /* 状態 */

  char* commit;                                   /* 確定文字列 */
  char* cut_buf;                                  /* 切り取った文字列 */

  struct anthy_input_segment* segment;            /* 文節リスト */
  struct anthy_input_segment* cur_segment;        /* 選択中の文節 */
};

 state: 現在の状態
             ST_NONE 待機状態
             ST_EDIT 編集中状態
             ST_CONV 変換中状態
             ST_CSEG 文節伸縮状態
 commit: NULL でなければ、確定された文字列が入っている。
         commit は一度 anthy_input_get_preedit すると消える。
 cut_buf: NULL でなければ、 anthy_input_cut により消された文字列が入っている。
          cut_buf は一度 anthy_input_get_preedit すると消える。
 segment: 変換中、文節伸縮状態では文節のリスト
          編集中状態では、カーソル前文字列、ローマ字文字列、空文節、
          カーソル後文字列のリスト
 cur_segment: カーソルのある文節

struct anthy_input_segment {
  char* str;                            /* 文字列 */
  int cand_no;                          /* 候補番号 */
  int noconv_len;                       /* 無変換状態でのバイト数 */
  int nr_cand;                          /* 候補数 */
  int flag;                             /* フラグ */

  struct anthy_input_segment* next;     /* 次の文節 */
};
 str: 現在の候補の文字列
      (編集中状態の、カーソルを表す文節では NULL になっている)
 cand_no: 候補番号 (0 〜 nr_cand - 1, 
                    候補の割り当てられた文節でないときと無変換候補のときは -1)
 noconv_len: 無変換状態での文節の文字列の長さ (バイト数)
 nr_cand: 全候補数 (候補の割り当てられた文節でないときは -1)
 flag: 文節の種類を表すフラグ
           SF_CURSOR       カーソルまたは選択中文節
           SF_ENUM         数回連続で変換キーが押されるなどしたので、
                           候補一覧を表示することをライブラリが提案している。
                           これを受け取ると、 anthy_input_get_candidate
                           を使って候補一覧を表示するのが望ましい。
           SF_ENUM_REVERSE 逆方向の候補一覧を表示することをライブラリが
                           提案している
           SF_EDITTING     編集中状態の文字列
           SF_PENDING      まだローマ字のままで、仮名にもなっていない文字列
           SF_FOLLOWING    文節伸縮状態で、選択中文節より後ろの文字列
                           を 1 文節にした文節
