- 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;