您的位置:首页 > 其它

U-boot移植日志(7)--使u-boot的help命令支持通配符(*)

2007-11-02 05:35 393 查看
调了有三四天u-boot了,但命令一直在往上加,只调u-boot,而命令成功之后就不用了,但又不想修改配置文件先把命令关掉,可是在调试的时候一运行help就显示一两屏的指令列表,超级终端本来就只能显示那么小,很不方便。

后来改了一个叫DNW 0.51A的软件,显示更好一些,但就是不支持kermit协议,不能发送文件,发送文件的时候还得再跑到超级终端,网卡好了之后通过网线下载,也就不用串口下程序了,但这是后话。即使是这样仍感觉列表太长。

于是想通过通配符*进行过滤,过滤后就可以通过

help i*

列出所有以i开头的指令,这样就少多了,基本上在同一屏上可以显完。于是找到do_help()函数,修改了代码,完整的u-boot 1.1.4的/common/command.c文件中的do_help()函数内容如下:

/*
* Use puts() instead of printf() to avoid printf buffer overflow
* for long help messages
*/

int do_help (cmd_tbl_t * cmdtp, int flag, int argc, char *argv[])
{
int i;
int rcode = 0;

if (argc < 3) { /*show list of commands */

int cmd_items = &__u_boot_cmd_end -
&__u_boot_cmd_start; /* pointer arith! */
cmd_tbl_t *cmd_array[cmd_items];
int i, j, swaps;

/* Make array of commands from .uboot_cmd section */
cmdtp = &__u_boot_cmd_start;
for (i = 0; i < cmd_items; i++) {
cmd_array[i] = cmdtp++;
}

/* Sort command list (trivial bubble sort) */
for (i = cmd_items - 1; i > 0; --i) {
swaps = 0;
for (j = 0; j < i; ++j) {
if (strcmp (cmd_array[j]->name,
cmd_array[j + 1]->name) > 0) {
cmd_tbl_t *tmp;
tmp = cmd_array[j];
cmd_array[j] = cmd_array[j + 1];
cmd_array[j + 1] = tmp;
++swaps;
}
}
if (!swaps)
break;
}

/* print short help (usage) */

/*
* use a * to list all command
* Nocky Tian 2006-08-25
*/
if(argc == 2){
int star;
for(star=0; argv[1][star] != '*' && argv[1][star] != 0; star++){
}
if( star < strlen(argv[1])){
for(i=0; i < cmd_items; i++){
if(strncmp(cmd_array[i]->name, argv[1], star) == 0){
puts(cmd_array[i]->usage);
}
}
return 0;
}

}
/* Nocky end */
else{
for (i = 0; i < cmd_items; i++) {
const char *usage = cmd_array[i]->usage;

/* allow user abort */
if (ctrlc ())
return 1;
if (usage == NULL)
continue;
puts (usage);
}
puts("/n You can use /" help xx* /" to list all command starting with a xx, where xx can be any letters/n");
return 0;
}

}

/*
* command help (long version)
*/
for (i = 1; i < argc; ++i) {
if ((cmdtp = find_cmd (argv[i])) != NULL) {
#ifdef CFG_LONGHELP
/* found - print (long) help info */
puts (cmdtp->name);
putc (' ');
if (cmdtp->help) {
puts (cmdtp->help);
} else {
puts ("- No help available./n");
rcode = 1;
}
putc ('/n');
#else /* no long help available */
if (cmdtp->usage)
puts (cmdtp->usage);
#endif /* CFG_LONGHELP */
} else {
printf ("Unknown command '%s' - try 'help'"
" without arguments for list of all"
" known commands/n/n", argv[i]
);
rcode = 1;
}
}
return rcode;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: