2013-10-28 67 views
0

我想打印所有函數定義的大小。以打印函數定義的大小及其名稱

樣本文件(實際文件相當大)

.... 
VideoChainT* ChainCtrlBuildChain(...) 
{ 
    abcd 
    edfg 
    dfdsh 
} 
eErrorT ChainCtrlInit(...) 
{ 
    sdgfg 
    dsgd 
} 
.... 

我已經(有更多的也有)到一個文本文件中使用的doxygen

function.txt

ChainCtrlBuildChain 
ChainCtrlInit 

提取函數名我的代碼

use strict; 
use warnings; 
open(FILE, "< chaincontroller.c") or die $!; 
my @lines = <FILE>; 
open(FILE1, "< functions.txt") or die $!; 
my @lines1 = <FILE1>; 

foreach my $func (@lines1){ 
foreach my $src_line (@lines){ 
    if ($src_line =~ /$func\([^;]+$/){  # points to function definitions 
      #need to extract function body into an array and get its size 

} 
} 

}

輸出所需

function ChainCtrlBuildChain has 3 lines. 
function ChainCtrlInit has 2 lines. 

會明白這個問題的幫助或有任何其他方式..

回答

2

這可能會失敗在很多方面取決於你的代碼的格式,但你可以嘗試用一個觸發器,它在函數定義中激活,並在關閉大括號中停用。你可以指望線,同時激活和3。減去

foreach my $func (@lines1){ 
    chomp $func; 
    foreach my $src_line (@lines){ 
     if (my $flipflop = ($src_line =~ /$func\([^;]+$/ .. $src_line =~ /^}/)){ 
      ++$lines; 
      if ($flipflop =~ /E0$/) { 
       printf qq|function %s has %d lines\n|, $func, $lines - 3; 
       $lines = 0; 
      } 
      next; 
     } 

    } 
} 

在我的測試它產生:

function ChainCtrlBuildChain has 3 lines 
function ChainCtrlInit has 2 lines 
+0

偉大作品的罰款。但爲什麼3被減少。 –

+0

@ Ad-vic:這是因爲觸發器從函數定義開始,以關閉大括號結束,但函數名稱和大括號都不作爲函數主體的線。 – Birei

+0

好的。但是你沒有初始化$行。我認爲它應該在foreach循環之前初始化爲0。 –

1
use strict; 
use warnings; 
open(FILE, "< chaincontroller.c") or die $!; 
my @source_lines = <FILE>; 
open(FILE1, "< functions.txt") or die $!; 
chomp(my @functions = <FILE1>); 

my $match_function = qr/\b(@{[ join '|', map quotemeta, sort { length($b) <=> length($a) } @functions ]})\([^;]+$/; 
my %function_size; 
my $function = ''; 
for my $source_line (@source_lines) { 
    if ($source_line =~ $match_function) { 
     $function = $1; 
     $function_size{$function} = 0; 
    } 
    elsif ($source_line =~ /^}/) { 
     $function = ''; 
    } 
    # ignore first { 
    elsif ($function && ($source_line !~ /^{/ || $function_size{$function})) { 
     ++$function_size{$function}; 
    } 
} 

for my $function (@functions) { 
    if (exists $function_size{$function}) { 
     print "function $function has $function_size{$function} lines.\n"; 
    } 
    else { 
     print "function $function not found.\n"; 
    } 
} 
+0

工作涼爽..感謝您的另一種解決方案。 –

相關問題