ctags многострочные прототипы функций C

Есть ли способ для ctags обрабатывать многострочные прототипы функций в C?

Я искал, и --fields=+S должен делать многострочные прототипы, но я не могу заставить его работать:

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

файл:

int 
foo(int
    x, int y
    );

ctags возвращает только:

foo(int

(Обратите внимание, что тип возвращаемого значения также отсутствует)

В конечном итоге я хотел бы получить результат, похожий на

int foo(int x, int y);

or

int foo(int x, int y

--fields=+S не правильный путь? Есть ли часть полей ctags, которые мне не хватает? Любые указатели в целом?

Если нет способа сделать это в ctags, какие-нибудь рекомендуемые программы? (в настоящее время я смотрю на uncrustify)


person pseudosudo    schedule 25.07.2011    source источник
comment
Компилятор — это место, где эта функциональность должна быть. Предварительная обработка завершена, под рукой есть синтаксическое дерево и таблица символов. На дворе 2018 год, а этой функциональности, которая была в компиляторе DEC более 20 лет назад (cc --proto foo.c › foo.h), нет в gcc. Абсурд. [Вы даже можете выбрать только статические или только внешние функции и/или переменные для создания общедоступного и частного файла .h!]   -  person John Hascall    schedule 28.05.2018


Ответы (4)


У меня была такая же проблема с моим кодом, но я не мог его изменить. Когда я использую параметр --fields=+S, кажется, что он работает, потому что я получаю дополнительную строку в файле тегов. Сигнатура: часть содержит все параметры функции.

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 подпись:( uint16 memory_ID, uint32 ** pt_data_address, uint32 nb_recover, uint32 * nb_copied, uint32 max_length )

person Leo    schedule 17.10.2011

Мне не удалось найти что-либо с ctags, поэтому я написал скрипт на python, чтобы переупорядочить мой файл, чтобы ctags мог захватывать прототипы.

Примечание: в моем коде были комментарии, и большая часть этого требует их удаления (иначе они мешали бы ctags).

Манипуляции проводились в таком порядке:

# 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() + ' ')
person pseudosudo    schedule 27.07.2011

Опция --_xformat может вам помочь.

[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)
person Masatake YAMATO    schedule 16.02.2017

Вы можете удалить ненужные разрывы строк с помощью простого фильтра, например.

 tr '\n' ' '  | sed 's/\([{};]\)/\1\n/g'
person n. 1.8e9-where's-my-share m.    schedule 25.07.2011