From 62f3085eff65dff7997737161b51d73805da7c09 Mon Sep 17 00:00:00 2001 From: Anthony Scemama Date: Wed, 2 Sep 2009 20:45:53 +0200 Subject: [PATCH] Initial version. Version:1.1.0 --- src/command_line.py | 89 +++++++++++ src/error.py | 35 +++++ src/init.py | 45 ++++++ src/irp_stack.py | 111 ++++++++++++++ src/irpf90.py | 21 +++ src/irpf90_t.py | 264 ++++++++++++++++++++++++++++++++ src/makefile.py | 34 +++++ src/preprocessed_text.py | 319 +++++++++++++++++++++++++++++++++++++++ src/regexps.py | 37 +++++ src/util.py | 24 +++ src/version.py | 1 + tools/commit-msg | 13 ++ tools/install_tools.sh | 10 ++ tools/post-commit | 18 +++ 14 files changed, 1021 insertions(+) create mode 100644 src/command_line.py create mode 100644 src/error.py create mode 100644 src/init.py create mode 100644 src/irp_stack.py create mode 100644 src/irpf90.py create mode 100644 src/irpf90_t.py create mode 100644 src/makefile.py create mode 100644 src/preprocessed_text.py create mode 100644 src/regexps.py create mode 100644 src/util.py create mode 100644 src/version.py create mode 100755 tools/commit-msg create mode 100755 tools/install_tools.sh create mode 100755 tools/post-commit diff --git a/src/command_line.py b/src/command_line.py new file mode 100644 index 0000000..72acf71 --- /dev/null +++ b/src/command_line.py @@ -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() diff --git a/src/error.py b/src/error.py new file mode 100644 index 0000000..0aaa1e3 --- /dev/null +++ b/src/error.py @@ -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") + diff --git a/src/init.py b/src/init.py new file mode 100644 index 0000000..e57ef10 --- /dev/null +++ b/src/init.py @@ -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 + diff --git a/src/irp_stack.py b/src/irp_stack.py new file mode 100644 index 0000000..978c294 --- /dev/null +++ b/src/irp_stack.py @@ -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() + + diff --git a/src/irpf90.py b/src/irpf90.py new file mode 100644 index 0000000..0efeb6b --- /dev/null +++ b/src/irpf90.py @@ -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() diff --git a/src/irpf90_t.py b/src/irpf90_t.py new file mode 100644 index 0000000..9954d16 --- /dev/null +++ b/src/irpf90_t.py @@ -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) + + + + + + + diff --git a/src/makefile.py b/src/makefile.py new file mode 100644 index 0000000..3d954b8 --- /dev/null +++ b/src/makefile.py @@ -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() + diff --git a/src/preprocessed_text.py b/src/preprocessed_text.py new file mode 100644 index 0000000..204958c --- /dev/null +++ b/src/preprocessed_text.py @@ -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 + diff --git a/src/regexps.py b/src/regexps.py new file mode 100644 index 0000000..936e3df --- /dev/null +++ b/src/regexps.py @@ -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".*[() ].*") + diff --git a/src/util.py b/src/util.py new file mode 100644 index 0000000..9d9ea91 --- /dev/null +++ b/src/util.py @@ -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) diff --git a/src/version.py b/src/version.py new file mode 100644 index 0000000..b2b60a5 --- /dev/null +++ b/src/version.py @@ -0,0 +1 @@ +version = "1.1.0" diff --git a/tools/commit-msg b/tools/commit-msg new file mode 100755 index 0000000..f6bebb6 --- /dev/null +++ b/tools/commit-msg @@ -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() + + + diff --git a/tools/install_tools.sh b/tools/install_tools.sh new file mode 100755 index 0000000..6eee1c2 --- /dev/null +++ b/tools/install_tools.sh @@ -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 diff --git a/tools/post-commit b/tools/post-commit new file mode 100755 index 0000000..aff0c83 --- /dev/null +++ b/tools/post-commit @@ -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() +