Re: [PATCH 1/1] ash,hush: tab completion of functions and aliases

2023-04-16 Thread Denys Vlasenko
Applied, thank you.

On Thu, Apr 13, 2023 at 1:56 PM Ron Yorston  wrote:
>
> Since commit 9e2a5668f (ash,hush: allow builtins to be tab-completed,
> closes 7532) ash and hush have supported tab completion of builtins.
>
> Other shells, bash and ksh for example, also support tab completion
> of functions and aliases.
>
> Add such support to ash and hush.
>
> function old new   delta
> ash_command_name   -  98 +98
> hush_command_name  -  71 +71
> ash_builtin_name  17   - -17
> hush_builtin_name 38   - -38
> --
> (add/remove: 2/2 grow/shrink: 0/0 up/down: 169/-55)   Total: 114 bytes
>
> Signed-off-by: Ron Yorston 
> Signed-off-by: Avi Halachmi 
> ---
>  shell/ash.c  | 30 ++
>  shell/hush.c | 11 +--
>  2 files changed, 35 insertions(+), 6 deletions(-)
>
> diff --git a/shell/ash.c b/shell/ash.c
> index d4ee4c93e..055f5ff73 100644
> --- a/shell/ash.c
> +++ b/shell/ash.c
> @@ -9732,7 +9732,7 @@ evalpipe(union node *n, int flags)
>
>  /* setinteractive needs this forward reference */
>  #if ENABLE_FEATURE_TAB_COMPLETION
> -static const char *get_builtin_name(int i) FAST_FUNC;
> +static const char *ash_command_name(int i) FAST_FUNC;
>  #endif
>
>  /*
> @@ -9769,7 +9769,7 @@ setinteractive(int on)
> if (!line_input_state) {
> line_input_state = new_line_input_t(FOR_SHELL | 
> WITH_PATH_LOOKUP);
>  # if ENABLE_FEATURE_TAB_COMPLETION
> -   line_input_state->get_exe_name = get_builtin_name;
> +   line_input_state->get_exe_name = ash_command_name;
>  # endif
>  # if EDITING_HAS_sh_get_var
> line_input_state->sh_get_var = lookupvar;
> @@ -10284,9 +10284,31 @@ find_builtin(const char *name)
>
>  #if ENABLE_FEATURE_TAB_COMPLETION
>  static const char * FAST_FUNC
> -get_builtin_name(int i)
> +ash_command_name(int i)
>  {
> -   return /*i >= 0 &&*/ i < ARRAY_SIZE(builtintab) ? builtintab[i].name 
> + 1 : NULL;
> +   int n;
> +
> +   if (/*i >= 0 &&*/ i < ARRAY_SIZE(builtintab))
> +   return builtintab[i].name + 1;
> +   i -= ARRAY_SIZE(builtintab);
> +
> +   for (n = 0; n < CMDTABLESIZE; n++) {
> +   for (struct tblentry *cmdp = cmdtable[n]; cmdp; cmdp = 
> cmdp->next) {
> +   if (cmdp->cmdtype == CMDFUNCTION && i-- <= 0)
> +   return cmdp->cmdname;
> +   }
> +   }
> +
> +# if ENABLE_ASH_ALIAS
> +   for (n = 0; n < ATABSIZE; n++) {
> +   for(struct alias *ap = atab[n]; ap; ap = ap->next) {
> +   if (i-- <= 0)
> +   return ap->name;
> +   }
> +   }
> +#endif
> +
> +   return NULL;
>  }
>  #endif
>
> diff --git a/shell/hush.c b/shell/hush.c
> index 202c0993a..9439c2cca 100644
> --- a/shell/hush.c
> +++ b/shell/hush.c
> @@ -8220,7 +8220,7 @@ static const struct built_in_command 
> *find_builtin(const char *name)
>  }
>
>  #if ENABLE_HUSH_JOB && ENABLE_FEATURE_TAB_COMPLETION
> -static const char * FAST_FUNC get_builtin_name(int i)
> +static const char * FAST_FUNC hush_command_name(int i)
>  {
> if (/*i >= 0 && */ i < ARRAY_SIZE(bltins1)) {
> return bltins1[i].b_cmd;
> @@ -8229,6 +8229,13 @@ static const char * FAST_FUNC get_builtin_name(int i)
> if (i < ARRAY_SIZE(bltins2)) {
> return bltins2[i].b_cmd;
> }
> +# if ENABLE_HUSH_FUNCTIONS
> +   i -= ARRAY_SIZE(bltins2);
> +   for (struct function *funcp = G.top_func; funcp; funcp = funcp->next) 
> {
> +   if (i-- <= 0)
> +   return funcp->name;
> +   }
> +# endif
> return NULL;
>  }
>  #endif
> @@ -10716,7 +10723,7 @@ int hush_main(int argc, char **argv)
>  # if ENABLE_FEATURE_EDITING
> G.line_input_state = new_line_input_t(FOR_SHELL);
>  #  if ENABLE_FEATURE_TAB_COMPLETION
> -   G.line_input_state->get_exe_name = get_builtin_name;
> +   G.line_input_state->get_exe_name = hush_command_name;
>  #  endif
>  #  if EDITING_HAS_sh_get_var
> G.line_input_state->sh_get_var = get_local_var_value;
> --
> 2.39.2
>
> ___
> busybox mailing list
> busybox@busybox.net
> http://lists.busybox.net/mailman/listinfo/busybox
___
busybox mailing list
busybox@busybox.net
http://lists.busybox.net/mailman/listinfo/busybox


[PATCH 1/1] ash,hush: tab completion of functions and aliases

2023-04-13 Thread Ron Yorston
Since commit 9e2a5668f (ash,hush: allow builtins to be tab-completed,
closes 7532) ash and hush have supported tab completion of builtins.

Other shells, bash and ksh for example, also support tab completion
of functions and aliases.

Add such support to ash and hush.

function old new   delta
ash_command_name   -  98 +98
hush_command_name  -  71 +71
ash_builtin_name  17   - -17
hush_builtin_name 38   - -38
--
(add/remove: 2/2 grow/shrink: 0/0 up/down: 169/-55)   Total: 114 bytes

Signed-off-by: Ron Yorston 
Signed-off-by: Avi Halachmi 
---
 shell/ash.c  | 30 ++
 shell/hush.c | 11 +--
 2 files changed, 35 insertions(+), 6 deletions(-)

diff --git a/shell/ash.c b/shell/ash.c
index d4ee4c93e..055f5ff73 100644
--- a/shell/ash.c
+++ b/shell/ash.c
@@ -9732,7 +9732,7 @@ evalpipe(union node *n, int flags)
 
 /* setinteractive needs this forward reference */
 #if ENABLE_FEATURE_TAB_COMPLETION
-static const char *get_builtin_name(int i) FAST_FUNC;
+static const char *ash_command_name(int i) FAST_FUNC;
 #endif
 
 /*
@@ -9769,7 +9769,7 @@ setinteractive(int on)
if (!line_input_state) {
line_input_state = new_line_input_t(FOR_SHELL | 
WITH_PATH_LOOKUP);
 # if ENABLE_FEATURE_TAB_COMPLETION
-   line_input_state->get_exe_name = get_builtin_name;
+   line_input_state->get_exe_name = ash_command_name;
 # endif
 # if EDITING_HAS_sh_get_var
line_input_state->sh_get_var = lookupvar;
@@ -10284,9 +10284,31 @@ find_builtin(const char *name)
 
 #if ENABLE_FEATURE_TAB_COMPLETION
 static const char * FAST_FUNC
-get_builtin_name(int i)
+ash_command_name(int i)
 {
-   return /*i >= 0 &&*/ i < ARRAY_SIZE(builtintab) ? builtintab[i].name + 
1 : NULL;
+   int n;
+
+   if (/*i >= 0 &&*/ i < ARRAY_SIZE(builtintab))
+   return builtintab[i].name + 1;
+   i -= ARRAY_SIZE(builtintab);
+
+   for (n = 0; n < CMDTABLESIZE; n++) {
+   for (struct tblentry *cmdp = cmdtable[n]; cmdp; cmdp = 
cmdp->next) {
+   if (cmdp->cmdtype == CMDFUNCTION && i-- <= 0)
+   return cmdp->cmdname;
+   }
+   }
+
+# if ENABLE_ASH_ALIAS
+   for (n = 0; n < ATABSIZE; n++) {
+   for(struct alias *ap = atab[n]; ap; ap = ap->next) {
+   if (i-- <= 0)
+   return ap->name;
+   }
+   }
+#endif
+
+   return NULL;
 }
 #endif
 
diff --git a/shell/hush.c b/shell/hush.c
index 202c0993a..9439c2cca 100644
--- a/shell/hush.c
+++ b/shell/hush.c
@@ -8220,7 +8220,7 @@ static const struct built_in_command *find_builtin(const 
char *name)
 }
 
 #if ENABLE_HUSH_JOB && ENABLE_FEATURE_TAB_COMPLETION
-static const char * FAST_FUNC get_builtin_name(int i)
+static const char * FAST_FUNC hush_command_name(int i)
 {
if (/*i >= 0 && */ i < ARRAY_SIZE(bltins1)) {
return bltins1[i].b_cmd;
@@ -8229,6 +8229,13 @@ static const char * FAST_FUNC get_builtin_name(int i)
if (i < ARRAY_SIZE(bltins2)) {
return bltins2[i].b_cmd;
}
+# if ENABLE_HUSH_FUNCTIONS
+   i -= ARRAY_SIZE(bltins2);
+   for (struct function *funcp = G.top_func; funcp; funcp = funcp->next) {
+   if (i-- <= 0)
+   return funcp->name;
+   }
+# endif
return NULL;
 }
 #endif
@@ -10716,7 +10723,7 @@ int hush_main(int argc, char **argv)
 # if ENABLE_FEATURE_EDITING
G.line_input_state = new_line_input_t(FOR_SHELL);
 #  if ENABLE_FEATURE_TAB_COMPLETION
-   G.line_input_state->get_exe_name = get_builtin_name;
+   G.line_input_state->get_exe_name = hush_command_name;
 #  endif
 #  if EDITING_HAS_sh_get_var
G.line_input_state->sh_get_var = get_local_var_value;
-- 
2.39.2

___
busybox mailing list
busybox@busybox.net
http://lists.busybox.net/mailman/listinfo/busybox