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