X-Git-Url: http://git.marmaro.de/?p=mmh;a=blobdiff_plain;f=uip%2Fmhl.c;h=e4e8dbf31dd10fd9dd4e7f348b218ab9f72f9b0d;hp=8c2e4af0a2d466b169d99d2a1cbaa86a5ad8fb5a;hb=a8984c0e490cda653615bc0e1d4743ad8fe7a2a7;hpb=f9ed40f2742263b3a1023bedee4139b4b18f0a86 diff --git a/uip/mhl.c b/uip/mhl.c index 8c2e4af..e4e8dbf 100644 --- a/uip/mhl.c +++ b/uip/mhl.c @@ -12,8 +12,11 @@ #include #include #include -#include #include +#include +#include +#include +#include /* ** MAJOR BUG: @@ -174,18 +177,12 @@ static char *parptr; static int num_ignores = 0; static char *ignores[MAXARGS]; -static jmp_buf env; -static jmp_buf mhlenv; - -static FILE *(*mhl_action) () = (FILE *(*) ()) 0; - +volatile sig_atomic_t eflag = 0; /* ** Redefine a couple of functions. ** These are undefined later in the code. */ -#define adios mhladios -#define done mhldone /* ** prototypes @@ -208,8 +205,6 @@ static char *oneline(char *, long); static void putstr(char *); static void putch(char); static void intrser(int); -static void mhladios(char *, char *, ...); -static void mhldone(int); int sc_width(void); /* from termsbr.c */ @@ -239,30 +234,30 @@ main(int argc, char **argv) switch (smatch(++cp, switches)) { case AMBIGSW: ambigsw(cp, switches); - done(1); + exit(EX_USAGE); case UNKWNSW: - adios(NULL, "-%s unknown\n", cp); + adios(EX_USAGE, NULL, "-%s unknown\n", cp); case HELPSW: snprintf(buf, sizeof(buf), "%s [switches] [files ...]", invo_name); print_help(buf, switches, 1); - done(1); + exit(argc == 2 ? EX_OK : EX_USAGE); case VERSIONSW: print_version(invo_name); - done(1); + exit(argc == 2 ? EX_OK : EX_USAGE); case FORMSW: if (!(form = *argp++) || *form == '-') - adios(NULL, "missing argument to %s", + adios(EX_USAGE, NULL, "missing argument to %s", argp[-2]); continue; case WIDTHSW: if (!(cp = *argp++) || *cp == '-') - adios(NULL, "missing argument to %s", + adios(EX_USAGE, NULL, "missing argument to %s", argp[-2]); if ((width = atoi(cp)) < 1) - adios(NULL, "bad argument %s %s", + adios(EX_USAGE, NULL, "bad argument %s %s", argp[-2], cp); continue; @@ -296,7 +291,7 @@ main(int argc, char **argv) fflush(stdout); if (ferror(stdout)) { - adios("output", "error writing"); + adios(EX_IOERR, "output", "error writing"); } return exitstat; @@ -327,7 +322,7 @@ mhl_format(char *file, int width) } if ((fp = fopen(etcpath(file), "r")) == NULL) - adios(file, "unable to open format file"); + adios(EX_IOERR, file, "unable to open format file"); if (fstat(fileno(fp), &st) != NOTOK) { mtime = st.st_mtime; @@ -374,7 +369,7 @@ mhl_format(char *file, int width) int n = 0; /* split the fields */ - tmparray = brkstring(getcpy(++parptr), ",", + tmparray = brkstring(mh_xstrdup(++parptr), ",", NULL); /* ** copy pointers to split fields @@ -389,7 +384,7 @@ mhl_format(char *file, int width) parptr = bp; while (*parptr) { if (evalvar(&global)) - adios(NULL, "format file syntax error: %s", bp); + adios(EX_CONFIG, NULL, "format file syntax error: %s", bp); if (*parptr) parptr++; } @@ -400,21 +395,21 @@ mhl_format(char *file, int width) while (*parptr == ':' || *parptr == ',') { parptr++; if (evalvar(c1)) - adios(NULL, "format file syntax error: %s", bp); + adios(EX_CONFIG, NULL, "format file syntax error: %s", bp); } if (!c1->c_fstr && global.c_fstr) { if ((c1->c_flags & DATEFMT) && (global.c_flags & DATEFMT)) { - c1->c_fstr = getcpy(global.c_fstr); + c1->c_fstr = mh_xstrdup(global.c_fstr); } else if ((c1->c_flags & ADDRFMT) && (global.c_flags & ADDRFMT)) { - c1->c_fstr = getcpy(global.c_fstr); + c1->c_fstr = mh_xstrdup(global.c_fstr); } } continue; default: - adios(NULL, "format file syntax error: %s", bp); + adios(EX_CONFIG, NULL, "format file syntax error: %s", bp); } } fclose(fp); @@ -463,8 +458,8 @@ evalvar(struct mcomp *c1) return 1; cp = concat("=", cp, NULL); fmtstr = new_fs(cp, NULL); - free(cp); - c1->c_fstr = getcpy(fmtstr); + mh_free0(&cp); + c1->c_fstr = mh_xstrdup(fmtstr); c1->c_flags |= FORMAT; return 0; } @@ -473,7 +468,7 @@ evalvar(struct mcomp *c1) char *fmtstr; fmtstr = new_fs("=%(decode{text})", NULL); - c1->c_fstr = getcpy(fmtstr); + c1->c_fstr = mh_xstrdup(fmtstr); c1->c_flags |= FORMAT; return 0; } @@ -535,7 +530,7 @@ ptos(char *name, char **s) } c = *parptr; *parptr = 0; - *s = getcpy(cp); + *s = mh_xstrdup(cp); if ((*parptr = c) == '"') parptr++; return 0; @@ -573,29 +568,25 @@ process(char *fname, int ofilen, int ofilec) FILE *fp = NULL; struct mcomp *c1; - if (setjmp(env) == 0) { - if (fname) { - fp = mhl_action ? (*mhl_action) (fname) : - fopen(fname, "r"); - if (fp == NULL) { - advise(fname, "unable to open"); - exitstat++; - return; - } - } else { - fname = "(stdin)"; - fp = stdin; + if (fname) { + fp = fopen(fname, "r"); + if (fp == NULL) { + advise(fname, "unable to open"); + exitstat++; + return; } - SIGNAL(SIGINT, intrser); - mhlfile(fp, fname, ofilen, ofilec); + } else { + fname = "(stdin)"; + fp = stdin; } + SIGNAL(SIGINT, intrser); + mhlfile(fp, fname, ofilen, ofilec); SIGNAL(SIGINT, SIG_IGN); - if (mhl_action == NULL && fp != stdin) + if (fp != stdin) fclose(fp); if (holder.c_text) { - free(holder.c_text); - holder.c_text = NULL; + mh_free0(&(holder.c_text)); } free_queue(&msghd, &msgtl); for (c1 = fmthd; c1; c1 = c1->c_next) @@ -624,7 +615,7 @@ mhlfile(FILE *fp, char *mname, int ofilen, int ofilec) printf(">>> %s\n\n", mname); } - for (state = FLD;;) { + for (state = FLD;!eflag;) { switch (state = m_getfld(state, name, buf, sizeof(buf), fp)) { case FLD: case FLDPLUS: @@ -671,8 +662,7 @@ mhlfile(FILE *fp, char *mname, int ofilen, int ofilec) holder.c_text = concat("(Message ", mname, ")\n", NULL); putcomp(c1, &holder, ONECOMP); - free(holder.c_text); - holder.c_text = NULL; + mh_free0(&(holder.c_text)); continue; } if (!mh_strcasecmp(c1->c_name, "extras")) { @@ -682,14 +672,13 @@ mhlfile(FILE *fp, char *mname, int ofilen, int ofilec) continue; } if (dobody && !mh_strcasecmp(c1->c_name, "body")) { - holder.c_text = mh_xmalloc(sizeof(buf)); + holder.c_text = mh_xcalloc(sizeof(buf), sizeof(char)); strncpy(holder.c_text, buf, sizeof(buf)); while (state == BODY) { putcomp(c1, &holder, BODYCOMP); state = m_getfld(state, name, holder.c_text, sizeof(buf), fp); } - free(holder.c_text); - holder.c_text = NULL; + mh_free0(&(holder.c_text)); continue; } for (c2 = msghd; c2; c2 = c2->c_next) @@ -709,7 +698,7 @@ mhlfile(FILE *fp, char *mname, int ofilen, int ofilec) return; default: - adios(NULL, "getfld() returned %d", state); + adios(EX_SOFTWARE, NULL, "getfld() returned %d", state); } } } @@ -780,23 +769,21 @@ mcomp_format(struct mcomp *c1, struct mcomp *c2) fmt_scan(c1->c_fmt, buffer, sizeof(buffer) - 1, dat); /* Don't need to append a newline, dctime() already did */ - c2->c_text = getcpy(buffer); + c2->c_text = mh_xstrdup(buffer); - free(ap); + mh_free0(&ap); return; } (q = &pq)->pq_next = NULL; while ((cp = getname(ap))) { - if ((p = (struct pqpair *) - calloc((size_t) 1, sizeof(*p))) == NULL) - adios(NULL, "unable to allocate pqpair memory"); + p = mh_xcalloc(1, sizeof(*p)); if ((mp = getm(cp, NULL, 0, AD_NAME, error)) == NULL) { - p->pq_text = getcpy(cp); - p->pq_error = getcpy(error); + p->pq_text = mh_xstrdup(cp); + p->pq_error = mh_xstrdup(error); } else { - p->pq_text = getcpy(mp->m_text); + p->pq_text = mh_xstrdup(mp->m_text); mnfree(mp); } q = (q->pq_next = p); @@ -819,11 +806,11 @@ mcomp_format(struct mcomp *c1, struct mcomp *c2) c2->c_text = add(buffer, c2->c_text); } - free(p->pq_text); + mh_free0(&(p->pq_text)); if (p->pq_error) - free(p->pq_error); + mh_free0(&(p->pq_error)); q = p->pq_next; - free((char *) p); + mh_free0(&p); } c2->c_text = add("\n", c2->c_text); @@ -837,16 +824,15 @@ add_queue(struct mcomp **head, struct mcomp **tail, char *name, { struct mcomp *c1; - if ((c1 = (struct mcomp *) calloc((size_t) 1, sizeof(*c1))) == NULL) - adios(NULL, "unable to allocate comp memory"); + c1 = mh_xcalloc(1, sizeof(*c1)); c1->c_flags = flags & ~INIT; - if ((c1->c_name = name ? getcpy(name) : NULL)) + if ((c1->c_name = name ? mh_xstrdup(name) : NULL)) c1->c_flags |= mcomp_flags(c1->c_name); - c1->c_text = text ? getcpy(text) : NULL; + c1->c_text = text ? mh_xstrdup(text) : NULL; if (flags & INIT) { if (global.c_ovtxt) - c1->c_ovtxt = getcpy(global.c_ovtxt); + c1->c_ovtxt = mh_xstrdup(global.c_ovtxt); c1->c_offset = global.c_offset; c1->c_ovoff = global. c_ovoff; c1->c_width = 0; @@ -871,16 +857,16 @@ free_queue(struct mcomp **head, struct mcomp **tail) for (c1 = *head; c1; c1 = c2) { c2 = c1->c_next; if (c1->c_name) - free(c1->c_name); + mh_free0(&(c1->c_name)); if (c1->c_text) - free(c1->c_text); + mh_free0(&(c1->c_text)); if (c1->c_ovtxt) - free(c1->c_ovtxt); + mh_free0(&(c1->c_ovtxt)); if (c1->c_fstr) - free(c1->c_fstr); + mh_free0(&(c1->c_fstr)); if (c1->c_fmt) - free((char *) c1->c_fmt); - free((char *) c1); + mh_free0(&(c1->c_fmt)); + mh_free0(&c1); } *head = *tail = NULL; @@ -901,7 +887,7 @@ putcomp(struct mcomp *c1, struct mcomp *c2, int flag) if ((ovtxt = c1->c_ovtxt ? c1->c_ovtxt : global.c_ovtxt) == NULL) ovtxt = ""; if (wid < ovoff + strlen(ovtxt) + 5) - adios(NULL, "component: %s width(%d) too small for overflow(%d)", c1->c_name, wid, ovoff + strlen(ovtxt) + 5); + adios(EX_SOFTWARE, NULL, "component: %s width(%d) too small for overflow(%d)", c1->c_name, wid, ovoff + strlen(ovtxt) + 5); onelp = NULL; if (c1->c_flags & CLEARTEXT) { @@ -1113,33 +1099,5 @@ putch(char ch) static void intrser(int i) { - discard(stdout); - putchar('\n'); - longjmp(env, DONE); -} - - -#undef adios -#undef done - -static void -mhladios(char *what, char *fmt, ...) -{ - va_list ap; - - va_start(ap, fmt); - advertise(what, NULL, fmt, ap); - va_end(ap); - mhldone(1); -} - - -static void -mhldone(int status) -{ - exitstat = status; - if (mhl_action) - longjmp(mhlenv, DONE); - else - done(exitstat); + eflag = 1; }