Index: Wnn/conv/cvt_key.c
===================================================================
RCS file: /home/cvs/private/hrs/freewnn/Wnn/conv/cvt_key.c,v
retrieving revision 1.1.1.1
retrieving revision 1.2
diff -u -p -r1.1.1.1 -r1.2
--- Wnn/conv/cvt_key.c 20 Dec 2008 07:13:30 -0000 1.1.1.1
+++ Wnn/conv/cvt_key.c 20 Dec 2008 15:22:37 -0000 1.2
@@ -65,172 +65,165 @@
extern struct CONVCODE tbl[];
extern int cnv_tbl_cnt; /* convert table count */
-
- /** intの配列 h をビットベクタとみなし、第iビットをチェックあるいは立てる */
+/** intの配列 h をビットベクタとみなし、第iビットをチェックあるいは立てる */
#define BITONP(h, i) (h[i / BITSIZ] & (1 << (i % BITSIZ)))
#define BITOFP(h, i) (!BITONP(h, i))
#define BIT_UP(h, i) (h[i / BITSIZ] |= (1 << (i % BITSIZ)))
#define BITDWN(h, i) (h[i / BITSIZ] &= ~(1 << (i % BITSIZ)))
- /** 変換コードのチェックとコード変換 */
+/** 変換コードのチェックとコード変換 */
int
-key_check (inbuf, conv_tbl, tbl_cnt, check_flg)
- int inbuf[]; /* ソースストリング */
- struct CONVCODE conv_tbl[]; /* コード変換テーブル */
- int tbl_cnt;
- int check_flg[];
+key_check (int inbuf[], /* ソースストリング */
+ struct CONVCODE conv_tbl[], /* コード変換テーブル */
+ int tbl_cnt,
+ int check_flg[])
{
- int dist, base;
- char *code_p;
- int i;
-
- for (base = 0; inbuf[base] != -1; base++)
- {
- for (dist = 0; dist < tbl_cnt; dist++)
- {
- if (BITONP (check_flg, dist) && conv_tbl[dist].fromkey != 0)
- {
- code_p = conv_tbl[dist].fromkey + base;
- if (*code_p == (char) inbuf[base])
- {
- if (*(code_p + 1) == (char) 0)
- {
- /* マッチした */
- for (i = 0, base++; (inbuf[i] = inbuf[base]) != -1; i++, base++);
- return (conv_tbl[dist].tokey);
- }
- /* まだマッチしていない */
- }
- else
- {
- BITDWN (check_flg, dist); /* 無効 */
- }
- }
- }
- }
-
- /* ビットベクタ check_flg[] の第0〜tblcntビットに立ったまま残っている
- ものがあるか調べる。 */
- for (i = 0; i < tbl_cnt / BITSIZ; i++)
- {
- if (check_flg[i])
- return (-1);
- }
- if ((tbl_cnt %= BITSIZ) && (check_flg[i] & ~(~0 << tbl_cnt)))
- return (-1);
- /* return -1 … まだ未決定の物がある */
+ int dist, base;
+ char *code_p;
+ int i;
+
+ for (base = 0; inbuf[base] != -1; base++) {
+ for (dist = 0; dist < tbl_cnt; dist++) {
+ if (BITONP (check_flg, dist) && conv_tbl[dist].fromkey != 0) {
+ code_p = conv_tbl[dist].fromkey + base;
+
+ if (*code_p == (char) inbuf[base]) {
+ if (*(code_p + 1) == (char) 0) {
+ /* マッチした */
+ for (i = 0, base++; (inbuf[i] = inbuf[base]) != -1; i++, base++);
+ return (conv_tbl[dist].tokey);
+ }
+ /* まだマッチしていない */
+ } else {
+ /* 無効 */
+ BITDWN (check_flg, dist);
+ }
+ }
+ }
+ }
+
+ /* ビットベクタ check_flg[] の第0〜tblcntビットに立ったまま残っている
+ ものがあるか調べる。 */
+
+ for (i = 0; i < tbl_cnt / BITSIZ; i++) {
+ if (check_flg[i])
+ return (-1);
+ }
+
+ if ((tbl_cnt %= BITSIZ) && (check_flg[i] & ~(~0 << tbl_cnt)))
+ return (-1);
+ /* return -1 … まだ未決定の物がある */
- return (-2); /* 変換対象となる物はない */
+ /* 変換対象となる物はない */
+ return (-2);
}
- /** 指定された変換テーブルに従ってコード変換する。*/
+/** 指定された変換テーブルに従ってコード変換する。*/
int
-convert_key (inkey, conv_tbl, tbl_cnt, matching_flg, in_buf)
- int (*inkey) (); /* キー入力関数 */
- struct CONVCODE conv_tbl[]; /* 変換テーブル */
- int tbl_cnt; /* conv_tbl[] の個数 */
- int matching_flg; /* マッチングしなかったストリングの処理指定
- 0 : 返値として返す
- 1 : そのストリングは捨てる */
- char *in_buf;
+convert_key (int (*inkey)(), /* キー入力関数 */
+ struct CONVCODE conv_tbl[], /* 変換テーブル */
+ int tbl_cnt, /* conv_tbl[] の個数 */
+ int matching_flg, /* マッチングしなかったストリングの処理指定
+ 0 : 返値として返す
+ 1 : そのストリングは捨てる */
+ char *in_buf)
{
#define MAX 20 /* キー入力バッファの最大値 */
- static int inbuf[MAX]; /* キー入力バッファ */
- /* バッファの終端は、-1 で示される。 */
-
- int out_cnt; /* 出力バッファの出力カウント */
-
- static int buf_cnt = 0; /* inbuf の入力時のカウンタ */
-
- int check_flg[CHANGE_MAX];
- /* ビットベクタとして扱われ、マッチング時に対象となっているconv_tbl[]
- を示す。1の時対象となり、0で非対象 */
-
- int i, c, flg = 0; /* work */
-
- for (i = 0; i < div_up (tbl_cnt, BITSIZ); check_flg[i++] = ~0);
- /* 配列check_flgをビットベクタ扱いし、その第0〜tbl_cnt ビットを立てる。
- 但し、実際はその少し先まで立つ */
-
- for (;;)
- {
- if (flg != 0 || buf_cnt == 0)
- {
- inbuf[buf_cnt] = (*inkey) (); /* 一文字入力 */
- in_buf[buf_cnt] = (char) (inbuf[buf_cnt] & 0xff);
- if (inbuf[buf_cnt] == -1)
- {
- if (buf_cnt > 0)
- {
- c = -2; /* タイムアウト */
- goto LABEL;
- }
- else
- {
- continue;
- }
- }
- else
- {
- inbuf[++buf_cnt] = -1; /* ターミネータ */
- }
- }
- flg++;
-
- if (buf_cnt >= MAX - 1)
- {
- in_buf[0] = '\0';
- return (-1); /* ERROR */
- }
-
- c = key_check (inbuf, conv_tbl, tbl_cnt, check_flg);
- LABEL:
- switch (c)
- {
- case -1: /* 未決定 */
- continue;
-
- case -2: /* 変換対象でないことが決定した */
- buf_cnt--;
- out_cnt = 0;
- c = inbuf[out_cnt++];
- for (i = 0; inbuf[i] != -1; inbuf[i++] = inbuf[out_cnt++]);
- if (matching_flg != 0)
- {
- flg = 0;
- continue;
- }
- in_buf[0] = '\0';
- return (c);
-
- default: /* 変換されたコード */
- in_buf[buf_cnt] = '\0';
- buf_cnt = 0;
- return (c);
- }
- }
+ /* キー入力バッファ */
+ /* バッファの終端は、-1 で示される。 */
+ static int inbuf[MAX];
+
+ /* 出力バッファの出力カウント */
+ int out_cnt;
+
+ /* inbuf の入力時のカウンタ */
+ static int buf_cnt = 0;
+
+
+ /* ビットベクタとして扱われ、マッチング時に対象となっているconv_tbl[]
+ を示す。1の時対象となり、0で非対象 */
+ int check_flg[CHANGE_MAX];
+
+ /* work */
+ int i, c, flg = 0;
+
+ for (i = 0; i < div_up (tbl_cnt, BITSIZ); check_flg[i++] = ~0);
+ /* 配列check_flgをビットベクタ扱いし、その第0〜tbl_cnt ビットを立てる。
+ 但し、実際はその少し先まで立つ */
+
+ for (;;) {
+ if (flg != 0 || buf_cnt == 0) {
+ inbuf[buf_cnt] = (*inkey) (); /* 一文字入力 */
+ in_buf[buf_cnt] = (char) (inbuf[buf_cnt] & 0xff);
+ if (inbuf[buf_cnt] == -1) {
+ if (buf_cnt > 0) {
+ c = -2;
+ /* タイムアウト */
+ goto LABEL;
+ } else {
+ continue;
+ }
+ } else {
+ /* ターミネータ */
+ inbuf[++buf_cnt] = -1;
+ }
+ }
+ flg++;
+
+ if (buf_cnt >= MAX - 1) {
+ in_buf[0] = '\0';
+
+ /* ERROR */
+ return (-1);
+ }
+
+ c = key_check (inbuf, conv_tbl, tbl_cnt, check_flg);
+
+ LABEL:
+ switch (c) {
+ case -1:
+ /* 未決定 */
+ continue;
+
+ case -2:
+ /* 変換対象でないことが決定した */
+ buf_cnt--;
+ out_cnt = 0;
+ c = inbuf[out_cnt++];
+ for (i = 0; inbuf[i] != -1; inbuf[i++] = inbuf[out_cnt++]);
+
+ if (matching_flg != 0) {
+ flg = 0;
+ continue;
+ }
+
+ in_buf[0] = '\0';
+ return (c);
+
+ default:
+ /* 変換されたコード */
+ in_buf[buf_cnt] = '\0';
+ buf_cnt = 0;
+ return (c);
+ }
+ }
}
/** コード変換を伴うキー入力関数 */
int
-keyin1 (get_ch, in_buf)
- int (*get_ch) (); /* getchar() と同様の関数 */
- char *in_buf;
+keyin1(int (*get_ch)(), /* getchar() と同様の関数 */
+ char *in_buf)
{
- int ret;
+ int ret;
- for (;;)
- {
- if (cnv_tbl_cnt == 0)
- {
- ret = (*get_ch) ();
- if (ret >= 0)
- return (ret);
- }
- else
- {
- return (convert_key (get_ch, tbl, cnv_tbl_cnt, 0, in_buf));
- }
- }
+ for (;;) {
+ if (cnv_tbl_cnt == 0) {
+ ret = (*get_ch)();
+ if (ret >= 0)
+ return (ret);
+ } else {
+ return (convert_key(get_ch, tbl, cnv_tbl_cnt, 0, in_buf));
+ }
+ }
}