X-Git-Url: http://git.marmaro.de/?p=mmh;a=blobdiff_plain;f=uip%2Fpicksbr.c;h=61d5afb88e3df8599d0bdcd8fc0a968968f4f1ec;hp=88463edebf9b0fddf3e1838c687a0a5ee914828d;hb=d8916ff5d389de5ab225cd6f40aeda1b285d0f28;hpb=1691e80890e5d8ba258c51c214a3e91880e1db2b diff --git a/uip/picksbr.c b/uip/picksbr.c index 88463ed..61d5afb 100644 --- a/uip/picksbr.c +++ b/uip/picksbr.c @@ -3,11 +3,27 @@ * 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. */ #include -#include +#include #include +#include + +#ifdef TIME_WITH_SYS_TIME +# include +# include +#else +# ifdef TM_IN_SYS_TIME +# include +# else +# include +# endif +#endif static struct swit parswit[] = { #define PRAND 0 @@ -66,7 +82,7 @@ static struct swit parswit[] = { #define STAR 01 #define LBSIZE 1024 -#define ESIZE 256 +#define ESIZE 1024 static char linebuf[LBSIZE + 1]; @@ -89,6 +105,23 @@ static char cc[] = { 0150,0151,0152,0153,0154,0155,0156,0157, 0160,0161,0162,0163,0164,0165,0166,0167, 0170,0171,0172,0173,0174,0175,0176,0177, + + 0200,0201,0202,0203,0204,0205,0206,0207, + 0210,0211,0212,0213,0214,0215,0216,0217, + 0220,0221,0222,0223,0224,0225,0226,0227, + 0230,0231,0232,0233,0234,0235,0236,0237, + 0240,0241,0242,0243,0244,0245,0246,0247, + 0250,0251,0252,0253,0254,0255,0256,0257, + 0260,0261,0262,0263,0264,0265,0266,0267, + 0270,0271,0272,0273,0274,0275,0276,0277, + 0300,0301,0302,0303,0304,0305,0306,0307, + 0310,0311,0312,0313,0314,0315,0316,0317, + 0320,0321,0322,0323,0324,0325,0326,0327, + 0330,0331,0332,0333,0334,0335,0336,0337, + 0340,0341,0342,0343,0344,0345,0346,0347, + 0350,0351,0352,0353,0354,0355,0356,0357, + 0360,0361,0362,0363,0364,0365,0366,0367, + 0370,0371,0372,0373,0374,0375,0376,0377, }; /* @@ -163,9 +196,9 @@ 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 *nexp1(); +static struct nexus *nexp2(); +static struct nexus *nexp3(); static struct nexus *newnexus(); static int ORaction(); @@ -206,7 +239,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 != '-') { @@ -242,12 +275,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 != '-') { @@ -270,7 +303,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; @@ -284,7 +317,7 @@ header: ; static struct nexus * -exp2 (void) +nexp2 (void) { register char *cp; register struct nexus *n; @@ -294,7 +327,7 @@ exp2 (void) if (*cp != '-') { prvarg (); - return exp3 (); + return nexp3 (); } if (*++cp == '-') @@ -311,7 +344,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; @@ -319,12 +352,12 @@ exp2 (void) header: ; default: prvarg (); - return exp3 (); + return nexp3 (); } } static struct nexus * -exp3 (void) +nexp3 (void) { int i; register char *cp, *dp; @@ -415,7 +448,7 @@ exp3 (void) padvise (NULL, "missing argument to %s", argp[-2]); return NULL; } - return exp3 (); + return nexp3 (); case PRAFTR: case PRBEFR: @@ -505,7 +538,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)); } @@ -542,7 +576,7 @@ gcompile (struct nexus *n, char *astr) { register int c; int cclcnt; - register char *ep, *dp, *sp, *lastep; + register unsigned char *ep, *dp, *sp, *lastep = 0; dp = (ep = n->n_expbuf) + sizeof n->n_expbuf; sp = astr; @@ -581,17 +615,33 @@ gcompile (struct nexus *n, char *astr) case '[': *ep++ = CCL; *ep++ = 0; - cclcnt = 1; + cclcnt = 0; if ((c = *sp++) == '^') { c = *sp++; ep[-2] = NCCL; } - do { + if (c == '-') { *ep++ = c; cclcnt++; - if (c == '\0' || ep >= dp) - goto cerror; + c = *sp++; + } + do { + if (c == '-' && *sp != '\0' && *sp != ']') { + for (c = ep[-1]+1; c < *sp; c++) { + *ep++ = c; + cclcnt++; + if (c == '\0' || ep >= dp) + goto cerror; + } + } else { + *ep++ = c; + cclcnt++; + if (c == '\0' || ep >= dp) + goto cerror; + } } while ((c = *sp++) != ']'); + if (cclcnt > 255) + goto cerror; lastep[1] = cclcnt; continue; @@ -641,14 +691,15 @@ plist ebp = ibuf + strlen (ibuf); } c = *p2++; - if (lf && c != '\n') + if (lf && c != '\n') { if (c != ' ' && c != '\t') { --p2; break; } else lf = 0; - if (c == '\n') + } + if (c == '\n') { if (body) break; else { @@ -659,6 +710,7 @@ plist lf++; c = ' '; } + } if (c && p1 < &linebuf[LBSIZE - 1]) *p1++ = c; } @@ -677,7 +729,7 @@ plist if (*p2 == CCHR) { c = p2[1]; do { - if (*p1 == c || cc[*p1] == c) + if (*p1 == c || cc[(unsigned char)*p1] == c) if (advance (p1, p2)) return 1; } while (*p1++); @@ -695,10 +747,10 @@ plist static int advance (char *alp, char *aep) { - register char *lp, *ep, *curlp; + register unsigned char *lp, *ep, *curlp; - lp = alp; - ep = aep; + lp = (unsigned char *)alp; + ep = (unsigned char *)aep; for (;;) switch (*ep++) { case CCHR: @@ -721,14 +773,14 @@ advance (char *alp, char *aep) case CCL: if (cclass (ep, *lp++, 1)) { - ep += *ep; + ep += *ep + 1; continue; } return 0; case NCCL: if (cclass (ep, *lp++, 0)) { - ep += *ep; + ep += *ep + 1; continue; } return 0; @@ -751,7 +803,7 @@ advance (char *alp, char *aep) curlp = lp; while (cclass (ep, *lp++, ep[-1] == (CCL | STAR))) continue; - ep += *ep; + ep += *ep + 1; goto star; star: @@ -770,19 +822,18 @@ advance (char *alp, char *aep) static int -cclass (char *aset, int ac, int af) +cclass (unsigned char *aset, int ac, int af) { - register int n; - register char c, - *set; + register unsigned int n; + register unsigned char c, *set; set = aset; if ((c = ac) == 0) return (0); n = *set++; - while (--n) - if (*set++ == c) + while (n--) + if (*set++ == c || set[-1] == cc[c]) return (af); return (!af); @@ -851,19 +902,19 @@ tws_special (char *ap) register struct tws *tw; time (&clock); - if (!strcasecmp (ap, "today")) + if (!mh_strcasecmp (ap, "today")) return dlocaltime (&clock); - if (!strcasecmp (ap, "yesterday")) { + if (!mh_strcasecmp (ap, "yesterday")) { clock -= (long) (60 * 60 * 24); return dlocaltime (&clock); } - if (!strcasecmp (ap, "tomorrow")) { + if (!mh_strcasecmp (ap, "tomorrow")) { clock += (long) (60 * 60 * 24); return dlocaltime (&clock); } for (i = 0; tw_ldotw[i]; i++) - if (!strcasecmp (ap, tw_ldotw[i])) + if (!mh_strcasecmp (ap, tw_ldotw[i])) break; if (tw_ldotw[i]) { if ((tw = dlocaltime (&clock)) == NULL) @@ -904,7 +955,7 @@ plist state = m_getfld (state, name, buf, sizeof buf, fp); bp = add (buf, bp); } - if (!strcasecmp (name, n->n_datef)) + if (!mh_strcasecmp (name, n->n_datef)) break; if (state != FLDEOF) continue;