cleanup: Remove duplicate MIN/MAX macros.
[libfirm] / ir / libcore / lc_opts.c
index fca9d07..fc9c162 100644 (file)
@@ -1,21 +1,7 @@
 /*
-  libcore: library for basic data structures and algorithms.
-  Copyright (C) 2005  IPD Goos, Universit"at Karlsruhe, Germany
-
-  This library is free software; you can redistribute it and/or
-  modify it under the terms of the GNU Lesser General Public
-  License as published by the Free Software Foundation; either
-  version 2.1 of the License, or (at your option) any later version.
-
-  This library is distributed in the hope that it will be useful,
-  but WITHOUT ANY WARRANTY; without even the implied warranty of
-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-  Lesser General Public License for more details.
-
-  You should have received a copy of the GNU Lesser General Public
-  License along with this library; if not, write to the Free Software
-  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
-*/
+ * This file is part of libFirm.
+ * Copyright (C) 2012 IPD Goos, Universit"at Karlsruhe, Germany
+ */
 #include "config.h"
 
 #include <stdio.h>
 #include <string.h>
 #include <ctype.h>
 
-#ifdef _WIN32
-#include <malloc.h>
-#endif
-#ifdef HAVE_ALLOCA_H
-#include <alloca.h>
-#endif
-
-/* Includes to determine user's home directory */
-#ifdef _WIN32
-#include <shlobj.h>
-#else
-#include <sys/types.h>
-#include <unistd.h>
-#include <pwd.h>
-#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;
 
 static void set_name(lc_opt_entry_t *ent, const char *name)
 {
        ent->name = name;
-       ent->hash = HASH_STR(name, strlen(name));
+       ent->hash = hash_str(name);
 }
 
 #define entry_matches(ent,hash_val,str) \
@@ -112,9 +76,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);
@@ -154,12 +118,12 @@ static lc_opt_entry_t *init_opt(lc_opt_entry_t *ent,
        set_error(err, lc_opt_err_none, "");
        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;
 }
@@ -198,8 +162,6 @@ static const char *get_type_name(lc_opt_type_t type)
                XXX(double);
                XXX(boolean);
                XXX(string);
-               case lc_opt_type_negbit:     res = "bit";     break;
-               case lc_opt_type_negboolean: res = "boolean"; break;
                default:
                res = "<none>";
        }
@@ -254,9 +216,9 @@ lc_opt_entry_t *lc_opt_add_opt(lc_opt_entry_t *parent,
 static lc_opt_entry_t *lc_opt_find_ent(const struct list_head *head, const char *name,
                int error_to_use, lc_opt_err_info_t *err)
 {
-       lc_opt_entry_t *ent, *found = NULL;
+       lc_opt_entry_t *found = NULL;
        int error = error_to_use;
-       unsigned hash = HASH_STR(name, strlen(name));
+       unsigned hash = hash_str(name);
 
        if (!list_empty(head)) {
                list_for_each_entry(lc_opt_entry_t, ent, head, list) {
@@ -311,7 +273,7 @@ static lc_opt_entry_t *resolve_up_to_last_str_rec(lc_opt_entry_t *from,
                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';
 
@@ -358,15 +320,16 @@ static char *strtolower(char *buf, size_t n, const char *str)
 {
        unsigned i;
        for (i = 0; i < n; ++i)
-               buf[i] = tolower(str[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);
 
@@ -376,29 +339,17 @@ int lc_opt_std_cb(UNUSED(const char *name), lc_opt_type_t type, void *data, size
                case lc_opt_type_bit:
                        integer = va_arg(args, int);
                        if (integer)
-                               *((int *) data) |= length;
-                       else
-                               *((int *) data) &= ~length;
-                       break;
-
-               case lc_opt_type_negbit:
-                       integer = va_arg(args, int);
-                       if (integer)
-                               *((int *) data) &= ~length;
+                               *(unsigned*)data |= length;
                        else
-                               *((int *) data) |= length;
+                               *(unsigned*)data &= ~length;
                        break;
 
                case lc_opt_type_boolean:
                        *((int *) data) = va_arg(args, int);
                        break;
 
-               case lc_opt_type_negboolean:
-                       *((int *) data) = !va_arg(args, int);
-                       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:
@@ -417,22 +368,22 @@ 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) {
                case lc_opt_type_bit:
-               case lc_opt_type_negbit:
                        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:
@@ -455,8 +406,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;
 }
@@ -516,11 +471,9 @@ int lc_opt_occurs(lc_opt_entry_t *opt, const char *value, lc_opt_err_info_t *err
                        break;
 
                case lc_opt_type_boolean:
-               case lc_opt_type_negboolean:
                case lc_opt_type_bit:
-               case lc_opt_type_negbit:
                                strtolower(buf, sizeof(buf), value);
-                               for (i = 0; i < LC_ARRSIZE(bool_strings); ++i) {
+                               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;
@@ -542,6 +495,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);
@@ -600,7 +555,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)
@@ -624,7 +579,6 @@ static void lc_opt_print_help_rec(lc_opt_entry_t *ent, char separator, lc_opt_en
        char grp_name[512];
        char value[256];
        char values[512];
-       lc_opt_entry_t *e;
 
        if (!list_empty(&s->opts)) {
                lc_opt_print_grp_path(grp_name, sizeof(grp_name), ent, separator, stop_ent);
@@ -682,8 +636,6 @@ 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) {
-               lc_opt_entry_t *e;
-
                s = lc_get_grp_special(ent);
                indent(f, level);
                fprintf(f, "/%s\n", ent->name);
@@ -709,54 +661,22 @@ static int lc_opts_default_error_handler(const char *prefix, const lc_opt_err_in
        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)();
-}
-
 int lc_opt_from_single_arg(const lc_opt_entry_t *root,
                                                   const char *opt_prefix,
                                                   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 != NULL ? 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 && (n_prefix == 0 || 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);
@@ -768,7 +688,7 @@ int lc_opt_from_single_arg(const lc_opt_entry_t *root,
                         * 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);
@@ -787,6 +707,7 @@ int lc_opt_from_single_arg(const lc_opt_entry_t *root,
 
                if (!error) {
                        lc_opt_entry_t *opt;
+                       char           *buf;
 
                        /*
                         * Now, we are at the last option part:
@@ -796,7 +717,7 @@ 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);
 
@@ -835,8 +756,9 @@ int lc_opt_from_argv(const lc_opt_entry_t *root,
        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;
 }
 
@@ -844,9 +766,9 @@ 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) {
        case 'V':
@@ -894,58 +816,3 @@ const lc_arg_env_t *lc_opt_get_arg_env(void)
 
        return env;
 }
-
-void lc_opt_default_configs(const char *ini_name)
-{
-       FILE *f;
-       char path[MAX_PATH];
-       char local_ini_file[MAX_PATH];
-       char home_dir_ini_file[MAX_PATH];
-
-       /* <cmnt>.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));
-                       /* .<cmnt>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 occurred */
-                       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);
-       }
-}