xref: /aoo41x/main/idl/source/prj/database.cxx (revision cdf0e10c)
1*cdf0e10cSrcweir /*************************************************************************
2*cdf0e10cSrcweir  *
3*cdf0e10cSrcweir  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4*cdf0e10cSrcweir  *
5*cdf0e10cSrcweir  * Copyright 2000, 2010 Oracle and/or its affiliates.
6*cdf0e10cSrcweir  *
7*cdf0e10cSrcweir  * OpenOffice.org - a multi-platform office productivity suite
8*cdf0e10cSrcweir  *
9*cdf0e10cSrcweir  * This file is part of OpenOffice.org.
10*cdf0e10cSrcweir  *
11*cdf0e10cSrcweir  * OpenOffice.org is free software: you can redistribute it and/or modify
12*cdf0e10cSrcweir  * it under the terms of the GNU Lesser General Public License version 3
13*cdf0e10cSrcweir  * only, as published by the Free Software Foundation.
14*cdf0e10cSrcweir  *
15*cdf0e10cSrcweir  * OpenOffice.org is distributed in the hope that it will be useful,
16*cdf0e10cSrcweir  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17*cdf0e10cSrcweir  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18*cdf0e10cSrcweir  * GNU Lesser General Public License version 3 for more details
19*cdf0e10cSrcweir  * (a copy is included in the LICENSE file that accompanied this code).
20*cdf0e10cSrcweir  *
21*cdf0e10cSrcweir  * You should have received a copy of the GNU Lesser General Public License
22*cdf0e10cSrcweir  * version 3 along with OpenOffice.org.  If not, see
23*cdf0e10cSrcweir  * <http://www.openoffice.org/license.html>
24*cdf0e10cSrcweir  * for a copy of the LGPLv3 License.
25*cdf0e10cSrcweir  *
26*cdf0e10cSrcweir  ************************************************************************/
27*cdf0e10cSrcweir 
28*cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
29*cdf0e10cSrcweir #include "precompiled_idl.hxx"
30*cdf0e10cSrcweir 
31*cdf0e10cSrcweir #include <ctype.h>
32*cdf0e10cSrcweir #include <stdio.h>
33*cdf0e10cSrcweir #include <stdlib.h>
34*cdf0e10cSrcweir #include <tools/fsys.hxx>
35*cdf0e10cSrcweir #include <tools/debug.hxx>
36*cdf0e10cSrcweir #include <database.hxx>
37*cdf0e10cSrcweir #include <globals.hxx>
38*cdf0e10cSrcweir 
39*cdf0e10cSrcweir /****************** SvIdlDataBase ****************************************/
40*cdf0e10cSrcweir /*************************************************************************
41*cdf0e10cSrcweir |*    SvIdlDataBase::SvIdlDataBase()
42*cdf0e10cSrcweir |*
43*cdf0e10cSrcweir |*    Beschreibung
44*cdf0e10cSrcweir *************************************************************************/
45*cdf0e10cSrcweir /*
46*cdf0e10cSrcweir void PrimeNumber(){
47*cdf0e10cSrcweir     sal_uInt16 i, n;
48*cdf0e10cSrcweir     for( i = 5001; i < 5500; i += 2 ){
49*cdf0e10cSrcweir         for( n = 2; n < i && ((i % n) != 0); n++ );
50*cdf0e10cSrcweir         if( n == i ){
51*cdf0e10cSrcweir             printf( "\nPrimzahl: %d\n", i );
52*cdf0e10cSrcweir             return;
53*cdf0e10cSrcweir         }
54*cdf0e10cSrcweir     }
55*cdf0e10cSrcweir }
56*cdf0e10cSrcweir */
57*cdf0e10cSrcweir 
58*cdf0e10cSrcweir SvIdlDataBase::SvIdlDataBase( const SvCommand& rCmd )
59*cdf0e10cSrcweir 	: bExport( sal_False )
60*cdf0e10cSrcweir 	, nUniqueId( 0 )
61*cdf0e10cSrcweir     , nVerbosity( rCmd.nVerbosity )
62*cdf0e10cSrcweir     , bIsModified( sal_False )
63*cdf0e10cSrcweir     , aPersStream( *IDLAPP->pClassMgr, NULL )
64*cdf0e10cSrcweir     , pIdTable( NULL )
65*cdf0e10cSrcweir {
66*cdf0e10cSrcweir 	//PrimeNumber();
67*cdf0e10cSrcweir }
68*cdf0e10cSrcweir 
69*cdf0e10cSrcweir /*************************************************************************
70*cdf0e10cSrcweir |*    SvIdlDataBase::~SvIdlDataBase()
71*cdf0e10cSrcweir |*
72*cdf0e10cSrcweir |*    Beschreibung
73*cdf0e10cSrcweir *************************************************************************/
74*cdf0e10cSrcweir SvIdlDataBase::~SvIdlDataBase()
75*cdf0e10cSrcweir {
76*cdf0e10cSrcweir     String * pStr = aIdFileList.First();
77*cdf0e10cSrcweir     while( pStr )
78*cdf0e10cSrcweir     {
79*cdf0e10cSrcweir         delete pStr;
80*cdf0e10cSrcweir         pStr = aIdFileList.Next();
81*cdf0e10cSrcweir     }
82*cdf0e10cSrcweir     delete pIdTable;
83*cdf0e10cSrcweir }
84*cdf0e10cSrcweir 
85*cdf0e10cSrcweir /*************************************************************************
86*cdf0e10cSrcweir |*    SvIdlDataBase::GetTypeList()
87*cdf0e10cSrcweir |*
88*cdf0e10cSrcweir |*    Beschreibung
89*cdf0e10cSrcweir *************************************************************************/
90*cdf0e10cSrcweir #define ADD_TYPE( Name, OdlName, ParserChar, CName, BasName, BasPost )            \
91*cdf0e10cSrcweir     aTypeList.Append( new SvMetaType( SvHash_##Name()->GetName(),	\
92*cdf0e10cSrcweir                      BasName, OdlName, ParserChar, CName, BasName, BasPost ) );
93*cdf0e10cSrcweir 
94*cdf0e10cSrcweir SvMetaTypeMemberList & SvIdlDataBase::GetTypeList()
95*cdf0e10cSrcweir {
96*cdf0e10cSrcweir     if( aTypeList.Count() == 0 )
97*cdf0e10cSrcweir     { // Initial fuellen
98*cdf0e10cSrcweir         aTypeList.Append( new SvMetaTypeString() );
99*cdf0e10cSrcweir         aTypeList.Append( new SvMetaTypevoid() );
100*cdf0e10cSrcweir 
101*cdf0e10cSrcweir 		// MI: IDispatch::Invoke kann keine unsigned
102*cdf0e10cSrcweir         ADD_TYPE( UINT16,    "long", 'h', "unsigned short", "Long", "&" );
103*cdf0e10cSrcweir         ADD_TYPE( INT16,     "short", 'h', "short", "Integer", "%" );
104*cdf0e10cSrcweir         ADD_TYPE( UINT32,    "long", 'l', "unsigned long", "Long", "&" );
105*cdf0e10cSrcweir         ADD_TYPE( INT32,     "long", 'l', "long", "Long", "&" );
106*cdf0e10cSrcweir         ADD_TYPE( int,       "int", 'i', "int", "Integer", "%" );
107*cdf0e10cSrcweir         ADD_TYPE( BOOL,      "boolean", 'b', "unsigned char", "Boolean", "" );
108*cdf0e10cSrcweir         ADD_TYPE( char,      "char", 'c', "char", "Integer", "%" );
109*cdf0e10cSrcweir         ADD_TYPE( BYTE,      "char", 'c', "unsigned char", "Integer", "%" );
110*cdf0e10cSrcweir         ADD_TYPE( float,     "float", 'f', "float", "Single", "!" );
111*cdf0e10cSrcweir         ADD_TYPE( double,    "double", 'F', "double", "Double", "#" );
112*cdf0e10cSrcweir         ADD_TYPE( SbxObject, "VARIANT", 'o', "C_Object", "Object", "" );
113*cdf0e10cSrcweir 
114*cdf0e10cSrcweir 
115*cdf0e10cSrcweir         // A c h t u n g !!!, bei hinzufuegen von Typen werden alle
116*cdf0e10cSrcweir         // bin�ren Datenbasen inkompatibel
117*cdf0e10cSrcweir 
118*cdf0e10cSrcweir     /*
119*cdf0e10cSrcweir         // So tun als ob die Init-Daten auf einem Stream gelesen wurden
120*cdf0e10cSrcweir         SvMemoryStream aStm;
121*cdf0e10cSrcweir         aPersStream.SetStream( &aStm );
122*cdf0e10cSrcweir         // Alle Init-Daten Streamen
123*cdf0e10cSrcweir         aPersStream << aTypeList;
124*cdf0e10cSrcweir         // Nur die Id-Zuordnung merken
125*cdf0e10cSrcweir         aPersStream.SetStream( NULL );
126*cdf0e10cSrcweir     */
127*cdf0e10cSrcweir     }
128*cdf0e10cSrcweir     return aTypeList;
129*cdf0e10cSrcweir }
130*cdf0e10cSrcweir 
131*cdf0e10cSrcweir /*************************************************************************
132*cdf0e10cSrcweir |*
133*cdf0e10cSrcweir |*    SvIdlDataBase::GetModuleInfo()
134*cdf0e10cSrcweir |*
135*cdf0e10cSrcweir |*    Beschreibung
136*cdf0e10cSrcweir |*    Ersterstellung    MM 13.12.94
137*cdf0e10cSrcweir |*    Letzte Aenderung  MM 13.12.94
138*cdf0e10cSrcweir |*
139*cdf0e10cSrcweir *************************************************************************/
140*cdf0e10cSrcweir SvMetaModule * SvIdlDataBase::GetModule( const ByteString & rName )
141*cdf0e10cSrcweir {
142*cdf0e10cSrcweir     for( sal_uLong n = 0; n < aModuleList.Count(); n++ )
143*cdf0e10cSrcweir         if( aModuleList.GetObject( n )->GetName() == rName )
144*cdf0e10cSrcweir             return aModuleList.GetObject( n );
145*cdf0e10cSrcweir     return NULL;
146*cdf0e10cSrcweir }
147*cdf0e10cSrcweir 
148*cdf0e10cSrcweir /*************************************************************************
149*cdf0e10cSrcweir |*
150*cdf0e10cSrcweir |*    SvIdlDataBase::IsBinaryFormat()
151*cdf0e10cSrcweir |*
152*cdf0e10cSrcweir |*    Beschreibung
153*cdf0e10cSrcweir |*
154*cdf0e10cSrcweir *************************************************************************/
155*cdf0e10cSrcweir #define DATABASE_SIGNATURE  (sal_uInt32)0x13B799F2
156*cdf0e10cSrcweir #define DATABASE_VER 0x0006
157*cdf0e10cSrcweir sal_Bool SvIdlDataBase::IsBinaryFormat( SvStream & rStm )
158*cdf0e10cSrcweir {
159*cdf0e10cSrcweir     sal_uInt32  nSig = 0;
160*cdf0e10cSrcweir     sal_uLong   nPos = rStm.Tell();
161*cdf0e10cSrcweir     rStm >> nSig;
162*cdf0e10cSrcweir     rStm.Seek( nPos );
163*cdf0e10cSrcweir 
164*cdf0e10cSrcweir     return nSig == DATABASE_SIGNATURE;
165*cdf0e10cSrcweir }
166*cdf0e10cSrcweir 
167*cdf0e10cSrcweir /*************************************************************************
168*cdf0e10cSrcweir |*
169*cdf0e10cSrcweir |*    SvIdlDataBase::Load()
170*cdf0e10cSrcweir |*
171*cdf0e10cSrcweir |*    Beschreibung
172*cdf0e10cSrcweir |*
173*cdf0e10cSrcweir *************************************************************************/
174*cdf0e10cSrcweir void SvIdlDataBase::Load( SvStream & rStm )
175*cdf0e10cSrcweir {
176*cdf0e10cSrcweir     DBG_ASSERT( aTypeList.Count() == 0, "type list already initialized" );
177*cdf0e10cSrcweir     SvPersistStream aPStm( *IDLAPP->pClassMgr, &rStm );
178*cdf0e10cSrcweir 
179*cdf0e10cSrcweir     sal_uInt16  nVersion = 0;
180*cdf0e10cSrcweir     sal_uInt32  nSig = 0;
181*cdf0e10cSrcweir 
182*cdf0e10cSrcweir     aPStm >> nSig;
183*cdf0e10cSrcweir     aPStm >> nVersion;
184*cdf0e10cSrcweir     if( nSig != DATABASE_SIGNATURE )
185*cdf0e10cSrcweir     {
186*cdf0e10cSrcweir         aPStm.SetError( SVSTREAM_FILEFORMAT_ERROR );
187*cdf0e10cSrcweir         return;
188*cdf0e10cSrcweir     }
189*cdf0e10cSrcweir     if( nVersion != DATABASE_VER )
190*cdf0e10cSrcweir     {
191*cdf0e10cSrcweir         aPStm.SetError( SVSTREAM_WRONGVERSION );
192*cdf0e10cSrcweir         return;
193*cdf0e10cSrcweir     }
194*cdf0e10cSrcweir     aPStm >> aClassList;
195*cdf0e10cSrcweir     aPStm >> aTypeList;
196*cdf0e10cSrcweir     aPStm >> aAttrList;
197*cdf0e10cSrcweir     aPStm >> aModuleList;
198*cdf0e10cSrcweir     aPStm >> nUniqueId;
199*cdf0e10cSrcweir 
200*cdf0e10cSrcweir     if( aPStm.IsEof() )
201*cdf0e10cSrcweir         aPStm.SetError( SVSTREAM_GENERALERROR );
202*cdf0e10cSrcweir }
203*cdf0e10cSrcweir 
204*cdf0e10cSrcweir /*************************************************************************
205*cdf0e10cSrcweir |*    SvIdlDataBase::Save()
206*cdf0e10cSrcweir |*
207*cdf0e10cSrcweir |*    Beschreibung
208*cdf0e10cSrcweir *************************************************************************/
209*cdf0e10cSrcweir void SvIdlDataBase::Save( SvStream & rStm, sal_uInt32 nFlags )
210*cdf0e10cSrcweir {
211*cdf0e10cSrcweir     SvPersistStream aPStm( *IDLAPP->pClassMgr, &rStm );
212*cdf0e10cSrcweir     aPStm.SetContextFlags( nFlags );
213*cdf0e10cSrcweir 
214*cdf0e10cSrcweir     aPStm << (sal_uInt32)DATABASE_SIGNATURE;
215*cdf0e10cSrcweir     aPStm << (sal_uInt16)DATABASE_VER;
216*cdf0e10cSrcweir 
217*cdf0e10cSrcweir     sal_Bool bOnlyStreamedObjs = sal_False;
218*cdf0e10cSrcweir     if( nFlags & IDL_WRITE_CALLING )
219*cdf0e10cSrcweir         bOnlyStreamedObjs = sal_True;
220*cdf0e10cSrcweir 
221*cdf0e10cSrcweir     if( bOnlyStreamedObjs )
222*cdf0e10cSrcweir     {
223*cdf0e10cSrcweir         SvMetaClassMemberList aList;
224*cdf0e10cSrcweir         for( sal_uLong n = 0; n < GetModuleList().Count(); n++ )
225*cdf0e10cSrcweir         {
226*cdf0e10cSrcweir             SvMetaModule * pModule = GetModuleList().GetObject( n );
227*cdf0e10cSrcweir             if( !pModule->IsImported() )
228*cdf0e10cSrcweir                 aList.Append( pModule->GetClassList() );
229*cdf0e10cSrcweir         }
230*cdf0e10cSrcweir         aPStm << aList;
231*cdf0e10cSrcweir     }
232*cdf0e10cSrcweir     else
233*cdf0e10cSrcweir         aPStm << aClassList;
234*cdf0e10cSrcweir 
235*cdf0e10cSrcweir     //aClassList.WriteObjects( aPStm, bOnlyStreamedObjs );
236*cdf0e10cSrcweir     aTypeList.WriteObjects( aPStm, bOnlyStreamedObjs );
237*cdf0e10cSrcweir     aAttrList.WriteObjects( aPStm, bOnlyStreamedObjs );
238*cdf0e10cSrcweir     aModuleList.WriteObjects( aPStm, bOnlyStreamedObjs );
239*cdf0e10cSrcweir 	aPStm << nUniqueId;
240*cdf0e10cSrcweir }
241*cdf0e10cSrcweir 
242*cdf0e10cSrcweir /*************************************************************************
243*cdf0e10cSrcweir |*    SvIdlDataBase::SetError()
244*cdf0e10cSrcweir |*
245*cdf0e10cSrcweir |*    Beschreibung
246*cdf0e10cSrcweir *************************************************************************/
247*cdf0e10cSrcweir void SvIdlDataBase::SetError( const ByteString & rError, SvToken * pTok )
248*cdf0e10cSrcweir {
249*cdf0e10cSrcweir 	if( pTok->GetLine() > 10000 )
250*cdf0e10cSrcweir 		aError.SetText( "hgchcg" );
251*cdf0e10cSrcweir 
252*cdf0e10cSrcweir     if( aError.nLine < pTok->GetLine()
253*cdf0e10cSrcweir       || (aError.nLine == pTok->GetLine() && aError.nColumn < pTok->GetColumn()) )
254*cdf0e10cSrcweir     {
255*cdf0e10cSrcweir         aError = SvIdlError( pTok->GetLine(), pTok->GetColumn() );
256*cdf0e10cSrcweir         aError.SetText( rError );
257*cdf0e10cSrcweir     }
258*cdf0e10cSrcweir }
259*cdf0e10cSrcweir 
260*cdf0e10cSrcweir /*************************************************************************
261*cdf0e10cSrcweir |*    SvIdlDataBase::Push()
262*cdf0e10cSrcweir |*
263*cdf0e10cSrcweir |*    Beschreibung
264*cdf0e10cSrcweir *************************************************************************/
265*cdf0e10cSrcweir void SvIdlDataBase::Push( SvMetaObject * pObj )
266*cdf0e10cSrcweir {
267*cdf0e10cSrcweir 	GetStack().Push( pObj );
268*cdf0e10cSrcweir }
269*cdf0e10cSrcweir 
270*cdf0e10cSrcweir #ifdef IDL_COMPILER
271*cdf0e10cSrcweir /*************************************************************************
272*cdf0e10cSrcweir |*
273*cdf0e10cSrcweir |*    SvIdlDataBase::FindId()
274*cdf0e10cSrcweir |*
275*cdf0e10cSrcweir |*    Beschreibung
276*cdf0e10cSrcweir |*
277*cdf0e10cSrcweir *************************************************************************/
278*cdf0e10cSrcweir sal_Bool SvIdlDataBase::FindId( const ByteString & rIdName, sal_uLong * pVal )
279*cdf0e10cSrcweir {
280*cdf0e10cSrcweir     if( pIdTable )
281*cdf0e10cSrcweir     {
282*cdf0e10cSrcweir         sal_uInt32 nHash;
283*cdf0e10cSrcweir         if( pIdTable->Test( rIdName, &nHash ) )
284*cdf0e10cSrcweir         {
285*cdf0e10cSrcweir             *pVal = pIdTable->Get( nHash )->GetValue();
286*cdf0e10cSrcweir             return sal_True;
287*cdf0e10cSrcweir         }
288*cdf0e10cSrcweir     }
289*cdf0e10cSrcweir     return sal_False;
290*cdf0e10cSrcweir }
291*cdf0e10cSrcweir 
292*cdf0e10cSrcweir /*************************************************************************
293*cdf0e10cSrcweir |*
294*cdf0e10cSrcweir |*    SvIdlDataBase::InsertId()
295*cdf0e10cSrcweir |*
296*cdf0e10cSrcweir |*    Beschreibung
297*cdf0e10cSrcweir |*
298*cdf0e10cSrcweir *************************************************************************/
299*cdf0e10cSrcweir sal_Bool SvIdlDataBase::InsertId( const ByteString & rIdName, sal_uLong nVal )
300*cdf0e10cSrcweir {
301*cdf0e10cSrcweir     if( !pIdTable )
302*cdf0e10cSrcweir         pIdTable = new SvStringHashTable( 20003 );
303*cdf0e10cSrcweir 
304*cdf0e10cSrcweir     sal_uInt32 nHash;
305*cdf0e10cSrcweir     if( pIdTable->Insert( rIdName, &nHash ) )
306*cdf0e10cSrcweir     {
307*cdf0e10cSrcweir         pIdTable->Get( nHash )->SetValue( nVal );
308*cdf0e10cSrcweir         return sal_True;
309*cdf0e10cSrcweir     }
310*cdf0e10cSrcweir     return sal_False;
311*cdf0e10cSrcweir }
312*cdf0e10cSrcweir 
313*cdf0e10cSrcweir /*************************************************************************
314*cdf0e10cSrcweir |*    SvIdlDataBase::ReadIdFile()
315*cdf0e10cSrcweir |*
316*cdf0e10cSrcweir |*    Beschreibung
317*cdf0e10cSrcweir *************************************************************************/
318*cdf0e10cSrcweir sal_Bool SvIdlDataBase::ReadIdFile( const String & rFileName )
319*cdf0e10cSrcweir {
320*cdf0e10cSrcweir     DirEntry aFullName( rFileName );
321*cdf0e10cSrcweir     aFullName.Find( GetPath() );
322*cdf0e10cSrcweir 
323*cdf0e10cSrcweir     String * pIdFile = aIdFileList.First();
324*cdf0e10cSrcweir     while( pIdFile )
325*cdf0e10cSrcweir     {
326*cdf0e10cSrcweir         if( *pIdFile == rFileName )
327*cdf0e10cSrcweir             return sal_True; // schon eingelesen
328*cdf0e10cSrcweir         pIdFile = aIdFileList.Next();
329*cdf0e10cSrcweir     }
330*cdf0e10cSrcweir 
331*cdf0e10cSrcweir     aIdFileList.Insert( new String( rFileName ), LIST_APPEND );
332*cdf0e10cSrcweir 
333*cdf0e10cSrcweir     SvTokenStream aTokStm( aFullName.GetFull() );
334*cdf0e10cSrcweir     if( aTokStm.GetStream().GetError() == SVSTREAM_OK )
335*cdf0e10cSrcweir     {
336*cdf0e10cSrcweir         SvToken * pTok = aTokStm.GetToken_Next();
337*cdf0e10cSrcweir 
338*cdf0e10cSrcweir         while( !pTok->IsEof() )
339*cdf0e10cSrcweir         {
340*cdf0e10cSrcweir             if( pTok->IsChar() && pTok->GetChar() == '#' )
341*cdf0e10cSrcweir             {
342*cdf0e10cSrcweir                 pTok = aTokStm.GetToken_Next();
343*cdf0e10cSrcweir                 if( pTok->Is( SvHash_define() ) )
344*cdf0e10cSrcweir                 {
345*cdf0e10cSrcweir                     pTok = aTokStm.GetToken_Next();
346*cdf0e10cSrcweir                     ByteString aDefName;
347*cdf0e10cSrcweir                     if( pTok->IsIdentifier() )
348*cdf0e10cSrcweir                         aDefName = pTok->GetString();
349*cdf0e10cSrcweir                     else
350*cdf0e10cSrcweir                     {
351*cdf0e10cSrcweir                         ByteString aStr( "unexpected token after define" );
352*cdf0e10cSrcweir                         // Fehler setzen
353*cdf0e10cSrcweir                         SetError( aStr, pTok );
354*cdf0e10cSrcweir                         WriteError( aTokStm );
355*cdf0e10cSrcweir                         return sal_False;
356*cdf0e10cSrcweir                     }
357*cdf0e10cSrcweir 
358*cdf0e10cSrcweir                     sal_uLong nVal = 0;
359*cdf0e10cSrcweir                     sal_Bool bOk = sal_True;
360*cdf0e10cSrcweir                     while( bOk )
361*cdf0e10cSrcweir                     {
362*cdf0e10cSrcweir                         pTok = aTokStm.GetToken_Next();
363*cdf0e10cSrcweir                         if( pTok->IsIdentifier() )
364*cdf0e10cSrcweir                         {
365*cdf0e10cSrcweir                             sal_uLong n;
366*cdf0e10cSrcweir                             if( FindId( pTok->GetString(), &n ) )
367*cdf0e10cSrcweir                                 nVal += n;
368*cdf0e10cSrcweir                             else
369*cdf0e10cSrcweir                                 bOk = sal_False;
370*cdf0e10cSrcweir                         }
371*cdf0e10cSrcweir                         else if( pTok->IsChar() )
372*cdf0e10cSrcweir                         {
373*cdf0e10cSrcweir                             if( pTok->GetChar() == '-'
374*cdf0e10cSrcweir                               || pTok->GetChar() == '/'
375*cdf0e10cSrcweir                               || pTok->GetChar() == '*'
376*cdf0e10cSrcweir                               || pTok->GetChar() == '&'
377*cdf0e10cSrcweir                               || pTok->GetChar() == '|'
378*cdf0e10cSrcweir                               || pTok->GetChar() == '^'
379*cdf0e10cSrcweir                               || pTok->GetChar() == '~' )
380*cdf0e10cSrcweir                             {
381*cdf0e10cSrcweir                                 ByteString aStr( "unknown operator '" );
382*cdf0e10cSrcweir                                 aStr += pTok->GetChar();
383*cdf0e10cSrcweir                                 aStr += "'in define";
384*cdf0e10cSrcweir                                 // Fehler setzen
385*cdf0e10cSrcweir                                 SetError( aStr, pTok );
386*cdf0e10cSrcweir                                 WriteError( aTokStm );
387*cdf0e10cSrcweir                                 return sal_False;
388*cdf0e10cSrcweir                             }
389*cdf0e10cSrcweir                             if( pTok->GetChar() != '+'
390*cdf0e10cSrcweir                               && pTok->GetChar() != '('
391*cdf0e10cSrcweir                               && pTok->GetChar() != ')' )
392*cdf0e10cSrcweir                                 // nur + erlaubt, Klammern spielen kein Rolle,
393*cdf0e10cSrcweir                                 // da + komutativ ist
394*cdf0e10cSrcweir                                 break;
395*cdf0e10cSrcweir                         }
396*cdf0e10cSrcweir                         else if( pTok->IsInteger() )
397*cdf0e10cSrcweir                         {
398*cdf0e10cSrcweir                             nVal += pTok->GetNumber();
399*cdf0e10cSrcweir                         }
400*cdf0e10cSrcweir                         else
401*cdf0e10cSrcweir                             break;
402*cdf0e10cSrcweir                     }
403*cdf0e10cSrcweir                     if( bOk )
404*cdf0e10cSrcweir                     {
405*cdf0e10cSrcweir                         if( !InsertId( aDefName, nVal ) )
406*cdf0e10cSrcweir                         {
407*cdf0e10cSrcweir 	                        ByteString aStr = "hash table overflow: ";
408*cdf0e10cSrcweir 			                SetError( aStr, pTok );
409*cdf0e10cSrcweir                             WriteError( aTokStm );
410*cdf0e10cSrcweir                             return sal_False;
411*cdf0e10cSrcweir                         }
412*cdf0e10cSrcweir                     }
413*cdf0e10cSrcweir                 }
414*cdf0e10cSrcweir                 else if( pTok->Is( SvHash_include() ) )
415*cdf0e10cSrcweir                 {
416*cdf0e10cSrcweir                     pTok = aTokStm.GetToken_Next();
417*cdf0e10cSrcweir                     ByteString aName;
418*cdf0e10cSrcweir                     if( pTok->IsString() )
419*cdf0e10cSrcweir                         aName = pTok->GetString();
420*cdf0e10cSrcweir                     else if( pTok->IsChar() && pTok->GetChar() == '<' )
421*cdf0e10cSrcweir                     {
422*cdf0e10cSrcweir                         pTok = aTokStm.GetToken_Next();
423*cdf0e10cSrcweir                         while( !pTok->IsEof()
424*cdf0e10cSrcweir                           && !(pTok->IsChar() && pTok->GetChar() == '>') )
425*cdf0e10cSrcweir                         {
426*cdf0e10cSrcweir                             aName += pTok->GetTokenAsString();
427*cdf0e10cSrcweir                             pTok = aTokStm.GetToken_Next();
428*cdf0e10cSrcweir                         }
429*cdf0e10cSrcweir                         if( pTok->IsEof() )
430*cdf0e10cSrcweir                         {
431*cdf0e10cSrcweir                             ByteString aStr( "unexpected eof in #include" );
432*cdf0e10cSrcweir                             // Fehler setzen
433*cdf0e10cSrcweir                             SetError( aStr, pTok );
434*cdf0e10cSrcweir                             WriteError( aTokStm );
435*cdf0e10cSrcweir                             return sal_False;
436*cdf0e10cSrcweir                         }
437*cdf0e10cSrcweir                     }
438*cdf0e10cSrcweir                     if( !ReadIdFile( String::CreateFromAscii(aName.GetBuffer()) ) )
439*cdf0e10cSrcweir                     {
440*cdf0e10cSrcweir                         ByteString aStr = "cannot read file: ";
441*cdf0e10cSrcweir                         aStr += aName;
442*cdf0e10cSrcweir                         SetError( aStr, pTok );
443*cdf0e10cSrcweir                         WriteError( aTokStm );
444*cdf0e10cSrcweir                         return sal_False;
445*cdf0e10cSrcweir                     }
446*cdf0e10cSrcweir                 }
447*cdf0e10cSrcweir             }
448*cdf0e10cSrcweir             else
449*cdf0e10cSrcweir                 pTok = aTokStm.GetToken_Next();
450*cdf0e10cSrcweir         }
451*cdf0e10cSrcweir     }
452*cdf0e10cSrcweir     else
453*cdf0e10cSrcweir         return sal_False;
454*cdf0e10cSrcweir     return sal_True;
455*cdf0e10cSrcweir }
456*cdf0e10cSrcweir 
457*cdf0e10cSrcweir /*************************************************************************
458*cdf0e10cSrcweir |*    SvIdlDataBase::FindType()
459*cdf0e10cSrcweir |*
460*cdf0e10cSrcweir |*    Beschreibung
461*cdf0e10cSrcweir *************************************************************************/
462*cdf0e10cSrcweir SvMetaType * SvIdlDataBase::FindType( const SvMetaType * pPType,
463*cdf0e10cSrcweir 									SvMetaTypeMemberList & rList )
464*cdf0e10cSrcweir {
465*cdf0e10cSrcweir 	SvMetaType * pType = rList.First();
466*cdf0e10cSrcweir 	while( pType && pPType != pType )
467*cdf0e10cSrcweir 		pType = rList.Next();
468*cdf0e10cSrcweir 	return pType;
469*cdf0e10cSrcweir }
470*cdf0e10cSrcweir 
471*cdf0e10cSrcweir SvMetaType * SvIdlDataBase::FindType( const ByteString & rName )
472*cdf0e10cSrcweir {
473*cdf0e10cSrcweir 	SvMetaType * pType = aTypeList.First();
474*cdf0e10cSrcweir 	while( pType && rName != pType->GetName() )
475*cdf0e10cSrcweir 		pType = aTypeList.Next();
476*cdf0e10cSrcweir 	return pType;
477*cdf0e10cSrcweir }
478*cdf0e10cSrcweir 
479*cdf0e10cSrcweir /*************************************************************************
480*cdf0e10cSrcweir |*    SvIdlDataBase::ReadKnownType()
481*cdf0e10cSrcweir |*
482*cdf0e10cSrcweir |*    Beschreibung
483*cdf0e10cSrcweir *************************************************************************/
484*cdf0e10cSrcweir SvMetaType * SvIdlDataBase::ReadKnownType( SvTokenStream & rInStm )
485*cdf0e10cSrcweir {
486*cdf0e10cSrcweir     sal_Bool bIn	= sal_False;
487*cdf0e10cSrcweir     sal_Bool bOut	= sal_False;
488*cdf0e10cSrcweir     int nCall0	= CALL_VALUE;
489*cdf0e10cSrcweir     int nCall1	= CALL_VALUE;
490*cdf0e10cSrcweir 	sal_Bool bSet   = sal_False; //irgent ein Attribut gesetzt
491*cdf0e10cSrcweir 
492*cdf0e10cSrcweir     sal_uInt32  nTokPos = rInStm.Tell();
493*cdf0e10cSrcweir     SvToken * pTok = rInStm.GetToken_Next();
494*cdf0e10cSrcweir 
495*cdf0e10cSrcweir 	if( pTok->HasHash() )
496*cdf0e10cSrcweir 	{
497*cdf0e10cSrcweir 	    sal_uInt32 nBeginPos = 0; // kann mit Tell nicht vorkommen
498*cdf0e10cSrcweir 	    while( nBeginPos != rInStm.Tell() )
499*cdf0e10cSrcweir 	    {
500*cdf0e10cSrcweir 	        nBeginPos = rInStm.Tell();
501*cdf0e10cSrcweir 	        if( pTok->Is( SvHash_in() ) )
502*cdf0e10cSrcweir 	        {
503*cdf0e10cSrcweir 	            bIn  = sal_True;
504*cdf0e10cSrcweir 	            pTok = rInStm.GetToken_Next();
505*cdf0e10cSrcweir 				bSet = sal_True;
506*cdf0e10cSrcweir 	        }
507*cdf0e10cSrcweir 	        if( pTok->Is( SvHash_out() ) )
508*cdf0e10cSrcweir 	        {
509*cdf0e10cSrcweir 	            bOut = sal_True;
510*cdf0e10cSrcweir 	            pTok = rInStm.GetToken_Next();
511*cdf0e10cSrcweir 				bSet = sal_True;
512*cdf0e10cSrcweir 	        }
513*cdf0e10cSrcweir 	        if( pTok->Is( SvHash_inout() ) )
514*cdf0e10cSrcweir 	        {
515*cdf0e10cSrcweir 	            bIn  = sal_True;
516*cdf0e10cSrcweir 	            bOut = sal_True;
517*cdf0e10cSrcweir 	            pTok = rInStm.GetToken_Next();
518*cdf0e10cSrcweir 				bSet = sal_True;
519*cdf0e10cSrcweir 	        }
520*cdf0e10cSrcweir 	    }
521*cdf0e10cSrcweir 	}
522*cdf0e10cSrcweir /*
523*cdf0e10cSrcweir     SvMetaTypeList aTmpTypeList;
524*cdf0e10cSrcweir     if( FillTypeList( aTmpTypeList, pTok ) )
525*cdf0e10cSrcweir */
526*cdf0e10cSrcweir     if( pTok->IsIdentifier() )
527*cdf0e10cSrcweir     {
528*cdf0e10cSrcweir         ByteString aName = pTok->GetString();
529*cdf0e10cSrcweir         SvMetaTypeMemberList & rList = GetTypeList();
530*cdf0e10cSrcweir         SvMetaType * pType = rList.First();
531*cdf0e10cSrcweir         while( pType )
532*cdf0e10cSrcweir         {
533*cdf0e10cSrcweir             if( pType->GetName() == aName )
534*cdf0e10cSrcweir 				break;
535*cdf0e10cSrcweir             pType = rList.Next();
536*cdf0e10cSrcweir         }
537*cdf0e10cSrcweir 		if( pType )
538*cdf0e10cSrcweir 		{
539*cdf0e10cSrcweir 			pTok = rInStm.GetToken();
540*cdf0e10cSrcweir 			if( pTok->IsChar() )
541*cdf0e10cSrcweir 			{
542*cdf0e10cSrcweir 				if( pTok->GetChar() == '&' || pTok->GetChar() == '*' )
543*cdf0e10cSrcweir 				{
544*cdf0e10cSrcweir 					nCall0 = (pTok->GetChar() == '&') ? CALL_REFERENCE :
545*cdf0e10cSrcweir 														CALL_POINTER;
546*cdf0e10cSrcweir 					rInStm.GetToken_Next();
547*cdf0e10cSrcweir 					pTok = rInStm.GetToken();
548*cdf0e10cSrcweir 					if( pTok->GetChar() == '&' || pTok->GetChar() == '*' )
549*cdf0e10cSrcweir 					{
550*cdf0e10cSrcweir 						nCall1 = (pTok->GetChar() == '&') ? CALL_REFERENCE :
551*cdf0e10cSrcweir 															CALL_POINTER;
552*cdf0e10cSrcweir 						rInStm.GetToken_Next();
553*cdf0e10cSrcweir 					}
554*cdf0e10cSrcweir 					bSet = sal_True;
555*cdf0e10cSrcweir 				}
556*cdf0e10cSrcweir 			}
557*cdf0e10cSrcweir 			/*
558*cdf0e10cSrcweir 			SvMetaType * pMetaType = aTmpTypeList.First();
559*cdf0e10cSrcweir 			while( pMetaType )
560*cdf0e10cSrcweir 			{
561*cdf0e10cSrcweir 				if( pMetaType->GetIn() == bIn
562*cdf0e10cSrcweir 				  && pMetaType->GetOut() == bOut
563*cdf0e10cSrcweir 				  && pMetaType->GetCall0() == nCall0
564*cdf0e10cSrcweir 				  && pMetaType->GetCall1() == nCall1 )
565*cdf0e10cSrcweir 				{
566*cdf0e10cSrcweir 					return pMetaType;
567*cdf0e10cSrcweir 				}
568*cdf0e10cSrcweir 				pMetaType = aTmpTypeList.Next();
569*cdf0e10cSrcweir 			}
570*cdf0e10cSrcweir 			*/
571*cdf0e10cSrcweir 			//SvMetaType * pType = aTmpTypeList.First();
572*cdf0e10cSrcweir 			if( !bSet )
573*cdf0e10cSrcweir 				// Ist genau dieser Typ
574*cdf0e10cSrcweir 				return pType;
575*cdf0e10cSrcweir 
576*cdf0e10cSrcweir 			DBG_ASSERT( aTmpTypeList.First(), "mindestens ein Element" );
577*cdf0e10cSrcweir 			SvMetaTypeRef xType = new SvMetaType( pType->GetName(), 'h', "dummy" );
578*cdf0e10cSrcweir 			xType->SetRef( pType );
579*cdf0e10cSrcweir 			xType->SetIn( bIn );
580*cdf0e10cSrcweir 			xType->SetOut( bOut );
581*cdf0e10cSrcweir 			xType->SetCall0( nCall0 );
582*cdf0e10cSrcweir 			xType->SetCall1( nCall1 );
583*cdf0e10cSrcweir 
584*cdf0e10cSrcweir 			aTmpTypeList.Append( xType );
585*cdf0e10cSrcweir 			return xType;
586*cdf0e10cSrcweir 		}
587*cdf0e10cSrcweir     }
588*cdf0e10cSrcweir     rInStm.Seek( nTokPos );
589*cdf0e10cSrcweir     return NULL;
590*cdf0e10cSrcweir }
591*cdf0e10cSrcweir 
592*cdf0e10cSrcweir /*************************************************************************
593*cdf0e10cSrcweir |*
594*cdf0e10cSrcweir |*    SvIdlDataBase::ReadKnownAttr()
595*cdf0e10cSrcweir |*
596*cdf0e10cSrcweir |*    Beschreibung
597*cdf0e10cSrcweir |*
598*cdf0e10cSrcweir *************************************************************************/
599*cdf0e10cSrcweir SvMetaAttribute * SvIdlDataBase::ReadKnownAttr
600*cdf0e10cSrcweir (
601*cdf0e10cSrcweir 	SvTokenStream & rInStm,
602*cdf0e10cSrcweir 	SvMetaType *	pType	/* Wenn der pType == NULL, dann muss der Typ
603*cdf0e10cSrcweir 							   noch gelesen werden. */
604*cdf0e10cSrcweir )
605*cdf0e10cSrcweir {
606*cdf0e10cSrcweir     sal_uInt32  nTokPos = rInStm.Tell();
607*cdf0e10cSrcweir 
608*cdf0e10cSrcweir 	if( !pType )
609*cdf0e10cSrcweir     	pType = ReadKnownType( rInStm );
610*cdf0e10cSrcweir 
611*cdf0e10cSrcweir     if( pType )
612*cdf0e10cSrcweir     {
613*cdf0e10cSrcweir 		// Wenn wir Slots auf die Wiese stellen, d"urfen wir nicht voraussetzen,
614*cdf0e10cSrcweir 		// da\s jeder Slot einen anderen Namen hat!
615*cdf0e10cSrcweir /*
616*cdf0e10cSrcweir         SvToken * pTok = rInStm.GetToken_Next();
617*cdf0e10cSrcweir         if( pTok->IsIdentifier() )
618*cdf0e10cSrcweir             for( sal_uLong n = 0; n < aAttrList.Count(); n++ )
619*cdf0e10cSrcweir             {
620*cdf0e10cSrcweir                 SvMetaAttribute * pAttr = aAttrList.GetObject( n );
621*cdf0e10cSrcweir                 if( pAttr->GetName() == pTok->GetString() )
622*cdf0e10cSrcweir                     return pAttr;
623*cdf0e10cSrcweir             }
624*cdf0e10cSrcweir */
625*cdf0e10cSrcweir     }
626*cdf0e10cSrcweir     else
627*cdf0e10cSrcweir     {
628*cdf0e10cSrcweir         // sonst SlotId?
629*cdf0e10cSrcweir         SvToken * pTok = rInStm.GetToken_Next();
630*cdf0e10cSrcweir 	    if( pTok->IsIdentifier() )
631*cdf0e10cSrcweir 	    {
632*cdf0e10cSrcweir 			sal_uLong n;
633*cdf0e10cSrcweir 	        if( FindId( pTok->GetString(), &n ) )
634*cdf0e10cSrcweir 	        {
635*cdf0e10cSrcweir 	            for( sal_uLong i = 0; i < aAttrList.Count(); i++ )
636*cdf0e10cSrcweir 	            {
637*cdf0e10cSrcweir 	                SvMetaAttribute * pAttr = aAttrList.GetObject( i );
638*cdf0e10cSrcweir 	                if( pAttr->GetSlotId() == pTok->GetString() )
639*cdf0e10cSrcweir 	                    return pAttr;
640*cdf0e10cSrcweir 	            }
641*cdf0e10cSrcweir 	        }
642*cdf0e10cSrcweir 
643*cdf0e10cSrcweir 			ByteString aStr( "Nicht gefunden : " );
644*cdf0e10cSrcweir 			aStr += pTok->GetString();
645*cdf0e10cSrcweir             DBG_ERROR( aStr.GetBuffer() );
646*cdf0e10cSrcweir 		}
647*cdf0e10cSrcweir     }
648*cdf0e10cSrcweir 
649*cdf0e10cSrcweir     rInStm.Seek( nTokPos );
650*cdf0e10cSrcweir     return NULL;
651*cdf0e10cSrcweir }
652*cdf0e10cSrcweir 
653*cdf0e10cSrcweir SvMetaAttribute* SvIdlDataBase::SearchKnownAttr
654*cdf0e10cSrcweir (
655*cdf0e10cSrcweir 	const SvNumberIdentifier& rId
656*cdf0e10cSrcweir )
657*cdf0e10cSrcweir {
658*cdf0e10cSrcweir 	sal_uLong n;
659*cdf0e10cSrcweir 	if( FindId( rId, &n ) )
660*cdf0e10cSrcweir 	{
661*cdf0e10cSrcweir 	    for( sal_uLong i = 0; i < aAttrList.Count(); i++ )
662*cdf0e10cSrcweir 	    {
663*cdf0e10cSrcweir 	        SvMetaAttribute * pAttr = aAttrList.GetObject( i );
664*cdf0e10cSrcweir 	        if( pAttr->GetSlotId() == rId )
665*cdf0e10cSrcweir 	            return pAttr;
666*cdf0e10cSrcweir 	    }
667*cdf0e10cSrcweir 	}
668*cdf0e10cSrcweir 
669*cdf0e10cSrcweir 	return NULL;
670*cdf0e10cSrcweir }
671*cdf0e10cSrcweir 
672*cdf0e10cSrcweir /*************************************************************************
673*cdf0e10cSrcweir |*    SvIdlDataBase::ReadKnownClass()
674*cdf0e10cSrcweir |*
675*cdf0e10cSrcweir |*    Beschreibung
676*cdf0e10cSrcweir *************************************************************************/
677*cdf0e10cSrcweir SvMetaClass * SvIdlDataBase::ReadKnownClass( SvTokenStream & rInStm )
678*cdf0e10cSrcweir {
679*cdf0e10cSrcweir     sal_uInt32  nTokPos = rInStm.Tell();
680*cdf0e10cSrcweir     SvToken * pTok = rInStm.GetToken_Next();
681*cdf0e10cSrcweir 
682*cdf0e10cSrcweir     if( pTok->IsIdentifier() )
683*cdf0e10cSrcweir         for( sal_uLong n = 0; n < aClassList.Count(); n++ )
684*cdf0e10cSrcweir         {
685*cdf0e10cSrcweir             SvMetaClass * pClass = aClassList.GetObject( n );
686*cdf0e10cSrcweir             if( pClass->GetName() == pTok->GetString() )
687*cdf0e10cSrcweir                 return pClass;
688*cdf0e10cSrcweir         }
689*cdf0e10cSrcweir 
690*cdf0e10cSrcweir     rInStm.Seek( nTokPos );
691*cdf0e10cSrcweir     return NULL;
692*cdf0e10cSrcweir }
693*cdf0e10cSrcweir 
694*cdf0e10cSrcweir /*************************************************************************
695*cdf0e10cSrcweir |*    SvIdlDataBase::Write()
696*cdf0e10cSrcweir |*
697*cdf0e10cSrcweir |*    Beschreibung
698*cdf0e10cSrcweir *************************************************************************/
699*cdf0e10cSrcweir void SvIdlDataBase::Write( const ByteString & rText )
700*cdf0e10cSrcweir {
701*cdf0e10cSrcweir     if( nVerbosity != 0 )
702*cdf0e10cSrcweir         fprintf( stdout, "%s", rText.GetBuffer() );
703*cdf0e10cSrcweir }
704*cdf0e10cSrcweir 
705*cdf0e10cSrcweir /*************************************************************************
706*cdf0e10cSrcweir |*    SvIdlDataBase::WriteError()
707*cdf0e10cSrcweir |*
708*cdf0e10cSrcweir |*    Beschreibung
709*cdf0e10cSrcweir *************************************************************************/
710*cdf0e10cSrcweir void SvIdlDataBase::WriteError( const ByteString & rErrWrn,
711*cdf0e10cSrcweir 								const ByteString & rFileName,
712*cdf0e10cSrcweir 								const ByteString & rErrorText,
713*cdf0e10cSrcweir 								sal_uLong nRow, sal_uLong nColumn ) const
714*cdf0e10cSrcweir {
715*cdf0e10cSrcweir     //Fehlerbehandlung
716*cdf0e10cSrcweir     fprintf( stderr, "\n%s --- %s: ( %ld, %ld )\n",
717*cdf0e10cSrcweir              rFileName.GetBuffer(), rErrWrn.GetBuffer(), nRow, nColumn );
718*cdf0e10cSrcweir 
719*cdf0e10cSrcweir     if( rErrorText.Len() )
720*cdf0e10cSrcweir     { // Fehler gesetzt
721*cdf0e10cSrcweir         fprintf( stderr, "\t%s\n", rErrorText.GetBuffer() );
722*cdf0e10cSrcweir 	}
723*cdf0e10cSrcweir }
724*cdf0e10cSrcweir 
725*cdf0e10cSrcweir /*************************************************************************
726*cdf0e10cSrcweir |*    SvIdlDataBase::WriteError()
727*cdf0e10cSrcweir |*
728*cdf0e10cSrcweir |*    Beschreibung
729*cdf0e10cSrcweir *************************************************************************/
730*cdf0e10cSrcweir void SvIdlDataBase::WriteError( SvTokenStream & rInStm )
731*cdf0e10cSrcweir {
732*cdf0e10cSrcweir     //Fehlerbehandlung
733*cdf0e10cSrcweir     String aFileName( rInStm.GetFileName() );
734*cdf0e10cSrcweir 	ByteString aErrorText;
735*cdf0e10cSrcweir 	sal_uLong	nRow = 0, nColumn = 0;
736*cdf0e10cSrcweir 
737*cdf0e10cSrcweir     rInStm.SeekEnd();
738*cdf0e10cSrcweir     SvToken *pTok = rInStm.GetToken();
739*cdf0e10cSrcweir 
740*cdf0e10cSrcweir     // Fehlerposition
741*cdf0e10cSrcweir 	nRow 	= pTok->GetLine();
742*cdf0e10cSrcweir 	nColumn = pTok->GetColumn();
743*cdf0e10cSrcweir 
744*cdf0e10cSrcweir     if( aError.IsError() )
745*cdf0e10cSrcweir     { // Fehler gesetzt
746*cdf0e10cSrcweir         // Fehler Token suchen
747*cdf0e10cSrcweir 	    // Fehlertext
748*cdf0e10cSrcweir 		if( aError.GetText().Len() )
749*cdf0e10cSrcweir 		{
750*cdf0e10cSrcweir 			aErrorText = "may be <";
751*cdf0e10cSrcweir         	aErrorText += aError.GetText();
752*cdf0e10cSrcweir 		}
753*cdf0e10cSrcweir 		SvToken * pPrevTok = NULL;
754*cdf0e10cSrcweir         while( pTok != pPrevTok )
755*cdf0e10cSrcweir         {
756*cdf0e10cSrcweir 			pPrevTok = pTok;
757*cdf0e10cSrcweir             if( pTok->GetLine() == aError.nLine
758*cdf0e10cSrcweir               && pTok->GetColumn() == aError.nColumn )
759*cdf0e10cSrcweir                 break;
760*cdf0e10cSrcweir             pTok = rInStm.GetToken_PrevAll();
761*cdf0e10cSrcweir         }
762*cdf0e10cSrcweir 
763*cdf0e10cSrcweir         // Fehlerposition
764*cdf0e10cSrcweir 		aErrorText += "> at ( ";
765*cdf0e10cSrcweir 		aErrorText += ByteString::CreateFromInt64(aError.nLine);
766*cdf0e10cSrcweir 		aErrorText += ", ";
767*cdf0e10cSrcweir 		aErrorText += ByteString::CreateFromInt64(aError.nColumn);
768*cdf0e10cSrcweir 		aErrorText += " )";
769*cdf0e10cSrcweir 
770*cdf0e10cSrcweir 		// Fehler zuruecksetzen
771*cdf0e10cSrcweir 		aError = SvIdlError();
772*cdf0e10cSrcweir     }
773*cdf0e10cSrcweir 
774*cdf0e10cSrcweir     WriteError( "error", ByteString( aFileName, RTL_TEXTENCODING_UTF8 ), aErrorText, nRow, nColumn );
775*cdf0e10cSrcweir 
776*cdf0e10cSrcweir     DBG_ASSERT( pTok, "token must be found" );
777*cdf0e10cSrcweir     if( !pTok )
778*cdf0e10cSrcweir         return;
779*cdf0e10cSrcweir 
780*cdf0e10cSrcweir     // Identifier in der Naehe suchen
781*cdf0e10cSrcweir     if( !pTok->IsIdentifier() )
782*cdf0e10cSrcweir     {
783*cdf0e10cSrcweir         rInStm.GetToken_PrevAll();
784*cdf0e10cSrcweir         pTok = rInStm.GetToken();
785*cdf0e10cSrcweir     }
786*cdf0e10cSrcweir     if( pTok && pTok->IsIdentifier() )
787*cdf0e10cSrcweir     {
788*cdf0e10cSrcweir         ByteString aN = IDLAPP->pHashTable->GetNearString( pTok->GetString() );
789*cdf0e10cSrcweir         if( aN.Len() )
790*cdf0e10cSrcweir             fprintf( stderr, "%s versus %s\n", pTok->GetString().GetBuffer(), aN.GetBuffer() );
791*cdf0e10cSrcweir     }
792*cdf0e10cSrcweir }
793*cdf0e10cSrcweir 
794*cdf0e10cSrcweir /****************** SvIdlWorkingBase ****************************************/
795*cdf0e10cSrcweir /*************************************************************************
796*cdf0e10cSrcweir |*    SvIdlWorkingBase::SvIdlWorkingBase()
797*cdf0e10cSrcweir |*
798*cdf0e10cSrcweir |*    Beschreibung
799*cdf0e10cSrcweir *************************************************************************/
800*cdf0e10cSrcweir SvIdlWorkingBase::SvIdlWorkingBase(const SvCommand& rCmd) : SvIdlDataBase(rCmd)
801*cdf0e10cSrcweir {
802*cdf0e10cSrcweir }
803*cdf0e10cSrcweir 
804*cdf0e10cSrcweir /*************************************************************************
805*cdf0e10cSrcweir |*    SvIdlWorkingBase::ReadSvIdl()
806*cdf0e10cSrcweir |*
807*cdf0e10cSrcweir |*    Beschreibung
808*cdf0e10cSrcweir *************************************************************************/
809*cdf0e10cSrcweir sal_Bool SvIdlWorkingBase::ReadSvIdl( SvTokenStream & rInStm, sal_Bool bImported, const String & rPath )
810*cdf0e10cSrcweir {
811*cdf0e10cSrcweir     aPath = rPath; // nur fuer den durchlauf gueltig
812*cdf0e10cSrcweir     SvToken * pTok;
813*cdf0e10cSrcweir     sal_Bool bOk = sal_True;
814*cdf0e10cSrcweir         pTok = rInStm.GetToken();
815*cdf0e10cSrcweir         // nur ein import ganz am Anfang
816*cdf0e10cSrcweir         if( pTok->Is( SvHash_import() ) )
817*cdf0e10cSrcweir         {
818*cdf0e10cSrcweir             rInStm.GetToken_Next();
819*cdf0e10cSrcweir             rInStm.Read( '(' ); // optional
820*cdf0e10cSrcweir             pTok = rInStm.GetToken_Next();
821*cdf0e10cSrcweir             if( pTok->IsString() )
822*cdf0e10cSrcweir             {
823*cdf0e10cSrcweir                 DirEntry aFullName( String::CreateFromAscii( pTok->GetString().GetBuffer() ) );
824*cdf0e10cSrcweir                 if( aFullName.Find( rPath ) )
825*cdf0e10cSrcweir                 {
826*cdf0e10cSrcweir                     SvFileStream aStm( aFullName.GetFull(),
827*cdf0e10cSrcweir                                         STREAM_STD_READ | STREAM_NOCREATE );
828*cdf0e10cSrcweir                     Load( aStm );
829*cdf0e10cSrcweir                     if( aStm.GetError() != SVSTREAM_OK )
830*cdf0e10cSrcweir                     {
831*cdf0e10cSrcweir                         if( aStm.GetError() == SVSTREAM_WRONGVERSION )
832*cdf0e10cSrcweir                         {
833*cdf0e10cSrcweir                             ByteString aStr( "wrong version, file " );
834*cdf0e10cSrcweir                             aStr += ByteString( aFullName.GetFull(), RTL_TEXTENCODING_UTF8 );
835*cdf0e10cSrcweir                             SetError( aStr, pTok );
836*cdf0e10cSrcweir                             WriteError( rInStm );
837*cdf0e10cSrcweir                             bOk = sal_False;
838*cdf0e10cSrcweir                         }
839*cdf0e10cSrcweir                         else
840*cdf0e10cSrcweir                         {
841*cdf0e10cSrcweir                             aStm.Seek( 0 );
842*cdf0e10cSrcweir                             aStm.ResetError();
843*cdf0e10cSrcweir                             SvTokenStream aTokStm( aStm, aFullName.GetFull() );
844*cdf0e10cSrcweir                             bOk = ReadSvIdl( aTokStm, sal_True, rPath );
845*cdf0e10cSrcweir                         }
846*cdf0e10cSrcweir                     }
847*cdf0e10cSrcweir                 }
848*cdf0e10cSrcweir                 else
849*cdf0e10cSrcweir                     bOk = sal_False;
850*cdf0e10cSrcweir             }
851*cdf0e10cSrcweir             else
852*cdf0e10cSrcweir                 bOk = sal_False;
853*cdf0e10cSrcweir         }
854*cdf0e10cSrcweir 
855*cdf0e10cSrcweir     sal_uInt32 nBeginPos = 0xFFFFFFFF; // kann mit Tell nicht vorkommen
856*cdf0e10cSrcweir 
857*cdf0e10cSrcweir     while( bOk && nBeginPos != rInStm.Tell() )
858*cdf0e10cSrcweir     {
859*cdf0e10cSrcweir         nBeginPos = rInStm.Tell();
860*cdf0e10cSrcweir         pTok = rInStm.GetToken();
861*cdf0e10cSrcweir         if( pTok->IsEof() )
862*cdf0e10cSrcweir             return sal_True;
863*cdf0e10cSrcweir         if( pTok->IsEmpty() )
864*cdf0e10cSrcweir             bOk = sal_False;
865*cdf0e10cSrcweir 
866*cdf0e10cSrcweir         // nur ein import ganz am Anfang
867*cdf0e10cSrcweir         /*else */if( pTok->Is( SvHash_module() ) )
868*cdf0e10cSrcweir         {
869*cdf0e10cSrcweir             SvMetaModuleRef aModule = new SvMetaModule( rInStm.GetFileName(), bImported );
870*cdf0e10cSrcweir             if( aModule->ReadSvIdl( *this, rInStm ) )
871*cdf0e10cSrcweir                 GetModuleList().Append( aModule );
872*cdf0e10cSrcweir             else
873*cdf0e10cSrcweir                 bOk = sal_False;
874*cdf0e10cSrcweir         }
875*cdf0e10cSrcweir         else
876*cdf0e10cSrcweir             bOk = sal_False;
877*cdf0e10cSrcweir     }
878*cdf0e10cSrcweir     if( !bOk || !pTok->IsEof() )
879*cdf0e10cSrcweir     {
880*cdf0e10cSrcweir          //Fehlerbehandlung
881*cdf0e10cSrcweir          WriteError( rInStm );
882*cdf0e10cSrcweir          return sal_False;
883*cdf0e10cSrcweir     }
884*cdf0e10cSrcweir     return sal_True;
885*cdf0e10cSrcweir }
886*cdf0e10cSrcweir 
887*cdf0e10cSrcweir /*************************************************************************
888*cdf0e10cSrcweir |*    SvIdlWorkingBase::WriteSvIdl()
889*cdf0e10cSrcweir |*
890*cdf0e10cSrcweir |*    Beschreibung
891*cdf0e10cSrcweir *************************************************************************/
892*cdf0e10cSrcweir sal_Bool SvIdlWorkingBase::WriteSvIdl( SvStream & rOutStm )
893*cdf0e10cSrcweir {
894*cdf0e10cSrcweir     if( rOutStm.GetError() != SVSTREAM_OK )
895*cdf0e10cSrcweir         return sal_False;
896*cdf0e10cSrcweir 
897*cdf0e10cSrcweir     SvStringHashList aList;
898*cdf0e10cSrcweir     if( GetIdTable() )
899*cdf0e10cSrcweir     {
900*cdf0e10cSrcweir         GetIdTable()->FillHashList( &aList );
901*cdf0e10cSrcweir         SvStringHashEntry * pEntry = aList.First();
902*cdf0e10cSrcweir         while( pEntry )
903*cdf0e10cSrcweir         {
904*cdf0e10cSrcweir             rOutStm << "#define " << pEntry->GetName().GetBuffer()
905*cdf0e10cSrcweir                     << '\t'
906*cdf0e10cSrcweir                     << ByteString::CreateFromInt64(
907*cdf0e10cSrcweir                         pEntry->GetValue() ).GetBuffer()
908*cdf0e10cSrcweir                     << endl;
909*cdf0e10cSrcweir             pEntry = aList.Next();
910*cdf0e10cSrcweir         }
911*cdf0e10cSrcweir     }
912*cdf0e10cSrcweir 
913*cdf0e10cSrcweir     for( sal_uLong n = 0; n < GetModuleList().Count(); n++ )
914*cdf0e10cSrcweir     {
915*cdf0e10cSrcweir         SvMetaModule * pModule = GetModuleList().GetObject( n );
916*cdf0e10cSrcweir         //if( !pModule->IsImported() )
917*cdf0e10cSrcweir             pModule->WriteSvIdl( *this, rOutStm, 0 );
918*cdf0e10cSrcweir     }
919*cdf0e10cSrcweir     return sal_True;
920*cdf0e10cSrcweir }
921*cdf0e10cSrcweir 
922*cdf0e10cSrcweir /*************************************************************************
923*cdf0e10cSrcweir |*    SvIdlWorkingBase::WriteSfx()
924*cdf0e10cSrcweir |*
925*cdf0e10cSrcweir |*    Beschreibung
926*cdf0e10cSrcweir *************************************************************************/
927*cdf0e10cSrcweir sal_Bool SvIdlWorkingBase::WriteSfx( SvStream & rOutStm )
928*cdf0e10cSrcweir {
929*cdf0e10cSrcweir     if( rOutStm.GetError() != SVSTREAM_OK )
930*cdf0e10cSrcweir         return sal_False;
931*cdf0e10cSrcweir 
932*cdf0e10cSrcweir 	// alle Tmp-Variablen fuer das Schreiben zuruecksetzen
933*cdf0e10cSrcweir 	WriteReset();
934*cdf0e10cSrcweir 	SvMemoryStream aTmpStm( 256000, 256000 );
935*cdf0e10cSrcweir 	sal_uLong n;
936*cdf0e10cSrcweir     for( n = 0; n < GetModuleList().Count(); n++ )
937*cdf0e10cSrcweir     {
938*cdf0e10cSrcweir         SvMetaModule * pModule = GetModuleList().GetObject( n );
939*cdf0e10cSrcweir         if( !pModule->IsImported() )
940*cdf0e10cSrcweir             pModule->WriteSfx( *this, aTmpStm );
941*cdf0e10cSrcweir 		aTmpStm.Seek( 0 );
942*cdf0e10cSrcweir     }
943*cdf0e10cSrcweir     for( n = 0; n < aUsedTypes.Count(); n++ )
944*cdf0e10cSrcweir     {
945*cdf0e10cSrcweir         SvMetaType * pType = aUsedTypes.GetObject( n );
946*cdf0e10cSrcweir         pType->WriteSfx( *this, rOutStm );
947*cdf0e10cSrcweir     }
948*cdf0e10cSrcweir 	aUsedTypes.Clear();
949*cdf0e10cSrcweir 	rOutStm << aTmpStm;
950*cdf0e10cSrcweir     return sal_True;
951*cdf0e10cSrcweir }
952*cdf0e10cSrcweir 
953*cdf0e10cSrcweir sal_Bool SvIdlWorkingBase::WriteHelpIds( SvStream& rOutStm )
954*cdf0e10cSrcweir {
955*cdf0e10cSrcweir     if( rOutStm.GetError() != SVSTREAM_OK )
956*cdf0e10cSrcweir         return sal_False;
957*cdf0e10cSrcweir 
958*cdf0e10cSrcweir     Table aIdTable;
959*cdf0e10cSrcweir 	sal_uLong n;
960*cdf0e10cSrcweir     for( n = 0; n < GetModuleList().Count(); n++ )
961*cdf0e10cSrcweir     {
962*cdf0e10cSrcweir         SvMetaModule * pModule = GetModuleList().GetObject( n );
963*cdf0e10cSrcweir         //if( !pModule->IsImported() )
964*cdf0e10cSrcweir             pModule->WriteHelpIds( *this, rOutStm, &aIdTable );
965*cdf0e10cSrcweir     }
966*cdf0e10cSrcweir 
967*cdf0e10cSrcweir     const SvMetaAttributeMemberList & rAttrList = GetAttrList();
968*cdf0e10cSrcweir     for( n = 0; n < rAttrList.Count(); n++ )
969*cdf0e10cSrcweir     {
970*cdf0e10cSrcweir         SvMetaAttribute * pAttr = rAttrList.GetObject( n );
971*cdf0e10cSrcweir         pAttr->WriteHelpId( *this, rOutStm, &aIdTable );
972*cdf0e10cSrcweir     }
973*cdf0e10cSrcweir 
974*cdf0e10cSrcweir 	return sal_True;
975*cdf0e10cSrcweir }
976*cdf0e10cSrcweir 
977*cdf0e10cSrcweir /*************************************************************************
978*cdf0e10cSrcweir |*    SvIdlWorkingBase::WriteSfxItem()
979*cdf0e10cSrcweir |*
980*cdf0e10cSrcweir |*    Beschreibung
981*cdf0e10cSrcweir *************************************************************************/
982*cdf0e10cSrcweir sal_Bool SvIdlWorkingBase::WriteSfxItem( SvStream & )
983*cdf0e10cSrcweir {
984*cdf0e10cSrcweir 	return sal_False;
985*cdf0e10cSrcweir }
986*cdf0e10cSrcweir 
987*cdf0e10cSrcweir void SvIdlDataBase::StartNewFile( const String& rName )
988*cdf0e10cSrcweir {
989*cdf0e10cSrcweir     bExport = ( aExportFile.EqualsIgnoreCaseAscii( rName ) );
990*cdf0e10cSrcweir }
991*cdf0e10cSrcweir 
992*cdf0e10cSrcweir void SvIdlDataBase::AppendAttr( SvMetaAttribute *pAttr )
993*cdf0e10cSrcweir {
994*cdf0e10cSrcweir 	aAttrList.Append( pAttr );
995*cdf0e10cSrcweir 	if ( bExport )
996*cdf0e10cSrcweir 		pAttr->SetNewAttribute( sal_True );
997*cdf0e10cSrcweir }
998*cdf0e10cSrcweir 
999*cdf0e10cSrcweir sal_Bool SvIdlWorkingBase::WriteCSV( SvStream& rStrm )
1000*cdf0e10cSrcweir {
1001*cdf0e10cSrcweir 	SvMetaAttributeMemberList &rList = GetAttrList();
1002*cdf0e10cSrcweir 	sal_uLong nCount = rList.Count();
1003*cdf0e10cSrcweir 	for ( sal_uLong n=0; n<nCount; n++ )
1004*cdf0e10cSrcweir 	{
1005*cdf0e10cSrcweir 		if ( rList.GetObject(n)->IsNewAttribute() )
1006*cdf0e10cSrcweir 		{
1007*cdf0e10cSrcweir 			rList.GetObject(n)->WriteCSV( *this, rStrm );
1008*cdf0e10cSrcweir 		}
1009*cdf0e10cSrcweir 	}
1010*cdf0e10cSrcweir 
1011*cdf0e10cSrcweir 	if ( rStrm.GetError() != SVSTREAM_OK )
1012*cdf0e10cSrcweir 		return sal_False;
1013*cdf0e10cSrcweir 	else
1014*cdf0e10cSrcweir 		return sal_True;
1015*cdf0e10cSrcweir }
1016*cdf0e10cSrcweir 
1017*cdf0e10cSrcweir /*************************************************************************
1018*cdf0e10cSrcweir |*    SvIdlWorkingBase::WriteDocumentation()
1019*cdf0e10cSrcweir |*
1020*cdf0e10cSrcweir |*    Beschreibung
1021*cdf0e10cSrcweir *************************************************************************/
1022*cdf0e10cSrcweir sal_Bool SvIdlWorkingBase::WriteDocumentation( SvStream & rOutStm )
1023*cdf0e10cSrcweir {
1024*cdf0e10cSrcweir     if( rOutStm.GetError() != SVSTREAM_OK )
1025*cdf0e10cSrcweir         return sal_False;
1026*cdf0e10cSrcweir 
1027*cdf0e10cSrcweir     for( sal_uLong n = 0; n < GetModuleList().Count(); n++ )
1028*cdf0e10cSrcweir     {
1029*cdf0e10cSrcweir         SvMetaModule * pModule = GetModuleList().GetObject( n );
1030*cdf0e10cSrcweir         if( !pModule->IsImported() )
1031*cdf0e10cSrcweir             pModule->Write( *this, rOutStm, 0, WRITE_DOCU );
1032*cdf0e10cSrcweir     }
1033*cdf0e10cSrcweir     return sal_True;
1034*cdf0e10cSrcweir }
1035*cdf0e10cSrcweir 
1036*cdf0e10cSrcweir 
1037*cdf0e10cSrcweir 
1038*cdf0e10cSrcweir #endif // IDL_COMPILER
1039*cdf0e10cSrcweir 
1040