Перемещение левой скобки в коде C на следующую строку? - PullRequest
1 голос
/ 31 мая 2019

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

if (x == NULL) {
    ...
}

необходимо изменить на

if (x == NULL)
{
    ...
}

Я надеялся использовать команду «отступ», но она слишком агрессивна.Он хочет изменить весь файл со всеми параметрами.

Полагаю, я могу сделать это в Perl или даже в Sed, но я не знаю достаточно хорошо, чтобы понять это.

Ответы [ 2 ]

3 голосов
/ 31 мая 2019

Что с этим не так?

$ cat tst.c
#include "stdio.h"

int
main ()
{
    void *x;

    if (x == NULL) {
        printf("darn\n");
    }

    return 0;
}

.

$ indent -i 4 -bli 0 -npcs -st tst.c
#include "stdio.h"

int
main()
{
    void *x;

    if (x == NULL)
    {
        printf("darn\n");
    }

    return 0;
}

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


В комментарии @ melpomene упомянул , что indent не всегда правильно обрабатывает запутанный код, и привел пример prin\<newline>tf("..."). Подумайте о других случаях, но вы можете справиться с этим, предварительно обработав с помощью sed и gcc:

$ cat tst.c
#include "stdio.h"

int
main ()
{
    void *x;

    // here is a comment
    if (x == NULL) {
        prin\
tf("darn\n");
    }

    return 0;
}

.

$ indent -i 4 -bli 0 -npcs -st tst.c
#include "stdio.h"

int
main()
{
    void *x;

    // here is a comment
    if (x == NULL)
    {
        prin tf("darn\n");
    }

    return 0;
}

.

$ sed 's/a/aA/g;s/__/aB/g;s/#/aC/g' tst.c |
    gcc -CC -P -traditional-cpp -E - |
    sed 's/aC/#/g;s/aB/__/g;s/aA/a/g'
#include "stdio.h"

int
main ()
{
    void *x;

    // here is a comment
    if (x == NULL) {
        printf("darn\n");
    }

    return 0;
}

.

$ sed 's/a/aA/g;s/__/aB/g;s/#/aC/g' tst.c |
    gcc -CC -P -traditional-cpp -E - |
    sed 's/aC/#/g;s/aB/__/g;s/aA/a/g' |
    indent -i 4 -bli 0 -npcs -st
#include "stdio.h"

int
main()
{
    void *x;

    // here is a comment
    if (x == NULL)
    {
        printf("darn\n");
    }

    return 0;
}
0 голосов
/ 31 мая 2019

Похоже, сегодня мой счастливый день, как я выяснил:

sed 's/^\([ ]*\)\(if (.* == NULL)\) {$/\1\2\n\1{/g' <filename>

Может кто-нибудь подтвердить, что это правильно?

...