diff options
-rw-r--r-- | cocoa/ScintillaCocoa.mm | 2 | ||||
-rwxr-xr-x | gtk/ScintillaGTK.cxx | 2 | ||||
-rw-r--r-- | qt/ScintillaEditBase/ScintillaQt.cpp | 2 | ||||
-rw-r--r-- | src/CaseFolder.cxx | 34 | ||||
-rw-r--r-- | src/CaseFolder.h | 8 | ||||
-rw-r--r-- | src/Editor.cxx | 10 | ||||
-rw-r--r-- | test/unit/testDocument.cxx | 2 | ||||
-rw-r--r-- | win32/ScintillaWin.cxx | 2 |
8 files changed, 24 insertions, 38 deletions
diff --git a/cocoa/ScintillaCocoa.mm b/cocoa/ScintillaCocoa.mm index e8723f318..f24157daf 100644 --- a/cocoa/ScintillaCocoa.mm +++ b/cocoa/ScintillaCocoa.mm @@ -567,7 +567,6 @@ class CaseFolderDBCS : public CaseFolderTable { CFStringEncoding encoding; public: explicit CaseFolderDBCS(CFStringEncoding encoding_) : encoding(encoding_) { - StandardASCII(); } size_t Fold(char *folded, size_t sizeFolded, const char *mixed, size_t lenMixed) override { if ((lenMixed == 1) && (sizeFolded > 0)) { @@ -606,7 +605,6 @@ std::unique_ptr<CaseFolder> ScintillaCocoa::CaseFolderForEncoding() { vs.styles[StyleDefault].characterSet); if (pdoc->dbcsCodePage == 0) { std::unique_ptr<CaseFolderTable> pcf = std::make_unique<CaseFolderTable>(); - pcf->StandardASCII(); // Only for single byte encodings for (int i=0x80; i<0x100; i++) { char sCharacter[2] = "A"; diff --git a/gtk/ScintillaGTK.cxx b/gtk/ScintillaGTK.cxx index 877b4763a..6bdc09a7d 100755 --- a/gtk/ScintillaGTK.cxx +++ b/gtk/ScintillaGTK.cxx @@ -1220,7 +1220,6 @@ class CaseFolderDBCS : public CaseFolderTable { const char *charSet; public: explicit CaseFolderDBCS(const char *charSet_) noexcept : charSet(charSet_) { - StandardASCII(); } size_t Fold(char *folded, size_t sizeFolded, const char *mixed, size_t lenMixed) override { if ((lenMixed == 1) && (sizeFolded > 0)) { @@ -1257,7 +1256,6 @@ std::unique_ptr<CaseFolder> ScintillaGTK::CaseFolderForEncoding() { if (charSetBuffer) { if (pdoc->dbcsCodePage == 0) { std::unique_ptr<CaseFolderTable> pcf = std::make_unique<CaseFolderTable>(); - pcf->StandardASCII(); // Only for single byte encodings for (int i=0x80; i<0x100; i++) { char sCharacter[2] = "A"; diff --git a/qt/ScintillaEditBase/ScintillaQt.cpp b/qt/ScintillaEditBase/ScintillaQt.cpp index c1276adc1..24c97013e 100644 --- a/qt/ScintillaEditBase/ScintillaQt.cpp +++ b/qt/ScintillaEditBase/ScintillaQt.cpp @@ -557,7 +557,6 @@ class CaseFolderDBCS : public CaseFolderTable { QTextCodec *codec; public: explicit CaseFolderDBCS(QTextCodec *codec_) : codec(codec_) { - StandardASCII(); } size_t Fold(char *folded, size_t sizeFolded, const char *mixed, size_t lenMixed) override { if ((lenMixed == 1) && (sizeFolded > 0)) { @@ -590,7 +589,6 @@ std::unique_ptr<CaseFolder> ScintillaQt::CaseFolderForEncoding() if (charSetBuffer) { if (pdoc->dbcsCodePage == 0) { std::unique_ptr<CaseFolderTable> pcf = std::make_unique<CaseFolderTable>(); - pcf->StandardASCII(); QTextCodec *codec = QTextCodec::codecForName(charSetBuffer); // Only for single byte encodings for (int i=0x80; i<0x100; i++) { diff --git a/src/CaseFolder.cxx b/src/CaseFolder.cxx index b5acc5f96..d66df3f4f 100644 --- a/src/CaseFolder.cxx +++ b/src/CaseFolder.cxx @@ -9,53 +9,51 @@ #include <vector> #include <algorithm> +#include "CharacterType.h" #include "CaseFolder.h" #include "CaseConvert.h" using namespace Scintilla::Internal; -CaseFolder::~CaseFolder() { +namespace { + +constexpr unsigned char IndexFromChar(char ch) { + return static_cast<unsigned char>(ch); +} + } CaseFolderTable::CaseFolderTable() noexcept : mapping{} { - for (size_t iChar=0; iChar<sizeof(mapping); iChar++) { - mapping[iChar] = static_cast<char>(iChar); - } + StandardASCII(); } size_t CaseFolderTable::Fold(char *folded, size_t sizeFolded, const char *mixed, size_t lenMixed) { if (lenMixed > sizeFolded) { return 0; - } else { - for (size_t i=0; i<lenMixed; i++) { - folded[i] = mapping[static_cast<unsigned char>(mixed[i])]; - } - return lenMixed; } + for (size_t i=0; i<lenMixed; i++) { + folded[i] = mapping[IndexFromChar(mixed[i])]; + } + return lenMixed; } void CaseFolderTable::SetTranslation(char ch, char chTranslation) noexcept { - mapping[static_cast<unsigned char>(ch)] = chTranslation; + mapping[IndexFromChar(ch)] = chTranslation; } void CaseFolderTable::StandardASCII() noexcept { - for (size_t iChar=0; iChar<sizeof(mapping); iChar++) { - if (iChar >= 'A' && iChar <= 'Z') { - mapping[iChar] = static_cast<char>(iChar - 'A' + 'a'); - } else { - mapping[iChar] = static_cast<char>(iChar); - } + for (size_t iChar=0; iChar<std::size(mapping); iChar++) { + mapping[iChar] = static_cast<char>(MakeLowerCase(iChar)); } } CaseFolderUnicode::CaseFolderUnicode() { - StandardASCII(); converter = ConverterFor(CaseConversion::fold); } size_t CaseFolderUnicode::Fold(char *folded, size_t sizeFolded, const char *mixed, size_t lenMixed) { if ((lenMixed == 1) && (sizeFolded > 0)) { - folded[0] = mapping[static_cast<unsigned char>(mixed[0])]; + folded[0] = mapping[IndexFromChar(mixed[0])]; return 1; } else { return converter->CaseConvertString(folded, sizeFolded, mixed, lenMixed); diff --git a/src/CaseFolder.h b/src/CaseFolder.h index 45abe4d8f..4f16ed69c 100644 --- a/src/CaseFolder.h +++ b/src/CaseFolder.h @@ -12,7 +12,13 @@ namespace Scintilla::Internal { class CaseFolder { public: - virtual ~CaseFolder(); + CaseFolder() = default; + // Deleted so CaseFolder objects can not be copied. + CaseFolder(const CaseFolder &source) = delete; + CaseFolder(CaseFolder &&) = delete; + CaseFolder &operator=(const CaseFolder &) = delete; + CaseFolder &operator=(CaseFolder &&) = delete; + virtual ~CaseFolder() = default; virtual size_t Fold(char *folded, size_t sizeFolded, const char *mixed, size_t lenMixed) = 0; }; diff --git a/src/Editor.cxx b/src/Editor.cxx index d5e6a92ff..6ff0f2d97 100644 --- a/src/Editor.cxx +++ b/src/Editor.cxx @@ -4084,17 +4084,9 @@ void Editor::Indent(bool forwards) { ContainerNeedsUpdate(Update::Selection); } -class CaseFolderASCII : public CaseFolderTable { -public: - CaseFolderASCII() noexcept { - StandardASCII(); - } -}; - - std::unique_ptr<CaseFolder> Editor::CaseFolderForEncoding() { // Simple default that only maps ASCII upper case to lower case. - return std::make_unique<CaseFolderASCII>(); + return std::make_unique<CaseFolderTable>(); } /** diff --git a/test/unit/testDocument.cxx b/test/unit/testDocument.cxx index 4a7e20095..7f3d9c6bb 100644 --- a/test/unit/testDocument.cxx +++ b/test/unit/testDocument.cxx @@ -95,14 +95,12 @@ struct DocPlus { // This case folder will not handle many DBCS cases. Scintilla uses platform-specific code for DBCS // case folding which can not easily be inserted in platform-independent tests. std::unique_ptr<CaseFolderTable> pcft = std::make_unique<CaseFolderTable>(); - pcft->StandardASCII(); document.SetCaseFolder(std::move(pcft)); } } void SetSBCSFoldings(const Folding *foldings, size_t length) { std::unique_ptr<CaseFolderTable> pcft = std::make_unique<CaseFolderTable>(); - pcft->StandardASCII(); for (size_t block = 0; block < length; block++) { for (int fold = 0; fold < foldings[block].length; fold++) { pcft->SetTranslation(foldings[block].from + fold, foldings[block].to + fold); diff --git a/win32/ScintillaWin.cxx b/win32/ScintillaWin.cxx index 876fa5746..ce9eca9f6 100644 --- a/win32/ScintillaWin.cxx +++ b/win32/ScintillaWin.cxx @@ -2431,7 +2431,6 @@ class CaseFolderDBCS : public CaseFolderTable { UINT cp; public: explicit CaseFolderDBCS(UINT cp_) : cp(cp_) { - StandardASCII(); } size_t Fold(char *folded, size_t sizeFolded, const char *mixed, size_t lenMixed) override { if ((lenMixed == 1) && (sizeFolded > 0)) { @@ -2491,7 +2490,6 @@ std::unique_ptr<CaseFolder> ScintillaWin::CaseFolderForEncoding() { } else { if (pdoc->dbcsCodePage == 0) { std::unique_ptr<CaseFolderTable> pcf = std::make_unique<CaseFolderTable>(); - pcf->StandardASCII(); // Only for single byte encodings for (int i=0x80; i<0x100; i++) { char sCharacter[2] = "A"; |