2009-07-17 5 views
4

extremely long and complicated functions in the Linux kernel에 대한 소규모 학술 연구를하고 있습니다. 나는 600 또는 800 라인 길이의 함수를 쓸 좋은 이유가 있는지 알아 내려고하고있다.소스 파일에서 단일 함수를 추출하는 방법

그런 목적으로 .c 파일에서 함수를 추출 할 수있는 도구를 찾고 싶습니다. 따라서 함수에 대한 자동화 된 테스트를 실행할 수 있습니다.

extract /fs/cifs/connect.c cifs_parse_mount_options 

코드의 523 개 라인을 반환 함수의 (!) : 나는 파일 connect.c 내에서 기능 cifs_parse_mount_options()이있는 경우 예를 들어

, 나는 거의 같은 일을 할 수있는 솔루션을 찾고있어 , 여는 괄호에서 닫는 괄호까지.

물론, gcc과 같은 기존 소프트웨어 패키지를 조작하는 방법이 가장 유용 할 것입니다.

감사합니다,

우디

편집 : Regex to pull out C function prototype declarations?- 대답은 정규식에 의해 함수 선언과 일치하는 사소한에서 멀리 저를 설득했다.

답변

3

작은 PERL/PHP/Python 스크립트 또는 심지어 작은 C++, Java 또는 C# 프로그램을 작성하지 않는 이유는 무엇입니까?

이미 작성한 도구가 무엇인지 모르겠지만 텍스트 파일을 구문 분석하고 C++ 코드 파일에서 함수 본문을 추출하는 코드를 작성하면 20 줄 이상의 코드를 사용해서는 안됩니다. 부분 만 부분은 함수의 시작 부분을 찾을 것이며 RegEx를 사용하여 비교적 간단한 작업이어야합니다. 그 후, 파일의 나머지 부분을 반복하여 중괄호를 열고 닫는 것을 추적하고 함수 몸체 닫기 중괄호에 도달하면 완료됩니다.

+0

이것이 제가 생각한 첫 번째 아이디어였습니다. 그러나 주석은 상황을 좀 더 복잡하게 만듭니다. 그러나 그런 스크립트를 작성하고 싶습니다. 나는 그것을 출판 할 것입니다 - 다른 사람들에게 유용 할 수도 있습니다. –

+0

동의합니다. 내부에 일치하지 않는 중괄호가 포함될 수 있으므로 의견을 수렴해야 할 수도 있습니다. 코드 작성이 너무 어렵지는 않습니다. –

+0

나는 그들을 제거하고 함수의 끝 위치를 얻은 다음 주석이있는 코드를 추출해야합니다. 또 다른 문제는 상단에 함수 서명이 있다는 것입니다.이 함수는 한 줄 이상 될 수 있습니다. 앞서 언급했듯이 큰 문제는 아니지만 차라리 연구에 집중하고 기성품 도구를 사용합니다. 그게 가능하지 않으면, 파이썬 문제 야! –

1

들여 쓰기 -KR 코드 -o code.out

AWK -f split.awk code.out

당신이 조금 split.awk 느릅 나무를 적응해야

내 코드 리팩토링 요구에 다소 다릅니다 (예를 들어, Y는 너무

을 타입 정의되지 않은 사람 구조체하고 난 당신이 기능을 추출하기 어려운 찾는 경우

-- 
BEGIN { line=0; FS=""; 
    out=ARGV[ARGC-1] ".out"; 
    var=ARGV[ARGC-1] ".var"; 
    ext=ARGV[ARGC-1] ".ext"; 
    def=ARGV[ARGC-1] ".def"; 
    inc=ARGV[ARGC-1] ".inc"; 
    typ=ARGV[ARGC-1] ".typ"; 
    system (rm " " -f " " out " " var " " ext " " def " " inc " " typ); 
    } 
/^[  ]*\/\/.*/ { print "comment :" $0 "\n"; print $0 >> out ; next ;} 
/^#define.*/  { print "define :" $0 ; print $0 >>def ; next;} 
/^#include.*/  { print "define :" $0 ; print $0 >>inc ; next;} 
/^typedef.*{$/  { print "typedef var :" $0 "\n"; decl="typedef";print $0 >> typ;infile="typ";next;} 
/^extern.*$/  { print "extern :" $0 "\n"; print $0 >> ext;infile="ext";next;} 
/^[^ }].*{$/  { print "init var :" $0 "\n";decl="var";print $0 >> var; infile="vars"; 
       print $0; 
       fout=gensub("^([^ \\*])*[ ]*([a-zA-A0-9_]*)\\[.*","\\2","g") ".vars"; 
        print "var decl : " $0 "in file " fout; 
        print $0 >fout; 
       next; 
         } 
/^[^ }].*)$/  { print "func :" $0 "\n";decl="func"; infile="func"; 
       print $0; 
       fout=gensub("^.*[ \\*]([a-zA-A0-9_]*)[ ]*\\(.*","\\1","g") ".func"; 
        print "function : " $0 "in file " fout; 
        print $0 >fout; 
       next; 
      } 
/^}[ ]*$/  { print "end of " decl ":" $0 "\n"; 
       if(infile=="typ") { 
        print $0 >> typ; 
       }else if (infile=="ext"){ 
        print $0 >> ext; 
       }else if (infile=="var") { 
        print $0 >> var; 
       }else if ((infile=="func")||(infile=="vars")) { 
        print $0 >> fout; 
        fflush (fout); 
        close (fout); 
       }else if (infile=="def") { 
        print $0 >> def; 
       }else if (infile=="inc"){ 
        print $0 >> inc; 
       }else print $0 >> out; 
       next; 
      } 
/^[a-zA-Z_]/  { print "extern :" $0 "\n"; print $0 >> var;infile="var";next;} 
      { print "other :" $0 "\n" ; 
       if(infile=="typ") { 
        print $0 >> typ; 
       }else if (infile=="ext"){ 
        print $0 >> ext; 
       }else if (infile=="var") { 
        print $0 >> var; 
       }else if ((infile=="func")||(infile=="vars")){ 
        print $0 >> fout; 
       }else if (infile=="def") { 
        print $0 >> def; 
       }else if (infile=="inc"){ 
        print $0 >> inc; 
       }else print $0 >> out; 
       next; 
       } 
0

:-) 더 좋은 스크립트를 만들 수 있습니다 확신 이름 :

1> 함수 이름을 추출하는 데 ctags (프로그램)를 사용하십시오. ctags -x --c-kinds = fp path_to_file. 2> 일단 함수 이름을 얻었 으면 위의 함수의 스크립트 이름을 전달하여 함수의 내용을 추출하는 간단한 perl 스크립트를 작성하십시오.

관련 문제