&& (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"
-#define VERSION "0.56"
+#define VERSION "0.57"
typedef enum { false, true } bool;
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 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);
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 = NULL;
char *merged_part_line = NULL;
const char *part_line;
- *buf = '\0';
complete_part_line (p + 1, &buf, stream);
- if (*buf != '\0')
+ if (buf)
part_line = merged_part_line = str_concat (line, buf);
else
part_line = line;
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))
{
if (ch == '[')
{
if (read_from_stream)
- save_char (ch, buf, &i);
+ save_char (ch, buf, &i, &size);
}
else
{
if (isdigit (ch) || ch == ';')
{
if (read_from_stream)
- save_char (ch, buf, &i);
+ save_char (ch, buf, &i, &size);
}
else /* read next character */
{
if (ch == 'm')
{
if (read_from_stream)
- save_char (ch, buf, &i);
+ save_char (ch, buf, &i, &size);
}
else
{
}
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 */
+ if (!*buf)
+ {
+ *size = ALLOC_COMPLETE_PART_LINE;
+ *buf = xmalloc (*size);
+ }
+ /* +1: effective occupied size of buffer */
+ else if ((*i + 1) == *size)
+ {
+ *size *= 2;
+ *buf = xrealloc (*buf, *size);
+ }
(*buf)[*i] = ch;
(*buf)[*i + 1] = '\0';
(*i)++;