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