aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorNeil <nyamatongwe@gmail.com>2013-07-07 11:57:42 +1000
committerNeil <nyamatongwe@gmail.com>2013-07-07 11:57:42 +1000
commitc8021790271b0895713b6384af69ec4afa98d2a7 (patch)
treeeb2b5a3e22b2b27572c7eef929b47e1f184a43e1 /src
parentfeaf60a96bfb0426e54b5a517b111070e388b97b (diff)
downloadscintilla-mirror-c8021790271b0895713b6384af69ec4afa98d2a7.tar.gz
When case conversion changes the length of the text, ensure only
valid memory accessed and that the converted text is selected.
Diffstat (limited to 'src')
-rw-r--r--src/Editor.cxx22
1 files changed, 16 insertions, 6 deletions
diff --git a/src/Editor.cxx b/src/Editor.cxx
index f778ea933..f925beab7 100644
--- a/src/Editor.cxx
+++ b/src/Editor.cxx
@@ -5000,18 +5000,28 @@ void Editor::ChangeCaseOfSelection(int caseMapping) {
size_t firstDifference = 0;
while (sMapped[firstDifference] == sText[firstDifference])
firstDifference++;
- size_t lastDifference = sMapped.size() - 1;
- while (sMapped[lastDifference] == sText[lastDifference])
- lastDifference--;
- size_t endSame = sMapped.size() - 1 - lastDifference;
+ size_t lastDifferenceText = sText.size() - 1;
+ size_t lastDifferenceMapped = sMapped.size() - 1;
+ while (sMapped[lastDifferenceMapped] == sText[lastDifferenceText]) {
+ lastDifferenceText--;
+ lastDifferenceMapped--;
+ }
+ size_t endDifferenceText = sText.size() - 1 - lastDifferenceText;
pdoc->DeleteChars(
static_cast<int>(currentNoVS.Start().Position() + firstDifference),
- static_cast<int>(rangeBytes - firstDifference - endSame));
+ static_cast<int>(rangeBytes - firstDifference - endDifferenceText));
pdoc->InsertString(
static_cast<int>(currentNoVS.Start().Position() + firstDifference),
sMapped.c_str() + firstDifference,
- static_cast<int>(lastDifference - firstDifference + 1));
+ static_cast<int>(lastDifferenceMapped - firstDifference + 1));
// Automatic movement changes selection so reset to exactly the same as it was.
+ int diffSizes = sMapped.size() - sText.size();
+ if (diffSizes != 0) {
+ if (current.anchor > current.caret)
+ current.anchor.Add(diffSizes);
+ else
+ current.caret.Add(diffSizes);
+ }
sel.Range(r) = current;
}
}