getopt32: add new syntax of 'o:+' and 'o:*' for -o NUM and -o LIST

In many cases, this aqllows to drop use of opt_complementary.
Approximately -400 bytes:

function                                             old     new   delta
getopt32                                            1423    1502     +79
opt_string                                            17      18      +1
OPT_STR                                               24      25      +1
uniq_main                                            416     406     -10
timeout_main                                         279     269     -10
sulogin_main                                         270     260     -10
readprofile_main                                    1825    1815     -10
ps_main                                              543     533     -10
pidof_main                                           245     235     -10
pgrep_main                                           611     601     -10
od_main                                             2600    2590     -10
mkfs_minix_main                                     2684    2674     -10
mkfs_ext2_main                                      2603    2593     -10
microcom_main                                        712     702     -10
makemime_main                                        315     305     -10
ionice_main                                          282     272     -10
inetd_main                                          2074    2064     -10
ifplugd_main                                        1144    1134     -10
halt_main                                            353     343     -10
getopt_main                                          636     626     -10
fdisk_main                                          2854    2844     -10
env_main                                             206     196     -10
dmesg_main                                           319     309     -10
conspy_main                                         1214    1204     -10
awk_main                                             981     971     -10
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 3/22 up/down: 81/-220)         Total: -139 bytes
   text	   data	    bss	    dec	    hex	filename
 919373	    906	  14060	 934339	  e41c3	busybox_old
 918969	    906	  14060	 933935	  e402f	busybox_unstripped

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
diff --git a/util-linux/dmesg.c b/util-linux/dmesg.c
index e543446..50e8a0f 100644
--- a/util-linux/dmesg.c
+++ b/util-linux/dmesg.c
@@ -34,8 +34,7 @@
 		OPT_r = 1 << 3
 	};
 
-	opt_complementary = "s+:n+"; /* numeric */
-	opts = getopt32(argv, "cs:n:r", &len, &level);
+	opts = getopt32(argv, "cs:+n:+r", &len, &level);
 	if (opts & OPT_n) {
 		if (klogctl(8, NULL, (long) level))
 			bb_perror_msg_and_die("klogctl");
diff --git a/util-linux/fdisk.c b/util-linux/fdisk.c
index f49ce95..6391f9b 100644
--- a/util-linux/fdisk.c
+++ b/util-linux/fdisk.c
@@ -2919,8 +2919,7 @@
 
 	close_dev_fd(); /* needed: fd 3 must not stay closed */
 
-	opt_complementary = "b+:C+:H+:S+"; /* numeric params */
-	opt = getopt32(argv, "b:C:H:lS:u" IF_FEATURE_FDISK_BLKSIZE("s"),
+	opt = getopt32(argv, "b:+C:+H:+lS:+u" IF_FEATURE_FDISK_BLKSIZE("s"),
 				&sector_size, &user_cylinders, &user_heads, &user_sectors);
 	argv += optind;
 	if (opt & OPT_b) {
diff --git a/util-linux/getopt.c b/util-linux/getopt.c
index b9dadf1..18d4909 100644
--- a/util-linux/getopt.c
+++ b/util-linux/getopt.c
@@ -397,8 +397,7 @@
 	opt = getopt32(argv, "+o:n:qQs:Tu", &optstr, &name, &s_arg);
 #else
 	applet_long_options = getopt_longopts;
-	opt_complementary = "l::";
-	opt = getopt32(argv, "+o:n:qQs:Tual:",
+	opt = getopt32(argv, "+o:n:qQs:Tual:*",
 					&optstr, &name, &s_arg, &l_arg);
 	/* Effectuate the read options for the applet itself */
 	while (l_arg) {
diff --git a/util-linux/mkfs_ext2.c b/util-linux/mkfs_ext2.c
index f91a0b4..413e7aa 100644
--- a/util-linux/mkfs_ext2.c
+++ b/util-linux/mkfs_ext2.c
@@ -244,8 +244,7 @@
 
 	// using global "option_mask32" instead of local "opts":
 	// we are register starved here
-	opt_complementary = "-1:b+:i+:I+:m+";
-	/*opts =*/ getopt32(argv, "cl:b:f:i:I:J:G:N:m:o:g:L:M:O:r:E:T:U:jnqvFS",
+	/*opts =*/ getopt32(argv, "cl:b:+f:i:+I:+J:G:N:m:+o:g:L:M:O:r:E:T:U:jnqvFS",
 		/*lbfi:*/ NULL, &bs, NULL, &bpi,
 		/*IJGN:*/ &user_inodesize, NULL, NULL, NULL,
 		/*mogL:*/ &reserved_percent, NULL, NULL, &label,
diff --git a/util-linux/mkfs_minix.c b/util-linux/mkfs_minix.c
index 88d7975..aaabf84 100644
--- a/util-linux/mkfs_minix.c
+++ b/util-linux/mkfs_minix.c
@@ -604,8 +604,7 @@
 		bb_error_msg_and_die("bad inode size");
 #endif
 
-	opt_complementary = "n+"; /* -n N */
-	opt = getopt32(argv, "ci:l:n:v", &str_i, &listfile, &G.namelen);
+	opt = getopt32(argv, "ci:l:n:+v", &str_i, &listfile, &G.namelen);
 	argv += optind;
 	//if (opt & 1) -c
 	if (opt & 2) G.req_nr_inodes = xatoul(str_i); // -i
diff --git a/util-linux/mkfs_reiser.c b/util-linux/mkfs_reiser.c
index 56c8f0a..0a31ee4 100644
--- a/util-linux/mkfs_reiser.c
+++ b/util-linux/mkfs_reiser.c
@@ -169,8 +169,8 @@
 
 	// using global "option_mask32" instead of local "opts":
 	// we are register starved here
-	opt_complementary = "-1:b+";
-	/*opts =*/ getopt32(argv, "b:j:s:o:t:B:h:u:l:fqd",
+	opt_complementary = "-1";
+	/*opts =*/ getopt32(argv, "b:+j:s:o:t:B:h:u:l:fqd",
 		NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, &label);
 	argv += optind; // argv[0] -- device
 
diff --git a/util-linux/mount.c b/util-linux/mount.c
index cef4f74..13590ce 100644
--- a/util-linux/mount.c
+++ b/util-linux/mount.c
@@ -268,7 +268,7 @@
 };
 
 
-#define OPTION_STR "o:t:rwanfvsiO:" IF_FEATURE_MOUNT_OTHERTAB("T:")
+#define OPTION_STR "o:*t:rwanfvsiO:" IF_FEATURE_MOUNT_OTHERTAB("T:")
 enum {
 	OPT_o = (1 << 0),
 	OPT_t = (1 << 1),
@@ -2167,7 +2167,7 @@
 
 	// Parse remaining options
 	// Max 2 params; -o is a list, -v is a counter
-	opt_complementary = "?2o::" IF_FEATURE_MOUNT_VERBOSE("vv");
+	opt_complementary = "?2" IF_FEATURE_MOUNT_VERBOSE("vv");
 	opt = getopt32(argv, OPTION_STR, &lst_o, &fstype, &O_optmatch
 			IF_FEATURE_MOUNT_OTHERTAB(, &fstabname)
 			IF_FEATURE_MOUNT_VERBOSE(, &verbose));
diff --git a/util-linux/readprofile.c b/util-linux/readprofile.c
index a645404..345b676 100644
--- a/util-linux/readprofile.c
+++ b/util-linux/readprofile.c
@@ -99,8 +99,7 @@
 	proFile = defaultpro;
 	mapFile = defaultmap;
 
-	opt_complementary = "M+"; /* -M N */
-	opt = getopt32(argv, "M:m:p:nabsirv", &multiplier, &mapFile, &proFile);
+	opt = getopt32(argv, "M:+m:p:nabsirv", &multiplier, &mapFile, &proFile);
 
 	if (opt & (OPT_M|OPT_r)) { /* mult or reset, or both */
 		int fd, to_write;