]> diplodocus.org Git - nmh/blobdiff - uip/mhlsbr.c
eliminate use of fgets() in mhparse.c
[nmh] / uip / mhlsbr.c
index f87c47d35c0f19ab1ea04647ad258e7732fd8203..e9d4de8eb8f0cc7854733235663c9d700afecd05 100644 (file)
@@ -14,9 +14,6 @@
 #include <h/tws.h>
 #include <h/utils.h>
 #include <setjmp.h>
-#include <signal.h>
-#include <errno.h>
-#include <sys/wait.h>
 #include <sys/types.h>
 
 /*
@@ -288,7 +285,7 @@ static unsigned int wid;
 
 static char *ovtxt;
 
-static unsigned char *onelp;
+static char *onelp;
 
 static char *parptr;
 
@@ -335,7 +332,6 @@ static void pipeser (int);
 static void quitser (int);
 static void mhladios (char *, char *, ...);
 static void mhldone (int);
-static void m_popen (char *);
 static void filterbody (struct mcomp *, char *, int, int, FILE *,
                         m_getfld_state_t);
 static void compile_formatfield(struct mcomp *);
@@ -352,11 +348,9 @@ mhl (int argc, char **argv)
     char buf[BUFSIZ], *files[MAXARGS];
     char **argp, **arguments;
 
+    /* Need this if called from main() of show(1). */
     invo_name = r1bindex (argv[0], '/');
 
-    /* read user profile/context */
-    context_read();
-
     arguments = getarguments (invo_name, argc, argv, 1);
     argp = arguments;
 
@@ -481,13 +475,13 @@ mhl (int argc, char **argv)
        folder = getenv ("mhfolder");
 
     if (isatty (fileno (stdout))) {
-       if (!nomore && !sc_hardcopy() && moreproc && *moreproc != '\0') {
+       if (!nomore && moreproc && *moreproc != '\0') {
            if (mhl_action) {
                SIGNAL (SIGINT, SIG_IGN);
                SIGNAL2 (SIGQUIT, quitser);
            }
            SIGNAL2 (SIGPIPE, pipeser);
-           m_popen (moreproc);
+           m_popen (moreproc, mhl_action != NULL);
            ontty = PITTY;
        } else {
            SIGNAL (SIGINT, SIG_IGN);
@@ -534,7 +528,7 @@ mhl (int argc, char **argv)
     }
     
     if (clearflg > 0 && ontty == NOTTY)
-       clear_screen ();
+       nmh_clear_screen ();
 
     if (ontty == PITTY)
        m_pclose ();
@@ -611,7 +605,7 @@ mhl_format (char *file, int length, int width)
                 * Split this list of fields to ignore, and copy
                 * it to the end of the current "ignores" list.
                 */
-               if (!mh_strcasecmp (name, "ignores")) {
+               if (!strcasecmp (name, "ignores")) {
                    char **tmparray, **p;
                    int n = 0;
 
@@ -720,17 +714,17 @@ evalvar (struct mcomp *c1)
        return 0;
     strncpy (name, parse(), sizeof(name));
 
-    if (!mh_strcasecmp (name, "component")) {
+    if (!strcasecmp (name, "component")) {
        if (ptos (name, &c1->c_text))
            return 1;
        c1->c_flags &= ~NOCOMPONENT;
        return 0;
     }
 
-    if (!mh_strcasecmp (name, "overflowtext"))
+    if (!strcasecmp (name, "overflowtext"))
        return ptos (name, &c1->c_ovtxt);
 
-    if (!mh_strcasecmp (name, "formatfield")) {
+    if (!strcasecmp (name, "formatfield")) {
        if (ptos (name, &cp))
            return 1;
        c1->c_nfs = getcpy (new_fs (NULL, NULL, cp));
@@ -739,40 +733,40 @@ evalvar (struct mcomp *c1)
        return 0;
     }
 
-    if (!mh_strcasecmp (name, "decode")) {
+    if (!strcasecmp (name, "decode")) {
        c1->c_nfs = getcpy (new_fs (NULL, NULL, "%(decode{text})"));
        compile_formatfield(c1);
        c1->c_flags |= FORMAT;
        return 0;
     }
 
-    if (!mh_strcasecmp (name, "offset"))
+    if (!strcasecmp (name, "offset"))
        return ptoi (name, &c1->c_offset);
-    if (!mh_strcasecmp (name, "overflowoffset"))
+    if (!strcasecmp (name, "overflowoffset"))
        return ptoi (name, &c1->c_ovoff);
-    if (!mh_strcasecmp (name, "width"))
+    if (!strcasecmp (name, "width"))
        return ptoi (name, &c1->c_width);
-    if (!mh_strcasecmp (name, "compwidth"))
+    if (!strcasecmp (name, "compwidth"))
        return ptoi (name, &c1->c_cwidth);
-    if (!mh_strcasecmp (name, "length"))
+    if (!strcasecmp (name, "length"))
        return ptoi (name, &c1->c_length);
-    if (!mh_strcasecmp (name, "nodashstuffing"))
+    if (!strcasecmp (name, "nodashstuffing"))
        return (dashstuff = -1);
 
     for (ap = triples; ap->t_name; ap++)
-       if (!mh_strcasecmp (ap->t_name, name)) {
+       if (!strcasecmp (ap->t_name, name)) {
            c1->c_flags |= ap->t_on;
            c1->c_flags &= ~ap->t_off;
            return 0;
        }
 
-   if (!mh_strcasecmp (name, "formatarg")) {
+   if (!strcasecmp (name, "formatarg")) {
        struct arglist *args;
 
        if (ptos (name, &cp))
            return 1;
 
-       if (mh_strcasecmp (c1->c_name, "body")) {
+       if (! c1->c_name  ||  strcasecmp (c1->c_name, "body")) {
            advise (NULL, "format filters are currently only supported on "
                    "the \"body\" component");
            return 1;
@@ -880,6 +874,8 @@ process (char *folder, char *fname, int ofilen, int ofilec)
     struct mcomp *c1;
     struct stat st;
     struct arglist *ap;
+    /* volatile to prevent "might be clobbered" warning from gcc: */
+    char *volatile fname2 = fname ? fname : "(stdin)";
 
     switch (setjmp (env)) {
        case OK: 
@@ -891,7 +887,6 @@ process (char *folder, char *fname, int ofilen, int ofilec)
                    return;
                }
            } else {
-               fname = "(stdin)";
                fp = stdin;
            }
            if (fstat(fileno(fp), &st) == 0) {
@@ -899,7 +894,7 @@ process (char *folder, char *fname, int ofilen, int ofilec)
            } else {
                filesize = 0;
            }
-           cp = folder ? concat (folder, ":", fname, NULL) : getcpy (fname);
+           cp = folder ? concat (folder, ":", fname2, NULL) : getcpy (fname2);
            if (ontty != PITTY)
                SIGNAL (SIGINT, intrser);
            mhlfile (fp, cp, ofilen, ofilec);  /* FALL THROUGH! */
@@ -958,7 +953,7 @@ mhlfile (FILE *fp, char *mname, int ofilen, int ofilec)
                if (ofilec > 1) {
                    if (ofilen > 1) {
                        if ((global.c_flags & CLEARSCR))
-                           clear_screen ();
+                           nmh_clear_screen ();
                        else
                            printf ("\n\n\n");
                    }
@@ -980,7 +975,7 @@ mhlfile (FILE *fp, char *mname, int ofilen, int ofilec)
                }
                if (strchr(buf, '\n')) {
                    if ((global.c_flags & CLEARSCR))
-                       clear_screen ();
+                       nmh_clear_screen ();
                }
                else
                    printf ("\n");
@@ -991,7 +986,7 @@ mhlfile (FILE *fp, char *mname, int ofilen, int ofilec)
                    if (ofilen > 1) {
                        printf ("\n\n\n");
                        if (clearflg > 0)
-                           clear_screen ();
+                           nmh_clear_screen ();
                    }
                    printf (">>> %s\n\n", mname);
                }
@@ -1006,7 +1001,7 @@ mhlfile (FILE *fp, char *mname, int ofilen, int ofilec)
            case FLDPLUS: 
                bucket = fmt_addcomptext(name, buf);
                for (ip = ignores; *ip; ip++)
-                   if (!mh_strcasecmp (name, *ip)) {
+                   if (!strcasecmp (name, *ip)) {
                        while (state == FLDPLUS) {
                            bufsz = sizeof buf;
                            state = m_getfld (&gstate, name, buf, &bufsz, fp);
@@ -1018,12 +1013,13 @@ mhlfile (FILE *fp, char *mname, int ofilen, int ofilec)
                    continue;
 
                for (c2 = fmthd; c2; c2 = c2->c_next)
-                   if (!mh_strcasecmp (c2->c_name, name))
+                   if (!strcasecmp (c2->c_name ? c2->c_name : "", name))
                        break;
                c1 = NULL;
                if (!((c3 = c2 ? c2 : &global)->c_flags & SPLIT))
                    for (c1 = msghd; c1; c1 = c1->c_next)
-                       if (!mh_strcasecmp (c1->c_name, c3->c_name)) {
+                       if (!strcasecmp (c1->c_name ? c1->c_name : "",
+                                        c3->c_name ? c3->c_name : "")) {
                            c1->c_text =
                                mcomp_add (c1->c_flags, buf, c1->c_text);
                            break;
@@ -1048,7 +1044,8 @@ mhlfile (FILE *fp, char *mname, int ofilen, int ofilec)
                        putcomp (c1, c1, ONECOMP);
                        continue;
                    }
-                   if (!mh_strcasecmp (c1->c_name, "messagename")) {
+                   if (!c1->c_name  ||
+                       !strcasecmp (c1->c_name, "messagename")) {
                        holder.c_text = concat ("(Message ", mname, ")\n",
                                            NULL);
                        putcomp (c1, &holder, ONECOMP);
@@ -1056,13 +1053,14 @@ mhlfile (FILE *fp, char *mname, int ofilen, int ofilec)
                        holder.c_text = NULL;
                        continue;
                    }
-                   if (!mh_strcasecmp (c1->c_name, "extras")) {
+                   if (!c1->c_name  ||  !strcasecmp (c1->c_name, "extras")) {
                        for (c2 = msghd; c2; c2 = c2->c_next)
                            if (c2->c_flags & EXTRA)
                                putcomp (c1, c2, TWOCOMP);
                        continue;
                    }
-                   if (dobody && !mh_strcasecmp (c1->c_name, "body")) {
+                   if (dobody && (!c1->c_name  ||
+                                  !strcasecmp (c1->c_name, "body"))) {
                        if (c1->c_flags & FMTFILTER && state == BODY &&
                                                        formatproc != NULL) {
                            filterbody(c1, buf, sizeof(buf), state, fp, gstate);
@@ -1081,25 +1079,27 @@ mhlfile (FILE *fp, char *mname, int ofilen, int ofilec)
                        continue;
                    }
                    for (c2 = msghd; c2; c2 = c2->c_next)
-                       if (!mh_strcasecmp (c2->c_name, c1->c_name)) {
+                       if (!strcasecmp (c2->c_name ? c2->c_name : "",
+                                        c1->c_name ? c1->c_name : "")) {
                            putcomp (c1, c2, ONECOMP);
                            if (!(c1->c_flags & SPLIT))
                                break;
                        }
                }
+               m_getfld_state_destroy (&gstate);
                return;
 
            case LENERR: 
            case FMTERR: 
                advise (NULL, "format error in message %s", mname);
                exitstat++;
+               m_getfld_state_destroy (&gstate);
                return;
 
            default: 
                adios (NULL, "getfld() returned %d", state);
        }
     }
-    m_getfld_state_destroy (&gstate);
 }
 
 
@@ -1109,7 +1109,7 @@ mcomp_flags (char *name)
     struct pair *ap;
 
     for (ap = pairs; ap->p_name; ap++)
-       if (!mh_strcasecmp (ap->p_name, name))
+       if (!strcasecmp (ap->p_name, name))
            return (ap->p_flags);
 
     return 0;
@@ -1163,7 +1163,8 @@ mcomp_format (struct mcomp *c1, struct mcomp *c2)
            if (!cp[1])
                *cp = 0;
 
-       fmt_scan (c1->c_fmt, buffer, sizeof buffer - 1, sizeof buffer - 1, dat);
+       fmt_scan (c1->c_fmt, buffer, sizeof buffer - 1, sizeof buffer - 1,
+                 dat, NULL);
        /* Don't need to append a newline, dctime() already did */
        c2->c_text = getcpy (buffer);
 
@@ -1176,7 +1177,7 @@ mcomp_format (struct mcomp *c1, struct mcomp *c2)
        if ((p = (struct pqpair *) calloc ((size_t) 1, sizeof(*p))) == NULL)
            adios (NULL, "unable to allocate pqpair memory");
 
-       if ((mp = getm (cp, NULL, 0, AD_NAME, error)) == NULL) {
+       if ((mp = getm (cp, NULL, 0, error, sizeof(error))) == NULL) {
            p->pq_text = getcpy (cp);
            p->pq_error = getcpy (error);
        } else {
@@ -1196,7 +1197,8 @@ mcomp_format (struct mcomp *c1, struct mcomp *c2)
            p->pq_error = NULL;
        }
 
-       fmt_scan (c1->c_fmt, buffer, sizeof buffer - 1, sizeof buffer - 1, dat);
+       fmt_scan (c1->c_fmt, buffer, sizeof buffer - 1, sizeof buffer - 1,
+                 dat, NULL);
        if (*buffer) {
            if (c2->c_text)
                c2->c_text = add (",\n", c2->c_text);
@@ -1277,7 +1279,7 @@ static void
 putcomp (struct mcomp *c1, struct mcomp *c2, int flag)
 {
     int count, cchdr;
-    unsigned char *cp;
+    char *cp;
 
     cchdr = 0;
     lm = 0;
@@ -1315,8 +1317,8 @@ putcomp (struct mcomp *c1, struct mcomp *c2, int flag)
     if (!(c1->c_flags & HDROUTPUT) && !(c1->c_flags & NOCOMPONENT)) {
         if (c1->c_flags & UPPERCASE)           /* uppercase component also */
            for (cp = (c1->c_text ? c1->c_text : c1->c_name); *cp; cp++)
-               if (islower (*cp))
-                   *cp = toupper (*cp);
+               if (islower ((unsigned char) *cp))
+                   *cp = toupper ((unsigned char) *cp);
        putstr (c1->c_text ? c1->c_text : c1->c_name, c1->c_flags);
        if (flag != BODYCOMP) {
            putstr (": ", c1->c_flags);
@@ -1338,8 +1340,8 @@ putcomp (struct mcomp *c1, struct mcomp *c2, int flag)
            && !(c2->c_flags & NOCOMPONENT)) {
         if (c1->c_flags & UPPERCASE)
            for (cp = c2->c_name; *cp; cp++)
-               if (islower (*cp))
-                   *cp = toupper (*cp);
+               if (islower ((unsigned char) *cp))
+                   *cp = toupper ((unsigned char) *cp);
        putstr (c2->c_name, c1->c_flags);
        putstr (": ", c1->c_flags);
        if (!(c1->c_flags & SPLIT))
@@ -1352,8 +1354,8 @@ putcomp (struct mcomp *c1, struct mcomp *c2, int flag)
     }
     if (c1->c_flags & UPPERCASE)
        for (cp = c2->c_text; *cp; cp++)
-           if (islower (*cp))
-               *cp = toupper (*cp);
+           if (islower ((unsigned char) *cp))
+               *cp = toupper ((unsigned char) *cp);
 
     count = 0;
     if (cchdr) {
@@ -1400,7 +1402,7 @@ oneline (char *stuff, long flags)
     term = 0;
     if (flags & COMPRESS) {
        for (spc = 1, cp = ret; *onelp; onelp++)
-           if (isspace (*onelp)) {
+           if (isspace ((unsigned char) *onelp)) {
                if (*onelp == '\n' && (!onelp[1] || (flags & ADDRFMT))) {
                    term = '\n';
                    *onelp++ = 0;
@@ -1480,7 +1482,7 @@ putch (char ch, long flags)
            read (fileno (stdout), buf, sizeof(buf));
            if (strchr(buf, '\n')) {
                if (global.c_flags & CLEARSCR)
-                   clear_screen ();
+                   nmh_clear_screen ();
                row = 0;
            } else {
                putchar ('\n');
@@ -1641,74 +1643,6 @@ mhldone (int status)
 }
 
 
-static int m_pid = NOTOK;
-static  int sd = NOTOK;
-
-static void
-m_popen (char *name)
-{
-    int pd[2];
-    char *file;
-    char **arglist;
-
-    if (mhl_action && (sd = dup (fileno (stdout))) == NOTOK)
-       adios ("standard output", "unable to dup()");
-
-    if (pipe (pd) == NOTOK)
-       adios ("pipe", "unable to");
-
-    switch (m_pid = vfork()) {
-       case NOTOK: 
-           adios ("fork", "unable to");
-
-       case OK: 
-           SIGNAL (SIGINT, SIG_DFL);
-           SIGNAL (SIGQUIT, SIG_DFL);
-
-           close (pd[1]);
-           if (pd[0] != fileno (stdin)) {
-               dup2 (pd[0], fileno (stdin));
-               close (pd[0]);
-           }
-           arglist = argsplit(name, &file, NULL);
-           execvp (file, arglist);
-           fprintf (stderr, "unable to exec ");
-           perror (name);
-           _exit (-1);
-
-       default: 
-           close (pd[0]);
-           if (pd[1] != fileno (stdout)) {
-               dup2 (pd[1], fileno (stdout));
-               close (pd[1]);
-           }
-    }
-}
-
-
-void
-m_pclose (void)
-{
-    if (m_pid == NOTOK)
-       return;
-
-    if (sd != NOTOK) {
-       fflush (stdout);
-       if (dup2 (sd, fileno (stdout)) == NOTOK)
-           adios ("standard output", "unable to dup2()");
-
-       clearerr (stdout);
-       close (sd);
-       sd = NOTOK;
-    }
-    else
-       fclose (stdout);
-
-    pidwait (m_pid, OK);
-    m_pid = NOTOK;
-}
-
-
 /*
  * Compile a format string used by the formatfield option and save it
  * for later.
@@ -1847,7 +1781,6 @@ filterbody (struct mcomp *c1, char *buf, int bufsz, int state, FILE *fp,
         * buffers that we have duplicated from the parent.
         */
        _exit(0);
-       break;
     case -1:
        adios(NULL, "Unable to fork for filter writer process");
        break;
@@ -1859,18 +1792,17 @@ filterbody (struct mcomp *c1, char *buf, int bufsz, int state, FILE *fp,
      */
 
     switch (filterpid = fork()) {
-        char **args;
+        char **args, *program;
        struct arglist *a;
-       int i, dat[5], s;
+       int i, dat[5], s, argp;
 
     case 0:
        /*
-        * Allocate an argument array for us
+        * Configure an argument array for us
         */
 
-       args = (char **) mh_xmalloc((filter_nargs + 2) * sizeof(char *));
-       args[0] = formatproc;
-       args[filter_nargs + 1] = NULL;
+       args = argsplit(formatproc, &program, &argp);
+       args[argp + filter_nargs] = NULL;
        dat[0] = 0;
        dat[1] = 0;
        dat[2] = 0;
@@ -1881,9 +1813,9 @@ filterbody (struct mcomp *c1, char *buf, int bufsz, int state, FILE *fp,
         * Pull out each argument and scan them.
         */
 
-       for (a = arglist_head, i = 1; a != NULL; a = a->a_next, i++) {
+       for (a = arglist_head, i = argp; a != NULL; a = a->a_next, i++) {
            args[i] = mh_xmalloc(BUFSIZ);
-           fmt_scan(a->a_fmt, args[i], BUFSIZ - 1, BUFSIZ, dat);
+           fmt_scan(a->a_fmt, args[i], BUFSIZ - 1, BUFSIZ, dat, NULL);
            /*
             * fmt_scan likes to put a trailing newline at the end of the
             * format string.  If we have one, get rid of it.