xref: /aosp_15_r20/external/toybox/toys/other/help.c (revision cf5a6c84e2b8763fc1a7db14496fd4742913b199)
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