diff options
Diffstat (limited to 'lexlib/CatalogueModules.h')
-rw-r--r-- | lexlib/CatalogueModules.h | 70 |
1 files changed, 70 insertions, 0 deletions
diff --git a/lexlib/CatalogueModules.h b/lexlib/CatalogueModules.h new file mode 100644 index 000000000..1a170cf70 --- /dev/null +++ b/lexlib/CatalogueModules.h @@ -0,0 +1,70 @@ +// Scintilla source code edit control +/** @file CatalogueModules.h + ** Lexer infrastructure. + ** Contains a list of LexerModules which can be searched to find a module appropriate for a + ** particular language. + **/ +// Copyright 1998-2010 by Neil Hodgson <neilh@scintilla.org> +// The License.txt file describes the conditions under which this software may be distributed. + +#ifndef CATALOGUEMODULES_H +#define CATALOGUEMODULES_H + +namespace Scintilla { + +class CatalogueModules { + std::vector<LexerModule *> lexerCatalogue; +public: + const LexerModule *Find(int language) { + for (const LexerModule *lm : lexerCatalogue) { + if (lm->GetLanguage() == language) { + return lm; + } + } + return nullptr; + } + + const LexerModule *Find(const char *languageName) { + if (languageName) { + for (const LexerModule *lm : lexerCatalogue) { + if (lm->languageName && (0 == strcmp(lm->languageName, languageName))) { + return lm; + } + } + } + return nullptr; + } + + void AddLexerModule(LexerModule *plm) { + lexerCatalogue.push_back(plm); + } + + unsigned int Count() { + return static_cast<unsigned int>(lexerCatalogue.size()); + } + + const char *Name(unsigned int index) { + if (index < static_cast<unsigned int>(lexerCatalogue.size())) { + return lexerCatalogue[index]->languageName; + } else { + return ""; + } + } + + LexerFactoryFunction Factory(unsigned int index) { + // Works for object lexers but not for function lexers + return lexerCatalogue[index]->fnFactory; + } + + ILexer4 *Create(unsigned int index) { + const LexerModule *plm = lexerCatalogue[index]; + if (!plm) { + return nullptr; + } + return plm->Create(); + } +}; + +} + +#endif |