RECVBUF.CPP

// =========================================================================== 
// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
// PARTICULAR PURPOSE.
//
// Copyright 1996 Microsoft Corporation. All Rights Reserved.
// ===========================================================================
#include "recvbuf.hpp"
#include <limits.h>

#define upcase(c) ((BYTE) CharUpper ((LPSTR) (BYTE) (c)))

// ---------------------------------------------------------------------------
// CUrlmonCallback::BufScanStr
// Utility to seek for a string in a memory buffer.
// ---------------------------------------------------------------------------
BOOL RecvBuf::BufAlloc (DWORD dwSize)
{
m_cbBufSize = dwSize;
m_pbBufBeg = (PBYTE) LocalAlloc (LMEM_FIXED, m_cbBufSize);
if (!m_pbBufBeg)
return FALSE;
m_pbBufEnd = m_pbBufBeg + m_cbBufSize;
m_pbDataBeg = m_pbBufBeg;
m_pbDataEnd = m_pbBufBeg;
return TRUE;
}

// ---------------------------------------------------------------------------
// CUrlmonCallback::SeekPastString
// Utility to seek for a string in a memory buffer.
// ---------------------------------------------------------------------------
BOOL RecvBuf::BufScanStr (PSTR pszSearch, DWORD cbSearch)
{
PBYTE pbLimit = m_pbDataEnd - cbSearch;

while (1)
{
DWORD ibSearch;

// Check for overflow.
if (m_pbDataBeg >= pbLimit)
return FALSE;

for (ibSearch = 0; ibSearch < cbSearch; ibSearch++)
{
if (upcase(m_pbDataBeg[ibSearch]) != upcase(pszSearch[ibSearch]))
break;
}

if (ibSearch == cbSearch)
{
// Found it.
m_pbDataBeg += cbSearch;
return TRUE;
}
else
{
m_pbDataBeg++;
continue;
}
}
}

// ---------------------------------------------------------------------------
// Utility to scan a 32-bit integer from memory buffer.
// Returns FALSE on integer overflow or end of buffer.
// ---------------------------------------------------------------------------
BOOL RecvBuf::BufScanInt (DWORD *pdwRet, BYTE cDelimit)
{
DWORD dwRet = 0;

// Scan past non-delimiters and non-digits.
while (*m_pbDataBeg != cDelimit && !isdigit(*m_pbDataBeg))
{
if (++m_pbDataBeg >= m_pbDataEnd)
return FALSE;
}

while (*m_pbDataBeg != cDelimit)
{
if (!isdigit(*m_pbDataBeg))
return FALSE;
if (dwRet > ULONG_MAX / 10)
return FALSE;
dwRet *= 10;
dwRet += *m_pbDataBeg - '0';
if (++m_pbDataBeg >= m_pbDataEnd)
return FALSE;
}

*pdwRet = dwRet;
return TRUE;
}