Извлечение тела функции по имени с помощью BASH и регулярного выражения - PullRequest
0 голосов
/ 18 февраля 2019

У меня есть автоматически сгенерированный код из MATLAB кодер .Я хотел бы сделать скрипт, чтобы найти мои записи из большого файла.Я успешно проложил свой путь через регулярное выражение с помощью BASH, чтобы получить основную функцию main\( *([^)]+?)\), а затем тело с /\{([^}]+)\}/;однако я ужасно склеиваю их вместе.Все, что мне нужно, это имена функций, содержащиеся в main ().

Я понимаю, что это может быть ужасным упражнением, но автоматически сгенерированный код дает мне простые функции, которые выглядят следующим образом:

int main(int argc, const char * const argv[])
{
  (void)argc;
  (void)argv;
  /* Initialize the application. You do not need to do this more than one time. */
  RT_initialize();
  /* Invoke the entry-point functions. You can call entry-point functions multiple times. */
  main_RT();
  /* Terminate the application.  You do not need to do this more than one time. */
  RT_terminate();
  return 0;
}

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

Любое руководство будет с благодарностью.

Ответы [ 2 ]

0 голосов
/ 19 февраля 2019

В связи с некоторыми ограничениями на использование BSD, результирующая функция BASH следует, чтобы получить тело функции из источника C для функции по имени.Это было проверено только с хорошо отформатированным C-кодом из MATLAB's Coder.

function getFunctionInC(){
TMPFILEIDENT="/tmp/indent.$$.tmp" #temp file
indent "$1" $TMPFILEIDENT
cat $TMPFILEIDENT | awk '
BEGIN { state = 0; last = ""; }
    $0 ~ /^'$2'\(/ { print last; state = 1; }
        { if (state == 1) print; }
    $0 ~ /^}/ { if (state) state = 2; }
        { last = $0; }
'
}

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

0 голосов
/ 19 февраля 2019

Простой способ достаточно надежного извлечения всего тела функции - это сначала выполнить код через средство форматирования:

indent -kr < mymain.c | sed -n 's/^int main(/,/^}/p'

cflow может дать вам график вызова функции.например:

cflow -d2 mymain.c
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...