* uip/mhlistsbr.c, uip/mhlsbr.c, uip/picksbr.c: cast
[mmh] / uip / picksbr.c
index b13ea66..61d5afb 100644 (file)
@@ -3,11 +3,16 @@
  * 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/mh.h>
-#include <zotnet/tws/tws.h>
+#include <h/tws.h>
 #include <h/picksbr.h>
+#include <h/utils.h>
 
 #ifdef TIME_WITH_SYS_TIME
 # include <sys/time.h>
@@ -77,7 +82,7 @@ static struct swit parswit[] = {
 #define        STAR    01
 
 #define LBSIZE  1024
-#define        ESIZE   256
+#define        ESIZE   1024
 
 
 static char linebuf[LBSIZE + 1];
@@ -100,6 +105,23 @@ static char cc[] = {
        0150,0151,0152,0153,0154,0155,0156,0157,
        0160,0161,0162,0163,0164,0165,0166,0167,
        0170,0171,0172,0173,0174,0175,0176,0177,
+
+       0200,0201,0202,0203,0204,0205,0206,0207,
+       0210,0211,0212,0213,0214,0215,0216,0217,
+       0220,0221,0222,0223,0224,0225,0226,0227,
+       0230,0231,0232,0233,0234,0235,0236,0237,
+       0240,0241,0242,0243,0244,0245,0246,0247,
+       0250,0251,0252,0253,0254,0255,0256,0257,
+       0260,0261,0262,0263,0264,0265,0266,0267,
+       0270,0271,0272,0273,0274,0275,0276,0277,
+       0300,0301,0302,0303,0304,0305,0306,0307,
+       0310,0311,0312,0313,0314,0315,0316,0317,
+       0320,0321,0322,0323,0324,0325,0326,0327,
+       0330,0331,0332,0333,0334,0335,0336,0337,
+       0340,0341,0342,0343,0344,0345,0346,0347,
+       0350,0351,0352,0353,0354,0355,0356,0357,
+       0360,0361,0362,0363,0364,0365,0366,0367,
+       0370,0371,0372,0373,0374,0375,0376,0377,
 };
 
 /*
@@ -174,9 +196,9 @@ 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 *nexp1();
+static struct nexus *nexp2();
+static struct nexus *nexp3();
 static struct nexus *newnexus();
 
 static int ORaction();
@@ -217,7 +239,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 != '-') {
@@ -253,12 +275,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 != '-') {
@@ -281,7 +303,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;
@@ -295,7 +317,7 @@ header: ;
 
 
 static struct nexus *
-exp2 (void)
+nexp2 (void)
 {
     register char *cp;
     register struct nexus *n;
@@ -305,7 +327,7 @@ exp2 (void)
 
     if (*cp != '-') {
        prvarg ();
-       return exp3 ();
+       return nexp3 ();
     }
 
     if (*++cp == '-')
@@ -322,7 +344,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;
@@ -330,12 +352,12 @@ exp2 (void)
 header: ;
        default: 
            prvarg ();
-           return exp3 ();
+           return nexp3 ();
     }
 }
 
 static struct nexus *
-exp3 (void)
+nexp3 (void)
 {
     int i;
     register char *cp, *dp;
@@ -426,7 +448,7 @@ exp3 (void)
                padvise (NULL, "missing argument to %s", argp[-2]);
                return NULL;
            }
-           return exp3 ();
+           return nexp3 ();
 
        case PRAFTR: 
        case PRBEFR: 
@@ -516,7 +538,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));
 }
 
 
@@ -553,7 +576,7 @@ gcompile (struct nexus *n, char *astr)
 {
     register int c;
     int cclcnt;
-    register char *ep, *dp, *sp, *lastep;
+    register unsigned char *ep, *dp, *sp, *lastep = 0;
 
     dp = (ep = n->n_expbuf) + sizeof n->n_expbuf;
     sp = astr;
@@ -592,17 +615,33 @@ gcompile (struct nexus *n, char *astr)
            case '[': 
                *ep++ = CCL;
                *ep++ = 0;
-               cclcnt = 1;
+               cclcnt = 0;
                if ((c = *sp++) == '^') {
                    c = *sp++;
                    ep[-2] = NCCL;
                }
-               do {
+               if (c == '-') {
                    *ep++ = c;
                    cclcnt++;
-                   if (c == '\0' || ep >= dp)
-                       goto cerror;
+                   c = *sp++;
+               }
+               do {
+                   if (c == '-' && *sp != '\0' && *sp != ']') {
+                       for (c = ep[-1]+1; c < *sp; c++) {
+                           *ep++ = c;
+                           cclcnt++;
+                           if (c == '\0' || ep >= dp)
+                               goto cerror;
+                       }
+                   } else {
+                       *ep++ = c;
+                       cclcnt++;
+                       if (c == '\0' || ep >= dp)
+                           goto cerror;
+                   }
                } while ((c = *sp++) != ']');
+               if (cclcnt > 255)
+                   goto cerror;
                lastep[1] = cclcnt;
                continue;
 
@@ -690,7 +729,7 @@ plist
        if (*p2 == CCHR) {
            c = p2[1];
            do {
-               if (*p1 == c || cc[*p1] == c)
+               if (*p1 == c || cc[(unsigned char)*p1] == c)
                    if (advance (p1, p2))
                        return 1;
            } while (*p1++);
@@ -708,10 +747,10 @@ 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: 
@@ -734,14 +773,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;
@@ -764,7 +803,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: 
@@ -783,19 +822,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)
+    while (n--)
+       if (*set++ == c || set[-1] == cc[c])
            return (af);
 
     return (!af);
@@ -864,19 +902,19 @@ tws_special (char *ap)
     register struct tws *tw;
 
     time (&clock);
-    if (!strcasecmp (ap, "today"))
+    if (!mh_strcasecmp (ap, "today"))
        return dlocaltime (&clock);
-    if (!strcasecmp (ap, "yesterday")) {
+    if (!mh_strcasecmp (ap, "yesterday")) {
        clock -= (long) (60 * 60 * 24);
        return dlocaltime (&clock);
     }
-    if (!strcasecmp (ap, "tomorrow")) {
+    if (!mh_strcasecmp (ap, "tomorrow")) {
        clock += (long) (60 * 60 * 24);
        return dlocaltime (&clock);
     }
 
     for (i = 0; tw_ldotw[i]; i++)
-       if (!strcasecmp (ap, tw_ldotw[i]))
+       if (!mh_strcasecmp (ap, tw_ldotw[i]))
            break;
     if (tw_ldotw[i]) {
        if ((tw = dlocaltime (&clock)) == NULL)
@@ -917,7 +955,7 @@ plist
                    state = m_getfld (state, name, buf, sizeof buf, fp);
                    bp = add (buf, bp);
                }
-               if (!strcasecmp (name, n->n_datef))
+               if (!mh_strcasecmp (name, n->n_datef))
                    break;
                if (state != FLDEOF)
                    continue;