X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Flibcore%2Flc_opts.c;h=665398acf9d5866516f4862d5a5fe1b82f1bee47;hb=bd019d8cd785c1a433c19dee44bf3f9e82397286;hp=08ba076b524b4e5523348224cec8bc3bc9f0903b;hpb=cfc7f9e2006fd93ed64399307b2b8728b03e4ec7;p=libfirm diff --git a/ir/libcore/lc_opts.c b/ir/libcore/lc_opts.c index 08ba076b5..665398acf 100644 --- a/ir/libcore/lc_opts.c +++ b/ir/libcore/lc_opts.c @@ -16,51 +16,28 @@ License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ -#ifdef HAVE_CONFIG_H #include "config.h" -#endif #include #include +#include #include #include -#if defined(__FreeBSD__) -#include -#elif defined(_WIN32) -#include -#else -#include -#endif - -/* Includes to determine user's home directory */ -#ifdef _WIN32 -#include -#else -#include -#include -#include -#endif - -/* maximum length of a path. */ -#ifndef MAX_PATH -#define MAX_PATH 2048 -#endif - - -#include "lc_common_t.h" #include "lc_opts_t.h" #include "lc_opts_enum.h" -#include "lc_parser_t.h" #include "hashptr.h" #include "lc_printf.h" +#include "util.h" +#include "xmalloc.h" +#include "obst.h" #define ERR_STRING "In argument \"%s\": " #define OPT_DELIM '-' -#define HELP_TEMPL "%-15s %-10s %-45s" -#define HELP_TEMPL_VALS HELP_TEMPL " [%s] (%s)" +#define HELP_TEMPL "%-15s %-10s %-45s" +#define HELP_TEMPL_VALS HELP_TEMPL " [%s] (%s)" static struct obstack obst; @@ -77,7 +54,7 @@ static void set_name(lc_opt_entry_t *ent, const char *name) static lc_opt_err_info_t *set_error(lc_opt_err_info_t *err, int error, const char *arg) { - if(err) { + if (err) { err->error = error; err->msg = ""; err->arg = arg; @@ -93,9 +70,9 @@ int lc_opt_raise_error(const lc_opt_err_info_t *err, lc_opt_error_handler_t *han int res = 0; va_start(args, fmt); - if(err && lc_opt_is_error(err)) { + if (err && lc_opt_is_error(err)) { res = 1; - if(handler) { + if (handler) { char buf[256]; vsnprintf(buf, sizeof(buf), fmt, args); handler(buf, err); @@ -113,9 +90,9 @@ static lc_opt_entry_t *init_entry(lc_opt_entry_t *ent, lc_opt_entry_t *parent, const char *copied_desc; obstack_grow0(&obst, name, strlen(name)); - copied_name = obstack_finish(&obst); + copied_name = (char*)obstack_finish(&obst); obstack_grow0(&obst, desc, strlen(desc)); - copied_desc = obstack_finish(&obst); + copied_desc = (char*)obstack_finish(&obst); memset(ent, 0, sizeof(*ent)); set_name(ent, copied_name); @@ -131,9 +108,9 @@ static lc_opt_entry_t *init_grp(lc_opt_entry_t *ent, lc_opt_err_info_t *err) INIT_LIST_HEAD(&ent->v.grp.opts); set_error(err, lc_opt_err_none, ""); - if(ent->parent) { - if(ent->parent->is_grp) - list_add(&ent->list, &lc_get_grp_special(ent->parent)->grps); + if (ent->parent) { + if (ent->parent->is_grp) + list_add_tail(&ent->list, &lc_get_grp_special(ent->parent)->grps); else set_error(err, lc_opt_err_grp_expected, ent->parent->name); } @@ -153,14 +130,14 @@ static lc_opt_entry_t *init_opt(lc_opt_entry_t *ent, ent->is_grp = 0; set_error(err, lc_opt_err_none, ""); - list_add(&ent->list, &lc_get_grp_special(ent->parent)->opts); + list_add_tail(&ent->list, &lc_get_grp_special(ent->parent)->opts); - s->type = type; - s->value = val; - s->cb = cb; + s->type = type; + s->value = val; + s->cb = cb; s->dump = dump; s->dump_vals = dump_vals; - s->length = length; + s->length = length; return ent; } @@ -171,7 +148,7 @@ lc_opt_entry_t *lc_opt_root_grp(void) static lc_opt_entry_t root_group; static int inited = 0; - if(!inited) { + if (!inited) { obstack_init(&obst); inited = 1; @@ -192,7 +169,7 @@ static const char *get_type_name(lc_opt_type_t type) const char *res; #define XXX(t) case lc_opt_type_ ## t: res = #t; break - switch(type) { + switch (type) { XXX(enum); XXX(bit); XXX(int); @@ -214,16 +191,12 @@ const char *lc_opt_get_type_name(const lc_opt_entry_t *ent) return get_type_name(lc_get_opt_special(ent)->type); } - -lc_opt_entry_t *lc_opt_find_grp(const lc_opt_entry_t *grp, const char *name, lc_opt_err_info_t *err); -lc_opt_entry_t *lc_opt_find_opt(const lc_opt_entry_t *grp, const char *name, lc_opt_err_info_t *err); - lc_opt_entry_t *lc_opt_get_grp(lc_opt_entry_t *parent, const char *name) { lc_opt_entry_t *ent = lc_opt_find_grp(parent, name, NULL); - if(!ent) { - ent = obstack_alloc(&obst, sizeof(*ent)); + if (!ent) { + ent = OALLOC(&obst, lc_opt_entry_t); init_entry(ent, parent, name, ""); init_grp(ent, NULL); } @@ -240,11 +213,11 @@ lc_opt_entry_t *lc_opt_add_opt(lc_opt_entry_t *parent, { lc_opt_entry_t *res = NULL; - if(parent->is_grp) { + if (parent->is_grp) { lc_opt_entry_t *ent = lc_opt_find_opt(parent, name, NULL); - if(!ent) { - res = obstack_alloc(&obst, sizeof(*ent)); + if (!ent) { + res = OALLOC(&obst, lc_opt_entry_t); init_entry(res, parent, name, desc); init_opt(res, type, value, length, cb, dump, dump_vals, err); } else @@ -263,9 +236,9 @@ static lc_opt_entry_t *lc_opt_find_ent(const struct list_head *head, const char int error = error_to_use; unsigned hash = HASH_STR(name, strlen(name)); - if(!list_empty(head)) { + if (!list_empty(head)) { list_for_each_entry(lc_opt_entry_t, ent, head, list) { - if(entry_matches(ent, hash, name)) { + if (entry_matches(ent, hash, name)) { error = lc_opt_err_none; found = ent; break; @@ -294,7 +267,7 @@ static const lc_opt_entry_t *resolve_up_to_last(const lc_opt_entry_t *root, { lc_opt_entry_t *ent; - if(pos == n) + if (pos == n) return root; ent = lc_opt_find_grp(root, names[pos], err); @@ -311,12 +284,12 @@ static lc_opt_entry_t *resolve_up_to_last_str_rec(lc_opt_entry_t *from, lc_opt_entry_t *res = from; size_t end = strcspn(path, path_delim); - if(path[end] != '\0') { + if (path[end] != '\0') { /* skip all delimiters */ size_t next = strspn(path + end, path_delim); /* copy the part of the path into a buffer */ - char *buf = malloc((end+1) * sizeof(buf[0])); + char *buf = (char*)malloc((end+1) * sizeof(buf[0])); strncpy(buf, path, end); buf[end] = '\0'; @@ -327,7 +300,7 @@ static lc_opt_entry_t *resolve_up_to_last_str_rec(lc_opt_entry_t *from, res = resolve_up_to_last_str_rec(from, path + end + next, last_name); } - else if(last_name != NULL) { + else if (last_name != NULL) { *last_name = path; } @@ -339,7 +312,7 @@ static lc_opt_entry_t *resolve_up_to_last_str(lc_opt_entry_t *root, const char * size_t next = strspn(path, path_delim); /* if l != 0 we saw deliminators, so we resolve from the root */ - if(next > 0) + if (next > 0) root = lc_opt_root_grp(); return resolve_up_to_last_str_rec(root, path + next, last_name); @@ -362,36 +335,37 @@ lc_opt_entry_t *lc_opt_resolve_opt(const lc_opt_entry_t *root, static char *strtolower(char *buf, size_t n, const char *str) { unsigned i; - for(i = 0; i < n; ++i) - buf[i] = tolower(str[i]); + for (i = 0; i < n; ++i) + buf[i] = tolower((unsigned char)str[i]); return buf; } -int lc_opt_std_cb(UNUSED(const char *name), lc_opt_type_t type, void *data, size_t length, ...) +int lc_opt_std_cb(const char *name, lc_opt_type_t type, void *data, size_t length, ...) { va_list args; int res = 0; int integer; + (void) name; va_start(args, length); - if(data) { + if (data) { res = 1; - switch(type) { + switch (type) { case lc_opt_type_bit: integer = va_arg(args, int); - if(integer) - *((int *) data) |= length; + if (integer) + *(unsigned*)data |= length; else - *((int *) data) &= ~length; + *(unsigned*)data &= ~length; break; case lc_opt_type_negbit: integer = va_arg(args, int); - if(integer) - *((int *) data) &= ~length; + if (integer) + *(unsigned*)data &= ~length; else - *((int *) data) |= length; + *(unsigned*)data |= length; break; case lc_opt_type_boolean: @@ -403,7 +377,7 @@ int lc_opt_std_cb(UNUSED(const char *name), lc_opt_type_t type, void *data, size break; case lc_opt_type_string: - strncpy(data, va_arg(args, const char *), length); + strncpy((char*)data, va_arg(args, const char *), length); break; case lc_opt_type_int: @@ -422,22 +396,24 @@ int lc_opt_std_cb(UNUSED(const char *name), lc_opt_type_t type, void *data, size return res; } -int lc_opt_std_dump(char *buf, size_t n, UNUSED(const char *name), lc_opt_type_t type, void *data, UNUSED(size_t length)) +int lc_opt_std_dump(char *buf, size_t n, const char *name, lc_opt_type_t type, void *data, size_t length) { int res; + (void) name; + (void) length; - if(data) { - switch(type) { + if (data) { + switch (type) { case lc_opt_type_bit: case lc_opt_type_negbit: - res = snprintf(buf, n, "%x", *((int *) data)); + res = snprintf(buf, n, "%x", *((unsigned *) data)); break; case lc_opt_type_boolean: case lc_opt_type_negboolean: res = snprintf(buf, n, "%s", *((int *) data) ? "true" : "false"); break; case lc_opt_type_string: - strncpy(buf, data, n); + strncpy(buf, (const char*)data, n); res = n; break; case lc_opt_type_int: @@ -460,8 +436,12 @@ int lc_opt_std_dump(char *buf, size_t n, UNUSED(const char *name), lc_opt_type_t return res; } -int lc_opt_bool_dump_vals(char *buf, size_t n, UNUSED(const char *name), UNUSED(lc_opt_type_t type), UNUSED(void *data), UNUSED(size_t length)) +int lc_opt_bool_dump_vals(char *buf, size_t n, const char *name, lc_opt_type_t type, void *data, size_t length) { + (void) name; + (void) type; + (void) data; + (void) length; strncpy(buf, "true, false", n); return n; } @@ -491,21 +471,21 @@ int lc_opt_occurs(lc_opt_entry_t *opt, const char *value, lc_opt_err_info_t *err double dbl; } val_storage, *val = &val_storage; - if(!opt) { + if (!opt) { set_error(err, lc_opt_err_opt_not_found, ""); return 0; } - if(!s->cb) { + if (!s->cb) { set_error(err, lc_opt_err_no_callback, ""); return 0; } s->is_set = 1; - switch(s->type) { + switch (s->type) { case lc_opt_type_int: - if(sscanf(value, "%i", (int *) val)) { + if (sscanf(value, "%i", (int *) val)) { error = lc_opt_err_unknown_value; if (s->cb(opt->name, s->type, s->value, s->length, val->integer)) error = lc_opt_err_none; @@ -513,7 +493,7 @@ int lc_opt_occurs(lc_opt_entry_t *opt, const char *value, lc_opt_err_info_t *err break; case lc_opt_type_double: - if(sscanf(value, "%lf", (double *) val)) { + if (sscanf(value, "%lf", (double *) val)) { error = lc_opt_err_unknown_value; if (s->cb(opt->name, s->type, s->value, s->length, val->dbl)) error = lc_opt_err_none; @@ -525,8 +505,8 @@ int lc_opt_occurs(lc_opt_entry_t *opt, const char *value, lc_opt_err_info_t *err case lc_opt_type_bit: case lc_opt_type_negbit: strtolower(buf, sizeof(buf), value); - for(i = 0; i < LC_ARRSIZE(bool_strings); ++i) { - if(strcmp(buf, bool_strings[i].str) == 0) { + for (i = 0; i < ARRAY_SIZE(bool_strings); ++i) { + if (strcmp(buf, bool_strings[i].str) == 0) { val->integer = bool_strings[i].val; error = lc_opt_err_none; break; @@ -547,6 +527,8 @@ int lc_opt_occurs(lc_opt_entry_t *opt, const char *value, lc_opt_err_info_t *err if (s->cb(opt->name, s->type, s->value, s->length, value)) error = lc_opt_err_none; break; + case lc_opt_type_invalid: + abort(); } set_error(err, error, value); @@ -556,7 +538,7 @@ int lc_opt_occurs(lc_opt_entry_t *opt, const char *value, lc_opt_err_info_t *err char *lc_opt_value_to_string(char *buf, size_t len, const lc_opt_entry_t *ent) { const lc_opt_special_t *s = lc_get_opt_special(ent); - if(s->dump) + if (s->dump) s->dump(buf, len, ent->name, s->type, s->value, s->length); else strncpy(buf, "", len); @@ -564,29 +546,27 @@ char *lc_opt_value_to_string(char *buf, size_t len, const lc_opt_entry_t *ent) return buf; } -char *lc_opt_values_to_string(char *buf, size_t len, const lc_opt_entry_t *ent) +static char *lc_opt_values_to_string(char *buf, size_t len, const lc_opt_entry_t *ent) { const lc_opt_special_t *s = lc_get_opt_special(ent); - if(s->dump_vals) + if (s->dump_vals) s->dump_vals(buf, len, ent->name, s->type, s->value, s->length); return buf; } -static lc_opt_entry_t *resolve_up_to_last_str(lc_opt_entry_t *root, const char *path, const char **last_name); - int lc_opt_add_table(lc_opt_entry_t *root, const lc_opt_table_entry_t *table) { int i, res = 0; lc_opt_err_info_t err; - for(i = 0; table[i].name != NULL; ++i) { + for (i = 0; table[i].name != NULL; ++i) { const char *name; const lc_opt_table_entry_t *tab = &table[i]; lc_opt_entry_t *grp = resolve_up_to_last_str(root, tab->name, &name); lc_opt_add_opt(grp, name, tab->desc, tab->type, tab->value, tab->len, tab->cb, tab->dump, tab->dump_vals, &err); - if(err.error != lc_opt_err_none) + if (err.error != lc_opt_err_none) res = 1; } @@ -607,7 +587,7 @@ static void lc_opt_print_grp_path_rec(char *buf, size_t len, const lc_opt_entry_ } } - strncat(buf, ent->name, len); + strncat(buf, ent->name, len-1); } static char *lc_opt_print_grp_path(char *buf, size_t len, const lc_opt_entry_t *ent, char separator, lc_opt_entry_t *stop_ent) @@ -630,10 +610,10 @@ static void lc_opt_print_help_rec(lc_opt_entry_t *ent, char separator, lc_opt_en lc_grp_special_t *s = lc_get_grp_special(ent); char grp_name[512]; char value[256]; - char values[256]; + char values[512]; lc_opt_entry_t *e; - if(!list_empty(&s->opts)) { + if (!list_empty(&s->opts)) { lc_opt_print_grp_path(grp_name, sizeof(grp_name), ent, separator, stop_ent); fputc('\n', f); if (grp_name[0]) @@ -670,7 +650,7 @@ void lc_opt_print_help_for_entry(lc_opt_entry_t *ent, char separator, FILE *f) static void indent(FILE *f, int n) { int i; - for(i = 0; i < n; ++i) + for (i = 0; i < n; ++i) fputc(' ', f); } @@ -688,7 +668,7 @@ static void lc_opt_print_tree_grp_indent(lc_opt_entry_t *ent, FILE *f, int level { lc_grp_special_t *s; - if(ent->is_grp) { + if (ent->is_grp) { lc_opt_entry_t *e; s = lc_get_grp_special(ent); @@ -710,12 +690,10 @@ void lc_opt_print_tree(lc_opt_entry_t *ent, FILE *f) lc_opt_print_tree_grp_indent(ent, f, 0); } - -void lc_opt_from_file(const char *filename, FILE *f, lc_opt_error_handler_t *handler) +static int lc_opts_default_error_handler(const char *prefix, const lc_opt_err_info_t *err) { - PMANGLE(in) = f; - lc_opt_init_parser(filename, handler); - PMANGLE(parse)(); + fprintf(stderr, "%s: %s; %s\n", prefix, err->msg, err->arg); + return 0; } int lc_opt_from_single_arg(const lc_opt_entry_t *root, @@ -723,57 +701,34 @@ int lc_opt_from_single_arg(const lc_opt_entry_t *root, const char *arg, lc_opt_error_handler_t *handler) { const lc_opt_entry_t *grp = root; - int n = strlen(arg); - int n_prefix = opt_prefix ? strlen(opt_prefix) : 0; + size_t n = strlen(arg); + size_t n_prefix = opt_prefix ? strlen(opt_prefix) : 0; int error = 0; int ret = 0; lc_opt_err_info_t err; - char *end, *buf, *eqsign; + const char *end, *eqsign; - if(n >= n_prefix && strncmp(opt_prefix, arg, n_prefix) == 0) { + if (n >= n_prefix && strncmp(opt_prefix, arg, n_prefix) == 0) { arg = arg + n_prefix; - /* - * check, if the next character is a @. - * This means, that we want to read options - * from a file. - */ - if(arg[0] == '@') { - size_t n = strcspn(&arg[1], " \t\n"); - char *fname = alloca(n + 1); - FILE *f; - - strncpy(fname, &arg[1], n); - if((f = fopen(fname, "rt")) != NULL) { - lc_opt_from_file(fname, f, handler); - fclose(f); - set_error(&err, lc_opt_err_none, NULL); - } - - else - set_error(&err, lc_opt_err_file_not_found, arg); - - return !lc_opt_raise_error(&err, handler, "Unable to open file: %s", fname); - } - /* find the next delimiter (the -) and extract the string up to * there. */ end = strchr(arg, OPT_DELIM); eqsign = strchr(arg, '='); if (eqsign && eqsign < end) end = NULL; - while(end != NULL) { + while (end != NULL) { /* * Copy the part of the option into the buffer and add the * finalizing zero. */ - buf = obstack_copy0(&obst, arg, end - arg); + char *buf = (char*)obstack_copy0(&obst, arg, end - arg); /* Resolve the group inside the group */ grp = lc_opt_find_grp(grp, buf, &err); error = lc_opt_raise_error(&err, handler, ERR_STRING, arg); - if(error) + if (error) break; /* Find the next option part delimiter. */ @@ -785,8 +740,9 @@ int lc_opt_from_single_arg(const lc_opt_entry_t *root, obstack_free(&obst, buf); } - if(!error) { + if (!error) { lc_opt_entry_t *opt; + char *buf; /* * Now, we are at the last option part: @@ -796,11 +752,11 @@ int lc_opt_from_single_arg(const lc_opt_entry_t *root, * later. */ end = strchr(arg, '='); - buf = obstack_copy0(&obst, arg, end ? end - arg : (int) strlen(arg)); + buf = (char*)obstack_copy0(&obst, arg, end ? end - arg : (int) strlen(arg)); opt = lc_opt_find_opt(grp, buf, &err); error = lc_opt_raise_error(&err, handler, ERR_STRING, arg); - if(!error) { + if (!error) { /* * Now evaluate the parameter of the option (the part after * the =) if it was given. @@ -825,15 +781,19 @@ int lc_opt_from_argv(const lc_opt_entry_t *root, int i; int options_set = 0; - for(i = 0; i < argc; ++i) { + if (handler == NULL) + handler = lc_opts_default_error_handler; + + for (i = 0; i < argc; ++i) { options_set |= lc_opt_from_single_arg(root, opt_prefix, argv[i], handler); } return options_set; } -static int opt_arg_type(UNUSED(const lc_arg_occ_t *occ)) +static int opt_arg_type(const lc_arg_occ_t *occ) { + (void) occ; return lc_arg_type_ptr; } @@ -841,11 +801,11 @@ static int opt_arg_emit(lc_appendable_t *app, const lc_arg_occ_t *occ, const lc_ { char buf[256]; - lc_opt_entry_t *opt = arg->v_ptr; - const char *s = buf; - size_t res = 0; + lc_opt_entry_t *opt = (lc_opt_entry_t*)arg->v_ptr; + const char *s = buf; + size_t res = 0; - switch(occ->conversion) { + switch (occ->conversion) { case 'V': lc_opt_value_to_string(buf, sizeof(buf), opt); break; @@ -862,7 +822,7 @@ static int opt_arg_emit(lc_appendable_t *app, const lc_arg_occ_t *occ, const lc_ s = NULL; } - if(s) + if (s) res = lc_appendable_snadd(app, s, strlen(s)); return res; @@ -880,7 +840,7 @@ const lc_arg_env_t *lc_opt_get_arg_env(void) { static lc_arg_env_t *env = NULL; - if(!env) { + if (!env) { env = lc_arg_new_env(); lc_arg_register(env, "opt:value", 'V', &lc_opt_arg_handler); @@ -891,67 +851,3 @@ const lc_arg_env_t *lc_opt_get_arg_env(void) return env; } - -static int lc_opts_default_error_handler(const char *prefix, const lc_opt_err_info_t *err) -{ - fprintf(stderr, "%s: %s; %s\n", prefix, err->msg, err->arg); - return 0; -} - -void lc_opts_init(const char *ini_name, lc_opt_entry_t *root, const char *arg_prefix, int argc, const char **argv) -{ - FILE *f; - char path[MAX_PATH]; - char local_ini_file[MAX_PATH]; - char home_dir_ini_file[MAX_PATH]; - - /* .ini */ - strncpy(local_ini_file, ini_name, sizeof(local_ini_file)); - strncat(local_ini_file, ".ini", sizeof(local_ini_file)); - local_ini_file[sizeof(local_ini_file) - 1] = '\0'; - path[0] = '\0'; - -#ifdef _WIN32 -#if _MSC_VER > 1200 - /* ARG: need newer SDK to compile this */ - SHGetFolderPath(NULL, CSIDL_LOCAL_APPDATA, NULL, 0, path); - strncat(path, "\\", sizeof(path)); -#endif - strncpy(home_dir_ini_file, local_ini_file, sizeof(home_dir_ini_file)); - home_dir_ini_file[sizeof(home_dir_ini_file) - 1] = '\0'; -#else - { - struct passwd *entry = getpwuid(getuid()); - if (entry != NULL) { - strcpy(path, entry->pw_dir); - strncat(path, "/", sizeof(path)); - /* .rc */ - snprintf(home_dir_ini_file, sizeof(home_dir_ini_file), ".%src", ini_name); - home_dir_ini_file[sizeof(home_dir_ini_file) - 1] = '\0'; - } else { - /* FIXME: some error occured */ - home_dir_ini_file[0] = '\0'; - } - } -#endif - - strncat(path, home_dir_ini_file, sizeof(path)); - path[sizeof(path) - 1] = '\0'; - - /* Process ini file in user's home. */ - f = fopen(path, "rt"); - if (f) { - lc_opt_from_file(path, f, lc_opts_default_error_handler); - fclose(f); - } - - /* Process ini file in current directory. */ - f = fopen(local_ini_file, "rt"); - if (f) { - lc_opt_from_file(local_ini_file, f, lc_opts_default_error_handler); - fclose(f); - } - - /* process arguments from the command line */ - lc_opt_from_argv(root, arg_prefix, argc, argv, lc_opts_default_error_handler); -}