Прототипы многострочной функции C ctags - PullRequest
10 голосов
/ 25 июля 2011

Есть ли у 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);

или

int foo(int x, int y

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

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

Ответы [ 4 ]

1 голос
/ 17 октября 2011

У меня была та же проблема с моим кодом, но я не мог изменить его. Когда я использую параметр --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, u32 * * pt_data_address, uint32 nb_recover, uint32 * nb_copied, uint32 max_length)

0 голосов
/ 16 февраля 2017

--_ Параметр 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)
0 голосов
/ 28 июля 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() + ' ')
0 голосов
/ 25 июля 2011

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

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