Mercurial > freewnn
diff Xwnmo/xwnmo/jhlp.c @ 0:bbc77ca4def5
initial import
author | Yoshiki Yazawa <yaz@cc.rim.or.jp> |
---|---|
date | Thu, 13 Dec 2007 04:30:14 +0900 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Xwnmo/xwnmo/jhlp.c Thu Dec 13 04:30:14 2007 +0900 @@ -0,0 +1,660 @@ +#ifndef lint +static char rcs_id[] = "$Id: jhlp.c,v 1.2 2001/06/14 18:16:16 ura Exp $"; +#endif /* lint */ + +/* + * FreeWnn is a network-extensible Kana-to-Kanji conversion system. + * This file is part of FreeWnn. + * + * Copyright Kyoto University Research Institute for Mathematical Sciences + * 1987, 1988, 1989, 1990, 1991, 1992 + * Copyright OMRON Corporation. 1987, 1988, 1989, 1990, 1991, 1992, 1999 + * Copyright ASTEC, Inc. 1987, 1988, 1989, 1990, 1991, 1992 + * Copyright 1991, 1992 by Massachusetts Institute of Technology + * + * Author: OMRON SOFTWARE Co., Ltd. <freewnn@rd.kyoto.omronsoft.co.jp> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with GNU Emacs; see the file COPYING. If not, write to the + * Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * + * Commentary: + * + * Change log: + * '99/04/19 TAOKA Satoshi - 田岡 智志<taoka@infonets.hiroshima-u.ac.jp> + * index() の宣言をコメントアウト。 + * + * Last modified date: 19,Apr.1999 + * + * Code: + * + */ +/* Version 4.0 + */ +#include <signal.h> +#include <pwd.h> +#include "commonhd.h" +#include "sdefine.h" +#include <X11/Xos.h> +#include "xim.h" +#include "sheader.h" +#include "config.h" +#include "ext.h" + +#ifdef BSD42 +#include <sgtty.h> +#endif /* BSD42 */ +#ifdef SYSVR2 +#include <termio.h> +#endif /* SYSVR2 */ +extern char *optarg; +extern int optind; + +extern char *getenv (); +extern void exit (); + +static void save_signals (); + +static struct _options +{ + char *opt; + char *desc; +} +options[] = +{ + { + "-D servername", "Wnn server to contact"} + , + { + "-lc langname", "language name"} + , + { + "-n username", "user name"} + , + { + "-k uumkeyname", "uumkey file"} + , + { + "-r rkfilename", "romkan file"} + , + { + "-X cvtximname", "convert keys file"} + , + { + "-F cvtfunname", "convert function file"} + , + { + "-M cvtmetaname", "convert meta file"} + , + { + "-fs fontnamelist", "font name list"} + , + { + "-geometry geom", "size (in pixels) and position"} + , + { + "-fg color", "foreground color"} + , + { + "-bg color", "background color"} + , + { + "-bd color", "border color"} + , + { + "-bw number", "border width in pixels"} + , + { + "-display displayname", "X server to contact"} + , + { + "-iconic", "start iconic"} + , + { + "#geom", "icon window geometry"} + , + { + "-help", "print out this message"} + , + { + "-h", "wake up in convertion off mode"} + , + { + "-H", "wake up in convertion on mode"} + , +#ifdef USING_XJUTIL + { + "-ju", "xjutil (dictionary utility manager) name"} + , +#endif /* USING_XJUTIL */ + { + "-RV", "Roo-mode window can switch map and unmap"} + , + { + NULL, NULL} +}; + +static int +message_open (lang) + register char *lang; +{ + char nlspath[MAXPATHLEN]; + + strcpy (nlspath, LIBDIR); + strcat (nlspath, "/%L/%N"); + +#ifdef DEBUG + cd = msg_open ("/usr/tmp/xim.msg", nlspath, lang); +#else + cd = msg_open (XIMMSGFILE, nlspath, lang); +#endif + if (cd->msg_bd == NULL) + { + print_out1 ("I can't open message_file \"%s\", use default message.", cd->nlspath); + } + return (0); +} + +static void +usage (bad_option) + char *bad_option; +{ + struct _options *opt; + int col; + + fprintf (stderr, "%s: bad command line option \"%s\"\r\n\n", prgname, bad_option); + + fprintf (stderr, "usage: %s", prgname); + col = 8 + strlen (prgname); + for (opt = options; opt->opt; opt++) + { + int len = 3 + strlen (opt->opt); + if (col + len > 79) + { + fprintf (stderr, "\r\n "); + col = 3; + } + fprintf (stderr, " [%s]", opt->opt); + col += len; + } + + fprintf (stderr, "\r\n\nType %s -help for a full description.\r\n\n", prgname); + exit (1); +} + +static void +help () +{ + struct _options *opt; + + fprintf (stderr, "usage:\n %s [-options ...]\n\n", prgname); + fprintf (stderr, "where options include:\n"); + for (opt = options; opt->opt; opt++) + { + fprintf (stderr, " %-28s %s\n", opt->opt, opt->desc); + } + fprintf (stderr, "\n"); + exit (0); +} + +/* + * Parse options + */ +static void +parse_options (argc, argv) + int argc; + char **argv; +{ + int i; + + for (i = 1; i < argc; i++) + { + if (!strcmp (argv[i], "-h")) + { + root_henkan_off_def = 1; + defined_by_option |= OPT_WAKING_UP_MODE; + } + else if (!strcmp (argv[i], "-H")) + { + root_henkan_off_def = 0; + defined_by_option |= OPT_WAKING_UP_MODE; + } + else if (!strcmp (argv[i], "-k")) + { + if ((++i >= argc) || (argv[i][0] == '-')) + usage (argv[i]); + root_uumkeyname = alloc_and_copy (argv[i]); + if (root_uumkeyname == NULL || *root_uumkeyname == '\0') + usage (argv[i]); + defined_by_option |= OPT_WNNKEY; + } + else if (!strcmp (argv[i], "-r")) + { + if ((++i >= argc) || (argv[i][0] == '-')) + usage (argv[i]); + root_rkfilename = alloc_and_copy (argv[i]); + if (root_rkfilename == NULL || *root_rkfilename == '\0') + usage (argv[i]); + defined_by_option |= OPT_RKFILE; + } + else if (!strcmp (argv[i], "-help")) + { + help (); + } + else + { + usage (argv[i]); + } + } +} + + +/* get rubout_code */ +#define UNDEF_STTY 0xff + +#ifdef BSD42 +static void +get_rubout () +{ + struct sgttyb savetmio; + + if ((ioctl (0, TIOCGETP, &savetmio) < 0) || (savetmio.sg_erase == UNDEF_STTY)) + { + rubout_code = RUBOUT; /* BackSpase */ + } + else + { + rubout_code = savetmio.sg_erase; + } +} +#endif /* BSD42 */ + +#ifdef SYSVR2 +static void +get_rubout () +{ + struct termio tmio; + + if ((ioctl (0, TCGETA, &tmio) < 0) || (tmio.c_cc[VERASE] == UNDEF_STTY)) + { + rubout_code = RUBOUT; /* BackSpase */ + } + else + { + rubout_code = tmio.c_cc[VERASE]; + } +} +#endif /* SYSVR2 */ + +void +do_end () +{ + xw_end (); + epilogue (); +#ifdef USING_XJUTIL + kill_all_xjutil (); +#endif /* USING_XJUTIL */ + exit (0); +} + +/** Handler of SIGTERM */ +static void +terminate_handler () +{ + do_end (); +} + +/** Mail roop */ + +void +in_put (c) + int c; +{ + register int ml; + + do + { + ml = kk (c); + if (ml >= 0) + { + make_history (return_buf, ml); + xw_write (return_buf, ml); + } + } + while (if_unget_buf ()); +} + +static void +do_main () +{ + int type; + + for (;;) + { + X_flush (); + type = wait_for_socket (); + switch (type) + { + case XEVENT_TYPE: + XEventDispatch (); + break; +#ifndef X11R5 + case REQUEST_TYPE_XIM: + XimRequestDispatch (); + break; +#endif /* !X11R5 */ +#if defined(X11R5) || defined(BC_X11R5) + case REQUEST_TYPE: + RequestDispatch (); + break; +#endif /* defined(X11R5) || defined(BC_X11R5) */ +#if defined(XJPLIB) && defined(XJPLIB_DIRECT) + case XJP_DIRECT_TYPE: + XJp_Direct_Dispatch (); +#endif /* defined(XJPLIB) && defined(XJPLIB_DIRECT) */ + default: + break; + } + } +} + +/* + signal settings + */ + +static void +save_signals () +{ + signal (SIGPIPE, SIG_IGN); + signal (SIGHUP, SIG_IGN); +#ifndef NOTFORK + signal (SIGINT, SIG_IGN); +#endif /* NOTFORK */ + signal (SIGQUIT, SIG_IGN); + signal (SIGTERM, terminate_handler); + signal (SIGCHLD, SIG_IGN); +} + +static int +make_world_lang () +{ + XIMLangDataBase *ld; + register int len = 0; + + for (ld = language_db; ld; ld = ld->next) + { + len += strlen (ld->lc_name) + 1; + } + if (!(world_lang = Malloc (len))) + return (-1); + world_lang[0] = '\0'; + for (ld = language_db; ld; ld = ld->next) + { + strcat (world_lang, ld->lc_name); + strcat (world_lang, ";"); + } + if (*world_lang) + { + world_lang[strlen (world_lang) - 1] = '\0'; + } + return (0); +} + +static int +create_arg_string (argv, argc) + char **argv; + int argc; +{ + register int nbytes, i; + register char *p; + + for (i = 0, nbytes = 0; i < argc; i++) + { + nbytes += (argv[i] ? strlen (argv[i]) : 0) + 1; + } + if (!(p = Malloc (nbytes))) + { + malloc_error ("allocation of work area"); + return (-1); + } + for (i = 0; i < argc; i++) + { + if (argv[i]) + { + strcpy (p, argv[i]); + p += strlen (argv[i]) + 1; + } + } + arg_string = p; + return (0); +} + +void +main (argc, argv) + int argc; + char **argv; +{ + char *name; + char lc_name_buf[64], *lc_name = NULL; + register XIMLangDataBase *db = NULL; + register XIMLcNameRec *lnl; + extern struct passwd *getpwuid (); + char *server_env; +#ifdef X11R5 + XLocale xlc; +#else + XLCd xlc; +#endif /* X11R5 */ + extern char *get_server_env (); +/* extern char *index(); */ + + prgname = argv[0]; + if (create_arg_string (argv, argc) == -1) + exit (1); + + /* + * get application resources + */ + argc = get_application_resources (argc, argv); + /* + * parse option + */ + parse_options (argc, argv); + + /* + * Get user name and server name + */ + if (root_username == NULL) + { + if ((name = getenv (WNN_USERNAME_ENV)) != NULL) + { + if (!(root_username = alloc_and_copy (name))) + exit (1); + } + else + { + if (!(root_username = alloc_and_copy (getpwuid (getuid ())->pw_name))) + exit (1); + } + } + + /* + * read xim.conf file + */ + if (read_ximconf () == -1) + exit (1); + + if (def_lang) + { + for (db = language_db; db; db = db->next) + { + if (!strcmp (db->lang, def_lang)) + { + lc_name = setlocale (LC_ALL, db->lc_name); + cur_lang = db; + break; + } + } + if (db == NULL || db->lang == NULL) + { + print_out1 ("Sorry, langName \"%s\" is not my supported language.", def_lang); + print_out ("I refer to the system locale."); + } + else if (lc_name == NULL) + { + print_out2 ("Sorry, can not set locale \"%s\" related to langName \"%s\".", db->lc_name, def_lang); + print_out ("I refer to the system locale."); + } + } + if (lc_name == NULL) + { + lc_name = setlocale (LC_ALL, ""); + if (lc_name == NULL || !strcmp (lc_name, "C")) + { + if (lc_name) + { + print_out ("The current locale is C."); + } + else + { + print_out ("The current locale is wrong."); + } + print_out1 ("I try to set locale to defualt \"%s\".", def_locale); + lc_name = setlocale (LC_ALL, def_locale); + if (lc_name == NULL) + { + print_out ("Could not set locale by setlocale()."); + print_out ("I will abort."); + exit (1); + } + if (!strcmp (lc_name, "C")) + { + print_out ("Sorry, can not run under the C locale environment."); + print_out ("I will abort."); + exit (1); + } + } +#ifdef X11R5 + if (!(xlc = _XFallBackConvert ())) + { + print_out ("Could not create locale environment."); + print_out ("I will abort."); + exit (1); + } + if (strcmp (lc_name, xlc->xlc_db->lc_name)) + { + lc_name = xlc->xlc_db->lc_name; +#else + if (!(xlc = _XlcCurrentLC ())) + { + print_out ("Could not create locale environment."); + print_out ("I will abort."); + exit (1); + } + if (strcmp (lc_name, xlc->core->name)) + { + lc_name = xlc->core->name; +#endif /* X11R5 */ + } + if (!strcmp (lc_name, world_locale)) + { + lnl = lc_name_list; + } + else + { + for (lnl = lc_name_list; lnl; lnl = lnl->next) + { + if (!strcmp (lnl->lc_name, lc_name)) + break; + } + } + if (!lnl) + { + print_out1 ("Sorry, locale \"%s\" is not my supported locale.", lc_name); + print_out ("I will abort."); + exit (1); + } + cur_lang = lnl->lang_db; + } + strcpy (lc_name_buf, lc_name); + + if (root_def_servername == NULL) + { + if (!(server_env = get_server_env (cur_lang->lang))) + { + server_env = WNN_DEF_SERVER_ENV; + } + if (name = getenv (server_env)) + { + if (!(root_def_servername = root_def_reverse_servername = alloc_and_copy (name))) + exit (1); + } + else + { + root_def_servername = root_def_reverse_servername = NULL; + } + } + + save_signals (); + + get_rubout (); + +#ifndef NOTFORK + if (fork ()) + { + signal (SIGTERM, exit); + signal (SIGCHLD, exit); + pause (); + } +#endif /* NOTFORK */ + + close (fileno (stdin)); + close (fileno (stdout)); + if (make_world_lang () < 0 || /* make world_lang string */ + read_ximrc () < 0 || /* read ximrc file */ + message_open (cur_lang->lang) < 0 || /* open message mechanism */ + read_default_rk () < 0 || init_xcvtkey () < 0 || alloc_all_buf () < 0 || create_xim (lc_name_buf) < 0) /* create X window environment */ + exit (1); + + if (c_c->use_server && !jl_isconnect (bun_data_)) + { + if (servername && *servername) + { + print_msg_getc (" I can not connect server(at %s)", servername, NULL, NULL); + } + else + { + print_msg_getc (" I can not connect server", NULL, NULL, NULL); + } + } + +#ifndef NOTFORK + /* End of initialization, kill parent */ + kill (getppid (), SIGTERM); +#endif /* !NOTFORK */ + + clear_c_b (); + + cur_rk = c_c->rk; + cur_rk_table = cur_rk->rk_table; + visual_status (); + if (henkan_off_flag == 0) + { + disp_mode (); +/* + } else { + henkan_off(); +*/ + } + do_main (); +}