1*3cd96b95SAndrew Rist /************************************************************** 2*3cd96b95SAndrew Rist * 3*3cd96b95SAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one 4*3cd96b95SAndrew Rist * or more contributor license agreements. See the NOTICE file 5*3cd96b95SAndrew Rist * distributed with this work for additional information 6*3cd96b95SAndrew Rist * regarding copyright ownership. The ASF licenses this file 7*3cd96b95SAndrew Rist * to you under the Apache License, Version 2.0 (the 8*3cd96b95SAndrew Rist * "License"); you may not use this file except in compliance 9*3cd96b95SAndrew Rist * with the License. You may obtain a copy of the License at 10*3cd96b95SAndrew Rist * 11*3cd96b95SAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0 12*3cd96b95SAndrew Rist * 13*3cd96b95SAndrew Rist * Unless required by applicable law or agreed to in writing, 14*3cd96b95SAndrew Rist * software distributed under the License is distributed on an 15*3cd96b95SAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16*3cd96b95SAndrew Rist * KIND, either express or implied. See the License for the 17*3cd96b95SAndrew Rist * specific language governing permissions and limitations 18*3cd96b95SAndrew Rist * under the License. 19*3cd96b95SAndrew Rist * 20*3cd96b95SAndrew Rist *************************************************************/ 21*3cd96b95SAndrew Rist 22cdf0e10cSrcweir #include <unicode/regex.h> 23cdf0e10cSrcweir #include <unicode/unistr.h> 24cdf0e10cSrcweir #include <string> 25cdf0e10cSrcweir #include <fstream> 26cdf0e10cSrcweir #include <iostream> 27cdf0e10cSrcweir #include "inireader.hxx" 28cdf0e10cSrcweir 29cdf0e10cSrcweir using namespace std; 30cdf0e10cSrcweir namespace transex3 31cdf0e10cSrcweir { 32cdf0e10cSrcweir 33cdf0e10cSrcweir bool INIreader::read( INImap& myMap , string& filename ) 34cdf0e10cSrcweir { 35cdf0e10cSrcweir ifstream aFStream( filename.c_str() ); 36cdf0e10cSrcweir if( aFStream && aFStream.is_open()) 37cdf0e10cSrcweir { 38cdf0e10cSrcweir string line; 39cdf0e10cSrcweir string section; 40cdf0e10cSrcweir string param_key; 41cdf0e10cSrcweir string param_value; 42cdf0e10cSrcweir stringmap* myvalues = 0; 43cdf0e10cSrcweir 44cdf0e10cSrcweir while( std::getline( aFStream , line ) ) 45cdf0e10cSrcweir { 46cdf0e10cSrcweir trim( line ); 47cdf0e10cSrcweir if( line.empty() ){ 48cdf0e10cSrcweir } 49cdf0e10cSrcweir else if( is_section( line , section ) ) 50cdf0e10cSrcweir { 51cdf0e10cSrcweir //cerr << "[" << section << "]\n"; 52cdf0e10cSrcweir myvalues = new stringmap(); 53cdf0e10cSrcweir myMap[ section ] = myvalues ; 54cdf0e10cSrcweir } 55cdf0e10cSrcweir else if ( is_parameter( line , param_key , param_value ) ) 56cdf0e10cSrcweir { 57cdf0e10cSrcweir //cerr << "" << param_key << " = " << param_value << "\n"; 58cdf0e10cSrcweir if( myvalues ) 59cdf0e10cSrcweir { 60cdf0e10cSrcweir (*myvalues)[ param_key ] = param_value ; 61cdf0e10cSrcweir } 62cdf0e10cSrcweir else 63cdf0e10cSrcweir { 64cdf0e10cSrcweir cerr << "ERROR: The INI file " << filename << " appears to be broken ... parameters without a section?!?\n"; 65cdf0e10cSrcweir if( aFStream.is_open() ) aFStream.close(); 66cdf0e10cSrcweir return false; 67cdf0e10cSrcweir } 68cdf0e10cSrcweir } 69cdf0e10cSrcweir } 70cdf0e10cSrcweir 71cdf0e10cSrcweir if( aFStream.is_open() ) 72cdf0e10cSrcweir aFStream.close(); 73cdf0e10cSrcweir 74cdf0e10cSrcweir return true; 75cdf0e10cSrcweir } 76cdf0e10cSrcweir else 77cdf0e10cSrcweir { 78cdf0e10cSrcweir cerr << "ERROR: Can't open file '" << filename << "'\n"; 79cdf0e10cSrcweir } 80cdf0e10cSrcweir return false; 81cdf0e10cSrcweir } 82cdf0e10cSrcweir 83cdf0e10cSrcweir bool INIreader::is_section( string& line , string& section_str ) 84cdf0e10cSrcweir { 85cdf0e10cSrcweir // Error in regex ? 86cdf0e10cSrcweir check_status( section_status ); 87cdf0e10cSrcweir UnicodeString target( line.c_str() , line.length() ); 88cdf0e10cSrcweir 89cdf0e10cSrcweir section_match->reset( target ); 90cdf0e10cSrcweir check_status( section_status ); 91cdf0e10cSrcweir 92cdf0e10cSrcweir if( section_match->find() ) 93cdf0e10cSrcweir { 94cdf0e10cSrcweir check_status( section_status ); 95cdf0e10cSrcweir UnicodeString result( section_match->group( 1 , section_status) ); 96cdf0e10cSrcweir check_status( section_status ); 97cdf0e10cSrcweir toStlString( result , section_str ); 98cdf0e10cSrcweir 99cdf0e10cSrcweir return true; 100cdf0e10cSrcweir } 101cdf0e10cSrcweir return false; 102cdf0e10cSrcweir } 103cdf0e10cSrcweir 104cdf0e10cSrcweir bool INIreader::is_parameter( string& line , string& parameter_key , string& parameter_value ) 105cdf0e10cSrcweir { 106cdf0e10cSrcweir // Error in regex ? 107cdf0e10cSrcweir check_status( parameter_status ); 108cdf0e10cSrcweir UnicodeString target( line.c_str() , line.length() ); 109cdf0e10cSrcweir 110cdf0e10cSrcweir parameter_match->reset( target ); 111cdf0e10cSrcweir check_status( parameter_status ); 112cdf0e10cSrcweir 113cdf0e10cSrcweir if( parameter_match->find() ) 114cdf0e10cSrcweir { 115cdf0e10cSrcweir check_status( parameter_status ); 116cdf0e10cSrcweir 117cdf0e10cSrcweir UnicodeString result1( parameter_match->group( 1 , parameter_status) ); 118cdf0e10cSrcweir check_status( parameter_status ); 119cdf0e10cSrcweir toStlString( result1 , parameter_key ); 120cdf0e10cSrcweir UnicodeString result2( parameter_match->group( 2 , parameter_status) ); 121cdf0e10cSrcweir check_status( parameter_status ); 122cdf0e10cSrcweir toStlString( result2 , parameter_value ); 123cdf0e10cSrcweir 124cdf0e10cSrcweir return true; 125cdf0e10cSrcweir } 126cdf0e10cSrcweir return false; 127cdf0e10cSrcweir } 128cdf0e10cSrcweir 129cdf0e10cSrcweir void INIreader::check_status( UErrorCode status ) 130cdf0e10cSrcweir { 131cdf0e10cSrcweir if( U_FAILURE( status) ) 132cdf0e10cSrcweir { 133cdf0e10cSrcweir cerr << "Error in or while using regex: " << u_errorName( status ) << "\n"; 134cdf0e10cSrcweir exit(-1); 135cdf0e10cSrcweir } 136cdf0e10cSrcweir } 137cdf0e10cSrcweir 138cdf0e10cSrcweir void INIreader::toStlString( const UnicodeString& str , string& stl_str) 139cdf0e10cSrcweir { 140cdf0e10cSrcweir // convert to string 141cdf0e10cSrcweir char* buffer = new char[ str.length()*3 ]; 142cdf0e10cSrcweir str.extract( 0 , str.length() , buffer ); 143cdf0e10cSrcweir stl_str = string( buffer ); 144cdf0e10cSrcweir delete [] buffer; 145cdf0e10cSrcweir } 146cdf0e10cSrcweir 147cdf0e10cSrcweir void INIreader::trim( string& str ) 148cdf0e10cSrcweir { 149cdf0e10cSrcweir string str1 = str.substr( 0 , str.find_last_not_of(' ') + 1 ); 150cdf0e10cSrcweir str = str1.empty() ? str1 : str1.substr( str1.find_first_not_of(' ') ); 151cdf0e10cSrcweir } 152cdf0e10cSrcweir 153cdf0e10cSrcweir } 154