X-Git-Url: http://git.refcnt.org/?a=blobdiff_plain;f=colorize.c;h=189040b0dc74f7fae203430f6b7b511c3e2a123d;hb=d00039e462c0a8720d6e19ee599d1eba046d1a5f;hp=bf7e3d6f1038bb1b42fc46bc2b91bf79c2f21e8e;hpb=31de42f6348099f80017e1b35abb407db01e6559;p=colorize.git diff --git a/colorize.c b/colorize.c index bf7e3d6..189040b 100644 --- a/colorize.c +++ b/colorize.c @@ -488,6 +488,10 @@ print_tstamp (FILE *log) } #endif +#define DUP_CONFIG() \ + *conf_file = xstrdup (optarg); \ + break; + #define PRINT_HELP_EXIT() \ print_help (); \ exit (EXIT_SUCCESS); @@ -502,7 +506,7 @@ static void process_opts (int argc, char **argv, char **conf_file) { int opt; - while ((opt = getopt_long (argc, argv, "hV", long_opts, NULL)) != -1) + while ((opt = getopt_long (argc, argv, "c:hV", long_opts, NULL)) != -1) { switch (opt) { @@ -520,8 +524,7 @@ process_opts (int argc, char **argv, char **conf_file) clean_all = true; break; case OPT_CONFIG: - *conf_file = xstrdup (optarg); - break; + DUP_CONFIG (); case OPT_EXCLUDE_RANDOM: opts_set |= OPT_EXCLUDE_RANDOM_SET; opts_arg.exclude_random = xstrdup (optarg); @@ -537,6 +540,8 @@ process_opts (int argc, char **argv, char **conf_file) ABORT_TRACE (); } break; + case 'c': + DUP_CONFIG (); case 'h': PRINT_HELP_EXIT (); case 'V': @@ -638,7 +643,7 @@ process_opt_exclude_random (const char *s, const bool is_opt) } if (!valid) vfprintf_fail ("%s must be provided a plain color", - is_opt ? "--exlude-random switch" : "exclude-random conf option"); + is_opt ? "--exclude-random switch" : "exclude-random conf option"); } static void @@ -676,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; @@ -691,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; @@ -799,7 +806,7 @@ print_help (void) }; const struct opt_data opts_data[] = { { "attr", NULL, "=ATTR1,ATTR2,..." }, - { "config", NULL, "=PATH" }, + { "config", "c", "=PATH" }, { "exclude-random", NULL, "=COLOR" }, { "help", "h", NULL }, { "version", "V", NULL }, @@ -839,9 +846,12 @@ print_help (void) if (opt_data) { if (opt_data->short_opt) - printf ("\t\t-%s, --%s\n", opt_data->short_opt, opt->name); + printf ("\t\t-%s, --%s", opt_data->short_opt, opt->name); else - printf ("\t\t --%s%s\n", opt->name, opt_data->arg); + printf ("\t\t --%s", opt->name); + if (opt_data->arg) + printf ("%s", opt_data->arg); + printf ("\n"); } else printf ("\t\t --%s\n", opt->name); @@ -946,7 +956,7 @@ free_conf (struct conf *config) static void process_args (unsigned int arg_cnt, char **arg_strings, char *attr, const struct color **colors, const char **file, FILE **stream, struct conf *config) { - bool use_conf_color; + bool has_hyphen, use_conf_color; int ret; char *p; struct stat sb; @@ -961,23 +971,27 @@ process_args (unsigned int arg_cnt, char **arg_strings, char *attr, const struct assert (color_string != NULL); - if (streq (color_string, "-")) + has_hyphen = streq (color_string, "-"); + + if (has_hyphen) { if (file_string) vfprintf_fail (formats[FMT_GENERIC], "hyphen cannot be used as color string"); - else + else if (!config->color) vfprintf_fail (formats[FMT_GENERIC], "hyphen must be preceded by color string"); } - if ((ret = lstat (color_string, &sb)) == 0) /* exists */ + if (!has_hyphen && (ret = lstat (color_string, &sb)) == 0) /* exists */ /* Ensure that we don't fail if there's a file with one or more color names in its path. */ use_conf_color = skip_path_colors (color_string, file_string, &sb, !!config->color); + else if (has_hyphen) + use_conf_color = true; + else + use_conf_color = false; /* Use color from config file. */ - if (arg_cnt == 1 - && (access (color_string, F_OK) != -1) - && use_conf_color) + if (arg_cnt == 1 && use_conf_color) { file_string = color_string; color_string = config->color; @@ -1160,6 +1174,7 @@ gather_color_names (const char *color_string, char *attr, struct color_name **co break; case BACKGROUND: vfprintf_fail (formats[FMT_COLOR], tables[BACKGROUND].desc, color, "cannot be bold"); + break; default: /* never reached */ ABORT_TRACE (); }