changeset 858:34ac05521d94

Move guts of help command into show_help() in lib/help.c, with config TOYBOX_HELP controlling infrastructure.
author Rob Landley <rob@landley.net>
date Sun, 14 Apr 2013 21:43:22 -0500
parents da601285a86e
children 4edd1cb3f700
files Config.in lib/args.c lib/help.c lib/lib.c lib/lib.h toys/other/help.c toys/other/losetup.c
diffstat 7 files changed, 50 insertions(+), 27 deletions(-) [+]
line wrap: on
line diff
--- a/Config.in	Sun Apr 14 12:35:25 2013 -0500
+++ b/Config.in	Sun Apr 14 21:43:22 2013 -0500
@@ -35,6 +35,12 @@
 	  Include floating point support infrastructure and commands that
 	  require it.
 
+config TOYBOX_HELP
+	bool "Help messages:
+	default y
+	help
+	  Include help text for each command.
+
 config TOYBOX_I18N
 	bool "Internationalization support"
 	default y
--- a/lib/args.c	Sun Apr 14 12:35:25 2013 -0500
+++ b/lib/args.c	Sun Apr 14 21:43:22 2013 -0500
@@ -341,7 +341,7 @@
   // Option parsing is a two stage process: parse the option string into
   // a struct opts list, then use that list to process argv[];
 
-  if (CFG_HELP) toys.exithelp++;
+  toys.exithelp++;
   // Allocate memory for optargs
   saveflags = 0;
   while (toys.argv[saveflags++]);
@@ -437,7 +437,7 @@
       gof.minargs, letters[!(gof.minargs-1)]);
   if (toys.optc>gof.maxargs)
     error_exit("Max %d argument%s", gof.maxargs, letters[!(gof.maxargs-1)]);
-  if (CFG_HELP) toys.exithelp = 0;
+  toys.exithelp = 0;
 
   if (CFG_TOYBOX_FREE) {
     llist_traverse(gof.opts, free);
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/help.c	Sun Apr 14 21:43:22 2013 -0500
@@ -0,0 +1,33 @@
+// Function to display help text
+
+#include "toys.h"
+
+#if !CFG_TOYBOX_HELP
+void show_help(char *command) {;}
+#else
+#include "generated/help.h"
+
+#undef NEWTOY
+#undef OLDTOY
+#define NEWTOY(name,opt,flags) help_##name "\0"
+#define OLDTOY(name,oldname,opts,flags) "\xff" #oldname "\0"
+static char *help_data =
+#include "generated/newtoys.h"
+;
+
+void show_help(void)
+{
+  int i = toys.which-toy_list;
+  char *s;
+
+  for (;;) {
+    s = help_data;
+    while (i--) s += strlen(s) + 1;
+    // If it's an alias, restart search for real name
+    if (*s != 255) break;
+    i = toy_find(++s)-toy_list;
+  }
+
+  fprintf(toys.exithelp ? stderr : stdout, "%s", s);
+}
+#endif
--- a/lib/lib.c	Sun Apr 14 12:35:25 2013 -0500
+++ b/lib/lib.c	Sun Apr 14 21:43:22 2013 -0500
@@ -52,11 +52,7 @@
 {
   va_list va;
 
-  if (CFG_HELP && toys.exithelp) {
-    *toys.optargs=*toys.argv;
-    USE_HELP(help_main();)  // dear gcc: shut up.
-    fprintf(stderr,"\n");
-  }
+  if (CFG_TOYBOX_HELP && toys.exithelp) show_help();
 
   va_start(va, msg);
   verror_msg(msg, 0, va);
--- a/lib/lib.h	Sun Apr 14 12:35:25 2013 -0500
+++ b/lib/lib.h	Sun Apr 14 21:43:22 2013 -0500
@@ -81,6 +81,10 @@
   int (*callback)(struct dirtree *node), int symfollow);
 struct dirtree *dirtree_read(char *path, int (*callback)(struct dirtree *node));
 
+// help.c
+
+void show_help(void);
+
 // lib.c
 void xstrcpy(char *dest, char *src, size_t size);
 void verror_msg(char *msg, int err, va_list va);
--- a/toys/other/help.c	Sun Apr 14 12:35:25 2013 -0500
+++ b/toys/other/help.c	Sun Apr 14 21:43:22 2013 -0500
@@ -9,6 +9,7 @@
 config HELP
   bool "help"
   default y
+  depends on TOYBOX_HELP
   help
     usage: help [command]
 
@@ -18,29 +19,12 @@
 
 
 #include "toys.h"
-#include "generated/help.h"
-
-#undef NEWTOY
-#undef OLDTOY
-#define NEWTOY(name,opt,flags) help_##name "\0"
-#define OLDTOY(name,oldname,opts,flags) "\xff" #oldname "\0"
-static char *help_data =
-#include "generated/newtoys.h"
-;
 
 void help_main(void)
 {
   struct toy_list *t = toy_find(*toys.optargs);
-  int i = t-toy_list;
-  char *s = help_data;
 
   if (!t) error_exit("Unknown command '%s'", *toys.optargs);
-  for (;;) {
-    while (i--) s += strlen(s) + 1;
-    if (*s != 255) break;
-    i = toy_find(++s)-toy_list;
-    s = help_data;
-  }
-
-  fprintf(toys.exithelp ? stderr : stdout, "%s", s);
+  toys.which = t;
+  show_help();
 }
--- a/toys/other/losetup.c	Sun Apr 14 12:35:25 2013 -0500
+++ b/toys/other/losetup.c	Sun Apr 14 21:43:22 2013 -0500
@@ -180,7 +180,7 @@
     char *file = (toys.optflags & (FLAG_d|FLAG_c)) ? NULL : toys.optargs[1];
 
     if (!toys.optc || (file && toys.optc>1)) {
-      if (CFG_HELP) toys.exithelp++;
+      toys.exithelp++;
       perror_exit("needs 1 arg");
     }
     for (s = toys.optargs; *s; s++) loopback_setup(*s, file);