xref: /aoo4110/main/soltools/giparser/gi_parse.cxx (revision b1cdbd2c)
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