Browse Source

Script to replace include paths with full paths under src/

This will let us move around header files without having to fix up
all the include sites manually.
Nick Mathewson 5 years ago
parent
commit
178b738be0
1 changed files with 60 additions and 0 deletions
  1. 60 0
      scripts/maint/rectify_include_paths.py

+ 60 - 0
scripts/maint/rectify_include_paths.py

@@ -0,0 +1,60 @@
+#!/usr/bin/python3
+
+import os
+import os.path
+import re
+
+# Find all the include files, map them to their real names.
+
+def exclude(paths, dirnames):
+    for p in paths:
+        if p in dirnames:
+            dirnames.remove(p)
+
+def get_include_map():
+    includes = { }
+
+    for dirpath,dirnames,fnames in os.walk("src"):
+        exclude(["ext", "win32"], dirnames)
+
+        for fname in fnames:
+            if fname.endswith(".h"):
+                assert fname not in includes
+                include = os.path.join(dirpath, fname)
+                assert include.startswith("src/")
+                includes[fname] = include[4:]
+
+    return includes
+
+INCLUDE_PAT = re.compile(r'( *# *include +")([^"]+)(".*)')
+
+def get_base_header_name(hdr):
+    return os.path.split(hdr)[1]
+
+def fix_includes(inp, out, mapping):
+    for line in inp:
+        m = INCLUDE_PAT.match(line)
+        if m:
+            include,hdr,rest = m.groups()
+            basehdr = get_base_header_name(hdr)
+            if basehdr in mapping:
+                out.write('{}{}{}\n'.format(include,mapping[basehdr],rest))
+                continue
+
+        out.write(line)
+
+incs = get_include_map()
+
+for dirpath,dirnames,fnames in os.walk("src"):
+    exclude(["ext", "trunnel"], dirnames)
+
+    for fname in fnames:
+        if fname.endswith(".c") or fname.endswith(".h"):
+            fname = os.path.join(dirpath, fname)
+            tmpfile = fname+".tmp"
+            f_in = open(fname, 'r')
+            f_out = open(tmpfile, 'w')
+            fix_includes(f_in, f_out, incs)
+            f_in.close()
+            f_out.close()
+            os.rename(tmpfile, fname)