X-Git-Url: https://diplodocus.org/git/nmh/blobdiff_plain/a616a7953d87c3c51afcc8e693c48c37ec000edf..c0ee509559273a5133ff73026e76c19aca65fa87:/uip/picksbr.c diff --git a/uip/picksbr.c b/uip/picksbr.c index 5fa73189..3c2107c2 100644 --- a/uip/picksbr.c +++ b/uip/picksbr.c @@ -17,39 +17,30 @@ #endif #include -static struct swit parswit[] = { -#define PRAND 0 - { "and", 0 }, -#define PROR 1 - { "or", 0 }, -#define PRNOT 2 - { "not", 0 }, -#define PRLBR 3 - { "lbrace", 0 }, -#define PRRBR 4 - { "rbrace", 0 }, -#define PRCC 5 - { "cc pattern", 0 }, -#define PRDATE 6 - { "date pattern", 0 }, -#define PRFROM 7 - { "from pattern", 0 }, -#define PRSRCH 8 - { "search pattern", 0 }, -#define PRSUBJ 9 - { "subject pattern", 0 }, -#define PRTO 10 - { "to pattern", 0 }, -#define PROTHR 11 - { "-othercomponent pattern", 15 }, -#define PRAFTR 12 - { "after date", 0 }, -#define PRBEFR 13 - { "before date", 0 }, -#define PRDATF 14 - { "datefield field", 5 }, - { NULL, 0 } -}; +#define PARSE_SWITCHES \ + X("and", 0, PRAND) \ + X("or", 0, PROR) \ + X("not", 0, PRNOT) \ + X("lbrace", 0, PRLBR) \ + X("rbrace", 0, PRRBR) \ + X("cc pattern", 0, PRCC) \ + X("date pattern", 0, PRDATE) \ + X("from pattern", 0, PRFROM) \ + X("search pattern", 0, PRSRCH) \ + X("subject pattern", 0, PRSUBJ) \ + X("to pattern", 0, PRTO) \ + X("-othercomponent pattern", 15, PROTHR) \ + X("after date", 0, PRAFTR) \ + X("before date", 0, PRBEFR) \ + X("datefield field", 5, PRDATF) \ + +#define X(sw, minchars, id) id, +DEFINE_SWITCH_ENUM(PARSE); +#undef X + +#define X(sw, minchars, id) { sw, minchars, id }, +DEFINE_SWITCH_ARRAY(PARSE, parswit); +#undef X /* DEFINITIONS FOR PATTERN MATCHING */ @@ -166,7 +157,6 @@ struct nexus { #define n_tws un.st3.un_tws static int talked; -static int pdebug = 0; static char *datesw; static char **argp; @@ -204,11 +194,6 @@ static int TWSaction(); int pcompile (char **vec, char *date) { - register char *cp; - - if ((cp = getenv ("MHPDEBUG")) && *cp) - pdebug++; - argp = vec; if ((datesw = date) == NULL) datesw = "date"; @@ -258,6 +243,7 @@ parse (void) if ((o->n_R_child = parse ())) return o; padvise (NULL, "missing disjunctive"); + free (o); return NULL; header: ; @@ -278,6 +264,7 @@ nexp1 (void) if (*cp != '-') { padvise (NULL, "%s unexpected", cp); + free (n); return NULL; } @@ -287,10 +274,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: @@ -299,6 +288,7 @@ nexp1 (void) if ((o->n_R_child = nexp1 ())) return o; padvise (NULL, "missing conjunctive"); + free (o); return NULL; header: ; @@ -340,6 +330,7 @@ nexp2 (void) if ((n->n_L_child = nexp3 ())) return n; padvise (NULL, "missing negation"); + free (n); return NULL; header: ; @@ -421,12 +412,14 @@ nexp3 (void) n->n_header = 0; if (!(cp = nxtarg ())) {/* allow -xyz arguments */ padvise (NULL, "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); + free (n); return NULL; } n->n_patbuf = getcpy (dp); @@ -453,6 +446,7 @@ nexp3 (void) 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); + free (n); return NULL; } return n; @@ -465,7 +459,7 @@ newnexus (int (*action)()) { register struct nexus *p; - if ((p = (struct nexus *) calloc ((size_t) 1, sizeof *p)) == NULL) + if ((p = (struct nexus *) mh_xcalloc ((size_t) 1, sizeof *p)) == NULL) adios (NULL, "unable to allocate component storage"); p->n_action = action; @@ -483,12 +477,12 @@ newnexus (int (*action)()) 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)); @@ -571,8 +565,8 @@ gcompile (struct nexus *n, char *astr) int cclcnt; register unsigned char *ep, *dp, *sp, *lastep = 0; - dp = (ep = n->n_expbuf) + sizeof n->n_expbuf; - sp = astr; + dp = (ep = (unsigned char *) n->n_expbuf) + sizeof n->n_expbuf; + sp = (unsigned char *) astr; if (*sp == '^') { n->n_circf = 1; sp++; @@ -811,7 +805,7 @@ advance (char *alp, char *aep) star: do { lp--; - if (advance (lp, ep)) + if (advance ((char *) lp, (char *) ep)) return (1); } while (lp > curlp); return 0; @@ -904,19 +898,19 @@ tws_special (char *ap) register 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) @@ -943,12 +937,13 @@ plist register char *bp; char buf[BUFSIZ], name[NAMESZ]; register struct tws *tw; + m_getfld_state_t gstate = 0; NMH_UNUSED (stop); fseek (fp, start, SEEK_SET); - for (state = FLD, bp = NULL;;) { + for (bp = NULL;;) { int bufsz = sizeof buf; - switch (state = m_getfld (state, name, buf, &bufsz, fp)) { + switch (state = m_getfld (&gstate, name, buf, &bufsz, fp)) { case FLD: case FLDPLUS: if (bp != NULL) @@ -956,10 +951,10 @@ plist bp = add (buf, NULL); while (state == FLDPLUS) { bufsz = sizeof buf; - state = m_getfld (state, name, buf, &bufsz, fp); + state = m_getfld (&gstate, name, buf, &bufsz, fp); bp = add (buf, bp); } - if (!mh_strcasecmp (name, n->n_datef)) + if (!strcasecmp (name, n->n_datef)) break; continue; @@ -978,6 +973,7 @@ plist } break; } + m_getfld_state_destroy (&gstate); if ((tw = dparsetime (bp)) == NULL) advise (NULL, "unable to parse %s field in message %d, matching...",