/* # skkinput (Simple Kana-Kanji Input)
 * buffers.h
 * This file is part of skkinput.
 * Copyright (C) 1997
 * Takashi SAKAMOTO (sakamoto@yajima.kuis.kyoto-u.ac.jp)
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2, or (at your option)
 * any later version.
 * 
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License
 * along with skkinput; see the file COPYING.  If not, write to
 * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
 */
/*
 * Mule における buffer を作成するのに必要な定義・宣言をまとめたヘッダ
 * ファイル "buffers.h"
 */
#ifndef buffers_h
#define buffers_h

/*
 * 漢字コードまわりの設定ファイルを読み込む。
 */
#include "kanji.h"

/*
 * skkinput の内部状態について記述した定数です。
 */
#define J_HENKAN_MODE_OFF	(0)
#define J_HENKAN_OFF		(0)
#define J_KANA_MODE_OFF		(0)
#define J_OKURIGANA_OFF		(0)
#define J_HENKAN_MODE_ON	(1<<3)
#define J_HENKAN_ON		(1<<2)
#define J_KANA_MODE_ON		(1<<1)
#define J_OKURIGANA_ON		(1)
#define SKKINPUT_MAXKEYINPUT	(8)

/*
 * 新たな変数の型を用意する。まあ、構造体の定義てことですね。
 */
/* 辞書(skkserv)からの結果を格納する構造体..list */
typedef struct _SkkinpSearchVector {
	struct myChar text[ TEXTBUFSIZE ] ;
	int used ;
	struct _SkkinpSearchVector *next ;
} SkkinpSearchVector ;

/* 辞書から引いた結果を引きやすくするための構造体...index */
typedef struct _VectorIndex {
	SkkinpSearchVector *node ;	/* 現在の候補。*/
	int position ;
	int length ;		/* 候補の長さ。*/
	struct _VectorIndex *next ;	/* 次の候補。*/
	struct _VectorIndex *prev ;	/* 前の候補。*/
} VectorIndex ;

/* elisp にあるマーカー用の構造体。*/
struct Marker {
	int *pos ;
	int cf ;
} ;

/*
 * mule における buffer 一つに相当する構造体…御陰様で無茶苦茶大きくなっ
 * てしまいました。もう少し何とかならないか模索中です。差分描画してチ
 * ラつかないよ…というのは無駄かもしれないです。でも、mule はチラつか
 * ないし。
 */
struct SKKInputNode {
	/* int number ; */
	/*
	 * 差分描画に用いる部分。
	 */
	int prev_cx, prev_cy ;
	/* 前回のウィンドウの左上の最初の文字はテキストの何バイト目から書 *
	 * かれたのか。*/
	int prev_start_pos ;
	/*
	 * 入力の管理に用いられる部分。
	 */
	/* 送信用の文字列を格納するバッファ。*/
	struct myChar textbuffer[ TEXTBUFSIZE ] ;
	struct myChar mtextbuffer[ TEXTBUFSIZE ] ;
	/* 変換のための j-prefix … これが rom-kana-rule-list による状態遷 *
	 * 移における状態の表現になる。以前、この配列を作った時には管理でき*
	 * なくてやられてしまったけれど…今度はどうかな? */
	struct myChar j_prefix[ TEXTBUFSIZE ] ;
	/* 変換対象となる文字列を保管するバッファなのである。*/
	struct myChar j_henkan_key[ TEXTBUFSIZE ] ;
	struct myChar j_henkan_key2[ TEXTBUFSIZE ] ;
	struct myChar j_search_key[ TEXTBUFSIZE ] ;
	struct myChar j_num_list[ TEXTBUFSIZE ] ;
	
	/* (;_;) 配列だらけ…しどい…。*/
	
	/* カーソルの座標。*/
	int cur_pos, cur_pos2, cur_pos3, cur_pos4 ;
	int cur_pos_backup ;
	/* カーソルの移動可能な最小の値。*/
	int cur_pos_top ;
	/* マーク位置。*/
	int mark_pos ;
	/* カーソルがあるか否か。基本的にカーソルがある場所がキーを受けと *
	 * ることが出来る。*/
	int cur_exist ;
	/* 変換モードに移行しているかどうか。*/
	int j_henkan_mode ;
	/* 変換中か否か( つまりは、▼かどうか。)。*/
	int j_henkan_on ;
	/* 仮名入力中か否か。*/
	int j_kana_mode ;
	/* 送り仮名の入力中か否か。*/
	int j_okurigana_mode ;
	/* 仮名か片仮名か。*/
	int j_katakana_mode ;
	/* 仮名入力の開始位置。*/
	int j_kana_start_point ;
	/* 変換文字列の開始位置。*/
	int j_henkan_start_point ;
	/* 変換文字列の終了位置。*/
	int j_henkan_end_point ;
	/* 送り仮名の開始位置。*/
	int j_okurigana_start_point ;
	int j_okurigana_offset ;
	/* 送り仮名。*/
	struct myChar j_okuri_chara ;
	/* abbrev-mode かどうか。*/
	int j_abbrev ;
	/* 全角入力モードかどうか。*/
	int j_zenkaku ;
	/* 仮名入力モードかどうか。*/
	int j_mode ;
	
	/* 確定までに変換した回数。*/
	int j_henkan_count ;
	/* 変換動作候補列挙中か？ */
	int j_henkan_show_candidate_mode ;
	/* ミニバッファが何のために作られたのかという情報が入る。*/
	int j_minibuff_usage ;
	/* 直接文字入力モードであったことが記されている。*/
	int j_input_by_code_or_menu_mode ;
	int j_input_by_code_or_menu_point ;
	int j_input_by_code_current_code ;
	int j_input_by_code_current_charset ;
	/*
	 * Elisp にあるマーカーのための設定。
	 */
	/* 現在のマーカーの位置。*/
	struct Marker markers[ MAXMARKERNUM ] ;
	/* マーカーの使用状況。*/
	int marker_usage ;
	
	/* search に利用。*/
	SkkinpSearchVector *j_henkan_vector_top ;
	VectorIndex *j_henkan_vector_index_top, *j_current_henkan_vector_index ;
	int j_henkan_vector_index_length ;
	
	/* completion に利用。*/
	SkkinpSearchVector *j_completion_vector_top ;
	VectorIndex *j_completion_vector_index_top,
		*j_current_completion_vector_index ;
	int j_completion_mode ;
	
	/* mini-buffer に利用。*/
	struct SKKInputNode *minibuffer ;
	struct SKKInputNode *parentbuffer ;
} ;

struct SKKTangoInfo {
  int tangotype ;
  char *henkankey ;
  char *string ;
  VectorIndex *vector ;
  VectorIndex **vectortop ;
  int okuri ;
} ;

/*
 * ローマ字仮名変換規則。
 */
struct skk_rom_kana_rule {
  struct myChar *state ;
  struct myChar *next ;
  struct myChar *houtput ;
  struct myChar *koutput ;
} ;

/*
 *文字と文字列のペア(cons?)
 */
struct chara_string_pair {
  unsigned char chara ;
  unsigned char *string ;
} ;

#endif
