Mercurial > freewnn
comparison Xwnmo/xwnmo/kuten.c @ 0:bbc77ca4def5
initial import
author | Yoshiki Yazawa <yaz@cc.rim.or.jp> |
---|---|
date | Thu, 13 Dec 2007 04:30:14 +0900 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:bbc77ca4def5 |
---|---|
1 /* | |
2 * $Id: kuten.c,v 1.2 2001/06/14 18:16:16 ura Exp $ | |
3 */ | |
4 | |
5 /* | |
6 * FreeWnn is a network-extensible Kana-to-Kanji conversion system. | |
7 * This file is part of FreeWnn. | |
8 * | |
9 * Copyright Kyoto University Research Institute for Mathematical Sciences | |
10 * 1987, 1988, 1989, 1990, 1991, 1992 | |
11 * Copyright OMRON Corporation. 1987, 1988, 1989, 1990, 1991, 1992, 1999 | |
12 * Copyright ASTEC, Inc. 1987, 1988, 1989, 1990, 1991, 1992 | |
13 * Copyright 1991, 1992 by Massachusetts Institute of Technology | |
14 * | |
15 * Author: OMRON SOFTWARE Co., Ltd. <freewnn@rd.kyoto.omronsoft.co.jp> | |
16 * | |
17 * This program is free software; you can redistribute it and/or modify | |
18 * it under the terms of the GNU General Public License as published by | |
19 * the Free Software Foundation; either version 2, or (at your option) | |
20 * any later version. | |
21 * | |
22 * This program is distributed in the hope that it will be useful, | |
23 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
24 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
25 * GNU General Public License for more details. | |
26 * | |
27 * You should have received a copy of the GNU General Public License | |
28 * along with GNU Emacs; see the file COPYING. If not, write to the | |
29 * Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | |
30 * | |
31 * Commentary: | |
32 * | |
33 * Change log: | |
34 * | |
35 * Last modified date: 8,Feb.1999 | |
36 * | |
37 * Code: | |
38 * | |
39 */ | |
40 /* Version 4.0 | |
41 */ | |
42 /* | |
43 ** programs for KUTEN NYUURYOKU | |
44 */ | |
45 | |
46 #include <stdio.h> | |
47 #include "commonhd.h" | |
48 #include "sdefine.h" | |
49 #ifdef XJUTIL | |
50 #include "xjutil.h" | |
51 #include "sxheader.h" | |
52 #include "xext.h" | |
53 #else /* XJUTIL */ | |
54 #include "xim.h" | |
55 #include "sheader.h" | |
56 #include "ext.h" | |
57 #endif /* XJUTIL */ | |
58 | |
59 #define MAX_TEN_LENGTH 94 | |
60 | |
61 #define RING(ret) {ring_bell(); return(ret);} | |
62 #ifdef XJUTIL | |
63 #define MES0_NUM 117 | |
64 #define MES1_NUM 115 | |
65 #define MES2_NUM 116 | |
66 #define MES3_NUM 8 | |
67 #define SEL_RET (xjutil->sel_ret) | |
68 #else /* XJUTIL */ | |
69 #define MES0_NUM 26 | |
70 #define MES1_NUM 24 | |
71 #define MES2_NUM 25 | |
72 #define MES3_NUM 19 | |
73 #define SEL_RET (xim->sel_ret) | |
74 #endif /* XJUTIL */ | |
75 | |
76 static int | |
77 get_ichiran (ku, in, multi, cs, lang) | |
78 int ku; | |
79 int in; | |
80 int multi, cs; | |
81 char *lang; | |
82 { | |
83 static char buf[1024]; | |
84 static char *buf_ptr[MAX_TEN_LENGTH]; | |
85 static int i; | |
86 static char *c; | |
87 static char kuten_title[32]; | |
88 static int kuten_ichi_step = 0; | |
89 static w_char code[2]; | |
90 | |
91 if (kuten_ichi_step == 0) | |
92 { | |
93 code[1] = (w_char) 0; | |
94 for (i = 0, c = buf; i < MAX_TEN_LENGTH; i++) | |
95 { | |
96 code[0] = (((ku + 32) << 8) | ((i + 1) + 32)) & 0x7f7f; | |
97 code[0] |= get_cs_mask (cs); | |
98 buf_ptr[i] = c; | |
99 c += sStrcpy (c, code) + 1; | |
100 } | |
101 if (multi > 1) | |
102 { | |
103 sprintf (kuten_title, "%s %d.%2d %s", msg_get (cd, MES1_NUM, default_message[MES1_NUM], lang), cs, ku, msg_get (cd, MES0_NUM, default_message[MES0_NUM], lang)); | |
104 } | |
105 else | |
106 { | |
107 sprintf (kuten_title, "%s %2d %s", msg_get (cd, MES1_NUM, default_message[MES1_NUM], lang), ku, msg_get (cd, MES0_NUM, default_message[MES0_NUM], lang)); | |
108 } | |
109 kuten_ichi_step++; | |
110 } | |
111 if ((i = xw_select_one_element (buf_ptr, MAX_TEN_LENGTH, 0, kuten_title, KUTEN_IN, main_table[4], in)) == -1) | |
112 { | |
113 kuten_ichi_step = 0; | |
114 return (-1); | |
115 } | |
116 else if (i == BUFFER_IN_CONT) | |
117 { | |
118 return (BUFFER_IN_CONT); | |
119 } | |
120 kuten_ichi_step = 0; | |
121 code[0] = ((((ku + 32) << 8) | ((i + 1) + 32)) & 0x7f7f) | get_cs_mask (cs); | |
122 return ((int) code[0]); | |
123 } | |
124 | |
125 int | |
126 in_kuten (in) /* returns code for a moji */ | |
127 int in; | |
128 { | |
129 static char buffer[7]; | |
130 static int code; | |
131 static int c_p = 0; | |
132 static int ret1, ret2; | |
133 static int mode = -1, mode1 = -1; | |
134 #ifndef XJUTIL | |
135 static WnnClientRec *c_c_sv = 0; | |
136 #endif /* !XJUTIL */ | |
137 static int kuten_step = 0; | |
138 static char *lang; | |
139 static int cs = 0, valid_cs[3], multi, os = 0; | |
140 register int i, k; | |
141 register char t_c, *start_p; | |
142 unsigned char c; | |
143 | |
144 #ifndef XJUTIL | |
145 if (in == -99) | |
146 { | |
147 end_ichiran (); | |
148 code = -1; | |
149 goto LAST; | |
150 } | |
151 if (c_c_sv != 0 && c_c != c_c_sv) | |
152 { | |
153 RING (-1); | |
154 } | |
155 #endif /* !XJUTIL */ | |
156 if (kuten_step == 0) | |
157 { | |
158 #ifdef XJUTIL | |
159 set_cswidth (xjutil->cswidth_id); | |
160 lang = xjutil->lang; | |
161 #else /* XJUTIL */ | |
162 set_cswidth (cur_lang->cswidth_id); | |
163 lang = cur_lang->lang; | |
164 c_c_sv = c_c; | |
165 #endif /* !XJUTIL */ | |
166 for (multi = 0, i = 0; i < 3; i++) | |
167 { | |
168 multi += valid_cs[i] = (get_cswidth (i) == 2) ? 1 : 0; | |
169 if (valid_cs[i]) | |
170 cs = i; | |
171 } | |
172 if (multi <= 0) | |
173 { | |
174 RING (-1); | |
175 } | |
176 if (multi > 1) | |
177 { | |
178 os = 2; | |
179 } | |
180 else | |
181 { | |
182 os = 0; | |
183 } | |
184 for (k = 0; k < os + 5; buffer[k++] = ' '); | |
185 buffer[os + 5] = '\0'; | |
186 c_p = 0; | |
187 mode = mode1 = -1; | |
188 kuten_step++; | |
189 } | |
190 | |
191 start: | |
192 if (kuten_step == 1) | |
193 { | |
194 if (init_ichiran ((unsigned char **) NULL, 0, -1, | |
195 (unsigned char *) msg_get (cd, MES1_NUM, default_message[MES1_NUM], lang), | |
196 (unsigned char *) msg_get (cd, MES2_NUM, default_message[MES2_NUM], lang), | |
197 (unsigned char *) msg_get (cd, MES3_NUM, default_message[MES3_NUM], lang), NULL, os + 5, NYUURYOKU) == -1) | |
198 { | |
199 #ifndef XJUTIL | |
200 c_c_sv = 0; | |
201 #endif /* !XJUTIL */ | |
202 RING (-1); | |
203 } | |
204 draw_nyuu_w ((unsigned char *) buffer, 1); | |
205 kuten_step++; | |
206 return (BUFFER_IN_CONT); | |
207 } | |
208 if (kuten_step == 2) | |
209 { | |
210 c = (unsigned char) (in & 0xff); | |
211 #ifdef XJUTIL | |
212 if (!cur_root->ichi->map) | |
213 return (BUFFER_IN_CONT); | |
214 #else /* XJUTIL */ | |
215 if (!xim->cur_j_c_root->ichi->map) | |
216 return (BUFFER_IN_CONT); | |
217 #endif /* XJUTIL */ | |
218 if (SEL_RET == -2) | |
219 { | |
220 end_ichiran (); | |
221 SEL_RET = -1; | |
222 code = -1; | |
223 goto LAST; | |
224 } | |
225 if ((c == ESC) || (t_quit == main_table[5][c])) | |
226 { | |
227 end_ichiran (); | |
228 code = -1; | |
229 goto LAST; | |
230 #ifndef XJUTIL | |
231 } | |
232 else if (henkan_off == main_table[5][c]) | |
233 { | |
234 RING (BUFFER_IN_CONT); | |
235 #endif /* !XJUTIL */ | |
236 } | |
237 if ((c <= '9' && c >= '0') || c == '.') | |
238 { | |
239 if (os > 0) | |
240 { | |
241 if (mode >= 0) | |
242 { | |
243 if (mode1 >= 0) | |
244 { | |
245 if ((c_p - mode1) <= 2 && c != '.') | |
246 { | |
247 buffer[c_p++] = (char) c; | |
248 goto RET; | |
249 } | |
250 } | |
251 else | |
252 { | |
253 t_c = buffer[0]; | |
254 if ((c_p - mode) <= 4 && c != '.') | |
255 { | |
256 buffer[c_p++] = c; | |
257 goto RET; | |
258 } | |
259 else if (mode == 1 && t_c >= '0' && t_c <= '2' && valid_cs[t_c - '0'] && (c_p - mode) <= 3 && (c_p - mode) >= 2 && c == '.') | |
260 { | |
261 mode1 = c_p; | |
262 buffer[c_p++] = c; | |
263 goto RET; | |
264 } | |
265 } | |
266 RING (BUFFER_IN_CONT); | |
267 } | |
268 else | |
269 { | |
270 if (c == '.') | |
271 { | |
272 if (c_p > 0 && c_p <= 2) | |
273 { | |
274 mode = c_p; | |
275 buffer[c_p++] = c; | |
276 goto RET; | |
277 } | |
278 } | |
279 else | |
280 { | |
281 if (c_p < 4) | |
282 { | |
283 buffer[c_p++] = c; | |
284 goto RET; | |
285 } | |
286 } | |
287 RING (BUFFER_IN_CONT); | |
288 } | |
289 } | |
290 else | |
291 { | |
292 if (c == '.') | |
293 { | |
294 if ((mode == -1) && 0 < c_p && c_p <= 2) | |
295 { | |
296 mode = c_p; | |
297 buffer[c_p++] = c; | |
298 goto RET; | |
299 } | |
300 } | |
301 else | |
302 { | |
303 if ((mode >= 0 ? (c_p - mode) <= 2 : c_p < 4)) | |
304 { | |
305 buffer[c_p++] = c; | |
306 goto RET; | |
307 } | |
308 } | |
309 RING (BUFFER_IN_CONT); | |
310 } | |
311 } | |
312 else if (c == rubout_code && c_p) | |
313 { | |
314 if (os > 0) | |
315 { | |
316 if (mode1 >= 0 && buffer[c_p - 1] == '.') | |
317 { | |
318 mode1 = -1; | |
319 } | |
320 else if (mode >= 0 && buffer[c_p - 1] == '.') | |
321 { | |
322 mode = -1; | |
323 } | |
324 } | |
325 else | |
326 { | |
327 if (buffer[c_p - 1] == '.') | |
328 mode = -1; | |
329 } | |
330 buffer[--c_p] = ' '; | |
331 } | |
332 else if (c == rubout_code && c_p == 0) | |
333 { | |
334 end_ichiran (); | |
335 code = -1; | |
336 goto LAST; | |
337 } | |
338 else if ((c == NEWLINE) || (c == CR)) | |
339 { | |
340 if (os > 0) | |
341 { | |
342 if ((mode1 >= 0 && (buffer[c_p - 1] != '.')) || (mode1 == -1 && mode >= 0 && (c_p - mode) >= 2) || (mode == -1 && c_p >= 3)) | |
343 { | |
344 if (mode1 >= 0 || (mode == 1 && (c_p - mode) >= 4)) | |
345 { | |
346 cs = buffer[0] - '0'; | |
347 if (valid_cs[cs] == 0) | |
348 RING (BUFFER_IN_CONT); | |
349 start_p = &buffer[os]; | |
350 } | |
351 else | |
352 { | |
353 cs = 0; | |
354 start_p = buffer; | |
355 } | |
356 if ((!(sscanf (start_p, "%d.%d", &ret1, &ret2) == 2) && | |
357 !(((mode == -1) ? (c_p == 4) : (c_p == os + 4)) && | |
358 sscanf (start_p, "%2d%2d", &ret1, &ret2) == 2) && | |
359 !(((mode == -1) ? (c_p == 3) : (c_p == os + 3)) && sscanf (start_p, "%1d%2d", &ret1, &ret2) == 2)) || ret1 <= 0 || ret1 > 94 || ret2 <= 0 || ret2 > 94) | |
360 { | |
361 RING (BUFFER_IN_CONT); | |
362 } | |
363 code = (((ret1 + 32) << 8) | (ret2 + 32)) & 0x7f7f; | |
364 code |= get_cs_mask (cs); | |
365 end_ichiran (); | |
366 goto LAST; | |
367 } | |
368 else | |
369 { | |
370 if (mode1 >= 0 && (buffer[c_p - 1] == '.')) | |
371 { | |
372 if (sscanf (&buffer[os], "%d.", &ret1) != 1 || (ret1 <= 0 || ret1 > 94)) | |
373 { | |
374 RING (BUFFER_IN_CONT); | |
375 } | |
376 } | |
377 else if (mode == -1 && (c_p == 1 || c_p == 2)) | |
378 { | |
379 if (sscanf (&buffer[0], "%d", &ret1) != 1 || (ret1 <= 0 || ret1 > 94)) | |
380 { | |
381 RING (BUFFER_IN_CONT); | |
382 } | |
383 } | |
384 else | |
385 { | |
386 RING (BUFFER_IN_CONT); | |
387 } | |
388 end_ichiran (); | |
389 kuten_step++; | |
390 goto NEXT; | |
391 } | |
392 RING (BUFFER_IN_CONT); | |
393 } | |
394 else | |
395 { | |
396 if (c_p >= 3 && (buffer[c_p - 1] != '.')) | |
397 { | |
398 start_p = buffer; | |
399 if ((!(sscanf (start_p, "%d.%d", &ret1, &ret2) == 2) && | |
400 !((c_p == 4) && | |
401 sscanf (start_p, "%2d%2d", &ret1, &ret2) == 2) && !((c_p == 3) && sscanf (start_p, "%1d%2d", &ret1, &ret2) == 2)) || ret1 <= 0 || ret1 > 94 || ret2 <= 0 || ret2 > 94) | |
402 { | |
403 RING (BUFFER_IN_CONT); | |
404 } | |
405 code = (((ret1 + 32) << 8) | (ret2 + 32)) & 0x7f7f; | |
406 code |= get_cs_mask (cs); | |
407 end_ichiran (); | |
408 goto LAST; | |
409 } | |
410 else if (c_p <= 2 && mode == -1) | |
411 { | |
412 if (sscanf (buffer, "%d", &ret1) != 1 || (ret1 <= 0 || ret1 > 94)) | |
413 { | |
414 RING (BUFFER_IN_CONT); | |
415 } | |
416 end_ichiran (); | |
417 kuten_step++; | |
418 goto NEXT; | |
419 } | |
420 RING (BUFFER_IN_CONT); | |
421 } | |
422 } | |
423 RET: | |
424 draw_nyuu_w ((unsigned char *) buffer, 1); | |
425 return (BUFFER_IN_CONT); | |
426 } | |
427 NEXT: | |
428 if (kuten_step == 3) | |
429 { | |
430 if (os > 0) | |
431 { | |
432 if (mode1 >= 0) | |
433 { | |
434 cs = buffer[0] - '0'; | |
435 } | |
436 else | |
437 { | |
438 cs = 0; | |
439 } | |
440 } | |
441 if ((code = get_ichiran (ret1, in, multi, cs, lang)) == -1) | |
442 { | |
443 kuten_step = 0; | |
444 goto start; | |
445 } | |
446 else if (code == BUFFER_IN_CONT) | |
447 { | |
448 return (BUFFER_IN_CONT); | |
449 } | |
450 } | |
451 LAST: | |
452 #ifndef XJUTIL | |
453 c_c_sv = 0; | |
454 #endif /* !XJUTIL */ | |
455 kuten_step = 0; | |
456 return (code); | |
457 } | |
458 | |
459 #undef RING | |
460 | |
461 /* | |
462 Local Variables: | |
463 eval: (setq kanji-flag t) | |
464 eval: (setq kanji-fileio-code 0) | |
465 eval: (mode-line-kanji-code-update) | |
466 End: | |
467 */ |