diff options
author | Neil Hodgson <nyamatongwe@gmail.com> | 2018-04-22 08:29:01 +1000 |
---|---|---|
committer | Neil Hodgson <nyamatongwe@gmail.com> | 2018-04-22 08:29:01 +1000 |
commit | dc7c28cfcf21c18f96a49f2cc0818d4f676bd301 (patch) | |
tree | 80b3dd322f359066f0b149a749ed8629a97e4184 | |
parent | 23ef8619d029b9edbe0f19212a6b3954b9f79874 (diff) | |
download | scintilla-mirror-dc7c28cfcf21c18f96a49f2cc0818d4f676bd301.tar.gz |
Fix problems with 64-bit positions by using types that expand to 64-bits and
removing casts to int.
-rw-r--r-- | cocoa/ScintillaCocoa.h | 2 | ||||
-rw-r--r-- | cocoa/ScintillaCocoa.mm | 56 | ||||
-rw-r--r-- | cocoa/ScintillaView.mm | 6 |
3 files changed, 33 insertions, 31 deletions
diff --git a/cocoa/ScintillaCocoa.h b/cocoa/ScintillaCocoa.h index e86c00724..a54e3cfbb 100644 --- a/cocoa/ScintillaCocoa.h +++ b/cocoa/ScintillaCocoa.h @@ -197,7 +197,7 @@ public: void ObserverRemove(); void IdleWork() override; void QueueIdleWork(WorkNeeded::workItems items, Sci::Position upTo) override; - int InsertText(NSString *input); + ptrdiff_t InsertText(NSString *input); NSRange PositionsFromCharacters(NSRange rangeCharacters) const; NSRange CharactersFromPositions(NSRange rangePositions) const; NSString *RangeTextAsString(NSRange rangePositions) const; diff --git a/cocoa/ScintillaCocoa.mm b/cocoa/ScintillaCocoa.mm index fce7308c3..a9009f073 100644 --- a/cocoa/ScintillaCocoa.mm +++ b/cocoa/ScintillaCocoa.mm @@ -144,7 +144,7 @@ static const KeyToCommand macMapDefault[] = { @interface FindHighlightLayer : CAGradientLayer { @private NSString *sFind; - int positionFind; + long positionFind; BOOL retaining; CGFloat widthText; CGFloat heightLine; @@ -153,7 +153,7 @@ static const KeyToCommand macMapDefault[] = { } @property(copy) NSString *sFind; -@property(assign) int positionFind; +@property(assign) long positionFind; @property(assign) BOOL retaining; @property(assign) CGFloat widthText; @property(assign) CGFloat heightLine; @@ -1024,7 +1024,7 @@ void ScintillaCocoa::Paste(bool forceRectangular) { pdoc->BeginUndoAction(); ClearSelection(false); - InsertPasteShape(selectedText.Data(), static_cast<int>(selectedText.Length()), + InsertPasteShape(selectedText.Data(), selectedText.Length(), selectedText.rectangular ? pasteRectangular : pasteStream); pdoc->EndUndoAction(); @@ -1287,7 +1287,9 @@ void ScintillaCocoa::StartDrag() { Sci::Line startLine = static_cast<Sci::Line>(pdoc->LineFromPosition(selStart)); Sci::Line endLine = static_cast<Sci::Line>(pdoc->LineFromPosition(selEnd)); Point pt; - long startPos, endPos, ep; + Sci::Position startPos; + Sci::Position endPos; + Sci::Position ep; PRectangle rcSel; if (startLine==endLine && WndProc(SCI_GETWRAPMODE, 0, 0) != SC_WRAP_NONE) { @@ -1302,8 +1304,8 @@ void ScintillaCocoa::StartDrag() { // step back a position if we're counting the newline ep = WndProc(SCI_GETLINEENDPOSITION, startLine, 0); if (endPos > ep) endPos = ep; - ptStart = LocationFromPosition(static_cast<int>(startPos)); - ptEnd = LocationFromPosition(static_cast<int>(endPos)); + ptStart = LocationFromPosition(startPos); + ptEnd = LocationFromPosition(endPos); if (ptStart.y == ptEnd.y) { // We're just selecting part of one visible line rcSel.left = ptStart.x; @@ -1311,7 +1313,7 @@ void ScintillaCocoa::StartDrag() { } else { // Find the bounding box. startPos = WndProc(SCI_POSITIONFROMLINE, startLine, 0); - rcSel.left = LocationFromPosition(static_cast<int>(startPos)).x; + rcSel.left = LocationFromPosition(startPos).x; rcSel.right = client.right; } rcSel.top = ptStart.y; @@ -1328,10 +1330,10 @@ void ScintillaCocoa::StartDrag() { // step back a position if we're counting the newline ep = WndProc(SCI_GETLINEENDPOSITION, l, 0); if (endPos > ep) endPos = ep; - pt = LocationFromPosition(static_cast<int>(startPos)); // top left of line selection + pt = LocationFromPosition(startPos); // top left of line selection if (pt.x < rcSel.left || rcSel.left < 0) rcSel.left = pt.x; if (pt.y < rcSel.top || rcSel.top < 0) rcSel.top = pt.y; - pt = LocationFromPosition(static_cast<int>(endPos)); // top right of line selection + pt = LocationFromPosition(endPos); // top right of line selection pt.y += vs.lineHeight; // get to the bottom of the line if (pt.x > rcSel.right || rcSel.right < 0) { if (pt.x > client.right) @@ -1589,7 +1591,7 @@ ptrdiff_t ScintillaCocoa::TargetAsUTF8(char *text) { if (text) memcpy(text, tmputf.c_str(), tmputf.length()); CFRelease(cfsVal); - return static_cast<ptrdiff_t>(tmputf.length()); + return tmputf.length(); } return targetLength; } @@ -1598,8 +1600,8 @@ ptrdiff_t ScintillaCocoa::TargetAsUTF8(char *text) { // Returns the text in the range converted to an NSString. NSString *ScintillaCocoa::RangeTextAsString(NSRange rangePositions) const { - const std::string text = RangeText(static_cast<int>(rangePositions.location), - static_cast<int>(NSMaxRange(rangePositions))); + const std::string text = RangeText(rangePositions.location, + NSMaxRange(rangePositions)); if (IsUnicodeMode()) { return @(text.c_str()); } else { @@ -1626,7 +1628,7 @@ NSRange ScintillaCocoa::RangeForVisibleLine(NSInteger lineVisible) { // Returns visible line number of a text position in characters. NSInteger ScintillaCocoa::VisibleLineForIndex(NSInteger index) { const NSRange rangePosition = PositionsFromCharacters(NSMakeRange(index, 0)); - const Sci::Line lineVisible = DisplayFromPosition(static_cast<Sci::Position>(rangePosition.location)); + const Sci::Line lineVisible = DisplayFromPosition(rangePosition.location); return lineVisible; } @@ -1638,11 +1640,11 @@ NSRect ScintillaCocoa::FrameForRange(NSRange rangeCharacters) { NSUInteger rangeEnd = NSMaxRange(posRange); const bool endsWithLineEnd = rangeCharacters.length && - (pdoc->GetColumn(static_cast<int>(rangeEnd)) == 0); + (pdoc->GetColumn(rangeEnd) == 0); - Point ptStart = LocationFromPosition(static_cast<int>(posRange.location)); + Point ptStart = LocationFromPosition(posRange.location); const PointEnd peEndRange = static_cast<PointEnd>(peSubLineEnd|peLineEnd); - Point ptEnd = LocationFromPosition(static_cast<int>(rangeEnd), peEndRange); + Point ptEnd = LocationFromPosition(rangeEnd, peEndRange); NSRect rect = NSMakeRect(ptStart.x, ptStart.y, ptEnd.x - ptStart.x, @@ -1678,7 +1680,7 @@ ptrdiff_t ScintillaCocoa::EncodedFromUTF8(char *utf8, char *encoded) const { if (IsUnicodeMode()) { if (encoded) memcpy(encoded, utf8, inputLength); - return static_cast<ptrdiff_t>(inputLength); + return inputLength; } else { // Need to convert const CFStringEncoding encoding = EncodingFromCharacterSet(IsUnicodeMode(), @@ -1689,7 +1691,7 @@ ptrdiff_t ScintillaCocoa::EncodedFromUTF8(char *utf8, char *encoded) const { if (encoded) memcpy(encoded, sEncoded.c_str(), sEncoded.length()); CFRelease(cfsVal); - return static_cast<ptrdiff_t>(sEncoded.length()); + return sEncoded.length(); } } @@ -2147,7 +2149,7 @@ bool ScintillaCocoa::KeyboardInput(NSEvent *event) { /** * Used to insert already processed text provided by the Cocoa text input system. */ -int ScintillaCocoa::InsertText(NSString *input) { +ptrdiff_t ScintillaCocoa::InsertText(NSString *input) { CFStringEncoding encoding = EncodingFromCharacterSet(IsUnicodeMode(), vs.styles[STYLE_DEFAULT].characterSet); std::string encoded = EncodedBytesString((__bridge CFStringRef)input, encoding); @@ -2155,7 +2157,7 @@ int ScintillaCocoa::InsertText(NSString *input) { if (encoded.length() > 0) { AddCharUTF(encoded.c_str(), static_cast<unsigned int>(encoded.length()), false); } - return static_cast<int>(encoded.length()); + return encoded.length(); } //-------------------------------------------------------------------------------------------------- @@ -2164,10 +2166,10 @@ int ScintillaCocoa::InsertText(NSString *input) { * Convert from a range of characters to a range of bytes. */ NSRange ScintillaCocoa::PositionsFromCharacters(NSRange rangeCharacters) const { - long start = pdoc->GetRelativePositionUTF16(0, static_cast<int>(rangeCharacters.location)); + Sci::Position start = pdoc->GetRelativePositionUTF16(0, rangeCharacters.location); if (start == INVALID_POSITION) start = pdoc->Length(); - long end = pdoc->GetRelativePositionUTF16(static_cast<int>(start), static_cast<int>(rangeCharacters.length)); + Sci::Position end = pdoc->GetRelativePositionUTF16(start, rangeCharacters.length); if (end == INVALID_POSITION) end = pdoc->Length(); return NSMakeRange(start, end - start); @@ -2179,9 +2181,9 @@ NSRange ScintillaCocoa::PositionsFromCharacters(NSRange rangeCharacters) const { * Convert from a range of characters from a range of bytes. */ NSRange ScintillaCocoa::CharactersFromPositions(NSRange rangePositions) const { - const long start = pdoc->CountUTF16(0, static_cast<int>(rangePositions.location)); - const long len = pdoc->CountUTF16(static_cast<int>(rangePositions.location), - static_cast<int>(NSMaxRange(rangePositions))); + const Sci::Position start = pdoc->CountUTF16(0, rangePositions.location); + const Sci::Position len = pdoc->CountUTF16(rangePositions.location, + NSMaxRange(rangePositions)); return NSMakeRange(start, len); } @@ -2447,14 +2449,14 @@ void ScintillaCocoa::ShowFindIndicatorForRange(NSRange charRange, BOOL retaining CFStringEncoding encoding = EncodingFromCharacterSet(IsUnicodeMode(), vs.styles[STYLE_DEFAULT].characterSet); std::vector<char> buffer(charRange.length); - pdoc->GetCharRange(&buffer[0], static_cast<int>(charRange.location), static_cast<int>(charRange.length)); + pdoc->GetCharRange(&buffer[0], charRange.location, charRange.length); CFStringRef cfsFind = CFStringFromString(&buffer[0], charRange.length, encoding); layerFindIndicator.sFind = (__bridge NSString *)cfsFind; if (cfsFind) CFRelease(cfsFind); layerFindIndicator.retaining = retaining; - layerFindIndicator.positionFind = static_cast<int>(charRange.location); + layerFindIndicator.positionFind = charRange.location; // SCI_GETSTYLEAT reports a signed byte but want an unsigned to index into styles const char styleByte = static_cast<char>(WndProc(SCI_GETSTYLEAT, charRange.location, 0)); const long style = static_cast<unsigned char>(styleByte); diff --git a/cocoa/ScintillaView.mm b/cocoa/ScintillaView.mm index c19c976f7..aad9b0c9a 100644 --- a/cocoa/ScintillaView.mm +++ b/cocoa/ScintillaView.mm @@ -600,7 +600,7 @@ static NSCursor *cursorFromEnum(Window::Cursor cursor) { NSRange posRangeCurrent = mOwner.backend->PositionsFromCharacters(NSMakeRange(replacementRange.location, 0)); // Note: Scintilla internally works almost always with bytes instead chars, so we need to take // this into account when determining selection ranges and such. - int lengthInserted = mOwner.backend->InsertText(newText); + ptrdiff_t lengthInserted = mOwner.backend->InsertText(newText); posRangeCurrent.length = lengthInserted; mMarkedTextRange = mOwner.backend->CharactersFromPositions(posRangeCurrent); // Mark the just inserted text. Keep the marked range for later reset. @@ -941,7 +941,7 @@ static NSCursor *cursorFromEnum(Window::Cursor cursor) { */ - (id) accessibilityValue { const sptr_t length = [mOwner message: SCI_GETLENGTH]; - return mOwner.backend->RangeTextAsString(NSMakeRange(0, static_cast<int>(length))); + return mOwner.backend->RangeTextAsString(NSMakeRange(0, length)); } //-------------------------------------------------------------------------------------------------- @@ -950,7 +950,7 @@ static NSCursor *cursorFromEnum(Window::Cursor cursor) { * NSAccessibility : Line of the caret. */ - (NSInteger) accessibilityInsertionPointLineNumber { - const int caret = static_cast<int>([mOwner message: SCI_GETCURRENTPOS]); + const Sci::Position caret = [mOwner message: SCI_GETCURRENTPOS]; const NSRange rangeCharactersCaret = mOwner.backend->CharactersFromPositions(NSMakeRange(caret, 0)); return mOwner.backend->VisibleLineForIndex(rangeCharactersCaret.location); } |