From 36ffc5aa3e6bfcab5d628208f4f1508f9b1c2620 Mon Sep 17 00:00:00 2001 From: Rob Landley Date: Sun, 14 Apr 2013 21:43:22 -0500 Subject: Move guts of help command into show_help() in lib/help.c, with config TOYBOX_HELP controlling infrastructure. --- lib/args.c | 4 ++-- lib/help.c | 33 +++++++++++++++++++++++++++++++++ lib/lib.c | 6 +----- lib/lib.h | 4 ++++ 4 files changed, 40 insertions(+), 7 deletions(-) create mode 100644 lib/help.c (limited to 'lib') diff --git a/lib/args.c b/lib/args.c index fa1d4e6f..748008f3 100644 --- a/lib/args.c +++ b/lib/args.c @@ -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 diff --git a/lib/lib.c b/lib/lib.c index 955f2426..66cecbc2 100644 --- a/lib/lib.c +++ b/lib/lib.c @@ -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); diff --git a/lib/lib.h b/lib/lib.h index 1b1899b0..8b28bd32 100644 --- a/lib/lib.h +++ b/lib/lib.h @@ -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); -- cgit v1.2.3