123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869 |
- #!/usr/bin/python
- import os
- import os.path
- import re
- import sys
- def warn(msg):
- sys.stderr.write("WARNING: %s\n"%msg)
- # 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)
- DUPLICATE = object()
- 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"):
- if fname in includes:
- warn("Multiple headers named %s"%fname)
- includes[fname] = DUPLICATE
- continue
- 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 and mapping[basehdr] is not DUPLICATE:
- 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(["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)
|