X-Git-Url: https://diplodocus.org/git/nmh/blobdiff_plain/ed759f583c7c5b2487ee5317d3ad4bc791a1d249..c4c53777458bfcfd288d45b7708e52eb47c56405:/uip/msh.c diff --git a/uip/msh.c b/uip/msh.c index 9e56ddd4..6069cac4 100644 --- a/uip/msh.c +++ b/uip/msh.c @@ -32,39 +32,30 @@ #define QUOTE '\\' /* sigh */ -static struct swit switches[] = { -#define IDSW 0 - { "idstart number", -7 }, /* interface from bbc */ -#define FDSW 1 - { "idstop number", -6 }, /* .. */ -#define QDSW 2 - { "idquit number", -6 }, /* .. */ -#define NMSW 3 - { "idname BBoard", -6 }, /* .. */ -#define PRMPTSW 4 - { "prompt string", 0 }, -#define SCANSW 5 - { "scan", 0 }, -#define NSCANSW 6 - { "noscan", 0 }, -#define READSW 7 - { "vmhread fd", -7 }, -#define WRITESW 8 - { "vmhwrite fd", -8 }, -#define PREADSW 9 - { "popread fd", -7 }, -#define PWRITSW 10 - { "popwrite fd", -8 }, -#define TCURSW 11 - { "topcur", 0 }, -#define NTCURSW 12 - { "notopcur", 0 }, -#define VERSIONSW 13 - { "version", 0 }, -#define HELPSW 14 - { "help", 0 }, - { NULL, 0 } -}; +#define MSH_SWITCHES \ + X("idstart number", -7, IDSW) /* interface from bbc */ \ + X("idstop number", -6, FDSW) /* .. */ \ + X("idquit number", -6, QDSW) /* .. */ \ + X("idname BBoard", -6, NMSW) /* .. */ \ + X("prompt string", 0, PRMPTSW) \ + X("scan", 0, SCANSW) \ + X("noscan", 0, NSCANSW) \ + X("vmhread fd", -7, READSW) \ + X("vmhwrite fd", -8, WRITESW) \ + X("popread fd", -7, PREADSW) \ + X("popwrite fd", -8, PWRITSW) \ + X("topcur", 0, TCURSW) \ + X("notopcur", 0, NTCURSW) \ + X("version", 0, VERSIONSW) \ + X("help", 0, HELPSW) \ + +#define X(sw, minchars, id) id, +DEFINE_SWITCH_ENUM(MSH); +#undef X + +#define X(sw, minchars, id) { sw, minchars, id }, +DEFINE_SWITCH_ARRAY(MSH, switches); +#undef X static int mbx_style = MMDF_FORMAT; @@ -150,19 +141,11 @@ int interrupted; /* SIGINT detected */ int broken_pipe; /* SIGPIPE detected */ int told_to_quit; /* SIGQUIT detected */ -#ifdef BSD42 -int should_intr; /* signal handler should interrupt call */ -jmp_buf sigenv; /* the environment pointer */ -#endif - /* * prototypes */ -int SOprintf (char *, ...); /* from termsbr.c */ -int sc_width (void); /* from termsbr.c */ void fsetup (char *); void setup (char *); -FILE *msh_ready (int, int); void readids (int); int readid (int); void display_info (int); @@ -181,7 +164,6 @@ static int read_map (char *, long); static int read_file (long, int); static void m_gMsgs (int); -FILE *msh_ready (int, int); static int check_folder (int); static void scanrange (int, int); static void scanstring (char *); @@ -195,10 +177,10 @@ static int initaux_io (struct Cmd *); static void fin_io (struct Cmd *, int); static void finaux_io (struct Cmd *); static void m_init (void); -static RETSIGTYPE intrser (int); -static RETSIGTYPE pipeser (int); -static RETSIGTYPE quitser (int); -static RETSIGTYPE alrmser (int); +static void intrser (int); +static void pipeser (int); +static void quitser (int); +static void alrmser (int); static int pINI (void); static int pQRY (char *, int); static int pQRY1 (int); @@ -244,10 +226,10 @@ main (int argc, char **argv) case HELPSW: snprintf (buf, sizeof(buf), "%s [switches] file", invo_name); print_help (buf, switches, 1); - done (1); + done (0); case VERSIONSW: print_version(invo_name); - done (1); + done (0); case IDSW: if (!(cp = *argp++) || *cp == '-') @@ -336,9 +318,6 @@ main (int argc, char **argv) ioctl (pfd, FIOCLEX, NULL); #endif /* FIOCLEX */ -#ifdef BSD42 - should_intr = 0; -#endif /* BSD42 */ istat = SIGNAL2 (SIGINT, intrser); qstat = SIGNAL2 (SIGQUIT, quitser); @@ -370,65 +349,43 @@ main (int argc, char **argv) } -static struct swit mshcmds[] = { -#define ADVCMD 0 - { "advance", -7 }, -#define ALICMD 1 - { "ali", 0 }, -#define EXPLCMD 2 - { "burst", 0 }, -#define COMPCMD 3 - { "comp", 0 }, -#define DISTCMD 4 - { "dist", 0 }, -#define EXITCMD 5 - { "exit", 0 }, -#define FOLDCMD 6 - { "folder", 0 }, -#define FORWCMD 7 - { "forw", 0 }, -#define HELPCMD 8 - { "help", 0 }, -#define INCMD 9 - { "inc", 0 }, -#define MARKCMD 10 - { "mark", 0 }, -#define MAILCMD 11 - { "mhmail", 0 }, -#define MHNCMD 12 - { "mhn", 0 }, -#define MSGKCMD 13 - { "msgchk", 0 }, -#define NEXTCMD 14 - { "next", 0 }, -#define PACKCMD 15 - { "packf", 0 }, -#define PICKCMD 16 - { "pick", 0 }, -#define PREVCMD 17 - { "prev", 0 }, -#define QUITCMD 18 - { "quit", 0 }, -#define FILECMD 19 - { "refile", 0 }, -#define REPLCMD 20 - { "repl", 0 }, -#define RMMCMD 21 - { "rmm", 0 }, -#define SCANCMD 22 - { "scan", 0 }, -#define SENDCMD 23 - { "send", 0 }, -#define SHOWCMD 24 - { "show", 0 }, -#define SORTCMD 25 - { "sortm", 0 }, -#define WHATCMD 26 - { "whatnow", 0 }, -#define WHOMCMD 27 - { "whom", 0 }, - { NULL, 0 } -}; +#define MSHCMDS_SWITCHES \ + X("advance", -7, ADVCMD) \ + X("ali", 0, ALICMD) \ + X("burst", 0, EXPLCMD) \ + X("comp", 0, COMPCMD) \ + X("dist", 0, DISTCMD) \ + X("exit", 0, EXITCMD) \ + X("folder", 0, FOLDCMD) \ + X("forw", 0, FORWCMD) \ + X("help", 0, HELPCMD) \ + X("inc", 0, INCMD) \ + X("mark", 0, MARKCMD) \ + X("mhmail", 0, MAILCMD) \ + X("mhn", 0, MHNCMD) \ + X("msgchk", 0, MSGKCMD) \ + X("next", 0, NEXTCMD) \ + X("packf", 0, PACKCMD) \ + X("pick", 0, PICKCMD) \ + X("prev", 0, PREVCMD) \ + X("quit", 0, QUITCMD) \ + X("refile", 0, FILECMD) \ + X("repl", 0, REPLCMD) \ + X("rmm", 0, RMMCMD) \ + X("scan", 0, SCANCMD) \ + X("send", 0, SENDCMD) \ + X("show", 0, SHOWCMD) \ + X("sortm", 0, SORTCMD) \ + X("whatnow", 0, WHATCMD) \ + X("whom", 0, WHOMCMD) \ + +#define X(sw, minchars, id) id, +DEFINE_SWITCH_ENUM(MSHCMDS); +#undef X + +#define X(sw, minchars, id) { sw, minchars, id }, +DEFINE_SWITCH_ARRAY(MSHCMDS, mshcmds); +#undef X static void @@ -816,6 +773,7 @@ msh_ready (int msgnum, int full) register int msgp; int fd; char *cp; + NMH_UNUSED (full); if (yp) { fclose (yp); @@ -1054,11 +1012,9 @@ display_info (int scansw) if (sp == NULL) { if ((sd = dup (fileno (stdout))) == NOTOK) padios ("standard output", "unable to dup"); -#ifndef BSD42 /* XXX */ #ifdef FIOCLEX ioctl (sd, FIOCLEX, NULL); #endif /* FIOCLEX */ -#endif /* not BSD42 */ if ((sp = fdopen (sd, "w")) == NULL) padios ("standard output", "unable to fdopen"); } @@ -1216,33 +1172,11 @@ getargs (char *prompt, struct swit *sw, struct Cmd *cmdp) told_to_quit = 0; for (;;) { interrupted = 0; -#ifdef BSD42 - switch (setjmp (sigenv)) { - case OK: - should_intr = 1; - break; - - default: - should_intr = 0; - if (interrupted && !told_to_quit) { - putchar ('\n'); - continue; - } - if (ppid > 0) -#ifdef SIGEMT - kill (ppid, SIGEMT); -#else - kill (ppid, SIGTERM); -#endif - return EOF; - } -#endif /* BSD42 */ if (interactive) { printf ("%s", prompt); fflush (stdout); } for (cp = buffer; (i = getchar ()) != '\n';) { -#ifndef BSD42 if (interrupted && !told_to_quit) { buffer[0] = '\0'; putchar ('\n'); @@ -1257,10 +1191,6 @@ getargs (char *prompt, struct swit *sw, struct Cmd *cmdp) #endif return EOF; } -#else /* BSD42 */ - if (i == EOF) - longjmp (sigenv, DONE); -#endif /* BSD42 */ if (cp < &buffer[sizeof buffer - 2]) *cp++ = i; } @@ -1288,9 +1218,6 @@ getargs (char *prompt, struct swit *sw, struct Cmd *cmdp) cmdp->args[0]); continue; default: -#ifdef BSD42 - should_intr = 0; -#endif /* BSD42 */ return i; } } @@ -1618,62 +1545,39 @@ seq_setcur (struct msgs *mp, int msgnum) -static RETSIGTYPE +static void intrser (int i) { -#ifndef RELIABLE_SIGNALS - SIGNAL (SIGINT, intrser); -#endif - + NMH_UNUSED (i); discard (stdout); interrupted++; - -#ifdef BSD42 - if (should_intr) - longjmp (sigenv, NOTOK); -#endif } -static RETSIGTYPE +static void pipeser (int i) { -#ifndef RELIABLE_SIGNALS - SIGNAL (SIGPIPE, pipeser); -#endif - + NMH_UNUSED (i); if (broken_pipe++ == 0) fprintf (stderr, "broken pipe\n"); told_to_quit++; interrupted++; - -#ifdef BSD42 - if (should_intr) - longjmp (sigenv, NOTOK); -#endif } -static RETSIGTYPE +static void quitser (int i) { -#ifndef RELIABLE_SIGNALS - SIGNAL (SIGQUIT, quitser); -#endif - + NMH_UNUSED (i); told_to_quit++; interrupted++; - -#ifdef BSD42 - if (should_intr) - longjmp (sigenv, NOTOK); -#endif } -static RETSIGTYPE +static void alrmser (int i) { + NMH_UNUSED (i); longjmp (peerenv, DONE); } @@ -1738,6 +1642,7 @@ pINI (void) static int pQRY (char *str, int scansw) { + NMH_UNUSED (str); if (pQRY1 (scansw) == NOTOK || pQRY2 () == NOTOK) return NOTOK;