blob: 41ea820819b731360dce77d41943151016985629 [file] [log] [blame]
/**************************************************************
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*************************************************************/
#ifndef _RSCDEF_HXX
#define _RSCDEF_HXX
#ifndef _TOOLS_UNQIDX_HXX
#include <tools/unqidx.hxx>
#endif
#include <rsctree.hxx>
/****************** C L A S S E S ****************************************/
class RscExpression;
class RscFileTab;
class RscDefine;
/*********** R s c E x p r e s s i o n ***********************************/
#define RSCEXP_LONG 0
#define RSCEXP_EXP 1
#define RSCEXP_DEF 2
#define RSCEXP_NOTHING 3
class RscExpType
{
public:
union {
RscExpression * pExp;
RscDefine * pDef;
struct {
short nHi;
unsigned short nLo;
} aLong;
} aExp;
char cType;
char cUnused;
sal_Bool IsNumber() const { return( RSCEXP_LONG == cType ); }
sal_Bool IsExpression()const { return( RSCEXP_EXP == cType ); }
sal_Bool IsDefinition()const { return( RSCEXP_DEF == cType ); }
sal_Bool IsNothing() const { return( RSCEXP_NOTHING == cType ); }
void SetLong( sal_Int32 lValue ){
aExp.aLong.nHi = (short)(lValue >> 16);
aExp.aLong.nLo = (unsigned short)lValue;
cType = RSCEXP_LONG;
}
sal_Int32 GetLong() const{
return aExp.aLong.nLo |
((sal_Int32)aExp.aLong.nHi << 16);
}
sal_Bool Evaluate( sal_Int32 * pValue ) const;
void GetMacro( ByteString & ) const;
};
/*********** R s c I d ***************************************************/
class RscId
{
static sal_Bool bNames;// sal_False, bei den Namenoperation nur Zahlen
public:
RscExpType aExp; // Zahl, Define oder Ausdruck
sal_Int32 GetNumber() const;
void Create( const RscExpType & rExpType );
void Create(){ aExp.cType = RSCEXP_NOTHING; }
RscId() { Create(); }
RscId( RscDefine * pEle );
RscId( sal_Int32 lNumber )
{ aExp.SetLong( lNumber ); }
RscId( const RscExpType & rExpType )
{ Create( rExpType ); }
void Destroy();
~RscId(){
Destroy();
}
RscId( const RscId& rRscId );
RscId& operator = ( const RscId& rRscId );
static sal_Bool IsSetNames();
static void SetNames( sal_Bool bSet = sal_True );
operator sal_Int32() const; // Gibt Nummer zurueck
ByteString GetName() const; // Gibt den Namen des Defines zurueck
ByteString GetMacro() const; // Gibt das Macro zurueck
sal_Bool operator < ( const RscId& rRscId ) const;
sal_Bool operator > ( const RscId& rRscId ) const;
sal_Bool operator == ( const RscId& rRscId ) const;
sal_Bool operator <= ( const RscId& rRscId ) const
{ return !(operator > ( rRscId )); }
sal_Bool operator >= ( const RscId& rRscId ) const
{ return !(operator < ( rRscId )); }
sal_Bool IsId() const { return !aExp.IsNothing(); }
};
/*********** R s c D e f i n e *******************************************/
class RscDefine : public StringNode
{
friend class RscFileTab;
friend class RscDefineList;
friend class RscDefTree;
friend class RscExpression;
friend class RscId;
sal_uLong lFileKey; // zu welcher Datei gehoert das Define
sal_uInt32 nRefCount; // Wieviele Referenzen auf dieses Objekt
sal_Int32 lId; // Identifier
RscExpression * pExp; // Ausdruck
protected:
RscDefine( sal_uLong lFileKey, const ByteString & rDefName,
sal_Int32 lDefId );
RscDefine( sal_uLong lFileKey, const ByteString & rDefName,
RscExpression * pExpression );
~RscDefine();
void IncRef(){ nRefCount++; }
sal_uInt32 GetRefCount() const { return nRefCount; }
void DecRef();
void DefineToNumber();
void SetName( const ByteString & rNewName ){ aName = rNewName; }
void ChangeMacro( RscExpression * pExpression );
void ChangeMacro( sal_Int32 lIdentifier );
using StringNode::Search;
public:
RscDefine * Search( const char * );
sal_uLong GetFileKey() const { return lFileKey; }
sal_Bool Evaluate();
sal_Int32 GetNumber() const { return lId; }
ByteString GetMacro();
};
DECLARE_LIST( RscSubDefList, RscDefine * )
class RscDefineList : public RscSubDefList {
friend class RscFile;
friend class RscFileTab;
private:
// pExpression wird auf jedenfall Eigentum der Liste
RscDefine * New( sal_uLong lFileKey, const ByteString & rDefName,
sal_Int32 lDefId, sal_uLong lPos );
RscDefine * New( sal_uLong lFileKey, const ByteString & rDefName,
RscExpression * pExpression, sal_uLong lPos );
sal_Bool Befor( const RscDefine * pFree, const RscDefine * pDepend );
sal_Bool Remove( RscDefine * pDef );
sal_Bool Remove( sal_uLong nIndex );
sal_Bool Remove();
public:
void WriteAll( FILE * fOutput );
};
/*********** R s c E x p r e s s i o n ***********************************/
class RscExpression {
friend class RscFileTab;
char cOperation;
RscExpType aLeftExp;
RscExpType aRightExp;
public:
RscExpression( RscExpType aLE, char cOp,
RscExpType aRE );
~RscExpression();
sal_Bool Evaluate( sal_Int32 * pValue );
ByteString GetMacro();
};
/********************** R S C F I L E ************************************/
class RscDepend {
sal_uLong lKey;
public:
RscDepend( sal_uLong lIncKey ){ lKey = lIncKey; };
sal_uLong GetFileKey(){ return lKey; }
};
DECLARE_LIST( RscDependList, RscDepend * )
// Tabelle die alle Dateinamen enthaelt
class RscFile : public RscDependList
{
friend class RscFileTab;
sal_Bool bIncFile; // Ist es eine Include-Datei
public:
sal_Bool bLoaded; // Ist die Datei geladen
sal_Bool bScanned; // Wurde Datei nach Inclide abgesucht
sal_Bool bDirty; // Dirty-Flag
ByteString aFileName; // Name der Datei
ByteString aPathName; // Pfad und Name der Datei
RscDefineList aDefLst; // Liste der Defines
RscFile();
~RscFile();
sal_Bool InsertDependFile( sal_uLong lDepFile, sal_uLong lPos );
void RemoveDependFile( sal_uLong lDepFile );
sal_Bool Depend( sal_uLong lDepend, sal_uLong lFree );
void SetIncFlag(){ bIncFile = sal_True; };
sal_Bool IsIncFile(){ return bIncFile; };
};
DECLARE_UNIQUEINDEX( RscSubFileTab, RscFile * )
#define NOFILE_INDEX UNIQUEINDEX_ENTRY_NOTFOUND
class RscDefTree {
RscDefine * pDefRoot;
public:
static sal_Bool Evaluate( RscDefine * pDef );
RscDefTree(){ pDefRoot = NULL; }
~RscDefTree();
void Remove();
sal_Bool Evaluate();
RscDefine * Search( const char * pName );
void Insert( RscDefine * pDef );
void Remove( RscDefine * pDef );
};
class RscFileTab : public RscSubFileTab {
RscDefTree aDefTree;
sal_uLong Find( const ByteString & rName );
public:
RscFileTab();
~RscFileTab();
RscDefine * FindDef( const char * );
RscDefine * FindDef( const ByteString& rStr ) { return FindDef( rStr.GetBuffer() ); }
RscDefine * FindDef( sal_uLong lKey, const ByteString & );
sal_Bool Depend( sal_uLong lDepend, sal_uLong lFree );
sal_Bool TestDef( sal_uLong lFileKey, sal_uLong lPos,
const RscDefine * pDefDec );
sal_Bool TestDef( sal_uLong lFileKey, sal_uLong lPos,
const RscExpression * pExpDec );
RscDefine * NewDef( sal_uLong lKey, const ByteString & rDefName,
sal_Int32 lId, sal_uLong lPos );
RscDefine * NewDef( sal_uLong lKey, const ByteString & rDefName,
RscExpression *, sal_uLong lPos );
sal_Bool ChangeDef( const ByteString & rDefName, sal_Int32 lId );
sal_Bool ChangeDef( const ByteString & rDefName, RscExpression * );
sal_Bool IsDefUsed( const ByteString & );
void DeleteDef( const ByteString & );
sal_Bool ChangeDefName( const ByteString & rDefName,
const ByteString & rNewName );
// Alle Defines die in dieser Datei Definiert sind loeschen
void DeleteFileContext( sal_uLong lKey );
void DeleteFile( sal_uLong lKey );
sal_uLong NewCodeFile( const ByteString & rName );
sal_uLong NewIncFile( const ByteString & rName, const ByteString & rPath );
RscFile * GetFile( sal_uLong lFileKey ){ return Get( lFileKey ); }
};
#endif // _RSCDEF_HXX