当前位置:  技术问答>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代码的时候看到的
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 

    
 
 

您可能感兴趣的文章:

  • 高分请教:怎样在Kdevelop不能够Trace构造函数?(其他函数可以Trace)
  • 请教:javascript 里有没有时间循环执行的函数,如我按住鼠标触发mousedown 事件函数时,反复执行我写的一个函数?
  • 请教semop()函数的用法、含义
  • 请教套接字中的select()函数问题
  • 请教一个函数入口处的汇编问题(压栈问题)
  • 请教一个关于ftw函数的问题!
  • 100分请教高手一个bash函数
  • 请教signal函数的用法!
  • 请教exec系列函数的用法
  • 请教UNIX C字符输入的检测函数?
  • 请教关于dlopen,动态库连接程序的输出函数
  • 请教select函数
  • (菜鸟请教)还有修改/etc/passwd文件用什么函数呢?
  • linux下time函数问题请教高手
  • 请教一个网络编程问题,accept函数的,在线等,急。。。
  • 请教一个取时间的函数,急!!!!!!!!!!!!!!!!
  • 请教,JavaScript中能不能调用JSP写的函数?
  • 请教:clock_gettime函数的使用问题
  • 请教 变量= { function:函数名};什么意思
  • signal 函数请教
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 请教unix常用命令命令问题
  • 请教:AIX命令中的procstack的命令显示的tid是线程ID吗
  • 请教:使用system(命令)或者exec(命令)启动一个进程执行命令,如何判断这个命令是否启动成功或正在运行?
  • 请教unix操作命令
  • 请教!Ubuntu下怎样在命令行下打开html文档啊?
  • 请教一下info命令是作什么用的?怎么用?
  • 请教redhat9下什么命令执行arp解析和逆向arp解析
  • 请教wget命令行的使用
  • 请教:使用什么命令查看导出的环境变量?
  • 请教一个命令行的使用
  • 散完全部分请教:linux下面有没有类似windows下面rasdial的命令
  • 请教iptables命令一则:如何封调一个ip地址30分钟
  • 请教::linux有没有命令可以做Ctrl+Z??
  • 请教各位老鸟,DOS下用什么命令可以看系统的配置信息??
  • 请教linux命令行的解析过程是怎样的
  • 请教FreeBSD下的Vi在命令模式下的编辑问题
  • 急!请教两个命令(操作目录)
  • 请教iproute命令的使用
  • 请教查看某个特定进程内存消耗情况的命令,急!
  • 请教:UNIX命令前加表示什么意思呢
  • 请教,请教,这个问题是为什么????
  • 请教本地硬盘安装问题请教本地硬盘安装问题
  • ■请教■请教redhat最基本的问题!
  • 请教一个 shell 问题,我用下面这个 shell 语句总是失败,请教
  • 高分请教,各位大侠,请教一个问题,理论高手请进??谢谢
  • 请教Linux下pgadmin3-1.0.2的编译和安装!!高分请教!
  • 各位大虾,请教装了REDHAT9操作系统后,启动时无法引导到LINUX,请教该如何解决啊
  • 请教,请教,,,一定要看!!一定要看!!
  • 请教高手,小弟打印width=1500,height=600(A3纸)的Applet,在预览中是该区域是黑的,打印出来也是黑的,请教高手解决一下
  • :请教高手,小弟打印width=1500,height=600(A3纸)的Applet,在预览中是该区域是黑的,打印出来也是黑的,请教高手解决一下
  • 请教象我这样的硬盘应如何安装Linux,我昨天试装了,但有问题。(老问题了,也看了前面的帖子,但还是来请教,请多指教)


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3