1 /*
2 * $Id: select_ele.c,v 1.2 2001/06/14 18:16:17 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 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 #include <stdio.h>
43 #include "commonhd.h"
44 #include "sdefine.h"
45 #ifdef XJUTIL
46 #include "xjutil.h"
47 #include "sxheader.h"
48 #include "xext.h"
49 #else /* XJUTIL */
50 #include "xim.h"
51 #include "sheader.h"
52 #include "ext.h"
53 #endif /* XJUTIL */
54
55 static int kosuu; /* kosuu of elements */
56
57 static int
change_decimal(c1)58 change_decimal (c1)
59 int c1;
60 {
61 if (c1 >= '0' && c1 <= '9')
62 return (c1 - '0');
63 if (c1 >= 'A' && c1 <= 'Z')
64 return (c1 - 'A' + 10);
65 if (c1 >= 'a' && c1 <= 'z')
66 return (c1 - 'a' + 10);
67 return (-1);
68 }
69
70 #define IsJIKOUHO(mode) (mode & (JIS_IN|KUTEN_IN|JIKOUHO))
71 #ifdef XJUTIL
72 #define SEL_RET (xjutil->sel_ret)
73 #else /* XJUTIL */
74 #define SEL_RET (xim->sel_ret)
75 #endif /* XJUTIL */
76 int
xw_select_one_element(c,kosuu1,init,title,mode,key_tbl,in)77 xw_select_one_element (c, kosuu1, init, title, mode, key_tbl, in)
78 char **c;
79 int kosuu1;
80 int init;
81 char *title;
82 int mode;
83 int (**key_tbl) ();
84 int in;
85 {
86 static int d;
87 int c1;
88 int ret;
89 #ifndef XJUTIL
90 static WnnClientRec *c_c_sv = 0;
91 #endif /* !XJUTIL */
92 static int select_step = 0;
93
94 #ifndef XJUTIL
95 if (in == -99)
96 {
97 end_ichiran ();
98 SEL_RET = -1;
99 select_step = 0;
100 ret = -1;
101 goto RET;
102 }
103 if (c_c_sv != 0 && c_c != c_c_sv)
104 {
105 ring_bell ();
106 return (-1);
107 }
108 #endif /* !XJUTIL */
109 if (select_step == 0)
110 {
111 kosuu = kosuu1;
112 if (init_ichiran ((unsigned char **) c, kosuu1, init, (unsigned char *) title, (unsigned char *) "", (unsigned char *) "", NULL, 0, mode) == -1)
113 {
114 ring_bell ();
115 return (-1);
116 }
117 #ifndef XJUTIL
118 c_c_sv = c_c;
119 #endif /* !XJUTIL */
120 select_step++;
121 return (BUFFER_IN_CONT);
122 }
123 c1 = in;
124 #ifdef XJUTIL
125 if (!cur_root->ichi->map)
126 return (BUFFER_IN_CONT);
127 #else /* XJUTIL */
128 if (!xim->cur_j_c_root->ichi->map)
129 return (BUFFER_IN_CONT);
130 #endif /* XJUTIL */
131 if (SEL_RET == -1)
132 {
133 d = change_decimal (c1);
134 }
135 else if (SEL_RET == -2)
136 {
137 end_ichiran ();
138 SEL_RET = -1;
139 select_step = 0;
140 ret = -1;
141 goto RET;
142 }
143 else
144 {
145 /*
146 end_ichiran();
147 */
148 if (IsJIKOUHO (mode))
149 {
150 d = find_ji_hilite ();
151 }
152 else
153 {
154 d = find_hilite ();
155 }
156 SEL_RET = -1;
157 }
158 if (d >= 0 && d < kosuu)
159 {
160 end_ichiran ();
161 select_step = 0;
162 ret = d;
163 goto RET;
164 }
165 if ((c1 < 256) && (key_tbl[c1] != NULL))
166 {
167 if ((ret = (*key_tbl[c1]) ()) == 1)
168 {
169 if (IsJIKOUHO (mode))
170 {
171 d = find_ji_hilite ();
172 }
173 else
174 {
175 d = find_hilite ();
176 }
177 end_ichiran ();
178 select_step = 0;
179 ret = d;
180 goto RET;
181 }
182 else if (ret == -1)
183 {
184 end_ichiran ();
185 select_step = 0;
186 ret = -1;
187 goto RET;
188 }
189 else if (ret == -3)
190 {
191 ring_bell ();
192 }
193 }
194 return (BUFFER_IN_CONT);
195 RET:
196 #ifndef XJUTIL
197 c_c_sv = 0;
198 #endif /* !XJUTIL */
199 select_step = 0;
200 return (ret);
201 }
202
203 #ifdef nodef
204 int
xw_select_one_jikouho(c,kosuu1,init,title,mode,key_tbl,in)205 xw_select_one_jikouho (c, kosuu1, init, title, mode, key_tbl, in)
206 char **c;
207 int kosuu1;
208 int init;
209 char *title;
210 int mode;
211 int (**key_tbl) ();
212 int in;
213 {
214 int ret;
215 static int d, c1;
216 static WnnClientRec *c_c_sv = 0;
217 static int select_step = 0;
218
219 if (in == -99)
220 {
221 end_ichiran ();
222 SEL_RET = -1;
223 select_step = 0;
224 ret = -1;
225 goto RET;
226 }
227 if (c_c_sv != 0 && c_c != c_c_sv)
228 {
229 ring_bell ();
230 return (-1);
231 }
232 if (select_step == 0)
233 {
234 kosuu = kosuu1;
235 if (init_ichiran ((unsigned char **) c, kosuu1, init, (unsigned char *) title, (unsigned char *) "", (unsigned char *) "", NULL, 0, mode) == -1)
236 {
237 ring_bell ();
238 return (-1);
239 }
240 c_c_sv = c_c;
241 select_step++;
242 return (BUFFER_IN_CONT);
243 }
244 else
245 {
246 c1 = in;
247 if (!xim->cur_j_c_root->ichi->map)
248 return (BUFFER_IN_CONT);
249 if (xim->sel_ret == -2)
250 {
251 end_ichiran ();
252 xim->sel_ret = -1;
253 c_c_sv = 0;
254 select_step = 0;
255 return (-1);
256 }
257 else if (xim->sel_ret != -1)
258 {
259 d = find_ji_hilite ();
260 end_ichiran ();
261 xim->sel_ret = -1;
262 c_c_sv = 0;
263 select_step = 0;
264 return (d);
265 }
266 else if ((c1 < 256) && (key_tbl[c1] != NULL))
267 {
268 if ((ret = (*key_tbl[c1]) ()) == 1)
269 {
270 d = find_ji_hilite ();
271 end_ichiran ();
272 c_c_sv = 0;
273 select_step = 0;
274 return (d);
275 }
276 else if (ret == -1)
277 {
278 end_ichiran ();
279 c_c_sv = 0;
280 select_step = 0;
281 return (-1);
282 }
283 else if (ret == -3)
284 {
285 ring_bell ();
286 return (BUFFER_IN_CONT);
287 }
288 else
289 {
290 return (BUFFER_IN_CONT);
291 }
292 }
293 else
294 {
295 ring_bell ();
296 return (BUFFER_IN_CONT);
297 }
298 }
299 }
300 #endif
301
302
303 #ifndef XJUTIL
304 static void
display_all()305 display_all ()
306 {
307 redraw_ichi_w ();
308 }
309 #endif
310
311 int
forward_select()312 forward_select ()
313 {
314 xw_forward_select ();
315 return (0);
316 }
317
318 int
backward_select()319 backward_select ()
320 {
321 xw_backward_select ();
322 return (0);
323 }
324
325 int
lineend_select()326 lineend_select ()
327 {
328 xw_lineend_select ();
329 return (0);
330 }
331
332 int
linestart_select()333 linestart_select ()
334 {
335 xw_linestart_select ();
336 return (0);
337 }
338
339 int
select_select()340 select_select ()
341 {
342 return (1); /* return mm from upper function */
343 }
344
345 int
quit_select()346 quit_select ()
347 {
348 return (-1);
349 }
350
351 int
previous_select()352 previous_select ()
353 {
354 xw_previous_select ();
355 return (0);
356 }
357
358 int
next_select()359 next_select ()
360 {
361 xw_next_select ();
362 return (0);
363 }
364
365 #ifndef XJUTIL
366 int
redraw_select()367 redraw_select ()
368 {
369 display_all ();
370 return (0);
371 }
372 #endif /* !XJUTIL */
373
374 /*
375 Local Variables:
376 eval: (setq kanji-flag t)
377 eval: (setq kanji-fileio-code 0)
378 eval: (mode-line-kanji-code-update)
379 End:
380 */
381