}
#endif
+#define DUP_CONFIG() \
+ *conf_file = xstrdup (optarg); \
+ break;
+
#define PRINT_HELP_EXIT() \
print_help (); \
exit (EXIT_SUCCESS);
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)
{
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);
ABORT_TRACE ();
}
break;
+ case 'c':
+ DUP_CONFIG ();
case 'h':
PRINT_HELP_EXIT ();
case 'V':
}
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
static void
parse_conf (const char *conf_file, struct conf *config)
{
+ unsigned int cnt = 0;
char line[256 + 1];
FILE *conf;
char *assign, *comment, *opt, *value;
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 exceeds maximum of %u characters", conf_file, (unsigned int)(sizeof (line) - 2));
- if ((p = strrchr (line, '\n')))
+ vfprintf_fail ("%s: line %u exceeds maximum of %u characters", conf_file, cnt, (unsigned int)(sizeof (line) - 2));
+ if ((p = strpbrk (line, "\n\r")))
*p = '\0';
/* NAME PARSING (start) */
p = line;
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;
};
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 },
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);
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;
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;
break;
case BACKGROUND:
vfprintf_fail (formats[FMT_COLOR], tables[BACKGROUND].desc, color, "cannot be bold");
+ break;
default: /* never reached */
ABORT_TRACE ();
}