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