diff options
Diffstat (limited to 'numpy/f2py/lib/sourceinfo.py')
-rw-r--r-- | numpy/f2py/lib/sourceinfo.py | 60 |
1 files changed, 60 insertions, 0 deletions
diff --git a/numpy/f2py/lib/sourceinfo.py b/numpy/f2py/lib/sourceinfo.py new file mode 100644 index 000000000..635e22f7d --- /dev/null +++ b/numpy/f2py/lib/sourceinfo.py @@ -0,0 +1,60 @@ +""" +Author: Pearu Peterson <pearu@cens.ioc.ee> +Created: May 2006 +""" + +__all__ = ['get_source_info'] +import re +import os + +_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 -> False, True + - in fix format and contains Fortran 90 code -> False, False + - in free format and contains Fortran 90 code -> True, False + - in free format and contains signatures (.pyf) -> 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 + while n>0 and line: + if line[0]!='!' and line.strip(): + n -= 1 + if (line[0]!='\t' and _free_f90_start(line[:5])) or line[-2:-1]=='&': + isfree = True + break + line = f.readline() + f.close() + return isfree |