X-Git-Url: http://git.marmaro.de/?p=mmh;a=blobdiff_plain;f=uip%2Fmhl.c;h=20f5d31f8bb5998e1655855ed57bcd78f3e58d2f;hp=45113f3ca2f20d7c550c5c51b081795a507ac889;hb=a87df3543d3bc128ba4079d1f95638476ba5ca50;hpb=96d10c193324201ef8acb622ed13e9a5ecb59827 diff --git a/uip/mhl.c b/uip/mhl.c index 45113f3..20f5d31 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,7 +177,7 @@ static char *parptr; static int num_ignores = 0; static char *ignores[MAXARGS]; -static jmp_buf env; +volatile sig_atomic_t eflag = 0; /* ** Redefine a couple of functions. @@ -231,30 +234,30 @@ main(int argc, char **argv) switch (smatch(++cp, switches)) { case AMBIGSW: ambigsw(cp, switches); - exit(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); - exit(0); + exit(argc == 2 ? EX_OK : EX_USAGE); case VERSIONSW: print_version(invo_name); - exit(0); + 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; @@ -288,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; @@ -319,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; @@ -381,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++; } @@ -392,7 +395,7 @@ 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) && @@ -406,7 +409,7 @@ mhl_format(char *file, int width) continue; default: - adios(NULL, "format file syntax error: %s", bp); + adios(EX_CONFIG, NULL, "format file syntax error: %s", bp); } } fclose(fp); @@ -565,51 +568,48 @@ process(char *fname, int ofilen, int ofilec) FILE *fp = NULL; struct mcomp *c1; - switch (setjmp(env)) { - case OK: - if (fname) { - fp = fopen(fname, "r"); - if (fp == NULL) { - advise(fname, "unable to open"); - exitstat++; - return; - } - } else { - fname = "(stdin)"; - fp = stdin; - } - SIGNAL(SIGINT, intrser); - mhlfile(fp, fname, ofilen, ofilec); - /* FALL THROUGH! */ - default: - SIGNAL(SIGINT, SIG_IGN); - if (fp != stdin) - fclose(fp); - if (holder.c_text) { - free(holder.c_text); - holder.c_text = NULL; + if (fname) { + fp = fopen(fname, "r"); + if (fp == NULL) { + advise(fname, "unable to open"); + exitstat++; + return; } - free_queue(&msghd, &msgtl); - for (c1 = fmthd; c1; c1 = c1->c_next) - c1->c_flags &= ~HDROUTPUT; - break; + } else { + fname = "(stdin)"; + fp = stdin; + } + SIGNAL(SIGINT, intrser); + mhlfile(fp, fname, ofilen, ofilec); + + SIGNAL(SIGINT, SIG_IGN); + if (fp != stdin) + fclose(fp); + if (holder.c_text) { + free(holder.c_text); + holder.c_text = NULL; } + free_queue(&msghd, &msgtl); + for (c1 = fmthd; c1; c1 = c1->c_next) + c1->c_flags &= ~HDROUTPUT; } static void mhlfile(FILE *fp, char *mname, int ofilen, int ofilec) { - int state; + enum state state; + struct field f = free_field; struct mcomp *c1, *c2, *c3; - char **ip, name[NAMESZ], buf[BUFSIZ]; + char **ip; if (forwall) { printf("\n-------"); - if (ofilen == 1) + if (ofilen == 1) { printf(" Forwarded Message%s", ofilec > 1 ? "s" : ""); - else + } else { printf(" Message %d", ofilen); + } printf("\n\n"); } else if (ofilec > 1) { if (ofilen > 1) { @@ -618,50 +618,46 @@ mhlfile(FILE *fp, char *mname, int ofilen, int ofilec) printf(">>> %s\n\n", mname); } - for (state = FLD;;) { - switch (state = m_getfld(state, name, buf, sizeof(buf), fp)) { - case FLD: - case FLDPLUS: + for (state = FLD2; !eflag; ) { + switch (state = m_getfld2(state, &f, fp)) { + case FLD2: for (ip = ignores; *ip; ip++) - if (!mh_strcasecmp(name, *ip)) { - while (state == FLDPLUS) - state = m_getfld(state, name, buf, sizeof(buf), fp); + if (mh_strcasecmp(f.name, *ip)==0) { break; } - if (*ip) + if (*ip) { continue; + } for (c2 = fmthd; c2; c2 = c2->c_next) - if (!mh_strcasecmp(c2->c_name, name)) + if (mh_strcasecmp(c2->c_name, f.name)==0) { break; + } c1 = NULL; if (!((c3 = c2 ? c2 : &global)->c_flags & SPLIT)) for (c1 = msghd; c1; c1 = c1->c_next) - if (!mh_strcasecmp(c1->c_name, - c3->c_name)) { - c1->c_text = mcomp_add(c1->c_flags, buf, c1->c_text); + if (mh_strcasecmp(c1->c_name, + c3->c_name)==0) { + c1->c_text = mcomp_add(c1->c_flags, f.value, c1->c_text); break; } - if (c1 == NULL) - c1 = add_queue(&msghd, &msgtl, name, buf, 0); - while (state == FLDPLUS) { - state = m_getfld(state, name, buf, - sizeof(buf), fp); - c1->c_text = add(buf, c1->c_text); + if (c1 == NULL) { + c1 = add_queue(&msghd, &msgtl, f.name, f.value, 0); } - if (c2 == NULL) + if (c2 == NULL) { c1->c_flags |= EXTRA; + } continue; - case BODY: - case FILEEOF: + case BODY2: + case FILEEOF2: column = 0; for (c1 = fmthd; c1; c1 = c1->c_next) { if (c1->c_flags & CLEARTEXT) { putcomp(c1, c1, ONECOMP); continue; } - if (!mh_strcasecmp(c1->c_name, "messagename")) { + if (mh_strcasecmp(c1->c_name, "messagename")==0) { holder.c_text = concat("(Message ", mname, ")\n", NULL); putcomp(c1, &holder, ONECOMP); @@ -669,41 +665,47 @@ mhlfile(FILE *fp, char *mname, int ofilen, int ofilec) holder.c_text = NULL; continue; } - if (!mh_strcasecmp(c1->c_name, "extras")) { - for (c2 = msghd; c2; c2 = c2->c_next) - if (c2->c_flags & EXTRA) + if (mh_strcasecmp(c1->c_name, "extras")==0) { + for (c2 = msghd; c2; c2 = c2->c_next) { + if (c2->c_flags & EXTRA) { putcomp(c1, c2, TWOCOMP); + } + } continue; } - if (dobody && !mh_strcasecmp(c1->c_name, "body")) { - holder.c_text = mh_xmalloc(sizeof(buf)); - strncpy(holder.c_text, buf, sizeof(buf)); - while (state == BODY) { + if (dobody && mh_strcasecmp(c1->c_name, "body")==0) { + holder.c_text = getcpy(f.value); + while (state == BODY2) { putcomp(c1, &holder, BODYCOMP); - state = m_getfld(state, name, holder.c_text, sizeof(buf), fp); + state = m_getfld2(state, &f, fp); + free(holder.c_text); + holder.c_text = getcpy(f.value); } free(holder.c_text); holder.c_text = NULL; continue; } - for (c2 = msghd; c2; c2 = c2->c_next) - if (!mh_strcasecmp(c2->c_name, - c1->c_name)) { + for (c2 = msghd; c2; c2 = c2->c_next) { + if (mh_strcasecmp(c2->c_name, + c1->c_name)==0) { putcomp(c1, c2, ONECOMP); - if (!(c1->c_flags & SPLIT)) + if (!(c1->c_flags & SPLIT)) { break; + } } + } } return; - case LENERR: - case FMTERR: + case LENERR2: + case FMTERR2: + case IOERR2: advise(NULL, "format error in message %s", mname); exitstat++; return; default: - adios(NULL, "getfld() returned %d", state); + adios(EX_SOFTWARE, NULL, "getfld() returned %d", state); } } } @@ -782,9 +784,7 @@ mcomp_format(struct mcomp *c1, struct mcomp *c2) (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 = (struct pqpair *) mh_xcalloc((size_t) 1, sizeof(*p)); if ((mp = getm(cp, NULL, 0, AD_NAME, error)) == NULL) { p->pq_text = getcpy(cp); @@ -831,8 +831,7 @@ 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 = (struct mcomp *) mh_xcalloc((size_t) 1, sizeof(*c1)); c1->c_flags = flags & ~INIT; if ((c1->c_name = name ? getcpy(name) : NULL)) @@ -895,7 +894,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) { @@ -1107,7 +1106,5 @@ putch(char ch) static void intrser(int i) { - discard(stdout); - putchar('\n'); - longjmp(env, DONE); + eflag = 1; }