1ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// Copyright 2014 PDFium Authors. All rights reserved. 2ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// Use of this source code is governed by a BSD-style license that can be 3ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// found in the LICENSE file. 4ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com 6ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 7ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "../../include/fxcrt/fx_basic.h" 8ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic int _Buffer_itoa(char* buf, int i, FX_DWORD flags) 9ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 10ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (i == 0) { 11ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov buf[0] = '0'; 12ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return 1; 13ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 14ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov char buf1[32]; 15ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int buf_pos = 31; 16ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_DWORD u = i; 17ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ((flags & FXFORMAT_SIGNED) && i < 0) { 18ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov u = -i; 19ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 20ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int base = 10; 21ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_LPCSTR string = "0123456789abcdef"; 22ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (flags & FXFORMAT_HEX) { 23ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov base = 16; 24ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (flags & FXFORMAT_CAPITAL) { 25ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov string = "0123456789ABCDEF"; 26ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 27ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 28ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov while (u != 0) { 29ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov buf1[buf_pos--] = string[u % base]; 30ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov u = u / base; 31ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 32ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ((flags & FXFORMAT_SIGNED) && i < 0) { 33ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov buf1[buf_pos--] = '-'; 34ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 35ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int len = 31 - buf_pos; 36ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (int ii = 0; ii < len; ii ++) { 37ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov buf[ii] = buf1[ii + buf_pos + 1]; 38ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 39ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return len; 40ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 41ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCFX_ByteString CFX_ByteString::FormatInteger(int i, FX_DWORD flags) 42ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 43ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov char buf[32]; 44ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return CFX_ByteStringC(buf, _Buffer_itoa(buf, i, flags)); 45ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 46ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic CFX_StringData* FX_AllocString(int nLen) 47ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 48ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (nLen == 0) { 49ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return NULL; 50ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 51ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_StringData* pData = (CFX_StringData*)FX_Alloc(FX_BYTE, sizeof(long) * 3 + (nLen + 1) * sizeof(char)); 52ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!pData) { 53ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return NULL; 54ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 55ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pData->m_nAllocLength = nLen; 56ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pData->m_nDataLength = nLen; 57ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pData->m_nRefs = 1; 58ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pData->m_String[nLen] = 0; 59ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return pData; 60ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 61ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic void FX_ReleaseString(CFX_StringData* pData) 62ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 63ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pData == NULL) { 64ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return; 65ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 66ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pData->m_nRefs --; 67ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pData->m_nRefs <= 0) { 68ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_Free(pData); 69ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 70ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 71ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCFX_ByteString::~CFX_ByteString() 72ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 73ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pData == NULL) { 74ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return; 75ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 76ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pData->m_nRefs --; 77ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pData->m_nRefs < 1) { 78ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_Free(m_pData); 79ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 80ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 81ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCFX_ByteString::CFX_ByteString(FX_LPCSTR lpsz, FX_STRSIZE nLen) 82ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 83ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (nLen < 0) { 84ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov nLen = lpsz ? (FX_STRSIZE)FXSYS_strlen(lpsz) : 0; 85ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 86ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (nLen) { 87ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pData = FX_AllocString(nLen); 88ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pData) { 89ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FXSYS_memcpy32(m_pData->m_String, lpsz, nLen * sizeof(char)); 90ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 91ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 92ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pData = NULL; 93ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 94ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 95ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCFX_ByteString::CFX_ByteString(FX_LPCBYTE lpsz, FX_STRSIZE nLen) 96ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 97ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (nLen > 0) { 98ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pData = FX_AllocString(nLen); 99ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pData) { 100ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FXSYS_memcpy32(m_pData->m_String, lpsz, nLen * sizeof(char)); 101ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 102ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 103ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pData = NULL; 104ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 105ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 106ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCFX_ByteString::CFX_ByteString(char ch) 107ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 108ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pData = FX_AllocString(1); 109ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pData) { 110ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pData->m_String[0] = ch; 111ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 112ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 113ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCFX_ByteString::CFX_ByteString(const CFX_ByteString& stringSrc) 114ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 115ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (stringSrc.m_pData == NULL) { 116ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pData = NULL; 117ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return; 118ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 119ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (stringSrc.m_pData->m_nRefs >= 0) { 120ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pData = stringSrc.m_pData; 121ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pData->m_nRefs ++; 122ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 123ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pData = NULL; 124ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *this = stringSrc; 125ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 126ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 127ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCFX_ByteString::CFX_ByteString(FX_BSTR stringSrc) 128ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 129ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (stringSrc.IsEmpty()) { 130ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pData = NULL; 131ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return; 132ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 133ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pData = NULL; 134ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *this = stringSrc; 135ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 136ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 137ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCFX_ByteString::CFX_ByteString(FX_BSTR str1, FX_BSTR str2) 138ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 139ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pData = NULL; 140ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int nNewLen = str1.GetLength() + str2.GetLength(); 141ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (nNewLen == 0) { 142ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return; 143ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 144ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pData = FX_AllocString(nNewLen); 145ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pData) { 146ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FXSYS_memcpy32(m_pData->m_String, str1.GetCStr(), str1.GetLength()); 147ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FXSYS_memcpy32(m_pData->m_String + str1.GetLength(), str2.GetCStr(), str2.GetLength()); 148ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 149ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 150ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovconst CFX_ByteString& CFX_ByteString::operator=(FX_LPCSTR lpsz) 151ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 152ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (lpsz == NULL || lpsz[0] == 0) { 153ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov Empty(); 154ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 155ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov AssignCopy((FX_STRSIZE)FXSYS_strlen(lpsz), lpsz); 156ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 157ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return *this; 158ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 159ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovconst CFX_ByteString& CFX_ByteString::operator=(FX_BSTR str) 160ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 161ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (str.IsEmpty()) { 162ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov Empty(); 163ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 164ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov AssignCopy(str.GetLength(), str.GetCStr()); 165ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 166ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return *this; 167ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 168ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovconst CFX_ByteString& CFX_ByteString::operator=(const CFX_ByteString& stringSrc) 169ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 170ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pData == stringSrc.m_pData) { 171ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return *this; 172ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 173ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (stringSrc.IsEmpty()) { 174ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov Empty(); 175ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else if ((m_pData && m_pData->m_nRefs < 0) || 176ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (stringSrc.m_pData && stringSrc.m_pData->m_nRefs < 0)) { 177ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov AssignCopy(stringSrc.m_pData->m_nDataLength, stringSrc.m_pData->m_String); 178ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 179ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov Empty(); 180ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pData = stringSrc.m_pData; 181ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pData) { 182ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pData->m_nRefs ++; 183ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 184ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 185ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return *this; 186ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 187ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovconst CFX_ByteString& CFX_ByteString::operator=(const CFX_BinaryBuf& buf) 188ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 189ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov Load(buf.GetBuffer(), buf.GetSize()); 190ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return *this; 191ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 192ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CFX_ByteString::Load(FX_LPCBYTE buf, FX_STRSIZE len) 193ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 194ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov Empty(); 195ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (len) { 196ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pData = FX_AllocString(len); 197ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pData) { 198ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FXSYS_memcpy32(m_pData->m_String, buf, len * sizeof(char)); 199ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 200ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 201ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pData = NULL; 202ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 203ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 204ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovconst CFX_ByteString& CFX_ByteString::operator+=(FX_LPCSTR lpsz) 205ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 206ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (lpsz) { 207ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ConcatInPlace((FX_STRSIZE)FXSYS_strlen(lpsz), lpsz); 208ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 209ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return *this; 210ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 211ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovconst CFX_ByteString& CFX_ByteString::operator+=(char ch) 212ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 213ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ConcatInPlace(1, &ch); 214ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return *this; 215ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 216ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovconst CFX_ByteString& CFX_ByteString::operator+=(const CFX_ByteString& string) 217ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 218ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (string.m_pData == NULL) { 219ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return *this; 220ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 221ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ConcatInPlace(string.m_pData->m_nDataLength, string.m_pData->m_String); 222ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return *this; 223ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 224ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovconst CFX_ByteString& CFX_ByteString::operator+=(FX_BSTR string) 225ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 226ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (string.IsEmpty()) { 227ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return *this; 228ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 229ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ConcatInPlace(string.GetLength(), string.GetCStr()); 230ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return *this; 231ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 232ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovbool CFX_ByteString::Equal(FX_BSTR str) const 233ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 234ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pData == NULL) { 235ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return str.IsEmpty(); 236ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 237ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return m_pData->m_nDataLength == str.GetLength() && 238ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FXSYS_memcmp32(m_pData->m_String, str.GetCStr(), str.GetLength()) == 0; 239ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 240ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovbool CFX_ByteString::operator ==(const CFX_ByteString& s2) const 241ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 242ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pData == NULL) { 243ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return s2.IsEmpty(); 244ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 245ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (s2.m_pData == NULL) { 246ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return false; 247ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 248ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return m_pData->m_nDataLength == s2.m_pData->m_nDataLength && 249ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FXSYS_memcmp32(m_pData->m_String, s2.m_pData->m_String, m_pData->m_nDataLength) == 0; 250ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 251ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CFX_ByteString::Empty() 252ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 253ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pData == NULL) { 254ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return; 255ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 256ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pData->m_nRefs > 1) { 257ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pData->m_nRefs --; 258ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 259ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_Free(m_pData); 260ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 261ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pData = NULL; 262ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 263ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovbool CFX_ByteString::EqualNoCase(FX_BSTR str) const 264ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 265ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pData == NULL) { 266ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return str.IsEmpty(); 267ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 268ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_STRSIZE len = str.GetLength(); 269ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pData->m_nDataLength != len) { 270ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return false; 271ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 272ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_LPCBYTE pThis = (FX_LPCBYTE)m_pData->m_String; 273ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_LPCBYTE pThat = (FX_LPCBYTE)str; 274ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (FX_STRSIZE i = 0; i < len; i ++) { 275ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ((*pThis) != (*pThat)) { 276ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_BYTE bThis = *pThis; 277ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (bThis >= 'A' && bThis <= 'Z') { 278ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov bThis += 'a' - 'A'; 279ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 280ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_BYTE bThat = *pThat; 281ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (bThat >= 'A' && bThat <= 'Z') { 282ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov bThat += 'a' - 'A'; 283ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 284ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (bThis != bThat) { 285ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return false; 286ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 287ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 288ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pThis ++; 289ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pThat ++; 290ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 291ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return true; 292ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 293ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CFX_ByteString::AssignCopy(FX_STRSIZE nSrcLen, FX_LPCSTR lpszSrcData) 294ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 295ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov AllocBeforeWrite(nSrcLen); 296ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FXSYS_memcpy32(m_pData->m_String, lpszSrcData, nSrcLen * sizeof(char)); 297ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pData->m_nDataLength = nSrcLen; 298ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pData->m_String[nSrcLen] = 0; 299ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 300ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CFX_ByteString::CopyBeforeWrite() 301ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 302ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pData == NULL || m_pData->m_nRefs <= 1) { 303ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return; 304ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 305ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_StringData* pData = m_pData; 306ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pData->m_nRefs --; 307ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_STRSIZE nDataLength = pData->m_nDataLength; 308ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pData = FX_AllocString(nDataLength); 309ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pData != NULL) { 310ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FXSYS_memcpy32(m_pData->m_String, pData->m_String, (nDataLength + 1) * sizeof(char)); 311ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 312ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 313ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CFX_ByteString::AllocBeforeWrite(FX_STRSIZE nLen) 314ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 315ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pData && m_pData->m_nRefs <= 1 && m_pData->m_nAllocLength >= nLen) { 316ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return; 317ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 318ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov Empty(); 319ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pData = FX_AllocString(nLen); 320ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 321ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CFX_ByteString::ReleaseBuffer(FX_STRSIZE nNewLength) 322ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 323ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pData == NULL) { 324ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return; 325ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 326ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CopyBeforeWrite(); 327ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (nNewLength == -1) { 328ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov nNewLength = (FX_STRSIZE)FXSYS_strlen((FX_LPCSTR)m_pData->m_String); 329ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 330ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (nNewLength == 0) { 331ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov Empty(); 332ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return; 333ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 334ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FXSYS_assert(nNewLength <= m_pData->m_nAllocLength); 335ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pData->m_nDataLength = nNewLength; 336ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pData->m_String[nNewLength] = 0; 337ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 338ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_LPSTR CFX_ByteString::LockBuffer() 339ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 340ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pData == NULL) { 341ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return NULL; 342ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 343ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_LPSTR lpsz = GetBuffer(0); 344ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pData->m_nRefs = -1; 345ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return lpsz; 346ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 347ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CFX_ByteString::Reserve(FX_STRSIZE len) 348ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 349ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov GetBuffer(len); 350ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ReleaseBuffer(GetLength()); 351ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 352ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_LPSTR CFX_ByteString::GetBuffer(FX_STRSIZE nMinBufLength) 353ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 354ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pData == NULL && nMinBufLength == 0) { 355ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return NULL; 356ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 357ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pData && m_pData->m_nRefs <= 1 && m_pData->m_nAllocLength >= nMinBufLength) { 358ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return m_pData->m_String; 359ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 360ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pData == NULL) { 361ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pData = FX_AllocString(nMinBufLength); 362ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!m_pData) { 363ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return NULL; 364ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 365ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pData->m_nDataLength = 0; 366ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pData->m_String[0] = 0; 367ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return m_pData->m_String; 368ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 369ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_StringData* pOldData = m_pData; 370ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_STRSIZE nOldLen = pOldData->m_nDataLength; 371ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (nMinBufLength < nOldLen) { 372ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov nMinBufLength = nOldLen; 373ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 374ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pData = FX_AllocString(nMinBufLength); 375ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!m_pData) { 376ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return NULL; 377ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 378ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FXSYS_memcpy32(m_pData->m_String, pOldData->m_String, (nOldLen + 1)*sizeof(char)); 379ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pData->m_nDataLength = nOldLen; 380ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pOldData->m_nRefs --; 381ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pOldData->m_nRefs <= 0) { 382ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_Free(pOldData); 383ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 384ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return m_pData->m_String; 385ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 386ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_STRSIZE CFX_ByteString::Delete(FX_STRSIZE nIndex, FX_STRSIZE nCount) 387ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 388ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pData == NULL) { 389ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return 0; 390ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 391ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (nIndex < 0) { 392ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov nIndex = 0; 393ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 394ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_STRSIZE nOldLength = m_pData->m_nDataLength; 395ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (nCount > 0 && nIndex < nOldLength) { 396ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_STRSIZE mLength = nIndex + nCount; 397ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (mLength >= nOldLength) { 398ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pData->m_nDataLength = nIndex; 399ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return m_pData->m_nDataLength; 400ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 401ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CopyBeforeWrite(); 402ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int nBytesToCopy = nOldLength - mLength + 1; 403ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FXSYS_memmove32(m_pData->m_String + nIndex, 404ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pData->m_String + mLength, nBytesToCopy * sizeof(char)); 405ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pData->m_nDataLength = nOldLength - nCount; 406ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 407ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return m_pData->m_nDataLength; 408ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 409ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CFX_ByteString::ConcatInPlace(FX_STRSIZE nSrcLen, FX_LPCSTR lpszSrcData) 410ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 411ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (nSrcLen == 0 || lpszSrcData == NULL) { 412ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return; 413ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 414ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pData == NULL) { 415ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pData = FX_AllocString(nSrcLen); 416ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!m_pData) { 417ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return; 418ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 419ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FXSYS_memcpy32(m_pData->m_String, lpszSrcData, nSrcLen * sizeof(char)); 420ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return; 421ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 422ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pData->m_nRefs > 1 || m_pData->m_nDataLength + nSrcLen > m_pData->m_nAllocLength) { 423ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_StringData* pOldData = m_pData; 424ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ConcatCopy(m_pData->m_nDataLength, m_pData->m_String, nSrcLen, lpszSrcData); 425ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_ReleaseString(pOldData); 426ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 427ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FXSYS_memcpy32(m_pData->m_String + m_pData->m_nDataLength, lpszSrcData, nSrcLen * sizeof(char)); 428ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pData->m_nDataLength += nSrcLen; 429ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pData->m_String[m_pData->m_nDataLength] = 0; 430ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 431ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 432ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CFX_ByteString::ConcatCopy(FX_STRSIZE nSrc1Len, FX_LPCSTR lpszSrc1Data, 433ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_STRSIZE nSrc2Len, FX_LPCSTR lpszSrc2Data) 434ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 435ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int nNewLen = nSrc1Len + nSrc2Len; 436ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (nNewLen == 0) { 437ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return; 438ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 439ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pData = FX_AllocString(nNewLen); 440ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pData) { 441ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FXSYS_memcpy32(m_pData->m_String, lpszSrc1Data, nSrc1Len * sizeof(char)); 442ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FXSYS_memcpy32(m_pData->m_String + nSrc1Len, lpszSrc2Data, nSrc2Len * sizeof(char)); 443ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 444ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 445ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCFX_ByteString CFX_ByteString::Mid(FX_STRSIZE nFirst) const 446ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 447ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pData == NULL) { 448ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return CFX_ByteString(); 449ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 450ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return Mid(nFirst, m_pData->m_nDataLength - nFirst); 451ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 452ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCFX_ByteString CFX_ByteString::Mid(FX_STRSIZE nFirst, FX_STRSIZE nCount) const 453ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 454ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (nFirst < 0) { 455ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov nFirst = 0; 456ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 457ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (nCount < 0) { 458ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov nCount = 0; 459ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 460ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (nFirst + nCount > m_pData->m_nDataLength) { 461ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov nCount = m_pData->m_nDataLength - nFirst; 462ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 463ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (nFirst > m_pData->m_nDataLength) { 464ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov nCount = 0; 465ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 466ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (nFirst == 0 && nFirst + nCount == m_pData->m_nDataLength) { 467ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return *this; 468ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 469ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_ByteString dest; 470ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov AllocCopy(dest, nCount, nFirst, 0); 471ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return dest; 472ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 473ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CFX_ByteString::AllocCopy(CFX_ByteString& dest, FX_STRSIZE nCopyLen, FX_STRSIZE nCopyIndex, 474ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_STRSIZE nExtraLen) const 475ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 476ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_STRSIZE nNewLen = nCopyLen + nExtraLen; 477ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (nNewLen == 0) { 478ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return; 479ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 480ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ASSERT(dest.m_pData == NULL); 481ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov dest.m_pData = FX_AllocString(nNewLen); 482ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (dest.m_pData) { 483ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FXSYS_memcpy32(dest.m_pData->m_String, m_pData->m_String + nCopyIndex, nCopyLen * sizeof(char)); 484ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 485ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 486ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FORCE_ANSI 0x10000 487ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FORCE_UNICODE 0x20000 488ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FORCE_INT64 0x40000 489ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CFX_ByteString::FormatV(FX_LPCSTR lpszFormat, va_list argList) 490ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 491ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov va_list argListSave; 492ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#if defined(__ARMCC_VERSION) || (!defined(_MSC_VER) && (_FX_CPU_ == _FX_X64_ || _FX_CPU_ == _FX_IA64_ || _FX_CPU_ == _FX_ARM64_)) || defined(__native_client__) 493ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov va_copy(argListSave, argList); 494ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#else 495ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov argListSave = argList; 496ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif 497ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int nMaxLen = 0; 498ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (FX_LPCSTR lpsz = lpszFormat; *lpsz != 0; lpsz ++) { 499ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (*lpsz != '%' || *(lpsz = lpsz + 1) == '%') { 500ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov nMaxLen += (FX_STRSIZE)FXSYS_strlen(lpsz); 501ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov continue; 502ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 503ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int nItemLen = 0; 504ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int nWidth = 0; 505ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (; *lpsz != 0; lpsz ++) { 506ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (*lpsz == '#') { 507ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov nMaxLen += 2; 508ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else if (*lpsz == '*') { 509ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov nWidth = va_arg(argList, int); 510ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else if (*lpsz == '-' || *lpsz == '+' || *lpsz == '0' || 511ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *lpsz == ' ') 512ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ; 513ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov else { 514ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 515ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 516ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 517ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (nWidth == 0) { 518ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov nWidth = FXSYS_atoi(lpsz); 519ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (; (*lpsz) >= '0' && (*lpsz) <= '9'; lpsz ++) 520ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ; 521ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 522ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (nWidth < 0 || nWidth > 128 * 1024) { 523ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov lpszFormat = "Bad width"; 524ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov nMaxLen = 10; 525ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 526ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 527ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int nPrecision = 0; 528ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (*lpsz == '.') { 529ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov lpsz ++; 530ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (*lpsz == '*') { 531ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov nPrecision = va_arg(argList, int); 532ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov lpsz ++; 533ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 534ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov nPrecision = FXSYS_atoi(lpsz); 535ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (; (*lpsz) >= '0' && (*lpsz) <= '9'; lpsz ++) 536ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ; 537ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 538ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 539ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (nPrecision < 0 || nPrecision > 128 * 1024) { 540ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov lpszFormat = "Bad precision"; 541ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov nMaxLen = 14; 542ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 543ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 544ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int nModifier = 0; 545ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (FXSYS_strncmp(lpsz, "I64", 3) == 0) { 546ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov lpsz += 3; 547ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov nModifier = FORCE_INT64; 548ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 549ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov switch (*lpsz) { 550ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case 'h': 551ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov nModifier = FORCE_ANSI; 552ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov lpsz ++; 553ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 554ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case 'l': 555ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov nModifier = FORCE_UNICODE; 556ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov lpsz ++; 557ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 558ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case 'F': 559ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case 'N': 560ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case 'L': 561ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov lpsz ++; 562ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 563ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 564ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 565ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov switch (*lpsz | nModifier) { 566ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case 'c': 567ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case 'C': 568ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov nItemLen = 2; 569ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov va_arg(argList, int); 570ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 571ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case 'c'|FORCE_ANSI: 572ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case 'C'|FORCE_ANSI: 573ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov nItemLen = 2; 574ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov va_arg(argList, int); 575ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 576ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case 'c'|FORCE_UNICODE: 577ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case 'C'|FORCE_UNICODE: 578ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov nItemLen = 2; 579ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov va_arg(argList, int); 580ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 581ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case 's': { 582ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_LPCSTR pstrNextArg = va_arg(argList, FX_LPCSTR); 583ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pstrNextArg == NULL) { 584ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov nItemLen = 6; 585ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 586ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov nItemLen = (FX_STRSIZE)FXSYS_strlen(pstrNextArg); 587ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (nItemLen < 1) { 588ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov nItemLen = 1; 589ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 590ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 591ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 592ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 593ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case 'S': { 594ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_LPWSTR pstrNextArg = va_arg(argList, FX_LPWSTR); 595ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pstrNextArg == NULL) { 596ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov nItemLen = 6; 597ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 598ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov nItemLen = (FX_STRSIZE)FXSYS_wcslen(pstrNextArg); 599ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (nItemLen < 1) { 600ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov nItemLen = 1; 601ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 602ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 603ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 604ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 605ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case 's'|FORCE_ANSI: 606ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case 'S'|FORCE_ANSI: { 607ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_LPCSTR pstrNextArg = va_arg(argList, FX_LPCSTR); 608ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pstrNextArg == NULL) { 609ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov nItemLen = 6; 610ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 611ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov nItemLen = (FX_STRSIZE)FXSYS_strlen(pstrNextArg); 612ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (nItemLen < 1) { 613ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov nItemLen = 1; 614ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 615ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 616ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 617ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 618ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case 's'|FORCE_UNICODE: 619ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case 'S'|FORCE_UNICODE: { 620ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_LPWSTR pstrNextArg = va_arg(argList, FX_LPWSTR); 621ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pstrNextArg == NULL) { 622ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov nItemLen = 6; 623ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 624ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov nItemLen = (FX_STRSIZE)FXSYS_wcslen(pstrNextArg); 625ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (nItemLen < 1) { 626ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov nItemLen = 1; 627ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 628ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 629ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 630ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 631ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 632ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (nItemLen != 0) { 633ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (nPrecision != 0 && nItemLen > nPrecision) { 634ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov nItemLen = nPrecision; 635ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 636ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (nItemLen < nWidth) { 637ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov nItemLen = nWidth; 638ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 639ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 640ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov switch (*lpsz) { 641ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case 'd': 642ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case 'i': 643ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case 'u': 644ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case 'x': 645ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case 'X': 646ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case 'o': 647ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (nModifier & FORCE_INT64) { 648ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov va_arg(argList, FX_INT64); 649ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 650ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov va_arg(argList, int); 651ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 652ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov nItemLen = 32; 653ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (nItemLen < nWidth + nPrecision) { 654ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov nItemLen = nWidth + nPrecision; 655ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 656ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 657ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case 'a': 658ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case 'A': 659ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case 'e': 660ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case 'E': 661ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case 'g': 662ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case 'G': 663ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov va_arg(argList, double); 664ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov nItemLen = 128; 665ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (nItemLen < nWidth + nPrecision) { 666ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov nItemLen = nWidth + nPrecision; 667ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 668ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 669ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case 'f': 670ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (nWidth + nPrecision > 100) { 671ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov nItemLen = nPrecision + nWidth + 128; 672ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 673ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov double f; 674ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov char pszTemp[256]; 675ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov f = va_arg(argList, double); 676ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FXSYS_sprintf(pszTemp, "%*.*f", nWidth, nPrecision + 6, f ); 677ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov nItemLen = (FX_STRSIZE)FXSYS_strlen(pszTemp); 678ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 679ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 680ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case 'p': 681ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov va_arg(argList, void*); 682ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov nItemLen = 32; 683ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (nItemLen < nWidth + nPrecision) { 684ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov nItemLen = nWidth + nPrecision; 685ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 686ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 687ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case 'n': 688ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov va_arg(argList, int*); 689ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 690ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 691ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 692ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov nMaxLen += nItemLen; 693ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 694ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov GetBuffer(nMaxLen); 695ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pData) { 696ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FXSYS_vsprintf(m_pData->m_String, lpszFormat, argListSave); 697ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ReleaseBuffer(); 698ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 699ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov va_end(argListSave); 700ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 701ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CFX_ByteString::Format(FX_LPCSTR lpszFormat, ...) 702ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 703ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov va_list argList; 704ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov va_start(argList, lpszFormat); 705ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FormatV(lpszFormat, argList); 706ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov va_end(argList); 707ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 708ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_STRSIZE CFX_ByteString::Insert(FX_STRSIZE nIndex, FX_CHAR ch) 709ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 710ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CopyBeforeWrite(); 711ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (nIndex < 0) { 712ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov nIndex = 0; 713ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 714ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_STRSIZE nNewLength = m_pData ? m_pData->m_nDataLength : 0; 715ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (nIndex > nNewLength) { 716ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov nIndex = nNewLength; 717ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 718ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov nNewLength++; 719ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pData == NULL || m_pData->m_nAllocLength < nNewLength) { 720ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_StringData* pOldData = m_pData; 721ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_LPCSTR pstr = m_pData->m_String; 722ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pData = FX_AllocString(nNewLength); 723ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!m_pData) { 724ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return 0; 725ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 726ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(pOldData != NULL) { 727ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FXSYS_memmove32(m_pData->m_String, pstr, (pOldData->m_nDataLength + 1)*sizeof(char)); 728ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_ReleaseString(pOldData); 729ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 730ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pData->m_String[0] = 0; 731ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 732ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 733ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FXSYS_memmove32(m_pData->m_String + nIndex + 1, 734ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pData->m_String + nIndex, (nNewLength - nIndex)*sizeof(char)); 735ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pData->m_String[nIndex] = ch; 736ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pData->m_nDataLength = nNewLength; 737ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return nNewLength; 738ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 739ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCFX_ByteString CFX_ByteString::Right(FX_STRSIZE nCount) const 740ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 741ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pData == NULL) { 742ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return CFX_ByteString(); 743ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 744ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (nCount < 0) { 745ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov nCount = 0; 746ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 747ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (nCount >= m_pData->m_nDataLength) { 748ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return *this; 749ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 750ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_ByteString dest; 751ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov AllocCopy(dest, nCount, m_pData->m_nDataLength - nCount, 0); 752ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return dest; 753ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 754ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCFX_ByteString CFX_ByteString::Left(FX_STRSIZE nCount) const 755ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 756ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pData == NULL) { 757ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return CFX_ByteString(); 758ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 759ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (nCount < 0) { 760ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov nCount = 0; 761ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 762ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (nCount >= m_pData->m_nDataLength) { 763ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return *this; 764ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 765ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_ByteString dest; 766ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov AllocCopy(dest, nCount, 0, 0); 767ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return dest; 768ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 769ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_STRSIZE CFX_ByteString::Find(FX_CHAR ch, FX_STRSIZE nStart) const 770ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 771ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pData == NULL) { 772ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return -1; 773ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 774ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_STRSIZE nLength = m_pData->m_nDataLength; 775ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (nStart >= nLength) { 776ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return -1; 777ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 778ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_LPCSTR lpsz = FXSYS_strchr(m_pData->m_String + nStart, ch); 779ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return (lpsz == NULL) ? -1 : (int)(lpsz - m_pData->m_String); 780ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 781ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_STRSIZE CFX_ByteString::ReverseFind(FX_CHAR ch) const 782ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 783ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pData == NULL) { 784ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return -1; 785ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 786ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_STRSIZE nLength = m_pData->m_nDataLength; 787ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov while (nLength) { 788ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pData->m_String[nLength - 1] == ch) { 789ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return nLength - 1; 790ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 791ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov nLength --; 792ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 793ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return -1; 794ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 795ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_LPCSTR FX_strstr(FX_LPCSTR str1, int len1, FX_LPCSTR str2, int len2) 796ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 797ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (len2 > len1 || len2 == 0) { 798ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return NULL; 799ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 800ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_LPCSTR end_ptr = str1 + len1 - len2; 801ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov while (str1 <= end_ptr) { 802ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int i = 0; 803ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov while (1) { 804ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (str1[i] != str2[i]) { 805ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 806ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 807ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov i ++; 808ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (i == len2) { 809ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return str1; 810ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 811ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 812ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov str1 ++; 813ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 814ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return NULL; 815ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 816ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_STRSIZE CFX_ByteString::Find(FX_BSTR lpszSub, FX_STRSIZE nStart) const 817ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 818ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pData == NULL) { 819ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return -1; 820ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 821ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_STRSIZE nLength = m_pData->m_nDataLength; 822ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (nStart > nLength) { 823ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return -1; 824ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 825ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_LPCSTR lpsz = FX_strstr(m_pData->m_String + nStart, m_pData->m_nDataLength - nStart, 826ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov lpszSub.GetCStr(), lpszSub.GetLength()); 827ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return (lpsz == NULL) ? -1 : (int)(lpsz - m_pData->m_String); 828ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 829ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CFX_ByteString::MakeLower() 830ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 831ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pData == NULL) { 832ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return; 833ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 834ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CopyBeforeWrite(); 835ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (GetLength() < 1) { 836ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return; 837ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 838ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FXSYS_strlwr(m_pData->m_String); 839ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 840ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CFX_ByteString::MakeUpper() 841ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 842ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pData == NULL) { 843ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return; 844ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 845ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CopyBeforeWrite(); 846ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (GetLength() < 1) { 847ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return; 848ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 849ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FXSYS_strupr(m_pData->m_String); 850ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 851ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_STRSIZE CFX_ByteString::Remove(FX_CHAR chRemove) 852ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 853ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pData == NULL) { 854ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return 0; 855ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 856ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CopyBeforeWrite(); 857ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (GetLength() < 1) { 858ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return 0; 859ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 860ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_LPSTR pstrSource = m_pData->m_String; 861ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_LPSTR pstrDest = m_pData->m_String; 862ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_LPSTR pstrEnd = m_pData->m_String + m_pData->m_nDataLength; 863ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov while (pstrSource < pstrEnd) { 864ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (*pstrSource != chRemove) { 865ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *pstrDest = *pstrSource; 866ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pstrDest ++; 867ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 868ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pstrSource ++; 869ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 870ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *pstrDest = 0; 871ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_STRSIZE nCount = (FX_STRSIZE)(pstrSource - pstrDest); 872ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pData->m_nDataLength -= nCount; 873ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return nCount; 874ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 875ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_STRSIZE CFX_ByteString::Replace(FX_BSTR lpszOld, FX_BSTR lpszNew) 876ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 877ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pData == NULL) { 878ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return 0; 879ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 880ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (lpszOld.IsEmpty()) { 881ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return 0; 882ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 883ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_STRSIZE nSourceLen = lpszOld.GetLength(); 884ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_STRSIZE nReplacementLen = lpszNew.GetLength(); 885ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_STRSIZE nCount = 0; 886ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_LPCSTR pStart = m_pData->m_String; 887ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_LPSTR pEnd = m_pData->m_String + m_pData->m_nDataLength; 888ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov while (1) { 889ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_LPCSTR pTarget = FX_strstr(pStart, (FX_STRSIZE)(pEnd - pStart), lpszOld.GetCStr(), nSourceLen); 890ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pTarget == NULL) { 891ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 892ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 893ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov nCount++; 894ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pStart = pTarget + nSourceLen; 895ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 896ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (nCount == 0) { 897ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return 0; 898ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 899ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_STRSIZE nNewLength = m_pData->m_nDataLength + (nReplacementLen - nSourceLen) * nCount; 900ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (nNewLength == 0) { 901ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov Empty(); 902ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return nCount; 903ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 904ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_StringData* pNewData = FX_AllocString(nNewLength); 905ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!pNewData) { 906ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return 0; 907ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 908ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pStart = m_pData->m_String; 909ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_LPSTR pDest = pNewData->m_String; 910ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (FX_STRSIZE i = 0; i < nCount; i ++) { 911ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_LPCSTR pTarget = FX_strstr(pStart, (FX_STRSIZE)(pEnd - pStart), lpszOld.GetCStr(), nSourceLen); 912ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FXSYS_memcpy32(pDest, pStart, pTarget - pStart); 913ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pDest += pTarget - pStart; 914ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FXSYS_memcpy32(pDest, lpszNew.GetCStr(), lpszNew.GetLength()); 915ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pDest += lpszNew.GetLength(); 916ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pStart = pTarget + nSourceLen; 917ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 918ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FXSYS_memcpy32(pDest, pStart, pEnd - pStart); 919ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_ReleaseString(m_pData); 920ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pData = pNewData; 921ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return nCount; 922ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 923ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CFX_ByteString::SetAt(FX_STRSIZE nIndex, FX_CHAR ch) 924ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 925ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pData == NULL) { 926ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return; 927ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 928ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FXSYS_assert(nIndex >= 0); 929ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FXSYS_assert(nIndex < m_pData->m_nDataLength); 930ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CopyBeforeWrite(); 931ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pData->m_String[nIndex] = ch; 932ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 933ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCFX_ByteString CFX_ByteString::LoadFromFile(FX_BSTR filename) 934ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 935ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FXSYS_FILE* file = FXSYS_fopen(CFX_ByteString(filename), "rb"); 936ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (file == NULL) { 937ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return CFX_ByteString(); 938ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 939ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FXSYS_fseek(file, 0, FXSYS_SEEK_END); 940ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int len = FXSYS_ftell(file); 941ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FXSYS_fseek(file, 0, FXSYS_SEEK_SET); 942ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_ByteString str; 943ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_LPSTR buf = str.GetBuffer(len); 944ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov size_t readCnt = FXSYS_fread(buf, 1, len, file); 945ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov str.ReleaseBuffer(len); 946ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FXSYS_fclose(file); 947ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return str; 948ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 949ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCFX_WideString CFX_ByteString::UTF8Decode() const 950ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 951ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_UTF8Decoder decoder; 952ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (FX_STRSIZE i = 0; i < GetLength(); i ++) { 953ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov decoder.Input((FX_BYTE)m_pData->m_String[i]); 954ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 955ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return decoder.GetResult(); 956ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 957ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCFX_ByteString CFX_ByteString::FromUnicode(FX_LPCWSTR str, FX_STRSIZE len) 958ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 959ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (len < 0) { 960ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov len = (FX_STRSIZE)FXSYS_wcslen(str); 961ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 962ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_ByteString bstr; 963ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov bstr.ConvertFrom(CFX_WideString(str, len)); 964ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return bstr; 965ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 966ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCFX_ByteString CFX_ByteString::FromUnicode(const CFX_WideString& str) 967ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 968ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FromUnicode((FX_LPCWSTR)str, str.GetLength()); 969ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 970ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CFX_ByteString::ConvertFrom(const CFX_WideString& str, CFX_CharMap* pCharMap) 971ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 972ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pCharMap == NULL) { 973ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pCharMap = CFX_CharMap::GetDefaultMapper(); 974ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 975ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *this = (*pCharMap->m_GetByteString)(pCharMap, str); 976ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 977ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovint CFX_ByteString::Compare(FX_BSTR str) const 978ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 979ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pData == NULL) { 980ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return str.IsEmpty() ? 0 : -1; 981ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 982ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int this_len = m_pData->m_nDataLength; 983ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int that_len = str.GetLength(); 984ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int min_len = this_len < that_len ? this_len : that_len; 985ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (int i = 0; i < min_len; i ++) { 986ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ((FX_BYTE)m_pData->m_String[i] < str.GetAt(i)) { 987ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return -1; 988ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else if ((FX_BYTE)m_pData->m_String[i] > str.GetAt(i)) { 989ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return 1; 990ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 991ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 992ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (this_len < that_len) { 993ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return -1; 994ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else if (this_len > that_len) { 995ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return 1; 996ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 997ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return 0; 998ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 999ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CFX_ByteString::TrimRight(FX_BSTR lpszTargets) 1000ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 1001ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pData == NULL || lpszTargets.IsEmpty()) { 1002ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return; 1003ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1004ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CopyBeforeWrite(); 1005ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_STRSIZE pos = GetLength(); 1006ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pos < 1) { 1007ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return; 1008ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1009ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov while (pos) { 1010ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_STRSIZE i = 0; 1011ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov while (i < lpszTargets.GetLength() && lpszTargets[i] != m_pData->m_String[pos - 1]) { 1012ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov i ++; 1013ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1014ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (i == lpszTargets.GetLength()) { 1015ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 1016ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1017ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pos --; 1018ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1019ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pos < m_pData->m_nDataLength) { 1020ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pData->m_String[pos] = 0; 1021ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pData->m_nDataLength = pos; 1022ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1023ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 1024ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CFX_ByteString::TrimRight(FX_CHAR chTarget) 1025ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 1026ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov TrimRight(CFX_ByteStringC(chTarget)); 1027ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 1028ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CFX_ByteString::TrimRight() 1029ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 1030ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov TrimRight(FX_BSTRC("\x09\x0a\x0b\x0c\x0d\x20")); 1031ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 1032ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CFX_ByteString::TrimLeft(FX_BSTR lpszTargets) 1033ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 1034ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pData == NULL) { 1035ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return; 1036ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1037ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (lpszTargets.IsEmpty()) { 1038ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return; 1039ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1040ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CopyBeforeWrite(); 1041ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_STRSIZE len = GetLength(); 1042ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (len < 1) { 1043ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return; 1044ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1045ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_STRSIZE pos = 0; 1046ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov while (pos < len) { 1047ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_STRSIZE i = 0; 1048ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov while (i < lpszTargets.GetLength() && lpszTargets[i] != m_pData->m_String[pos]) { 1049ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov i ++; 1050ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1051ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (i == lpszTargets.GetLength()) { 1052ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 1053ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1054ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pos ++; 1055ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1056ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pos) { 1057ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_STRSIZE nDataLength = len - pos; 1058ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FXSYS_memmove32(m_pData->m_String, m_pData->m_String + pos, (nDataLength + 1)*sizeof(FX_CHAR)); 1059ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pData->m_nDataLength = nDataLength; 1060ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1061ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 1062ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CFX_ByteString::TrimLeft(FX_CHAR chTarget) 1063ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 1064ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov TrimLeft(CFX_ByteStringC(chTarget)); 1065ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 1066ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CFX_ByteString::TrimLeft() 1067ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 1068ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov TrimLeft(FX_BSTRC("\x09\x0a\x0b\x0c\x0d\x20")); 1069ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 1070ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_DWORD CFX_ByteString::GetID(FX_STRSIZE start_pos) const 1071ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 1072ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return CFX_ByteStringC(*this).GetID(start_pos); 1073ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 1074ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_DWORD CFX_ByteStringC::GetID(FX_STRSIZE start_pos) const 1075ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 1076ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_Length == 0) { 1077ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return 0; 1078ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1079ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (start_pos >= m_Length) { 1080ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return 0; 1081ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1082ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_DWORD strid = 0; 1083ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (start_pos + 4 > m_Length) { 1084ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (FX_STRSIZE i = 0; i < m_Length - start_pos; i ++) { 1085ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov strid = strid * 256 + m_Ptr[start_pos + i]; 1086ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1087ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov strid = strid << ((4 - m_Length + start_pos) * 8); 1088ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 1089ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (int i = 0; i < 4; i ++) { 1090ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov strid = strid * 256 + m_Ptr[start_pos + i]; 1091ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1092ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1093ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return strid; 1094ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 1095ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_STRSIZE FX_ftoa(FX_FLOAT d, FX_LPSTR buf) 1096ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 1097ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov buf[0] = '0'; 1098ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov buf[1] = '\0'; 1099ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (d == 0.0f) { 1100ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return 1; 1101ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1102ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_BOOL bNegative = FALSE; 1103ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (d < 0) { 1104ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov bNegative = TRUE; 1105ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov d = -d; 1106ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1107ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int scale = 1; 1108ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int scaled = FXSYS_round(d); 1109ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov while (scaled < 100000) { 1110ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (scale == 1000000) { 1111ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 1112ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1113ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov scale *= 10; 1114ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov scaled = FXSYS_round(d * scale); 1115ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1116ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (scaled == 0) { 1117ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return 1; 1118ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1119ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov char buf2[32]; 1120ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int buf_size = 0; 1121ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (bNegative) { 1122ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov buf[buf_size++] = '-'; 1123ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1124ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int i = scaled / scale; 1125ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FXSYS_itoa(i, buf2, 10); 1126ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_STRSIZE len = (FX_STRSIZE)FXSYS_strlen(buf2); 1127ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FXSYS_memcpy32(buf + buf_size, buf2, len); 1128ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov buf_size += len; 1129ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int fraction = scaled % scale; 1130ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (fraction == 0) { 1131ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return buf_size; 1132ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1133ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov buf[buf_size++] = '.'; 1134ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov scale /= 10; 1135ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov while (fraction) { 1136ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov buf[buf_size++] = '0' + fraction / scale; 1137ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov fraction %= scale; 1138ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov scale /= 10; 1139ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1140ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return buf_size; 1141ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 1142ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCFX_ByteString CFX_ByteString::FormatFloat(FX_FLOAT d, int precision) 1143ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 1144ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_CHAR buf[32]; 1145ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_STRSIZE len = FX_ftoa(d, buf); 1146ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return CFX_ByteString(buf, len); 1147ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 1148ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CFX_StringBufBase::Copy(FX_BSTR str) 1149ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 1150ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_Size = str.GetLength(); 1151ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_Size > m_Limit) { 1152ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_Size = m_Limit; 1153ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1154ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_CHAR* pBuffer = (FX_CHAR*)(this + 1); 1155ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FXSYS_memcpy32(pBuffer, str.GetPtr(), m_Size); 1156ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 1157ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CFX_StringBufBase::Append(FX_BSTR str) 1158ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 1159ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int len = str.GetLength(); 1160ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (len > m_Limit - m_Size) { 1161ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov len = m_Limit - m_Size; 1162ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1163ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_CHAR* pBuffer = (FX_CHAR*)(this + 1); 1164ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FXSYS_memcpy32(pBuffer + m_Size, str.GetPtr(), len); 1165ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_Size += len; 1166ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 1167ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CFX_StringBufBase::Append(int i, FX_DWORD flags) 1168ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 1169ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov char buf[32]; 1170ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int len = _Buffer_itoa(buf, i, flags); 1171ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov Append(CFX_ByteStringC(buf, len)); 1172ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 1173ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CFX_ByteStringL::Empty(IFX_Allocator* pAllocator) 1174ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 1175ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_Ptr) { 1176ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_Allocator_Free(pAllocator, (FX_LPVOID)m_Ptr); 1177ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1178ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_Ptr = NULL, m_Length = 0; 1179ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 1180ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_LPSTR CFX_ByteStringL::AllocBuffer(FX_STRSIZE length, IFX_Allocator* pAllocator) 1181ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 1182ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov Empty(pAllocator); 1183ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_LPSTR str = FX_Allocator_Alloc(pAllocator, FX_CHAR, length + 1); 1184ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!str) { 1185ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return NULL; 1186ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1187ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *(FX_LPSTR*)(&m_Ptr) = str; 1188ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_Length = length; 1189ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return str; 1190ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 1191ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CFX_ByteStringL::Set(FX_BSTR src, IFX_Allocator* pAllocator) 1192ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 1193ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov Empty(pAllocator); 1194ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (src.GetCStr() != NULL && src.GetLength() > 0) { 1195ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_LPSTR str = FX_Allocator_Alloc(pAllocator, FX_CHAR, src.GetLength() + 1); 1196ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!str) { 1197ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return; 1198ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1199ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FXSYS_memcpy32(str, src, src.GetLength()); 1200ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov str[src.GetLength()] = '\0'; 1201ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *(FX_LPSTR*)(&m_Ptr) = str; 1202ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_Length = src.GetLength(); 1203ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1204ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 1205