Один лайнер для typedef c структуры - PullRequest
0 голосов
/ 04 января 2019

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

Например, я хочу преобразовать это:

struct Foo_t
{
   uint8_t one
   uint8_t two;
   uint8_t three;
};

К этому:

typedef struct
{
   uint8_t one
   uint8_t two;
   uint8_t three;
} Foo_t;

На высоком уровне я хочу использовать утилиту, такую ​​как sed, awk или perl, для:

  1. Найти все строки, начинающиеся с "struct"
  2. Запомните тег struct, который следует в приведенном выше примере Foo_t
  3. Найдите первую фигурную скобку "{"
  4. Пропускать n новых строк до первого появления закрывающей скобки "}"
  5. Вставить тег структуры (Foo_t) или что-то еще называется
  6. Введите точку с запятой, чтобы завершить определение структуры

К сожалению, самое дальнее, что у меня есть, это:

find . -regextype egrep -path ./dont_touch -prune -o -name "*.h" -print0 | xargs -0 sed -i 's/struct* /typedef struct /g;'

Этот подход явно не работает, но это, по крайней мере, отправная точка для меня.

Любая помощь будет принята с благодарностью.

Спасибо!

Обновление:

Примером данных испытаний будет:

test.h

struct Foo_t
{
   uint8_t one;
   uint8_t two;
   uint8_t three;
   uint8_t four;
};

struct Bar_t
{
   float_t one;
   float_t two;
};

struct Baz_t {
   float_t one;
   float_t two;
};

1 Ответ

0 голосов
/ 04 января 2019

Предполагая, что текст в определении вашей структуры не содержит ни {, ни }, следующий Perl oneliner преобразует все объявления struct в typedef объявления:

perl -0777 -pi -e 's!\bstruct\b\s+(\w+)\s*(\{.*?\})!typedef struct\n$2 $1!sg' 

-0777 - сохранить файл целиком в $_

-pi - редактировать файл на месте

-e - используя этот код Perl

s!\bstruct\b\s+(\w+)\s*(\{.*?\})!typedef struct\n$2 $1!sg

Замените все struct, за которыми следует идентификатор C, а затем { ... } на typedef struct, затем фигурные скобки и прочее, а затем идентификатор. Подробнее см. regex101 .

Смотри также

perlre - для объяснения частей регулярного выражения

perlrun - для ключей командной строки

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