BugFix for a rare case:
[libfirm] / ir / libcore / lc_opts_enum.c
index 57322e6..1d67602 100644 (file)
@@ -8,9 +8,7 @@
  *
  * Enum callback and dump implementation.
  */
-#ifdef HAVE_CONFIG_H
 #include "config.h"
-#endif
 
 #include <stdlib.h>
 #include <stdarg.h>
@@ -85,12 +83,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 = ", "; \
                } \
        } \
@@ -106,10 +114,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 = ", "; \
        } \
  \