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 $ */
26 #include <DtHelp/LocaleXlate.h> /* for locale equivalence between platforms */
31 /* ******** locale name manupilation ******** */
33 int find_CDE_locale_name()
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(CDE_locale)
69 char plat[_DtPLATFORM_MAX_LEN];
74 ret = _DtLcxOpenAllDbs(&db);
77 ret = _DtXlateGetXlateEnv(db, plat, &execver, &compver);
80 ret = _DtLcxXlateStdToOp(db, plat, compver, DtLCX_OPER_SETLOCALE,
81 CDE_locale, NULL, NULL, NULL,
84 ret = _DtLcxCloseDb(&db);
94 /* ******** string manupilation ******** */
96 char *strcpyx(dest, src)
97 register char *dest, *src;
99 while (*dest++ = *src++) ;
104 char *strcpy2(dest, src1, src2)
105 register char *dest, *src1, *src2;
107 while (*dest++ = *src1++) ;
109 while (*dest++ = *src2++) ;
113 char *newstradded(src1, src2, src3)
114 register char *src1, *src2, *src3;
119 dest = p = ALLOC(strlen(src1) + strlen(src2) + strlen(src3) + 1, char);
120 if (src1) { while (*p++ = *src1++) ; p--; }
121 if (src2) { while (*p++ = *src2++) ; p--; }
122 if (src3) { while (*p++ = *src3++) ; }
128 int str_to_int(ptr, val)
135 /* if (!ptr || !*ptr || !val) return(False); */
137 base = ptr[0] == '0' ? (((ptr[1] & 0xdf) == 'X') ? 16 : 8) : 10;
138 *val = strtol(ptr, &pp, base);
139 if (!pp || *pp) return(False);
143 bool str_to_bool(ptr, def_val)
147 if (!ptr || !*ptr) return def_val;
150 switch (*ptr) { /* true/false , 0/1 , yes/no , on/off */
154 def_val = True; break;
159 def_val = False; break;
162 if (ptr[1] == 'N' || ptr[1] == 'n')
164 else if (ptr[1] == 'F' || ptr[1] == 'f')
174 register char *lastp;
177 for (lastp = ptr + strlen(ptr) - 1;
178 lastp >= ptr && (is_white(*lastp) || *lastp == '\n'); lastp--) ;
180 return ptr; /* return lastp > ptr ? ptr : NULL; */
183 char **parse_strlist(ptr, sep_ch)
187 char *pbuf[100], **new, **bp;
192 if (!ptr || !*ptr) return (char **)0;
193 ptr = save_ptr = NEWSTR(ptr);
195 if (!sep_ch) sep_ch = ',';
196 bp = pbuf; pbuf[0] = NULL;
199 if (sep = strchr(ptr, sep_ch)) *sep++ = 0;
203 if (bp - pbuf >= 100) sep = NULL; /* over-flow */
209 new = ALLOC(n + 1, char *);
210 memcpy((void *) new, (void *)pbuf, n * sizeof(char *));
219 int pack_strlist(ptr, listp, sep_ch)
223 register char *bp = ptr, **lp = listp;
225 /* if (!ptr) return 0; */
230 if (!sep_ch) sep_ch = ',';
232 for (bp; *lp; lp++) {
233 bp = strcpyx(bp, *lp);
237 DPR2(("pack_strlist(): ptr='%s'\n", ptr));
243 void free_strlist(pp)
246 register char **ptr = pp;
249 for ( ; *ptr; ptr++) FREE(*ptr);
254 /* ******** display string ******** */
256 bool parse_dpy_str(display_str, host, dnum, snum, dnet)
257 char *display_str, **host;
258 int *dnum, *snum, *dnet;
260 char buf[BUFSIZ], hostbuf[BUFSIZ], *p, *hp, *pdnum, *psnum;
263 strcpy(buf, display_str);
265 /* extract host name */
266 if (!(p = strchr(buf, ':'))) return False;
268 if (*p == ':') { /* DECnet ? */
274 if (!*hp || strcmp(hp, "unix") == 0 || strcmp(hp, "local") == 0) {
275 gethostname(hostbuf, BUFSIZ);
278 if (p = strchr(hp, '.')) *p = 0;
280 /* extract display number */
281 for (p = pdnum; *p && isdigit(*p); p++) ;
282 if (p == pdnum || (*p && *p != '.'))
286 if (*p) { /* extract screen number */
287 *p++ = 0; /* must be '.' */
288 for (psnum = p; *p && isdigit(*p); p++) ;
289 if (p == psnum || *p) psnum = NULL;
293 if (dnum) *dnum = atoi(pdnum);
294 if (snum) *snum = psnum ? atoi(psnum) : 0;
295 if (dnet) *dnet = isdnet ? 1 : 0;
296 if (host) *host = NEWSTR(hp);
298 DPR3(("parse_dpy_str(%s):\thost=%s dnum=%d snum=%d dnet=%d\n",
299 display_str, *host, *dnum, *snum, *dnet));
304 char *std_dpy_str(display_str, snum)
308 char buf[BUFSIZ], *bp, val[20];
310 int dnum = 0, dnet = 0;
313 if (parse_dpy_str(display_str, &host, &dnum, snum, &dnet) == False)
316 /* sprintf(buf, "%s:%s%d", host, dnet ? ":" : NULL, dnum); */
317 bp = buf; buf[0] = 0;
318 bp = strcpyx(bp, host); *bp++ = ':';
319 if (dnet) *bp++ = ':';
320 sprintf(val, "%ld", (long) dnum);
321 bp = strcpyx(bp, val);
323 DPR3(("std_dpy_str(): \"%s\" --> \"%s\" snum=%d\n",
324 display_str, buf, *snum));
331 /* ******** file & dir manipulation ******** */
333 int make_user_dir(path)
336 if (!is_directory(path, False)) {
337 if (access(path, F_OK) == 0)
339 if (mkdir(path, 0777) != 0)
341 DPR(("make_user_dir(%s): created\n", path));
349 static char dname[MAXPATHLEN];
350 register char *p = path;
353 /* if (!p || !p[0]) return NULL; */
355 for (p = path + strlen(path) - 1; p > path && *p == '/'; p--) ;
357 memcpy(dname, path, dlen);
360 if (p = strrchr(dname, '/')) {
365 for ( ; p > dname && *p == '/'; p--) *p = 0;
374 int is_directory(path, must_writable)
379 int mode = R_OK|X_OK;
381 if (must_writable) mode |= W_OK;
382 return stat(path, &stb) == 0 && S_ISDIR(stb.st_mode)
383 && access(path, mode) == 0;
387 int is_regularfile(path)
391 return stat(path, &stb) == 0 && S_ISREG(stb.st_mode);
394 int is_emptyfile(path)
398 return stat(path, &stb) == 0 && S_ISREG(stb.st_mode) && stb.st_size == 0;
403 int is_executable(path)
407 return stat(path, &stb) == 0 && S_ISREG(stb.st_mode)
408 && access(path, R_OK|X_OK) == 0;
412 int is_writable(path)
415 if (access(path, R_OK|W_OK) == 0)
417 else if (errno == ENOENT) /* check directory permission */
418 return is_directory(dirname(path), True);
424 int is_readable(path, allow_empty)
429 return stat(path, &stb) == 0 && S_ISREG(stb.st_mode)
430 && access(path, R_OK) == 0 && (allow_empty || stb.st_size > 0);
434 /* ******** file reading ******** */
436 static int tag_line_num = 0;
437 static char *tag_linebuf = NULL;
438 static char *tag_file = NULL;
440 int start_tag_line(fname)
445 tag_linebuf = ALLOC(BUFSIZ, char);
449 if (tag_linebuf) FREE(tag_linebuf);
450 tag_linebuf = tag_file = 0;
456 int read_tag_line(fp, tagp, valp)
462 while (fgets(lp = tag_linebuf, BUFSIZ, fp)) {
464 skip_white(lp); /* lp = trim_line(lp); */
465 if (!*lp || *lp == '\n' || is_comment_char(*lp))
467 if (!(lp2 = strchr(lp, TAG_END_CHAR))) {
468 DPR3(("\t[line=%d] no tag on '%s'\n", tag_line_num, tag_file));
472 lp2 = trim_line(lp2);
475 *valp = *lp2 ? lp2 : 0;
480 return (ferror(fp)) ? -1 : 0;
484 /* ******** put messages ******** */
486 void put_xims_msg(msg_type, err_num, arg1, arg2, arg3)
487 int msg_type, err_num;
488 void *arg1, *arg2, *arg3;
493 msg = xims_errmsg(err_num, arg1, arg2, arg3);
496 { static char buf[80];
497 sprintf(buf, "ERROR: %s (%d)\n", error_name(err_num), err_num);
502 if (!msg || !*msg) return;
504 if (UseMsgWindow && useWINDOW()) {
505 ret = put_msg_win(msg_type, msg);
512 LastErrMsg = err_num;
517 void put_xims_errmsg(err_num, arg1, arg2, arg3)
519 void *arg1, *arg2, *arg3;
522 put_xims_msg(MSGTYP_FATAL, err_num, arg1, arg2, arg3);
525 void put_xims_warnmsg(err_num, arg1, arg2, arg3)
527 void *arg1, *arg2, *arg3;
530 put_xims_msg(MSGTYP_WARN, err_num, arg1, arg2, arg3);
535 /* for DPR*() macro */
536 void print_msg(fmt, arg1, arg2, arg3, arg4, arg5)
538 void *arg1, *arg2, *arg3, *arg4, *arg5;
540 fprintf(LogFp, fmt, arg1, arg2, arg3, arg4, arg5);
545 int put_xims_log(fmt, arg1, arg2, arg3)
547 void *arg1, *arg2, *arg3;
550 char *logpath = Opt.LogPath;
552 /* if (Verbose < 1) return False; */
554 if (fp = fopen(logpath, "a")) {
556 time_t tm = time((time_t *)0);
558 if (strftime(time_str, 80, /* "%x %X" */ "%D %T", localtime(&tm)) == 0)
560 fprintf(fp, "[%s] %s: ", time_str, ProgramName);
561 fprintf(fp, fmt, arg1, arg2, arg3);
566 DPR(("put_xims_log(); failed on '%s'\n", logpath));
571 /* ******** clear structure ******** */
573 void clear_ImsConf(ims)
576 FREE(ims->servername);
577 FREE(ims->servername2);
578 FREE(ims->classname);
581 FREE(ims->cmd_param);
583 FREE(ims->env_unset);
589 void clear_ImsEnt(ent)
596 clear_ImsConf(ent->ims);
602 void clear_ImsList(list)
607 for (i = 0; i < list->num_ent; i++) {
608 clear_ImsEnt(list->elist[i]);
609 FREE(list->elist[i]);
614 list->default_idx = -1;
615 list->def_selmode = SEL_MODE_NOAUTO;
619 void clear_FileSel(fsel)
623 FREE(fsel->hostname);
624 FREE(fsel->real_fname);
628 for (op = fsel->opts; *op; op++) {
629 FREE((*op)->ims_name);
630 FREE((*op)->opt_str);
638 fsel->select_mode = SEL_MODE_NONE;
640 fsel->dpy_specific = False;
643 void clear_UserSelection(sel)
649 clear_FileSel(sel->fsel);
653 clear_RunEnv(sel->renv);
656 /* FREE(sel->list); don't free */
657 /* FREE(sel->ent); don't free */
659 CLR(sel, UserSelection);
661 sel->host_type = HOST_LOCAL;
662 sel->flag = F_SELECT_NONE;
663 sel->status = NoError;
669 void clear_RunEnv(renv)
673 FREE(renv->atom_name);
677 renv->status = NoError;;
681 void clear_OutEnv(oenv)
688 for (ep = oenv->set; ep->name; ep++) {
689 FREE(ep->name); FREE(ep->value);
692 for (ep = oenv->unset; ep->name; ep++) {
693 FREE(ep->name); FREE(ep->value);
701 UserEnv *uenv = &userEnv;
703 FREE(uenv->hostname);
704 FREE(uenv->username);
707 FREE(uenv->real_locale);
708 FREE(uenv->displayname);
709 FREE(uenv->displaydir);
710 FREE(uenv->xmodifiers);
711 FREE_LIST(uenv->locale_aliases);
713 CLR(&userEnv, UserEnv);
719 if (cmdconf_initialized) {
720 CmdConf *conf = &Conf;
724 FREE(conf->imsConfDir);
725 FREE(conf->imsAppDir);
726 FREE(conf->imsLogDir);
727 FREE(conf->imsLogDile);
729 FREE(conf->userImsDir);
730 FREE(conf->userTmpDir);
731 FREE(conf->userAltDir);
733 for (i = 0; i < NUM_PROTOCOLS; i++) {
737 for (i = 0; i < NUM_ACTIONS; i++) {
738 FREE(conf->action[i]);
741 FREE(conf->remote->passEnv);
745 FREE(conf->dt->confDir);
746 FREE(conf->dt->userDir);
747 FREE(conf->dt->resPath);
752 FREE(conf->vue->confDir);
753 FREE(conf->vue->userDir);
754 FREE(conf->vue->uselite);
755 FREE(conf->vue->resPath);
756 FREE(conf->vue->litePath);
760 for (ap = conf->alias; *ap; ap++) {
762 FREE((*ap)->aliases);
767 for (i = 0; i < XHP_LANG_NUM; i++)
768 FREE(conf->xhp[i].locales);
771 # endif /* old_hpux */
774 cmdconf_initialized = False;
780 CLR(&winEnv, WinEnv);
790 UserSelection *sel = &userSel;
792 if (sel->list && sel->list != localList) {
793 clear_ImsList(sel->list);
797 clear_ImsList(localList);
801 clear_UserSelection(sel);
802 /* clear_FileSel(sel->fsel); */
803 /* clear_RunEnv(sel->renv); */
816 /* ******** print structure (for DEBUG) ******** */
818 void pr_FileSel(fsel)
821 fprintf(LogFp, "FileSel:\tdpy_specific=%d real_fname=%s select_mode=%d\n",
822 fsel->dpy_specific, fsel->real_fname, fsel->select_mode);
823 fprintf(LogFp, "\tname=%s host=%s iconic=%d com_opt='%s' opts=%#x\n",
824 fsel->name, fsel->hostname, fsel->iconic, fsel->com_opt, fsel->opts);
828 for (op = fsel->opts; *op; op++)
829 fprintf(LogFp, "\t opts[%d] <%s>\t'%s'\n",
830 op - fsel->opts, (*op)->ims_name, (*op)->opt_str);
834 void pr_UserSelection(sel)
837 fprintf(LogFp, "userSelection:\tstatus=%s flag=%#x ims_idx=%d\n",
838 error_name(sel->status), sel->flag, sel->ims_idx);
839 fprintf(LogFp, "\tname=%s host=%s host_type=%d iconic=%d\n",
840 sel->name, sel->hostname, sel->host_type, sel->iconic);
841 fprintf(LogFp, "\tfsel=%#x list=%#x ent=%#x renv=%#x\n",
842 sel->fsel, sel->list, sel->ent, sel->renv);
843 if (sel->fsel) pr_FileSel(sel->fsel);
844 if (sel->renv) pr_RunEnv(sel->renv);
847 void pr_ImsConf(conf, ims_name)
853 fprintf(LogFp, "ImsConf:\tname=%s protocols=%s%s%s%s\n", ims_name,
854 (conf->protocols & ProtoBit(Proto_XIM)) ? "XIM," : NULL,
855 (conf->protocols & ProtoBit(Proto_Ximp)) ? "Ximp," : NULL,
856 (conf->protocols & ProtoBit(Proto_Xsi)) ? "Xsi," : NULL,
858 (conf->protocols & ProtoBit(Proto_Xhp)) ? "Xhp," : NULL,
861 # endif /* old_hpux */
862 (conf->protocols & ProtoBit(Proto_None)) ? "None," : NULL);
863 fprintf(LogFp, "\tproperty=%s servername=%s (%s) class=%s\n",
864 conf->property, conf->servername,
865 conf->servername2, conf->classname);
866 fprintf(LogFp, "\tpath=%s param='%s'\n",
867 conf->cmd_path, conf->cmd_param);
868 fprintf(LogFp, "\ttimeout=%d interval=%d flags=%s%s%s\n",
869 conf->timeout, conf->interval,
870 (conf->flags & F_NO_SERVER) ? "no_server," : NULL,
871 (conf->flags & F_NO_REMOTE) ? "no_remote," : NULL,
872 (conf->flags & F_NO_OPTION) ? "no_option," : NULL,
873 (conf->flags & F_TRY_CONNECT) ? "try_connect," : NULL);
874 fprintf(LogFp, "\tenv_set: '%s'\n", conf->env_set);
875 fprintf(LogFp, "\tenv_unset: '%s'\n", conf->env_unset);
876 fprintf(LogFp, "\tenv_pass: '%s'\n", conf->env_pass);
880 void pr_ImsEnt(ent, idx)
884 fprintf(LogFp, "ImsEnt[%d]:\tname=%s fname=%s label=%s ims=%#x\n",
885 idx, ent->name, ent->fname, ent->label, ent->ims);
888 void pr_ImsList(list)
894 fprintf(LogFp, "ImsList:\tstatus=%d num_ent=%d def_idx=%d def_sel=%d\n",
895 list->status, list->num_ent, list->default_idx, list->def_selmode);
896 for (i = 0; i < list->num_ent; i++) {
897 ent = list->elist[i];
899 if (ent->ims) pr_ImsConf(ent->ims, ent->name);
906 fprintf(LogFp, "WinEnv:\tstatus=%d Dpy=%#x topW=%#x appC=%#x\n",
907 wenv->status, wenv->Dpy, wenv->TopW, wenv->appC);
908 fprintf(LogFp, "\tatom_owner=%#x atom: main=%d status=%d data=%d\n",
909 wenv->atom_owner, wenv->atom_main, wenv->atom_status, wenv->atom_data);
915 fprintf(LogFp, "RunEnv:\tstatus=%s is_remote=%d proto=%d\n",
916 error_name(renv->status), renv->is_remote, proto_name(renv->proto));
917 fprintf(LogFp, "\tim_mod='%s' atom_name='%s' prop_atom=%d\n",
918 renv->im_mod, renv->atom_name, renv->prop_atom);
919 fprintf(LogFp, "\tpid=%d wait_status=%#x cmdbuf='%s'\n",
920 renv->pid, renv->wait_status, renv->cmdbuf);
926 UserEnv *uenv = &userEnv;
928 fprintf(LogFp, "UserEnv:\n");
929 fprintf(LogFp, "\thostname=\"%s\"\n", uenv->hostname);
930 fprintf(LogFp, "\tusername=\"%s\"\n", uenv->username);
931 fprintf(LogFp, "\tlocale=\"%s\" real_locale=\"%s\"\n",
932 uenv->locale, uenv->real_locale);
933 fprintf(LogFp, "\thomedir=\"%s\"\n", uenv->homedir);
934 fprintf(LogFp, "\tdisplayname=\"%s\"\n", uenv->displayname);
935 fprintf(LogFp, "\tdisplaydir=\"%s\"\n", uenv->displaydir);
936 fprintf(LogFp, "\tscreen_num=%d\n", uenv->screen_num);
944 fprintf(LogFp, "OutEnv:\n");
945 fprintf(LogFp, " set: \t");
947 for (ep = oenv->set; ep->name; ep++)
948 fprintf(LogFp, "%s='%s' ", ep->name, ep->value);
951 fprintf(LogFp, " unset:\t");
953 for (ep = oenv->unset; ep->name; ep++)
954 fprintf(LogFp, "%s='%s' ", ep->name, ep->value);
962 CmdConf *conf = &Conf;
965 # endif /* old_hpux */
968 fprintf(LogFp, "CmdConf:\n");
969 fprintf(LogFp, "\timsConfDir=%s\n", conf->imsConfDir);
970 fprintf(LogFp, "\timsAppDir=%s\n", conf->imsAppDir);
971 fprintf(LogFp, "\timsLogDir=%s\n", conf->imsLogDir);
972 fprintf(LogFp, "\timsLogFile=%s\n", conf->imsLogFile);
973 fprintf(LogFp, "\timsDir=%s\n", conf->imsDir);
974 fprintf(LogFp, "\tuserImsDir=%s\n", conf->userImsDir);
975 fprintf(LogFp, "\tuserTmpDir=%s\n", conf->userTmpDir);
976 fprintf(LogFp, "\tuserAltDir=%s\n", conf->userAltDir);
979 fprintf(LogFp, "\tImXmod:\tXIM=%s Ximp=%s Xsi=%s Xhp=%s None=%s\n",
980 conf->xmod[Proto_XIM], conf->xmod[Proto_Ximp],
981 conf->xmod[Proto_Xsi], conf->xmod[Proto_Xhp], conf->atom[Proto_None]);
982 fprintf(LogFp, "\tImAtom:\tXIM=%s Ximp=%s Xsi=%s Xhp=%s None=%s\n",
983 conf->atom[Proto_XIM], conf->atom[Proto_Ximp],
984 conf->atom[Proto_Xsi], conf->atom[Proto_Xhp], conf->atom[Proto_None]);
986 fprintf(LogFp, "\tImXmod:\tXIM=%s Ximp=%s Xsi=%s None=%s\n",
987 conf->xmod[Proto_XIM], conf->xmod[Proto_Ximp],
988 conf->xmod[Proto_Xsi], conf->atom[Proto_None]);
989 fprintf(LogFp, "\tImAtom:\tXIM=%s Ximp=%s Xsi=%s None=%s\n",
990 conf->atom[Proto_XIM], conf->atom[Proto_Ximp],
991 conf->atom[Proto_Xsi], conf->atom[Proto_None]);
992 # endif /* old_hpux */
994 fprintf(LogFp, "\tAction[%d]:\t{ ", NUM_ACTIONS);
995 for (i = 0; i < NUM_ACTIONS; i++)
996 fprintf(LogFp, "\"%s\", ", conf->action[i]);
997 fprintf(LogFp, "}\n");
999 fprintf(LogFp, "\tRemote:\tDisabled=%s useRemsh=%s timeout=%d\n",
1000 conf->remote->disabled ? "True" : "False",
1001 conf->remote->useRemsh ? "True" : "False",
1002 conf->remote->timeout);
1003 fprintf(LogFp, "\t Env:\t%s\n", conf->remote->passEnv);
1006 fprintf(LogFp, "\tDtEnv:\tConfDir=%s UserDir=%s\n",
1007 conf->dt->confDir, conf->dt->userDir);
1008 fprintf(LogFp, "\t resPath=\"%s\"\n", conf->dt->resPath);
1010 fprintf(LogFp, "\tDtEnv:\t<None>\n");
1014 fprintf(LogFp, "\tVueEnv:\tConfDir=%s UserDir=%s\n",
1015 conf->vue->confDir, conf->vue->userDir);
1016 fprintf(LogFp, "\t uselite=%s\n", conf->vue->uselite);
1017 fprintf(LogFp, "\t resPath=\"%s\"\n", conf->vue->resPath);
1018 fprintf(LogFp, "\t litePath=\"%s\"\n", conf->vue->litePath);
1020 fprintf(LogFp, "\tVueEnv:\t<None>\n");
1022 fprintf(LogFp, "\tlocaleAlias:\t%s\n", conf->alias ? NULL : "None");
1024 for (ap = conf->alias; *ap; ap++)
1025 fprintf(LogFp, "\t [%s]\t%s\n", (*ap)->name, (*ap)->aliases);
1028 fprintf(LogFp, "\txhp:\t%s\n", conf->xhp ? NULL : "None");
1030 for (i = 0; i < XHP_LANG_NUM; i++)
1031 fprintf(LogFp, "\t [%c]\t%s\n",
1032 conf->xhp[i].type, conf->xhp[i].locales);
1034 # endif /* old_hpux */
1039 fprintf(LogFp, "CmdOpt:\tDisplayName=%s LocaleName=%s ShellName=%s\n",
1040 Opt.DisplayName, Opt.LocaleName, Opt.ShellName);
1041 fprintf(LogFp, "\tConfPath=%s UserPath=%s\n",
1042 Opt.ConfPath, Opt.UserPath);
1043 fprintf(LogFp, "\tLogPath=%s ResourceFile=%s\n",
1044 Opt.LogPath, Opt.ResourceFile);
1045 fprintf(LogFp, "\tImsName=%s HostName=%s ImsOption=%s\n",
1046 Opt.ImsName, Opt.HostName, Opt.ImsOption);
1047 fprintf(LogFp, "\tSelectMode=%d Timeout=%d Interval=%d\n",
1048 Opt.SelectMode, Opt.Timeout, Opt.Interval);
1051 void pr_OpModeFlag()
1053 char *name = "<unknown>";
1056 case MODE_START: name = "START"; break;
1057 case MODE_MODE: name = "MODE"; break;
1058 case MODE_STYLE: name = "STYLE"; break;
1059 case MODE_LIST: name = "LIST"; break;
1060 case MODE_CURRENT: name = "CURRENT"; break;
1061 case MODE_REMCONF: name = "REMCONF"; break;
1063 fprintf(LogFp, "OpMode=%s[%d] OpFlag=[%#x] ", name, OpMode, OpFlag);
1066 if (OpFlag & FLAG_ENV) fputs("Env, ", LogFp);
1067 if (OpFlag & FLAG_NOSAVE) fputs("NoSave, ", LogFp);
1068 if (OpFlag & FLAG_NOSTART) fputs("NoStart, ", LogFp);
1069 if (OpFlag & FLAG_NOWAIT) fputs("NoWait, ", LogFp);
1070 if (OpFlag & FLAG_NOTIMEOUT) fputs("NoTimeout, ", LogFp);
1071 if (OpFlag & FLAG_NORESOURCE) fputs("NoResource, ", LogFp);
1072 if (OpFlag & FLAG_NOREMOTE) fputs("NoRemote, ", LogFp);
1073 if (OpFlag & FLAG_NOTIFY) fputs("Notify, ", LogFp);
1074 if (OpFlag & FLAG_CONNECT) fputs("Connect, ", LogFp);
1075 if (OpFlag & FLAG_REMOTERUN) fputs("RemoteRun, ", LogFp);
1076 if (OpFlag & FLAG_WINDOW) fputs("Window, ", LogFp);
1077 if (OpFlag & FLAG_DT) fputs("Dt, ", LogFp);
1079 if (OpFlag & FLAG_VUE) fputs("Vue, ", LogFp);
1080 # endif /* old_hpux */
1085 static char *StateNameTbl[] = {
1108 #define NumStates (sizeof(StateNameTbl) / sizeof(char *))
1112 return (OpState >= 0 && OpState < NumStates) ?
1113 StateNameTbl[OpState] : "<unknown>";
1117 /* ******** error name ******** */
1119 char *error_name(error)
1122 char *name = "<unknown>";
1125 #define ERR_CASE(err) case err : name = #err; break
1127 #define ERR_CASE(err) case err : name = "err"; break
1128 # endif /* __STDC__ */
1132 ERR_CASE(ErrSyntax);
1133 ERR_CASE(ErrNoHome);
1134 ERR_CASE(ErrNoLocale);
1135 ERR_CASE(ErrNoCDELocale);
1136 ERR_CASE(ErrNoDisplay);
1137 ERR_CASE(ErrDisabled);
1138 ERR_CASE(ErrSignaled);
1141 ERR_CASE(ErrFileOpen);
1142 ERR_CASE(ErrFileCreate);
1143 ERR_CASE(ErrDirCreate);
1144 ERR_CASE(ErrMissEntry);
1147 ERR_CASE(ErrAnotherProg);
1148 ERR_CASE(ErrNoSelectionFile);
1149 ERR_CASE(ErrSaveSelection);
1150 ERR_CASE(ErrNoSelection);
1151 ERR_CASE(ErrNoLocaleConf);
1152 ERR_CASE(ErrNoImsEntry);
1153 ERR_CASE(ErrNoImsConf);
1154 ERR_CASE(ErrNotRegistered);
1155 ERR_CASE(ErrNoExecutable);
1158 ERR_CASE(ErrImsRunning);
1159 ERR_CASE(ErrImsExecution);
1160 ERR_CASE(ErrImsAborted);
1161 ERR_CASE(ErrImsTimeout);
1162 ERR_CASE(ErrUnknownHost);
1163 ERR_CASE(ErrRemoteAction);
1164 ERR_CASE(ErrRemoteData);
1165 ERR_CASE(ErrRemoteNoIms);
1166 ERR_CASE(ErrRemoteMissIms);
1167 ERR_CASE(ErrNoImsstart);
1168 ERR_CASE(ErrRemoteIms);
1171 ERR_CASE(ErrOpenDpy);
1174 ERR_CASE(ErrMemory);
1177 ERR_CASE(ErrIsNone);
1178 ERR_CASE(ErrNotRun);
1179 ERR_CASE(ErrImsWaiting);
1180 ERR_CASE(ErrImsWaitDone);
1181 ERR_CASE(ErrImsConnecting);
1182 ERR_CASE(ErrImsConnectDone);
1183 ERR_CASE(ErrInvState);
1184 ERR_CASE(ErrInternal);
1192 static char *_proto_names[NUM_PROTOCOLS] =
1194 { "None", "XIM", "Ximp", "Xsi", "Xhp" };
1196 { "None", "XIM", "Ximp", "Xsi" };
1197 # endif /* old_hpux */
1199 char *proto_name(proto_idx)
1202 if (proto_idx >= 0 && proto_idx < NUM_PROTOCOLS)
1203 return _proto_names[proto_idx];
1208 static char *SigNames[] = { /* 1 ~ 32 */
1209 "HUP", "INT", "QUIT", "ILL", "TRAP", "IOT,ABRT", "EMT", "FPE",
1210 "KILL", "BUS", "SEGV", "SYS", "PIPE", "ALRM", "TERM", "USR1",
1211 "USR2", "CHLD", "PWR", "VTALRM", "PROF", "POLL,IO", "WINCH", "STOP",
1212 "TSTP", "CONT", "TTIN", "TTOU", "URG", "LOST", "(reserved)", "DIL",
1215 #define MaxSigNum (sizeof(SigNames) / sizeof(char *))
1220 return (sig > 0 && sig <= MaxSigNum) ? SigNames[sig - 1] : "<unknown>";
1227 static char *last_brk = 0;
1228 char *new_brk = (char *) sbrk(0);
1229 long inc = (long) (new_brk - last_brk);
1231 inc += inc > 0 ? 1023 : -1023;
1232 DPR(("%s: BREAK=%p (Inc=%+d KB)\n", msg, new_brk, inc/1024));