}
}
+static void free_args(struct isl_arg *arg, void *opt);
+
+static void free_child(struct isl_arg *arg, void *opt)
+{
+ if (arg->offset == (size_t) -1)
+ free_args(arg->u.child.child->args, opt);
+ else
+ isl_args_free(arg->u.child.child,
+ *(void **)(((char *)opt) + arg->offset));
+}
+
static void free_str_list(struct isl_arg *arg, void *opt)
{
int i;
free(list);
}
+static void free_user(struct isl_arg *arg, void *opt)
+{
+ if (arg->u.user.clear)
+ arg->u.user.clear(((char *)opt) + arg->offset);
+}
+
static void free_args(struct isl_arg *arg, void *opt)
{
int i;
for (i = 0; arg[i].type != isl_arg_end; ++i) {
switch (arg[i].type) {
case isl_arg_child:
- if (arg[i].offset == (size_t) -1)
- free_args(arg[i].u.child.child->args, opt);
- else
- isl_args_free(arg[i].u.child.child,
- *(void **)(((char *)opt) + arg[i].offset));
+ free_child(&arg[i], opt);
break;
case isl_arg_arg:
case isl_arg_str:
free_str_list(&arg[i], opt);
break;
case isl_arg_user:
- if (arg[i].u.user.clear)
- arg[i].u.user.clear(((char *)opt) + arg[i].offset);
+ free_user(&arg[i], opt);
break;
case isl_arg_alias:
case isl_arg_bool:
static int drop_argument(int argc, char **argv, int drop, int n)
{
- for (; drop < argc; ++drop)
+ for (; drop + n < argc; ++drop)
argv[drop] = argv[drop + n];
return argc - n;