1 /*
2 * $Id: jutil.c,v 1.4 2002/03/30 01:45:41 hiroo 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 FreeWnn Project 1999, 2000, 2002
14 *
15 * Maintainer: FreeWnn Project <freewnn@tomo.gr.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 of the License, or
20 * (at your option) 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 this program; if not, write to the Free Software
29 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
30 */
31
32 /* jisho utility routine for otasuke (user interface) process */
33 /* �輭��Ȥϥ����ȥ桼������Τ��Ȥ��� */
34 #ifdef HAVE_CONFIG_H
35 # include <config.h>
36 #endif
37
38 #include <stdio.h>
39 #if STDC_HEADERS
40 # include <stdlib.h>
41 # include <string.h>
42 #else
43 # if HAVE_STRINGS_H
44 # include <strings.h>
45 # endif
46 #endif /* STDC_HEADERS */
47
48 #include "commonhd.h"
49 #include "jslib.h"
50 #include "jllib.h"
51 #include "sdefine.h"
52 #include "sheader.h"
53 #include "wnn_os.h"
54
55 #define MESSAGE_REC 3
56 #define MESSAGE_NUM 5
57
58
59 #ifdef nodef
60 char *sh_fname ();
61 #endif
62
63 static void ret (); /* remove sonota() , nullfun() */
64 void touroku ();
65 void kensaku ();
66 void jishoadd (), dicsv (), fuzoku_set ();
67 void paramchg (), dicinfoout (), select_one_dict8 ();
68
69 /*
70 static struct msg_fun {
71 char *msg;
72 void (*fun)();
73 };
74
75 static struct msg_fun message1[] = {
76 {"�����ɲ�", jishoadd},
77 {"�������",select_one_dict8},
78 {"��Ͽ", touroku},
79 {"����", kensaku},
80 {"�ѥ����ѹ�",paramchg},
81 {"���٥�����",dicsv},
82 {"�������",dicinfoout},
83 {"��°���ѹ�", fuzoku_set},
84 {"��λ",ret}
85 };
86 */
87
88 struct msg_fun
89 {
90 void (*fun) ();
91 };
92
93 static struct msg_fun message1[] = {
94 {jishoadd},
95 {select_one_dict8},
96 {touroku},
97 {kensaku},
98 {paramchg},
99 {dicsv},
100 {dicinfoout},
101 {fuzoku_set},
102 {ret}
103 };
104
105 int
jutil()106 jutil ()
107 {
108 static int last = 3;
109 int not_redrawtmp = not_redraw;
110 int c;
111 int k;
112 char *buf[sizeof (message1) / sizeof (struct msg_fun)];
113
114 not_redraw = 1;
115 for (k = 0; k < (sizeof (message1) / sizeof (struct msg_fun)); k++)
116 {
117 /*
118 buf[k]=message1[k].msg;
119 */
120 buf[k] = MSG_GET (61 + k);
121 }
122
123 c = select_one_element (buf, sizeof (message1) / sizeof (struct msg_fun), last, "", 0, 1, main_table[4]);
124 if (c == -1)
125 {
126 not_redraw = not_redrawtmp;
127 return (0);
128 }
129 last = c;
130 (*message1[c].fun) ();
131 not_redraw = not_redrawtmp;
132 return (0);
133 }
134
135 static void
ret()136 ret ()
137 {
138 }
139
140
141 void
paramchg()142 paramchg ()
143 {
144 int c, k;
145 int newval;
146 char *ch;
147 char st[80];
148 char message[80];
149 w_char kana_buf[1024];
150
151 #ifdef nodef
152 static char *ccc[] = { "����ʸ���", "��ʸ��κ����",
153 "���ٽŤ�", "��ʸ��Ĺ�Ť�", "��Ω��Ĺ�Ť�", "�Ƕ���Ѿ����Ť�", "����ͥ���ٽŤ�", "��ʸ���ɾ���ͽŤ�", "��ʸ��Ĺ�Ť�", "��ʸ����Ť�", /* "����Ĺ�Ť�", */
154 "����������", "���ʤ�����", "�ѿ�������", "���������", "�ij�̤�����", "��°�������", "����̤�����"
155 };
156 #endif
157 struct wnn_param para;
158 int *paraary;
159 /*
160 char *cccmsg[(sizeof(ccc) / sizeof(char *))];
161 */
162 char *cccmsg[86 - 70 + 1];
163 char buf[1024];
164
165 paraary = (int *) ¶
166 if (jl_param_get (bun_data_, ¶) < 0)
167 {
168 errorkeyin ();
169 }
170 /*
171 for(k = 0,ch = buf ; k < (sizeof(ccc) / sizeof(char *)) ; k++){
172 */
173 for (k = 0, ch = buf; k < (86 - 70 + 1); k++)
174 {
175 cccmsg[k] = ch;
176 /*
177 sprintf(ch,"%s[%d]",ccc[k],paraary[k]);
178 */
179 sprintf (ch, "%s[%d]", MSG_GET (70 + k), paraary[k]);
180 ch += strlen (ch) + 1;
181 }
182 repeat:
183 /*
184 if((c = select_one_element(cccmsg,(sizeof(ccc) / sizeof(char *)),
185 */
186 if ((c = select_one_element (cccmsg, (86 - 70 + 1), 0, "", 0, 1, main_table[4])) == -1)
187 {
188 return;
189 }
190
191 throw_c (0);
192 clr_line ();
193
194 if (c == 0)
195 {
196 /*
197 sprintf(message , "���� %dʸ�����ˡ���Ѥ��Ƥ��ޤ�����ʸ�����ˡ���Ѥ��ޤ��� ?" , paraary[0]);
198 */
199 sprintf (message, MSG_GET (45), paraary[0]);
200 }
201 else
202 {
203 /*
204 sprintf(message , "���ߤ�%s�� %d�Ǥ������Ĥˤ��ޤ��� ? ", ccc[c] , paraary[c] );
205 */
206 sprintf (message, MSG_GET (46), MSG_GET (70 + c), paraary[c]);
207 }
208 kana_buf[0] = 0;
209 if (kana_in (message, UNDER_LINE_MODE, kana_buf, 1024) == -1)
210 return;
211 if (wchartochar (kana_buf, st) || sscanf (st, "%d", &newval) <= 0)
212 {
213 /*
214 print_msg_getc("���������Ϥ��Ƥ���������(ǡ��?)");
215 */
216 print_msg_getc (MSG_GET (47));
217 goto repeat;
218 }
219 if (c == 0 && newval <= 0)
220 {
221 /*
222 print_msg_getc("���ο��������Ϥ��Ƥ���������(ǡ��?)");
223 */
224 print_msg_getc (MSG_GET (48));
225 goto repeat;
226 }
227 paraary[c] = newval;
228 if (jl_param_set (bun_data_, ¶) < 0)
229 {
230 errorkeyin ();
231 }
232 }
233
234
235 void
dicsv()236 dicsv ()
237 {
238 /*
239 print_msg("��������������٤ȥ桼��������֤��Ƥ��ޤ���");
240 */
241 print_msg (MSG_GET (49));
242 flush ();
243 if (jl_dic_save_all (bun_data_) == -1)
244 {
245 errorkeyin ();
246 }
247 }
248
249 int
update_dic_list(buf)250 update_dic_list (buf)
251 struct wnn_buf *buf;
252 {
253 if ((dic_list_size = jl_dic_list (bun_data_, &dicinfo)) == -1)
254 {
255 errorkeyin ();
256 return (-1);
257 }
258 return (0);
259 }
260
261 int
dic_nickname(dic_no,buf)262 dic_nickname (dic_no, buf)
263 int dic_no;
264 char *buf;
265 {
266 int j;
267
268 if ((j = find_dic_by_no (dic_no)) == -1)
269 return (-1);
270 if (*dicinfo[j].comment)
271 sStrcpy (buf, dicinfo[j].comment);
272 else
273 strcpy (buf, dicinfo[j].fname);
274 return (0);
275 }
276
277 int
find_dic_by_no(dic_no)278 find_dic_by_no (dic_no)
279 int dic_no;
280 {
281 int j;
282
283 for (j = 0; j < dic_list_size; j++)
284 {
285 if (dicinfo[j].dic_no == dic_no)
286 return (j);
287 }
288 return (-1);
289 }
290
291
292
293 void
dicinfoout()294 dicinfoout ()
295 {
296 int k;
297 int cnt;
298 char buf[4096];
299 char *info[JISHOKOSUU];
300 int size;
301
302 if (update_dic_list (bun_data_) == -1)
303 {
304 errorkeyin ();
305 return;
306 }
307 cnt = dic_list_size;
308
309 cnt += 1; /* for the comment line */
310 size = 4096 / cnt;
311 if (make_info_out (buf, size, dicinfo, cnt) == -1)
312 {
313 /*
314 print_msg("��ǰ������¿�����ޤ���");
315 */
316 print_msg (MSG_GET (50));
317 return;
318 }
319 for (k = 0; k < cnt; k++)
320 {
321 info[k] = buf + k * size;
322 }
323 set_lc_offset (1);
324 select_line_element (info, cnt, 0, "", 0, 0, main_table[8]);
325 set_lc_offset (0);
326 }
327
328
329 void
select_one_dict8()330 select_one_dict8 ()
331 {
332 set_lc_offset (0);
333 select_one_dict1 (8);
334 }
335
336 int
select_one_dict1(tbl)337 select_one_dict1 (tbl)
338 int tbl;
339 {
340 int l;
341 char *c;
342 char buf[4096];
343 char *buf_ptr[JISHOKOSUU];
344 char baka[1024];
345
346 if (update_dic_list (bun_data_) == -1)
347 {
348 errorkeyin ();
349 return (0);
350 }
351 if (dic_list_size == 0)
352 {
353 /*
354 print_msg_getc("����Ĥ�ͭ��ޤ���");
355 */
356 print_msg_getc (MSG_GET (51));
357 return (0);
358 }
359
360 for (c = buf, l = 0; l < dic_list_size; l++)
361 {
362 buf_ptr[l] = c;
363 dic_nickname (dicinfo[l].dic_no, baka);
364 sprintf (c, "%s(%s) %s %d/%d", baka, dicinfo[l].hfname,
365 /*
366 dicinfo[l].enablef? "������":"������",
367 */
368 dicinfo[l].enablef ? MSG_GET (52) : MSG_GET (53), l + 1, dic_list_size);
369 c += strlen (c) + 1;
370 }
371 return (select_line_element (buf_ptr, dic_list_size, 0, "", 0, 0, main_table[tbl]));
372 }
373
374 void
print_msg1(X)375 print_msg1 (X)
376 char *X;
377 {
378 push_cursor ();
379 throw_c (0);
380 clr_line ();
381 printf (X);
382 flush ();
383 pop_cursor ();
384 }
385
386 void
fuzoku_set()387 fuzoku_set ()
388 {
389 /*
390 char *message = "��°��ե�����̾ >";
391 */
392 char fname[128];
393 w_char kana_buf[1024];
394
395 Strcpy (kana_buf, fuzokugopath);
396 if (kana_in (MSG_GET (54), UNDER_LINE_MODE, kana_buf, 1024) == -1)
397 return;
398 wchartochar (kana_buf, fname);
399 if (strlen (fname) == 0)
400 return;
401 Strcpy (fuzokugopath, kana_buf);
402 if (jl_fuzokugo_set (bun_data_, fname) == -1)
403 {
404 errorkeyin ();
405 }
406 }
407
408 void
jishoadd()409 jishoadd ()
410 {
411 /*
412 char *message = "����������� > ";
413 char *hmessage = "���٥ե�����̾ > ";
414 char *priomessage = "�����ͥ���٤ο�������ꤷ�Ʋ������� > ";
415 */
416 char fname[128];
417 char tmp[128];
418 char hfname[128];
419 int prio;
420 int rdonly;
421 int hrdonly;
422 int id, l;
423 w_char kana_buf[1024];
424
425 Strcpy (kana_buf, jishopath);
426 if (kana_in (MSG_GET (55), UNDER_LINE_MODE, kana_buf, 1024) == -1)
427 return;
428 wchartochar (kana_buf, fname);
429 if (strlen (fname) == 0)
430 return;
431 Strcpy (jishopath, kana_buf);
432
433 Strcpy (kana_buf, hindopath);
434 getfname (hfname, fname);
435 if (strcmp (hfname + strlen (hfname) - 4, ".usr") == 0 ||
436 strcmp (hfname + strlen (hfname) - 4, ".sys") == 0 || strcmp (hfname + strlen (hfname) - 4, ".dic") == 0 || strcmp (hfname + strlen (hfname) - 4, ".rev") == 0)
437 {
438 hfname[strlen (hfname) - 4] = 0;
439 strcat (hfname, ".h");
440 }
441 else if (strcmp (hfname + strlen (hfname) - 5, ".usrR") == 0 || strcmp (hfname + strlen (hfname) - 5, ".sysR") == 0)
442 {
443 hfname[strlen (hfname) - 5] = 0;
444 strcat (hfname, ".hR");
445 }
446 else
447 {
448 strcat (hfname, ".h");
449 }
450 Sstrcpy (kana_buf + Strlen (kana_buf), hfname);
451 if (kana_in (MSG_GET (56), UNDER_LINE_MODE, kana_buf, 1024) == -1)
452 {
453 return;
454 }
455 wchartochar (kana_buf, hfname);
456 sprintf (tmp, "%d", JISHO_PRIO_DEFAULT);
457 Sstrcpy (kana_buf, tmp);
458 if (kana_in (MSG_GET (57), UNDER_LINE_MODE, kana_buf, 1024) == -1)
459 return;
460 wchartochar (kana_buf, tmp);
461 prio = atoi (tmp);
462 /*
463 if(yes_or_no_or_newline("���������⡼�ɤǻȤ��ޤ���?(Y or Newline / N)") == 1){
464 */
465 if (yes_or_no_or_newline (MSG_GET (58)) == 1)
466 {
467 rdonly = 0;
468 }
469 else
470 {
471 rdonly = 1;
472 }
473 /*
474 if(yes_or_no_or_newline("���٤�����⡼�ɤǻȤ��ޤ���?(Y or Newline / N)") == 1){
475 */
476 if (yes_or_no_or_newline (MSG_GET (59)) == 1)
477 {
478 hrdonly = 0;
479 }
480 else
481 {
482 hrdonly = 1;
483 }
484
485 throw_c (0);
486 clr_line ();
487 /*
488 printf("������������ɤ߹���Ǥ��ޤ���");
489 */
490 printf (MSG_GET (60));
491 flush ();
492
493 if ((id = jl_dic_add (bun_data_, fname, hfname, 0, prio, rdonly, hrdonly, NULL, NULL, yes_or_no_or_newline, print_msg1)) == -1 && wnn_errorno != -1)
494 {
495 errorkeyin ();
496 }
497 update_dic_list (bun_data_);
498 for (l = 0; l < dic_list_size; l++)
499 {
500 if (dicinfo[l].dic_no == id)
501 {
502 break;
503 }
504 }
505 if (l != dic_list_size && env_reverse && (dicinfo[l].type == WNN_REV_DICT || dicinfo[l].type == BWNN_REV_DICT || dicinfo[l].type == CWNN_REV_DICT))
506 {
507 if (jl_dic_add_e (env_reverse, fname, hfname, 1, prio, rdonly, hrdonly, NULL, NULL, yes_or_no_or_newline, print_msg1) == -1 && wnn_errorno != -1)
508 {
509 errorkeyin ();
510 }
511 }
512 }
513
514 #ifdef nodef
515 char *
sh_fname(s,n,d)516 sh_fname (s, n, d) /* file̾ s��Ĺ�����ˡ����κǸ�������ä� nʸ���ˤޤȤ�� d������� */
517 char *s, *d;
518 int n;
519 {
520 int k;
521 char *c, *c1;
522
523 k = strlen (s);
524 if (k < n)
525 {
526 strcpy (d, s);
527 return (d);
528 }
529 else
530 {
531 c = s + k - n + 2;
532 c1 = d;
533 *c1++ = '-';
534 *c1++ = '-';
535 for (; *c && *c != '/'; c++)
536 {
537 *c1++ = '-';
538 }
539 strcpy (c1, c);
540 return (d);
541 }
542 }
543 #endif
544
545 int
yes_or_no(string)546 yes_or_no (string)
547 char *string;
548 {
549 int x;
550 throw_c (0);
551 clr_line ();
552 printf (string);
553 flush ();
554 for (;;)
555 {
556 x = keyin ();
557 if (x == 'n' || x == 'N')
558 return (0);
559 if (x == 'y' || x == 'Y')
560 return (1);
561 }
562 }
563
564
565 int
yes_or_no_or_newline(string)566 yes_or_no_or_newline (string)
567 char *string;
568 {
569 int x;
570 throw_c (0);
571 clr_line ();
572 printf (string);
573 flush ();
574 for (;;)
575 {
576 x = keyin ();
577 if (x == 'n' || x == 'N')
578 return (0);
579 if (x == 'y' || x == 'Y' || x == '\n' || x == CR)
580 return (1);
581 }
582 }
583
584
585
586
587 /*
588 static char *info_out_data[] ={
589 "No.",
590 "Type",
591 "������",
592 "�ե�����̾",
593 "���٥ե�����̾",
594 "���ÿ�",
595 "ͥ����",
596 "��Ͽ��ǽ",
597 "���ٹ�����ǽ",
598 "�����椫",
599 "��Ͽ�ѥ����",
600 "���ٹ����ѥ����",
601 ""
602 };
603 */
604
605 int
make_info_out(buf,size,infobuf,cnt)606 make_info_out (buf, size, infobuf, cnt)
607 char buf[];
608 WNN_DIC_INFO infobuf[];
609 int cnt;
610 int size;
611 {
612 int max1 = 0;
613 int max0 = 0;
614 int i, k, j;
615
616 for (k = 0; k < cnt; k++)
617 {
618 for (j = 0; j < size; j++)
619 {
620 buf[k * size + j] = 0;
621 }
622 }
623
624 for (i = 0; i < 13; i++)
625 {
626 if (i == 12)
627 {
628 sprintf (buf + max0, "%3d/%-3d", 0, cnt - 1);
629 }
630 else
631 {
632 /*
633 sprintf(buf + max0,"%s",info_out_data[i]);
634 */
635 sprintf (buf + max0, "%s", MSG_GET (87 + i));
636 }
637 max1 = max (max1, strlen (buf));
638 if (max1 >= size)
639 return (-1);
640 for (k = 1; k < cnt; k++)
641 {
642 switch (i)
643 {
644 case 0:
645 sprintf (buf + size * k + max0, "%3d ", infobuf[k - 1].dic_no);
646 break;
647 case 1:
648 {
649 char *tmp;
650 if ((0xff00 & infobuf[k - 1].type) == (BWNN_REV_DICT & 0xff00))
651 tmp = bwnn_dic_types[0xff & infobuf[k - 1].type];
652 else if ((0xff00 & infobuf[k - 1].type) == (CWNN_REV_DICT & 0xff00))
653 tmp = cwnn_dic_types[0xff & infobuf[k - 1].type];
654 else
655 tmp = wnn_dic_types[infobuf[k - 1].type];
656 sprintf (buf + size * k + max0, "%8s", tmp);
657 break;
658 }
659 case 2:
660 sStrcpy (buf + size * k + max0, infobuf[k - 1].comment);
661 break;
662 case 3:
663 strcpy (buf + size * k + max0, infobuf[k - 1].fname);
664 break;
665 case 4:
666 strcpy (buf + size * k + max0, infobuf[k - 1].hfname);
667 break;
668 case 5:
669 sprintf (buf + size * k + max0, "%6d", infobuf[k - 1].gosuu);
670 break;
671 case 6:
672 sprintf (buf + size * k + max0, "%4d", infobuf[k - 1].nice);
673 break;
674 case 7:
675 strcpy (buf + size * k + max0, (!infobuf[k - 1].rw) ? "Yes" : "No");
676 break;
677 case 8:
678 strcpy (buf + size * k + max0, (!infobuf[k - 1].hindo_rw) ? "Yes" : "No");
679 break;
680 case 9:
681 /*
682 strcpy(buf + size * k + max0,(infobuf[k - 1].enablef)? "������":"������");
683 */
684 strcpy (buf + size * k + max0, (infobuf[k - 1].enablef) ? MSG_GET (52) : MSG_GET (53));
685 break;
686 case 10:
687 strcpy (buf + size * k + max0, infobuf[k - 1].passwd);
688 break;
689 case 11:
690 strcpy (buf + size * k + max0, infobuf[k - 1].hpasswd);
691 break;
692 case 12:
693 sprintf (buf + size * k + max0, "%3d/%-3d", k, cnt - 1);
694 break;
695 }
696 max1 = max (max1, strlen (buf + size * k));
697 if (max1 >= size)
698 return (-1);
699 }
700 max0 = max1 + 1;
701 for (k = 0; k < cnt; k++)
702 {
703 fill (buf + size * k, max0);
704 }
705 }
706 return (1);
707 }
708
709
710 void
fill(c,x)711 fill (c, x)
712 char *c;
713 int x;
714 {
715 for (; *c; c++, x--);
716 for (; x; x--, c++)
717 {
718 *c = ' ';
719 }
720 }
721