source: trunk/third/nmh/sbr/getans.c @ 12455

Revision 12455, 1.3 KB checked in by danw, 26 years ago (diff)
This commit was generated by cvs2svn to compensate for changes in r12454, which included commits to RCS files with non-trunk default branches.
RevLine 
[12454]1
2/*
3 * getans.c -- get an answer from the user and return a string array
4 *
5 * $Id: getans.c,v 1.1.1.1 1999-02-07 18:14:08 danw Exp $
6 */
7
8#include <h/mh.h>
9#include <h/signals.h>
10#include <setjmp.h>
11#include <signal.h>
12
13static char ansbuf[BUFSIZ];
14static jmp_buf sigenv;
15
16/*
17 * static prototypes
18 */
19static RETSIGTYPE intrser (int);
20
21
22char **
23getans (char *prompt, struct swit *ansp)
24{
25    int i;
26    SIGNAL_HANDLER istat;
27    char *cp, **cpp;
28
29    if (!(setjmp (sigenv))) {
30        istat = SIGNAL (SIGINT, intrser);
31    } else {
32        SIGNAL (SIGINT, istat);
33        return NULL;
34    }
35
36    for (;;) {
37        printf ("%s", prompt);
38        fflush (stdout);
39        cp = ansbuf;
40        while ((i = getchar ()) != '\n') {
41            if (i == EOF)
42                longjmp (sigenv, 1);
43            if (cp < &ansbuf[sizeof ansbuf - 1])
44                *cp++ = i;
45        }
46        *cp = '\0';
47        if (ansbuf[0] == '?' || cp == ansbuf) {
48            printf ("Options are:\n");
49            print_sw (ALL, ansp, "");
50            continue;
51        }
52        cpp = brkstring (ansbuf, " ", NULL);
53        switch (smatch (*cpp, ansp)) {
54            case AMBIGSW:
55                ambigsw (*cpp, ansp);
56                continue;
57            case UNKWNSW:
58                printf (" -%s unknown. Hit <CR> for help.\n", *cpp);
59                continue;
60            default:
61                SIGNAL (SIGINT, istat);
62                return cpp;
63        }
64    }
65}
66
67
68static RETSIGTYPE
69intrser (int i)
70{
71    /*
72     * should this be siglongjmp?
73     */
74    longjmp (sigenv, 1);
75}
Note: See TracBrowser for help on using the repository browser.