#!/usr/bin/env python from __future__ import print_function import re import sys categories = [] defines = [] excludes = [] 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(',') excludes = map(re.compile, excludes) exported = [] for filename in filenames: for line in open(filename).readlines(): name, _, meta, _ = re.split('\s+', line) if any(map(lambda p: p.match(name), 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) print('EXPORTS', file=out) for name in sorted(exported): print(' ', name, file=out)