目前尚没有能力直接去阅读htslib的源代码,看到bioawk的代码稍微简单点,因此准备先从这里下手,bioawk的项目地址为https://github.com/lh3/bioawk。
这次先阅读了"main.c"部分学习如何解析参数。
1-23: 版权信息部分
![img_a969965a17172aaba49e2d9707ab6859.png](https://i-blog.csdnimg.cn/blog_migrate/494cfe4831caac6c419caf5427dd1cee.png)
25: 版本信息
27: #define
创建自己的常量和宏
27-35: 导入标准库的头文件和原来awk的头文件
![img_035eafc84a20ace917bfa59bcdd00a3d.png](https://i-blog.csdnimg.cn/blog_migrate/832040c3d51481d6b6a8db5ca1913493.png)
37-38: extern声明后面的变量来自于其他文件,避免编译时报错
![img_87daf2489fc48b00d10c002b7817923e.png](https://i-blog.csdnimg.cn/blog_migrate/2424ec23ddc122a5d609062fff6d9104.png)
49-53: 定义后续用于解析的最大程序文件数(pfile), 当前解析的程序文件(curpfile)
![img_7d883a53c5e93342fef4ce6f8a6adf5d.png](https://i-blog.csdnimg.cn/blog_migrate/af31288bce4157b2321c0793e8d616f4.png)
62-63: setlocale
设置区域相关的设置,其中LC_CTYPE 影响所有字符函数。LC_NUMERIC影响 localeconv 函数提供的小数点格式化和信息
![img_412e172f92d6fffa24c45f0815948215.png](https://i-blog.csdnimg.cn/blog_migrate/feec8ee293a8872677f5e8a0efefd3e9.png)
65:获取程序的名字
66-70:如果参数只有一个,也就是只输入程序名,那么就用fprintf
将信息格式化输出的标准错误输出(stderr),也就是你可以用bioawk 2> err.log
而不是bioawk > err.log
报错报错信息。
![img_4c4096c60decb7fa29ef1ff5226b02fb.png](https://i-blog.csdnimg.cn/blog_migrate/9e82c2ff07c920a1749466e44bcd8326.png)
78:使用while语句开始解析参数。 argv[1][0] == '-' &&argv[1][1] != '\0'
表示第二个C语言接受的第二个参数是-
, --
开头的参数
![img_e4fb52e27bf8bebc027d20cf396c880c.png](https://i-blog.csdnimg.cn/blog_migrate/a416d3a2422ed6c6d7fd84550c8a4174.png)
79-83:使用string.h的strcmp进行文本比较,如果输入是 "-version" 或者是 "--version" 则输出版本信息,其中version在第25行定义。 strcmp返回0表示比较的内容相同,否则都是不相同。最后用break跳出循环
![img_0aa2a052bd6474af90dc1403835878cb.png](https://i-blog.csdnimg.cn/blog_migrate/f4bbb209de7772fef14b45c50e50b358.png)
84-88: 使用string.h
的strncmp比较两个字符串的最多n个字符。 也就是说,你可以用bioawk -c fastx ------------ '{printf $seq’ xxxx.fa
这种无聊的操作. 后续的argc--
与argv--
对当前解析的参数位置进行移动,就能读取到后面的参数了。
![img_389584072bdfb69d4c4ca9ad7a1a3813.png](https://i-blog.csdnimg.cn/blog_migrate/253a03896284c3ca03d14c641266f609.png)
89: 开始用switch解析短参数
90-93:用strcmp判断是否是 -safe,是的话就将safe赋值为1,最后跳出switch,
![img_33d045fafb4cbb72e1ac510e7d5059e8.png](https://i-blog.csdnimg.cn/blog_migrate/24387e428bf863eeb19728ab765567ba.png)
167-168:跳出switch之后,--argc
和 ++argv
进行参数偏移,也就是读取下一个参数
![img_9e7d88a84c62b85bfcfbddd3576a3619.png](https://i-blog.csdnimg.cn/blog_migrate/a305c422991ed27a573c821aeaa72444.png)
94-107: 处理program文件。将文件名存放到pfile(字符串数组),也就是将文件名开头的字符的地址( &argv[1][2])存放到pfile数组中。这里考虑有两种习惯,一种是-fsomefile,另一种是-f samefile, 其中后者需要对输入参数进行偏移。
![img_ea6edcb2e0103df86fd894e32ce00456.png](https://i-blog.csdnimg.cn/blog_migrate/c9c460948655218d8736a42a6818e36f.png)
108-123:处理分隔符。同样考虑到-F"\t和-F t这两种情况
![img_8a3a373557fd6acccb878d2f562fe781.png](https://i-blog.csdnimg.cn/blog_migrate/59303c3d334743279147a9341fb6bdfb.png)
124-126:使用string.h的strcpy
进行文本复制。
![img_4484f9ba1c50900ee4ee192caf69b9af.png](https://i-blog.csdnimg.cn/blog_migrate/338c87cb78a9ddca6aef460ba6f6ba41.png)
144-149: 使用stdlib.h的atoi函数将字符串转成数值。这里发现如果用bioawk -d 0
就会进行调试模式哦,这和原本awk -d是不同的。
![img_b5e75198c70911cde0c2a4434558718c.png](https://i-blog.csdnimg.cn/blog_migrate/8160369bccbcaaff1feceb5c408f24f2.png)
153-162:对格式进行解析。
![img_74cd8adaeb49f5cea3d4ee903da67300.png](https://i-blog.csdnimg.cn/blog_migrate/37895caea4e60f6a307ccce79bc2e2b4.png)