aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/CaseConvert.cxx
diff options
context:
space:
mode:
authorNeil <nyamatongwe@gmail.com>2018-04-21 16:18:38 +1000
committerNeil <nyamatongwe@gmail.com>2018-04-21 16:18:38 +1000
commitd05d7fbd132b6a8060b3f0fa3a7a56cfaa0c41e0 (patch)
tree3722f90a5360ba769d80aaf0a978538655efcb4e /src/CaseConvert.cxx
parentc477f4d6852219240182352fd35b5429121fee5c (diff)
downloadscintilla-mirror-d05d7fbd132b6a8060b3f0fa3a7a56cfaa0c41e0.tar.gz
Safety improvements for character code - drop reinterpret_cast, ensure more
variables are initialized, specify noexcept when safe.
Diffstat (limited to 'src/CaseConvert.cxx')
-rw-r--r--src/CaseConvert.cxx21
1 files changed, 10 insertions, 11 deletions
diff --git a/src/CaseConvert.cxx b/src/CaseConvert.cxx
index ce191f574..2d6db4eb7 100644
--- a/src/CaseConvert.cxx
+++ b/src/CaseConvert.cxx
@@ -563,8 +563,7 @@ class CaseConverter : public ICaseConverter {
enum { maxConversionLength=6 };
struct ConversionString {
char conversion[maxConversionLength+1];
- ConversionString() {
- conversion[0] = '\0';
+ ConversionString() : conversion{} {
}
};
// Conversions are initially store in a vector of structs but then decomposed into
@@ -572,10 +571,10 @@ class CaseConverter : public ICaseConverter {
struct CharacterConversion {
int character;
ConversionString conversion;
- CharacterConversion(int character_=0, const char *conversion_="") : character(character_) {
+ CharacterConversion(int character_=0, const char *conversion_="") noexcept : character(character_) {
StringCopy(conversion.conversion, conversion_);
}
- bool operator<(const CharacterConversion &other) const {
+ bool operator<(const CharacterConversion &other) const noexcept {
return character < other.character;
}
};
@@ -607,9 +606,9 @@ public:
size_t CaseConvertString(char *converted, size_t sizeConverted, const char *mixed, size_t lenMixed) override {
size_t lenConverted = 0;
size_t mixedPos = 0;
- unsigned char bytes[UTF8MaxBytes + 1];
+ unsigned char bytes[UTF8MaxBytes + 1]{};
while (mixedPos < lenMixed) {
- const unsigned char leadByte = static_cast<unsigned char>(mixed[mixedPos]);
+ const unsigned char leadByte = mixed[mixedPos];
const char *caseConverted = 0;
size_t lenMixedChar = 1;
if (UTF8IsAscii(leadByte)) {
@@ -705,10 +704,10 @@ void SetupConversions(enum CaseConversion conversion) {
while (*sComplex) {
// Longest ligature is 3 character so 5 for safety
const size_t lenUTF8 = 5*UTF8MaxBytes+1;
- char originUTF8[lenUTF8];
- char foldedUTF8[lenUTF8];
- char lowerUTF8[lenUTF8];
- char upperUTF8[lenUTF8];
+ unsigned char originUTF8[lenUTF8]{};
+ char foldedUTF8[lenUTF8]{};
+ char lowerUTF8[lenUTF8]{};
+ char upperUTF8[lenUTF8]{};
size_t i = 0;
while (*sComplex && *sComplex != '|') {
originUTF8[i++] = *sComplex;
@@ -738,7 +737,7 @@ void SetupConversions(enum CaseConversion conversion) {
sComplex++;
lowerUTF8[i] = 0;
- const int character = UnicodeFromUTF8(reinterpret_cast<unsigned char *>(originUTF8));
+ const int character = UnicodeFromUTF8(originUTF8);
if (conversion == CaseConversionFold && foldedUTF8[0]) {
caseConvFold.Add(character, foldedUTF8);