[git commit] getopt: simple code shrink; expand help text

Denys Vlasenko vda.linux at googlemail.com
Thu Feb 9 17:17:29 UTC 2012


commit: http://git.busybox.net/busybox/commit/?id=594db1e62a060a0a5646f6840112189fd0ce3b81
branch: http://git.busybox.net/busybox/commit/?id=refs/heads/master

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

Signed-off-by: Denys Vlasenko <vda.linux at googlemail.com>
---
 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 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);
 }


More information about the busybox-cvs mailing list