Important Update:

- Improve parameter checking before function execution
- Rename functions:
  Get->Peek, ReadFD->ReadFromFD, WriteFD->WriteToFD
- Add StartPos param to Peek() & FindChar()
- Add ClearChar param for GetChar()
- Add default values for Position and Lengths
  Get, Set, Clear, Push, Peek, GetChar, FindChar
This commit is contained in:
Charl Wentzel
2016-05-19 07:44:28 +02:00
parent c50766021a
commit 839c8a1432
3 changed files with 107 additions and 45 deletions

View File

@@ -48,11 +48,15 @@ CBuffer::~CBuffer()
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
// Over write existing buffer with new data // Over write existing buffer with new data
int CBuffer::Set( char * Data, int Len ) int CBuffer::Set( const char * Data, int Len )
{ {
// Validate data // Validate data
if (!Data || !Len) if (!Data || !Len) {
return 0; return 0;
}
else if (Len == -1) {
Len = strlen( Data );
}
if (Len <= BufSize) { if (Len <= BufSize) {
memcpy( Buffer, Data, Len ); memcpy( Buffer, Data, Len );
@@ -71,9 +75,10 @@ int CBuffer::Set( char * Data, int Len )
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
// Return "stitched" buffer data in temporary buffer // Return "stitched" buffer data in temporary buffer
int CBuffer::Get( char ** Data, int MaxLen ) int CBuffer::Peek( char ** Data, int PeekPos, int MaxLen )
{ {
int BytesReturned = 0; int BytesReturned = 0;
int StartPos = 0;
// Check if any data // Check if any data
if (!BufLen || !MaxLen) { if (!BufLen || !MaxLen) {
@@ -81,19 +86,31 @@ int CBuffer::Get( char ** Data, int MaxLen )
return 0; return 0;
} }
// Validate start position
if (PeekPos >= BufLen) {
*Data = NULL;
return 0;
}
else if (BufStart + StartPos < BufSize) {
StartPos = BufStart + PeekPos;
}
else {
StartPos = BufStart + PeekPos - BufSize;
}
// Validate MaxLen // Validate MaxLen
if ((MaxLen == -1) || (MaxLen > BufSize)) { if ((MaxLen == -1) || (MaxLen > BufSize)) {
MaxLen = BufSize; MaxLen = BufSize;
} }
BytesReturned = (MaxLen > BufLen)? BufLen : MaxLen; BytesReturned = (MaxLen > BufLen - PeekPos)? (BufLen - PeekPos) : MaxLen;
// Copy Data from Buffer // Copy Data from Buffer
if (BufStart + BytesReturned < BufSize) { if (StartPos + BytesReturned <= BufSize) {
memcpy( OutBuffer, &Buffer[BufStart], BytesReturned ); memcpy( OutBuffer, &Buffer[StartPos], BytesReturned );
} }
else { else {
memcpy( OutBuffer, &Buffer[BufStart], BufSize-BufStart ); // Copy from end of buffer memcpy( OutBuffer, &Buffer[StartPos], BufSize-StartPos ); // Copy from end of buffer
memcpy( &OutBuffer[BufSize-BufStart], Buffer, (BytesReturned-(BufSize-BufStart)) ); // Copy rollover from start of buffer memcpy( &OutBuffer[BufSize-StartPos], Buffer, (BytesReturned-(BufSize-StartPos)) ); // Copy rollover from start of buffer
} }
OutBuffer[BytesReturned] = 0; OutBuffer[BytesReturned] = 0;
@@ -108,7 +125,12 @@ int CBuffer::Clear( int ClearLen )
int BytesCleared; int BytesCleared;
// Validate ClearLen // Validate ClearLen
BytesCleared = (ClearLen > BufSize)? BufSize : ClearLen; if (ClearLen == -1) {
BytesCleared = BufLen;
}
else {
BytesCleared = (ClearLen > BufLen)? BufLen : ClearLen;
}
// Update Buffer pointers // Update Buffer pointers
if (BufStart + BytesCleared < BufSize) { if (BufStart + BytesCleared < BufSize) {
@@ -139,17 +161,20 @@ int CBuffer::Reset()
// Add bytes to end of buffer // Add bytes to end of buffer
// Return "stitched" buffer data in temporary buffer // Return "stitched" buffer data in temporary buffer
int CBuffer::Push( char * Data, int Len ) int CBuffer::Push( const char * Data, int Len )
{ {
int BytesPushed = 0; int BytesPushed = 0;
int TotalPushed = 0; int TotalPushed = 0;
int BufRemain = 0; int BufRemain = 0;
int DataRemain = Len; int DataRemain = Len;
// Check if buffer created // Validate Buffer and Len
if (!BufSize) { if (!BufSize || !Len) {
return 0; return 0;
} }
else if (Len == -1) {
Len = strlen( Data );
}
// Read Data into buffer // Read Data into buffer
while (TotalPushed < Len) while (TotalPushed < Len)
@@ -188,7 +213,7 @@ int CBuffer::Pop( char ** Data, int MaxLen )
int BytesWritten = 0; int BytesWritten = 0;
// Read data // Read data
BytesWritten = Get( Data, MaxLen ); BytesWritten = Peek( Data, MaxLen );
// Clear bytes // Clear bytes
Clear( BytesWritten ); Clear( BytesWritten );
@@ -199,7 +224,7 @@ int CBuffer::Pop( char ** Data, int MaxLen )
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
// Read File descriptor directly into rolling buffer // Read File descriptor directly into rolling buffer
int CBuffer::ReadFD( int Handle, int MaxRead ) int CBuffer::ReadFromFD( int Handle, int MaxRead )
{ {
int BytesRead = 0; int BytesRead = 0;
int TotalRead = 0; int TotalRead = 0;
@@ -242,12 +267,13 @@ int CBuffer::ReadFD( int Handle, int MaxRead )
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
// Write given number of bytes directly from buffer to File descriptor // Write given number of bytes directly from buffer to File descriptor
int CBuffer::WriteFD( int Handle, int MaxLen ) int CBuffer::WriteToFD( int Handle, int MaxLen )
{ {
int BytesWritten = 0; int BytesWritten = 0;
int TotalWritten = 0; int TotalWritten = 0;
int BufRemain = 0; int BufRemain = 0;
int DataRemain = 0; int DataRemain = 0;
int ReadPos = 0;
// Check if buffer created // Check if buffer created
if (!BufSize) { if (!BufSize) {
@@ -255,12 +281,13 @@ int CBuffer::WriteFD( int Handle, int MaxLen )
} }
// Read Data into buffer // Read Data into buffer
ReadPos = BufStart;
DataRemain = (MaxLen == -1)? BufLen : MaxLen; DataRemain = (MaxLen == -1)? BufLen : MaxLen;
while ((TotalWritten < MaxLen) && (BufLen > 0)) while ((TotalWritten < MaxLen) && (BufLen > 0))
{ {
// Read from file descriptor // Read from file descriptor
BufRemain = BufSize - BufStart; BufRemain = BufSize - ReadPos;
BytesWritten = write( Handle, &Buffer[BufStart], ((BufRemain > DataRemain)? DataRemain : BufRemain) ); BytesWritten = write( Handle, &Buffer[ReadPos], ((BufRemain > DataRemain)? DataRemain : BufRemain) );
if (BytesWritten <= 0) if (BytesWritten <= 0)
break; break;
@@ -270,10 +297,9 @@ int CBuffer::WriteFD( int Handle, int MaxLen )
// Update Buffer Pointers // Update Buffer Pointers
BufLen -= BytesWritten; BufLen -= BytesWritten;
BufStart += BytesWritten; ReadPos += BytesWritten;
if (BufStart >= BufSize) { if (ReadPos >= BufSize) {
// Rolling over end of buffer, start at beginning ReadPos = 0; // Rolling over end of buffer, start at beginning
BufStart = 0;
} }
} }
@@ -282,48 +308,78 @@ int CBuffer::WriteFD( int Handle, int MaxLen )
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
// Return specific character for current rolling data // Return specific character for current rolling data
char CBuffer::GetChar( int Pos ) char CBuffer::PeekChar( int Pos, bool ClearChar )
{ {
char CharValue = 0;
// Validate buffer and Pos
if (!BufLen) { if (!BufLen) {
return 0; return 0;
} }
else if (BufStart + Pos < BufSize) {
return Buffer[ BufStart+Pos ]; // Get char
if (BufStart + Pos < BufSize) {
CharValue = Buffer[ BufStart+Pos ];
} }
else { else {
return Buffer[ BufStart+Pos-BufSize ]; CharValue = Buffer[ BufStart+Pos-BufSize ];
} }
// Clear Char
if (ClearChar && (Pos == 0)) {
BufStart++;
BufLen--;
}
// Return char
return CharValue;
} }
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
// Look for first occureance of character in buffer // Look for first occurrence of character in buffer
bool CBuffer::FindChar( char SearchChar, int &Pos ) bool CBuffer::FindChar( char SearchChar, int &FoundPos, int StartPos )
{ {
char * CheckPos; char * CheckPos;
char * Limit; char * Limit;
// Check if buffer exists // Check if buffer exists
if (!BufLen) { if (!BufLen) {
FoundPos = -1;
return false; return false;
} }
// Validate start Pos
if (StartPos >= BufLen) {
FoundPos = -1;
return false;
}
// Get Search start point
if (BufStart + StartPos < BufSize) {
CheckPos = &Buffer[ BufStart+StartPos ];
} else {
CheckPos = &Buffer[ (BufStart+StartPos)-BufSize ];
}
// Search for char // Search for char
Pos = 0; FoundPos = StartPos;
CheckPos = &Buffer[BufStart];
Limit = &Buffer[BufSize-1]; Limit = &Buffer[BufSize-1];
while (Pos < BufLen) while (FoundPos < BufLen)
{ {
if (*CheckPos == SearchChar) if (*CheckPos == SearchChar)
return true; return true;
// Next char // Next char
Pos++; FoundPos++;
if (CheckPos == Limit) { if (CheckPos == Limit) {
CheckPos = Buffer; // Roll-over, Start at beginning of buffer CheckPos = Buffer; // Roll-over, Start at beginning of buffer
} else { } else {
CheckPos++; CheckPos++;
} }
} }
// Not Found
FoundPos = -1;
return false; return false;
} }
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------

View File

@@ -38,21 +38,21 @@ public:
// Direct Operations // Direct Operations
int Reset(); int Reset();
int Set( char * Data, int Len ); int Set( const char * Data, int Len = -1 );
int Get( char ** Data, int MaxLen = -1 ); int Peek( char ** Data, int PeekPos = 0, int MaxLen = -1 );
int Clear( int ClearLen ); int Clear( int ClearLen = -1 );
// FiFo operations // FiFo operations
int Push( char * Data, int Len ); int Push( const char * Data, int Len = -1 );
int Pop( char ** Data, int MaxLen = -1 ); int Pop( char ** Data, int MaxLen = -1 );
// File operations // File operations
int ReadFD( int Handle, int MaxRead = -1 ); int ReadFromFD( int Handle, int MaxRead = -1 );
int WriteFD( int Handle, int MaxWrite = -1 ); int WriteToFD( int Handle, int MaxWrite = -1 );
// Character Operations // Character Operations
char GetChar( int Pos ); char PeekChar( int Pos = 0, bool ClearChar = false );
bool FindChar( char SearchChar, int &Pos ); bool FindChar( char SearchChar, int &FoundPos, int StartPos = 0 );
// Miscellaneous // Miscellaneous
int Size() { return BufSize; }; int Size() { return BufSize; };

View File

@@ -59,10 +59,12 @@ CPortCore::~CPortCore()
if (Name) { if (Name) {
free( Name ); free( Name );
} }
if (Buffer) { if (Buffer) {
delete Buffer; delete Buffer;
} }
if (InMarkers) {
free( InMarkers );
}
} }
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
@@ -122,6 +124,7 @@ bool CPortCore::InputConfig( const long InputTimeout, const char * InputMarkers,
InTimeout = InputTimeout; InTimeout = InputTimeout;
if (InputMarkerLen && InputMarkers) { if (InputMarkerLen && InputMarkers) {
InMarkerLen = InputMarkerLen; InMarkerLen = InputMarkerLen;
if (InMarkers) { free( InMarkers ); }
InMarkers = (char *)malloc( InMarkerLen ); InMarkers = (char *)malloc( InMarkerLen );
memcpy( InMarkers, InputMarkers, InMarkerLen ); memcpy( InMarkers, InputMarkers, InMarkerLen );
} }
@@ -285,7 +288,7 @@ bool CPortCore::Read( const int MaxRead )
int BytesRead = 0; int BytesRead = 0;
// Read File directly into buffer // Read File directly into buffer
if (!(BytesRead = Buffer->ReadFD( Handle ))) if (!(BytesRead = Buffer->ReadFromFD( Handle )))
return false; return false;
// Process Buffer // Process Buffer
@@ -313,11 +316,11 @@ bool CPortCore::ProcessBuffer( bool Force )
if (Force) if (Force)
{ {
// Show Packet // Show Packet
Len = Buffer->Get( &Data ); Len = Buffer->Peek( &Data );
ShowOutput( "Port In", OUT_NORMAL, Data, Len ); ShowOutput( "Port In", OUT_NORMAL, Data, Len );
// Write buffer to Port // Write buffer to Port
Buffer->WriteFD( OutputHandle, Len ); Buffer->WriteToFD( OutputHandle, Len );
} }
else else
{ {
@@ -325,13 +328,16 @@ bool CPortCore::ProcessBuffer( bool Force )
while (Buffer->FindChar( '\n', Pos )) while (Buffer->FindChar( '\n', Pos ))
{ {
// Show Packet // Show Packet
Len = Buffer->Get( &Data, Pos+1 ); Len = Buffer->Peek( &Data, Pos+1 );
ShowOutput( "Port In", OUT_NORMAL, Data, Len ); ShowOutput( "Port In", OUT_NORMAL, Data, Len );
// Write buffer to Port // Write buffer to Port
Buffer->WriteFD( OutputHandle, Len ); Buffer->WriteToFD( OutputHandle, Len );
} }
} }
// Clear processed bytes from buffer
Buffer->Clear( Len );
return true; return true;
} }
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------