#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
s[end] = '\0'; \
\
end = 0; \
- while(arg[end] != '\0') { \
+ while (arg[end] != '\0') { \
unsigned int i; \
\
begin = end + strspn(arg + end, delim); \
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; \
} \
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 = ", "; \
} \
} \
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 = ", "; \
} \
\