Patch from Dennis Vlasenko to add the option to compress help text.
authorRob Landley <rob@landley.net>
Thu, 27 Apr 2006 23:34:46 +0000 (23:34 -0000)
committerRob Landley <rob@landley.net>
Thu, 27 Apr 2006 23:34:46 +0000 (23:34 -0000)
Config.in
Makefile
applets/applets.c
archival/libunarchive/Makefile.in
include/applets.h
scripts/usage.c [new file with mode: 0644]
scripts/usage_compressed [new file with mode: 0644]

index b23ec2ce1c7e1436e29f12f85913e68cc788c421..6dd4c58e7cff2ca74cdbaab6b8f8a8e58b6f7ac3 100644 (file)
--- a/Config.in
+++ b/Config.in
@@ -56,6 +56,14 @@ config CONFIG_FEATURE_VERBOSE_USAGE
          busybox binary.  In the default configuration, this will add about
          13k, but it can add much more depending on your configuration.
 
+config CONFIG_FEATURE_COMPRESS_USAGE
+       bool "Store applet usage messages in compressed form"
+       default y
+       depends on CONFIG_SHOW_USAGE
+       help
+         Store usage messages in compressed form, uncompress them on-the-fly
+         when <applet> --help is called.
+
 config CONFIG_FEATURE_INSTALLER
        bool "Support --install [-s] to install applet links at runtime"
        default n
index bcf25fe6dca7beeb4369199a70fd160ee7897208..e8730bfd066979ec3557d36057597b39baf39a96 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -405,6 +405,13 @@ include/bbconfigopts.h: .config
        $(Q)$(top_srcdir)/scripts/config/mkconfigs > $@
 endif
 
+scripts/usage: $(top_srcdir)/scripts/usage.c .config
+       $(HOSTCC) $(HOSTCFLAGS) -I$(top_srcdir)/include -o $@ $<
+
+DEP_INCLUDES += include/usage_compressed.h
+include/usage_compressed.h: .config scripts/usage
+       $(Q)sh $(top_srcdir)/scripts/usage_compressed "$(top_srcdir)/scripts" > $@
+
 depend dep: .depend
 .depend: scripts/bb_mkdep $(DEP_INCLUDES)
        $(disp_gen)
index 77e4fdbfe515483320aff53fa442e333558598f5..387ddce84d04e1a63c1ab682d80320358c964cda 100644 (file)
 #include <assert.h>
 #include "busybox.h"
 
-#if ENABLE_SHOW_USAGE
-const char usage_messages[] =
-
+#if ENABLE_SHOW_USAGE && !ENABLE_FEATURE_COMPRESS_USAGE
+static const char usage_messages[] =
 #define MAKE_USAGE
 #include "usage.h"
-
 #include "applets.h"
-
 ;
-
 #undef MAKE_USAGE
 #endif /* ENABLE_SHOW_USAGE */
+
 #undef APPLET
 #undef APPLET_NOUSAGE
 #undef PROTOTYPES
 #include "applets.h"
 
-
 static struct BB_applet *applet_using;
 
 /* The -1 arises because of the {0,NULL,0,-1} entry above. */
@@ -405,27 +401,69 @@ static void check_suid (struct BB_applet *applet)
 
 
 
+#if ENABLE_FEATURE_COMPRESS_USAGE
 
+#include "usage_compressed.h"
+#include "unarchive.h"
 
-void bb_show_usage (void)
+static const char *unpack_usage_messages(void)
 {
-#if ENABLE_SHOW_USAGE
-  const char *format_string;
-  const char *usage_string = usage_messages;
-  int i;
-
-  for (i = applet_using - applets; i > 0;) {
-       if (!*usage_string++) {
-         --i;
+       int input[2], output[2], pid;
+       char *buf;
+
+       if(pipe(input) < 0 || pipe(output) < 0)
+               exit(1);
+
+       pid = fork();
+       switch (pid) {
+       case -1: /* error */
+               exit(1);
+       case 0: /* child */
+               close(input[1]);
+               close(output[0]);
+               uncompressStream(input[0], output[1]);
+               exit(0);
        }
-  }
+       /* parent */
+
+       close(input[0]);
+       close(output[1]);
+       pid = fork();
+       switch (pid) {
+       case -1: /* error */
+               exit(1);
+       case 0: /* child */
+               bb_full_write(input[1], packed_usage, sizeof(packed_usage));
+               exit(0);
+       }
+       /* parent */
+       close(input[1]);
 
-  format_string = "%s\n\nUsage: %s %s\n\n";
-  if (*usage_string == '\b')
-       format_string = "%s\n\nNo help available.\n\n";
-  fprintf (stderr, format_string, bb_msg_full_version, applet_using->name,
-                  usage_string);
-#endif /* ENABLE_SHOW_USAGE */
+       buf = xmalloc(SIZEOF_usage_messages);
+       bb_full_read(output[0], buf, SIZEOF_usage_messages);
+       return buf;
+}
+
+#else
+#define unpack_usage_messages() usage_messages;
+#endif /* ENABLE_FEATURE_COMPRESS_USAGE */
+
+void bb_show_usage (void)
+{
+       if (ENABLE_SHOW_USAGE) {
+               const char *format_string;
+               const char *usage_string = unpack_usage_messages();
+               int i;
+
+               for (i = applet_using - applets; i > 0;)
+                       if (!*usage_string++) --i;
+
+               format_string = "%s\n\nUsage: %s %s\n\n";
+               if (*usage_string == '\b')
+                       format_string = "%s\n\nNo help available.\n\n";
+               fprintf (stderr, format_string, bb_msg_full_version,
+                       applet_using->name, usage_string);
+       }
 
   exit (bb_default_error_retval);
 }
index 9bb91563d5d256eb7de41912484c14dab0715a5d..928e5bf8bca0c7f2ecdc1c6ce28ae8b523b18bec 100644 (file)
@@ -67,6 +67,7 @@ LIBUNARCHIVE-$(CONFIG_FEATURE_TAR_GZIP) += $(GUNZIP_FILES) get_header_tar_gz.o
 LIBUNARCHIVE-$(CONFIG_FEATURE_TAR_COMPRESS) += decompress_uncompress.o
 LIBUNARCHIVE-$(CONFIG_UNCOMPRESS) += decompress_uncompress.o
 LIBUNARCHIVE-$(CONFIG_UNZIP) += $(GUNZIP_FILES)
+LIBUNARCHIVE-$(CONFIG_FEATURE_COMPRESS_USAGE) += decompress_bunzip2.o
 
 
 LIBUNARCHIVE-y:=$(sort $(LIBUNARCHIVE-y))
index 059472248d823b3d60c98b3b5399a09d8de4cd93..06bd9e7f514f6e4d4bce4fab727352aedb6afe34 100644 (file)
@@ -19,7 +19,6 @@
 # define APPLET(a,b,c,d) extern int b(int argc, char **argv);
 # define APPLET_NOUSAGE(a,b,c,d) extern int b(int argc, char **argv);
 # define APPLET_ODDNAME(a,b,c,d,e) extern int b(int argc, char **argv);
-  extern const char usage_messages[];
 #elif defined(MAKE_USAGE)
 # ifdef CONFIG_FEATURE_VERBOSE_USAGE
 #  define APPLET(a,b,c,d) a##_trivial_usage "\n\n" a##_full_usage "\0"
diff --git a/scripts/usage.c b/scripts/usage.c
new file mode 100644 (file)
index 0000000..06f059a
--- /dev/null
@@ -0,0 +1,14 @@
+#include <unistd.h>
+#include "busybox.h"
+
+static const char usage_messages[] =
+#define MAKE_USAGE
+#include "usage.h"
+#include "applets.h"
+;
+
+int main(void)
+{
+       write(1, usage_messages, sizeof(usage_messages));
+       return 0;
+}
diff --git a/scripts/usage_compressed b/scripts/usage_compressed
new file mode 100644 (file)
index 0000000..fa12e40
--- /dev/null
@@ -0,0 +1,11 @@
+#!/bin/sh
+
+loc="$1"
+
+test "$loc" || loc=.
+
+echo 'static const char packed_usage[] = '
+"$loc"/usage | bzip2 -9 | od -v -t x1 \
+| sed -e 's/^[^ ]*//' -e 's/ \(..\)/\\x\1/g' -e 's/^\(.*\)$/"\1"/'
+echo ';'
+echo '#define SIZEOF_usage_messages' $((0 + `"$loc"/usage | wc -c `))