From 3eea219548e84efdbc3148ce378fcba865f97a01 Mon Sep 17 00:00:00 2001 From: Ben Longbons Date: Fri, 6 Dec 2013 14:15:43 -0800 Subject: Add basic source formatting tools --- tools/apply-filter | 10 ++++++++++ tools/bs-align | 45 ++++++++++++++++++++++++++++++++++++++++++++ tools/maybe-mv | 8 ++++++++ tools/maybe-replace | 3 +++ tools/pp-indent | 54 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 120 insertions(+) create mode 100755 tools/apply-filter create mode 100755 tools/bs-align create mode 100755 tools/maybe-mv create mode 100755 tools/maybe-replace create mode 100755 tools/pp-indent (limited to 'tools') diff --git a/tools/apply-filter b/tools/apply-filter new file mode 100755 index 0000000..6d36be4 --- /dev/null +++ b/tools/apply-filter @@ -0,0 +1,10 @@ +#!/bin/bash -eu +# Apply a filter command to a set of files + +filter=$1; shift +for arg +do + echo apply-filter "$filter" "$arg" + bash -c "$filter" < "$arg" > "$arg.tmp" + maybe-mv "$arg.tmp" "$arg" +done diff --git a/tools/bs-align b/tools/bs-align new file mode 100755 index 0000000..6582298 --- /dev/null +++ b/tools/bs-align @@ -0,0 +1,45 @@ +#!/usr/bin/env python +# -*- encoding: utf-8 +## bs-align.py - Filter to align trailing line continuations +## +## Copyright ©2013 Ben Longbons +## +## This file is part of The Mana World (Athena server) +## +## This program is free software: you can redistribute it and/or modify +## it under the terms of the GNU General Public License as published by +## the Free Software Foundation, either version 3 of the License, or +## (at your option) any later version. +## +## This program is distributed in the hope that it will be useful, +## but WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +## GNU General Public License for more details. +## +## You should have received a copy of the GNU General Public License +## along with this program. If not, see . + +# Settings. +pad = 1 +align = 4 +min_col = 8 + +import sys + +lines = [] + +for line in sys.stdin: + if line.endswith('\\\n'): + lines.append(line[:-2].rstrip()) + continue + if lines: + # TODO: correctly handle tabs and multibyte characters + tlen = max(len(l) for l in lines) + pad + if tlen < min_col: + tlen = min_col + elif tlen % align: + tlen += align - tlen % align + for l in lines: + sys.stdout.writelines([l, ' ' * (tlen - len(l)), '\\\n']) + del lines[:] + sys.stdout.write(line) diff --git a/tools/maybe-mv b/tools/maybe-mv new file mode 100755 index 0000000..725b86b --- /dev/null +++ b/tools/maybe-mv @@ -0,0 +1,8 @@ +#!/bin/bash -eu +# Replace one file with another, but maybe don't update the timestamp +if cmp -s "$1" "$2" +then + rm "$1" +else + mv "$1" "$2" +fi diff --git a/tools/maybe-replace b/tools/maybe-replace new file mode 100755 index 0000000..97bd19c --- /dev/null +++ b/tools/maybe-replace @@ -0,0 +1,3 @@ +#!/bin/bash -eu +cat > "$1.tmp" +maybe-mv "$1.tmp" "$1" diff --git a/tools/pp-indent b/tools/pp-indent new file mode 100755 index 0000000..9be9a03 --- /dev/null +++ b/tools/pp-indent @@ -0,0 +1,54 @@ +#!/usr/bin/env python +# -*- encoding: utf-8 +## pp-indent - Filter to apply indentation to preprocessor statements +## +## Copyright ©2013 Ben Longbons +## +## This file is part of The Mana World (Athena server) +## +## This program is free software: you can redistribute it and/or modify +## it under the terms of the GNU General Public License as published by +## the Free Software Foundation, either version 3 of the License, or +## (at your option) any later version. +## +## This program is distributed in the hope that it will be useful, +## but WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +## GNU General Public License for more details. +## +## You should have received a copy of the GNU General Public License +## along with this program. If not, see . + +# Settings. + +pre_indent = '' +post_indent = ' ' +rules = { + 'if': (0, 1), + 'ifdef': (0, 1), + 'ifndef': (0, 1), + 'else': (-1, 1), + 'elif': (-1, 1), + 'endif': (-1, 0), + 'define_h': (-1, 1), +} + +import sys + +depth = 0 +for line in sys.stdin: + sline = line.lstrip() + if not sline.startswith('#'): + sys.stdout.write(line) + continue + line = sline[1:].lstrip() + if not line: + sys.stdout.write('\n') + continue + word = line.split(None, 1)[0] + if word == 'define' and line.endswith('_HPP\n'): + word = 'define_h' + pre, post = rules.get(word, (0, 0)) + depth += pre + sys.stdout.writelines([depth * pre_indent, '#', depth * post_indent, line]) + depth += post -- cgit v1.2.3-70-g09d2