From 924a6fc31c118e722d4b1eba494c1675d0b2810c Mon Sep 17 00:00:00 2001 From: nyamatongwe Date: Wed, 6 Sep 2000 04:39:54 +0000 Subject: Fix from Tahir Karaca for LineVector::MergeMarkers. --- doc/ScintillaDownload.html | 2 +- src/CellBuffer.cxx | 123 ++++++++++++++++++++++++--------------------- 2 files changed, 66 insertions(+), 59 deletions(-) diff --git a/doc/ScintillaDownload.html b/doc/ScintillaDownload.html index cb75aa86e..dbb985d5f 100644 --- a/doc/ScintillaDownload.html +++ b/doc/ScintillaDownload.html @@ -46,7 +46,7 @@ The source code package contains all of the source code for Scintilla but no binary executable code and is available in Instructions for building on both Windows and Linux are included in the readme file. diff --git a/src/CellBuffer.cxx b/src/CellBuffer.cxx index 68bcde2ed..befec75fc 100644 --- a/src/CellBuffer.cxx +++ b/src/CellBuffer.cxx @@ -88,7 +88,7 @@ void MarkerHandleSet::RemoveHandle(int handle) { if (mhn->handle == handle) { *pmhn = mhn->next; delete mhn; - return; + return ; } pmhn = &((*pmhn)->next); } @@ -101,7 +101,7 @@ void MarkerHandleSet::RemoveNumber(int markerNum) { if (mhn->number == markerNum) { *pmhn = mhn->next; delete mhn; - return; + return ; } pmhn = &((*pmhn)->next); } @@ -119,9 +119,9 @@ void MarkerHandleSet::CombineWith(MarkerHandleSet *other) { LineVector::LineVector() { linesData = 0; lines = 0; - size = 0; + size = 0; levels = 0; - sizeLevels = 0; + sizeLevels = 0; handleCurrent = 1; Init(); @@ -165,6 +165,7 @@ void LineVector::Expand(int sizeNew) { Platform::DebugPrintf("No memory available\n"); // TODO: Blow up } + } void LineVector::ExpandLevels(int sizeNew) { @@ -184,12 +185,13 @@ void LineVector::ExpandLevels(int sizeNew) { Platform::DebugPrintf("No memory available\n"); // TODO: Blow up } + } void LineVector::ClearLevels() { delete []levels; levels = 0; - sizeLevels = 0; + sizeLevels = 0; } void LineVector::InsertValue(int pos, int value) { @@ -212,10 +214,10 @@ void LineVector::InsertValue(int pos, int value) { } if (pos == 0) { levels[pos] = SC_FOLDLEVELBASE; - } else if (pos == (lines-1)) { // Last line will not be a folder + } else if (pos == (lines - 1)) { // Last line will not be a folder levels[pos] = SC_FOLDLEVELBASE; } else { - levels[pos] = levels[pos-1]; + levels[pos] = levels[pos - 1]; } } } @@ -244,10 +246,10 @@ void LineVector::Remove(int pos) { linesData[i] = linesData[i + 1]; } if (levels) { - // Level information merges back onto previous line - int posAbove = pos-1; - if (posAbove < 0) - posAbove = 0; + // Level information merges back onto previous line + int posAbove = pos - 1; + if (posAbove < 0) + posAbove = 0; for (int j = posAbove; j < lines; j++) { levels[j] = levels[j + 1]; } @@ -290,11 +292,12 @@ int LineVector::AddMark(int line, int markerNum) { } void LineVector::MergeMarkers(int pos) { - if (linesData[pos].handleSet || linesData[pos + 1].handleSet) { - if (linesData[pos].handleSet && linesData[pos + 1].handleSet) { - linesData[pos].handleSet->CombineWith(linesData[pos].handleSet); - linesData[pos].handleSet = 0; - } + if (linesData[pos + 1].handleSet != NULL) { + if (linesData[pos].handleSet == NULL ) + linesData[pos].handleSet = new MarkerHandleSet; + linesData[pos].handleSet->CombineWith(linesData[pos + 1].handleSet); + delete linesData[pos + 1].handleSet; + linesData[pos + 1].handleSet = NULL; } } @@ -368,7 +371,7 @@ void Action::Grab(Action *source) { data = source->data; lenData = source->lenData; mayCoalesce = source->mayCoalesce; - + // Ownership of source data transferred to this source->position = 0; source->at = startAction; @@ -377,21 +380,21 @@ void Action::Grab(Action *source) { source->mayCoalesce = true; } -// The undo history stores a sequence of user operations that represent the user's view of the -// commands executed on the text. +// The undo history stores a sequence of user operations that represent the user's view of the +// commands executed on the text. // Each user operation contains a sequence of text insertion and text deletion actions. // All the user operations are stored in a list of individual actions with 'start' actions used // as delimiters between user operations. -// Initially there is one start action in the history. -// As each action is performed, it is recorded in the history. The action may either become +// Initially there is one start action in the history. +// As each action is performed, it is recorded in the history. The action may either become // part of the current user operation or may start a new user operation. If it is to be part of the -// current operation, then it overwrites the current last action. If it is to be part of a new +// current operation, then it overwrites the current last action. If it is to be part of a new // operation, it is appended after the current last action. // After writing the new action, a new start action is appended at the end of the history. -// The decision of whether to start a new user operation is based upon two factors. If a +// The decision of whether to start a new user operation is based upon two factors. If a // compound operation has been explicitly started by calling BeginUndoAction and no matching -// EndUndoAction (these calls nest) has been called, then the action is coalesced into the current -// operation. If there is no outstanding BeginUndoAction call then a new operation is started +// EndUndoAction (these calls nest) has been called, then the action is coalesced into the current +// operation. If there is no outstanding BeginUndoAction call then a new operation is started // unless it looks as if the new action is caused by the user typing or deleting a stream of text. // Sequences that look like typing or deletion are coalesced into a single user operation. @@ -422,7 +425,7 @@ void UndoHistory::EnsureUndoRoom() { int lenActionsNew = lenActions * 2; Action *actionsNew = new Action[lenActionsNew]; if (!actionsNew) - return; + return ; for (int act = 0; act <= currentAction; act++) actionsNew[act].Grab(&actions[act]); delete []actions; @@ -435,11 +438,11 @@ void UndoHistory::EnsureUndoRoom() { void UndoHistory::AppendAction(actionType at, int position, char *data, int lengthData) { EnsureUndoRoom(); //Platform::DebugPrintf("%% %d action %d %d %d\n", at, position, lengthData, currentAction); - //Platform::DebugPrintf("^ %d action %d %d\n", actions[currentAction - 1].at, + //Platform::DebugPrintf("^ %d action %d %d\n", actions[currentAction - 1].at, // actions[currentAction - 1].position, actions[currentAction - 1].lenData); if (currentAction >= 1) { if (0 == undoSequenceDepth) { - // Top level actions may not always be coalesced + // Top level actions may not always be coalesced Action &actPrevious = actions[currentAction - 1]; // See if current action can be coalesced into previous action // Will work if both are inserts or deletes and position is same @@ -447,22 +450,23 @@ void UndoHistory::AppendAction(actionType at, int position, char *data, int leng currentAction++; } else if (currentAction == savePoint) { currentAction++; - } else if ((at == removeAction) && - ((position + lengthData * 2) != actPrevious.position)) { + } else if ((at == removeAction) && + ((position + lengthData * 2) != actPrevious.position)) { // Removals must be at same position to coalesce currentAction++; - } else if ((at == insertAction) && - (position != (actPrevious.position + actPrevious.lenData*2))) { + } else if ((at == insertAction) && + (position != (actPrevious.position + actPrevious.lenData*2))) { // Insertions must be immediately after to coalesce currentAction++; } else { //Platform::DebugPrintf("action coalesced\n"); } + } else { // Actions not at top level are always coalesced unless this is after return to top level if (!actions[currentAction].mayCoalesce) currentAction++; - } + } } else { currentAction++; } @@ -497,7 +501,7 @@ void UndoHistory::EndUndoAction() { actions[currentAction].mayCoalesce = false; } } - + void UndoHistory::DropUndoSequence() { undoSequenceDepth = 0; } @@ -527,9 +531,9 @@ int UndoHistory::StartUndo() { // Drop any trailing startAction if (actions[currentAction].at == startAction && currentAction > 0) currentAction--; - + // Count the steps in this action - int act = currentAction; + int act = currentAction; while (actions[act].at != startAction && act > 0) { act--; } @@ -552,9 +556,9 @@ int UndoHistory::StartRedo() { // Drop any leading startAction if (actions[currentAction].at == startAction && currentAction < maxAction) currentAction++; - + // Count the steps in this action - int act = currentAction; + int act = currentAction; while (actions[act].at != startAction && act < maxAction) { act++; } @@ -573,7 +577,7 @@ CellBuffer::CellBuffer(int initialLength) { body = new char[initialLength]; size = initialLength; length = 0; - part1len = 0; + part1len = 0; gaplen = initialLength; part2body = body + gaplen; readOnly = false; @@ -587,7 +591,7 @@ CellBuffer::~CellBuffer() { void CellBuffer::GapTo(int position) { if (position == part1len) - return; + return ; if (position < part1len) { int diff = part1len - position; //Platform::DebugPrintf("Move gap backwards to %d diff = %d part1len=%d length=%d \n", position,diff, part1len, length); @@ -619,6 +623,7 @@ void CellBuffer::RoomFor(int insertionLength) { size = newSize; //Platform::DebugPrintf("end need room %d %d - size=%d length=%d\n", gaplen, insertionLength,size,length); } + } // To make it easier to write code that uses ByteAt, a position outside the range of the buffer @@ -643,16 +648,16 @@ void CellBuffer::SetByteAt(int position, char ch) { if (position < 0) { //Platform::DebugPrintf("Bad position %d\n",position); - return; + return ; } if (position >= length + 11) { Platform::DebugPrintf("Very Bad position %d of %d\n", position, length); //exit(2); - return; + return ; } if (position >= length) { //Platform::DebugPrintf("Bad position %d of %d\n",position,length); - return; + return ; } if (position < part1len) { @@ -668,20 +673,20 @@ char CellBuffer::CharAt(int position) { void CellBuffer::GetCharRange(char *buffer, int position, int lengthRetrieve) { if (lengthRetrieve < 0) - return; + return ; if (position < 0) - return; + return ; int bytePos = position * 2; if ((bytePos + lengthRetrieve * 2) > length) { - Platform::DebugPrintf("Bad GetCharRange %d for %d of %d\n",bytePos, - lengthRetrieve, length); - return; + Platform::DebugPrintf("Bad GetCharRange %d for %d of %d\n", bytePos, + lengthRetrieve, length); + return ; } GapTo(0); // Move the buffer so its easy to subscript into it char *pb = part2body + bytePos; while (lengthRetrieve--) { *buffer++ = *pb; - pb +=2; + pb += 2; } } @@ -716,7 +721,7 @@ void CellBuffer::InsertCharStyle(int position, char ch, char style) { } bool CellBuffer::SetStyleAt(int position, char style, char mask) { - char curVal = ByteAt(position*2 + 1); + char curVal = ByteAt(position * 2 + 1); if ((curVal & mask) != style) { SetByteAt(position*2 + 1, static_cast((curVal & ~mask) | style)); return true; @@ -833,7 +838,7 @@ int CellBuffer::LineFromHandle(int markerHandle) { void CellBuffer::BasicInsertString(int position, char *s, int insertLength) { //Platform::DebugPrintf("Inserting at %d for %d\n", position, insertLength); if (insertLength == 0) - return; + return ; RoomFor(insertLength); GapTo(position); @@ -893,7 +898,7 @@ void CellBuffer::BasicInsertString(int position, char *s, int insertLength) { void CellBuffer::BasicDeleteChars(int position, int deleteLength) { //Platform::DebugPrintf("Deleting at %d for %d\n", position, deleteLength); if (deleteLength == 0) - return; + return ; if ((position == 0) && (deleteLength == length)) { // If whole buffer is being deleted, faster to reinitialise lines data @@ -925,6 +930,7 @@ void CellBuffer::BasicDeleteChars(int position, int deleteLength) { ignoreNL = true; // First \n is not real deletion } + char ch = chNext; for (int i = 0; i < deleteLength; i += 2) { chNext = ' '; @@ -942,6 +948,7 @@ void CellBuffer::BasicDeleteChars(int position, int deleteLength) { ignoreNL = false; // Further \n are not real deletions } + ch = chNext; } // May have to fix up end if last deletion causes cr to be next to lf @@ -1004,12 +1011,12 @@ void CellBuffer::PerformUndoStep() { char *styledData = new char[actionStep.lenData * 2]; for (int i = 0; i < actionStep.lenData; i++) { styledData[i*2] = actionStep.data[i]; - styledData[i*2+1] = 0; + styledData[i*2 + 1] = 0; } BasicInsertString(actionStep.position, styledData, actionStep.lenData*2); delete []styledData; } - uh.CompletedUndoStep(); + uh.CompletedUndoStep(); } bool CellBuffer::CanRedo() { @@ -1030,14 +1037,14 @@ void CellBuffer::PerformRedoStep() { char *styledData = new char[actionStep.lenData * 2]; for (int i = 0; i < actionStep.lenData; i++) { styledData[i*2] = actionStep.data[i]; - styledData[i*2+1] = 0; + styledData[i*2 + 1] = 0; } BasicInsertString(actionStep.position, styledData, actionStep.lenData*2); delete []styledData; } else if (actionStep.at == removeAction) { BasicDeleteChars(actionStep.position, actionStep.lenData*2); } - uh.CompletedRedoStep(); + uh.CompletedRedoStep(); } int CellBuffer::SetLineState(int line, int state) { @@ -1053,7 +1060,7 @@ int CellBuffer::GetLineState(int line) { int CellBuffer::GetMaxLineState() { return lineStates.Length(); } - + int CellBuffer::SetLevel(int line, int level) { int prev = 0; if ((line >= 0) && (line < lv.lines)) { @@ -1077,5 +1084,5 @@ int CellBuffer::GetLevel(int line) { } void CellBuffer::ClearLevels() { - lv.ClearLevels(); + lv.ClearLevels(); } -- cgit v1.2.3