gawk awk1.c源码分析

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()
  在链表的尾部插入结点。也很简单。
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章