Конденсатные мультилинейные прототипы функций С - PullRequest
2 голосов
/ 26 июля 2011

У меня есть прототипы функций C (некоторые заголовочные файлы Windows API), которые выглядят так:

int
foo
(
int
a
,
int
*
b
)
;

(похоже, они не имеют соглашения о кодировании)

, который я пытаюсь программно превратить в однострочный прототип формы (или что-то близкое к ней):

int foo(int a, int * b);

Я изучал такие программы, как ctags ( многострочные прототипы функций C ctags ) и различные настройки в uncrustify (http://uncrustify.sourceforge.net/), однако я не смог добиться успеха в любом. (любое понимание было бы замечательно, или, возможно, один из 385 вариантов, которые я пропустил, делает то, что я хочу).

Программно я пытаюсь найти уникальные маркеры, которые обозначают прототип функции, чтобы я мог написать сценарий, который будет форматировать код на мой вкус.

Без использования лексера и парсера кажется, что он может очень запутаться очень быстро; какие-либо предложения?

Ответы [ 4 ]

4 голосов
/ 26 июля 2011

пропустите их через indent -kr или astyle --style=kr

1 голос
/ 26 июля 2011
sed ':a;N;$!ba;s/\n/ /g' prototypes.file  | sed 's/; */;\n/g'

Первая команда - перед конвейером - заменит все новые строки на пробелы, а следующая - после каждой точки с запятой.

Конечно, это будет работать, только если в файле нет ничего кроме этих прототипов. Если есть другие вещи, которые вы хотите оставить как есть, вы можете использовать визуальный выбор vim и две команды подстановки:

Выберите регион, к которому хотите присоединиться, чем

:s/\n/ /

Выберите объединенную строку и

:s/; */;\r/g
1 голос
/ 26 июля 2011

Решение с использованием vim?

поставить маркер на int и сделать 11J

0 голосов
/ 26 июля 2011

Другое решение, использующее vi:

, выполняет поиск регулярных выражений, удаляя все новые строки.Затем возьмите получившийся беспорядок и выполните другой поиск регулярных выражений, заменив каждый ; на ; \n\n.Это должно оставить вас со списком прототипов с пропущенной строкой между каждым.Поскольку мы отмечаем концы прототипов вместо начала, и все прототипы заканчиваются одинаково, нам не нужно беспокоиться о том, чтобы не распознавать особые случаи.

...