From 014b3527e778f7feca4c07245afff568e1b9c8f6 Mon Sep 17 00:00:00 2001 From: Johan Danielsson Date: Fri, 24 Sep 1999 14:47:56 +0000 Subject: [PATCH] add a callback type to do more complicated processing git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@7023 ec53bebd-3082-4978-b11e-865c3cabbd6b --- lib/roken/getarg.c | 15 +++++++++++++-- lib/roken/getarg.h | 8 +++++++- 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/lib/roken/getarg.c b/lib/roken/getarg.c index 23a326d4f..c0fe543d2 100644 --- a/lib/roken/getarg.c +++ b/lib/roken/getarg.c @@ -296,7 +296,7 @@ add_string(getarg_strings *s, char *value) static int arg_match_long(struct getargs *args, size_t num_args, - char *argv) + char *argv, int argc, char **rargv, int *optind) { int i; char *optarg = NULL; @@ -393,6 +393,10 @@ arg_match_long(struct getargs *args, size_t num_args, *(double*)current->value = tmp; return 0; } + case arg_collect:{ + struct getarg_collect_info *c = current->value; + return (*c->func)(optarg + 1, argc, rargv, optind, c->data); + } default: abort (); } @@ -415,7 +419,8 @@ getarg(struct getargs *args, size_t num_args, i++; break; } - ret = arg_match_long (args, num_args, argv[i] + 2); + ret = arg_match_long (args, num_args, argv[i] + 2, + argc, argv, &i); if(ret) return ret; }else{ @@ -459,6 +464,12 @@ getarg(struct getargs *args, size_t num_args, return ARG_ERR_BAD_ARG; *(double*)args[k].value = tmp; goto out; + } else if(args[k].type == arg_collect){ + struct getarg_collect_info *c = args[k].value; + if((*c->func)(optarg, argc, argv, &i, + c->data)) + return ARG_ERR_BAD_ARG; + goto out; } return ARG_ERR_BAD_ARG; } diff --git a/lib/roken/getarg.h b/lib/roken/getarg.h index 996ea4f20..61d509bb1 100644 --- a/lib/roken/getarg.h +++ b/lib/roken/getarg.h @@ -51,7 +51,8 @@ struct getargs{ arg_flag, arg_negative_flag, arg_strings, - arg_double + arg_double, + arg_collect } type; void *value; const char *help; @@ -69,6 +70,11 @@ typedef struct getarg_strings { char **strings; } getarg_strings; +typedef struct getarg_collect_info { + int (*func)(char *optarg, int argc, char **argv, int *optind, void *data); + void *data; +} getarg_collect_info; + int getarg(struct getargs *args, size_t num_args, int argc, char **argv, int *optind);