在 C 程序中查找函数的脚本

在 C 程序中查找函数的脚本

我正在尝试找到以下问题的解决方案:

给定目录结构:

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和文件并创建文件。的内容看起来像(在这个例子中).htop-dirtabletabletop-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以获得您想要的格式。

相关内容