File indexing completed on 2024-12-17 18:40:00 UTC
view on githubraw file Latest commit 8fbfd1f3 on 2018-02-26 18:39:21 UTC
8fbfd1f382 Oliv*0001 import sys
0002 import os
0003 import re
0004 from collections import OrderedDict
0005
0006 __all__ = ['readparameters']
0007
0008 def readparameters(*files, **kwargs):
0009 '''
0010 extracts fortran parameters from header files with CPP directives
0011
0012 The arguments are file names or open files.
0013
0014 Keyword arguments:
0015
0016 dir :: directory for include files
0017 conditions :: return a dictionary with CPP conditions for each parameter
0018 sloppy :: ignore missing include files
0019
0020 Returns a dictionary of parameter names and values and, if <conditions> is
0021 true, a dictionary of CPP conditions.
0022 '''
0023 sloppy = kwargs.pop('sloppy', False)
0024 returnconditions = kwargs.pop('conditions', False)
0025
0026 dir = kwargs.pop('dir', '.')
0027 assert len(kwargs) == 0
0028
0029 filestack = []
0030 for f in files:
0031 if not hasattr(f,'readlines'):
0032 f = open(f)
0033 filestack[:0] = [f]
0034
0035 conds = {}
0036
0037 code = ''
0038 cond = []
0039 varlist = []
0040 while len(filestack):
0041 file = filestack[-1]
0042 for line in file:
0043 m = re.match(r'^ *# *include *"([^"]*)"', line)
0044 if m:
0045 fname = os.path.join(dir, m.group(1))
0046 try:
0047 file = open(fname)
0048 except IOError:
0049 if not sloppy:
0050 raise
0051 else:
0052 filestack.append(file)
0053 continue
0054
0055 m = re.match(r'^ *# *ifn?def *(\S*)', line)
0056 if m:
0057 cond.append(line)
0058 continue
0059
0060 m = re.match(r'^ *# *endif', line)
0061 if m:
0062 cond.pop()
0063 continue
0064
0065 m = re.match(r'^ *parameter *\( *(.*) *\)', line, re.IGNORECASE)
0066 if m:
0067 codeline = m.group(1)
0068 codeline = re.sub(r',', ';', codeline)
0069 codeline = re.sub(r'\bin\b', 'IN', codeline)
0070 code += codeline + '\n'
0071 try:
0072 name,val = m.group(1).split('=')
0073 except ValueError:
0074 pass
0075 else:
0076 conds[name.strip().lower()] = list(cond)
0077 varlist.append(name.strip())
0078 filestack.remove(file)
0079
0080
0081 d = dict()
0082 exec(code, d)
0083 dnew = OrderedDict.fromkeys(varlist)
0084 for k,v in d.items():
0085 if k == 'IN':
0086 k = 'in'
0087 dnew[k] = v
0088 d = dnew
0089
0090 try:
0091 del d['__builtins__']
0092 except:
0093 pass
0094
0095 if returnconditions:
0096 return d, conds
0097 else:
0098 return d
0099
0100
0101 if __name__ == '__main__':
0102 d = readparameters(*sys.argv[1:])
0103 wid = max(len(k) for k in d)
0104
0105
0106