MSK
MSK

Reputation: 185

ctags: To get C function end line number

is it possible via ctags to get the function end line number as well

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

Above command lists the function definition start line-numbers. Wanted a way to get the function end line numbers.

Other Approaches:

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

This needs the code to be properly formatted

Example: 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: filename and the function start line no.

Example:

    Input: filename.c  3
    Output: 12

    Input : filename.c 19
    Output : 23

Is there any better/simple way of doing this ?

Upvotes: 4

Views: 2881

Answers (2)

Masatake YAMATO
Masatake YAMATO

Reputation: 1300

C/C++ parser of Universal-ctags(https://ctags.io) has end: field.

jet@localhost 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  
[jet@localhost 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:    

Upvotes: 9

karakfa
karakfa

Reputation: 67507

awk to the rescue!

doesn't handle curly braces within comments but should handle blocks within functions, please give it a try...

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

finds the matching brace for the first one after the specified start line number s.

Upvotes: 2

Related Questions