aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGravatar Steven Schubiger <stsc@refcnt.org> 2015-09-20 16:13:11 +0200
committerGravatar Steven Schubiger <stsc@refcnt.org> 2015-09-20 16:13:11 +0200
commitf77dfa416cafc1a9db80349b31e6cb82e7f0491d (patch)
tree18c7f55a23e8c53cbbcbc3270b5973b1c483472c
parent6863ca2831b26c73b091e5e4b4215f5112ed2362 (diff)
downloadcolorize-f77dfa416cafc1a9db80349b31e6cb82e7f0491d.tar.gz
colorize-f77dfa416cafc1a9db80349b31e6cb82e7f0491d.tar.bz2
Lazily allocate memory
-rw-r--r--colorize.c23
1 files 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);