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:
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user