diff options
author | Steven Schubiger <stsc@refcnt.org> | 2013-07-03 23:40:37 +0200 |
---|---|---|
committer | Steven Schubiger <stsc@refcnt.org> | 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) = @_; |