LinuxForum.Fans
Тема

форматирование C++ кода

Автор: drBatty 1 сообщений 1583 просмотров
#109579
text
#!/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

ЗЫЖ немного неправильно... форумный движок пожрёт пробелы и табуляции. потому скрипт лучше скачать

Войдите или зарегистрируйтесь, чтобы ответить.