Back to home page

darwin3

 
 

    


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 #    d = OrderedDict()
                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 #    for k,v in d.items():
                0105 #        print '{0:{1}s} = {2}'.format(k, wid, v)
                0106