diff toys/other/help.c @ 1232:4654f241ccbe draft

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 34ac05521d94
children
line wrap: on
line diff
--- 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 (*toys.optargs && !(t = toy_find(*toys.optargs)))
+      error_exit("Unknown command '%s'", *toys.optargs);
+    do_help(t);
+    return;
+  }
 
-  if (!t) error_exit("Unknown command '%s'", *toys.optargs);
-  toys.which = t;
-  show_help();
+  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>");
 }