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