diff options
Diffstat (limited to 'src/CharacterCategoryMap.h')
-rw-r--r-- | src/CharacterCategoryMap.h | 52 |
1 files changed, 52 insertions, 0 deletions
diff --git a/src/CharacterCategoryMap.h b/src/CharacterCategoryMap.h new file mode 100644 index 000000000..35706eda7 --- /dev/null +++ b/src/CharacterCategoryMap.h @@ -0,0 +1,52 @@ +// Scintilla source code edit control +/** @file CharacterCategoryMap.h + ** Returns the Unicode general category of a character. + ** Similar code to Lexilla's lexilla/lexlib/CharacterCategory.h but renamed + ** to avoid problems with builds that statically include both Scintilla and Lexilla. + **/ +// Copyright 2013 by Neil Hodgson <neilh@scintilla.org> +// The License.txt file describes the conditions under which this software may be distributed. + +#ifndef CHARACTERCATEGORYMAP_H +#define CHARACTERCATEGORYMAP_H + +namespace Scintilla { + +enum CharacterCategory { + ccLu, ccLl, ccLt, ccLm, ccLo, + ccMn, ccMc, ccMe, + ccNd, ccNl, ccNo, + ccPc, ccPd, ccPs, ccPe, ccPi, ccPf, ccPo, + ccSm, ccSc, ccSk, ccSo, + ccZs, ccZl, ccZp, + ccCc, ccCf, ccCs, ccCo, ccCn +}; + +CharacterCategory CategoriseCharacter(int character); + +// Common definitions of allowable characters in identifiers from UAX #31. +bool IsIdStart(int character); +bool IsIdContinue(int character); +bool IsXidStart(int character); +bool IsXidContinue(int character); + +class CharacterCategoryMap { +private: + std::vector<unsigned char> dense; +public: + CharacterCategoryMap(); + CharacterCategory CategoryFor(int character) const { + if (static_cast<size_t>(character) < dense.size()) { + return static_cast<CharacterCategory>(dense[character]); + } else { + // binary search through ranges + return CategoriseCharacter(character); + } + } + int Size() const noexcept; + void Optimize(int countCharacters); +}; + +} + +#endif |