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.
This commit is contained in:
Nick Mathewson 2018-06-20 09:25:16 -04:00
parent d7301a456a
commit 178b738be0

View File

@ -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)