simplify confusing entity/owner interfaces. There is no public way anymore to add...
[libfirm] / ir / libcore / lc_opts_enum.c
index 4451806..144294d 100644 (file)
@@ -8,17 +8,17 @@
  *
  * 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)
+#ifdef _WIN32
 #include <malloc.h>
-#else
+#endif
+#ifdef HAVE_ALLOCA_H
 #include <alloca.h>
 #endif
 
@@ -49,7 +49,7 @@ int lc_opt_enum_ ## N ## _cb(LC_UNUSED(const char *name), LC_UNUSED(lc_opt_type_
        s[end]  = '\0'; \
        \
        end = 0; \
-       while(arg[end] != '\0') { \
+       while (arg[end] != '\0') { \
                unsigned int i; \
                \
                begin  = end + strspn(arg + end, delim); \
@@ -57,8 +57,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; \
                        } \
@@ -82,12 +82,22 @@ int lc_opt_enum_ ## N ## _dump(char *buf, size_t n, LC_UNUSED(const char *name),
        const char *prefix                                                              = "";                    \
        TYPE(value) = *var->value; \
        int i; \
+       size_t l = strlen(buf); \
  \
-       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 = ", "; \
                } \
        } \
@@ -103,10 +113,21 @@ int lc_opt_enum_ ## N ## _dump_vals(char *buf, size_t n, LC_UNUSED(const char *n
        const lc_opt_enum_ ## N ## _items_t *items      = var->items; \
        const char *prefix                                                              = "";                    \
        int i; \
+       size_t l = strlen(buf); \
  \
-       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 = ", "; \
        } \
  \