1// Scintilla source code edit control
2// Encoding: UTF-8
3/** @file CaseConvert.h
4 ** Performs Unicode case conversions.
5 ** Does not handle locale-sensitive case conversion.
6 **/
7// Copyright 2013 by Neil Hodgson <neilh@scintilla.org>
8// The License.txt file describes the conditions under which this software may be distributed.
9
10#ifndef CASECONVERT_H
11#define CASECONVERT_H
12
13namespace Scintilla::Internal {
14
15enum class CaseConversion {
16 fold,
17 upper,
18 lower
19};
20
21class ICaseConverter {
22public:
23 virtual size_t CaseConvertString(char *converted, size_t sizeConverted, const char *mixed, size_t lenMixed) = 0;
24};
25
26ICaseConverter *ConverterFor(CaseConversion conversion);
27
28// Returns a UTF-8 string. Empty when no conversion
29const char *CaseConvert(int character, CaseConversion conversion);
30
31// When performing CaseConvertString, the converted value may be up to 3 times longer than the input.
32// Ligatures are often decomposed into multiple characters and long cases include:
33// ΐ "\xce\x90" folds to ΐ "\xce\xb9\xcc\x88\xcc\x81"
34constexpr size_t maxExpansionCaseConversion = 3;
35
36// Converts a mixed case string using a particular conversion.
37// Result may be a different length to input and the length is the return value.
38// If there is not enough space then 0 is returned.
39size_t CaseConvertString(char *converted, size_t sizeConverted, const char *mixed, size_t lenMixed, CaseConversion conversion);
40
41// Converts a mixed case string using a particular conversion.
42std::string CaseConvertString(const std::string &s, CaseConversion conversion);
43
44}
45
46#endif
47