+ }
+ else if (clean)
+ {
+ bool check_values, first = true;
+ if (!isdigit (*p))
+ goto END;
+ do {
+ const char *digit;
+ check_values = false;
+ if (!first && !isdigit (*p))
+ goto DISCARD;
+ digit = p;
+ while (isdigit (*p))
+ p++;
+ if (p - digit > 2)
+ goto DISCARD;
+ else /* check range */
+ {
+ char val[3];
+ int value;
+ unsigned int i;
+ const unsigned int digits = p - digit;
+ for (i = 0; i < digits; i++)
+ val[i] = *digit++;
+ val[i] = '\0';
+ value = atoi (val);
+ if (!((value == 0 || value == 1) /* attributes */
+ || (value >= 30 && value <= 37) /* foreground colors */
+ || (value >= 40 && value <= 47) /* background colors */
+ || (value == 39 || value == 49))) /* default colors */
+ goto DISCARD;
+ }
+ if (*p == ';')
+ {
+ p++;
+ check_values = true;
+ }
+ first = false;
+ } while (check_values);
+ }