]> diplodocus.org Git - nmh/blobdiff - uip/picksbr.c
getpass.c: Move interface to own file.
[nmh] / uip / picksbr.c
index 74834f4eaa8ae5700f34e093dc59f1fc1c431fe5..aff2fea77ef9953d79f1606afcfa1fe063125537 100644 (file)
@@ -1,16 +1,18 @@
-
-/*
- * picksbr.c -- routines to help pick along...
+/* picksbr.c -- routines to help pick along...
  *
  * 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 <h/tws.h>
-#include <h/picksbr.h>
-#include <h/utils.h>
+#include "h/mh.h"
+#include "sbr/fmt_rfc2047.h"
+#include "sbr/brkstring.h"
+#include "sbr/ambigsw.h"
+#include "sbr/error.h"
+#include "h/tws.h"
+#include "h/picksbr.h"
+#include "h/utils.h"
 
 #ifdef HAVE_SYS_TIME_H
 # include <sys/time.h>
@@ -64,7 +66,7 @@ DEFINE_SWITCH_ARRAY(PARSE, parswit);
 
 #define        STAR    01
 
-#define LBSIZE  1024
+#define LBSIZE  NMH_BUFSIZ
 #define        ESIZE   1024
 
 
@@ -115,10 +117,10 @@ static unsigned char cc[] = {
 #define        nxtarg()        (*argp ? *argp++ : NULL)
 #define        prvarg()        argp--
 
-#define        padvise         if (!talked++) advise
+#define        pinform         if (!talked++) inform
 
 struct nexus {
-    int (*n_action)();
+    int (*n_action)(struct nexus *n, FILE *fp, int msgnum, long start, long stop);
 
     union {
        /* for {OR,AND,NOT}action */
@@ -182,13 +184,19 @@ 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 struct nexus *newnexus(int (*action)(struct nexus *n,
+    FILE *fp, int msgnum, long start, long stop));
 
-static int ORaction();
-static int ANDaction();
-static int NOTaction();
-static int GREPaction();
-static int TWSaction();
+static int ORaction(struct nexus *n, FILE *fp, int msgnum,
+    long start, long stop);
+static int ANDaction(struct nexus *n, FILE *fp, int msgnum,
+    long start, long stop);
+static int NOTaction(struct nexus *n, FILE *fp, int msgnum,
+    long start, long stop);
+static int GREPaction(struct nexus *n, FILE *fp, int msgnum,
+    long start, long stop);
+static int TWSaction(struct nexus *n, FILE *fp, int msgnum,
+    long start, long stop);
 
 
 int
@@ -200,10 +208,10 @@ pcompile (char **vec, char *date)
     talked = 0;
 
     if ((head = parse ()) == NULL)
-       return (talked ? 0 : 1);
+        return !talked;
 
     if (*argp) {
-       padvise (NULL, "%s unexpected", *argp);
+       inform("%s unexpected", *argp);
        return 0;
     }
 
@@ -214,14 +222,14 @@ pcompile (char **vec, char *date)
 static struct nexus *
 parse (void)
 {
-    register char  *cp;
-    register struct nexus *n, *o;
+    char  *cp;
+    struct nexus *n, *o;
 
     if ((n = nexp1 ()) == NULL || (cp = nxtarg ()) == NULL)
        return n;
 
     if (*cp != '-') {
-       padvise (NULL, "%s unexpected", cp);
+       pinform("%s unexpected", cp);
        return NULL;
     }
 
@@ -242,7 +250,8 @@ parse (void)
            o->n_L_child = n;
            if ((o->n_R_child = parse ()))
                return o;
-           padvise (NULL, "missing disjunctive");
+           pinform("missing disjunctive");
+           free (o);
            return NULL;
 
 header: ;
@@ -255,14 +264,15 @@ header: ;
 static struct nexus *
 nexp1 (void)
 {
-    register char *cp;
-    register struct nexus *n, *o;
+    char *cp;
+    struct nexus *n, *o;
 
     if ((n = nexp2 ()) == NULL || (cp = nxtarg ()) == NULL)
        return n;
 
     if (*cp != '-') {
-       padvise (NULL, "%s unexpected", cp);
+       pinform("%s unexpected", cp);
+       free (n);
        return NULL;
     }
 
@@ -272,10 +282,12 @@ nexp1 (void)
        case AMBIGSW: 
            ambigsw (cp, parswit);
            talked++;
+           free (n);
            return NULL;
        case UNKWNSW: 
            fprintf (stderr, "-%s unknown\n", cp);
            talked++;
+           free (n);
            return NULL;
 
        case PRAND: 
@@ -283,7 +295,8 @@ nexp1 (void)
            o->n_L_child = n;
            if ((o->n_R_child = nexp1 ()))
                return o;
-           padvise (NULL, "missing conjunctive");
+           pinform("missing conjunctive");
+           free (o);
            return NULL;
 
 header: ;
@@ -297,8 +310,8 @@ header: ;
 static struct nexus *
 nexp2 (void)
 {
-    register char *cp;
-    register struct nexus *n;
+    char *cp;
+    struct nexus *n;
 
     if ((cp = nxtarg ()) == NULL)
        return NULL;
@@ -324,7 +337,8 @@ nexp2 (void)
            n = newnexus (NOTaction);
            if ((n->n_L_child = nexp3 ()))
                return n;
-           padvise (NULL, "missing negation");
+           pinform("missing negation");
+           free (n);
            return NULL;
 
 header: ;
@@ -338,15 +352,15 @@ static struct nexus *
 nexp3 (void)
 {
     int i;
-    register char *cp, *dp;
+    char *cp, *dp;
     char buffer[BUFSIZ], temp[64];
-    register struct nexus *n;
+    struct nexus *n;
 
     if ((cp = nxtarg ()) == NULL)
        return NULL;
 
     if (*cp != '-') {
-       padvise (NULL, "%s unexpected", cp);
+       pinform("%s unexpected", cp);
        return NULL;
     }
 
@@ -366,16 +380,16 @@ nexp3 (void)
 
        case PRLBR: 
            if ((n = parse ()) == NULL) {
-               padvise (NULL, "missing group");
+               pinform("missing group");
                return NULL;
            }
            if ((cp = nxtarg ()) == NULL) {
-               padvise (NULL, "missing -rbrace");
+               pinform("missing -rbrace");
                return NULL;
            }
            if (*cp++ == '-' && smatch (cp, parswit) == PRRBR)
                return n;
-           padvise (NULL, "%s unexpected", --cp);
+           pinform("%s unexpected", --cp);
            return NULL;
 
        default: 
@@ -392,7 +406,7 @@ nexp3 (void)
            dp = *brkstring (temp, " ", NULL);
     header: ;
            if (!(cp = nxtarg ())) {/* allow -xyz arguments */
-               padvise (NULL, "missing argument to %s", argp[-2]);
+               pinform("missing argument to %s", argp[-2]);
                return NULL;
            }
            n = newnexus (GREPaction);
@@ -405,25 +419,27 @@ nexp3 (void)
            n = newnexus (GREPaction);
            n->n_header = 0;
            if (!(cp = nxtarg ())) {/* allow -xyz arguments */
-               padvise (NULL, "missing argument to %s", argp[-2]);
+               pinform("missing argument to %s", argp[-2]);
+               free (n);
                return NULL;
            }
            dp = cp;
     pattern: ;
            if (!gcompile (n, dp)) {
-               padvise (NULL, "pattern error in %s %s", argp[-2], cp);
+               pinform("pattern error in %s %s", argp[-2], cp);
+               free (n);
                return NULL;
            }
-           n->n_patbuf = getcpy (dp);
+           n->n_patbuf = mh_xstrdup(dp);
            return n;
 
        case PROTHR: 
-           padvise (NULL, "internal error!");
+           pinform("internal error!");
            return NULL;
 
        case PRDATF: 
            if (!(datesw = nxtarg ()) || *datesw == '-') {
-               padvise (NULL, "missing argument to %s", argp[-2]);
+               pinform("missing argument to %s", argp[-2]);
                return NULL;
            }
            return nexp3 ();
@@ -431,13 +447,14 @@ nexp3 (void)
        case PRAFTR: 
        case PRBEFR: 
            if (!(cp = nxtarg ())) {/* allow -xyz arguments */
-               padvise (NULL, "missing argument to %s", argp[-2]);
+               pinform("missing argument to %s", argp[-2]);
                return NULL;
            }
            n = newnexus (TWSaction);
            n->n_datef = datesw;
            if (!tcompile (cp, &n->n_tws, n->n_after = i == PRAFTR)) {
-               padvise (NULL, "unable to parse %s %s", argp[-2], cp);
+               pinform("unable to parse %s %s", argp[-2], cp);
+               free (n);
                return NULL;
            }
            return n;
@@ -446,27 +463,17 @@ nexp3 (void)
 
 
 static struct nexus *
-newnexus (int (*action)())
+newnexus(int (*action)(struct nexus *n, FILE *fp, int msgnum,
+    long start, long stop))
 {
-    register struct nexus *p;
-
-    if ((p = (struct nexus *) calloc ((size_t) 1, sizeof *p)) == NULL)
-       adios (NULL, "unable to allocate component storage");
+    struct nexus *p;
 
+    NEW0(p);
     p->n_action = action;
     return p;
 }
 
 
-#define        args(a) a, fp, msgnum, start, stop
-#define        params  args (n)
-#define        plist   \
-           register struct nexus  *n; \
-           register FILE *fp; \
-           int msgnum; \
-           long    start, \
-                   stop;
-
 int
 pmatches (FILE *fp, int msgnum, long start, long stop, int debug)
 {
@@ -476,14 +483,14 @@ pmatches (FILE *fp, int msgnum, long start, long stop, int debug)
     if (!talked++ && debug)
        PRaction (head, 0);
 
-    return (*head->n_action) (args (head));
+    return (*head->n_action)(head, fp, msgnum, start, stop);
 }
 
 
 static void
 PRaction (struct nexus *n, int level)
 {
-    register int i;
+    int i;
 
     for (i = 0; i < level; i++)
        fprintf (stderr, "| ");
@@ -516,45 +523,44 @@ PRaction (struct nexus *n, int level)
                dasctime (&n->n_tws, TW_NULL));
        return;
     }
-    fprintf (stderr, "UNKNOWN(0x%x)\n",
-            (unsigned int)(unsigned long) (*n->n_action));
+
+    generic_pointer gp;
+    gp.f = (void (*)(void))n->n_action;
+    fprintf(stderr, "UNKNOWN(%p)\n", gp.v);
 }
 
 
 static int
-ORaction (params)
-plist
+ORaction(struct nexus *n, FILE *fp, int msgnum, long start, long stop)
 {
-    if ((*n->n_L_child->n_action) (args (n->n_L_child)))
+    if ((*n->n_L_child->n_action)(n->n_L_child, fp, msgnum, start, stop))
        return 1;
-    return (*n->n_R_child->n_action) (args (n->n_R_child));
+    return (*n->n_R_child->n_action)(n->n_R_child, fp, msgnum, start, stop);
 }
 
 
 static int
-ANDaction (params)
-plist
+ANDaction(struct nexus *n, FILE *fp, int msgnum, long start, long stop)
 {
-    if (!(*n->n_L_child->n_action) (args (n->n_L_child)))
+    if (!(*n->n_L_child->n_action)(n->n_L_child, fp, msgnum, start, stop))
        return 0;
-    return (*n->n_R_child->n_action) (args (n->n_R_child));
+    return (*n->n_R_child->n_action)(n->n_R_child, fp, msgnum, start, stop);
 }
 
 
 static int
-NOTaction (params)
-plist
+NOTaction(struct nexus *n, FILE *fp, int msgnum, long start, long stop)
 {
-    return (!(*n->n_L_child->n_action) (args (n->n_L_child)));
+    return (!(*n->n_L_child->n_action)(n->n_L_child, fp, msgnum, start, stop));
 }
 
 
 static int
 gcompile (struct nexus *n, char *astr)
 {
-    register int c;
+    int c;
     int cclcnt;
-    register unsigned char *ep, *dp, *sp, *lastep = 0;
+    unsigned char *ep, *dp, *sp, *lastep = 0;
 
     dp = (ep = (unsigned char *) n->n_expbuf) + sizeof n->n_expbuf;
     sp = (unsigned char *) astr;
@@ -626,6 +632,7 @@ gcompile (struct nexus *n, char *astr)
            case '\\': 
                if ((c = *sp++) == '\0')
                    goto cerror;
+               /* FALLTHRU */
        defchar: 
            default: 
                *ep++ = CCHR;
@@ -639,24 +646,25 @@ cerror: ;
 
 
 static int
-GREPaction (params)
-plist
+GREPaction(struct nexus *n, FILE *fp, int msgnum, long start, long stop)
 {
-    int c, body, lf;
+    int c;
+    bool body;
+    bool lf;
     long pos = start;
-    register char *p1, *p2, *ebp, *cbp;
+    char *p1, *p2, *ebp, *cbp;
     char ibuf[BUFSIZ];
     NMH_UNUSED (msgnum);
 
     fseek (fp, start, SEEK_SET);
-    body = 0;
+    body = false;
     ebp = cbp = ibuf;
     for (;;) {
        if (body && n->n_header)
            return 0;
        p1 = linebuf;
        p2 = cbp;
-       lf = 0;
+       lf = false;
        for (;;) {
            if (p2 >= ebp) {
                if (fgets (ibuf, sizeof ibuf, fp) == NULL
@@ -675,21 +683,18 @@ plist
                    --p2;
                    break;
                }
-               else
-                   lf = 0;
+                lf = false;
            }
            if (c == '\n') {
                if (body)
                    break;
-               else {
-                   if (lf) {
-                       body++;
-                       break;
-                   }
-                   lf++;
-                   /* Unfold by skipping the newline. */
-                   c = 0;
-               }
+                if (lf) {
+                    body = true;
+                    break;
+                }
+                lf = true;
+                /* Unfold by skipping the newline. */
+                c = 0;
            }
            if (c && p1 < &linebuf[LBSIZE - 1])
                *p1++ = c;
@@ -702,7 +707,7 @@ plist
 
        /* Attempt to decode as a MIME header.  If it's the last header,
           body will be 1 and lf will be at least 1. */
-       if ((body == 0 || lf > 0)  &&
+       if ((!body || lf)  &&
            decode_rfc2047 (linebuf, decoded_linebuf, sizeof decoded_linebuf)) {
            p1 = decoded_linebuf;
        }
@@ -734,7 +739,7 @@ plist
 static int
 advance (char *alp, char *aep)
 {
-    register unsigned char *lp, *ep, *curlp;
+    unsigned char *lp, *ep, *curlp;
 
     lp = (unsigned char *)alp;
     ep = (unsigned char *)aep;
@@ -797,12 +802,12 @@ advance (char *alp, char *aep)
                do {
                    lp--;
                    if (advance ((char *) lp, (char *) ep))
-                       return (1);
+                       return 1;
                } while (lp > curlp);
                return 0;
 
            default: 
-               admonish (NULL, "advance() botch -- you lose big");
+               inform("advance() botch -- you lose big, continuing...");
                return 0;
        }
 }
@@ -811,31 +816,31 @@ advance (char *alp, char *aep)
 static int
 cclass (unsigned char *aset, int ac, int af)
 {
-    register unsigned int    n;
-    register unsigned char   c, *set;
+    unsigned int    n;
+    unsigned char   c, *set;
 
     set = aset;
     if ((c = ac) == 0)
-       return (0);
+       return 0;
 
     n = *set++;
     while (n--)
        if (*set++ == c || set[-1] == cc[c])
-           return (af);
+           return af;
 
-    return (!af);
+    return !af;
 }
 
 
 static int
 tcompile (char *ap, struct tws *tb, int isafter)
 {
-    register struct tws *tw;
+    struct tws *tw;
 
     if ((tw = tws_parse (ap, isafter)) == NULL)
        return 0;
 
-    twscopy (tb, tw);
+    *tb = *tw;
     return 1;
 }
 
@@ -844,7 +849,7 @@ static struct tws *
 tws_parse (char *ap, int isafter)
 {
     char buffer[BUFSIZ];
-    register struct tws *tw, *ts;
+    struct tws *tw, *ts;
 
     if ((tw = tws_special (ap)) != NULL) {
        tw->tw_sec = tw->tw_min = isafter ? 59 : 0;
@@ -886,7 +891,7 @@ tws_special (char *ap)
 {
     int i;
     time_t clock;
-    register struct tws *tw;
+    struct tws *tw;
 
     time (&clock);
     if (!strcasecmp (ap, "today"))
@@ -909,11 +914,12 @@ tws_special (char *ap)
        if ((i -= tw->tw_wday) > 0)
            i -= 7;
     }
-    else
+    else {
        if (*ap != '-')
            return NULL;
-       else                    /* -ddd days ago */
-           i = atoi (ap);      /* we should error check this */
+       /* -ddd days ago */
+       i = atoi (ap);  /* we should error check this */
+    }
 
     clock += (long) ((60 * 60 * 24) * i);
     return dlocaltime (&clock);
@@ -921,28 +927,27 @@ tws_special (char *ap)
 
 
 static int
-TWSaction (params)
-plist
+TWSaction(struct nexus *n, FILE *fp, int msgnum, long start, long stop)
 {
     int state;
-    register char *bp;
-    char buf[BUFSIZ], name[NAMESZ];
-    register struct tws *tw;
-    m_getfld_state_t gstate = 0;
+    char *bp;
+    char buf[NMH_BUFSIZ], name[NAMESZ];
+    struct tws *tw;
+    m_getfld_state_t gstate;
     NMH_UNUSED (stop);
 
     fseek (fp, start, SEEK_SET);
+    gstate = m_getfld_state_init(fp);
     for (bp = NULL;;) {
        int bufsz = sizeof buf;
-       switch (state = m_getfld (&gstate, name, buf, &bufsz, fp)) {
+       switch (state = m_getfld2(&gstate, name, buf, &bufsz)) {
            case FLD: 
            case FLDPLUS: 
-               if (bp != NULL)
-                   free (bp), bp = NULL;
-               bp = add (buf, NULL);
+                free(bp);
+               bp = mh_xstrdup(buf);
                while (state == FLDPLUS) {
                    bufsz = sizeof buf;
-                   state = m_getfld (&gstate, name, buf, &bufsz, fp);
+                   state = m_getfld2(&gstate, name, buf, &bufsz);
                    bp = add (buf, bp);
                }
                if (!strcasecmp (name, n->n_datef))
@@ -954,26 +959,24 @@ plist
            case LENERR: 
            case FMTERR: 
                if (state == LENERR || state == FMTERR)
-                   advise (NULL, "format error in message %d", msgnum);
-               if (bp != NULL)
-                   free (bp);
+                   inform("format error in message %d", msgnum);
+                free(bp);
                return 0;
 
            default: 
-               adios (NULL, "internal error -- you lose");
+               die("internal error -- you lose");
        }
        break;
     }
     m_getfld_state_destroy (&gstate);
 
     if ((tw = dparsetime (bp)) == NULL)
-       advise (NULL, "unable to parse %s field in message %d, matching...",
+       inform("unable to parse %s field in message %d, matching...",
                n->n_datef, msgnum), state = 1;
     else
        state = n->n_after ? (twsort (tw, &n->n_tws) > 0)
            : (twsort (tw, &n->n_tws) < 0);
 
-    if (bp != NULL)
-       free (bp);
+    free(bp);
     return state;
 }