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