1 /* @(#)$XConsortium: util.c /main/6 1996/07/12 15:44:21 pascale $ */
3 #include <DtHelp/LocaleXlate.h> /* for locale equivalence between platforms */
8 /* ******** locale name manupilation ******** */
10 int find_CDE_locale_name()
12 UserEnv *uenv = &userEnv;
15 char plat[_DtPLATFORM_MAX_LEN];
18 static bool first = True;
22 uenv->CDE_locale = NULL;
24 ret = _DtLcxOpenAllDbs(&db);
27 ret = _DtXlateGetXlateEnv(db, plat, &execver, &compver);
30 ret = _DtLcxXlateOpToStd(db, plat, compver, DtLCX_OPER_SETLOCALE,
31 uenv->locale, &uenv->CDE_locale,
34 ret = _DtLcxCloseDb(&db);
41 char *find_system_locale_name(CDE_locale)
46 char plat[_DtPLATFORM_MAX_LEN];
51 ret = _DtLcxOpenAllDbs(&db);
54 ret = _DtXlateGetXlateEnv(db, plat, &execver, &compver);
57 ret = _DtLcxXlateStdToOp(db, plat, compver, DtLCX_OPER_SETLOCALE,
58 CDE_locale, NULL, NULL, NULL,
61 ret = _DtLcxCloseDb(&db);
71 /* ******** string manupilation ******** */
73 char *strcpyx(dest, src)
74 register char *dest, *src;
76 while (*dest++ = *src++) ;
81 char *strcpy2(dest, src1, src2)
82 register char *dest, *src1, *src2;
84 while (*dest++ = *src1++) ;
86 while (*dest++ = *src2++) ;
90 char *newstradded(src1, src2, src3)
91 register char *src1, *src2, *src3;
96 dest = p = ALLOC(strlen(src1) + strlen(src2) + strlen(src3) + 1, char);
97 if (src1) { while (*p++ = *src1++) ; p--; }
98 if (src2) { while (*p++ = *src2++) ; p--; }
99 if (src3) { while (*p++ = *src3++) ; }
105 int str_to_int(ptr, val)
112 /* if (!ptr || !*ptr || !val) return(False); */
114 base = ptr[0] == '0' ? (((ptr[1] & 0xdf) == 'X') ? 16 : 8) : 10;
115 *val = strtol(ptr, &pp, base);
116 if (!pp || *pp) return(False);
120 bool str_to_bool(ptr, def_val)
124 if (!ptr || !*ptr) return def_val;
127 switch (*ptr) { /* true/false , 0/1 , yes/no , on/off */
131 def_val = True; break;
136 def_val = False; break;
139 if (ptr[1] == 'N' || ptr[1] == 'n')
141 else if (ptr[1] == 'F' || ptr[1] == 'f')
151 register char *lastp;
154 for (lastp = ptr + strlen(ptr) - 1;
155 lastp >= ptr && (is_white(*lastp) || *lastp == '\n'); lastp--) ;
157 return ptr; /* return lastp > ptr ? ptr : NULL; */
160 char **parse_strlist(ptr, sep_ch)
164 char *pbuf[100], **new, **bp;
169 if (!ptr || !*ptr) return (char **)0;
170 ptr = save_ptr = NEWSTR(ptr);
172 if (!sep_ch) sep_ch = ',';
173 bp = pbuf; pbuf[0] = NULL;
176 if (sep = strchr(ptr, sep_ch)) *sep++ = 0;
180 if (bp - pbuf >= 100) sep = NULL; /* over-flow */
186 new = ALLOC(n + 1, char *);
187 memcpy((void *) new, (void *)pbuf, n * sizeof(char *));
196 int pack_strlist(ptr, listp, sep_ch)
200 register char *bp = ptr, **lp = listp;
202 /* if (!ptr) return 0; */
207 if (!sep_ch) sep_ch = ',';
209 for (bp; *lp; lp++) {
210 bp = strcpyx(bp, *lp);
214 DPR2(("pack_strlist(): ptr='%s'\n", ptr));
220 void free_strlist(pp)
223 register char **ptr = pp;
226 for ( ; *ptr; ptr++) FREE(*ptr);
231 /* ******** display string ******** */
233 bool parse_dpy_str(display_str, host, dnum, snum, dnet)
234 char *display_str, **host;
235 int *dnum, *snum, *dnet;
237 char buf[BUFSIZ], hostbuf[BUFSIZ], *p, *hp, *pdnum, *psnum;
240 strcpy(buf, display_str);
242 /* extract host name */
243 if (!(p = strchr(buf, ':'))) return False;
245 if (*p == ':') { /* DECnet ? */
251 if (!*hp || strcmp(hp, "unix") == 0 || strcmp(hp, "local") == 0) {
252 gethostname(hostbuf, BUFSIZ);
255 if (p = strchr(hp, '.')) *p = 0;
257 /* extract display number */
258 for (p = pdnum; *p && isdigit(*p); p++) ;
259 if (p == pdnum || (*p && *p != '.'))
263 if (*p) { /* extract screen number */
264 *p++ = 0; /* must be '.' */
265 for (psnum = p; *p && isdigit(*p); p++) ;
266 if (p == psnum || *p) psnum = NULL;
270 if (dnum) *dnum = atoi(pdnum);
271 if (snum) *snum = psnum ? atoi(psnum) : 0;
272 if (dnet) *dnet = isdnet ? 1 : 0;
273 if (host) *host = NEWSTR(hp);
275 DPR3(("parse_dpy_str(%s):\thost=%s dnum=%d snum=%d dnet=%d\n",
276 display_str, *host, *dnum, *snum, *dnet));
281 char *std_dpy_str(display_str, snum)
285 char buf[BUFSIZ], *bp, val[20];
287 int dnum = 0, dnet = 0;
290 if (parse_dpy_str(display_str, &host, &dnum, snum, &dnet) == False)
293 /* sprintf(buf, "%s:%s%d", host, dnet ? ":" : NULL, dnum); */
294 bp = buf; buf[0] = 0;
295 bp = strcpyx(bp, host); *bp++ = ':';
296 if (dnet) *bp++ = ':';
297 sprintf(val, "%ld", (long) dnum);
298 bp = strcpyx(bp, val);
300 DPR3(("std_dpy_str(): \"%s\" --> \"%s\" snum=%d\n",
301 display_str, buf, *snum));
308 /* ******** file & dir manipulation ******** */
310 int make_user_dir(path)
313 if (!is_directory(path, False)) {
314 if (access(path, F_OK) == 0)
316 if (mkdir(path, 0777) != 0)
318 DPR(("make_user_dir(%s): created\n", path));
326 static char dname[MAXPATHLEN];
327 register char *p = path;
330 /* if (!p || !p[0]) return NULL; */
332 for (p = path + strlen(path) - 1; p > path && *p == '/'; p--) ;
334 memcpy(dname, path, dlen);
337 if (p = strrchr(dname, '/')) {
342 for ( ; p > dname && *p == '/'; p--) *p = 0;
351 int is_directory(path, must_writable)
356 int mode = R_OK|X_OK;
358 if (must_writable) mode |= W_OK;
359 return stat(path, &stb) == 0 && S_ISDIR(stb.st_mode)
360 && access(path, mode) == 0;
364 int is_regularfile(path)
368 return stat(path, &stb) == 0 && S_ISREG(stb.st_mode);
371 int is_emptyfile(path)
375 return stat(path, &stb) == 0 && S_ISREG(stb.st_mode) && stb.st_size == 0;
380 int is_executable(path)
384 return stat(path, &stb) == 0 && S_ISREG(stb.st_mode)
385 && access(path, R_OK|X_OK) == 0;
389 int is_writable(path)
392 if (access(path, R_OK|W_OK) == 0)
394 else if (errno == ENOENT) /* check directory permission */
395 return is_directory(dirname(path), True);
401 int is_readable(path, allow_empty)
406 return stat(path, &stb) == 0 && S_ISREG(stb.st_mode)
407 && access(path, R_OK) == 0 && (allow_empty || stb.st_size > 0);
411 /* ******** file reading ******** */
413 static int tag_line_num = 0;
414 static char *tag_linebuf = NULL;
415 static char *tag_file = NULL;
417 int start_tag_line(fname)
422 tag_linebuf = ALLOC(BUFSIZ, char);
426 if (tag_linebuf) FREE(tag_linebuf);
427 tag_linebuf = tag_file = 0;
433 int read_tag_line(fp, tagp, valp)
439 while (fgets(lp = tag_linebuf, BUFSIZ, fp)) {
441 skip_white(lp); /* lp = trim_line(lp); */
442 if (!*lp || *lp == '\n' || is_comment_char(*lp))
444 if (!(lp2 = strchr(lp, TAG_END_CHAR))) {
445 DPR3(("\t[line=%d] no tag on '%s'\n", tag_line_num, tag_file));
449 lp2 = trim_line(lp2);
452 *valp = *lp2 ? lp2 : 0;
457 return (ferror(fp)) ? -1 : 0;
461 /* ******** put messages ******** */
463 void put_xims_msg(msg_type, err_num, arg1, arg2, arg3)
464 int msg_type, err_num;
465 void *arg1, *arg2, *arg3;
470 msg = xims_errmsg(err_num, arg1, arg2, arg3);
473 { static char buf[80];
474 sprintf(buf, "ERROR: %s (%d)\n", error_name(err_num), err_num);
479 if (!msg || !*msg) return;
481 if (UseMsgWindow && useWINDOW()) {
482 ret = put_msg_win(msg_type, msg);
489 LastErrMsg = err_num;
494 void put_xims_errmsg(err_num, arg1, arg2, arg3)
496 void *arg1, *arg2, *arg3;
499 put_xims_msg(MSGTYP_FATAL, err_num, arg1, arg2, arg3);
502 void put_xims_warnmsg(err_num, arg1, arg2, arg3)
504 void *arg1, *arg2, *arg3;
507 put_xims_msg(MSGTYP_WARN, err_num, arg1, arg2, arg3);
512 /* for DPR*() macro */
513 void print_msg(fmt, arg1, arg2, arg3, arg4, arg5)
515 void *arg1, *arg2, *arg3, *arg4, *arg5;
517 fprintf(LogFp, fmt, arg1, arg2, arg3, arg4, arg5);
522 int put_xims_log(fmt, arg1, arg2, arg3)
524 void *arg1, *arg2, *arg3;
527 char *logpath = Opt.LogPath;
529 /* if (Verbose < 1) return False; */
531 if (fp = fopen(logpath, "a")) {
533 time_t tm = time((time_t *)0);
535 if (strftime(time_str, 80, /* "%x %X" */ "%D %T", localtime(&tm)) == 0)
537 fprintf(fp, "[%s] %s: ", time_str, ProgramName);
538 fprintf(fp, fmt, arg1, arg2, arg3);
543 DPR(("put_xims_log(); failed on '%s'\n", logpath));
548 /* ******** clear structure ******** */
550 void clear_ImsConf(ims)
553 FREE(ims->servername);
554 FREE(ims->servername2);
555 FREE(ims->classname);
558 FREE(ims->cmd_param);
560 FREE(ims->env_unset);
566 void clear_ImsEnt(ent)
573 clear_ImsConf(ent->ims);
579 void clear_ImsList(list)
584 for (i = 0; i < list->num_ent; i++) {
585 clear_ImsEnt(list->elist[i]);
586 FREE(list->elist[i]);
591 list->default_idx = -1;
592 list->def_selmode = SEL_MODE_NOAUTO;
596 void clear_FileSel(fsel)
600 FREE(fsel->hostname);
601 FREE(fsel->real_fname);
605 for (op = fsel->opts; *op; op++) {
606 FREE((*op)->ims_name);
607 FREE((*op)->opt_str);
615 fsel->select_mode = SEL_MODE_NONE;
617 fsel->dpy_specific = False;
620 void clear_UserSelection(sel)
626 clear_FileSel(sel->fsel);
630 clear_RunEnv(sel->renv);
633 /* FREE(sel->list); don't free */
634 /* FREE(sel->ent); don't free */
636 CLR(sel, UserSelection);
638 sel->host_type = HOST_LOCAL;
639 sel->flag = F_SELECT_NONE;
640 sel->status = NoError;
646 void clear_RunEnv(renv)
650 FREE(renv->atom_name);
654 renv->status = NoError;;
658 void clear_OutEnv(oenv)
665 for (ep = oenv->set; ep->name; ep++) {
666 FREE(ep->name); FREE(ep->value);
669 for (ep = oenv->unset; ep->name; ep++) {
670 FREE(ep->name); FREE(ep->value);
678 UserEnv *uenv = &userEnv;
680 FREE(uenv->hostname);
681 FREE(uenv->username);
684 FREE(uenv->real_locale);
685 FREE(uenv->displayname);
686 FREE(uenv->displaydir);
687 FREE(uenv->xmodifiers);
688 FREE_LIST(uenv->locale_aliases);
690 CLR(&userEnv, UserEnv);
696 if (cmdconf_initialized) {
697 CmdConf *conf = &Conf;
701 FREE(conf->imsConfDir);
702 FREE(conf->imsAppDir);
703 FREE(conf->imsLogDir);
704 FREE(conf->imsLogDile);
706 FREE(conf->userImsDir);
707 FREE(conf->userTmpDir);
708 FREE(conf->userAltDir);
710 for (i = 0; i < NUM_PROTOCOLS; i++) {
714 for (i = 0; i < NUM_ACTIONS; i++) {
715 FREE(conf->action[i]);
718 FREE(conf->remote->passEnv);
722 FREE(conf->dt->confDir);
723 FREE(conf->dt->userDir);
724 FREE(conf->dt->resPath);
729 FREE(conf->vue->confDir);
730 FREE(conf->vue->userDir);
731 FREE(conf->vue->uselite);
732 FREE(conf->vue->resPath);
733 FREE(conf->vue->litePath);
737 for (ap = conf->alias; *ap; ap++) {
739 FREE((*ap)->aliases);
744 for (i = 0; i < XHP_LANG_NUM; i++)
745 FREE(conf->xhp[i].locales);
748 # endif /* old_hpux */
751 cmdconf_initialized = False;
757 CLR(&winEnv, WinEnv);
767 UserSelection *sel = &userSel;
769 if (sel->list && sel->list != localList) {
770 clear_ImsList(sel->list);
774 clear_ImsList(localList);
778 clear_UserSelection(sel);
779 /* clear_FileSel(sel->fsel); */
780 /* clear_RunEnv(sel->renv); */
793 /* ******** print structure (for DEBUG) ******** */
795 void pr_FileSel(fsel)
798 fprintf(LogFp, "FileSel:\tdpy_specific=%d real_fname=%s select_mode=%d\n",
799 fsel->dpy_specific, fsel->real_fname, fsel->select_mode);
800 fprintf(LogFp, "\tname=%s host=%s iconic=%d com_opt='%s' opts=%#x\n",
801 fsel->name, fsel->hostname, fsel->iconic, fsel->com_opt, fsel->opts);
805 for (op = fsel->opts; *op; op++)
806 fprintf(LogFp, "\t opts[%d] <%s>\t'%s'\n",
807 op - fsel->opts, (*op)->ims_name, (*op)->opt_str);
811 void pr_UserSelection(sel)
814 fprintf(LogFp, "userSelection:\tstatus=%s flag=%#x ims_idx=%d\n",
815 error_name(sel->status), sel->flag, sel->ims_idx);
816 fprintf(LogFp, "\tname=%s host=%s host_type=%d iconic=%d\n",
817 sel->name, sel->hostname, sel->host_type, sel->iconic);
818 fprintf(LogFp, "\tfsel=%#x list=%#x ent=%#x renv=%#x\n",
819 sel->fsel, sel->list, sel->ent, sel->renv);
820 if (sel->fsel) pr_FileSel(sel->fsel);
821 if (sel->renv) pr_RunEnv(sel->renv);
824 void pr_ImsConf(conf, ims_name)
830 fprintf(LogFp, "ImsConf:\tname=%s protocols=%s%s%s%s\n", ims_name,
831 (conf->protocols & ProtoBit(Proto_XIM)) ? "XIM," : NULL,
832 (conf->protocols & ProtoBit(Proto_Ximp)) ? "Ximp," : NULL,
833 (conf->protocols & ProtoBit(Proto_Xsi)) ? "Xsi," : NULL,
835 (conf->protocols & ProtoBit(Proto_Xhp)) ? "Xhp," : NULL,
838 # endif /* old_hpux */
839 (conf->protocols & ProtoBit(Proto_None)) ? "None," : NULL);
840 fprintf(LogFp, "\tproperty=%s servername=%s (%s) class=%s\n",
841 conf->property, conf->servername,
842 conf->servername2, conf->classname);
843 fprintf(LogFp, "\tpath=%s param='%s'\n",
844 conf->cmd_path, conf->cmd_param);
845 fprintf(LogFp, "\ttimeout=%d interval=%d flags=%s%s%s\n",
846 conf->timeout, conf->interval,
847 (conf->flags & F_NO_SERVER) ? "no_server," : NULL,
848 (conf->flags & F_NO_REMOTE) ? "no_remote," : NULL,
849 (conf->flags & F_NO_OPTION) ? "no_option," : NULL,
850 (conf->flags & F_TRY_CONNECT) ? "try_connect," : NULL);
851 fprintf(LogFp, "\tenv_set: '%s'\n", conf->env_set);
852 fprintf(LogFp, "\tenv_unset: '%s'\n", conf->env_unset);
853 fprintf(LogFp, "\tenv_pass: '%s'\n", conf->env_pass);
857 void pr_ImsEnt(ent, idx)
861 fprintf(LogFp, "ImsEnt[%d]:\tname=%s fname=%s label=%s ims=%#x\n",
862 idx, ent->name, ent->fname, ent->label, ent->ims);
865 void pr_ImsList(list)
871 fprintf(LogFp, "ImsList:\tstatus=%d num_ent=%d def_idx=%d def_sel=%d\n",
872 list->status, list->num_ent, list->default_idx, list->def_selmode);
873 for (i = 0; i < list->num_ent; i++) {
874 ent = list->elist[i];
876 if (ent->ims) pr_ImsConf(ent->ims, ent->name);
883 fprintf(LogFp, "WinEnv:\tstatus=%d Dpy=%#x topW=%#x appC=%#x\n",
884 wenv->status, wenv->Dpy, wenv->TopW, wenv->appC);
885 fprintf(LogFp, "\tatom_owner=%#x atom: main=%d status=%d data=%d\n",
886 wenv->atom_owner, wenv->atom_main, wenv->atom_status, wenv->atom_data);
892 fprintf(LogFp, "RunEnv:\tstatus=%s is_remote=%d proto=%d\n",
893 error_name(renv->status), renv->is_remote, proto_name(renv->proto));
894 fprintf(LogFp, "\tim_mod='%s' atom_name='%s' prop_atom=%d\n",
895 renv->im_mod, renv->atom_name, renv->prop_atom);
896 fprintf(LogFp, "\tpid=%d wait_status=%#x cmdbuf='%s'\n",
897 renv->pid, renv->wait_status, renv->cmdbuf);
903 UserEnv *uenv = &userEnv;
905 fprintf(LogFp, "UserEnv:\n");
906 fprintf(LogFp, "\thostname=\"%s\"\n", uenv->hostname);
907 fprintf(LogFp, "\tusername=\"%s\"\n", uenv->username);
908 fprintf(LogFp, "\tlocale=\"%s\" real_locale=\"%s\"\n",
909 uenv->locale, uenv->real_locale);
910 fprintf(LogFp, "\thomedir=\"%s\"\n", uenv->homedir);
911 fprintf(LogFp, "\tdisplayname=\"%s\"\n", uenv->displayname);
912 fprintf(LogFp, "\tdisplaydir=\"%s\"\n", uenv->displaydir);
913 fprintf(LogFp, "\tscreen_num=%d\n", uenv->screen_num);
921 fprintf(LogFp, "OutEnv:\n");
922 fprintf(LogFp, " set: \t");
924 for (ep = oenv->set; ep->name; ep++)
925 fprintf(LogFp, "%s='%s' ", ep->name, ep->value);
928 fprintf(LogFp, " unset:\t");
930 for (ep = oenv->unset; ep->name; ep++)
931 fprintf(LogFp, "%s='%s' ", ep->name, ep->value);
939 CmdConf *conf = &Conf;
942 # endif /* old_hpux */
945 fprintf(LogFp, "CmdConf:\n");
946 fprintf(LogFp, "\timsConfDir=%s\n", conf->imsConfDir);
947 fprintf(LogFp, "\timsAppDir=%s\n", conf->imsAppDir);
948 fprintf(LogFp, "\timsLogDir=%s\n", conf->imsLogDir);
949 fprintf(LogFp, "\timsLogFile=%s\n", conf->imsLogFile);
950 fprintf(LogFp, "\timsDir=%s\n", conf->imsDir);
951 fprintf(LogFp, "\tuserImsDir=%s\n", conf->userImsDir);
952 fprintf(LogFp, "\tuserTmpDir=%s\n", conf->userTmpDir);
953 fprintf(LogFp, "\tuserAltDir=%s\n", conf->userAltDir);
956 fprintf(LogFp, "\tImXmod:\tXIM=%s Ximp=%s Xsi=%s Xhp=%s None=%s\n",
957 conf->xmod[Proto_XIM], conf->xmod[Proto_Ximp],
958 conf->xmod[Proto_Xsi], conf->xmod[Proto_Xhp], conf->atom[Proto_None]);
959 fprintf(LogFp, "\tImAtom:\tXIM=%s Ximp=%s Xsi=%s Xhp=%s None=%s\n",
960 conf->atom[Proto_XIM], conf->atom[Proto_Ximp],
961 conf->atom[Proto_Xsi], conf->atom[Proto_Xhp], conf->atom[Proto_None]);
963 fprintf(LogFp, "\tImXmod:\tXIM=%s Ximp=%s Xsi=%s None=%s\n",
964 conf->xmod[Proto_XIM], conf->xmod[Proto_Ximp],
965 conf->xmod[Proto_Xsi], conf->atom[Proto_None]);
966 fprintf(LogFp, "\tImAtom:\tXIM=%s Ximp=%s Xsi=%s None=%s\n",
967 conf->atom[Proto_XIM], conf->atom[Proto_Ximp],
968 conf->atom[Proto_Xsi], conf->atom[Proto_None]);
969 # endif /* old_hpux */
971 fprintf(LogFp, "\tAction[%d]:\t{ ", NUM_ACTIONS);
972 for (i = 0; i < NUM_ACTIONS; i++)
973 fprintf(LogFp, "\"%s\", ", conf->action[i]);
974 fprintf(LogFp, "}\n");
976 fprintf(LogFp, "\tRemote:\tDisabled=%s useRemsh=%s timeout=%d\n",
977 conf->remote->disabled ? "True" : "False",
978 conf->remote->useRemsh ? "True" : "False",
979 conf->remote->timeout);
980 fprintf(LogFp, "\t Env:\t%s\n", conf->remote->passEnv);
983 fprintf(LogFp, "\tDtEnv:\tConfDir=%s UserDir=%s\n",
984 conf->dt->confDir, conf->dt->userDir);
985 fprintf(LogFp, "\t resPath=\"%s\"\n", conf->dt->resPath);
987 fprintf(LogFp, "\tDtEnv:\t<None>\n");
991 fprintf(LogFp, "\tVueEnv:\tConfDir=%s UserDir=%s\n",
992 conf->vue->confDir, conf->vue->userDir);
993 fprintf(LogFp, "\t uselite=%s\n", conf->vue->uselite);
994 fprintf(LogFp, "\t resPath=\"%s\"\n", conf->vue->resPath);
995 fprintf(LogFp, "\t litePath=\"%s\"\n", conf->vue->litePath);
997 fprintf(LogFp, "\tVueEnv:\t<None>\n");
999 fprintf(LogFp, "\tlocaleAlias:\t%s\n", conf->alias ? NULL : "None");
1001 for (ap = conf->alias; *ap; ap++)
1002 fprintf(LogFp, "\t [%s]\t%s\n", (*ap)->name, (*ap)->aliases);
1005 fprintf(LogFp, "\txhp:\t%s\n", conf->xhp ? NULL : "None");
1007 for (i = 0; i < XHP_LANG_NUM; i++)
1008 fprintf(LogFp, "\t [%c]\t%s\n",
1009 conf->xhp[i].type, conf->xhp[i].locales);
1011 # endif /* old_hpux */
1016 fprintf(LogFp, "CmdOpt:\tDisplayName=%s LocaleName=%s ShellName=%s\n",
1017 Opt.DisplayName, Opt.LocaleName, Opt.ShellName);
1018 fprintf(LogFp, "\tConfPath=%s UserPath=%s\n",
1019 Opt.ConfPath, Opt.UserPath);
1020 fprintf(LogFp, "\tLogPath=%s ResourceFile=%s\n",
1021 Opt.LogPath, Opt.ResourceFile);
1022 fprintf(LogFp, "\tImsName=%s HostName=%s ImsOption=%s\n",
1023 Opt.ImsName, Opt.HostName, Opt.ImsOption);
1024 fprintf(LogFp, "\tSelectMode=%d Timeout=%d Interval=%d\n",
1025 Opt.SelectMode, Opt.Timeout, Opt.Interval);
1028 void pr_OpModeFlag()
1030 char *name = "<unknown>";
1033 case MODE_START: name = "START"; break;
1034 case MODE_MODE: name = "MODE"; break;
1035 case MODE_STYLE: name = "STYLE"; break;
1036 case MODE_LIST: name = "LIST"; break;
1037 case MODE_CURRENT: name = "CURRENT"; break;
1038 case MODE_REMCONF: name = "REMCONF"; break;
1040 fprintf(LogFp, "OpMode=%s[%d] OpFlag=[%#x] ", name, OpMode, OpFlag);
1043 if (OpFlag & FLAG_ENV) fputs("Env, ", LogFp);
1044 if (OpFlag & FLAG_NOSAVE) fputs("NoSave, ", LogFp);
1045 if (OpFlag & FLAG_NOSTART) fputs("NoStart, ", LogFp);
1046 if (OpFlag & FLAG_NOWAIT) fputs("NoWait, ", LogFp);
1047 if (OpFlag & FLAG_NOTIMEOUT) fputs("NoTimeout, ", LogFp);
1048 if (OpFlag & FLAG_NORESOURCE) fputs("NoResource, ", LogFp);
1049 if (OpFlag & FLAG_NOREMOTE) fputs("NoRemote, ", LogFp);
1050 if (OpFlag & FLAG_NOTIFY) fputs("Notify, ", LogFp);
1051 if (OpFlag & FLAG_CONNECT) fputs("Connect, ", LogFp);
1052 if (OpFlag & FLAG_REMOTERUN) fputs("RemoteRun, ", LogFp);
1053 if (OpFlag & FLAG_WINDOW) fputs("Window, ", LogFp);
1054 if (OpFlag & FLAG_DT) fputs("Dt, ", LogFp);
1056 if (OpFlag & FLAG_VUE) fputs("Vue, ", LogFp);
1057 # endif /* old_hpux */
1062 static char *StateNameTbl[] = {
1085 #define NumStates (sizeof(StateNameTbl) / sizeof(char *))
1089 return (OpState >= 0 && OpState < NumStates) ?
1090 StateNameTbl[OpState] : "<unknown>";
1094 /* ******** error name ******** */
1096 char *error_name(error)
1099 char *name = "<unknown>";
1102 #define ERR_CASE(err) case err : name = #err; break
1104 #define ERR_CASE(err) case err : name = "err"; break
1105 # endif /* __STDC__ */
1109 ERR_CASE(ErrSyntax);
1110 ERR_CASE(ErrNoHome);
1111 ERR_CASE(ErrNoLocale);
1112 ERR_CASE(ErrNoCDELocale);
1113 ERR_CASE(ErrNoDisplay);
1114 ERR_CASE(ErrDisabled);
1115 ERR_CASE(ErrSignaled);
1118 ERR_CASE(ErrFileOpen);
1119 ERR_CASE(ErrFileCreate);
1120 ERR_CASE(ErrDirCreate);
1121 ERR_CASE(ErrMissEntry);
1124 ERR_CASE(ErrAnotherProg);
1125 ERR_CASE(ErrNoSelectionFile);
1126 ERR_CASE(ErrSaveSelection);
1127 ERR_CASE(ErrNoSelection);
1128 ERR_CASE(ErrNoLocaleConf);
1129 ERR_CASE(ErrNoImsEntry);
1130 ERR_CASE(ErrNoImsConf);
1131 ERR_CASE(ErrNotRegistered);
1132 ERR_CASE(ErrNoExecutable);
1135 ERR_CASE(ErrImsRunning);
1136 ERR_CASE(ErrImsExecution);
1137 ERR_CASE(ErrImsAborted);
1138 ERR_CASE(ErrImsTimeout);
1139 ERR_CASE(ErrUnknownHost);
1140 ERR_CASE(ErrRemoteAction);
1141 ERR_CASE(ErrRemoteData);
1142 ERR_CASE(ErrRemoteNoIms);
1143 ERR_CASE(ErrRemoteMissIms);
1144 ERR_CASE(ErrNoImsstart);
1145 ERR_CASE(ErrRemoteIms);
1148 ERR_CASE(ErrOpenDpy);
1151 ERR_CASE(ErrMemory);
1154 ERR_CASE(ErrIsNone);
1155 ERR_CASE(ErrNotRun);
1156 ERR_CASE(ErrImsWaiting);
1157 ERR_CASE(ErrImsWaitDone);
1158 ERR_CASE(ErrImsConnecting);
1159 ERR_CASE(ErrImsConnectDone);
1160 ERR_CASE(ErrInvState);
1161 ERR_CASE(ErrInternal);
1169 static char *_proto_names[NUM_PROTOCOLS] =
1171 { "None", "XIM", "Ximp", "Xsi", "Xhp" };
1173 { "None", "XIM", "Ximp", "Xsi" };
1174 # endif /* old_hpux */
1176 char *proto_name(proto_idx)
1179 if (proto_idx >= 0 && proto_idx < NUM_PROTOCOLS)
1180 return _proto_names[proto_idx];
1185 static char *SigNames[] = { /* 1 ~ 32 */
1186 "HUP", "INT", "QUIT", "ILL", "TRAP", "IOT,ABRT", "EMT", "FPE",
1187 "KILL", "BUS", "SEGV", "SYS", "PIPE", "ALRM", "TERM", "USR1",
1188 "USR2", "CHLD", "PWR", "VTALRM", "PROF", "POLL,IO", "WINCH", "STOP",
1189 "TSTP", "CONT", "TTIN", "TTOU", "URG", "LOST", "(reserved)", "DIL",
1192 #define MaxSigNum (sizeof(SigNames) / sizeof(char *))
1197 return (sig > 0 && sig <= MaxSigNum) ? SigNames[sig - 1] : "<unknown>";
1204 static char *last_brk = 0;
1205 char *new_brk = (char *) sbrk(0);
1206 long inc = (long) (new_brk - last_brk);
1208 inc += inc > 0 ? 1023 : -1023;
1209 DPR(("%s: BREAK=%p (Inc=%+d KB)\n", msg, new_brk, inc/1024));