Major update:
- General bug fixes - Implement search for multi-character marker search in BufferCore Replaced FindChar() method with FindStr() method - Implemented LocalIO and LinkedIO in FunctionCore - Connect LocalIO with FD in SelectableCore - Implement Write buffer with Write Select in SelectableCore - Improve validation checks in SelectableCore - Use Handle ptr instead of Handle Names for Config methods
This commit is contained in:
@@ -243,7 +243,7 @@ int CBuffer::ReadFromFD( int Handle, int MaxRead )
|
||||
// Read from file descriptor
|
||||
BufRemain = BufSize - BufEnd;
|
||||
BytesRead = read( Handle, &Buffer[BufEnd], ((BufRemain > DataRemain)? DataRemain : BufRemain) );
|
||||
if (BytesRead < 0)
|
||||
if (BytesRead <= 0)
|
||||
break;
|
||||
|
||||
// Update Buffer Pointers
|
||||
@@ -283,7 +283,7 @@ int CBuffer::WriteToFD( int Handle, int MaxLen )
|
||||
// Read Data into buffer
|
||||
ReadPos = BufStart;
|
||||
DataRemain = (MaxLen == -1)? BufLen : MaxLen;
|
||||
while ((TotalWritten < MaxLen) && (BufLen > 0))
|
||||
while (DataRemain)
|
||||
{
|
||||
// Read from file descriptor
|
||||
BufRemain = BufSize - ReadPos;
|
||||
@@ -336,10 +336,12 @@ char CBuffer::PeekChar( int Pos, bool ClearChar )
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
// Look for first occurrence of character in buffer
|
||||
bool CBuffer::FindChar( char SearchChar, int &FoundPos, int StartPos )
|
||||
bool CBuffer::FindStr( const char * SearchStr, int SearchLen, int &FoundPos, int StartPos )
|
||||
{
|
||||
char * CheckPos;
|
||||
char * Limit;
|
||||
char * CheckPos = NULL;
|
||||
char * CheckLimit = NULL;
|
||||
char * MatchPos = NULL;
|
||||
char * MatchLimit = NULL;
|
||||
|
||||
// Check if buffer exists
|
||||
if (!BufLen) {
|
||||
@@ -353,24 +355,35 @@ bool CBuffer::FindChar( char SearchChar, int &FoundPos, int StartPos )
|
||||
return false;
|
||||
}
|
||||
|
||||
// Get Search start point
|
||||
if (BufStart + StartPos < BufSize) {
|
||||
CheckPos = &Buffer[ BufStart+StartPos ];
|
||||
} else {
|
||||
CheckPos = &Buffer[ (BufStart+StartPos)-BufSize ];
|
||||
}
|
||||
// Get Search start point and limit
|
||||
CheckPos = (BufStart + StartPos < BufSize)? &Buffer[ BufStart+StartPos ] : &Buffer[ (BufStart+StartPos)-BufSize ];
|
||||
CheckLimit = &Buffer[BufSize-1];
|
||||
|
||||
// Set Match start point and limit
|
||||
MatchPos = (char*)SearchStr;
|
||||
MatchLimit = (char*)&SearchStr[SearchLen-1];
|
||||
|
||||
// Search for char
|
||||
FoundPos = StartPos;
|
||||
Limit = &Buffer[BufSize-1];
|
||||
while (FoundPos < BufLen)
|
||||
{
|
||||
if (*CheckPos == SearchChar)
|
||||
return true;
|
||||
// Check if char match
|
||||
if (*CheckPos == *MatchPos) {
|
||||
if (MatchPos == MatchLimit)
|
||||
// Full match found
|
||||
return true;
|
||||
else
|
||||
// Next char to match
|
||||
MatchPos++;
|
||||
}
|
||||
else {
|
||||
// Reset match point
|
||||
MatchPos = (char*)SearchStr;
|
||||
}
|
||||
|
||||
// Next char
|
||||
FoundPos++;
|
||||
if (CheckPos == Limit) {
|
||||
if (CheckPos == CheckLimit) {
|
||||
CheckPos = Buffer; // Roll-over, Start at beginning of buffer
|
||||
} else {
|
||||
CheckPos++;
|
||||
|
||||
Reference in New Issue
Block a user