valueset: Remove the unused link field.
[libfirm] / ir / libcore / lc_opts_enum.c
index 4451806..c286f97 100644 (file)
@@ -8,30 +8,24 @@
  *
  * Enum callback and dump implementation.
  */
+#include "config.h"
 
 #include <stdlib.h>
 #include <stdarg.h>
 #include <stdio.h>
 #include <string.h>
 
-#if defined(__FreeBSD__)
-#include <stdlib.h>
-#elif defined(_WIN32)
-#include <malloc.h>
-#else
-#include <alloca.h>
-#endif
-
 #include "lc_opts_t.h"
 #include "lc_opts_enum.h"
+#include "xmalloc.h"
 
-static const char *delim                       = " \t|,";
+static const char *delim = " \t|,";
 
 #define DECL_CB(N, op) \
-int lc_opt_enum_ ## N ## _cb(LC_UNUSED(const char *name), LC_UNUSED(lc_opt_type_t type), void *data, size_t len, ...) \
+int lc_opt_enum_ ## N ## _cb(const char *name, lc_opt_type_t type, void *data, size_t len, ...) \
 { \
-       lc_opt_enum_ ## N ## _var_t *var                                                = data; \
-       const lc_opt_enum_ ## N ## _items_t *items      = var->items; \
+       lc_opt_enum_ ## N ## _var_t *var           = (lc_opt_enum_ ## N ## _var_t*)data; \
+       const lc_opt_enum_ ## N ## _items_t *items = var->items; \
  \
        va_list args; \
        char *s, *tmp; \
@@ -39,17 +33,19 @@ int lc_opt_enum_ ## N ## _cb(LC_UNUSED(const char *name), LC_UNUSED(lc_opt_type_
        const char *arg; \
        int res = 0; \
  \
+       (void) name; \
+       (void) type; \
        va_start(args, len); \
        arg = va_arg(args, const char *); \
        va_end(args); \
        \
        end     = strlen(arg); \
-       tmp = s = malloc((end + 1) * sizeof(arg[0])); \
+       tmp = s = (char*)malloc((end + 1) * sizeof(arg[0])); \
        strcpy(s, arg); \
        s[end]  = '\0'; \
        \
        end = 0; \
-       while(arg[end] != '\0') { \
+       while (arg[end] != '\0') { \
                unsigned int i; \
                \
                begin  = end + strspn(arg + end, delim); \
@@ -57,8 +53,8 @@ int lc_opt_enum_ ## N ## _cb(LC_UNUSED(const char *name), LC_UNUSED(lc_opt_type_
                s      = tmp + begin; \
                s[end - begin] = '\0'; \
                \
-               for(i = 0; items[i].name != NULL; ++i) { \
-                       if(strcmp(s, items[i].name) == 0) { \
+               for (i = 0; items[i].name != NULL; ++i) { \
+                       if (strcmp(s, items[i].name) == 0) { \
                                *var->value op items[i].value; \
                                res = 1; \
                        } \
@@ -75,42 +71,69 @@ DECL_CB(const_ptr, =)
 DECL_CB(func_ptr, =)
 
 #define DECL_DUMP(T, N, cond) \
-int lc_opt_enum_ ## N ## _dump(char *buf, size_t n, LC_UNUSED(const char *name), LC_UNUSED(lc_opt_type_t type), void *data, LC_UNUSED(size_t len)) \
+int lc_opt_enum_ ## N ## _dump(char *buf, size_t n, const char *name, lc_opt_type_t type, void *data, size_t len) \
 { \
-       lc_opt_enum_ ## N ## _var_t *var                                                = data; \
-       const lc_opt_enum_ ## N ## _items_t *items      = var->items; \
-       const char *prefix                                                              = "";                    \
+       lc_opt_enum_ ## N ## _var_t *var           = (lc_opt_enum_ ## N ## _var_t*)data;       \
+       const lc_opt_enum_ ## N ## _items_t *items = var->items; \
+       const char *prefix                         = "";         \
        TYPE(value) = *var->value; \
        int i; \
+       size_t l = strlen(buf); \
+       (void) name; \
+       (void) type; \
+       (void) len; \
  \
-       for(i = 0; items[i].name != NULL; ++i) { \
+       if (l >= n) \
+               return (int)l; \
+       n -= l; \
+       n += 2; \
+       for (i = 0; items[i].name != NULL; ++i) { \
                TYPE(item_value) = items[i].value; \
-               if(cond) { \
-                       strncat(buf, prefix, n); \
-                       strncat(buf, items[i].name, n); \
+               if (cond) { \
+                       if (n <= 2) \
+                               break; \
+                       strcat(buf, prefix); \
+                       l = strlen(items[i].name); \
+                       if (n <= l) \
+                               break; \
+                       strcat(buf, items[i].name); \
                        prefix = ", "; \
                } \
        } \
  \
-       return strlen(buf); \
+       return (int)strlen(buf); \
 } \
 
 
 #define DECL_DUMP_VALS(T, N) \
-int lc_opt_enum_ ## N ## _dump_vals(char *buf, size_t n, LC_UNUSED(const char *name), LC_UNUSED(lc_opt_type_t type), void *data, LC_UNUSED(size_t len)) \
+int lc_opt_enum_ ## N ## _dump_vals(char *buf, size_t n, const char *name, lc_opt_type_t type, void *data, size_t len) \
 { \
-       lc_opt_enum_ ## N ## _var_t *var                                                = data; \
-       const lc_opt_enum_ ## N ## _items_t *items      = var->items; \
-       const char *prefix                                                              = "";                    \
+       lc_opt_enum_ ## N ## _var_t *var           = (lc_opt_enum_ ## N ## _var_t*) data;       \
+       const lc_opt_enum_ ## N ## _items_t *items = var->items; \
+       const char *prefix                         = "";         \
        int i; \
+       size_t l = strlen(buf); \
+       (void) name; \
+       (void) type; \
+       (void) len; \
  \
-       for(i = 0; items[i].name != NULL; ++i) { \
-               strncat(buf, prefix, n); \
-               strncat(buf, items[i].name, n); \
+       if (l >= n) \
+               return (int)l; \
+       n -= l; \
+       n += 2; \
+       for (i = 0; items[i].name != NULL; ++i) { \
+               if (n <= 2) \
+                       break; \
+               strcat(buf, prefix); n -= 2; \
+               l = strlen(items[i].name); \
+               if (n <= l) \
+                       break; \
+               strcat(buf, items[i].name); \
+               n -= l; \
                prefix = ", "; \
        } \
  \
-       return strlen(buf); \
+       return (int)strlen(buf); \
 } \