svn commit: trunk/busybox: archival console-tools coreutils debianu etc...

vda at busybox.net vda at busybox.net
Mon Jul 23 17:14:15 UTC 2007


Author: vda
Date: 2007-07-23 10:14:14 -0700 (Mon, 23 Jul 2007)
New Revision: 19235

Log:
rework long option handling. saves ~1.2k

function                                             old     new   delta
tar_longopts                                           -     222    +222
static.udhcpc_longopts                                 -     192    +192
start_stop_daemon_longopts                             -     150    +150
getopt32                                            1045    1185    +140
static.wget_longopts                                   -     111    +111
static.od_longopts                                     -     105    +105
getopt_longopts                                        -      96     +96
install_longopts                                       -      67     +67
ipcalc_longopts                                        -      63     +63
static.hwclock_longopts                                -      54     +54
ftpgetput_longopts                                     -      52     +52
static.dumpleases_longopts                             -      32     +32
env_longopts                                           -      31     +31
runparts_longopts                                      -      30     +30
mv_longopts                                            -      24     +24
mkdir_longopts                                         -      19     +19
find_pair                                            164     180     +16
bb_null_long_options                                   -      16     +16
setconsole_longopts                                    -      10     +10
display_speed                                         91      98      +7
collect_blk                                          467     474      +7
show_color                                             4       1      -3
ls_main                                              913     904      -9
bb_default_long_options                               16       -     -16
ls_color_opt                                          32      10     -22
setconsole_long_options                               32       -     -32
arith                                               2077    2030     -47
mv_long_options                                       48       -     -48
mkdir_long_options                                    48       -     -48
env_long_options                                      48       -     -48
static.options                                       248     184     -64
runparts_long_options                                 80       -     -80
ftpgetput_long_options                                96       -     -96
static.hwclock_long_options                          112       -    -112
install_long_options                                 112       -    -112
static.long_options                                  144       -    -144
static.wget_long_options                             160       -    -160
longopts                                             160       -    -160
static.arg_options                                   304       -    -304
tar_long_options                                     320       -    -320
long_options                                         384       -    -384
------------------------------------------------------------------------------
(add/remove: 17/15 grow/shrink: 4/5 up/down: 1444/-2209)     Total: -765 bytes
   text    data     bss     dec     hex filename
 782618    1328   11900  795846   c24c6 busybox_old
 781354    1328   11900  794582   c1fd6 busybox_unstripped




Modified:
   trunk/busybox/archival/tar.c
   trunk/busybox/console-tools/setconsole.c
   trunk/busybox/coreutils/env.c
   trunk/busybox/coreutils/install.c
   trunk/busybox/coreutils/ls.c
   trunk/busybox/coreutils/mkdir.c
   trunk/busybox/coreutils/mv.c
   trunk/busybox/coreutils/od_bloaty.c
   trunk/busybox/debianutils/run_parts.c
   trunk/busybox/debianutils/start_stop_daemon.c
   trunk/busybox/include/libbb.h
   trunk/busybox/libbb/getopt32.c
   trunk/busybox/loginutils/chpasswd.c
   trunk/busybox/networking/ftpgetput.c
   trunk/busybox/networking/ipcalc.c
   trunk/busybox/networking/udhcp/dhcpc.c
   trunk/busybox/networking/udhcp/dumpleases.c
   trunk/busybox/networking/wget.c
   trunk/busybox/selinux/chcon.c
   trunk/busybox/selinux/runcon.c
   trunk/busybox/util-linux/getopt.c
   trunk/busybox/util-linux/hwclock.c


Changeset:
Modified: trunk/busybox/archival/tar.c
===================================================================
--- trunk/busybox/archival/tar.c	2007-07-23 15:00:37 UTC (rev 19234)
+++ trunk/busybox/archival/tar.c	2007-07-23 17:14:14 UTC (rev 19235)
@@ -715,45 +715,44 @@
 	OPT_NOPRESERVE_PERM = 1 << OPTBIT_NOPRESERVE_PERM, // no-same-permissions
 };
 #if ENABLE_FEATURE_TAR_LONG_OPTIONS
-static const struct option tar_long_options[] = {
-	{ "list",               0,  NULL,   't' },
-	{ "extract",            0,  NULL,   'x' },
-	{ "directory",          1,  NULL,   'C' },
-	{ "file",               1,  NULL,   'f' },
-	{ "to-stdout",          0,  NULL,   'O' },
-	{ "same-permissions",   0,  NULL,   'p' },
-	{ "verbose",            0,  NULL,   'v' },
-	{ "keep-old",           0,  NULL,   'k' },
+static const char tar_longopts[] =
+	"list\0"                No_argument       "t"
+	"extract\0"             No_argument       "x"
+	"directory\0"           Required_argument "C"
+	"file\0"                Required_argument "f"
+	"to-stdout\0"           No_argument       "O"
+	"same-permissions\0"    No_argument       "p"
+	"verbose\0"             No_argument       "v"
+	"keep-old\0"            No_argument       "k"
 # if ENABLE_FEATURE_TAR_CREATE
-	{ "create",             0,  NULL,   'c' },
-	{ "dereference",        0,  NULL,   'h' },
+	"create\0"              No_argument       "c"
+	"dereference\0"         No_argument       "h"
 # endif
 # if ENABLE_FEATURE_TAR_BZIP2
-	{ "bzip2",              0,  NULL,   'j' },
+	"bzip2\0"               No_argument       "j"
 # endif
 # if ENABLE_FEATURE_TAR_LZMA
-	{ "lzma",               0,  NULL,   'a' },
+	"lzma\0"                No_argument       "a"
 # endif
 # if ENABLE_FEATURE_TAR_FROM
-	{ "files-from",         1,  NULL,   'T' },
-	{ "exclude-from",       1,  NULL,   'X' },
+	"files-from\0"          Required_argument "T"
+	"exclude-from\0"        Required_argument "X"
 # endif
 # if ENABLE_FEATURE_TAR_GZIP
-	{ "gzip",               0,  NULL,   'z' },
+	"gzip\0"                No_argument       "z"
 # endif
 # if ENABLE_FEATURE_TAR_COMPRESS
-	{ "compress",           0,  NULL,   'Z' },
+	"compress\0"            No_argument       "Z"
 # endif
-	{ "no-same-owner",      0,  NULL,   0xfd },
-	{ "no-same-permissions",0,  NULL,   0xfe },
+	"no-same-owner\0"       No_argument       "\xfd"
+	"no-same-permissions\0" No_argument       "\xfe"
 	/* --exclude takes next bit position in option mask, */
 	/* therefore we have to either put it _after_ --no-same-perm */
 	/* or add OPT[BIT]_EXCLUDE before OPT[BIT]_NOPRESERVE_OWN */
 # if ENABLE_FEATURE_TAR_FROM
-	{ "exclude",            1,  NULL,   0xff },
+	"exclude\0"             Required_argument "\xff"
 # endif
-	{ 0,                    0, 0, 0 }
-};
+	"\0";
 #endif
 
 int tar_main(int argc, char **argv);
@@ -787,7 +786,7 @@
 		USE_FEATURE_TAR_CREATE("c--tx:t--cx:x--ct") // mutually exclusive
 		SKIP_FEATURE_TAR_CREATE("t--x:x--t"); // mutually exclusive
 #if ENABLE_FEATURE_TAR_LONG_OPTIONS
-	applet_long_options = tar_long_options;
+	applet_long_options = tar_longopts;
 #endif
 	opt = getopt32(argc, argv,
 		"txC:f:Opvk"

Modified: trunk/busybox/console-tools/setconsole.c
===================================================================
--- trunk/busybox/console-tools/setconsole.c	2007-07-23 15:00:37 UTC (rev 19234)
+++ trunk/busybox/console-tools/setconsole.c	2007-07-23 17:14:14 UTC (rev 19235)
@@ -11,10 +11,9 @@
 #include "libbb.h"
 
 #if ENABLE_FEATURE_SETCONSOLE_LONG_OPTIONS
-static const struct option setconsole_long_options[] = {
-	{ "reset", 0, NULL, 'r' },
-	{ 0, 0, 0, 0 }
-};
+static const char setconsole_longopts[] =
+	"reset\0" No_argument "r"
+	"\0";
 #endif
 
 #define OPT_SETCONS_RESET 1
@@ -26,7 +25,7 @@
 	const char *device = CURRENT_TTY;
 
 #if ENABLE_FEATURE_SETCONSOLE_LONG_OPTIONS
-	applet_long_options = setconsole_long_options;
+	applet_long_options = setconsole_longopts;
 #endif
 	flags = getopt32(argc, argv, "r");
 

Modified: trunk/busybox/coreutils/env.c
===================================================================
--- trunk/busybox/coreutils/env.c	2007-07-23 15:00:37 UTC (rev 19234)
+++ trunk/busybox/coreutils/env.c	2007-07-23 17:14:14 UTC (rev 19235)
@@ -35,11 +35,10 @@
 #include "libbb.h"
 
 #if ENABLE_FEATURE_ENV_LONG_OPTIONS
-static const struct option env_long_options[] = {
-	{ "ignore-environment", 0, NULL, 'i' },
-	{ "unset", 1, NULL, 'u' },
-	{ 0, 0, 0, 0 }
-};
+static const char env_longopts[] =
+	"ignore-environment\0" No_argument       "i"
+	"unset\0"              Required_argument "u"
+	"\0";
 #endif
 
 int env_main(int argc, char** argv);
@@ -53,7 +52,7 @@
 
 	opt_complementary = "u::";
 #if ENABLE_FEATURE_ENV_LONG_OPTIONS
-	applet_long_options = env_long_options;
+	applet_long_options = env_longopts;
 #endif
 	opt = getopt32(argc, argv, "+iu:", &unset_env);
 	argv += optind;

Modified: trunk/busybox/coreutils/install.c
===================================================================
--- trunk/busybox/coreutils/install.c	2007-07-23 15:00:37 UTC (rev 19234)
+++ trunk/busybox/coreutils/install.c	2007-07-23 17:14:14 UTC (rev 19235)
@@ -16,20 +16,19 @@
 #include "libcoreutils/coreutils.h"
 
 #if ENABLE_FEATURE_INSTALL_LONG_OPTIONS
-static const struct option install_long_options[] = {
-	{ "directory",           0, NULL, 'd' },
-	{ "preserve-timestamps", 0, NULL, 'p' },
-	{ "strip",               0, NULL, 's' },
-	{ "group",               0, NULL, 'g' },
-	{ "mode",                0, NULL, 'm' },
-	{ "owner",               0, NULL, 'o' },
+static const char install_longopts[] =
+	"directory\0"           No_argument       "d"
+	"preserve-timestamps\0" No_argument       "p"
+	"strip\0"               No_argument       "s"
+	"group\0"               No_argument       "g"
+	"mode\0"                No_argument       "m"
+	"owner\0"               No_argument       "o"
 #if ENABLE_SELINUX
-	{ "context",             1, NULL, 'Z' },
-	{ "preserve_context",    0, NULL, 0xff },
-	{ "preserve-context",    0, NULL, 0xff },
+	"context\0"             Required_argument "Z"
+	"preserve_context\0"    No_argument       "\xff"
+	"preserve-context\0"    No_argument       "\xff"
 #endif
-	{ 0, 0, 0, 0 }
-};
+	"\0";
 #endif
 
 
@@ -97,7 +96,7 @@
 	};
 
 #if ENABLE_FEATURE_INSTALL_LONG_OPTIONS
-	applet_long_options = install_long_options;
+	applet_long_options = install_longopts;
 #endif
 	opt_complementary = "s--d:d--s" USE_SELINUX(":Z--\xff:\xff--Z");
 	/* -c exists for backwards compatibility, it's needed */

Modified: trunk/busybox/coreutils/ls.c
===================================================================
--- trunk/busybox/coreutils/ls.c	2007-07-23 15:00:37 UTC (rev 19234)
+++ trunk/busybox/coreutils/ls.c	2007-07-23 17:14:14 UTC (rev 19235)
@@ -117,13 +117,12 @@
 
 /* colored LS support by JaWi, janwillem.janssen at lxtreme.nl */
 #if ENABLE_FEATURE_LS_COLOR
-static int show_color;
+static smallint show_color;
 /* long option entry used only for --color, which has no short option
  * equivalent */
-static const struct option ls_color_opt[] = {
-	{ "color", optional_argument, NULL, 1 },
-	{ NULL, 0, NULL, 0 }
-};
+static const char ls_color_opt[] =
+	"color\0" Optional_argument "\xff" /* no short equivalent */
+	"\0";
 #else
 enum { show_color = 0 };
 #endif

Modified: trunk/busybox/coreutils/mkdir.c
===================================================================
--- trunk/busybox/coreutils/mkdir.c	2007-07-23 15:00:37 UTC (rev 19234)
+++ trunk/busybox/coreutils/mkdir.c	2007-07-23 17:14:14 UTC (rev 19235)
@@ -25,14 +25,13 @@
 /* This is a NOFORK applet. Be very careful! */
 
 #if ENABLE_FEATURE_MKDIR_LONG_OPTIONS
-static const struct option mkdir_long_options[] = {
-	{ "mode"   , 1, NULL, 'm' },
-	{ "parents", 0, NULL, 'p' },
+static const char mkdir_longopts[] =
+	"mode\0"    Required_argument "m"
+	"parents\0" No_argument       "p"
 #if ENABLE_SELINUX
-	{ "context", 1, NULL, 'Z' },
+	"context\0" Required_argument "Z"
 #endif
-	{ NULL, 0, NULL, 0 }
-};
+	"\0";
 #endif
 
 int mkdir_main(int argc, char **argv);
@@ -48,7 +47,7 @@
 #endif
 
 #if ENABLE_FEATURE_MKDIR_LONG_OPTIONS
-	applet_long_options = mkdir_long_options;
+	applet_long_options = mkdir_longopts;
 #endif
 	opt = getopt32(argc, argv, "m:p" USE_SELINUX("Z:"), &smode USE_SELINUX(,&scontext));
 	if (opt & 1) {

Modified: trunk/busybox/coreutils/mv.c
===================================================================
--- trunk/busybox/coreutils/mv.c	2007-07-23 15:00:37 UTC (rev 19234)
+++ trunk/busybox/coreutils/mv.c	2007-07-23 17:14:14 UTC (rev 19235)
@@ -21,11 +21,10 @@
 #include "libcoreutils/coreutils.h"
 
 #if ENABLE_FEATURE_MV_LONG_OPTIONS
-static const struct option mv_long_options[] = {
-	{ "interactive", 0, NULL, 'i' },
-	{ "force", 0, NULL, 'f' },
-	{ 0, 0, 0, 0 }
-};
+static const char mv_longopts[] =
+	"interactive\0" No_argument "i"
+	"force\0"       No_argument "f"
+	"\0";
 #endif
 
 #define OPT_FILEUTILS_FORCE       1
@@ -45,7 +44,7 @@
 	int copy_flag = 0;
 
 #if ENABLE_FEATURE_MV_LONG_OPTIONS
-	applet_long_options = mv_long_options;
+	applet_long_options = mv_longopts;
 #endif
 	opt_complementary = "f-i:i-f";
 	flags = getopt32(argc, argv, "fi");

Modified: trunk/busybox/coreutils/od_bloaty.c
===================================================================
--- trunk/busybox/coreutils/od_bloaty.c	2007-07-23 15:00:37 UTC (rev 19234)
+++ trunk/busybox/coreutils/od_bloaty.c	2007-07-23 17:14:14 UTC (rev 19235)
@@ -1242,17 +1242,16 @@
 		OPT_traditional = (1 << 18) * ENABLE_GETOPT_LONG,
 	};
 #if ENABLE_GETOPT_LONG
-	static const struct option long_options[] = {
-		{ "skip-bytes",    required_argument, NULL, 'j' },
-		{ "address-radix", required_argument, NULL, 'A' },
-		{ "read-bytes",    required_argument, NULL, 'N' },
-		{ "format",        required_argument, NULL, 't' },
-		{ "output-duplicates", no_argument,   NULL, 'v' },
-		{ "strings",       optional_argument, NULL, 'S' },
-		{ "width",         optional_argument, NULL, 'w' },
-		{ "traditional",   no_argument,       NULL, 0xff },
-		{ NULL, 0, NULL, 0 }
-	};
+	static const char od_longopts[] =
+		"skip-bytes\0"        Required_argument "j"
+		"address-radix\0"     Required_argument "A"
+		"read-bytes\0"        Required_argument "N"
+		"format\0"            Required_argument "t"
+		"output-duplicates\0" No_argument       "v"
+		"strings\0"           Optional_argument "S"
+		"width\0"             Optional_argument "w"
+		"traditional\0"       No_argument       "\xff"
+		"\0";
 #endif
 	char *str_A, *str_N, *str_j, *str_S;
 	char *str_w = NULL;
@@ -1267,7 +1266,7 @@
 	/* Parse command line */
 	opt_complementary = "t::"; // list
 #if ENABLE_GETOPT_LONG
-	applet_long_options = long_options;
+	applet_long_options = od_longopts;
 #endif
 	opt = getopt32(argc, argv, "A:N:abcdfhij:lot:vxsS:"
 		"w::", // -w with optional param

Modified: trunk/busybox/debianutils/run_parts.c
===================================================================
--- trunk/busybox/debianutils/run_parts.c	2007-07-23 15:00:37 UTC (rev 19234)
+++ trunk/busybox/debianutils/run_parts.c	2007-07-23 17:14:14 UTC (rev 19235)
@@ -35,17 +35,16 @@
 #include "libbb.h"
 
 #if ENABLE_FEATURE_RUN_PARTS_LONG_OPTIONS
-static const struct option runparts_long_options[] = {
-	{ "arg",        1,      NULL,   'a' },
-	{ "umask",      1,      NULL,   'u' },
-	{ "test",       0,      NULL,   't' },
+static const char runparts_longopts[] =
+	"arg\0"     Required_argument "a"
+	"umask\0"   Required_argument "u"
+	"test\0"    No_argument       "t"
 #if ENABLE_FEATURE_RUN_PARTS_FANCY
-	{ "list",       0,      NULL,   'l' },
-//XXX:TODO:	{ "reverse",       0,      NULL,   'r' },
-//XXX:TODO:	{ "verbose",       0,      NULL,   'v' },
+	"list\0"    No_argument       "l"
+//TODO: "reverse\0" No_argument       "r"
+//TODO: "verbose\0" No_argument       "v"
 #endif
-	{ 0,            0,      0,      0   }
-};
+	"\0";
 #endif
 
 struct globals {
@@ -120,7 +119,7 @@
 	/* We require exactly one argument: the directory name */
 	opt_complementary = "=1:a::";
 #if ENABLE_FEATURE_RUN_PARTS_LONG_OPTIONS
-	applet_long_options = runparts_long_options;
+	applet_long_options = runparts_longopts;
 #endif
 	tmp = getopt32(argc, argv, "a:u:t"USE_FEATURE_RUN_PARTS_FANCY("l"), &arg_list, &umask_p);
 	G.mode = tmp &~ (RUN_PARTS_OPT_a|RUN_PARTS_OPT_u);

Modified: trunk/busybox/debianutils/start_stop_daemon.c
===================================================================
--- trunk/busybox/debianutils/start_stop_daemon.c	2007-07-23 15:00:37 UTC (rev 19234)
+++ trunk/busybox/debianutils/start_stop_daemon.c	2007-07-23 17:14:14 UTC (rev 19235)
@@ -194,29 +194,28 @@
 }
 
 #if ENABLE_FEATURE_START_STOP_DAEMON_LONG_OPTIONS
-static const struct option long_options[] = {
-	{ "stop",               0,      NULL,   'K' },
-	{ "start",              0,      NULL,   'S' },
-	{ "background",         0,      NULL,   'b' },
-	{ "quiet",              0,      NULL,   'q' },
-	{ "make-pidfile",       0,      NULL,   'm' },
+static const char start_stop_daemon_longopts[] =
+	"stop\0"         No_argument       "K"
+	"start\0"        No_argument       "S"
+	"background\0"   No_argument       "b"
+	"quiet\0"        No_argument       "q"
+	"make-pidfile\0" No_argument       "m"
 #if ENABLE_FEATURE_START_STOP_DAEMON_FANCY
-	{ "oknodo",             0,      NULL,   'o' },
-	{ "verbose",            0,      NULL,   'v' },
-	{ "nicelevel",          1,      NULL,   'N' },
+	"oknodo\0"       No_argument       "o"
+	"verbose\0"      No_argument       "v"
+	"nicelevel\0"    Required_argument "N"
 #endif
-	{ "startas",            1,      NULL,   'a' },
-	{ "name",               1,      NULL,   'n' },
-	{ "signal",             1,      NULL,   's' },
-	{ "user",               1,      NULL,   'u' },
-	{ "chuid",              1,      NULL,   'c' },
-	{ "exec",               1,      NULL,   'x' },
-	{ "pidfile",            1,      NULL,   'p' },
+	"startas\0"      Required_argument "a"
+	"name\0"         Required_argument "n"
+	"signal\0"       Required_argument "s"
+	"user\0"         Required_argument "u"
+	"chuid\0"        Required_argument "c"
+	"exec\0"         Required_argument "x"
+	"pidfile\0"      Required_argument "p"
 #if ENABLE_FEATURE_START_STOP_DAEMON_FANCY
-	{ "retry",              1,      NULL,   'R' },
+	"retry\0"        Required_argument "R"
 #endif
-	{ 0,                    0,      0,      0 }
-};
+	"\0";
 #endif
 
 enum {
@@ -250,7 +249,7 @@
 	char *opt_N;
 #endif
 #if ENABLE_FEATURE_START_STOP_DAEMON_LONG_OPTIONS
-	applet_long_options = long_options;
+	applet_long_options = start_stop_daemon_longopts;
 #endif
 
 	/* Check required one context option was given */

Modified: trunk/busybox/include/libbb.h
===================================================================
--- trunk/busybox/include/libbb.h	2007-07-23 15:00:37 UTC (rev 19234)
+++ trunk/busybox/include/libbb.h	2007-07-23 17:14:14 UTC (rev 19235)
@@ -590,7 +590,10 @@
 
 extern const char *opt_complementary;
 #if ENABLE_GETOPT_LONG
-extern const struct option *applet_long_options;
+#define No_argument "\0"
+#define Required_argument "\001"
+#define Optional_argument "\002"
+extern const char *applet_long_options;
 #endif
 extern uint32_t option_mask32;
 extern uint32_t getopt32(int argc, char **argv, const char *applet_opts, ...);

Modified: trunk/busybox/libbb/getopt32.c
===================================================================
--- trunk/busybox/libbb/getopt32.c	2007-07-23 15:00:37 UTC (rev 19234)
+++ trunk/busybox/libbb/getopt32.c	2007-07-23 17:14:14 UTC (rev 19235)
@@ -72,24 +72,21 @@
         env -i ls -d /
         Here we want env to process just the '-i', not the '-d'.
 
-const struct option *applet_long_options
+const char *applet_long_options
 
-        This struct allows you to define long options.  The syntax for
-        declaring the array is just like that of getopt's longopts.
-        (see getopt(3))
+        This struct allows you to define long options:
 
-        static const struct option applet_long_options[] = {
-		//name,has_arg,flag,val
-		{ "verbose", 0, 0, 'v' },
-		{ 0, 0, 0, 0 }
-        };
-        applet_long_options = applet_long_options;
+        static const char applet_longopts[] =
+		//"name\0" has_arg val
+		"verbose\0" No_argument "v"
+		"\0";
+        applet_long_options = applet_longopts;
 
         The last member of struct option (val) typically is set to
         matching short option from applet_opts. If there is no matching
         char in applet_opts, then:
         - return bit have next position after short options
-        - if has_arg is not "no_argument", use ptr for arg also
+        - if has_arg is not "No_argument", use ptr for arg also
         - opt_complementary affects it too
 
         Note: a good applet will make long options configurable via the
@@ -290,12 +287,10 @@
 
 /* You can set applet_long_options for parse called long options */
 #if ENABLE_GETOPT_LONG
-static const struct option bb_default_long_options[] = {
-/*      { "help", 0, NULL, '?' }, */
+static const struct option bb_null_long_options[1] = {
 	{ 0, 0, 0, 0 }
 };
-
-const struct option *applet_long_options = bb_default_long_options;
+const char *applet_long_options;
 #endif
 
 uint32_t option_mask32;
@@ -312,6 +307,7 @@
 	va_list p;
 #if ENABLE_GETOPT_LONG
 	const struct option *l_o;
+	struct option *long_options = NULL;
 #endif
 	unsigned trigger;
 	char **pargv = NULL;
@@ -347,19 +343,42 @@
 	}
 
 #if ENABLE_GETOPT_LONG
-	for (l_o = applet_long_options; l_o->name; l_o++) {
-		if (l_o->flag)
-			continue;
-		for (on_off = complementary; on_off->opt != 0; on_off++)
-			if (on_off->opt == l_o->val)
-				goto next_long;
-		if (c >= 32) break;
-		on_off->opt = l_o->val;
-		on_off->switch_on = (1 << c);
-		if (l_o->has_arg != no_argument)
-			on_off->optarg = va_arg(p, void **);
-		c++;
+	if (applet_long_options) {
+		const char *optstr;
+		unsigned i, count;
+
+		count = 1;
+		optstr = applet_long_options;
+		while (optstr[0]) {
+			optstr += strlen(optstr) + 3; /* skip \0, has_arg, val */
+			count++;
+		}
+		/* count == no. of longopts + 1 */
+		long_options = xzalloc(count * sizeof(*long_options));
+		i = 0;
+		optstr = applet_long_options;
+		while (--count) {
+			long_options[i].name = optstr;
+			optstr += strlen(optstr) + 1;
+			long_options[i].has_arg = (unsigned char)(*optstr++);
+			/* long_options[i].flag = NULL; */
+			long_options[i].val = (unsigned char)(*optstr++);
+			i++;
+		}
+		for (l_o = long_options; l_o->name; l_o++) {
+			if (l_o->flag)
+				continue;
+			for (on_off = complementary; on_off->opt != 0; on_off++)
+				if (on_off->opt == l_o->val)
+					goto next_long;
+			if (c >= 32) break;
+			on_off->opt = l_o->val;
+			on_off->switch_on = (1 << c);
+			if (l_o->has_arg != no_argument)
+				on_off->optarg = va_arg(p, void **);
+			c++;
  next_long: ;
+		}
 	}
 #endif /* ENABLE_GETOPT_LONG */
 	for (s = (const unsigned char *)opt_complementary; s && *s; s++) {
@@ -457,7 +476,7 @@
 	 * (supposed to act as --header, but doesn't) */
 #if ENABLE_GETOPT_LONG
 	while ((c = getopt_long(argc, argv, applet_opts,
-				 applet_long_options, NULL)) != -1) {
+			long_options ? long_options : bb_null_long_options, NULL)) != -1) {
 #else
 	while ((c = getopt(argc, argv, applet_opts)) != -1) {
 #endif
@@ -516,6 +535,9 @@
 	if (argc < min_arg || (max_arg >= 0 && argc > max_arg))
 		bb_show_usage();
 
+#if ENABLE_GETOPT_LONG
+	free(long_options);
+#endif
 	option_mask32 = flags;
 	return flags;
 }

Modified: trunk/busybox/loginutils/chpasswd.c
===================================================================
--- trunk/busybox/loginutils/chpasswd.c	2007-07-23 15:00:37 UTC (rev 19234)
+++ trunk/busybox/loginutils/chpasswd.c	2007-07-23 17:14:14 UTC (rev 19235)
@@ -11,11 +11,10 @@
 #if ENABLE_GETOPT_LONG
 #include <getopt.h>
 
-static const struct option chpasswd_opts[] = {
-	{ "encrypted", no_argument, NULL, 'e' },
-	{ "md5", no_argument, NULL, 'm' },
-	{ NULL, 0, NULL, 0 }
-};
+static const char chpasswd_opts[] =
+	"encrypted\0" No_argument "e"
+	"md5\0"       No_argument "m"
+	"\0";
 #endif
 
 #define OPT_ENC		1

Modified: trunk/busybox/networking/ftpgetput.c
===================================================================
--- trunk/busybox/networking/ftpgetput.c	2007-07-23 15:00:37 UTC (rev 19234)
+++ trunk/busybox/networking/ftpgetput.c	2007-07-23 17:14:14 UTC (rev 19235)
@@ -287,14 +287,13 @@
 #define FTPGETPUT_OPT_PORT	16
 
 #if ENABLE_FEATURE_FTPGETPUT_LONG_OPTIONS
-static const struct option ftpgetput_long_options[] = {
-	{ "continue", 1, NULL, 'c' },
-	{ "verbose", 0, NULL, 'v' },
-	{ "username", 1, NULL, 'u' },
-	{ "password", 1, NULL, 'p' },
-	{ "port", 1, NULL, 'P' },
-	{ 0, 0, 0, 0 }
-};
+static const char ftpgetput_longopts[] =
+	"continue\0" Required_argument "c"
+	"verbose\0"  No_argument       "v"
+	"username\0" Required_argument "u"
+	"password\0" Required_argument "p"
+	"port\0"     Required_argument "P"
+	"\0";
 #endif
 
 int ftpgetput_main(int argc, char **argv);
@@ -329,7 +328,7 @@
 	 * Decipher the command line
 	 */
 #if ENABLE_FEATURE_FTPGETPUT_LONG_OPTIONS
-	applet_long_options = ftpgetput_long_options;
+	applet_long_options = ftpgetput_longopts;
 #endif
 	opt_complementary = "=3"; /* must have 3 params */
 	opt = getopt32(argc, argv, "cvu:p:P:", &server->user, &server->password, &port);

Modified: trunk/busybox/networking/ipcalc.c
===================================================================
--- trunk/busybox/networking/ipcalc.c	2007-07-23 15:00:37 UTC (rev 19234)
+++ trunk/busybox/networking/ipcalc.c	2007-07-23 17:14:14 UTC (rev 19235)
@@ -63,17 +63,16 @@
 #define SILENT    0x20
 
 #if ENABLE_FEATURE_IPCALC_LONG_OPTIONS
-	static const struct option long_options[] = {
-		{ "netmask",     no_argument, NULL, 'm' },
-		{ "broadcast",   no_argument, NULL, 'b' },
-		{ "network",     no_argument, NULL, 'n' },
+	static const char ipcalc_longopts[] =
+		"netmask\0"   No_argument "m"
+		"broadcast\0" No_argument "b"
+		"network\0"   No_argument "n"
 # if ENABLE_FEATURE_IPCALC_FANCY
-		{ "prefix",      no_argument, NULL, 'p' },
-		{ "hostname",	 no_argument, NULL, 'h' },
-		{ "silent",      no_argument, NULL, 's' },
+		"prefix\0"    No_argument "p"
+		"hostname\0"  No_argument "h"
+		"silent\0"    No_argument "s"
 # endif
-		{ NULL, 0, NULL, 0 }
-	};
+		"\0";
 #endif
 
 int ipcalc_main(int argc, char **argv);
@@ -86,7 +85,7 @@
 	char *ipstr;
 
 #if ENABLE_FEATURE_IPCALC_LONG_OPTIONS
-	applet_long_options = long_options;
+	applet_long_options = ipcalc_longopts;
 #endif
 	opt = getopt32(argc, argv, "mbn" USE_FEATURE_IPCALC_FANCY("phs"));
 	argc -= optind;

Modified: trunk/busybox/networking/udhcp/dhcpc.c
===================================================================
--- trunk/busybox/networking/udhcp/dhcpc.c	2007-07-23 15:00:37 UTC (rev 19234)
+++ trunk/busybox/networking/udhcp/dhcpc.c	2007-07-23 17:14:14 UTC (rev 19235)
@@ -181,27 +181,26 @@
 		OPT_v = 1 << 17,
 	};
 #if ENABLE_GETOPT_LONG
-	static const struct option arg_options[] = {
-		{ "clientid",   required_argument,      0, 'c' },
-		{ "clientid-none", no_argument,         0, 'C' },
-		{ "vendorclass", required_argument,     0, 'V' },
-		{ "foreground", no_argument,            0, 'f' },
-		{ "background", no_argument,            0, 'b' },
-		{ "hostname",   required_argument,      0, 'H' },
-		{ "hostname",   required_argument,      0, 'h' },
-		{ "fqdn",       required_argument,      0, 'F' },
-		{ "interface",  required_argument,      0, 'i' },
-		{ "now",        no_argument,            0, 'n' },
-		{ "pidfile",    required_argument,      0, 'p' },
-		{ "quit",       no_argument,            0, 'q' },
-		{ "release",    no_argument,            0, 'R' },
-		{ "request",    required_argument,      0, 'r' },
-		{ "script",     required_argument,      0, 's' },
-		{ "timeout",    required_argument,      0, 'T' },
-		{ "version",    no_argument,            0, 'v' },
-		{ "retries",    required_argument,      0, 't' },
-		{ 0, 0, 0, 0 }
-	};
+	static const char udhcpc_longopts[] =
+		"clientid\0"      Required_argument "c"
+		"clientid-none\0" No_argument       "C"
+		"vendorclass\0"   Required_argument "V"
+		"foreground\0"    No_argument       "f"
+		"background\0"    No_argument       "b"
+		"hostname\0"      Required_argument "H"
+		"hostname\0"      Required_argument "h"
+		"fqdn\0"          Required_argument "F"
+		"interface\0"     Required_argument "i"
+		"now\0"           No_argument       "n"
+		"pidfile\0"       Required_argument "p"
+		"quit\0"          No_argument       "q"
+		"release\0"       No_argument       "R"
+		"request\0"       Required_argument "r"
+		"script\0"        Required_argument "s"
+		"timeout\0"       Required_argument "T"
+		"version\0"       No_argument       "v"
+		"retries\0"       Required_argument "t"
+		"\0";
 #endif
 	/* Default options. */
 	client_config.interface = "eth0";
@@ -213,7 +212,7 @@
 	opt_complementary = "c--C:C--c" // mutually exclusive
 	                    ":hH:Hh"; // -h and -H are the same
 #if ENABLE_GETOPT_LONG
-	applet_long_options = arg_options;
+	applet_long_options = udhcpc_longopts;
 #endif
 	opt = getopt32(argc, argv, "c:CV:fbH:h:F:i:np:qRr:s:T:t:v",
 		&str_c, &str_V, &str_h, &str_h, &str_F,

Modified: trunk/busybox/networking/udhcp/dumpleases.c
===================================================================
--- trunk/busybox/networking/udhcp/dumpleases.c	2007-07-23 15:00:37 UTC (rev 19234)
+++ trunk/busybox/networking/udhcp/dumpleases.c	2007-07-23 17:14:14 UTC (rev 19235)
@@ -24,14 +24,13 @@
 		OPT_f	= 0x4,	// -f
 	};
 #if ENABLE_GETOPT_LONG
-	static const struct option options[] = {
-		{ "absolute", no_argument, 0, 'a' },
-		{ "remaining", no_argument, 0, 'r' },
-		{ "file", required_argument, 0, 'f' },
-		{ NULL, 0, 0, 0 }
-	};
+	static const char dumpleases_longopts[] =
+		"absolute\0"  No_argument       "a"
+		"remaining\0" No_argument       "r"
+		"file\0"      Required_argument "f"
+		"\0";
 
-	applet_long_options = options;
+	applet_long_options = dumpleases_longopts;
 #endif
 	opt_complementary = "=0:a--r:r--a";
 	opt = getopt32(argc, argv, "arf:", &file);

Modified: trunk/busybox/networking/wget.c
===================================================================
--- trunk/busybox/networking/wget.c	2007-07-23 15:00:37 UTC (rev 19234)
+++ trunk/busybox/networking/wget.c	2007-07-23 17:14:14 UTC (rev 19235)
@@ -132,20 +132,19 @@
 		WGET_OPT_HEADER     = 0x100,
 	};
 #if ENABLE_FEATURE_WGET_LONG_OPTIONS
-	static const struct option wget_long_options[] = {
-		/* name, has_arg, flag, val */
-		{ "continue",         no_argument, NULL, 'c' },
-		{ "spider",           no_argument, NULL, 's' },
-		{ "quiet",            no_argument, NULL, 'q' },
-		{ "output-document",  required_argument, NULL, 'O' },
-		{ "directory-prefix", required_argument, NULL, 'P' },
-		{ "proxy",            required_argument, NULL, 'Y' },
-		{ "user-agent",       required_argument, NULL, 'U' },
-		{ "passive-ftp",      no_argument, NULL, 0xff },
-		{ "header",           required_argument, NULL, 0xfe },
-		{ 0, 0, 0, 0 }
-	};
-	applet_long_options = wget_long_options;
+	static const char wget_longopts[] =
+		/* name, has_arg, val */
+		"continue\0"         No_argument       "c"
+		"spider\0"           No_argument       "s"
+		"quiet\0"            No_argument       "q"
+		"output-document\0"  Required_argument "O"
+		"directory-prefix\0" Required_argument "P"
+		"proxy\0"            Required_argument "Y"
+		"user-agent\0"       Required_argument "U"
+		"passive-ftp\0"      No_argument       "\xff"
+		"header\0"           Required_argument "\xfe"
+		"\0";
+	applet_long_options = wget_longopts;
 #endif
 	/* server.allocated = target.allocated = NULL; */
 	opt_complementary = "-1" USE_FEATURE_WGET_LONG_OPTIONS(":\xfe::");

Modified: trunk/busybox/selinux/chcon.c
===================================================================
--- trunk/busybox/selinux/chcon.c	2007-07-23 15:00:37 UTC (rev 19234)
+++ trunk/busybox/selinux/chcon.c	2007-07-23 17:14:14 UTC (rev 19235)
@@ -105,20 +105,19 @@
 }
 
 #if ENABLE_FEATURE_CHCON_LONG_OPTIONS
-static struct option chcon_options[] = {
-	{ "recursive",      0, NULL, 'R' },
-	{ "changes",        0, NULL, 'c' },
-	{ "no-dereference", 0, NULL, 'h' },
-	{ "silent",         0, NULL, 'f' },
-	{ "quiet",          0, NULL, 'f' },
-	{ "user",           1, NULL, 'u' },
-	{ "role",           1, NULL, 'r' },
-	{ "type",           1, NULL, 't' },
-	{ "range",          1, NULL, 'l' },
-	{ "verbose",        0, NULL, 'v' },
-	{ "reference",      1, NULL, 0xff }, /* no short option */
-	{ NULL,             0, NULL, 0 },
-};
+static const char chcon_longopts[] =
+	"recursive\0"      No_argument       "R"
+	"changes\0"        No_argument       "c"
+	"no-dereference\0" No_argument       "h"
+	"silent\0"         No_argument       "f"
+	"quiet\0"          No_argument       "f"
+	"user\0"           Required_argument "u"
+	"role\0"           Required_argument "r"
+	"type\0"           Required_argument "t"
+	"range\0"          Required_argument "l"
+	"verbose\0"        No_argument       "v"
+	"reference\0"      Required_argument "\xff" /* no short option */
+	"\0";
 #endif
 
 int chcon_main(int argc, char **argv);
@@ -129,7 +128,7 @@
 	int i, errors = 0;
 
 #if ENABLE_FEATURE_CHCON_LONG_OPTIONS
-	applet_long_options = chcon_options;
+	applet_long_options = chcon_longopts;
 #endif
 	opt_complementary = "-1"  /* at least 1 param */
 		":?"  /* error if exclusivity constraints are violated */

Modified: trunk/busybox/selinux/runcon.c
===================================================================
--- trunk/busybox/selinux/runcon.c	2007-07-23 15:00:37 UTC (rev 19234)
+++ trunk/busybox/selinux/runcon.c	2007-07-23 17:14:14 UTC (rev 19235)
@@ -69,15 +69,14 @@
 }
 
 #if ENABLE_FEATURE_RUNCON_LONG_OPTIONS
-static const struct option runcon_options[] = {
-	{ "user",       1, NULL, 'u' },
-	{ "role",       1, NULL, 'r' },
-	{ "type",       1, NULL, 't' },
-	{ "range",      1, NULL, 'l' },
-	{ "compute",    0, NULL, 'c' },
-	{ "help",       0, NULL, 'h' },
-	{ NULL,         0, NULL, 0 },
-};
+static const char runcon_options[] =
+	"user\0"    Required_argument "u"
+	"role\0"    Required_argument "r"
+	"type\0"    Required_argument "t"
+	"range\0"   Required_argument "l"
+	"compute\0" No_argument "c"
+	"help\0"    No_argument "h"      
+	"\0";
 #endif
 
 #define OPTS_ROLE	(1<<0)	/* r */

Modified: trunk/busybox/util-linux/getopt.c
===================================================================
--- trunk/busybox/util-linux/getopt.c	2007-07-23 15:00:37 UTC (rev 19234)
+++ trunk/busybox/util-linux/getopt.c	2007-07-23 17:14:14 UTC (rev 19235)
@@ -266,18 +266,17 @@
  */
 
 #if ENABLE_GETOPT_LONG
-static const struct option longopts[] = {
-	{ "options",      required_argument, NULL, 'o' },
-	{ "longoptions",  required_argument, NULL, 'l' },
-	{ "quiet",        no_argument,       NULL, 'q' },
-	{ "quiet-output", no_argument,       NULL, 'Q' },
-	{ "shell",        required_argument, NULL, 's' },
-	{ "test",         no_argument,       NULL, 'T' },
-	{ "unquoted",     no_argument,       NULL, 'u' },
-	{ "alternative",  no_argument,       NULL, 'a' },
-	{ "name",         required_argument, NULL, 'n' },
-	{ NULL, 0, NULL, 0 }
-};
+static const char getopt_longopts[] =
+	"options\0"      Required_argument "o"
+	"longoptions\0"  Required_argument "l"
+	"quiet\0"        No_argument       "q"
+	"quiet-output\0" No_argument       "Q"
+	"shell\0"        Required_argument "s"
+	"test\0"         No_argument       "T"
+	"unquoted\0"     No_argument       "u"
+	"alternative\0"  No_argument       "a"
+	"name\0"         Required_argument "n"
+	"\0";
 #endif
 
 int getopt_main(int argc, char *argv[]);
@@ -317,7 +316,7 @@
 #if !ENABLE_GETOPT_LONG
 	opt = getopt32(argc, argv, "+o:n:qQs:Tu", &optstr, &name, &s_arg);
 #else
-	applet_long_options = longopts;
+	applet_long_options = getopt_longopts;
 	opt_complementary = "l::";
 	opt = getopt32(argc, argv, "+o:n:qQs:Tual:",
 					&optstr, &name, &s_arg, &l_arg);

Modified: trunk/busybox/util-linux/hwclock.c
===================================================================
--- trunk/busybox/util-linux/hwclock.c	2007-07-23 15:00:37 UTC (rev 19234)
+++ trunk/busybox/util-linux/hwclock.c	2007-07-23 17:14:14 UTC (rev 19235)
@@ -178,16 +178,15 @@
 	int utc;
 
 #if ENABLE_FEATURE_HWCLOCK_LONG_OPTIONS
-	static const struct option hwclock_long_options[] = {
-		{ "localtime", 0, 0, 'l' },
-		{ "utc",       0, 0, 'u' },
-		{ "show",      0, 0, 'r' },
-		{ "hctosys",   0, 0, 's' },
-		{ "systohc",   0, 0, 'w' },
-		{ "file",      1, 0, 'f' },
-		{ 0,           0, 0, 0 }
-	};
-	applet_long_options = hwclock_long_options;
+	static const char hwclock_longopts[] =
+		"localtime\0" No_argument "l"
+		"utc\0"       No_argument "u"
+		"show\0"      No_argument "r"
+		"hctosys\0"   No_argument "s"
+		"systohc\0"   No_argument "w"
+		"file\0"      Required_argument "f"
+		"\0";
+	applet_long_options = hwclock_longopts;
 #endif
 	opt_complementary = "r--ws:w--rs:s--wr:l--u:u--l";
 	opt = getopt32(argc, argv, "lurswf:", &rtcname);




More information about the busybox-cvs mailing list