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:
2021-10-14 09:19:55 -05:00
parent 474289beab
commit 9830f687ad
7 changed files with 196 additions and 260 deletions

View File

@@ -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