aeuo
написал 28 марта 2007 года в 13:26 (1042 просмотра)
Ведет себя
неопределенно; открыл 5 тем в форуме, оставил 18 комментариев на сайте.
Доброго времени суток!
Будьте добры, подскажите, пожалуйста, каким инструменто можно решить элегантно следующую задачу:
Необходимо вставить вызов функции в начало каждой функции. Где код написан на Си.
Пример
void function()
{
int var = 0;
/*здесь нужно вставить функцию*/
… некий код
}
При этом надо не забывать, что вствлять нужно после объявлений, так как в Си объявления должные предшестовать всему остальному.
Есть ли готовые тулзины для такой работы, что бы к примеру на перле не ваять, что-то своё. И желательно это сделать средствами UNIX тулзин.
Последние комментарии
- OlegL, 17 декабря в 15:00 → Перекличка 21
- REDkiy, 8 июня 2023 года в 9:09 → Как «замокать» файл для юниттеста в Python? 2
- fhunter, 29 ноября 2022 года в 2:09 → Проблема с NO_PUBKEY: как получить GPG-ключ и добавить его в базу apt? 6
- Иванн, 9 апреля 2022 года в 8:31 → Ассоциация РАСПО провела первое учредительное собрание 1
- Kiri11.ADV1, 7 марта 2021 года в 12:01 → Логи catalina.out в TomCat 9 в формате JSON 1
ecobeing.ru
Экология и вегетарианство на благо всем живым существам Планеты.
Тут проблема, как определить где начало функции? А вставить потом можно с помощью tr.
А как ты узнаешь где заканчиваются объявления переменных?
вот пример как отформатированы функции:
1. может быть объявление той же функции в этом же файле
2. фигурная скобка после названия функции всегда с новой строки
3. объявление переменных всегда заканчивается хотябы одной пустой строкой
int main(int n, char**argv);
int main(int n, char**argv)
{
int a;
float b;
struct MYSTRUCT c;
if(a==0)
puts(«a=0»);
return 0;
}
sed ’s/main.*(*.*)[[:space:]]*$/&TEXT/g' c.c
здесь понятно что текст встанет не верно
int main(int n, char**argv);
int main(int n, char**argv)TEXT
{
int a;
float b;
struct MYSTRUCT c;
if(a==0)
puts(«a=0»);
return 0;
}
второй вариант
# command.sed
sed command file:
/main[[:space:]]*(/a\
TEXT
int main(int n, char**argv);
TEXT
int main(int n, char**argv)
TEXT
{
int a;
float b;
struct MYSTRUCT c;
if(a==0)
puts(«a=0»);
return 0;
}
текст встаёт опять не там где надо.
Подскажите, пожалуйста, как правильно. Или куда копать. Конечно в итоге хотелось бы универсальный способ, может как-то не шеловскими примочками, а некими редакторами. Но можно и sed’ом
я идей могу накидать, а как оно лучше/проще — это тебе думать придётся:
1. indent — привести код к виду который проще регекспами разруливать
2. gcc — ты ведь им компиляешь? gcc понимает объявления в любом месте.
3. cparse — библиотечка для парсинга c-кода
4. можно все функции переименовать, например так: func -> func_with_suffix,
а потом добавить функции, типа:
type func (args)
{
my_hook ();
return func_with_suffix (args);
}
5. взять ELF после сборки, и добавить необходимые вызовы при помощи одного из вирусных способов.
Спасибо, rgo!
Пожалуй буду делать вот этим ;-)
Объясни пожалуйста в двух слова как gcc может помочь? ты предлагаешь выдрать из него куски кода и написать свою прогу?
Ты чё, в танке? Сказали же, что GCC понимает объявления в любом месте. Это значит, что насчёт объявлений можно не париться — вставляешь вызов сразу за '{' и все дела.
Да, нет не в танке. Просто не понял, что имелось в виду. Си прогу компилируют с разными компиляторами и она должна следовать стандарту.
Вот только в действительности большинство программ сложнее «Hello World» обычно компиллируется далеко не всеми компилляторами.
И даже не всеми версиями gcc.
Боюсь здесь разведётся флуд. Как однажды про Slackware vs Suse :-) Но я продолжу,
я не имею в виду большинство программ. Может быть ты и прав. Но я говорю про мою программу, которая обязана придерживаться стандарту ANSI для совместимости с другими компиляторами, которые понимают это стандарт.