- return FALSE;
- i = p - s;
- ch = *text;
- if ((CC_EQ(s,i, "alnum") && ISALNUM(ch))
- || (CC_EQ(s,i, "alpha") && ISALPHA(ch))
- || (CC_EQ(s,i, "blank") && ISBLANK(ch))
- || (CC_EQ(s,i, "cntrl") && ISCNTRL(ch))
- || (CC_EQ(s,i, "digit") && ISDIGIT(ch))
- || (CC_EQ(s,i, "graph") && ISGRAPH(ch))
- || (CC_EQ(s,i, "lower") && ISLOWER(ch))
- || (CC_EQ(s,i, "print") && ISPRINT(ch))
- || (CC_EQ(s,i, "punct") && ISPUNCT(ch))
- || (CC_EQ(s,i, "space") && ISSPACE(ch))
- || (CC_EQ(s,i, "upper") && ISUPPER(ch))
- || (CC_EQ(s,i,"xdigit") && ISXDIGIT(ch)))
- matched = TRUE;
- p++;
+ return ABORT_ALL;
+ i = p - s - 1;
+ if (i < 0 || p[-1] != ':') {
+ /* Didn't find ":]", so treat like a normal set. */
+ p = s - 2;
+ ch = '[';
+ if (*text == ch)
+ matched = TRUE;
+ continue;
+ }
+ if (CC_EQ(s,i, "alnum")) {
+ if (ISALNUM(*text))
+ matched = TRUE;
+ }
+ else if (CC_EQ(s,i, "alpha")) {
+ if (ISALPHA(*text))
+ matched = TRUE;
+ }
+ else if (CC_EQ(s,i, "blank")) {
+ if (ISBLANK(*text))
+ matched = TRUE;
+ }
+ else if (CC_EQ(s,i, "cntrl")) {
+ if (ISCNTRL(*text))
+ matched = TRUE;
+ }
+ else if (CC_EQ(s,i, "digit")) {
+ if (ISDIGIT(*text))
+ matched = TRUE;
+ }
+ else if (CC_EQ(s,i, "graph")) {
+ if (ISGRAPH(*text))
+ matched = TRUE;
+ }
+ else if (CC_EQ(s,i, "lower")) {
+ if (ISLOWER(*text))
+ matched = TRUE;
+ }
+ else if (CC_EQ(s,i, "print")) {
+ if (ISPRINT(*text))
+ matched = TRUE;
+ }
+ else if (CC_EQ(s,i, "punct")) {
+ if (ISPUNCT(*text))
+ matched = TRUE;
+ }
+ else if (CC_EQ(s,i, "space")) {
+ if (ISSPACE(*text))
+ matched = TRUE;
+ }
+ else if (CC_EQ(s,i, "upper")) {
+ if (ISUPPER(*text))
+ matched = TRUE;
+ }
+ else if (CC_EQ(s,i, "xdigit")) {
+ if (ISXDIGIT(*text))
+ matched = TRUE;
+ }
+ else /* malformed [:class:] string */
+ return ABORT_ALL;