diff options
author | Pearu Peterson <pearu.peterson@gmail.com> | 2006-10-01 11:49:23 +0000 |
---|---|---|
committer | Pearu Peterson <pearu.peterson@gmail.com> | 2006-10-01 11:49:23 +0000 |
commit | c3c53e6805beb164581f041a69c9f51c2740d344 (patch) | |
tree | 70d942460a7624996b6a7ee0dd5e25c014b9772f /numpy/f2py/lib/parser/sourceinfo.py | |
parent | 6c52e6fc05f89f13871b79074ea8891c11092d35 (diff) | |
download | numpy-c3c53e6805beb164581f041a69c9f51c2740d344.tar.gz |
F2PY G3: Moved Fortran parser related code to subpackage parser.
Diffstat (limited to 'numpy/f2py/lib/parser/sourceinfo.py')
-rw-r--r-- | numpy/f2py/lib/parser/sourceinfo.py | 81 |
1 files changed, 81 insertions, 0 deletions
diff --git a/numpy/f2py/lib/parser/sourceinfo.py b/numpy/f2py/lib/parser/sourceinfo.py new file mode 100644 index 000000000..2f5aab603 --- /dev/null +++ b/numpy/f2py/lib/parser/sourceinfo.py @@ -0,0 +1,81 @@ +""" +Provides get_source_info(<filename>) function to determine the format +(free|fixed|strict|pyf) of a Fortran file. + +----- +Permission to use, modify, and distribute this software is given under the +terms of the NumPy License. See http://scipy.org. + +NO WARRANTY IS EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK. +Author: Pearu Peterson <pearu@cens.ioc.ee> +Created: May 2006 +----- +""" + +__all__ = ['get_source_info'] + +import re +import os +import sys + +_has_f_extension = re.compile(r'.*[.](for|ftn|f77|f)\Z',re.I).match +_has_f_header = re.compile(r'-[*]-\s*fortran\s*-[*]-',re.I).search +_has_f90_header = re.compile(r'-[*]-\s*f90\s*-[*]-',re.I).search +_has_fix_header = re.compile(r'-[*]-\s*fix\s*-[*]-',re.I).search +_free_f90_start = re.compile(r'[^c*!]\s*[^\s\d\t]',re.I).match + +def get_source_info(filename): + """ + Determine if fortran file is + - in fix format and contains Fortran 77 code -> return False, True + - in fix format and contains Fortran 90 code -> return False, False + - in free format and contains Fortran 90 code -> return True, False + - in free format and contains signatures (.pyf) -> return True, True + """ + base,ext = os.path.splitext(filename) + if ext=='.pyf': + return True, True + isfree = False + isstrict = False + f = open(filename,'r') + firstline = f.readline() + f.close() + if _has_f_extension(filename) and \ + not (_has_f90_header(firstline) or _has_fix_header(firstline)): + isstrict = True + elif is_free_format(filename) and not _has_fix_header(firstline): + isfree = True + return isfree,isstrict + +def is_free_format(file): + """Check if file is in free format Fortran.""" + # f90 allows both fixed and free format, assuming fixed unless + # signs of free format are detected. + isfree = False + f = open(file,'r') + line = f.readline() + n = 10000 # the number of non-comment lines to scan for hints + if _has_f_header(line): + n = 0 + elif _has_f90_header(line): + n = 0 + isfree = True + contline = False + while n>0 and line: + line = line.rstrip() + if line and line[0]!='!': + n -= 1 + if line[0]!='\t' and _free_f90_start(line[:5]) or line[-1:]=='&': + isfree = True + break + line = f.readline() + f.close() + return isfree + +def simple_main(): + for filename in sys.argv[1:]: + isfree, isstrict = get_source_info(filename) + print '%s: isfree=%s, isstrict=%s' % (filename, isfree, isstrict) + +if __name__ == '__main__': + simple_main() |