读源码学C之阅读李恒的bioawk

简介: 目前尚没有能力直接去阅读htslib的源代码,看到bioawk的代码稍微简单点,因此准备先从这里下手,bioawk的项目地址为https://github.com/lh3/bioawk。

目前尚没有能力直接去阅读htslib的源代码,看到bioawk的代码稍微简单点,因此准备先从这里下手,bioawk的项目地址为https://github.com/lh3/bioawk

这次先阅读了"main.c"部分学习如何解析参数。

1-23: 版权信息部分

img_a969965a17172aaba49e2d9707ab6859.png
copyright

25: 版本信息
27: #define创建自己的常量和宏
27-35: 导入标准库的头文件和原来awk的头文件

img_035eafc84a20ace917bfa59bcdd00a3d.png
导入标准库

37-38: extern声明后面的变量来自于其他文件,避免编译时报错

img_87daf2489fc48b00d10c002b7817923e.png
声明外部变量

49-53: 定义后续用于解析的最大程序文件数(pfile), 当前解析的程序文件(curpfile)

img_7d883a53c5e93342fef4ce6f8a6adf5d.png
定义变量

62-63: setlocale设置区域相关的设置,其中LC_CTYPE 影响所有字符函数。LC_NUMERIC影响 localeconv 函数提供的小数点格式化和信息

img_412e172f92d6fffa24c45f0815948215.png
区域相关设置

65:获取程序的名字
66-70:如果参数只有一个,也就是只输入程序名,那么就用fprintf将信息格式化输出的标准错误输出(stderr),也就是你可以用bioawk 2> err.log而不是bioawk > err.log报错报错信息。

img_4c4096c60decb7fa29ef1ff5226b02fb.png
判断

78:使用while语句开始解析参数。 argv[1][0] == '-' &&argv[1][1] != '\0' 表示第二个C语言接受的第二个参数是-, --开头的参数

img_e4fb52e27bf8bebc027d20cf396c880c.png
解析参数

79-83:使用string.h的strcmp进行文本比较,如果输入是 "-version" 或者是 "--version" 则输出版本信息,其中version在第25行定义。 strcmp返回0表示比较的内容相同,否则都是不相同。最后用break跳出循环

img_0aa2a052bd6474af90dc1403835878cb.png
版本参数

84-88: 使用string.h的strncmp比较两个字符串的最多n个字符。 也就是说,你可以用bioawk -c fastx ------------ '{printf $seq’ xxxx.fa 这种无聊的操作. 后续的argc--argv--对当前解析的参数位置进行移动,就能读取到后面的参数了。

img_389584072bdfb69d4c4ca9ad7a1a3813.png
显示声明参数结尾

89: 开始用switch解析短参数

90-93:用strcmp判断是否是 -safe,是的话就将safe赋值为1,最后跳出switch,

img_33d045fafb4cbb72e1ac510e7d5059e8.png
第一个判断

167-168:跳出switch之后,--argc++argv进行参数偏移,也就是读取下一个参数

img_9e7d88a84c62b85bfcfbddd3576a3619.png
跳出循环

94-107: 处理program文件。将文件名存放到pfile(字符串数组),也就是将文件名开头的字符的地址( &argv[1][2])存放到pfile数组中。这里考虑有两种习惯,一种是-fsomefile,另一种是-f samefile, 其中后者需要对输入参数进行偏移。

img_ea6edcb2e0103df86fd894e32ce00456.png
处理program文件

108-123:处理分隔符。同样考虑到-F"\t和-F t这两种情况

img_8a3a373557fd6acccb878d2f562fe781.png
image.png

124-126:使用string.h的strcpy进行文本复制。

img_4484f9ba1c50900ee4ee192caf69b9af.png
复制字符串

144-149: 使用stdlib.h的atoi函数将字符串转成数值。这里发现如果用bioawk -d 0就会进行调试模式哦,这和原本awk -d是不同的。

img_b5e75198c70911cde0c2a4434558718c.png
调试功能

153-162:对格式进行解析。

img_74cd8adaeb49f5cea3d4ee903da67300.png
选择格式
目录
相关文章
|
Android开发
Android中实现获取相册中的图片扫描二维码的功能
Android中实现获取相册中的图片扫描二维码的功能
713 0
|
5月前
|
人工智能 安全 定位技术
阿里云开发者社区关于AKSGEO+E-E-A-T 双轮驱动:AI 搜索时代本地商家获客新范式
AI搜索时代,本地商家获客迎来范式变革:AKSGEO以“权威信源+地理优化”双轮驱动,深度融合E-E-A-T评估体系,将传统GEO升级为AI信任资产,助力餐饮、服务、制造等实体企业实现精准曝光、优先推荐与高转化增长。
|
7月前
|
人工智能 弹性计算 安全
2026年阿里云OpenClaw一键秒级部署教程,快速搭建专属AI助理!
2026年,阿里云推出OpenClaw一键秒级部署方案,预置镜像、简化配置,零基础用户几分钟即可搭建本地优先的AI数字员工。支持文件管理、日程安排、代码辅助与钉钉/飞书协同,数据全留在您服务器,安全可控,真正开箱即用!
1240 10
|
7月前
|
运维 监控 Linux
Finalshell远程管理软件安装步骤详解(附SSH连接与文件传输教程)
FinalShell是一款专为运维与开发者设计的国产远程管理工具,支持SSH/SFTP连接Linux服务器、VPS及云主机,集成终端、文件拖拽传输、实时资源监控(CPU/内存/磁盘)等功能,界面简洁易用,Win7–Win11全兼容。(239字)
3808 4
|
消息中间件 Java API
微服务架构设计与实现:从理论到实践
微服务架构设计与实现:从理论到实践
661 7
|
Unix Linux Shell
export在linux中的作用
通过对 `export`命令的详细介绍和实际应用示例,可以更好地理解和使用这一命令来管理Linux环境中的变量配置,从而提高系统管理和脚本编写的效率和灵活性。
1291 27
|
SQL 分布式计算 Hadoop
Apache Hive 帮助文档
Apache Hive 帮助文档
1014 9
|
API Android开发
Android P 性能优化:创建APP进程白名单,杀死白名单之外的进程
本文介绍了在Android P系统中通过创建应用进程白名单并杀死白名单之外的进程来优化性能的方法,包括设置权限、获取运行中的APP列表、配置白名单以及在应用启动时杀死非白名单进程的代码实现。
623 1
|
域名解析 缓存 网络协议
理解DNS的重要性与影响
【8月更文挑战第24天】
790 0
|
NoSQL Java Redis
认证服务---整合短信验证码,验证码倒计时,验证码防刷校验 【一】
这篇文章介绍了如何在分布式微服务项目中整合短信验证码服务,包括使用阿里云短信验证接口、将短信验证功能集成到第三方服务中、其他服务的远程调用,以及通过Redis实现验证码防刷机制的代码实现和遇到的问题解决方案。

热门文章

最新文章