2016-12-10 8 views
1

것이 가능를 얻으려면. 함수 끝 줄 번호를 가져 오는 방법을 원했습니다.ctags를이 : ctags를 명령 목록 위뿐만 아니라</p> <pre><code>"ctags -x --c-kinds=f filename.c" </code></pre> <p>기능 정의 시작 줄 번호를 함수 끝 행 번호를 얻을 통해 C 함수 끝 행 번호

다른 접근 방법 :

awk 'NR > first && /^}$/ { print NR; exit }' first=$FIRST_LINE filename.c 

이 코드를 필요로 제대로 포맷하는

예 : 이 filename.c

1 #include<stdio.h> 
    2 #include<stdlib.h> 
    3 int main() 
    4 { 
    5 const char *name; 
    6 
    7  int a=0 
    8  printf("name"); 
    9  printf("sssss: %s",name); 
10 
11  return 0; 
12 } 
13 
14 void code() 
15 { 
16   printf("Code \n"); 
17 } 
18 
19 int code2() 
20 { 
21   printf("code2 \n"); 
22   return 1 
23 } 
24 

입력 : 파일 이름과 함수 출발 선 없음.

Example: 

    Input: filename.c 3 
    Output: 12 

    Input : filename.c 19 
    Output : 23 

더 좋은 방법이 있습니까?

+0

샘플 입력 파일을 사용하면 더 많은 답변을 얻을 수 있습니다. – karakfa

+0

@karakfa 샘플 예제가 추가되었습니다. 어떤 도움을 주시면 감사하겠습니다. – MSK

답변

2

awk the rescue!

댓글에서 중괄호를 처리하지 않고 기능 내에서 블록을 처리해야,
$ awk -v s=3 'NR>=s && /{/    {c++} 
       NR>=s && /}/ && c && !--c {print NR; exit}' file 

는 지정된 시작 행 번호의 후 첫 번째에 대한 일치하는 중괄호를 발견 ... 한번 시도해주십시오.

+1

차갑습니다. 이 작동합니다. 변경 : 끝에 '를 추가하십시오. NR => s를 NR> = s로 변경하십시오. – MSK

2

Universal-ctags (https://ctags.io)의 C/C++ 구문 분석기에는 end : 필드가 있습니다.

[email protected] tmp]$ cat -n foo.c 
    1 int 
    2 main(void) 
    3 { 
    4 
    5 } 
    6 
    7 int 
    8 bar (void) 
    9 { 
    10 
    11 } 
    12 
    13 struct x { 
    14  int y; 
    15 }; 
    16 
[[email protected] tmp]$ ~/var/ctags/ctags --fields=+ne -o - --sort=no foo.c 
main foo.c /^main(void)$/;" f line:2 typeref:typename:int end:5 
bar foo.c /^bar (void)$/;" f line:8 typeref:typename:int end:11 
x foo.c /^struct x {$/;" s line:13 file: end:15 
y foo.c /^ int y;$/;" m line:14 struct:x typeref:typename:int file:  
+0

이것은 작동합니다. 동일한 명령에서 시작과 끝 줄을 가져올 수 있습니까? – MSK