1a4e54154Smrg#!/usr/bin/env python3
2a4e54154Smrg
3a4e54154Smrgimport os
4a4e54154Smrgimport re
5a4e54154Smrgimport sys
6a4e54154Smrgimport argparse
7a4e54154Smrgfrom collections import OrderedDict
8a4e54154Smrg
9a4e54154Smrg# cat fontconfig/fontconfig.h | grep '^Fc[^ ]* *(' | sed -e 's/ *(.*$//'
10a4e54154Smrg
11a4e54154Smrgdef extract(fname):
12a4e54154Smrg    with open(fname, 'r', encoding='utf-8') as f:
13a4e54154Smrg        for l in f.readlines():
14a4e54154Smrg            l = l.rstrip()
15a4e54154Smrg            m = re.match(r'^(Fc[^ ]*)[\s\w]*\(.*', l)
16a4e54154Smrg
17a4e54154Smrg            if m and m.group(1) not in ['FcCacheDir', 'FcCacheSubdir']:
18a4e54154Smrg                yield m.group(1)
19a4e54154Smrg
20a4e54154Smrgif __name__=='__main__':
21a4e54154Smrg    parser = argparse.ArgumentParser()
22a4e54154Smrg    parser.add_argument('srcdir')
23a4e54154Smrg    parser.add_argument('head')
24a4e54154Smrg    parser.add_argument('tail')
25a4e54154Smrg    parser.add_argument('headers', nargs='+')
26a4e54154Smrg
27a4e54154Smrg    args = parser.parse_args()
28a4e54154Smrg
29a4e54154Smrg    definitions = {}
30a4e54154Smrg
31a4e54154Smrg    for fname in os.listdir(args.srcdir):
32a4e54154Smrg        define_name, ext = os.path.splitext(fname)
33a4e54154Smrg        if ext != '.c':
34a4e54154Smrg            continue
35a4e54154Smrg
36a4e54154Smrg        define_name = '__%s__' % os.path.basename(define_name)
37a4e54154Smrg
38a4e54154Smrg        for definition in extract(os.path.join(args.srcdir, fname)):
39a4e54154Smrg            definitions[definition] = define_name
40a4e54154Smrg
41a4e54154Smrg    declarations = OrderedDict()
42a4e54154Smrg
43a4e54154Smrg    for fname in args.headers:
44a4e54154Smrg        for declaration in extract(fname):
45a4e54154Smrg            try:
46a4e54154Smrg                define_name = definitions[declaration]
47a4e54154Smrg            except KeyError:
48a4e54154Smrg                print ('error: could not locate %s in src/*.c' % declaration)
49a4e54154Smrg                sys.exit(1)
50a4e54154Smrg
51a4e54154Smrg            declarations[declaration] = define_name
52a4e54154Smrg
53a4e54154Smrg    with open(args.head, 'w') as head:
54a4e54154Smrg        with open(args.tail, 'w') as tail:
55a4e54154Smrg            tail.write('#if HAVE_GNUC_ATTRIBUTE\n')
56a4e54154Smrg            last = None
57a4e54154Smrg            for name, define_name in declarations.items():
58a4e54154Smrg                alias = 'IA__%s' % name
59a4e54154Smrg                hattr = 'FC_ATTRIBUTE_VISIBILITY_HIDDEN'
60a4e54154Smrg                head.write('extern __typeof (%s) %s %s;\n' % (name, alias, hattr))
61a4e54154Smrg                head.write('#define %s %s\n' % (name, alias))
62a4e54154Smrg                if define_name != last:
63a4e54154Smrg                    if last is not None:
64a4e54154Smrg                        tail.write('#endif /* %s */\n' % last)
65a4e54154Smrg                    tail.write('#ifdef %s\n' % define_name)
66a4e54154Smrg                    last = define_name
67a4e54154Smrg                tail.write('# undef %s\n' % name)
68a4e54154Smrg                cattr = '__attribute((alias("%s"))) FC_ATTRIBUTE_VISIBILITY_EXPORT' % alias
69a4e54154Smrg                tail.write('extern __typeof (%s) %s %s;\n' % (name, name, cattr))
70a4e54154Smrg            tail.write('#endif /* %s */\n' % last)
71a4e54154Smrg            tail.write('#endif /* HAVE_GNUC_ATTRIBUTE */\n')
72