summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--util-linux/getopt.c52
1 files changed, 36 insertions, 16 deletions
diff --git a/util-linux/getopt.c b/util-linux/getopt.c
index c45edf8..6bad3ef 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);
}