aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorRob Landley <rob@landley.net>2013-04-14 21:43:22 -0500
committerRob Landley <rob@landley.net>2013-04-14 21:43:22 -0500
commit36ffc5aa3e6bfcab5d628208f4f1508f9b1c2620 (patch)
tree02fa7a68fe53808c79ce72f9ba21beb0b9908214 /lib
parent26c0045a6eb061e180f58b6b4c029a5df5a2818e (diff)
downloadtoybox-36ffc5aa3e6bfcab5d628208f4f1508f9b1c2620.tar.gz
Move guts of help command into show_help() in lib/help.c, with config TOYBOX_HELP controlling infrastructure.
Diffstat (limited to 'lib')
-rw-r--r--lib/args.c4
-rw-r--r--lib/help.c33
-rw-r--r--lib/lib.c6
-rw-r--r--lib/lib.h4
4 files changed, 40 insertions, 7 deletions
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);