X-Git-Url: http://git.marmaro.de/?p=mmh;a=blobdiff_plain;f=uip%2Fmhl.c;h=386cf95cd9fed4b36d0132e1fbfe981b678bdcc2;hp=328db8fc8d28ba6245b36322f459a7fad1e721e5;hb=2abb9a7cfb0930e27062088734d306e7d78e4cc2;hpb=32b2354dbaf4bf934936eb5b102a4a3d2fdd209a diff --git a/uip/mhl.c b/uip/mhl.c index 328db8f..386cf95 100644 --- a/uip/mhl.c +++ b/uip/mhl.c @@ -12,8 +12,10 @@ #include #include #include -#include #include +#include +#include +#include /* ** MAJOR BUG: @@ -40,28 +42,20 @@ #define QUOTE '\\' -static struct swit mhlswitches[] = { +static struct swit switches[] = { #define FORMSW 0 { "form formfile", 0 }, #define WIDTHSW 1 { "width columns", 0 }, -#define SLEEPSW 2 - { "sleep seconds", 0 }, -#define VERSIONSW 3 +#define VERSIONSW 2 { "Version", 0 }, -#define HELPSW 4 +#define HELPSW 3 { "help", 0 }, -#define FORW1SW 5 +#define FORW1SW 4 { "forward", -7 }, -#define FORW2SW 6 +#define FORW2SW 5 { "forwall", -7 }, -#define DGSTSW 7 - { "digest list", -6 }, -#define VOLUMSW 8 - { "volume number", -6 }, -#define ISSUESW 9 - { "issue number", -5 }, -#define NBODYSW 10 +#define NBODYSW 6 { "nobody", -6 }, { NULL, 0 } }; @@ -163,12 +157,6 @@ static int dobody = 1; static int forwflg = 0; static int forwall = 0; -static int sleepsw = NOTOK; - -static char *digest = NULL; -static int volume = 0; -static int issue = 0; - static int exitstat = 0; static int mhldebug = 0; @@ -188,22 +176,12 @@ static char *parptr; static int num_ignores = 0; static char *ignores[MAXARGS]; -static jmp_buf env; -static jmp_buf mhlenv; - -static char delim3[] = -"\n----------------------------------------------------------------------\n\n"; -static char delim4[] = "\n------------------------------\n\n"; - -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 @@ -226,8 +204,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 */ @@ -240,10 +216,7 @@ main(int argc, char **argv) char buf[BUFSIZ], *files[MAXARGS]; char **argp, **arguments; -#ifdef LOCALE setlocale(LC_ALL, ""); -#endif - invo_name = mhbasename(argv[0]); /* read user profile/context */ @@ -257,20 +230,20 @@ main(int argc, char **argv) while ((cp = *argp++)) { if (*cp == '-') { - switch (smatch(++cp, mhlswitches)) { + switch (smatch(++cp, switches)) { case AMBIGSW: - ambigsw(cp, mhlswitches); - done(1); + ambigsw(cp, switches); + exit(1); case UNKWNSW: adios(NULL, "-%s unknown\n", cp); case HELPSW: snprintf(buf, sizeof(buf), "%s [switches] [files ...]", invo_name); - print_help(buf, mhlswitches, 1); - done(1); + print_help(buf, switches, 1); + exit(0); case VERSIONSW: print_version(invo_name); - done(1); + exit(0); case FORMSW: if (!(form = *argp++) || *form == '-') @@ -278,13 +251,6 @@ main(int argc, char **argv) argp[-2]); continue; - case SLEEPSW: - if (!(cp = *argp++) || *cp == '-') - adios(NULL, "missing argument to %s", - argp[-2]); - sleepsw = atoi(cp); /* ZERO ok! */ - continue; - case WIDTHSW: if (!(cp = *argp++) || *cp == '-') adios(NULL, "missing argument to %s", @@ -294,29 +260,6 @@ main(int argc, char **argv) argp[-2], cp); continue; - case DGSTSW: - if (!(digest = *argp++) || - *digest == '-') - adios(NULL, "missing argument to %s", - argp[-2]); - continue; - case ISSUESW: - if (!(cp = *argp++) || *cp == '-') - adios(NULL, "missing argument to %s", - argp[-2]); - if ((issue = atoi(cp)) < 1) - adios(NULL, "bad argument %s %s", - argp[-2], cp); - continue; - case VOLUMSW: - if (!(cp = *argp++) || *cp == '-') - adios(NULL, "missing argument to %s", - argp[-2]); - if ((volume = atoi(cp)) < 1) - adios(NULL, "bad argument %s %s", - argp[-2], cp); - continue; - case FORW2SW: forwall++; /* fall */ case FORW1SW: @@ -341,22 +284,7 @@ main(int argc, char **argv) } if (forwall) { - if (digest) { - printf("%s", delim4); - if (volume == 0) { - snprintf(buf, sizeof(buf), - "End of %s Digest\n", digest); - } else { - snprintf(buf, sizeof(buf), "End of %s Digest [Volume %d Issue %d]\n", digest, volume, issue); - } - i = strlen(buf); - for (cp = buf + i; i > 1; i--) - *cp++ = '*'; - *cp++ = '\n'; - *cp = 0; - printf("%s", buf); - } else - printf("\n------- End of Forwarded Message%s\n\n", + printf("\n------- End of Forwarded Message%s\n\n", vecp > 1 ? "s" : ""); } @@ -639,36 +567,30 @@ process(char *fname, int ofilen, int ofilec) FILE *fp = NULL; struct mcomp *c1; - switch (setjmp(env)) { - case OK: - 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; - } - SIGNAL(SIGINT, intrser); - mhlfile(fp, fname, ofilen, ofilec); - /* FALL THROUGH! */ - default: - SIGNAL(SIGINT, SIG_IGN); - if (mhl_action == NULL && 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; } @@ -680,17 +602,12 @@ mhlfile(FILE *fp, char *mname, int ofilen, int ofilec) char **ip, name[NAMESZ], buf[BUFSIZ]; if (forwall) { - if (digest) - printf("%s", ofilen == 1 ? delim3 : delim4); - else { - printf("\n-------"); - if (ofilen == 1) - printf(" Forwarded Message%s", - ofilec > 1 ? "s" : ""); - else - printf(" Message %d", ofilen); - printf("\n\n"); - } + printf("\n-------"); + if (ofilen == 1) + printf(" Forwarded Message%s", ofilec > 1 ? "s" : ""); + else + printf(" Message %d", ofilen); + printf("\n\n"); } else if (ofilec > 1) { if (ofilen > 1) { printf("\n\n\n"); @@ -698,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: @@ -1187,33 +1104,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; }