From bc00d671241fb5509b81a13efdf50cae616610d0 Mon Sep 17 00:00:00 2001 From: Steven Schubiger Date: Wed, 3 Jul 2013 23:40:37 +0200 Subject: Clean sequences more strictly --- colorize.c | 49 +++++++++++++++++++++++++++++++++---------------- test.pl | 17 ++++++++++++++++- 2 files changed, 49 insertions(+), 17 deletions(-) diff --git a/colorize.c b/colorize.c index c402a01..02190f9 100644 --- a/colorize.c +++ b/colorize.c @@ -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') { diff --git a/test.pl b/test.pl index 373a4bc..056f818 100755 --- a/test.pl +++ b/test.pl @@ -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) = @_; -- cgit v1.2.3