void *CScanLexer::TokenMemAlloc (CSTOKEN *pToken, size_t iSize) { if (SizeAdd(iSize, m_iMemUsed) > (size_t)m_iMemSize) { size_t iRoundSize = SizeAdd(m_iMemUsed + iSize, 0x100) & ~(size_t)0xff; // Hard-coded growth by 256 byte blocks void *pMem = (m_pTokenMem == NULL) ? VSAlloc (iRoundSize) : VSRealloc (m_pTokenMem, iRoundSize); if (pMem == NULL) return NULL; m_pTokenMem = pMem; m_iMemSize = iRoundSize; } ASSERT (SizeAdd(m_iMemUsed, iSize) <= (size_t)m_iMemSize); void *pRet = ((BYTE *)m_pTokenMem + m_iMemUsed); m_iMemUsed += iSize; return pRet; }
void CStringBuilder::Append (PCWSTR pszText, size_t iLen) { // Do nothing if we've already failed if (FAILED (m_hr)) return; // If -1, use nul to determine length if (iLen == (size_t)-1) iLen = wcslen (pszText); // Determine new size and reallocate if necessary size_t iReqSize = (m_iLen + iLen + m_iAllocSize) & (~(m_iAllocSize -1)); if (m_pszText == m_szBuf) { if (iReqSize > (sizeof (m_szBuf) / sizeof (m_szBuf[0]))) { // The size needed is bigger than our static buffer. Time to allocate // the dynamic buffer for the first time m_pszText = (PWSTR)VSAlloc (iReqSize * sizeof (WCHAR)); if (m_pszText == NULL) { m_hr = E_OUTOFMEMORY; m_pszText = m_szBuf; return; } // Copy the current text wcscpy (m_pszText, m_szBuf); // Keep our current pointer current... m_pszCur = m_pszText + m_iLen; ASSERT (m_pszCur[0] == 0); } else { // Do nothing -- the text will fit in our static buffer. } } else if (iReqSize != ((m_iLen + m_iAllocSize) & (~(m_iAllocSize - 1)))) { // See if we need to increase our allocation size if (iReqSize >= 0x10000 && m_iAllocSize < 0x10000) { m_iAllocSize = 0x10000; iReqSize = ((m_iLen + iLen + m_iAllocSize) & (~(m_iAllocSize - 1))); } else if (iReqSize >= 0x1000 && m_iAllocSize < 0x1000) { m_iAllocSize = 0x1000; iReqSize = ((m_iLen + iLen + m_iAllocSize) & (~(m_iAllocSize - 1))); } // Need to grow PWSTR pszNewText = (PWSTR)VSRealloc (m_pszText, iReqSize * sizeof (WCHAR)); if (pszNewText == NULL) { m_hr = E_OUTOFMEMORY; return; } m_pszText = pszNewText; // Keep our current pointer current... m_pszCur = m_pszText + m_iLen; ASSERT (m_pszCur[0] == 0); } ASSERT (iReqSize > m_iLen + iLen); // Copy incoming text to end of buffer. wcsncpy (m_pszCur, pszText, iLen); m_iLen += iLen; m_pszCur += iLen; m_pszCur[0] = 0; }