don't optimistically split these strange msut_be_different copies
[libfirm] / ir / libcore / lc_opts.c
index 8d0868d..85b7dcc 100644 (file)
   License along with this library; if not, write to the Free Software
   Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 */
+#include "config.h"
 
 #include <stdio.h>
 #include <stdarg.h>
+#include <stdlib.h>
 #include <string.h>
 #include <ctype.h>
 
-#if defined(__FreeBSD__)
-#include <stdlib.h>
-#elif defined(_WIN32)
+#ifdef _WIN32
 #include <malloc.h>
-#else
+#endif
+#ifdef HAVE_ALLOCA_H
 #include <alloca.h>
 #endif
 
@@ -51,6 +52,7 @@
 #include "lc_parser_t.h"
 #include "hashptr.h"
 #include "lc_printf.h"
+#include "xmalloc.h"
 
 #define ERR_STRING "In argument \"%s\": "
 
@@ -130,7 +132,7 @@ static lc_opt_entry_t *init_grp(lc_opt_entry_t *ent, lc_opt_err_info_t *err)
        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);
+                       list_add_tail(&ent->list, &lc_get_grp_special(ent->parent)->grps);
                else
                        set_error(err, lc_opt_err_grp_expected, ent->parent->name);
        }
@@ -150,7 +152,7 @@ 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;
@@ -220,7 +222,7 @@ 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));
+               ent = OALLOC(&obst, lc_opt_entry_t);
                init_entry(ent, parent, name, "");
                init_grp(ent, NULL);
        }
@@ -241,7 +243,7 @@ lc_opt_entry_t *lc_opt_add_opt(lc_opt_entry_t *parent,
                lc_opt_entry_t *ent = lc_opt_find_opt(parent, name, NULL);
 
                if(!ent) {
-                       res = obstack_alloc(&obst, sizeof(*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
@@ -627,7 +629,7 @@ 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)) {
@@ -707,9 +709,16 @@ void lc_opt_print_tree(lc_opt_entry_t *ent, FILE *f)
        lc_opt_print_tree_grp_indent(ent, f, 0);
 }
 
+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_opt_from_file(const char *filename, FILE *f, lc_opt_error_handler_t *handler)
 {
+       if (handler == NULL)
+               handler = lc_opts_default_error_handler;
        PMANGLE(in) = f;
        lc_opt_init_parser(filename, handler);
        PMANGLE(parse)();
@@ -822,6 +831,9 @@ int lc_opt_from_argv(const lc_opt_entry_t *root,
        int i;
        int options_set = 0;
 
+       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);
        }
@@ -889,13 +901,7 @@ 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)
+void lc_opt_default_configs(const char *ini_name)
 {
        FILE *f;
        char path[MAX_PATH];
@@ -926,7 +932,7 @@ void lc_opts_init(const char *ini_name, lc_opt_entry_t *root, const char *arg_pr
                        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 */
+                       /* FIXME: some error occurred */
                        home_dir_ini_file[0] = '\0';
                }
        }
@@ -948,7 +954,4 @@ void lc_opts_init(const char *ini_name, lc_opt_entry_t *root, const char *arg_pr
                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);
 }