1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski *
3*b1cdbd2cSJim Jagielski * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski * or more contributor license agreements. See the NOTICE file
5*b1cdbd2cSJim Jagielski * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski * regarding copyright ownership. The ASF licenses this file
7*b1cdbd2cSJim Jagielski * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski * with the License. You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski *
11*b1cdbd2cSJim Jagielski * http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski *
13*b1cdbd2cSJim Jagielski * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski * KIND, either express or implied. See the License for the
17*b1cdbd2cSJim Jagielski * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski * under the License.
19*b1cdbd2cSJim Jagielski *
20*b1cdbd2cSJim Jagielski *************************************************************/
21*b1cdbd2cSJim Jagielski
22*b1cdbd2cSJim Jagielski
23*b1cdbd2cSJim Jagielski
24*b1cdbd2cSJim Jagielski // MARKER(update_precomp.py): autogen include statement, do not remove
25*b1cdbd2cSJim Jagielski #include "precompiled_soltools.hxx"
26*b1cdbd2cSJim Jagielski
27*b1cdbd2cSJim Jagielski #include <gi_parse.hxx>
28*b1cdbd2cSJim Jagielski
29*b1cdbd2cSJim Jagielski #include <stdio.h>
30*b1cdbd2cSJim Jagielski #include <string.h>
31*b1cdbd2cSJim Jagielski #include <fstream>
32*b1cdbd2cSJim Jagielski #include <gilacces.hxx>
33*b1cdbd2cSJim Jagielski
34*b1cdbd2cSJim Jagielski
35*b1cdbd2cSJim Jagielski using namespace std;
36*b1cdbd2cSJim Jagielski
37*b1cdbd2cSJim Jagielski
38*b1cdbd2cSJim Jagielski const char * C_sLineEnd = "\r\n";
39*b1cdbd2cSJim Jagielski
40*b1cdbd2cSJim Jagielski
41*b1cdbd2cSJim Jagielski
42*b1cdbd2cSJim Jagielski inline void
WriteStr(ostream & o_rOut,const Simstr & i_rStr)43*b1cdbd2cSJim Jagielski WriteStr( ostream & o_rOut, const Simstr & i_rStr )
44*b1cdbd2cSJim Jagielski {
45*b1cdbd2cSJim Jagielski o_rOut.write( i_rStr.str(), i_rStr.l() );
46*b1cdbd2cSJim Jagielski }
47*b1cdbd2cSJim Jagielski
48*b1cdbd2cSJim Jagielski inline void
WriteStr(ostream & o_rOut,const char * i_rStr)49*b1cdbd2cSJim Jagielski WriteStr( ostream & o_rOut, const char * i_rStr )
50*b1cdbd2cSJim Jagielski {
51*b1cdbd2cSJim Jagielski o_rOut.write( i_rStr, strlen(i_rStr) );
52*b1cdbd2cSJim Jagielski }
53*b1cdbd2cSJim Jagielski
54*b1cdbd2cSJim Jagielski inline void
SetError(E_Error i_eError)55*b1cdbd2cSJim Jagielski GenericInfo_Parser::SetError( E_Error i_eError )
56*b1cdbd2cSJim Jagielski {
57*b1cdbd2cSJim Jagielski eErrorCode = i_eError;
58*b1cdbd2cSJim Jagielski nErrorLine = nCurLine;
59*b1cdbd2cSJim Jagielski }
60*b1cdbd2cSJim Jagielski
61*b1cdbd2cSJim Jagielski
GenericInfo_Parser()62*b1cdbd2cSJim Jagielski GenericInfo_Parser::GenericInfo_Parser()
63*b1cdbd2cSJim Jagielski : sCurParsePosition(""),
64*b1cdbd2cSJim Jagielski nCurLine(0),
65*b1cdbd2cSJim Jagielski nLevel(0),
66*b1cdbd2cSJim Jagielski bGoon(false),
67*b1cdbd2cSJim Jagielski // sCurComment,
68*b1cdbd2cSJim Jagielski eErrorCode(ok),
69*b1cdbd2cSJim Jagielski nErrorLine(0),
70*b1cdbd2cSJim Jagielski pResult(0),
71*b1cdbd2cSJim Jagielski pResource(0)
72*b1cdbd2cSJim Jagielski {
73*b1cdbd2cSJim Jagielski }
74*b1cdbd2cSJim Jagielski
~GenericInfo_Parser()75*b1cdbd2cSJim Jagielski GenericInfo_Parser::~GenericInfo_Parser()
76*b1cdbd2cSJim Jagielski {
77*b1cdbd2cSJim Jagielski }
78*b1cdbd2cSJim Jagielski
79*b1cdbd2cSJim Jagielski bool
LoadList(GenericInfoList_Builder & o_rResult,const Simstr & i_sSourceFileName)80*b1cdbd2cSJim Jagielski GenericInfo_Parser::LoadList( GenericInfoList_Builder & o_rResult,
81*b1cdbd2cSJim Jagielski const Simstr & i_sSourceFileName )
82*b1cdbd2cSJim Jagielski {
83*b1cdbd2cSJim Jagielski ifstream aFile( i_sSourceFileName.str() );
84*b1cdbd2cSJim Jagielski if ( aFile.fail() )
85*b1cdbd2cSJim Jagielski {
86*b1cdbd2cSJim Jagielski SetError(cannot_open);
87*b1cdbd2cSJim Jagielski return false;
88*b1cdbd2cSJim Jagielski }
89*b1cdbd2cSJim Jagielski
90*b1cdbd2cSJim Jagielski aFile.seekg(0, ios::end);
91*b1cdbd2cSJim Jagielski UINT32 nTextSize = aFile.tellg();
92*b1cdbd2cSJim Jagielski if ( nTextSize == 0 || nTextSize == UINT32(-1) )
93*b1cdbd2cSJim Jagielski return true;
94*b1cdbd2cSJim Jagielski dpBuffer = new char[nTextSize+2];
95*b1cdbd2cSJim Jagielski
96*b1cdbd2cSJim Jagielski aFile.seekg(0);
97*b1cdbd2cSJim Jagielski aFile.read( dpBuffer, nTextSize );
98*b1cdbd2cSJim Jagielski aFile.close();
99*b1cdbd2cSJim Jagielski
100*b1cdbd2cSJim Jagielski sFilePtr = dpBuffer;
101*b1cdbd2cSJim Jagielski char * sLastChar = dpBuffer + nTextSize - 1;
102*b1cdbd2cSJim Jagielski
103*b1cdbd2cSJim Jagielski while ( sFilePtr != sLastChar && *sFilePtr <= 32 )
104*b1cdbd2cSJim Jagielski ++sCurParsePosition;
105*b1cdbd2cSJim Jagielski if ( sFilePtr == sLastChar )
106*b1cdbd2cSJim Jagielski {
107*b1cdbd2cSJim Jagielski if ( *sFilePtr <= 32 )
108*b1cdbd2cSJim Jagielski return true;
109*b1cdbd2cSJim Jagielski }
110*b1cdbd2cSJim Jagielski else while ( *sLastChar <= 32 )
111*b1cdbd2cSJim Jagielski {
112*b1cdbd2cSJim Jagielski --sLastChar;
113*b1cdbd2cSJim Jagielski }
114*b1cdbd2cSJim Jagielski
115*b1cdbd2cSJim Jagielski *(sLastChar+1) = '\n';
116*b1cdbd2cSJim Jagielski *(sLastChar+2) = '\0';
117*b1cdbd2cSJim Jagielski
118*b1cdbd2cSJim Jagielski ResetState(o_rResult);
119*b1cdbd2cSJim Jagielski
120*b1cdbd2cSJim Jagielski for ( ReadLine(); bGoon; ReadLine() )
121*b1cdbd2cSJim Jagielski {
122*b1cdbd2cSJim Jagielski bool bOk = InterpretLine();
123*b1cdbd2cSJim Jagielski if ( !bOk)
124*b1cdbd2cSJim Jagielski {
125*b1cdbd2cSJim Jagielski SetError(syntax_error);
126*b1cdbd2cSJim Jagielski break;
127*b1cdbd2cSJim Jagielski }
128*b1cdbd2cSJim Jagielski }
129*b1cdbd2cSJim Jagielski
130*b1cdbd2cSJim Jagielski if ( nLevel > 0 && eErrorCode == ok)
131*b1cdbd2cSJim Jagielski {
132*b1cdbd2cSJim Jagielski SetError(unexpected_eof);
133*b1cdbd2cSJim Jagielski }
134*b1cdbd2cSJim Jagielski else if ( nLevel < 0 )
135*b1cdbd2cSJim Jagielski {
136*b1cdbd2cSJim Jagielski SetError(unexpected_list_end);
137*b1cdbd2cSJim Jagielski }
138*b1cdbd2cSJim Jagielski
139*b1cdbd2cSJim Jagielski delete [] dpBuffer;
140*b1cdbd2cSJim Jagielski dpBuffer = 0;
141*b1cdbd2cSJim Jagielski sFilePtr = 0;
142*b1cdbd2cSJim Jagielski
143*b1cdbd2cSJim Jagielski return eErrorCode == ok;
144*b1cdbd2cSJim Jagielski }
145*b1cdbd2cSJim Jagielski
146*b1cdbd2cSJim Jagielski bool
SaveList(const Simstr & i_rOutputFile,GenericInfoList_Browser & io_rListBrowser)147*b1cdbd2cSJim Jagielski GenericInfo_Parser::SaveList( const Simstr & i_rOutputFile,
148*b1cdbd2cSJim Jagielski GenericInfoList_Browser & io_rListBrowser )
149*b1cdbd2cSJim Jagielski {
150*b1cdbd2cSJim Jagielski ofstream aFile( i_rOutputFile.str() );
151*b1cdbd2cSJim Jagielski if ( aFile.fail() )
152*b1cdbd2cSJim Jagielski {
153*b1cdbd2cSJim Jagielski SetError(cannot_open);
154*b1cdbd2cSJim Jagielski return false;
155*b1cdbd2cSJim Jagielski }
156*b1cdbd2cSJim Jagielski
157*b1cdbd2cSJim Jagielski ResetState(io_rListBrowser);
158*b1cdbd2cSJim Jagielski
159*b1cdbd2cSJim Jagielski WriteList(aFile);
160*b1cdbd2cSJim Jagielski
161*b1cdbd2cSJim Jagielski aFile.close();
162*b1cdbd2cSJim Jagielski return eErrorCode == ok;
163*b1cdbd2cSJim Jagielski }
164*b1cdbd2cSJim Jagielski
165*b1cdbd2cSJim Jagielski void
ResetState(GenericInfoList_Builder & io_rResult)166*b1cdbd2cSJim Jagielski GenericInfo_Parser::ResetState( GenericInfoList_Builder & io_rResult )
167*b1cdbd2cSJim Jagielski {
168*b1cdbd2cSJim Jagielski sCurParsePosition = "";
169*b1cdbd2cSJim Jagielski nCurLine = 0;
170*b1cdbd2cSJim Jagielski nLevel = 0;
171*b1cdbd2cSJim Jagielski bGoon = true;
172*b1cdbd2cSJim Jagielski sCurComment = "";
173*b1cdbd2cSJim Jagielski eErrorCode = ok;
174*b1cdbd2cSJim Jagielski nErrorLine = 0;
175*b1cdbd2cSJim Jagielski pResult = &io_rResult;
176*b1cdbd2cSJim Jagielski pResource = 0;
177*b1cdbd2cSJim Jagielski }
178*b1cdbd2cSJim Jagielski
179*b1cdbd2cSJim Jagielski void
ResetState(GenericInfoList_Browser & io_rSrc)180*b1cdbd2cSJim Jagielski GenericInfo_Parser::ResetState( GenericInfoList_Browser & io_rSrc )
181*b1cdbd2cSJim Jagielski {
182*b1cdbd2cSJim Jagielski sCurParsePosition = "";
183*b1cdbd2cSJim Jagielski nCurLine = 0;
184*b1cdbd2cSJim Jagielski nLevel = 0;
185*b1cdbd2cSJim Jagielski bGoon = false;
186*b1cdbd2cSJim Jagielski sCurComment = "";
187*b1cdbd2cSJim Jagielski eErrorCode = ok;
188*b1cdbd2cSJim Jagielski nErrorLine = 0;
189*b1cdbd2cSJim Jagielski pResult = 0;
190*b1cdbd2cSJim Jagielski pResource = &io_rSrc;
191*b1cdbd2cSJim Jagielski }
192*b1cdbd2cSJim Jagielski
193*b1cdbd2cSJim Jagielski
194*b1cdbd2cSJim Jagielski void
ReadLine()195*b1cdbd2cSJim Jagielski GenericInfo_Parser::ReadLine()
196*b1cdbd2cSJim Jagielski {
197*b1cdbd2cSJim Jagielski if ( *sFilePtr == '\0' ) // See initialising of dpBuffer and sLastChar in LoadList().
198*b1cdbd2cSJim Jagielski {
199*b1cdbd2cSJim Jagielski bGoon = false;
200*b1cdbd2cSJim Jagielski return;
201*b1cdbd2cSJim Jagielski }
202*b1cdbd2cSJim Jagielski
203*b1cdbd2cSJim Jagielski sCurParsePosition = sFilePtr;
204*b1cdbd2cSJim Jagielski while ( *sFilePtr != '\n' )
205*b1cdbd2cSJim Jagielski ++sFilePtr;
206*b1cdbd2cSJim Jagielski nCurLine++;
207*b1cdbd2cSJim Jagielski
208*b1cdbd2cSJim Jagielski // Remove leading and trailing whitespace from line:
209*b1cdbd2cSJim Jagielski while ( sCurParsePosition != sFilePtr && *sCurParsePosition <= 32 )
210*b1cdbd2cSJim Jagielski ++sCurParsePosition;
211*b1cdbd2cSJim Jagielski
212*b1cdbd2cSJim Jagielski char * sEndOfLine = sFilePtr;
213*b1cdbd2cSJim Jagielski while ( sEndOfLine != sCurParsePosition && *sEndOfLine <= 32 )
214*b1cdbd2cSJim Jagielski --sEndOfLine;
215*b1cdbd2cSJim Jagielski if ( sCurParsePosition != sEndOfLine || *sCurParsePosition > 32 )
216*b1cdbd2cSJim Jagielski ++sEndOfLine;
217*b1cdbd2cSJim Jagielski *sEndOfLine = '\0';
218*b1cdbd2cSJim Jagielski
219*b1cdbd2cSJim Jagielski ++sFilePtr; // Go beyond line end to first character of next line.
220*b1cdbd2cSJim Jagielski }
221*b1cdbd2cSJim Jagielski
222*b1cdbd2cSJim Jagielski bool
InterpretLine()223*b1cdbd2cSJim Jagielski GenericInfo_Parser::InterpretLine()
224*b1cdbd2cSJim Jagielski {
225*b1cdbd2cSJim Jagielski switch ( ClassifyLine() )
226*b1cdbd2cSJim Jagielski {
227*b1cdbd2cSJim Jagielski case lt_key: ReadKey();
228*b1cdbd2cSJim Jagielski break;
229*b1cdbd2cSJim Jagielski case lt_open_list: PushLevel_Read();
230*b1cdbd2cSJim Jagielski break;
231*b1cdbd2cSJim Jagielski case lt_close_list: PopLevel_Read();
232*b1cdbd2cSJim Jagielski break;
233*b1cdbd2cSJim Jagielski case lt_comment: AddCurLine2CurComment();
234*b1cdbd2cSJim Jagielski break;
235*b1cdbd2cSJim Jagielski case lt_empty: AddCurLine2CurComment();
236*b1cdbd2cSJim Jagielski break;
237*b1cdbd2cSJim Jagielski default:
238*b1cdbd2cSJim Jagielski return false;
239*b1cdbd2cSJim Jagielski }
240*b1cdbd2cSJim Jagielski return true;
241*b1cdbd2cSJim Jagielski }
242*b1cdbd2cSJim Jagielski
243*b1cdbd2cSJim Jagielski GenericInfo_Parser::E_LineType
ClassifyLine()244*b1cdbd2cSJim Jagielski GenericInfo_Parser::ClassifyLine()
245*b1cdbd2cSJim Jagielski {
246*b1cdbd2cSJim Jagielski switch ( *sCurParsePosition )
247*b1cdbd2cSJim Jagielski {
248*b1cdbd2cSJim Jagielski case '{': return lt_open_list;
249*b1cdbd2cSJim Jagielski case '}': return lt_close_list;
250*b1cdbd2cSJim Jagielski case '#': return lt_comment;
251*b1cdbd2cSJim Jagielski case '\0': return lt_empty;
252*b1cdbd2cSJim Jagielski }
253*b1cdbd2cSJim Jagielski
254*b1cdbd2cSJim Jagielski return lt_key;
255*b1cdbd2cSJim Jagielski }
256*b1cdbd2cSJim Jagielski
257*b1cdbd2cSJim Jagielski void
ReadKey()258*b1cdbd2cSJim Jagielski GenericInfo_Parser::ReadKey()
259*b1cdbd2cSJim Jagielski {
260*b1cdbd2cSJim Jagielski const char * pSearch = sCurParsePosition;
261*b1cdbd2cSJim Jagielski
262*b1cdbd2cSJim Jagielski for ( ; *pSearch > 32; ++pSearch ) ;
263*b1cdbd2cSJim Jagielski UINT32 nKeyLength = pSearch - sCurParsePosition;
264*b1cdbd2cSJim Jagielski
265*b1cdbd2cSJim Jagielski for ( ; *pSearch <= 32 && *pSearch > '\0'; ++pSearch ) ;
266*b1cdbd2cSJim Jagielski
267*b1cdbd2cSJim Jagielski pResult->AddKey( sCurParsePosition, nKeyLength,
268*b1cdbd2cSJim Jagielski pSearch, strlen(pSearch),
269*b1cdbd2cSJim Jagielski sCurComment.str(), sCurComment.l()
270*b1cdbd2cSJim Jagielski );
271*b1cdbd2cSJim Jagielski sCurComment = "";
272*b1cdbd2cSJim Jagielski }
273*b1cdbd2cSJim Jagielski
274*b1cdbd2cSJim Jagielski void
PushLevel_Read()275*b1cdbd2cSJim Jagielski GenericInfo_Parser::PushLevel_Read()
276*b1cdbd2cSJim Jagielski {
277*b1cdbd2cSJim Jagielski nLevel++;
278*b1cdbd2cSJim Jagielski pResult->OpenList();
279*b1cdbd2cSJim Jagielski }
280*b1cdbd2cSJim Jagielski
281*b1cdbd2cSJim Jagielski void
PopLevel_Read()282*b1cdbd2cSJim Jagielski GenericInfo_Parser::PopLevel_Read()
283*b1cdbd2cSJim Jagielski {
284*b1cdbd2cSJim Jagielski nLevel--;
285*b1cdbd2cSJim Jagielski pResult->CloseList();
286*b1cdbd2cSJim Jagielski }
287*b1cdbd2cSJim Jagielski
288*b1cdbd2cSJim Jagielski void
AddCurLine2CurComment()289*b1cdbd2cSJim Jagielski GenericInfo_Parser::AddCurLine2CurComment()
290*b1cdbd2cSJim Jagielski {
291*b1cdbd2cSJim Jagielski sCurComment += sCurParsePosition;
292*b1cdbd2cSJim Jagielski sCurComment += C_sLineEnd;
293*b1cdbd2cSJim Jagielski }
294*b1cdbd2cSJim Jagielski
295*b1cdbd2cSJim Jagielski void
WriteList(ostream & o_rFile)296*b1cdbd2cSJim Jagielski GenericInfo_Parser::WriteList( ostream & o_rFile )
297*b1cdbd2cSJim Jagielski {
298*b1cdbd2cSJim Jagielski static char sBuffer[32000];
299*b1cdbd2cSJim Jagielski
300*b1cdbd2cSJim Jagielski for ( bGoon = pResource->Start_CurList();
301*b1cdbd2cSJim Jagielski bGoon;
302*b1cdbd2cSJim Jagielski bGoon = pResource->NextOf_CurList() )
303*b1cdbd2cSJim Jagielski {
304*b1cdbd2cSJim Jagielski pResource->Get_CurComment(&sBuffer[0]);
305*b1cdbd2cSJim Jagielski WriteComment(o_rFile,sBuffer);
306*b1cdbd2cSJim Jagielski
307*b1cdbd2cSJim Jagielski pResource->Get_CurKey(&sBuffer[0]);
308*b1cdbd2cSJim Jagielski WriteKey(o_rFile,sBuffer);
309*b1cdbd2cSJim Jagielski
310*b1cdbd2cSJim Jagielski pResource->Get_CurValue(&sBuffer[0]);
311*b1cdbd2cSJim Jagielski WriteValue(o_rFile,sBuffer);
312*b1cdbd2cSJim Jagielski
313*b1cdbd2cSJim Jagielski if ( pResource->HasSubList_CurKey() )
314*b1cdbd2cSJim Jagielski {
315*b1cdbd2cSJim Jagielski PushLevel_Write();
316*b1cdbd2cSJim Jagielski
317*b1cdbd2cSJim Jagielski /*
318*b1cdbd2cSJim Jagielski WriteIndentation();
319*b1cdbd2cSJim Jagielski o_rFile.write("{",1);
320*b1cdbd2cSJim Jagielski o_rFile.write(C_sLineEnd, C_nLineEndLength);
321*b1cdbd2cSJim Jagielski */
322*b1cdbd2cSJim Jagielski WriteList(o_rFile);
323*b1cdbd2cSJim Jagielski
324*b1cdbd2cSJim Jagielski /*
325*b1cdbd2cSJim Jagielski WriteIndentation();
326*b1cdbd2cSJim Jagielski o_rFile.write("}",1);
327*b1cdbd2cSJim Jagielski o_rFile.write(C_sLineEnd, C_nLineEndLength);
328*b1cdbd2cSJim Jagielski */
329*b1cdbd2cSJim Jagielski PopLevel_Write();
330*b1cdbd2cSJim Jagielski }
331*b1cdbd2cSJim Jagielski } // end for
332*b1cdbd2cSJim Jagielski }
333*b1cdbd2cSJim Jagielski
334*b1cdbd2cSJim Jagielski void
PushLevel_Write()335*b1cdbd2cSJim Jagielski GenericInfo_Parser::PushLevel_Write()
336*b1cdbd2cSJim Jagielski {
337*b1cdbd2cSJim Jagielski nLevel++;
338*b1cdbd2cSJim Jagielski pResource->Push_CurList();
339*b1cdbd2cSJim Jagielski }
340*b1cdbd2cSJim Jagielski
341*b1cdbd2cSJim Jagielski void
PopLevel_Write()342*b1cdbd2cSJim Jagielski GenericInfo_Parser::PopLevel_Write()
343*b1cdbd2cSJim Jagielski {
344*b1cdbd2cSJim Jagielski nLevel--;
345*b1cdbd2cSJim Jagielski pResource->Pop_CurList();
346*b1cdbd2cSJim Jagielski }
347*b1cdbd2cSJim Jagielski
348*b1cdbd2cSJim Jagielski void
WriteComment(ostream & o_rFile,const char * i_sStr)349*b1cdbd2cSJim Jagielski GenericInfo_Parser::WriteComment( ostream & o_rFile,
350*b1cdbd2cSJim Jagielski const char * i_sStr )
351*b1cdbd2cSJim Jagielski {
352*b1cdbd2cSJim Jagielski WriteStr( o_rFile, i_sStr );
353*b1cdbd2cSJim Jagielski if ( i_sStr[ strlen(i_sStr)-1 ] != '\n' )
354*b1cdbd2cSJim Jagielski WriteStr( o_rFile, C_sLineEnd );
355*b1cdbd2cSJim Jagielski }
356*b1cdbd2cSJim Jagielski
357*b1cdbd2cSJim Jagielski void
WriteKey(ostream & o_rFile,const char * i_sStr)358*b1cdbd2cSJim Jagielski GenericInfo_Parser::WriteKey( ostream & o_rFile,
359*b1cdbd2cSJim Jagielski const char * i_sStr )
360*b1cdbd2cSJim Jagielski {
361*b1cdbd2cSJim Jagielski WriteIndentation(o_rFile);
362*b1cdbd2cSJim Jagielski WriteStr( o_rFile, i_sStr );
363*b1cdbd2cSJim Jagielski }
364*b1cdbd2cSJim Jagielski
365*b1cdbd2cSJim Jagielski void
WriteValue(ostream & o_rFile,const char * i_sStr)366*b1cdbd2cSJim Jagielski GenericInfo_Parser::WriteValue( ostream & o_rFile,
367*b1cdbd2cSJim Jagielski const char * i_sStr )
368*b1cdbd2cSJim Jagielski {
369*b1cdbd2cSJim Jagielski if ( i_sStr != 0 ? strlen(i_sStr) > 0 : false )
370*b1cdbd2cSJim Jagielski {
371*b1cdbd2cSJim Jagielski WriteStr(o_rFile," ");
372*b1cdbd2cSJim Jagielski WriteStr(o_rFile,i_sStr);
373*b1cdbd2cSJim Jagielski }
374*b1cdbd2cSJim Jagielski
375*b1cdbd2cSJim Jagielski WriteStr(o_rFile,C_sLineEnd);
376*b1cdbd2cSJim Jagielski }
377*b1cdbd2cSJim Jagielski
378*b1cdbd2cSJim Jagielski void
WriteIndentation(ostream & o_rFile)379*b1cdbd2cSJim Jagielski GenericInfo_Parser::WriteIndentation( ostream & o_rFile )
380*b1cdbd2cSJim Jagielski {
381*b1cdbd2cSJim Jagielski const int nIndentBound = 60;
382*b1cdbd2cSJim Jagielski
383*b1cdbd2cSJim Jagielski static const char sIndentation[nIndentBound+1] =
384*b1cdbd2cSJim Jagielski "\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t"
385*b1cdbd2cSJim Jagielski "\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t"
386*b1cdbd2cSJim Jagielski "\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t";
387*b1cdbd2cSJim Jagielski
388*b1cdbd2cSJim Jagielski if ( nLevel == 0 )
389*b1cdbd2cSJim Jagielski return;
390*b1cdbd2cSJim Jagielski
391*b1cdbd2cSJim Jagielski if ( nLevel <= nIndentBound )
392*b1cdbd2cSJim Jagielski o_rFile.write( sIndentation, nLevel );
393*b1cdbd2cSJim Jagielski else
394*b1cdbd2cSJim Jagielski {
395*b1cdbd2cSJim Jagielski INT16 iLevel = nLevel;
396*b1cdbd2cSJim Jagielski for ( ; iLevel > nIndentBound; iLevel-=nIndentBound )
397*b1cdbd2cSJim Jagielski o_rFile.write( sIndentation, nIndentBound );
398*b1cdbd2cSJim Jagielski o_rFile.write( sIndentation, iLevel );
399*b1cdbd2cSJim Jagielski }
400*b1cdbd2cSJim Jagielski }
401*b1cdbd2cSJim Jagielski
402*b1cdbd2cSJim Jagielski
403*b1cdbd2cSJim Jagielski
404