getopt: simple code shrink; expand help text

function                                             old     new   delta
packed_usage                                       28978   29184    +206
getopt_main                                          656     632     -24

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
Denys Vlasenko 2012-02-09 18:17:29 +01:00
parent 9106107a50
commit 594db1e62a

View File

@ -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);
}