xref: /MusicPlayer2/scintilla/lexlib/CatalogueModules.h (revision 8af74909132ed5e696cb05b6689ae4baf14c1c96)
1*8af74909SZhong Yang // Scintilla source code edit control
2*8af74909SZhong Yang /** @file CatalogueModules.h
3*8af74909SZhong Yang  ** Lexer infrastructure.
4*8af74909SZhong Yang  ** Contains a list of LexerModules which can be searched to find a module appropriate for a
5*8af74909SZhong Yang  ** particular language.
6*8af74909SZhong Yang  **/
7*8af74909SZhong Yang // Copyright 1998-2010 by Neil Hodgson <[email protected]>
8*8af74909SZhong Yang // The License.txt file describes the conditions under which this software may be distributed.
9*8af74909SZhong Yang 
10*8af74909SZhong Yang #ifndef CATALOGUEMODULES_H
11*8af74909SZhong Yang #define CATALOGUEMODULES_H
12*8af74909SZhong Yang 
13*8af74909SZhong Yang namespace Scintilla {
14*8af74909SZhong Yang 
15*8af74909SZhong Yang class CatalogueModules {
16*8af74909SZhong Yang 	std::vector<LexerModule *> lexerCatalogue;
17*8af74909SZhong Yang public:
Find(int language)18*8af74909SZhong Yang 	const LexerModule *Find(int language) const {
19*8af74909SZhong Yang 		for (const LexerModule *lm : lexerCatalogue) {
20*8af74909SZhong Yang 			if (lm->GetLanguage() == language) {
21*8af74909SZhong Yang 				return lm;
22*8af74909SZhong Yang 			}
23*8af74909SZhong Yang 		}
24*8af74909SZhong Yang 		return nullptr;
25*8af74909SZhong Yang 	}
26*8af74909SZhong Yang 
Find(const char * languageName)27*8af74909SZhong Yang 	const LexerModule *Find(const char *languageName) const noexcept {
28*8af74909SZhong Yang 		if (languageName) {
29*8af74909SZhong Yang 			for (const LexerModule *lm : lexerCatalogue) {
30*8af74909SZhong Yang 				if (lm->languageName && (0 == strcmp(lm->languageName, languageName))) {
31*8af74909SZhong Yang 					return lm;
32*8af74909SZhong Yang 				}
33*8af74909SZhong Yang 			}
34*8af74909SZhong Yang 		}
35*8af74909SZhong Yang 		return nullptr;
36*8af74909SZhong Yang 	}
37*8af74909SZhong Yang 
AddLexerModule(LexerModule * plm)38*8af74909SZhong Yang 	void AddLexerModule(LexerModule *plm) {
39*8af74909SZhong Yang 		lexerCatalogue.push_back(plm);
40*8af74909SZhong Yang 	}
41*8af74909SZhong Yang 
Count()42*8af74909SZhong Yang 	unsigned int Count() const noexcept {
43*8af74909SZhong Yang 		return static_cast<unsigned int>(lexerCatalogue.size());
44*8af74909SZhong Yang 	}
45*8af74909SZhong Yang 
Name(unsigned int index)46*8af74909SZhong Yang 	const char *Name(unsigned int index) const noexcept {
47*8af74909SZhong Yang 		if (index < static_cast<unsigned int>(lexerCatalogue.size())) {
48*8af74909SZhong Yang 			return lexerCatalogue[index]->languageName;
49*8af74909SZhong Yang 		} else {
50*8af74909SZhong Yang 			return "";
51*8af74909SZhong Yang 		}
52*8af74909SZhong Yang 	}
53*8af74909SZhong Yang 
Factory(unsigned int index)54*8af74909SZhong Yang 	LexerFactoryFunction Factory(unsigned int index) const noexcept {
55*8af74909SZhong Yang 		// Works for object lexers but not for function lexers
56*8af74909SZhong Yang 		return lexerCatalogue[index]->fnFactory;
57*8af74909SZhong Yang 	}
58*8af74909SZhong Yang 
Create(unsigned int index)59*8af74909SZhong Yang 	ILexer5 *Create(unsigned int index) const {
60*8af74909SZhong Yang 		const LexerModule *plm = lexerCatalogue[index];
61*8af74909SZhong Yang 		if (!plm) {
62*8af74909SZhong Yang 			return nullptr;
63*8af74909SZhong Yang 		}
64*8af74909SZhong Yang 		return plm->Create();
65*8af74909SZhong Yang 	}
66*8af74909SZhong Yang };
67*8af74909SZhong Yang 
68*8af74909SZhong Yang }
69*8af74909SZhong Yang 
70*8af74909SZhong Yang #endif
71