xref: /AOO41X/main/l10ntools/source/inireader.cxx (revision 3cd96b95fb0ad23ccdd883f9b15a685c459d45ca)
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