X-Git-Url: http://git.marmaro.de/?p=mmh;a=blobdiff_plain;f=uip%2Fmhl.c;h=386cf95cd9fed4b36d0132e1fbfe981b678bdcc2;hp=45113f3ca2f20d7c550c5c51b081795a507ac889;hb=2abb9a7cfb0930e27062088734d306e7d78e4cc2;hpb=96d10c193324201ef8acb622ed13e9a5ecb59827 diff --git a/uip/mhl.c b/uip/mhl.c index 45113f3..386cf95 100644 --- a/uip/mhl.c +++ b/uip/mhl.c @@ -12,8 +12,10 @@ #include #include #include -#include #include +#include +#include +#include /* ** MAJOR BUG: @@ -174,7 +176,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. @@ -565,35 +567,30 @@ 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; } @@ -618,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: @@ -1107,7 +1104,5 @@ putch(char ch) static void intrser(int i) { - discard(stdout); - putchar('\n'); - longjmp(env, DONE); + eflag = 1; }