1*f6dc9357SAndroid Build Coastguard Worker // Common/MyString.cpp
2*f6dc9357SAndroid Build Coastguard Worker
3*f6dc9357SAndroid Build Coastguard Worker #include "StdAfx.h"
4*f6dc9357SAndroid Build Coastguard Worker
5*f6dc9357SAndroid Build Coastguard Worker #ifdef _WIN32
6*f6dc9357SAndroid Build Coastguard Worker #include <wchar.h>
7*f6dc9357SAndroid Build Coastguard Worker #else
8*f6dc9357SAndroid Build Coastguard Worker #include <ctype.h>
9*f6dc9357SAndroid Build Coastguard Worker #endif
10*f6dc9357SAndroid Build Coastguard Worker
11*f6dc9357SAndroid Build Coastguard Worker #include "IntToString.h"
12*f6dc9357SAndroid Build Coastguard Worker
13*f6dc9357SAndroid Build Coastguard Worker #if !defined(_UNICODE) || !defined(USE_UNICODE_FSTRING)
14*f6dc9357SAndroid Build Coastguard Worker #include "StringConvert.h"
15*f6dc9357SAndroid Build Coastguard Worker #endif
16*f6dc9357SAndroid Build Coastguard Worker
17*f6dc9357SAndroid Build Coastguard Worker #include "MyString.h"
18*f6dc9357SAndroid Build Coastguard Worker
19*f6dc9357SAndroid Build Coastguard Worker #define MY_STRING_NEW(_T_, _size_) new _T_[_size_]
20*f6dc9357SAndroid Build Coastguard Worker // #define MY_STRING_NEW(_T_, _size_) ((_T_ *)my_new((size_t)(_size_) * sizeof(_T_)))
21*f6dc9357SAndroid Build Coastguard Worker
22*f6dc9357SAndroid Build Coastguard Worker /*
23*f6dc9357SAndroid Build Coastguard Worker inline const char* MyStringGetNextCharPointer(const char *p) throw()
24*f6dc9357SAndroid Build Coastguard Worker {
25*f6dc9357SAndroid Build Coastguard Worker #if defined(_WIN32) && !defined(UNDER_CE)
26*f6dc9357SAndroid Build Coastguard Worker return CharNextA(p);
27*f6dc9357SAndroid Build Coastguard Worker #else
28*f6dc9357SAndroid Build Coastguard Worker return p + 1;
29*f6dc9357SAndroid Build Coastguard Worker #endif
30*f6dc9357SAndroid Build Coastguard Worker }
31*f6dc9357SAndroid Build Coastguard Worker */
32*f6dc9357SAndroid Build Coastguard Worker
33*f6dc9357SAndroid Build Coastguard Worker #define MY_STRING_NEW_char(_size_) MY_STRING_NEW(char, (_size_))
34*f6dc9357SAndroid Build Coastguard Worker #define MY_STRING_NEW_wchar_t(_size_) MY_STRING_NEW(wchar_t, (_size_))
35*f6dc9357SAndroid Build Coastguard Worker
36*f6dc9357SAndroid Build Coastguard Worker
FindCharPosInString(const char * s,char c)37*f6dc9357SAndroid Build Coastguard Worker int FindCharPosInString(const char *s, char c) throw()
38*f6dc9357SAndroid Build Coastguard Worker {
39*f6dc9357SAndroid Build Coastguard Worker for (const char *p = s;; p++)
40*f6dc9357SAndroid Build Coastguard Worker {
41*f6dc9357SAndroid Build Coastguard Worker if (*p == c)
42*f6dc9357SAndroid Build Coastguard Worker return (int)(p - s);
43*f6dc9357SAndroid Build Coastguard Worker if (*p == 0)
44*f6dc9357SAndroid Build Coastguard Worker return -1;
45*f6dc9357SAndroid Build Coastguard Worker // MyStringGetNextCharPointer(p);
46*f6dc9357SAndroid Build Coastguard Worker }
47*f6dc9357SAndroid Build Coastguard Worker }
48*f6dc9357SAndroid Build Coastguard Worker
FindCharPosInString(const wchar_t * s,wchar_t c)49*f6dc9357SAndroid Build Coastguard Worker int FindCharPosInString(const wchar_t *s, wchar_t c) throw()
50*f6dc9357SAndroid Build Coastguard Worker {
51*f6dc9357SAndroid Build Coastguard Worker for (const wchar_t *p = s;; p++)
52*f6dc9357SAndroid Build Coastguard Worker {
53*f6dc9357SAndroid Build Coastguard Worker if (*p == c)
54*f6dc9357SAndroid Build Coastguard Worker return (int)(p - s);
55*f6dc9357SAndroid Build Coastguard Worker if (*p == 0)
56*f6dc9357SAndroid Build Coastguard Worker return -1;
57*f6dc9357SAndroid Build Coastguard Worker }
58*f6dc9357SAndroid Build Coastguard Worker }
59*f6dc9357SAndroid Build Coastguard Worker
60*f6dc9357SAndroid Build Coastguard Worker /*
61*f6dc9357SAndroid Build Coastguard Worker void MyStringUpper_Ascii(char *s) throw()
62*f6dc9357SAndroid Build Coastguard Worker {
63*f6dc9357SAndroid Build Coastguard Worker for (;;)
64*f6dc9357SAndroid Build Coastguard Worker {
65*f6dc9357SAndroid Build Coastguard Worker const char c = *s;
66*f6dc9357SAndroid Build Coastguard Worker if (c == 0)
67*f6dc9357SAndroid Build Coastguard Worker return;
68*f6dc9357SAndroid Build Coastguard Worker *s++ = MyCharUpper_Ascii(c);
69*f6dc9357SAndroid Build Coastguard Worker }
70*f6dc9357SAndroid Build Coastguard Worker }
71*f6dc9357SAndroid Build Coastguard Worker
72*f6dc9357SAndroid Build Coastguard Worker void MyStringUpper_Ascii(wchar_t *s) throw()
73*f6dc9357SAndroid Build Coastguard Worker {
74*f6dc9357SAndroid Build Coastguard Worker for (;;)
75*f6dc9357SAndroid Build Coastguard Worker {
76*f6dc9357SAndroid Build Coastguard Worker const wchar_t c = *s;
77*f6dc9357SAndroid Build Coastguard Worker if (c == 0)
78*f6dc9357SAndroid Build Coastguard Worker return;
79*f6dc9357SAndroid Build Coastguard Worker *s++ = MyCharUpper_Ascii(c);
80*f6dc9357SAndroid Build Coastguard Worker }
81*f6dc9357SAndroid Build Coastguard Worker }
82*f6dc9357SAndroid Build Coastguard Worker */
83*f6dc9357SAndroid Build Coastguard Worker
MyStringLower_Ascii(char * s)84*f6dc9357SAndroid Build Coastguard Worker void MyStringLower_Ascii(char *s) throw()
85*f6dc9357SAndroid Build Coastguard Worker {
86*f6dc9357SAndroid Build Coastguard Worker for (;;)
87*f6dc9357SAndroid Build Coastguard Worker {
88*f6dc9357SAndroid Build Coastguard Worker const char c = *s;
89*f6dc9357SAndroid Build Coastguard Worker if (c == 0)
90*f6dc9357SAndroid Build Coastguard Worker return;
91*f6dc9357SAndroid Build Coastguard Worker *s++ = MyCharLower_Ascii(c);
92*f6dc9357SAndroid Build Coastguard Worker }
93*f6dc9357SAndroid Build Coastguard Worker }
94*f6dc9357SAndroid Build Coastguard Worker
MyStringLower_Ascii(wchar_t * s)95*f6dc9357SAndroid Build Coastguard Worker void MyStringLower_Ascii(wchar_t *s) throw()
96*f6dc9357SAndroid Build Coastguard Worker {
97*f6dc9357SAndroid Build Coastguard Worker for (;;)
98*f6dc9357SAndroid Build Coastguard Worker {
99*f6dc9357SAndroid Build Coastguard Worker const wchar_t c = *s;
100*f6dc9357SAndroid Build Coastguard Worker if (c == 0)
101*f6dc9357SAndroid Build Coastguard Worker return;
102*f6dc9357SAndroid Build Coastguard Worker *s++ = MyCharLower_Ascii(c);
103*f6dc9357SAndroid Build Coastguard Worker }
104*f6dc9357SAndroid Build Coastguard Worker }
105*f6dc9357SAndroid Build Coastguard Worker
106*f6dc9357SAndroid Build Coastguard Worker #ifdef _WIN32
107*f6dc9357SAndroid Build Coastguard Worker
108*f6dc9357SAndroid Build Coastguard Worker #ifdef _UNICODE
109*f6dc9357SAndroid Build Coastguard Worker
110*f6dc9357SAndroid Build Coastguard Worker // wchar_t * MyStringUpper(wchar_t *s) { return CharUpperW(s); }
111*f6dc9357SAndroid Build Coastguard Worker // wchar_t * MyStringLower(wchar_t *s) { return CharLowerW(s); }
112*f6dc9357SAndroid Build Coastguard Worker // for WinCE - FString - char
113*f6dc9357SAndroid Build Coastguard Worker // const char *MyStringGetPrevCharPointer(const char * /* base */, const char *p) { return p - 1; }
114*f6dc9357SAndroid Build Coastguard Worker
115*f6dc9357SAndroid Build Coastguard Worker #else
116*f6dc9357SAndroid Build Coastguard Worker
117*f6dc9357SAndroid Build Coastguard Worker // const char * MyStringGetPrevCharPointer(const char *base, const char *p) throw() { return CharPrevA(base, p); }
118*f6dc9357SAndroid Build Coastguard Worker // char * MyStringUpper(char *s) { return CharUpperA(s); }
119*f6dc9357SAndroid Build Coastguard Worker // char * MyStringLower(char *s) { return CharLowerA(s); }
120*f6dc9357SAndroid Build Coastguard Worker
MyCharUpper_WIN(wchar_t c)121*f6dc9357SAndroid Build Coastguard Worker wchar_t MyCharUpper_WIN(wchar_t c) throw()
122*f6dc9357SAndroid Build Coastguard Worker {
123*f6dc9357SAndroid Build Coastguard Worker wchar_t *res = CharUpperW((LPWSTR)(UINT_PTR)(unsigned)c);
124*f6dc9357SAndroid Build Coastguard Worker if (res != 0 || ::GetLastError() != ERROR_CALL_NOT_IMPLEMENTED)
125*f6dc9357SAndroid Build Coastguard Worker return (wchar_t)(unsigned)(UINT_PTR)res;
126*f6dc9357SAndroid Build Coastguard Worker const int kBufSize = 4;
127*f6dc9357SAndroid Build Coastguard Worker char s[kBufSize + 1];
128*f6dc9357SAndroid Build Coastguard Worker int numChars = ::WideCharToMultiByte(CP_ACP, 0, &c, 1, s, kBufSize, 0, 0);
129*f6dc9357SAndroid Build Coastguard Worker if (numChars == 0 || numChars > kBufSize)
130*f6dc9357SAndroid Build Coastguard Worker return c;
131*f6dc9357SAndroid Build Coastguard Worker s[numChars] = 0;
132*f6dc9357SAndroid Build Coastguard Worker ::CharUpperA(s);
133*f6dc9357SAndroid Build Coastguard Worker ::MultiByteToWideChar(CP_ACP, 0, s, numChars, &c, 1);
134*f6dc9357SAndroid Build Coastguard Worker return c;
135*f6dc9357SAndroid Build Coastguard Worker }
136*f6dc9357SAndroid Build Coastguard Worker
137*f6dc9357SAndroid Build Coastguard Worker /*
138*f6dc9357SAndroid Build Coastguard Worker wchar_t MyCharLower_WIN(wchar_t c)
139*f6dc9357SAndroid Build Coastguard Worker {
140*f6dc9357SAndroid Build Coastguard Worker wchar_t *res = CharLowerW((LPWSTR)(UINT_PTR)(unsigned)c);
141*f6dc9357SAndroid Build Coastguard Worker if (res != 0 || ::GetLastError() != ERROR_CALL_NOT_IMPLEMENTED)
142*f6dc9357SAndroid Build Coastguard Worker return (wchar_t)(unsigned)(UINT_PTR)res;
143*f6dc9357SAndroid Build Coastguard Worker const int kBufSize = 4;
144*f6dc9357SAndroid Build Coastguard Worker char s[kBufSize + 1];
145*f6dc9357SAndroid Build Coastguard Worker int numChars = ::WideCharToMultiByte(CP_ACP, 0, &c, 1, s, kBufSize, 0, 0);
146*f6dc9357SAndroid Build Coastguard Worker if (numChars == 0 || numChars > kBufSize)
147*f6dc9357SAndroid Build Coastguard Worker return c;
148*f6dc9357SAndroid Build Coastguard Worker s[numChars] = 0;
149*f6dc9357SAndroid Build Coastguard Worker ::CharLowerA(s);
150*f6dc9357SAndroid Build Coastguard Worker ::MultiByteToWideChar(CP_ACP, 0, s, numChars, &c, 1);
151*f6dc9357SAndroid Build Coastguard Worker return c;
152*f6dc9357SAndroid Build Coastguard Worker }
153*f6dc9357SAndroid Build Coastguard Worker */
154*f6dc9357SAndroid Build Coastguard Worker
155*f6dc9357SAndroid Build Coastguard Worker /*
156*f6dc9357SAndroid Build Coastguard Worker wchar_t * MyStringUpper(wchar_t *s)
157*f6dc9357SAndroid Build Coastguard Worker {
158*f6dc9357SAndroid Build Coastguard Worker if (s == 0)
159*f6dc9357SAndroid Build Coastguard Worker return 0;
160*f6dc9357SAndroid Build Coastguard Worker wchar_t *res = CharUpperW(s);
161*f6dc9357SAndroid Build Coastguard Worker if (res != 0 || ::GetLastError() != ERROR_CALL_NOT_IMPLEMENTED)
162*f6dc9357SAndroid Build Coastguard Worker return res;
163*f6dc9357SAndroid Build Coastguard Worker AString a = UnicodeStringToMultiByte(s);
164*f6dc9357SAndroid Build Coastguard Worker a.MakeUpper();
165*f6dc9357SAndroid Build Coastguard Worker MyStringCopy(s, (const wchar_t *)MultiByteToUnicodeString(a));
166*f6dc9357SAndroid Build Coastguard Worker return s;
167*f6dc9357SAndroid Build Coastguard Worker }
168*f6dc9357SAndroid Build Coastguard Worker */
169*f6dc9357SAndroid Build Coastguard Worker
170*f6dc9357SAndroid Build Coastguard Worker /*
171*f6dc9357SAndroid Build Coastguard Worker wchar_t * MyStringLower(wchar_t *s)
172*f6dc9357SAndroid Build Coastguard Worker {
173*f6dc9357SAndroid Build Coastguard Worker if (s == 0)
174*f6dc9357SAndroid Build Coastguard Worker return 0;
175*f6dc9357SAndroid Build Coastguard Worker wchar_t *res = CharLowerW(s);
176*f6dc9357SAndroid Build Coastguard Worker if (res != 0 || ::GetLastError() != ERROR_CALL_NOT_IMPLEMENTED)
177*f6dc9357SAndroid Build Coastguard Worker return res;
178*f6dc9357SAndroid Build Coastguard Worker AString a = UnicodeStringToMultiByte(s);
179*f6dc9357SAndroid Build Coastguard Worker a.MakeLower();
180*f6dc9357SAndroid Build Coastguard Worker MyStringCopy(s, (const wchar_t *)MultiByteToUnicodeString(a));
181*f6dc9357SAndroid Build Coastguard Worker return s;
182*f6dc9357SAndroid Build Coastguard Worker }
183*f6dc9357SAndroid Build Coastguard Worker */
184*f6dc9357SAndroid Build Coastguard Worker
185*f6dc9357SAndroid Build Coastguard Worker #endif
186*f6dc9357SAndroid Build Coastguard Worker
187*f6dc9357SAndroid Build Coastguard Worker #endif
188*f6dc9357SAndroid Build Coastguard Worker
IsString1PrefixedByString2(const char * s1,const char * s2)189*f6dc9357SAndroid Build Coastguard Worker bool IsString1PrefixedByString2(const char *s1, const char *s2) throw()
190*f6dc9357SAndroid Build Coastguard Worker {
191*f6dc9357SAndroid Build Coastguard Worker for (;;)
192*f6dc9357SAndroid Build Coastguard Worker {
193*f6dc9357SAndroid Build Coastguard Worker const char c2 = *s2++; if (c2 == 0) return true;
194*f6dc9357SAndroid Build Coastguard Worker const char c1 = *s1++; if (c1 != c2) return false;
195*f6dc9357SAndroid Build Coastguard Worker }
196*f6dc9357SAndroid Build Coastguard Worker }
197*f6dc9357SAndroid Build Coastguard Worker
StringsAreEqualNoCase(const wchar_t * s1,const wchar_t * s2)198*f6dc9357SAndroid Build Coastguard Worker bool StringsAreEqualNoCase(const wchar_t *s1, const wchar_t *s2) throw()
199*f6dc9357SAndroid Build Coastguard Worker {
200*f6dc9357SAndroid Build Coastguard Worker for (;;)
201*f6dc9357SAndroid Build Coastguard Worker {
202*f6dc9357SAndroid Build Coastguard Worker const wchar_t c1 = *s1++;
203*f6dc9357SAndroid Build Coastguard Worker const wchar_t c2 = *s2++;
204*f6dc9357SAndroid Build Coastguard Worker if (c1 != c2 && MyCharUpper(c1) != MyCharUpper(c2)) return false;
205*f6dc9357SAndroid Build Coastguard Worker if (c1 == 0) return true;
206*f6dc9357SAndroid Build Coastguard Worker }
207*f6dc9357SAndroid Build Coastguard Worker }
208*f6dc9357SAndroid Build Coastguard Worker
209*f6dc9357SAndroid Build Coastguard Worker // ---------- ASCII ----------
210*f6dc9357SAndroid Build Coastguard Worker
IsPrefixedBy_Ascii_NoCase(const char * s) const211*f6dc9357SAndroid Build Coastguard Worker bool AString::IsPrefixedBy_Ascii_NoCase(const char *s) const throw()
212*f6dc9357SAndroid Build Coastguard Worker {
213*f6dc9357SAndroid Build Coastguard Worker const char *s1 = _chars;
214*f6dc9357SAndroid Build Coastguard Worker for (;;)
215*f6dc9357SAndroid Build Coastguard Worker {
216*f6dc9357SAndroid Build Coastguard Worker const char c2 = *s++;
217*f6dc9357SAndroid Build Coastguard Worker if (c2 == 0)
218*f6dc9357SAndroid Build Coastguard Worker return true;
219*f6dc9357SAndroid Build Coastguard Worker const char c1 = *s1++;
220*f6dc9357SAndroid Build Coastguard Worker if (MyCharLower_Ascii(c1) !=
221*f6dc9357SAndroid Build Coastguard Worker MyCharLower_Ascii(c2))
222*f6dc9357SAndroid Build Coastguard Worker return false;
223*f6dc9357SAndroid Build Coastguard Worker }
224*f6dc9357SAndroid Build Coastguard Worker }
225*f6dc9357SAndroid Build Coastguard Worker
IsPrefixedBy_Ascii_NoCase(const char * s) const226*f6dc9357SAndroid Build Coastguard Worker bool UString::IsPrefixedBy_Ascii_NoCase(const char *s) const throw()
227*f6dc9357SAndroid Build Coastguard Worker {
228*f6dc9357SAndroid Build Coastguard Worker const wchar_t *s1 = _chars;
229*f6dc9357SAndroid Build Coastguard Worker for (;;)
230*f6dc9357SAndroid Build Coastguard Worker {
231*f6dc9357SAndroid Build Coastguard Worker const char c2 = *s++;
232*f6dc9357SAndroid Build Coastguard Worker if (c2 == 0)
233*f6dc9357SAndroid Build Coastguard Worker return true;
234*f6dc9357SAndroid Build Coastguard Worker const wchar_t c1 = *s1++;
235*f6dc9357SAndroid Build Coastguard Worker if (MyCharLower_Ascii(c1) != (unsigned char)MyCharLower_Ascii(c2))
236*f6dc9357SAndroid Build Coastguard Worker return false;
237*f6dc9357SAndroid Build Coastguard Worker }
238*f6dc9357SAndroid Build Coastguard Worker }
239*f6dc9357SAndroid Build Coastguard Worker
StringsAreEqual_Ascii(const char * u,const char * a)240*f6dc9357SAndroid Build Coastguard Worker bool StringsAreEqual_Ascii(const char *u, const char *a) throw()
241*f6dc9357SAndroid Build Coastguard Worker {
242*f6dc9357SAndroid Build Coastguard Worker for (;;)
243*f6dc9357SAndroid Build Coastguard Worker {
244*f6dc9357SAndroid Build Coastguard Worker const char c = *a;
245*f6dc9357SAndroid Build Coastguard Worker if (c != *u)
246*f6dc9357SAndroid Build Coastguard Worker return false;
247*f6dc9357SAndroid Build Coastguard Worker if (c == 0)
248*f6dc9357SAndroid Build Coastguard Worker return true;
249*f6dc9357SAndroid Build Coastguard Worker a++;
250*f6dc9357SAndroid Build Coastguard Worker u++;
251*f6dc9357SAndroid Build Coastguard Worker }
252*f6dc9357SAndroid Build Coastguard Worker }
253*f6dc9357SAndroid Build Coastguard Worker
StringsAreEqual_Ascii(const wchar_t * u,const char * a)254*f6dc9357SAndroid Build Coastguard Worker bool StringsAreEqual_Ascii(const wchar_t *u, const char *a) throw()
255*f6dc9357SAndroid Build Coastguard Worker {
256*f6dc9357SAndroid Build Coastguard Worker for (;;)
257*f6dc9357SAndroid Build Coastguard Worker {
258*f6dc9357SAndroid Build Coastguard Worker const unsigned char c = (unsigned char)*a;
259*f6dc9357SAndroid Build Coastguard Worker if (c != *u)
260*f6dc9357SAndroid Build Coastguard Worker return false;
261*f6dc9357SAndroid Build Coastguard Worker if (c == 0)
262*f6dc9357SAndroid Build Coastguard Worker return true;
263*f6dc9357SAndroid Build Coastguard Worker a++;
264*f6dc9357SAndroid Build Coastguard Worker u++;
265*f6dc9357SAndroid Build Coastguard Worker }
266*f6dc9357SAndroid Build Coastguard Worker }
267*f6dc9357SAndroid Build Coastguard Worker
StringsAreEqualNoCase_Ascii(const char * s1,const char * s2)268*f6dc9357SAndroid Build Coastguard Worker bool StringsAreEqualNoCase_Ascii(const char *s1, const char *s2) throw()
269*f6dc9357SAndroid Build Coastguard Worker {
270*f6dc9357SAndroid Build Coastguard Worker for (;;)
271*f6dc9357SAndroid Build Coastguard Worker {
272*f6dc9357SAndroid Build Coastguard Worker const char c1 = *s1++;
273*f6dc9357SAndroid Build Coastguard Worker const char c2 = *s2++;
274*f6dc9357SAndroid Build Coastguard Worker if (c1 != c2 && MyCharLower_Ascii(c1) != MyCharLower_Ascii(c2))
275*f6dc9357SAndroid Build Coastguard Worker return false;
276*f6dc9357SAndroid Build Coastguard Worker if (c1 == 0)
277*f6dc9357SAndroid Build Coastguard Worker return true;
278*f6dc9357SAndroid Build Coastguard Worker }
279*f6dc9357SAndroid Build Coastguard Worker }
280*f6dc9357SAndroid Build Coastguard Worker
StringsAreEqualNoCase_Ascii(const wchar_t * s1,const wchar_t * s2)281*f6dc9357SAndroid Build Coastguard Worker bool StringsAreEqualNoCase_Ascii(const wchar_t *s1, const wchar_t *s2) throw()
282*f6dc9357SAndroid Build Coastguard Worker {
283*f6dc9357SAndroid Build Coastguard Worker for (;;)
284*f6dc9357SAndroid Build Coastguard Worker {
285*f6dc9357SAndroid Build Coastguard Worker const wchar_t c1 = *s1++;
286*f6dc9357SAndroid Build Coastguard Worker const wchar_t c2 = *s2++;
287*f6dc9357SAndroid Build Coastguard Worker if (c1 != c2 && MyCharLower_Ascii(c1) != MyCharLower_Ascii(c2))
288*f6dc9357SAndroid Build Coastguard Worker return false;
289*f6dc9357SAndroid Build Coastguard Worker if (c1 == 0)
290*f6dc9357SAndroid Build Coastguard Worker return true;
291*f6dc9357SAndroid Build Coastguard Worker }
292*f6dc9357SAndroid Build Coastguard Worker }
293*f6dc9357SAndroid Build Coastguard Worker
StringsAreEqualNoCase_Ascii(const wchar_t * s1,const char * s2)294*f6dc9357SAndroid Build Coastguard Worker bool StringsAreEqualNoCase_Ascii(const wchar_t *s1, const char *s2) throw()
295*f6dc9357SAndroid Build Coastguard Worker {
296*f6dc9357SAndroid Build Coastguard Worker for (;;)
297*f6dc9357SAndroid Build Coastguard Worker {
298*f6dc9357SAndroid Build Coastguard Worker const wchar_t c1 = *s1++;
299*f6dc9357SAndroid Build Coastguard Worker const char c2 = *s2++;
300*f6dc9357SAndroid Build Coastguard Worker if (c1 != (unsigned char)c2 && (c1 > 0x7F || MyCharLower_Ascii(c1) != (unsigned char)MyCharLower_Ascii(c2)))
301*f6dc9357SAndroid Build Coastguard Worker return false;
302*f6dc9357SAndroid Build Coastguard Worker if (c1 == 0)
303*f6dc9357SAndroid Build Coastguard Worker return true;
304*f6dc9357SAndroid Build Coastguard Worker }
305*f6dc9357SAndroid Build Coastguard Worker }
306*f6dc9357SAndroid Build Coastguard Worker
IsString1PrefixedByString2(const wchar_t * s1,const wchar_t * s2)307*f6dc9357SAndroid Build Coastguard Worker bool IsString1PrefixedByString2(const wchar_t *s1, const wchar_t *s2) throw()
308*f6dc9357SAndroid Build Coastguard Worker {
309*f6dc9357SAndroid Build Coastguard Worker for (;;)
310*f6dc9357SAndroid Build Coastguard Worker {
311*f6dc9357SAndroid Build Coastguard Worker const wchar_t c2 = *s2++; if (c2 == 0) return true;
312*f6dc9357SAndroid Build Coastguard Worker const wchar_t c1 = *s1++; if (c1 != c2) return false;
313*f6dc9357SAndroid Build Coastguard Worker }
314*f6dc9357SAndroid Build Coastguard Worker }
315*f6dc9357SAndroid Build Coastguard Worker
IsString1PrefixedByString2(const wchar_t * s1,const char * s2)316*f6dc9357SAndroid Build Coastguard Worker bool IsString1PrefixedByString2(const wchar_t *s1, const char *s2) throw()
317*f6dc9357SAndroid Build Coastguard Worker {
318*f6dc9357SAndroid Build Coastguard Worker for (;;)
319*f6dc9357SAndroid Build Coastguard Worker {
320*f6dc9357SAndroid Build Coastguard Worker const unsigned char c2 = (unsigned char)(*s2++); if (c2 == 0) return true;
321*f6dc9357SAndroid Build Coastguard Worker const wchar_t c1 = *s1++; if (c1 != c2) return false;
322*f6dc9357SAndroid Build Coastguard Worker }
323*f6dc9357SAndroid Build Coastguard Worker }
324*f6dc9357SAndroid Build Coastguard Worker
IsString1PrefixedByString2_NoCase_Ascii(const char * s1,const char * s2)325*f6dc9357SAndroid Build Coastguard Worker bool IsString1PrefixedByString2_NoCase_Ascii(const char *s1, const char *s2) throw()
326*f6dc9357SAndroid Build Coastguard Worker {
327*f6dc9357SAndroid Build Coastguard Worker for (;;)
328*f6dc9357SAndroid Build Coastguard Worker {
329*f6dc9357SAndroid Build Coastguard Worker const char c2 = *s2++; if (c2 == 0) return true;
330*f6dc9357SAndroid Build Coastguard Worker const char c1 = *s1++;
331*f6dc9357SAndroid Build Coastguard Worker if (c1 != c2 && MyCharLower_Ascii(c1) != MyCharLower_Ascii(c2))
332*f6dc9357SAndroid Build Coastguard Worker return false;
333*f6dc9357SAndroid Build Coastguard Worker }
334*f6dc9357SAndroid Build Coastguard Worker }
335*f6dc9357SAndroid Build Coastguard Worker
IsString1PrefixedByString2_NoCase_Ascii(const wchar_t * s1,const char * s2)336*f6dc9357SAndroid Build Coastguard Worker bool IsString1PrefixedByString2_NoCase_Ascii(const wchar_t *s1, const char *s2) throw()
337*f6dc9357SAndroid Build Coastguard Worker {
338*f6dc9357SAndroid Build Coastguard Worker for (;;)
339*f6dc9357SAndroid Build Coastguard Worker {
340*f6dc9357SAndroid Build Coastguard Worker const char c2 = *s2++; if (c2 == 0) return true;
341*f6dc9357SAndroid Build Coastguard Worker const wchar_t c1 = *s1++;
342*f6dc9357SAndroid Build Coastguard Worker if (c1 != (unsigned char)c2 && MyCharLower_Ascii(c1) != (unsigned char)MyCharLower_Ascii(c2))
343*f6dc9357SAndroid Build Coastguard Worker return false;
344*f6dc9357SAndroid Build Coastguard Worker }
345*f6dc9357SAndroid Build Coastguard Worker }
346*f6dc9357SAndroid Build Coastguard Worker
IsString1PrefixedByString2_NoCase(const wchar_t * s1,const wchar_t * s2)347*f6dc9357SAndroid Build Coastguard Worker bool IsString1PrefixedByString2_NoCase(const wchar_t *s1, const wchar_t *s2) throw()
348*f6dc9357SAndroid Build Coastguard Worker {
349*f6dc9357SAndroid Build Coastguard Worker for (;;)
350*f6dc9357SAndroid Build Coastguard Worker {
351*f6dc9357SAndroid Build Coastguard Worker const wchar_t c2 = *s2++; if (c2 == 0) return true;
352*f6dc9357SAndroid Build Coastguard Worker const wchar_t c1 = *s1++;
353*f6dc9357SAndroid Build Coastguard Worker if (c1 != c2 && MyCharUpper(c1) != MyCharUpper(c2))
354*f6dc9357SAndroid Build Coastguard Worker return false;
355*f6dc9357SAndroid Build Coastguard Worker }
356*f6dc9357SAndroid Build Coastguard Worker }
357*f6dc9357SAndroid Build Coastguard Worker
358*f6dc9357SAndroid Build Coastguard Worker // NTFS order: uses upper case
MyStringCompareNoCase(const wchar_t * s1,const wchar_t * s2)359*f6dc9357SAndroid Build Coastguard Worker int MyStringCompareNoCase(const wchar_t *s1, const wchar_t *s2) throw()
360*f6dc9357SAndroid Build Coastguard Worker {
361*f6dc9357SAndroid Build Coastguard Worker for (;;)
362*f6dc9357SAndroid Build Coastguard Worker {
363*f6dc9357SAndroid Build Coastguard Worker const wchar_t c1 = *s1++;
364*f6dc9357SAndroid Build Coastguard Worker const wchar_t c2 = *s2++;
365*f6dc9357SAndroid Build Coastguard Worker if (c1 != c2)
366*f6dc9357SAndroid Build Coastguard Worker {
367*f6dc9357SAndroid Build Coastguard Worker const wchar_t u1 = MyCharUpper(c1);
368*f6dc9357SAndroid Build Coastguard Worker const wchar_t u2 = MyCharUpper(c2);
369*f6dc9357SAndroid Build Coastguard Worker if (u1 < u2) return -1;
370*f6dc9357SAndroid Build Coastguard Worker if (u1 > u2) return 1;
371*f6dc9357SAndroid Build Coastguard Worker }
372*f6dc9357SAndroid Build Coastguard Worker if (c1 == 0) return 0;
373*f6dc9357SAndroid Build Coastguard Worker }
374*f6dc9357SAndroid Build Coastguard Worker }
375*f6dc9357SAndroid Build Coastguard Worker
376*f6dc9357SAndroid Build Coastguard Worker /*
377*f6dc9357SAndroid Build Coastguard Worker int MyStringCompareNoCase_N(const wchar_t *s1, const wchar_t *s2, unsigned num)
378*f6dc9357SAndroid Build Coastguard Worker {
379*f6dc9357SAndroid Build Coastguard Worker for (; num != 0; num--)
380*f6dc9357SAndroid Build Coastguard Worker {
381*f6dc9357SAndroid Build Coastguard Worker wchar_t c1 = *s1++;
382*f6dc9357SAndroid Build Coastguard Worker wchar_t c2 = *s2++;
383*f6dc9357SAndroid Build Coastguard Worker if (c1 != c2)
384*f6dc9357SAndroid Build Coastguard Worker {
385*f6dc9357SAndroid Build Coastguard Worker wchar_t u1 = MyCharUpper(c1);
386*f6dc9357SAndroid Build Coastguard Worker wchar_t u2 = MyCharUpper(c2);
387*f6dc9357SAndroid Build Coastguard Worker if (u1 < u2) return -1;
388*f6dc9357SAndroid Build Coastguard Worker if (u1 > u2) return 1;
389*f6dc9357SAndroid Build Coastguard Worker }
390*f6dc9357SAndroid Build Coastguard Worker if (c1 == 0) return 0;
391*f6dc9357SAndroid Build Coastguard Worker }
392*f6dc9357SAndroid Build Coastguard Worker return 0;
393*f6dc9357SAndroid Build Coastguard Worker }
394*f6dc9357SAndroid Build Coastguard Worker */
395*f6dc9357SAndroid Build Coastguard Worker
396*f6dc9357SAndroid Build Coastguard Worker // ---------- AString ----------
397*f6dc9357SAndroid Build Coastguard Worker
InsertSpace(unsigned & index,unsigned size)398*f6dc9357SAndroid Build Coastguard Worker void AString::InsertSpace(unsigned &index, unsigned size)
399*f6dc9357SAndroid Build Coastguard Worker {
400*f6dc9357SAndroid Build Coastguard Worker Grow(size);
401*f6dc9357SAndroid Build Coastguard Worker MoveItems(index + size, index);
402*f6dc9357SAndroid Build Coastguard Worker }
403*f6dc9357SAndroid Build Coastguard Worker
404*f6dc9357SAndroid Build Coastguard Worker #define k_Alloc_Len_Limit (0x40000000 - 2)
405*f6dc9357SAndroid Build Coastguard Worker // #define k_Alloc_Len_Limit (((unsigned)1 << (sizeof(unsigned) * 8 - 2)) - 2)
406*f6dc9357SAndroid Build Coastguard Worker
ReAlloc(unsigned newLimit)407*f6dc9357SAndroid Build Coastguard Worker void AString::ReAlloc(unsigned newLimit)
408*f6dc9357SAndroid Build Coastguard Worker {
409*f6dc9357SAndroid Build Coastguard Worker // MY_STRING_REALLOC(_chars, char, (size_t)newLimit + 1, (size_t)_len + 1);
410*f6dc9357SAndroid Build Coastguard Worker char *newBuf = MY_STRING_NEW_char((size_t)newLimit + 1);
411*f6dc9357SAndroid Build Coastguard Worker memcpy(newBuf, _chars, (size_t)_len + 1);
412*f6dc9357SAndroid Build Coastguard Worker MY_STRING_DELETE(_chars)
413*f6dc9357SAndroid Build Coastguard Worker _chars = newBuf;
414*f6dc9357SAndroid Build Coastguard Worker _limit = newLimit;
415*f6dc9357SAndroid Build Coastguard Worker }
416*f6dc9357SAndroid Build Coastguard Worker
417*f6dc9357SAndroid Build Coastguard Worker #define THROW_STRING_ALLOC_EXCEPTION { throw 20130220; }
418*f6dc9357SAndroid Build Coastguard Worker
419*f6dc9357SAndroid Build Coastguard Worker #define CHECK_STRING_ALLOC_LEN(len) \
420*f6dc9357SAndroid Build Coastguard Worker { if ((len) > k_Alloc_Len_Limit) THROW_STRING_ALLOC_EXCEPTION }
421*f6dc9357SAndroid Build Coastguard Worker
ReAlloc2(unsigned newLimit)422*f6dc9357SAndroid Build Coastguard Worker void AString::ReAlloc2(unsigned newLimit)
423*f6dc9357SAndroid Build Coastguard Worker {
424*f6dc9357SAndroid Build Coastguard Worker CHECK_STRING_ALLOC_LEN(newLimit)
425*f6dc9357SAndroid Build Coastguard Worker // MY_STRING_REALLOC(_chars, char, (size_t)newLimit + 1, 0);
426*f6dc9357SAndroid Build Coastguard Worker char *newBuf = MY_STRING_NEW_char((size_t)newLimit + 1);
427*f6dc9357SAndroid Build Coastguard Worker newBuf[0] = 0;
428*f6dc9357SAndroid Build Coastguard Worker MY_STRING_DELETE(_chars)
429*f6dc9357SAndroid Build Coastguard Worker _chars = newBuf;
430*f6dc9357SAndroid Build Coastguard Worker _limit = newLimit;
431*f6dc9357SAndroid Build Coastguard Worker _len = 0;
432*f6dc9357SAndroid Build Coastguard Worker }
433*f6dc9357SAndroid Build Coastguard Worker
SetStartLen(unsigned len)434*f6dc9357SAndroid Build Coastguard Worker void AString::SetStartLen(unsigned len)
435*f6dc9357SAndroid Build Coastguard Worker {
436*f6dc9357SAndroid Build Coastguard Worker _chars = NULL;
437*f6dc9357SAndroid Build Coastguard Worker _chars = MY_STRING_NEW_char((size_t)len + 1);
438*f6dc9357SAndroid Build Coastguard Worker _len = len;
439*f6dc9357SAndroid Build Coastguard Worker _limit = len;
440*f6dc9357SAndroid Build Coastguard Worker }
441*f6dc9357SAndroid Build Coastguard Worker
442*f6dc9357SAndroid Build Coastguard Worker Z7_NO_INLINE
Grow_1()443*f6dc9357SAndroid Build Coastguard Worker void AString::Grow_1()
444*f6dc9357SAndroid Build Coastguard Worker {
445*f6dc9357SAndroid Build Coastguard Worker unsigned next = _len;
446*f6dc9357SAndroid Build Coastguard Worker next += next / 2;
447*f6dc9357SAndroid Build Coastguard Worker next += 16;
448*f6dc9357SAndroid Build Coastguard Worker next &= ~(unsigned)15;
449*f6dc9357SAndroid Build Coastguard Worker next--;
450*f6dc9357SAndroid Build Coastguard Worker if (next < _len || next > k_Alloc_Len_Limit)
451*f6dc9357SAndroid Build Coastguard Worker next = k_Alloc_Len_Limit;
452*f6dc9357SAndroid Build Coastguard Worker if (next <= _len)
453*f6dc9357SAndroid Build Coastguard Worker THROW_STRING_ALLOC_EXCEPTION
454*f6dc9357SAndroid Build Coastguard Worker ReAlloc(next);
455*f6dc9357SAndroid Build Coastguard Worker // Grow(1);
456*f6dc9357SAndroid Build Coastguard Worker }
457*f6dc9357SAndroid Build Coastguard Worker
Grow(unsigned n)458*f6dc9357SAndroid Build Coastguard Worker void AString::Grow(unsigned n)
459*f6dc9357SAndroid Build Coastguard Worker {
460*f6dc9357SAndroid Build Coastguard Worker const unsigned freeSize = _limit - _len;
461*f6dc9357SAndroid Build Coastguard Worker if (n <= freeSize)
462*f6dc9357SAndroid Build Coastguard Worker return;
463*f6dc9357SAndroid Build Coastguard Worker unsigned next = _len + n;
464*f6dc9357SAndroid Build Coastguard Worker next += next / 2;
465*f6dc9357SAndroid Build Coastguard Worker next += 16;
466*f6dc9357SAndroid Build Coastguard Worker next &= ~(unsigned)15;
467*f6dc9357SAndroid Build Coastguard Worker next--;
468*f6dc9357SAndroid Build Coastguard Worker if (next < _len || next > k_Alloc_Len_Limit)
469*f6dc9357SAndroid Build Coastguard Worker next = k_Alloc_Len_Limit;
470*f6dc9357SAndroid Build Coastguard Worker if (next <= _len || next - _len < n)
471*f6dc9357SAndroid Build Coastguard Worker THROW_STRING_ALLOC_EXCEPTION
472*f6dc9357SAndroid Build Coastguard Worker ReAlloc(next);
473*f6dc9357SAndroid Build Coastguard Worker }
474*f6dc9357SAndroid Build Coastguard Worker
AString(unsigned num,const char * s)475*f6dc9357SAndroid Build Coastguard Worker AString::AString(unsigned num, const char *s)
476*f6dc9357SAndroid Build Coastguard Worker {
477*f6dc9357SAndroid Build Coastguard Worker unsigned len = MyStringLen(s);
478*f6dc9357SAndroid Build Coastguard Worker if (num > len)
479*f6dc9357SAndroid Build Coastguard Worker num = len;
480*f6dc9357SAndroid Build Coastguard Worker SetStartLen(num);
481*f6dc9357SAndroid Build Coastguard Worker memcpy(_chars, s, num);
482*f6dc9357SAndroid Build Coastguard Worker _chars[num] = 0;
483*f6dc9357SAndroid Build Coastguard Worker }
484*f6dc9357SAndroid Build Coastguard Worker
AString(unsigned num,const AString & s)485*f6dc9357SAndroid Build Coastguard Worker AString::AString(unsigned num, const AString &s)
486*f6dc9357SAndroid Build Coastguard Worker {
487*f6dc9357SAndroid Build Coastguard Worker if (num > s._len)
488*f6dc9357SAndroid Build Coastguard Worker num = s._len;
489*f6dc9357SAndroid Build Coastguard Worker SetStartLen(num);
490*f6dc9357SAndroid Build Coastguard Worker memcpy(_chars, s._chars, num);
491*f6dc9357SAndroid Build Coastguard Worker _chars[num] = 0;
492*f6dc9357SAndroid Build Coastguard Worker }
493*f6dc9357SAndroid Build Coastguard Worker
AString(const AString & s,char c)494*f6dc9357SAndroid Build Coastguard Worker AString::AString(const AString &s, char c)
495*f6dc9357SAndroid Build Coastguard Worker {
496*f6dc9357SAndroid Build Coastguard Worker SetStartLen(s.Len() + 1);
497*f6dc9357SAndroid Build Coastguard Worker char *chars = _chars;
498*f6dc9357SAndroid Build Coastguard Worker unsigned len = s.Len();
499*f6dc9357SAndroid Build Coastguard Worker memcpy(chars, s, len);
500*f6dc9357SAndroid Build Coastguard Worker chars[len] = c;
501*f6dc9357SAndroid Build Coastguard Worker chars[(size_t)len + 1] = 0;
502*f6dc9357SAndroid Build Coastguard Worker }
503*f6dc9357SAndroid Build Coastguard Worker
AString(const char * s1,unsigned num1,const char * s2,unsigned num2)504*f6dc9357SAndroid Build Coastguard Worker AString::AString(const char *s1, unsigned num1, const char *s2, unsigned num2)
505*f6dc9357SAndroid Build Coastguard Worker {
506*f6dc9357SAndroid Build Coastguard Worker SetStartLen(num1 + num2);
507*f6dc9357SAndroid Build Coastguard Worker char *chars = _chars;
508*f6dc9357SAndroid Build Coastguard Worker memcpy(chars, s1, num1);
509*f6dc9357SAndroid Build Coastguard Worker memcpy(chars + num1, s2, num2 + 1);
510*f6dc9357SAndroid Build Coastguard Worker }
511*f6dc9357SAndroid Build Coastguard Worker
operator +(const AString & s1,const AString & s2)512*f6dc9357SAndroid Build Coastguard Worker AString operator+(const AString &s1, const AString &s2) { return AString(s1, s1.Len(), s2, s2.Len()); }
operator +(const AString & s1,const char * s2)513*f6dc9357SAndroid Build Coastguard Worker AString operator+(const AString &s1, const char *s2) { return AString(s1, s1.Len(), s2, MyStringLen(s2)); }
operator +(const char * s1,const AString & s2)514*f6dc9357SAndroid Build Coastguard Worker AString operator+(const char *s1, const AString &s2) { return AString(s1, MyStringLen(s1), s2, s2.Len()); }
515*f6dc9357SAndroid Build Coastguard Worker
516*f6dc9357SAndroid Build Coastguard Worker static const unsigned kStartStringCapacity = 4;
517*f6dc9357SAndroid Build Coastguard Worker
AString()518*f6dc9357SAndroid Build Coastguard Worker AString::AString()
519*f6dc9357SAndroid Build Coastguard Worker {
520*f6dc9357SAndroid Build Coastguard Worker _chars = NULL;
521*f6dc9357SAndroid Build Coastguard Worker _chars = MY_STRING_NEW_char(kStartStringCapacity);
522*f6dc9357SAndroid Build Coastguard Worker _len = 0;
523*f6dc9357SAndroid Build Coastguard Worker _limit = kStartStringCapacity - 1;
524*f6dc9357SAndroid Build Coastguard Worker _chars[0] = 0;
525*f6dc9357SAndroid Build Coastguard Worker }
526*f6dc9357SAndroid Build Coastguard Worker
AString(char c)527*f6dc9357SAndroid Build Coastguard Worker AString::AString(char c)
528*f6dc9357SAndroid Build Coastguard Worker {
529*f6dc9357SAndroid Build Coastguard Worker SetStartLen(1);
530*f6dc9357SAndroid Build Coastguard Worker char *chars = _chars;
531*f6dc9357SAndroid Build Coastguard Worker chars[0] = c;
532*f6dc9357SAndroid Build Coastguard Worker chars[1] = 0;
533*f6dc9357SAndroid Build Coastguard Worker }
534*f6dc9357SAndroid Build Coastguard Worker
AString(const char * s)535*f6dc9357SAndroid Build Coastguard Worker AString::AString(const char *s)
536*f6dc9357SAndroid Build Coastguard Worker {
537*f6dc9357SAndroid Build Coastguard Worker SetStartLen(MyStringLen(s));
538*f6dc9357SAndroid Build Coastguard Worker MyStringCopy(_chars, s);
539*f6dc9357SAndroid Build Coastguard Worker }
540*f6dc9357SAndroid Build Coastguard Worker
AString(const AString & s)541*f6dc9357SAndroid Build Coastguard Worker AString::AString(const AString &s)
542*f6dc9357SAndroid Build Coastguard Worker {
543*f6dc9357SAndroid Build Coastguard Worker SetStartLen(s._len);
544*f6dc9357SAndroid Build Coastguard Worker MyStringCopy(_chars, s._chars);
545*f6dc9357SAndroid Build Coastguard Worker }
546*f6dc9357SAndroid Build Coastguard Worker
operator =(char c)547*f6dc9357SAndroid Build Coastguard Worker AString &AString::operator=(char c)
548*f6dc9357SAndroid Build Coastguard Worker {
549*f6dc9357SAndroid Build Coastguard Worker if (1 > _limit)
550*f6dc9357SAndroid Build Coastguard Worker {
551*f6dc9357SAndroid Build Coastguard Worker char *newBuf = MY_STRING_NEW_char(1 + 1);
552*f6dc9357SAndroid Build Coastguard Worker MY_STRING_DELETE(_chars)
553*f6dc9357SAndroid Build Coastguard Worker _chars = newBuf;
554*f6dc9357SAndroid Build Coastguard Worker _limit = 1;
555*f6dc9357SAndroid Build Coastguard Worker }
556*f6dc9357SAndroid Build Coastguard Worker _len = 1;
557*f6dc9357SAndroid Build Coastguard Worker char *chars = _chars;
558*f6dc9357SAndroid Build Coastguard Worker chars[0] = c;
559*f6dc9357SAndroid Build Coastguard Worker chars[1] = 0;
560*f6dc9357SAndroid Build Coastguard Worker return *this;
561*f6dc9357SAndroid Build Coastguard Worker }
562*f6dc9357SAndroid Build Coastguard Worker
operator =(const char * s)563*f6dc9357SAndroid Build Coastguard Worker AString &AString::operator=(const char *s)
564*f6dc9357SAndroid Build Coastguard Worker {
565*f6dc9357SAndroid Build Coastguard Worker unsigned len = MyStringLen(s);
566*f6dc9357SAndroid Build Coastguard Worker if (len > _limit)
567*f6dc9357SAndroid Build Coastguard Worker {
568*f6dc9357SAndroid Build Coastguard Worker char *newBuf = MY_STRING_NEW_char((size_t)len + 1);
569*f6dc9357SAndroid Build Coastguard Worker MY_STRING_DELETE(_chars)
570*f6dc9357SAndroid Build Coastguard Worker _chars = newBuf;
571*f6dc9357SAndroid Build Coastguard Worker _limit = len;
572*f6dc9357SAndroid Build Coastguard Worker }
573*f6dc9357SAndroid Build Coastguard Worker _len = len;
574*f6dc9357SAndroid Build Coastguard Worker MyStringCopy(_chars, s);
575*f6dc9357SAndroid Build Coastguard Worker return *this;
576*f6dc9357SAndroid Build Coastguard Worker }
577*f6dc9357SAndroid Build Coastguard Worker
operator =(const AString & s)578*f6dc9357SAndroid Build Coastguard Worker AString &AString::operator=(const AString &s)
579*f6dc9357SAndroid Build Coastguard Worker {
580*f6dc9357SAndroid Build Coastguard Worker if (&s == this)
581*f6dc9357SAndroid Build Coastguard Worker return *this;
582*f6dc9357SAndroid Build Coastguard Worker unsigned len = s._len;
583*f6dc9357SAndroid Build Coastguard Worker if (len > _limit)
584*f6dc9357SAndroid Build Coastguard Worker {
585*f6dc9357SAndroid Build Coastguard Worker char *newBuf = MY_STRING_NEW_char((size_t)len + 1);
586*f6dc9357SAndroid Build Coastguard Worker MY_STRING_DELETE(_chars)
587*f6dc9357SAndroid Build Coastguard Worker _chars = newBuf;
588*f6dc9357SAndroid Build Coastguard Worker _limit = len;
589*f6dc9357SAndroid Build Coastguard Worker }
590*f6dc9357SAndroid Build Coastguard Worker _len = len;
591*f6dc9357SAndroid Build Coastguard Worker MyStringCopy(_chars, s._chars);
592*f6dc9357SAndroid Build Coastguard Worker return *this;
593*f6dc9357SAndroid Build Coastguard Worker }
594*f6dc9357SAndroid Build Coastguard Worker
SetFromWStr_if_Ascii(const wchar_t * s)595*f6dc9357SAndroid Build Coastguard Worker void AString::SetFromWStr_if_Ascii(const wchar_t *s)
596*f6dc9357SAndroid Build Coastguard Worker {
597*f6dc9357SAndroid Build Coastguard Worker unsigned len = 0;
598*f6dc9357SAndroid Build Coastguard Worker {
599*f6dc9357SAndroid Build Coastguard Worker for (;; len++)
600*f6dc9357SAndroid Build Coastguard Worker {
601*f6dc9357SAndroid Build Coastguard Worker wchar_t c = s[len];
602*f6dc9357SAndroid Build Coastguard Worker if (c == 0)
603*f6dc9357SAndroid Build Coastguard Worker break;
604*f6dc9357SAndroid Build Coastguard Worker if (c >= 0x80)
605*f6dc9357SAndroid Build Coastguard Worker return;
606*f6dc9357SAndroid Build Coastguard Worker }
607*f6dc9357SAndroid Build Coastguard Worker }
608*f6dc9357SAndroid Build Coastguard Worker if (len > _limit)
609*f6dc9357SAndroid Build Coastguard Worker {
610*f6dc9357SAndroid Build Coastguard Worker char *newBuf = MY_STRING_NEW_char((size_t)len + 1);
611*f6dc9357SAndroid Build Coastguard Worker MY_STRING_DELETE(_chars)
612*f6dc9357SAndroid Build Coastguard Worker _chars = newBuf;
613*f6dc9357SAndroid Build Coastguard Worker _limit = len;
614*f6dc9357SAndroid Build Coastguard Worker }
615*f6dc9357SAndroid Build Coastguard Worker _len = len;
616*f6dc9357SAndroid Build Coastguard Worker char *dest = _chars;
617*f6dc9357SAndroid Build Coastguard Worker unsigned i;
618*f6dc9357SAndroid Build Coastguard Worker for (i = 0; i < len; i++)
619*f6dc9357SAndroid Build Coastguard Worker dest[i] = (char)s[i];
620*f6dc9357SAndroid Build Coastguard Worker dest[i] = 0;
621*f6dc9357SAndroid Build Coastguard Worker }
622*f6dc9357SAndroid Build Coastguard Worker
623*f6dc9357SAndroid Build Coastguard Worker /*
624*f6dc9357SAndroid Build Coastguard Worker void AString::SetFromBstr_if_Ascii(BSTR s)
625*f6dc9357SAndroid Build Coastguard Worker {
626*f6dc9357SAndroid Build Coastguard Worker unsigned len = ::SysStringLen(s);
627*f6dc9357SAndroid Build Coastguard Worker {
628*f6dc9357SAndroid Build Coastguard Worker for (unsigned i = 0; i < len; i++)
629*f6dc9357SAndroid Build Coastguard Worker if (s[i] <= 0 || s[i] >= 0x80)
630*f6dc9357SAndroid Build Coastguard Worker return;
631*f6dc9357SAndroid Build Coastguard Worker }
632*f6dc9357SAndroid Build Coastguard Worker if (len > _limit)
633*f6dc9357SAndroid Build Coastguard Worker {
634*f6dc9357SAndroid Build Coastguard Worker char *newBuf = MY_STRING_NEW_char((size_t)len + 1);
635*f6dc9357SAndroid Build Coastguard Worker MY_STRING_DELETE(_chars)
636*f6dc9357SAndroid Build Coastguard Worker _chars = newBuf;
637*f6dc9357SAndroid Build Coastguard Worker _limit = len;
638*f6dc9357SAndroid Build Coastguard Worker }
639*f6dc9357SAndroid Build Coastguard Worker _len = len;
640*f6dc9357SAndroid Build Coastguard Worker char *dest = _chars;
641*f6dc9357SAndroid Build Coastguard Worker unsigned i;
642*f6dc9357SAndroid Build Coastguard Worker for (i = 0; i < len; i++)
643*f6dc9357SAndroid Build Coastguard Worker dest[i] = (char)s[i];
644*f6dc9357SAndroid Build Coastguard Worker dest[i] = 0;
645*f6dc9357SAndroid Build Coastguard Worker }
646*f6dc9357SAndroid Build Coastguard Worker */
647*f6dc9357SAndroid Build Coastguard Worker
Add_Char(char c)648*f6dc9357SAndroid Build Coastguard Worker void AString::Add_Char(char c) { operator+=(c); }
Add_Space()649*f6dc9357SAndroid Build Coastguard Worker void AString::Add_Space() { operator+=(' '); }
Add_Space_if_NotEmpty()650*f6dc9357SAndroid Build Coastguard Worker void AString::Add_Space_if_NotEmpty() { if (!IsEmpty()) Add_Space(); }
Add_LF()651*f6dc9357SAndroid Build Coastguard Worker void AString::Add_LF() { operator+=('\n'); }
Add_Slash()652*f6dc9357SAndroid Build Coastguard Worker void AString::Add_Slash() { operator+=('/'); }
Add_Dot()653*f6dc9357SAndroid Build Coastguard Worker void AString::Add_Dot() { operator+=('.'); }
Add_Minus()654*f6dc9357SAndroid Build Coastguard Worker void AString::Add_Minus() { operator+=('-'); }
Add_Colon()655*f6dc9357SAndroid Build Coastguard Worker void AString::Add_Colon() { operator+=(':'); }
656*f6dc9357SAndroid Build Coastguard Worker
operator +=(const char * s)657*f6dc9357SAndroid Build Coastguard Worker AString &AString::operator+=(const char *s)
658*f6dc9357SAndroid Build Coastguard Worker {
659*f6dc9357SAndroid Build Coastguard Worker unsigned len = MyStringLen(s);
660*f6dc9357SAndroid Build Coastguard Worker Grow(len);
661*f6dc9357SAndroid Build Coastguard Worker MyStringCopy(_chars + _len, s);
662*f6dc9357SAndroid Build Coastguard Worker _len += len;
663*f6dc9357SAndroid Build Coastguard Worker return *this;
664*f6dc9357SAndroid Build Coastguard Worker }
665*f6dc9357SAndroid Build Coastguard Worker
Add_OptSpaced(const char * s)666*f6dc9357SAndroid Build Coastguard Worker void AString::Add_OptSpaced(const char *s)
667*f6dc9357SAndroid Build Coastguard Worker {
668*f6dc9357SAndroid Build Coastguard Worker Add_Space_if_NotEmpty();
669*f6dc9357SAndroid Build Coastguard Worker (*this) += s;
670*f6dc9357SAndroid Build Coastguard Worker }
671*f6dc9357SAndroid Build Coastguard Worker
operator +=(const AString & s)672*f6dc9357SAndroid Build Coastguard Worker AString &AString::operator+=(const AString &s)
673*f6dc9357SAndroid Build Coastguard Worker {
674*f6dc9357SAndroid Build Coastguard Worker Grow(s._len);
675*f6dc9357SAndroid Build Coastguard Worker MyStringCopy(_chars + _len, s._chars);
676*f6dc9357SAndroid Build Coastguard Worker _len += s._len;
677*f6dc9357SAndroid Build Coastguard Worker return *this;
678*f6dc9357SAndroid Build Coastguard Worker }
679*f6dc9357SAndroid Build Coastguard Worker
Add_UInt32(UInt32 v)680*f6dc9357SAndroid Build Coastguard Worker void AString::Add_UInt32(UInt32 v)
681*f6dc9357SAndroid Build Coastguard Worker {
682*f6dc9357SAndroid Build Coastguard Worker Grow(10);
683*f6dc9357SAndroid Build Coastguard Worker _len = (unsigned)(ConvertUInt32ToString(v, _chars + _len) - _chars);
684*f6dc9357SAndroid Build Coastguard Worker }
685*f6dc9357SAndroid Build Coastguard Worker
Add_UInt64(UInt64 v)686*f6dc9357SAndroid Build Coastguard Worker void UString::Add_UInt64(UInt64 v)
687*f6dc9357SAndroid Build Coastguard Worker {
688*f6dc9357SAndroid Build Coastguard Worker Grow(20);
689*f6dc9357SAndroid Build Coastguard Worker _len = (unsigned)(ConvertUInt64ToString(v, _chars + _len) - _chars);
690*f6dc9357SAndroid Build Coastguard Worker }
691*f6dc9357SAndroid Build Coastguard Worker
AddFrom(const char * s,unsigned len)692*f6dc9357SAndroid Build Coastguard Worker void AString::AddFrom(const char *s, unsigned len) // no check
693*f6dc9357SAndroid Build Coastguard Worker {
694*f6dc9357SAndroid Build Coastguard Worker if (len != 0)
695*f6dc9357SAndroid Build Coastguard Worker {
696*f6dc9357SAndroid Build Coastguard Worker Grow(len);
697*f6dc9357SAndroid Build Coastguard Worker memcpy(_chars + _len, s, len);
698*f6dc9357SAndroid Build Coastguard Worker len += _len;
699*f6dc9357SAndroid Build Coastguard Worker _chars[len] = 0;
700*f6dc9357SAndroid Build Coastguard Worker _len = len;
701*f6dc9357SAndroid Build Coastguard Worker }
702*f6dc9357SAndroid Build Coastguard Worker }
703*f6dc9357SAndroid Build Coastguard Worker
SetFrom(const char * s,unsigned len)704*f6dc9357SAndroid Build Coastguard Worker void AString::SetFrom(const char *s, unsigned len) // no check
705*f6dc9357SAndroid Build Coastguard Worker {
706*f6dc9357SAndroid Build Coastguard Worker if (len > _limit)
707*f6dc9357SAndroid Build Coastguard Worker {
708*f6dc9357SAndroid Build Coastguard Worker CHECK_STRING_ALLOC_LEN(len)
709*f6dc9357SAndroid Build Coastguard Worker char *newBuf = MY_STRING_NEW_char((size_t)len + 1);
710*f6dc9357SAndroid Build Coastguard Worker MY_STRING_DELETE(_chars)
711*f6dc9357SAndroid Build Coastguard Worker _chars = newBuf;
712*f6dc9357SAndroid Build Coastguard Worker _limit = len;
713*f6dc9357SAndroid Build Coastguard Worker }
714*f6dc9357SAndroid Build Coastguard Worker if (len != 0)
715*f6dc9357SAndroid Build Coastguard Worker memcpy(_chars, s, len);
716*f6dc9357SAndroid Build Coastguard Worker _chars[len] = 0;
717*f6dc9357SAndroid Build Coastguard Worker _len = len;
718*f6dc9357SAndroid Build Coastguard Worker }
719*f6dc9357SAndroid Build Coastguard Worker
SetFrom_Chars_SizeT(const char * s,size_t len)720*f6dc9357SAndroid Build Coastguard Worker void AString::SetFrom_Chars_SizeT(const char *s, size_t len)
721*f6dc9357SAndroid Build Coastguard Worker {
722*f6dc9357SAndroid Build Coastguard Worker CHECK_STRING_ALLOC_LEN(len)
723*f6dc9357SAndroid Build Coastguard Worker SetFrom(s, (unsigned)len);
724*f6dc9357SAndroid Build Coastguard Worker }
725*f6dc9357SAndroid Build Coastguard Worker
SetFrom_CalcLen(const char * s,unsigned len)726*f6dc9357SAndroid Build Coastguard Worker void AString::SetFrom_CalcLen(const char *s, unsigned len) // no check
727*f6dc9357SAndroid Build Coastguard Worker {
728*f6dc9357SAndroid Build Coastguard Worker unsigned i;
729*f6dc9357SAndroid Build Coastguard Worker for (i = 0; i < len; i++)
730*f6dc9357SAndroid Build Coastguard Worker if (s[i] == 0)
731*f6dc9357SAndroid Build Coastguard Worker break;
732*f6dc9357SAndroid Build Coastguard Worker SetFrom(s, i);
733*f6dc9357SAndroid Build Coastguard Worker }
734*f6dc9357SAndroid Build Coastguard Worker
Find(const char * s,unsigned startIndex) const735*f6dc9357SAndroid Build Coastguard Worker int AString::Find(const char *s, unsigned startIndex) const throw()
736*f6dc9357SAndroid Build Coastguard Worker {
737*f6dc9357SAndroid Build Coastguard Worker const char *fs = strstr(_chars + startIndex, s);
738*f6dc9357SAndroid Build Coastguard Worker if (!fs)
739*f6dc9357SAndroid Build Coastguard Worker return -1;
740*f6dc9357SAndroid Build Coastguard Worker return (int)(fs - _chars);
741*f6dc9357SAndroid Build Coastguard Worker
742*f6dc9357SAndroid Build Coastguard Worker /*
743*f6dc9357SAndroid Build Coastguard Worker if (s[0] == 0)
744*f6dc9357SAndroid Build Coastguard Worker return startIndex;
745*f6dc9357SAndroid Build Coastguard Worker unsigned len = MyStringLen(s);
746*f6dc9357SAndroid Build Coastguard Worker const char *p = _chars + startIndex;
747*f6dc9357SAndroid Build Coastguard Worker for (;; p++)
748*f6dc9357SAndroid Build Coastguard Worker {
749*f6dc9357SAndroid Build Coastguard Worker const char c = *p;
750*f6dc9357SAndroid Build Coastguard Worker if (c != s[0])
751*f6dc9357SAndroid Build Coastguard Worker {
752*f6dc9357SAndroid Build Coastguard Worker if (c == 0)
753*f6dc9357SAndroid Build Coastguard Worker return -1;
754*f6dc9357SAndroid Build Coastguard Worker continue;
755*f6dc9357SAndroid Build Coastguard Worker }
756*f6dc9357SAndroid Build Coastguard Worker unsigned i;
757*f6dc9357SAndroid Build Coastguard Worker for (i = 1; i < len; i++)
758*f6dc9357SAndroid Build Coastguard Worker if (p[i] != s[i])
759*f6dc9357SAndroid Build Coastguard Worker break;
760*f6dc9357SAndroid Build Coastguard Worker if (i == len)
761*f6dc9357SAndroid Build Coastguard Worker return (int)(p - _chars);
762*f6dc9357SAndroid Build Coastguard Worker }
763*f6dc9357SAndroid Build Coastguard Worker */
764*f6dc9357SAndroid Build Coastguard Worker }
765*f6dc9357SAndroid Build Coastguard Worker
ReverseFind(char c) const766*f6dc9357SAndroid Build Coastguard Worker int AString::ReverseFind(char c) const throw()
767*f6dc9357SAndroid Build Coastguard Worker {
768*f6dc9357SAndroid Build Coastguard Worker if (_len == 0)
769*f6dc9357SAndroid Build Coastguard Worker return -1;
770*f6dc9357SAndroid Build Coastguard Worker const char *p = _chars + _len - 1;
771*f6dc9357SAndroid Build Coastguard Worker for (;;)
772*f6dc9357SAndroid Build Coastguard Worker {
773*f6dc9357SAndroid Build Coastguard Worker if (*p == c)
774*f6dc9357SAndroid Build Coastguard Worker return (int)(p - _chars);
775*f6dc9357SAndroid Build Coastguard Worker if (p == _chars)
776*f6dc9357SAndroid Build Coastguard Worker return -1;
777*f6dc9357SAndroid Build Coastguard Worker p--; // p = GetPrevCharPointer(_chars, p);
778*f6dc9357SAndroid Build Coastguard Worker }
779*f6dc9357SAndroid Build Coastguard Worker }
780*f6dc9357SAndroid Build Coastguard Worker
ReverseFind_PathSepar() const781*f6dc9357SAndroid Build Coastguard Worker int AString::ReverseFind_PathSepar() const throw()
782*f6dc9357SAndroid Build Coastguard Worker {
783*f6dc9357SAndroid Build Coastguard Worker if (_len == 0)
784*f6dc9357SAndroid Build Coastguard Worker return -1;
785*f6dc9357SAndroid Build Coastguard Worker const char *p = _chars + _len - 1;
786*f6dc9357SAndroid Build Coastguard Worker for (;;)
787*f6dc9357SAndroid Build Coastguard Worker {
788*f6dc9357SAndroid Build Coastguard Worker const char c = *p;
789*f6dc9357SAndroid Build Coastguard Worker if (IS_PATH_SEPAR(c))
790*f6dc9357SAndroid Build Coastguard Worker return (int)(p - _chars);
791*f6dc9357SAndroid Build Coastguard Worker if (p == _chars)
792*f6dc9357SAndroid Build Coastguard Worker return -1;
793*f6dc9357SAndroid Build Coastguard Worker p--;
794*f6dc9357SAndroid Build Coastguard Worker }
795*f6dc9357SAndroid Build Coastguard Worker }
796*f6dc9357SAndroid Build Coastguard Worker
TrimLeft()797*f6dc9357SAndroid Build Coastguard Worker void AString::TrimLeft() throw()
798*f6dc9357SAndroid Build Coastguard Worker {
799*f6dc9357SAndroid Build Coastguard Worker const char *p = _chars;
800*f6dc9357SAndroid Build Coastguard Worker for (;; p++)
801*f6dc9357SAndroid Build Coastguard Worker {
802*f6dc9357SAndroid Build Coastguard Worker char c = *p;
803*f6dc9357SAndroid Build Coastguard Worker if (c != ' ' && c != '\n' && c != '\t')
804*f6dc9357SAndroid Build Coastguard Worker break;
805*f6dc9357SAndroid Build Coastguard Worker }
806*f6dc9357SAndroid Build Coastguard Worker unsigned pos = (unsigned)(p - _chars);
807*f6dc9357SAndroid Build Coastguard Worker if (pos != 0)
808*f6dc9357SAndroid Build Coastguard Worker {
809*f6dc9357SAndroid Build Coastguard Worker MoveItems(0, pos);
810*f6dc9357SAndroid Build Coastguard Worker _len -= pos;
811*f6dc9357SAndroid Build Coastguard Worker }
812*f6dc9357SAndroid Build Coastguard Worker }
813*f6dc9357SAndroid Build Coastguard Worker
TrimRight()814*f6dc9357SAndroid Build Coastguard Worker void AString::TrimRight() throw()
815*f6dc9357SAndroid Build Coastguard Worker {
816*f6dc9357SAndroid Build Coastguard Worker const char *p = _chars;
817*f6dc9357SAndroid Build Coastguard Worker unsigned i;
818*f6dc9357SAndroid Build Coastguard Worker for (i = _len; i != 0; i--)
819*f6dc9357SAndroid Build Coastguard Worker {
820*f6dc9357SAndroid Build Coastguard Worker char c = p[(size_t)i - 1];
821*f6dc9357SAndroid Build Coastguard Worker if (c != ' ' && c != '\n' && c != '\t')
822*f6dc9357SAndroid Build Coastguard Worker break;
823*f6dc9357SAndroid Build Coastguard Worker }
824*f6dc9357SAndroid Build Coastguard Worker if (i != _len)
825*f6dc9357SAndroid Build Coastguard Worker {
826*f6dc9357SAndroid Build Coastguard Worker _chars[i] = 0;
827*f6dc9357SAndroid Build Coastguard Worker _len = i;
828*f6dc9357SAndroid Build Coastguard Worker }
829*f6dc9357SAndroid Build Coastguard Worker }
830*f6dc9357SAndroid Build Coastguard Worker
InsertAtFront(char c)831*f6dc9357SAndroid Build Coastguard Worker void AString::InsertAtFront(char c)
832*f6dc9357SAndroid Build Coastguard Worker {
833*f6dc9357SAndroid Build Coastguard Worker if (_limit == _len)
834*f6dc9357SAndroid Build Coastguard Worker Grow_1();
835*f6dc9357SAndroid Build Coastguard Worker MoveItems(1, 0);
836*f6dc9357SAndroid Build Coastguard Worker _chars[0] = c;
837*f6dc9357SAndroid Build Coastguard Worker _len++;
838*f6dc9357SAndroid Build Coastguard Worker }
839*f6dc9357SAndroid Build Coastguard Worker
840*f6dc9357SAndroid Build Coastguard Worker /*
841*f6dc9357SAndroid Build Coastguard Worker void AString::Insert(unsigned index, char c)
842*f6dc9357SAndroid Build Coastguard Worker {
843*f6dc9357SAndroid Build Coastguard Worker InsertSpace(index, 1);
844*f6dc9357SAndroid Build Coastguard Worker _chars[index] = c;
845*f6dc9357SAndroid Build Coastguard Worker _len++;
846*f6dc9357SAndroid Build Coastguard Worker }
847*f6dc9357SAndroid Build Coastguard Worker */
848*f6dc9357SAndroid Build Coastguard Worker
Insert(unsigned index,const char * s)849*f6dc9357SAndroid Build Coastguard Worker void AString::Insert(unsigned index, const char *s)
850*f6dc9357SAndroid Build Coastguard Worker {
851*f6dc9357SAndroid Build Coastguard Worker unsigned num = MyStringLen(s);
852*f6dc9357SAndroid Build Coastguard Worker if (num != 0)
853*f6dc9357SAndroid Build Coastguard Worker {
854*f6dc9357SAndroid Build Coastguard Worker InsertSpace(index, num);
855*f6dc9357SAndroid Build Coastguard Worker memcpy(_chars + index, s, num);
856*f6dc9357SAndroid Build Coastguard Worker _len += num;
857*f6dc9357SAndroid Build Coastguard Worker }
858*f6dc9357SAndroid Build Coastguard Worker }
859*f6dc9357SAndroid Build Coastguard Worker
Insert(unsigned index,const AString & s)860*f6dc9357SAndroid Build Coastguard Worker void AString::Insert(unsigned index, const AString &s)
861*f6dc9357SAndroid Build Coastguard Worker {
862*f6dc9357SAndroid Build Coastguard Worker unsigned num = s.Len();
863*f6dc9357SAndroid Build Coastguard Worker if (num != 0)
864*f6dc9357SAndroid Build Coastguard Worker {
865*f6dc9357SAndroid Build Coastguard Worker InsertSpace(index, num);
866*f6dc9357SAndroid Build Coastguard Worker memcpy(_chars + index, s, num);
867*f6dc9357SAndroid Build Coastguard Worker _len += num;
868*f6dc9357SAndroid Build Coastguard Worker }
869*f6dc9357SAndroid Build Coastguard Worker }
870*f6dc9357SAndroid Build Coastguard Worker
RemoveChar(char ch)871*f6dc9357SAndroid Build Coastguard Worker void AString::RemoveChar(char ch) throw()
872*f6dc9357SAndroid Build Coastguard Worker {
873*f6dc9357SAndroid Build Coastguard Worker char *src = _chars;
874*f6dc9357SAndroid Build Coastguard Worker
875*f6dc9357SAndroid Build Coastguard Worker for (;;)
876*f6dc9357SAndroid Build Coastguard Worker {
877*f6dc9357SAndroid Build Coastguard Worker char c = *src++;
878*f6dc9357SAndroid Build Coastguard Worker if (c == 0)
879*f6dc9357SAndroid Build Coastguard Worker return;
880*f6dc9357SAndroid Build Coastguard Worker if (c == ch)
881*f6dc9357SAndroid Build Coastguard Worker break;
882*f6dc9357SAndroid Build Coastguard Worker }
883*f6dc9357SAndroid Build Coastguard Worker
884*f6dc9357SAndroid Build Coastguard Worker char *dest = src - 1;
885*f6dc9357SAndroid Build Coastguard Worker
886*f6dc9357SAndroid Build Coastguard Worker for (;;)
887*f6dc9357SAndroid Build Coastguard Worker {
888*f6dc9357SAndroid Build Coastguard Worker char c = *src++;
889*f6dc9357SAndroid Build Coastguard Worker if (c == 0)
890*f6dc9357SAndroid Build Coastguard Worker break;
891*f6dc9357SAndroid Build Coastguard Worker if (c != ch)
892*f6dc9357SAndroid Build Coastguard Worker *dest++ = c;
893*f6dc9357SAndroid Build Coastguard Worker }
894*f6dc9357SAndroid Build Coastguard Worker
895*f6dc9357SAndroid Build Coastguard Worker *dest = 0;
896*f6dc9357SAndroid Build Coastguard Worker _len = (unsigned)(dest - _chars);
897*f6dc9357SAndroid Build Coastguard Worker }
898*f6dc9357SAndroid Build Coastguard Worker
899*f6dc9357SAndroid Build Coastguard Worker // !!!!!!!!!!!!!!! test it if newChar = '\0'
Replace(char oldChar,char newChar)900*f6dc9357SAndroid Build Coastguard Worker void AString::Replace(char oldChar, char newChar) throw()
901*f6dc9357SAndroid Build Coastguard Worker {
902*f6dc9357SAndroid Build Coastguard Worker if (oldChar == newChar)
903*f6dc9357SAndroid Build Coastguard Worker return; // 0;
904*f6dc9357SAndroid Build Coastguard Worker // unsigned number = 0;
905*f6dc9357SAndroid Build Coastguard Worker int pos = 0;
906*f6dc9357SAndroid Build Coastguard Worker char *chars = _chars;
907*f6dc9357SAndroid Build Coastguard Worker while ((unsigned)pos < _len)
908*f6dc9357SAndroid Build Coastguard Worker {
909*f6dc9357SAndroid Build Coastguard Worker pos = Find(oldChar, (unsigned)pos);
910*f6dc9357SAndroid Build Coastguard Worker if (pos < 0)
911*f6dc9357SAndroid Build Coastguard Worker break;
912*f6dc9357SAndroid Build Coastguard Worker chars[(unsigned)pos] = newChar;
913*f6dc9357SAndroid Build Coastguard Worker pos++;
914*f6dc9357SAndroid Build Coastguard Worker // number++;
915*f6dc9357SAndroid Build Coastguard Worker }
916*f6dc9357SAndroid Build Coastguard Worker return; // number;
917*f6dc9357SAndroid Build Coastguard Worker }
918*f6dc9357SAndroid Build Coastguard Worker
Replace(const AString & oldString,const AString & newString)919*f6dc9357SAndroid Build Coastguard Worker void AString::Replace(const AString &oldString, const AString &newString)
920*f6dc9357SAndroid Build Coastguard Worker {
921*f6dc9357SAndroid Build Coastguard Worker if (oldString.IsEmpty())
922*f6dc9357SAndroid Build Coastguard Worker return; // 0;
923*f6dc9357SAndroid Build Coastguard Worker if (oldString == newString)
924*f6dc9357SAndroid Build Coastguard Worker return; // 0;
925*f6dc9357SAndroid Build Coastguard Worker const unsigned oldLen = oldString.Len();
926*f6dc9357SAndroid Build Coastguard Worker const unsigned newLen = newString.Len();
927*f6dc9357SAndroid Build Coastguard Worker // unsigned number = 0;
928*f6dc9357SAndroid Build Coastguard Worker int pos = 0;
929*f6dc9357SAndroid Build Coastguard Worker while ((unsigned)pos < _len)
930*f6dc9357SAndroid Build Coastguard Worker {
931*f6dc9357SAndroid Build Coastguard Worker pos = Find(oldString, (unsigned)pos);
932*f6dc9357SAndroid Build Coastguard Worker if (pos < 0)
933*f6dc9357SAndroid Build Coastguard Worker break;
934*f6dc9357SAndroid Build Coastguard Worker Delete((unsigned)pos, oldLen);
935*f6dc9357SAndroid Build Coastguard Worker Insert((unsigned)pos, newString);
936*f6dc9357SAndroid Build Coastguard Worker pos += newLen;
937*f6dc9357SAndroid Build Coastguard Worker // number++;
938*f6dc9357SAndroid Build Coastguard Worker }
939*f6dc9357SAndroid Build Coastguard Worker // return number;
940*f6dc9357SAndroid Build Coastguard Worker }
941*f6dc9357SAndroid Build Coastguard Worker
Delete(unsigned index)942*f6dc9357SAndroid Build Coastguard Worker void AString::Delete(unsigned index) throw()
943*f6dc9357SAndroid Build Coastguard Worker {
944*f6dc9357SAndroid Build Coastguard Worker MoveItems(index, index + 1);
945*f6dc9357SAndroid Build Coastguard Worker _len--;
946*f6dc9357SAndroid Build Coastguard Worker }
947*f6dc9357SAndroid Build Coastguard Worker
Delete(unsigned index,unsigned count)948*f6dc9357SAndroid Build Coastguard Worker void AString::Delete(unsigned index, unsigned count) throw()
949*f6dc9357SAndroid Build Coastguard Worker {
950*f6dc9357SAndroid Build Coastguard Worker if (index + count > _len)
951*f6dc9357SAndroid Build Coastguard Worker count = _len - index;
952*f6dc9357SAndroid Build Coastguard Worker if (count > 0)
953*f6dc9357SAndroid Build Coastguard Worker {
954*f6dc9357SAndroid Build Coastguard Worker MoveItems(index, index + count);
955*f6dc9357SAndroid Build Coastguard Worker _len -= count;
956*f6dc9357SAndroid Build Coastguard Worker }
957*f6dc9357SAndroid Build Coastguard Worker }
958*f6dc9357SAndroid Build Coastguard Worker
DeleteFrontal(unsigned num)959*f6dc9357SAndroid Build Coastguard Worker void AString::DeleteFrontal(unsigned num) throw()
960*f6dc9357SAndroid Build Coastguard Worker {
961*f6dc9357SAndroid Build Coastguard Worker if (num != 0)
962*f6dc9357SAndroid Build Coastguard Worker {
963*f6dc9357SAndroid Build Coastguard Worker MoveItems(0, num);
964*f6dc9357SAndroid Build Coastguard Worker _len -= num;
965*f6dc9357SAndroid Build Coastguard Worker }
966*f6dc9357SAndroid Build Coastguard Worker }
967*f6dc9357SAndroid Build Coastguard Worker
968*f6dc9357SAndroid Build Coastguard Worker /*
969*f6dc9357SAndroid Build Coastguard Worker AString operator+(const AString &s1, const AString &s2)
970*f6dc9357SAndroid Build Coastguard Worker {
971*f6dc9357SAndroid Build Coastguard Worker AString result(s1);
972*f6dc9357SAndroid Build Coastguard Worker result += s2;
973*f6dc9357SAndroid Build Coastguard Worker return result;
974*f6dc9357SAndroid Build Coastguard Worker }
975*f6dc9357SAndroid Build Coastguard Worker
976*f6dc9357SAndroid Build Coastguard Worker AString operator+(const AString &s, const char *chars)
977*f6dc9357SAndroid Build Coastguard Worker {
978*f6dc9357SAndroid Build Coastguard Worker AString result(s);
979*f6dc9357SAndroid Build Coastguard Worker result += chars;
980*f6dc9357SAndroid Build Coastguard Worker return result;
981*f6dc9357SAndroid Build Coastguard Worker }
982*f6dc9357SAndroid Build Coastguard Worker
983*f6dc9357SAndroid Build Coastguard Worker AString operator+(const char *chars, const AString &s)
984*f6dc9357SAndroid Build Coastguard Worker {
985*f6dc9357SAndroid Build Coastguard Worker AString result(chars);
986*f6dc9357SAndroid Build Coastguard Worker result += s;
987*f6dc9357SAndroid Build Coastguard Worker return result;
988*f6dc9357SAndroid Build Coastguard Worker }
989*f6dc9357SAndroid Build Coastguard Worker
990*f6dc9357SAndroid Build Coastguard Worker AString operator+(const AString &s, char c)
991*f6dc9357SAndroid Build Coastguard Worker {
992*f6dc9357SAndroid Build Coastguard Worker AString result(s);
993*f6dc9357SAndroid Build Coastguard Worker result += c;
994*f6dc9357SAndroid Build Coastguard Worker return result;
995*f6dc9357SAndroid Build Coastguard Worker }
996*f6dc9357SAndroid Build Coastguard Worker */
997*f6dc9357SAndroid Build Coastguard Worker
998*f6dc9357SAndroid Build Coastguard Worker /*
999*f6dc9357SAndroid Build Coastguard Worker AString operator+(char c, const AString &s)
1000*f6dc9357SAndroid Build Coastguard Worker {
1001*f6dc9357SAndroid Build Coastguard Worker AString result(c);
1002*f6dc9357SAndroid Build Coastguard Worker result += s;
1003*f6dc9357SAndroid Build Coastguard Worker return result;
1004*f6dc9357SAndroid Build Coastguard Worker }
1005*f6dc9357SAndroid Build Coastguard Worker */
1006*f6dc9357SAndroid Build Coastguard Worker
1007*f6dc9357SAndroid Build Coastguard Worker
1008*f6dc9357SAndroid Build Coastguard Worker
1009*f6dc9357SAndroid Build Coastguard Worker
1010*f6dc9357SAndroid Build Coastguard Worker // ---------- UString ----------
1011*f6dc9357SAndroid Build Coastguard Worker
InsertSpace(unsigned index,unsigned size)1012*f6dc9357SAndroid Build Coastguard Worker void UString::InsertSpace(unsigned index, unsigned size)
1013*f6dc9357SAndroid Build Coastguard Worker {
1014*f6dc9357SAndroid Build Coastguard Worker Grow(size);
1015*f6dc9357SAndroid Build Coastguard Worker MoveItems(index + size, index);
1016*f6dc9357SAndroid Build Coastguard Worker }
1017*f6dc9357SAndroid Build Coastguard Worker
ReAlloc(unsigned newLimit)1018*f6dc9357SAndroid Build Coastguard Worker void UString::ReAlloc(unsigned newLimit)
1019*f6dc9357SAndroid Build Coastguard Worker {
1020*f6dc9357SAndroid Build Coastguard Worker // MY_STRING_REALLOC(_chars, wchar_t, (size_t)newLimit + 1, (size_t)_len + 1);
1021*f6dc9357SAndroid Build Coastguard Worker wchar_t *newBuf = MY_STRING_NEW_wchar_t((size_t)newLimit + 1);
1022*f6dc9357SAndroid Build Coastguard Worker wmemcpy(newBuf, _chars, _len + 1);
1023*f6dc9357SAndroid Build Coastguard Worker MY_STRING_DELETE(_chars)
1024*f6dc9357SAndroid Build Coastguard Worker _chars = newBuf;
1025*f6dc9357SAndroid Build Coastguard Worker _limit = newLimit;
1026*f6dc9357SAndroid Build Coastguard Worker }
1027*f6dc9357SAndroid Build Coastguard Worker
ReAlloc2(unsigned newLimit)1028*f6dc9357SAndroid Build Coastguard Worker void UString::ReAlloc2(unsigned newLimit)
1029*f6dc9357SAndroid Build Coastguard Worker {
1030*f6dc9357SAndroid Build Coastguard Worker CHECK_STRING_ALLOC_LEN(newLimit)
1031*f6dc9357SAndroid Build Coastguard Worker // MY_STRING_REALLOC(_chars, wchar_t, newLimit + 1, 0);
1032*f6dc9357SAndroid Build Coastguard Worker wchar_t *newBuf = MY_STRING_NEW_wchar_t((size_t)newLimit + 1);
1033*f6dc9357SAndroid Build Coastguard Worker newBuf[0] = 0;
1034*f6dc9357SAndroid Build Coastguard Worker MY_STRING_DELETE(_chars)
1035*f6dc9357SAndroid Build Coastguard Worker _chars = newBuf;
1036*f6dc9357SAndroid Build Coastguard Worker _limit = newLimit;
1037*f6dc9357SAndroid Build Coastguard Worker _len = 0;
1038*f6dc9357SAndroid Build Coastguard Worker }
1039*f6dc9357SAndroid Build Coastguard Worker
SetStartLen(unsigned len)1040*f6dc9357SAndroid Build Coastguard Worker void UString::SetStartLen(unsigned len)
1041*f6dc9357SAndroid Build Coastguard Worker {
1042*f6dc9357SAndroid Build Coastguard Worker _chars = NULL;
1043*f6dc9357SAndroid Build Coastguard Worker _chars = MY_STRING_NEW_wchar_t((size_t)len + 1);
1044*f6dc9357SAndroid Build Coastguard Worker _len = len;
1045*f6dc9357SAndroid Build Coastguard Worker _limit = len;
1046*f6dc9357SAndroid Build Coastguard Worker }
1047*f6dc9357SAndroid Build Coastguard Worker
1048*f6dc9357SAndroid Build Coastguard Worker Z7_NO_INLINE
Grow_1()1049*f6dc9357SAndroid Build Coastguard Worker void UString::Grow_1()
1050*f6dc9357SAndroid Build Coastguard Worker {
1051*f6dc9357SAndroid Build Coastguard Worker unsigned next = _len;
1052*f6dc9357SAndroid Build Coastguard Worker next += next / 2;
1053*f6dc9357SAndroid Build Coastguard Worker next += 16;
1054*f6dc9357SAndroid Build Coastguard Worker next &= ~(unsigned)15;
1055*f6dc9357SAndroid Build Coastguard Worker next--;
1056*f6dc9357SAndroid Build Coastguard Worker if (next < _len || next > k_Alloc_Len_Limit)
1057*f6dc9357SAndroid Build Coastguard Worker next = k_Alloc_Len_Limit;
1058*f6dc9357SAndroid Build Coastguard Worker if (next <= _len)
1059*f6dc9357SAndroid Build Coastguard Worker THROW_STRING_ALLOC_EXCEPTION
1060*f6dc9357SAndroid Build Coastguard Worker ReAlloc(next);
1061*f6dc9357SAndroid Build Coastguard Worker }
1062*f6dc9357SAndroid Build Coastguard Worker
Grow(unsigned n)1063*f6dc9357SAndroid Build Coastguard Worker void UString::Grow(unsigned n)
1064*f6dc9357SAndroid Build Coastguard Worker {
1065*f6dc9357SAndroid Build Coastguard Worker const unsigned freeSize = _limit - _len;
1066*f6dc9357SAndroid Build Coastguard Worker if (n <= freeSize)
1067*f6dc9357SAndroid Build Coastguard Worker return;
1068*f6dc9357SAndroid Build Coastguard Worker unsigned next = _len + n;
1069*f6dc9357SAndroid Build Coastguard Worker next += next / 2;
1070*f6dc9357SAndroid Build Coastguard Worker next += 16;
1071*f6dc9357SAndroid Build Coastguard Worker next &= ~(unsigned)15;
1072*f6dc9357SAndroid Build Coastguard Worker next--;
1073*f6dc9357SAndroid Build Coastguard Worker if (next < _len || next > k_Alloc_Len_Limit)
1074*f6dc9357SAndroid Build Coastguard Worker next = k_Alloc_Len_Limit;
1075*f6dc9357SAndroid Build Coastguard Worker if (next <= _len || next - _len < n)
1076*f6dc9357SAndroid Build Coastguard Worker THROW_STRING_ALLOC_EXCEPTION
1077*f6dc9357SAndroid Build Coastguard Worker ReAlloc(next - 1);
1078*f6dc9357SAndroid Build Coastguard Worker }
1079*f6dc9357SAndroid Build Coastguard Worker
1080*f6dc9357SAndroid Build Coastguard Worker
UString(unsigned num,const wchar_t * s)1081*f6dc9357SAndroid Build Coastguard Worker UString::UString(unsigned num, const wchar_t *s)
1082*f6dc9357SAndroid Build Coastguard Worker {
1083*f6dc9357SAndroid Build Coastguard Worker unsigned len = MyStringLen(s);
1084*f6dc9357SAndroid Build Coastguard Worker if (num > len)
1085*f6dc9357SAndroid Build Coastguard Worker num = len;
1086*f6dc9357SAndroid Build Coastguard Worker SetStartLen(num);
1087*f6dc9357SAndroid Build Coastguard Worker wmemcpy(_chars, s, num);
1088*f6dc9357SAndroid Build Coastguard Worker _chars[num] = 0;
1089*f6dc9357SAndroid Build Coastguard Worker }
1090*f6dc9357SAndroid Build Coastguard Worker
1091*f6dc9357SAndroid Build Coastguard Worker
UString(unsigned num,const UString & s)1092*f6dc9357SAndroid Build Coastguard Worker UString::UString(unsigned num, const UString &s)
1093*f6dc9357SAndroid Build Coastguard Worker {
1094*f6dc9357SAndroid Build Coastguard Worker if (num > s._len)
1095*f6dc9357SAndroid Build Coastguard Worker num = s._len;
1096*f6dc9357SAndroid Build Coastguard Worker SetStartLen(num);
1097*f6dc9357SAndroid Build Coastguard Worker wmemcpy(_chars, s._chars, num);
1098*f6dc9357SAndroid Build Coastguard Worker _chars[num] = 0;
1099*f6dc9357SAndroid Build Coastguard Worker }
1100*f6dc9357SAndroid Build Coastguard Worker
UString(const UString & s,wchar_t c)1101*f6dc9357SAndroid Build Coastguard Worker UString::UString(const UString &s, wchar_t c)
1102*f6dc9357SAndroid Build Coastguard Worker {
1103*f6dc9357SAndroid Build Coastguard Worker SetStartLen(s.Len() + 1);
1104*f6dc9357SAndroid Build Coastguard Worker wchar_t *chars = _chars;
1105*f6dc9357SAndroid Build Coastguard Worker unsigned len = s.Len();
1106*f6dc9357SAndroid Build Coastguard Worker wmemcpy(chars, s, len);
1107*f6dc9357SAndroid Build Coastguard Worker chars[len] = c;
1108*f6dc9357SAndroid Build Coastguard Worker chars[(size_t)len + 1] = 0;
1109*f6dc9357SAndroid Build Coastguard Worker }
1110*f6dc9357SAndroid Build Coastguard Worker
UString(const wchar_t * s1,unsigned num1,const wchar_t * s2,unsigned num2)1111*f6dc9357SAndroid Build Coastguard Worker UString::UString(const wchar_t *s1, unsigned num1, const wchar_t *s2, unsigned num2)
1112*f6dc9357SAndroid Build Coastguard Worker {
1113*f6dc9357SAndroid Build Coastguard Worker SetStartLen(num1 + num2);
1114*f6dc9357SAndroid Build Coastguard Worker wchar_t *chars = _chars;
1115*f6dc9357SAndroid Build Coastguard Worker wmemcpy(chars, s1, num1);
1116*f6dc9357SAndroid Build Coastguard Worker wmemcpy(chars + num1, s2, num2 + 1);
1117*f6dc9357SAndroid Build Coastguard Worker }
1118*f6dc9357SAndroid Build Coastguard Worker
operator +(const UString & s1,const UString & s2)1119*f6dc9357SAndroid Build Coastguard Worker UString operator+(const UString &s1, const UString &s2) { return UString(s1, s1.Len(), s2, s2.Len()); }
operator +(const UString & s1,const wchar_t * s2)1120*f6dc9357SAndroid Build Coastguard Worker UString operator+(const UString &s1, const wchar_t *s2) { return UString(s1, s1.Len(), s2, MyStringLen(s2)); }
operator +(const wchar_t * s1,const UString & s2)1121*f6dc9357SAndroid Build Coastguard Worker UString operator+(const wchar_t *s1, const UString &s2) { return UString(s1, MyStringLen(s1), s2, s2.Len()); }
1122*f6dc9357SAndroid Build Coastguard Worker
UString()1123*f6dc9357SAndroid Build Coastguard Worker UString::UString()
1124*f6dc9357SAndroid Build Coastguard Worker {
1125*f6dc9357SAndroid Build Coastguard Worker _chars = NULL;
1126*f6dc9357SAndroid Build Coastguard Worker _chars = MY_STRING_NEW_wchar_t(kStartStringCapacity);
1127*f6dc9357SAndroid Build Coastguard Worker _len = 0;
1128*f6dc9357SAndroid Build Coastguard Worker _limit = kStartStringCapacity - 1;
1129*f6dc9357SAndroid Build Coastguard Worker _chars[0] = 0;
1130*f6dc9357SAndroid Build Coastguard Worker }
1131*f6dc9357SAndroid Build Coastguard Worker
UString(wchar_t c)1132*f6dc9357SAndroid Build Coastguard Worker UString::UString(wchar_t c)
1133*f6dc9357SAndroid Build Coastguard Worker {
1134*f6dc9357SAndroid Build Coastguard Worker SetStartLen(1);
1135*f6dc9357SAndroid Build Coastguard Worker wchar_t *chars = _chars;
1136*f6dc9357SAndroid Build Coastguard Worker chars[0] = c;
1137*f6dc9357SAndroid Build Coastguard Worker chars[1] = 0;
1138*f6dc9357SAndroid Build Coastguard Worker }
1139*f6dc9357SAndroid Build Coastguard Worker
UString(char c)1140*f6dc9357SAndroid Build Coastguard Worker UString::UString(char c)
1141*f6dc9357SAndroid Build Coastguard Worker {
1142*f6dc9357SAndroid Build Coastguard Worker SetStartLen(1);
1143*f6dc9357SAndroid Build Coastguard Worker wchar_t *chars = _chars;
1144*f6dc9357SAndroid Build Coastguard Worker chars[0] = (unsigned char)c;
1145*f6dc9357SAndroid Build Coastguard Worker chars[1] = 0;
1146*f6dc9357SAndroid Build Coastguard Worker }
1147*f6dc9357SAndroid Build Coastguard Worker
UString(const wchar_t * s)1148*f6dc9357SAndroid Build Coastguard Worker UString::UString(const wchar_t *s)
1149*f6dc9357SAndroid Build Coastguard Worker {
1150*f6dc9357SAndroid Build Coastguard Worker const unsigned len = MyStringLen(s);
1151*f6dc9357SAndroid Build Coastguard Worker SetStartLen(len);
1152*f6dc9357SAndroid Build Coastguard Worker wmemcpy(_chars, s, len + 1);
1153*f6dc9357SAndroid Build Coastguard Worker }
1154*f6dc9357SAndroid Build Coastguard Worker
UString(const char * s)1155*f6dc9357SAndroid Build Coastguard Worker UString::UString(const char *s)
1156*f6dc9357SAndroid Build Coastguard Worker {
1157*f6dc9357SAndroid Build Coastguard Worker const unsigned len = MyStringLen(s);
1158*f6dc9357SAndroid Build Coastguard Worker SetStartLen(len);
1159*f6dc9357SAndroid Build Coastguard Worker wchar_t *chars = _chars;
1160*f6dc9357SAndroid Build Coastguard Worker for (unsigned i = 0; i < len; i++)
1161*f6dc9357SAndroid Build Coastguard Worker chars[i] = (unsigned char)s[i];
1162*f6dc9357SAndroid Build Coastguard Worker chars[len] = 0;
1163*f6dc9357SAndroid Build Coastguard Worker }
1164*f6dc9357SAndroid Build Coastguard Worker
UString(const AString & s)1165*f6dc9357SAndroid Build Coastguard Worker UString::UString(const AString &s)
1166*f6dc9357SAndroid Build Coastguard Worker {
1167*f6dc9357SAndroid Build Coastguard Worker const unsigned len = s.Len();
1168*f6dc9357SAndroid Build Coastguard Worker SetStartLen(len);
1169*f6dc9357SAndroid Build Coastguard Worker wchar_t *chars = _chars;
1170*f6dc9357SAndroid Build Coastguard Worker const char *s2 = s.Ptr();
1171*f6dc9357SAndroid Build Coastguard Worker for (unsigned i = 0; i < len; i++)
1172*f6dc9357SAndroid Build Coastguard Worker chars[i] = (unsigned char)s2[i];
1173*f6dc9357SAndroid Build Coastguard Worker chars[len] = 0;
1174*f6dc9357SAndroid Build Coastguard Worker }
1175*f6dc9357SAndroid Build Coastguard Worker
UString(const UString & s)1176*f6dc9357SAndroid Build Coastguard Worker UString::UString(const UString &s)
1177*f6dc9357SAndroid Build Coastguard Worker {
1178*f6dc9357SAndroid Build Coastguard Worker SetStartLen(s._len);
1179*f6dc9357SAndroid Build Coastguard Worker wmemcpy(_chars, s._chars, s._len + 1);
1180*f6dc9357SAndroid Build Coastguard Worker }
1181*f6dc9357SAndroid Build Coastguard Worker
operator =(wchar_t c)1182*f6dc9357SAndroid Build Coastguard Worker UString &UString::operator=(wchar_t c)
1183*f6dc9357SAndroid Build Coastguard Worker {
1184*f6dc9357SAndroid Build Coastguard Worker if (1 > _limit)
1185*f6dc9357SAndroid Build Coastguard Worker {
1186*f6dc9357SAndroid Build Coastguard Worker wchar_t *newBuf = MY_STRING_NEW_wchar_t(1 + 1);
1187*f6dc9357SAndroid Build Coastguard Worker MY_STRING_DELETE(_chars)
1188*f6dc9357SAndroid Build Coastguard Worker _chars = newBuf;
1189*f6dc9357SAndroid Build Coastguard Worker _limit = 1;
1190*f6dc9357SAndroid Build Coastguard Worker }
1191*f6dc9357SAndroid Build Coastguard Worker _len = 1;
1192*f6dc9357SAndroid Build Coastguard Worker wchar_t *chars = _chars;
1193*f6dc9357SAndroid Build Coastguard Worker chars[0] = c;
1194*f6dc9357SAndroid Build Coastguard Worker chars[1] = 0;
1195*f6dc9357SAndroid Build Coastguard Worker return *this;
1196*f6dc9357SAndroid Build Coastguard Worker }
1197*f6dc9357SAndroid Build Coastguard Worker
operator =(const wchar_t * s)1198*f6dc9357SAndroid Build Coastguard Worker UString &UString::operator=(const wchar_t *s)
1199*f6dc9357SAndroid Build Coastguard Worker {
1200*f6dc9357SAndroid Build Coastguard Worker unsigned len = MyStringLen(s);
1201*f6dc9357SAndroid Build Coastguard Worker if (len > _limit)
1202*f6dc9357SAndroid Build Coastguard Worker {
1203*f6dc9357SAndroid Build Coastguard Worker wchar_t *newBuf = MY_STRING_NEW_wchar_t((size_t)len + 1);
1204*f6dc9357SAndroid Build Coastguard Worker MY_STRING_DELETE(_chars)
1205*f6dc9357SAndroid Build Coastguard Worker _chars = newBuf;
1206*f6dc9357SAndroid Build Coastguard Worker _limit = len;
1207*f6dc9357SAndroid Build Coastguard Worker }
1208*f6dc9357SAndroid Build Coastguard Worker _len = len;
1209*f6dc9357SAndroid Build Coastguard Worker wmemcpy(_chars, s, len + 1);
1210*f6dc9357SAndroid Build Coastguard Worker return *this;
1211*f6dc9357SAndroid Build Coastguard Worker }
1212*f6dc9357SAndroid Build Coastguard Worker
operator =(const UString & s)1213*f6dc9357SAndroid Build Coastguard Worker UString &UString::operator=(const UString &s)
1214*f6dc9357SAndroid Build Coastguard Worker {
1215*f6dc9357SAndroid Build Coastguard Worker if (&s == this)
1216*f6dc9357SAndroid Build Coastguard Worker return *this;
1217*f6dc9357SAndroid Build Coastguard Worker unsigned len = s._len;
1218*f6dc9357SAndroid Build Coastguard Worker if (len > _limit)
1219*f6dc9357SAndroid Build Coastguard Worker {
1220*f6dc9357SAndroid Build Coastguard Worker wchar_t *newBuf = MY_STRING_NEW_wchar_t((size_t)len + 1);
1221*f6dc9357SAndroid Build Coastguard Worker MY_STRING_DELETE(_chars)
1222*f6dc9357SAndroid Build Coastguard Worker _chars = newBuf;
1223*f6dc9357SAndroid Build Coastguard Worker _limit = len;
1224*f6dc9357SAndroid Build Coastguard Worker }
1225*f6dc9357SAndroid Build Coastguard Worker _len = len;
1226*f6dc9357SAndroid Build Coastguard Worker wmemcpy(_chars, s._chars, len + 1);
1227*f6dc9357SAndroid Build Coastguard Worker return *this;
1228*f6dc9357SAndroid Build Coastguard Worker }
1229*f6dc9357SAndroid Build Coastguard Worker
SetFrom(const wchar_t * s,unsigned len)1230*f6dc9357SAndroid Build Coastguard Worker void UString::SetFrom(const wchar_t *s, unsigned len) // no check
1231*f6dc9357SAndroid Build Coastguard Worker {
1232*f6dc9357SAndroid Build Coastguard Worker if (len > _limit)
1233*f6dc9357SAndroid Build Coastguard Worker {
1234*f6dc9357SAndroid Build Coastguard Worker CHECK_STRING_ALLOC_LEN(len)
1235*f6dc9357SAndroid Build Coastguard Worker wchar_t *newBuf = MY_STRING_NEW_wchar_t((size_t)len + 1);
1236*f6dc9357SAndroid Build Coastguard Worker MY_STRING_DELETE(_chars)
1237*f6dc9357SAndroid Build Coastguard Worker _chars = newBuf;
1238*f6dc9357SAndroid Build Coastguard Worker _limit = len;
1239*f6dc9357SAndroid Build Coastguard Worker }
1240*f6dc9357SAndroid Build Coastguard Worker if (len != 0)
1241*f6dc9357SAndroid Build Coastguard Worker wmemcpy(_chars, s, len);
1242*f6dc9357SAndroid Build Coastguard Worker _chars[len] = 0;
1243*f6dc9357SAndroid Build Coastguard Worker _len = len;
1244*f6dc9357SAndroid Build Coastguard Worker }
1245*f6dc9357SAndroid Build Coastguard Worker
SetFromBstr(LPCOLESTR s)1246*f6dc9357SAndroid Build Coastguard Worker void UString::SetFromBstr(LPCOLESTR s)
1247*f6dc9357SAndroid Build Coastguard Worker {
1248*f6dc9357SAndroid Build Coastguard Worker unsigned len = ::SysStringLen((BSTR)(void *)(s));
1249*f6dc9357SAndroid Build Coastguard Worker
1250*f6dc9357SAndroid Build Coastguard Worker /*
1251*f6dc9357SAndroid Build Coastguard Worker #if WCHAR_MAX > 0xffff
1252*f6dc9357SAndroid Build Coastguard Worker size_t num_wchars = 0;
1253*f6dc9357SAndroid Build Coastguard Worker for (size_t i = 0; i < len;)
1254*f6dc9357SAndroid Build Coastguard Worker {
1255*f6dc9357SAndroid Build Coastguard Worker wchar_t c = s[i++];
1256*f6dc9357SAndroid Build Coastguard Worker if (c >= 0xd800 && c < 0xdc00 && i + 1 != len)
1257*f6dc9357SAndroid Build Coastguard Worker {
1258*f6dc9357SAndroid Build Coastguard Worker wchar_t c2 = s[i];
1259*f6dc9357SAndroid Build Coastguard Worker if (c2 >= 0xdc00 && c2 < 0xe000)
1260*f6dc9357SAndroid Build Coastguard Worker {
1261*f6dc9357SAndroid Build Coastguard Worker c = 0x10000 + ((c & 0x3ff) << 10) + (c2 & 0x3ff);
1262*f6dc9357SAndroid Build Coastguard Worker i++;
1263*f6dc9357SAndroid Build Coastguard Worker }
1264*f6dc9357SAndroid Build Coastguard Worker }
1265*f6dc9357SAndroid Build Coastguard Worker num_wchars++;
1266*f6dc9357SAndroid Build Coastguard Worker }
1267*f6dc9357SAndroid Build Coastguard Worker len = num_wchars;
1268*f6dc9357SAndroid Build Coastguard Worker #endif
1269*f6dc9357SAndroid Build Coastguard Worker */
1270*f6dc9357SAndroid Build Coastguard Worker
1271*f6dc9357SAndroid Build Coastguard Worker if (len > _limit)
1272*f6dc9357SAndroid Build Coastguard Worker {
1273*f6dc9357SAndroid Build Coastguard Worker wchar_t *newBuf = MY_STRING_NEW_wchar_t((size_t)len + 1);
1274*f6dc9357SAndroid Build Coastguard Worker MY_STRING_DELETE(_chars)
1275*f6dc9357SAndroid Build Coastguard Worker _chars = newBuf;
1276*f6dc9357SAndroid Build Coastguard Worker _limit = len;
1277*f6dc9357SAndroid Build Coastguard Worker }
1278*f6dc9357SAndroid Build Coastguard Worker _len = len;
1279*f6dc9357SAndroid Build Coastguard Worker
1280*f6dc9357SAndroid Build Coastguard Worker /*
1281*f6dc9357SAndroid Build Coastguard Worker #if WCHAR_MAX > 0xffff
1282*f6dc9357SAndroid Build Coastguard Worker
1283*f6dc9357SAndroid Build Coastguard Worker wchar_t *chars = _chars;
1284*f6dc9357SAndroid Build Coastguard Worker for (size_t i = 0; i <= len; i++)
1285*f6dc9357SAndroid Build Coastguard Worker {
1286*f6dc9357SAndroid Build Coastguard Worker wchar_t c = *s++;
1287*f6dc9357SAndroid Build Coastguard Worker if (c >= 0xd800 && c < 0xdc00 && i + 1 != len)
1288*f6dc9357SAndroid Build Coastguard Worker {
1289*f6dc9357SAndroid Build Coastguard Worker wchar_t c2 = *s;
1290*f6dc9357SAndroid Build Coastguard Worker if (c2 >= 0xdc00 && c2 < 0xe000)
1291*f6dc9357SAndroid Build Coastguard Worker {
1292*f6dc9357SAndroid Build Coastguard Worker s++;
1293*f6dc9357SAndroid Build Coastguard Worker c = 0x10000 + ((c & 0x3ff) << 10) + (c2 & 0x3ff);
1294*f6dc9357SAndroid Build Coastguard Worker }
1295*f6dc9357SAndroid Build Coastguard Worker }
1296*f6dc9357SAndroid Build Coastguard Worker chars[i] = c;
1297*f6dc9357SAndroid Build Coastguard Worker }
1298*f6dc9357SAndroid Build Coastguard Worker
1299*f6dc9357SAndroid Build Coastguard Worker #else
1300*f6dc9357SAndroid Build Coastguard Worker */
1301*f6dc9357SAndroid Build Coastguard Worker
1302*f6dc9357SAndroid Build Coastguard Worker // if (s)
1303*f6dc9357SAndroid Build Coastguard Worker wmemcpy(_chars, s, len + 1);
1304*f6dc9357SAndroid Build Coastguard Worker
1305*f6dc9357SAndroid Build Coastguard Worker // #endif
1306*f6dc9357SAndroid Build Coastguard Worker }
1307*f6dc9357SAndroid Build Coastguard Worker
operator =(const char * s)1308*f6dc9357SAndroid Build Coastguard Worker UString &UString::operator=(const char *s)
1309*f6dc9357SAndroid Build Coastguard Worker {
1310*f6dc9357SAndroid Build Coastguard Worker unsigned len = MyStringLen(s);
1311*f6dc9357SAndroid Build Coastguard Worker if (len > _limit)
1312*f6dc9357SAndroid Build Coastguard Worker {
1313*f6dc9357SAndroid Build Coastguard Worker wchar_t *newBuf = MY_STRING_NEW_wchar_t((size_t)len + 1);
1314*f6dc9357SAndroid Build Coastguard Worker MY_STRING_DELETE(_chars)
1315*f6dc9357SAndroid Build Coastguard Worker _chars = newBuf;
1316*f6dc9357SAndroid Build Coastguard Worker _limit = len;
1317*f6dc9357SAndroid Build Coastguard Worker }
1318*f6dc9357SAndroid Build Coastguard Worker wchar_t *chars = _chars;
1319*f6dc9357SAndroid Build Coastguard Worker for (unsigned i = 0; i < len; i++)
1320*f6dc9357SAndroid Build Coastguard Worker chars[i] = (unsigned char)s[i];
1321*f6dc9357SAndroid Build Coastguard Worker chars[len] = 0;
1322*f6dc9357SAndroid Build Coastguard Worker _len = len;
1323*f6dc9357SAndroid Build Coastguard Worker return *this;
1324*f6dc9357SAndroid Build Coastguard Worker }
1325*f6dc9357SAndroid Build Coastguard Worker
Add_Char(char c)1326*f6dc9357SAndroid Build Coastguard Worker void UString::Add_Char(char c) { operator+=((wchar_t)(unsigned char)c); }
1327*f6dc9357SAndroid Build Coastguard Worker // void UString::Add_WChar(wchar_t c) { operator+=(c); }
Add_Dot()1328*f6dc9357SAndroid Build Coastguard Worker void UString::Add_Dot() { operator+=(L'.'); }
Add_Space()1329*f6dc9357SAndroid Build Coastguard Worker void UString::Add_Space() { operator+=(L' '); }
Add_Minus()1330*f6dc9357SAndroid Build Coastguard Worker void UString::Add_Minus() { operator+=(L'-'); }
Add_Colon()1331*f6dc9357SAndroid Build Coastguard Worker void UString::Add_Colon() { operator+=(L':'); }
Add_LF()1332*f6dc9357SAndroid Build Coastguard Worker void UString::Add_LF() { operator+=(L'\n'); }
Add_Space_if_NotEmpty()1333*f6dc9357SAndroid Build Coastguard Worker void UString::Add_Space_if_NotEmpty() { if (!IsEmpty()) Add_Space(); }
1334*f6dc9357SAndroid Build Coastguard Worker
operator +=(const wchar_t * s)1335*f6dc9357SAndroid Build Coastguard Worker UString &UString::operator+=(const wchar_t *s)
1336*f6dc9357SAndroid Build Coastguard Worker {
1337*f6dc9357SAndroid Build Coastguard Worker unsigned len = MyStringLen(s);
1338*f6dc9357SAndroid Build Coastguard Worker Grow(len);
1339*f6dc9357SAndroid Build Coastguard Worker wmemcpy(_chars + _len, s, len + 1);
1340*f6dc9357SAndroid Build Coastguard Worker _len += len;
1341*f6dc9357SAndroid Build Coastguard Worker return *this;
1342*f6dc9357SAndroid Build Coastguard Worker }
1343*f6dc9357SAndroid Build Coastguard Worker
operator +=(const UString & s)1344*f6dc9357SAndroid Build Coastguard Worker UString &UString::operator+=(const UString &s)
1345*f6dc9357SAndroid Build Coastguard Worker {
1346*f6dc9357SAndroid Build Coastguard Worker Grow(s._len);
1347*f6dc9357SAndroid Build Coastguard Worker wmemcpy(_chars + _len, s._chars, s._len + 1);
1348*f6dc9357SAndroid Build Coastguard Worker _len += s._len;
1349*f6dc9357SAndroid Build Coastguard Worker return *this;
1350*f6dc9357SAndroid Build Coastguard Worker }
1351*f6dc9357SAndroid Build Coastguard Worker
operator +=(const char * s)1352*f6dc9357SAndroid Build Coastguard Worker UString &UString::operator+=(const char *s)
1353*f6dc9357SAndroid Build Coastguard Worker {
1354*f6dc9357SAndroid Build Coastguard Worker unsigned len = MyStringLen(s);
1355*f6dc9357SAndroid Build Coastguard Worker Grow(len);
1356*f6dc9357SAndroid Build Coastguard Worker wchar_t *chars = _chars + _len;
1357*f6dc9357SAndroid Build Coastguard Worker for (unsigned i = 0; i < len; i++)
1358*f6dc9357SAndroid Build Coastguard Worker chars[i] = (unsigned char)s[i];
1359*f6dc9357SAndroid Build Coastguard Worker chars[len] = 0;
1360*f6dc9357SAndroid Build Coastguard Worker _len += len;
1361*f6dc9357SAndroid Build Coastguard Worker return *this;
1362*f6dc9357SAndroid Build Coastguard Worker }
1363*f6dc9357SAndroid Build Coastguard Worker
1364*f6dc9357SAndroid Build Coastguard Worker
Add_UInt32(UInt32 v)1365*f6dc9357SAndroid Build Coastguard Worker void UString::Add_UInt32(UInt32 v)
1366*f6dc9357SAndroid Build Coastguard Worker {
1367*f6dc9357SAndroid Build Coastguard Worker Grow(10);
1368*f6dc9357SAndroid Build Coastguard Worker _len = (unsigned)(ConvertUInt32ToString(v, _chars + _len) - _chars);
1369*f6dc9357SAndroid Build Coastguard Worker }
1370*f6dc9357SAndroid Build Coastguard Worker
Add_UInt64(UInt64 v)1371*f6dc9357SAndroid Build Coastguard Worker void AString::Add_UInt64(UInt64 v)
1372*f6dc9357SAndroid Build Coastguard Worker {
1373*f6dc9357SAndroid Build Coastguard Worker Grow(20);
1374*f6dc9357SAndroid Build Coastguard Worker _len = (unsigned)(ConvertUInt64ToString(v, _chars + _len) - _chars);
1375*f6dc9357SAndroid Build Coastguard Worker }
1376*f6dc9357SAndroid Build Coastguard Worker
1377*f6dc9357SAndroid Build Coastguard Worker
Find(const wchar_t * s,unsigned startIndex) const1378*f6dc9357SAndroid Build Coastguard Worker int UString::Find(const wchar_t *s, unsigned startIndex) const throw()
1379*f6dc9357SAndroid Build Coastguard Worker {
1380*f6dc9357SAndroid Build Coastguard Worker const wchar_t *fs = wcsstr(_chars + startIndex, s);
1381*f6dc9357SAndroid Build Coastguard Worker if (!fs)
1382*f6dc9357SAndroid Build Coastguard Worker return -1;
1383*f6dc9357SAndroid Build Coastguard Worker return (int)(fs - _chars);
1384*f6dc9357SAndroid Build Coastguard Worker
1385*f6dc9357SAndroid Build Coastguard Worker /*
1386*f6dc9357SAndroid Build Coastguard Worker if (s[0] == 0)
1387*f6dc9357SAndroid Build Coastguard Worker return startIndex;
1388*f6dc9357SAndroid Build Coastguard Worker unsigned len = MyStringLen(s);
1389*f6dc9357SAndroid Build Coastguard Worker const wchar_t *p = _chars + startIndex;
1390*f6dc9357SAndroid Build Coastguard Worker for (;; p++)
1391*f6dc9357SAndroid Build Coastguard Worker {
1392*f6dc9357SAndroid Build Coastguard Worker const wchar_t c = *p;
1393*f6dc9357SAndroid Build Coastguard Worker if (c != s[0])
1394*f6dc9357SAndroid Build Coastguard Worker {
1395*f6dc9357SAndroid Build Coastguard Worker if (c == 0)
1396*f6dc9357SAndroid Build Coastguard Worker return -1;
1397*f6dc9357SAndroid Build Coastguard Worker continue;
1398*f6dc9357SAndroid Build Coastguard Worker }
1399*f6dc9357SAndroid Build Coastguard Worker unsigned i;
1400*f6dc9357SAndroid Build Coastguard Worker for (i = 1; i < len; i++)
1401*f6dc9357SAndroid Build Coastguard Worker if (p[i] != s[i])
1402*f6dc9357SAndroid Build Coastguard Worker break;
1403*f6dc9357SAndroid Build Coastguard Worker if (i == len)
1404*f6dc9357SAndroid Build Coastguard Worker return (int)(p - _chars);
1405*f6dc9357SAndroid Build Coastguard Worker }
1406*f6dc9357SAndroid Build Coastguard Worker */
1407*f6dc9357SAndroid Build Coastguard Worker }
1408*f6dc9357SAndroid Build Coastguard Worker
ReverseFind(wchar_t c) const1409*f6dc9357SAndroid Build Coastguard Worker int UString::ReverseFind(wchar_t c) const throw()
1410*f6dc9357SAndroid Build Coastguard Worker {
1411*f6dc9357SAndroid Build Coastguard Worker if (_len == 0)
1412*f6dc9357SAndroid Build Coastguard Worker return -1;
1413*f6dc9357SAndroid Build Coastguard Worker const wchar_t *p = _chars + _len;
1414*f6dc9357SAndroid Build Coastguard Worker do
1415*f6dc9357SAndroid Build Coastguard Worker {
1416*f6dc9357SAndroid Build Coastguard Worker if (*(--p) == c)
1417*f6dc9357SAndroid Build Coastguard Worker return (int)(p - _chars);
1418*f6dc9357SAndroid Build Coastguard Worker }
1419*f6dc9357SAndroid Build Coastguard Worker while (p != _chars);
1420*f6dc9357SAndroid Build Coastguard Worker return -1;
1421*f6dc9357SAndroid Build Coastguard Worker }
1422*f6dc9357SAndroid Build Coastguard Worker
ReverseFind_PathSepar() const1423*f6dc9357SAndroid Build Coastguard Worker int UString::ReverseFind_PathSepar() const throw()
1424*f6dc9357SAndroid Build Coastguard Worker {
1425*f6dc9357SAndroid Build Coastguard Worker const wchar_t *p = _chars + _len;
1426*f6dc9357SAndroid Build Coastguard Worker while (p != _chars)
1427*f6dc9357SAndroid Build Coastguard Worker {
1428*f6dc9357SAndroid Build Coastguard Worker const wchar_t c = *(--p);
1429*f6dc9357SAndroid Build Coastguard Worker if (IS_PATH_SEPAR(c))
1430*f6dc9357SAndroid Build Coastguard Worker return (int)(p - _chars);
1431*f6dc9357SAndroid Build Coastguard Worker }
1432*f6dc9357SAndroid Build Coastguard Worker return -1;
1433*f6dc9357SAndroid Build Coastguard Worker }
1434*f6dc9357SAndroid Build Coastguard Worker
TrimLeft()1435*f6dc9357SAndroid Build Coastguard Worker void UString::TrimLeft() throw()
1436*f6dc9357SAndroid Build Coastguard Worker {
1437*f6dc9357SAndroid Build Coastguard Worker const wchar_t *p = _chars;
1438*f6dc9357SAndroid Build Coastguard Worker for (;; p++)
1439*f6dc9357SAndroid Build Coastguard Worker {
1440*f6dc9357SAndroid Build Coastguard Worker wchar_t c = *p;
1441*f6dc9357SAndroid Build Coastguard Worker if (c != ' ' && c != '\n' && c != '\t')
1442*f6dc9357SAndroid Build Coastguard Worker break;
1443*f6dc9357SAndroid Build Coastguard Worker }
1444*f6dc9357SAndroid Build Coastguard Worker unsigned pos = (unsigned)(p - _chars);
1445*f6dc9357SAndroid Build Coastguard Worker if (pos != 0)
1446*f6dc9357SAndroid Build Coastguard Worker {
1447*f6dc9357SAndroid Build Coastguard Worker MoveItems(0, pos);
1448*f6dc9357SAndroid Build Coastguard Worker _len -= pos;
1449*f6dc9357SAndroid Build Coastguard Worker }
1450*f6dc9357SAndroid Build Coastguard Worker }
1451*f6dc9357SAndroid Build Coastguard Worker
TrimRight()1452*f6dc9357SAndroid Build Coastguard Worker void UString::TrimRight() throw()
1453*f6dc9357SAndroid Build Coastguard Worker {
1454*f6dc9357SAndroid Build Coastguard Worker const wchar_t *p = _chars;
1455*f6dc9357SAndroid Build Coastguard Worker unsigned i;
1456*f6dc9357SAndroid Build Coastguard Worker for (i = _len; i != 0; i--)
1457*f6dc9357SAndroid Build Coastguard Worker {
1458*f6dc9357SAndroid Build Coastguard Worker wchar_t c = p[(size_t)i - 1];
1459*f6dc9357SAndroid Build Coastguard Worker if (c != ' ' && c != '\n' && c != '\t')
1460*f6dc9357SAndroid Build Coastguard Worker break;
1461*f6dc9357SAndroid Build Coastguard Worker }
1462*f6dc9357SAndroid Build Coastguard Worker if (i != _len)
1463*f6dc9357SAndroid Build Coastguard Worker {
1464*f6dc9357SAndroid Build Coastguard Worker _chars[i] = 0;
1465*f6dc9357SAndroid Build Coastguard Worker _len = i;
1466*f6dc9357SAndroid Build Coastguard Worker }
1467*f6dc9357SAndroid Build Coastguard Worker }
1468*f6dc9357SAndroid Build Coastguard Worker
InsertAtFront(wchar_t c)1469*f6dc9357SAndroid Build Coastguard Worker void UString::InsertAtFront(wchar_t c)
1470*f6dc9357SAndroid Build Coastguard Worker {
1471*f6dc9357SAndroid Build Coastguard Worker if (_limit == _len)
1472*f6dc9357SAndroid Build Coastguard Worker Grow_1();
1473*f6dc9357SAndroid Build Coastguard Worker MoveItems(1, 0);
1474*f6dc9357SAndroid Build Coastguard Worker _chars[0] = c;
1475*f6dc9357SAndroid Build Coastguard Worker _len++;
1476*f6dc9357SAndroid Build Coastguard Worker }
1477*f6dc9357SAndroid Build Coastguard Worker
1478*f6dc9357SAndroid Build Coastguard Worker /*
1479*f6dc9357SAndroid Build Coastguard Worker void UString::Insert_wchar_t(unsigned index, wchar_t c)
1480*f6dc9357SAndroid Build Coastguard Worker {
1481*f6dc9357SAndroid Build Coastguard Worker InsertSpace(index, 1);
1482*f6dc9357SAndroid Build Coastguard Worker _chars[index] = c;
1483*f6dc9357SAndroid Build Coastguard Worker _len++;
1484*f6dc9357SAndroid Build Coastguard Worker }
1485*f6dc9357SAndroid Build Coastguard Worker */
1486*f6dc9357SAndroid Build Coastguard Worker
Insert(unsigned index,const wchar_t * s)1487*f6dc9357SAndroid Build Coastguard Worker void UString::Insert(unsigned index, const wchar_t *s)
1488*f6dc9357SAndroid Build Coastguard Worker {
1489*f6dc9357SAndroid Build Coastguard Worker unsigned num = MyStringLen(s);
1490*f6dc9357SAndroid Build Coastguard Worker if (num != 0)
1491*f6dc9357SAndroid Build Coastguard Worker {
1492*f6dc9357SAndroid Build Coastguard Worker InsertSpace(index, num);
1493*f6dc9357SAndroid Build Coastguard Worker wmemcpy(_chars + index, s, num);
1494*f6dc9357SAndroid Build Coastguard Worker _len += num;
1495*f6dc9357SAndroid Build Coastguard Worker }
1496*f6dc9357SAndroid Build Coastguard Worker }
1497*f6dc9357SAndroid Build Coastguard Worker
Insert(unsigned index,const UString & s)1498*f6dc9357SAndroid Build Coastguard Worker void UString::Insert(unsigned index, const UString &s)
1499*f6dc9357SAndroid Build Coastguard Worker {
1500*f6dc9357SAndroid Build Coastguard Worker unsigned num = s.Len();
1501*f6dc9357SAndroid Build Coastguard Worker if (num != 0)
1502*f6dc9357SAndroid Build Coastguard Worker {
1503*f6dc9357SAndroid Build Coastguard Worker InsertSpace(index, num);
1504*f6dc9357SAndroid Build Coastguard Worker wmemcpy(_chars + index, s, num);
1505*f6dc9357SAndroid Build Coastguard Worker _len += num;
1506*f6dc9357SAndroid Build Coastguard Worker }
1507*f6dc9357SAndroid Build Coastguard Worker }
1508*f6dc9357SAndroid Build Coastguard Worker
RemoveChar(wchar_t ch)1509*f6dc9357SAndroid Build Coastguard Worker void UString::RemoveChar(wchar_t ch) throw()
1510*f6dc9357SAndroid Build Coastguard Worker {
1511*f6dc9357SAndroid Build Coastguard Worker wchar_t *src = _chars;
1512*f6dc9357SAndroid Build Coastguard Worker
1513*f6dc9357SAndroid Build Coastguard Worker for (;;)
1514*f6dc9357SAndroid Build Coastguard Worker {
1515*f6dc9357SAndroid Build Coastguard Worker wchar_t c = *src++;
1516*f6dc9357SAndroid Build Coastguard Worker if (c == 0)
1517*f6dc9357SAndroid Build Coastguard Worker return;
1518*f6dc9357SAndroid Build Coastguard Worker if (c == ch)
1519*f6dc9357SAndroid Build Coastguard Worker break;
1520*f6dc9357SAndroid Build Coastguard Worker }
1521*f6dc9357SAndroid Build Coastguard Worker
1522*f6dc9357SAndroid Build Coastguard Worker wchar_t *dest = src - 1;
1523*f6dc9357SAndroid Build Coastguard Worker
1524*f6dc9357SAndroid Build Coastguard Worker for (;;)
1525*f6dc9357SAndroid Build Coastguard Worker {
1526*f6dc9357SAndroid Build Coastguard Worker wchar_t c = *src++;
1527*f6dc9357SAndroid Build Coastguard Worker if (c == 0)
1528*f6dc9357SAndroid Build Coastguard Worker break;
1529*f6dc9357SAndroid Build Coastguard Worker if (c != ch)
1530*f6dc9357SAndroid Build Coastguard Worker *dest++ = c;
1531*f6dc9357SAndroid Build Coastguard Worker }
1532*f6dc9357SAndroid Build Coastguard Worker
1533*f6dc9357SAndroid Build Coastguard Worker *dest = 0;
1534*f6dc9357SAndroid Build Coastguard Worker _len = (unsigned)(dest - _chars);
1535*f6dc9357SAndroid Build Coastguard Worker }
1536*f6dc9357SAndroid Build Coastguard Worker
1537*f6dc9357SAndroid Build Coastguard Worker // !!!!!!!!!!!!!!! test it if newChar = '\0'
Replace(wchar_t oldChar,wchar_t newChar)1538*f6dc9357SAndroid Build Coastguard Worker void UString::Replace(wchar_t oldChar, wchar_t newChar) throw()
1539*f6dc9357SAndroid Build Coastguard Worker {
1540*f6dc9357SAndroid Build Coastguard Worker if (oldChar == newChar)
1541*f6dc9357SAndroid Build Coastguard Worker return; // 0;
1542*f6dc9357SAndroid Build Coastguard Worker // unsigned number = 0;
1543*f6dc9357SAndroid Build Coastguard Worker int pos = 0;
1544*f6dc9357SAndroid Build Coastguard Worker wchar_t *chars = _chars;
1545*f6dc9357SAndroid Build Coastguard Worker while ((unsigned)pos < _len)
1546*f6dc9357SAndroid Build Coastguard Worker {
1547*f6dc9357SAndroid Build Coastguard Worker pos = Find(oldChar, (unsigned)pos);
1548*f6dc9357SAndroid Build Coastguard Worker if (pos < 0)
1549*f6dc9357SAndroid Build Coastguard Worker break;
1550*f6dc9357SAndroid Build Coastguard Worker chars[(unsigned)pos] = newChar;
1551*f6dc9357SAndroid Build Coastguard Worker pos++;
1552*f6dc9357SAndroid Build Coastguard Worker // number++;
1553*f6dc9357SAndroid Build Coastguard Worker }
1554*f6dc9357SAndroid Build Coastguard Worker return; // number;
1555*f6dc9357SAndroid Build Coastguard Worker }
1556*f6dc9357SAndroid Build Coastguard Worker
Replace(const UString & oldString,const UString & newString)1557*f6dc9357SAndroid Build Coastguard Worker void UString::Replace(const UString &oldString, const UString &newString)
1558*f6dc9357SAndroid Build Coastguard Worker {
1559*f6dc9357SAndroid Build Coastguard Worker if (oldString.IsEmpty())
1560*f6dc9357SAndroid Build Coastguard Worker return; // 0;
1561*f6dc9357SAndroid Build Coastguard Worker if (oldString == newString)
1562*f6dc9357SAndroid Build Coastguard Worker return; // 0;
1563*f6dc9357SAndroid Build Coastguard Worker unsigned oldLen = oldString.Len();
1564*f6dc9357SAndroid Build Coastguard Worker unsigned newLen = newString.Len();
1565*f6dc9357SAndroid Build Coastguard Worker // unsigned number = 0;
1566*f6dc9357SAndroid Build Coastguard Worker int pos = 0;
1567*f6dc9357SAndroid Build Coastguard Worker while ((unsigned)pos < _len)
1568*f6dc9357SAndroid Build Coastguard Worker {
1569*f6dc9357SAndroid Build Coastguard Worker pos = Find(oldString, (unsigned)pos);
1570*f6dc9357SAndroid Build Coastguard Worker if (pos < 0)
1571*f6dc9357SAndroid Build Coastguard Worker break;
1572*f6dc9357SAndroid Build Coastguard Worker Delete((unsigned)pos, oldLen);
1573*f6dc9357SAndroid Build Coastguard Worker Insert((unsigned)pos, newString);
1574*f6dc9357SAndroid Build Coastguard Worker pos += newLen;
1575*f6dc9357SAndroid Build Coastguard Worker // number++;
1576*f6dc9357SAndroid Build Coastguard Worker }
1577*f6dc9357SAndroid Build Coastguard Worker // return number;
1578*f6dc9357SAndroid Build Coastguard Worker }
1579*f6dc9357SAndroid Build Coastguard Worker
Delete(unsigned index)1580*f6dc9357SAndroid Build Coastguard Worker void UString::Delete(unsigned index) throw()
1581*f6dc9357SAndroid Build Coastguard Worker {
1582*f6dc9357SAndroid Build Coastguard Worker MoveItems(index, index + 1);
1583*f6dc9357SAndroid Build Coastguard Worker _len--;
1584*f6dc9357SAndroid Build Coastguard Worker }
1585*f6dc9357SAndroid Build Coastguard Worker
Delete(unsigned index,unsigned count)1586*f6dc9357SAndroid Build Coastguard Worker void UString::Delete(unsigned index, unsigned count) throw()
1587*f6dc9357SAndroid Build Coastguard Worker {
1588*f6dc9357SAndroid Build Coastguard Worker if (index + count > _len)
1589*f6dc9357SAndroid Build Coastguard Worker count = _len - index;
1590*f6dc9357SAndroid Build Coastguard Worker if (count > 0)
1591*f6dc9357SAndroid Build Coastguard Worker {
1592*f6dc9357SAndroid Build Coastguard Worker MoveItems(index, index + count);
1593*f6dc9357SAndroid Build Coastguard Worker _len -= count;
1594*f6dc9357SAndroid Build Coastguard Worker }
1595*f6dc9357SAndroid Build Coastguard Worker }
1596*f6dc9357SAndroid Build Coastguard Worker
DeleteFrontal(unsigned num)1597*f6dc9357SAndroid Build Coastguard Worker void UString::DeleteFrontal(unsigned num) throw()
1598*f6dc9357SAndroid Build Coastguard Worker {
1599*f6dc9357SAndroid Build Coastguard Worker if (num != 0)
1600*f6dc9357SAndroid Build Coastguard Worker {
1601*f6dc9357SAndroid Build Coastguard Worker MoveItems(0, num);
1602*f6dc9357SAndroid Build Coastguard Worker _len -= num;
1603*f6dc9357SAndroid Build Coastguard Worker }
1604*f6dc9357SAndroid Build Coastguard Worker }
1605*f6dc9357SAndroid Build Coastguard Worker
1606*f6dc9357SAndroid Build Coastguard Worker
1607*f6dc9357SAndroid Build Coastguard Worker // ---------- UString2 ----------
1608*f6dc9357SAndroid Build Coastguard Worker
ReAlloc2(unsigned newLimit)1609*f6dc9357SAndroid Build Coastguard Worker void UString2::ReAlloc2(unsigned newLimit)
1610*f6dc9357SAndroid Build Coastguard Worker {
1611*f6dc9357SAndroid Build Coastguard Worker // wrong (_len) is allowed after this function
1612*f6dc9357SAndroid Build Coastguard Worker CHECK_STRING_ALLOC_LEN(newLimit)
1613*f6dc9357SAndroid Build Coastguard Worker // MY_STRING_REALLOC(_chars, wchar_t, newLimit + 1, 0);
1614*f6dc9357SAndroid Build Coastguard Worker if (_chars)
1615*f6dc9357SAndroid Build Coastguard Worker {
1616*f6dc9357SAndroid Build Coastguard Worker MY_STRING_DELETE(_chars)
1617*f6dc9357SAndroid Build Coastguard Worker _chars = NULL;
1618*f6dc9357SAndroid Build Coastguard Worker // _len = 0;
1619*f6dc9357SAndroid Build Coastguard Worker }
1620*f6dc9357SAndroid Build Coastguard Worker _chars = MY_STRING_NEW_wchar_t((size_t)newLimit + 1);
1621*f6dc9357SAndroid Build Coastguard Worker _chars[0] = 0;
1622*f6dc9357SAndroid Build Coastguard Worker // _len = newLimit;
1623*f6dc9357SAndroid Build Coastguard Worker }
1624*f6dc9357SAndroid Build Coastguard Worker
SetStartLen(unsigned len)1625*f6dc9357SAndroid Build Coastguard Worker void UString2::SetStartLen(unsigned len)
1626*f6dc9357SAndroid Build Coastguard Worker {
1627*f6dc9357SAndroid Build Coastguard Worker _chars = NULL;
1628*f6dc9357SAndroid Build Coastguard Worker _chars = MY_STRING_NEW_wchar_t((size_t)len + 1);
1629*f6dc9357SAndroid Build Coastguard Worker _len = len;
1630*f6dc9357SAndroid Build Coastguard Worker }
1631*f6dc9357SAndroid Build Coastguard Worker
1632*f6dc9357SAndroid Build Coastguard Worker
1633*f6dc9357SAndroid Build Coastguard Worker /*
1634*f6dc9357SAndroid Build Coastguard Worker UString2::UString2(wchar_t c)
1635*f6dc9357SAndroid Build Coastguard Worker {
1636*f6dc9357SAndroid Build Coastguard Worker SetStartLen(1);
1637*f6dc9357SAndroid Build Coastguard Worker wchar_t *chars = _chars;
1638*f6dc9357SAndroid Build Coastguard Worker chars[0] = c;
1639*f6dc9357SAndroid Build Coastguard Worker chars[1] = 0;
1640*f6dc9357SAndroid Build Coastguard Worker }
1641*f6dc9357SAndroid Build Coastguard Worker */
1642*f6dc9357SAndroid Build Coastguard Worker
UString2(const wchar_t * s)1643*f6dc9357SAndroid Build Coastguard Worker UString2::UString2(const wchar_t *s)
1644*f6dc9357SAndroid Build Coastguard Worker {
1645*f6dc9357SAndroid Build Coastguard Worker const unsigned len = MyStringLen(s);
1646*f6dc9357SAndroid Build Coastguard Worker SetStartLen(len);
1647*f6dc9357SAndroid Build Coastguard Worker wmemcpy(_chars, s, len + 1);
1648*f6dc9357SAndroid Build Coastguard Worker }
1649*f6dc9357SAndroid Build Coastguard Worker
UString2(const UString2 & s)1650*f6dc9357SAndroid Build Coastguard Worker UString2::UString2(const UString2 &s): _chars(NULL), _len(0)
1651*f6dc9357SAndroid Build Coastguard Worker {
1652*f6dc9357SAndroid Build Coastguard Worker if (s._chars)
1653*f6dc9357SAndroid Build Coastguard Worker {
1654*f6dc9357SAndroid Build Coastguard Worker SetStartLen(s._len);
1655*f6dc9357SAndroid Build Coastguard Worker wmemcpy(_chars, s._chars, s._len + 1);
1656*f6dc9357SAndroid Build Coastguard Worker }
1657*f6dc9357SAndroid Build Coastguard Worker }
1658*f6dc9357SAndroid Build Coastguard Worker
1659*f6dc9357SAndroid Build Coastguard Worker /*
1660*f6dc9357SAndroid Build Coastguard Worker UString2 &UString2::operator=(wchar_t c)
1661*f6dc9357SAndroid Build Coastguard Worker {
1662*f6dc9357SAndroid Build Coastguard Worker if (1 > _len)
1663*f6dc9357SAndroid Build Coastguard Worker {
1664*f6dc9357SAndroid Build Coastguard Worker wchar_t *newBuf = MY_STRING_NEW_wchar_t(1 + 1);
1665*f6dc9357SAndroid Build Coastguard Worker if (_chars)
1666*f6dc9357SAndroid Build Coastguard Worker MY_STRING_DELETE(_chars)
1667*f6dc9357SAndroid Build Coastguard Worker _chars = newBuf;
1668*f6dc9357SAndroid Build Coastguard Worker }
1669*f6dc9357SAndroid Build Coastguard Worker _len = 1;
1670*f6dc9357SAndroid Build Coastguard Worker wchar_t *chars = _chars;
1671*f6dc9357SAndroid Build Coastguard Worker chars[0] = c;
1672*f6dc9357SAndroid Build Coastguard Worker chars[1] = 0;
1673*f6dc9357SAndroid Build Coastguard Worker return *this;
1674*f6dc9357SAndroid Build Coastguard Worker }
1675*f6dc9357SAndroid Build Coastguard Worker */
1676*f6dc9357SAndroid Build Coastguard Worker
operator =(const wchar_t * s)1677*f6dc9357SAndroid Build Coastguard Worker UString2 &UString2::operator=(const wchar_t *s)
1678*f6dc9357SAndroid Build Coastguard Worker {
1679*f6dc9357SAndroid Build Coastguard Worker unsigned len = MyStringLen(s);
1680*f6dc9357SAndroid Build Coastguard Worker if (len > _len)
1681*f6dc9357SAndroid Build Coastguard Worker {
1682*f6dc9357SAndroid Build Coastguard Worker wchar_t *newBuf = MY_STRING_NEW_wchar_t((size_t)len + 1);
1683*f6dc9357SAndroid Build Coastguard Worker if (_chars)
1684*f6dc9357SAndroid Build Coastguard Worker MY_STRING_DELETE(_chars)
1685*f6dc9357SAndroid Build Coastguard Worker _chars = newBuf;
1686*f6dc9357SAndroid Build Coastguard Worker }
1687*f6dc9357SAndroid Build Coastguard Worker _len = len;
1688*f6dc9357SAndroid Build Coastguard Worker MyStringCopy(_chars, s);
1689*f6dc9357SAndroid Build Coastguard Worker return *this;
1690*f6dc9357SAndroid Build Coastguard Worker }
1691*f6dc9357SAndroid Build Coastguard Worker
SetFromAscii(const char * s)1692*f6dc9357SAndroid Build Coastguard Worker void UString2::SetFromAscii(const char *s)
1693*f6dc9357SAndroid Build Coastguard Worker {
1694*f6dc9357SAndroid Build Coastguard Worker unsigned len = MyStringLen(s);
1695*f6dc9357SAndroid Build Coastguard Worker if (len > _len)
1696*f6dc9357SAndroid Build Coastguard Worker {
1697*f6dc9357SAndroid Build Coastguard Worker wchar_t *newBuf = MY_STRING_NEW_wchar_t((size_t)len + 1);
1698*f6dc9357SAndroid Build Coastguard Worker if (_chars)
1699*f6dc9357SAndroid Build Coastguard Worker MY_STRING_DELETE(_chars)
1700*f6dc9357SAndroid Build Coastguard Worker _chars = newBuf;
1701*f6dc9357SAndroid Build Coastguard Worker }
1702*f6dc9357SAndroid Build Coastguard Worker wchar_t *chars = _chars;
1703*f6dc9357SAndroid Build Coastguard Worker for (unsigned i = 0; i < len; i++)
1704*f6dc9357SAndroid Build Coastguard Worker chars[i] = (unsigned char)s[i];
1705*f6dc9357SAndroid Build Coastguard Worker chars[len] = 0;
1706*f6dc9357SAndroid Build Coastguard Worker _len = len;
1707*f6dc9357SAndroid Build Coastguard Worker }
1708*f6dc9357SAndroid Build Coastguard Worker
operator =(const UString2 & s)1709*f6dc9357SAndroid Build Coastguard Worker UString2 &UString2::operator=(const UString2 &s)
1710*f6dc9357SAndroid Build Coastguard Worker {
1711*f6dc9357SAndroid Build Coastguard Worker if (&s == this)
1712*f6dc9357SAndroid Build Coastguard Worker return *this;
1713*f6dc9357SAndroid Build Coastguard Worker unsigned len = s._len;
1714*f6dc9357SAndroid Build Coastguard Worker if (len > _len)
1715*f6dc9357SAndroid Build Coastguard Worker {
1716*f6dc9357SAndroid Build Coastguard Worker wchar_t *newBuf = MY_STRING_NEW_wchar_t((size_t)len + 1);
1717*f6dc9357SAndroid Build Coastguard Worker if (_chars)
1718*f6dc9357SAndroid Build Coastguard Worker MY_STRING_DELETE(_chars)
1719*f6dc9357SAndroid Build Coastguard Worker _chars = newBuf;
1720*f6dc9357SAndroid Build Coastguard Worker }
1721*f6dc9357SAndroid Build Coastguard Worker _len = len;
1722*f6dc9357SAndroid Build Coastguard Worker MyStringCopy(_chars, s._chars);
1723*f6dc9357SAndroid Build Coastguard Worker return *this;
1724*f6dc9357SAndroid Build Coastguard Worker }
1725*f6dc9357SAndroid Build Coastguard Worker
operator ==(const UString2 & s1,const UString2 & s2)1726*f6dc9357SAndroid Build Coastguard Worker bool operator==(const UString2 &s1, const UString2 &s2)
1727*f6dc9357SAndroid Build Coastguard Worker {
1728*f6dc9357SAndroid Build Coastguard Worker return s1.Len() == s2.Len() && (s1.IsEmpty() || wcscmp(s1.GetRawPtr(), s2.GetRawPtr()) == 0);
1729*f6dc9357SAndroid Build Coastguard Worker }
1730*f6dc9357SAndroid Build Coastguard Worker
operator ==(const UString2 & s1,const wchar_t * s2)1731*f6dc9357SAndroid Build Coastguard Worker bool operator==(const UString2 &s1, const wchar_t *s2)
1732*f6dc9357SAndroid Build Coastguard Worker {
1733*f6dc9357SAndroid Build Coastguard Worker if (s1.IsEmpty())
1734*f6dc9357SAndroid Build Coastguard Worker return (*s2 == 0);
1735*f6dc9357SAndroid Build Coastguard Worker return wcscmp(s1.GetRawPtr(), s2) == 0;
1736*f6dc9357SAndroid Build Coastguard Worker }
1737*f6dc9357SAndroid Build Coastguard Worker
operator ==(const wchar_t * s1,const UString2 & s2)1738*f6dc9357SAndroid Build Coastguard Worker bool operator==(const wchar_t *s1, const UString2 &s2)
1739*f6dc9357SAndroid Build Coastguard Worker {
1740*f6dc9357SAndroid Build Coastguard Worker if (s2.IsEmpty())
1741*f6dc9357SAndroid Build Coastguard Worker return (*s1 == 0);
1742*f6dc9357SAndroid Build Coastguard Worker return wcscmp(s1, s2.GetRawPtr()) == 0;
1743*f6dc9357SAndroid Build Coastguard Worker }
1744*f6dc9357SAndroid Build Coastguard Worker
1745*f6dc9357SAndroid Build Coastguard Worker
1746*f6dc9357SAndroid Build Coastguard Worker
1747*f6dc9357SAndroid Build Coastguard Worker // ----------------------------------------
1748*f6dc9357SAndroid Build Coastguard Worker
1749*f6dc9357SAndroid Build Coastguard Worker /*
1750*f6dc9357SAndroid Build Coastguard Worker int MyStringCompareNoCase(const char *s1, const char *s2)
1751*f6dc9357SAndroid Build Coastguard Worker {
1752*f6dc9357SAndroid Build Coastguard Worker return MyStringCompareNoCase(MultiByteToUnicodeString(s1), MultiByteToUnicodeString(s2));
1753*f6dc9357SAndroid Build Coastguard Worker }
1754*f6dc9357SAndroid Build Coastguard Worker */
1755*f6dc9357SAndroid Build Coastguard Worker
1756*f6dc9357SAndroid Build Coastguard Worker #if !defined(USE_UNICODE_FSTRING) || !defined(_UNICODE)
1757*f6dc9357SAndroid Build Coastguard Worker
GetCurrentCodePage()1758*f6dc9357SAndroid Build Coastguard Worker static inline UINT GetCurrentCodePage()
1759*f6dc9357SAndroid Build Coastguard Worker {
1760*f6dc9357SAndroid Build Coastguard Worker #if defined(UNDER_CE) || !defined(_WIN32)
1761*f6dc9357SAndroid Build Coastguard Worker return CP_ACP;
1762*f6dc9357SAndroid Build Coastguard Worker #else
1763*f6dc9357SAndroid Build Coastguard Worker return ::AreFileApisANSI() ? CP_ACP : CP_OEMCP;
1764*f6dc9357SAndroid Build Coastguard Worker #endif
1765*f6dc9357SAndroid Build Coastguard Worker }
1766*f6dc9357SAndroid Build Coastguard Worker
1767*f6dc9357SAndroid Build Coastguard Worker #endif
1768*f6dc9357SAndroid Build Coastguard Worker
1769*f6dc9357SAndroid Build Coastguard Worker #ifdef USE_UNICODE_FSTRING
1770*f6dc9357SAndroid Build Coastguard Worker
1771*f6dc9357SAndroid Build Coastguard Worker #ifndef _UNICODE
1772*f6dc9357SAndroid Build Coastguard Worker
fs2fas(CFSTR s)1773*f6dc9357SAndroid Build Coastguard Worker AString fs2fas(CFSTR s)
1774*f6dc9357SAndroid Build Coastguard Worker {
1775*f6dc9357SAndroid Build Coastguard Worker return UnicodeStringToMultiByte(s, GetCurrentCodePage());
1776*f6dc9357SAndroid Build Coastguard Worker }
1777*f6dc9357SAndroid Build Coastguard Worker
fas2fs(const char * s)1778*f6dc9357SAndroid Build Coastguard Worker FString fas2fs(const char *s)
1779*f6dc9357SAndroid Build Coastguard Worker {
1780*f6dc9357SAndroid Build Coastguard Worker return MultiByteToUnicodeString(s, GetCurrentCodePage());
1781*f6dc9357SAndroid Build Coastguard Worker }
1782*f6dc9357SAndroid Build Coastguard Worker
fas2fs(const AString & s)1783*f6dc9357SAndroid Build Coastguard Worker FString fas2fs(const AString &s)
1784*f6dc9357SAndroid Build Coastguard Worker {
1785*f6dc9357SAndroid Build Coastguard Worker return MultiByteToUnicodeString(s, GetCurrentCodePage());
1786*f6dc9357SAndroid Build Coastguard Worker }
1787*f6dc9357SAndroid Build Coastguard Worker
1788*f6dc9357SAndroid Build Coastguard Worker #endif // _UNICODE
1789*f6dc9357SAndroid Build Coastguard Worker
1790*f6dc9357SAndroid Build Coastguard Worker #else // USE_UNICODE_FSTRING
1791*f6dc9357SAndroid Build Coastguard Worker
fs2us(const FChar * s)1792*f6dc9357SAndroid Build Coastguard Worker UString fs2us(const FChar *s)
1793*f6dc9357SAndroid Build Coastguard Worker {
1794*f6dc9357SAndroid Build Coastguard Worker return MultiByteToUnicodeString(s, GetCurrentCodePage());
1795*f6dc9357SAndroid Build Coastguard Worker }
1796*f6dc9357SAndroid Build Coastguard Worker
fs2us(const FString & s)1797*f6dc9357SAndroid Build Coastguard Worker UString fs2us(const FString &s)
1798*f6dc9357SAndroid Build Coastguard Worker {
1799*f6dc9357SAndroid Build Coastguard Worker return MultiByteToUnicodeString(s, GetCurrentCodePage());
1800*f6dc9357SAndroid Build Coastguard Worker }
1801*f6dc9357SAndroid Build Coastguard Worker
us2fs(const wchar_t * s)1802*f6dc9357SAndroid Build Coastguard Worker FString us2fs(const wchar_t *s)
1803*f6dc9357SAndroid Build Coastguard Worker {
1804*f6dc9357SAndroid Build Coastguard Worker return UnicodeStringToMultiByte(s, GetCurrentCodePage());
1805*f6dc9357SAndroid Build Coastguard Worker }
1806*f6dc9357SAndroid Build Coastguard Worker
1807*f6dc9357SAndroid Build Coastguard Worker #endif // USE_UNICODE_FSTRING
1808*f6dc9357SAndroid Build Coastguard Worker
1809*f6dc9357SAndroid Build Coastguard Worker
FindWord_In_LowCaseAsciiList_NoCase(const char * p,const wchar_t * str)1810*f6dc9357SAndroid Build Coastguard Worker bool CStringFinder::FindWord_In_LowCaseAsciiList_NoCase(const char *p, const wchar_t *str)
1811*f6dc9357SAndroid Build Coastguard Worker {
1812*f6dc9357SAndroid Build Coastguard Worker _temp.Empty();
1813*f6dc9357SAndroid Build Coastguard Worker for (;;)
1814*f6dc9357SAndroid Build Coastguard Worker {
1815*f6dc9357SAndroid Build Coastguard Worker const wchar_t c = *str++;
1816*f6dc9357SAndroid Build Coastguard Worker if (c == 0)
1817*f6dc9357SAndroid Build Coastguard Worker break;
1818*f6dc9357SAndroid Build Coastguard Worker if (c <= 0x20 || c > 0x7f)
1819*f6dc9357SAndroid Build Coastguard Worker return false;
1820*f6dc9357SAndroid Build Coastguard Worker _temp.Add_Char((char)MyCharLower_Ascii((char)c));
1821*f6dc9357SAndroid Build Coastguard Worker }
1822*f6dc9357SAndroid Build Coastguard Worker
1823*f6dc9357SAndroid Build Coastguard Worker while (*p != 0)
1824*f6dc9357SAndroid Build Coastguard Worker {
1825*f6dc9357SAndroid Build Coastguard Worker const char *s2 = _temp.Ptr();
1826*f6dc9357SAndroid Build Coastguard Worker char c, c2;
1827*f6dc9357SAndroid Build Coastguard Worker do
1828*f6dc9357SAndroid Build Coastguard Worker {
1829*f6dc9357SAndroid Build Coastguard Worker c = *p++;
1830*f6dc9357SAndroid Build Coastguard Worker c2 = *s2++;
1831*f6dc9357SAndroid Build Coastguard Worker }
1832*f6dc9357SAndroid Build Coastguard Worker while (c == c2);
1833*f6dc9357SAndroid Build Coastguard Worker
1834*f6dc9357SAndroid Build Coastguard Worker if (c == ' ')
1835*f6dc9357SAndroid Build Coastguard Worker {
1836*f6dc9357SAndroid Build Coastguard Worker if (c2 == 0)
1837*f6dc9357SAndroid Build Coastguard Worker return true;
1838*f6dc9357SAndroid Build Coastguard Worker continue;
1839*f6dc9357SAndroid Build Coastguard Worker }
1840*f6dc9357SAndroid Build Coastguard Worker
1841*f6dc9357SAndroid Build Coastguard Worker while (*p++ != ' ');
1842*f6dc9357SAndroid Build Coastguard Worker }
1843*f6dc9357SAndroid Build Coastguard Worker
1844*f6dc9357SAndroid Build Coastguard Worker return false;
1845*f6dc9357SAndroid Build Coastguard Worker }
1846*f6dc9357SAndroid Build Coastguard Worker
1847*f6dc9357SAndroid Build Coastguard Worker
SplitString(const UString & srcString,UStringVector & destStrings)1848*f6dc9357SAndroid Build Coastguard Worker void SplitString(const UString &srcString, UStringVector &destStrings)
1849*f6dc9357SAndroid Build Coastguard Worker {
1850*f6dc9357SAndroid Build Coastguard Worker destStrings.Clear();
1851*f6dc9357SAndroid Build Coastguard Worker unsigned len = srcString.Len();
1852*f6dc9357SAndroid Build Coastguard Worker if (len == 0)
1853*f6dc9357SAndroid Build Coastguard Worker return;
1854*f6dc9357SAndroid Build Coastguard Worker UString s;
1855*f6dc9357SAndroid Build Coastguard Worker for (unsigned i = 0; i < len; i++)
1856*f6dc9357SAndroid Build Coastguard Worker {
1857*f6dc9357SAndroid Build Coastguard Worker const wchar_t c = srcString[i];
1858*f6dc9357SAndroid Build Coastguard Worker if (c == ' ')
1859*f6dc9357SAndroid Build Coastguard Worker {
1860*f6dc9357SAndroid Build Coastguard Worker if (!s.IsEmpty())
1861*f6dc9357SAndroid Build Coastguard Worker {
1862*f6dc9357SAndroid Build Coastguard Worker destStrings.Add(s);
1863*f6dc9357SAndroid Build Coastguard Worker s.Empty();
1864*f6dc9357SAndroid Build Coastguard Worker }
1865*f6dc9357SAndroid Build Coastguard Worker }
1866*f6dc9357SAndroid Build Coastguard Worker else
1867*f6dc9357SAndroid Build Coastguard Worker s += c;
1868*f6dc9357SAndroid Build Coastguard Worker }
1869*f6dc9357SAndroid Build Coastguard Worker if (!s.IsEmpty())
1870*f6dc9357SAndroid Build Coastguard Worker destStrings.Add(s);
1871*f6dc9357SAndroid Build Coastguard Worker }
1872