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 librararies 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 $ */
25 #include <DtHelp/LocaleXlate.h> /* for locale equivalence between platforms */
30 /* ******** locale name manupilation ******** */
32 int find_CDE_locale_name()
34 UserEnv *uenv = &userEnv;
37 char plat[_DtPLATFORM_MAX_LEN];
40 static bool first = True;
44 uenv->CDE_locale = NULL;
46 ret = _DtLcxOpenAllDbs(&db);
49 ret = _DtXlateGetXlateEnv(db, plat, &execver, &compver);
52 ret = _DtLcxXlateOpToStd(db, plat, compver, DtLCX_OPER_SETLOCALE,
53 uenv->locale, &uenv->CDE_locale,
56 ret = _DtLcxCloseDb(&db);
63 char *find_system_locale_name(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(dest, src)
96 register char *dest, *src;
98 while (*dest++ = *src++) ;
103 char *strcpy2(dest, src1, src2)
104 register char *dest, *src1, *src2;
106 while (*dest++ = *src1++) ;
108 while (*dest++ = *src2++) ;
112 char *newstradded(src1, src2, src3)
113 register char *src1, *src2, *src3;
118 dest = p = ALLOC(strlen(src1) + strlen(src2) + strlen(src3) + 1, char);
119 if (src1) { while (*p++ = *src1++) ; p--; }
120 if (src2) { while (*p++ = *src2++) ; p--; }
121 if (src3) { while (*p++ = *src3++) ; }
127 int str_to_int(ptr, val)
134 /* if (!ptr || !*ptr || !val) return(False); */
136 base = ptr[0] == '0' ? (((ptr[1] & 0xdf) == 'X') ? 16 : 8) : 10;
137 *val = strtol(ptr, &pp, base);
138 if (!pp || *pp) return(False);
142 bool str_to_bool(ptr, def_val)
146 if (!ptr || !*ptr) return def_val;
149 switch (*ptr) { /* true/false , 0/1 , yes/no , on/off */
153 def_val = True; break;
158 def_val = False; break;
161 if (ptr[1] == 'N' || ptr[1] == 'n')
163 else if (ptr[1] == 'F' || ptr[1] == 'f')
173 register char *lastp;
176 for (lastp = ptr + strlen(ptr) - 1;
177 lastp >= ptr && (is_white(*lastp) || *lastp == '\n'); lastp--) ;
179 return ptr; /* return lastp > ptr ? ptr : NULL; */
182 char **parse_strlist(ptr, sep_ch)
186 char *pbuf[100], **new, **bp;
191 if (!ptr || !*ptr) return (char **)0;
192 ptr = save_ptr = NEWSTR(ptr);
194 if (!sep_ch) sep_ch = ',';
195 bp = pbuf; pbuf[0] = NULL;
198 if (sep = strchr(ptr, sep_ch)) *sep++ = 0;
202 if (bp - pbuf >= 100) sep = NULL; /* over-flow */
208 new = ALLOC(n + 1, char *);
209 memcpy((void *) new, (void *)pbuf, n * sizeof(char *));
218 int pack_strlist(ptr, listp, sep_ch)
222 register char *bp = ptr, **lp = listp;
224 /* if (!ptr) return 0; */
229 if (!sep_ch) sep_ch = ',';
231 for (bp; *lp; lp++) {
232 bp = strcpyx(bp, *lp);
236 DPR2(("pack_strlist(): ptr='%s'\n", ptr));
242 void free_strlist(pp)
245 register char **ptr = pp;
248 for ( ; *ptr; ptr++) FREE(*ptr);
253 /* ******** display string ******** */
255 bool parse_dpy_str(display_str, host, dnum, snum, dnet)
256 char *display_str, **host;
257 int *dnum, *snum, *dnet;
259 char buf[BUFSIZ], hostbuf[BUFSIZ], *p, *hp, *pdnum, *psnum;
262 strcpy(buf, display_str);
264 /* extract host name */
265 if (!(p = strchr(buf, ':'))) return False;
267 if (*p == ':') { /* DECnet ? */
273 if (!*hp || strcmp(hp, "unix") == 0 || strcmp(hp, "local") == 0) {
274 gethostname(hostbuf, BUFSIZ);
277 if (p = strchr(hp, '.')) *p = 0;
279 /* extract display number */
280 for (p = pdnum; *p && isdigit(*p); p++) ;
281 if (p == pdnum || (*p && *p != '.'))
285 if (*p) { /* extract screen number */
286 *p++ = 0; /* must be '.' */
287 for (psnum = p; *p && isdigit(*p); p++) ;
288 if (p == psnum || *p) psnum = NULL;
292 if (dnum) *dnum = atoi(pdnum);
293 if (snum) *snum = psnum ? atoi(psnum) : 0;
294 if (dnet) *dnet = isdnet ? 1 : 0;
295 if (host) *host = NEWSTR(hp);
297 DPR3(("parse_dpy_str(%s):\thost=%s dnum=%d snum=%d dnet=%d\n",
298 display_str, *host, *dnum, *snum, *dnet));
303 char *std_dpy_str(display_str, snum)
307 char buf[BUFSIZ], *bp, val[20];
309 int dnum = 0, dnet = 0;
312 if (parse_dpy_str(display_str, &host, &dnum, snum, &dnet) == False)
315 /* sprintf(buf, "%s:%s%d", host, dnet ? ":" : NULL, dnum); */
316 bp = buf; buf[0] = 0;
317 bp = strcpyx(bp, host); *bp++ = ':';
318 if (dnet) *bp++ = ':';
319 sprintf(val, "%ld", (long) dnum);
320 bp = strcpyx(bp, val);
322 DPR3(("std_dpy_str(): \"%s\" --> \"%s\" snum=%d\n",
323 display_str, buf, *snum));
330 /* ******** file & dir manipulation ******** */
332 int make_user_dir(path)
335 if (!is_directory(path, False)) {
336 if (access(path, F_OK) == 0)
338 if (mkdir(path, 0777) != 0)
340 DPR(("make_user_dir(%s): created\n", path));
348 static char dname[MAXPATHLEN];
349 register char *p = path;
352 /* if (!p || !p[0]) return NULL; */
354 for (p = path + strlen(path) - 1; p > path && *p == '/'; p--) ;
356 memcpy(dname, path, dlen);
359 if (p = strrchr(dname, '/')) {
364 for ( ; p > dname && *p == '/'; p--) *p = 0;
373 int is_directory(path, must_writable)
378 int mode = R_OK|X_OK;
380 if (must_writable) mode |= W_OK;
381 return stat(path, &stb) == 0 && S_ISDIR(stb.st_mode)
382 && access(path, mode) == 0;
386 int is_regularfile(path)
390 return stat(path, &stb) == 0 && S_ISREG(stb.st_mode);
393 int is_emptyfile(path)
397 return stat(path, &stb) == 0 && S_ISREG(stb.st_mode) && stb.st_size == 0;
402 int is_executable(path)
406 return stat(path, &stb) == 0 && S_ISREG(stb.st_mode)
407 && access(path, R_OK|X_OK) == 0;
411 int is_writable(path)
414 if (access(path, R_OK|W_OK) == 0)
416 else if (errno == ENOENT) /* check directory permission */
417 return is_directory(dirname(path), True);
423 int is_readable(path, allow_empty)
428 return stat(path, &stb) == 0 && S_ISREG(stb.st_mode)
429 && access(path, R_OK) == 0 && (allow_empty || stb.st_size > 0);
433 /* ******** file reading ******** */
435 static int tag_line_num = 0;
436 static char *tag_linebuf = NULL;
437 static char *tag_file = NULL;
439 int start_tag_line(fname)
444 tag_linebuf = ALLOC(BUFSIZ, char);
448 if (tag_linebuf) FREE(tag_linebuf);
449 tag_linebuf = tag_file = 0;
455 int read_tag_line(fp, tagp, valp)
461 while (fgets(lp = tag_linebuf, BUFSIZ, fp)) {
463 skip_white(lp); /* lp = trim_line(lp); */
464 if (!*lp || *lp == '\n' || is_comment_char(*lp))
466 if (!(lp2 = strchr(lp, TAG_END_CHAR))) {
467 DPR3(("\t[line=%d] no tag on '%s'\n", tag_line_num, tag_file));
471 lp2 = trim_line(lp2);
474 *valp = *lp2 ? lp2 : 0;
479 return (ferror(fp)) ? -1 : 0;
483 /* ******** put messages ******** */
485 void put_xims_msg(msg_type, err_num, arg1, arg2, arg3)
486 int msg_type, err_num;
487 void *arg1, *arg2, *arg3;
492 msg = xims_errmsg(err_num, arg1, arg2, arg3);
495 { static char buf[80];
496 sprintf(buf, "ERROR: %s (%d)\n", error_name(err_num), err_num);
501 if (!msg || !*msg) return;
503 if (UseMsgWindow && useWINDOW()) {
504 ret = put_msg_win(msg_type, msg);
511 LastErrMsg = err_num;
516 void put_xims_errmsg(err_num, arg1, arg2, arg3)
518 void *arg1, *arg2, *arg3;
521 put_xims_msg(MSGTYP_FATAL, err_num, arg1, arg2, arg3);
524 void put_xims_warnmsg(err_num, arg1, arg2, arg3)
526 void *arg1, *arg2, *arg3;
529 put_xims_msg(MSGTYP_WARN, err_num, arg1, arg2, arg3);
534 /* for DPR*() macro */
535 void print_msg(fmt, arg1, arg2, arg3, arg4, arg5)
537 void *arg1, *arg2, *arg3, *arg4, *arg5;
539 fprintf(LogFp, fmt, arg1, arg2, arg3, arg4, arg5);
544 int put_xims_log(fmt, arg1, arg2, arg3)
546 void *arg1, *arg2, *arg3;
549 char *logpath = Opt.LogPath;
551 /* if (Verbose < 1) return False; */
553 if (fp = fopen(logpath, "a")) {
555 time_t tm = time((time_t *)0);
557 if (strftime(time_str, 80, /* "%x %X" */ "%D %T", localtime(&tm)) == 0)
559 fprintf(fp, "[%s] %s: ", time_str, ProgramName);
560 fprintf(fp, fmt, arg1, arg2, arg3);
565 DPR(("put_xims_log(); failed on '%s'\n", logpath));
570 /* ******** clear structure ******** */
572 void clear_ImsConf(ims)
575 FREE(ims->servername);
576 FREE(ims->servername2);
577 FREE(ims->classname);
580 FREE(ims->cmd_param);
582 FREE(ims->env_unset);
588 void clear_ImsEnt(ent)
595 clear_ImsConf(ent->ims);
601 void clear_ImsList(list)
606 for (i = 0; i < list->num_ent; i++) {
607 clear_ImsEnt(list->elist[i]);
608 FREE(list->elist[i]);
613 list->default_idx = -1;
614 list->def_selmode = SEL_MODE_NOAUTO;
618 void clear_FileSel(fsel)
622 FREE(fsel->hostname);
623 FREE(fsel->real_fname);
627 for (op = fsel->opts; *op; op++) {
628 FREE((*op)->ims_name);
629 FREE((*op)->opt_str);
637 fsel->select_mode = SEL_MODE_NONE;
639 fsel->dpy_specific = False;
642 void clear_UserSelection(sel)
648 clear_FileSel(sel->fsel);
652 clear_RunEnv(sel->renv);
655 /* FREE(sel->list); don't free */
656 /* FREE(sel->ent); don't free */
658 CLR(sel, UserSelection);
660 sel->host_type = HOST_LOCAL;
661 sel->flag = F_SELECT_NONE;
662 sel->status = NoError;
668 void clear_RunEnv(renv)
672 FREE(renv->atom_name);
676 renv->status = NoError;;
680 void clear_OutEnv(oenv)
687 for (ep = oenv->set; ep->name; ep++) {
688 FREE(ep->name); FREE(ep->value);
691 for (ep = oenv->unset; ep->name; ep++) {
692 FREE(ep->name); FREE(ep->value);
700 UserEnv *uenv = &userEnv;
702 FREE(uenv->hostname);
703 FREE(uenv->username);
706 FREE(uenv->real_locale);
707 FREE(uenv->displayname);
708 FREE(uenv->displaydir);
709 FREE(uenv->xmodifiers);
710 FREE_LIST(uenv->locale_aliases);
712 CLR(&userEnv, UserEnv);
718 if (cmdconf_initialized) {
719 CmdConf *conf = &Conf;
723 FREE(conf->imsConfDir);
724 FREE(conf->imsAppDir);
725 FREE(conf->imsLogDir);
726 FREE(conf->imsLogDile);
728 FREE(conf->userImsDir);
729 FREE(conf->userTmpDir);
730 FREE(conf->userAltDir);
732 for (i = 0; i < NUM_PROTOCOLS; i++) {
736 for (i = 0; i < NUM_ACTIONS; i++) {
737 FREE(conf->action[i]);
740 FREE(conf->remote->passEnv);
744 FREE(conf->dt->confDir);
745 FREE(conf->dt->userDir);
746 FREE(conf->dt->resPath);
751 FREE(conf->vue->confDir);
752 FREE(conf->vue->userDir);
753 FREE(conf->vue->uselite);
754 FREE(conf->vue->resPath);
755 FREE(conf->vue->litePath);
759 for (ap = conf->alias; *ap; ap++) {
761 FREE((*ap)->aliases);
766 for (i = 0; i < XHP_LANG_NUM; i++)
767 FREE(conf->xhp[i].locales);
770 # endif /* old_hpux */
773 cmdconf_initialized = False;
779 CLR(&winEnv, WinEnv);
789 UserSelection *sel = &userSel;
791 if (sel->list && sel->list != localList) {
792 clear_ImsList(sel->list);
796 clear_ImsList(localList);
800 clear_UserSelection(sel);
801 /* clear_FileSel(sel->fsel); */
802 /* clear_RunEnv(sel->renv); */
815 /* ******** print structure (for DEBUG) ******** */
817 void pr_FileSel(fsel)
820 fprintf(LogFp, "FileSel:\tdpy_specific=%d real_fname=%s select_mode=%d\n",
821 fsel->dpy_specific, fsel->real_fname, fsel->select_mode);
822 fprintf(LogFp, "\tname=%s host=%s iconic=%d com_opt='%s' opts=%#x\n",
823 fsel->name, fsel->hostname, fsel->iconic, fsel->com_opt, fsel->opts);
827 for (op = fsel->opts; *op; op++)
828 fprintf(LogFp, "\t opts[%d] <%s>\t'%s'\n",
829 op - fsel->opts, (*op)->ims_name, (*op)->opt_str);
833 void pr_UserSelection(sel)
836 fprintf(LogFp, "userSelection:\tstatus=%s flag=%#x ims_idx=%d\n",
837 error_name(sel->status), sel->flag, sel->ims_idx);
838 fprintf(LogFp, "\tname=%s host=%s host_type=%d iconic=%d\n",
839 sel->name, sel->hostname, sel->host_type, sel->iconic);
840 fprintf(LogFp, "\tfsel=%#x list=%#x ent=%#x renv=%#x\n",
841 sel->fsel, sel->list, sel->ent, sel->renv);
842 if (sel->fsel) pr_FileSel(sel->fsel);
843 if (sel->renv) pr_RunEnv(sel->renv);
846 void pr_ImsConf(conf, ims_name)
852 fprintf(LogFp, "ImsConf:\tname=%s protocols=%s%s%s%s\n", ims_name,
853 (conf->protocols & ProtoBit(Proto_XIM)) ? "XIM," : NULL,
854 (conf->protocols & ProtoBit(Proto_Ximp)) ? "Ximp," : NULL,
855 (conf->protocols & ProtoBit(Proto_Xsi)) ? "Xsi," : NULL,
857 (conf->protocols & ProtoBit(Proto_Xhp)) ? "Xhp," : NULL,
860 # endif /* old_hpux */
861 (conf->protocols & ProtoBit(Proto_None)) ? "None," : NULL);
862 fprintf(LogFp, "\tproperty=%s servername=%s (%s) class=%s\n",
863 conf->property, conf->servername,
864 conf->servername2, conf->classname);
865 fprintf(LogFp, "\tpath=%s param='%s'\n",
866 conf->cmd_path, conf->cmd_param);
867 fprintf(LogFp, "\ttimeout=%d interval=%d flags=%s%s%s\n",
868 conf->timeout, conf->interval,
869 (conf->flags & F_NO_SERVER) ? "no_server," : NULL,
870 (conf->flags & F_NO_REMOTE) ? "no_remote," : NULL,
871 (conf->flags & F_NO_OPTION) ? "no_option," : NULL,
872 (conf->flags & F_TRY_CONNECT) ? "try_connect," : NULL);
873 fprintf(LogFp, "\tenv_set: '%s'\n", conf->env_set);
874 fprintf(LogFp, "\tenv_unset: '%s'\n", conf->env_unset);
875 fprintf(LogFp, "\tenv_pass: '%s'\n", conf->env_pass);
879 void pr_ImsEnt(ent, idx)
883 fprintf(LogFp, "ImsEnt[%d]:\tname=%s fname=%s label=%s ims=%#x\n",
884 idx, ent->name, ent->fname, ent->label, ent->ims);
887 void pr_ImsList(list)
893 fprintf(LogFp, "ImsList:\tstatus=%d num_ent=%d def_idx=%d def_sel=%d\n",
894 list->status, list->num_ent, list->default_idx, list->def_selmode);
895 for (i = 0; i < list->num_ent; i++) {
896 ent = list->elist[i];
898 if (ent->ims) pr_ImsConf(ent->ims, ent->name);
905 fprintf(LogFp, "WinEnv:\tstatus=%d Dpy=%#x topW=%#x appC=%#x\n",
906 wenv->status, wenv->Dpy, wenv->TopW, wenv->appC);
907 fprintf(LogFp, "\tatom_owner=%#x atom: main=%d status=%d data=%d\n",
908 wenv->atom_owner, wenv->atom_main, wenv->atom_status, wenv->atom_data);
914 fprintf(LogFp, "RunEnv:\tstatus=%s is_remote=%d proto=%d\n",
915 error_name(renv->status), renv->is_remote, proto_name(renv->proto));
916 fprintf(LogFp, "\tim_mod='%s' atom_name='%s' prop_atom=%d\n",
917 renv->im_mod, renv->atom_name, renv->prop_atom);
918 fprintf(LogFp, "\tpid=%d wait_status=%#x cmdbuf='%s'\n",
919 renv->pid, renv->wait_status, renv->cmdbuf);
925 UserEnv *uenv = &userEnv;
927 fprintf(LogFp, "UserEnv:\n");
928 fprintf(LogFp, "\thostname=\"%s\"\n", uenv->hostname);
929 fprintf(LogFp, "\tusername=\"%s\"\n", uenv->username);
930 fprintf(LogFp, "\tlocale=\"%s\" real_locale=\"%s\"\n",
931 uenv->locale, uenv->real_locale);
932 fprintf(LogFp, "\thomedir=\"%s\"\n", uenv->homedir);
933 fprintf(LogFp, "\tdisplayname=\"%s\"\n", uenv->displayname);
934 fprintf(LogFp, "\tdisplaydir=\"%s\"\n", uenv->displaydir);
935 fprintf(LogFp, "\tscreen_num=%d\n", uenv->screen_num);
943 fprintf(LogFp, "OutEnv:\n");
944 fprintf(LogFp, " set: \t");
946 for (ep = oenv->set; ep->name; ep++)
947 fprintf(LogFp, "%s='%s' ", ep->name, ep->value);
950 fprintf(LogFp, " unset:\t");
952 for (ep = oenv->unset; ep->name; ep++)
953 fprintf(LogFp, "%s='%s' ", ep->name, ep->value);
961 CmdConf *conf = &Conf;
964 # endif /* old_hpux */
967 fprintf(LogFp, "CmdConf:\n");
968 fprintf(LogFp, "\timsConfDir=%s\n", conf->imsConfDir);
969 fprintf(LogFp, "\timsAppDir=%s\n", conf->imsAppDir);
970 fprintf(LogFp, "\timsLogDir=%s\n", conf->imsLogDir);
971 fprintf(LogFp, "\timsLogFile=%s\n", conf->imsLogFile);
972 fprintf(LogFp, "\timsDir=%s\n", conf->imsDir);
973 fprintf(LogFp, "\tuserImsDir=%s\n", conf->userImsDir);
974 fprintf(LogFp, "\tuserTmpDir=%s\n", conf->userTmpDir);
975 fprintf(LogFp, "\tuserAltDir=%s\n", conf->userAltDir);
978 fprintf(LogFp, "\tImXmod:\tXIM=%s Ximp=%s Xsi=%s Xhp=%s None=%s\n",
979 conf->xmod[Proto_XIM], conf->xmod[Proto_Ximp],
980 conf->xmod[Proto_Xsi], conf->xmod[Proto_Xhp], conf->atom[Proto_None]);
981 fprintf(LogFp, "\tImAtom:\tXIM=%s Ximp=%s Xsi=%s Xhp=%s None=%s\n",
982 conf->atom[Proto_XIM], conf->atom[Proto_Ximp],
983 conf->atom[Proto_Xsi], conf->atom[Proto_Xhp], conf->atom[Proto_None]);
985 fprintf(LogFp, "\tImXmod:\tXIM=%s Ximp=%s Xsi=%s None=%s\n",
986 conf->xmod[Proto_XIM], conf->xmod[Proto_Ximp],
987 conf->xmod[Proto_Xsi], conf->atom[Proto_None]);
988 fprintf(LogFp, "\tImAtom:\tXIM=%s Ximp=%s Xsi=%s None=%s\n",
989 conf->atom[Proto_XIM], conf->atom[Proto_Ximp],
990 conf->atom[Proto_Xsi], conf->atom[Proto_None]);
991 # endif /* old_hpux */
993 fprintf(LogFp, "\tAction[%d]:\t{ ", NUM_ACTIONS);
994 for (i = 0; i < NUM_ACTIONS; i++)
995 fprintf(LogFp, "\"%s\", ", conf->action[i]);
996 fprintf(LogFp, "}\n");
998 fprintf(LogFp, "\tRemote:\tDisabled=%s useRemsh=%s timeout=%d\n",
999 conf->remote->disabled ? "True" : "False",
1000 conf->remote->useRemsh ? "True" : "False",
1001 conf->remote->timeout);
1002 fprintf(LogFp, "\t Env:\t%s\n", conf->remote->passEnv);
1005 fprintf(LogFp, "\tDtEnv:\tConfDir=%s UserDir=%s\n",
1006 conf->dt->confDir, conf->dt->userDir);
1007 fprintf(LogFp, "\t resPath=\"%s\"\n", conf->dt->resPath);
1009 fprintf(LogFp, "\tDtEnv:\t<None>\n");
1013 fprintf(LogFp, "\tVueEnv:\tConfDir=%s UserDir=%s\n",
1014 conf->vue->confDir, conf->vue->userDir);
1015 fprintf(LogFp, "\t uselite=%s\n", conf->vue->uselite);
1016 fprintf(LogFp, "\t resPath=\"%s\"\n", conf->vue->resPath);
1017 fprintf(LogFp, "\t litePath=\"%s\"\n", conf->vue->litePath);
1019 fprintf(LogFp, "\tVueEnv:\t<None>\n");
1021 fprintf(LogFp, "\tlocaleAlias:\t%s\n", conf->alias ? NULL : "None");
1023 for (ap = conf->alias; *ap; ap++)
1024 fprintf(LogFp, "\t [%s]\t%s\n", (*ap)->name, (*ap)->aliases);
1027 fprintf(LogFp, "\txhp:\t%s\n", conf->xhp ? NULL : "None");
1029 for (i = 0; i < XHP_LANG_NUM; i++)
1030 fprintf(LogFp, "\t [%c]\t%s\n",
1031 conf->xhp[i].type, conf->xhp[i].locales);
1033 # endif /* old_hpux */
1038 fprintf(LogFp, "CmdOpt:\tDisplayName=%s LocaleName=%s ShellName=%s\n",
1039 Opt.DisplayName, Opt.LocaleName, Opt.ShellName);
1040 fprintf(LogFp, "\tConfPath=%s UserPath=%s\n",
1041 Opt.ConfPath, Opt.UserPath);
1042 fprintf(LogFp, "\tLogPath=%s ResourceFile=%s\n",
1043 Opt.LogPath, Opt.ResourceFile);
1044 fprintf(LogFp, "\tImsName=%s HostName=%s ImsOption=%s\n",
1045 Opt.ImsName, Opt.HostName, Opt.ImsOption);
1046 fprintf(LogFp, "\tSelectMode=%d Timeout=%d Interval=%d\n",
1047 Opt.SelectMode, Opt.Timeout, Opt.Interval);
1050 void pr_OpModeFlag()
1052 char *name = "<unknown>";
1055 case MODE_START: name = "START"; break;
1056 case MODE_MODE: name = "MODE"; break;
1057 case MODE_STYLE: name = "STYLE"; break;
1058 case MODE_LIST: name = "LIST"; break;
1059 case MODE_CURRENT: name = "CURRENT"; break;
1060 case MODE_REMCONF: name = "REMCONF"; break;
1062 fprintf(LogFp, "OpMode=%s[%d] OpFlag=[%#x] ", name, OpMode, OpFlag);
1065 if (OpFlag & FLAG_ENV) fputs("Env, ", LogFp);
1066 if (OpFlag & FLAG_NOSAVE) fputs("NoSave, ", LogFp);
1067 if (OpFlag & FLAG_NOSTART) fputs("NoStart, ", LogFp);
1068 if (OpFlag & FLAG_NOWAIT) fputs("NoWait, ", LogFp);
1069 if (OpFlag & FLAG_NOTIMEOUT) fputs("NoTimeout, ", LogFp);
1070 if (OpFlag & FLAG_NORESOURCE) fputs("NoResource, ", LogFp);
1071 if (OpFlag & FLAG_NOREMOTE) fputs("NoRemote, ", LogFp);
1072 if (OpFlag & FLAG_NOTIFY) fputs("Notify, ", LogFp);
1073 if (OpFlag & FLAG_CONNECT) fputs("Connect, ", LogFp);
1074 if (OpFlag & FLAG_REMOTERUN) fputs("RemoteRun, ", LogFp);
1075 if (OpFlag & FLAG_WINDOW) fputs("Window, ", LogFp);
1076 if (OpFlag & FLAG_DT) fputs("Dt, ", LogFp);
1078 if (OpFlag & FLAG_VUE) fputs("Vue, ", LogFp);
1079 # endif /* old_hpux */
1084 static char *StateNameTbl[] = {
1107 #define NumStates (sizeof(StateNameTbl) / sizeof(char *))
1111 return (OpState >= 0 && OpState < NumStates) ?
1112 StateNameTbl[OpState] : "<unknown>";
1116 /* ******** error name ******** */
1118 char *error_name(error)
1121 char *name = "<unknown>";
1124 #define ERR_CASE(err) case err : name = #err; break
1126 #define ERR_CASE(err) case err : name = "err"; break
1127 # endif /* __STDC__ */
1131 ERR_CASE(ErrSyntax);
1132 ERR_CASE(ErrNoHome);
1133 ERR_CASE(ErrNoLocale);
1134 ERR_CASE(ErrNoCDELocale);
1135 ERR_CASE(ErrNoDisplay);
1136 ERR_CASE(ErrDisabled);
1137 ERR_CASE(ErrSignaled);
1140 ERR_CASE(ErrFileOpen);
1141 ERR_CASE(ErrFileCreate);
1142 ERR_CASE(ErrDirCreate);
1143 ERR_CASE(ErrMissEntry);
1146 ERR_CASE(ErrAnotherProg);
1147 ERR_CASE(ErrNoSelectionFile);
1148 ERR_CASE(ErrSaveSelection);
1149 ERR_CASE(ErrNoSelection);
1150 ERR_CASE(ErrNoLocaleConf);
1151 ERR_CASE(ErrNoImsEntry);
1152 ERR_CASE(ErrNoImsConf);
1153 ERR_CASE(ErrNotRegistered);
1154 ERR_CASE(ErrNoExecutable);
1157 ERR_CASE(ErrImsRunning);
1158 ERR_CASE(ErrImsExecution);
1159 ERR_CASE(ErrImsAborted);
1160 ERR_CASE(ErrImsTimeout);
1161 ERR_CASE(ErrUnknownHost);
1162 ERR_CASE(ErrRemoteAction);
1163 ERR_CASE(ErrRemoteData);
1164 ERR_CASE(ErrRemoteNoIms);
1165 ERR_CASE(ErrRemoteMissIms);
1166 ERR_CASE(ErrNoImsstart);
1167 ERR_CASE(ErrRemoteIms);
1170 ERR_CASE(ErrOpenDpy);
1173 ERR_CASE(ErrMemory);
1176 ERR_CASE(ErrIsNone);
1177 ERR_CASE(ErrNotRun);
1178 ERR_CASE(ErrImsWaiting);
1179 ERR_CASE(ErrImsWaitDone);
1180 ERR_CASE(ErrImsConnecting);
1181 ERR_CASE(ErrImsConnectDone);
1182 ERR_CASE(ErrInvState);
1183 ERR_CASE(ErrInternal);
1191 static char *_proto_names[NUM_PROTOCOLS] =
1193 { "None", "XIM", "Ximp", "Xsi", "Xhp" };
1195 { "None", "XIM", "Ximp", "Xsi" };
1196 # endif /* old_hpux */
1198 char *proto_name(proto_idx)
1201 if (proto_idx >= 0 && proto_idx < NUM_PROTOCOLS)
1202 return _proto_names[proto_idx];
1207 static char *SigNames[] = { /* 1 ~ 32 */
1208 "HUP", "INT", "QUIT", "ILL", "TRAP", "IOT,ABRT", "EMT", "FPE",
1209 "KILL", "BUS", "SEGV", "SYS", "PIPE", "ALRM", "TERM", "USR1",
1210 "USR2", "CHLD", "PWR", "VTALRM", "PROF", "POLL,IO", "WINCH", "STOP",
1211 "TSTP", "CONT", "TTIN", "TTOU", "URG", "LOST", "(reserved)", "DIL",
1214 #define MaxSigNum (sizeof(SigNames) / sizeof(char *))
1219 return (sig > 0 && sig <= MaxSigNum) ? SigNames[sig - 1] : "<unknown>";
1226 static char *last_brk = 0;
1227 char *new_brk = (char *) sbrk(0);
1228 long inc = (long) (new_brk - last_brk);
1230 inc += inc > 0 ? 1023 : -1023;
1231 DPR(("%s: BREAK=%p (Inc=%+d KB)\n", msg, new_brk, inc/1024));