Bash - 如何计算C源文件函数调用

时间:2012-04-08 13:04:25

标签: bash shell

我想为C源文件中定义的每个函数找到它被调用多少次以及在哪一行上。 我应该在C中搜索看起来像函数定义的模式,然后计算函数名称出现的次数。如果是这样,我该怎么办?常用表达? 任何帮助将受到高度赞赏!

#!/bin/bash
if [ -r $1 ]; then
       #??????
else    
        echo The file \"$1\" does NOT exist
fi      

最终结果是:(请报告任何错误)

 10 if [ -r $1 ]; then
 11         functs=`grep -n -e "\(void\|double\|char\|int\) \w*(.*)"  $1 | sed 's/^.*\(void\|double\|int\) \(\w*\)(.*$/\2/g'`
 12         for f in $functs;do
 13                 echo -n  $f\(\) is called:
 14                 grep -n $f $1 > temp.txt
 15                 echo -n `grep -c -v -e "\(void\|double\|int\) $f(.*)" -e"//" temp.txt`
 16                 echo " times"
 17                 echo -n on lines:
 18                 echo -n `grep  -v -e "\(void\|double\|int\) $f(.*)" -e"//" temp.txt | sed -n 's/^\([0-9]*\)[:].*/\1/p'`
 19                 echo
 20                 echo
 21         done    
 22 else    
 23         echo The file \"$1\" does not exist
 24 fi 

2 个答案:

答案 0 :(得分:1)

这可能有点工作。第一位找到像

这样的函数定义
<datatype> <name>(<stuff>)

并取出<name>。然后grep为那个字符串。有很多情况下这不起作用,但是如果你试图制作一个适用于某些程序的简单shell脚本,它可能是一个很好的起点。

functions=`grep -e "\(void\|double\|int\) \w*(.*)$" -f input.c | sed 's/^.*\(void\|double\|int\) \(\w*\)(.*$/\2/g'`
for func in $functions
do
  echo "Counting references for $func:"
  grep "$func" -f input.c | wc -l
done

答案 1 :(得分:1)

您可以尝试使用此正则表达式

(^|[^\w\d])?(functionName(\s)*\()

例如搜索所有printf次出现

(^|[^\w\d])?(printf(\s)*\()

要将此表达式与grep一起使用,您必须使用-E选项,就像这样

grep -E "(^|[^\w\d])?(printf(\s)*\()" the_file.txt

最后请注意,此解决方案的缺失是跳过评论bloks中的事件。