gawk awk1.c源码分析
今天接着读代码。前段时间迷上读网络小说,用kindle看小说,看得天昏地暗。读小说锻炼了阅读速度。
星期五购买了几件打折的衣服。我要好好读代码,把购衣服的价值创造出来。
言归正传。我用一台旧的笔记本不上网,只用于在上面写代码。因为上面只有gawk的源码,没有拷coreutils的源码,所以就读gawk的了。
今天看的时候,感觉把这篇基本全部看懂了。个别细节也懂了。下面就说我的心得。
main()函数
对命令行选项进行处理
-d,-D进行调试相关
-R 设置记录分隔符
-F 设置字段分隔符
-f 后面的awk文件
先打开-f后面的文件
如果成功打开了文件
把文件内容读入到指针lexptr中。
把打开的文件关闭
如果lexptr值为空,也就是命令行中,没有-f选项,就直接从命令行中读awk指令
lexptr_begin=lexptr
再调用bison的程序进行编译,生成代码树
初始化字段变量
在awk指令中,查找BEGIN,END块。
如果有BEGIN块,就处理之
判断命令行中,是否有参数,如awk -f awkfile a=1 b=2
datafile中,a=1之类变量值。
如果命令行中没有数据文件,就设为从stdin中读
对命令行中的每个数据文件进行循环处理
如果文件名是“-”,就从标准输入读,否则打开相应文件
对文件的每行进行循环处理
如果命令行中有参数
把参数的名字和参数值解析出来,写入数据库中保存
把解析后的全部awk指令应用在当前行上,并读入下一行,直到文件处理完为止
如果打开的不是标准输入文件,则关闭之
如果有END块,就再处理之
在awk1.c中,还有许多小函数,比较简单,不细讲,下面分析一下存储变量的几个函数
1.variable(name)
在全局量variables中查找变量name,如果没有则调install插入之
2.spc_var()
在全局量variables中查找变量name,如果没有则调install插入之
3.install()
是经典的链表插入算法,采用的是头部插入。
4.lookup()
是经典的链表查找算法。是在hash表中,每个hash节点是一个链表。
5。hashf()
产生某字串的hash值
6.append_right()
在链表的尾部插入结点。也很简单。