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