getopt32: factor out code to treat all args as options

Working towards making getopt32() xmalloc-free

function                                             old     new   delta
make_all_argv_opts                                     -      58     +58
top_main                                             914     912      -2
getopt32                                            1517    1458     -59
------------------------------------------------------------------------------
(add/remove: 2/0 grow/shrink: 0/2 up/down: 58/-61)             Total: -3 bytes

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
diff --git a/libbb/Kbuild.src b/libbb/Kbuild.src
index 458973f..73201a6 100644
--- a/libbb/Kbuild.src
+++ b/libbb/Kbuild.src
@@ -40,7 +40,6 @@
 lib-y += get_console.o
 lib-y += get_last_path_component.o
 lib-y += get_line_from_file.o
-lib-y += getopt32.o
 lib-y += getpty.o
 lib-y += get_volsize.o
 lib-y += herror_msg.o
diff --git a/libbb/getopt32.c b/libbb/getopt32.c
index 80f4cc0..129840c 100644
--- a/libbb/getopt32.c
+++ b/libbb/getopt32.c
@@ -6,12 +6,13 @@
  *
  * Licensed under GPLv2 or later, see file LICENSE in this source tree.
  */
-
 #if ENABLE_LONG_OPTS || ENABLE_FEATURE_GETOPT_LONG
 # include <getopt.h>
 #endif
 #include "libbb.h"
 
+//kbuild:lib-y += getopt32.o
+
 /*      Documentation
 
 uint32_t
@@ -170,21 +171,6 @@
 
 Special characters:
 
- "-"    A group consisting of just a dash forces all arguments
-        to be treated as options, even if they have no leading dashes.
-        Next char in this case can't be a digit (0-9), use ':' or end of line.
-        Example:
-
-        opt_complementary = "-:w-x:x-w"; // "-w-x:x-w" would also work,
-        getopt32(argv, "wx");            // but is less readable
-
-        This makes it possible to use options without a dash (./program w x)
-        as well as with a dash (./program -x).
-
-        NB: getopt32() will leak a small amount of memory if you use
-        this option! Do not use it if there is a possibility of recursive
-        getopt32() calls.
-
  "--"   A double dash at the beginning of opt_complementary means the
         argv[1] string should always be treated as options, even if it isn't
         prefixed with a "-".  This is useful for special syntax in applets
@@ -373,8 +359,7 @@
 	int max_arg = -1;
 
 #define SHOW_USAGE_IF_ERROR     1
-#define ALL_ARGV_IS_OPTS        2
-#define FIRST_ARGV_IS_OPT       4
+#define FIRST_ARGV_IS_OPT       2
 
 	int spec_flgs = 0;
 
@@ -486,8 +471,7 @@
 				if (c == '-') {
 					spec_flgs |= FIRST_ARGV_IS_OPT;
 					s++;
-				} else
-					spec_flgs |= ALL_ARGV_IS_OPTS;
+				}
 			} else {
 				min_arg = c - '0';
 				s++;
@@ -551,9 +535,9 @@
 	opt_complementary = NULL;
 	va_end(p);
 
-	if (spec_flgs & (FIRST_ARGV_IS_OPT | ALL_ARGV_IS_OPTS)) {
+	if (spec_flgs & FIRST_ARGV_IS_OPT) {
 		pargv = argv + 1;
-		while (*pargv) {
+		if (*pargv) {
 			if (pargv[0][0] != '-' && pargv[0][0] != '\0') {
 				/* Can't use alloca: opts with params will
 				 * return pointers to stack!
@@ -563,9 +547,6 @@
 				strcpy(pp + 1, *pargv);
 				*pargv = pp;
 			}
-			if (!(spec_flgs & ALL_ARGV_IS_OPTS))
-				break;
-			pargv++;
 		}
 	}
 
diff --git a/libbb/getopt_allopts.c b/libbb/getopt_allopts.c
new file mode 100644
index 0000000..a67d2b7
--- /dev/null
+++ b/libbb/getopt_allopts.c
@@ -0,0 +1,27 @@
+/* vi: set sw=4 ts=4: */
+/*
+ * Copyright (C) 2017 Denys Vlasenko
+ *
+ * Licensed under GPLv2 or later, see file LICENSE in this source tree.
+ */
+#include "libbb.h"
+
+//kbuild:lib-y += getopt_allopts.o
+
+void FAST_FUNC make_all_argv_opts(char **argv)
+{
+	/* Note: we skip argv[0] */
+	while (*++argv) {
+		char *p;
+
+		if (argv[0][0] == '-')
+			continue;
+		/* Neither top nor ps care if "" arg turns into "-" */
+		/*if (argv[0][0] == '\0')
+			continue;*/
+		p = xmalloc(strlen(*argv) + 2);
+		*p = '-';
+		strcpy(p + 1, *argv);
+		*argv = p;
+	}
+}