xref: /aoo41x/main/rsc/inc/rscdef.hxx (revision f7c60c9c)
1*f7c60c9cSAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
3*f7c60c9cSAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4*f7c60c9cSAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5*f7c60c9cSAndrew Rist  * distributed with this work for additional information
6*f7c60c9cSAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7*f7c60c9cSAndrew Rist  * to you under the Apache License, Version 2.0 (the
8*f7c60c9cSAndrew Rist  * "License"); you may not use this file except in compliance
9*f7c60c9cSAndrew Rist  * with the License.  You may obtain a copy of the License at
10*f7c60c9cSAndrew Rist  *
11*f7c60c9cSAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12*f7c60c9cSAndrew Rist  *
13*f7c60c9cSAndrew Rist  * Unless required by applicable law or agreed to in writing,
14*f7c60c9cSAndrew Rist  * software distributed under the License is distributed on an
15*f7c60c9cSAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*f7c60c9cSAndrew Rist  * KIND, either express or implied.  See the License for the
17*f7c60c9cSAndrew Rist  * specific language governing permissions and limitations
18*f7c60c9cSAndrew Rist  * under the License.
19*f7c60c9cSAndrew Rist  *
20*f7c60c9cSAndrew Rist  *************************************************************/
21*f7c60c9cSAndrew Rist 
22*f7c60c9cSAndrew Rist 
23cdf0e10cSrcweir #ifndef _RSCDEF_HXX
24cdf0e10cSrcweir #define _RSCDEF_HXX
25cdf0e10cSrcweir 
26cdf0e10cSrcweir #ifndef _TOOLS_UNQIDX_HXX
27cdf0e10cSrcweir #include <tools/unqidx.hxx>
28cdf0e10cSrcweir #endif
29cdf0e10cSrcweir #include <rsctree.hxx>
30cdf0e10cSrcweir 
31cdf0e10cSrcweir /****************** C L A S S E S ****************************************/
32cdf0e10cSrcweir class RscExpression;
33cdf0e10cSrcweir class RscFileTab;
34cdf0e10cSrcweir class RscDefine;
35cdf0e10cSrcweir 
36cdf0e10cSrcweir /*********** R s c E x p r e s s i o n ***********************************/
37cdf0e10cSrcweir #define RSCEXP_LONG 	0
38cdf0e10cSrcweir #define RSCEXP_EXP		1
39cdf0e10cSrcweir #define RSCEXP_DEF		2
40cdf0e10cSrcweir #define RSCEXP_NOTHING	3
41cdf0e10cSrcweir 
42cdf0e10cSrcweir class RscExpType
43cdf0e10cSrcweir {
44cdf0e10cSrcweir public:
45cdf0e10cSrcweir 	union {
46cdf0e10cSrcweir 		RscExpression * pExp;
47cdf0e10cSrcweir 		RscDefine	  * pDef;
48cdf0e10cSrcweir 		struct {
49cdf0e10cSrcweir 			 short			 nHi;
50cdf0e10cSrcweir 			 unsigned short  nLo;
51cdf0e10cSrcweir 		} aLong;
52cdf0e10cSrcweir 	} aExp;
53cdf0e10cSrcweir 	char cType;
54cdf0e10cSrcweir 	char cUnused;
IsNumber() const55cdf0e10cSrcweir 	sal_Bool IsNumber()    const { return( RSCEXP_LONG	   == cType ); }
IsExpression() const56cdf0e10cSrcweir 	sal_Bool IsExpression()const { return( RSCEXP_EXP	   == cType ); }
IsDefinition() const57cdf0e10cSrcweir 	sal_Bool IsDefinition()const { return( RSCEXP_DEF	   == cType ); }
IsNothing() const58cdf0e10cSrcweir 	sal_Bool IsNothing()   const { return( RSCEXP_NOTHING  == cType ); }
SetLong(sal_Int32 lValue)59cdf0e10cSrcweir 	void SetLong( sal_Int32 lValue ){
60cdf0e10cSrcweir 			aExp.aLong.nHi = (short)(lValue >> 16);
61cdf0e10cSrcweir 			aExp.aLong.nLo = (unsigned short)lValue;
62cdf0e10cSrcweir 			cType = RSCEXP_LONG;
63cdf0e10cSrcweir 		 }
GetLong() const64cdf0e10cSrcweir 	sal_Int32 GetLong() const{
65cdf0e10cSrcweir 			 return aExp.aLong.nLo |
66cdf0e10cSrcweir 					((sal_Int32)aExp.aLong.nHi << 16);
67cdf0e10cSrcweir 		 }
68cdf0e10cSrcweir 	sal_Bool Evaluate( sal_Int32 * pValue ) const;
69cdf0e10cSrcweir 	void GetMacro( ByteString & ) const;
70cdf0e10cSrcweir };
71cdf0e10cSrcweir 
72cdf0e10cSrcweir /*********** R s c I d ***************************************************/
73cdf0e10cSrcweir class RscId
74cdf0e10cSrcweir {
75cdf0e10cSrcweir 	static		sal_Bool bNames;// sal_False, bei den Namenoperation nur Zahlen
76cdf0e10cSrcweir public:
77cdf0e10cSrcweir 	RscExpType	aExp;		// Zahl, Define oder Ausdruck
78cdf0e10cSrcweir 	sal_Int32	GetNumber() const;
79cdf0e10cSrcweir 	void	Create( const RscExpType & rExpType );
Create()80cdf0e10cSrcweir 	void	Create(){ aExp.cType = RSCEXP_NOTHING; }
81cdf0e10cSrcweir 
RscId()82cdf0e10cSrcweir 			RscId() { Create(); 						}
83cdf0e10cSrcweir 
84cdf0e10cSrcweir 			RscId( RscDefine * pEle );
RscId(sal_Int32 lNumber)85cdf0e10cSrcweir 			RscId( sal_Int32 lNumber )
86cdf0e10cSrcweir 					{ aExp.SetLong( lNumber );			}
87cdf0e10cSrcweir 
RscId(const RscExpType & rExpType)88cdf0e10cSrcweir 			RscId( const RscExpType & rExpType )
89cdf0e10cSrcweir 					{ Create( rExpType );				}
90cdf0e10cSrcweir 
91cdf0e10cSrcweir 			void Destroy();
92cdf0e10cSrcweir 
~RscId()93cdf0e10cSrcweir 			~RscId(){
94cdf0e10cSrcweir 				Destroy();
95cdf0e10cSrcweir 			}
96cdf0e10cSrcweir 
97cdf0e10cSrcweir 			RscId( const RscId& rRscId );
98cdf0e10cSrcweir 
99cdf0e10cSrcweir 			RscId& operator = ( const RscId& rRscId );
100cdf0e10cSrcweir 
101cdf0e10cSrcweir 	static sal_Bool    IsSetNames();
102cdf0e10cSrcweir 	static void    SetNames( sal_Bool bSet = sal_True );
103cdf0e10cSrcweir 	operator	     sal_Int32() const;   // Gibt Nummer zurueck
104cdf0e10cSrcweir 	ByteString	   GetName()  const;   // Gibt den Namen des Defines zurueck
105cdf0e10cSrcweir 	ByteString	   GetMacro()  const;  // Gibt das Macro zurueck
106cdf0e10cSrcweir 	sal_Bool	operator <	( const RscId& rRscId ) const;
107cdf0e10cSrcweir 	sal_Bool	operator >	( const RscId& rRscId ) const;
108cdf0e10cSrcweir 	sal_Bool	operator == ( const RscId& rRscId ) const;
operator <=(const RscId & rRscId) const109cdf0e10cSrcweir 	sal_Bool	operator <=  ( const RscId& rRscId ) const
110cdf0e10cSrcweir 			{ return !(operator > ( rRscId )); }
operator >=(const RscId & rRscId) const111cdf0e10cSrcweir 	sal_Bool	operator >= ( const RscId& rRscId ) const
112cdf0e10cSrcweir 			{ return !(operator < ( rRscId )); }
IsId() const113cdf0e10cSrcweir 	sal_Bool	IsId() const { return !aExp.IsNothing(); }
114cdf0e10cSrcweir };
115cdf0e10cSrcweir 
116cdf0e10cSrcweir /*********** R s c D e f i n e *******************************************/
117cdf0e10cSrcweir class RscDefine : public StringNode
118cdf0e10cSrcweir {
119cdf0e10cSrcweir friend class RscFileTab;
120cdf0e10cSrcweir friend class RscDefineList;
121cdf0e10cSrcweir friend class RscDefTree;
122cdf0e10cSrcweir friend class RscExpression;
123cdf0e10cSrcweir friend class RscId;
124cdf0e10cSrcweir 	sal_uLong			lFileKey;	// zu welcher Datei gehoert das Define
125cdf0e10cSrcweir 	sal_uInt32			nRefCount;	// Wieviele Referenzen auf dieses Objekt
126cdf0e10cSrcweir 	sal_Int32			lId;		// Identifier
127cdf0e10cSrcweir 	RscExpression * pExp;		// Ausdruck
128cdf0e10cSrcweir protected:
129cdf0e10cSrcweir 
130cdf0e10cSrcweir 			RscDefine( sal_uLong lFileKey, const ByteString & rDefName,
131cdf0e10cSrcweir 					   sal_Int32 lDefId );
132cdf0e10cSrcweir 			RscDefine( sal_uLong lFileKey, const ByteString & rDefName,
133cdf0e10cSrcweir 					   RscExpression * pExpression );
134cdf0e10cSrcweir 			~RscDefine();
IncRef()135cdf0e10cSrcweir 	void	IncRef(){ nRefCount++; }
GetRefCount() const136cdf0e10cSrcweir 	sal_uInt32	GetRefCount() const    { return nRefCount; }
137cdf0e10cSrcweir 	void	DecRef();
138cdf0e10cSrcweir 	void	DefineToNumber();
SetName(const ByteString & rNewName)139cdf0e10cSrcweir 	void	SetName( const ByteString & rNewName ){ aName = rNewName; }
140cdf0e10cSrcweir 	void	ChangeMacro( RscExpression * pExpression );
141cdf0e10cSrcweir 	void	ChangeMacro( sal_Int32 lIdentifier );
142cdf0e10cSrcweir 
143cdf0e10cSrcweir     using StringNode::Search;
144cdf0e10cSrcweir public:
145cdf0e10cSrcweir 	RscDefine * Search( const char * );
GetFileKey() const146cdf0e10cSrcweir 	sal_uLong		GetFileKey() const { return lFileKey; }
147cdf0e10cSrcweir 	sal_Bool		Evaluate();
GetNumber() const148cdf0e10cSrcweir 	sal_Int32		GetNumber() const  { return lId;	  }
149cdf0e10cSrcweir 	ByteString	GetMacro();
150cdf0e10cSrcweir };
151cdf0e10cSrcweir 
152cdf0e10cSrcweir DECLARE_LIST( RscSubDefList, RscDefine * )
153cdf0e10cSrcweir 
154cdf0e10cSrcweir class RscDefineList : public RscSubDefList {
155cdf0e10cSrcweir friend class RscFile;
156cdf0e10cSrcweir friend class RscFileTab;
157cdf0e10cSrcweir private:
158cdf0e10cSrcweir 				// pExpression wird auf jedenfall Eigentum der Liste
159cdf0e10cSrcweir 	RscDefine * New( sal_uLong lFileKey, const ByteString & rDefName,
160cdf0e10cSrcweir 					 sal_Int32 lDefId, sal_uLong lPos );
161cdf0e10cSrcweir 	RscDefine * New( sal_uLong lFileKey, const ByteString & rDefName,
162cdf0e10cSrcweir 					 RscExpression * pExpression, sal_uLong lPos );
163cdf0e10cSrcweir 	sal_Bool		Befor( const RscDefine * pFree, const RscDefine * pDepend );
164cdf0e10cSrcweir 	sal_Bool		Remove( RscDefine * pDef );
165cdf0e10cSrcweir 	sal_Bool		Remove( sal_uLong nIndex );
166cdf0e10cSrcweir 	sal_Bool		Remove();
167cdf0e10cSrcweir public:
168cdf0e10cSrcweir 	void		WriteAll( FILE * fOutput );
169cdf0e10cSrcweir };
170cdf0e10cSrcweir 
171cdf0e10cSrcweir /*********** R s c E x p r e s s i o n ***********************************/
172cdf0e10cSrcweir class RscExpression {
173cdf0e10cSrcweir friend class RscFileTab;
174cdf0e10cSrcweir 	char		cOperation;
175cdf0e10cSrcweir 	RscExpType	aLeftExp;
176cdf0e10cSrcweir 	RscExpType	aRightExp;
177cdf0e10cSrcweir public:
178cdf0e10cSrcweir 				RscExpression( RscExpType aLE, char cOp,
179cdf0e10cSrcweir 							   RscExpType aRE );
180cdf0e10cSrcweir 				~RscExpression();
181cdf0e10cSrcweir 	sal_Bool		Evaluate( sal_Int32 * pValue );
182cdf0e10cSrcweir 	ByteString	GetMacro();
183cdf0e10cSrcweir };
184cdf0e10cSrcweir 
185cdf0e10cSrcweir /********************** R S C F I L E ************************************/
186cdf0e10cSrcweir class RscDepend {
187cdf0e10cSrcweir 	sal_uLong			 lKey;
188cdf0e10cSrcweir public:
RscDepend(sal_uLong lIncKey)189cdf0e10cSrcweir 			RscDepend( sal_uLong lIncKey ){ lKey = lIncKey; };
GetFileKey()190cdf0e10cSrcweir 	sal_uLong	GetFileKey(){ return lKey; }
191cdf0e10cSrcweir };
192cdf0e10cSrcweir DECLARE_LIST( RscDependList, RscDepend * )
193cdf0e10cSrcweir 
194cdf0e10cSrcweir // Tabelle die alle Dateinamen enthaelt
195cdf0e10cSrcweir class RscFile : public RscDependList
196cdf0e10cSrcweir {
197cdf0e10cSrcweir friend class RscFileTab;
198cdf0e10cSrcweir 	sal_Bool			bIncFile;	// Ist es eine Include-Datei
199cdf0e10cSrcweir public:
200cdf0e10cSrcweir 	sal_Bool			bLoaded;	// Ist die Datei geladen
201cdf0e10cSrcweir 	sal_Bool			bScanned;	// Wurde Datei nach Inclide abgesucht
202cdf0e10cSrcweir 	sal_Bool			bDirty; 	// Dirty-Flag
203cdf0e10cSrcweir 	ByteString		aFileName;	// Name der Datei
204cdf0e10cSrcweir 	ByteString		aPathName;	// Pfad und Name der Datei
205cdf0e10cSrcweir 	RscDefineList	aDefLst;	// Liste der Defines
206cdf0e10cSrcweir 
207cdf0e10cSrcweir 					RscFile();
208cdf0e10cSrcweir 					~RscFile();
209cdf0e10cSrcweir 	sal_Bool			InsertDependFile( sal_uLong lDepFile, sal_uLong lPos );
210cdf0e10cSrcweir 	void			RemoveDependFile( sal_uLong lDepFile );
211cdf0e10cSrcweir 	sal_Bool			Depend( sal_uLong lDepend, sal_uLong lFree );
SetIncFlag()212cdf0e10cSrcweir 	void			SetIncFlag(){ bIncFile = sal_True; };
IsIncFile()213cdf0e10cSrcweir 	sal_Bool			IsIncFile(){  return bIncFile; };
214cdf0e10cSrcweir };
215cdf0e10cSrcweir 
216cdf0e10cSrcweir DECLARE_UNIQUEINDEX( RscSubFileTab, RscFile * )
217cdf0e10cSrcweir #define NOFILE_INDEX UNIQUEINDEX_ENTRY_NOTFOUND
218cdf0e10cSrcweir 
219cdf0e10cSrcweir class RscDefTree {
220cdf0e10cSrcweir 	RscDefine * pDefRoot;
221cdf0e10cSrcweir public:
222cdf0e10cSrcweir 	static sal_Bool Evaluate( RscDefine * pDef );
RscDefTree()223cdf0e10cSrcweir 				RscDefTree(){ pDefRoot = NULL; }
224cdf0e10cSrcweir 				~RscDefTree();
225cdf0e10cSrcweir 	void		Remove();
226cdf0e10cSrcweir 	sal_Bool		Evaluate();
227cdf0e10cSrcweir 	RscDefine * Search( const char * pName );
228cdf0e10cSrcweir 	void		Insert( RscDefine * pDef );
229cdf0e10cSrcweir 	void		Remove( RscDefine * pDef );
230cdf0e10cSrcweir };
231cdf0e10cSrcweir 
232cdf0e10cSrcweir class RscFileTab : public RscSubFileTab {
233cdf0e10cSrcweir 	RscDefTree aDefTree;
234cdf0e10cSrcweir 	sal_uLong		Find( const ByteString & rName );
235cdf0e10cSrcweir public:
236cdf0e10cSrcweir 				RscFileTab();
237cdf0e10cSrcweir 				~RscFileTab();
238cdf0e10cSrcweir 
239cdf0e10cSrcweir 	RscDefine * FindDef( const char * );
FindDef(const ByteString & rStr)240cdf0e10cSrcweir 	RscDefine * FindDef( const ByteString& rStr ) { return FindDef( rStr.GetBuffer() ); }
241cdf0e10cSrcweir 	RscDefine * FindDef( sal_uLong lKey, const ByteString & );
242cdf0e10cSrcweir 
243cdf0e10cSrcweir 	sal_Bool		Depend( sal_uLong lDepend, sal_uLong lFree );
244cdf0e10cSrcweir 	sal_Bool		TestDef( sal_uLong lFileKey, sal_uLong lPos,
245cdf0e10cSrcweir 						 const RscDefine * pDefDec );
246cdf0e10cSrcweir 	sal_Bool		TestDef( sal_uLong lFileKey, sal_uLong lPos,
247cdf0e10cSrcweir 						 const RscExpression * pExpDec );
248cdf0e10cSrcweir 
249cdf0e10cSrcweir 	RscDefine * NewDef( sal_uLong lKey, const ByteString & rDefName,
250cdf0e10cSrcweir 						sal_Int32 lId, sal_uLong lPos );
251cdf0e10cSrcweir 	RscDefine * NewDef( sal_uLong lKey, const ByteString & rDefName,
252cdf0e10cSrcweir 						RscExpression *, sal_uLong lPos );
253cdf0e10cSrcweir 
254cdf0e10cSrcweir 	sal_Bool		ChangeDef( const ByteString & rDefName, sal_Int32 lId );
255cdf0e10cSrcweir 	sal_Bool		ChangeDef( const ByteString & rDefName, RscExpression * );
256cdf0e10cSrcweir 
257cdf0e10cSrcweir 	sal_Bool IsDefUsed( const ByteString & );
258cdf0e10cSrcweir 	void DeleteDef( const ByteString & );
259cdf0e10cSrcweir 	sal_Bool ChangeDefName( const ByteString & rDefName,
260cdf0e10cSrcweir 						const ByteString & rNewName );
261cdf0e10cSrcweir 
262cdf0e10cSrcweir 		   // Alle Defines die in dieser Datei Definiert sind loeschen
263cdf0e10cSrcweir 	void   DeleteFileContext( sal_uLong lKey );
264cdf0e10cSrcweir 	void   DeleteFile( sal_uLong lKey );
265cdf0e10cSrcweir 	sal_uLong  NewCodeFile( const ByteString & rName );
266cdf0e10cSrcweir 	sal_uLong  NewIncFile( const ByteString & rName, const ByteString & rPath );
GetFile(sal_uLong lFileKey)267cdf0e10cSrcweir 	RscFile * GetFile( sal_uLong lFileKey ){ return Get( lFileKey ); }
268cdf0e10cSrcweir };
269cdf0e10cSrcweir 
270cdf0e10cSrcweir #endif // _RSCDEF_HXX
271