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