summaryrefslogtreecommitdiff
path: root/idl/inc/lex.hxx
diff options
context:
space:
mode:
Diffstat (limited to 'idl/inc/lex.hxx')
-rw-r--r--idl/inc/lex.hxx271
1 files changed, 271 insertions, 0 deletions
diff --git a/idl/inc/lex.hxx b/idl/inc/lex.hxx
new file mode 100644
index 000000000000..b42a7ce4b0f2
--- /dev/null
+++ b/idl/inc/lex.hxx
@@ -0,0 +1,271 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#ifndef _LEX_HXX
+#define _LEX_HXX
+
+#include <hash.hxx>
+#include <tools/gen.hxx>
+#include <tools/stream.hxx>
+
+/******************** enum ***********************************************/
+enum SVTOKEN_ENUM { SVTOKEN_EMPTY, SVTOKEN_COMMENT,
+ SVTOKEN_INTEGER, SVTOKEN_STRING,
+ SVTOKEN_BOOL, SVTOKEN_IDENTIFIER,
+ SVTOKEN_CHAR, SVTOKEN_RTTIBASE,
+ SVTOKEN_EOF, SVTOKEN_HASHID };
+
+/******************** class SvToken **************************************/
+class BigInt;
+class SvToken
+{
+friend class SvTokenStream;
+ ULONG nLine, nColumn;
+ SVTOKEN_ENUM nType;
+ ByteString aString;
+ union
+ {
+ ULONG nLong;
+ BOOL bBool;
+ char cChar;
+// SvRttiBase * pComplexObj;
+ SvStringHashEntry * pHash;
+ };
+public:
+ SvToken();
+ SvToken( const SvToken & rObj );
+ SvToken( ULONG n );
+ SvToken( SVTOKEN_ENUM nTypeP, BOOL b );
+ SvToken( char c );
+ SvToken( SVTOKEN_ENUM nTypeP, const ByteString & rStr );
+// SvToken( SvRttiBase * pComplexObj );
+ SvToken( SVTOKEN_ENUM nTypeP );
+
+ SvToken & operator = ( const SvToken & rObj );
+
+ ByteString GetTokenAsString() const;
+ SVTOKEN_ENUM GetType() const { return nType; }
+
+ void SetLine( ULONG nLineP ) { nLine = nLineP; }
+ ULONG GetLine() const { return nLine; }
+
+ void SetColumn( ULONG nColumnP ) { nColumn = nColumnP; }
+ ULONG GetColumn() const { return nColumn; }
+
+ BOOL IsEmpty() const { return nType == SVTOKEN_EMPTY; }
+ BOOL IsComment() const { return nType == SVTOKEN_COMMENT; }
+ BOOL IsInteger() const { return nType == SVTOKEN_INTEGER; }
+ BOOL IsString() const { return nType == SVTOKEN_STRING; }
+ BOOL IsBool() const { return nType == SVTOKEN_BOOL; }
+ BOOL IsIdentifierHash() const
+ { return nType == SVTOKEN_HASHID; }
+ BOOL IsIdentifier() const
+ {
+ return nType == SVTOKEN_IDENTIFIER
+ || nType == SVTOKEN_HASHID;
+ }
+ BOOL IsChar() const { return nType == SVTOKEN_CHAR; }
+ BOOL IsRttiBase() const { return nType == SVTOKEN_RTTIBASE; }
+ BOOL IsEof() const { return nType == SVTOKEN_EOF; }
+
+ const ByteString & GetString() const
+ {
+ return IsIdentifierHash()
+ ? pHash->GetName()
+ : aString;
+ }
+ ULONG GetNumber() const { return nLong; }
+ BOOL GetBool() const { return bBool; }
+ char GetChar() const { return cChar; }
+// SvRttiBase *GetObject() const { return pComplexObj; }
+
+ void SetHash( SvStringHashEntry * pHashP )
+ { pHash = pHashP; nType = SVTOKEN_HASHID; }
+ BOOL HasHash() const
+ { return nType == SVTOKEN_HASHID; }
+ SvStringHashEntry * GetHash() const { return pHash; }
+ BOOL Is( SvStringHashEntry * pEntry ) const
+ { return IsIdentifierHash() && pHash == pEntry; }
+};
+
+inline SvToken::SvToken()
+ : nType( SVTOKEN_EMPTY ) {}
+
+inline SvToken::SvToken( ULONG n )
+ : nType( SVTOKEN_INTEGER ), nLong( n ) {}
+
+inline SvToken::SvToken( SVTOKEN_ENUM nTypeP, BOOL b )
+ : nType( nTypeP ), bBool( b ) {}
+
+inline SvToken::SvToken( char c )
+ : nType( SVTOKEN_CHAR ), cChar( c ) {}
+
+inline SvToken::SvToken( SVTOKEN_ENUM nTypeP, const ByteString & rStr )
+ : nType( nTypeP ), aString( rStr ) {}
+
+/*
+inline SvToken::SvToken( SvRttiBase * pObj )
+ : nType( SVTOKEN_RTTIBASE ), pComplexObj( pObj )
+ { pObj->AddRef(); }
+*/
+
+inline SvToken::SvToken( SVTOKEN_ENUM nTypeP )
+: nType( nTypeP ) {}
+
+DECLARE_LIST( SvTokenList, SvToken * )
+
+/******************** class SvTokenStream ********************************/
+class SvTokenStream
+{
+ ULONG nLine, nColumn;
+ int nBufPos;
+ int c; // naechstes Zeichen
+ CharSet nCharSet;
+ char * pCharTab; // Zeiger auf die Konverierungstabelle
+ USHORT nTabSize; // Tabulator Laenge
+ ByteString aStrTrue;
+ ByteString aStrFalse;
+ ULONG nMaxPos;
+
+ SvFileStream * pInStream;
+ SvStream & rInStream;
+ String aFileName;
+ SvTokenList aTokList;
+ SvToken * pCurToken;
+
+ void InitCtor();
+
+ ByteString aBufStr;
+ int GetNextChar();
+ int GetFastNextChar()
+ {
+ return aBufStr.GetChar((USHORT)nBufPos++);
+ }
+
+ void FillTokenList();
+ ULONG GetNumber();
+ BOOL MakeToken( SvToken & );
+ BOOL IsEof() const { return rInStream.IsEof(); }
+ void SetMax()
+ {
+ ULONG n = Tell();
+ if( n > nMaxPos )
+ nMaxPos = n;
+ }
+ void CalcColumn()
+ {
+ // wenn Zeilenende berechnung sparen
+ if( 0 != c )
+ {
+ USHORT n = 0;
+ nColumn = 0;
+ while( n < nBufPos )
+ nColumn += aBufStr.GetChar(n++) == '\t' ? nTabSize : 1;
+ }
+ }
+public:
+ SvTokenStream( const String & rFileName );
+ SvTokenStream( SvStream & rInStream, const String & rFileName );
+ ~SvTokenStream();
+
+ const String & GetFileName() const { return aFileName; }
+ SvStream & GetStream() { return rInStream; }
+
+ void SetCharSet( CharSet nSet );
+ CharSet GetCharSet() const { return nCharSet; }
+
+ void SetTabSize( USHORT nTabSizeP )
+ { nTabSize = nTabSizeP; }
+ USHORT GetTabSize() const { return nTabSize; }
+
+ SvToken * GetToken_PrevAll()
+ {
+ SvToken * pRetToken = pCurToken;
+ if( NULL == (pCurToken = aTokList.Prev()) )
+ // Current Zeiger nie Null
+ pCurToken = pRetToken;
+
+ return pRetToken;
+ }
+ SvToken * GetToken_NextAll()
+ {
+ SvToken * pRetToken = pCurToken;
+ if( NULL == (pCurToken = aTokList.Next()) )
+ // Current Zeiger nie Null
+ pCurToken = pRetToken;
+ SetMax();
+ return pRetToken;
+ }
+ SvToken * GetToken_Next()
+ {
+ // Kommentare werden initial entfernt
+ return GetToken_NextAll();
+ }
+ SvToken * GetToken() const { return pCurToken; }
+ BOOL Read( char cChar )
+ {
+ if( pCurToken->IsChar()
+ && cChar == pCurToken->GetChar() )
+ {
+ GetToken_Next();
+ return TRUE;
+ }
+ else
+ return FALSE;
+ }
+ void ReadDelemiter()
+ {
+ if( pCurToken->IsChar()
+ && (';' == pCurToken->GetChar()
+ || ',' == pCurToken->GetChar()) )
+ {
+ GetToken_Next();
+ }
+ }
+
+ UINT32 Tell() const
+ { return aTokList.GetCurPos(); }
+ void Seek( UINT32 nPos )
+ {
+ pCurToken = aTokList.Seek( nPos );
+ SetMax();
+ }
+ void SeekRel( INT32 nRelPos )
+ {
+ pCurToken = aTokList.Seek( Tell() + nRelPos );
+ SetMax();
+ }
+ void SeekEnd()
+ {
+ pCurToken = aTokList.Seek( nMaxPos );
+ }
+};
+
+
+
+#endif // _LEX_HXX
+