mirror of
https://gitlab.com/scemama/irpf90.git
synced 2024-12-21 11:53:32 +01:00
Initial version.
Version:1.1.0
This commit is contained in:
commit
62f3085eff
89
src/command_line.py
Normal file
89
src/command_line.py
Normal file
@ -0,0 +1,89 @@
|
||||
#!/usr/bin/python
|
||||
|
||||
import getopt, sys
|
||||
from IRPPython import irp
|
||||
from version import version
|
||||
|
||||
description = "IRPF90 Fortran preprocessor."
|
||||
options = {}
|
||||
options['d'] = [ 'debug' , 'Activate debug', 0 ]
|
||||
options['v'] = [ 'version' , 'Print version of irpf90', 0 ]
|
||||
options['a'] = [ 'assert' , 'Activate assertions', 0 ]
|
||||
options['h'] = [ 'help' , 'Print this help', 0 ]
|
||||
options['o'] = [ 'openmp' , 'Activate openMP', 0 ]
|
||||
options['c'] = [ 'check_cycles' , 'Check cycles in dependencies', 0 ]
|
||||
options['i'] = [ 'init' , 'Initialize current directory', 0 ]
|
||||
|
||||
class CommandLine(object):
|
||||
|
||||
def __init__(self):
|
||||
pass
|
||||
|
||||
def executable_name(self):
|
||||
return sys.argv[0]
|
||||
executable_name = irp(executable_name,str)
|
||||
|
||||
def usage(self):
|
||||
t = """
|
||||
$EXE - $DESCR
|
||||
|
||||
Usage:
|
||||
$EXE [OPTION]
|
||||
|
||||
Options:
|
||||
"""
|
||||
t = t.replace("$EXE",self.executable_name)
|
||||
t = t.replace("$DESCR",description)
|
||||
print t
|
||||
sorted = options.keys()
|
||||
sorted.sort()
|
||||
for o in sorted:
|
||||
print " -%s , --%15s : %s"%(o,options[o][0].ljust(15),options[o][1])
|
||||
if options[o][2] == 1:
|
||||
print " Requires an argument"
|
||||
print ""
|
||||
print "Version : ", version
|
||||
print ""
|
||||
|
||||
def opts(self):
|
||||
optlist = ["",[]]
|
||||
for o in options.keys():
|
||||
b = [o]+options[o]
|
||||
if b[3] == 1:
|
||||
b[0] = b[0]+":"
|
||||
b[1] = b[1]+"="
|
||||
optlist[0] += b[0]
|
||||
optlist[1] += [b[1]]
|
||||
|
||||
try:
|
||||
opts, args = getopt.getopt(sys.argv[1:], optlist[0], optlist[1])
|
||||
except getopt.GetoptError, err:
|
||||
# print help information and exit:
|
||||
self.usage()
|
||||
print str(err) # will print something like "option -a not recognized"
|
||||
sys.exit(2)
|
||||
|
||||
return opts
|
||||
opts = irp(opts,list,tuple,str)
|
||||
|
||||
t = """
|
||||
def do_$LONG(self):
|
||||
result = False
|
||||
for o,a in self.opts:
|
||||
if o in ("-$SHORT", "--$LONG"):
|
||||
result = True
|
||||
break
|
||||
return result
|
||||
do_$LONG = irp(do_$LONG,bool)
|
||||
"""
|
||||
for short in options.keys():
|
||||
long = options[short][0]
|
||||
exec t.replace("$LONG",long).replace("$SHORT",short)
|
||||
|
||||
def do_run(self):
|
||||
result = not (self.do_version or self.do_init)
|
||||
return result
|
||||
do_run = irp(do_run,bool)
|
||||
|
||||
|
||||
command_line = CommandLine()
|
35
src/error.py
Normal file
35
src/error.py
Normal file
@ -0,0 +1,35 @@
|
||||
#!/usr/bin/python
|
||||
|
||||
import sys
|
||||
from irpf90_t import *
|
||||
|
||||
######################################################################
|
||||
def fail(line,message):
|
||||
assert isinstance(line,Line)
|
||||
print """
|
||||
Error:
|
||||
-----
|
||||
"""
|
||||
if line.i > 0:
|
||||
print "file %s, line %d:\n%s"%(line.filename,line.i,line.text)
|
||||
print message, '\n'
|
||||
sys.exit(1)
|
||||
|
||||
|
||||
######################################################################
|
||||
def warn(line,message):
|
||||
assert isinstance(line,Line)
|
||||
print """
|
||||
Warning:
|
||||
-------
|
||||
"""
|
||||
if line.i > 0:
|
||||
print "file %s, line %d:\n%s"%(line.filename,line.i,line.text)
|
||||
print message, '\n'
|
||||
|
||||
|
||||
######################################################################
|
||||
if __name__ == '__main__':
|
||||
line = Empty_line(3,"empty", "testfile")
|
||||
fail(line, "Message")
|
||||
|
45
src/init.py
Normal file
45
src/init.py
Normal file
@ -0,0 +1,45 @@
|
||||
#!/usr/bin/python
|
||||
|
||||
import os
|
||||
|
||||
import util
|
||||
import makefile
|
||||
import irpf90_t
|
||||
|
||||
initialized = False
|
||||
|
||||
|
||||
def init():
|
||||
|
||||
global initialized
|
||||
if initialized:
|
||||
return
|
||||
|
||||
# Create directories
|
||||
for dir in [ irpf90_t.irpdir, irpf90_t.mandir ]:
|
||||
try:
|
||||
wd = os.getcwd()
|
||||
os.chdir(dir)
|
||||
os.chdir(wd)
|
||||
except OSError:
|
||||
os.mkdir(dir)
|
||||
|
||||
# Create makefile
|
||||
makefile.create()
|
||||
|
||||
# Copy current files in the irpdir
|
||||
for filename in os.listdir(os.getcwd()):
|
||||
if not filename[0].startswith(".") and not os.path.isdir(filename):
|
||||
file = open(filename,"r")
|
||||
buffer = file.readlines()
|
||||
file.close()
|
||||
if not util.same_file(irpf90_t.irpdir+filename,buffer):
|
||||
file = open(filename,"r")
|
||||
buffer = file.read()
|
||||
file.close()
|
||||
file = open(irpf90_t.irpdir+filename,"w")
|
||||
file.write(buffer)
|
||||
file.close()
|
||||
|
||||
initialized = True
|
||||
|
111
src/irp_stack.py
Normal file
111
src/irp_stack.py
Normal file
@ -0,0 +1,111 @@
|
||||
#!/usr/bin/python
|
||||
|
||||
import util
|
||||
from command_line import command_line
|
||||
|
||||
do_assert = command_line.do_assert
|
||||
do_debug = command_line.do_debug
|
||||
do_openmp = command_line.do_openmp
|
||||
|
||||
import irpf90_t
|
||||
|
||||
FILENAME = irpf90_t.irpdir+"irp_stack.irp.F90"
|
||||
|
||||
def create():
|
||||
|
||||
txt = """
|
||||
module irp_stack_mod
|
||||
integer, parameter :: STACKMAX=1000
|
||||
character*(128),allocatable :: irp_stack(:,:)
|
||||
double precision,allocatable :: irp_cpu(:,:)
|
||||
integer,allocatable :: stack_index(:)
|
||||
logical :: alloc = .False.
|
||||
character*(128) :: white = ''
|
||||
end module
|
||||
|
||||
subroutine irp_enter(irp_where)
|
||||
use irp_stack_mod
|
||||
integer :: ithread
|
||||
integer :: nthread
|
||||
character*(*) :: irp_where
|
||||
ithread = 0
|
||||
nthread = 1
|
||||
$1
|
||||
$2
|
||||
end subroutine
|
||||
|
||||
subroutine irp_leave (irp_where)
|
||||
use irp_stack_mod
|
||||
character*(*) :: irp_where
|
||||
integer :: ithread
|
||||
double precision :: cpu
|
||||
ithread = 0
|
||||
$3
|
||||
$4
|
||||
end subroutine
|
||||
"""
|
||||
|
||||
# $1
|
||||
if do_assert or do_debug:
|
||||
txt = txt.replace("$1","""
|
||||
!$OMP CRITICAL
|
||||
if (.not.alloc) then
|
||||
allocate(irp_stack(STACKMAX,nthread))
|
||||
allocate(irp_cpu(STACKMAX,nthread))
|
||||
allocate(stack_index(nthread))
|
||||
alloc = .True.
|
||||
endif
|
||||
!$OMP END CRITICAL
|
||||
stack_index(ithread+1) = stack_index(ithread+1)+1
|
||||
irp_stack(stack_index(ithread+1),ithread+1) = irp_where""")
|
||||
else:
|
||||
txt = txt.replace("$1","")
|
||||
|
||||
# $2
|
||||
if do_debug:
|
||||
txt = txt.replace("$2","""
|
||||
print *, ithread, ':', white(1:stack_index(ithread+1))//'-> ', trim(irp_where)
|
||||
call cpu_time(irp_cpu(stack_index(ithread+1),ithread+1))""")
|
||||
else:
|
||||
txt = txt.replace("$2","")
|
||||
|
||||
# $3
|
||||
if do_debug:
|
||||
txt = txt.replace("$3","""
|
||||
call cpu_time(cpu)
|
||||
print *, ithread, ':', white(1:stack_index(ithread+1))//'<- ', &
|
||||
trim(irp_stack(stack_index(ithread+1),ithread+1)), &
|
||||
cpu-irp_cpu(stack_index(ithread+1),ithread+1)""")
|
||||
else:
|
||||
txt = txt.replace("$3","")
|
||||
|
||||
# $4
|
||||
if do_debug or do_assert:
|
||||
txt = txt.replace("$4","""
|
||||
stack_index(ithread+1) = stack_index(ithread+1)-1""")
|
||||
else:
|
||||
txt = txt.replace("$4","")
|
||||
|
||||
if do_debug or do_assert:
|
||||
txt += """
|
||||
subroutine irp_trace
|
||||
use irp_stack_mod
|
||||
integer :: ithread
|
||||
integer :: i
|
||||
ithread = 0
|
||||
if (.not.alloc) return
|
||||
print *, 'Stack trace: ', ithread
|
||||
print *, '-------------------------'
|
||||
do i=1,stack_index(ithread+1)
|
||||
print *, trim(irp_stack(i,ithread+1))
|
||||
enddo
|
||||
print *, '-------------------------'
|
||||
end subroutine
|
||||
"""
|
||||
|
||||
if not util.same_file(FILENAME, txt):
|
||||
file = open(FILENAME,'w')
|
||||
file.write(txt)
|
||||
file.close()
|
||||
|
||||
|
21
src/irpf90.py
Normal file
21
src/irpf90.py
Normal file
@ -0,0 +1,21 @@
|
||||
#!/usr/bin/python
|
||||
|
||||
def main():
|
||||
from command_line import command_line
|
||||
|
||||
if command_line.do_version:
|
||||
from version import version
|
||||
print version
|
||||
return
|
||||
|
||||
from init import init
|
||||
if command_line.do_init:
|
||||
init()
|
||||
if not command_line.do_run:
|
||||
return
|
||||
|
||||
init()
|
||||
import irp_stack
|
||||
irp_stack.create()
|
||||
|
||||
main()
|
264
src/irpf90_t.py
Normal file
264
src/irpf90_t.py
Normal file
@ -0,0 +1,264 @@
|
||||
#!/usr/bin/python
|
||||
|
||||
irpdir = "IRPF90_temp/"
|
||||
mandir = "IRPF90_man/"
|
||||
|
||||
|
||||
class Line(object):
|
||||
def __init__(self,i,text,filename):
|
||||
self.i = i
|
||||
self.text = text
|
||||
self.filename = filename
|
||||
|
||||
class Empty_line(Line):
|
||||
def __init__(self,i,text,filename):
|
||||
Line.__init__(self,i,text,filename)
|
||||
def __repr__(self):
|
||||
return "%20s:%5d : %s"%("Empty_line",self.i,self.text)
|
||||
|
||||
class Simple_line(Line):
|
||||
def __init__(self,i,text,filename):
|
||||
Line.__init__(self,i,text,filename)
|
||||
def __repr__(self):
|
||||
return "%20s:%5d : %s"%("Simple_line",self.i,self.text)
|
||||
|
||||
class Declaration(Line):
|
||||
def __init__(self,i,text,filename):
|
||||
Line.__init__(self,i,text,filename)
|
||||
def __repr__(self):
|
||||
return "%20s:%5d : %s"%("Declaration",self.i,self.text)
|
||||
|
||||
class Continue(Line):
|
||||
def __init__(self,i,text,filename):
|
||||
Line.__init__(self,i,text,filename)
|
||||
def __repr__(self):
|
||||
return "%20s:%5d : %s"%("Continue",self.i,self.text)
|
||||
|
||||
class Begin_provider(Line):
|
||||
def __init__(self,i,text,filename):
|
||||
Line.__init__(self,i,text,filename)
|
||||
def __repr__(self):
|
||||
return "%20s:%5d : %s"%("Begin_provider",self.i,self.text)
|
||||
|
||||
class Cont_provider(Line):
|
||||
def __init__(self,i,text,filename):
|
||||
Line.__init__(self,i,text,filename)
|
||||
def __repr__(self):
|
||||
return "%20s:%5d : %s"%("Cont_provider",self.i,self.text)
|
||||
|
||||
class End_provider(Line):
|
||||
def __init__(self,i,text,filename):
|
||||
Line.__init__(self,i,text,filename)
|
||||
def __repr__(self):
|
||||
return "%20s:%5d : %s"%("End_provider",self.i,self.text)
|
||||
|
||||
class Begin_doc(Line):
|
||||
def __init__(self,i,text,filename):
|
||||
Line.__init__(self,i,text,filename)
|
||||
def __repr__(self):
|
||||
return "%20s:%5d : %s"%("Begin_doc",self.i,self.text)
|
||||
|
||||
class Doc(Line):
|
||||
def __init__(self,i,text,filename):
|
||||
Line.__init__(self,i,text,filename)
|
||||
def __repr__(self):
|
||||
return "%20s:%5d : %s"%("Doc",self.i,self.text)
|
||||
|
||||
class End_doc(Line):
|
||||
def __init__(self,i,text,filename):
|
||||
Line.__init__(self,i,text,filename)
|
||||
def __repr__(self):
|
||||
return "%20s:%5d : %s"%("End_doc",self.i,self.text)
|
||||
|
||||
class Begin_shell(Line):
|
||||
def __init__(self,i,text,filename):
|
||||
Line.__init__(self,i,text,filename)
|
||||
def __repr__(self):
|
||||
return "%20s:%5d : %s"%("Begin_shell",self.i,self.text)
|
||||
|
||||
class End_shell(Line):
|
||||
def __init__(self,i,text,filename):
|
||||
Line.__init__(self,i,text,filename)
|
||||
def __repr__(self):
|
||||
return "%20s:%5d : %s"%("End_shell",self.i,self.text)
|
||||
|
||||
class Assert(Line):
|
||||
def __init__(self,i,text,filename):
|
||||
Line.__init__(self,i,text,filename)
|
||||
def __repr__(self):
|
||||
return "%20s:%5d : %s"%("Assert",self.i,self.text)
|
||||
|
||||
class Touch(Line):
|
||||
def __init__(self,i,text,filename):
|
||||
Line.__init__(self,i,text,filename)
|
||||
def __repr__(self):
|
||||
return "%20s:%5d : %s"%("Touch",self.i,self.text)
|
||||
|
||||
class Irp_read(Line):
|
||||
def __init__(self,i,text,filename):
|
||||
Line.__init__(self,i,text,filename)
|
||||
def __repr__(self):
|
||||
return "%20s:%5d : %s"%("Irp_read",self.i,self.text)
|
||||
|
||||
class Irp_write(Line):
|
||||
def __init__(self,i,text,filename):
|
||||
Line.__init__(self,i,text,filename)
|
||||
def __repr__(self):
|
||||
return "%20s:%5d : %s"%("Irp_write",self.i,self.text)
|
||||
|
||||
class Irp_If(Line):
|
||||
def __init__(self,i,text,filename):
|
||||
Line.__init__(self,i,text,filename)
|
||||
def __repr__(self):
|
||||
return "%20s:%5d : %s"%("Irp_If",self.i,self.text)
|
||||
|
||||
class Irp_Else(Line):
|
||||
def __init__(self,i,text,filename):
|
||||
Line.__init__(self,i,text,filename)
|
||||
def __repr__(self):
|
||||
return "%20s:%5d : %s"%("Irp_Else",self.i,self.text)
|
||||
|
||||
class Irp_Endif(Line):
|
||||
def __init__(self,i,text,filename):
|
||||
Line.__init__(self,i,text,filename)
|
||||
def __repr__(self):
|
||||
return "%20s:%5d : %s"%("Irp_Endif",self.i,self.text)
|
||||
|
||||
class Openmp(Line):
|
||||
def __init__(self,i,text,filename):
|
||||
Line.__init__(self,i,text,filename)
|
||||
def __repr__(self):
|
||||
return "%20s:%5d : %s"%("Openmp",self.i,self.text)
|
||||
|
||||
class Use(Line):
|
||||
def __init__(self,i,text,filename):
|
||||
Line.__init__(self,i,text,filename)
|
||||
def __repr__(self):
|
||||
return "%20s:%5d : %s"%("Use",self.i,self.text)
|
||||
|
||||
class Do(Line):
|
||||
def __init__(self,i,text,filename):
|
||||
Line.__init__(self,i,text,filename)
|
||||
def __repr__(self):
|
||||
return "%20s:%5d : %s"%("Do",self.i,self.text)
|
||||
|
||||
class Enddo (Line):
|
||||
def __init__(self,i,text,filename):
|
||||
Line.__init__(self,i,text,filename)
|
||||
def __repr__(self):
|
||||
return "%20s:%5d : %s"%("Enddo",self.i,self.text)
|
||||
|
||||
class If(Line):
|
||||
def __init__(self,i,text,filename):
|
||||
Line.__init__(self,i,text,filename)
|
||||
def __repr__(self):
|
||||
return "%20s:%5d : %s"%("If",self.i,self.text)
|
||||
|
||||
class Elseif(Line):
|
||||
def __init__(self,i,text,filename):
|
||||
Line.__init__(self,i,text,filename)
|
||||
def __repr__(self):
|
||||
return "%20s:%5d : %s"%("Elseif",self.i,self.text)
|
||||
|
||||
class Else(Line):
|
||||
def __init__(self,i,text,filename):
|
||||
Line.__init__(self,i,text,filename)
|
||||
def __repr__(self):
|
||||
return "%20s:%5d : %s"%("Else",self.i,self.text)
|
||||
|
||||
class Endif(Line):
|
||||
def __init__(self,i,text,filename):
|
||||
Line.__init__(self,i,text,filename)
|
||||
def __repr__(self):
|
||||
return "%20s:%5d : %s"%("Endif",self.i,self.text)
|
||||
|
||||
class Select(Line):
|
||||
def __init__(self,i,text,filename):
|
||||
Line.__init__(self,i,text,filename)
|
||||
def __repr__(self):
|
||||
return "%20s:%5d : %s"%("Select",self.i,self.text)
|
||||
|
||||
class Case(Line):
|
||||
def __init__(self,i,text,filename):
|
||||
Line.__init__(self,i,text,filename)
|
||||
def __repr__(self):
|
||||
return "%20s:%5d : %s"%("Case",self.i,self.text)
|
||||
|
||||
class End_select(Line):
|
||||
def __init__(self,i,text,filename):
|
||||
Line.__init__(self,i,text,filename)
|
||||
def __repr__(self):
|
||||
return "%20s:%5d : %s"%("End_select",self.i,self.text)
|
||||
|
||||
class Program(Line):
|
||||
def __init__(self,i,text,filename):
|
||||
Line.__init__(self,i,text,filename)
|
||||
def __repr__(self):
|
||||
return "%20s:%5d : %s"%("Program",self.i,self.text)
|
||||
|
||||
class Subroutine(Line):
|
||||
def __init__(self,i,text,filename):
|
||||
Line.__init__(self,i,text,filename)
|
||||
def __repr__(self):
|
||||
return "%20s:%5d : %s"%("Subroutine",self.i,self.text)
|
||||
|
||||
class Function(Line):
|
||||
def __init__(self,i,text,filename):
|
||||
Line.__init__(self,i,text,filename)
|
||||
def __repr__(self):
|
||||
return "%20s:%5d : %s"%("Function",self.i,self.text)
|
||||
|
||||
class Call(Line):
|
||||
def __init__(self,i,text,filename):
|
||||
Line.__init__(self,i,text,filename)
|
||||
def __repr__(self):
|
||||
return "%20s:%5d : %s"%("Call",self.i,self.text)
|
||||
|
||||
class Provide(Line):
|
||||
def __init__(self,i,text,filename):
|
||||
Line.__init__(self,i,text,filename)
|
||||
def __repr__(self):
|
||||
return "%20s:%5d : %s"%("Provide",self.i,self.text)
|
||||
|
||||
class Return (Line):
|
||||
def __init__(self,i,text,filename):
|
||||
Line.__init__(self,i,text,filename)
|
||||
def __repr__(self):
|
||||
return "%20s:%5d : %s"%("Return",self.i,self.text)
|
||||
|
||||
class Include(Line):
|
||||
def __init__(self,i,text,filename):
|
||||
Line.__init__(self,i,text,filename)
|
||||
def __repr__(self):
|
||||
return "%20s:%5d : %s"%("Include",self.i,self.text)
|
||||
|
||||
class Implicit (Line):
|
||||
def __init__(self,i,text,filename):
|
||||
Line.__init__(self,i,text,filename)
|
||||
def __repr__(self):
|
||||
return "%20s:%5d : %s"%("Implicit",self.i,self.text)
|
||||
|
||||
class Free(Line):
|
||||
def __init__(self,i,text,filename):
|
||||
Line.__init__(self,i,text,filename)
|
||||
def __repr__(self):
|
||||
return "%20s:%5d : %s"%("Free",self.i,self.text)
|
||||
|
||||
class End(Line):
|
||||
def __init__(self,i,text,filename):
|
||||
Line.__init__(self,i,text,filename)
|
||||
def __repr__(self):
|
||||
return "%20s:%5d : %s"%("End",self.i,self.text)
|
||||
|
||||
class Provide_all (Line):
|
||||
def __init__(self,i,text,filename):
|
||||
Line.__init__(self,i,text,filename)
|
||||
def __repr__(self):
|
||||
return "%20s:%5d : %s"%("Provide_all",self.i,self.text)
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
34
src/makefile.py
Normal file
34
src/makefile.py
Normal file
@ -0,0 +1,34 @@
|
||||
#!/usr/bin/python
|
||||
|
||||
import irpf90_t
|
||||
irpdir = irpf90_t.irpdir
|
||||
mandir = irpf90_t.mandir
|
||||
|
||||
FILENAME = "Makefile"
|
||||
|
||||
|
||||
def create():
|
||||
has_makefile = True
|
||||
try:
|
||||
file = open(FILENAME,"r")
|
||||
except OSError:
|
||||
has_makefile = False
|
||||
if has_makefile:
|
||||
return
|
||||
file = open(FILENAME,"w")
|
||||
t = """IRPF90 = irpf90 #-a -d
|
||||
FC = gfortran
|
||||
FCFLAGS= -ffree-line-length-none -O2
|
||||
|
||||
SRC=
|
||||
OBJ=
|
||||
LIB=
|
||||
|
||||
include irpf90.make
|
||||
|
||||
irpf90.make: $(wildcard *.irp.f)
|
||||
\t$(IRPF90)
|
||||
"""
|
||||
file.write(t)
|
||||
file.close()
|
||||
|
319
src/preprocessed_text.py
Normal file
319
src/preprocessed_text.py
Normal file
@ -0,0 +1,319 @@
|
||||
#!/usr/bin/python
|
||||
|
||||
from irpf90_t import *
|
||||
from regexps import *
|
||||
import error
|
||||
|
||||
# Local regular expressions
|
||||
re_endif = re.compile("end\s+if")
|
||||
re_elseif = re.compile("else\s+if")
|
||||
re_enddo = re.compile("end\s+do")
|
||||
re_endselect = re.compile("end\s+select")
|
||||
|
||||
# Local variables
|
||||
Free_form = 0
|
||||
Fixed_form = 1
|
||||
|
||||
|
||||
######################################################################
|
||||
def get_type (i, filename, line, is_doc):
|
||||
'''Find the type of a text line'''
|
||||
assert isinstance(i,int)
|
||||
assert isinstance(filename,str)
|
||||
assert isinstance(line,str)
|
||||
assert isinstance(is_doc,bool)
|
||||
|
||||
line = line.rstrip()
|
||||
lower_line0 = line.lstrip().lower()
|
||||
lower_line = lower_line0.replace("!"," ! ")
|
||||
|
||||
# Replacements
|
||||
lower_line = re_elseif.sub("elseif",lower_line)
|
||||
lower_line = re_enddo.sub("enddo",lower_line)
|
||||
lower_line = re_endif.sub("endif",lower_line)
|
||||
lower_line = re_endselect.sub("endselect",lower_line)
|
||||
for c in """()'"[]""":
|
||||
lower_line = lower_line.replace(c," ")
|
||||
|
||||
buffer = lower_line.split()
|
||||
if len(buffer) == 0:
|
||||
return [ Empty_line(i,line,filename) ], is_doc
|
||||
|
||||
firstword = buffer[0]
|
||||
if firstword.isdigit():
|
||||
assert len(buffer) > 1
|
||||
buffer = buffer[1:]
|
||||
firstword = buffer[0]
|
||||
|
||||
# Detect errors
|
||||
if firstword == "dowhile":
|
||||
error.fail( Do(i,line,filename) , "'do while' should be in 2 words." )
|
||||
|
||||
# Identify line
|
||||
if firstword == "end_doc":
|
||||
return [ End_doc (i,line,filename) ], False
|
||||
|
||||
if firstword == "begin_doc":
|
||||
return [ Begin_doc (i,line,filename) ], True
|
||||
|
||||
if is_doc:
|
||||
return [ Doc (i,line,filename) ], is_doc
|
||||
|
||||
# Dictionary of simple statements
|
||||
simple_dict = {
|
||||
"program": [ Program (i,line,filename) ] ,
|
||||
"subroutine": [ Subroutine (i,line,filename) ] ,
|
||||
"begin_shell": [ Begin_shell (i,line,filename) ] ,
|
||||
"end_shell": [ End_shell (i,line,filename) ] ,
|
||||
"end_doc": [ End_doc (i,line,filename) ] ,
|
||||
"begin_provider": [ Begin_provider (i,line,filename) ] ,
|
||||
"&begin_provider": [ Cont_provider (i,line,filename) ] ,
|
||||
"end_provider": [ End_provider (i,line,filename) ] ,
|
||||
"assert": [ Assert (i,line,filename) ] ,
|
||||
"touch": [ Touch (i,line,filename) ] ,
|
||||
"provide": [ Provide (i,line,filename) ] ,
|
||||
"free": [ Free (i,line,filename) ] ,
|
||||
"irp_if": [ Irp_If (i,line,filename) ] ,
|
||||
"irp_else": [ Irp_Else (i,line,filename) ] ,
|
||||
"irp_endif": [ Irp_Endif (i,line,filename) ] ,
|
||||
"irp_read": [ Irp_read (i,line,filename) ] ,
|
||||
"irp_write": [ Irp_write (i,line,filename) ] ,
|
||||
"use": [ Use (i,line,filename) ] ,
|
||||
"do": [ Do (i,line,filename) ] ,
|
||||
"selectcase": [ Select (i,"",filename) ,
|
||||
Simple_line (i,line,filename) ] ,
|
||||
"select": [ Select (i,"",filename) ,
|
||||
Simple_line (i,line,filename) ] ,
|
||||
"if": [ If (i,line,filename) ] ,
|
||||
"case": [ Case (i,line,filename) ] ,
|
||||
"elseif": [ Elseif (i,line,filename) ] ,
|
||||
"else": [ Else (i,line,filename) ] ,
|
||||
"enddo": [ Enddo (i,line,filename) ] ,
|
||||
"endif": [ Endif (i,line,filename) ] ,
|
||||
"endselect": [ End_select (i,line,filename) ] ,
|
||||
"end": [ End (i,line,filename) ] ,
|
||||
"include": [ Include (i,line,filename) ] ,
|
||||
"call": [ Call (i,line,filename) ] ,
|
||||
"continue": [ Continue (i,line,filename) ] ,
|
||||
"return": [ Return (i,line,filename) ] ,
|
||||
"implicit": [ Implicit (i,line,filename) ] ,
|
||||
"save": [ Declaration (i,line,filename) ] ,
|
||||
"function": [ Function (i,line,filename) ] ,
|
||||
"recursive": [ Function (i,line,filename) ] ,
|
||||
}
|
||||
|
||||
if firstword in simple_dict.keys():
|
||||
return simple_dict[firstword], is_doc
|
||||
|
||||
if len(lower_line0) > 4:
|
||||
|
||||
if firstword[0] == '#':
|
||||
result = [ Simple_line(i,line,filename) ]
|
||||
error.warn ( result ,
|
||||
"""irpf90 may not work with preprocessor directives. You can use
|
||||
Irp_if ... Irp_else ... Irp_endif
|
||||
instead of
|
||||
#ifdef ... #else ... #endif""" )
|
||||
return result, is_doc
|
||||
|
||||
if firstword.startswith("case("):
|
||||
return [ Case(i,line,filename) ], is_doc
|
||||
|
||||
if lower_line0[1:5] == "$omp":
|
||||
return [ Openmp(i,line,filename) ], is_doc
|
||||
|
||||
if re_decl.match(lower_line) is not None:
|
||||
if "function" in buffer[1:3]:
|
||||
return [ Function (i,line,filename) ], is_doc
|
||||
else:
|
||||
return [ Declaration (i,line,filename) ], is_doc
|
||||
|
||||
return [ Simple_line(i,line,filename) ], is_doc
|
||||
|
||||
|
||||
######################################################################
|
||||
def get_text(lines,filename):
|
||||
'''Read the input file and transform it to labeled lines'''
|
||||
assert isinstance(filename,str)
|
||||
assert isinstance(lines,list)
|
||||
|
||||
result = []
|
||||
is_doc = False
|
||||
for i,line in enumerate(lines):
|
||||
line, is_doc = get_type(i+1,filename,line,is_doc)
|
||||
result += line
|
||||
assert not is_doc
|
||||
return result
|
||||
|
||||
######################################################################
|
||||
def execute_shell(text):
|
||||
'''Execute the embedded shell scripts'''
|
||||
def fail(l,a,b): error.fail(l,"In Begin_Shell, %s '%s'"%(a,b))
|
||||
inside = False
|
||||
result = []
|
||||
for line in text:
|
||||
if inside:
|
||||
if isinstance(line,Begin_shell):
|
||||
error.fail(line,"Nested Begin_shell")
|
||||
elif isinstance(line,End_shell):
|
||||
inside = False
|
||||
# Write script file
|
||||
scriptname = "%s_shell_%d"%(line.filename,line.i)
|
||||
file = open(scriptname,'w')
|
||||
file.writelines(script)
|
||||
file.close()
|
||||
# Execute shell
|
||||
import os
|
||||
pipe = os.popen("%s < %s"%(shell,scriptname),'r')
|
||||
lines = pipe.readlines()
|
||||
pipe.close()
|
||||
result += get_text(lines,scriptname)
|
||||
else:
|
||||
script.append(line.text+'\n')
|
||||
else:
|
||||
if isinstance(line,Begin_shell):
|
||||
inside = True
|
||||
begin = line.i
|
||||
script = []
|
||||
# Find shell executable
|
||||
buffer = line.text.split('[')
|
||||
if len(buffer) > 2:
|
||||
fail(line,"Too many",'[')
|
||||
elif len(buffer) < 2:
|
||||
fail(line,"Missing",'[')
|
||||
buffer = buffer[1]
|
||||
buffer = buffer.split(']')
|
||||
if len(buffer) > 2:
|
||||
fail(line,"Too many",']')
|
||||
elif len(buffer) < 2:
|
||||
fail(line,"Missing",']')
|
||||
shell = buffer[0].strip()
|
||||
elif isinstance(line,End_shell):
|
||||
error.fail(line,"Begin_shell missing")
|
||||
else:
|
||||
result.append(line)
|
||||
return result
|
||||
|
||||
######################################################################
|
||||
def form(text):
|
||||
'''Find if the text is in fixed form or in free form'''
|
||||
assert isinstance(text,list)
|
||||
if len(text) == 0:
|
||||
return Free_form
|
||||
assert isinstance(text[0],Line)
|
||||
|
||||
re2 = re.compile(r"^\s*[!#]")
|
||||
re3 = re.compile(r"^\s*[^ 0-9]+")
|
||||
for line in text:
|
||||
if isinstance(line,Empty_line) or \
|
||||
isinstance(line,Doc) or \
|
||||
isinstance(line,Openmp):
|
||||
pass
|
||||
else:
|
||||
if len(line.text) > 5:
|
||||
test = line.text[0:5]
|
||||
if test[0] in "Cc#!*":
|
||||
pass
|
||||
else:
|
||||
if re2.match(test) is None and \
|
||||
re3.match(test) is not None:
|
||||
return Free_form
|
||||
return Fixed_form
|
||||
|
||||
######################################################################
|
||||
def remove_comments(text,form):
|
||||
'''Remove all comments'''
|
||||
result = []
|
||||
|
||||
def remove_after_bang(line):
|
||||
match = re_comment.match(line)
|
||||
if match is None:
|
||||
return line
|
||||
else:
|
||||
return re_comment.split(line)[1].rstrip()
|
||||
|
||||
if form == Free_form:
|
||||
for line in text:
|
||||
if isinstance(line,Openmp) or \
|
||||
isinstance(line,Doc):
|
||||
result.append(line)
|
||||
elif isinstance(line,Empty_line):
|
||||
pass
|
||||
else:
|
||||
newline = line.text.lstrip()
|
||||
if newline == "" or newline[0] == "!":
|
||||
pass
|
||||
else:
|
||||
line.text = remove_after_bang(line.text)
|
||||
result.append(line)
|
||||
return result
|
||||
else:
|
||||
for line in text:
|
||||
if isinstance(line,Openmp) or \
|
||||
isinstance(line,Doc):
|
||||
result.append(line)
|
||||
elif isinstance(line,Empty_line):
|
||||
pass
|
||||
else:
|
||||
line.text = remove_after_bang(line.text)
|
||||
if line.text[0] in "#123456789 ":
|
||||
result.append(line)
|
||||
return result
|
||||
|
||||
######################################################################
|
||||
def remove_continuation(text,form):
|
||||
'''Removes continuation lines'''
|
||||
result = []
|
||||
buffer = ""
|
||||
number = 0
|
||||
if form == Free_form:
|
||||
for line in text:
|
||||
if line.text[-1] == '&':
|
||||
buffer = "%s%s "%(buffer,line.text[:-1].lstrip())
|
||||
if number == 0:
|
||||
number = line.i
|
||||
else:
|
||||
if number != 0:
|
||||
line.text = "%s%s"%(buffer,line.text.lstrip())
|
||||
line.i = number
|
||||
number = 0
|
||||
buffer = ""
|
||||
result.append(line)
|
||||
else:
|
||||
rev_text = list(text)
|
||||
rev_text.reverse()
|
||||
for line in rev_text:
|
||||
is_continuation = False
|
||||
if isinstance(line,Simple_line):
|
||||
if len(line.text) >= 6:
|
||||
if line.text[5] != ' ':
|
||||
is_continuation = True
|
||||
if is_continuation:
|
||||
buffer = "%s %s"%(line.text[6:].lstrip(),buffer)
|
||||
else:
|
||||
line.text = line.text+buffer
|
||||
result.insert(0,line)
|
||||
buffer = ""
|
||||
return result
|
||||
|
||||
|
||||
######################################################################
|
||||
def preprocessed_text(filename):
|
||||
file = open(filename,"r")
|
||||
lines = file.readlines()
|
||||
file.close()
|
||||
result = get_text(lines,filename)
|
||||
result = execute_shell(result)
|
||||
fortran_form = form(result)
|
||||
result = remove_comments(result,fortran_form)
|
||||
result = remove_continuation(result,fortran_form)
|
||||
return result
|
||||
|
||||
if __name__ == '__main__':
|
||||
txt = preprocessed_text('testfile.irp.f')
|
||||
for line in txt:
|
||||
print line
|
||||
txt = preprocessed_text('testfile_fixed.irp.f')
|
||||
for line in txt:
|
||||
print line
|
||||
|
37
src/regexps.py
Normal file
37
src/regexps.py
Normal file
@ -0,0 +1,37 @@
|
||||
#!/usr/bin/python
|
||||
|
||||
import re
|
||||
|
||||
re_comment = re.compile(r"^([^'!]*)('[^']*'[^']*)*!")
|
||||
|
||||
re_decl = re.compile( "".join( [ r"^\ *",
|
||||
r"(integer *(::)?",
|
||||
r"|double *precision *(::)?",
|
||||
r"|logical *(::)?",
|
||||
r"|character *(::)?",
|
||||
r"|real *(::)?",
|
||||
r"|dimension *(::)?",
|
||||
r"|parameter *(::)?",
|
||||
r"|data */",
|
||||
r"|allocatable *(::)?",
|
||||
r"|common */",
|
||||
r"|namelist */",
|
||||
r"|save */",
|
||||
r"|complex *(::)?",
|
||||
r"|intrinsic *(::)?",
|
||||
r"|external *(::)?",
|
||||
r"|equivalence *(::)?",
|
||||
r")[^=(]"
|
||||
] ) )
|
||||
|
||||
re_left = re.compile(r"\[")
|
||||
re_right = re.compile(r"\]")
|
||||
|
||||
re_test = re.compile(r"\( *(.*)(\.[a-zA-Z]*\.|[<>]=?|[=/]=)([^=]*)\)")
|
||||
|
||||
re_space = re.compile("\s")
|
||||
|
||||
re_string = re.compile(r"'.*'")
|
||||
re_assert = re.compile(r"assert *",re.I)
|
||||
re_check = re.compile(r".*[() ].*")
|
||||
|
24
src/util.py
Normal file
24
src/util.py
Normal file
@ -0,0 +1,24 @@
|
||||
#!/usr/bin/python
|
||||
|
||||
def same_file(filename,txt):
|
||||
assert isinstance(filename,str)
|
||||
assert isinstance(txt,list)
|
||||
|
||||
try:
|
||||
file = open(filename,"r")
|
||||
except IOError:
|
||||
return False
|
||||
lines = file.readlines()
|
||||
file.close()
|
||||
if len(lines) != len(txt):
|
||||
return False
|
||||
for a,b in zip(lines,txt):
|
||||
if a != b:
|
||||
return False
|
||||
return True
|
||||
|
||||
if __name__ == '__main__':
|
||||
txt = open('/etc/passwd','r').readlines()
|
||||
print same_file('/etc/passwd',txt)
|
||||
print same_file('/etc/group',txt)
|
||||
print same_file('/etc/passwd-',txt)
|
1
src/version.py
Normal file
1
src/version.py
Normal file
@ -0,0 +1 @@
|
||||
version = "1.1.0"
|
13
tools/commit-msg
Executable file
13
tools/commit-msg
Executable file
@ -0,0 +1,13 @@
|
||||
#!/usr/bin/python
|
||||
|
||||
import os,sys
|
||||
ROOT = os.path.dirname(__file__)+'/../../'
|
||||
file = open(ROOT+'src/version.py','r')
|
||||
exec file
|
||||
file.close()
|
||||
file = open(sys.argv[1],'a')
|
||||
print >>file, 'Version:'+version
|
||||
file.close()
|
||||
|
||||
|
||||
|
10
tools/install_tools.sh
Executable file
10
tools/install_tools.sh
Executable file
@ -0,0 +1,10 @@
|
||||
#!/bin/bash
|
||||
|
||||
OLD_DIR=$PWD
|
||||
cd ../.git/hooks/
|
||||
|
||||
for i in commit-msg post-commit
|
||||
do
|
||||
rm $i
|
||||
ln -s $OLD_DIR/$i $PWD/$i
|
||||
done
|
18
tools/post-commit
Executable file
18
tools/post-commit
Executable file
@ -0,0 +1,18 @@
|
||||
#!/usr/bin/python
|
||||
|
||||
import os
|
||||
ROOT = os.path.dirname(__file__)+'/../../'
|
||||
|
||||
file = open(ROOT+'src/version.py','r') ;
|
||||
exec file
|
||||
file.close() ;
|
||||
v = version.split('.')
|
||||
v = map(int,v)
|
||||
|
||||
v[2] += 1
|
||||
line = 'version = "%d.%d.%d"\n'%tuple(v)
|
||||
|
||||
file = open(ROOT+'src/version.py','w')
|
||||
file.writelines([line])
|
||||
file.close()
|
||||
|
Loading…
Reference in New Issue
Block a user