From 8ef08604932c05ebfabb041704dc6f994d7a93a7 Mon Sep 17 00:00:00 2001 From: gramanas Date: Sat, 26 Nov 2022 17:37:18 +0200 Subject: Fix longopts --- src/foodopts.c | 39 +++++++++++++++++++++++++++++++++++++-- 1 file changed, 37 insertions(+), 2 deletions(-) (limited to 'src/foodopts.c') 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 +#include #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 * -- cgit v1.2.3