На проекте достаточно много однотипных функций (типа юнит тестов и некоторого сдк).
Нужно генерировать .h / .c файлы с функциями, а так же заполнять некоторые массивы (типа пара указатель на функцию + строка с описанием).
Возможно уже есть какие-то решения, которые позволят не изобретать велосипед с нуля? В качестве выхлопа нужен именно си, не си++.
Здравствуйте, SaZ, Вы писали:
SaZ>На проекте достаточно много однотипных функций (типа юнит тестов и некоторого сдк). SaZ>Нужно генерировать .h / .c файлы с функциями, а так же заполнять некоторые массивы (типа пара указатель на функцию + строка с описанием).
SaZ>Возможно уже есть какие-то решения, которые позволят не изобретать велосипед с нуля? В качестве выхлопа нужен именно си, не си++.
Здравствуйте, SaZ, Вы писали:
SaZ>Возможно уже есть какие-то решения, которые позволят не изобретать велосипед с нуля? В качестве выхлопа нужен именно си, не си++.
Ещё наверное не просто абы что абы как генерить, а по какому-то исходному описанию — DSL? Непонятно, что на входе, что на выходе.
Начал писать ответ, но что-то разошелся, и решил пост в свою жежешечу запилить
SaZ>Нужно генерировать .h / .c файлы с функциями, а так же заполнять некоторые массивы (типа пара указатель на функцию + строка с описанием). SaZ>Возможно уже есть какие-то решения, которые позволят не изобретать велосипед с нуля? В качестве выхлопа нужен именно си, не си++.
Есть некий трюк, не помню как называется, что-то вроде C include template.
Смысл таков.
1. Описываешь дефайны.
2. #include "impl.c"
В котором эти дефайны используются, в том числе формируются имена функций и структур.
3. #undef
4. GOTO 1.
Здравствуйте, SaZ, Вы писали:
SaZ>Возможно уже есть какие-то решения, которые позволят не изобретать велосипед с нуля? В качестве выхлопа нужен именно си, не си++.
Я как-то всегда для этих целей простым советским printf'ом обходился. Ну, с небольшими самодельными прибамбасами, чтобы рутиные веши, типа формирования отступов, автоматизировать (читабельность выхлопа совершенно не важна с точки зрения его исполнения, но очень сильно помогает отлаживать его генератора).
И есть еще один момент. В зависимости от решаемой задачи, иногда имеет смысл генерировать именно код, а иногда — таблицы, с которым будет работать код, написанный руками. Причем второе встречается чаще, чем первое (по крайней мере, по моему опыту).
Здравствуйте, Marty, Вы писали:
M>... M>Ещё наверное не просто абы что абы как генерить, а по какому-то исходному описанию — DSL? Непонятно, что на входе, что на выходе.
То что скормить на вход — отдельная задача. Часть будет лежать в виде json/xml (вероятно), но основная масса — это сишный код: сигнатуры функий, doxygen комменты в определённом формате.
Есть написанный на коленке прототип, аля moc из Qt, но он не учитывает макросы и вполне вероятно что изобилирует косяками.
Часть данных для генерации будет задаваться из вне, с форматом пока не определились.
M>Начал писать ответ, но что-то разошелся, и решил пост в свою жежешечу запилить M>https://trampampamparam.livejournal.com/18914.html
SaZ>>Нужно генерировать .h / .c файлы с функциями, а так же заполнять некоторые массивы (типа пара указатель на функцию + строка с описанием). SaZ>>Возможно уже есть какие-то решения, которые позволят не изобретать велосипед с нуля? В качестве выхлопа нужен именно си, не си++.
BB>Есть некий трюк, не помню как называется, что-то вроде C include template. BB>Смысл таков.
BB>1. Описываешь дефайны. BB>2. #include "impl.c" BB>В котором эти дефайны используются, в том числе формируются имена функций и структур. BB>3. #undef BB>4. GOTO 1.
BB>Во тут BB>https://stackoverflow.com/questions/10950828/simulation-of-templates-in-c-for-a-queue-data-type BB>Второй ответ сверху.
Не прокатит, увы. С тем же успехом можно gnu gengen приспособить. Код будет зависеть от внешних данных, которые скорее всего придут в виде json.
Здравствуйте, Pzz, Вы писали:
Pzz>Здравствуйте, SaZ, Вы писали:
SaZ>>Возможно уже есть какие-то решения, которые позволят не изобретать велосипед с нуля? В качестве выхлопа нужен именно си, не си++.
Pzz>Я как-то всегда для этих целей простым советским printf'ом обходился. Ну, с небольшими самодельными прибамбасами, чтобы рутиные веши, типа формирования отступов, автоматизировать (читабельность выхлопа совершенно не важна с точки зрения его исполнения, но очень сильно помогает отлаживать его генератора).
Pzz>И есть еще один момент. В зависимости от решаемой задачи, иногда имеет смысл генерировать именно код, а иногда — таблицы, с которым будет работать код, написанный руками. Причем второе встречается чаще, чем первое (по крайней мере, по моему опыту).
Так и есть. Мне надо генерить преимущественно таблицы и поиск по ним. В том числе таблицы функций. И в меру хитрые связи между ними, в зависимости от исходных данных. Нашёл тулзу gnu gengen, но поверх неё достаточно много нужно допиливать, так что пока действительно склоняюсь к ручной кодогенерации.
Здравствуйте, SaZ, Вы писали:
SaZ>То что скормить на вход — отдельная задача. Часть будет лежать в виде json/xml (вероятно), но основная масса — это сишный код: сигнатуры функий, doxygen комменты в определённом формате.
Плюсовый код (и самопровозглашенный IDL) пару раз парсил, в тч и doxygen комменты (с поддержкой формата javadoc и qt). Но это давно было. Тогда ничего хорошего не нашел. Сейчас может стоит посмотреть в сторону llvm и его плюсового фронтэнда. Ну, коменты наверное придётся самому парсить, но это уже на 2 порядка проще, чем парсить всё.
SaZ>Есть написанный на коленке прототип, аля moc из Qt, но он не учитывает макросы и вполне вероятно что изобилирует косяками.
Недельку плотно посидеть
SaZ>Часть данных для генерации будет задаваться из вне, с форматом пока не определились.
Здравствуйте, Marty, Вы писали:
M>Здравствуйте, SaZ, Вы писали: SaZ>>То что скормить на вход — отдельная задача. Часть будет лежать в виде json/xml (вероятно), но основная масса — это сишный код: сигнатуры функий, doxygen комменты в определённом формате.
M>Плюсовый код (и самопровозглашенный IDL) пару раз парсил, в тч и doxygen комменты (с поддержкой формата javadoc и qt). Но это давно было. Тогда ничего хорошего не нашел. Сейчас может стоит посмотреть в сторону llvm и его плюсового фронтэнда. Ну, коменты наверное придётся самому парсить, но это уже на 2 порядка проще, чем парсить всё.
Мне ещё проще, у нас си, без плюсов. Если точнее gnu c99. Благодарю ещё раз.
Здравствуйте, SaZ, Вы писали:
SaZ>Всем здравствуйте,
SaZ>На проекте достаточно много однотипных функций (типа юнит тестов и некоторого сдк). SaZ>Нужно генерировать .h / .c файлы с функциями, а так же заполнять некоторые массивы (типа пара указатель на функцию + строка с описанием).
SaZ>Возможно уже есть какие-то решения, которые позволят не изобретать велосипед с нуля? В качестве выхлопа нужен именно си, не си++.
Да, вполне. Очень хорошо подходит Jinja2, можно довольно продвинутый плюсовый код генерировать, что я в некоторых проектах и делал.