summaryrefslogtreecommitdiff
path: root/numpy/f2py/lib/parser/sourceinfo.py
diff options
context:
space:
mode:
authorPearu Peterson <pearu.peterson@gmail.com>2006-10-01 11:49:23 +0000
committerPearu Peterson <pearu.peterson@gmail.com>2006-10-01 11:49:23 +0000
commitc3c53e6805beb164581f041a69c9f51c2740d344 (patch)
tree70d942460a7624996b6a7ee0dd5e25c014b9772f /numpy/f2py/lib/parser/sourceinfo.py
parent6c52e6fc05f89f13871b79074ea8891c11092d35 (diff)
downloadnumpy-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.py81
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()