X-Git-Url: https://diplodocus.org/git/nmh/blobdiff_plain/2e768e3cc0ce768373d3320eca4cdd08b8cf646a..63621a81d16ab743de6b57d47578a9a2c670ad22:/uip/picksbr.c diff --git a/uip/picksbr.c b/uip/picksbr.c index ec7400a3..54b50e70 100644 --- a/uip/picksbr.c +++ b/uip/picksbr.c @@ -1,6 +1,4 @@ - -/* - * 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 @@ -64,7 +62,7 @@ DEFINE_SWITCH_ARRAY(PARSE, parswit); #define STAR 01 -#define LBSIZE 1024 +#define LBSIZE NMH_BUFSIZ #define ESIZE 1024 @@ -115,10 +113,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 */ @@ -157,7 +155,6 @@ struct nexus { #define n_tws un.st3.un_tws static int talked; -static int pdebug = 0; static char *datesw; static char **argp; @@ -183,33 +180,34 @@ 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 pcompile (char **vec, char *date) { - register char *cp; - - if ((cp = getenv ("MHPDEBUG")) && *cp) - pdebug++; - argp = vec; if ((datesw = date) == NULL) datesw = "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; } @@ -220,14 +218,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; } @@ -248,7 +246,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: ; @@ -261,14 +260,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; } @@ -278,10 +278,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: @@ -289,7 +291,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: ; @@ -303,8 +306,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; @@ -330,7 +333,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: ; @@ -344,15 +348,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; } @@ -372,16 +376,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: @@ -398,7 +402,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); @@ -411,25 +415,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 (); @@ -437,13 +443,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; @@ -452,44 +459,34 @@ 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) +pmatches (FILE *fp, int msgnum, long start, long stop, int debug) { if (!head) return 1; - if (!talked++ && pdebug) + 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, "| "); @@ -522,45 +519,41 @@ 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)); + fprintf(stderr, "UNKNOWN(%#llx)\n", (unsigned long long)n->n_action); } 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; @@ -632,6 +625,7 @@ gcompile (struct nexus *n, char *astr) case '\\': if ((c = *sp++) == '\0') goto cerror; + /* FALLTHRU */ defchar: default: *ep++ = CCHR; @@ -645,12 +639,11 @@ cerror: ; static int -GREPaction (params) -plist +GREPaction(struct nexus *n, FILE *fp, int msgnum, long start, long stop) { int c, body, lf; long pos = start; - register char *p1, *p2, *ebp, *cbp; + char *p1, *p2, *ebp, *cbp; char ibuf[BUFSIZ]; NMH_UNUSED (msgnum); @@ -681,21 +674,18 @@ plist --p2; break; } - else - lf = 0; + lf = 0; } if (c == '\n') { if (body) break; - else { - if (lf) { - body++; - break; - } - lf++; - /* Unfold by skipping the newline. */ - c = 0; - } + if (lf) { + body++; + break; + } + lf++; + /* Unfold by skipping the newline. */ + c = 0; } if (c && p1 < &linebuf[LBSIZE - 1]) *p1++ = c; @@ -740,7 +730,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; @@ -808,7 +798,7 @@ advance (char *alp, char *aep) return 0; default: - admonish (NULL, "advance() botch -- you lose big"); + inform("advance() botch -- you lose big, continuing..."); return 0; } } @@ -817,8 +807,8 @@ 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) @@ -836,12 +826,12 @@ cclass (unsigned char *aset, int ac, int 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; } @@ -850,7 +840,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; @@ -892,22 +882,22 @@ tws_special (char *ap) { int i; time_t clock; - register struct tws *tw; + struct tws *tw; time (&clock); - if (!mh_strcasecmp (ap, "today")) + if (!strcasecmp (ap, "today")) return dlocaltime (&clock); - if (!mh_strcasecmp (ap, "yesterday")) { + if (!strcasecmp (ap, "yesterday")) { clock -= (long) (60 * 60 * 24); return dlocaltime (&clock); } - if (!mh_strcasecmp (ap, "tomorrow")) { + if (!strcasecmp (ap, "tomorrow")) { clock += (long) (60 * 60 * 24); return dlocaltime (&clock); } for (i = 0; tw_ldotw[i]; i++) - if (!mh_strcasecmp (ap, tw_ldotw[i])) + if (!strcasecmp (ap, tw_ldotw[i])) break; if (tw_ldotw[i]) { if ((tw = dlocaltime (&clock)) == NULL) @@ -915,11 +905,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); @@ -927,31 +918,30 @@ 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 (!mh_strcasecmp (name, n->n_datef)) + if (!strcasecmp (name, n->n_datef)) break; continue; @@ -960,9 +950,8 @@ 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: @@ -973,13 +962,12 @@ plist 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; }