summaryrefslogblamecommitdiffstats
path: root/tester/covoar/ConfigFile.cc
blob: 7109b2ce8483305c80533e75bb6f3e050a99a542 (plain) (tree)
1
2
3
4
5
6
7
8
9








                                                                  

                  









                                                                             













                               
                               


                                               




                            



                    

                                                           


                   


                                                                    



                   
                                                



                 



                                                                   































                                                        
                          

                 

                                                         






                                                      
                                                 








                                           
                      
                             
                                                 



                                        
                                                 










































                                           
                                                                             


     

/*! @file ConfigFile.cc
 *  @brief ConfigFile Implementation
 *
 *  This file contains the implementation of the FileReader class.
 */

#include "ConfigFile.h"
#include <string.h>
#include <ctype.h>

#include <iostream>
#include <fstream>
#include <sstream>

static void print_invalid_line_number( const std::string& file, int line_no )
{
  std::cerr << file << ": line" << line_no << " is invalid: " << line
            << std::endl;
}

namespace Configuration {

  FileReader::FileReader(
    Options_t *options
  )
  {
    options_m = options;
  }

  FileReader::~FileReader()
  {
  }

  bool FileReader::processFile(
    const std::string&     file
  )
  {
    #define METHOD "FileReader::processFile - "
    #define MAX_LENGTH 256
    std::ifstream in;
    std::string line;
    char option[MAX_LENGTH];
    char value[MAX_LENGTH];
    int     line_no;
    int     i;
    int     j;

    if ( file.empty() ) {
      std::cerr << METHOD << "Empty filename" << std::endl;
      return false;
    }

    in.open( file );
    if ( !in.is_open() ) {
      std::cerr << METHOD << "unable to open " << file << std::endl;
      return false;
    }

    line_no = 0;
    while ( std::getline( line, MAX_LENGTH ) ) {
      int length;

      line_no++;

      length = (int) line.length();
      if ( length > MAX_LENGTH ) {
        std::cerr << file << ": line " << line_no << " is too long"
                  << std::endl;
        continue;
      }

      line[length - 1] = '\0';
      length--;

      /*
       *  Strip off comments at end of line
       *
       *      LHS = RHS   # comment
       */
      for (i=0 ; i<length ; i++ ) {
        if ( line[i] == '#' ) {
          line[i] = '\0';
          length = i;
          break;
        }
      }

      /*
       *  Strip off trailing white space
       */
      for (i=length-1 ; i>=0 && isspace(line[i]) ; i-- )
        ;

      line[i+1] = '\0';
      length = i+1;

      /* Ignore empty lines.  We have stripped
       * all comments and blanks therefore, only
       * an empty string needs to be checked.
       */
      if (line[0] == '\0')
        continue;

      if (std::sscanf(line.c_str(), "%s", option) != 1) {
        print_invalid_line_number(file, line_no);
        continue;
      }

      for (i=0; ((line[i] != '=') && (i<length)); i++)
        ;

      if (i == length) {
        print_invalid_line_number(file, line_no);
        continue;
      }

      i++;
      value[0] = '\0';
      while ( isspace(line[i]) )
        i++;
      for (j=0; line[i] != '\0'; i++, j++ )
        value[j] = line[i];
      value[j] = '\0';
      if (value[0] == '\0') {
        print_invalid_line_number(file, line_no);
        continue;
      }

      if ( !setOption(option, value) ) {
        print_invalid_line_number(file, line_no);
        continue;
      }

    }

    return false;
  }

  bool FileReader::setOption(
    const char* const option,
    const char* const value
  )
  {
    Options_t *o;

    for ( o=options_m ; o->option ; o++ ) {
      if ( !strcmp( o->option, option ) ) {
        o->value = strdup( value );
        return true;
      }
    }
    return false;
  }

  const char *FileReader::getOption(
    const char* const option
  )
  {
    Options_t *o;

    for ( o=options_m ; o->option ; o++ ) {
      if ( !strcmp( o->option, option ) ) {
        return o->value;
      }
    }
    return NULL;
  }

  void FileReader::printOptions(void)
  {
    Options_t *o;

    for ( o=options_m ; o->option ; o++ ) {
      std::cerr << '(' << o->option << ")=(" << o->value << ')' << std::endl;
    }
  }
}