X-Git-Url: http://git.refcnt.org/?a=blobdiff_plain;f=colorize.c;h=fc23d8bd720411c92383f64039235a6a6b308f8e;hb=dbbbe0626872bd88a0262a8545b81a1b5eeceaa4;hp=06ef8fba68707d2a477c0b3042756282b42c664c;hpb=f77dfa416cafc1a9db80349b31e6cb82e7f0491d;p=colorize.git diff --git a/colorize.c b/colorize.c index 06ef8fb..fc23d8b 100644 --- a/colorize.c +++ b/colorize.c @@ -110,7 +110,7 @@ #define DEBUG_FILE "debug.txt" -#define VERSION "0.56" +#define VERSION "0.57" typedef enum { false, true } bool; @@ -211,11 +211,13 @@ static void cleanup (void); 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 skip_path_colors (const char *, const char *, const struct stat *); +static void gather_color_names (const char *, bool *, struct color_name **); 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 long *, size_t *); +static void save_char (char, char **, size_t *, 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); @@ -257,7 +259,7 @@ extern int optind; int main (int argc, char **argv) { - unsigned int arg_cnt = 0; + unsigned int arg_cnt; bool bold = false; @@ -493,9 +495,7 @@ cleanup (void) { unsigned int i; for (i = 0; i < stacked_vars; i++) - if (vars_list[i]) - free (vars_list[i]); - + free (vars_list[i]); free_null (vars_list); } } @@ -516,8 +516,7 @@ static void process_args (unsigned int arg_cnt, char **arg_strings, bool *bold, const struct color **colors, const char **file, FILE **stream) { int ret; - unsigned int index; - char *color, *p, *str; + char *p; struct stat sb; const char *color_string = arg_cnt >= 1 ? arg_strings[0] : NULL; @@ -538,53 +537,7 @@ process_args (unsigned int arg_cnt, char **arg_strings, bool *bold, const struct /* Ensure that we don't fail if there's a file with one or more color names in its path. */ if (ret == 0) /* success */ - { - bool have_file; - unsigned int c; - const char *color = color_string; - const mode_t mode = sb.st_mode; - - for (c = 1; c <= 2 && *color; c++) - { - bool matched = false; - unsigned int i; - for (i = 0; i < tables[FOREGROUND].count; i++) - { - const struct color *entry = &tables[FOREGROUND].entries[i]; - if (has_color_name (color, entry->name)) - { - color += strlen (entry->name); - matched = true; - break; - } - } - if (!matched && has_color_name (color, "random")) - { - color += strlen ("random"); - matched = true; - } - if (matched && *color == COLOR_SEP_CHAR && *(color + 1)) - color++; - else - break; - } - - have_file = (*color != '\0'); - - if (have_file) - { - const char *file_exists = color_string; - if (file_string) - vfprintf_fail (formats[FMT_QUOTE], get_file_type (mode), file_exists, "cannot be used as color string"); - else - { - if (VALID_FILE_TYPE (mode)) - vfprintf_fail (formats[FMT_QUOTE], get_file_type (mode), file_exists, "must be preceeded by color string"); - else - vfprintf_fail (formats[FMT_QUOTE], get_file_type (mode), file_exists, "is not a valid file type"); - } - } - } + skip_path_colors (color_string, file_string, &sb); if ((p = strchr (color_string, COLOR_SEP_CHAR))) { @@ -596,59 +549,7 @@ process_args (unsigned int arg_cnt, char **arg_strings, bool *bold, const struct vfprintf_fail (formats[FMT_STRING], "one color pair allowed only for string", color_string); } - str = xstrdup (color_string); - STACK_VAR (str); - - for (index = 0, color = str; *color; index++, color = p) - { - char *ch, *sep; - - p = NULL; - if ((sep = strchr (color, COLOR_SEP_CHAR))) - { - *sep = '\0'; - p = sep + 1; - } - else - p = color + strlen (color); - assert (p); - - for (ch = color; *ch; ch++) - if (!isalpha (*ch)) - vfprintf_fail (formats[FMT_COLOR], tables[index].desc, color, "cannot be made of non-alphabetic characters"); - - for (ch = color + 1; *ch; ch++) - if (!islower (*ch)) - vfprintf_fail (formats[FMT_COLOR], tables[index].desc, color, "cannot be in mixed lower/upper case"); - - if (streq (color, "None")) - vfprintf_fail (formats[FMT_COLOR], tables[index].desc, color, "cannot be bold"); - - if (isupper (*color)) - { - switch (index) - { - case FOREGROUND: - *bold = true; - break; - case BACKGROUND: - vfprintf_fail (formats[FMT_COLOR], tables[BACKGROUND].desc, color, "cannot be bold"); - default: /* never reached */ - ABORT_TRACE (); - } - } - - color_names[index] = xcalloc (1, sizeof (struct color_name)); - - color_names[index]->orig = xstrdup (color); - - for (ch = color; *ch; ch++) - *ch = tolower (*ch); - - color_names[index]->name = xstrdup (color); - } - - RELEASE_VAR (str); + gather_color_names (color_string, bold, color_names); assert (color_names[FOREGROUND]); @@ -715,6 +616,117 @@ process_file_arg (const char *file_string, const char **file, FILE **stream) assert (*file); } +static void +skip_path_colors (const char *color_string, const char *file_string, const struct stat *sb) +{ + bool have_file; + unsigned int c; + const char *color = color_string; + const mode_t mode = sb->st_mode; + + for (c = 1; c <= 2 && *color; c++) + { + bool matched = false; + unsigned int i; + for (i = 0; i < tables[FOREGROUND].count; i++) + { + const struct color *entry = &tables[FOREGROUND].entries[i]; + if (has_color_name (color, entry->name)) + { + color += strlen (entry->name); + matched = true; + break; + } + } + if (!matched && has_color_name (color, "random")) + { + color += strlen ("random"); + matched = true; + } + if (matched && *color == COLOR_SEP_CHAR && *(color + 1)) + color++; + else + break; + } + + have_file = (*color != '\0'); + + if (have_file) + { + const char *file_exists = color_string; + if (file_string) + vfprintf_fail (formats[FMT_QUOTE], get_file_type (mode), file_exists, "cannot be used as color string"); + else + { + if (VALID_FILE_TYPE (mode)) + vfprintf_fail (formats[FMT_QUOTE], get_file_type (mode), file_exists, "must be preceeded by color string"); + else + vfprintf_fail (formats[FMT_QUOTE], get_file_type (mode), file_exists, "is not a valid file type"); + } + } +} + +static void +gather_color_names (const char *color_string, bool *bold, struct color_name **color_names) +{ + unsigned int index; + char *color, *p, *str; + + str = xstrdup (color_string); + STACK_VAR (str); + + for (index = 0, color = str; *color; index++, color = p) + { + char *ch, *sep; + + p = NULL; + if ((sep = strchr (color, COLOR_SEP_CHAR))) + { + *sep = '\0'; + p = sep + 1; + } + else + p = color + strlen (color); + assert (p); + + for (ch = color; *ch; ch++) + if (!isalpha (*ch)) + vfprintf_fail (formats[FMT_COLOR], tables[index].desc, color, "cannot be made of non-alphabetic characters"); + + for (ch = color + 1; *ch; ch++) + if (!islower (*ch)) + vfprintf_fail (formats[FMT_COLOR], tables[index].desc, color, "cannot be in mixed lower/upper case"); + + if (streq (color, "None")) + vfprintf_fail (formats[FMT_COLOR], tables[index].desc, color, "cannot be bold"); + + if (isupper (*color)) + { + switch (index) + { + case FOREGROUND: + *bold = true; + break; + case BACKGROUND: + vfprintf_fail (formats[FMT_COLOR], tables[BACKGROUND].desc, color, "cannot be bold"); + default: /* never reached */ + ABORT_TRACE (); + } + } + + color_names[index] = xcalloc (1, sizeof (struct color_name)); + + color_names[index]->orig = xstrdup (color); + + for (ch = color; *ch; ch++) + *ch = tolower (*ch); + + color_names[index]->name = xstrdup (color); + } + + RELEASE_VAR (str); +} + static void read_print_stream (bool bold, const struct color **colors, const char *file, FILE *stream) { @@ -783,8 +795,8 @@ merge_print_line (bool bold, const struct color **colors, const char *line, cons #ifdef TEST_MERGE_PART_LINE printf ("%s", part_line); - free (merged_part_line); - exit (EXIT_SUCCESS); + fflush (stdout); + _exit (EXIT_SUCCESS); #else print_line (bold, colors, part_line, 0); free (merged_part_line); @@ -796,8 +808,7 @@ 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; + size_t i = 0, size; if (get_next_char (&ch, &p, stream, &read_from_stream)) { @@ -876,7 +887,7 @@ 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) +save_char (char ch, char **buf, size_t *i, size_t *size) { if (!*buf) {