diff options
| -rw-r--r-- | colorize.c | 49 | ||||
| -rwxr-xr-x | test.pl | 17 | 
2 files changed, 49 insertions, 17 deletions
| @@ -824,13 +824,13 @@ print_clean (const char *line)                }              else if (clean)                { -                bool check_values, first = true; -                if (!isdigit (*p)) -                  goto END; +                bool check_values; +                unsigned int iter = 0; +                const char *digit;                  do { -                  const char *digit;                    check_values = false; -                  if (!first && !isdigit (*p)) +                  iter++; +                  if (!isdigit (*p))                      goto DISCARD;                    digit = p;                    while (isdigit (*p)) @@ -847,19 +847,36 @@ print_clean (const char *line)                          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    */ +                      if (value == 0) /* reset */ +                        { +                          if (iter > 1) +                            goto DISCARD; +                          goto END; +                        } +                      else if (value == 1) /* bold */ +                        { +                          bool discard = false; +                          if (iter > 1) +                            discard = true; +                          else if (*p != ';') +                            discard = true; +                          if (discard) +                            goto DISCARD; +                          p++; +                          check_values = true; +                        } +                      else if ((value >= 30 && value <= 37) || value == 39) /* foreground colors */ +                        goto END; +                      else if ((value >= 40 && value <= 47) || value == 49) /* background colors */ +                        { +                          if (iter > 1) +                            goto DISCARD; +                          goto END; +                        } +                      else                          goto DISCARD;                      } -                  if (*p == ';') -                    { -                      p++; -                      check_values = true; -                    } -                  first = false; -                } while (check_values); +                } while (iter == 1 && check_values);                }              END: if (*p == 'm')                { @@ -7,7 +7,7 @@ use constant true => 1;  use File::Temp qw(tempfile tmpnam);  use Test::More; -my $tests = 21; +my $tests = 22;  my %BUF_SIZE = (     normal => 1024, @@ -47,6 +47,21 @@ SKIP: {      is_deeply([split /\n/, qx(cat $infile1 | $program none/none)], [split /\n/, $text], 'text read from stdin');      is_deeply([split /\n/, qx($program none/none $infile1)],       [split /\n/, $text], 'text read from file'); +    { +        my @fg_colors = (30..37, 39); +        my @bg_colors = (40..47, 49); + +        my @bold_colors = map "1;$_", @fg_colors; + +        my @values = (@fg_colors, @bg_colors, @bold_colors, 0); + +        my $ok = true; +        foreach my $value (@values) { +            $ok &= qx(echo -n "\e[${value}m" | $program --clean) eq ''; +        } +        ok($ok, 'clean color sequences'); +    } +      my $check_clean = sub      {          my ($type) = @_; | 
