我正在尝试找到以下问题的解决方案:
给定目录结构:
project/
bridge/
mysql_bridge.c
postgres_bridge.c
我的代码应该从根文件夹检索 .c 文件中的所有函数及其子目录中的所有 c 程序*:
- mysql_bridge.c
- postgres_bridge.c
如果没有遇到源文件,我的脚本应该输出“无法找到任何源文件”。具体来说,应该搜索的唯一源文件是 .c 文件(标头被忽略)
我想使用命令行参数作为项目的根。以下是场景:
示例1:
./findfn.sh project_1
project_1/ever/jump.c:
void logical_jump(int loc)
int ngoto()
project_1/indent/handle.c:
FILE* figure_out_this(char* name)
void kill_all()
project_1/mac.c:
void some(void)
int super_function(int xx, int ya)
project_1/test.c:
void this_function()
示例2:坏目录
./findfn.sh file
file is not a directory
示例3:找不到功能
./findfn.sh project_2
Unable to find any functions
答案1
AC 源文件与其他结构化数据文件一样难以解析。最好使用了解该语言语法的解析器,而不是尝试自己处理它。
假设你有旺盛的C标签安装为ectags
:
find top-dir -type f -name '*.[ch]' -exec ectags -x --c-kinds=f {} ';' >table
这将找到中或下的所有.c
和文件并创建文件。的内容看起来像(在这个例子中).h
top-dir
table
table
top-dir
.
GetTimeSeed function 373 ./src/bayes.c void GetTimeSeed (void)
InitializeMrBayes function 443 ./src/bayes.c int InitializeMrBayes (void)
PrintHeader function 821 ./src/bayes.c void PrintHeader (void)
ReinitializeMrBayes function 838 ./src/bayes.c int ReinitializeMrBayes (void)
main function 101 ./src/bayes.c int main (int argc, char *argv[])
readline_completion function 359 ./src/bayes.c char **readline_completion (const char *text, int start, int stop)
(ETC。)
这种输出格式应该很容易被解析,例如,awk
以获得您想要的格式。