diff options
author | unknown <serg@serg.mylan> | 2004-04-28 15:33:03 +0200 |
---|---|---|
committer | unknown <serg@serg.mylan> | 2004-04-28 15:33:03 +0200 |
commit | ad3d7a210df918b1f01e55f08fb15e7f95eb11c6 (patch) | |
tree | 942f55204daac6608e816f9c98cdaa9efcb7508e /mysys/my_getopt.c | |
parent | fdee1cbbb43a668f50bc6496dae125786e78536b (diff) | |
download | mariadb-git-ad3d7a210df918b1f01e55f08fb15e7f95eb11c6.tar.gz |
bug#3529 - my_getopt doesn't process short OPT_ARG options correctly
cleanup
Diffstat (limited to 'mysys/my_getopt.c')
-rw-r--r-- | mysys/my_getopt.c | 31 |
1 files changed, 20 insertions, 11 deletions
diff --git a/mysys/my_getopt.c b/mysys/my_getopt.c index 8e1276990c0..d304b5076f9 100644 --- a/mysys/my_getopt.c +++ b/mysys/my_getopt.c @@ -32,7 +32,7 @@ static longlong getopt_ll(char *arg, const struct my_option *optp, int *err); static ulonglong getopt_ull(char *arg, const struct my_option *optp, int *err); static void init_variables(const struct my_option *options); -static int setval(const struct my_option *opts, char *argument, +static int setval(const struct my_option *opts,char *argument, my_bool set_maximum_value); /* @@ -315,8 +315,8 @@ int handle_options(int *argc, char ***argv, { if (!optend) /* No argument -> enable option */ *((my_bool*) optp->value)= (my_bool) 1; - else /* If argument differs from 0, enable option, else disable */ - *((my_bool*) optp->value)= (my_bool) atoi(optend) != 0; + else + argument= optend; } } else if (optp->arg_type == REQUIRED_ARG && !optend) @@ -362,18 +362,24 @@ int handle_options(int *argc, char ***argv, /* This is in effect a jump out of the outer loop */ optend= (char*) " "; } - else if (optp->arg_type == REQUIRED_ARG) + else { /* Check if there are more arguments after this one */ - if (!*++pos) + if (!pos[1]) { - if (my_getopt_print_errors) - fprintf(stderr, - "%s: option '-%c' requires an argument\n", - progname, optp->id); - return EXIT_ARGUMENT_REQUIRED; + if (optp->var_type == GET_BOOL && optp->arg_type == OPT_ARG) + { + *((my_bool*) optp->value)= (my_bool) 1; + get_one_option(optp->id, optp, argument); + continue; + } + if (my_getopt_print_errors) + fprintf(stderr, + "%s: option '-%c' requires an argument\n", + progname, optp->id); + return EXIT_ARGUMENT_REQUIRED; } - argument= *pos; + argument= *++pos; (*argc)--; /* the other loop will break, because *optend + 1 == 0 */ } @@ -445,6 +451,9 @@ static int setval(const struct my_option *opts, char *argument, return EXIT_NO_PTR_TO_VARIABLE; switch (opts->var_type) { + case GET_BOOL: /* If argument differs from 0, enable option, else disable */ + *((my_bool*) result_pos)= (my_bool) atoi(argument) != 0; + break; case GET_INT: case GET_UINT: /* fall through */ *((int*) result_pos)= (int) getopt_ll(argument, opts, &err); |