diff options
| author | 2013-07-03 23:40:37 +0200 | |
|---|---|---|
| committer | 2013-07-03 23:40:37 +0200 | |
| commit | bc00d671241fb5509b81a13efdf50cae616610d0 (patch) | |
| tree | 834a17bc1a8199d93acb5d958ebe0ff0f9cad979 | |
| parent | 84ac1076aa25a687ddcaf3036ceeb0da6b5730dc (diff) | |
| download | colorize-bc00d671241fb5509b81a13efdf50cae616610d0.tar.gz colorize-bc00d671241fb5509b81a13efdf50cae616610d0.tar.bz2 | |
Clean sequences more strictly
| -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) = @_; | 
