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
This commit is contained in:
Michael Lotz
2010-04-15 17:22:16 +00:00
parent 7af231d838
commit 2272ecea26
2 changed files with 14 additions and 10 deletions
@@ -20,18 +20,20 @@
namespace BPrivate { namespace BPrivate {
static const int32 kTextGapBufferBlockSize = 2048;
TextGapBuffer::TextGapBuffer() TextGapBuffer::TextGapBuffer()
: fExtraCount(2048), : fItemCount(0),
fItemCount(0),
fBuffer(NULL), fBuffer(NULL),
fBufferCount(fExtraCount + fItemCount), fBufferCount(kTextGapBufferBlockSize + fItemCount),
fGapIndex(fItemCount), fGapIndex(fItemCount),
fGapCount(fBufferCount - fGapIndex), fGapCount(fBufferCount - fGapIndex),
fScratchBuffer(NULL), fScratchBuffer(NULL),
fScratchSize(0), fScratchSize(0),
fPasswordMode(false) fPasswordMode(false)
{ {
fBuffer = (char *)malloc(fExtraCount + fItemCount); fBuffer = (char *)malloc(kTextGapBufferBlockSize + fItemCount);
fScratchBuffer = NULL; fScratchBuffer = NULL;
} }
@@ -56,7 +58,7 @@ TextGapBuffer::InsertText(const char *inText, int32 inNumItems, int32 inAtIndex)
MoveGapTo(inAtIndex); MoveGapTo(inAtIndex);
if (fGapCount < inNumItems) if (fGapCount < inNumItems)
SizeGapTo(inNumItems + fExtraCount); SizeGapTo(inNumItems + kTextGapBufferBlockSize);
memcpy(fBuffer + fGapIndex, inText, inNumItems); memcpy(fBuffer + fGapIndex, inText, inNumItems);
@@ -91,7 +93,7 @@ TextGapBuffer::InsertText(BFile *file, int32 fileOffset, int32 inNumItems, int32
MoveGapTo(inAtIndex); MoveGapTo(inAtIndex);
if (fGapCount < inNumItems) if (fGapCount < inNumItems)
SizeGapTo(inNumItems + fExtraCount); SizeGapTo(inNumItems + kTextGapBufferBlockSize);
// Finally, read the data and put it into the buffer // Finally, read the data and put it into the buffer
if (file->ReadAt(fileOffset, fBuffer + fGapIndex, inNumItems) > 0) { if (file->ReadAt(fileOffset, fBuffer + fGapIndex, inNumItems) > 0) {
@@ -119,8 +121,8 @@ TextGapBuffer::RemoveRange(int32 start, int32 end)
fGapCount += inNumItems; fGapCount += inNumItems;
fItemCount -= inNumItems; fItemCount -= inNumItems;
if (fGapCount > fExtraCount) if (fGapCount > kTextGapBufferBlockSize)
SizeGapTo(fExtraCount); SizeGapTo(kTextGapBufferBlockSize);
} }
@@ -278,8 +280,11 @@ const char *
TextGapBuffer::RealText() TextGapBuffer::RealText()
{ {
MoveGapTo(fItemCount); MoveGapTo(fItemCount);
fBuffer[fItemCount] = '\0';
if (fGapCount == 0)
SizeGapTo(kTextGapBufferBlockSize);
fBuffer[fItemCount] = '\0';
return fBuffer; return fBuffer;
} }
@@ -48,7 +48,6 @@ virtual ~TextGapBuffer();
// void Resize(int32 size); // void Resize(int32 size);
protected: protected:
int32 fExtraCount; // when realloc()-ing
int32 fItemCount; // logical count int32 fItemCount; // logical count
char * fBuffer; // allocated memory char * fBuffer; // allocated memory
int32 fBufferCount; // physical count int32 fBufferCount; // physical count