diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/args.c | 4 | ||||
-rw-r--r-- | lib/help.c | 33 | ||||
-rw-r--r-- | lib/lib.c | 6 | ||||
-rw-r--r-- | lib/lib.h | 4 |
4 files changed, 40 insertions, 7 deletions
@@ -341,7 +341,7 @@ void get_optflags(void) // 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 @@ notflag: 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); diff --git a/lib/help.c b/lib/help.c new file mode 100644 index 00000000..f7a326a8 --- /dev/null +++ b/lib/help.c @@ -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 @@ -52,11 +52,7 @@ void error_exit(char *msg, ...) { 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); @@ -81,6 +81,10 @@ void dirtree_recurse(struct dirtree *node, 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); |