Example #1
0
bool Simulator::parseMetaData()
{
    string lineBuffer;
    string filePath = configurationData.filePath;
    int hardwareCycleTime;
    bool doneParsing = false;
    Program program;

    const string BEGIN_SIMULATOR_STRING = "S(start)0";
    const string END_SIMULATOR_STRING   = "S(end)0.";
    const string BEGIN_PROGRAM_STRING   = "A(start)0";
    const string END_PROGRAM_STRING     = "A(end)0";

    // Open the file for reading
    ifstream inFile( filePath.c_str() );
    if( inFile.fail() )
    {
        cerr << "Error! Failed to open Meta-Data file." << endl;
        return false;
    }

    // Check first line
    getline( inFile, lineBuffer );
    if( lineBuffer != "Start Program Meta-Data Code:" )
    {
        cerr << "Error! Invalid Meta-Data file." << endl;
        if( inFile.is_open() )
        {
            inFile.close();
        }
        return false;
    }

    // Get each token delimited by semicolons
    while( !doneParsing )
    {
        // Ignore whitespace
        inFile >> std::ws;

        // Get the next operation
        getline( inFile, lineBuffer, ';' );

        // Check if at the end
        doneParsing = lineBuffer.find( END_SIMULATOR_STRING ) != string::npos;

        if( lineBuffer == BEGIN_PROGRAM_STRING )
        {
            program.clear_operations();
            hardwareCycleTime = 0;
            program.add_operation( lineBuffer, 0 );
        }
        else if( lineBuffer == END_PROGRAM_STRING )
        {
            program.add_operation( lineBuffer, 0 );
            programs_.push_back( program );
            programs_.back().prepare();
        }
        else if( ( lineBuffer != BEGIN_SIMULATOR_STRING ) && !doneParsing )
        {
            if( lineBuffer.find( "printer" ) != string::npos )
            {
                hardwareCycleTime = configurationData.printerCycleTime;
            }
            else if( lineBuffer.find( "monitor" ) != string::npos )
            {
                hardwareCycleTime = configurationData.monitorDisplayTime;
            }
            else if( lineBuffer.find( "keyboard" ) != string::npos )
            {
                hardwareCycleTime = configurationData.keyboardCycleTime;
            }
            else if( lineBuffer.find( "run" ) != string::npos )
            {
                hardwareCycleTime = configurationData.processorCycleTime;
            }
            else if( lineBuffer.find( "hard drive" ) != string::npos )
            {
                hardwareCycleTime = configurationData.hardDriveCycleTime;
            }
            else
            {
                cerr << "Error! Invalid Meta-Data file. "
                    << "Could not set operation hardware cycle!" << endl;

                if(inFile.is_open())
                {
                    inFile.close();
                }
                return false;
            }

            program.add_operation( lineBuffer, hardwareCycleTime );
        }

    }

    // Close the file
    if(inFile.is_open())
    {
        inFile.close();
    }

    return true;
}