Fixed pick(1) to properly unfold multiple-line header fields
[mmh] / uip / picksbr.c
index 001bf08..4895b23 100644 (file)
@@ -2,8 +2,6 @@
 /*
  * picksbr.c -- routines to help pick along...
  *
- * $Id$
- *
  * This code is Copyright (c) 2002, by the authors of nmh.  See the
  * COPYRIGHT file in the root directory of the nmh distribution for
  * complete copyright information.
 #include <h/picksbr.h>
 #include <h/utils.h>
 
-#ifdef TIME_WITH_SYS_TIME
+#ifdef HAVE_SYS_TIME_H
 # include <sys/time.h>
-# include <time.h>
-#else
-# ifdef TM_IN_SYS_TIME
-#  include <sys/time.h>
-# else
-#  include <time.h>
-# endif
 #endif
+#include <time.h>
 
 static struct swit parswit[] = {
 #define        PRAND                   0
@@ -88,7 +80,7 @@ static struct swit parswit[] = {
 static char linebuf[LBSIZE + 1];
 
 /* the magic array for case-independence */
-static char cc[] = {
+static unsigned char cc[] = {
        0000,0001,0002,0003,0004,0005,0006,0007,
        0010,0011,0012,0013,0014,0015,0016,0017,
        0020,0021,0022,0023,0024,0025,0026,0027,
@@ -183,23 +175,23 @@ static struct nexus *head;
 /*
  * prototypes for date routines
  */
-static struct tws *tws_parse();
-static struct tws *tws_special();
+static struct tws *tws_parse(char *, int);
+static struct tws *tws_special(char *);
 
 /*
  * static prototypes
  */
-static void PRaction();
-static int gcompile();
-static int advance();
-static int cclass();
-static int tcompile();
-
-static struct nexus *parse();
-static struct nexus *exp1();
-static struct nexus *exp2();
-static struct nexus *exp3();
-static struct nexus *newnexus();
+static void PRaction(struct nexus *, int);
+static int gcompile(struct nexus *, char *);
+static int advance(char *, char *);
+static int cclass(unsigned char *, int, int);
+static int tcompile(char *, struct tws *, int);
+
+static struct nexus *parse(void);
+static struct nexus *nexp1(void);
+static struct nexus *nexp2(void);
+static struct nexus *nexp3(void);
+static struct nexus *newnexus(int (*)());
 
 static int ORaction();
 static int ANDaction();
@@ -239,7 +231,7 @@ parse (void)
     register char  *cp;
     register struct nexus *n, *o;
 
-    if ((n = exp1 ()) == NULL || (cp = nxtarg ()) == NULL)
+    if ((n = nexp1 ()) == NULL || (cp = nxtarg ()) == NULL)
        return n;
 
     if (*cp != '-') {
@@ -275,12 +267,12 @@ header: ;
 }
 
 static struct nexus *
-exp1 (void)
+nexp1 (void)
 {
     register char *cp;
     register struct nexus *n, *o;
 
-    if ((n = exp2 ()) == NULL || (cp = nxtarg ()) == NULL)
+    if ((n = nexp2 ()) == NULL || (cp = nxtarg ()) == NULL)
        return n;
 
     if (*cp != '-') {
@@ -303,7 +295,7 @@ exp1 (void)
        case PRAND: 
            o = newnexus (ANDaction);
            o->n_L_child = n;
-           if ((o->n_R_child = exp1 ()))
+           if ((o->n_R_child = nexp1 ()))
                return o;
            padvise (NULL, "missing conjunctive");
            return NULL;
@@ -317,7 +309,7 @@ header: ;
 
 
 static struct nexus *
-exp2 (void)
+nexp2 (void)
 {
     register char *cp;
     register struct nexus *n;
@@ -327,7 +319,7 @@ exp2 (void)
 
     if (*cp != '-') {
        prvarg ();
-       return exp3 ();
+       return nexp3 ();
     }
 
     if (*++cp == '-')
@@ -344,7 +336,7 @@ exp2 (void)
 
        case PRNOT: 
            n = newnexus (NOTaction);
-           if ((n->n_L_child = exp3 ()))
+           if ((n->n_L_child = nexp3 ()))
                return n;
            padvise (NULL, "missing negation");
            return NULL;
@@ -352,12 +344,12 @@ exp2 (void)
 header: ;
        default: 
            prvarg ();
-           return exp3 ();
+           return nexp3 ();
     }
 }
 
 static struct nexus *
-exp3 (void)
+nexp3 (void)
 {
     int i;
     register char *cp, *dp;
@@ -448,7 +440,7 @@ exp3 (void)
                padvise (NULL, "missing argument to %s", argp[-2]);
                return NULL;
            }
-           return exp3 ();
+           return nexp3 ();
 
        case PRAFTR: 
        case PRBEFR: 
@@ -538,7 +530,8 @@ PRaction (struct nexus *n, int level)
                dasctime (&n->n_tws, TW_NULL));
        return;
     }
-    fprintf (stderr, "UNKNOWN(0x%x)\n", (unsigned int) (*n->n_action));
+    fprintf (stderr, "UNKNOWN(0x%x)\n",
+            (unsigned int)(unsigned long) (*n->n_action));
 }
 
 
@@ -575,7 +568,7 @@ gcompile (struct nexus *n, char *astr)
 {
     register int c;
     int cclcnt;
-    register char *ep, *dp, *sp, *lastep = 0;
+    register unsigned char *ep, *dp, *sp, *lastep = 0;
 
     dp = (ep = n->n_expbuf) + sizeof n->n_expbuf;
     sp = astr;
@@ -614,7 +607,7 @@ gcompile (struct nexus *n, char *astr)
            case '[': 
                *ep++ = CCL;
                *ep++ = 0;
-               cclcnt = 1;
+               cclcnt = 0;
                if ((c = *sp++) == '^') {
                    c = *sp++;
                    ep[-2] = NCCL;
@@ -639,6 +632,8 @@ gcompile (struct nexus *n, char *astr)
                            goto cerror;
                    }
                } while ((c = *sp++) != ']');
+               if (cclcnt > 255)
+                   goto cerror;
                lastep[1] = cclcnt;
                continue;
 
@@ -665,6 +660,7 @@ plist
     long pos = start;
     register char *p1, *p2, *ebp, *cbp;
     char ibuf[BUFSIZ];
+    NMH_UNUSED (msgnum);
 
     fseek (fp, start, SEEK_SET);
     body = 0;
@@ -705,7 +701,8 @@ plist
                        break;
                    }
                    lf++;
-                   c = ' ';
+                   /* Unfold by skipping the newline. */
+                   c = 0;
                }
            }
            if (c && p1 < &linebuf[LBSIZE - 1])
@@ -744,14 +741,14 @@ plist
 static int
 advance (char *alp, char *aep)
 {
-    register char *lp, *ep, *curlp;
+    register unsigned char *lp, *ep, *curlp;
 
-    lp = alp;
-    ep = aep;
+    lp = (unsigned char *)alp;
+    ep = (unsigned char *)aep;
     for (;;)
        switch (*ep++) {
            case CCHR: 
-               if (*ep++ == *lp++ || ep[-1] == cc[(unsigned char)lp[-1]])
+               if (*ep++ == *lp++ || ep[-1] == cc[lp[-1]])
                    continue;
                return 0;
 
@@ -770,14 +767,14 @@ advance (char *alp, char *aep)
 
            case CCL: 
                if (cclass (ep, *lp++, 1)) {
-                   ep += *ep;
+                   ep += *ep + 1;
                    continue;
                }
                return 0;
 
            case NCCL: 
                if (cclass (ep, *lp++, 0)) {
-                   ep += *ep;
+                   ep += *ep + 1;
                    continue;
                }
                return 0;
@@ -790,7 +787,7 @@ advance (char *alp, char *aep)
 
            case CCHR | STAR: 
                curlp = lp;
-               while (*lp++ == *ep || cc[(unsigned char)lp[-1]] == *ep)
+               while (*lp++ == *ep || cc[lp[-1]] == *ep)
                    continue;
                ep++;
                goto star;
@@ -800,7 +797,7 @@ advance (char *alp, char *aep)
                curlp = lp;
                while (cclass (ep, *lp++, ep[-1] == (CCL | STAR)))
                    continue;
-               ep += *ep;
+               ep += *ep + 1;
                goto star;
 
        star: 
@@ -819,19 +816,18 @@ advance (char *alp, char *aep)
 
 
 static int
-cclass (char *aset, int ac, int af)
+cclass (unsigned char *aset, int ac, int af)
 {
-    register int    n;
-    register char   c,
-                   *set;
+    register unsigned int    n;
+    register unsigned char   c, *set;
 
     set = aset;
     if ((c = ac) == 0)
        return (0);
 
     n = *set++;
-    while (--n)
-       if (*set++ == c || set[-1] == cc[(unsigned char)c])
+    while (n--)
+       if (*set++ == c || set[-1] == cc[c])
            return (af);
 
     return (!af);
@@ -939,6 +935,7 @@ plist
     register char *bp;
     char buf[BUFSIZ], name[NAMESZ];
     register struct tws *tw;
+    NMH_UNUSED (stop);
 
     fseek (fp, start, SEEK_SET);
     for (state = FLD, bp = NULL;;) {