xref: /haiku/src/apps/terminal/TerminalCharClassifier.cpp (revision b8ded2f89783a220c7b3019d48266a682cc79158)
152b1d543SIngo Weinhold /*
2*e9bad28aSIngo Weinhold  * Copyright 2008-2013, Ingo Weinhold, ingo_weinhold@gmx.de.
352b1d543SIngo Weinhold  * Distributed under the terms of the MIT License.
452b1d543SIngo Weinhold  */
552b1d543SIngo Weinhold 
652b1d543SIngo Weinhold #include "TerminalCharClassifier.h"
752b1d543SIngo Weinhold 
8*e9bad28aSIngo Weinhold #include <ctype.h>
9*e9bad28aSIngo Weinhold 
10*e9bad28aSIngo Weinhold #include <algorithm>
11*e9bad28aSIngo Weinhold 
12*e9bad28aSIngo Weinhold 
13*e9bad28aSIngo Weinhold // #pragma mark - TerminalCharClassifier
14*e9bad28aSIngo Weinhold 
1552b1d543SIngo Weinhold 
~TerminalCharClassifier()1652b1d543SIngo Weinhold TerminalCharClassifier::~TerminalCharClassifier()
1752b1d543SIngo Weinhold {
1852b1d543SIngo Weinhold }
19*e9bad28aSIngo Weinhold 
20*e9bad28aSIngo Weinhold 
21*e9bad28aSIngo Weinhold // #pragma mark - DefaultCharClassifier
22*e9bad28aSIngo Weinhold 
23*e9bad28aSIngo Weinhold 
DefaultCharClassifier(const char * additionalWordChars)24*e9bad28aSIngo Weinhold DefaultCharClassifier::DefaultCharClassifier(const char* additionalWordChars)
25*e9bad28aSIngo Weinhold {
26*e9bad28aSIngo Weinhold 	const char* p = additionalWordChars;
27*e9bad28aSIngo Weinhold 	while (p != NULL && *p != '\0') {
28*e9bad28aSIngo Weinhold 		int count = UTF8Char::ByteCount(*p);
29*e9bad28aSIngo Weinhold 		if (count <= 0 || count > 4)
30*e9bad28aSIngo Weinhold 			break;
31*e9bad28aSIngo Weinhold 		fAdditionalWordChars.push_back(UTF8Char(p, count));
32*e9bad28aSIngo Weinhold 		p += count;
33*e9bad28aSIngo Weinhold 	}
34*e9bad28aSIngo Weinhold }
35*e9bad28aSIngo Weinhold 
36*e9bad28aSIngo Weinhold 
37*e9bad28aSIngo Weinhold int
Classify(const UTF8Char & character)38*e9bad28aSIngo Weinhold DefaultCharClassifier::Classify(const UTF8Char& character)
39*e9bad28aSIngo Weinhold {
40*e9bad28aSIngo Weinhold 	if (character.IsSpace())
41*e9bad28aSIngo Weinhold 		return CHAR_TYPE_SPACE;
42*e9bad28aSIngo Weinhold 
43*e9bad28aSIngo Weinhold 	if (character.IsAlNum())
44*e9bad28aSIngo Weinhold 		return CHAR_TYPE_WORD_CHAR;
45*e9bad28aSIngo Weinhold 
46*e9bad28aSIngo Weinhold 	if (std::find(fAdditionalWordChars.begin(), fAdditionalWordChars.end(),
47*e9bad28aSIngo Weinhold 			character) != fAdditionalWordChars.end()) {
48*e9bad28aSIngo Weinhold 		return CHAR_TYPE_WORD_CHAR;
49*e9bad28aSIngo Weinhold 	}
50*e9bad28aSIngo Weinhold 
51*e9bad28aSIngo Weinhold 	return CHAR_TYPE_WORD_DELIMITER;
52*e9bad28aSIngo Weinhold }
53