blob: f6a424129a7d0093a1ac7587f9b5000c45dfbbb7 [file] [log] [blame]
/**************************************************************
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*************************************************************/
#include <unicode/regex.h>
#include <unicode/unistr.h>
#include <string>
#include <fstream>
#include <iostream>
#include "inireader.hxx"
using namespace std;
namespace transex3
{
bool INIreader::read( INImap& myMap , string& filename )
{
ifstream aFStream( filename.c_str() );
if( aFStream && aFStream.is_open())
{
string line;
string section;
string param_key;
string param_value;
stringmap* myvalues = 0;
while( std::getline( aFStream , line ) )
{
trim( line );
if( line.empty() ){
}
else if( is_section( line , section ) )
{
//cerr << "[" << section << "]\n";
myvalues = new stringmap();
myMap[ section ] = myvalues ;
}
else if ( is_parameter( line , param_key , param_value ) )
{
//cerr << "" << param_key << " = " << param_value << "\n";
if( myvalues )
{
(*myvalues)[ param_key ] = param_value ;
}
else
{
cerr << "ERROR: The INI file " << filename << " appears to be broken ... parameters without a section?!?\n";
if( aFStream.is_open() ) aFStream.close();
return false;
}
}
}
if( aFStream.is_open() )
aFStream.close();
return true;
}
else
{
cerr << "ERROR: Can't open file '" << filename << "'\n";
}
return false;
}
bool INIreader::is_section( string& line , string& section_str )
{
// Error in regex ?
check_status( section_status );
UnicodeString target( line.c_str() , line.length() );
section_match->reset( target );
check_status( section_status );
if( section_match->find() )
{
check_status( section_status );
UnicodeString result( section_match->group( 1 , section_status) );
check_status( section_status );
toStlString( result , section_str );
return true;
}
return false;
}
bool INIreader::is_parameter( string& line , string& parameter_key , string& parameter_value )
{
// Error in regex ?
check_status( parameter_status );
UnicodeString target( line.c_str() , line.length() );
parameter_match->reset( target );
check_status( parameter_status );
if( parameter_match->find() )
{
check_status( parameter_status );
UnicodeString result1( parameter_match->group( 1 , parameter_status) );
check_status( parameter_status );
toStlString( result1 , parameter_key );
UnicodeString result2( parameter_match->group( 2 , parameter_status) );
check_status( parameter_status );
toStlString( result2 , parameter_value );
return true;
}
return false;
}
void INIreader::check_status( UErrorCode status )
{
if( U_FAILURE( status) )
{
cerr << "Error in or while using regex: " << u_errorName( status ) << "\n";
exit(-1);
}
}
void INIreader::toStlString( const UnicodeString& str , string& stl_str)
{
// convert to string
char* buffer = new char[ str.length()*3 ];
str.extract( 0 , str.length() , buffer );
stl_str = string( buffer );
delete [] buffer;
}
void INIreader::trim( string& str )
{
string str1 = str.substr( 0 , str.find_last_not_of(' ') + 1 );
str = str1.empty() ? str1 : str1.substr( str1.find_first_not_of(' ') );
}
}