命令是怎样被执行的❌
命令执行的总入口是 script_driver(),不论是命令行输入还是执行脚本最终都是通过它。调用路径分别如下:
命令行输入:
update.c:mainloop()=>update.c:update_input()=>input.c:process_input()=>parse.c:parse_input()=>tokenize.c:script_driver()
process_input() 本质上仍然是事件循环的一部分,一次只捕获一个按键,因此最终是否真的调用 parse_input() 取决于用户是否按下了回车键。这部分处理在 cursor.c 中进行,按下回车键后会设置标记 TINTIN_FLAG_PROCESSINPUT,否则就会跳过后续处理:
if (!HAS_BIT(gtd->flags, TINTIN_FLAG_PROCESSINPUT))
{
pop_call();
return;
}执行脚本:
files.c:do_read()=>files.c:read_file()=>tokenize.c:script_driver()
注意 read_file() 中有一个相当长的前置处理,在交给 script_driver() 之前,实际上就已经做了一些粗略的词法处理:
去掉注释
处理花括号
忽略
'\r',去掉'\n',并且根据命令分隔符(也就是';')拆分命令。FIXME: 没找到关于转义字符的处理,不确定是何时处理的。
最后更新于