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