X-Git-Url: http://git.refcnt.org/?a=blobdiff_plain;f=colorize.c;h=c8786bf90b45524237a467dea74596ef693269b4;hb=a2a5aaf75c6ebf8e6609dd2c7b3ed1c23290db88;hp=c4319331d27e2dbb4ffa3f06f2e52206f1b0945d;hpb=c4524ce6e98aca85c74e53c51494f3e38787480a;p=colorize.git diff --git a/colorize.c b/colorize.c index c431933..c8786bf 100644 --- a/colorize.c +++ b/colorize.c @@ -192,18 +192,20 @@ enum { FMT_ERROR, FMT_FILE, FMT_TYPE, - FMT_CONF + FMT_CONF, + FMT_CONF_FILE }; static const char *formats[] = { - "%s", /* generic */ - "%s '%s'", /* string */ - "%s `%s' %s", /* quote */ - "%s color '%s' %s", /* color */ - "%s color '%s' %s '%s'", /* random */ - "less than %lu bytes %s", /* error */ - "%s: %s", /* file */ - "%s: %s: %s", /* type */ - "%s: option '%s' %s" /* conf */ + "%s", /* generic */ + "%s '%s'", /* string */ + "%s `%s' %s", /* quote */ + "%s color '%s' %s", /* color */ + "%s color '%s' %s '%s'", /* random */ + "less than %lu bytes %s", /* error */ + "%s: %s", /* file */ + "%s: %s: %s", /* type */ + "%s: option '%s' %s", /* conf */ + "config file %s: %s" /* conf file */ }; enum { GENERIC, FOREGROUND = 0, BACKGROUND }; @@ -218,7 +220,7 @@ static const struct { }; static unsigned int opts_set; -enum { +enum opt_set { OPT_ATTR_SET = 0x01, OPT_EXCLUDE_RANDOM_SET = 0x02, OPT_OMIT_COLOR_EMPTY_SET = 0x04 @@ -285,6 +287,7 @@ static const char *program_name; static void print_tstamp (FILE *); #endif static void process_opts (int, char **, char **); +static void conf_file_path (char **); static void process_opt_attr (const char *, const bool); static void write_attr (const struct attr *, unsigned int *, const bool); static void process_opt_exclude_random (const char *, const bool); @@ -380,23 +383,8 @@ main (int argc, char **argv) #elif !defined(TEST) if (conf_file == NULL) { - uid_t uid; - struct passwd *passwd; - size_t size; - - uid = getuid (); - errno = 0; - if ((passwd = getpwuid (uid)) == NULL) - { - if (errno == 0) - vfprintf_diag ("password file entry for uid %lu not found", (unsigned long)uid); - else - perror ("getpwuid"); - exit (EXIT_FAILURE); - } - size = strlen (passwd->pw_dir) + 1 + strlen (CONF_FILE) + 1; - conf_file = xmalloc (size); - snprintf (conf_file, size, "%s/%s", passwd->pw_dir, CONF_FILE); + conf_file_path (&conf_file); + STACK_VAR (conf_file); } else { @@ -406,9 +394,10 @@ main (int argc, char **argv) free (conf_file); conf_file = s; } + STACK_VAR (conf_file); errno = 0; if (access (conf_file, F_OK) == -1) - vfprintf_fail (formats[FMT_FILE], conf_file, strerror (errno)); + vfprintf_fail (formats[FMT_CONF_FILE], conf_file, strerror (errno)); } #endif #if defined(CONF_FILE_TEST) || !defined(TEST) @@ -416,7 +405,7 @@ main (int argc, char **argv) parse_conf (conf_file, &config); #endif #if !defined(CONF_FILE_TEST) && !defined(TEST) - free (conf_file); + RELEASE_VAR (conf_file); #endif init_conf_vars (&config); @@ -429,14 +418,21 @@ main (int argc, char **argv) if (clean && clean_all) vfprintf_fail (formats[FMT_GENERIC], "--clean and --clean-all switch are mutually exclusive"); if (arg_cnt > 1) - { - const char *const format = "%s %s"; - const char *const message = "switch cannot be used with more than one file"; - if (clean) - vfprintf_fail (format, "--clean", message); - else if (clean_all) - vfprintf_fail (format, "--clean-all", message); - } + vfprintf_fail ("--clean%s switch cannot be used with more than one file", clean_all ? "-all" : ""); + { + unsigned int i; + const struct option_set { + const char *option; + enum opt_set set; + } options[] = { + { "attr", OPT_ATTR_SET }, + { "exclude-random", OPT_EXCLUDE_RANDOM_SET }, + { "omit-color-empty", OPT_OMIT_COLOR_EMPTY_SET }, + }; + for (i = 0; i < COUNT_OF (options, struct option_set); i++) + if (opts_set & options[i].set) + vfprintf_diag ("--%s switch has no meaning with --clean%s", options[i].option, clean_all ? "-all" : ""); + } } else { @@ -516,6 +512,7 @@ process_opts (int argc, char **argv, char **conf_file) case OPT_ATTR: opts_set |= OPT_ATTR_SET; opts_arg.attr = xstrdup (optarg); + STACK_VAR (opts_arg.attr); break; case OPT_CLEAN: clean = true; @@ -528,6 +525,7 @@ process_opts (int argc, char **argv, char **conf_file) case OPT_EXCLUDE_RANDOM: opts_set |= OPT_EXCLUDE_RANDOM_SET; opts_arg.exclude_random = xstrdup (optarg); + STACK_VAR (opts_arg.exclude_random); break; case OPT_OMIT_COLOR_EMPTY: opts_set |= OPT_OMIT_COLOR_EMPTY_SET; @@ -555,6 +553,31 @@ process_opts (int argc, char **argv, char **conf_file) } } +static void +conf_file_path (char **conf_file) +{ + char *path; + uid_t uid; + struct passwd *passwd; + size_t size; + + uid = getuid (); + errno = 0; + if ((passwd = getpwuid (uid)) == NULL) + { + if (errno == 0) + vfprintf_diag ("password file entry for uid %lu not found", (unsigned long)uid); + else + perror ("getpwuid"); + exit (EXIT_FAILURE); + } + size = strlen (passwd->pw_dir) + 1 + strlen (CONF_FILE) + 1; + path = xmalloc (size); + snprintf (path, size, "%s/%s", passwd->pw_dir, CONF_FILE); + + *conf_file = path; +} + static void process_opt_attr (const char *p, const bool is_opt) { @@ -658,8 +681,8 @@ init_opts_vars (void) if (opts_set & OPT_OMIT_COLOR_EMPTY_SET) omit_color_empty = true; - free (opts_arg.attr); - free (opts_arg.exclude_random); + RELEASE_VAR (opts_arg.attr); + RELEASE_VAR (opts_arg.exclude_random); } #define IS_SPACE(c) ((c) == ' ' || (c) == '\t') @@ -734,18 +757,20 @@ parse_conf (const char *conf_file, struct conf *config) /* save option name */ cfg = xstrdup (opt); + STACK_VAR (cfg); /* save option value (allow empty ones) */ val = strlen (value) ? xstrdup (value) : NULL; + STACK_VAR (val); assign_conf (conf_file, config, cfg, val); - free (cfg); + RELEASE_VAR (cfg); } fclose (conf); } #define ASSIGN_CONF(str,val) do { \ - free (str); \ + RELEASE_VAR (str); \ str = val; \ } while (false) @@ -939,10 +964,10 @@ free_color_names (struct color_name **color_names) static void free_conf (struct conf *config) { - free (config->attr); - free (config->color); - free (config->exclude_random); - free (config->omit_color_empty); + RELEASE_VAR (config->attr); + RELEASE_VAR (config->color); + RELEASE_VAR (config->exclude_random); + RELEASE_VAR (config->omit_color_empty); } static void