|
|
1.1 ! root 1: /* getans.c - get an answer from the user and return a string array */ ! 2: ! 3: #include "../h/mh.h" ! 4: #ifdef BSD42 ! 5: #include <setjmp.h> ! 6: #endif BSD42 ! 7: #include <signal.h> ! 8: #include <stdio.h> ! 9: ! 10: ! 11: static char ansbuf[BUFSIZ]; ! 12: #ifndef BSD42 ! 13: static int interrupted; ! 14: #else BSD42 ! 15: static jmp_buf sigenv; ! 16: #endif BSD42 ! 17: static SIGDECL intrser(); ! 18: ! 19: char ** ! 20: getans(prompt, ansp) ! 21: register char *prompt; ! 22: register struct swit *ansp; ! 23: { ! 24: register int i; ! 25: SIGDECL (*istat)(); ! 26: register char *cp, ! 27: **cpp; ! 28: ! 29: #ifndef BSD42 ! 30: interrupted = 0; ! 31: istat = signal (SIGINT, intrser); ! 32: #else BSD42 ! 33: switch (setjmp (sigenv)) { ! 34: case OK: ! 35: istat = signal (SIGINT, intrser); ! 36: break; ! 37: ! 38: default: ! 39: (void) signal (SIGINT, istat); ! 40: return NULL; ! 41: } ! 42: #endif BSD42 ! 43: for (;;) { ! 44: printf ("%s", prompt); ! 45: (void) fflush (stdout); ! 46: cp = ansbuf; ! 47: while ((i = getchar ()) != '\n') { ! 48: #ifndef BSD42 ! 49: if (i == EOF || interrupted) { ! 50: interrupted = 0; ! 51: (void) signal (SIGINT, istat); ! 52: return NULL; ! 53: } ! 54: #else BSD42 ! 55: if (i == EOF) ! 56: longjmp (sigenv, DONE); ! 57: #endif BSD42 ! 58: if (cp < &ansbuf[sizeof ansbuf - 1]) ! 59: *cp++ = i; ! 60: } ! 61: *cp = 0; ! 62: if (ansbuf[0] == '?' || cp == ansbuf) { ! 63: printf ("Options are:\n"); ! 64: printsw (ALL, ansp, ""); ! 65: continue; ! 66: } ! 67: cpp = brkstring (ansbuf, " ", NULLCP); ! 68: switch (smatch (*cpp, ansp)) { ! 69: case AMBIGSW: ! 70: ambigsw (*cpp, ansp); ! 71: continue; ! 72: case UNKWNSW: ! 73: printf (" -%s unknown. Hit <CR> for help.\n", *cpp); ! 74: continue; ! 75: default: ! 76: (void) signal (SIGINT, istat); ! 77: return cpp; ! 78: } ! 79: } ! 80: } ! 81: ! 82: ! 83: static SIGDECL ! 84: intrser() ! 85: { ! 86: #ifndef BSD42 ! 87: (void) signal(SIGINT, intrser); ! 88: interrupted = 1; ! 89: #else BSD42 ! 90: longjmp (sigenv, NOTOK); ! 91: #endif BSD42 ! 92: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.