mirror of
https://github.com/ONLYOFFICE/core.git
synced 2026-07-20 02:48:12 +08:00
git-svn-id: svn://fileserver/activex/AVS/Sources/TeamlabOffice/trunk/ServerComponents@58853 954022d7-b5bf-4e40-9824-e11837661b57
380 lines
7.1 KiB
C++
380 lines
7.1 KiB
C++
#pragma once
|
|
//#include "../stdafx.h"
|
|
|
|
#ifdef _WIN32
|
|
#include <atlbase.h>
|
|
#include <atlcom.h>
|
|
#else
|
|
#include "../../Common/DocxFormat/Source/Base/ASCString.h"
|
|
#endif
|
|
|
|
#ifndef AVSINLINE
|
|
#if defined(_MSC_VER)
|
|
#define AVSINLINE __forceinline
|
|
#else
|
|
#define AVSINLINE inline
|
|
#endif
|
|
#endif
|
|
|
|
namespace NSStrings
|
|
{
|
|
class CTextItem
|
|
{
|
|
protected:
|
|
wchar_t* m_pData;
|
|
size_t m_lSize;
|
|
|
|
wchar_t* m_pDataCur;
|
|
size_t m_lSizeCur;
|
|
|
|
public:
|
|
CTextItem()
|
|
{
|
|
m_pData = NULL;
|
|
m_lSize = 0;
|
|
|
|
m_pDataCur = m_pData;
|
|
m_lSizeCur = m_lSize;
|
|
}
|
|
CTextItem(const CTextItem& oSrc)
|
|
{
|
|
m_pData = NULL;
|
|
*this = oSrc;
|
|
}
|
|
CTextItem& operator=(const CTextItem& oSrc)
|
|
{
|
|
RELEASEMEM(m_pData);
|
|
|
|
m_lSize = oSrc.m_lSize;
|
|
m_lSizeCur = oSrc.m_lSizeCur;
|
|
m_pData = (wchar_t*)malloc(m_lSize * sizeof(wchar_t));
|
|
|
|
memcpy(m_pData, oSrc.m_pData, m_lSizeCur * sizeof(wchar_t));
|
|
|
|
m_pDataCur = m_pData + m_lSizeCur;
|
|
|
|
return *this;
|
|
}
|
|
|
|
CTextItem(const size_t& nLen)
|
|
{
|
|
m_lSize = nLen;
|
|
m_pData = (wchar_t*)malloc(m_lSize * sizeof(wchar_t));
|
|
|
|
m_lSizeCur = 0;
|
|
m_pDataCur = m_pData;
|
|
}
|
|
CTextItem(wchar_t* pData, const size_t& nLen)
|
|
{
|
|
m_lSize = nLen;
|
|
m_pData = (wchar_t*)malloc(m_lSize * sizeof(wchar_t));
|
|
|
|
memcpy(m_pData, pData, m_lSize * sizeof(wchar_t));
|
|
|
|
m_lSizeCur = m_lSize;
|
|
m_pDataCur = m_pData + m_lSize;
|
|
}
|
|
CTextItem(wchar_t* pData, BYTE* pUnicodeChecker = NULL)
|
|
{
|
|
size_t nLen = GetStringLen(pData);
|
|
|
|
m_lSize = nLen;
|
|
m_pData = (wchar_t*)malloc(m_lSize * sizeof(wchar_t));
|
|
|
|
memcpy(m_pData, pData, m_lSize * sizeof(wchar_t));
|
|
|
|
m_lSizeCur = m_lSize;
|
|
m_pDataCur = m_pData + m_lSize;
|
|
|
|
if (NULL != pUnicodeChecker)
|
|
{
|
|
wchar_t* pMemory = m_pData;
|
|
while (pMemory < m_pDataCur)
|
|
{
|
|
if (!pUnicodeChecker[*pMemory])
|
|
*pMemory = wchar_t(' ');
|
|
++pMemory;
|
|
}
|
|
}
|
|
}
|
|
virtual ~CTextItem()
|
|
{
|
|
RELEASEMEM(m_pData);
|
|
}
|
|
|
|
AVSINLINE void AddSize(const size_t& nSize)
|
|
{
|
|
if (NULL == m_pData)
|
|
{
|
|
m_lSize = nSize > 1000 ? nSize : 1000;
|
|
m_pData = (wchar_t*)malloc(m_lSize * sizeof(wchar_t));
|
|
|
|
m_lSizeCur = 0;
|
|
m_pDataCur = m_pData;
|
|
return;
|
|
}
|
|
|
|
if ((m_lSizeCur + nSize) > m_lSize)
|
|
{
|
|
while ((m_lSizeCur + nSize) > m_lSize)
|
|
{
|
|
m_lSize *= 2;
|
|
}
|
|
|
|
wchar_t* pRealloc = (wchar_t*)realloc(m_pData, m_lSize * sizeof(wchar_t));
|
|
if (NULL != pRealloc)
|
|
{
|
|
// реаллок сработал
|
|
m_pData = pRealloc;
|
|
m_pDataCur = m_pData + m_lSizeCur;
|
|
}
|
|
else
|
|
{
|
|
wchar_t* pMalloc = (wchar_t*)malloc(m_lSize * sizeof(wchar_t));
|
|
memcpy(pMalloc, m_pData, m_lSizeCur * sizeof(wchar_t));
|
|
|
|
free(m_pData);
|
|
m_pData = pMalloc;
|
|
m_pDataCur = m_pData + m_lSizeCur;
|
|
}
|
|
}
|
|
}
|
|
|
|
public:
|
|
|
|
AVSINLINE void operator+=(const CTextItem& oTemp)
|
|
{
|
|
WriteString(oTemp.m_pData, oTemp.m_lSizeCur);
|
|
}
|
|
AVSINLINE void operator+=(CString& oTemp)
|
|
{
|
|
size_t nLen = (size_t)oTemp.GetLength();
|
|
|
|
#ifdef _UNICODE
|
|
WriteString(oTemp.GetBuffer(), nLen);
|
|
#else
|
|
CStringW str = (CStringW)oTemp;
|
|
WriteString(str.GetBuffer(), nLen);
|
|
#endif
|
|
}
|
|
AVSINLINE wchar_t operator[](const size_t& nIndex)
|
|
{
|
|
if (nIndex < m_lSizeCur)
|
|
return m_pData[nIndex];
|
|
|
|
return 0;
|
|
}
|
|
|
|
AVSINLINE void SetText(BSTR& bsText)
|
|
{
|
|
ClearNoAttack();
|
|
size_t nLen = GetStringLen(bsText);
|
|
|
|
WriteString(bsText, nLen);
|
|
|
|
for (size_t i = 0; i < nLen; ++i)
|
|
{
|
|
if (WCHAR(8233) == m_pData[i])
|
|
m_pData[i] = WCHAR(' ');
|
|
}
|
|
}
|
|
AVSINLINE void AddSpace()
|
|
{
|
|
AddSize(1);
|
|
*m_pDataCur = wchar_t(' ');
|
|
|
|
++m_lSizeCur;
|
|
++m_pDataCur;
|
|
}
|
|
AVSINLINE void CorrectUnicode(const BYTE* pUnicodeChecker)
|
|
{
|
|
if (NULL != pUnicodeChecker)
|
|
{
|
|
wchar_t* pMemory = m_pData;
|
|
while (pMemory < m_pDataCur)
|
|
{
|
|
if (!pUnicodeChecker[*pMemory])
|
|
*pMemory = wchar_t(' ');
|
|
++pMemory;
|
|
}
|
|
}
|
|
}
|
|
AVSINLINE void RemoveLastSpaces()
|
|
{
|
|
wchar_t* pMemory = m_pDataCur - 1;
|
|
while ((pMemory > m_pData) && (wchar_t(' ') == *pMemory))
|
|
{
|
|
--pMemory;
|
|
--m_lSizeCur;
|
|
--m_pDataCur;
|
|
}
|
|
|
|
}
|
|
AVSINLINE bool IsSpace()
|
|
{
|
|
if (1 != m_lSizeCur)
|
|
return false;
|
|
return (wchar_t(' ') == *m_pData);
|
|
}
|
|
|
|
public:
|
|
AVSINLINE void WriteString(const wchar_t* pString, const size_t& nLen)
|
|
{
|
|
AddSize(nLen);
|
|
//memcpy(m_pDataCur, pString, nLen * sizeof(wchar_t));
|
|
memcpy(m_pDataCur, pString, nLen << 1);
|
|
m_pDataCur += nLen;
|
|
m_lSizeCur += nLen;
|
|
}
|
|
AVSINLINE size_t GetCurSize()
|
|
{
|
|
return m_lSizeCur;
|
|
}
|
|
AVSINLINE void SetCurSize(ULONG lCurSize)
|
|
{
|
|
m_lSizeCur = (size_t)lCurSize;
|
|
m_pDataCur = m_pData + m_lSizeCur;
|
|
}
|
|
AVSINLINE size_t GetSize()
|
|
{
|
|
return m_lSize;
|
|
}
|
|
AVSINLINE void Clear()
|
|
{
|
|
RELEASEMEM(m_pData);
|
|
|
|
m_pData = NULL;
|
|
m_lSize = 0;
|
|
|
|
m_pDataCur = m_pData;
|
|
m_lSizeCur = 0;
|
|
}
|
|
AVSINLINE void ClearNoAttack()
|
|
{
|
|
m_pDataCur = m_pData;
|
|
m_lSizeCur = 0;
|
|
}
|
|
|
|
AVSINLINE size_t GetStringLen(const wchar_t* pData)
|
|
{
|
|
const wchar_t* s = pData;
|
|
for (; *s != 0; ++s);
|
|
return (size_t)(s - pData);
|
|
}
|
|
|
|
AVSINLINE CString GetCString()
|
|
{
|
|
CString str(m_pData, (int)m_lSizeCur);
|
|
return str;
|
|
}
|
|
AVSINLINE wchar_t* GetBuffer()
|
|
{
|
|
return m_pData;
|
|
}
|
|
|
|
AVSINLINE void AddCharNoCheck(const WCHAR& wc)
|
|
{
|
|
*m_pDataCur++ = wc;
|
|
++m_lSizeCur;
|
|
}
|
|
AVSINLINE void AddIntNoCheck(int val)
|
|
{
|
|
if (0 == val)
|
|
{
|
|
*m_pDataCur++ = (WCHAR)'0';
|
|
++m_lSizeCur;
|
|
return;
|
|
}
|
|
if (val < 0)
|
|
{
|
|
val = -val;
|
|
*m_pDataCur++ = (WCHAR)'-';
|
|
++m_lSizeCur;
|
|
}
|
|
|
|
int len = 0;
|
|
int oval = val;
|
|
while (oval > 0)
|
|
{
|
|
oval /= 10;
|
|
++len;
|
|
}
|
|
|
|
oval = 1;
|
|
while (val > 0)
|
|
{
|
|
m_pDataCur[len - oval] = (WCHAR)('0' + (val % 10));
|
|
++oval;
|
|
val /= 10;
|
|
}
|
|
|
|
m_pDataCur += len;
|
|
m_lSizeCur += len;
|
|
}
|
|
|
|
AVSINLINE void AddIntNoCheckDel10(int val)
|
|
{
|
|
if (0 == val)
|
|
{
|
|
*m_pDataCur++ = (WCHAR)'0';
|
|
++m_lSizeCur;
|
|
return;
|
|
}
|
|
if (val < 0)
|
|
{
|
|
val = -val;
|
|
*m_pDataCur++ = (WCHAR)'-';
|
|
++m_lSizeCur;
|
|
}
|
|
|
|
int len = 0;
|
|
int oval = val;
|
|
while (oval > 0)
|
|
{
|
|
oval /= 10;
|
|
++len;
|
|
}
|
|
|
|
oval = 1;
|
|
int nLastS = (val % 10);
|
|
if (0 != nLastS)
|
|
{
|
|
++len;
|
|
m_pDataCur[len - oval] = (WCHAR)('0' + nLastS);
|
|
++oval;
|
|
m_pDataCur[len - oval] = (WCHAR)('.');
|
|
++oval;
|
|
val /= 10;
|
|
}
|
|
else
|
|
{
|
|
--len;
|
|
val /= 10;
|
|
}
|
|
|
|
while (val > 0)
|
|
{
|
|
m_pDataCur[len - oval] = (WCHAR)('0' + (val % 10));
|
|
++oval;
|
|
val /= 10;
|
|
}
|
|
|
|
m_pDataCur += len;
|
|
m_lSizeCur += len;
|
|
}
|
|
|
|
AVSINLINE void AddStringNoCheck(const wchar_t* pData, const int& len)
|
|
{
|
|
memcpy(m_pDataCur, pData, len << 1);
|
|
m_pDataCur += len;
|
|
m_lSizeCur += len;
|
|
}
|
|
AVSINLINE void AddSpaceNoCheck()
|
|
{
|
|
*m_pDataCur = WCHAR(' ');
|
|
++m_pDataCur;
|
|
++m_lSizeCur;
|
|
}
|
|
};
|
|
}
|