2016-12-10 3 views
1

ist es möglich, erhalten über ctags die Funktion Ende Zeilennummer als auch die Funktionsdefinition Startlinie-Zahlenctags: Um C-Funktion Ende Zeilennummer

"ctags -x --c-kinds=f filename.c" 

Above Befehlslisten zu erhalten. Wollte einen Weg, um die Funktion Endzeilennummern zu bekommen.

Andere Ansätze: 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 

Input:: Dateiname und die Funktion Startlinie keine

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

Dieser den Code richtig

Beispiel formatiert werden muss.

Example: 

    Input: filename.c 3 
    Output: 12 

    Input : filename.c 19 
    Output : 23 

Gibt es einen besseren/einfachen Weg, dies zu tun?

+0

Eine Beispieleingabedatei hilft Ihnen, mehr Antworten zu erhalten. – karakfa

+0

@karakfa Das Beispielbeispiel hinzugefügt. Schätzen Sie jede Hilfe hier – MSK

Antwort

2

awk zur Rettung!

behandelt nicht geschweiften Klammern innerhalb von Kommentaren, sondern sollten Blöcke innerhalb von Funktionen behandeln, es bitte zu versuchen ...

$ awk -v s=3 'NR>=s && /{/    {c++} 
       NR>=s && /}/ && c && !--c {print NR; exit}' file 

findet die passende Klammer für die erste nach der Zeilennummer s angegebenen Start.

+1

Cool. Das funktioniert. Änderungen: Hinzufügen eines Abschlusses am Ende. und ändere NR => s zu NR> = s – MSK

2

C/C++ - Parser von Universal-Ctags (https://ctags.io) hat Ende: Feld.

[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

Das funktioniert. Können wir die Start- und Endzeile im selben Befehl erhalten? – MSK