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