xref: /MusicPlayer2/scintilla/src/CaseFolder.cxx (revision 8af74909132ed5e696cb05b6689ae4baf14c1c96)
1*8af74909SZhong Yang // Scintilla source code edit control
2*8af74909SZhong Yang /** @file CaseFolder.cxx
3*8af74909SZhong Yang  ** Classes for case folding.
4*8af74909SZhong Yang  **/
5*8af74909SZhong Yang // Copyright 1998-2013 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 <stdexcept>
9*8af74909SZhong Yang #include <vector>
10*8af74909SZhong Yang #include <algorithm>
11*8af74909SZhong Yang 
12*8af74909SZhong Yang #include "CaseFolder.h"
13*8af74909SZhong Yang #include "CaseConvert.h"
14*8af74909SZhong Yang 
15*8af74909SZhong Yang using namespace Scintilla;
16*8af74909SZhong Yang 
~CaseFolder()17*8af74909SZhong Yang CaseFolder::~CaseFolder() {
18*8af74909SZhong Yang }
19*8af74909SZhong Yang 
CaseFolderTable()20*8af74909SZhong Yang CaseFolderTable::CaseFolderTable() noexcept : mapping{}  {
21*8af74909SZhong Yang 	for (size_t iChar=0; iChar<sizeof(mapping); iChar++) {
22*8af74909SZhong Yang 		mapping[iChar] = static_cast<char>(iChar);
23*8af74909SZhong Yang 	}
24*8af74909SZhong Yang }
25*8af74909SZhong Yang 
~CaseFolderTable()26*8af74909SZhong Yang CaseFolderTable::~CaseFolderTable() {
27*8af74909SZhong Yang }
28*8af74909SZhong Yang 
Fold(char * folded,size_t sizeFolded,const char * mixed,size_t lenMixed)29*8af74909SZhong Yang size_t CaseFolderTable::Fold(char *folded, size_t sizeFolded, const char *mixed, size_t lenMixed) {
30*8af74909SZhong Yang 	if (lenMixed > sizeFolded) {
31*8af74909SZhong Yang 		return 0;
32*8af74909SZhong Yang 	} else {
33*8af74909SZhong Yang 		for (size_t i=0; i<lenMixed; i++) {
34*8af74909SZhong Yang 			folded[i] = mapping[static_cast<unsigned char>(mixed[i])];
35*8af74909SZhong Yang 		}
36*8af74909SZhong Yang 		return lenMixed;
37*8af74909SZhong Yang 	}
38*8af74909SZhong Yang }
39*8af74909SZhong Yang 
SetTranslation(char ch,char chTranslation)40*8af74909SZhong Yang void CaseFolderTable::SetTranslation(char ch, char chTranslation) noexcept {
41*8af74909SZhong Yang 	mapping[static_cast<unsigned char>(ch)] = chTranslation;
42*8af74909SZhong Yang }
43*8af74909SZhong Yang 
StandardASCII()44*8af74909SZhong Yang void CaseFolderTable::StandardASCII() noexcept {
45*8af74909SZhong Yang 	for (size_t iChar=0; iChar<sizeof(mapping); iChar++) {
46*8af74909SZhong Yang 		if (iChar >= 'A' && iChar <= 'Z') {
47*8af74909SZhong Yang 			mapping[iChar] = static_cast<char>(iChar - 'A' + 'a');
48*8af74909SZhong Yang 		} else {
49*8af74909SZhong Yang 			mapping[iChar] = static_cast<char>(iChar);
50*8af74909SZhong Yang 		}
51*8af74909SZhong Yang 	}
52*8af74909SZhong Yang }
53*8af74909SZhong Yang 
CaseFolderUnicode()54*8af74909SZhong Yang CaseFolderUnicode::CaseFolderUnicode() {
55*8af74909SZhong Yang 	StandardASCII();
56*8af74909SZhong Yang 	converter = ConverterFor(CaseConversionFold);
57*8af74909SZhong Yang }
58*8af74909SZhong Yang 
Fold(char * folded,size_t sizeFolded,const char * mixed,size_t lenMixed)59*8af74909SZhong Yang size_t CaseFolderUnicode::Fold(char *folded, size_t sizeFolded, const char *mixed, size_t lenMixed) {
60*8af74909SZhong Yang 	if ((lenMixed == 1) && (sizeFolded > 0)) {
61*8af74909SZhong Yang 		folded[0] = mapping[static_cast<unsigned char>(mixed[0])];
62*8af74909SZhong Yang 		return 1;
63*8af74909SZhong Yang 	} else {
64*8af74909SZhong Yang 		return converter->CaseConvertString(folded, sizeFolded, mixed, lenMixed);
65*8af74909SZhong Yang 	}
66*8af74909SZhong Yang }
67