0
|
1 #ifndef lint
|
|
2 static char rcs_id[] = "$Id: jhlp.c,v 1.2 2001/06/14 18:16:16 ura Exp $";
|
|
3 #endif /* lint */
|
|
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 * '99/04/19 TAOKA Satoshi - 田岡 智志<taoka@infonets.hiroshima-u.ac.jp>
|
|
35 * index() の宣言をコメントアウト。
|
|
36 *
|
|
37 * Last modified date: 19,Apr.1999
|
|
38 *
|
|
39 * Code:
|
|
40 *
|
|
41 */
|
|
42 /* Version 4.0
|
|
43 */
|
|
44 #include <signal.h>
|
|
45 #include <pwd.h>
|
|
46 #include "commonhd.h"
|
|
47 #include "sdefine.h"
|
|
48 #include <X11/Xos.h>
|
|
49 #include "xim.h"
|
|
50 #include "sheader.h"
|
|
51 #include "config.h"
|
|
52 #include "ext.h"
|
|
53
|
|
54 #ifdef BSD42
|
|
55 #include <sgtty.h>
|
|
56 #endif /* BSD42 */
|
|
57 #ifdef SYSVR2
|
|
58 #include <termio.h>
|
|
59 #endif /* SYSVR2 */
|
|
60 extern char *optarg;
|
|
61 extern int optind;
|
|
62
|
|
63 extern char *getenv ();
|
|
64 extern void exit ();
|
|
65
|
|
66 static void save_signals ();
|
|
67
|
|
68 static struct _options
|
|
69 {
|
|
70 char *opt;
|
|
71 char *desc;
|
|
72 }
|
|
73 options[] =
|
|
74 {
|
|
75 {
|
|
76 "-D servername", "Wnn server to contact"}
|
|
77 ,
|
|
78 {
|
|
79 "-lc langname", "language name"}
|
|
80 ,
|
|
81 {
|
|
82 "-n username", "user name"}
|
|
83 ,
|
|
84 {
|
|
85 "-k uumkeyname", "uumkey file"}
|
|
86 ,
|
|
87 {
|
|
88 "-r rkfilename", "romkan file"}
|
|
89 ,
|
|
90 {
|
|
91 "-X cvtximname", "convert keys file"}
|
|
92 ,
|
|
93 {
|
|
94 "-F cvtfunname", "convert function file"}
|
|
95 ,
|
|
96 {
|
|
97 "-M cvtmetaname", "convert meta file"}
|
|
98 ,
|
|
99 {
|
|
100 "-fs fontnamelist", "font name list"}
|
|
101 ,
|
|
102 {
|
|
103 "-geometry geom", "size (in pixels) and position"}
|
|
104 ,
|
|
105 {
|
|
106 "-fg color", "foreground color"}
|
|
107 ,
|
|
108 {
|
|
109 "-bg color", "background color"}
|
|
110 ,
|
|
111 {
|
|
112 "-bd color", "border color"}
|
|
113 ,
|
|
114 {
|
|
115 "-bw number", "border width in pixels"}
|
|
116 ,
|
|
117 {
|
|
118 "-display displayname", "X server to contact"}
|
|
119 ,
|
|
120 {
|
|
121 "-iconic", "start iconic"}
|
|
122 ,
|
|
123 {
|
|
124 "#geom", "icon window geometry"}
|
|
125 ,
|
|
126 {
|
|
127 "-help", "print out this message"}
|
|
128 ,
|
|
129 {
|
|
130 "-h", "wake up in convertion off mode"}
|
|
131 ,
|
|
132 {
|
|
133 "-H", "wake up in convertion on mode"}
|
|
134 ,
|
|
135 #ifdef USING_XJUTIL
|
|
136 {
|
|
137 "-ju", "xjutil (dictionary utility manager) name"}
|
|
138 ,
|
|
139 #endif /* USING_XJUTIL */
|
|
140 {
|
|
141 "-RV", "Roo-mode window can switch map and unmap"}
|
|
142 ,
|
|
143 {
|
|
144 NULL, NULL}
|
|
145 };
|
|
146
|
|
147 static int
|
|
148 message_open (lang)
|
|
149 register char *lang;
|
|
150 {
|
|
151 char nlspath[MAXPATHLEN];
|
|
152
|
|
153 strcpy (nlspath, LIBDIR);
|
|
154 strcat (nlspath, "/%L/%N");
|
|
155
|
|
156 #ifdef DEBUG
|
|
157 cd = msg_open ("/usr/tmp/xim.msg", nlspath, lang);
|
|
158 #else
|
|
159 cd = msg_open (XIMMSGFILE, nlspath, lang);
|
|
160 #endif
|
|
161 if (cd->msg_bd == NULL)
|
|
162 {
|
|
163 print_out1 ("I can't open message_file \"%s\", use default message.", cd->nlspath);
|
|
164 }
|
|
165 return (0);
|
|
166 }
|
|
167
|
|
168 static void
|
|
169 usage (bad_option)
|
|
170 char *bad_option;
|
|
171 {
|
|
172 struct _options *opt;
|
|
173 int col;
|
|
174
|
|
175 fprintf (stderr, "%s: bad command line option \"%s\"\r\n\n", prgname, bad_option);
|
|
176
|
|
177 fprintf (stderr, "usage: %s", prgname);
|
|
178 col = 8 + strlen (prgname);
|
|
179 for (opt = options; opt->opt; opt++)
|
|
180 {
|
|
181 int len = 3 + strlen (opt->opt);
|
|
182 if (col + len > 79)
|
|
183 {
|
|
184 fprintf (stderr, "\r\n ");
|
|
185 col = 3;
|
|
186 }
|
|
187 fprintf (stderr, " [%s]", opt->opt);
|
|
188 col += len;
|
|
189 }
|
|
190
|
|
191 fprintf (stderr, "\r\n\nType %s -help for a full description.\r\n\n", prgname);
|
|
192 exit (1);
|
|
193 }
|
|
194
|
|
195 static void
|
|
196 help ()
|
|
197 {
|
|
198 struct _options *opt;
|
|
199
|
|
200 fprintf (stderr, "usage:\n %s [-options ...]\n\n", prgname);
|
|
201 fprintf (stderr, "where options include:\n");
|
|
202 for (opt = options; opt->opt; opt++)
|
|
203 {
|
|
204 fprintf (stderr, " %-28s %s\n", opt->opt, opt->desc);
|
|
205 }
|
|
206 fprintf (stderr, "\n");
|
|
207 exit (0);
|
|
208 }
|
|
209
|
|
210 /*
|
|
211 * Parse options
|
|
212 */
|
|
213 static void
|
|
214 parse_options (argc, argv)
|
|
215 int argc;
|
|
216 char **argv;
|
|
217 {
|
|
218 int i;
|
|
219
|
|
220 for (i = 1; i < argc; i++)
|
|
221 {
|
|
222 if (!strcmp (argv[i], "-h"))
|
|
223 {
|
|
224 root_henkan_off_def = 1;
|
|
225 defined_by_option |= OPT_WAKING_UP_MODE;
|
|
226 }
|
|
227 else if (!strcmp (argv[i], "-H"))
|
|
228 {
|
|
229 root_henkan_off_def = 0;
|
|
230 defined_by_option |= OPT_WAKING_UP_MODE;
|
|
231 }
|
|
232 else if (!strcmp (argv[i], "-k"))
|
|
233 {
|
|
234 if ((++i >= argc) || (argv[i][0] == '-'))
|
|
235 usage (argv[i]);
|
|
236 root_uumkeyname = alloc_and_copy (argv[i]);
|
|
237 if (root_uumkeyname == NULL || *root_uumkeyname == '\0')
|
|
238 usage (argv[i]);
|
|
239 defined_by_option |= OPT_WNNKEY;
|
|
240 }
|
|
241 else if (!strcmp (argv[i], "-r"))
|
|
242 {
|
|
243 if ((++i >= argc) || (argv[i][0] == '-'))
|
|
244 usage (argv[i]);
|
|
245 root_rkfilename = alloc_and_copy (argv[i]);
|
|
246 if (root_rkfilename == NULL || *root_rkfilename == '\0')
|
|
247 usage (argv[i]);
|
|
248 defined_by_option |= OPT_RKFILE;
|
|
249 }
|
|
250 else if (!strcmp (argv[i], "-help"))
|
|
251 {
|
|
252 help ();
|
|
253 }
|
|
254 else
|
|
255 {
|
|
256 usage (argv[i]);
|
|
257 }
|
|
258 }
|
|
259 }
|
|
260
|
|
261
|
|
262 /* get rubout_code */
|
|
263 #define UNDEF_STTY 0xff
|
|
264
|
|
265 #ifdef BSD42
|
|
266 static void
|
|
267 get_rubout ()
|
|
268 {
|
|
269 struct sgttyb savetmio;
|
|
270
|
|
271 if ((ioctl (0, TIOCGETP, &savetmio) < 0) || (savetmio.sg_erase == UNDEF_STTY))
|
|
272 {
|
|
273 rubout_code = RUBOUT; /* BackSpase */
|
|
274 }
|
|
275 else
|
|
276 {
|
|
277 rubout_code = savetmio.sg_erase;
|
|
278 }
|
|
279 }
|
|
280 #endif /* BSD42 */
|
|
281
|
|
282 #ifdef SYSVR2
|
|
283 static void
|
|
284 get_rubout ()
|
|
285 {
|
|
286 struct termio tmio;
|
|
287
|
|
288 if ((ioctl (0, TCGETA, &tmio) < 0) || (tmio.c_cc[VERASE] == UNDEF_STTY))
|
|
289 {
|
|
290 rubout_code = RUBOUT; /* BackSpase */
|
|
291 }
|
|
292 else
|
|
293 {
|
|
294 rubout_code = tmio.c_cc[VERASE];
|
|
295 }
|
|
296 }
|
|
297 #endif /* SYSVR2 */
|
|
298
|
|
299 void
|
|
300 do_end ()
|
|
301 {
|
|
302 xw_end ();
|
|
303 epilogue ();
|
|
304 #ifdef USING_XJUTIL
|
|
305 kill_all_xjutil ();
|
|
306 #endif /* USING_XJUTIL */
|
|
307 exit (0);
|
|
308 }
|
|
309
|
|
310 /** Handler of SIGTERM */
|
|
311 static void
|
|
312 terminate_handler ()
|
|
313 {
|
|
314 do_end ();
|
|
315 }
|
|
316
|
|
317 /** Mail roop */
|
|
318
|
|
319 void
|
|
320 in_put (c)
|
|
321 int c;
|
|
322 {
|
|
323 register int ml;
|
|
324
|
|
325 do
|
|
326 {
|
|
327 ml = kk (c);
|
|
328 if (ml >= 0)
|
|
329 {
|
|
330 make_history (return_buf, ml);
|
|
331 xw_write (return_buf, ml);
|
|
332 }
|
|
333 }
|
|
334 while (if_unget_buf ());
|
|
335 }
|
|
336
|
|
337 static void
|
|
338 do_main ()
|
|
339 {
|
|
340 int type;
|
|
341
|
|
342 for (;;)
|
|
343 {
|
|
344 X_flush ();
|
|
345 type = wait_for_socket ();
|
|
346 switch (type)
|
|
347 {
|
|
348 case XEVENT_TYPE:
|
|
349 XEventDispatch ();
|
|
350 break;
|
|
351 #ifndef X11R5
|
|
352 case REQUEST_TYPE_XIM:
|
|
353 XimRequestDispatch ();
|
|
354 break;
|
|
355 #endif /* !X11R5 */
|
|
356 #if defined(X11R5) || defined(BC_X11R5)
|
|
357 case REQUEST_TYPE:
|
|
358 RequestDispatch ();
|
|
359 break;
|
|
360 #endif /* defined(X11R5) || defined(BC_X11R5) */
|
|
361 #if defined(XJPLIB) && defined(XJPLIB_DIRECT)
|
|
362 case XJP_DIRECT_TYPE:
|
|
363 XJp_Direct_Dispatch ();
|
|
364 #endif /* defined(XJPLIB) && defined(XJPLIB_DIRECT) */
|
|
365 default:
|
|
366 break;
|
|
367 }
|
|
368 }
|
|
369 }
|
|
370
|
|
371 /*
|
|
372 signal settings
|
|
373 */
|
|
374
|
|
375 static void
|
|
376 save_signals ()
|
|
377 {
|
|
378 signal (SIGPIPE, SIG_IGN);
|
|
379 signal (SIGHUP, SIG_IGN);
|
|
380 #ifndef NOTFORK
|
|
381 signal (SIGINT, SIG_IGN);
|
|
382 #endif /* NOTFORK */
|
|
383 signal (SIGQUIT, SIG_IGN);
|
|
384 signal (SIGTERM, terminate_handler);
|
|
385 signal (SIGCHLD, SIG_IGN);
|
|
386 }
|
|
387
|
|
388 static int
|
|
389 make_world_lang ()
|
|
390 {
|
|
391 XIMLangDataBase *ld;
|
|
392 register int len = 0;
|
|
393
|
|
394 for (ld = language_db; ld; ld = ld->next)
|
|
395 {
|
|
396 len += strlen (ld->lc_name) + 1;
|
|
397 }
|
|
398 if (!(world_lang = Malloc (len)))
|
|
399 return (-1);
|
|
400 world_lang[0] = '\0';
|
|
401 for (ld = language_db; ld; ld = ld->next)
|
|
402 {
|
|
403 strcat (world_lang, ld->lc_name);
|
|
404 strcat (world_lang, ";");
|
|
405 }
|
|
406 if (*world_lang)
|
|
407 {
|
|
408 world_lang[strlen (world_lang) - 1] = '\0';
|
|
409 }
|
|
410 return (0);
|
|
411 }
|
|
412
|
|
413 static int
|
|
414 create_arg_string (argv, argc)
|
|
415 char **argv;
|
|
416 int argc;
|
|
417 {
|
|
418 register int nbytes, i;
|
|
419 register char *p;
|
|
420
|
|
421 for (i = 0, nbytes = 0; i < argc; i++)
|
|
422 {
|
|
423 nbytes += (argv[i] ? strlen (argv[i]) : 0) + 1;
|
|
424 }
|
|
425 if (!(p = Malloc (nbytes)))
|
|
426 {
|
|
427 malloc_error ("allocation of work area");
|
|
428 return (-1);
|
|
429 }
|
|
430 for (i = 0; i < argc; i++)
|
|
431 {
|
|
432 if (argv[i])
|
|
433 {
|
|
434 strcpy (p, argv[i]);
|
|
435 p += strlen (argv[i]) + 1;
|
|
436 }
|
|
437 }
|
|
438 arg_string = p;
|
|
439 return (0);
|
|
440 }
|
|
441
|
|
442 void
|
|
443 main (argc, argv)
|
|
444 int argc;
|
|
445 char **argv;
|
|
446 {
|
|
447 char *name;
|
|
448 char lc_name_buf[64], *lc_name = NULL;
|
|
449 register XIMLangDataBase *db = NULL;
|
|
450 register XIMLcNameRec *lnl;
|
|
451 extern struct passwd *getpwuid ();
|
|
452 char *server_env;
|
|
453 #ifdef X11R5
|
|
454 XLocale xlc;
|
|
455 #else
|
|
456 XLCd xlc;
|
|
457 #endif /* X11R5 */
|
|
458 extern char *get_server_env ();
|
|
459 /* extern char *index(); */
|
|
460
|
|
461 prgname = argv[0];
|
|
462 if (create_arg_string (argv, argc) == -1)
|
|
463 exit (1);
|
|
464
|
|
465 /*
|
|
466 * get application resources
|
|
467 */
|
|
468 argc = get_application_resources (argc, argv);
|
|
469 /*
|
|
470 * parse option
|
|
471 */
|
|
472 parse_options (argc, argv);
|
|
473
|
|
474 /*
|
|
475 * Get user name and server name
|
|
476 */
|
|
477 if (root_username == NULL)
|
|
478 {
|
|
479 if ((name = getenv (WNN_USERNAME_ENV)) != NULL)
|
|
480 {
|
|
481 if (!(root_username = alloc_and_copy (name)))
|
|
482 exit (1);
|
|
483 }
|
|
484 else
|
|
485 {
|
|
486 if (!(root_username = alloc_and_copy (getpwuid (getuid ())->pw_name)))
|
|
487 exit (1);
|
|
488 }
|
|
489 }
|
|
490
|
|
491 /*
|
|
492 * read xim.conf file
|
|
493 */
|
|
494 if (read_ximconf () == -1)
|
|
495 exit (1);
|
|
496
|
|
497 if (def_lang)
|
|
498 {
|
|
499 for (db = language_db; db; db = db->next)
|
|
500 {
|
|
501 if (!strcmp (db->lang, def_lang))
|
|
502 {
|
|
503 lc_name = setlocale (LC_ALL, db->lc_name);
|
|
504 cur_lang = db;
|
|
505 break;
|
|
506 }
|
|
507 }
|
|
508 if (db == NULL || db->lang == NULL)
|
|
509 {
|
|
510 print_out1 ("Sorry, langName \"%s\" is not my supported language.", def_lang);
|
|
511 print_out ("I refer to the system locale.");
|
|
512 }
|
|
513 else if (lc_name == NULL)
|
|
514 {
|
|
515 print_out2 ("Sorry, can not set locale \"%s\" related to langName \"%s\".", db->lc_name, def_lang);
|
|
516 print_out ("I refer to the system locale.");
|
|
517 }
|
|
518 }
|
|
519 if (lc_name == NULL)
|
|
520 {
|
|
521 lc_name = setlocale (LC_ALL, "");
|
|
522 if (lc_name == NULL || !strcmp (lc_name, "C"))
|
|
523 {
|
|
524 if (lc_name)
|
|
525 {
|
|
526 print_out ("The current locale is C.");
|
|
527 }
|
|
528 else
|
|
529 {
|
|
530 print_out ("The current locale is wrong.");
|
|
531 }
|
|
532 print_out1 ("I try to set locale to defualt \"%s\".", def_locale);
|
|
533 lc_name = setlocale (LC_ALL, def_locale);
|
|
534 if (lc_name == NULL)
|
|
535 {
|
|
536 print_out ("Could not set locale by setlocale().");
|
|
537 print_out ("I will abort.");
|
|
538 exit (1);
|
|
539 }
|
|
540 if (!strcmp (lc_name, "C"))
|
|
541 {
|
|
542 print_out ("Sorry, can not run under the C locale environment.");
|
|
543 print_out ("I will abort.");
|
|
544 exit (1);
|
|
545 }
|
|
546 }
|
|
547 #ifdef X11R5
|
|
548 if (!(xlc = _XFallBackConvert ()))
|
|
549 {
|
|
550 print_out ("Could not create locale environment.");
|
|
551 print_out ("I will abort.");
|
|
552 exit (1);
|
|
553 }
|
|
554 if (strcmp (lc_name, xlc->xlc_db->lc_name))
|
|
555 {
|
|
556 lc_name = xlc->xlc_db->lc_name;
|
|
557 #else
|
|
558 if (!(xlc = _XlcCurrentLC ()))
|
|
559 {
|
|
560 print_out ("Could not create locale environment.");
|
|
561 print_out ("I will abort.");
|
|
562 exit (1);
|
|
563 }
|
|
564 if (strcmp (lc_name, xlc->core->name))
|
|
565 {
|
|
566 lc_name = xlc->core->name;
|
|
567 #endif /* X11R5 */
|
|
568 }
|
|
569 if (!strcmp (lc_name, world_locale))
|
|
570 {
|
|
571 lnl = lc_name_list;
|
|
572 }
|
|
573 else
|
|
574 {
|
|
575 for (lnl = lc_name_list; lnl; lnl = lnl->next)
|
|
576 {
|
|
577 if (!strcmp (lnl->lc_name, lc_name))
|
|
578 break;
|
|
579 }
|
|
580 }
|
|
581 if (!lnl)
|
|
582 {
|
|
583 print_out1 ("Sorry, locale \"%s\" is not my supported locale.", lc_name);
|
|
584 print_out ("I will abort.");
|
|
585 exit (1);
|
|
586 }
|
|
587 cur_lang = lnl->lang_db;
|
|
588 }
|
|
589 strcpy (lc_name_buf, lc_name);
|
|
590
|
|
591 if (root_def_servername == NULL)
|
|
592 {
|
|
593 if (!(server_env = get_server_env (cur_lang->lang)))
|
|
594 {
|
|
595 server_env = WNN_DEF_SERVER_ENV;
|
|
596 }
|
|
597 if (name = getenv (server_env))
|
|
598 {
|
|
599 if (!(root_def_servername = root_def_reverse_servername = alloc_and_copy (name)))
|
|
600 exit (1);
|
|
601 }
|
|
602 else
|
|
603 {
|
|
604 root_def_servername = root_def_reverse_servername = NULL;
|
|
605 }
|
|
606 }
|
|
607
|
|
608 save_signals ();
|
|
609
|
|
610 get_rubout ();
|
|
611
|
|
612 #ifndef NOTFORK
|
|
613 if (fork ())
|
|
614 {
|
|
615 signal (SIGTERM, exit);
|
|
616 signal (SIGCHLD, exit);
|
|
617 pause ();
|
|
618 }
|
|
619 #endif /* NOTFORK */
|
|
620
|
|
621 close (fileno (stdin));
|
|
622 close (fileno (stdout));
|
|
623 if (make_world_lang () < 0 || /* make world_lang string */
|
|
624 read_ximrc () < 0 || /* read ximrc file */
|
|
625 message_open (cur_lang->lang) < 0 || /* open message mechanism */
|
|
626 read_default_rk () < 0 || init_xcvtkey () < 0 || alloc_all_buf () < 0 || create_xim (lc_name_buf) < 0) /* create X window environment */
|
|
627 exit (1);
|
|
628
|
|
629 if (c_c->use_server && !jl_isconnect (bun_data_))
|
|
630 {
|
|
631 if (servername && *servername)
|
|
632 {
|
|
633 print_msg_getc (" I can not connect server(at %s)", servername, NULL, NULL);
|
|
634 }
|
|
635 else
|
|
636 {
|
|
637 print_msg_getc (" I can not connect server", NULL, NULL, NULL);
|
|
638 }
|
|
639 }
|
|
640
|
|
641 #ifndef NOTFORK
|
|
642 /* End of initialization, kill parent */
|
|
643 kill (getppid (), SIGTERM);
|
|
644 #endif /* !NOTFORK */
|
|
645
|
|
646 clear_c_b ();
|
|
647
|
|
648 cur_rk = c_c->rk;
|
|
649 cur_rk_table = cur_rk->rk_table;
|
|
650 visual_status ();
|
|
651 if (henkan_off_flag == 0)
|
|
652 {
|
|
653 disp_mode ();
|
|
654 /*
|
|
655 } else {
|
|
656 henkan_off();
|
|
657 */
|
|
658 }
|
|
659 do_main ();
|
|
660 }
|