home *** CD-ROM | disk | FTP | other *** search
/ Tricks of the Windows Gam…ming Gurus (2nd Edition) / Disc2.iso / msdn_vcb / samples / vc98 / sdk / com / activedocument / range / recvbuf.cpp < prev    next >
C/C++ Source or Header  |  1996-05-18  |  3KB  |  97 lines

  1. // ===========================================================================
  2. // THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
  3. // ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
  4. // THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
  5. // PARTICULAR PURPOSE.
  6. //
  7. // Copyright 1996 Microsoft Corporation.  All Rights Reserved.
  8. // ===========================================================================
  9. #include "recvbuf.hpp"
  10. #include <limits.h>
  11.  
  12. #define upcase(c)  ((BYTE) CharUpper ((LPSTR) (BYTE) (c)))
  13.  
  14. // ---------------------------------------------------------------------------
  15. // CUrlmonCallback::BufScanStr
  16. // Utility to seek for a string in a memory buffer.
  17. // ---------------------------------------------------------------------------
  18. BOOL RecvBuf::BufAlloc (DWORD dwSize)
  19. {
  20.     m_cbBufSize = dwSize;
  21.     m_pbBufBeg = (PBYTE) LocalAlloc (LMEM_FIXED, m_cbBufSize);
  22.     if (!m_pbBufBeg)
  23.         return FALSE;
  24.     m_pbBufEnd = m_pbBufBeg + m_cbBufSize;
  25.     m_pbDataBeg = m_pbBufBeg;
  26.     m_pbDataEnd = m_pbBufBeg;
  27.     return TRUE;
  28. }
  29.  
  30. // ---------------------------------------------------------------------------
  31. // CUrlmonCallback::SeekPastString
  32. // Utility to seek for a string in a memory buffer.
  33. // ---------------------------------------------------------------------------
  34. BOOL RecvBuf::BufScanStr (PSTR pszSearch, DWORD cbSearch)
  35. {
  36.     PBYTE pbLimit = m_pbDataEnd - cbSearch;
  37.     
  38.     while (1)
  39.     {
  40.         DWORD ibSearch;
  41.         
  42.         // Check for overflow.
  43.         if (m_pbDataBeg >= pbLimit)
  44.             return FALSE;
  45.  
  46.         for (ibSearch = 0; ibSearch < cbSearch; ibSearch++)
  47.         {
  48.             if (upcase(m_pbDataBeg[ibSearch]) != upcase(pszSearch[ibSearch]))
  49.                 break;
  50.         }
  51.  
  52.         if (ibSearch == cbSearch)
  53.         {
  54.             // Found it.
  55.                m_pbDataBeg += cbSearch;
  56.             return TRUE;
  57.         }
  58.         else
  59.         {
  60.             m_pbDataBeg++;
  61.             continue;
  62.         }
  63.     }
  64. }
  65.  
  66. // ---------------------------------------------------------------------------
  67. // Utility to scan a 32-bit integer from memory buffer.
  68. // Returns FALSE on integer overflow or end of buffer.
  69. // ---------------------------------------------------------------------------
  70. BOOL RecvBuf::BufScanInt (DWORD *pdwRet, BYTE cDelimit)
  71. {
  72.     DWORD dwRet = 0;
  73.  
  74.     // Scan past non-delimiters and non-digits.
  75.     while (*m_pbDataBeg != cDelimit && !isdigit(*m_pbDataBeg))
  76.     {
  77.         if (++m_pbDataBeg >= m_pbDataEnd)
  78.             return FALSE;
  79.     }
  80.     
  81.     while (*m_pbDataBeg != cDelimit)
  82.     {
  83.         if (!isdigit(*m_pbDataBeg))
  84.             return FALSE;
  85.         if (dwRet > ULONG_MAX / 10)
  86.             return FALSE;
  87.         dwRet *= 10;
  88.         dwRet += *m_pbDataBeg - '0';
  89.         if (++m_pbDataBeg >= m_pbDataEnd)
  90.             return FALSE;
  91.     }
  92.  
  93.     *pdwRet = dwRet;
  94.     return TRUE;
  95. }
  96.  
  97.