X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Flibcore%2Flc_opts_enum.c;h=ebcb034b38a33ee47a2088818e674bfabd891001;hb=d32deaaaf39ca256be208269c9a933c211439feb;hp=57322e6bb0bd9e2a6ca9cf4f865197e469c0e314;hpb=cfc7f9e2006fd93ed64399307b2b8728b03e4ec7;p=libfirm diff --git a/ir/libcore/lc_opts_enum.c b/ir/libcore/lc_opts_enum.c index 57322e6bb..ebcb034b3 100644 --- a/ir/libcore/lc_opts_enum.c +++ b/ir/libcore/lc_opts_enum.c @@ -8,33 +8,27 @@ * * Enum callback and dump implementation. */ -#ifdef HAVE_CONFIG_H #include "config.h" -#endif #include #include #include #include -#if defined(__FreeBSD__) -#include -#elif defined(_WIN32) +#ifdef _WIN32 #include -#else -#include #endif #include "lc_opts_t.h" #include "lc_opts_enum.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, ...) \ { \ - 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; \ @@ -47,12 +41,12 @@ int lc_opt_enum_ ## N ## _cb(LC_UNUSED(const char *name), LC_UNUSED(lc_opt_type_ 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); \ @@ -60,8 +54,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; \ } \ @@ -80,40 +74,61 @@ 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)) \ { \ - 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); \ \ - 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)) \ { \ - 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); \ \ - 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); \ } \