summaryrefslogtreecommitdiff
path: root/tools/indent.py
diff options
context:
space:
mode:
authorQuentin Young <qlyoung@qlyoung.net>2018-02-20 12:37:41 -0500
committerQuentin Young <qlyoung@qlyoung.net>2018-02-20 12:37:41 -0500
commit7c557e5b3da8b8ba1db9542bc24bbf2a70bd1f1a (patch)
tree8757305b9d6c685ee446d5eeea59d00547f5c9c5 /tools/indent.py
parent4298f5e937a1fa689047697395f8b741fb9b3d15 (diff)
*: move random tools into tools/
Signed-off-by: Quentin Young <qlyoung@qlyoung.net>
Diffstat (limited to 'tools/indent.py')
-rw-r--r--tools/indent.py47
1 files changed, 47 insertions, 0 deletions
diff --git a/tools/indent.py b/tools/indent.py
new file mode 100644
index 0000000000..560c13c77d
--- /dev/null
+++ b/tools/indent.py
@@ -0,0 +1,47 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+# 2017 by David Lamparter, placed in public domain
+
+import sys, re, subprocess, os
+
+# find all DEFUNs
+defun_re = re.compile(
+ r'^((DEF(UN(_NOSH|_HIDDEN)?|PY)|ALIAS)\s*\(.*?)^(?=\s*\{)',
+ re.M | re.S)
+define_re = re.compile(
+ r'((^#\s*define[^\n]+[^\\]\n)+)',
+ re.M | re.S)
+# find clang-format control that we just inserted
+clean_re = re.compile(
+ r'^/\* \$FRR indent\$ \*/\s*\n\s*/\* clang-format (on|off) \*/\s*\n',
+ re.M)
+
+def wrap_file(fn):
+ with open(fn, 'r') as fd:
+ text = fd.read()
+
+ repl = r'/* $FRR indent$ */\n/* clang-format off */\n' + \
+ r'\1' + \
+ r'/* $FRR indent$ */\n/* clang-format on */\n'
+
+ # around each DEFUN, insert an indent-on/off comment
+ text = defun_re.sub(repl, text)
+ text = define_re.sub(repl, text)
+
+ ci = subprocess.Popen(['clang-format'], stdin = subprocess.PIPE, stdout = subprocess.PIPE)
+ stdout, ign = ci.communicate(text)
+ ci.wait()
+ if ci.returncode != 0:
+ raise IOError('clang-format returned %d' % (ci.returncode))
+
+ # remove the bits we inserted above
+ final = clean_re.sub('', stdout)
+
+ tmpname = fn + '.indent'
+ with open(tmpname, 'w') as ofd:
+ ofd.write(final)
+ os.rename(tmpname, fn)
+
+if __name__ == '__main__':
+ for fn in sys.argv[1:]:
+ wrap_file(fn)