From 2272ecea2647f43104a26bdc03bdd0ae48515d84 Mon Sep 17 00:00:00 2001 From: Michael Lotz Date: Thu, 15 Apr 2010 17:22:16 +0000 Subject: [PATCH] zooey+mmlr: * Ensure that there is still buffer left when 0-terminating the buffer in RealText(). * Remove the fExtraCount member and instead make it into a constant as that's how it's used and more obvious. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@36306 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- .../textview_support/TextGapBuffer.cpp | 23 +++++++++++-------- .../textview_support/TextGapBuffer.h | 1 - 2 files changed, 14 insertions(+), 10 deletions(-) diff --git a/src/kits/interface/textview_support/TextGapBuffer.cpp b/src/kits/interface/textview_support/TextGapBuffer.cpp index 683cb90ba7..bbf6cfaa60 100644 --- a/src/kits/interface/textview_support/TextGapBuffer.cpp +++ b/src/kits/interface/textview_support/TextGapBuffer.cpp @@ -20,18 +20,20 @@ namespace BPrivate { +static const int32 kTextGapBufferBlockSize = 2048; + + TextGapBuffer::TextGapBuffer() - : fExtraCount(2048), - fItemCount(0), + : fItemCount(0), fBuffer(NULL), - fBufferCount(fExtraCount + fItemCount), + fBufferCount(kTextGapBufferBlockSize + fItemCount), fGapIndex(fItemCount), fGapCount(fBufferCount - fGapIndex), fScratchBuffer(NULL), fScratchSize(0), fPasswordMode(false) { - fBuffer = (char *)malloc(fExtraCount + fItemCount); + fBuffer = (char *)malloc(kTextGapBufferBlockSize + fItemCount); fScratchBuffer = NULL; } @@ -56,7 +58,7 @@ TextGapBuffer::InsertText(const char *inText, int32 inNumItems, int32 inAtIndex) MoveGapTo(inAtIndex); if (fGapCount < inNumItems) - SizeGapTo(inNumItems + fExtraCount); + SizeGapTo(inNumItems + kTextGapBufferBlockSize); memcpy(fBuffer + fGapIndex, inText, inNumItems); @@ -91,7 +93,7 @@ TextGapBuffer::InsertText(BFile *file, int32 fileOffset, int32 inNumItems, int32 MoveGapTo(inAtIndex); if (fGapCount < inNumItems) - SizeGapTo(inNumItems + fExtraCount); + SizeGapTo(inNumItems + kTextGapBufferBlockSize); // Finally, read the data and put it into the buffer if (file->ReadAt(fileOffset, fBuffer + fGapIndex, inNumItems) > 0) { @@ -119,8 +121,8 @@ TextGapBuffer::RemoveRange(int32 start, int32 end) fGapCount += inNumItems; fItemCount -= inNumItems; - if (fGapCount > fExtraCount) - SizeGapTo(fExtraCount); + if (fGapCount > kTextGapBufferBlockSize) + SizeGapTo(kTextGapBufferBlockSize); } @@ -278,8 +280,11 @@ const char * TextGapBuffer::RealText() { MoveGapTo(fItemCount); - fBuffer[fItemCount] = '\0'; + if (fGapCount == 0) + SizeGapTo(kTextGapBufferBlockSize); + + fBuffer[fItemCount] = '\0'; return fBuffer; } diff --git a/src/kits/interface/textview_support/TextGapBuffer.h b/src/kits/interface/textview_support/TextGapBuffer.h index 38f575c534..406d273516 100644 --- a/src/kits/interface/textview_support/TextGapBuffer.h +++ b/src/kits/interface/textview_support/TextGapBuffer.h @@ -48,7 +48,6 @@ virtual ~TextGapBuffer(); // void Resize(int32 size); protected: - int32 fExtraCount; // when realloc()-ing int32 fItemCount; // logical count char * fBuffer; // allocated memory int32 fBufferCount; // physical count