diff --git a/src/bee.sh.in b/src/bee.sh.in index 3bd66f3..26c1fca 100644 --- a/src/bee.sh.in +++ b/src/bee.sh.in @@ -85,6 +85,7 @@ function search_tool_cmd { } options=$(${BEE_BINDIR}/beegetopt --name=bee \ + --keep-option-end \ --option=destdir/d= \ -- "${@}") @@ -105,6 +106,7 @@ done options=$(${BEE_BINDIR}/beegetopt --name=bee \ --stop-on-no-option \ --no-skip-unknown-option \ + --keep-option-end \ --option=print-config \ --option=help/h \ --option=version/V \ diff --git a/src/bee_getopt.c b/src/bee_getopt.c index 57f30e3..e05a55a 100644 --- a/src/bee_getopt.c +++ b/src/bee_getopt.c @@ -73,6 +73,8 @@ int bee_getopt_init(struct bee_getopt_ctl *ctl, int argc, char **argv, struct be ctl->_argc = argc; ctl->_unhandled_shortopts = NULL; + ctl->flags = 0; + return err?0:1; } @@ -353,7 +355,8 @@ static int _bee_getopt_long(struct bee_getopt_ctl *optctl, int *optindex) /* match & skip '--' and pop all remaining arguments */ if(maybe_long && (optctl->argv[this][2] == '\0')) { - optctl->optind++; + if(!(optctl->flags & BEE_FLAG_KEEPOPTIONEND)) + optctl->optind++; bee_getopt_pop_all_arguments(optctl); return BEE_GETOPT_END; } @@ -394,7 +397,7 @@ int bee_getopt_long(struct bee_getopt_ctl *optctl, int *optindex) return _bee_getopt_long(optctl, optindex); } -int bee_getopt(struct bee_getopt_ctl *optctl, int *optindex, int flags) +int bee_getopt(struct bee_getopt_ctl *optctl, int *optindex) { int opt; @@ -404,7 +407,7 @@ int bee_getopt(struct bee_getopt_ctl *optctl, int *optindex, int flags) return BEE_GETOPT_NOVALUE; case BEE_GETOPT_NOOPT: - if (flags & BEE_FLAG_STOPONNOOPT) { + if (optctl->flags & BEE_FLAG_STOPONNOOPT) { bee_getopt_pop_all_arguments(optctl); return BEE_GETOPT_END; } @@ -417,11 +420,11 @@ int bee_getopt(struct bee_getopt_ctl *optctl, int *optindex, int flags) return BEE_GETOPT_ERROR; case BEE_GETOPT_OPTUNKNOWN: - if (flags & BEE_FLAG_STOPONUNKNOWN) { + if (optctl->flags & BEE_FLAG_STOPONUNKNOWN) { bee_getopt_pop_all_arguments(optctl); return BEE_GETOPT_END; } - if (!(flags & BEE_FLAG_SKIPUNKNOWN)) { + if (!(optctl->flags & BEE_FLAG_SKIPUNKNOWN)) { if (optctl->program) fprintf(stderr, "%s: ", optctl->program); fprintf(stderr, "unrecognized option '%s'.\n", optctl->argv[optctl->optind]); diff --git a/src/bee_getopt.h b/src/bee_getopt.h index 1b07077..9f5b193 100644 --- a/src/bee_getopt.h +++ b/src/bee_getopt.h @@ -37,6 +37,7 @@ #define BEE_FLAG_SKIPUNKNOWN (1<<0) #define BEE_FLAG_STOPONNOOPT (1<<1) #define BEE_FLAG_STOPONUNKNOWN (1<<2) +#define BEE_FLAG_KEEPOPTIONEND (1<<3) #define BEE_OPT_LONG(name) .long_opt = (name) #define BEE_OPT_SHORT(short) .short_opt = (short) @@ -165,13 +166,15 @@ struct bee_getopt_ctl { int _argc; int _optcnt; char *_unhandled_shortopts; + + int flags; }; void bee_getopt_pop_current_argument(struct bee_getopt_ctl *optctl); int bee_getopt_init(struct bee_getopt_ctl *ctl, int argc, char **argv, struct bee_option *optv); int bee_getopt_long(struct bee_getopt_ctl *optctl, int *optindex); -int bee_getopt(struct bee_getopt_ctl *optctl, int *optindex, int flags); +int bee_getopt(struct bee_getopt_ctl *optctl, int *optindex); void bee_getopt_print_quoted(char *s); diff --git a/src/beegetopt.c b/src/beegetopt.c index 3b42b6d..ccf622a 100644 --- a/src/beegetopt.c +++ b/src/beegetopt.c @@ -49,6 +49,7 @@ void usage(void) " by default unknown options are skipped\n" " and handled as non-option argument.\n" " -S is ignored if -U is given.\n" + " -k | --keep-option-end respect but keep '--' at it's position\n" "\n" " -h | --help print this little help\n" " -V | --version print version\n" @@ -81,6 +82,7 @@ int main(int argc, char *argv[]) BEE_OPTION_REQUIRED_ARG("name", 'n'), BEE_OPTION_NO_ARG("stop-on-unknown-option", 'U'), BEE_OPTION_NO_ARG("stop-on-no-option", 'N'), + BEE_OPTION_NO_ARG("keep-option-end", 'k'), BEE_OPTION_NO_ARG("no-skip-unknown-option", 'S'), BEE_OPTION_END }; @@ -105,7 +107,7 @@ int main(int argc, char *argv[]) optctl.program = "beegetopt"; - while((opt=bee_getopt(&optctl, &i, 0)) != BEE_GETOPT_END) { + while((opt=bee_getopt(&optctl, &i)) != BEE_GETOPT_END) { if (opt == BEE_GETOPT_ERROR) { exit(1); @@ -131,6 +133,10 @@ int main(int argc, char *argv[]) flags |= BEE_FLAG_STOPONUNKNOWN; break; + case 'k': + flags |= BEE_FLAG_KEEPOPTIONEND; + break; + case 'S': flags &= ~BEE_FLAG_SKIPUNKNOWN; break; @@ -236,9 +242,9 @@ int main(int argc, char *argv[]) bee_getopt_init(&optctl, optctl.argc-optctl.optind, &argv[optctl.optind+1], beeopts); optctl.program = name?name:"program"; + optctl.flags = flags; - while((opt=bee_getopt(&optctl, &i, flags)) != BEE_GETOPT_END) { - + while((opt=bee_getopt(&optctl, &i)) != BEE_GETOPT_END) { if (opt == BEE_GETOPT_ERROR) { exit(1); }