1
0
mirror of https://github.com/samba-team/samba.git synced 2025-08-02 00:22:11 +03:00

added basic command completion support

This commit is contained in:
Andrew Tridgell
-
parent af62692e62
commit 386fdff2df
3 changed files with 43 additions and 3 deletions

View File

@ -1752,6 +1752,40 @@ static void process_command_string(char *cmd)
}
}
/****************************************************************************
handle completion of commands for readline
****************************************************************************/
static char **completion_fn(char *text, int start, int end)
{
#define MAX_COMPLETIONS 100
char **matches;
int i, count=0;
/* for words not at the start of the line fallback to filename completion */
if (start) return NULL;
matches = (char **)malloc(sizeof(matches[0])*MAX_COMPLETIONS);
if (!matches) return NULL;
matches[count++] = strdup(text);
if (!matches[0]) return NULL;
for (i=0;commands[i].fn && count < MAX_COMPLETIONS-1;i++) {
if (strncmp(text, commands[i].name, strlen(text)) == 0) {
matches[count] = strdup(commands[i].name);
if (!matches[count]) return NULL;
count++;
}
}
if (count == 2) {
free(matches[0]);
matches[0] = strdup(matches[1]);
}
matches[count] = NULL;
return matches;
}
/****************************************************************************
make sure we swallow keepalives during idle time
@ -1805,7 +1839,7 @@ static void process_stdin(void)
/* display a prompt */
slprintf(prompt, sizeof(prompt), "smb: %s> ", cur_dir);
line = smb_readline(prompt, readline_callback);
line = smb_readline(prompt, readline_callback, completion_fn);
if (!line) break;

View File

@ -166,7 +166,8 @@ void pidfile_create(char *name);
/*The following definitions come from lib/readline.c */
char *smb_readline(char *prompt, void (*callback)(void));
char *smb_readline(char *prompt, void (*callback)(void),
char **(completion_fn)(char *text, int start, int end));
void cmd_history(void);
/*The following definitions come from lib/replace.c */

View File

@ -43,10 +43,15 @@
/****************************************************************************
display the prompt and wait for input. Call callback() regularly
****************************************************************************/
char *smb_readline(char *prompt, void (*callback)(void))
char *smb_readline(char *prompt, void (*callback)(void),
char **(completion_fn)(char *text, int start, int end))
{
char *ret;
#if HAVE_LIBREADLINE
if (completion_fn) {
rl_attempted_completion_function = completion_fn;
}
rl_event_hook = (Function *)callback;
ret = readline(prompt);
if (ret && *ret) add_history(ret);