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
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;
}

View File

@@ -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);