diff options
-rw-r--r-- | util-linux/getopt.c | 52 |
1 files changed, 36 insertions, 16 deletions
diff --git a/util-linux/getopt.c b/util-linux/getopt.c index c45edf8ca..6bad3efc2 100644 --- a/util-linux/getopt.c +++ b/util-linux/getopt.c @@ -32,30 +32,48 @@ */ //usage:#define getopt_trivial_usage -//usage: "[OPTIONS]" +//usage: "[OPTIONS] [--] OPTSTRING PARAMS" //usage:#define getopt_full_usage "\n\n" //usage: IF_LONG_OPTS( //usage: " -a,--alternative Allow long options starting with single -" -//usage: "\n -l,--longoptions=longopts Long options to be recognized" -//usage: "\n -n,--name=progname The name under which errors are reported" -//usage: "\n -o,--options=optstring Short options to be recognized" +//usage: "\n -l,--longoptions=LOPT[,...] Long options to be recognized" +//usage: "\n -n,--name=PROGNAME The name under which errors are reported" +//usage: "\n -o,--options=OPTSTRING Short options to be recognized" //usage: "\n -q,--quiet Disable error reporting by getopt(3)" //usage: "\n -Q,--quiet-output No normal output" -//usage: "\n -s,--shell=shell Set shell quoting conventions" +//usage: "\n -s,--shell=SHELL Set shell quoting conventions" //usage: "\n -T,--test Test for getopt(1) version" //usage: "\n -u,--unquoted Don't quote the output" //usage: ) //usage: IF_NOT_LONG_OPTS( //usage: " -a Allow long options starting with single -" -//usage: "\n -l longopts Long options to be recognized" -//usage: "\n -n progname The name under which errors are reported" -//usage: "\n -o optstring Short options to be recognized" +//usage: "\n -l LOPT[,...] Long options to be recognized" +//usage: "\n -n PROGNAME The name under which errors are reported" +//usage: "\n -o OPTSTRING Short options to be recognized" //usage: "\n -q Disable error reporting by getopt(3)" //usage: "\n -Q No normal output" -//usage: "\n -s shell Set shell quoting conventions" +//usage: "\n -s SHELL Set shell quoting conventions" //usage: "\n -T Test for getopt(1) version" //usage: "\n -u Don't quote the output" //usage: ) +//usage: "\n" +//usage: "\nExample:" +//usage: "\n" +//usage: "\nO=`getopt -l bb: -- ab:c:: \"$@\"`" +//usage: "\n[ $? = 0 ] || exit 1" +//usage: "\neval set -- \"$O\"" +//usage: "\nwhile true; do" +//usage: "\n case \"$1\" in" +//usage: "\n -a) echo A; shift;;" +//usage: "\n -b|--bb) echo \"B:'$2'\"; shift 2;;" +//usage: "\n -c) case \"$2\" in" +//usage: "\n \"\") echo C; shift 2;;" +//usage: "\n *) echo \"C:'$2'\"; shift 2;;" +//usage: "\n esac;;" +//usage: "\n --) shift; break;;" +//usage: "\n *) echo Error; exit 1;;" +//usage: "\n esac" +//usage: "\ndone" //usage: //usage:#define getopt_example_usage //usage: "$ cat getopt.test\n" @@ -339,6 +357,7 @@ static const char getopt_longopts[] ALIGN1 = int getopt_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; int getopt_main(int argc, char **argv) { + int n; char *optstr = NULL; char *name = NULL; unsigned opt; @@ -351,7 +370,7 @@ int getopt_main(int argc, char **argv) compatible = getenv("GETOPT_COMPATIBLE"); /* used as yes/no flag */ - if (argc == 1) { + if (!argv[1]) { if (compatible) { /* For some reason, the original getopt gave no error when there were no arguments. */ @@ -362,10 +381,10 @@ int getopt_main(int argc, char **argv) } if (argv[1][0] != '-' || compatible) { - char *s; + char *s = argv[1]; option_mask32 |= OPT_u; /* quoting off */ - s = xstrdup(argv[1] + strspn(argv[1], "-+")); + s = xstrdup(s + strspn(s, "-+")); argv[1] = argv[0]; return generate_output(argv+1, argc-1, s, long_options); } @@ -392,12 +411,13 @@ int getopt_main(int argc, char **argv) } /* All options controlling the applet have now been parsed */ + n = optind - 1; if (!optstr) { - if (optind >= argc) + optstr = argv[++n]; + if (!optstr) bb_error_msg_and_die("missing optstring argument"); - optstr = argv[optind++]; } - argv[optind-1] = name ? name : argv[0]; - return generate_output(argv+optind-1, argc-optind+1, optstr, long_options); + argv[n] = name ? name : argv[0]; + return generate_output(argv + n, argc - n, optstr, long_options); } |