aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGravatar Steven Schubiger <stsc@refcnt.org> 2019-09-17 23:14:18 +0200
committerGravatar Steven Schubiger <stsc@refcnt.org> 2019-09-17 23:14:18 +0200
commit9082b6aa7b7bd32db92ed1bd8ebe31e836147704 (patch)
tree1267f3fae5576a73bd969cd77480713e4e1da7ac
parent69f07b58527f4a75d67443232a34f944a65ae423 (diff)
downloadcolorize-9082b6aa7b7bd32db92ed1bd8ebe31e836147704.tar.gz
colorize-9082b6aa7b7bd32db92ed1bd8ebe31e836147704.tar.bz2
parse_conf(): minor tweaks
- Parse lines with CRLF endings - Separate the '#' sign from the option name
-rw-r--r--colorize.c10
-rwxr-xr-xt/conf/endings.t36
-rwxr-xr-xt/conf/parse/fail.t3
3 files changed, 44 insertions, 5 deletions
diff --git a/colorize.c b/colorize.c
index 147e684..753f749 100644
--- a/colorize.c
+++ b/colorize.c
@@ -681,9 +681,11 @@ parse_conf (const char *conf_file, struct conf *config)
char *p;
cnt++;
+ if ((p = strchr (line, '\r')) && *(p + 1) != '\n')
+ vfprintf_fail ("%s: CR ending of line %u is not supported, switch to CRLF/LF instead", conf_file, cnt);
if (strlen (line) > (sizeof (line) - 2))
vfprintf_fail ("%s: line %u exceeds maximum of %u characters", conf_file, cnt, (unsigned int)(sizeof (line) - 2));
- if ((p = strrchr (line, '\n')))
+ if ((p = strpbrk (line, "\n\r")))
*p = '\0';
/* NAME PARSING (start) */
p = line;
@@ -696,9 +698,9 @@ parse_conf (const char *conf_file, struct conf *config)
opt = p;
if (!(assign = strchr (opt, '='))) /* check for = */
{
- char *space;
- if ((space = strchr (opt, ' ')))
- *space = '\0';
+ char *s;
+ if ((s = strpbrk (opt, "# ")))
+ *s = '\0';
vfprintf_fail (formats[FMT_CONF], conf_file, opt, "not followed by =");
}
p = assign;
diff --git a/t/conf/endings.t b/t/conf/endings.t
new file mode 100755
index 0000000..35abe20
--- /dev/null
+++ b/t/conf/endings.t
@@ -0,0 +1,36 @@
+#!/usr/bin/perl
+
+use strict;
+use warnings;
+use lib qw(lib);
+
+use Colorize::Common qw(:defaults $write_to_tmpfile);
+use File::Temp qw(tmpnam);
+use Test::More;
+
+my $tests = 1;
+
+my $conf = <<'EOT';
+attr=reverse
+color=red
+EOT
+
+plan tests => $tests;
+
+SKIP: {
+ my $program = tmpnam();
+ my $conf_file = tmpnam();
+
+ skip 'compiling failed (endings)', $tests unless system(qq($compiler -DTEST -DCONF_FILE_TEST=\"$conf_file\" -o $program $source)) == 0;
+
+ my $infile = $write_to_tmpfile->('foo');
+
+ open(my $fh, '>', $conf_file) or die "Cannot open `$conf_file' for writing: $!\n";
+ print {$fh} join "\015\012", split /\n/, $conf;
+ close($fh);
+
+ is(qx($program $infile), "\e[7;31mfoo\e[0m", 'CRLF line endings');
+
+ unlink $program;
+ unlink $conf_file;
+}
diff --git a/t/conf/parse/fail.t b/t/conf/parse/fail.t
index ea267f8..d2988e4 100755
--- a/t/conf/parse/fail.t
+++ b/t/conf/parse/fail.t
@@ -12,7 +12,7 @@ use IPC::Open3 qw(open3);
use Symbol qw(gensym);
use Test::More;
-my $tests = 8;
+my $tests = 9;
my $run_program_fail = sub
{
@@ -47,6 +47,7 @@ SKIP: {
[ 'exclude-random1=black', 'option \'exclude-random1\' not recognized' ],
[ 'omit-color-empty1=yes', 'option \'omit-color-empty1\' not recognized' ],
[ 'attr', 'option \'attr\' not followed by =' ],
+ [ 'attr#', 'option \'attr\' not followed by =' ],
[ 'attr bold', 'option \'attr\' not followed by =' ],
[ "color=$chars_exceed", 'line 1 exceeds maximum of' ],
);