CharBuffer search fixed & Log/Util buffer changed:
- Char/ShiftBuffer: Fixed multi-char string search
- UtilCore: Always pass output buffer & remove own buffer for conversions
- UtilCore: Remove optional parameters to force passing of buffer
- LogCore: Add TempBuffer for output conversion (using UtilCore)
- ApplicationCore: Allow setting size of TempBuffer via config
- Optimize use of {}
This commit is contained in:
@@ -21,8 +21,7 @@
|
||||
CCharBuffer::CCharBuffer( int BufferSize ) : BufSize( BufferSize )
|
||||
{
|
||||
// Create Buffer
|
||||
if (BufSize)
|
||||
{
|
||||
if (BufSize) {
|
||||
// Create Buffer
|
||||
Buffer = (char *)malloc( BufSize+1 );
|
||||
memset( Buffer, 0, BufSize+1 );
|
||||
@@ -44,12 +43,10 @@ CCharBuffer::CCharBuffer( int BufferSize ) : BufSize( BufferSize )
|
||||
CCharBuffer::~CCharBuffer()
|
||||
{
|
||||
// Destroy Buffer
|
||||
if (Buffer) {
|
||||
if (Buffer)
|
||||
free( Buffer );
|
||||
}
|
||||
if (OutBuffer) {
|
||||
if (OutBuffer)
|
||||
free( OutBuffer );
|
||||
}
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
@@ -125,17 +122,14 @@ char CRollingBuffer::PeekChar( int Pos )
|
||||
char CharValue = 0;
|
||||
|
||||
// Validate buffer and Pos
|
||||
if (!BufSize || (Pos < 0) || (Pos > BufLen)) {
|
||||
if (!BufSize || (Pos < 0) || (Pos > BufLen))
|
||||
return 0;
|
||||
}
|
||||
|
||||
// Get char
|
||||
if (BufStart + Pos < BufSize) {
|
||||
if (BufStart + Pos < BufSize)
|
||||
CharValue = Buffer[ BufStart+Pos ];
|
||||
}
|
||||
else {
|
||||
else
|
||||
CharValue = Buffer[ BufStart+Pos-BufSize ];
|
||||
}
|
||||
|
||||
// Return char
|
||||
return CharValue;
|
||||
@@ -187,17 +181,15 @@ int CRollingBuffer::Peek( char ** Data, int PeekPos, int MaxLen )
|
||||
}
|
||||
|
||||
// Get buffer start position
|
||||
if (BufStart + StartPos < BufSize) {
|
||||
if (BufStart + StartPos < BufSize)
|
||||
StartPos = BufStart + PeekPos;
|
||||
}
|
||||
else {
|
||||
else
|
||||
StartPos = BufStart + PeekPos - BufSize;
|
||||
}
|
||||
|
||||
// Validate MaxLen
|
||||
if ((MaxLen == -1) || (MaxLen > BufSize)) {
|
||||
if ((MaxLen == -1) || (MaxLen > BufSize))
|
||||
MaxLen = BufSize;
|
||||
}
|
||||
|
||||
BytesReturned = (MaxLen > BufLen - PeekPos)? (BufLen - PeekPos) : MaxLen;
|
||||
|
||||
// Copy Data from Buffer
|
||||
@@ -232,17 +224,15 @@ int CRollingBuffer::PeekCopy( char ** Data, int PeekPos, int MaxLen )
|
||||
}
|
||||
|
||||
// Get start position
|
||||
if (BufStart + StartPos < BufSize) {
|
||||
if (BufStart + StartPos < BufSize)
|
||||
StartPos = BufStart + PeekPos;
|
||||
}
|
||||
else {
|
||||
else
|
||||
StartPos = BufStart + PeekPos - BufSize;
|
||||
}
|
||||
|
||||
// Validate MaxLen
|
||||
if ((MaxLen == -1) || (MaxLen > BufSize)) {
|
||||
if ((MaxLen == -1) || (MaxLen > BufSize))
|
||||
MaxLen = BufSize;
|
||||
}
|
||||
|
||||
BytesReturned = (MaxLen > BufLen - PeekPos)? (BufLen - PeekPos) : MaxLen;
|
||||
|
||||
// Allocate memory
|
||||
@@ -266,10 +256,11 @@ int CRollingBuffer::PeekCopy( char ** Data, int PeekPos, int MaxLen )
|
||||
// Look for first occurrence of character in buffer
|
||||
bool CRollingBuffer::FindStr( const char * SearchStr, int SearchLen, int &FoundPos, int StartPos )
|
||||
{
|
||||
const char * CheckPos = NULL;
|
||||
const char * CheckLimit = NULL;
|
||||
const char * MatchPos = NULL;
|
||||
const char * MatchLimit = NULL;
|
||||
const char * CheckChar = NULL; // Current position in haystack
|
||||
const char * CheckLimit = NULL; // Roll-over point in haystack
|
||||
const char * CheckStart = NULL; // Reference to where match starts in haystack
|
||||
const char * MatchChar = NULL; // Current match position in needle
|
||||
const char * MatchLimit = NULL; // End of needle
|
||||
|
||||
// Check if buffer exists
|
||||
if (!BufSize || !SearchStr || !SearchLen) {
|
||||
@@ -283,43 +274,45 @@ bool CRollingBuffer::FindStr( const char * SearchStr, int SearchLen, int &FoundP
|
||||
return false;
|
||||
}
|
||||
|
||||
// Get Search start point and limit
|
||||
CheckPos = (BufStart + StartPos < BufSize)? &Buffer[ BufStart+StartPos ] : &Buffer[ (BufStart+StartPos)-BufSize ];
|
||||
// Get Search start point and roll-over of haystack
|
||||
CheckChar = (BufStart + StartPos < BufSize)? &Buffer[ BufStart+StartPos ] : &Buffer[ (BufStart+StartPos)-BufSize ];
|
||||
CheckLimit = &Buffer[BufSize-1];
|
||||
|
||||
// Set Match start point and limit
|
||||
MatchPos = SearchStr;
|
||||
// Set Match start point and limit of needle
|
||||
MatchChar = SearchStr;
|
||||
MatchLimit = &SearchStr[SearchLen-1];
|
||||
|
||||
// Search for char
|
||||
// Search for needle in haystack
|
||||
FoundPos = StartPos;
|
||||
while (FoundPos < BufLen)
|
||||
{
|
||||
// Check if char match
|
||||
if (*CheckPos == *MatchPos) {
|
||||
if (MatchPos == MatchLimit) {
|
||||
// Full match found
|
||||
if (*CheckChar == *MatchChar) {
|
||||
if (MatchChar == MatchLimit) {
|
||||
// Whole needle found
|
||||
FoundPos -= SearchLen-1;
|
||||
return true;
|
||||
}
|
||||
else {
|
||||
// Next char to match
|
||||
MatchPos++;
|
||||
// More needle to find
|
||||
if (MatchChar == SearchStr)
|
||||
CheckStart = CheckChar; // Mark start of match
|
||||
MatchChar++; // Continue matching needle
|
||||
}
|
||||
}
|
||||
else if (MatchPos != SearchStr){
|
||||
// Reset match point
|
||||
FoundPos -= MatchPos - SearchStr;
|
||||
MatchPos = SearchStr;
|
||||
else if (MatchChar != SearchStr){
|
||||
// Only partial needle found - reset match search
|
||||
FoundPos -= MatchChar - SearchStr;
|
||||
CheckChar = CheckStart;
|
||||
MatchChar = SearchStr;
|
||||
}
|
||||
|
||||
// Next char
|
||||
FoundPos++;
|
||||
if (CheckPos == CheckLimit) {
|
||||
CheckPos = Buffer; // Roll-over, Start at beginning of buffer
|
||||
} else {
|
||||
CheckPos++;
|
||||
}
|
||||
if (CheckChar == CheckLimit)
|
||||
CheckChar = Buffer; // Roll-over, Start at beginning of haystack
|
||||
else
|
||||
CheckChar++;
|
||||
}
|
||||
|
||||
// Not Found
|
||||
@@ -334,19 +327,17 @@ int CRollingBuffer::Clear( int ClearLen )
|
||||
int BytesCleared;
|
||||
|
||||
// Validate ClearLen
|
||||
if (ClearLen == -1) {
|
||||
if (ClearLen == -1)
|
||||
BytesCleared = BufLen;
|
||||
}
|
||||
else {
|
||||
else
|
||||
BytesCleared = (ClearLen > BufLen)? BufLen : ClearLen;
|
||||
}
|
||||
|
||||
// Update Buffer pointers
|
||||
if (BufStart + BytesCleared < BufSize) {
|
||||
if (BufStart + BytesCleared < BufSize)
|
||||
BufStart += BytesCleared;
|
||||
} else {
|
||||
else
|
||||
BufStart = (BytesCleared-(BufSize-BufStart)); // Copy roll-over from start of buffer
|
||||
}
|
||||
|
||||
BufLen -= BytesCleared;
|
||||
|
||||
return BytesCleared;
|
||||
@@ -364,19 +355,16 @@ int CRollingBuffer::Push( bool Overwrite, const char * Data, int Len )
|
||||
int DataRemain;
|
||||
|
||||
// Validate Buffer and Len
|
||||
if (!BufSize || !Data || !Len) {
|
||||
if (!BufSize || !Data || !Len)
|
||||
return 0;
|
||||
}
|
||||
else if (Len == -1) {
|
||||
else if (Len == -1)
|
||||
Len = strlen( Data );
|
||||
}
|
||||
|
||||
// Prevent overwrite
|
||||
DataRemain = (!Overwrite && (Len > BufSize-BufLen))? BufSize-BufLen : Len;
|
||||
|
||||
// Read Data into buffer
|
||||
while (DataRemain)
|
||||
{
|
||||
while (DataRemain) {
|
||||
// Read from file descriptor
|
||||
BufRemain = BufSize - BufEnd;
|
||||
BytesPushed = ((BufRemain > DataRemain)? DataRemain : BufRemain);
|
||||
@@ -414,16 +402,14 @@ int CRollingBuffer::ReadFromFD( int Handle, int MaxRead, bool Overwrite )
|
||||
bool Error = false;
|
||||
|
||||
// Check if buffer created
|
||||
if (!BufSize) {
|
||||
if (!BufSize)
|
||||
return 0;
|
||||
}
|
||||
|
||||
// Read file descriptor into buffer
|
||||
if (MaxRead == -1)
|
||||
MaxRead = BufSize;
|
||||
DataRemain = ((!Overwrite && (MaxRead > BufSize-BufLen)))? BufSize-BufLen : MaxRead;
|
||||
while (DataRemain)
|
||||
{
|
||||
while (DataRemain) {
|
||||
// Read from file descriptor
|
||||
BufRemain = BufSize - BufEnd;
|
||||
BytesRead = read( Handle, &Buffer[BufEnd], ((BufRemain > DataRemain)? DataRemain : BufRemain) );
|
||||
@@ -448,9 +434,8 @@ int CRollingBuffer::ReadFromFD( int Handle, int MaxRead, bool Overwrite )
|
||||
BufStart = BufEnd;
|
||||
}
|
||||
|
||||
if (DataRemain) {
|
||||
if (DataRemain)
|
||||
usleep( 500 );
|
||||
}
|
||||
}
|
||||
return (Error)? -TotalRead : TotalRead; // Report negative total on error
|
||||
}
|
||||
@@ -467,13 +452,11 @@ int CRollingBuffer::WriteToFD( int Handle, int MaxLen )
|
||||
bool Error = false;
|
||||
|
||||
// Check if buffer created
|
||||
if (!BufSize) {
|
||||
if (!BufSize)
|
||||
return 0;
|
||||
}
|
||||
|
||||
// Read Data into buffer
|
||||
while (DataRemain)
|
||||
{
|
||||
while (DataRemain) {
|
||||
// Read from file descriptor
|
||||
BufRemain = BufSize - ReadPos;
|
||||
BytesWritten = write( Handle, &Buffer[ReadPos], ((BufRemain > DataRemain)? DataRemain : BufRemain) );
|
||||
@@ -489,13 +472,11 @@ int CRollingBuffer::WriteToFD( int Handle, int MaxLen )
|
||||
|
||||
// Update Buffer Pointers
|
||||
ReadPos += BytesWritten;
|
||||
if (ReadPos >= BufSize) {
|
||||
if (ReadPos >= BufSize)
|
||||
ReadPos = 0; // Rolling over end of buffer, start at beginning
|
||||
}
|
||||
|
||||
if (DataRemain) {
|
||||
if (DataRemain)
|
||||
usleep( 500 );
|
||||
}
|
||||
}
|
||||
|
||||
return (Error)? -TotalWritten : TotalWritten; // Report negative total on error
|
||||
@@ -515,9 +496,8 @@ CShiftBuffer::CShiftBuffer( int BufferSize ) :
|
||||
char CShiftBuffer::PeekChar( int Pos )
|
||||
{
|
||||
// Validate buffer and Pos
|
||||
if (!BufSize || (Pos < 0) || (Pos > BufLen)) {
|
||||
if (!BufSize || (Pos < 0) || (Pos > BufLen))
|
||||
return 0;
|
||||
}
|
||||
|
||||
// Return char
|
||||
return Buffer[Pos];
|
||||
@@ -552,9 +532,9 @@ int CShiftBuffer::Peek( char ** Data, int PeekPos, int MaxLen )
|
||||
}
|
||||
|
||||
// Calculate bytes to return
|
||||
if ((MaxLen == -1) || (MaxLen > BufSize)) {
|
||||
if ((MaxLen == -1) || (MaxLen > BufSize))
|
||||
MaxLen = BufSize;
|
||||
}
|
||||
|
||||
BytesReturned = (MaxLen > BufLen - PeekPos)? (BufLen - PeekPos) : MaxLen;
|
||||
|
||||
// Copy Data from Buffer
|
||||
@@ -581,9 +561,9 @@ int CShiftBuffer::PeekCopy( char ** Data, int PeekPos, int MaxLen )
|
||||
}
|
||||
|
||||
// Calculate bytes to return
|
||||
if ((MaxLen == -1) || (MaxLen > BufSize)) {
|
||||
if ((MaxLen == -1) || (MaxLen > BufSize))
|
||||
MaxLen = BufSize;
|
||||
}
|
||||
|
||||
BytesReturned = (MaxLen > BufLen - PeekPos)? (BufLen - PeekPos) : MaxLen;
|
||||
|
||||
// Allocate memory
|
||||
@@ -601,10 +581,11 @@ int CShiftBuffer::PeekCopy( char ** Data, int PeekPos, int MaxLen )
|
||||
// Look for first occurrence of character in buffer
|
||||
bool CShiftBuffer::FindStr( const char * SearchStr, int SearchLen, int &FoundPos, int StartPos )
|
||||
{
|
||||
char * CheckPos = NULL;
|
||||
char * CheckLimit = NULL;
|
||||
char * MatchPos = NULL;
|
||||
char * MatchLimit = NULL;
|
||||
const char * CheckChar = NULL; // Current position in haystack
|
||||
const char * CheckLimit = NULL; // End of haystack
|
||||
const char * CheckStart = NULL; // Reference to where match starts in haystack
|
||||
const char * MatchChar = NULL; // Current match position in needle
|
||||
const char * MatchLimit = NULL; // End of needle
|
||||
|
||||
// Check if buffer exists
|
||||
if (!BufSize || !SearchStr || !SearchLen) {
|
||||
@@ -618,42 +599,44 @@ bool CShiftBuffer::FindStr( const char * SearchStr, int SearchLen, int &FoundPos
|
||||
return false;
|
||||
}
|
||||
|
||||
// Get Search start point and limit
|
||||
CheckPos = &Buffer[StartPos];
|
||||
// Get Search start point and end of haystack
|
||||
CheckChar = &Buffer[StartPos];
|
||||
CheckLimit = &Buffer[BufLen-1];
|
||||
|
||||
// Set Match start point and limit
|
||||
MatchPos = (char*)SearchStr;
|
||||
// Set Match start point and limit of needle
|
||||
MatchChar = (char*)SearchStr;
|
||||
MatchLimit = (char*)&SearchStr[SearchLen-1];
|
||||
|
||||
// Search for char
|
||||
FoundPos = StartPos;
|
||||
while (FoundPos < BufLen)
|
||||
{
|
||||
while (FoundPos < BufLen) {
|
||||
// Check if char match
|
||||
if (*CheckPos == *MatchPos) {
|
||||
if (MatchPos == MatchLimit) {
|
||||
// Full match found
|
||||
if (*CheckChar == *MatchChar) {
|
||||
if (MatchChar == MatchLimit) {
|
||||
// Whole needle found
|
||||
FoundPos -= SearchLen-1;
|
||||
return true;
|
||||
}
|
||||
else {
|
||||
// Next char to match
|
||||
MatchPos++;
|
||||
// More needle to find
|
||||
if (MatchChar == SearchStr)
|
||||
CheckStart = CheckChar; // Mark start of match
|
||||
MatchChar++; // Continue matching needle
|
||||
}
|
||||
}
|
||||
else {
|
||||
// Reset match point
|
||||
MatchPos = (char*)SearchStr;
|
||||
else if (MatchChar != SearchStr){
|
||||
// Only partial needle found - reset match search
|
||||
FoundPos -= MatchChar - SearchStr;
|
||||
CheckChar = CheckStart;
|
||||
MatchChar = SearchStr;
|
||||
}
|
||||
|
||||
// Next char
|
||||
FoundPos++;
|
||||
if (CheckPos == CheckLimit) {
|
||||
if (CheckChar == CheckLimit) // End of haystack reached
|
||||
break;
|
||||
} else {
|
||||
CheckPos++;
|
||||
}
|
||||
else
|
||||
CheckChar++;
|
||||
}
|
||||
|
||||
// Not Found
|
||||
@@ -668,8 +651,7 @@ int CShiftBuffer::Clear( int ClearLen )
|
||||
int BytesCleared;
|
||||
|
||||
// Validate ClearLen
|
||||
if ((ClearLen == -1) || (ClearLen >= BufLen))
|
||||
{
|
||||
if ((ClearLen == -1) || (ClearLen >= BufLen)) {
|
||||
// Clear all data
|
||||
BufLen = 0;
|
||||
Buffer[0] = 0;
|
||||
@@ -695,17 +677,14 @@ int CShiftBuffer::Push( bool Overwrite, const char * Data, int Len )
|
||||
int BufRemain = 0;
|
||||
|
||||
// Validate Buffer and Len
|
||||
if (!BufSize || !Data || !Len) {
|
||||
if (!BufSize || !Data || !Len)
|
||||
return 0;
|
||||
}
|
||||
else if (Len == -1) {
|
||||
else if (Len == -1)
|
||||
Len = strlen( Data );
|
||||
}
|
||||
|
||||
// Copy Data to buffer
|
||||
BufRemain = BufSize - BufLen;
|
||||
if (Overwrite && (Len > BufRemain))
|
||||
{
|
||||
if (Overwrite && (Len > BufRemain)) {
|
||||
if (Len < BufSize) {
|
||||
memcpy( Buffer, &Buffer[Len-BufRemain], BufLen-(Len-BufRemain) ); // Shift remaining old data left
|
||||
memcpy( &Buffer[BufSize-Len], Data, Len ); // Copy new data
|
||||
@@ -720,8 +699,7 @@ int CShiftBuffer::Push( bool Overwrite, const char * Data, int Len )
|
||||
BufLen = BufSize;
|
||||
Buffer[BufLen] = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
else {
|
||||
// Copy first portion of new data to buffer
|
||||
BytesPushed = (Len > BufRemain)? BufRemain : Len;
|
||||
memcpy( &Buffer[BufLen], Data, BytesPushed );
|
||||
@@ -744,16 +722,14 @@ int CShiftBuffer::ReadFromFD( int Handle, int MaxRead, bool Overwrite )
|
||||
bool Error = false;
|
||||
|
||||
// Check if buffer created
|
||||
if (!BufSize) {
|
||||
if (!BufSize)
|
||||
return 0;
|
||||
}
|
||||
|
||||
// Read file descriptor into buffer
|
||||
if (MaxRead == -1)
|
||||
MaxRead = BufSize;
|
||||
DataRemain = ((!Overwrite && (MaxRead > BufSize-BufLen)))? BufSize-BufLen : MaxRead;
|
||||
while (DataRemain)
|
||||
{
|
||||
while (DataRemain) {
|
||||
// Read from file descriptor
|
||||
BytesRead = read( Handle, &Buffer[BufLen], DataRemain );
|
||||
if (BytesRead <= 0) {
|
||||
@@ -770,9 +746,8 @@ int CShiftBuffer::ReadFromFD( int Handle, int MaxRead, bool Overwrite )
|
||||
// Zero terminate
|
||||
Buffer[BufLen] = 0;
|
||||
|
||||
if (DataRemain) {
|
||||
if (DataRemain)
|
||||
usleep( 500 );
|
||||
}
|
||||
}
|
||||
return (Error)? -TotalRead : TotalRead; // Report negative total on error
|
||||
}
|
||||
@@ -789,13 +764,11 @@ int CShiftBuffer::WriteToFD( int Handle, int MaxLen )
|
||||
bool Error = false;
|
||||
|
||||
// Check if buffer created
|
||||
if (!BufSize) {
|
||||
if (!BufSize)
|
||||
return 0;
|
||||
}
|
||||
|
||||
// Read Data into buffer
|
||||
while (DataRemain)
|
||||
{
|
||||
while (DataRemain) {
|
||||
// Read from file descriptor
|
||||
BufRemain = BufSize - ReadPos;
|
||||
BytesWritten = write( Handle, &Buffer[ReadPos], ((BufRemain > DataRemain)? DataRemain : BufRemain) );
|
||||
@@ -811,13 +784,11 @@ int CShiftBuffer::WriteToFD( int Handle, int MaxLen )
|
||||
|
||||
// Update Buffer Pointers
|
||||
ReadPos += BytesWritten;
|
||||
if (ReadPos >= BufSize) {
|
||||
if (ReadPos >= BufSize)
|
||||
ReadPos = 0; // Rolling over end of buffer, start at beginning
|
||||
}
|
||||
|
||||
if (DataRemain) {
|
||||
if (DataRemain)
|
||||
usleep( 500 );
|
||||
}
|
||||
}
|
||||
|
||||
return (Error)? -TotalWritten : TotalWritten; // Report negative total on error
|
||||
|
||||
Reference in New Issue
Block a user