#!/usr/bin/env python from __future__ import print_function import re import sys categories = [] defines = [] excludes = [] bases = [] if __name__ == '__main__': out = sys.stdout filenames = sys.argv[1:] while filenames and filenames[0].startswith('-'): option = filenames.pop(0) if option == '-o': out = open(filenames.pop(0), 'w') elif option.startswith('-C'): categories += option[2:].split(',') elif option.startswith('-D'): defines += option[2:].split(',') elif option.startswith('-X'): excludes += option[2:].split(',') elif option.startswith('-B'): bases += option[2:].split(',') excludes = [re.compile(exclude) for exclude in excludes] exported = [] for filename in filenames: for line in open(filename).readlines(): name, _, _, meta, _ = re.split('\s+', line) if any(p.match(name) for p in excludes): continue meta = meta.split(':') assert meta[0] in ('EXIST', 'NOEXIST') assert meta[2] in ('FUNCTION', 'VARIABLE') if meta[0] != 'EXIST': continue if meta[2] != 'FUNCTION': continue def satisfy(expr, rules): def test(expr): if expr.startswith('!'): return not expr[1:] in rules return expr == '' or expr in rules return all(map(test, expr.split(','))) if not satisfy(meta[1], defines): continue if not satisfy(meta[3], categories): continue exported.append(name) for filename in bases: for line in open(filename).readlines(): line = line.strip() if line == 'EXPORTS': continue if line[0] == ';': continue exported.append(line) print('EXPORTS', file=out) for name in sorted(exported): print(' ', name, file=out)