X-Git-Url: https://diplodocus.org/git/nmh/blobdiff_plain/5dd6771b28c257af405d7248639ed0e3bcdce38b..b0aa8cdb1c264e42d4931ca24968689c73381278:/uip/picksbr.c diff --git a/uip/picksbr.c b/uip/picksbr.c index bd4c263e..6433d2d0 100644 --- a/uip/picksbr.c +++ b/uip/picksbr.c @@ -12,50 +12,35 @@ #include #include -#ifdef TIME_WITH_SYS_TIME +#ifdef HAVE_SYS_TIME_H # include -# include -#else -# ifdef TM_IN_SYS_TIME -# include -# else -# include -# endif #endif - -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 } -}; +#include + +#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 */ @@ -84,9 +69,10 @@ static struct swit parswit[] = { static char linebuf[LBSIZE + 1]; +static char decoded_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, @@ -171,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; @@ -181,23 +166,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 *nexp1(); -static struct nexus *nexp2(); -static struct nexus *nexp3(); -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(); @@ -209,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"; @@ -234,8 +214,8 @@ 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; @@ -263,6 +243,7 @@ parse (void) if ((o->n_R_child = parse ())) return o; padvise (NULL, "missing disjunctive"); + free (o); return NULL; header: ; @@ -275,14 +256,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); + free (n); return NULL; } @@ -292,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: @@ -304,6 +288,7 @@ nexp1 (void) if ((o->n_R_child = nexp1 ())) return o; padvise (NULL, "missing conjunctive"); + free (o); return NULL; header: ; @@ -317,8 +302,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; @@ -345,6 +330,7 @@ nexp2 (void) if ((n->n_L_child = nexp3 ())) return n; padvise (NULL, "missing negation"); + free (n); return NULL; header: ; @@ -358,9 +344,9 @@ 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; @@ -426,15 +412,17 @@ 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); + n->n_patbuf = mh_xstrdup(dp); return n; case PROTHR: @@ -458,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; @@ -468,11 +457,9 @@ nexp3 (void) static struct nexus * newnexus (int (*action)()) { - 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; } @@ -481,19 +468,19 @@ newnexus (int (*action)()) #define args(a) a, fp, msgnum, start, stop #define params args (n) #define plist \ - register struct nexus *n; \ - register FILE *fp; \ + struct nexus *n; \ + 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)); @@ -503,7 +490,7 @@ pmatches (FILE *fp, int msgnum, long start, long stop) static void PRaction (struct nexus *n, int level) { - register int i; + int i; for (i = 0; i < level; i++) fprintf (stderr, "| "); @@ -572,12 +559,12 @@ plist 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 = 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++; @@ -664,8 +651,9 @@ plist { int c, body, 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; @@ -706,7 +694,8 @@ plist break; } lf++; - c = ' '; + /* Unfold by skipping the newline. */ + c = 0; } } if (c && p1 < &linebuf[LBSIZE - 1]) @@ -718,6 +707,13 @@ plist p1 = linebuf; p2 = n->n_expbuf; + /* 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) && + decode_rfc2047 (linebuf, decoded_linebuf, sizeof decoded_linebuf)) { + p1 = decoded_linebuf; + } + if (n->n_circf) { if (advance (p1, p2)) return 1; @@ -745,7 +741,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; @@ -807,7 +803,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; @@ -822,8 +818,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) @@ -841,7 +837,7 @@ 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; @@ -855,7 +851,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; @@ -897,22 +893,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) @@ -920,11 +916,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); @@ -936,37 +933,36 @@ TWSaction (params) plist { int state; - register char *bp; + char *bp; char buf[BUFSIZ], name[NAMESZ]; - register struct tws *tw; + struct tws *tw; + m_getfld_state_t gstate = 0; + NMH_UNUSED (stop); fseek (fp, start, SEEK_SET); - for (state = FLD, bp = NULL;;) { - switch (state = m_getfld (state, name, buf, sizeof buf, fp)) { + for (bp = NULL;;) { + int bufsz = sizeof buf; + switch (state = m_getfld (&gstate, name, buf, &bufsz, fp)) { case FLD: - case FLDEOF: case FLDPLUS: - if (bp != NULL) - free (bp), bp = NULL; + mh_xfree(bp); bp = add (buf, NULL); while (state == FLDPLUS) { - state = m_getfld (state, name, buf, sizeof buf, fp); + bufsz = sizeof buf; + 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; - if (state != FLDEOF) - continue; + continue; case BODY: - case BODYEOF: case FILEEOF: case LENERR: case FMTERR: if (state == LENERR || state == FMTERR) advise (NULL, "format error in message %d", msgnum); - if (bp != NULL) - free (bp); + mh_xfree(bp); return 0; default: @@ -974,6 +970,7 @@ plist } break; } + m_getfld_state_destroy (&gstate); if ((tw = dparsetime (bp)) == NULL) advise (NULL, "unable to parse %s field in message %d, matching...", @@ -982,7 +979,6 @@ plist state = n->n_after ? (twsort (tw, &n->n_tws) > 0) : (twsort (tw, &n->n_tws) < 0); - if (bp != NULL) - free (bp); + mh_xfree(bp); return state; }