diff options
author | Ron Yorston <rmy@frippery.org> | 2015-05-29 11:31:40 +0100 |
---|---|---|
committer | Denys Vlasenko <vda.linux@googlemail.com> | 2015-10-30 19:49:33 +0100 |
commit | f23264b35f5bb138c6c3676079251e71bee42c8a (patch) | |
tree | e6cba0f51f2db6460f81003e98c4a7107145ace8 /libbb/lineedit.c | |
parent | ae57af6e78ed7179b2b12675ad86adc4e8d5bebd (diff) |
lineedit: search applets as well as PATH for tab completion
In standalone shell mode search the applet table as well as PATH
when tab completing a command.
Use a stupid linear search: we're also about to read all the
directories on PATH so efficiency isn't a big concern.
function old new delta
add_match - 53 +53
complete_cmd_dir_file 687 724 +37
------------------------------------------------------------------------------
(add/remove: 1/0 grow/shrink: 1/0 up/down: 90/0) Total: 90 bytes
Signed-off-by: Ron Yorston <rmy@frippery.org>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
Diffstat (limited to 'libbb/lineedit.c')
-rw-r--r-- | libbb/lineedit.c | 17 |
1 files changed, 16 insertions, 1 deletions
diff --git a/libbb/lineedit.c b/libbb/lineedit.c index a83e07c0c..2ddb2b6e9 100644 --- a/libbb/lineedit.c +++ b/libbb/lineedit.c @@ -47,7 +47,8 @@ * It stems from simplistic "cmdedit_y = cmdedit_prmt_len / cmdedit_termw" * calculation of how many lines the prompt takes. */ -#include "libbb.h" +#include "busybox.h" +#include "NUM_APPLETS.h" #include "unicode.h" #ifndef _POSIX_VDISABLE # define _POSIX_VDISABLE '\0' @@ -774,6 +775,20 @@ static NOINLINE unsigned complete_cmd_dir_file(const char *command, int type) } pf_len = strlen(pfind); +#if ENABLE_FEATURE_SH_STANDALONE && NUM_APPLETS != 1 + if (type == FIND_EXE_ONLY) { + const char *p = applet_names; + + i = 0; + while (i < NUM_APPLETS) { + if (strncmp(pfind, p, pf_len) == 0) + add_match(xstrdup(p)); + p += strlen(p) + 1; + i++; + } + } +#endif + for (i = 0; i < npaths; i++) { DIR *dir; struct dirent *next; |