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#ifndef _FX_STRING_H_
8ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define _FX_STRING_H_
9ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovclass CFX_ByteStringC;
10ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovclass CFX_ByteString;
11ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovclass CFX_WideStringC;
12ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovclass CFX_WideString;
13ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstruct CFX_CharMap;
14ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovclass CFX_BinaryBuf;
15ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovtypedef int FX_STRSIZE;
16ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovclass CFX_ByteStringL;
17ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovclass CFX_WideStringL;
18ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovclass CFX_ByteStringC : public CFX_Object
19ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
20ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovpublic:
21ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
22ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CFX_ByteStringC()
23ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
24ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_Ptr = NULL;
25ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_Length = 0;
26ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
27ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
28ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CFX_ByteStringC(FX_LPCBYTE ptr, FX_STRSIZE size)
29ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
30ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_Ptr = ptr;
31ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_Length = size;
32ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
33ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
34ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CFX_ByteStringC(FX_LPCSTR ptr)
35ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
36ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_Ptr = (FX_LPCBYTE)ptr;
37ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_Length = ptr ? (FX_STRSIZE)FXSYS_strlen(ptr) : 0;
38ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
39ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
40ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CFX_ByteStringC(FX_CHAR& ch)
41ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
42ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_Ptr = (FX_LPCBYTE)&ch;
43ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_Length = 1;
44ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
45ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
46ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CFX_ByteStringC(FX_LPCSTR ptr, FX_STRSIZE len)
47ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
48ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_Ptr = (FX_LPCBYTE)ptr;
49ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (len == -1) {
50ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            m_Length = (FX_STRSIZE)FXSYS_strlen(ptr);
51ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        } else {
52ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            m_Length = len;
53ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
54ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
55ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
56ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CFX_ByteStringC(const CFX_ByteStringC& src)
57ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
58ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_Ptr = src.m_Ptr;
59ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_Length = src.m_Length;
60ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
61ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
62ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CFX_ByteStringC(const CFX_ByteString& src);
63ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
64ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CFX_ByteStringC& operator = (FX_LPCSTR src)
65ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
66ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_Ptr = (FX_LPCBYTE)src;
67ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_Length = (FX_STRSIZE)FXSYS_strlen(src);
68ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return *this;
69ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
70ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
71ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CFX_ByteStringC& operator = (const CFX_ByteStringC& src)
72ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
73ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_Ptr = src.m_Ptr;
74ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_Length = src.m_Length;
75ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return *this;
76ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
77ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
78ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CFX_ByteStringC& operator = (const CFX_ByteString& src);
79ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
80ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    bool			operator == (const CFX_ByteStringC& str) const
81ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
82ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return 	str.m_Length == m_Length && FXSYS_memcmp32(str.m_Ptr, m_Ptr, m_Length) == 0;
83ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
84ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
85ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    bool			operator != (const CFX_ByteStringC& str) const
86ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
87ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return 	str.m_Length != m_Length || FXSYS_memcmp32(str.m_Ptr, m_Ptr, m_Length) != 0;
88ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
89ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FXBSTR_ID(c1, c2, c3, c4) ((c1 << 24) | (c2 << 16) | (c3 << 8) | (c4))
90ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
91ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_DWORD		GetID(FX_STRSIZE start_pos = 0) const;
92ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
93ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_LPCBYTE		GetPtr() const
94ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
95ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return m_Ptr;
96ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
97ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
98ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_LPCSTR		GetCStr() const
99ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
100ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return (FX_LPCSTR)m_Ptr;
101ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
102ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
103ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_STRSIZE		GetLength() const
104ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
105ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return m_Length;
106ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
107ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
108ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    bool			IsEmpty() const
109ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
110ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return m_Length == 0;
111ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
112ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
113ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    operator		FX_LPCBYTE() const
114ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
115ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return m_Ptr;
116ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
117ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
118ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_BYTE			GetAt(FX_STRSIZE index) const
119ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
120ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return m_Ptr[index];
121ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
122ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
123ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CFX_ByteStringC	Mid(FX_STRSIZE index, FX_STRSIZE count = -1) const
124ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
125ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (index < 0) {
126ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            index = 0;
127ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
128ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (index > m_Length) {
129ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return CFX_ByteStringC();
130ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
131ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (count < 0 || count > m_Length - index) {
132ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            count = m_Length - index;
133ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
134ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return CFX_ByteStringC(m_Ptr + index, count);
135ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
136ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovprotected:
137ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
138ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_LPCBYTE		m_Ptr;
139ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
140ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_STRSIZE		m_Length;
141ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovprivate:
142ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
143ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void*			operator new (size_t) throw()
144ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
145ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return NULL;
146ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
147ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov};
148ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovtypedef const CFX_ByteStringC& FX_BSTR;
149ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FX_BSTRC(str) CFX_ByteStringC(str, sizeof str-1)
150ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstruct CFX_StringData {
151ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
152ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    long		m_nRefs;
153ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
154ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_STRSIZE	m_nDataLength;
155ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
156ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_STRSIZE	m_nAllocLength;
157ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
158ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_CHAR		m_String[1];
159ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov};
160ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovclass CFX_ByteString : public CFX_Object
161ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
162ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovpublic:
163ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
164ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CFX_ByteString()
165ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
166ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_pData = NULL;
167ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
168ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
169ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CFX_ByteString(const CFX_ByteString& str);
170ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
171ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CFX_ByteString(char ch);
172ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
173ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CFX_ByteString(FX_LPCSTR ptr, FX_STRSIZE len = -1);
174ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
175ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CFX_ByteString(FX_LPCBYTE ptr, FX_STRSIZE len);
176ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
177ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CFX_ByteString(FX_BSTR bstrc);
178ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
179ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CFX_ByteString(FX_BSTR bstrc1, FX_BSTR bstrc2);
180ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
181ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    ~CFX_ByteString();
182ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
183ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    static CFX_ByteString	FromUnicode(FX_LPCWSTR ptr, FX_STRSIZE len = -1);
184ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
185ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    static CFX_ByteString	FromUnicode(const CFX_WideString& str);
186ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
187ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    operator				FX_LPCSTR() const
188ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
189ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return m_pData ? m_pData->m_String : "";
190ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
191ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
192ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    operator				FX_LPCBYTE() const
193ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
194ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return m_pData ? (FX_LPCBYTE)m_pData->m_String : NULL;
195ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
196ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
197ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_STRSIZE				GetLength() const
198ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
199ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return m_pData ? m_pData->m_nDataLength : 0;
200ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
201ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
202ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    bool					IsEmpty() const
203ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
204ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return !GetLength();
205ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
206ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
207ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    int						Compare(FX_BSTR str) const;
208ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
209ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
210ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    bool					Equal(FX_BSTR str) const;
211ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
212ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
213ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    bool					EqualNoCase(FX_BSTR str) const;
214ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
215ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    bool					operator == (FX_LPCSTR str) const
216ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
217ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return Equal(str);
218ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
219ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
220ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    bool					operator == (FX_BSTR str) const
221ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
222ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return Equal(str);
223ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
224ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
225ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    bool					operator == (const CFX_ByteString& str) const;
226ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
227ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    bool					operator != (FX_LPCSTR str) const
228ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
229ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return !Equal(str);
230ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
231ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
232ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    bool					operator != (FX_BSTR str) const
233ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
234ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return !Equal(str);
235ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
236ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
237ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    bool					operator != (const CFX_ByteString& str) const
238ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
239ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return !operator==(str);
240ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
241ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
242ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void					Empty();
243ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
244ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    const CFX_ByteString&	operator = (FX_LPCSTR str);
245ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
246ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    const CFX_ByteString&	operator = (FX_BSTR bstrc);
247ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
248ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    const CFX_ByteString&	operator = (const CFX_ByteString& stringSrc);
249ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
250ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    const CFX_ByteString&	operator = (const CFX_BinaryBuf& buf);
251ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
252ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void					Load(FX_LPCBYTE str, FX_STRSIZE len);
253ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
254ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    const CFX_ByteString&	operator += (FX_CHAR ch);
255ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
256ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    const CFX_ByteString&	operator += (FX_LPCSTR str);
257ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
258ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    const CFX_ByteString&	operator += (const CFX_ByteString& str);
259ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
260ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    const CFX_ByteString&	operator += (FX_BSTR bstrc);
261ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
262ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_BYTE					GetAt(FX_STRSIZE nIndex) const
263ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
264ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return m_pData ? m_pData->m_String[nIndex] : 0;
265ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
266ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
267ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_BYTE					operator[](FX_STRSIZE nIndex) const
268ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
269ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return m_pData ? m_pData->m_String[nIndex] : 0;
270ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
271ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
272ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void					SetAt(FX_STRSIZE nIndex, FX_CHAR ch);
273ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
274ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_STRSIZE				Insert(FX_STRSIZE index, FX_CHAR ch);
275ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
276ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_STRSIZE				Delete(FX_STRSIZE index, FX_STRSIZE count = 1);
277ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
278ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
279ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void					Format(FX_LPCSTR lpszFormat, ... );
280ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
281ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void					FormatV(FX_LPCSTR lpszFormat, va_list argList);
282ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
283ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
284ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void					Reserve(FX_STRSIZE len);
285ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
286ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_LPSTR				GetBuffer(FX_STRSIZE len);
287ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
288ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_LPSTR				LockBuffer();
289ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
290ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void					ReleaseBuffer(FX_STRSIZE len = -1);
291ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
292ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CFX_ByteString			Mid(FX_STRSIZE first) const;
293ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
294ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CFX_ByteString			Mid(FX_STRSIZE first, FX_STRSIZE count) const;
295ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
296ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CFX_ByteString			Left(FX_STRSIZE count) const;
297ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
298ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CFX_ByteString			Right(FX_STRSIZE count) const;
299ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
300ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_STRSIZE				Find(FX_BSTR lpszSub, FX_STRSIZE start = 0) const;
301ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
302ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_STRSIZE				Find(FX_CHAR ch, FX_STRSIZE start = 0) const;
303ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
304ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_STRSIZE				ReverseFind(FX_CHAR ch) const;
305ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
306ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void					MakeLower();
307ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
308ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void					MakeUpper();
309ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
310ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void					TrimRight();
311ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
312ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void					TrimRight(FX_CHAR chTarget);
313ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
314ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void					TrimRight(FX_BSTR lpszTargets);
315ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
316ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void					TrimLeft();
317ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
318ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void					TrimLeft(FX_CHAR chTarget);
319ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
320ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void					TrimLeft(FX_BSTR lpszTargets);
321ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
322ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_STRSIZE				Replace(FX_BSTR lpszOld, FX_BSTR lpszNew);
323ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
324ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_STRSIZE				Remove(FX_CHAR ch);
325ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
326ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CFX_WideString			UTF8Decode() const;
327ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
328ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void					ConvertFrom(const CFX_WideString& str, CFX_CharMap* pCharMap = NULL);
329ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
330ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_DWORD				GetID(FX_STRSIZE start_pos = 0) const;
331ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
332ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    static CFX_ByteString	LoadFromFile(FX_BSTR file_path);
333ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FXFORMAT_SIGNED			1
334ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FXFORMAT_HEX			2
335ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FXFORMAT_CAPITAL		4
336ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
337ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    static CFX_ByteString	FormatInteger(int i, FX_DWORD flags = 0);
338ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
339ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    static CFX_ByteString	FormatFloat(FX_FLOAT f, int precision = 0);
340ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovprotected:
341ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
342ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    struct CFX_StringData*	m_pData;
343ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void					AllocCopy(CFX_ByteString& dest, FX_STRSIZE nCopyLen, FX_STRSIZE nCopyIndex, FX_STRSIZE nExtraLen) const;
344ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void					AssignCopy(FX_STRSIZE nSrcLen, FX_LPCSTR lpszSrcData);
345ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void					ConcatCopy(FX_STRSIZE nSrc1Len, FX_LPCSTR lpszSrc1Data, FX_STRSIZE nSrc2Len, FX_LPCSTR lpszSrc2Data);
346ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void					ConcatInPlace(FX_STRSIZE nSrcLen, FX_LPCSTR lpszSrcData);
347ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void					CopyBeforeWrite();
348ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void					AllocBeforeWrite(FX_STRSIZE nLen);
349ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov};
350ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovinline CFX_ByteStringC::CFX_ByteStringC(const CFX_ByteString& src)
351ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
352ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_Ptr = (FX_LPCBYTE)src;
353ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_Length = src.GetLength();
354ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
355ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovinline CFX_ByteStringC& CFX_ByteStringC::operator = (const CFX_ByteString& src)
356ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
357ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_Ptr = (FX_LPCBYTE)src;
358ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_Length = src.GetLength();
359ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return *this;
360ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
361ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
362ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovinline CFX_ByteString operator + (FX_BSTR str1, FX_BSTR str2)
363ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
364ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return CFX_ByteString(str1, str2);
365ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
366ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovinline CFX_ByteString operator + (FX_BSTR str1, FX_LPCSTR str2)
367ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
368ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return CFX_ByteString(str1, str2);
369ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
370ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovinline CFX_ByteString operator + (FX_LPCSTR str1, FX_BSTR str2)
371ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
372ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return CFX_ByteString(str1, str2);
373ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
374ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovinline CFX_ByteString operator + (FX_BSTR str1, FX_CHAR ch)
375ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
376ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return CFX_ByteString(str1, CFX_ByteStringC(ch));
377ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
378ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovinline CFX_ByteString operator + (FX_CHAR ch, FX_BSTR str2)
379ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
380ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return CFX_ByteString(ch, str2);
381ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
382ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovinline CFX_ByteString operator + (const CFX_ByteString& str1, const CFX_ByteString& str2)
383ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
384ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return CFX_ByteString(str1, str2);
385ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
386ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovinline CFX_ByteString operator + (const CFX_ByteString& str1, FX_CHAR ch)
387ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
388ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return CFX_ByteString(str1, CFX_ByteStringC(ch));
389ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
390ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovinline CFX_ByteString operator + (FX_CHAR ch, const CFX_ByteString& str2)
391ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
392ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return CFX_ByteString(ch, str2);
393ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
394ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovinline CFX_ByteString operator + (const CFX_ByteString& str1, FX_LPCSTR str2)
395ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
396ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return CFX_ByteString(str1, str2);
397ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
398ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovinline CFX_ByteString operator + (FX_LPCSTR str1, const CFX_ByteString& str2)
399ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
400ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return CFX_ByteString(str1, str2);
401ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
402ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovinline CFX_ByteString operator + (const CFX_ByteString& str1, FX_BSTR str2)
403ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
404ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return CFX_ByteString(str1, str2);
405ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
406ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovinline CFX_ByteString operator + (FX_BSTR str1, const CFX_ByteString& str2)
407ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
408ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return CFX_ByteString(str1, str2);
409ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
410ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovclass CFX_StringBufBase : public CFX_Object
411ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
412ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovpublic:
413ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
414ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CFX_StringBufBase(FX_STRSIZE limit)
415ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
416ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_Size = 0;
417ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_Limit = limit;
418ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
419ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
420ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_CHAR*	GetPtr() const
421ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
422ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return (FX_CHAR*)(this + 1);
423ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
424ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
425ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_STRSIZE	GetSize() const
426ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
427ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return m_Size;
428ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
429ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
430ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void		Empty()
431ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
432ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_Size = 0;
433ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
434ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
435ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void		Copy(FX_BSTR str);
436ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
437ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void		Append(FX_BSTR str);
438ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
439ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void		Append(int i, FX_DWORD flags = 0);
440ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
441ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CFX_ByteStringC		GetStringC() const
442ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
443ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return CFX_ByteStringC((FX_CHAR*)(this + 1), m_Size);
444ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
445ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
446ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CFX_ByteString		GetString() const
447ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
448ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return CFX_ByteString((FX_CHAR*)(this + 1), m_Size);
449ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
450ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovprotected:
451ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
452ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_STRSIZE	m_Limit;
453ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
454ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_STRSIZE	m_Size;
455ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov};
456ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovtemplate<FX_STRSIZE limit>
457ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovclass CFX_StringBufTemplate : public CFX_StringBufBase
458ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
459ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovpublic:
460ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
461ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CFX_StringBufTemplate() : CFX_StringBufBase(limit) {}
462ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
463ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_CHAR		m_Buffer[limit];
464ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov};
465ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovtypedef CFX_StringBufTemplate<256> CFX_StringBuf256;
466ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovclass CFX_WideStringC : public CFX_Object
467ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
468ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovpublic:
469ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
470ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CFX_WideStringC()
471ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
472ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_Ptr = NULL;
473ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_Length = 0;
474ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
475ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
476ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CFX_WideStringC(FX_LPCWSTR ptr)
477ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
478ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_Ptr = ptr;
479ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_Length = ptr ? (FX_STRSIZE)FXSYS_wcslen(ptr) : 0;
480ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
481ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
482ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CFX_WideStringC(FX_WCHAR& ch)
483ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
484ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_Ptr = &ch;
485ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_Length = 1;
486ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
487ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
488ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CFX_WideStringC(FX_LPCWSTR ptr, FX_STRSIZE len)
489ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
490ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_Ptr = ptr;
491ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (len == -1) {
492ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            m_Length = (FX_STRSIZE)FXSYS_wcslen(ptr);
493ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        } else {
494ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            m_Length = len;
495ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
496ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
497ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
498ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CFX_WideStringC(const CFX_WideStringC& src)
499ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
500ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_Ptr = src.m_Ptr;
501ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_Length = src.m_Length;
502ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
503ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
504ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CFX_WideStringC(const CFX_WideString& src);
505ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
506ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CFX_WideStringC& operator = (FX_LPCWSTR src)
507ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
508ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_Ptr = src;
509ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_Length = (FX_STRSIZE)FXSYS_wcslen(src);
510ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return *this;
511ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
512ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
513ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CFX_WideStringC& operator = (const CFX_WideStringC& src)
514ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
515ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_Ptr = src.m_Ptr;
516ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_Length = src.m_Length;
517ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return *this;
518ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
519ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
520ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CFX_WideStringC& operator = (const CFX_WideString& src);
521ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
522ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    bool			operator == (const CFX_WideStringC& str) const
523ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
524ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return 	str.m_Length == m_Length && FXSYS_memcmp32(str.m_Ptr, m_Ptr, m_Length * sizeof(FX_WCHAR)) == 0;
525ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
526ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
527ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    bool			operator != (const CFX_WideStringC& str) const
528ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
529ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return 	str.m_Length != m_Length || FXSYS_memcmp32(str.m_Ptr, m_Ptr, m_Length * sizeof(FX_WCHAR)) != 0;
530ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
531ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
532ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_LPCWSTR		GetPtr() const
533ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
534ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return m_Ptr;
535ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
536ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
537ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_STRSIZE		GetLength() const
538ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
539ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return m_Length;
540ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
541ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
542ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    bool			IsEmpty() const
543ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
544ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return m_Length == 0;
545ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
546ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
547ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_WCHAR		GetAt(FX_STRSIZE index) const
548ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
549ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return m_Ptr[index];
550ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
551ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
552ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CFX_WideStringC	Left(FX_STRSIZE count) const
553ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
554ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (count < 1) {
555ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return CFX_WideStringC();
556ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
557ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (count > m_Length) {
558ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            count = m_Length;
559ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
560ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return CFX_WideStringC(m_Ptr, count);
561ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
562ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
563ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CFX_WideStringC	Mid(FX_STRSIZE index, FX_STRSIZE count = -1) const
564ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
565ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (index < 0) {
566ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            index = 0;
567ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
568ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (index > m_Length) {
569ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return CFX_WideStringC();
570ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
571ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (count < 0 || count > m_Length - index) {
572ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            count = m_Length - index;
573ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
574ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return CFX_WideStringC(m_Ptr + index, count);
575ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
576ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
577ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CFX_WideStringC	Right(FX_STRSIZE count) const
578ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
579ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (count < 1) {
580ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return CFX_WideStringC();
581ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
582ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (count > m_Length) {
583ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            count = m_Length;
584ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
585ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return CFX_WideStringC(m_Ptr + m_Length - count, count);
586ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
587ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovprotected:
588ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
589ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_LPCWSTR		m_Ptr;
590ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
591ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_STRSIZE		m_Length;
592ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovprivate:
593ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
594ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void*			operator new (size_t) throw()
595ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
596ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return NULL;
597ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
598ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov};
599ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovtypedef const CFX_WideStringC&	FX_WSTR;
600ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FX_WSTRC(wstr) CFX_WideStringC((FX_LPCWSTR)wstr, sizeof(wstr) / sizeof(FX_WCHAR) - 1)
601ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstruct CFX_StringDataW {
602ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
603ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    long		m_nRefs;
604ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
605ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_STRSIZE	m_nDataLength;
606ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
607ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_STRSIZE	m_nAllocLength;
608ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
609ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_WCHAR	m_String[1];
610ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov};
611ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovclass CFX_WideString : public CFX_Object
612ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
613ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovpublic:
614ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
615ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CFX_WideString()
616ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
617ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_pData = NULL;
618ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
619ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
620ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CFX_WideString(const CFX_WideString& str);
621ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
622ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CFX_WideString(FX_LPCWSTR ptr, FX_STRSIZE len = -1)
623ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
624ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        InitStr(ptr, len);
625ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
626ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
627ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CFX_WideString(FX_WCHAR ch);
628ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
629ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CFX_WideString(const CFX_WideStringC& str);
630ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
631ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CFX_WideString(const CFX_WideStringC& str1, const CFX_WideStringC& str2);
632ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
633ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    ~CFX_WideString();
634ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
635ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    static CFX_WideString	FromLocal(const char* str, FX_STRSIZE len = -1);
636ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
637ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    static CFX_WideString	FromUTF8(const char* str, FX_STRSIZE len = -1);
638ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
639ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    static CFX_WideString	FromUTF16LE(const unsigned short* str, FX_STRSIZE len = -1);
640ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
641ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    operator FX_LPCWSTR() const
642ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
643ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return m_pData ? m_pData->m_String : (FX_WCHAR*)L"";
644ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
645ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
646ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void					Empty();
647ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
648ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
649ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_BOOL					IsEmpty() const
650ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
651ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return !GetLength();
652ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
653ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
654ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_STRSIZE				GetLength() const
655ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
656ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return m_pData ? m_pData->m_nDataLength : 0;
657ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
658ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
659ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    const CFX_WideString&	operator = (FX_LPCWSTR str);
660ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
661ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    const CFX_WideString&	operator =(const CFX_WideString& stringSrc);
662ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
663ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    const CFX_WideString&	operator =(const CFX_WideStringC& stringSrc);
664ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
665ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    const CFX_WideString&	operator += (FX_LPCWSTR str);
666ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
667ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    const CFX_WideString&	operator += (FX_WCHAR ch);
668ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
669ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    const CFX_WideString&	operator += (const CFX_WideString& str);
670ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
671ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    const CFX_WideString&	operator += (const CFX_WideStringC& str);
672ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
673ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_WCHAR				GetAt(FX_STRSIZE nIndex) const
674ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
675ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return m_pData ? m_pData->m_String[nIndex] : 0;
676ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
677ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
678ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_WCHAR				operator[](FX_STRSIZE nIndex) const
679ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
680ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return m_pData ? m_pData->m_String[nIndex] : 0;
681ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
682ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
683ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void					SetAt(FX_STRSIZE nIndex, FX_WCHAR ch);
684ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
685ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    int						Compare(FX_LPCWSTR str) const;
686ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
687ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    int						Compare(const CFX_WideString& str) const;
688ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
689ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    int						CompareNoCase(FX_LPCWSTR str) const;
690ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
691ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    bool					Equal(const CFX_WideStringC& str) const;
692ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
693ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CFX_WideString			Mid(FX_STRSIZE first) const;
694ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
695ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CFX_WideString			Mid(FX_STRSIZE first, FX_STRSIZE count) const;
696ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
697ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CFX_WideString			Left(FX_STRSIZE count) const;
698ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
699ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CFX_WideString			Right(FX_STRSIZE count) const;
700ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
701ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_STRSIZE				Insert(FX_STRSIZE index, FX_WCHAR ch);
702ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
703ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_STRSIZE				Delete(FX_STRSIZE index, FX_STRSIZE count = 1);
704ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
705ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void					Format(FX_LPCWSTR lpszFormat, ... );
706ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
707ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void					FormatV(FX_LPCWSTR lpszFormat, va_list argList);
708ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
709ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void					MakeLower();
710ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
711ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void					MakeUpper();
712ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
713ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void					TrimRight();
714ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
715ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void					TrimRight(FX_WCHAR chTarget);
716ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
717ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void					TrimRight(FX_LPCWSTR lpszTargets);
718ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
719ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void					TrimLeft();
720ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
721ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void					TrimLeft(FX_WCHAR chTarget);
722ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
723ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void					TrimLeft(FX_LPCWSTR lpszTargets);
724ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
725ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void					Reserve(FX_STRSIZE len);
726ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
727ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_LPWSTR				GetBuffer(FX_STRSIZE len);
728ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
729ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_LPWSTR				LockBuffer();
730ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
731ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void					ReleaseBuffer(FX_STRSIZE len = -1);
732ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
733ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    int						GetInteger() const;
734ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
735ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_FLOAT				GetFloat() const;
736ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
737ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_STRSIZE				Find(FX_LPCWSTR lpszSub, FX_STRSIZE start = 0) const;
738ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
739ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_STRSIZE				Find(FX_WCHAR ch, FX_STRSIZE start = 0) const;
740ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
741ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_STRSIZE				Replace(FX_LPCWSTR lpszOld, FX_LPCWSTR lpszNew);
742ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
743ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_STRSIZE				Remove(FX_WCHAR ch);
744ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
745ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CFX_ByteString			UTF8Encode() const;
746ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
747ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CFX_ByteString			UTF16LE_Encode(FX_BOOL bTerminate = TRUE) const;
748ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
749ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void					ConvertFrom(const CFX_ByteString& str, CFX_CharMap* pCharMap = NULL);
750ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovprotected:
751ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void					InitStr(FX_LPCWSTR ptr, int len);
752ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
753ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CFX_StringDataW*		m_pData;
754ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void					CopyBeforeWrite();
755ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void					AllocBeforeWrite(FX_STRSIZE nLen);
756ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void					ConcatInPlace(FX_STRSIZE nSrcLen, FX_LPCWSTR lpszSrcData);
757ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void					ConcatCopy(FX_STRSIZE nSrc1Len, FX_LPCWSTR lpszSrc1Data, FX_STRSIZE nSrc2Len, FX_LPCWSTR lpszSrc2Data);
758ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void					AssignCopy(FX_STRSIZE nSrcLen, FX_LPCWSTR lpszSrcData);
759ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void					AllocCopy(CFX_WideString& dest, FX_STRSIZE nCopyLen, FX_STRSIZE nCopyIndex, FX_STRSIZE nExtraLen) const;
760ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov};
761ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovinline CFX_WideStringC::CFX_WideStringC(const CFX_WideString& src)
762ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
763ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_Ptr = (FX_LPCWSTR)src;
764ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_Length = src.GetLength();
765ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
766ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovinline CFX_WideStringC& CFX_WideStringC::operator = (const CFX_WideString& src)
767ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
768ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_Ptr = (FX_LPCWSTR)src;
769ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_Length = src.GetLength();
770ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return *this;
771ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
772ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
773ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovinline CFX_WideString operator + (const CFX_WideStringC& str1, const CFX_WideStringC& str2)
774ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
775ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return CFX_WideString(str1, str2);
776ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
777ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovinline CFX_WideString operator + (const CFX_WideStringC& str1, FX_LPCWSTR str2)
778ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
779ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return CFX_WideString(str1, str2);
780ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
781ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovinline CFX_WideString operator + (FX_LPCWSTR str1, const CFX_WideStringC& str2)
782ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
783ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return CFX_WideString(str1, str2);
784ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
785ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovinline CFX_WideString operator + (const CFX_WideStringC& str1, FX_WCHAR ch)
786ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
787ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return CFX_WideString(str1, CFX_WideStringC(ch));
788ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
789ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovinline CFX_WideString operator + (FX_WCHAR ch, const CFX_WideStringC& str2)
790ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
791ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return CFX_WideString(ch, str2);
792ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
793ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovinline CFX_WideString operator + (const CFX_WideString& str1, const CFX_WideString& str2)
794ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
795ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return CFX_WideString(str1, str2);
796ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
797ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovinline CFX_WideString operator + (const CFX_WideString& str1, FX_WCHAR ch)
798ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
799ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return CFX_WideString(str1, CFX_WideStringC(ch));
800ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
801ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovinline CFX_WideString operator + (FX_WCHAR ch, const CFX_WideString& str2)
802ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
803ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return CFX_WideString(ch, str2);
804ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
805ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovinline CFX_WideString operator + (const CFX_WideString& str1, FX_LPCWSTR str2)
806ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
807ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return CFX_WideString(str1, str2);
808ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
809ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovinline CFX_WideString operator + (FX_LPCWSTR str1, const CFX_WideString& str2)
810ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
811ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return CFX_WideString(str1, str2);
812ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
813ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovinline CFX_WideString operator + (const CFX_WideString& str1, const CFX_WideStringC& str2)
814ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
815ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return CFX_WideString(str1, str2);
816ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
817ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovinline CFX_WideString operator + (const CFX_WideStringC& str1, const CFX_WideString& str2)
818ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
819ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return CFX_WideString(str1, str2);
820ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
821ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
822ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovbool operator==(const CFX_WideString& s1, const CFX_WideString& s2);
823ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovbool operator==(const CFX_WideString& s1, const CFX_WideStringC& s2);
824ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovbool operator==(const CFX_WideStringC& s1, const CFX_WideString& s2);
825ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovbool operator== (const CFX_WideString& s1, FX_LPCWSTR s2);
826ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovbool operator==(FX_LPCWSTR s1, const CFX_WideString& s2);
827ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovbool operator!=(const CFX_WideString& s1, const CFX_WideString& s2);
828ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovbool operator!=(const CFX_WideString& s1, const CFX_WideStringC& s2);
829ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovbool operator!=(const CFX_WideStringC& s1, const CFX_WideString& s2);
830ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovbool operator!= (const CFX_WideString& s1, FX_LPCWSTR s2);
831ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovbool operator!=(FX_LPCWSTR s1, const CFX_WideString& s2);
832ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_FLOAT FX_atof(FX_BSTR str);
833ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid FX_atonum(FX_BSTR str, FX_BOOL& bInteger, void* pData);
834ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_STRSIZE FX_ftoa(FX_FLOAT f, FX_LPSTR buf);
835ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCFX_ByteString	FX_UTF8Encode(FX_LPCWSTR pwsStr, FX_STRSIZE len);
836ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovinline CFX_ByteString	FX_UTF8Encode(FX_WSTR wsStr)
837ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
838ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return FX_UTF8Encode(wsStr.GetPtr(), wsStr.GetLength());
839ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
840ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovinline CFX_ByteString	FX_UTF8Encode(const CFX_WideString &wsStr)
841ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
842ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return FX_UTF8Encode((FX_LPCWSTR)wsStr, wsStr.GetLength());
843ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
844ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovclass CFX_ByteStringL : public CFX_ByteStringC
845ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
846ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovpublic:
847ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CFX_ByteStringL() : CFX_ByteStringC() {}
848ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    ~CFX_ByteStringL() {}
849ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
850ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void		Empty(IFX_Allocator* pAllocator);
851ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_LPSTR	AllocBuffer(FX_STRSIZE length, IFX_Allocator* pAllocator);
852ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
853ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void		Set(FX_BSTR src, IFX_Allocator* pAllocator);
854ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov};
855ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovclass CFX_WideStringL : public CFX_WideStringC
856ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
857ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovpublic:
858ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CFX_WideStringL() : CFX_WideStringC() {}
859ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    ~CFX_WideStringL() {}
860ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
861ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void		Empty(IFX_Allocator* pAllocator);
862ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void		Set(FX_WSTR src, IFX_Allocator* pAllocator);
863ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
864ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    int			GetInteger() const;
865ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_FLOAT	GetFloat() const;
866ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
867ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void		TrimRight(FX_LPCWSTR lpszTargets);
868ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov};
869ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid	FX_UTF8Encode(FX_LPCWSTR pwsStr, FX_STRSIZE len, CFX_ByteStringL &utf8Str, IFX_Allocator* pAllocator = NULL);
870ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif
871