blob: c7d5878fe48526f0dbc98b2c8e17d4304c13fa1b [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 _SVTOOLS_SYNTAXHIGHLIGHT_HXX
#define _SVTOOLS_SYNTAXHIGHLIGHT_HXX
#include <list>
#include <vos/macros.hxx>
#include <vos/mutex.hxx>
#include <vcl/svapp.hxx>
#include <tools/stream.hxx>
#include <tools/shl.hxx>
#include <svl/brdcst.hxx>
#include <svtools/svtdllapi.h>
// for the bsearch
#ifdef WNT
#define CDECL _cdecl
#endif
#if defined(UNX) || defined(OS2)
#define CDECL
#endif
#ifdef UNX
#include <sys/resource.h>
#endif
#include <stdio.h>
#include <tools/string.hxx>
#include <tools/gen.hxx>
// Token-Typen TT_...
enum TokenTypes
{
TT_UNKNOWN,
TT_IDENTIFIER,
TT_WHITESPACE,
TT_NUMBER,
TT_STRING,
TT_EOL,
TT_COMMENT,
TT_ERROR,
TT_OPERATOR,
TT_KEYWORDS,
TT_PARAMETER
};
struct HighlightPortion { sal_uInt16 nBegin; sal_uInt16 nEnd; TokenTypes tokenType; };
typedef std::vector<HighlightPortion> HighlightPortions;
/////////////////////////////////////////////////////////////////////////
// Hilfsklasse zur Untersuchung von JavaScript-Modulen, zunaechst zum
// Heraussuchen der Funktionen, spaeter auch zum Syntax-Highlighting verwenden
// Flags fuer Zeichen-Eigenschaften
#define CHAR_START_IDENTIFIER 0x0001
#define CHAR_IN_IDENTIFIER 0x0002
#define CHAR_START_NUMBER 0x0004
#define CHAR_IN_NUMBER 0x0008
#define CHAR_IN_HEX_NUMBER 0x0010
#define CHAR_IN_OCT_NUMBER 0x0020
#define CHAR_START_STRING 0x0040
#define CHAR_OPERATOR 0x0080
#define CHAR_SPACE 0x0100
#define CHAR_EOL 0x0200
#define CHAR_EOF 0x00
// Sprachmodus des HighLighters (spaeter eventuell feiner
// differenzieren mit Keyword-Liste, C-Kommentar-Flag)
enum HighlighterLanguage
{
HIGHLIGHT_BASIC,
HIGHLIGHT_SQL
};
class SimpleTokenizer_Impl
{
HighlighterLanguage aLanguage;
// Zeichen-Info-Tabelle
sal_uInt16 aCharTypeTab[256];
const sal_Unicode* mpStringBegin;
const sal_Unicode* mpActualPos;
// Zeile und Spalte
sal_uInt32 nLine;
sal_uInt32 nCol;
sal_Unicode peekChar( void ) { return *mpActualPos; }
sal_Unicode getChar( void ) { nCol++; return *mpActualPos++; }
// Hilfsfunktion: Zeichen-Flag Testen
sal_Bool testCharFlags( sal_Unicode c, sal_uInt16 nTestFlags );
// Neues Token holen, Leerstring == nix mehr da
sal_Bool getNextToken( /*out*/TokenTypes& reType,
/*out*/const sal_Unicode*& rpStartPos, /*out*/const sal_Unicode*& rpEndPos );
String getTokStr( /*out*/const sal_Unicode* pStartPos, /*out*/const sal_Unicode* pEndPos );
#ifdef DBG_UTIL
// TEST: Token ausgeben
String getFullTokenStr( /*out*/TokenTypes eType,
/*out*/const sal_Unicode* pStartPos, /*out*/const sal_Unicode* pEndPos );
#endif
const char** ppListKeyWords;
sal_uInt16 nKeyWordCount;
public:
SimpleTokenizer_Impl( HighlighterLanguage aLang = HIGHLIGHT_BASIC );
~SimpleTokenizer_Impl( void );
sal_uInt16 parseLine( sal_uInt32 nLine, const String* aSource );
void getHighlightPortions( sal_uInt32 nParseLine, const String& rLine,
/*out*/HighlightPortions& portions );
void setKeyWords( const char** ppKeyWords, sal_uInt16 nCount );
};
//*** SyntaxHighlighter-Klasse ***
// Konzept: Der Highlighter wird ueber alle Aenderungen im Source
// informiert (notifyChange) und liefert dem Aufrufer jeweils die
// Information zurueck, welcher Zeilen-Bereich des Source-Codes
// aufgrund dieser Aenderung neu gehighlighted werden muss.
// Dazu merkt sich Highlighter intern fuer jede Zeile, ob dort
// C-Kommentare beginnen oder enden.
class SVT_DLLPUBLIC SyntaxHighlighter
{
HighlighterLanguage eLanguage;
SimpleTokenizer_Impl* m_pSimpleTokenizer;
char* m_pKeyWords;
sal_uInt16 m_nKeyWordCount;
// void initializeKeyWords( HighlighterLanguage eLanguage );
public:
SyntaxHighlighter( void );
~SyntaxHighlighter( void );
// HighLighter (neu) initialisieren, die Zeilen-Tabelle wird
// dabei komplett geloescht, d.h. im Abschluss wird von einem
// leeren Source ausgegangen. In notifyChange() kann dann
// nur Zeile 0 angegeben werden.
void initialize( HighlighterLanguage eLanguage_ );
const Range notifyChange( sal_uInt32 nLine, sal_Int32 nLineCountDifference,
const String* pChangedLines, sal_uInt32 nArrayLength);
void getHighlightPortions( sal_uInt32 nLine, const String& rLine,
HighlightPortions& pPortions );
HighlighterLanguage GetLanguage() { return eLanguage;}
};
#endif