blob: 1fbefd1133d816d4117c2810845c1f0c5f5bd2c9 (
plain) (
tree)
|
|
/*! @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()
{
Options_t *o;
for ( o = options_m; o->option; o++ ) {
std::cerr << '(' << o->option << ")=(" << o->value << ')' << std::endl;
}
}
}
|