Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /*
3 : * This file is part of the LibreOffice project.
4 : *
5 : * This Source Code Form is subject to the terms of the Mozilla Public
6 : * License, v. 2.0. If a copy of the MPL was not distributed with this
7 : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 : *
9 : * This file incorporates work covered by the following license notice:
10 : *
11 : * Licensed to the Apache Software Foundation (ASF) under one or more
12 : * contributor license agreements. See the NOTICE file distributed
13 : * with this work for additional information regarding copyright
14 : * ownership. The ASF licenses this file to you under the Apache
15 : * License, Version 2.0 (the "License"); you may not use this file
16 : * except in compliance with the License. You may obtain a copy of
17 : * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 : */
19 : #ifndef _RSCDEF_HXX
20 : #define _RSCDEF_HXX
21 :
22 : #include <tools/unqidx.hxx>
23 : #include <rsctree.hxx>
24 : #include <rtl/strbuf.hxx>
25 : #include <vector>
26 :
27 : /****************** C L A S S E S ****************************************/
28 : class RscExpression;
29 : class RscFileTab;
30 : class RscDefine;
31 :
32 : /*********** R s c E x p r e s s i o n ***********************************/
33 : #define RSCEXP_LONG 0
34 : #define RSCEXP_EXP 1
35 : #define RSCEXP_DEF 2
36 : #define RSCEXP_NOTHING 3
37 :
38 : class RscExpType
39 : {
40 : public:
41 : union {
42 : RscExpression * pExp;
43 : RscDefine * pDef;
44 : struct {
45 : short nHi;
46 : unsigned short nLo;
47 : } aLong;
48 : } aExp;
49 : char cType;
50 : char cUnused;
51 110679 : sal_Bool IsNumber() const { return( RSCEXP_LONG == cType ); }
52 2655056 : sal_Bool IsExpression()const { return( RSCEXP_EXP == cType ); }
53 3868952 : sal_Bool IsDefinition()const { return( RSCEXP_DEF == cType ); }
54 3099701 : sal_Bool IsNothing() const { return( RSCEXP_NOTHING == cType ); }
55 312686 : void SetLong( sal_Int32 lValue ){
56 312686 : aExp.aLong.nHi = (short)(lValue >> 16);
57 312686 : aExp.aLong.nLo = (unsigned short)lValue;
58 312686 : cType = RSCEXP_LONG;
59 312686 : }
60 2630994 : sal_Int32 GetLong() const{
61 : return aExp.aLong.nLo |
62 2630994 : ((sal_Int32)aExp.aLong.nHi << 16);
63 : }
64 : sal_Bool Evaluate( sal_Int32 * pValue ) const;
65 : void AppendMacro( rtl::OStringBuffer & ) const;
66 : };
67 :
68 : /*********** R s c I d ***************************************************/
69 : class RscId
70 : {
71 : static sal_Bool bNames;// sal_False, bei den Namenoperation nur Zahlen
72 : public:
73 : RscExpType aExp; // Zahl, Define oder Ausdruck
74 : sal_Int32 GetNumber() const;
75 : void Create( const RscExpType & rExpType );
76 765265 : void Create(){ aExp.cType = RSCEXP_NOTHING; }
77 :
78 515743 : RscId() { Create(); }
79 :
80 : RscId( RscDefine * pEle );
81 76184 : RscId( sal_Int32 lNumber )
82 76184 : { aExp.SetLong( lNumber ); }
83 :
84 20563 : RscId( const RscExpType & rExpType )
85 20563 : { Create( rExpType ); }
86 :
87 : void Destroy();
88 :
89 631346 : ~RscId(){
90 631346 : Destroy();
91 631346 : }
92 :
93 : RscId( const RscId& rRscId );
94 :
95 : RscId& operator = ( const RscId& rRscId );
96 :
97 : static void SetNames( sal_Bool bSet = sal_True );
98 : operator sal_Int32() const; // Gibt Nummer zurueck
99 : rtl::OString GetName() const; // Gibt den Namen des Defines zurueck
100 : sal_Bool operator < ( const RscId& rRscId ) const;
101 : sal_Bool operator > ( const RscId& rRscId ) const;
102 : sal_Bool operator == ( const RscId& rRscId ) const;
103 0 : sal_Bool operator <= ( const RscId& rRscId ) const
104 0 : { return !(operator > ( rRscId )); }
105 0 : sal_Bool operator >= ( const RscId& rRscId ) const
106 0 : { return !(operator < ( rRscId )); }
107 397874 : sal_Bool IsId() const { return !aExp.IsNothing(); }
108 : };
109 :
110 : /*********** R s c D e f i n e *******************************************/
111 : class RscDefine : public StringNode
112 : {
113 : friend class RscFileTab;
114 : friend class RscDefineList;
115 : friend class RscDefTree;
116 : friend class RscExpression;
117 : friend class RscId;
118 : sal_uLong lFileKey; // zu welcher Datei gehoert das Define
119 : sal_uInt32 nRefCount; // Wieviele Referenzen auf dieses Objekt
120 : sal_Int32 lId; // Identifier
121 : RscExpression * pExp; // Ausdruck
122 : protected:
123 :
124 : RscDefine( sal_uLong lFileKey, const rtl::OString& rDefName,
125 : sal_Int32 lDefId );
126 : RscDefine( sal_uLong lFileKey, const rtl::OString& rDefName,
127 : RscExpression * pExpression );
128 : ~RscDefine();
129 0 : void IncRef(){ nRefCount++; }
130 : sal_uInt32 GetRefCount() const { return nRefCount; }
131 : void DecRef();
132 : void DefineToNumber();
133 0 : void SetName(const rtl::OString& rNewName) { m_aName = rNewName; }
134 :
135 : using StringNode::Search;
136 : public:
137 : RscDefine * Search( const char * );
138 0 : sal_uLong GetFileKey() const { return lFileKey; }
139 : sal_Bool Evaluate();
140 0 : sal_Int32 GetNumber() const { return lId; }
141 : rtl::OString GetMacro();
142 : };
143 :
144 : typedef ::std::vector< RscDefine* > RscSubDefList;
145 :
146 2646 : class RscDefineList {
147 : friend class RscFile;
148 : friend class RscFileTab;
149 : private:
150 : RscSubDefList maList;
151 : // pExpression wird auf jedenfall Eigentum der Liste
152 : RscDefine * New( sal_uLong lFileKey, const rtl::OString& rDefName,
153 : sal_Int32 lDefId, size_t lPos );
154 : RscDefine * New( sal_uLong lFileKey, const rtl::OString& rDefName,
155 : RscExpression * pExpression, size_t lPos );
156 : sal_Bool Remove();
157 0 : size_t GetPos( RscDefine* item ) {
158 0 : for ( size_t i = 0, n = maList.size(); i < n; ++i )
159 0 : if ( maList[ i ] == item )
160 0 : return i;
161 0 : return size_t(-1);
162 : }
163 : public:
164 : void WriteAll( FILE * fOutput );
165 : };
166 :
167 : /*********** R s c E x p r e s s i o n ***********************************/
168 : class RscExpression {
169 : friend class RscFileTab;
170 : char cOperation;
171 : RscExpType aLeftExp;
172 : RscExpType aRightExp;
173 : public:
174 : RscExpression( RscExpType aLE, char cOp,
175 : RscExpType aRE );
176 : ~RscExpression();
177 : sal_Bool Evaluate( sal_Int32 * pValue );
178 : rtl::OString GetMacro();
179 : };
180 :
181 : /********************** R S C F I L E ************************************/
182 : class RscDepend {
183 : sal_uLong lKey;
184 : public:
185 1323 : RscDepend( sal_uLong lIncKey ){ lKey = lIncKey; };
186 816 : sal_uLong GetFileKey(){ return lKey; }
187 : };
188 :
189 : typedef ::std::vector< RscDepend* > RscDependList;
190 :
191 : // Tabelle die alle Dateinamen enthaelt
192 : class RscFile
193 : {
194 : friend class RscFileTab;
195 : sal_Bool bIncFile; // Ist es eine Include-Datei
196 : public:
197 : sal_Bool bLoaded; // Ist die Datei geladen
198 : sal_Bool bScanned; // Wurde Datei nach Inclide abgesucht
199 : sal_Bool bDirty; // Dirty-Flag
200 : rtl::OString aFileName; // Name der Datei
201 : rtl::OString aPathName; // Pfad und Name der Datei
202 : RscDefineList aDefLst; // Liste der Defines
203 : RscDependList aDepLst; // List of Depend
204 :
205 : RscFile();
206 : ~RscFile();
207 : sal_Bool InsertDependFile( sal_uLong lDepFile, size_t lPos );
208 : sal_Bool Depend( sal_uLong lDepend, sal_uLong lFree );
209 0 : void SetIncFlag(){ bIncFile = sal_True; };
210 2077 : sal_Bool IsIncFile(){ return bIncFile; };
211 : };
212 :
213 : typedef UniqueIndex<RscFile> RscSubFileTab;
214 : #define NOFILE_INDEX UNIQUEINDEX_ENTRY_NOTFOUND
215 :
216 : class RscDefTree {
217 : RscDefine * pDefRoot;
218 : public:
219 : static sal_Bool Evaluate( RscDefine * pDef );
220 691 : RscDefTree(){ pDefRoot = NULL; }
221 : ~RscDefTree();
222 : void Remove();
223 : RscDefine * Search( const char * pName );
224 : void Insert( RscDefine * pDef );
225 : void Remove( RscDefine * pDef );
226 : };
227 :
228 : class RscFileTab : public RscSubFileTab
229 : {
230 : RscDefTree aDefTree;
231 : sal_uLong Find(const rtl::OString& rName);
232 : public:
233 : RscFileTab();
234 : ~RscFileTab();
235 :
236 : RscDefine * FindDef( const char * );
237 0 : RscDefine * FindDef(const rtl::OString& rStr)
238 : {
239 0 : return FindDef(rStr.getStr());
240 : }
241 :
242 : sal_Bool Depend( sal_uLong lDepend, sal_uLong lFree );
243 : sal_Bool TestDef( sal_uLong lFileKey, size_t lPos,
244 : const RscDefine * pDefDec );
245 : sal_Bool TestDef( sal_uLong lFileKey, size_t lPos,
246 : const RscExpression * pExpDec );
247 :
248 : RscDefine * NewDef( sal_uLong lKey, const rtl::OString& rDefName,
249 : sal_Int32 lId, sal_uLong lPos );
250 : RscDefine * NewDef( sal_uLong lKey, const rtl::OString& rDefName,
251 : RscExpression *, sal_uLong lPos );
252 :
253 : // Alle Defines die in dieser Datei Definiert sind loeschen
254 : void DeleteFileContext( sal_uLong lKey );
255 : sal_uLong NewCodeFile(const rtl::OString& rName);
256 : sal_uLong NewIncFile(const rtl::OString& rName, const rtl::OString& rPath);
257 186 : RscFile * GetFile( sal_uLong lFileKey ){ return Get( lFileKey ); }
258 : };
259 :
260 : #endif // _RSCDEF_HXX
261 :
262 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|