nixp.ru v3.0

19 октября 2017,
четверг,
17:16:54 MSK

DevOps с компанией «Флант»
aeuo написал 28 марта 2007 года в 13:26 (406 просмотров) Ведет себя неопределенно; открыл 5 тем в форуме, оставил 18 комментариев на сайте.

Доброго времени суток!

Будьте добры, подскажите, пожалуйста, каким инструменто можно решить элегантно следующую задачу:

Необходимо вставить вызов функции в начало каждой функции. Где код написан на Си.

Пример

void function()

{

int var = 0;

/*здесь нужно вставить функцию*/

… некий код

}

При этом надо не забывать, что вствлять нужно после объявлений, так как в Си объявления должные предшестовать всему остальному.

Есть ли готовые тулзины для такой работы, что бы к примеру на перле не ваять, что-то своё. И желательно это сделать средствами UNIX тулзин.

skeletor

Тут проблема, как определить где начало функции? А вставить потом можно с помощью tr.

aeuo

А как ты узнаешь где заканчиваются объявления переменных?

aeuo

вот пример как отформатированы функции:

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’ом

rgo

я идей могу накидать, а как оно лучше/проще — это тебе думать придётся:

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 после сборки, и добавить необходимые вызовы при помощи одного из вирусных способов.

aeuo

Спасибо, rgo!

rgo
5. взять ELF после сборки, и добавить необходимые вызовы при помощи одного из вирусных способов.

Пожалуй буду делать вот этим ;-)

aeuo
rgo
2. gcc — ты ведь им компиляешь? gcc понимает объявления в любом месте.

Объясни пожалуйста в двух слова как gcc может помочь? ты предлагаешь выдрать из него куски кода и написать свою прогу?

myst

Ты чё, в танке? Сказали же, что GCC понимает объявления в любом месте. Это значит, что насчёт объявлений можно не париться — вставляешь вызов сразу за '{' и все дела.

aeuo
myst
Ты чё, в танке? Сказали же, что GCC понимает объявления в любом месте. Это значит, что насчёт объявлений можно не париться — вставляешь вызов сразу за '{' и все дела.

Да, нет не в танке. Просто не понял, что имелось в виду. Си прогу компилируют с разными компиляторами и она должна следовать стандарту.

Anarchist
aeuo
Да, нет не в танке. Просто не понял, что имелось в виду. Си прогу компилируют с разными компиляторами и она должна следовать стандарту.

Вот только в действительности большинство программ сложнее «Hello World» обычно компиллируется далеко не всеми компилляторами.

И даже не всеми версиями gcc.

aeuo

Боюсь здесь разведётся флуд. Как однажды про Slackware vs Suse :-) Но я продолжу,

я не имею в виду большинство программ. Может быть ты и прав. Но я говорю про мою программу, которая обязана придерживаться стандарту ANSI для совместимости с другими компиляторами, которые понимают это стандарт.

rgo
ISO C99 and ISO C++ allow declarations and code to be freely mixed

within compound statements. As an extension, GCC also allows this in

C89 mode.