1 /*
2 * $Id: jikouho.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 #include <stdio.h>
43 #include "commonhd.h"
44 #include "sdefine.h"
45 #include "xim.h"
46 #include "sheader.h"
47 #include "ext.h"
48
49
50 /* add by KUWA */
51 int
dai_top(buf,bnst)52 dai_top (buf, bnst)
53 struct wnn_buf *buf;
54 int bnst;
55 {
56 if (bnst >= jl_bun_suu (buf))
57 return (jl_bun_suu (buf));
58 for (; bnst >= 0 && !jl_dai_top (buf, bnst); bnst--);
59 return (bnst);
60 }
61
62 int
dai_end(buf,bnst)63 dai_end (buf, bnst)
64 struct wnn_buf *buf;
65 int bnst;
66 {
67 for (bnst++; bnst < jl_bun_suu (buf) && !jl_dai_top (buf, bnst); bnst++);
68 return (bnst);
69 }
70
71 void
set_escape_code(x)72 set_escape_code (x)
73 char *x;
74 {
75 int m;
76 char buf[512];
77 char *tmp;
78
79 for (m = 0, tmp = x; *tmp; tmp++)
80 {
81 if (ESCAPE_CHAR ((*tmp & 0xff)))
82 {
83 buf[m++] = '^';
84 if (*tmp == 0x7f)
85 buf[m++] = '?';
86 else
87 buf[m++] = (*tmp + 'A' - 1);
88 }
89 else
90 {
91 buf[m++] = *tmp;
92 }
93 }
94 buf[m] = '\0';
95 strcpy (x, buf);
96 }
97
98 /* ��������Ĥ���ɽ������ؿ�
99 num = 1 �ΤȤ��������num = -1 �ΤȤ��������ɽ������ */
100 static int
jikouho(num)101 jikouho (num)
102 int num;
103 {
104 int tmp;
105 int mae_p;
106 /* ���ܤ��Ƥ���ʸ��μ����䤬�ޤ��Ѱդ���Ƥ��ʤ�����
107 �ޤ�������Ѱդ��롣 */
108 jl_env_set (bun_data_, bunsetsu_env[cur_bnst_]);
109 if (bunsetsu_env[cur_bnst_] == bunsetsu_env[cur_bnst_ + 1])
110 mae_p = WNN_USE_ZENGO;
111 else
112 mae_p = WNN_USE_MAE;
113 if (jl_zenkouho_bun (bun_data_) != cur_bnst_ || jl_zenkouho_daip (bun_data_))
114 {
115 if (jl_zenkouho (bun_data_, cur_bnst_, mae_p, WNN_UNIQ) < 0)
116 {
117 errorkeyin ();
118 return (-1);
119 }
120 }
121
122 if (num == 1)
123 jl_next (bun_data_);
124 else if (num == -1)
125 jl_previous (bun_data_);
126 else
127 return (-1);
128 make_kanji_buffer (cur_bnst_);
129
130 tmp = c_b->t_b_st;
131 c_b->t_m_start = bunsetsuend[cur_bnst_];
132 c_b->t_b_st = bunsetsu[dai_top (bun_data_, cur_bnst_)];
133 c_b->t_b_end = bunsetsuend[dai_end (bun_data_, cur_bnst_) - 1];
134 t_redraw_move (bunsetsu[cur_bnst_], MIN_VAL (tmp, c_b->t_b_st), c_b->maxlen, 1);
135 check_scroll ();
136 return (0);
137 }
138
139 /* ��������Ĥ���ɽ������ؿ�
140 num = 1 �ΤȤ��������num = -1 �ΤȤ��������ɽ������ */
141 static int
jikouho_dai(num)142 jikouho_dai (num)
143 int num;
144 {
145 int tmp;
146 int mae_p;
147 /* ���ܤ��Ƥ���ʸ��μ����䤬�ޤ��Ѱդ���Ƥ��ʤ�����
148 �ޤ�������Ѱդ��롣 */
149 jl_env_set (bun_data_, bunsetsu_env[cur_bnst_]);
150 if (bunsetsu_env[cur_bnst_] == bunsetsu_env[dai_end (bun_data_, cur_bnst_)])
151 mae_p = WNN_USE_ZENGO;
152 else
153 mae_p = WNN_USE_MAE;
154 if (jl_zenkouho_bun (bun_data_) != cur_bnst_ || !jl_zenkouho_daip (bun_data_))
155 {
156 if (jl_zenkouho_dai (bun_data_, cur_bnst_, dai_end (bun_data_, cur_bnst_), mae_p, WNN_UNIQ) < 0)
157 {
158 errorkeyin ();
159 return (-1);
160 }
161 }
162
163 if (num == 1)
164 jl_next_dai (bun_data_);
165 else if (num == -1)
166 jl_previous_dai (bun_data_);
167 else
168 return (-1);
169 make_kanji_buffer (cur_bnst_);
170 for (tmp = cur_bnst_ + 1; tmp < jl_bun_suu (bun_data_); tmp++)
171 bunsetsu_env[tmp] = jl_env_get (bun_data_);
172 tmp = c_b->t_b_st;
173 c_b->t_m_start = bunsetsuend[cur_bnst_];
174 c_b->t_b_st = bunsetsu[dai_top (bun_data_, cur_bnst_)];
175 c_b->t_b_end = bunsetsuend[dai_end (bun_data_, cur_bnst_) - 1];
176 t_redraw_move (bunsetsu[cur_bnst_], MIN_VAL (tmp, c_b->t_b_st), c_b->maxlen, 1);
177 check_scroll ();
178 return (0);
179 }
180
181
182
183 int
jikouho_c()184 jikouho_c ()
185 {
186 jikouho (1);
187 return (0);
188 }
189
190 int
zenkouho_c()191 zenkouho_c ()
192 {
193 jikouho (-1);
194 return (0);
195 }
196
197 int
jikouho_dai_c()198 jikouho_dai_c ()
199 {
200 jikouho_dai (1);
201 return (0);
202 }
203
204 int
zenkouho_dai_c()205 zenkouho_dai_c ()
206 {
207 jikouho_dai (-1);
208 return (0);
209 }
210
211 static int
make_jikouho_retu(h,h_m,r,r_m)212 make_jikouho_retu (h, h_m, r, r_m)
213 char *h;
214 int h_m;
215 int r_m;
216 char *r[];
217 {
218 int k;
219 char *c = h;
220 w_char tmp[512];
221 char tmp1[512];
222
223 if (r_m <= jl_zenkouho_suu (bun_data_))
224 return (-1);
225
226 for (k = 0; k < jl_zenkouho_suu (bun_data_); k++)
227 {
228 r[k] = c;
229 tmp[0] = 0;
230 jl_get_zenkouho_kanji (bun_data_, k, tmp);
231 if (print_out_func)
232 (*print_out_func) (tmp, tmp, Strlen (tmp));
233 delete_w_ss2 (tmp, Strlen (tmp));
234 sStrcpy (tmp1, tmp);
235 if (c + strlen (tmp1) + 1 >= h_m + h)
236 {
237 return (-1);
238 }
239 set_escape_code (tmp1); /* add by KUWA */
240 strcpy (c, tmp1);
241 c += strlen (tmp1) + 1;
242 }
243 return (0);
244 }
245
246 static int
select_jikouho1(daip,in)247 select_jikouho1 (daip, in)
248 int daip;
249 int in;
250 {
251 static char *j_retu[MAXJIKOUHO];
252 static char jikouho_heap[MAXJIKOUHO * 10];
253 int c;
254 int tmp;
255 static int jikouho_step = 0;
256 static WnnClientRec *c_c_sv = 0;
257 static char *lang;
258
259 if (c_c_sv != 0 && c_c != c_c_sv)
260 {
261 ring_bell ();
262 return (-1);
263 }
264 if (jikouho_step == 0)
265 {
266 jl_env_set (bun_data_, bunsetsu_env[cur_bnst_]);
267 if (jl_zenkouho_bun (bun_data_) != cur_bnst_ || jl_zenkouho_daip (bun_data_) != daip)
268 {
269 if (daip)
270 {
271 if (jl_zenkouho_dai (bun_data_, cur_bnst_, dai_end (bun_data_, cur_bnst_), WNN_USE_ZENGO, WNN_UNIQ) == -1)
272 {
273 errorkeyin ();
274 return (-1);
275 }
276 }
277 else
278 {
279 if (jl_zenkouho (bun_data_, cur_bnst_, WNN_USE_ZENGO, WNN_UNIQ) == -1)
280 {
281 errorkeyin ();
282 return (-1);
283 }
284 }
285 }
286 lang = cur_lang->lang;
287 if (make_jikouho_retu (jikouho_heap, MAXJIKOUHO * 10, j_retu, MAXJIKOUHO) == -1)
288 {
289 print_msg_getc ("%s", msg_get (cd, 3, default_message[3], lang), NULL, NULL);
290 return (-1);
291 }
292 c_c_sv = c_c;
293 jikouho_step++;
294 }
295
296 if ((c = xw_select_one_element (j_retu, jl_zenkouho_suu (bun_data_),
297 jl_c_zenkouho (bun_data_), (daip ? msg_get (cd, 2, default_message[2], lang) : msg_get (cd, 1, default_message[1], lang)), JIKOUHO, main_table[4], in)) == -1)
298 {
299 jikouho_step = 0;
300 c_c_sv = 0;
301 return (-1);
302 }
303 else if (c == BUFFER_IN_CONT)
304 {
305 return (BUFFER_IN_CONT);
306 }
307 if (daip == WNN_SHO)
308 {
309 jl_set_jikouho (bun_data_, c);
310 }
311 else
312 {
313 jl_set_jikouho_dai (bun_data_, c);
314 }
315 make_kanji_buffer (cur_bnst_);
316 for (tmp = cur_bnst_ + 1; tmp < jl_bun_suu (bun_data_); tmp++)
317 bunsetsu_env[tmp] = jl_env_get (bun_data_);
318 c_b->t_m_start = bunsetsuend[cur_bnst_];
319 c_b->t_c_p = bunsetsu[cur_bnst_];
320 c_b->t_b_st = bunsetsu[dai_top (bun_data_, cur_bnst_)];
321 c_b->t_b_end = bunsetsuend[dai_end (bun_data_, cur_bnst_) - 1];
322 jikouho_step = 0;
323 c_c_sv = 0;
324 return (0);
325 }
326
327 int
select_jikouho(in)328 select_jikouho (in)
329 int in;
330 {
331 int ret;
332 static WnnClientRec *c_c_sv = 0;
333
334 #ifdef CALLBACKS
335 if (IsPreeditCallbacks (cur_x) && cur_x->cb_redraw_needed)
336 {
337 redraw_line ();
338 c_c_sv = 0;
339 pop_func (c_c);
340 cur_x->cb_redraw_needed = 0;
341 return (0);
342 }
343 #endif /* CALLBACKS */
344 if (c_c_sv != 0 && c_c != c_c_sv)
345 {
346 ring_bell ();
347 return (0);
348 }
349 if (c_c_sv == 0)
350 {
351 c_c_sv = c_c;
352 push_func (c_c, select_jikouho);
353 }
354 if ((ret = select_jikouho1 (WNN_SHO, in)) == BUFFER_IN_CONT)
355 {
356 return (BUFFER_IN_CONT);
357 }
358 else if (ret == -1)
359 {
360 if (cur_p->cur_xl->visible == 3)
361 {
362 t_print_l ();
363 }
364 }
365 else
366 {
367 #ifdef CALLBACKS
368 if (IsPreeditCallbacks (cur_x))
369 {
370 cur_x->cb_redraw_needed = 1;
371 SendCBRedraw ();
372 return (BUFFER_IN_CONT);
373 }
374 else
375 {
376 #endif /* CALLBACKS */
377 kk_cursor_invisible ();
378 redraw_line ();
379 kk_cursor_normal ();
380 #ifdef CALLBACKS
381 }
382 #endif /* CALLBACKS */
383 }
384 c_c_sv = 0;
385 pop_func (c_c);
386 check_scroll ();
387 return (0);
388 }
389
390 int
select_jikouho_dai(in)391 select_jikouho_dai (in)
392 int in;
393 {
394 int ret;
395 static WnnClientRec *c_c_sv = 0;
396
397 #ifdef CALLBACKS
398 if (IsPreeditCallbacks (cur_x) && cur_x->cb_redraw_needed)
399 {
400 redraw_line ();
401 c_c_sv = 0;
402 pop_func (c_c);
403 cur_x->cb_redraw_needed = 0;
404 return (0);
405 }
406 #endif /* CALLBACKS */
407 if (c_c_sv != 0 && c_c != c_c_sv)
408 {
409 ring_bell ();
410 return (0);
411 }
412 if (c_c_sv == 0)
413 {
414 c_c_sv = c_c;
415 push_func (c_c, select_jikouho_dai);
416 }
417 if ((ret = select_jikouho1 (WNN_DAI, in)) == BUFFER_IN_CONT)
418 {
419 return (BUFFER_IN_CONT);
420 }
421 else if (ret == -1)
422 {
423 if (cur_p->cur_xl->visible == 3)
424 {
425 t_print_l ();
426 }
427 }
428 else
429 {
430 #ifdef CALLBACKS
431 if (IsPreeditCallbacks (cur_x))
432 {
433 cur_x->cb_redraw_needed = 1;
434 SendCBRedraw ();
435 return (BUFFER_IN_CONT);
436 }
437 else
438 {
439 #endif /* CALLBACKS */
440 kk_cursor_invisible ();
441 redraw_line ();
442 kk_cursor_normal ();
443 #ifdef CALLBACKS
444 }
445 #endif /* CALLBACKS */
446 }
447 c_c_sv = 0;
448 pop_func (c_c);
449 check_scroll ();
450 return (0);
451 }
452
453 /*
454 Local Variables:
455 eval: (setq kanji-flag t)
456 eval: (setq kanji-fileio-code 0)
457 eval: (mode-line-kanji-code-update)
458 End:
459 */
460