diff options
author | gramanas <anastasis.gramm2@gmail.com> | 2022-11-26 17:37:18 +0200 |
---|---|---|
committer | gramanas <anastasis.gramm2@gmail.com> | 2022-11-26 17:37:18 +0200 |
commit | 8ef08604932c05ebfabb041704dc6f994d7a93a7 (patch) | |
tree | cfdb23f88e854f54674eb57fa2ef14fac32a0b54 /src/foodopts.c | |
parent | 5aa48ee3bd2797d0f39ffc677d97384dbe0f59fb (diff) | |
download | foodtools-8ef08604932c05ebfabb041704dc6f994d7a93a7.tar.gz foodtools-8ef08604932c05ebfabb041704dc6f994d7a93a7.tar.bz2 foodtools-8ef08604932c05ebfabb041704dc6f994d7a93a7.zip |
Fix longopts
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 * |