示例#1
0
 def process_assert(line):
     assert type(line) == Assert
     if command_line.do_assert:
         if '(' not in line.text or ')' not in line.text:
             error.fail(line,
                        "Syntax error in ASSERT statement (parentheses)")
         condition = "(%s" % (line.text.split('(', 1)[1])
         if condition == "":
             error.fail(line, "Error in Assert statement")
         condition_str = condition.replace("'", "''")
         i = line.i
         f = line.filename
         txt = line.text.strip()
         result = [
             Empty_line(i, "!", f),
             Empty_line(i, "! >>> %s" % (txt, ), f),
             If(i, "  if (.not.%s) then" % (condition, ), f),
             Simple_line(i, "   print *, irp_here//': Assert failed:'", f),
             Simple_line(i, "   print *, ' file: %s, line: %d'" %
                         (f, i), f),
             Simple_line(i, "   print *, '%s'" % (condition_str, ), f),
         ] + debug_conditions(line) + [
             Simple_line(i, "   stop 1", f),
             Endif(i, "  endif", f),
             Empty_line(i, "! <<< END %s" % (txt, ), f),
             Empty_line(i, "!", f)
         ]
     else:
         result = []
     return result
示例#2
0
 def fun(x):
     if x not in variables:
         error.fail(line, "Variable %s unknown" % (x, ))
     return ([],
             Simple_line(line.i,
                         " %s_is_built = .True." % (x, ),
                         line.filename))
示例#3
0
def change_includes(text):
    '''Deals with include files'''
    result = []
    for line in text:
        if type(line) == Include:
            txt = line.text.replace('"', "'").split("'")
            if len(txt) != 3:
                print txt
                error.fail(line, "Error in include statement")
            directory = (("./" + line.filename).rsplit('/', 1)[0] + '/')[2:]
            if directory == "":
                filename = txt[1].strip()
            else:
                filename = directory + txt[1].strip()
            try:
                file = open(filename, 'r')
                file.close()
                result.append(
                    Include(line.i, "! include '%s'" % filename, filename))
                result += create_preprocessed_text(filename)
            except IOError:
                result.append(Declaration(line.i, line.text, line.filename))
        else:
            result.append(line)
    return result
示例#4
0
 def process_assert(line):
   assert type(line) == Assert
   if command_line.do_assert:
     condition = "(%s"%(line.text.split('(',1)[1])
     if condition == "":
       error.fail(line,"Error in Assert statement")
     condition_str = condition.replace("'","''")
     i = line.i
     f = line.filename
     txt = line.text.strip()
     result = [
      Empty_line(i, "!", f),
      Empty_line(i, "! >>> %s"%(txt,), f),
      If         (i, "  if (.not.%s) then"%(condition,), f),
      Simple_line(i, "   call irp_trace", f),
      Simple_line(i, "   print *, irp_here//': Assert failed:'", f),
      Simple_line(i, "   print *, ' file: %s, line: %d'"%(f,i), f),
      Simple_line(i, "   print *, '%s'"%(condition_str,), f),
      ] + debug_conditions(line) + [
      Simple_line(i, "   stop 1", f),
      Endif      (i, "  endif", f),
      Empty_line(i, "! <<< END %s"%(txt,), f),
      Empty_line(i, "!", f)
     ]
   else:
     result = []
   return result
示例#5
0
def check_begin_end(text):
  '''Checks x...endx consistence'''

  filter_line = lambda line: type(line) in [ Do, Enddo, If, Endif, \
         Program, Begin_provider, End_provider, \
         Subroutine, Function, End, Begin_doc, End_doc ]
  text = filter(filter_line, text)

  d = { 'do' : Do,         'enddo': Enddo,
        'if' : If,         'endif': Endif,
        '_doc': Begin_doc, 'end_doc': End_doc}
  assert type(text) == list

  def find_matching_end_ifdo(begin,x):
    level = 1
    for i in range(begin+1,len(text)):
      line = text[i]
      if type(line) == d[x]:
        level += 1
      elif type(line) == d["end%s"%(x,)]:
        level -= 1
        if level == 0:
          return True
      elif type(line) in [End, End_provider]:
        break
    error.fail(text[begin],"Missing 'end%s'"%(x,))

  def find_matching_end_subfunpro(begin,x):
    for i in range(begin+1,len(text)):
      line = text[i]
      if type(line) == x:
        return
      if type(line) in [ Subroutine, Function, Program, Begin_provider ]:
        error.fail(text[begin],type(line).str+" is not closed")
    error.fail(text[begin],type(line).str + " is not closed")

  
  level = 0
  for i,line in enumerate(text):
    if type(line) == Begin_doc:
      find_matching_end_ifdo(i,'_doc')
  for i,line in enumerate(text):
    if type(line) == Do:
      find_matching_end_ifdo(i,'do')
    elif type(line) == If:
      find_matching_end_ifdo(i,'if')
    elif type(line) in [Subroutine, Function, Program]:
      level += 1
      find_matching_end_subfunpro(i,End)
    elif type(line) == Begin_provider:
      level += 1
      find_matching_end_subfunpro(i,End_provider)
    elif type(line) == End:
      level -= 1
    elif type(line) == End_provider:
      level -= 1
    if level < 0:
      error.fail(line,"Beginning of block not matched")

  return True
示例#6
0
 def find_matching_end_subfunpro(begin,x):
   for i in range(begin+1,len(text)):
     line = text[i]
     if type(line) == x:
       return
     if type(line) in [ Subroutine, Function, Program, Begin_provider ]:
       error.fail(text[begin],type(line).str+" is not closed")
   error.fail(text[begin],type(line).str + " is not closed")
示例#7
0
 def change_matching_enddo(begin,number):
   for i in range(begin+1,len(text)):
     line = text[i]
     if type(line) in [Continue,Enddo]:
       buffer = line.text.split()
       if buffer[0] == number:
         text[i] = Enddo(line.i,"  enddo",line.filename)
         return
   error.fail(text[begin],"Old-style do loops should end with 'continue' or 'end do'")
示例#8
0
 def fun(x):
     if x not in variables:
         error.fail(line, "Variable %s unknown" % (x, ))
     return [([],
              Simple_line(line.i, " call touch_%s" % (x, ),
                          line.filename)),
             ([],
              Use(line.i, " use %s" % (variables[x].fmodule),
                  line.filename))]
示例#9
0
文件: util.py 项目: eth-cscs/irpf90
def find_subname(line):
  buffer = line.lower
  if not buffer.endswith(')'):
    buffer += "()"
  buffer = buffer.split('(')
  buffer = buffer[0].split()
  if len(buffer) < 2:
    error.fail(line,"Syntax Error")
  return buffer[-1]
示例#10
0
def find_subname(line):
    buffer = line.lower
    if not buffer.endswith(')'):
        buffer += "()"
    buffer = buffer.split('(')
    buffer = buffer[0].split()
    if len(buffer) < 2:
        error.fail(line, "Syntax Error")
    return buffer[-1]
示例#11
0
 def find_matching_end_subfunpro(begin, x):
     line = text[begin]
     for i in range(begin + 1, len(text)):
         line = text[i]
         if type(line) == x:
             return
         if type(line) in [Subroutine, Function, Program, Begin_provider]:
             error.fail(text[begin], type(line).str + " is not closed")
     error.fail(text[begin], type(line).str + " is not closed")
示例#12
0
 def process_cont_provider(line):
     assert type(line) == Cont_provider
     buffer = line.lower.replace('[', " ")
     buffer = buffer.replace(']', "")
     buffer = buffer.split(',')
     if len(buffer) < 2:
         error.fail(line, "Error in Cont_provider statement")
     varname = buffer[1].strip()
     i = line.i
     f = line.filename
     return [Cont_provider(i, line.text, (f, varname))]
示例#13
0
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 type(line) == Begin_shell:
                error.fail(line, "Nested Begin_shell")
            elif type(line) == End_shell:
                inside = False
                # Write script file
                scriptname = "%s%s_shell_%d" % (irpdir, line.filename, line.i)
                file = open(scriptname, 'w')
                file.writelines(script)
                file.close()
                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)
                os.remove(scriptname)
            else:
                script.append(line.text + '\n')
        else:
            if type(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 type(line) == End_shell:
                error.fail(line, "Begin_shell missing")
            else:
                result.append(line)
    return result
示例#14
0
 def change_matching_enddo(begin, number):
     for i in range(begin + 1, len(text)):
         line = text[i]
         if type(line) in [Continue, Enddo]:
             buffer = line.text.split()
             if buffer[0] == number:
                 text[i] = Enddo(line.i, "  enddo", line.filename)
                 return
     error.fail(
         text[begin],
         "Old-style do loops should end with 'continue' or 'end do'")
示例#15
0
 def process_cont_provider(line):
   assert type(line) == Cont_provider
   buffer = line.lower.replace('['," ")
   buffer = buffer.replace(']',"")
   buffer = buffer.split(',')
   if len(buffer) < 2:
     error.fail(line,"Error in Cont_provider statement")
   varname = buffer[1].strip()
   i = line.i
   f = line.filename
   return [ Cont_provider(i,line.text,(f,varname)) ]
示例#16
0
文件: variable.py 项目: v1j4y/irpf90
 def type(self):
   if '_type' not in self.__dict__:
     line = self.line.text
     buffer = line.split(',')[0]
     try:
       buffer = buffer.split('[')[1].strip()
     except IndexError:
       error.fail(None,"Error in definition of %s."%(self.name))
     if self.dim != []:
       buffer = "%s, allocatable"%(buffer)
     self._type = buffer
   return self._type
示例#17
0
 def type(self):
     if '_type' not in self.__dict__:
         line = self.line.text
         buffer = line.split(',')[0]
         try:
             buffer = buffer.split('[')[1].strip()
         except IndexError:
             error.fail(None, "Error in definition of %s." % (self.name))
         if self.dim != []:
             buffer = "%s, allocatable" % (buffer)
         self._type = buffer
     return self._type
示例#18
0
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 type(line) == Begin_shell:
        error.fail(line,"Nested Begin_shell")
      elif type(line) == End_shell:
        inside = False
        # Write script file
        scriptname = "%s%s_shell_%d"%(irpdir,line.filename,line.i)
        file = open(scriptname,'w')
        file.writelines(script)
        file.close()
        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)
        os.remove(scriptname)
      else:
        script.append(line.text+'\n')
    else:
      if type(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 type(line) == End_shell:
        error.fail(line,"Begin_shell missing")
      else:
        result.append(line)
  return result
示例#19
0
 def find_matching_end_ifdo(begin, x):
     level = 1
     for i in range(begin + 1, len(text)):
         line = text[i]
         if type(line) == d[x]:
             level += 1
         elif type(line) == d["end%s" % (x, )]:
             level -= 1
             if level == 0:
                 return True
         elif type(line) in [End, End_provider]:
             break
     error.fail(text[begin], "Missing 'end%s'" % (x, ))
示例#20
0
 def find_matching_end_ifdo(begin,x):
   level = 1
   for i in range(begin+1,len(text)):
     line = text[i]
     if type(line) == d[x]:
       level += 1
     elif type(line) == d["end%s"%(x,)]:
       level -= 1
       if level == 0:
         return True
     elif type(line) in [End, End_provider]:
       break
   error.fail(text[begin],"Missing 'end%s'"%(x,))
示例#21
0
def update_variables():
  for filename,text in preprocessed_text:

    for line in filter(lambda x: type(x) in [ Touch, SoftTouch ], text):
        vars = line.lower.split()
        if len(vars) < 2:
          error.fail(line,"Syntax error")
        for v in vars[1:]:
          if v not in variables:
            error.fail(line,"Variable %s unknown"%(v,))
          variables[v]._is_touched = True

    for line in filter(lambda x: type(x) == Free,text):
        vars = line.lower.split()
        if len(vars) < 2:
          error.fail(line,"Syntax error")
        for v in vars[1:]:
          if v not in variables:
            error.fail(line,"Variable %s unknown"%(v,))
          variables[v].is_freed = True

    for line in filter(lambda x: type(x) == Irp_read,text):
        variables[line.filename]._is_read = True

    for line in filter(lambda x: type (x) == Irp_write,text):
        variables[line.filename]._is_written = True
示例#22
0
def check_touch(line,vars,main_vars):
  def fun(main_var):
    if main_var not in variables:
      error.fail(line,"Variable %s unknown"%(main_var,))
    x = variables[main_var]
    return [main_var]+x.others
  all_others = make_single(flatten( map(fun,main_vars) ))
  all_others.sort()
  vars.sort()
  for x,y in zip(vars,all_others):
      if x != y:
        message = "The following entities should be touched:\n"
        message = "\n".join([message]+map(lambda x: "- %s"%(x,),all_others))
        error.fail(line,message)
示例#23
0
def update_variables():
    for filename, text in preprocessed_text:

        for line in filter(lambda x: type(x) in [Touch, SoftTouch], text):
            vars = line.lower.split()
            if len(vars) < 2:
                error.fail(line, "Syntax error")
            for v in vars[1:]:
                if v not in variables:
                    error.fail(line, "Variable %s unknown" % (v, ))
                variables[v]._is_touched = True

        for line in filter(lambda x: type(x) == Free, text):
            vars = line.lower.split()
            if len(vars) < 2:
                error.fail(line, "Syntax error")
            for v in vars[1:]:
                if v not in variables:
                    error.fail(line, "Variable %s unknown" % (v, ))
                variables[v].is_freed = True

        for line in filter(lambda x: type(x) == Irp_read, text):
            variables[line.filename]._is_read = True

        for line in filter(lambda x: type(x) == Irp_write, text):
            variables[line.filename]._is_written = True
示例#24
0
  def name(self):
    '''Name is lowercase'''
    if '_name' not in self.__dict__:
      buffer = None
      text = self.text
      for line in text:
        if type(line) == Begin_provider:
          self._name = line.filename[1]
          if "(" in self._name:
            error.fail(line,"""'(' not allowed in variable name.
A ',' is probably missing between the name of the variable and the
dimension.
""") 
          break
    return self._name
示例#25
0
def check_touch(line, vars, main_vars):
    def fun(main_var):
        if main_var not in variables:
            error.fail(line, "Variable %s unknown" % (main_var, ))
        x = variables[main_var]
        return [main_var] + x.others

    all_others = make_single(flatten(map(fun, main_vars)))
    all_others.sort()
    vars.sort()
    for x, y in zip(vars, all_others):
        if x != y:
            message = "The following entities should be touched:\n"
            message = "\n".join([message] +
                                map(lambda x: "- %s" % (x, ), all_others))
            error.fail(line, message)
示例#26
0
def change_single_line_ifs(text):
    '''Changes:
if (test) result

to

if (test) then
  result
endif'''

    assert type(text) == list
    result = []
    for line in text:
        if type(line) == If:
            if line.lower.endswith("then"):
                result.append(line)
            else:
                buffer = line.text
                begin = buffer.find('(')
                if begin < 0:
                    error.fail(line, "Error in if statement")
                level = 0
                instring = False
                for i, c in enumerate(buffer[begin:]):
                    if c == "'":
                        instring = not instring
                    if instring:
                        pass
                    elif c == '(':
                        level += 1
                    elif c == ')':
                        level -= 1
                    if level == 0:
                        end = begin + i + 1
                        break
                if level != 0:
                    error.fail(line, "Error in if statement")
                test = buffer[:end]
                code = buffer[end:]
                i = line.i
                f = line.filename
                result.append(If(i, "%s then" % (test, ), f))
                result += get_type(i, f, code, False)[0]
                result.append(Endif(i, "  endif", f))
        else:
            result.append(line)
    return result
示例#27
0
def change_single_line_ifs(text):
  '''Changes:
if (test) result

to

if (test) then
  result
endif'''

  assert type(text) == list
  result = []
  for line in text:
    if type(line) == If:
      if line.lower.endswith("then"):
        result.append(line)
      else:
        buffer = line.text
        begin = buffer.find('(')
        if begin < 0:
          error.fail(line,"Error in if statement")
        level = 0
        instring = False
        for i,c in enumerate(buffer[begin:]):
          if c == "'":
            instring = not instring
          if instring:
            pass
          elif c == '(':
            level +=1
          elif c == ')':
            level -= 1
          if level == 0:
            end = begin+i+1
            break
        if level != 0:
          error.fail(line,"Error in if statement")
        test = buffer[:end]
        code = buffer[end:]
        i = line.i
        f = line.filename
        result.append( If(i,"%s then"%(test,),f) )
        result += get_type(i,f,code,False)[0]
        result.append( Endif(i,"  endif",f) )
    else:
      result.append(line)
  return result
示例#28
0
 def process_begin_provider(line):
   assert type(line) == Begin_provider
   buffer = line.lower.replace('['," ")
   buffer = buffer.replace(']',"")
   buffer = buffer.split(',')
   if len(buffer) < 2:
     error.fail(line,"Error in Begin_provider statement")
   varname = buffer[1].strip()
   length = len(varname)
   i = line.i
   f = line.filename
   result = [ Begin_provider(i,line.text, (f,varname)),
     Declaration(i,"  character*(%d) :: irp_here = '%s'"%(length,varname), f) ]
   if command_line.do_assert or command_line.do_debug:
     result += [
       Simple_line(i,"  call irp_enter(irp_here)", f),
     ]
   return result
示例#29
0
文件: variable.py 项目: v1j4y/irpf90
 def children(self):
   if '_children' not in self.__dict__:
     if not self.is_main:
       self._children = []
     from variables import variables
     if '_needs' not in self.__dict__:
       import parsed_text
     result = []
     for x in self.needs:
       result.append(x)
       try:
         result += variables[x].children
       except RuntimeError:
         pass # Exception will be checked after
     self._children = make_single(result)
     if self.name in result:
       error.fail(self.line,"Cyclic dependencies:\n%s"%(str(self._children)))
   return self._children
示例#30
0
def check_OpenMP(text):
  assert type(text) == list
  result = []
  inside_openmp = False
  for line in text:
     if type(line) == Openmp:
       # Detect OpenMP blocks
       buffer = line.text.lower().split()
       if buffer[1] == "parallel":
         inside_openmp = True
       if buffer[1] == "end" and buffer[2] == "parallel":
         inside_openmp = False
     result.append(line)

     if inside_openmp:
       if type(line) in [ Provide_all, Provide, Touch, SoftTouch ]:
          error.fail(line,type(line).str+" is not allowed in an OpenMP block.")

  return result
示例#31
0
 def children(self):
     if '_children' not in self.__dict__:
         if not self.is_main:
             self._children = []
         from variables import variables
         if '_needs' not in self.__dict__:
             import parsed_text
         result = []
         for x in self.needs:
             result.append(x)
             try:
                 result += variables[x].children
             except RuntimeError:
                 pass  # Exception will be checked after
         self._children = make_single(result)
         if self.name in result:
             error.fail(self.line,
                        "Cyclic dependencies:\n%s" % (str(self._children)))
     return self._children
示例#32
0
def change_includes(text):
  '''Deals with include files'''
  result = []
  for line in text:
    if type(line) == Include:
     txt = line.text.replace('"',"'").split("'")
     if len(txt) != 3:
       print txt
       error.fail(line,"Error in include statement")
     filename = txt[1].strip()
     try:
       file = open(filename,'r')
       file.close()
       result.append(Include(line.i,"! include '%s'"%filename,filename))
       result += create_preprocessed_text(filename)
     except IOError:
       result.append(Declaration(line.i,line.text,line.filename))
    else:
     result.append(line)
  return result
示例#33
0
def check_OpenMP(text):
    assert type(text) == list
    result = []
    inside_openmp = False
    for line in text:
        if type(line) == Openmp:
            # Detect OpenMP blocks
            buffer = line.text.lower().split()
            if buffer[1] == "parallel":
                inside_openmp = True
            if buffer[1] == "end" and buffer[2] == "parallel":
                inside_openmp = False
        result.append(line)

        if inside_openmp:
            if type(line) in [Provide_all, Provide, Touch, SoftTouch]:
                error.fail(
                    line,
                    type(line).str + " is not allowed in an OpenMP block.")

    return result
示例#34
0
 def parents(self):
   if '_parents' not in self.__dict__:
     if not self.is_main:
       self._parents = []
     else:
       from variables import variables
       if '_needed_by' not in self.__dict__:
         import parsed_text
       if command_line.do_unused and self.needed_by == []:
         error.warn(None, "Provider %s is not used"%self.name)
       result = []
       for x in self.needed_by:
         result.append(x)
         try:
           result += variables[x].parents
         except RuntimeError:
           pass # Exception will be checked after
       self._parents = make_single(result)
       if self.name in result:
         error.fail(self.line,"Cyclic dependencies:\n%s"%(str(self._parents)))
   return self._parents
示例#35
0
 def process_irp_rw(line,rw,t):
   assert type(line) == t
   buffer = line.text.split()
   if len(buffer) == 2:
     dummy, variable = buffer
     num = "0"
   elif len(buffer) == 3:
     dummy, variable, num = buffer
   else:
     error.fail(line,"Error in IRP_%s statement"%(rw,))
   variable = variable.lower()
   i = line.i
   f = line.filename
   txt = line.text.lstrip()
   result = [
      Empty_line(i,"!",f),
      t(i,"! >>> %s"%(txt,),variable ),
      Provide_all(i,"   call %ser_%s('%s')"%(rw,variable,num),f),
      Empty_line(i,"! >>> END %s "%(txt,),f ),
      Empty_line(line.i,"!",f),
   ]
   return result
示例#36
0
 def process_irp_rw(line, rw, t):
     assert type(line) == t
     buffer = line.text.split()
     if len(buffer) == 2:
         dummy, variable = buffer
         num = "0"
     elif len(buffer) == 3:
         dummy, variable, num = buffer
     else:
         error.fail(line, "Error in IRP_%s statement" % (rw, ))
     variable = variable.lower()
     i = line.i
     f = line.filename
     txt = line.text.lstrip()
     result = [
         Empty_line(i, "!", f),
         t(i, "! >>> %s" % (txt, ), variable),
         Provide_all(i, "   call %ser_%s('%s')" % (rw, variable, num), f),
         Empty_line(i, "! >>> END %s " % (txt, ), f),
         Empty_line(line.i, "!", f),
     ]
     return result
示例#37
0
 def process_begin_provider(line):
     assert type(line) == Begin_provider
     buffer = line.lower.replace('[', " ")
     buffer = buffer.replace(']', "")
     buffer = buffer.split(',')
     if len(buffer) < 2:
         error.fail(line, "Error in Begin_provider statement")
     varname = buffer[1].strip()
     length = len(varname)
     i = line.i
     f = line.filename
     result = [
         Begin_provider(i, line.text, (f, varname)),
         Declaration(
             i, "  character*(%d) :: irp_here = '%s'" % (length, varname),
             f)
     ]
     if command_line.do_debug:
         result += [
             Simple_line(i, "  call irp_enter(irp_here)", f),
         ]
     return result
示例#38
0
 def parents(self):
     if '_parents' not in self.__dict__:
         if not self.is_main:
             self._parents = []
         else:
             from variables import variables
             if '_needed_by' not in self.__dict__:
                 import parsed_text
             if command_line.do_unused and self.needed_by == []:
                 error.warn(None, "Provider %s is not used" % self.name)
             result = []
             for x in self.needed_by:
                 result.append(x)
                 try:
                     result += variables[x].parents
                 except RuntimeError:
                     pass  # Exception will be checked after
             self._parents = make_single(result)
             if self.name in result:
                 error.fail(
                     self.line,
                     "Cyclic dependencies:\n%s" % (str(self._parents)))
     return self._parents
示例#39
0
def get_type (i, filename, line, is_doc):
  '''Find the type of a text line'''
  assert type(i) == int
  assert type(filename) == str
  assert type(line) == str
  assert type(is_doc) == bool

  # add support for interface block
  has_interface = False

  line = line.rstrip()
  line = line.replace("$IRP_ALIGN",command_line.align)
  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_endtype.sub("endtype",lower_line)
  lower_line = re_endmodule.sub("endmodule",lower_line)
  lower_line = re_endif.sub("endif",lower_line)
  lower_line = re_endselect.sub("endselect",lower_line)
  lower_line = re_endinterface.sub("endinterface",lower_line)

  for c in """()'"[]""":
    lower_line = lower_line.replace(c," "+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]

  # Identify line
  if firstword == "endinterface":
    has_interface = False
    return [ Simple_line   (i,line,filename) ], False

  if firstword == "interface" or has_interface:
    has_interface = True
    return [ Simple_line   (i,line,filename) ], False

  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

  if firstword in simple_dict:
    return [ simple_dict[firstword](i,line,filename) ], is_doc

  if firstword in [ "select", "selectcase" ]:
    return [ Select(i,line,filename) ] , is_doc

  if len(lower_line0) > 4:

    if firstword[0] == '#':
      result = [ Simple_line(i,line,filename) ]
      error.warn ( result[0] ,
"""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
    elif lower_line0[1:5] in ["dec$", "dir$"] and command_line.directives:
     return [ Directive(i,line,filename) ], is_doc
    elif lower_line0[1:3] == "$ ":
     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

    # Detect errors
    if firstword == "dowhile":
      error.fail( Do(i,line,filename) , "'do while' should be in 2 words." )

  return [ Simple_line(i,line,filename) ], is_doc
示例#40
0
 def fail(l, a, b):
     error.fail(l, "In %s, %s" % (a, b))
示例#41
0
    def func(filename, text):
        varlist = []
        result = []
        append = result.append
        for line in text:  #filter(
            #     lambda x: type(x) not in [ Doc, Begin_doc, End_doc ],
            #     text):
            if type(line) in [ \
              Empty_line,
              Continue,
              Return,
              Begin_shell,
              End_shell,
              Openmp,
              Directive,
              Use,
              Enddo,
              End_select,
              Endif,
              Implicit,
              Program,
              Subroutine,
              Function,
              End,
            ]:
                append(([], line))
            elif type(line) in [Begin_provider, Cont_provider]:
                if type(line) == Begin_provider:
                    varlist = []
                buffer = map(strip, line.lower.replace(']', '').split(','))
                assert len(buffer) > 1
                v = buffer[1]
                varlist.append(v)
                variable_list = find_variables_in_line(line)
                try:
                    variable_list.remove(variables[v].same_as)
                except ValueError:
                    print v, variables[v].same_as
                    raise
                append((variable_list, line))
            elif type(line) == End_provider:
                varlist = []
                append(([], line))
            elif type(line) == Provide:
                l = line.lower.split()[1:]
                l = filter(lambda x: x not in varlist, l)
                for v in l:
                    if v not in variables:
                        error.fail(line, "Variable %s is unknown" % (v))
                append(
                    (l, Simple_line(line.i, "!%s" % (line.text),
                                    line.filename)))
            elif type(line) == NoDep:
                l = line.lower.split()[1:]
                for v in l:
                    if v not in variables:
                        error.fail(line, "Variable %s is unknown" % (v))
                l = map(lambda x: "-%s" % (x), l)
                append(
                    (l, Simple_line(line.i, "!%s" % (line.text),
                                    line.filename)))
            elif type(line) in [Touch, SoftTouch]:
                vars = line.lower.split()
                if len(vars) < 2:
                    error.fail(line, "Syntax error")
                vars = vars[1:]

                def fun(x):
                    main = variables[x].same_as
                    return main

                main_vars = make_single(map(fun, vars))
                check_touch(line, vars, main_vars)
                txt = " ".join(vars)
                append((vars, Simple_line(line.i, "!", line.filename)))
                append(([],
                        Simple_line(line.i, "! >>> TOUCH %s" % (txt, ),
                                    line.filename)))

                def fun(x):
                    if x not in variables:
                        error.fail(line, "Variable %s unknown" % (x, ))
                    return [([],
                             Simple_line(line.i, " call touch_%s" % (x, ),
                                         line.filename)),
                            ([],
                             Use(line.i, " use %s" % (variables[x].fmodule),
                                 line.filename))]

                result += flatten(map(fun, main_vars))

                def fun(x):
                    if x not in variables:
                        error.fail(line, "Variable %s unknown" % (x, ))
                    return ([],
                            Simple_line(line.i,
                                        " %s_is_built = .True." % (x, ),
                                        line.filename))

                result += map(fun, main_vars[:-1])
                if type(line) == SoftTouch:
                    append(([],
                            Simple_line(line.i, "! <<< END TOUCH (Soft)",
                                        line.filename)))
                else:
                    append(([],
                            Provide_all(line.i, "! <<< END TOUCH",
                                        line.filename)))
            elif type(line) == Call:
                l = find_variables_in_line(line)
                l = filter(lambda x: x not in varlist, l)
                sub = find_subroutine_in_line(line)
                if sub not in subroutines:
                    t = Simple_line
                    append((l, Simple_line(line.i, line.text, line.filename)))
                else:
                    append((l, line))
                    if subroutines[sub].touches != []:
                        append(([], Provide_all(line.i, "", line.filename)))
            elif type(line) == Free:
                vars = line.lower.split()
                vars = vars[1:]
                append(
                    ([], Simple_line(line.i, "!%s" % (line.text),
                                     line.filename)))
                use = map(lambda x: "  use %s" % (variables[x].fmodule), vars)
                for var in vars:
                    result += map(
                        lambda x: ([], Use(line.i, x, line.filename)),
                        make_single(use))
                    result += map(
                        lambda x: ([], Simple_line(line.i, x, line.filename)),
                        variables[var].free)
            elif type(line) == Irp_read:
                append(
                    ([], Simple_line(line.i, "!%s" % (line.text),
                                     line.filename)))
            elif type(line) == Irp_write:
                append(
                    ([], Simple_line(line.i, "!%s" % (line.text),
                                     line.filename)))
            elif type(line) in [Begin_doc, End_doc, Doc]:
                pass
            else:
                l = find_variables_in_line(line)
                l = filter(lambda x: x not in varlist, l)
                append((l, line))
        return result
示例#42
0
 def fail(l, a, b):
     error.fail(l, "In Begin_Shell, %s '%s'" % (a, b))
示例#43
0
    def func(filename, text):
        result = []
        append = result.append
        # 1st pass
        varlist = []
        ifvars = []
        elsevars = []
        old_varlist = []
        old_ifvars = []
        old_elsevars = []
        revtext = list(text)
        revtext.reverse()
        try:
            for vars, line in revtext:
                if type(line) in [End_provider, End]:
                    varlist = []
                    append(([], line))
                elif type(line) in [Endif, End_select]:
                    old_ifvars.append(list(ifvars))
                    old_elsevars.append(list(elsevars))
                    old_varlist.append(list(varlist))
                    varlist = []
                    append(([], line))
                elif type(line) == Else:
                    elsevars += list(varlist)
                    append((varlist, line))
                    varlist = []
                elif type(line) in [Elseif, Case]:
                    ifvars += list(varlist)
                    append((varlist, line))
                    if vars != []:
                        varlist = old_varlist.pop()
                        varlist += vars
                        old_varlist.append(list(varlist))
                    varlist = []
                elif type(line) in [If, Select]:
                    ifvars += list(varlist)
                    append((varlist, line))
                    vars += filter(lambda x: x in elsevars, ifvars)
                    ifvars = old_ifvars.pop()
                    elsevars = old_elsevars.pop()
                    varlist = old_varlist.pop() + vars
                elif type(line) in [
                        Begin_provider, Program, Subroutine, Function
                ]:
                    varlist += vars
                    append((varlist, line))
                    if old_varlist != [] \
                     or old_ifvars != [] \
                     or old_elsevars != []:
                        error.fail(line, "End if missing")
                    varlist = []
                elif type(line) == Provide_all:
                    append((vars, line))
                else:
                    varlist += vars
                    append(([], line))
        except:
            error.fail(line, "Unable to parse file")

        result.reverse()

        # 2nd pass
        text = result
        result = []
        append = result.append
        old_varlist = []
        varlist = []
        try:
            for vars, line in text:
                if vars != []:
                    vars = make_single(vars)
                if type(line) in [
                        Begin_provider, Program, Subroutine, Function
                ]:
                    varlist = list(vars)
                elif type(line) in [If, Select]:
                    old_varlist.append(varlist)
                    vars = filter(lambda x: x not in varlist, vars)
                    varlist = make_single(varlist + vars)
                    assert old_varlist is not varlist
                elif type(line) in [Elseif, Else, Case]:
                    varlist = old_varlist.pop()
                    old_varlist.append(varlist)
                    vars = filter(lambda x: x not in varlist, vars)
                    varlist = make_single(varlist + vars)
                    assert old_varlist is not varlist
                elif type(line) in [Endif, End_select]:
                    varlist = old_varlist.pop()
                elif type(line) == Provide_all:
                    vars += varlist
                elif type(line) in [End_provider, End]:
                    assert old_varlist == []
                    varlist = []
                for v in vars[:]:
                    if v[0] == '-':
                        vars.remove(v)
                        vars.remove(v[1:])
                result.append((vars, line))
        except:
            error.fail(line, "Unable to parse file")
        return result
示例#44
0
 def fun(main_var):
   if main_var not in variables:
     error.fail(line,"Variable %s unknown"%(main_var,))
   x = variables[main_var]
   return [main_var]+x.others
示例#45
0
def check_begin_end(text):
    '''Checks x...endx consistence'''

    filter_line = lambda line: type(line) in [ Do, Enddo, If, Endif, \
           Program, Begin_provider, End_provider, \
           Subroutine, Function, End, Begin_doc, End_doc ]
    text = filter(filter_line, text)

    d = {
        'do': Do,
        'enddo': Enddo,
        'if': If,
        'endif': Endif,
        '_doc': Begin_doc,
        'end_doc': End_doc
    }
    assert type(text) == list

    def find_matching_end_ifdo(begin, x):
        level = 1
        for i in range(begin + 1, len(text)):
            line = text[i]
            if type(line) == d[x]:
                level += 1
            elif type(line) == d["end%s" % (x, )]:
                level -= 1
                if level == 0:
                    return True
            elif type(line) in [End, End_provider]:
                break
        error.fail(text[begin], "Missing 'end%s'" % (x, ))

    def find_matching_end_subfunpro(begin, x):
        line = text[begin]
        for i in range(begin + 1, len(text)):
            line = text[i]
            if type(line) == x:
                return
            if type(line) in [Subroutine, Function, Program, Begin_provider]:
                error.fail(text[begin], type(line).str + " is not closed")
        error.fail(text[begin], type(line).str + " is not closed")

    level = 0
    for i, line in enumerate(text):
        if type(line) == Begin_doc:
            find_matching_end_ifdo(i, '_doc')
    for i, line in enumerate(text):
        if type(line) == Do:
            find_matching_end_ifdo(i, 'do')
        elif type(line) == If:
            find_matching_end_ifdo(i, 'if')
        elif type(line) in [Subroutine, Function, Program]:
            level += 1
            find_matching_end_subfunpro(i, End)
        elif type(line) == Begin_provider:
            level += 1
            find_matching_end_subfunpro(i, End_provider)
        elif type(line) == End:
            level -= 1
        elif type(line) == End_provider:
            level -= 1
        if level < 0:
            error.fail(line, "Beginning of block not matched")

    return True
示例#46
0
def get_type(i, filename, line, is_doc):
    '''Find the type of a text line'''
    assert type(i) == int
    assert type(filename) == str
    assert type(line) == str
    assert type(is_doc) == bool

    # add support for interface block
    has_interface = False

    line = line.rstrip()
    line = line.replace("$IRP_ALIGN", command_line.align)
    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_endtype.sub("endtype", lower_line)
    lower_line = re_endmodule.sub("endmodule", lower_line)
    lower_line = re_endif.sub("endif", lower_line)
    lower_line = re_endselect.sub("endselect", lower_line)
    lower_line = re_endinterface.sub("endinterface", lower_line)

    for c in """()'"[]""":
        lower_line = lower_line.replace(c, " " + 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]

    # Identify line
    if firstword == "endinterface":
        has_interface = False
        return [Simple_line(i, line, filename)], False

    if firstword == "interface" or has_interface:
        has_interface = True
        return [Simple_line(i, line, filename)], False

    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

    if firstword in simple_dict:
        return [simple_dict[firstword](i, line, filename)], is_doc

    if firstword in ["select", "selectcase"]:
        return [Select(i, line, filename)], is_doc

    if len(lower_line0) > 4:

        if firstword[0] == '#':
            result = [Simple_line(i, line, filename)]
            error.warn(
                result[0],
                """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
        elif lower_line0[1:5] in ["dec$", "dir$"] and command_line.directives:
            return [Directive(i, line, filename)], is_doc
        elif lower_line0[1:3] == "$ ":
            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

        # Detect errors
        if firstword == "dowhile":
            error.fail(Do(i, line, filename),
                       "'do while' should be in 2 words.")

    return [Simple_line(i, line, filename)], is_doc
示例#47
0
  def fail(l,a,b): error.fail(l,"In %s, %s"%(a,b))

  def get_variables(line):
示例#48
0
 def fail(l,a,b): error.fail(l,"In Begin_Shell, %s '%s'"%(a,b))
 inside = False
示例#49
0
  def func(filename, text):
    varlist = []
    result = []
    append = result.append
    for line in text: #filter(
#     lambda x: type(x) not in [ Doc, Begin_doc, End_doc ],
#     text):
      if type(line) in [ \
        Empty_line,
        Continue,
        Return,
        Begin_shell,
        End_shell,
        Openmp,
        Directive,
        Use,
        Enddo,
        End_select,
        Endif,
        Implicit,
        Program,
        Subroutine,
        Function,
        End,
      ]:
        append( ([],line) )
      elif type(line) in [ Begin_provider, Cont_provider ]:
        if type(line) == Begin_provider:
          varlist = []
        buffer = map(strip,line.lower.replace(']','').split(','))
        assert len(buffer) > 1
        v = buffer[1]
        varlist.append(v)
        variable_list = find_variables_in_line(line)
        try:
          variable_list.remove(variables[v].same_as)
        except ValueError:
          print v, variables[v].same_as
          raise
        append( (variable_list,line) )
      elif type(line) == End_provider:
        varlist = []
        append( ([],line) )
      elif type(line) == Provide:
        l = line.lower.split()[1:]
        l = filter(lambda x: x not in varlist, l)
        for v in l:
          if v not in variables:
            error.fail(line,"Variable %s is unknown"%(v))
        append( (l,Provide(line.i,"",line.filename)) )
        append( (l,Simple_line(line.i,"!%s"%(line.text),line.filename)) )
      elif type(line) == NoDep:
        l = line.lower.split()[1:]
        for v in l:
          if v not in variables:
            error.fail(line,"Variable %s is unknown"%(v))
        l = map(lambda x: "-%s"%(x), l)
        append( (l,Simple_line(line.i,"!%s"%(line.text),line.filename)) )
      elif type(line) in [ Touch, SoftTouch ]:
        vars = line.lower.split()
        if len(vars) < 2:
          error.fail(line,"Syntax error")
        vars = vars[1:]
        def fun(x):
          main = variables[x].same_as
          return main
        main_vars = make_single( map(fun, vars) )
        check_touch(line,vars,main_vars)
        txt = " ".join(vars)
        append ( (vars,Simple_line(line.i,"!",line.filename)) )
        append ( ([],Simple_line(line.i,"! >>> TOUCH %s"%(txt,),line.filename)) )
        def fun(x):
          if x not in variables:
            error.fail(line,"Variable %s unknown"%(x,))
          return [ ([],Simple_line(line.i," call touch_%s"%(x,),line.filename)),
                   ([],Use(line.i," use %s"%(variables[x].fmodule), line.filename)) ]
        result += flatten(map( fun, main_vars ))
        def fun(x):
          if x not in variables:
            error.fail(line,"Variable %s unknown"%(x,))
          return ([],Simple_line(line.i," %s_is_built = .True."%(x,),line.filename))
        result += map( fun, main_vars[:-1] )
        if type(line) == SoftTouch:
          append ( ([],Simple_line(line.i,"! <<< END TOUCH (Soft)",line.filename)) )
        else:
          append ( ([],Provide_all(line.i,"! <<< END TOUCH",line.filename)) )
      elif type(line) == Call:
        l = find_variables_in_line(line)
        l = filter(lambda x: x not in varlist, l)
        sub = find_subroutine_in_line(line)
        if sub not in subroutines:
          t = Simple_line
          append( (l,Simple_line(line.i,line.text,line.filename)) )
        else:
          append( (l,line) )
          if subroutines[sub].touches != []:
            append( ([],Provide_all(line.i,"",line.filename)) )
      elif type(line) == Free:
        vars = line.lower.split()
        vars = vars[1:]
        append( ([],Simple_line(line.i,"!%s"%(line.text),line.filename)) )
        use = map(lambda x: "  use %s"%(variables[x].fmodule),vars)
        for var in vars:
          result += map(lambda x: ([],Use(line.i,x,line.filename)),
            make_single(use))
          result += map(lambda x: ([],Simple_line(line.i,x,line.filename)),
            variables[var].free)
      elif type(line) == Irp_read:
        append( ([],Simple_line(line.i,"!%s"%(line.text),line.filename)) )
      elif type(line) == Irp_write:
        append( ([],Simple_line(line.i,"!%s"%(line.text),line.filename)) )
      elif type(line) in [ Begin_doc, End_doc, Doc ]:
        pass
      else:
        l = find_variables_in_line(line)
        l = filter(lambda x: x not in varlist, l)
        append( (l,line) )
    return result
示例#50
0
  def func(filename, text):
    result = []
    append = result.append
    # 1st pass
    varlist = []
    ifvars = []
    elsevars = []
    old_varlist = []
    old_ifvars = []
    old_elsevars = []
    revtext = list(text)
    revtext.reverse()
    try:
      for vars,line in revtext:
        if type(line) in [ End_provider,End ]:
          varlist = []
          append( ([],line) )
        elif type(line) in [ Endif, End_select ]:
          old_ifvars.append( list(ifvars) )
          old_elsevars.append( list(elsevars) )
          old_varlist.append( list(varlist) )
          varlist = []
          append( ([],line) )
        elif type(line) == Else:
          elsevars += list(varlist)
          append( (varlist,line) )
          varlist = []
        elif type(line) in [ Elseif, Case ]:
          ifvars += list(varlist)
          append( (varlist,line) )
          if vars != []:
            varlist = old_varlist.pop()
            varlist += vars
            old_varlist.append( list(varlist) )
          varlist = []
        elif type(line) in [ If, Select ]:
          ifvars += list(varlist)
          append( (varlist,line) )
          vars += filter(lambda x: x in elsevars, ifvars)
          ifvars = old_ifvars.pop()
          elsevars = old_elsevars.pop()
          varlist = old_varlist.pop() + vars
        elif type(line) in [ Begin_provider, Program, Subroutine, Function ]:
          varlist += vars
          append( (varlist,line) )
          if old_varlist != [] \
           or old_ifvars != [] \
           or old_elsevars != []:
            error.fail(line,"End if missing")
          varlist = []
        elif type(line) in (Provide,Provide_all):
          append( (vars,line) )
        else:
          varlist += vars
          append( ([],line) )
    except:
      error.fail(line,"Unable to parse file")

    result.reverse()

    # 2nd pass
    text = result
    result = []
    append = result.append
    old_varlist = []
    varlist = []
    try:
      for vars,line in text:
        if vars != []:
          vars = make_single(vars)
        if type(line) in [ Begin_provider, Program, Subroutine, Function ]:
          varlist = list(vars)
        elif type(line) in [ If, Select ]:
          old_varlist.append(varlist)
          vars = filter(lambda x: x not in varlist,vars)
          varlist = make_single(varlist + vars)
          assert old_varlist is not varlist
        elif type(line) in [ Elseif, Else, Case ]:
          varlist = old_varlist.pop()
          old_varlist.append(varlist)
          vars = filter(lambda x: x not in varlist,vars)
          varlist = make_single(varlist + vars)
          assert old_varlist is not varlist
        elif type(line) in [ Endif, End_select ]:
          varlist = old_varlist.pop()
        elif type(line) == Provide_all:
          vars += varlist
        elif type(line) in [ End_provider, End ]:
          assert old_varlist == []
          varlist = []
        for v in vars[:]:
          if v[0] == '-':
            vars.remove(v)
            vars.remove(v[1:])
        result.append( (vars,line) )
    except:
      error.fail(line,"Unable to parse file")
    return result
示例#51
0
 def fun(x):
   if x not in variables:
     error.fail(line,"Variable %s unknown"%(x,))
   return [ ([],Simple_line(line.i," call touch_%s"%(x,),line.filename)),
            ([],Use(line.i," use %s"%(variables[x].fmodule), line.filename)) ]
示例#52
0
 def fun(main_var):
     if main_var not in variables:
         error.fail(line, "Variable %s unknown" % (main_var, ))
     x = variables[main_var]
     return [main_var] + x.others
示例#53
0
 def fun(x):
   if x not in variables:
     error.fail(line,"Variable %s unknown"%(x,))
   return ([],Simple_line(line.i," %s_is_built = .True."%(x,),line.filename))