xref: /MusicPlayer2/scintilla/src/CharClassify.cxx (revision 8af74909132ed5e696cb05b6689ae4baf14c1c96)
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 Yang CharClassify::CharClassify() : charClass{} {
19*8af74909SZhong Yang 	SetDefaultCharClasses(true);
20*8af74909SZhong Yang }
21*8af74909SZhong Yang 
SetDefaultCharClasses(bool includeWordClass)22*8af74909SZhong Yang void 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 Yang void 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 Yang int 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