当前位置: 技术问答>linux和unix
请教一下命令补全函数var_complete的参数问题
来源: 互联网 发布时间:2017-05-30
本文导语: 在追uboot代码的时候看到的 void install_auto_complete(void) { 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 } stat...
在追uboot代码的时候看到的
首先是调用install_auto_complete_handler函数完成对结构体中函数指针的初始化,这里是把var_complete赋值给了
cmdtp->complete。这点比较容易理解,然后就是var_complete函数本身,不太明白他的工作原理,int maxv, char *cmdv[}是用来做什么的?希望高手介绍一下这个函数,不胜感激。
void install_auto_complete(void)
{
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 void install_auto_complete_handler(const char *cmd,
int (*complete)(int argc, char *argv[], char last_char, int maxv, char *cmdv[]))
{
cmd_tbl_t *cmdtp;
cmdtp = find_cmd(cmd);
if (cmdtp == NULL)
return;
cmdtp->complete = complete;
}
int var_complete(int argc, char *argv[], char last_char, int maxv, char *cmdv[])
{
static char tmp_buf[512];
int space;
space = last_char == '' || last_char == ' ' || last_char == 't';
if (space && argc == 1)
return env_complete("", maxv, cmdv, sizeof(tmp_buf), tmp_buf);
if (!space && argc == 2)
return env_complete(argv[1], maxv, cmdv, sizeof(tmp_buf), tmp_buf);
return 0;
}
首先是调用install_auto_complete_handler函数完成对结构体中函数指针的初始化,这里是把var_complete赋值给了
cmdtp->complete。这点比较容易理解,然后就是var_complete函数本身,不太明白他的工作原理,int maxv, char *cmdv[}是用来做什么的?希望高手介绍一下这个函数,不胜感激。
|
手头的uboot code和楼主的不完全一样, 不过道理相通,大概说一下自己的理解,仅供楼主参考
complete command 有个限制,不能说 printenv有1000个env variable 就真的输出1000行,所以这个限制就是保证用户界面usable
输出一定量entry,如果有更多就用。。。代替,然后用户可以加强搜索条件得到更精确的match
所以
321 int cmd_auto_complete(const char *const prompt, char *buf, int *np, int *colp)
322 {
323 int n = *np, col = *colp;
324 char *argv[CONFIG_SYS_MAXARGS + 1]; /* NULL terminated */
325 char *cmdv[20];
。。。
348 i = complete_cmdv(argc, argv, last_char, sizeof(cmdv)/sizeof(cmdv[0]), cmdv);
可以看到缺省就是输出20行, 在env_complete 里面,当match的数目太多就用。。。代替
272 int env_complete(char *var, int maxv, char *cmdv[], int bufsz, char *buf)
273 {
274 ENTRY *match;
275 int found, idx;
276
277 idx = 0;
278 found = 0;
279 cmdv[0] = NULL;
280
281 while ((idx = hmatch_r(var, idx, &match, &env_htab))) {
282 int vallen = strlen(match->key) + 1;
283
284 if (found >= maxv - 2 || bufsz
complete command 有个限制,不能说 printenv有1000个env variable 就真的输出1000行,所以这个限制就是保证用户界面usable
输出一定量entry,如果有更多就用。。。代替,然后用户可以加强搜索条件得到更精确的match
所以
321 int cmd_auto_complete(const char *const prompt, char *buf, int *np, int *colp)
322 {
323 int n = *np, col = *colp;
324 char *argv[CONFIG_SYS_MAXARGS + 1]; /* NULL terminated */
325 char *cmdv[20];
。。。
348 i = complete_cmdv(argc, argv, last_char, sizeof(cmdv)/sizeof(cmdv[0]), cmdv);
可以看到缺省就是输出20行, 在env_complete 里面,当match的数目太多就用。。。代替
272 int env_complete(char *var, int maxv, char *cmdv[], int bufsz, char *buf)
273 {
274 ENTRY *match;
275 int found, idx;
276
277 idx = 0;
278 found = 0;
279 cmdv[0] = NULL;
280
281 while ((idx = hmatch_r(var, idx, &match, &env_htab))) {
282 int vallen = strlen(match->key) + 1;
283
284 if (found >= maxv - 2 || bufsz