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:
Johan Danielsson
1999-09-24 14:47:56 +00:00
parent 5486efe053
commit 014b3527e7
2 changed files with 20 additions and 3 deletions

View File

@@ -296,7 +296,7 @@ add_string(getarg_strings *s, char *value)
static int static int
arg_match_long(struct getargs *args, size_t num_args, arg_match_long(struct getargs *args, size_t num_args,
char *argv) char *argv, int argc, char **rargv, int *optind)
{ {
int i; int i;
char *optarg = NULL; char *optarg = NULL;
@@ -393,6 +393,10 @@ arg_match_long(struct getargs *args, size_t num_args,
*(double*)current->value = tmp; *(double*)current->value = tmp;
return 0; return 0;
} }
case arg_collect:{
struct getarg_collect_info *c = current->value;
return (*c->func)(optarg + 1, argc, rargv, optind, c->data);
}
default: default:
abort (); abort ();
} }
@@ -415,7 +419,8 @@ getarg(struct getargs *args, size_t num_args,
i++; i++;
break; 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) if(ret)
return ret; return ret;
}else{ }else{
@@ -459,6 +464,12 @@ getarg(struct getargs *args, size_t num_args,
return ARG_ERR_BAD_ARG; return ARG_ERR_BAD_ARG;
*(double*)args[k].value = tmp; *(double*)args[k].value = tmp;
goto out; 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; return ARG_ERR_BAD_ARG;
} }

View File

@@ -51,7 +51,8 @@ struct getargs{
arg_flag, arg_flag,
arg_negative_flag, arg_negative_flag,
arg_strings, arg_strings,
arg_double arg_double,
arg_collect
} type; } type;
void *value; void *value;
const char *help; const char *help;
@@ -69,6 +70,11 @@ typedef struct getarg_strings {
char **strings; char **strings;
} getarg_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 getarg(struct getargs *args, size_t num_args,
int argc, char **argv, int *optind); int argc, char **argv, int *optind);