summaryrefslogtreecommitdiffstats
path: root/tools/indent.py
diff options
context:
space:
mode:
Diffstat (limited to 'tools/indent.py')
-rwxr-xr-xtools/indent.py52
1 files changed, 52 insertions, 0 deletions
diff --git a/tools/indent.py b/tools/indent.py
new file mode 100755
index 0000000..61a0fd4
--- /dev/null
+++ b/tools/indent.py
@@ -0,0 +1,52 @@
+#!/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(|_ATTR|_CMD_(ELEMENT|FUNC_(DECL|TEXT))|_DEPRECATED|_NOSH|_HIDDEN|SH(|_ATTR|_DEPRECATED|_HIDDEN))?|PY|PY_ATTR|PY_HIDDEN)|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)