1*cf5a6c84SAndroid Build Coastguard Worker /* help.c - Show help for toybox commands
2*cf5a6c84SAndroid Build Coastguard Worker *
3*cf5a6c84SAndroid Build Coastguard Worker * Copyright 2007 Rob Landley <[email protected]>
4*cf5a6c84SAndroid Build Coastguard Worker *
5*cf5a6c84SAndroid Build Coastguard Worker * Often a shell builtin.
6*cf5a6c84SAndroid Build Coastguard Worker
7*cf5a6c84SAndroid Build Coastguard Worker USE_HELP(NEWTOY(help, "ahu", TOYFLAG_BIN|TOYFLAG_MAYFORK))
8*cf5a6c84SAndroid Build Coastguard Worker
9*cf5a6c84SAndroid Build Coastguard Worker config HELP
10*cf5a6c84SAndroid Build Coastguard Worker bool "help"
11*cf5a6c84SAndroid Build Coastguard Worker default y
12*cf5a6c84SAndroid Build Coastguard Worker depends on TOYBOX_HELP
13*cf5a6c84SAndroid Build Coastguard Worker help
14*cf5a6c84SAndroid Build Coastguard Worker usage: help [-ahu] [COMMAND]
15*cf5a6c84SAndroid Build Coastguard Worker
16*cf5a6c84SAndroid Build Coastguard Worker -a All commands
17*cf5a6c84SAndroid Build Coastguard Worker -u Usage only
18*cf5a6c84SAndroid Build Coastguard Worker -h HTML output
19*cf5a6c84SAndroid Build Coastguard Worker
20*cf5a6c84SAndroid Build Coastguard Worker Show usage information for toybox commands.
21*cf5a6c84SAndroid Build Coastguard Worker Run "toybox" with no arguments for a list of available commands.
22*cf5a6c84SAndroid Build Coastguard Worker */
23*cf5a6c84SAndroid Build Coastguard Worker
24*cf5a6c84SAndroid Build Coastguard Worker #define FOR_help
25*cf5a6c84SAndroid Build Coastguard Worker #include "toys.h"
26*cf5a6c84SAndroid Build Coastguard Worker
do_help(struct toy_list * t)27*cf5a6c84SAndroid Build Coastguard Worker static void do_help(struct toy_list *t)
28*cf5a6c84SAndroid Build Coastguard Worker {
29*cf5a6c84SAndroid Build Coastguard Worker if (FLAG(h))
30*cf5a6c84SAndroid Build Coastguard Worker xprintf("<a name=\"%s\"><h1>%s</h1><blockquote><pre>\n", t->name, t->name);
31*cf5a6c84SAndroid Build Coastguard Worker
32*cf5a6c84SAndroid Build Coastguard Worker toys.which = t;
33*cf5a6c84SAndroid Build Coastguard Worker show_help(stdout, HELP_USAGE*FLAG(u) + (HELP_SEE|HELP_HTML)*FLAG(h));
34*cf5a6c84SAndroid Build Coastguard Worker
35*cf5a6c84SAndroid Build Coastguard Worker if (FLAG(h)) xprintf("</blockquote></pre>\n");
36*cf5a6c84SAndroid Build Coastguard Worker }
37*cf5a6c84SAndroid Build Coastguard Worker
38*cf5a6c84SAndroid Build Coastguard Worker // Simple help is just toys.which = toy_find("name"); show_help(stdout, 0);
39*cf5a6c84SAndroid Build Coastguard Worker // but iterating through html output and all commands is a bit more
40*cf5a6c84SAndroid Build Coastguard Worker
help_main(void)41*cf5a6c84SAndroid Build Coastguard Worker void help_main(void)
42*cf5a6c84SAndroid Build Coastguard Worker {
43*cf5a6c84SAndroid Build Coastguard Worker long i;
44*cf5a6c84SAndroid Build Coastguard Worker
45*cf5a6c84SAndroid Build Coastguard Worker // If called with no arguments as a builtin from the shell, show all builtins
46*cf5a6c84SAndroid Build Coastguard Worker if (toys.rebound && !*toys.optargs && !toys.optflags) {
47*cf5a6c84SAndroid Build Coastguard Worker for (i = 0; i < toys.toycount; i++) {
48*cf5a6c84SAndroid Build Coastguard Worker if (!(toy_list[i].flags&(TOYFLAG_NOFORK|TOYFLAG_MAYFORK))) continue;
49*cf5a6c84SAndroid Build Coastguard Worker toys.which = toy_list+i;
50*cf5a6c84SAndroid Build Coastguard Worker show_help(stdout, HELP_SEE|HELP_USAGE*!toys.optflags);
51*cf5a6c84SAndroid Build Coastguard Worker }
52*cf5a6c84SAndroid Build Coastguard Worker return;
53*cf5a6c84SAndroid Build Coastguard Worker }
54*cf5a6c84SAndroid Build Coastguard Worker
55*cf5a6c84SAndroid Build Coastguard Worker if (!FLAG(a)) {
56*cf5a6c84SAndroid Build Coastguard Worker struct toy_list *t = toys.which, *tt;
57*cf5a6c84SAndroid Build Coastguard Worker
58*cf5a6c84SAndroid Build Coastguard Worker // Zero which to include "toybox" in search, put it back for error msg
59*cf5a6c84SAndroid Build Coastguard Worker toys.which = 0;
60*cf5a6c84SAndroid Build Coastguard Worker tt = *toys.optargs ? toy_find(*toys.optargs) : t;
61*cf5a6c84SAndroid Build Coastguard Worker toys.which = t;
62*cf5a6c84SAndroid Build Coastguard Worker
63*cf5a6c84SAndroid Build Coastguard Worker if (tt) return do_help(tt);
64*cf5a6c84SAndroid Build Coastguard Worker else error_exit("Unknown command '%s'", *toys.optargs);
65*cf5a6c84SAndroid Build Coastguard Worker }
66*cf5a6c84SAndroid Build Coastguard Worker
67*cf5a6c84SAndroid Build Coastguard Worker if (FLAG(h)) {
68*cf5a6c84SAndroid Build Coastguard Worker sprintf(toybuf, "Toybox %s command help", toybox_version);
69*cf5a6c84SAndroid Build Coastguard Worker xprintf("<html>\n<title>%s</title>\n<body>\n<h1>%s</h1><hr /><p>",
70*cf5a6c84SAndroid Build Coastguard Worker toybuf, toybuf);
71*cf5a6c84SAndroid Build Coastguard Worker for (i = 0; i<toys.toycount; i++) if (toy_list[i].flags)
72*cf5a6c84SAndroid Build Coastguard Worker xprintf("<a href=\"#%s\">%s</a>\n", toy_list[i].name,toy_list[i].name);
73*cf5a6c84SAndroid Build Coastguard Worker xprintf("</p>\n");
74*cf5a6c84SAndroid Build Coastguard Worker }
75*cf5a6c84SAndroid Build Coastguard Worker
76*cf5a6c84SAndroid Build Coastguard Worker for (i = 0; i < toys.toycount; i++) {
77*cf5a6c84SAndroid Build Coastguard Worker if (!toy_list[i].flags) continue;
78*cf5a6c84SAndroid Build Coastguard Worker if (FLAG(h)) xprintf("<hr>\n<pre>\n");
79*cf5a6c84SAndroid Build Coastguard Worker else if (!FLAG(u)) {
80*cf5a6c84SAndroid Build Coastguard Worker memset(toybuf, '-', 78);
81*cf5a6c84SAndroid Build Coastguard Worker memcpy(toybuf+3, toy_list[i].name, strlen(toy_list[i].name));
82*cf5a6c84SAndroid Build Coastguard Worker printf("\n%s\n\n", toybuf);
83*cf5a6c84SAndroid Build Coastguard Worker }
84*cf5a6c84SAndroid Build Coastguard Worker do_help(toy_list+i);
85*cf5a6c84SAndroid Build Coastguard Worker if (FLAG(h)) xprintf("</pre>\n");
86*cf5a6c84SAndroid Build Coastguard Worker }
87*cf5a6c84SAndroid Build Coastguard Worker
88*cf5a6c84SAndroid Build Coastguard Worker if (FLAG(h)) xprintf("</html>");
89*cf5a6c84SAndroid Build Coastguard Worker }
90