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