X-Git-Url: https://diplodocus.org/git/nmh/blobdiff_plain/43d85eaa38c25385082958d831fc926c5e619eac..c4c53777458bfcfd288d45b7708e52eb47c56405:/uip/picksbr.c?ds=inline diff --git a/uip/picksbr.c b/uip/picksbr.c index a00f335e..7b64f819 100644 --- a/uip/picksbr.c +++ b/uip/picksbr.c @@ -2,8 +2,6 @@ /* * 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. @@ -14,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 */ @@ -86,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, @@ -183,23 +167,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 *exp1(); -static struct nexus *exp2(); -static struct nexus *exp3(); -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(); @@ -239,7 +223,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 != '-') { @@ -275,12 +259,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 != '-') { @@ -303,7 +287,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; @@ -317,7 +301,7 @@ header: ; static struct nexus * -exp2 (void) +nexp2 (void) { register char *cp; register struct nexus *n; @@ -327,7 +311,7 @@ exp2 (void) if (*cp != '-') { prvarg (); - return exp3 (); + return nexp3 (); } if (*++cp == '-') @@ -344,7 +328,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; @@ -352,12 +336,12 @@ exp2 (void) header: ; default: prvarg (); - return exp3 (); + return nexp3 (); } } static struct nexus * -exp3 (void) +nexp3 (void) { int i; register char *cp, *dp; @@ -448,7 +432,7 @@ exp3 (void) padvise (NULL, "missing argument to %s", argp[-2]); return NULL; } - return exp3 (); + return nexp3 (); case PRAFTR: case PRBEFR: @@ -538,7 +522,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)); } @@ -667,6 +652,7 @@ plist long pos = start; register char *p1, *p2, *ebp, *cbp; char ibuf[BUFSIZ]; + NMH_UNUSED (msgnum); fseek (fp, start, SEEK_SET); body = 0; @@ -707,7 +693,8 @@ plist break; } lf++; - c = ' '; + /* Unfold by skipping the newline. */ + c = 0; } } if (c && p1 < &linebuf[LBSIZE - 1]) @@ -719,6 +706,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; @@ -940,6 +934,7 @@ plist register char *bp; char buf[BUFSIZ], name[NAMESZ]; register struct tws *tw; + NMH_UNUSED (stop); fseek (fp, start, SEEK_SET); for (state = FLD, bp = NULL;;) {