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;
}
Beispiel #2
0
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;
}