1*8af74909SZhong Yang // Scintilla source code edit control
2*8af74909SZhong Yang /** @file LexerBase.cxx
3*8af74909SZhong Yang ** A simple lexer with no state.
4*8af74909SZhong Yang **/
5*8af74909SZhong Yang // Copyright 1998-2010 by Neil Hodgson <[email protected]>
6*8af74909SZhong Yang // The License.txt file describes the conditions under which this software may be distributed.
7*8af74909SZhong Yang
8*8af74909SZhong Yang #include <cstdlib>
9*8af74909SZhong Yang #include <cassert>
10*8af74909SZhong Yang #include <cstring>
11*8af74909SZhong Yang
12*8af74909SZhong Yang #include "ILexer.h"
13*8af74909SZhong Yang #include "Scintilla.h"
14*8af74909SZhong Yang #include "SciLexer.h"
15*8af74909SZhong Yang
16*8af74909SZhong Yang #include "PropSetSimple.h"
17*8af74909SZhong Yang #include "WordList.h"
18*8af74909SZhong Yang #include "LexAccessor.h"
19*8af74909SZhong Yang #include "Accessor.h"
20*8af74909SZhong Yang #include "LexerModule.h"
21*8af74909SZhong Yang #include "LexerBase.h"
22*8af74909SZhong Yang
23*8af74909SZhong Yang using namespace Scintilla;
24*8af74909SZhong Yang
25*8af74909SZhong Yang static const char styleSubable[] = { 0 };
26*8af74909SZhong Yang
LexerBase(const LexicalClass * lexClasses_,size_t nClasses_)27*8af74909SZhong Yang LexerBase::LexerBase(const LexicalClass *lexClasses_, size_t nClasses_) :
28*8af74909SZhong Yang lexClasses(lexClasses_), nClasses(nClasses_) {
29*8af74909SZhong Yang for (int wl = 0; wl < numWordLists; wl++)
30*8af74909SZhong Yang keyWordLists[wl] = new WordList;
31*8af74909SZhong Yang keyWordLists[numWordLists] = 0;
32*8af74909SZhong Yang }
33*8af74909SZhong Yang
~LexerBase()34*8af74909SZhong Yang LexerBase::~LexerBase() {
35*8af74909SZhong Yang for (int wl = 0; wl < numWordLists; wl++) {
36*8af74909SZhong Yang delete keyWordLists[wl];
37*8af74909SZhong Yang keyWordLists[wl] = 0;
38*8af74909SZhong Yang }
39*8af74909SZhong Yang keyWordLists[numWordLists] = 0;
40*8af74909SZhong Yang }
41*8af74909SZhong Yang
Release()42*8af74909SZhong Yang void SCI_METHOD LexerBase::Release() {
43*8af74909SZhong Yang delete this;
44*8af74909SZhong Yang }
45*8af74909SZhong Yang
Version() const46*8af74909SZhong Yang int SCI_METHOD LexerBase::Version() const {
47*8af74909SZhong Yang return lvRelease5;
48*8af74909SZhong Yang }
49*8af74909SZhong Yang
PropertyNames()50*8af74909SZhong Yang const char * SCI_METHOD LexerBase::PropertyNames() {
51*8af74909SZhong Yang return "";
52*8af74909SZhong Yang }
53*8af74909SZhong Yang
PropertyType(const char *)54*8af74909SZhong Yang int SCI_METHOD LexerBase::PropertyType(const char *) {
55*8af74909SZhong Yang return SC_TYPE_BOOLEAN;
56*8af74909SZhong Yang }
57*8af74909SZhong Yang
DescribeProperty(const char *)58*8af74909SZhong Yang const char * SCI_METHOD LexerBase::DescribeProperty(const char *) {
59*8af74909SZhong Yang return "";
60*8af74909SZhong Yang }
61*8af74909SZhong Yang
PropertySet(const char * key,const char * val)62*8af74909SZhong Yang Sci_Position SCI_METHOD LexerBase::PropertySet(const char *key, const char *val) {
63*8af74909SZhong Yang const char *valOld = props.Get(key);
64*8af74909SZhong Yang if (strcmp(val, valOld) != 0) {
65*8af74909SZhong Yang props.Set(key, val, strlen(key), strlen(val));
66*8af74909SZhong Yang return 0;
67*8af74909SZhong Yang } else {
68*8af74909SZhong Yang return -1;
69*8af74909SZhong Yang }
70*8af74909SZhong Yang }
71*8af74909SZhong Yang
PropertyGet(const char * key)72*8af74909SZhong Yang const char *SCI_METHOD LexerBase::PropertyGet(const char *key) {
73*8af74909SZhong Yang return props.Get(key);
74*8af74909SZhong Yang }
75*8af74909SZhong Yang
DescribeWordListSets()76*8af74909SZhong Yang const char * SCI_METHOD LexerBase::DescribeWordListSets() {
77*8af74909SZhong Yang return "";
78*8af74909SZhong Yang }
79*8af74909SZhong Yang
WordListSet(int n,const char * wl)80*8af74909SZhong Yang Sci_Position SCI_METHOD LexerBase::WordListSet(int n, const char *wl) {
81*8af74909SZhong Yang if (n < numWordLists) {
82*8af74909SZhong Yang if (keyWordLists[n]->Set(wl)) {
83*8af74909SZhong Yang return 0;
84*8af74909SZhong Yang }
85*8af74909SZhong Yang }
86*8af74909SZhong Yang return -1;
87*8af74909SZhong Yang }
88*8af74909SZhong Yang
PrivateCall(int,void *)89*8af74909SZhong Yang void * SCI_METHOD LexerBase::PrivateCall(int, void *) {
90*8af74909SZhong Yang return nullptr;
91*8af74909SZhong Yang }
92*8af74909SZhong Yang
LineEndTypesSupported()93*8af74909SZhong Yang int SCI_METHOD LexerBase::LineEndTypesSupported() {
94*8af74909SZhong Yang return SC_LINE_END_TYPE_DEFAULT;
95*8af74909SZhong Yang }
96*8af74909SZhong Yang
AllocateSubStyles(int,int)97*8af74909SZhong Yang int SCI_METHOD LexerBase::AllocateSubStyles(int, int) {
98*8af74909SZhong Yang return -1;
99*8af74909SZhong Yang }
100*8af74909SZhong Yang
SubStylesStart(int)101*8af74909SZhong Yang int SCI_METHOD LexerBase::SubStylesStart(int) {
102*8af74909SZhong Yang return -1;
103*8af74909SZhong Yang }
104*8af74909SZhong Yang
SubStylesLength(int)105*8af74909SZhong Yang int SCI_METHOD LexerBase::SubStylesLength(int) {
106*8af74909SZhong Yang return 0;
107*8af74909SZhong Yang }
108*8af74909SZhong Yang
StyleFromSubStyle(int subStyle)109*8af74909SZhong Yang int SCI_METHOD LexerBase::StyleFromSubStyle(int subStyle) {
110*8af74909SZhong Yang return subStyle;
111*8af74909SZhong Yang }
112*8af74909SZhong Yang
PrimaryStyleFromStyle(int style)113*8af74909SZhong Yang int SCI_METHOD LexerBase::PrimaryStyleFromStyle(int style) {
114*8af74909SZhong Yang return style;
115*8af74909SZhong Yang }
116*8af74909SZhong Yang
FreeSubStyles()117*8af74909SZhong Yang void SCI_METHOD LexerBase::FreeSubStyles() {
118*8af74909SZhong Yang }
119*8af74909SZhong Yang
SetIdentifiers(int,const char *)120*8af74909SZhong Yang void SCI_METHOD LexerBase::SetIdentifiers(int, const char *) {
121*8af74909SZhong Yang }
122*8af74909SZhong Yang
DistanceToSecondaryStyles()123*8af74909SZhong Yang int SCI_METHOD LexerBase::DistanceToSecondaryStyles() {
124*8af74909SZhong Yang return 0;
125*8af74909SZhong Yang }
126*8af74909SZhong Yang
GetSubStyleBases()127*8af74909SZhong Yang const char * SCI_METHOD LexerBase::GetSubStyleBases() {
128*8af74909SZhong Yang return styleSubable;
129*8af74909SZhong Yang }
130*8af74909SZhong Yang
NamedStyles()131*8af74909SZhong Yang int SCI_METHOD LexerBase::NamedStyles() {
132*8af74909SZhong Yang return static_cast<int>(nClasses);
133*8af74909SZhong Yang }
134*8af74909SZhong Yang
NameOfStyle(int style)135*8af74909SZhong Yang const char * SCI_METHOD LexerBase::NameOfStyle(int style) {
136*8af74909SZhong Yang return (style < NamedStyles()) ? lexClasses[style].name : "";
137*8af74909SZhong Yang }
138*8af74909SZhong Yang
TagsOfStyle(int style)139*8af74909SZhong Yang const char * SCI_METHOD LexerBase::TagsOfStyle(int style) {
140*8af74909SZhong Yang return (style < NamedStyles()) ? lexClasses[style].tags : "";
141*8af74909SZhong Yang }
142*8af74909SZhong Yang
DescriptionOfStyle(int style)143*8af74909SZhong Yang const char * SCI_METHOD LexerBase::DescriptionOfStyle(int style) {
144*8af74909SZhong Yang return (style < NamedStyles()) ? lexClasses[style].description : "";
145*8af74909SZhong Yang }
146*8af74909SZhong Yang
147*8af74909SZhong Yang // ILexer5 methods
148*8af74909SZhong Yang
GetName()149*8af74909SZhong Yang const char *SCI_METHOD LexerBase::GetName() {
150*8af74909SZhong Yang return "";
151*8af74909SZhong Yang }
152*8af74909SZhong Yang
GetIdentifier()153*8af74909SZhong Yang int SCI_METHOD LexerBase::GetIdentifier() {
154*8af74909SZhong Yang return SCLEX_AUTOMATIC;
155*8af74909SZhong Yang }
156