Mercurial > hg > toybox
changeset 858:34ac05521d94
Move guts of help command into show_help() in lib/help.c, with config TOYBOX_HELP controlling infrastructure.
author | Rob Landley <rob@landley.net> |
---|---|
date | Sun, 14 Apr 2013 21:43:22 -0500 |
parents | da601285a86e |
children | 4edd1cb3f700 |
files | Config.in lib/args.c lib/help.c lib/lib.c lib/lib.h toys/other/help.c toys/other/losetup.c |
diffstat | 7 files changed, 50 insertions(+), 27 deletions(-) [+] |
line wrap: on
line diff
--- a/Config.in Sun Apr 14 12:35:25 2013 -0500 +++ b/Config.in Sun Apr 14 21:43:22 2013 -0500 @@ -35,6 +35,12 @@ Include floating point support infrastructure and commands that require it. +config TOYBOX_HELP + bool "Help messages: + default y + help + Include help text for each command. + config TOYBOX_I18N bool "Internationalization support" default y
--- a/lib/args.c Sun Apr 14 12:35:25 2013 -0500 +++ b/lib/args.c Sun Apr 14 21:43:22 2013 -0500 @@ -341,7 +341,7 @@ // 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 @@ 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);
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lib/help.c Sun Apr 14 21:43:22 2013 -0500 @@ -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
--- a/lib/lib.c Sun Apr 14 12:35:25 2013 -0500 +++ b/lib/lib.c Sun Apr 14 21:43:22 2013 -0500 @@ -52,11 +52,7 @@ { 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);
--- a/lib/lib.h Sun Apr 14 12:35:25 2013 -0500 +++ b/lib/lib.h Sun Apr 14 21:43:22 2013 -0500 @@ -81,6 +81,10 @@ 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);
--- a/toys/other/help.c Sun Apr 14 12:35:25 2013 -0500 +++ b/toys/other/help.c Sun Apr 14 21:43:22 2013 -0500 @@ -9,6 +9,7 @@ config HELP bool "help" default y + depends on TOYBOX_HELP help usage: help [command] @@ -18,29 +19,12 @@ #include "toys.h" -#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 help_main(void) { struct toy_list *t = toy_find(*toys.optargs); - int i = t-toy_list; - char *s = help_data; if (!t) error_exit("Unknown command '%s'", *toys.optargs); - for (;;) { - while (i--) s += strlen(s) + 1; - if (*s != 255) break; - i = toy_find(++s)-toy_list; - s = help_data; - } - - fprintf(toys.exithelp ? stderr : stdout, "%s", s); + toys.which = t; + show_help(); }
--- a/toys/other/losetup.c Sun Apr 14 12:35:25 2013 -0500 +++ b/toys/other/losetup.c Sun Apr 14 21:43:22 2013 -0500 @@ -180,7 +180,7 @@ char *file = (toys.optflags & (FLAG_d|FLAG_c)) ? NULL : toys.optargs[1]; if (!toys.optc || (file && toys.optc>1)) { - if (CFG_HELP) toys.exithelp++; + toys.exithelp++; perror_exit("needs 1 arg"); } for (s = toys.optargs; *s; s++) loopback_setup(*s, file);