Fix spelling and encoding errors in manpages and an error message
[mmh] / uip / prompter.c
index e1f0bff..2adbd48 100644 (file)
 #include <errno.h>
 #include <signal.h>
 #include <setjmp.h>
+#include <unistd.h>
+#include <ctype.h>
+#include <sys/stat.h>
+#include <locale.h>
+#include <sysexits.h>
 
 static struct swit switches[] = {
 #define PREPSW  0
@@ -34,8 +39,8 @@ static struct swit switches[] = {
 };
 
 
-static int wtuser = 0;
-static int sigint = 0;
+volatile sig_atomic_t wtuser = 0;
+volatile sig_atomic_t sigint = 0;
 static jmp_buf sigenv;
 
 /*
@@ -57,9 +62,7 @@ main(int argc, char **argv)
        FILE *in, *out;
        char *tfile = NULL;
 
-#ifdef LOCALE
        setlocale(LC_ALL, "");
-#endif
        invo_name = mhbasename(argv[0]);
 
        /* read user profile/context */
@@ -73,19 +76,20 @@ main(int argc, char **argv)
                        switch (smatch(++cp, switches)) {
                        case AMBIGSW:
                                ambigsw(cp, switches);
-                               done(1);
+                               exit(EX_USAGE);
                        case UNKWNSW:
-                               adios(NULL, "-%s unknown", cp);
+                               adios(EX_USAGE, NULL, "-%s unknown", cp);
 
                        case HELPSW:
                                snprintf(buffer, sizeof(buffer),
                                                "%s [switches] file",
                                                invo_name);
                                print_help(buffer, switches, 1);
-                               done(1);
+                               exit(argc == 2 ? EX_OK : EX_USAGE);
+
                        case VERSIONSW:
                                print_version(invo_name);
-                               done(1);
+                               exit(argc == 2 ? EX_OK : EX_USAGE);
 
                        case PREPSW:
                                prepend++;
@@ -113,14 +117,17 @@ main(int argc, char **argv)
                }
        }
 
-       if (!drft)
-               adios(NULL, "usage: %s [switches] file", invo_name);
-       if ((in = fopen(drft, "r")) == NULL)
-               adios(drft, "unable to open");
+       if (!drft) {
+               adios(EX_USAGE, NULL, "usage: %s [switches] file", invo_name);
+       }
+       if ((in = fopen(drft, "r")) == NULL) {
+               adios(EX_IOERR, drft, "unable to open");
+       }
 
        tfile = m_mktemp2(NULL, invo_name, NULL, &out);
-       if (tfile == NULL)
-               adios("prompter", "unable to create temporary file");
+       if (tfile == NULL) {
+               adios(EX_CANTCREAT, "prompter", "unable to create temporary file");
+       }
        chmod(tmpfil, 0600);
        strncpy(tmpfil, tfile, sizeof(tmpfil));
 
@@ -134,7 +141,6 @@ main(int argc, char **argv)
                switch (state = m_getfld(state, name, field, sizeof(field),
                                in)) {
                case FLD:
-               case FLDEOF:
                case FLDPLUS:
                        /*
                        ** Check if the value of field contains
@@ -162,7 +168,7 @@ main(int argc, char **argv)
                                if (i == -1) {
 abort:
                                        unlink(tmpfil);
-                                       done(1);
+                                       exit(EX_DATAERR);
                                }
                                if (i || (field[0]!='\n' && field[0]!='\0')) {
                                        fprintf(out, "%s:", name);
@@ -176,18 +182,9 @@ abort:
                                }
                        }
 
-                       if (state == FLDEOF) {  /* moby hack */
-                               /* draft has no body separator; only headers */
-                               fprintf(out, "--------\n");
-                               if (!qbody)
-                                       break;
-                               printf("--------\n");
-                               goto has_no_body;
-                       }
                        continue;
 
                case BODY:
-               case BODYEOF:
                case FILEEOF:
                        fprintf(out, "--------\n");
                        if (qbody) {
@@ -233,7 +230,7 @@ has_no_body:
                        break;
 
                default:
-                       adios(NULL, "skeleton is poorly formatted");
+                       adios(EX_DATAERR, NULL, "skeleton is poorly formatted");
                }
                break;
        }
@@ -246,18 +243,19 @@ has_no_body:
        fclose(out);
        SIGNAL(SIGINT, SIG_IGN);
 
-       if ((fdi = open(tmpfil, O_RDONLY)) == NOTOK)
-               adios(tmpfil, "unable to re-open");
-       if ((fdo = creat(drft, m_gmprot())) == NOTOK)
-               adios(drft, "unable to write");
+       if ((fdi = open(tmpfil, O_RDONLY)) == NOTOK) {
+               adios(EX_IOERR, tmpfil, "unable to re-open");
+       }
+       if ((fdo = creat(drft, m_gmprot())) == NOTOK) {
+               adios(EX_IOERR, drft, "unable to write");
+       }
        cpydata(fdi, fdo, tmpfil, drft);
        close(fdi);
        close(fdo);
        unlink(tmpfil);
 
        context_save();  /* save the context file */
-       done(0);
-       return 1;
+       return EX_OK;
 }
 
 
@@ -265,23 +263,25 @@ int
 getln(char *buffer, int n)
 {
        int c;
+       sig_atomic_t psigint = sigint;
        char *cp;
 
        cp = buffer;
        *cp = '\0';
 
        switch (setjmp(sigenv)) {
-       case OK:
+       case 0:
                wtuser = 1;
                break;
 
-       case DONE:
-               wtuser = 0;
-               return 0;
-
        default:
                wtuser = 0;
-               return NOTOK;
+               if (sigint == psigint) {
+                       return 0;
+               } else {
+                       sigint = psigint;
+                       return NOTOK;
+               }
        }
 
        for (;;) {
@@ -313,7 +313,8 @@ getln(char *buffer, int n)
 static void
 intrser(int i)
 {
-       if (wtuser)
-               longjmp(sigenv, NOTOK);
+       if (wtuser) {
+               close(STDIN_FILENO);
+       }
        sigint++;
 }