ctags multi-line C function prototypes

穿精又带淫゛_ 提交于 2019-12-13 11:37:10

问题


Is there a way for ctags to handle multiline function prototypes in C?

I've searched around and the --fields=+S is supposed to do multiline prototypes, but I can't get it to work:

ctags -x --c-kinds=pf --fields=+S file

file:

int 
foo(int
    x, int y
    );

ctags only returns:

foo(int

(Note that the return type is also missing)

Ultimately I would like to get an output similar to

int foo(int x, int y);

or

int foo(int x, int y

is --fields=+S not the correct way? Are there part of the ctags fields that I am missing? Any pointers in general?

If there is not a way to do it in ctags, any recommended programs? (I'm currently looking at uncrustify)


回答1:


I had the same issue with my code but I couldn't modify it. When I use the --fields=+S parameter, it seem to work because I get an additional line in the tag file. The signature: part contains all the parameters of the function.

CopyToTX26 D:\BiseL\My Dropbox\Work\0_BSW\PKG_CMD\Memory.c /^void CopyToTX26( uint16 memory_ID, uint32 ** pt_data_address, uint32 nb_recover, $/;" f signature:( uint16 memory_ID, uint32 ** pt_data_address, uint32 nb_recover, uint32 * nb_copied, uint32 max_length )




回答2:


I was unable to find anything with ctags so I wrote a python script to re-arrange my file so that ctags could capture the prototypes.

Note: my code had comments and so much of this takes care with removing them (otherwise they would get in the way of ctags).

Manipulations were done in this order:

# concat to one line
file_str = ''
for line in read_from.readlines():
    file_str += line

# remove all /* */ comments
file_str = re.sub('/\*(.|[\r\n])*?\*/', '', file_str)

# remove '//' comments
file_str = re.sub('//.*', '', file_str)

# split on '\n'
file_as_list = file_str.splitlines(True)

# strip everything
for index in range(len(file_as_list)):
    file_as_list[index] = file_as_list[index].strip()

# add in newlines where appropriate
for line in file_as_list:
    # if the line ends in ';' or '}'
    if line.endswith(';') or line.endswith('}'):
        # append a newline to the stripped line
        write_to.write(line.strip() + '\n')
    else:
        # append a space to the stripped line
        write_to.write(line.strip() + ' ')



回答3:


--_xformat option may help you.

[jet@localhost ~]$ cat /tmp/foo.h
int 
foo(int
    x, int y
    );
[jet@localhost ~]$ ~/var/ctags/ctags -x --c-kinds=pf --_xformat="%-16N %4n %-16F %C %S" /tmp/foo.h
foo                 2 /tmp/foo.h       foo(int (int x,int y)



回答4:


You can remove unneeded line breaks with a simple filter, e.g.

 tr '\n' ' '  | sed 's/\([{};]\)/\1\n/g'


来源:https://stackoverflow.com/questions/6820350/ctags-multi-line-c-function-prototypes

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!