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()
  在鏈表的尾部插入結點。也很簡單。
 

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