home *** CD-ROM | disk | FTP | other *** search
- // ===========================================================================
- // 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;
- }
-
-