1*01aa44aaSAndrew Rist /************************************************************** 2cdf0e10cSrcweir * 3*01aa44aaSAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one 4*01aa44aaSAndrew Rist * or more contributor license agreements. See the NOTICE file 5*01aa44aaSAndrew Rist * distributed with this work for additional information 6*01aa44aaSAndrew Rist * regarding copyright ownership. The ASF licenses this file 7*01aa44aaSAndrew Rist * to you under the Apache License, Version 2.0 (the 8*01aa44aaSAndrew Rist * "License"); you may not use this file except in compliance 9*01aa44aaSAndrew Rist * with the License. You may obtain a copy of the License at 10*01aa44aaSAndrew Rist * 11*01aa44aaSAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0 12*01aa44aaSAndrew Rist * 13*01aa44aaSAndrew Rist * Unless required by applicable law or agreed to in writing, 14*01aa44aaSAndrew Rist * software distributed under the License is distributed on an 15*01aa44aaSAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16*01aa44aaSAndrew Rist * KIND, either express or implied. See the License for the 17*01aa44aaSAndrew Rist * specific language governing permissions and limitations 18*01aa44aaSAndrew Rist * under the License. 19*01aa44aaSAndrew Rist * 20*01aa44aaSAndrew Rist *************************************************************/ 21*01aa44aaSAndrew Rist 22*01aa44aaSAndrew Rist 23cdf0e10cSrcweir #ifndef _SVTOOLS_SYNTAXHIGHLIGHT_HXX 24cdf0e10cSrcweir #define _SVTOOLS_SYNTAXHIGHLIGHT_HXX 25cdf0e10cSrcweir 26cdf0e10cSrcweir #include <list> 27cdf0e10cSrcweir 28cdf0e10cSrcweir #include <vos/macros.hxx> 29cdf0e10cSrcweir #include <vos/mutex.hxx> 30cdf0e10cSrcweir 31cdf0e10cSrcweir #include <vcl/svapp.hxx> 32cdf0e10cSrcweir 33cdf0e10cSrcweir #include <tools/stream.hxx> 34cdf0e10cSrcweir #include <tools/shl.hxx> 35cdf0e10cSrcweir 36cdf0e10cSrcweir #include <svl/brdcst.hxx> 37cdf0e10cSrcweir #include <svtools/svtdllapi.h> 38cdf0e10cSrcweir 39cdf0e10cSrcweir 40cdf0e10cSrcweir // for the bsearch 41cdf0e10cSrcweir #ifdef WNT 42cdf0e10cSrcweir #define CDECL _cdecl 43cdf0e10cSrcweir #endif 44cdf0e10cSrcweir #if defined(UNX) || defined(OS2) 45cdf0e10cSrcweir #define CDECL 46cdf0e10cSrcweir #endif 47cdf0e10cSrcweir #ifdef UNX 48cdf0e10cSrcweir #include <sys/resource.h> 49cdf0e10cSrcweir #endif 50cdf0e10cSrcweir 51cdf0e10cSrcweir #include <stdio.h> 52cdf0e10cSrcweir 53cdf0e10cSrcweir #include <tools/string.hxx> 54cdf0e10cSrcweir #include <tools/gen.hxx> 55cdf0e10cSrcweir 56cdf0e10cSrcweir 57cdf0e10cSrcweir // Token-Typen TT_... 58cdf0e10cSrcweir enum TokenTypes 59cdf0e10cSrcweir { 60cdf0e10cSrcweir TT_UNKNOWN, 61cdf0e10cSrcweir TT_IDENTIFIER, 62cdf0e10cSrcweir TT_WHITESPACE, 63cdf0e10cSrcweir TT_NUMBER, 64cdf0e10cSrcweir TT_STRING, 65cdf0e10cSrcweir TT_EOL, 66cdf0e10cSrcweir TT_COMMENT, 67cdf0e10cSrcweir TT_ERROR, 68cdf0e10cSrcweir TT_OPERATOR, 69cdf0e10cSrcweir TT_KEYWORDS, 70cdf0e10cSrcweir TT_PARAMETER 71cdf0e10cSrcweir }; 72cdf0e10cSrcweir 73cdf0e10cSrcweir struct HighlightPortion { sal_uInt16 nBegin; sal_uInt16 nEnd; TokenTypes tokenType; }; 74cdf0e10cSrcweir 75cdf0e10cSrcweir 76cdf0e10cSrcweir typedef std::vector<HighlightPortion> HighlightPortions; 77cdf0e10cSrcweir 78cdf0e10cSrcweir ///////////////////////////////////////////////////////////////////////// 79cdf0e10cSrcweir // Hilfsklasse zur Untersuchung von JavaScript-Modulen, zunaechst zum 80cdf0e10cSrcweir // Heraussuchen der Funktionen, spaeter auch zum Syntax-Highlighting verwenden 81cdf0e10cSrcweir 82cdf0e10cSrcweir // Flags fuer Zeichen-Eigenschaften 83cdf0e10cSrcweir #define CHAR_START_IDENTIFIER 0x0001 84cdf0e10cSrcweir #define CHAR_IN_IDENTIFIER 0x0002 85cdf0e10cSrcweir #define CHAR_START_NUMBER 0x0004 86cdf0e10cSrcweir #define CHAR_IN_NUMBER 0x0008 87cdf0e10cSrcweir #define CHAR_IN_HEX_NUMBER 0x0010 88cdf0e10cSrcweir #define CHAR_IN_OCT_NUMBER 0x0020 89cdf0e10cSrcweir #define CHAR_START_STRING 0x0040 90cdf0e10cSrcweir #define CHAR_OPERATOR 0x0080 91cdf0e10cSrcweir #define CHAR_SPACE 0x0100 92cdf0e10cSrcweir #define CHAR_EOL 0x0200 93cdf0e10cSrcweir 94cdf0e10cSrcweir #define CHAR_EOF 0x00 95cdf0e10cSrcweir 96cdf0e10cSrcweir 97cdf0e10cSrcweir // Sprachmodus des HighLighters (spaeter eventuell feiner 98cdf0e10cSrcweir // differenzieren mit Keyword-Liste, C-Kommentar-Flag) 99cdf0e10cSrcweir enum HighlighterLanguage 100cdf0e10cSrcweir { 101cdf0e10cSrcweir HIGHLIGHT_BASIC, 102cdf0e10cSrcweir HIGHLIGHT_SQL 103cdf0e10cSrcweir }; 104cdf0e10cSrcweir 105cdf0e10cSrcweir class SimpleTokenizer_Impl 106cdf0e10cSrcweir { 107cdf0e10cSrcweir HighlighterLanguage aLanguage; 108cdf0e10cSrcweir // Zeichen-Info-Tabelle 109cdf0e10cSrcweir sal_uInt16 aCharTypeTab[256]; 110cdf0e10cSrcweir 111cdf0e10cSrcweir const sal_Unicode* mpStringBegin; 112cdf0e10cSrcweir const sal_Unicode* mpActualPos; 113cdf0e10cSrcweir 114cdf0e10cSrcweir // Zeile und Spalte 115cdf0e10cSrcweir sal_uInt32 nLine; 116cdf0e10cSrcweir sal_uInt32 nCol; 117cdf0e10cSrcweir peekChar(void)118cdf0e10cSrcweir sal_Unicode peekChar( void ) { return *mpActualPos; } getChar(void)119cdf0e10cSrcweir sal_Unicode getChar( void ) { nCol++; return *mpActualPos++; } 120cdf0e10cSrcweir 121cdf0e10cSrcweir // Hilfsfunktion: Zeichen-Flag Testen 122cdf0e10cSrcweir sal_Bool testCharFlags( sal_Unicode c, sal_uInt16 nTestFlags ); 123cdf0e10cSrcweir 124cdf0e10cSrcweir // Neues Token holen, Leerstring == nix mehr da 125cdf0e10cSrcweir sal_Bool getNextToken( /*out*/TokenTypes& reType, 126cdf0e10cSrcweir /*out*/const sal_Unicode*& rpStartPos, /*out*/const sal_Unicode*& rpEndPos ); 127cdf0e10cSrcweir 128cdf0e10cSrcweir String getTokStr( /*out*/const sal_Unicode* pStartPos, /*out*/const sal_Unicode* pEndPos ); 129cdf0e10cSrcweir 130cdf0e10cSrcweir #ifdef DBG_UTIL 131cdf0e10cSrcweir // TEST: Token ausgeben 132cdf0e10cSrcweir String getFullTokenStr( /*out*/TokenTypes eType, 133cdf0e10cSrcweir /*out*/const sal_Unicode* pStartPos, /*out*/const sal_Unicode* pEndPos ); 134cdf0e10cSrcweir #endif 135cdf0e10cSrcweir 136cdf0e10cSrcweir const char** ppListKeyWords; 137cdf0e10cSrcweir sal_uInt16 nKeyWordCount; 138cdf0e10cSrcweir 139cdf0e10cSrcweir public: 140cdf0e10cSrcweir SimpleTokenizer_Impl( HighlighterLanguage aLang = HIGHLIGHT_BASIC ); 141cdf0e10cSrcweir ~SimpleTokenizer_Impl( void ); 142cdf0e10cSrcweir 143cdf0e10cSrcweir sal_uInt16 parseLine( sal_uInt32 nLine, const String* aSource ); 144cdf0e10cSrcweir void getHighlightPortions( sal_uInt32 nParseLine, const String& rLine, 145cdf0e10cSrcweir /*out*/HighlightPortions& portions ); 146cdf0e10cSrcweir void setKeyWords( const char** ppKeyWords, sal_uInt16 nCount ); 147cdf0e10cSrcweir }; 148cdf0e10cSrcweir 149cdf0e10cSrcweir 150cdf0e10cSrcweir //*** SyntaxHighlighter-Klasse *** 151cdf0e10cSrcweir // Konzept: Der Highlighter wird ueber alle Aenderungen im Source 152cdf0e10cSrcweir // informiert (notifyChange) und liefert dem Aufrufer jeweils die 153cdf0e10cSrcweir // Information zurueck, welcher Zeilen-Bereich des Source-Codes 154cdf0e10cSrcweir // aufgrund dieser Aenderung neu gehighlighted werden muss. 155cdf0e10cSrcweir // Dazu merkt sich Highlighter intern fuer jede Zeile, ob dort 156cdf0e10cSrcweir // C-Kommentare beginnen oder enden. 157cdf0e10cSrcweir class SVT_DLLPUBLIC SyntaxHighlighter 158cdf0e10cSrcweir { 159cdf0e10cSrcweir HighlighterLanguage eLanguage; 160cdf0e10cSrcweir SimpleTokenizer_Impl* m_pSimpleTokenizer; 161cdf0e10cSrcweir char* m_pKeyWords; 162cdf0e10cSrcweir sal_uInt16 m_nKeyWordCount; 163cdf0e10cSrcweir 164cdf0e10cSrcweir // void initializeKeyWords( HighlighterLanguage eLanguage ); 165cdf0e10cSrcweir 166cdf0e10cSrcweir public: 167cdf0e10cSrcweir SyntaxHighlighter( void ); 168cdf0e10cSrcweir ~SyntaxHighlighter( void ); 169cdf0e10cSrcweir 170cdf0e10cSrcweir // HighLighter (neu) initialisieren, die Zeilen-Tabelle wird 171cdf0e10cSrcweir // dabei komplett geloescht, d.h. im Abschluss wird von einem 172cdf0e10cSrcweir // leeren Source ausgegangen. In notifyChange() kann dann 173cdf0e10cSrcweir // nur Zeile 0 angegeben werden. 174cdf0e10cSrcweir void initialize( HighlighterLanguage eLanguage_ ); 175cdf0e10cSrcweir 176cdf0e10cSrcweir const Range notifyChange( sal_uInt32 nLine, sal_Int32 nLineCountDifference, 177cdf0e10cSrcweir const String* pChangedLines, sal_uInt32 nArrayLength); 178cdf0e10cSrcweir 179cdf0e10cSrcweir void getHighlightPortions( sal_uInt32 nLine, const String& rLine, 180cdf0e10cSrcweir HighlightPortions& pPortions ); 181cdf0e10cSrcweir GetLanguage()182cdf0e10cSrcweir HighlighterLanguage GetLanguage() { return eLanguage;} 183cdf0e10cSrcweir }; 184cdf0e10cSrcweir #endif 185