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