summaryrefslogtreecommitdiff
path: root/numpy/f2py/lib/sourceinfo.py
diff options
context:
space:
mode:
Diffstat (limited to 'numpy/f2py/lib/sourceinfo.py')
-rw-r--r--numpy/f2py/lib/sourceinfo.py60
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