From ebfd54048a93419de865da53eaa4875d85d078cb Mon Sep 17 00:00:00 2001 From: Steven Schubiger Date: Sun, 9 Aug 2015 00:45:07 +0200 Subject: First draft of improved merging partial lines --- colorize.c | 155 +++++++++++++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 130 insertions(+), 25 deletions(-) diff --git a/colorize.c b/colorize.c index 498e566..c54cec7 100644 --- a/colorize.c +++ b/colorize.c @@ -210,6 +210,10 @@ static void free_color_names (struct color_name **); static void process_args (unsigned int, char **, bool *, const struct color **, const char **, FILE **); static void process_file_arg (const char *, const char **, FILE **); static void read_print_stream (bool, const struct color **, const char *, FILE *); +static void merge_print_line (bool, const struct color **, const char *, const char *, FILE *); +static void complete_part_line (const char *, char **, FILE *); +static bool get_next_char (char *, const char **, FILE *, bool *); +static void save_char (char, char **, unsigned int *); static void find_color_entries (struct color_name **, const struct color **); static void find_color_entry (const struct color_name *, unsigned int, const struct color **); static void print_line (bool, const struct color **, const char * const, unsigned int); @@ -709,23 +713,10 @@ process_file_arg (const char *file_string, const char **file, FILE **stream) assert (*file); } -#define MERGE_PRINT_LINE(part_line, line, flags, check_eof) do { \ - char *current_line, *merged_line = NULL; \ - if (part_line) \ - { \ - merged_line = str_concat (part_line, line); \ - free_null (part_line); \ - } \ - current_line = merged_line ? merged_line : (char *)line; \ - if (!check_eof || *current_line != '\0') \ - print_line (bold, colors, current_line, flags); \ - free (merged_line); \ -} while (false) - static void read_print_stream (bool bold, const struct color **colors, const char *file, FILE *stream) { - char buf[BUF_SIZE + 1], *part_line = NULL; + char buf[BUF_SIZE + 1]; unsigned int flags = 0; while (!feof (stream)) @@ -754,26 +745,140 @@ read_print_stream (bool bold, const struct color **colors, const char *file, FIL vfprintf_fail (formats[FMT_FILE], file, "unrecognized line ending"); p = eol + SKIP_LINE_ENDINGS (flags); *eol = '\0'; - MERGE_PRINT_LINE (part_line, line, flags, false); + print_line (bold, colors, line, flags); line = p; } if (feof (stream)) { - MERGE_PRINT_LINE (part_line, line, 0, true); + if (*line != '\0') + print_line (bold, colors, line, 0); } else if (*line != '\0') { - if (!clean && !clean_all) /* efficiency */ - print_line (bold, colors, line, 0); - else if (!part_line) - part_line = xstrdup (line); + char *p; + if ((clean || clean_all) && (p = strrchr (line, '\033'))) + merge_print_line (bold, colors, line, p, stream); else - { - char *merged_line = str_concat (part_line, line); - free (part_line); - part_line = merged_line; - } + print_line (bold, colors, line, 0); + } + } +} + +static void +merge_print_line (bool bold, const struct color **colors, const char *line, const char *p, FILE *stream) +{ + char *buf = xmalloc (1); + char *merged_part_line = NULL; + const char *part_line; + + *buf = '\0'; + complete_part_line (p + 1, &buf, stream); + + if (*buf != '\0') + part_line = merged_part_line = str_concat (line, buf); + else + part_line = line; + free (buf); + +#ifdef TEST_MERGE_PART_LINE + printf ("%s", part_line); + free (merged_part_line); + exit (EXIT_SUCCESS); +#else + print_line (bold, colors, part_line, 0); + free (merged_part_line); +#endif +} + +static void +complete_part_line (const char *p, char **buf, FILE *stream) +{ + bool got_next_char = false, read_from_stream; + char ch; + unsigned int i = 0; + + if (get_next_char (&ch, &p, stream, &read_from_stream)) + { + if (ch == '[') + { + if (read_from_stream) + save_char (ch, buf, &i); + } + else + { + if (read_from_stream) + ungetc ((int)ch, stream); + return; /* cancel */ } } + else + return; /* cancel */ + + while (get_next_char (&ch, &p, stream, &read_from_stream)) + { + if (isdigit (ch) || ch == ';') + { + if (read_from_stream) + save_char (ch, buf, &i); + } + else /* read next character */ + { + got_next_char = true; + break; + } + } + + if (got_next_char) + { + if (ch == 'm') + { + if (read_from_stream) + save_char (ch, buf, &i); + } + else + { + if (read_from_stream) + ungetc ((int)ch, stream); + return; /* cancel */ + } + } + else + return; /* cancel */ +} + +static bool +get_next_char (char *ch, const char **p, FILE *stream, bool *read_from_stream) +{ + if (**p == '\0') + { + int c; + if ((c = fgetc (stream)) != EOF) + { + *ch = (char)c; + *read_from_stream = true; + return true; + } + else + { + *read_from_stream = false; + return false; + } + } + else + { + *ch = **p; + (*p)++; + *read_from_stream = false; + return true; + } +} + +static void +save_char (char ch, char **buf, unsigned int *i) +{ + *buf = xrealloc (*buf, *i + 2); /* +1: size of buf, +1: space for NUL */ + (*buf)[*i] = ch; + (*buf)[*i + 1] = '\0'; + (*i)++; } static void -- cgit v1.2.3 From 535e0ac2df5fc5dc7284027e99ac6231fd4b2ce1 Mon Sep 17 00:00:00 2001 From: Steven Schubiger Date: Sun, 9 Aug 2015 22:11:45 +0200 Subject: Run test files from test directory --- test.pl | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/test.pl b/test.pl index 959d83f..32b1b51 100755 --- a/test.pl +++ b/test.pl @@ -8,6 +8,7 @@ use constant false => 0; use File::Temp qw(tempfile tempdir tmpnam); use IPC::Open3 qw(open3); use Symbol qw(gensym); +use TAP::Harness; use Test::More; my $tests = 25; @@ -30,6 +31,12 @@ my $write_to_tmpfile = sub return $tmpfile; }; +{ + my @tests = glob('t/*.t'); + my $harness = TAP::Harness->new; + $harness->runtests(@tests); +} + plan tests => $tests; SKIP: { -- cgit v1.2.3 From bc0e7ee4a3198101dbe71fe050ae2bc0eaa8aa8f Mon Sep 17 00:00:00 2001 From: Steven Schubiger Date: Sat, 15 Aug 2015 23:54:09 +0200 Subject: Add merge test file --- t/merge.t | 152 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 152 insertions(+) create mode 100755 t/merge.t diff --git a/t/merge.t b/t/merge.t new file mode 100755 index 0000000..fe73c2b --- /dev/null +++ b/t/merge.t @@ -0,0 +1,152 @@ +#!/usr/bin/perl + +use strict; +use warnings; +use constant true => 1; +use constant false => 0; + +use File::Temp qw(tmpnam); +use Test::More; + +# sequence, buffer sizes +my @merge_success = ( + [ "\e[30m", [ 1..4 ] ], + [ "\e[31m", [ 1..4 ] ], + [ "\e[32m", [ 1..4 ] ], + [ "\e[33m", [ 1..4 ] ], + [ "\e[34m", [ 1..4 ] ], + [ "\e[35m", [ 1..4 ] ], + [ "\e[36m", [ 1..4 ] ], + [ "\e[37m", [ 1..4 ] ], + [ "\e[39m", [ 1..4 ] ], + [ "\e[1;30m", [ 1..6 ] ], + [ "\e[1;31m", [ 1..6 ] ], + [ "\e[1;32m", [ 1..6 ] ], + [ "\e[1;33m", [ 1..6 ] ], + [ "\e[1;34m", [ 1..6 ] ], + [ "\e[1;35m", [ 1..6 ] ], + [ "\e[1;36m", [ 1..6 ] ], + [ "\e[1;37m", [ 1..6 ] ], + [ "\e[1;39m", [ 1..6 ] ], + [ "\e[40m", [ 1..4 ] ], + [ "\e[41m", [ 1..4 ] ], + [ "\e[42m", [ 1..4 ] ], + [ "\e[43m", [ 1..4 ] ], + [ "\e[44m", [ 1..4 ] ], + [ "\e[45m", [ 1..4 ] ], + [ "\e[46m", [ 1..4 ] ], + [ "\e[47m", [ 1..4 ] ], + [ "\e[49m", [ 1..4 ] ], + [ "\e[0m", [ 1..3 ] ], + [ "\e[m", [ 1..2 ] ], + [ "\e[;;m", [ 1..4 ] ], +); +# sequence, buffer size +my @merge_fail = ( + [ "\e30m", 1 ], # missing bracket + [ "\e[am", 2 ], # not a digit nor ; nor m +); +# sequence +my @buffer = ( + "\e[30mz", + "\e[31mz", + "\e[32mz", + "\e[33mz", + "\e[34mz", + "\e[35mz", + "\e[36mz", + "\e[37mz", + "\e[39mz", + "\e[1;30mz", + "\e[1;31mz", + "\e[1;32mz", + "\e[1;33mz", + "\e[1;34mz", + "\e[1;35mz", + "\e[1;36mz", + "\e[1;37mz", + "\e[1;39mz", + "\e[40mz", + "\e[41mz", + "\e[42mz", + "\e[43mz", + "\e[44mz", + "\e[45mz", + "\e[46mz", + "\e[47mz", + "\e[49mz", + "\e[0mz", + "\e[mz", + "\e[;;mz", +); +# sequence, buffer size +my @pushback = ( + [ "\ezm", 1 ], + [ "\e[z", 2 ], +); + +my $tests = 0; +foreach (@merge_success) { + $tests += @{$_->[1]}; +} +$tests += @merge_fail; +$tests += @buffer; +$tests += @pushback; + +my $source = 'colorize.c'; +my %programs; + +my $compile = sub +{ + my ($buf_size) = @_; + return true if exists $programs{$buf_size}; + my $program = tmpnam(); + return false unless system("gcc -DTEST_MERGE_PART_LINE -DBUF_SIZE=$buf_size -o $program $source") == 0; + $programs{$buf_size} = $program; + return true; # compiling succeeded +}; + +my $test_name = sub +{ + my ($sequence, $buf_size) = @_; + my $substr = substr($sequence, 0, $buf_size); + $substr =~ s/^\e/ESC/; + $sequence =~ s/^\e/ESC/; + return "$sequence: $substr"; +}; + +plan tests => $tests; + +foreach my $test (@merge_success) { + foreach my $buf_size (@{$test->[1]}) { + SKIP: { + skip 'compiling failed (merge part line)', 1 unless $compile->($buf_size); + ok(qx(echo -n "$test->[0]" | $programs{$buf_size} --clean) eq $test->[0], 'merge success: ' . $test_name->($test->[0], $buf_size)); + } + } +} +foreach my $test (@merge_fail) { + my $buf_size = $test->[1]; + SKIP: { + skip 'compiling failed (merge part line)', 1 unless $compile->($buf_size); + ok(qx(echo -n "$test->[0]" | $programs{$buf_size} --clean) eq substr($test->[0], 0, $buf_size), 'merge fail: ' . $test_name->($test->[0], $buf_size)); + } +} +foreach my $test (@buffer) { + my $buf_size = length($test) - 1; + SKIP: { + skip 'compiling failed (merge part line)', 1 unless $compile->($buf_size); + ok(qx(echo -n "$test" | $programs{$buf_size} --clean) eq substr($test, 0, $buf_size), 'buffer: ' . $test_name->($test, $buf_size)); + } +} +foreach my $test (@pushback) { + my $buf_size = $test->[1]; + SKIP: { + my $program = tmpnam(); + skip 'compiling failed (merge part line)', 1 unless system("gcc -DBUF_SIZE=$buf_size -o $program $source") == 0; + ok(qx(echo -n "$test->[0]" | $program --clean) eq $test->[0], 'pushback: ' . $test_name->($test->[0], $buf_size)); + unlink $program; + } +} + +unlink $programs{$_} foreach keys %programs; -- cgit v1.2.3 From c4009516f582e1a595e57d07b062b9339a3f215c Mon Sep 17 00:00:00 2001 From: Steven Schubiger Date: Mon, 17 Aug 2015 20:17:03 +0200 Subject: Switch from TAP::Harness to Test::Harness in order to increase portability. --- test.pl | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/test.pl b/test.pl index 32b1b51..9b0a64f 100755 --- a/test.pl +++ b/test.pl @@ -8,7 +8,7 @@ use constant false => 0; use File::Temp qw(tempfile tempdir tmpnam); use IPC::Open3 qw(open3); use Symbol qw(gensym); -use TAP::Harness; +use Test::Harness qw(runtests); use Test::More; my $tests = 25; @@ -32,9 +32,8 @@ my $write_to_tmpfile = sub }; { - my @tests = glob('t/*.t'); - my $harness = TAP::Harness->new; - $harness->runtests(@tests); + my @test_files = glob('t/*.t'); + runtests(@test_files); } plan tests => $tests; -- cgit v1.2.3 From d15d767e78401203e962d8fff77921409625db9a Mon Sep 17 00:00:00 2001 From: Steven Schubiger Date: Tue, 18 Aug 2015 19:10:50 +0200 Subject: Properly indent pair of braces --- colorize.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/colorize.c b/colorize.c index c54cec7..d73e5f6 100644 --- a/colorize.c +++ b/colorize.c @@ -748,10 +748,11 @@ read_print_stream (bool bold, const struct color **colors, const char *file, FIL print_line (bold, colors, line, flags); line = p; } - if (feof (stream)) { - if (*line != '\0') - print_line (bold, colors, line, 0); - } + if (feof (stream)) + { + if (*line != '\0') + print_line (bold, colors, line, 0); + } else if (*line != '\0') { char *p; -- cgit v1.2.3 From 51dda1be52cbc5a79a16cdada24fd92c8696dfa0 Mon Sep 17 00:00:00 2001 From: Steven Schubiger Date: Sun, 23 Aug 2015 21:39:01 +0200 Subject: Amend test name and comment --- test.pl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test.pl b/test.pl index 9b0a64f..30c1fd1 100755 --- a/test.pl +++ b/test.pl @@ -145,9 +145,9 @@ SKIP: { my $switch = "--$type"; - # Check that line chunks are merged when cleaning text + # Check that line chunks are printed when cleaning text without sequences my $short_text = 'Linux dev 2.6.32-5-openvz-686 #1 SMP Sun Sep 23 11:40:07 UTC 2012 i686 GNU/Linux'; - is(qx(echo -n "$short_text" | $program_buf $switch), $short_text, "merge ${\length $short_text} bytes (BUF_SIZE=$BUF_SIZE{short}, $type)"); + is(qx(echo -n "$short_text" | $program_buf $switch), $short_text, "print ${\length $short_text} bytes (BUF_SIZE=$BUF_SIZE{short}, $type)"); }; SKIP: { -- cgit v1.2.3 From ce23df99848c52c808acc76a584f60228aab4376 Mon Sep 17 00:00:00 2001 From: Steven Schubiger Date: Fri, 28 Aug 2015 15:48:41 +0200 Subject: Choose larger integer data type --- colorize.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/colorize.c b/colorize.c index d73e5f6..476b2cc 100644 --- a/colorize.c +++ b/colorize.c @@ -213,7 +213,7 @@ static void read_print_stream (bool, const struct color **, const char *, FILE * static void merge_print_line (bool, const struct color **, const char *, const char *, FILE *); static void complete_part_line (const char *, char **, FILE *); static bool get_next_char (char *, const char **, FILE *, bool *); -static void save_char (char, char **, unsigned int *); +static void save_char (char, char **, unsigned long *); static void find_color_entries (struct color_name **, const struct color **); static void find_color_entry (const struct color_name *, unsigned int, const struct color **); static void print_line (bool, const struct color **, const char * const, unsigned int); @@ -795,7 +795,7 @@ complete_part_line (const char *p, char **buf, FILE *stream) { bool got_next_char = false, read_from_stream; char ch; - unsigned int i = 0; + unsigned long i = 0; if (get_next_char (&ch, &p, stream, &read_from_stream)) { @@ -874,7 +874,7 @@ get_next_char (char *ch, const char **p, FILE *stream, bool *read_from_stream) } static void -save_char (char ch, char **buf, unsigned int *i) +save_char (char ch, char **buf, unsigned long *i) { *buf = xrealloc (*buf, *i + 2); /* +1: size of buf, +1: space for NUL */ (*buf)[*i] = ch; -- cgit v1.2.3 From 6863ca2831b26c73b091e5e4b4215f5112ed2362 Mon Sep 17 00:00:00 2001 From: Steven Schubiger Date: Thu, 3 Sep 2015 13:49:27 +0200 Subject: Double memory when increasing buffer --- colorize.c | 31 +++++++++++++++++++++---------- t/merge.t | 61 +++++++++++++++++++++++++++++++------------------------------ 2 files changed, 52 insertions(+), 40 deletions(-) diff --git a/colorize.c b/colorize.c index 476b2cc..8e37e19 100644 --- a/colorize.c +++ b/colorize.c @@ -104,6 +104,8 @@ && (streq (color_names[color2]->name, "none") \ || streq (color_names[color2]->name, "default")) \ +#define ALLOC_COMPLETE_PART_LINE 8 + #define COLOR_SEP_CHAR '/' #define DEBUG_FILE "debug.txt" @@ -211,9 +213,9 @@ static void process_args (unsigned int, char **, bool *, const struct color **, static void process_file_arg (const char *, const char **, FILE **); static void read_print_stream (bool, const struct color **, const char *, FILE *); static void merge_print_line (bool, const struct color **, const char *, const char *, FILE *); -static void complete_part_line (const char *, char **, FILE *); +static void complete_part_line (const char *, char **, size_t, FILE *); static bool get_next_char (char *, const char **, FILE *, bool *); -static void save_char (char, char **, unsigned long *); +static void save_char (char, char **, unsigned long *, size_t *); static void find_color_entries (struct color_name **, const struct color **); static void find_color_entry (const struct color_name *, unsigned int, const struct color **); static void print_line (bool, const struct color **, const char * const, unsigned int); @@ -767,12 +769,15 @@ read_print_stream (bool bold, const struct color **colors, const char *file, FIL static void merge_print_line (bool bold, const struct color **colors, const char *line, const char *p, FILE *stream) { - char *buf = xmalloc (1); + char *buf; + const size_t size = ALLOC_COMPLETE_PART_LINE; char *merged_part_line = NULL; const char *part_line; + buf = xmalloc (size); *buf = '\0'; - complete_part_line (p + 1, &buf, stream); + + complete_part_line (p + 1, &buf, size, stream); if (*buf != '\0') part_line = merged_part_line = str_concat (line, buf); @@ -791,7 +796,7 @@ merge_print_line (bool bold, const struct color **colors, const char *line, cons } static void -complete_part_line (const char *p, char **buf, FILE *stream) +complete_part_line (const char *p, char **buf, size_t size, FILE *stream) { bool got_next_char = false, read_from_stream; char ch; @@ -802,7 +807,7 @@ complete_part_line (const char *p, char **buf, FILE *stream) if (ch == '[') { if (read_from_stream) - save_char (ch, buf, &i); + save_char (ch, buf, &i, &size); } else { @@ -819,7 +824,7 @@ complete_part_line (const char *p, char **buf, FILE *stream) if (isdigit (ch) || ch == ';') { if (read_from_stream) - save_char (ch, buf, &i); + save_char (ch, buf, &i, &size); } else /* read next character */ { @@ -833,7 +838,7 @@ complete_part_line (const char *p, char **buf, FILE *stream) if (ch == 'm') { if (read_from_stream) - save_char (ch, buf, &i); + save_char (ch, buf, &i, &size); } else { @@ -874,9 +879,15 @@ get_next_char (char *ch, const char **p, FILE *stream, bool *read_from_stream) } static void -save_char (char ch, char **buf, unsigned long *i) +save_char (char ch, char **buf, unsigned long *i, size_t *size) { - *buf = xrealloc (*buf, *i + 2); /* +1: size of buf, +1: space for NUL */ + assert (*i < *size); + /* +1: effective occupied size of buffer */ + if ((*i + 1) == *size) + { + *size *= 2; + *buf = xrealloc (*buf, *size); + } (*buf)[*i] = ch; (*buf)[*i + 1] = '\0'; (*i)++; diff --git a/t/merge.t b/t/merge.t index fe73c2b..b5c6dc7 100755 --- a/t/merge.t +++ b/t/merge.t @@ -10,36 +10,37 @@ use Test::More; # sequence, buffer sizes my @merge_success = ( - [ "\e[30m", [ 1..4 ] ], - [ "\e[31m", [ 1..4 ] ], - [ "\e[32m", [ 1..4 ] ], - [ "\e[33m", [ 1..4 ] ], - [ "\e[34m", [ 1..4 ] ], - [ "\e[35m", [ 1..4 ] ], - [ "\e[36m", [ 1..4 ] ], - [ "\e[37m", [ 1..4 ] ], - [ "\e[39m", [ 1..4 ] ], - [ "\e[1;30m", [ 1..6 ] ], - [ "\e[1;31m", [ 1..6 ] ], - [ "\e[1;32m", [ 1..6 ] ], - [ "\e[1;33m", [ 1..6 ] ], - [ "\e[1;34m", [ 1..6 ] ], - [ "\e[1;35m", [ 1..6 ] ], - [ "\e[1;36m", [ 1..6 ] ], - [ "\e[1;37m", [ 1..6 ] ], - [ "\e[1;39m", [ 1..6 ] ], - [ "\e[40m", [ 1..4 ] ], - [ "\e[41m", [ 1..4 ] ], - [ "\e[42m", [ 1..4 ] ], - [ "\e[43m", [ 1..4 ] ], - [ "\e[44m", [ 1..4 ] ], - [ "\e[45m", [ 1..4 ] ], - [ "\e[46m", [ 1..4 ] ], - [ "\e[47m", [ 1..4 ] ], - [ "\e[49m", [ 1..4 ] ], - [ "\e[0m", [ 1..3 ] ], - [ "\e[m", [ 1..2 ] ], - [ "\e[;;m", [ 1..4 ] ], + [ "\e[30m", [ 1..4 ] ], + [ "\e[31m", [ 1..4 ] ], + [ "\e[32m", [ 1..4 ] ], + [ "\e[33m", [ 1..4 ] ], + [ "\e[34m", [ 1..4 ] ], + [ "\e[35m", [ 1..4 ] ], + [ "\e[36m", [ 1..4 ] ], + [ "\e[37m", [ 1..4 ] ], + [ "\e[39m", [ 1..4 ] ], + [ "\e[1;30m", [ 1..6 ] ], + [ "\e[1;31m", [ 1..6 ] ], + [ "\e[1;32m", [ 1..6 ] ], + [ "\e[1;33m", [ 1..6 ] ], + [ "\e[1;34m", [ 1..6 ] ], + [ "\e[1;35m", [ 1..6 ] ], + [ "\e[1;36m", [ 1..6 ] ], + [ "\e[1;37m", [ 1..6 ] ], + [ "\e[1;39m", [ 1..6 ] ], + [ "\e[40m", [ 1..4 ] ], + [ "\e[41m", [ 1..4 ] ], + [ "\e[42m", [ 1..4 ] ], + [ "\e[43m", [ 1..4 ] ], + [ "\e[44m", [ 1..4 ] ], + [ "\e[45m", [ 1..4 ] ], + [ "\e[46m", [ 1..4 ] ], + [ "\e[47m", [ 1..4 ] ], + [ "\e[49m", [ 1..4 ] ], + [ "\e[0m", [ 1..3 ] ], + [ "\e[m", [ 1..2 ] ], + [ "\e[;;m", [ 1..4 ] ], + [ "\e[123456m", [ 1 ] ], # tightly coupled to ALLOC_COMPLETE_PART_LINE ); # sequence, buffer size my @merge_fail = ( -- cgit v1.2.3 From f77dfa416cafc1a9db80349b31e6cb82e7f0491d Mon Sep 17 00:00:00 2001 From: Steven Schubiger Date: Sun, 20 Sep 2015 16:13:11 +0200 Subject: Lazily allocate memory --- colorize.c | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/colorize.c b/colorize.c index 8e37e19..06ef8fb 100644 --- a/colorize.c +++ b/colorize.c @@ -213,7 +213,7 @@ static void process_args (unsigned int, char **, bool *, const struct color **, static void process_file_arg (const char *, const char **, FILE **); static void read_print_stream (bool, const struct color **, const char *, FILE *); static void merge_print_line (bool, const struct color **, const char *, const char *, FILE *); -static void complete_part_line (const char *, char **, size_t, FILE *); +static void complete_part_line (const char *, char **, FILE *); static bool get_next_char (char *, const char **, FILE *, bool *); static void save_char (char, char **, unsigned long *, size_t *); static void find_color_entries (struct color_name **, const struct color **); @@ -769,17 +769,13 @@ read_print_stream (bool bold, const struct color **colors, const char *file, FIL static void merge_print_line (bool bold, const struct color **colors, const char *line, const char *p, FILE *stream) { - char *buf; - const size_t size = ALLOC_COMPLETE_PART_LINE; + char *buf = NULL; char *merged_part_line = NULL; const char *part_line; - buf = xmalloc (size); - *buf = '\0'; + complete_part_line (p + 1, &buf, stream); - complete_part_line (p + 1, &buf, size, stream); - - if (*buf != '\0') + if (buf) part_line = merged_part_line = str_concat (line, buf); else part_line = line; @@ -796,11 +792,12 @@ merge_print_line (bool bold, const struct color **colors, const char *line, cons } static void -complete_part_line (const char *p, char **buf, size_t size, FILE *stream) +complete_part_line (const char *p, char **buf, FILE *stream) { bool got_next_char = false, read_from_stream; char ch; unsigned long i = 0; + size_t size; if (get_next_char (&ch, &p, stream, &read_from_stream)) { @@ -881,9 +878,13 @@ get_next_char (char *ch, const char **p, FILE *stream, bool *read_from_stream) static void save_char (char ch, char **buf, unsigned long *i, size_t *size) { - assert (*i < *size); + if (!*buf) + { + *size = ALLOC_COMPLETE_PART_LINE; + *buf = xmalloc (*size); + } /* +1: effective occupied size of buffer */ - if ((*i + 1) == *size) + else if ((*i + 1) == *size) { *size *= 2; *buf = xrealloc (*buf, *size); -- cgit v1.2.3