1*8af74909SZhong Yang // Scintilla source code edit control 2*8af74909SZhong Yang /** @file CharClassify.cxx 3*8af74909SZhong Yang ** Character classifications used by Document and RESearch. 4*8af74909SZhong Yang **/ 5*8af74909SZhong Yang // Copyright 2006 by Neil Hodgson <[email protected]> 6*8af74909SZhong Yang // The License.txt file describes the conditions under which this software may be distributed. 7*8af74909SZhong Yang 8*8af74909SZhong Yang #include <cstdlib> 9*8af74909SZhong Yang #include <cassert> 10*8af74909SZhong Yang 11*8af74909SZhong Yang #include <stdexcept> 12*8af74909SZhong Yang 13*8af74909SZhong Yang #include "CharacterSet.h" 14*8af74909SZhong Yang #include "CharClassify.h" 15*8af74909SZhong Yang 16*8af74909SZhong Yang using namespace Scintilla; 17*8af74909SZhong Yang CharClassify()18*8af74909SZhong YangCharClassify::CharClassify() : charClass{} { 19*8af74909SZhong Yang SetDefaultCharClasses(true); 20*8af74909SZhong Yang } 21*8af74909SZhong Yang SetDefaultCharClasses(bool includeWordClass)22*8af74909SZhong Yangvoid CharClassify::SetDefaultCharClasses(bool includeWordClass) { 23*8af74909SZhong Yang // Initialize all char classes to default values 24*8af74909SZhong Yang for (int ch = 0; ch < 256; ch++) { 25*8af74909SZhong Yang if (ch == '\r' || ch == '\n') 26*8af74909SZhong Yang charClass[ch] = ccNewLine; 27*8af74909SZhong Yang else if (ch < 0x20 || ch == ' ') 28*8af74909SZhong Yang charClass[ch] = ccSpace; 29*8af74909SZhong Yang else if (includeWordClass && (ch >= 0x80 || IsAlphaNumeric(ch) || ch == '_')) 30*8af74909SZhong Yang charClass[ch] = ccWord; 31*8af74909SZhong Yang else 32*8af74909SZhong Yang charClass[ch] = ccPunctuation; 33*8af74909SZhong Yang } 34*8af74909SZhong Yang } 35*8af74909SZhong Yang SetCharClasses(const unsigned char * chars,cc newCharClass)36*8af74909SZhong Yangvoid CharClassify::SetCharClasses(const unsigned char *chars, cc newCharClass) { 37*8af74909SZhong Yang // Apply the newCharClass to the specified chars 38*8af74909SZhong Yang if (chars) { 39*8af74909SZhong Yang while (*chars) { 40*8af74909SZhong Yang charClass[*chars] = static_cast<unsigned char>(newCharClass); 41*8af74909SZhong Yang chars++; 42*8af74909SZhong Yang } 43*8af74909SZhong Yang } 44*8af74909SZhong Yang } 45*8af74909SZhong Yang GetCharsOfClass(cc characterClass,unsigned char * buffer) const46*8af74909SZhong Yangint CharClassify::GetCharsOfClass(cc characterClass, unsigned char *buffer) const noexcept { 47*8af74909SZhong Yang // Get characters belonging to the given char class; return the number 48*8af74909SZhong Yang // of characters (if the buffer is NULL, don't write to it). 49*8af74909SZhong Yang int count = 0; 50*8af74909SZhong Yang for (int ch = maxChar - 1; ch >= 0; --ch) { 51*8af74909SZhong Yang if (charClass[ch] == characterClass) { 52*8af74909SZhong Yang ++count; 53*8af74909SZhong Yang if (buffer) { 54*8af74909SZhong Yang *buffer = static_cast<unsigned char>(ch); 55*8af74909SZhong Yang buffer++; 56*8af74909SZhong Yang } 57*8af74909SZhong Yang } 58*8af74909SZhong Yang } 59*8af74909SZhong Yang return count; 60*8af74909SZhong Yang } 61