|
本帖最后由 mdyblog 于 2015-1-11 10:11 编辑
run_line 函数优化了下,call :abc 时不占用宝贵的64K的命令行栈。
下面 红色为添加的代码。
int run_line (char *heap,int flags)
{
char *cmdline_buf = cmd_buffer;
char *arg;
int status = 0;
int ret = 0;
int arg_len = 0;
while (*heap == 0x20 || *heap == '\t') ++heap;
do
{
if(!grub_memcmp("call", heap,4) && (*heap[4] == 0x20 || heap[4] == '\t'))
{
//arg=heap+5; //--其实这3行可以不要,直接break
//while (*arg == 0x20 || *arg == '\t') ++arg; //--
//if(':'==*arg) //--
break;
}
arg_len = strlen(heap) + 1;
cmd_buffer += (arg_len + 0x0F) & ~0x0F; //cmd_buffer += (arg_len + 0x10) & -0x10;
memmove(cmdline_buf,heap,arg_len);
heap = cmdline_buf;
}while(0);
while(*heap && (arg = heap))
{
heap = skip_to_next_cmd(heap,&status,OPT_MULTI_CMD_AND | OPT_MULTI_CMD_OR | OPT_MULTI_CMD);//next cmd
ret = run_cmd_line(arg,flags);
if (((status & OPT_MULTI_CMD_AND) && !ret) || ((status & OPT_MULTI_CMD_OR) && ret))
{
errnum = ERR_NONE;
heap = skip_to_next_cmd(heap,&status,OPT_MULTI_CMD);//next cmd
}
}
cmd_buffer = cmdline_buf;
return ret;
} |
运行次数还是有不太大的限制。
另外的地方每次会好用好大一块“堆”。
最终会因为“堆”耗尽而终止。
除非那儿再优化下: bat_run_script()函数。
|
|