# else
# define MAX_HISTORY 0
# endif
+typedef const char *get_exe_name_t(int i) FAST_FUNC;
typedef struct line_input_t {
int flags;
int timeout;
const char *path_lookup;
+# if ENABLE_FEATURE_TAB_COMPLETION \
+&& (ENABLE_ASH || ENABLE_SH_IS_ASH || ENABLE_BASH_IS_ASH \
+|| ENABLE_HUSH || ENABLE_SH_IS_HUSH || ENABLE_BASH_IS_HUSH \
+)
+ /* function to fetch additional application-specific names to match */
+ get_exe_name_t *get_exe_name;
+# define EDITING_HAS_get_exe_name 1
+# endif
# if MAX_HISTORY
int cnt_history;
int cur_history;
read_line_input(prompt, command, maxsize)
#endif
+#ifndef EDITING_HAS_get_exe_name
+# define EDITING_HAS_get_exe_name 0
+#endif
+
#ifndef COMM_LEN
# ifdef TASK_COMM_LEN
}
pf_len = strlen(pfind);
-# if ENABLE_FEATURE_SH_STANDALONE && NUM_APPLETS != 1
if (type == FIND_EXE_ONLY && !dirbuf) {
+# if ENABLE_FEATURE_SH_STANDALONE && NUM_APPLETS != 1
const char *p = applet_names;
-
while (*p) {
if (strncmp(pfind, p, pf_len) == 0)
add_match(xstrdup(p));
while (*p++ != '\0')
continue;
}
- }
# endif
+# if EDITING_HAS_get_exe_name
+ if (state->get_exe_name) {
+ i = 0;
+ for (;;) {
+ const char *b = state->get_exe_name(i++);
+ if (!b)
+ break;
+ if (strncmp(pfind, b, pf_len) == 0)
+ add_match(xstrdup(b));
+ }
+ }
+# endif
+ }
for (i = 0; i < npaths; i++) {
DIR *dir;
return status;
}
+/* setinteractive needs this forward reference */
+#if EDITING_HAS_get_exe_name
+static const char *get_builtin_name(int i) FAST_FUNC;
+#endif
+
/*
* Controls whether the shell is interactive or not.
*/
}
#endif
#if ENABLE_FEATURE_EDITING
- if (!line_input_state)
+ if (!line_input_state) {
line_input_state = new_line_input_t(FOR_SHELL | WITH_PATH_LOOKUP);
+# if EDITING_HAS_get_exe_name
+ line_input_state->get_exe_name = get_builtin_name;
+# endif
+ }
#endif
}
}
return bp;
}
+#if EDITING_HAS_get_exe_name
+static const char * FAST_FUNC
+get_builtin_name(int i)
+{
+ return /*i >= 0 &&*/ i < ARRAY_SIZE(builtintab) ? builtintab[i].name + 1 : NULL;
+}
+#endif
+
/*
* Execute a simple command.
*/
return find_builtin_helper(name, bltins2, &bltins2[ARRAY_SIZE(bltins2)]);
}
+#if EDITING_HAS_get_exe_name
+static const char * FAST_FUNC get_builtin_name(int i)
+{
+ if (/*i >= 0 && */ i < ARRAY_SIZE(bltins1)) {
+ return bltins1[i].b_cmd;
+ }
+ i -= ARRAY_SIZE(bltins1);
+ if (i < ARRAY_SIZE(bltins2)) {
+ return bltins2[i].b_cmd;
+ }
+ return NULL;
+}
+#endif
+
static void remove_nested_vars(void)
{
struct variable *cur;
# if ENABLE_FEATURE_EDITING
G.line_input_state = new_line_input_t(FOR_SHELL);
+# if EDITING_HAS_get_exe_name
+ G.line_input_state->get_exe_name = get_builtin_name;
+# endif
# endif
# if ENABLE_HUSH_SAVEHISTORY && MAX_HISTORY > 0
{