+ if (ENABLE_FEATURE_TR_CLASSES && *arg++ == ':') {
+ if (strncmp(arg, "alpha", 5) == 0) {
+ for (i = 'A'; i <= 'Z'; i++)
+ *buffer++ = i;
+ for (i = 'a'; i <= 'z'; i++)
+ *buffer++ = i;
+ }
+ else if (strncmp(arg, "alnum", 5) == 0) {
+ for (i = 'A'; i <= 'Z'; i++)
+ *buffer++ = i;
+ for (i = 'a'; i <= 'z'; i++)
+ *buffer++ = i;
+ for (i = '0'; i <= '9'; i++)
+ *buffer++ = i;
+ }
+ else if (strncmp(arg, "digit", 5) == 0)
+ for (i = '0'; i <= '9'; i++)
+ *buffer++ = i;
+ else if (strncmp(arg, "lower", 5) == 0)
+ for (i = 'a'; i <= 'z'; i++)
+ *buffer++ = i;
+ else if (strncmp(arg, "upper", 5) == 0)
+ for (i = 'A'; i <= 'Z'; i++)
+ *buffer++ = i;
+ else if (strncmp(arg, "space", 5) == 0)
+ strcat((char*)buffer, " \f\n\r\t\v");
+ else if (strncmp(arg, "blank", 5) == 0)
+ strcat((char*)buffer, " \t");
+ /* gcc gives a warning if braces aren't used here */
+ else if (strncmp(arg, "punct", 5) == 0) {
+ for (i = 0; i <= ASCII; i++)
+ if (isprint(i) && (!isalnum(i)) && (!isspace(i)))
+ *buffer++ = i;
+ }
+ else if (strncmp(arg, "cntrl", 5) == 0) {
+ for (i = 0; i <= ASCII; i++)
+ if (iscntrl(i))
+ *buffer++ = i;
+ }
+ else {
+ strcat((char*)buffer, "[:");
+ arg++;
+ continue;
+ }
+ break;
+ }
+ if (ENABLE_FEATURE_TR_EQUIV && *arg++ == '=') {
+ *buffer++ = *arg;
+ /* skip the closing =] */
+ arg += 3;
+ continue;
+ }