X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=isl_arg.c;h=0963aa126c8fbec8160158bc8ddad2025f0196f3;hb=f44a1a3e730acbedf80309eeb4884f2a6bcba7d7;hp=873ab02eb599f6dd6e4e65d9c28e4d4e67192d15;hpb=d331765d9d14594016820253991c9efba0082bdf;p=platform%2Fupstream%2Fisl.git diff --git a/isl_arg.c b/isl_arg.c index 873ab02..0963aa1 100644 --- a/isl_arg.c +++ b/isl_arg.c @@ -130,6 +130,17 @@ void isl_args_set_defaults(struct isl_args *args, void *opt) } } +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; @@ -141,6 +152,12 @@ static void free_str_list(struct isl_arg *arg, void *opt) 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; @@ -148,11 +165,7 @@ static void free_args(struct isl_arg *arg, void *opt) 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: @@ -162,8 +175,7 @@ static void free_args(struct isl_arg *arg, void *opt) 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: @@ -1112,7 +1124,7 @@ static void print_version_and_exit(struct isl_arg *decl) 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;