Exemplo n.º 1
0
def setSourceProcessingFlags(config):
    # set outputFormat explicitly if format or output file are supplied by user.
    # otherwise, outputFormat is set to inputFormat during parsing
    if config.outputFormat == None:
        if config.outputFile:
            ext = os.path.splitext(config.outputFile)[1]
            config.outputFormat = Ffile.get_format(ext)
            setOutputFormat(config.outputFormat)
    elif (config.outputFormat <> 'fixed') and (config.outputFormat <> 'free'):
        opt.error(
            "outputFormat option must be specified with either 'fixed' or 'free' as an argument"
        )
    else:
        setOutputFormat(config.outputFormat)
    if config.outputLineLength:
        setOutputLineLength(config.outputLineLength)
    if config.inputLineLength:
        setInputLineLength(config.inputLineLength)
    # set symtab type defaults
    Symtab.setTypeDefaults((fs.RealStmt, []), (fs.IntegerStmt, []))
    # parse info units
    if config.infoUnitFile:
        from PyFort.fortUnit import fortUnitIterator
        for aUnit in fortUnitIterator(config.infoUnitFile, config.inputFormat):
            # need to parse this so the type information is available, but do not modify or print units
            pass
    # set verbosity
    DebugManager.setVerbose(config.isVerbose)
    DebugManager.setQuiet(config.noWarnings)
    DebugManager.setCheck(config.check)
def main():
    global ourOutFileNameList
    global ourOutFileHandle
    usage = '%prog [options] <input_file> [additional input files]'
    opt = OptionParser(usage=usage)
    addPostProcessorOptions(opt)

    try:
        config, args = opt.parse_args()

        startTime = None
        if (config.timing):
            startTime = datetime.datetime.utcnow()

        PostProcessorOptErrors(opt, config, args)
        setPostProcessFlags(config, args)

        ActiveTypeHelper.setPlaceholderActiveType(
            UnitPostProcessor._replacement_type)
        ActiveTypeHelper.setPlaceholderActiveType(
            UnitPostProcessor._abstract_type)

        # set options for splitting compile units
        if config.width:
            splitUnits = True
            unitNameWidth = config.width
        else:
            splitUnits = False
        DebugManager.debug("running for <input_file>:" + args[0] +
                           " and the following options: " + str(config))

        inputFile = args[0]
        initTriples = caselessDict()
        initModuleNames = set()
        if splitUnits:
            (base, ext) = os.path.splitext(inputFile)
            unitNumExt = "%0" + str(unitNameWidth) + "d"
            unit_num = 0
            unitStartTime = None
            if (config.timing):
                unitStartTime = datetime.datetime.utcnow()
            for aUnit in fortUnitIterator(inputFile, config.inputFormat):
                if (config.explicitInit or config.activeVariablesFile):
                    UnitPostProcessor(aUnit).getInitDecls(
                        initTriples, initModuleNames)
                outputFile = base + unitNumExt % unit_num + ext
                unit_num += 1
                ourOutFileHandle = open(outputFile, 'w')
                ourOutFileNameList.append(outputFile)
                UnitPostProcessor(aUnit).processUnit().printit(
                    ourOutFileHandle)
                ourOutFileHandle.close()
                globalTypeTable.cleanUpUnitTypeEntries()
                globalTypeTable.verifyTypeEntries()
                if (config.progress):
                    msg = 'SourceProcessing: PROGRESS: done  with unit ' + aUnit.uinfo.name
                    if (config.timing):
                        nTime = datetime.datetime.utcnow()
                        msg += ' took: ' + str(nTime - unitStartTime)
                        unitStartTime = nTime
                    print msg
            # add new init procedures & global init procedure at end
            if (config.explicitInit):
                addInitProcedures(initTriples,initModuleNames,base=base,unitNumExt=unitNumExt,\
                                      unit_num=unit_num,ext=ext,splitUnits=splitUnits)

            makeOut = open('postProcess.make', 'w')
            makeOut.write("POSTPROCESSEDFILES=")
            for outFileName in ourOutFileNameList:
                makeOut.write(" \\\n" + outFileName)
            makeOut.write("\n")
            makeOut.close()
        # SEPARATE OUTPUT INTO FILES AS SPECIFIED BY PRAGMAS
        elif config.separateOutput:
            ourOutFileHandle = None
            setFormat = False
            if config.outputFormat == None:
                setFormat = True
            unitStartTime = None
            if (config.timing):
                unitStartTime = datetime.datetime.utcnow()
            for aUnit in fortUnitIterator(inputFile, config.inputFormat):
                if (config.progress):
                    print 'SourceProcessing: PROGRESS: start with unit ' + aUnit.uinfo.name
                if (config.explicitInit or config.activeVariablesFile):
                    UnitPostProcessor(aUnit).getInitDecls(
                        initTriples, initModuleNames)
                # We expect to find file pragmas in the cmnt section of units exclusively
                if aUnit.cmnt:
                    if (re.search('openad xxx file_start', aUnit.cmnt.rawline,
                                  re.IGNORECASE)):
                        # close the previous output file (if any)
                        if ourOutFileHandle: ourOutFileHandle.close()
                        # extract the new output file location (and add path and filename suffixes)
                        (head, tail) = os.path.split(
                            aUnit.cmnt.rawline.split('start [')[1].split(']')
                            [0])
                        (fileName, fileExtension) = os.path.splitext(tail)
                        outputDirectory = config.pathPrefix + head + config.pathSuffix
                        if outputDirectory == '': outputDirectory = './'
                        if not os.path.exists(outputDirectory):
                            os.makedirs(outputDirectory)
                        if (not setFormat):
                            fileExtension = Ffile.get_extension(
                                config.outputFormat)
                        else:
                            config.outputFormat = Ffile.get_format(
                                fileExtension)
                            setOutputFormat(config.outputFormat)
                        newOutputFile = os.path.join(
                            outputDirectory,
                            fileName + config.filenameSuffix + fileExtension)
                        ourOutFileNameList.append(newOutputFile)
                        ourOutFileHandle = open(newOutputFile, 'w')
                elif not ourOutFileHandle:
                    raise PostProcessError(
                        'option separateOutput specified, no output file can be determined for the first unit',
                        0)
                # postprocess the unit and print it
                UnitPostProcessor(aUnit).processUnit().printit(
                    ourOutFileHandle)
                globalTypeTable.cleanUpUnitTypeEntries()
                globalTypeTable.verifyTypeEntries()
                if (config.progress):
                    msg = 'SourceProcessing: PROGRESS: done  with unit ' + aUnit.uinfo.name
                    if (config.timing):
                        nTime = datetime.datetime.utcnow()
                        msg += ' took: ' + str(nTime - unitStartTime)
                        unitStartTime = nTime
                    print msg
            # add new init procedures & global init procedure after module declarations
            if (config.explicitInit):
                addInitProcedures(initTriples, initModuleNames,
                                  ourOutFileHandle)
            ourOutFileHandle.close()
        else:
            ourOutFileHandle = None
            if config.outputFile:
                ourOutFileHandle = open(config.outputFile, 'w')
                ourOutFileNameList.append(config.outputFile)
            else:
                ourOutFileHandle = sys.stdout
            for aUnit in fortUnitIterator(inputFile, config.inputFormat):
                if (config.explicitInit or config.activeVariablesFile):
                    UnitPostProcessor(aUnit).getInitDecls(
                        initTriples, initModuleNames)
                UnitPostProcessor(aUnit).processUnit().printit(
                    ourOutFileHandle)
                globalTypeTable.cleanUpUnitTypeEntries()
                globalTypeTable.verifyTypeEntries()
                # add new init procedures & global init procedure after module declarations
            if (config.explicitInit):
                addInitProcedures(initTriples, initModuleNames,
                                  ourOutFileHandle)
            if config.outputFile:
                ourOutFileHandle.close()

        UnitPostProcessor.activeDecls(initTriples, initModuleNames)

        if (config.timing):
            print 'SourceProcessing: timing: ' + str(
                datetime.datetime.utcnow() - startTime)

    except (PostProcessError, UserError, AssemblerException,
            ListAssemblerException, ParseError, LogicError, ScanError), e:
        sys.stderr.write(str(e) + '\n')
        cleanup(config)
        return 1