aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorNeil <nyamatongwe@gmail.com>2018-04-17 08:23:18 +1000
committerNeil <nyamatongwe@gmail.com>2018-04-17 08:23:18 +1000
commit255d2d33abf4c2c5a918bacde049004e52b7986f (patch)
tree4a563a7d7a9594be0e67b6be6c2c493d8ffea9ec
parentec79c307ff36cdcce0e520e67bef69e64a3e19b5 (diff)
downloadscintilla-mirror-255d2d33abf4c2c5a918bacde049004e52b7986f.tar.gz
Add SC_DOCUMENTOPTION_TEXT_LARGE option for documents larger than 2 GigaBytes.
This option is provisional and experimental.
-rw-r--r--doc/ScintillaDoc.html49
-rw-r--r--doc/ScintillaHistory.html4
-rw-r--r--include/Scintilla.h4
-rw-r--r--include/Scintilla.iface10
-rw-r--r--src/CellBuffer.cxx17
-rw-r--r--src/CellBuffer.h5
-rw-r--r--src/ContractionState.cxx7
-rw-r--r--src/ContractionState.h2
-rw-r--r--src/Document.cxx9
-rw-r--r--src/Document.h2
-rw-r--r--src/EditModel.cxx2
-rw-r--r--src/EditView.cxx7
-rw-r--r--src/Editor.cxx9
-rw-r--r--src/MarginView.cxx13
-rw-r--r--src/Position.h4
-rw-r--r--src/RunStyles.cxx2
-rw-r--r--test/unit/testCellBuffer.cxx2
-rw-r--r--test/unit/testContractionState.cxx2
-rw-r--r--test/unit/testPartitioning.cxx2
19 files changed, 111 insertions, 41 deletions
diff --git a/doc/ScintillaDoc.html b/doc/ScintillaDoc.html
index 25e7ca15b..d9f658814 100644
--- a/doc/ScintillaDoc.html
+++ b/doc/ScintillaDoc.html
@@ -119,7 +119,7 @@
<h1>Scintilla Documentation</h1>
- <p>Last edited 1 February 2018 NH</p>
+ <p>Last edited 17 April 2018 NH</p>
<p>There is <a class="jump" href="Design.html">an overview of the internal design of
Scintilla</a>.<br />
@@ -5711,11 +5711,12 @@ sptr_t CallScintilla(unsigned int iMessage, uptr_t wParam, sptr_t lParam){
<code><a class="message" href="#SCI_GETDOCPOINTER">SCI_GETDOCPOINTER &rarr; document *</a><br />
<a class="message" href="#SCI_SETDOCPOINTER">SCI_SETDOCPOINTER(&lt;unused&gt;, document
*doc)</a><br />
- <a class="message" href="#SCI_CREATEDOCUMENT">SCI_CREATEDOCUMENT(int bytes, int documentOption) &rarr; document *</a><br />
+ <a class="message" href="#SCI_CREATEDOCUMENT">SCI_CREATEDOCUMENT(int bytes, int documentOptions) &rarr; document *</a><br />
<a class="message" href="#SCI_ADDREFDOCUMENT">SCI_ADDREFDOCUMENT(&lt;unused&gt;, document
*doc)</a><br />
<a class="message" href="#SCI_RELEASEDOCUMENT">SCI_RELEASEDOCUMENT(&lt;unused&gt;, document
*doc)</a><br />
+ <a class="message" href="#SCI_GETDOCUMENTOPTIONS">SCI_GETDOCUMENTOPTIONS &rarr; int</a><br />
</code>
<p><b id="SCI_GETDOCPOINTER">SCI_GETDOCPOINTER &rarr; document *</b><br />
@@ -5732,7 +5733,7 @@ sptr_t CallScintilla(unsigned int iMessage, uptr_t wParam, sptr_t lParam){
window.<br />
6. If <code class="parameter">doc</code> was not 0, its reference count is increased by 1.</p>
- <p><b id="SCI_CREATEDOCUMENT">SCI_CREATEDOCUMENT(int bytes, int documentOption) &rarr; document *</b><br />
+ <p><b id="SCI_CREATEDOCUMENT">SCI_CREATEDOCUMENT(int bytes, int documentOptions) &rarr; document *</b><br />
This message creates a new, empty document and returns a pointer to it. This document is not
selected into the editor and starts with a reference count of 1. This means that you have
ownership of it and must either reduce its reference count by 1 after using
@@ -5743,12 +5744,29 @@ sptr_t CallScintilla(unsigned int iMessage, uptr_t wParam, sptr_t lParam){
to allocate once rather than rely on the buffer growing as data is added.
If <code>SCI_CREATEDOCUMENT</code> fails then 0 is returned.</p>
- <p id="documentOption">The <code class="parameter">documentOption</code> argument
+ <p id="documentOptions">The <code class="parameter">documentOptions</code> argument
chooses between different document capabilities which affect memory allocation and performance with
<code>SC_DOCUMENTOPTION_DEFAULT</code> (0) choosing standard options.
- <code>SC_DOCUMENTOPTION_STYLES_NONE</code> (1) stops allocation of memory to style characters
+ <code>SC_DOCUMENTOPTION_STYLES_NONE</code> (0x1) stops allocation of memory to style characters
which saves significant memory, often 40% with the whole document treated as being style 0.
- Lexers may still produce visual styling by using indicators.</p>
+ Lexers may still produce visual styling by using indicators.
+ <span class="provisional"><code>SC_DOCUMENTOPTION_TEXT_LARGE</code> (0x100) accomodates documents larger than 2 GigaBytes
+ in 64-bit executables.</span>
+ </p>
+
+ <p>With <code>SC_DOCUMENTOPTION_STYLES_NONE</code>, lexers are still active and may display
+ indicators. Some may produce folding information althoough most require lexical styles to correctly determine folding.
+ Its often more efficient to set the null lexer <code>SCLEX_NULL</code> so no lexer is run.
+ </p>
+
+ <p class="provisional">The <code>SC_DOCUMENTOPTION_TEXT_LARGE</code> option is experimental and has not been
+ thoroughly tested. Lexers may fail or hang when lexing past 2GB or 4GB.
+ Applications using this option should be tested to ensure the option works in their circumstances and each lexer
+ included should also be tested with documents larger than 4GB.
+ For many applications lexing documents larger than 4GB will be too sluggish so <code>SC_DOCUMENTOPTION_STYLES_NONE</code>
+ and the null lexer <code>SCLEX_NULL</code> can be used. Another approach is to turn on idle styling with
+ <a class="seealso" href="#SCI_SETIDLESTYLING"><code>SCI_SETIDLESTYLING</code></a>.
+ </p>
<table class="standard" summary="Document options">
<tbody>
@@ -5769,10 +5787,16 @@ sptr_t CallScintilla(unsigned int iMessage, uptr_t wParam, sptr_t lParam){
<tr>
<td align="left">SC_DOCUMENTOPTION_STYLES_NONE</td>
- <td align="left">1</td>
+ <td align="left">0x1</td>
<td align="left">Stop allocation of memory for styles and treat all text as style 0.</td>
</tr>
+ <tr>
+ <td align="left" class="provisional">SC_DOCUMENTOPTION_TEXT_LARGE</td>
+ <td align="left">0x100</td>
+ <td align="left">Allow document to be larger than 2 GB.</td>
+ </tr>
+
</tbody>
</table>
@@ -5794,6 +5818,9 @@ sptr_t CallScintilla(unsigned int iMessage, uptr_t wParam, sptr_t lParam){
world spinning in its orbit you must balance each call to <code>SCI_CREATEDOCUMENT</code> or
<code>SCI_ADDREFDOCUMENT</code> with a call to <code>SCI_RELEASEDOCUMENT</code>.</p>
+ <p><b id="SCI_GETDOCUMENTOPTIONS">SCI_GETDOCUMENTOPTIONS &rarr; int</b><br />
+ Returns the options that were used to create the document.</p>
+
<h2 id="BackgroundLoadSave">Background loading and saving</h2>
<p>To ensure a responsive user interface, applications may decide to load and save documents using a separate thread
@@ -5801,7 +5828,7 @@ sptr_t CallScintilla(unsigned int iMessage, uptr_t wParam, sptr_t lParam){
<h3 id="BackgroundLoad">Loading in the background</h3>
- <code><a class="message" href="#SCI_CREATELOADER">SCI_CREATELOADER(int bytes, int documentOption) &rarr; int</a><br />
+ <code><a class="message" href="#SCI_CREATELOADER">SCI_CREATELOADER(int bytes, int documentOptions) &rarr; int</a><br />
</code>
<p>An application can load all of a file into a buffer it allocates on a background thread and then add the data in that buffer
@@ -5810,15 +5837,15 @@ sptr_t CallScintilla(unsigned int iMessage, uptr_t wParam, sptr_t lParam){
<p>To avoid these issues, a loader object may be created and used to load the file. The loader object supports the ILoader interface.</p>
- <p><b id="SCI_CREATELOADER">SCI_CREATELOADER(int bytes, int documentOption) &rarr; int</b><br />
+ <p><b id="SCI_CREATELOADER">SCI_CREATELOADER(int bytes, int documentOptions) &rarr; int</b><br />
Create an object that supports the <code>ILoader</code> interface which can be used to load data and then
be turned into a Scintilla document object for attachment to a view object.
The <code class="parameter">bytes</code> argument determines the initial memory allocation for the document as it is more efficient
to allocate once rather than rely on the buffer growing as data is added.
If <code>SCI_CREATELOADER</code> fails then 0 is returned.</p>
- <p>The <code class="parameter">documentOption</code> argument
- is described in the <a class="seealso" href="#documentOption"><code>SCI_CREATEDOCUMENT</code></a> section.</p>
+ <p>The <code class="parameter">documentOptions</code> argument
+ is described in the <a class="seealso" href="#documentOptions"><code>SCI_CREATEDOCUMENT</code></a> section.</p>
<h4>ILoader</h4>
diff --git a/doc/ScintillaHistory.html b/doc/ScintillaHistory.html
index 87bfa49ab..00fe782fe 100644
--- a/doc/ScintillaHistory.html
+++ b/doc/ScintillaHistory.html
@@ -542,6 +542,10 @@
Released 10 April 2018.
</li>
<li>
+ Add experimental SC_DOCUMENTOPTION_TEXT_LARGE option to accomodate documents larger than
+ 2 GigaBytes.
+ </li>
+ <li>
Set the last X chosen when SCI_REPLACESEL called to ensure macros work
when text insertion followed by caret up or down.
</li>
diff --git a/include/Scintilla.h b/include/Scintilla.h
index 29a723e26..3ec70a380 100644
--- a/include/Scintilla.h
+++ b/include/Scintilla.h
@@ -685,10 +685,12 @@ typedef sptr_t (*SciFnDirect)(sptr_t ptr, unsigned int iMessage, uptr_t wParam,
#define SCI_SETZOOM 2373
#define SCI_GETZOOM 2374
#define SC_DOCUMENTOPTION_DEFAULT 0
-#define SC_DOCUMENTOPTION_STYLES_NONE 1
+#define SC_DOCUMENTOPTION_STYLES_NONE 0x1
+#define SC_DOCUMENTOPTION_TEXT_LARGE 0x100
#define SCI_CREATEDOCUMENT 2375
#define SCI_ADDREFDOCUMENT 2376
#define SCI_RELEASEDOCUMENT 2377
+#define SCI_GETDOCUMENTOPTIONS 2379
#define SCI_GETMODEVENTMASK 2378
#define SCI_SETFOCUS 2380
#define SCI_GETFOCUS 2381
diff --git a/include/Scintilla.iface b/include/Scintilla.iface
index 51c3f2e81..2c361b5f0 100644
--- a/include/Scintilla.iface
+++ b/include/Scintilla.iface
@@ -1773,16 +1773,20 @@ get int GetZoom=2374(,)
enu DocumentOption=SC_DOCUMENTOPTION_
val SC_DOCUMENTOPTION_DEFAULT=0
-val SC_DOCUMENTOPTION_STYLES_NONE=1
+val SC_DOCUMENTOPTION_STYLES_NONE=0x1
+val SC_DOCUMENTOPTION_TEXT_LARGE=0x100
# Create a new document object.
# Starts with reference count of 1 and not selected into editor.
-fun int CreateDocument=2375(int bytes, int documentOption)
+fun int CreateDocument=2375(int bytes, int documentOptions)
# Extend life of document.
fun void AddRefDocument=2376(, int doc)
# Release a reference to the document, deleting document if it fades to black.
fun void ReleaseDocument=2377(, int doc)
+# Get which document options are set.
+get int GetDocumentOptions=2379(,)
+
# Get which document modification events are sent to the container.
get int GetModEventMask=2378(,)
@@ -2544,7 +2548,7 @@ set void SetTechnology=2630(int technology,)
get int GetTechnology=2631(,)
# Create an ILoader*.
-fun int CreateLoader=2632(int bytes, int documentOption)
+fun int CreateLoader=2632(int bytes, int documentOptions)
# On OS X, show a find indicator.
fun void FindIndicatorShow=2640(position start, position end)
diff --git a/src/CellBuffer.cxx b/src/CellBuffer.cxx
index d6d83c20b..fcc75a741 100644
--- a/src/CellBuffer.cxx
+++ b/src/CellBuffer.cxx
@@ -364,12 +364,17 @@ void UndoHistory::CompletedRedoStep() {
currentAction++;
}
-CellBuffer::CellBuffer(bool hasStyles_) :
- hasStyles(hasStyles_) {
+CellBuffer::CellBuffer(bool hasStyles_, bool largeDocument_) :
+ hasStyles(hasStyles_), largeDocument(largeDocument_) {
readOnly = false;
utf8LineEnds = 0;
collectingUndo = true;
plv = std::make_unique<LineVector<Sci::Position>>();
+ if (largeDocument)
+ plv = std::make_unique<LineVector<Sci::Position>>();
+ else
+ plv = std::make_unique<LineVector<int>>();
+
}
CellBuffer::~CellBuffer() {
@@ -556,6 +561,14 @@ void CellBuffer::SetReadOnly(bool set) {
readOnly = set;
}
+bool CellBuffer::IsLarge() const {
+ return largeDocument;
+}
+
+bool CellBuffer::HasStyles() const {
+ return hasStyles;
+}
+
void CellBuffer::SetSavePoint() {
uh.SetSavePoint();
}
diff --git a/src/CellBuffer.h b/src/CellBuffer.h
index 544a26711..935ea6e69 100644
--- a/src/CellBuffer.h
+++ b/src/CellBuffer.h
@@ -108,6 +108,7 @@ public:
class CellBuffer {
private:
bool hasStyles;
+ bool largeDocument;
SplitVector<char> substance;
SplitVector<char> style;
bool readOnly;
@@ -126,7 +127,7 @@ private:
public:
- CellBuffer(bool hasStyles_);
+ CellBuffer(bool hasStyles_, bool largeDocument_);
// Deleted so CellBuffer objects can not be copied.
CellBuffer(const CellBuffer &) = delete;
void operator=(const CellBuffer &) = delete;
@@ -163,6 +164,8 @@ public:
bool IsReadOnly() const;
void SetReadOnly(bool set);
+ bool IsLarge() const;
+ bool HasStyles() const;
/// The save point is a marker in the undo stack where the container has stated that
/// the buffer was saved. Undo and redo can move over the save point.
diff --git a/src/ContractionState.cxx b/src/ContractionState.cxx
index 2950587cb..b513c20a6 100644
--- a/src/ContractionState.cxx
+++ b/src/ContractionState.cxx
@@ -407,8 +407,11 @@ void ContractionState<LINE>::Check() const {
namespace Scintilla {
-std::unique_ptr<IContractionState> ContractionStateCreate() {
- return std::make_unique<ContractionState<Sci::Line>>();
+std::unique_ptr<IContractionState> ContractionStateCreate(bool largeDocument) {
+ if (largeDocument)
+ return std::make_unique<ContractionState<Sci::Line>>();
+ else
+ return std::make_unique<ContractionState<int>>();
}
}
diff --git a/src/ContractionState.h b/src/ContractionState.h
index a951e0a0c..90f5c0784 100644
--- a/src/ContractionState.h
+++ b/src/ContractionState.h
@@ -45,7 +45,7 @@ public:
virtual void ShowAll()=0;
};
-std::unique_ptr<IContractionState> ContractionStateCreate();
+std::unique_ptr<IContractionState> ContractionStateCreate(bool largeDocument);
}
diff --git a/src/Document.cxx b/src/Document.cxx
index 09a91d469..4765248d1 100644
--- a/src/Document.cxx
+++ b/src/Document.cxx
@@ -82,7 +82,7 @@ int LexInterface::LineEndTypesSupported() {
}
Document::Document(int options) :
- cb((options & SC_DOCUMENTOPTION_STYLES_NONE) == 0) {
+ cb((options & SC_DOCUMENTOPTION_STYLES_NONE) == 0, (options & SC_DOCUMENTOPTION_TEXT_LARGE) != 0) {
refCount = 0;
#ifdef _WIN32
eolMode = SC_EOL_CRLF;
@@ -113,7 +113,7 @@ Document::Document(int options) :
perLineData[ldMargin] = std::make_unique<LineAnnotation>();
perLineData[ldAnnotation] = std::make_unique<LineAnnotation>();
- decorations = DecorationListCreate(false);
+ decorations = DecorationListCreate(IsLarge());
cb.SetPerLine(this);
}
@@ -1520,6 +1520,11 @@ void Document::ConvertLineEnds(int eolModeSet) {
}
+int Document::Options() const {
+ return (IsLarge() ? SC_DOCUMENTOPTION_TEXT_LARGE : 0) |
+ (cb.HasStyles() ? 0 : SC_DOCUMENTOPTION_STYLES_NONE);
+}
+
bool Document::IsWhiteLine(Sci::Line line) const {
Sci::Position currentChar = static_cast<Sci::Position>(LineStart(line));
const Sci::Position endLine = static_cast<Sci::Position>(LineEnd(line));
diff --git a/src/Document.h b/src/Document.h
index 7614373e2..d5d0a4d2e 100644
--- a/src/Document.h
+++ b/src/Document.h
@@ -352,6 +352,8 @@ public:
void ConvertLineEnds(int eolModeSet);
void SetReadOnly(bool set) { cb.SetReadOnly(set); }
bool IsReadOnly() const { return cb.IsReadOnly(); }
+ bool IsLarge() const { return cb.IsLarge(); }
+ int Options() const;
void DelChar(Sci::Position pos);
void DelCharBack(Sci::Position pos);
diff --git a/src/EditModel.cxx b/src/EditModel.cxx
index 7782f583e..e7400ca37 100644
--- a/src/EditModel.cxx
+++ b/src/EditModel.cxx
@@ -70,7 +70,7 @@ EditModel::EditModel() {
wrapWidth = LineLayout::wrapWidthInfinite;
pdoc = new Document(SC_DOCUMENTOPTION_DEFAULT);
pdoc->AddRef();
- pcs = ContractionStateCreate();
+ pcs = ContractionStateCreate(pdoc->IsLarge());
}
EditModel::~EditModel() {
diff --git a/src/EditView.cxx b/src/EditView.cxx
index 37a6a9f9e..3f490af5e 100644
--- a/src/EditView.cxx
+++ b/src/EditView.cxx
@@ -2330,16 +2330,15 @@ Sci::Position EditView::FormatRange(bool draw, Sci_RangeToFormat *pfr, Surface *
if (draw && lineNumberWidth &&
(ypos + vsPrint.lineHeight <= pfr->rc.bottom) &&
(visibleLine >= 0)) {
- char number[100];
- sprintf(number, "%d" lineNumberPrintSpace, lineDoc + 1);
+ const std::string number = std::to_string(lineDoc + 1) + lineNumberPrintSpace;
PRectangle rcNumber = rcLine;
rcNumber.right = rcNumber.left + lineNumberWidth;
// Right justify
rcNumber.left = rcNumber.right - surfaceMeasure->WidthText(
- vsPrint.styles[STYLE_LINENUMBER].font, number, static_cast<int>(strlen(number)));
+ vsPrint.styles[STYLE_LINENUMBER].font, number.c_str(), static_cast<int>(number.length()));
surface->FlushCachedState();
surface->DrawTextNoClip(rcNumber, vsPrint.styles[STYLE_LINENUMBER].font,
- static_cast<XYPOSITION>(ypos + vsPrint.maxAscent), number, static_cast<int>(strlen(number)),
+ static_cast<XYPOSITION>(ypos + vsPrint.maxAscent), number.c_str(), static_cast<int>(number.length()),
vsPrint.styles[STYLE_LINENUMBER].fore,
vsPrint.styles[STYLE_LINENUMBER].back);
}
diff --git a/src/Editor.cxx b/src/Editor.cxx
index 0a2cf9c7c..ca23b0030 100644
--- a/src/Editor.cxx
+++ b/src/Editor.cxx
@@ -5212,7 +5212,7 @@ void Editor::SetDocPointer(Document *document) {
pdoc = document;
}
pdoc->AddRef();
- pcs = ContractionStateCreate();
+ pcs = ContractionStateCreate(pdoc->IsLarge());
// Ensure all positions within document
sel.Clear();
@@ -7604,7 +7604,7 @@ sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) {
Document *doc = new Document(static_cast<int>(lParam));
doc->AddRef();
doc->Allocate(static_cast<int>(wParam));
- pcs = ContractionStateCreate();
+ pcs = ContractionStateCreate(pdoc->IsLarge());
return reinterpret_cast<sptr_t>(doc);
}
@@ -7616,12 +7616,15 @@ sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) {
(reinterpret_cast<Document *>(lParam))->Release();
break;
+ case SCI_GETDOCUMENTOPTIONS:
+ return pdoc->Options();
+
case SCI_CREATELOADER: {
Document *doc = new Document(static_cast<int>(lParam));
doc->AddRef();
doc->Allocate(static_cast<int>(wParam));
doc->SetUndoCollection(false);
- pcs = ContractionStateCreate();
+ pcs = ContractionStateCreate(pdoc->IsLarge());
return reinterpret_cast<sptr_t>(static_cast<ILoader *>(doc));
}
diff --git a/src/MarginView.cxx b/src/MarginView.cxx
index a7f9a9a2d..02a961b10 100644
--- a/src/MarginView.cxx
+++ b/src/MarginView.cxx
@@ -367,10 +367,12 @@ void MarginView::PaintMargin(Surface *surface, Sci::Line topLine, PRectangle rc,
rcMarker.bottom = static_cast<XYPOSITION>(yposScreen + vs.lineHeight);
if (vs.ms[margin].style == SC_MARGIN_NUMBER) {
if (firstSubLine) {
- char number[100] = "";
- if (lineDoc >= 0)
- sprintf(number, "%d", lineDoc + 1);
+ std::string sNumber;
+ if (lineDoc >= 0) {
+ sNumber = std::to_string(lineDoc + 1);
+ }
if (model.foldFlags & (SC_FOLDFLAG_LEVELNUMBERS | SC_FOLDFLAG_LINESTATE)) {
+ char number[100] = "";
if (model.foldFlags & SC_FOLDFLAG_LEVELNUMBERS) {
const int lev = model.pdoc->GetLevel(lineDoc);
sprintf(number, "%c%c %03X %03X",
@@ -383,14 +385,15 @@ void MarginView::PaintMargin(Surface *surface, Sci::Line topLine, PRectangle rc,
const int state = model.pdoc->GetLineState(lineDoc);
sprintf(number, "%0X", state);
}
+ sNumber = number;
}
PRectangle rcNumber = rcMarker;
// Right justify
- const XYPOSITION width = surface->WidthText(fontLineNumber, number, static_cast<int>(strlen(number)));
+ const XYPOSITION width = surface->WidthText(fontLineNumber, sNumber.c_str(), static_cast<int>(sNumber.length()));
const XYPOSITION xpos = rcNumber.right - width - vs.marginNumberPadding;
rcNumber.left = xpos;
DrawTextNoClipPhase(surface, rcNumber, vs.styles[STYLE_LINENUMBER],
- rcNumber.top + vs.maxAscent, number, static_cast<int>(strlen(number)), drawAll);
+ rcNumber.top + vs.maxAscent, sNumber.c_str(), static_cast<int>(sNumber.length()), drawAll);
} else if (vs.wrapVisualFlags & SC_WRAPVISUALFLAG_MARGIN) {
PRectangle rcWrapMarker = rcMarker;
rcWrapMarker.right -= wrapMarkerPaddingRight;
diff --git a/src/Position.h b/src/Position.h
index a8fbfb494..e0bbcb53f 100644
--- a/src/Position.h
+++ b/src/Position.h
@@ -16,8 +16,8 @@
namespace Sci {
-typedef int Position;
-typedef int Line;
+typedef ptrdiff_t Position;
+typedef ptrdiff_t Line;
const Position invalidPosition = -1;
diff --git a/src/RunStyles.cxx b/src/RunStyles.cxx
index 03692f673..f92da5047 100644
--- a/src/RunStyles.cxx
+++ b/src/RunStyles.cxx
@@ -306,3 +306,5 @@ void RunStyles<DISTANCE, STYLE>::Check() const {
template class Scintilla::RunStyles<int, int>;
template class Scintilla::RunStyles<int, char>;
+template class Scintilla::RunStyles<ptrdiff_t, int>;
+template class Scintilla::RunStyles<ptrdiff_t, char>;
diff --git a/test/unit/testCellBuffer.cxx b/test/unit/testCellBuffer.cxx
index f0192423c..cef88cb17 100644
--- a/test/unit/testCellBuffer.cxx
+++ b/test/unit/testCellBuffer.cxx
@@ -26,7 +26,7 @@ TEST_CASE("CellBuffer") {
const char sText[] = "Scintilla";
const Sci::Position sLength = static_cast<Sci::Position>(strlen(sText));
- CellBuffer cb(true);
+ CellBuffer cb(true, false);
SECTION("InsertOneLine") {
bool startSequence = false;
diff --git a/test/unit/testContractionState.cxx b/test/unit/testContractionState.cxx
index b0346dfc9..fcee90287 100644
--- a/test/unit/testContractionState.cxx
+++ b/test/unit/testContractionState.cxx
@@ -25,7 +25,7 @@ using namespace Scintilla;
TEST_CASE("ContractionState") {
- std::unique_ptr<IContractionState> pcs = ContractionStateCreate();
+ std::unique_ptr<IContractionState> pcs = ContractionStateCreate(false);
SECTION("IsEmptyInitially") {
REQUIRE(1 == pcs->LinesInDoc());
diff --git a/test/unit/testPartitioning.cxx b/test/unit/testPartitioning.cxx
index 69bbe7957..449253ef3 100644
--- a/test/unit/testPartitioning.cxx
+++ b/test/unit/testPartitioning.cxx
@@ -50,7 +50,7 @@ TEST_CASE("SplitVectorWithRangeAdd") {
TEST_CASE("Partitioning") {
- Partitioning<int> part(growSize);
+ Partitioning<Sci::Position> part(growSize);
SECTION("IsEmptyInitially") {
REQUIRE(1 == part.Partitions());