From dc0b0be755b41f3c195913631fedf023ad69192e Mon Sep 17 00:00:00 2001 From: Paul Fox Date: Fri, 31 Mar 2006 15:14:49 +0000 Subject: [PATCH] this commit: - adds range support to character classes - fixes out-of-bounds references to the case-folding array when doing case comparisons for 8-bit message text - makes character classes as case tolerant as the rest of the pick regexp machine. (where lowercase chars in patterns should match uppercase in the text.) - fixes an uninitialized pointer warning, which might actually have been a real bug --- uip/picksbr.c | 43 +++++++++++++++++++++++++++++++++++++------ 1 file changed, 37 insertions(+), 6 deletions(-) diff --git a/uip/picksbr.c b/uip/picksbr.c index a7276d7..001bf08 100644 --- a/uip/picksbr.c +++ b/uip/picksbr.c @@ -82,7 +82,7 @@ static struct swit parswit[] = { #define STAR 01 #define LBSIZE 1024 -#define ESIZE 256 +#define ESIZE 1024 static char linebuf[LBSIZE + 1]; @@ -105,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, }; /* @@ -558,7 +575,7 @@ gcompile (struct nexus *n, char *astr) { register int c; int cclcnt; - register char *ep, *dp, *sp, *lastep; + register char *ep, *dp, *sp, *lastep = 0; dp = (ep = n->n_expbuf) + sizeof n->n_expbuf; sp = astr; @@ -602,11 +619,25 @@ gcompile (struct nexus *n, char *astr) 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++) != ']'); lastep[1] = cclcnt; continue; @@ -800,7 +831,7 @@ cclass (char *aset, int ac, int af) n = *set++; while (--n) - if (*set++ == c) + if (*set++ == c || set[-1] == cc[(unsigned char)c]) return (af); return (!af); -- 1.7.10.4