busybox: add '--show SCRIPT' option to display scripts

Add an option to allow the content of embedded scripts to be
displayed.  This includes applet scripts, custom scripts and the
.profile script.

function                                             old     new   delta
busybox_main                                         624     701     +77
find_script_by_name                                    -      24     +24
scripted_main                                         41      35      -6
------------------------------------------------------------------------------
(add/remove: 1/0 grow/shrink: 1/1 up/down: 101/-6)             Total: 95 bytes

Signed-off-by: Ron Yorston <rmy@pobox.com>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
diff --git a/libbb/appletlib.c b/libbb/appletlib.c
index a0ebaca..a79a37e 100644
--- a/libbb/appletlib.c
+++ b/libbb/appletlib.c
@@ -756,6 +756,44 @@
 
 static void run_applet_and_exit(const char *name, char **argv) NORETURN;
 
+# if NUM_SCRIPTS > 0
+static int find_script_by_name(const char *name)
+{
+	int i;
+	int applet = find_applet_by_name(name);
+
+	if (applet >= 0) {
+		for (i = 0; i < NUM_SCRIPTS; ++i)
+			if (applet_numbers[i] == applet)
+				return i;
+	}
+	return -1;
+}
+
+int scripted_main(int argc UNUSED_PARAM, char **argv)
+{
+	int script = find_script_by_name(applet_name);
+	if (script >= 0)
+		exit(ash_main(-script - 1, argv));
+	return 0;
+}
+
+char* FAST_FUNC
+get_script_content(unsigned n)
+{
+	char *t = unpack_bz2_data(packed_scripts, sizeof(packed_scripts),
+					UNPACKED_SCRIPTS_LENGTH);
+	if (t) {
+		while (n != 0) {
+			while (*t++ != '\0')
+				continue;
+			n--;
+		}
+	}
+	return t;
+}
+# endif /* NUM_SCRIPTS > 0 */
+
 # if ENABLE_BUSYBOX
 #  if ENABLE_FEATURE_SH_STANDALONE && ENABLE_FEATURE_TAB_COMPLETION
     /*
@@ -793,6 +831,9 @@
 			"\n"
 			"Usage: busybox [function [arguments]...]\n"
 			"   or: busybox --list"IF_FEATURE_INSTALLER("[-full]")"\n"
+#  if ENABLE_FEATURE_SHOW_SCRIPT && NUM_SCRIPTS > 0
+			"   or: busybox --show SCRIPT\n"
+#  endif
 			IF_FEATURE_INSTALLER(
 			"   or: busybox --install [-s] [DIR]\n"
 			)
@@ -838,6 +879,19 @@
 		return 0;
 	}
 
+#  if ENABLE_FEATURE_SHOW_SCRIPT && NUM_SCRIPTS > 0
+	if (strcmp(argv[1], "--show") == 0) {
+		int n;
+		if (!argv[2])
+			bb_error_msg_and_die(bb_msg_requires_arg, "--show");
+		n = find_script_by_name(argv[2]);
+		if (n < 0)
+			bb_error_msg_and_die("script '%s' not found", argv[2]);
+		full_write1_str(get_script_content(n));
+		return 0;
+	}
+#  endif
+
 	if (is_prefixed_with(argv[1], "--list")) {
 		unsigned i = 0;
 		const char *a = applet_names;
@@ -939,44 +993,6 @@
 }
 # endif /* NUM_APPLETS > 0 */
 
-# if NUM_SCRIPTS > 0
-static int find_script_by_name(const char *name)
-{
-	int i;
-	int applet = find_applet_by_name(name);
-
-	if (applet >= 0) {
-		for (i = 0; i < NUM_SCRIPTS; ++i)
-			if (applet_numbers[i] == applet)
-				return i;
-	}
-	return -1;
-}
-
-int scripted_main(int argc UNUSED_PARAM, char **argv)
-{
-	int script = find_script_by_name(applet_name);
-	if (script >= 0)
-		exit(ash_main(-script - 1, argv));
-	return 0;
-}
-
-char* FAST_FUNC
-get_script_content(unsigned n)
-{
-	char *t = unpack_bz2_data(packed_scripts, sizeof(packed_scripts),
-					UNPACKED_SCRIPTS_LENGTH);
-	if (t) {
-		while (n != 0) {
-			while (*t++ != '\0')
-				continue;
-			n--;
-		}
-	}
-	return t;
-}
-# endif /* NUM_SCRIPTS > 0 */
-
 # if ENABLE_BUSYBOX || NUM_APPLETS > 0
 static NORETURN void run_applet_and_exit(const char *name, char **argv)
 {