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
|
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;
|
||||||
}
|
}
|
||||||
|
@@ -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);
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user