autocomplete: remove runtime handler install

Rather than add runtime overhead of installing completion handlers, do it
statically at build time.  This requires a new build time helper macro to
declare a command and the completion handler at the same time.  Then we
convert the env related funcs over to this.

This gives an opportunity to also unify the U_BOOT_CMD macros.

Signed-off-by: Mike Frysinger <vapier@gentoo.org>
This commit is contained in:
Mike Frysinger 2010-10-20 03:52:39 -04:00 committed by Wolfgang Denk
parent 882b7d726f
commit 722b061b6f
4 changed files with 30 additions and 48 deletions

View File

@ -883,29 +883,32 @@ U_BOOT_CMD(
*/ */
#if defined(CONFIG_CMD_EDITENV) #if defined(CONFIG_CMD_EDITENV)
U_BOOT_CMD( U_BOOT_CMD_COMPLETE(
editenv, 2, 0, do_env_edit, editenv, 2, 0, do_env_edit,
"edit environment variable", "edit environment variable",
"name\n" "name\n"
" - edit environment variable 'name'" " - edit environment variable 'name'",
var_complete
); );
#endif #endif
U_BOOT_CMD( U_BOOT_CMD_COMPLETE(
printenv, CONFIG_SYS_MAXARGS, 1, do_env_print, printenv, CONFIG_SYS_MAXARGS, 1, do_env_print,
"print environment variables", "print environment variables",
"\n - print values of all environment variables\n" "\n - print values of all environment variables\n"
"printenv name ...\n" "printenv name ...\n"
" - print value of environment variable 'name'" " - print value of environment variable 'name'",
var_complete
); );
U_BOOT_CMD( U_BOOT_CMD_COMPLETE(
setenv, CONFIG_SYS_MAXARGS, 0, do_env_set, setenv, CONFIG_SYS_MAXARGS, 0, do_env_set,
"set environment variables", "set environment variables",
"name value ...\n" "name value ...\n"
" - set environment variable 'name' to 'value ...'\n" " - set environment variable 'name' to 'value ...'\n"
"setenv name\n" "setenv name\n"
" - delete environment variable 'name'" " - delete environment variable 'name'",
var_complete
); );
#if defined(CONFIG_CMD_ASKENV) #if defined(CONFIG_CMD_ASKENV)
@ -926,10 +929,11 @@ U_BOOT_CMD(
#endif #endif
#if defined(CONFIG_CMD_RUN) #if defined(CONFIG_CMD_RUN)
U_BOOT_CMD( U_BOOT_CMD_COMPLETE(
run, CONFIG_SYS_MAXARGS, 1, do_run, run, CONFIG_SYS_MAXARGS, 1, do_run,
"run commands in an environment variable", "run commands in an environment variable",
"var [...]\n" "var [...]\n"
" - run the commands in the environment variable(s) 'var'" " - run the commands in the environment variable(s) 'var'",
var_complete
); );
#endif #endif

View File

@ -177,30 +177,6 @@ int var_complete(int argc, char * const argv[], char last_char, int maxv, char *
return 0; return 0;
} }
static void install_auto_complete_handler(const char *cmd,
int (*complete)(int argc, char * const argv[], char last_char, int maxv, char *cmdv[]))
{
cmd_tbl_t *cmdtp;
cmdtp = find_cmd(cmd);
if (cmdtp == NULL)
return;
cmdtp->complete = complete;
}
void install_auto_complete(void)
{
#if defined(CONFIG_CMD_EDITENV)
install_auto_complete_handler("editenv", var_complete);
#endif
install_auto_complete_handler("printenv", var_complete);
install_auto_complete_handler("setenv", var_complete);
#if defined(CONFIG_CMD_RUN)
install_auto_complete_handler("run", var_complete);
#endif
}
/*************************************************************************************/ /*************************************************************************************/
static int complete_cmdv(int argc, char * const argv[], char last_char, int maxv, char *cmdv[]) static int complete_cmdv(int argc, char * const argv[], char last_char, int maxv, char *cmdv[])

View File

@ -336,10 +336,6 @@ void main_loop (void)
hush_init_var (); hush_init_var ();
#endif #endif
#ifdef CONFIG_AUTO_COMPLETE
install_auto_complete();
#endif
#ifdef CONFIG_PREBOOT #ifdef CONFIG_PREBOOT
if ((p = getenv ("preboot")) != NULL) { if ((p = getenv ("preboot")) != NULL) {
# ifdef CONFIG_AUTOBOOT_KEYED # ifdef CONFIG_AUTOBOOT_KEYED

View File

@ -74,7 +74,7 @@ cmd_tbl_t *find_cmd_tbl (const char *cmd, cmd_tbl_t *table, int table_len);
extern int cmd_usage(cmd_tbl_t *cmdtp); extern int cmd_usage(cmd_tbl_t *cmdtp);
#ifdef CONFIG_AUTO_COMPLETE #ifdef CONFIG_AUTO_COMPLETE
extern void install_auto_complete(void); extern int var_complete(int argc, char * const argv[], char last_char, int maxv, char *cmdv[]);
extern int cmd_auto_complete(const char *const prompt, char *buf, int *np, int *colp); extern int cmd_auto_complete(const char *const prompt, char *buf, int *np, int *colp);
#endif #endif
@ -111,23 +111,29 @@ extern int do_reset(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]);
#define Struct_Section __attribute__ ((unused,section (".u_boot_cmd"))) #define Struct_Section __attribute__ ((unused,section (".u_boot_cmd")))
#ifdef CONFIG_AUTO_COMPLETE
# define _CMD_COMPLETE(x) x,
#else
# define _CMD_COMPLETE(x)
#endif
#ifdef CONFIG_SYS_LONGHELP #ifdef CONFIG_SYS_LONGHELP
# define _CMD_HELP(x) x,
#else
# define _CMD_HELP(x)
#endif
#define U_BOOT_CMD(name,maxargs,rep,cmd,usage,help) \ #define U_BOOT_CMD_MKENT_COMPLETE(name,maxargs,rep,cmd,usage,help,comp) \
cmd_tbl_t __u_boot_cmd_##name Struct_Section = {#name, maxargs, rep, cmd, usage, help} {#name, maxargs, rep, cmd, usage, _CMD_HELP(help) _CMD_COMPLETE(comp)}
#define U_BOOT_CMD_MKENT(name,maxargs,rep,cmd,usage,help) \ #define U_BOOT_CMD_MKENT(name,maxargs,rep,cmd,usage,help) \
{#name, maxargs, rep, cmd, usage, help} U_BOOT_CMD_MKENT_COMPLETE(name,maxargs,rep,cmd,usage,help,NULL)
#else /* no long help info */ #define U_BOOT_CMD_COMPLETE(name,maxargs,rep,cmd,usage,help,comp) \
cmd_tbl_t __u_boot_cmd_##name Struct_Section = \
U_BOOT_CMD_MKENT_COMPLETE(name,maxargs,rep,cmd,usage,help,comp)
#define U_BOOT_CMD(name,maxargs,rep,cmd,usage,help) \ #define U_BOOT_CMD(name,maxargs,rep,cmd,usage,help) \
cmd_tbl_t __u_boot_cmd_##name Struct_Section = {#name, maxargs, rep, cmd, usage} U_BOOT_CMD_COMPLETE(name,maxargs,rep,cmd,usage,help,NULL)
#define U_BOOT_CMD_MKENT(name,maxargs,rep,cmd,usage,help) \
{#name, maxargs, rep, cmd, usage}
#endif /* CONFIG_SYS_LONGHELP */
#if defined(CONFIG_NEEDS_MANUAL_RELOC) #if defined(CONFIG_NEEDS_MANUAL_RELOC)
void fixup_cmdtable(cmd_tbl_t *cmdtp, int size); void fixup_cmdtable(cmd_tbl_t *cmdtp, int size);