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
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
@@ -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);
|
||||
|
||||
|
Reference in New Issue
Block a user