summaryrefslogtreecommitdiff
path: root/japanese/FreeWnn-server/files/patch-Wnn-conv-cvt_key.c
diff options
context:
space:
mode:
authorHiroki Sato <hrs@FreeBSD.org>2010-01-02 14:47:20 +0000
committerHiroki Sato <hrs@FreeBSD.org>2010-01-02 14:47:20 +0000
commit4b38031b7f2a6cc8fcf3ef57a907f00dcc2b5335 (patch)
treefb4d9f6e7af5bc43687100e12721b75ba27087b9 /japanese/FreeWnn-server/files/patch-Wnn-conv-cvt_key.c
parent- Update to 0.5.7 (diff)
- Improve buffer management. This change should fix issues on amd64.
- Fix daemonizing part. It now returns the exit status correctly. - Fix *_{pre,post}cmd handling in the rc.d scripts. Plus, wnntouch is now invoked just before running the server process. - Use ${*_WNNMANDIR} in Makefile to use the common patchset in both FreeWnn-server and -lib. - Integrate libtool22 change and regenerate patch files.
Notes
Notes: svn path=/head/; revision=246996
Diffstat (limited to 'japanese/FreeWnn-server/files/patch-Wnn-conv-cvt_key.c')
-rw-r--r--japanese/FreeWnn-server/files/patch-Wnn-conv-cvt_key.c322
1 files changed, 322 insertions, 0 deletions
diff --git a/japanese/FreeWnn-server/files/patch-Wnn-conv-cvt_key.c b/japanese/FreeWnn-server/files/patch-Wnn-conv-cvt_key.c
new file mode 100644
index 000000000000..f7f94e3bd27f
--- /dev/null
+++ b/japanese/FreeWnn-server/files/patch-Wnn-conv-cvt_key.c
@@ -0,0 +1,322 @@
+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));
++ }
++ }
+ }