changeset 1232:4654f241ccbe

Add help -a (to show all commands) and -h (to produce HTML output).
author Rob Landley <rob@landley.net>
date Fri, 28 Mar 2014 17:48:02 -0500
parents ee5a6875d695
children 859b9bdde999
files main.c toys.h toys/other/help.c
diffstat 3 files changed, 59 insertions(+), 10 deletions(-) [+]
line wrap: on
line diff
--- a/main.c	Thu Mar 27 07:02:01 2014 -0500
+++ b/main.c	Fri Mar 28 17:48:02 2014 -0500
@@ -162,6 +162,8 @@
 {
   if (CFG_TOYBOX_I18N) setlocale(LC_ALL, "");
 
+  toys.toycount = ARRAY_LEN(toy_list);
+
   if (CFG_TOYBOX) {
     // Trim path off of command name
     *argv = basename(*argv);
--- a/toys.h	Thu Mar 27 07:02:01 2014 -0500
+++ b/toys.h	Fri Mar 28 17:48:02 2014 -0500
@@ -115,14 +115,15 @@
 
 extern struct toy_context {
   struct toy_list *which;  // Which entry in toy_list is this one?
+  char **argv;             // Original command line arguments
+  char **optargs;          // Arguments left over from get_optflags()
+  jmp_buf *rebound;        // longjmp here instead of exit when do_rebound set
+  unsigned optflags;       // Command line option flags from get_optflags()
   int exitval;             // Value error_exit feeds to exit()
-  char **argv;             // Original command line arguments
-  unsigned optflags;       // Command line option flags from get_optflags()
-  char **optargs;          // Arguments left over from get_optflags()
   int optc;                // Count of optargs
   int exithelp;            // Should error_exit print a usage message first?
   int old_umask;           // Old umask preserved by TOYFLAG_UMASK
-  jmp_buf *rebound;        // longjmp here instead of exit when do_rebound set
+  int toycount;            // Total number of commands in this build
 } toys;
 
 // Two big temporary buffers: one for use by commands, one for library functions
--- a/toys/other/help.c	Thu Mar 27 07:02:01 2014 -0500
+++ b/toys/other/help.c	Fri Mar 28 17:48:02 2014 -0500
@@ -4,7 +4,7 @@
  *
  * Often a shell builtin.
 
-USE_HELP(NEWTOY(help, "<1", TOYFLAG_BIN))
+USE_HELP(NEWTOY(help, ""USE_HELP_EXTRAS("ah"), TOYFLAG_BIN))
 
 config HELP
   bool "help"
@@ -15,16 +15,62 @@
 
     Show usage information for toybox commands.
     Run "toybox" with no arguments for a list of available commands.
+
+config HELP_EXTRAS
+  bool "help -ah"
+  default y
+  depends on TOYBOX
+  depends on HELP
+  help
+    usage: help [-ah]
+
+    -a	All commands
+    -h	HTML output
 */
 
+#define FOR_help
+#include "toys.h"
 
-#include "toys.h"
+static void do_help(struct toy_list *t)
+{
+  if (toys.optflags & FLAG_h) 
+    xprintf("<a name=\"%s\"><h1>%s</h1><blockquote><pre>\n", t->name, t->name);
+
+  toys.which = t;
+  show_help();
+
+  if (toys.optflags & FLAG_h) xprintf("</blockquote></pre>\n");
+}
+
+// The simple help is just toys.which = toy_find("name"); show_help();
+// But iterating through html output and all commands is a big more 
 
 void help_main(void)
 {
-  struct toy_list *t = toy_find(*toys.optargs);
+  int i;
+  
+  if (!(toys.optflags & FLAG_a)) {
+    struct toy_list *t = toys.which;
 
-  if (!t) error_exit("Unknown command '%s'", *toys.optargs);
-  toys.which = t;
-  show_help();
+    if (*toys.optargs && !(t = toy_find(*toys.optargs)))
+      error_exit("Unknown command '%s'", *toys.optargs);
+    do_help(t);
+    return;
+  }
+
+  if (toys.optflags & FLAG_h) {
+    xprintf("<html>\n<title>Toybox command list</title>\n<body>\n<p>\n");
+    for (i=0; i < toys.toycount; i++)
+      xprintf("<a href=\"#%s\">%s</a>\n", toy_list[i].name,
+              toy_list[i].name);
+    xprintf("</p>\n");
+  }
+
+  for (i = 0; i < toys.toycount; i++) {
+    if (toys.optflags & FLAG_h) xprintf("<hr>\n<pre>\n");
+    do_help(toy_list+i);
+    if (toys.optflags & FLAG_h) xprintf("</pre>\n");
+  }
+
+  if (toys.optflags & FLAG_h) xprintf("</html>");
 }