""" Provides get_source_info() 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 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()