1 /*
2  * $Id: xselectele.c,v 1.2 2001/06/14 18:16:13 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 
41 /*      Version 4.0
42  */
43 #define DD_MAX 512
44 
45 #include <stdio.h>
46 #include "jslib.h"
47 #include "commonhd.h"
48 #include "sdefine.h"
49 #include "xjutil.h"
50 #include "sxheader.h"
51 #include "rk_spclval.h"
52 #include "rk_fundecl.h"
53 #include "xext.h"
54 
55 #define printh(mm)\
56   if(state == 0){\
57     printf("%c.",((mm - dd[cc]) > 9)? mm - dd[cc] - 10  + 'A':mm - dd[cc] + '0');\
58     printf(data[mm]);\
59   }else{\
60     printf("%c.",((mm > 9)? mm - 10  + 'A':mm + '0'));\
61     printf(data[mm]);}
62 
63 
64 #define kouho_len(x) (strlen(x) + 4)
65 
66 static int cc;                  /* ima no gamen */
67 static int kosuu;               /* kosuu of elements */
68 extern hilited_item;
69 extern max_line;
70 
71 int
xw_select_one_element_call(c,kosuu1,init,title)72 xw_select_one_element_call (c, kosuu1, init, title)
73      char **c;
74      int kosuu1;
75      int init;
76      char *title;
77 {
78   int in, ret;
79 
80   for (;;)
81     {
82       if ((ret = xw_select_one_element (c, kosuu1, init, title, SENTAKU, main_table[4], in)) != BUFFER_IN_CONT)
83         return (ret);
84       in = keyin ();
85     }
86 }
87 
88 int
xw_select_one_element_keytable(c,kosuu1,init,title,bcnt,btable_t,b_tbl,key_tbl,comment)89 xw_select_one_element_keytable (c, kosuu1, init, title, bcnt, btable_t, b_tbl, key_tbl, comment)
90      char **c;
91      int kosuu1;
92      int init;
93      char *title;
94      int bcnt;
95      char *btable_t[];
96      int (**b_tbl) ();
97      int (**key_tbl) ();
98      char *comment;
99 {
100   register int i;
101   int d;
102   unsigned int c1;
103   int ret;
104 
105   kosuu = kosuu1;
106   init_ichiran (c, kosuu1, init, title, (unsigned char *) "", (unsigned char *) "", comment, 0, SENTAKU);
107   for (;;)
108     {
109     TOP:
110       xjutil->sel_ret = -1;
111       c1 = keyin ();
112       if (xjutil->sel_ret == -2)
113         {
114           end_ichiran ();
115           romkan_clear ();
116           return (-1);
117         }
118       else if (xjutil->sel_ret != -1)
119         {
120           d = find_hilite ();
121           xjutil->sel_ret = -1;
122           if (d < 0 || d > kosuu)
123             {
124               ring_bell ();
125               continue;
126             }
127         }
128       else
129         {
130           if ((c1 < 256) && (key_tbl[c1] != NULL))
131             {
132               cc = d = find_hilite ();
133               if (d < 0 || d > kosuu)
134                 {
135                   ring_bell ();
136                   continue;
137                 }
138               for (i = 0; i < bcnt; i++)
139                 {
140                   if (key_tbl[c1] == b_tbl[i])
141                     {
142                       lock_ichiran ();
143                       break;
144                     }
145                 }
146               ret = (*key_tbl[c1]) ();
147               unlock_ichiran ();
148               if (ret == -1)
149                 {
150                   end_ichiran ();
151                   romkan_clear ();
152                   return (-1);
153                 }
154               else if (ret == 1)
155                 {
156                   end_ichiran ();
157                   romkan_clear ();
158                   return (0);
159                 }
160               else
161                 {
162                   continue;
163                 }
164             }
165           else
166             {
167               ring_bell ();
168               continue;
169             }
170         }
171       romkan_clear ();
172       if (!bcnt)
173         {
174           end_ichiran ();
175           return (d);
176         }
177       else
178         {
179           cc = d;
180           lock_ichiran ();
181         }
182       init_keytable (bcnt, btable_t);
183       for (;;)
184         {
185           c1 = keyin ();
186           if (xjutil->sel_ret == -2)
187             {
188               end_ichiran ();
189               end_keytable ();
190               romkan_clear ();
191               return (-1);
192             }
193           else if (xjutil->sel_ret != -1)
194             {
195               d = xjutil->sel_ret;
196               xjutil->sel_ret = -1;
197               if ((d < bcnt) && (b_tbl[d] != NULL))
198                 {
199                   end_keytable ();
200                   if ((ret = (*b_tbl[d]) ()) == 1)
201                     {
202                       end_ichiran ();
203                       romkan_clear ();
204                       return (0);
205                     }
206                   unlock_ichiran ();
207                   goto TOP;
208                 }
209               else
210                 {
211                   ring_bell ();
212                 }
213             }
214           else
215             {
216               if ((c1 < 256) && (key_tbl[c1] != NULL))
217                 {
218                   end_keytable ();
219                   if ((ret = (*key_tbl[c1]) ()) == 1)
220                     {
221                       end_ichiran ();
222                       romkan_clear ();
223                       return (0);
224                     }
225                   unlock_ichiran ();
226                   goto TOP;
227                 }
228               else
229                 {
230                   ring_bell ();
231                   xjutil->sel_ret = -1;
232                   continue;
233                 }
234             }
235         }
236       romkan_clear ();
237     }
238 }
239 
240 /*
241  *
242  *  Functions Called during select element (dictionaries).
243  *
244  */
245 
246 /* jishodel for kensaku */
247 int
kdicdel()248 kdicdel ()
249 {
250   char buf[512];
251 
252   sprintf (buf, "%s %s %s", msg_get (cd, 77, default_message[77], xjutil->lang), dicinfo[cc].fname, msg_get (cd, 78, default_message[78], xjutil->lang));
253   if (yes_or_no (buf) == 1)
254     {
255       if (dic_delete_e (cur_env, dicinfo[cc].dic_no) == -1)
256         {
257           errorkeyin ();
258           return (0);
259         }
260       return (1);
261     }
262   return (0);
263 }
264 
265 
266 int
kdicuse()267 kdicuse ()
268 {
269   char buf[512];
270 
271   if (dicinfo[cc].enablef)
272     {
273       sprintf (buf, "%s %s %s", msg_get (cd, 77, default_message[77], xjutil->lang), dicinfo[cc].fname, msg_get (cd, 79, default_message[89], xjutil->lang));
274     }
275   else
276     {
277       sprintf (buf, "%s %s %s", msg_get (cd, 77, default_message[77], xjutil->lang), dicinfo[cc].fname, msg_get (cd, 80, default_message[80], xjutil->lang));
278     }
279   if (yes_or_no (buf) == 1)
280     {
281       if (js_dic_use (cur_env, dicinfo[cc].dic_no, !dicinfo[cc].enablef) == -1)
282         {
283           if_dead_disconnect (cur_env, -1);
284           errorkeyin ();
285           return (0);
286         }
287       return (1);
288     }
289   return (0);
290 }
291 
292 int
kdiccom()293 kdiccom ()
294 {
295   w_char com[512];
296   WNN_DIC_INFO dic;
297   WNN_FILE_INFO_STRUCT file;
298   char *mes[1];
299 
300   com[0] = 0;
301   mes[0] = msg_get (cd, 81, default_message[81], xjutil->lang);
302   init_jutil (msg_get (cd, 39, default_message[39], xjutil->lang), msg_get (cd, 8, default_message[8], xjutil->lang), 1, &mes, NULL);
303   cur_text->max_pos = 127;
304   clr_line_all ();
305   throw_col (0);
306   kk_cursor_normal ();
307   if (kana_in (UNDER_LINE_MODE, com, 512) == -1)
308     {
309       kk_cursor_invisible ();
310       end_jutil ();
311       return (0);
312     }
313   kk_cursor_invisible ();
314   end_jutil ();
315   if (js_dic_info (cur_env, dicinfo[cc].dic_no, &dic) < 0)
316     {
317       if_dead_disconnect (cur_env, -1);
318       return (0);
319     }
320   if (js_file_info (cur_env, dic.body, &file) < 0)
321     {
322       if_dead_disconnect (cur_env, -1);
323       return (0);
324     }
325   if (js_file_comment_set (cur_env, file.fid, com) == -1)
326     {
327       if_dead_disconnect (cur_env, -1);
328       errorkeyin ();
329       return (0);
330     }
331   return (1);
332 }
333 
334 /*
335  *
336  *  Functions Called during select element (dic_entries).
337  *
338  */
339 
340 /* Defined in kensaku.c */
341 extern struct wnn_jdata *word_searched;
342 extern int del_point, ima_point, hindo_point, com_point, max_c_len;
343 
344 int
kworddel()345 kworddel ()
346 {
347   int type;
348 
349   if (cur_root->ichi->buf[cc][del_point] == 'D')
350     {
351       change_ichi_buf (cc, del_point, " ");
352       return (0);
353     }
354   type = dicinfo[find_dic_by_no (word_searched[cc].dic_no)].type;
355   if (type != WNN_UD_DICT && type != WNN_REV_DICT && type != CWNN_REV_DICT)
356     {
357       print_msg_getc (msg_get (cd, 82, default_message[82], xjutil->lang), NULL, NULL, NULL);
358       return (0);
359     }
360   if (dicinfo[find_dic_by_no (word_searched[cc].dic_no)].rw == WNN_DIC_RDONLY)
361     {
362       print_msg_getc (msg_get (cd, 83, default_message[83], xjutil->lang), NULL, NULL, NULL);
363       return (0);
364     }
365   change_ichi_buf (cc, del_point, "D");
366   return (0);
367 }
368 
369 int
kworddel_op()370 kworddel_op ()
371 {
372   register int i;
373   char buf[512];
374   Ichiran *ichi = cur_root->ichi;
375 
376   for (i = 0; i < ichi->kosuu_all; i++)
377     {
378       if (ichi->buf[i][del_point] != 'D')
379         continue;
380       strcpy (buf, msg_get (cd, 84, default_message[84], xjutil->lang));
381       sStrcpy (buf + strlen (buf), word_searched[i].kanji);
382       sprintf (buf + strlen (buf), "%s", msg_get (cd, 85, default_message[85], xjutil->lang));
383       if (yes_or_no (buf) == 1)
384         {
385           if (js_word_delete (cur_env, word_searched[i].dic_no, word_searched[i].serial) == -1)
386             {
387               if_dead_disconnect (cur_env, -1);
388               errorkeyin ();
389             }
390         }
391     }
392   return (1);
393 }
394 
395 int
kwordcom()396 kwordcom ()
397 {
398   w_char com[512];
399   char buf[512];
400   int type, len;
401   char *mes[1];
402 
403   type = dicinfo[find_dic_by_no (word_searched[cc].dic_no)].type;
404   if (type != WNN_UD_DICT && type != WNN_REV_DICT && type != CWNN_REV_DICT)
405     {
406       print_msg_getc (msg_get (cd, 89, default_message[89], xjutil->lang), NULL, NULL, NULL);
407       return (0);
408     }
409   if (dicinfo[find_dic_by_no (word_searched[cc].dic_no)].rw == WNN_DIC_RDONLY)
410     {
411       print_msg_getc (msg_get (cd, 90, default_message[90], xjutil->lang), NULL, NULL, NULL);
412       return (0);
413     }
414 
415   com[0] = 0;
416   mes[0] = msg_get (cd, 81, default_message[81], xjutil->lang);
417   init_jutil (msg_get (cd, 39, default_message[39], xjutil->lang), msg_get (cd, 8, default_message[8], xjutil->lang), 1, &mes, NULL);
418   cur_text->max_pos = 127;
419   clr_line_all ();
420   throw_col (0);
421   kk_cursor_normal ();
422   if (kana_in (UNDER_LINE_MODE, com, 512) == -1)
423     {
424       kk_cursor_invisible ();
425       end_jutil ();
426       return (0);
427     }
428   kk_cursor_invisible ();
429   end_jutil ();
430   if (js_word_comment_set (cur_env, word_searched[cc].dic_no, word_searched[cc].serial, com) == -1)
431     {
432       if_dead_disconnect (cur_env, -1);
433       errorkeyin ();
434       return (0);
435     }
436   bzero (buf, sizeof (buf));
437   if (Strlen (com))
438     {
439       strcpy (buf, "{");
440       sStrcpy (buf + strlen (buf), com);
441       strcat (buf, "}  ");
442     }
443   if (strlen (buf) > max_c_len)
444     {
445       len = strlen (buf) - max_c_len;
446       insert_space_in_ichi_buf (com_point + max_c_len, len);
447       max_c_len = strlen (buf);
448       ima_point += len;
449       hindo_point += len;
450     }
451   else
452     {
453       fill_space (buf, max_c_len);
454     }
455   change_ichi_buf (cc, com_point, buf);
456   return (0);
457 }
458 
459 static int
call_hindo_set(ima,hindo)460 call_hindo_set (ima, hindo)
461      int ima;
462      int hindo;
463 {
464   if (js_hindo_set (cur_env, word_searched[cc].dic_no, word_searched[cc].serial, ima, hindo) == -1)
465     {
466       if_dead_disconnect (cur_env, -1);
467       errorkeyin ();
468       return (0);
469     }
470   return (1);
471 }
472 
473 int
kwordima()474 kwordima ()
475 {
476   if (word_searched[cc].ima)
477     {
478       if (call_hindo_set (WNN_IMA_OFF, WNN_HINDO_NOP))
479         {
480           change_ichi_buf (cc, ima_point, " ");
481           word_searched[cc].ima = 0;
482         }
483     }
484   else
485     {
486       if (call_hindo_set (WNN_IMA_ON, WNN_HINDO_NOP))
487         {
488           change_ichi_buf (cc, ima_point, "*");
489           word_searched[cc].ima = 1;
490         }
491     }
492   return (0);
493 }
494 
495 int
kworduse()496 kworduse ()
497 {
498   int ima, hindo;
499   char buf[32];
500   extern int wnn_word_use_initial_hindo;
501 
502   if (word_searched[cc].hindo != -1)
503     {
504       if (call_hindo_set (WNN_HINDO_NOP, WNN_ENTRY_NO_USE))
505         {
506           change_ichi_buf (cc, ima_point, "----  ");
507           word_searched[cc].hindo = -1;
508         }
509     }
510   else
511     {
512       ima = wnn_word_use_initial_hindo & 0x80;
513       hindo = wnn_word_use_initial_hindo & 0x7f;
514       if (call_hindo_set ((ima ? WNN_IMA_ON : WNN_IMA_OFF), hindo))
515         {
516           sprintf (buf, "%c%-3d  ", (ima ? '*' : ' '), hindo);
517           change_ichi_buf (cc, ima_point, buf);
518           word_searched[cc].hindo = hindo;
519           word_searched[cc].ima = ima;
520         }
521 
522     }
523   return (0);
524 }
525 
526 int
kwordhindo()527 kwordhindo ()
528 {
529   int cur_hindo;
530   char *mes[1];
531   w_char kana_buf[512];
532   char st[32];
533   char buf[32];
534   int newhindo;
535   char message[80];
536 
537   if (dicinfo[find_dic_by_no (word_searched[cc].dic_no)].hindo_rw == WNN_DIC_RDONLY)
538     {
539       print_msg_getc (msg_get (cd, 118, default_message[118], xjutil->lang), NULL, NULL, NULL);
540       return (0);
541     }
542   cur_hindo = word_searched[cc].hindo;
543 
544   sprintf (message, "%s %d %s", msg_get (cd, 119, default_message[119], xjutil->lang), cur_hindo, msg_get (cd, 32, default_message[32], xjutil->lang));
545 
546   mes[0] = msg_get (cd, 33, default_message[33], xjutil->lang);
547   init_jutil (message, msg_get (cd, 8, default_message[8], xjutil->lang), 1, &mes, NULL);
548 Retry:
549   cur_text->max_pos = 127;
550   clr_line_all ();
551   throw_col (0);
552   kk_cursor_normal ();
553   kana_buf[0] = 0;
554   if (kana_in (UNDER_LINE_MODE, kana_buf, 512) == -1)
555     {
556       kk_cursor_invisible ();
557       end_jutil ();
558       return (0);
559     }
560   kk_cursor_invisible ();
561   if (sStrcpy_and_ck (st, kana_buf) || sscanf (st, "%d", &newhindo) <= 0)
562     {
563       print_msg_getc ("%s", msg_get (cd, 34, default_message[34], xjutil->lang), NULL, NULL);
564       goto Retry;
565     }
566   else if (newhindo < 0)
567     {
568       print_msg_getc ("%s", msg_get (cd, 35, default_message[35], xjutil->lang), NULL, NULL);
569       goto Retry;
570     }
571 
572   end_jutil ();
573   if (call_hindo_set (WNN_HINDO_NOP, newhindo))
574     {
575       sprintf (buf, "%-3d  ", newhindo);
576       change_ichi_buf (cc, hindo_point, buf);
577       word_searched[cc].hindo = newhindo;
578     }
579   return (0);
580 }
581 
582 /*
583   Local Variables:
584   eval: (setq kanji-flag t)
585   eval: (setq kanji-fileio-code 0)
586   eval: (mode-line-kanji-code-update)
587   End:
588 */
589