#!/bin/sed -rnf
# форматировсние C++ программы
# размер отступа == 4 пробела
# правила:
# 1) закрытый объект вида [^{}]+;$ не влияет на отступы
# 2) незакрытый объект вида [^{}]*[^{};]$ приводит к увеличению отступов на 1 шаг для следующей строки
# 2.1) исключение (2) - незакрытая функция не приводит к изменению отступов /[^{}]+(.*)/
# 3) закрывающая } уменьшает отступ. Действует для текущей линии.
# 4) открывающая { увеличивает отступ для сл. линии.
# 5) точка с запятой после } уменьшает отступ на 1 шаг. Действует сразу
# 6) /^(private|publuic|protected|case[^:]+|default):$/ не меняют отступы, но выводятся на один шаг левее.
s/^\s+//
s/\s+$//
H
g
# есть-ли кавычка?
:l0
/"/{
# да, есть. убираем закавыченную строчку
s/^([^"]*)"[^"]*"/\1/
b l0
}
# если комментарий?
\~//~{
# стирание комментария
s~//.*~~
# стираем пробел и табуляцию, а \n не трогаем.
s~[ ]+$~~
}
/^\s*$/ b l1
/^[^{}]*;$/ ! b l5
:l1
# пустая строка и закрытый объект
# обычная печать
s/\n.*//
x
s/\n//p
b
:l5
/^\s*(class|struct|union)\s+[^{}]+\{$/{
s/^( *)\n.*/ \1/
x
s/\n//p
b
}
/^ *\nelse$/ b l1
/^ *\nwhile\s*\([^{}]+\)$/ b l1
/^ *\nclass\s+\w+\s+:\s*public\s*\w+\s*\{[^{}]*\};$/ b l1
/^ *\n\w+\([^(){}]*\)\s*:(\s*\w+\([^(){}]*\),)*\s*\w+\([^(){}]*\)\s*\{[^{}]*\};$/ b l1
/^ *\nif\s*\(/ b l1
# исключения
/^ *\n(private|protected|public|case\s*[^:]+|default):$/{
s/\n.*//
x
s/^ //
s/\n//p
b
}
# вообще-то конструктор. но и многие функции потянет
/^ *\n\w+\([^)]*\)\s*(:(\s*\w+\([^{}]*\),)*\s*\w+\([^{}]*\))?(\s*\{[^}]*\})?$/ b l1
/^ *\n(virtual\s*)~\w+\(\)\s*\{[^}]*\}$/ b l1
# функции и методы
/^ *\n[^{}()]+\([^)]*\)(\s*\{[^{}]*\})?$/ b l1
# { ... }
/^ *\n\{[^{}]*\}$/ b l1
# template
/^ *\ntemplate\s*<[^>]+>$/ b l1
# {
/^ *\n\{$/{
s/\n.*/ /
x
s/\n//p
b
}
# };?
/^ *\n\};?$/{
/;$/{
s/^ //
x
s/^ //
x
}
s/^ //
s/\n.*//
x
s/^ //
s/\n//p
b
}
# : xxx(), yyy() {...}
/^ *\n:(\s*\w+\([^(){}]*\),)*\s*\w+\([^(){}]*\),?\s*\{[^{}]*\}$/{
s/\n.*//
x
s/\n/ /p
b
}
b l1
:error
=
G
s/.*/\x1b[31;1mERROR IN LINE '&'\x1b[0m/
p
q 77
ЗЫЖ немного неправильно... форумный движок пожрёт пробелы и табуляции. потому скрипт лучше скачать