X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Flibcore%2Flc_opts_enum.c;h=75ce0ff9fe73abe749afa097c9c18139a42f3835;hb=e0e9e9ace61d3ec46e4d09c7ab2c6947b17b2778;hp=44518062cb270584682e55b5072b3bcd8bde0d23;hpb=de1b0c8d4f653f534a38740ad7f6803d82f2762e;p=libfirm diff --git a/ir/libcore/lc_opts_enum.c b/ir/libcore/lc_opts_enum.c index 44518062c..75ce0ff9f 100644 --- a/ir/libcore/lc_opts_enum.c +++ b/ir/libcore/lc_opts_enum.c @@ -8,17 +8,17 @@ * * Enum callback and dump implementation. */ +#include "config.h" #include #include #include #include -#if defined(__FreeBSD__) -#include -#elif defined(_WIN32) +#ifdef _WIN32 #include -#else +#endif +#ifdef HAVE_ALLOCA_H #include #endif @@ -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 = ", "; \ } \ \