make firm (mostly) -Wmissing-prototypes clean
[libfirm] / ir / libcore / lc_opts_enum.c
index 821c961..144294d 100644 (file)
 #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
 
@@ -50,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); \
@@ -58,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; \
                        } \
@@ -83,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 = ", "; \
                } \
        } \
@@ -104,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 = ", "; \
        } \
  \