diff options
Diffstat (limited to 'src/foodopts.c')
-rw-r--r-- | src/foodopts.c | 39 |
1 files changed, 37 insertions, 2 deletions
diff --git a/src/foodopts.c b/src/foodopts.c index 338b97e..fac807d 100644 --- a/src/foodopts.c +++ b/src/foodopts.c @@ -1,14 +1,49 @@ #include <stdio.h> +#include <stdlib.h> #include "foodopts.h" +static struct option * +to_getopt_longopts(const struct foodoption * src) +{ + int l = 0; + while( src[l].name != 0 + || src[l].has_arg != 0 + || src[l].flag != 0 + || src[l].val != 0) { + l++; + } + + struct option * dst = (struct option *)malloc(sizeof(struct option) * (l + 1)); + int i = 0; + while( src[i].name != 0 + || src[i].has_arg != 0 + || src[i].flag != 0 + || src[i].val != 0) { + dst[i].name = src[i].name; + dst[i].has_arg = src[i].has_arg; + dst[i].flag = src[i].flag; + dst[i].val = src[i].val; + i++; + } + dst[i].name = 0; + dst[i].has_arg = 0; + dst[i].flag = 0; + dst[i].val = 0; + + return dst; +} + int get_foodopt(int argc, char *const argv[], const char *optstring, const struct foodoption *longopts, int *longindex) { - return getopt_long(argc, argv, optstring, - (struct option *)longopts, longindex); + struct option * o = to_getopt_longopts(longopts); + int rc = getopt_long(argc, argv, optstring, o, longindex); + + free(o); + return rc; } const char * |