75{
76 bool success(true);
77
79 m_tree =
new MiniConfigTreeNode(
"global", 0 );
81 MiniConfigTreeNode* node =
m_tree;
82
85 std::cerr << "MiniConfig::ReadFile(): "
86 <<
"cannot read from file: " <<
fileName <<
"\n";
87 return false;
88 }
89
95 std::string att;
97 int skipCount(0);
98 int lineNumber = 0;
99
100 while( getline(
file,line) ) {
101 ++lineNumber;
102 std::istringstream linestream(line);
104
105 while( linestream.get(c) ) {
106
107 if( !isspace(c) ) {
108 break;
109 }
110 }
111
112
113 if( c == 0 || isspace(c) ) {
114 continue;
115 }
116
117
118 if( c == '#' ) {
119 continue;
120 }
121
122 linestream.putback(c);
123
124
126 if( !linestream ) {
127 std::cerr << "MiniConfig::ReadFile(): "
128 <<
"badly formatted line: \"" <<
line <<
"\", line number " << lineNumber <<
"\n";
129 success = false;
130 continue;
131 }
132 if( sep == "}" ) {
133 if( skipCount > 0 ) {
134 --skipCount;
135 }
136 else {
137 node = node->GetParent();
138 if( node == 0 ) {
139 std::cerr << "MiniConfig::ReadFile(): "
140 << "unmatched \"}\", line number " << lineNumber << "\n";
141 success = false;
143 }
144 }
145 continue;
146 }
147
148
151 if( !linestream ) {
152 std::cerr << "MiniConfig::ReadFile(): "
153 <<
"badly formatted line: \"" <<
line <<
"\", line number " << lineNumber <<
"\n";
154 success = false;
155 continue;
156 }
157 if( sep == "=" ) {
158 val =
line.substr(linestream.tellg(), std::string::npos);
159 boost::trim(val);
160
161 if(
val.size() == 0 ) {
162 std::cerr << "MiniConfig::ReadFile(): "
163 <<
"badly formatted line: \"" <<
line <<
"\", line number " << lineNumber <<
"\n";
164 success = false;
165 continue;
166 }
167 if( skipCount == 0 ) {
168 node->SetAttribute( att, val, false );
169 }
170 continue;
171 }
172
173
175
176
177
178
179 std::string lokey =
key;
180 std::ranges::transform(lokey, lokey.begin(), [](unsigned char c) { return std::tolower(c); });
183 if( !linestream ) {
184 std::cerr << "MiniConfig::ReadFile(): "
185 <<
"badly formatted line: \"" <<
line <<
"\", line number " << lineNumber <<
"\n";
186 success = false;
187 continue;
188 }
189 if( sep == "{" ) {
192 node = node->GetNewDaughter( id );
193 }
196 node->SetAttribute( id, node->GetPathName(), true );
197 node = node->GetNewDaughter( id );
198 }
199 else {
200 skipCount++;
201 }
202 continue;
203 }
204
205 std::cerr << "MiniConfig::ReadFile(): "
206 <<
"badly formatted line: \"" <<
line <<
"\", line number " << lineNumber <<
"\n";
207 success = false;
208 }
209
210 return success;
211}