读源码学C之阅读李恒的bioawk
目前尚沒有能力直接去閱讀htslib的源代碼,看到bioawk的代碼稍微簡單點,因此準備先從這里下手,bioawk的項目地址為https://github.com/lh3/bioawk。
這次先閱讀了"main.c"部分學習如何解析參數(shù)。
1-23: 版權(quán)信息部分
copyright25: 版本信息
27: #define創(chuàng)建自己的常量和宏
27-35: 導(dǎo)入標準庫的頭文件和原來awk的頭文件
37-38: extern聲明后面的變量來自于其他文件,避免編譯時報錯
聲明外部變量49-53: 定義后續(xù)用于解析的最大程序文件數(shù)(pfile), 當前解析的程序文件(curpfile)
定義變量62-63: setlocale設(shè)置區(qū)域相關(guān)的設(shè)置,其中LC_CTYPE 影響所有字符函數(shù)。LC_NUMERIC影響 localeconv 函數(shù)提供的小數(shù)點格式化和信息
區(qū)域相關(guān)設(shè)置65:獲取程序的名字
66-70:如果參數(shù)只有一個,也就是只輸入程序名,那么就用fprintf將信息格式化輸出的標準錯誤輸出(stderr),也就是你可以用bioawk 2> err.log而不是bioawk > err.log報錯報錯信息。
78:使用while語句開始解析參數(shù)。 argv[1][0] == '-' &&argv[1][1] != '\0' 表示第二個C語言接受的第二個參數(shù)是-, --開頭的參數(shù)
解析參數(shù)79-83:使用string.h的strcmp進行文本比較,如果輸入是 "-version" 或者是 "--version" 則輸出版本信息,其中version在第25行定義。 strcmp返回0表示比較的內(nèi)容相同,否則都是不相同。最后用break跳出循環(huán)
版本參數(shù)84-88: 使用string.h的strncmp比較兩個字符串的最多n個字符。 也就是說,你可以用bioawk -c fastx ------------ '{printf $seq’ xxxx.fa 這種無聊的操作. 后續(xù)的argc--與argv--對當前解析的參數(shù)位置進行移動,就能讀取到后面的參數(shù)了。
顯示聲明參數(shù)結(jié)尾89: 開始用switch解析短參數(shù)
90-93:用strcmp判斷是否是 -safe,是的話就將safe賦值為1,最后跳出switch,
第一個判斷167-168:跳出switch之后,--argc 和 ++argv進行參數(shù)偏移,也就是讀取下一個參數(shù)
跳出循環(huán)94-107: 處理program文件。將文件名存放到pfile(字符串數(shù)組),也就是將文件名開頭的字符的地址( &argv[1][2])存放到pfile數(shù)組中。這里考慮有兩種習慣,一種是-fsomefile,另一種是-f samefile, 其中后者需要對輸入?yún)?shù)進行偏移。
處理program文件108-123:處理分隔符。同樣考慮到-F"\t和-F t這兩種情況
image.png124-126:使用string.h的strcpy進行文本復(fù)制。
復(fù)制字符串144-149: 使用stdlib.h的atoi函數(shù)將字符串轉(zhuǎn)成數(shù)值。這里發(fā)現(xiàn)如果用bioawk -d 0就會進行調(diào)試模式哦,這和原本awk -d是不同的。
調(diào)試功能153-162:對格式進行解析。
選擇格式總結(jié)
以上是生活随笔為你收集整理的读源码学C之阅读李恒的bioawk的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 打通C/4HANA和S/4HANA的一个
- 下一篇: ACM题集总结