2 * CDE - Common Desktop Environment
4 * Copyright (c) 1993-2012, The Open Group. All rights reserved.
6 * These libraries and programs are free software; you can
7 * redistribute them and/or modify them under the terms of the GNU
8 * Lesser General Public License as published by the Free Software
9 * Foundation; either version 2 of the License, or (at your option)
12 * These libraries and programs are distributed in the hope that
13 * they will be useful, but WITHOUT ANY WARRANTY; without even the
14 * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
15 * PURPOSE. See the GNU Lesser General Public License for more
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with these libraries and programs; if not, write
20 * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth
21 * Floor, Boston, MA 02110-1301 USA
23 /* @(#)$XConsortium: util.c /main/6 1996/07/12 15:44:21 pascale $ */
26 #include <DtHelp/LocaleXlate.h> /* for locale equivalence between platforms */
31 /* ******** locale name manupilation ******** */
33 int find_CDE_locale_name(void)
35 UserEnv *uenv = &userEnv;
38 char plat[_DtPLATFORM_MAX_LEN];
41 static bool first = True;
45 uenv->CDE_locale = NULL;
47 ret = _DtLcxOpenAllDbs(&db);
50 ret = _DtXlateGetXlateEnv(db, plat, &execver, &compver);
53 ret = _DtLcxXlateOpToStd(db, plat, compver, DtLCX_OPER_SETLOCALE,
54 uenv->locale, &uenv->CDE_locale,
57 ret = _DtLcxCloseDb(&db);
64 char *find_system_locale_name(char *CDE_locale)
68 char plat[_DtPLATFORM_MAX_LEN];
73 ret = _DtLcxOpenAllDbs(&db);
76 ret = _DtXlateGetXlateEnv(db, plat, &execver, &compver);
79 ret = _DtLcxXlateStdToOp(db, plat, compver, DtLCX_OPER_SETLOCALE,
80 CDE_locale, NULL, NULL, NULL,
83 ret = _DtLcxCloseDb(&db);
93 /* ******** string manupilation ******** */
95 char *strcpyx(register char *dest, register char *src)
97 while (*dest++ = *src++) ;
102 char *strcpy2(register char *dest, register char *src1, register char *src2)
104 while (*dest++ = *src1++) ;
106 while (*dest++ = *src2++) ;
110 char *newstradded(register char *src1, register char *src2, register char *src3)
115 dest = p = ALLOC(strlen(src1) + strlen(src2) + strlen(src3) + 1, char);
116 if (src1) { while (*p++ = *src1++) ; p--; }
117 if (src2) { while (*p++ = *src2++) ; p--; }
118 if (src3) { while (*p++ = *src3++) ; }
124 int str_to_int(char *ptr, int *val)
129 /* if (!ptr || !*ptr || !val) return(False); */
131 base = ptr[0] == '0' ? (((ptr[1] & 0xdf) == 'X') ? 16 : 8) : 10;
132 *val = strtol(ptr, &pp, base);
133 if (!pp || *pp) return(False);
137 bool str_to_bool(char *ptr, bool def_val)
139 if (!ptr || !*ptr) return def_val;
142 switch (*ptr) { /* true/false , 0/1 , yes/no , on/off */
146 def_val = True; break;
151 def_val = False; break;
154 if (ptr[1] == 'N' || ptr[1] == 'n')
156 else if (ptr[1] == 'F' || ptr[1] == 'f')
163 char *trim_line(char *ptr)
165 register char *lastp;
168 for (lastp = ptr + strlen(ptr) - 1;
169 lastp >= ptr && (is_white(*lastp) || *lastp == '\n'); lastp--) ;
171 return ptr; /* return lastp > ptr ? ptr : NULL; */
174 char **parse_strlist(register char *ptr, char sep_ch)
176 char *pbuf[100], **new, **bp;
181 if (!ptr || !*ptr) return (char **)0;
182 ptr = save_ptr = NEWSTR(ptr);
184 if (!sep_ch) sep_ch = ',';
185 bp = pbuf; pbuf[0] = NULL;
188 if (sep = strchr(ptr, sep_ch)) *sep++ = 0;
192 if (bp - pbuf >= 100) sep = NULL; /* over-flow */
198 new = ALLOC(n + 1, char *);
199 memcpy((void *) new, (void *)pbuf, n * sizeof(char *));
208 int pack_strlist(char *ptr, char **listp, char sep_ch)
210 register char *bp = ptr, **lp = listp;
212 /* if (!ptr) return 0; */
217 if (!sep_ch) sep_ch = ',';
219 for (bp; *lp; lp++) {
220 bp = strcpyx(bp, *lp);
224 DPR2(("pack_strlist(): ptr='%s'\n", ptr));
230 void free_strlist(char **pp)
232 register char **ptr = pp;
235 for ( ; *ptr; ptr++) FREE(*ptr);
240 /* ******** display string ******** */
242 bool parse_dpy_str(char *display_str, char **host, int *dnum, int *snum, int *dnet)
244 char buf[BUFSIZ], hostbuf[BUFSIZ], *p, *hp, *pdnum, *psnum;
247 snprintf(buf, sizeof(buf), "%s", display_str);
249 /* extract host name */
250 if (!(p = strchr(buf, ':'))) return False;
252 if (*p == ':') { /* DECnet ? */
258 if (!*hp || strcmp(hp, "unix") == 0 || strcmp(hp, "local") == 0) {
259 gethostname(hostbuf, BUFSIZ);
262 if (p = strchr(hp, '.')) *p = 0;
264 /* extract display number */
265 for (p = pdnum; *p && isdigit(*p); p++) ;
266 if (p == pdnum || (*p && *p != '.'))
270 if (*p) { /* extract screen number */
271 *p++ = 0; /* must be '.' */
272 for (psnum = p; *p && isdigit(*p); p++) ;
273 if (p == psnum || *p) psnum = NULL;
277 if (dnum) *dnum = atoi(pdnum);
278 if (snum) *snum = psnum ? atoi(psnum) : 0;
279 if (dnet) *dnet = isdnet ? 1 : 0;
280 if (host) *host = NEWSTR(hp);
282 DPR3(("parse_dpy_str(%s):\thost=%s dnum=%d snum=%d dnet=%d\n",
283 display_str, *host, *dnum, *snum, *dnet));
288 char *std_dpy_str(char *display_str, int *snum)
290 char buf[BUFSIZ], *bp, val[20];
292 int dnum = 0, dnet = 0;
295 if (parse_dpy_str(display_str, &host, &dnum, snum, &dnet) == False)
298 /* sprintf(buf, "%s:%s%d", host, dnet ? ":" : NULL, dnum); */
299 bp = buf; buf[0] = 0;
300 bp = strcpyx(bp, host); *bp++ = ':';
301 if (dnet) *bp++ = ':';
302 sprintf(val, "%ld", (long) dnum);
303 bp = strcpyx(bp, val);
305 DPR3(("std_dpy_str(): \"%s\" --> \"%s\" snum=%d\n",
306 display_str, buf, *snum));
313 /* ******** file & dir manipulation ******** */
315 int make_user_dir(char *path)
317 if (!is_directory(path, False)) {
318 if (access(path, F_OK) == 0)
320 if (mkdir(path, 0777) != 0)
322 DPR(("make_user_dir(%s): created\n", path));
327 char *dirname(char *path)
329 static char dname[MAXPATHLEN];
330 register char *p = path;
333 /* if (!p || !p[0]) return NULL; */
335 for (p = path + strlen(path) - 1; p > path && *p == '/'; p--) ;
337 memcpy(dname, path, dlen);
340 if (p = strrchr(dname, '/')) {
345 for ( ; p > dname && *p == '/'; p--) *p = 0;
354 int is_directory(char *path, int must_writable)
357 int mode = R_OK|X_OK;
359 if (must_writable) mode |= W_OK;
360 return stat(path, &stb) == 0 && S_ISDIR(stb.st_mode)
361 && access(path, mode) == 0;
365 int is_regularfile(char *path)
368 return stat(path, &stb) == 0 && S_ISREG(stb.st_mode);
371 int is_emptyfile(char *path)
374 return stat(path, &stb) == 0 && S_ISREG(stb.st_mode) && stb.st_size == 0;
379 int is_executable(char *path)
382 return stat(path, &stb) == 0 && S_ISREG(stb.st_mode)
383 && access(path, R_OK|X_OK) == 0;
387 int is_writable(char *path)
389 if (access(path, R_OK|W_OK) == 0)
391 else if (errno == ENOENT) /* check directory permission */
392 return is_directory(dirname(path), True);
398 int is_readable(char *path, int allow_empty)
401 return stat(path, &stb) == 0 && S_ISREG(stb.st_mode)
402 && access(path, R_OK) == 0 && (allow_empty || stb.st_size > 0);
406 /* ******** file reading ******** */
408 static int tag_line_num = 0;
409 static char *tag_linebuf = NULL;
410 static char *tag_file = NULL;
412 int start_tag_line(char *fname)
416 tag_linebuf = ALLOC(BUFSIZ, char);
420 if (tag_linebuf) FREE(tag_linebuf);
421 tag_linebuf = tag_file = 0;
427 int read_tag_line(FILE *fp, char **tagp, char **valp)
431 while (fgets(lp = tag_linebuf, BUFSIZ, fp)) {
433 skip_white(lp); /* lp = trim_line(lp); */
434 if (!*lp || *lp == '\n' || is_comment_char(*lp))
436 if (!(lp2 = strchr(lp, TAG_END_CHAR))) {
437 DPR3(("\t[line=%d] no tag on '%s'\n", tag_line_num, tag_file));
441 lp2 = trim_line(lp2);
444 *valp = *lp2 ? lp2 : 0;
449 return (ferror(fp)) ? -1 : 0;
453 /* ******** put messages ******** */
455 void put_xims_msg(int msg_type, int err_num, void *arg1, void *arg2, void *arg3)
460 msg = xims_errmsg(err_num, arg1, arg2, arg3);
463 { static char buf[80];
464 sprintf(buf, "ERROR: %s (%d)\n", error_name(err_num), err_num);
469 if (!msg || !*msg) return;
471 if (UseMsgWindow && useWINDOW()) {
472 ret = put_msg_win(msg_type, msg);
479 LastErrMsg = err_num;
484 void put_xims_errmsg(int err_num, void *arg1, void *arg2, void *arg3)
487 put_xims_msg(MSGTYP_FATAL, err_num, arg1, arg2, arg3);
490 void put_xims_warnmsg(int err_num, void *arg1, void *arg2, void *arg3)
493 put_xims_msg(MSGTYP_WARN, err_num, arg1, arg2, arg3);
498 /* for DPR*() macro */
499 void print_msg(char *fmt, void *arg1, void *arg2, void *arg3, void *arg4, void *arg5)
501 fprintf(LogFp, fmt, arg1, arg2, arg3, arg4, arg5);
506 int put_xims_log(char *fmt, void *arg1, void *arg2, void *arg3)
509 char *logpath = Opt.LogPath;
511 /* if (Verbose < 1) return False; */
513 if (fp = fopen(logpath, "a")) {
515 time_t tm = time((time_t *)0);
517 if (strftime(time_str, 80, /* "%x %X" */ "%D %T", localtime(&tm)) == 0)
519 fprintf(fp, "[%s] %s: ", time_str, ProgramName);
520 fprintf(fp, fmt, arg1, arg2, arg3);
525 DPR(("put_xims_log(); failed on '%s'\n", logpath));
530 /* ******** clear structure ******** */
532 void clear_ImsConf(ImsConf *ims)
534 FREE(ims->servername);
535 FREE(ims->servername2);
536 FREE(ims->classname);
539 FREE(ims->cmd_param);
541 FREE(ims->env_unset);
547 void clear_ImsEnt(ImsEnt *ent)
553 clear_ImsConf(ent->ims);
559 void clear_ImsList(ImsList *list)
563 for (i = 0; i < list->num_ent; i++) {
564 clear_ImsEnt(list->elist[i]);
565 FREE(list->elist[i]);
570 list->default_idx = -1;
571 list->def_selmode = SEL_MODE_NOAUTO;
575 void clear_FileSel(FileSel *fsel)
578 FREE(fsel->hostname);
579 FREE(fsel->real_fname);
583 for (op = fsel->opts; *op; op++) {
584 FREE((*op)->ims_name);
585 FREE((*op)->opt_str);
593 fsel->select_mode = SEL_MODE_NONE;
595 fsel->dpy_specific = False;
598 void clear_UserSelection(UserSelection *sel)
603 clear_FileSel(sel->fsel);
607 clear_RunEnv(sel->renv);
610 /* FREE(sel->list); don't free */
611 /* FREE(sel->ent); don't free */
613 CLR(sel, UserSelection);
615 sel->host_type = HOST_LOCAL;
616 sel->flag = F_SELECT_NONE;
617 sel->status = NoError;
623 void clear_RunEnv(RunEnv *renv)
626 FREE(renv->atom_name);
630 renv->status = NoError;;
634 void clear_OutEnv(OutEnv *oenv)
640 for (ep = oenv->set; ep->name; ep++) {
641 FREE(ep->name); FREE(ep->value);
644 for (ep = oenv->unset; ep->name; ep++) {
645 FREE(ep->name); FREE(ep->value);
651 void clear_UserEnv(void)
653 UserEnv *uenv = &userEnv;
655 FREE(uenv->hostname);
656 FREE(uenv->username);
659 FREE(uenv->real_locale);
660 FREE(uenv->displayname);
661 FREE(uenv->displaydir);
662 FREE(uenv->xmodifiers);
663 FREE_LIST(uenv->locale_aliases);
665 CLR(&userEnv, UserEnv);
669 void clear_CmdConf(void)
671 if (cmdconf_initialized) {
672 CmdConf *conf = &Conf;
676 FREE(conf->imsConfDir);
677 FREE(conf->imsAppDir);
678 FREE(conf->imsLogDir);
679 FREE(conf->imsLogDile);
681 FREE(conf->userImsDir);
682 FREE(conf->userTmpDir);
683 FREE(conf->userAltDir);
685 for (i = 0; i < NUM_PROTOCOLS; i++) {
689 for (i = 0; i < NUM_ACTIONS; i++) {
690 FREE(conf->action[i]);
693 FREE(conf->remote->passEnv);
697 FREE(conf->dt->confDir);
698 FREE(conf->dt->userDir);
699 FREE(conf->dt->resPath);
704 FREE(conf->vue->confDir);
705 FREE(conf->vue->userDir);
706 FREE(conf->vue->uselite);
707 FREE(conf->vue->resPath);
708 FREE(conf->vue->litePath);
712 for (ap = conf->alias; *ap; ap++) {
714 FREE((*ap)->aliases);
719 for (i = 0; i < XHP_LANG_NUM; i++)
720 FREE(conf->xhp[i].locales);
723 # endif /* old_hpux */
726 cmdconf_initialized = False;
730 void clear_WinEnv(void)
732 CLR(&winEnv, WinEnv);
735 void clear_CmdOpt(void)
742 UserSelection *sel = &userSel;
744 if (sel->list && sel->list != localList) {
745 clear_ImsList(sel->list);
749 clear_ImsList(localList);
753 clear_UserSelection(sel);
754 /* clear_FileSel(sel->fsel); */
755 /* clear_RunEnv(sel->renv); */
768 /* ******** print structure (for DEBUG) ******** */
770 void pr_FileSel(FileSel *fsel)
772 fprintf(LogFp, "FileSel:\tdpy_specific=%d real_fname=%s select_mode=%d\n",
773 fsel->dpy_specific, fsel->real_fname, fsel->select_mode);
774 fprintf(LogFp, "\tname=%s host=%s iconic=%d com_opt='%s' opts=%#x\n",
775 fsel->name, fsel->hostname, fsel->iconic, fsel->com_opt, fsel->opts);
779 for (op = fsel->opts; *op; op++)
780 fprintf(LogFp, "\t opts[%d] <%s>\t'%s'\n",
781 op - fsel->opts, (*op)->ims_name, (*op)->opt_str);
785 void pr_UserSelection(UserSelection *sel)
787 fprintf(LogFp, "userSelection:\tstatus=%s flag=%#x ims_idx=%d\n",
788 error_name(sel->status), sel->flag, sel->ims_idx);
789 fprintf(LogFp, "\tname=%s host=%s host_type=%d iconic=%d\n",
790 sel->name, sel->hostname, sel->host_type, sel->iconic);
791 fprintf(LogFp, "\tfsel=%#x list=%#x ent=%#x renv=%#x\n",
792 sel->fsel, sel->list, sel->ent, sel->renv);
793 if (sel->fsel) pr_FileSel(sel->fsel);
794 if (sel->renv) pr_RunEnv(sel->renv);
797 void pr_ImsConf(ImsConf *conf, char *ims_name)
801 fprintf(LogFp, "ImsConf:\tname=%s protocols=%s%s%s%s\n", ims_name,
802 (conf->protocols & ProtoBit(Proto_XIM)) ? "XIM," : NULL,
803 (conf->protocols & ProtoBit(Proto_Ximp)) ? "Ximp," : NULL,
804 (conf->protocols & ProtoBit(Proto_Xsi)) ? "Xsi," : NULL,
806 (conf->protocols & ProtoBit(Proto_Xhp)) ? "Xhp," : NULL,
809 # endif /* old_hpux */
810 (conf->protocols & ProtoBit(Proto_None)) ? "None," : NULL);
811 fprintf(LogFp, "\tproperty=%s servername=%s (%s) class=%s\n",
812 conf->property, conf->servername,
813 conf->servername2, conf->classname);
814 fprintf(LogFp, "\tpath=%s param='%s'\n",
815 conf->cmd_path, conf->cmd_param);
816 fprintf(LogFp, "\ttimeout=%d interval=%d flags=%s%s%s\n",
817 conf->timeout, conf->interval,
818 (conf->flags & F_NO_SERVER) ? "no_server," : NULL,
819 (conf->flags & F_NO_REMOTE) ? "no_remote," : NULL,
820 (conf->flags & F_NO_OPTION) ? "no_option," : NULL,
821 (conf->flags & F_TRY_CONNECT) ? "try_connect," : NULL);
822 fprintf(LogFp, "\tenv_set: '%s'\n", conf->env_set);
823 fprintf(LogFp, "\tenv_unset: '%s'\n", conf->env_unset);
824 fprintf(LogFp, "\tenv_pass: '%s'\n", conf->env_pass);
828 void pr_ImsEnt(ImsEnt *ent, int idx)
830 fprintf(LogFp, "ImsEnt[%d]:\tname=%s fname=%s label=%s ims=%#x\n",
831 idx, ent->name, ent->fname, ent->label, ent->ims);
834 void pr_ImsList(ImsList *list)
839 fprintf(LogFp, "ImsList:\tstatus=%d num_ent=%d def_idx=%d def_sel=%d\n",
840 list->status, list->num_ent, list->default_idx, list->def_selmode);
841 for (i = 0; i < list->num_ent; i++) {
842 ent = list->elist[i];
844 if (ent->ims) pr_ImsConf(ent->ims, ent->name);
848 void pr_WinEnv(WinEnv *wenv)
850 fprintf(LogFp, "WinEnv:\tstatus=%d Dpy=%#x topW=%#x appC=%#x\n",
851 wenv->status, wenv->Dpy, wenv->TopW, wenv->appC);
852 fprintf(LogFp, "\tatom_owner=%#x atom: main=%d status=%d data=%d\n",
853 wenv->atom_owner, wenv->atom_main, wenv->atom_status, wenv->atom_data);
856 void pr_RunEnv(RunEnv *renv)
858 fprintf(LogFp, "RunEnv:\tstatus=%s is_remote=%d proto=%d\n",
859 error_name(renv->status), renv->is_remote, proto_name(renv->proto));
860 fprintf(LogFp, "\tim_mod='%s' atom_name='%s' prop_atom=%d\n",
861 renv->im_mod, renv->atom_name, renv->prop_atom);
862 fprintf(LogFp, "\tpid=%d wait_status=%#x cmdbuf='%s'\n",
863 renv->pid, renv->wait_status, renv->cmdbuf);
867 void pr_UserEnv(void)
869 UserEnv *uenv = &userEnv;
871 fprintf(LogFp, "UserEnv:\n");
872 fprintf(LogFp, "\thostname=\"%s\"\n", uenv->hostname);
873 fprintf(LogFp, "\tusername=\"%s\"\n", uenv->username);
874 fprintf(LogFp, "\tlocale=\"%s\" real_locale=\"%s\"\n",
875 uenv->locale, uenv->real_locale);
876 fprintf(LogFp, "\thomedir=\"%s\"\n", uenv->homedir);
877 fprintf(LogFp, "\tdisplayname=\"%s\"\n", uenv->displayname);
878 fprintf(LogFp, "\tdisplaydir=\"%s\"\n", uenv->displaydir);
879 fprintf(LogFp, "\tscreen_num=%d\n", uenv->screen_num);
882 void pr_OutEnv(OutEnv *oenv)
886 fprintf(LogFp, "OutEnv:\n");
887 fprintf(LogFp, " set: \t");
889 for (ep = oenv->set; ep->name; ep++)
890 fprintf(LogFp, "%s='%s' ", ep->name, ep->value);
893 fprintf(LogFp, " unset:\t");
895 for (ep = oenv->unset; ep->name; ep++)
896 fprintf(LogFp, "%s='%s' ", ep->name, ep->value);
901 void pr_CmdConf(void)
904 CmdConf *conf = &Conf;
907 # endif /* old_hpux */
910 fprintf(LogFp, "CmdConf:\n");
911 fprintf(LogFp, "\timsConfDir=%s\n", conf->imsConfDir);
912 fprintf(LogFp, "\timsAppDir=%s\n", conf->imsAppDir);
913 fprintf(LogFp, "\timsLogDir=%s\n", conf->imsLogDir);
914 fprintf(LogFp, "\timsLogFile=%s\n", conf->imsLogFile);
915 fprintf(LogFp, "\timsDir=%s\n", conf->imsDir);
916 fprintf(LogFp, "\tuserImsDir=%s\n", conf->userImsDir);
917 fprintf(LogFp, "\tuserTmpDir=%s\n", conf->userTmpDir);
918 fprintf(LogFp, "\tuserAltDir=%s\n", conf->userAltDir);
921 fprintf(LogFp, "\tImXmod:\tXIM=%s Ximp=%s Xsi=%s Xhp=%s None=%s\n",
922 conf->xmod[Proto_XIM], conf->xmod[Proto_Ximp],
923 conf->xmod[Proto_Xsi], conf->xmod[Proto_Xhp], conf->atom[Proto_None]);
924 fprintf(LogFp, "\tImAtom:\tXIM=%s Ximp=%s Xsi=%s Xhp=%s None=%s\n",
925 conf->atom[Proto_XIM], conf->atom[Proto_Ximp],
926 conf->atom[Proto_Xsi], conf->atom[Proto_Xhp], conf->atom[Proto_None]);
928 fprintf(LogFp, "\tImXmod:\tXIM=%s Ximp=%s Xsi=%s None=%s\n",
929 conf->xmod[Proto_XIM], conf->xmod[Proto_Ximp],
930 conf->xmod[Proto_Xsi], conf->atom[Proto_None]);
931 fprintf(LogFp, "\tImAtom:\tXIM=%s Ximp=%s Xsi=%s None=%s\n",
932 conf->atom[Proto_XIM], conf->atom[Proto_Ximp],
933 conf->atom[Proto_Xsi], conf->atom[Proto_None]);
934 # endif /* old_hpux */
936 fprintf(LogFp, "\tAction[%d]:\t{ ", NUM_ACTIONS);
937 for (i = 0; i < NUM_ACTIONS; i++)
938 fprintf(LogFp, "\"%s\", ", conf->action[i]);
939 fprintf(LogFp, "}\n");
941 fprintf(LogFp, "\tRemote:\tDisabled=%s useRemsh=%s timeout=%d\n",
942 conf->remote->disabled ? "True" : "False",
943 conf->remote->useRemsh ? "True" : "False",
944 conf->remote->timeout);
945 fprintf(LogFp, "\t Env:\t%s\n", conf->remote->passEnv);
948 fprintf(LogFp, "\tDtEnv:\tConfDir=%s UserDir=%s\n",
949 conf->dt->confDir, conf->dt->userDir);
950 fprintf(LogFp, "\t resPath=\"%s\"\n", conf->dt->resPath);
952 fprintf(LogFp, "\tDtEnv:\t<None>\n");
956 fprintf(LogFp, "\tVueEnv:\tConfDir=%s UserDir=%s\n",
957 conf->vue->confDir, conf->vue->userDir);
958 fprintf(LogFp, "\t uselite=%s\n", conf->vue->uselite);
959 fprintf(LogFp, "\t resPath=\"%s\"\n", conf->vue->resPath);
960 fprintf(LogFp, "\t litePath=\"%s\"\n", conf->vue->litePath);
962 fprintf(LogFp, "\tVueEnv:\t<None>\n");
964 fprintf(LogFp, "\tlocaleAlias:\t%s\n", conf->alias ? NULL : "None");
966 for (ap = conf->alias; *ap; ap++)
967 fprintf(LogFp, "\t [%s]\t%s\n", (*ap)->name, (*ap)->aliases);
970 fprintf(LogFp, "\txhp:\t%s\n", conf->xhp ? NULL : "None");
972 for (i = 0; i < XHP_LANG_NUM; i++)
973 fprintf(LogFp, "\t [%c]\t%s\n",
974 conf->xhp[i].type, conf->xhp[i].locales);
976 # endif /* old_hpux */
981 fprintf(LogFp, "CmdOpt:\tDisplayName=%s LocaleName=%s ShellName=%s\n",
982 Opt.DisplayName, Opt.LocaleName, Opt.ShellName);
983 fprintf(LogFp, "\tConfPath=%s UserPath=%s\n",
984 Opt.ConfPath, Opt.UserPath);
985 fprintf(LogFp, "\tLogPath=%s ResourceFile=%s\n",
986 Opt.LogPath, Opt.ResourceFile);
987 fprintf(LogFp, "\tImsName=%s HostName=%s ImsOption=%s\n",
988 Opt.ImsName, Opt.HostName, Opt.ImsOption);
989 fprintf(LogFp, "\tSelectMode=%d Timeout=%d Interval=%d\n",
990 Opt.SelectMode, Opt.Timeout, Opt.Interval);
993 void pr_OpModeFlag(void)
995 char *name = "<unknown>";
998 case MODE_START: name = "START"; break;
999 case MODE_MODE: name = "MODE"; break;
1000 case MODE_STYLE: name = "STYLE"; break;
1001 case MODE_LIST: name = "LIST"; break;
1002 case MODE_CURRENT: name = "CURRENT"; break;
1003 case MODE_REMCONF: name = "REMCONF"; break;
1005 fprintf(LogFp, "OpMode=%s[%d] OpFlag=[%#x] ", name, OpMode, OpFlag);
1008 if (OpFlag & FLAG_ENV) fputs("Env, ", LogFp);
1009 if (OpFlag & FLAG_NOSAVE) fputs("NoSave, ", LogFp);
1010 if (OpFlag & FLAG_NOSTART) fputs("NoStart, ", LogFp);
1011 if (OpFlag & FLAG_NOWAIT) fputs("NoWait, ", LogFp);
1012 if (OpFlag & FLAG_NOTIMEOUT) fputs("NoTimeout, ", LogFp);
1013 if (OpFlag & FLAG_NORESOURCE) fputs("NoResource, ", LogFp);
1014 if (OpFlag & FLAG_NOREMOTE) fputs("NoRemote, ", LogFp);
1015 if (OpFlag & FLAG_NOTIFY) fputs("Notify, ", LogFp);
1016 if (OpFlag & FLAG_CONNECT) fputs("Connect, ", LogFp);
1017 if (OpFlag & FLAG_REMOTERUN) fputs("RemoteRun, ", LogFp);
1018 if (OpFlag & FLAG_WINDOW) fputs("Window, ", LogFp);
1019 if (OpFlag & FLAG_DT) fputs("Dt, ", LogFp);
1021 if (OpFlag & FLAG_VUE) fputs("Vue, ", LogFp);
1022 # endif /* old_hpux */
1027 static char *StateNameTbl[] = {
1050 #define NumStates (sizeof(StateNameTbl) / sizeof(char *))
1052 char *StateName(void)
1054 return (OpState >= 0 && OpState < NumStates) ?
1055 StateNameTbl[OpState] : "<unknown>";
1059 /* ******** error name ******** */
1061 char *error_name(ximsError error)
1063 char *name = "<unknown>";
1066 #define ERR_CASE(err) case err : name = #err; break
1068 #define ERR_CASE(err) case err : name = "err"; break
1069 # endif /* __STDC__ */
1073 ERR_CASE(ErrSyntax);
1074 ERR_CASE(ErrNoHome);
1075 ERR_CASE(ErrNoLocale);
1076 ERR_CASE(ErrNoCDELocale);
1077 ERR_CASE(ErrNoDisplay);
1078 ERR_CASE(ErrDisabled);
1079 ERR_CASE(ErrSignaled);
1082 ERR_CASE(ErrFileOpen);
1083 ERR_CASE(ErrFileCreate);
1084 ERR_CASE(ErrDirCreate);
1085 ERR_CASE(ErrMissEntry);
1088 ERR_CASE(ErrAnotherProg);
1089 ERR_CASE(ErrNoSelectionFile);
1090 ERR_CASE(ErrSaveSelection);
1091 ERR_CASE(ErrNoSelection);
1092 ERR_CASE(ErrNoLocaleConf);
1093 ERR_CASE(ErrNoImsEntry);
1094 ERR_CASE(ErrNoImsConf);
1095 ERR_CASE(ErrNotRegistered);
1096 ERR_CASE(ErrNoExecutable);
1099 ERR_CASE(ErrImsRunning);
1100 ERR_CASE(ErrImsExecution);
1101 ERR_CASE(ErrImsAborted);
1102 ERR_CASE(ErrImsTimeout);
1103 ERR_CASE(ErrUnknownHost);
1104 ERR_CASE(ErrRemoteAction);
1105 ERR_CASE(ErrRemoteData);
1106 ERR_CASE(ErrRemoteNoIms);
1107 ERR_CASE(ErrRemoteMissIms);
1108 ERR_CASE(ErrNoImsstart);
1109 ERR_CASE(ErrRemoteIms);
1112 ERR_CASE(ErrOpenDpy);
1115 ERR_CASE(ErrMemory);
1118 ERR_CASE(ErrIsNone);
1119 ERR_CASE(ErrNotRun);
1120 ERR_CASE(ErrImsWaiting);
1121 ERR_CASE(ErrImsWaitDone);
1122 ERR_CASE(ErrImsConnecting);
1123 ERR_CASE(ErrImsConnectDone);
1124 ERR_CASE(ErrInvState);
1125 ERR_CASE(ErrInternal);
1133 static char *_proto_names[NUM_PROTOCOLS] =
1135 { "None", "XIM", "Ximp", "Xsi", "Xhp" };
1137 { "None", "XIM", "Ximp", "Xsi" };
1138 # endif /* old_hpux */
1140 char *proto_name(int proto_idx)
1142 if (proto_idx >= 0 && proto_idx < NUM_PROTOCOLS)
1143 return _proto_names[proto_idx];
1148 static char *SigNames[] = { /* 1 ~ 32 */
1149 "HUP", "INT", "QUIT", "ILL", "TRAP", "IOT,ABRT", "EMT", "FPE",
1150 "KILL", "BUS", "SEGV", "SYS", "PIPE", "ALRM", "TERM", "USR1",
1151 "USR2", "CHLD", "PWR", "VTALRM", "PROF", "POLL,IO", "WINCH", "STOP",
1152 "TSTP", "CONT", "TTIN", "TTOU", "URG", "LOST", "(reserved)", "DIL",
1155 #define MaxSigNum (sizeof(SigNames) / sizeof(char *))
1157 char *sig_name(int sig)
1159 return (sig > 0 && sig <= MaxSigNum) ? SigNames[sig - 1] : "<unknown>";
1163 void pr_brk(char *msg)
1165 static char *last_brk = 0;
1166 char *new_brk = (char *) sbrk(0);
1167 long inc = (long) (new_brk - last_brk);
1169 inc += inc > 0 ? 1023 : -1023;
1170 DPR(("%s: BREAK=%p (Inc=%+d KB)\n", msg, new_brk, inc/1024));