OLD | NEW |
1 // Copyright 2014 PDFium Authors. All rights reserved. | 1 // Copyright 2014 PDFium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com | 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com |
6 | 6 |
7 #include <stddef.h> // For offsetof(). | 7 #include <stddef.h> // For offsetof(). |
8 | 8 |
9 #include "../../include/fxcrt/fx_basic.h" | 9 #include "../../include/fxcrt/fx_basic.h" |
10 #include "../../../third_party/base/numerics/safe_math.h" | 10 #include "../../../third_party/base/numerics/safe_math.h" |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
49 return; | 49 return; |
50 } | 50 } |
51 if (stringSrc.m_pData->m_nRefs >= 0) { | 51 if (stringSrc.m_pData->m_nRefs >= 0) { |
52 m_pData = stringSrc.m_pData; | 52 m_pData = stringSrc.m_pData; |
53 m_pData->Retain(); | 53 m_pData->Retain(); |
54 } else { | 54 } else { |
55 m_pData = NULL; | 55 m_pData = NULL; |
56 *this = stringSrc; | 56 *this = stringSrc; |
57 } | 57 } |
58 } | 58 } |
59 CFX_WideString::CFX_WideString(FX_LPCWSTR lpsz, FX_STRSIZE nLen) { | 59 CFX_WideString::CFX_WideString(const FX_WCHAR* lpsz, FX_STRSIZE nLen) { |
60 if (nLen < 0) { | 60 if (nLen < 0) { |
61 nLen = lpsz ? FXSYS_wcslen(lpsz) : 0; | 61 nLen = lpsz ? FXSYS_wcslen(lpsz) : 0; |
62 } | 62 } |
63 if (nLen) { | 63 if (nLen) { |
64 m_pData = StringData::Create(nLen); | 64 m_pData = StringData::Create(nLen); |
65 if (m_pData) { | 65 if (m_pData) { |
66 FXSYS_memcpy32(m_pData->m_String, lpsz, nLen * sizeof(FX_WCHAR)); | 66 FXSYS_memcpy32(m_pData->m_String, lpsz, nLen * sizeof(FX_WCHAR)); |
67 } | 67 } |
68 } else { | 68 } else { |
69 m_pData = NULL; | 69 m_pData = NULL; |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
110 nNewLength = m_pData ? FXSYS_wcslen(m_pData->m_String) : 0; | 110 nNewLength = m_pData ? FXSYS_wcslen(m_pData->m_String) : 0; |
111 } | 111 } |
112 if (nNewLength == 0) { | 112 if (nNewLength == 0) { |
113 Empty(); | 113 Empty(); |
114 return; | 114 return; |
115 } | 115 } |
116 FXSYS_assert(nNewLength <= m_pData->m_nAllocLength); | 116 FXSYS_assert(nNewLength <= m_pData->m_nAllocLength); |
117 m_pData->m_nDataLength = nNewLength; | 117 m_pData->m_nDataLength = nNewLength; |
118 m_pData->m_String[nNewLength] = 0; | 118 m_pData->m_String[nNewLength] = 0; |
119 } | 119 } |
120 const CFX_WideString& CFX_WideString::operator=(FX_LPCWSTR lpsz) | 120 const CFX_WideString& CFX_WideString::operator=(const FX_WCHAR* lpsz) |
121 { | 121 { |
122 if (lpsz == NULL || lpsz[0] == 0) { | 122 if (lpsz == NULL || lpsz[0] == 0) { |
123 Empty(); | 123 Empty(); |
124 } else { | 124 } else { |
125 AssignCopy(FXSYS_wcslen(lpsz), lpsz); | 125 AssignCopy(FXSYS_wcslen(lpsz), lpsz); |
126 } | 126 } |
127 return *this; | 127 return *this; |
128 } | 128 } |
129 const CFX_WideString& CFX_WideString::operator=(const CFX_WideStringC& stringSrc
) | 129 const CFX_WideString& CFX_WideString::operator=(const CFX_WideStringC& stringSrc
) |
130 { | 130 { |
(...skipping 21 matching lines...) Expand all Loading... |
152 m_pData->Retain(); | 152 m_pData->Retain(); |
153 } | 153 } |
154 } | 154 } |
155 return *this; | 155 return *this; |
156 } | 156 } |
157 const CFX_WideString& CFX_WideString::operator+=(FX_WCHAR ch) | 157 const CFX_WideString& CFX_WideString::operator+=(FX_WCHAR ch) |
158 { | 158 { |
159 ConcatInPlace(1, &ch); | 159 ConcatInPlace(1, &ch); |
160 return *this; | 160 return *this; |
161 } | 161 } |
162 const CFX_WideString& CFX_WideString::operator+=(FX_LPCWSTR lpsz) | 162 const CFX_WideString& CFX_WideString::operator+=(const FX_WCHAR* lpsz) |
163 { | 163 { |
164 if (lpsz) { | 164 if (lpsz) { |
165 ConcatInPlace(FXSYS_wcslen(lpsz), lpsz); | 165 ConcatInPlace(FXSYS_wcslen(lpsz), lpsz); |
166 } | 166 } |
167 return *this; | 167 return *this; |
168 } | 168 } |
169 const CFX_WideString& CFX_WideString::operator+=(const CFX_WideString& string) | 169 const CFX_WideString& CFX_WideString::operator+=(const CFX_WideString& string) |
170 { | 170 { |
171 if (string.m_pData == NULL) { | 171 if (string.m_pData == NULL) { |
172 return *this; | 172 return *this; |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
214 m_pData->m_String, | 214 m_pData->m_String, |
215 m_pData->m_nDataLength) == 0; | 215 m_pData->m_nDataLength) == 0; |
216 } | 216 } |
217 void CFX_WideString::Empty() | 217 void CFX_WideString::Empty() |
218 { | 218 { |
219 if (m_pData) { | 219 if (m_pData) { |
220 m_pData->Release(); | 220 m_pData->Release(); |
221 m_pData = NULL; | 221 m_pData = NULL; |
222 } | 222 } |
223 } | 223 } |
224 void CFX_WideString::ConcatInPlace(FX_STRSIZE nSrcLen, FX_LPCWSTR lpszSrcData) | 224 void CFX_WideString::ConcatInPlace(FX_STRSIZE nSrcLen, const FX_WCHAR* lpszSrcDa
ta) |
225 { | 225 { |
226 if (nSrcLen == 0 || lpszSrcData == NULL) { | 226 if (nSrcLen == 0 || lpszSrcData == NULL) { |
227 return; | 227 return; |
228 } | 228 } |
229 if (m_pData == NULL) { | 229 if (m_pData == NULL) { |
230 m_pData = StringData::Create(nSrcLen); | 230 m_pData = StringData::Create(nSrcLen); |
231 if (m_pData) { | 231 if (m_pData) { |
232 FXSYS_memcpy32(m_pData->m_String, lpszSrcData, nSrcLen * sizeof(FX_W
CHAR)); | 232 FXSYS_memcpy32(m_pData->m_String, lpszSrcData, nSrcLen * sizeof(FX_W
CHAR)); |
233 } | 233 } |
234 return; | 234 return; |
235 } | 235 } |
236 if (m_pData->m_nRefs > 1 || m_pData->m_nDataLength + nSrcLen > m_pData->m_nA
llocLength) { | 236 if (m_pData->m_nRefs > 1 || m_pData->m_nDataLength + nSrcLen > m_pData->m_nA
llocLength) { |
237 ConcatCopy(m_pData->m_nDataLength, m_pData->m_String, nSrcLen, lpszSrcDa
ta); | 237 ConcatCopy(m_pData->m_nDataLength, m_pData->m_String, nSrcLen, lpszSrcDa
ta); |
238 } else { | 238 } else { |
239 FXSYS_memcpy32(m_pData->m_String + m_pData->m_nDataLength, lpszSrcData,
nSrcLen * sizeof(FX_WCHAR)); | 239 FXSYS_memcpy32(m_pData->m_String + m_pData->m_nDataLength, lpszSrcData,
nSrcLen * sizeof(FX_WCHAR)); |
240 m_pData->m_nDataLength += nSrcLen; | 240 m_pData->m_nDataLength += nSrcLen; |
241 m_pData->m_String[m_pData->m_nDataLength] = 0; | 241 m_pData->m_String[m_pData->m_nDataLength] = 0; |
242 } | 242 } |
243 } | 243 } |
244 void CFX_WideString::ConcatCopy(FX_STRSIZE nSrc1Len, FX_LPCWSTR lpszSrc1Data, | 244 void CFX_WideString::ConcatCopy(FX_STRSIZE nSrc1Len, const FX_WCHAR* lpszSrc1Dat
a, |
245 FX_STRSIZE nSrc2Len, FX_LPCWSTR lpszSrc2Data) | 245 FX_STRSIZE nSrc2Len, const FX_WCHAR* lpszSrc2Dat
a) |
246 { | 246 { |
247 FX_STRSIZE nNewLen = nSrc1Len + nSrc2Len; | 247 FX_STRSIZE nNewLen = nSrc1Len + nSrc2Len; |
248 if (nNewLen <= 0) { | 248 if (nNewLen <= 0) { |
249 return; | 249 return; |
250 } | 250 } |
251 // Don't release until done copying, might be one of the arguments. | 251 // Don't release until done copying, might be one of the arguments. |
252 StringData* pOldData = m_pData; | 252 StringData* pOldData = m_pData; |
253 m_pData = StringData::Create(nNewLen); | 253 m_pData = StringData::Create(nNewLen); |
254 if (m_pData) { | 254 if (m_pData) { |
255 wmemcpy(m_pData->m_String, lpszSrc1Data, nSrc1Len); | 255 wmemcpy(m_pData->m_String, lpszSrc1Data, nSrc1Len); |
(...skipping 15 matching lines...) Expand all Loading... |
271 } | 271 } |
272 } | 272 } |
273 void CFX_WideString::AllocBeforeWrite(FX_STRSIZE nLen) | 273 void CFX_WideString::AllocBeforeWrite(FX_STRSIZE nLen) |
274 { | 274 { |
275 if (m_pData && m_pData->m_nRefs <= 1 && m_pData->m_nAllocLength >= nLen) { | 275 if (m_pData && m_pData->m_nRefs <= 1 && m_pData->m_nAllocLength >= nLen) { |
276 return; | 276 return; |
277 } | 277 } |
278 Empty(); | 278 Empty(); |
279 m_pData = StringData::Create(nLen); | 279 m_pData = StringData::Create(nLen); |
280 } | 280 } |
281 void CFX_WideString::AssignCopy(FX_STRSIZE nSrcLen, FX_LPCWSTR lpszSrcData) | 281 void CFX_WideString::AssignCopy(FX_STRSIZE nSrcLen, const FX_WCHAR* lpszSrcData) |
282 { | 282 { |
283 AllocBeforeWrite(nSrcLen); | 283 AllocBeforeWrite(nSrcLen); |
284 FXSYS_memcpy32(m_pData->m_String, lpszSrcData, nSrcLen * sizeof(FX_WCHAR)); | 284 FXSYS_memcpy32(m_pData->m_String, lpszSrcData, nSrcLen * sizeof(FX_WCHAR)); |
285 m_pData->m_nDataLength = nSrcLen; | 285 m_pData->m_nDataLength = nSrcLen; |
286 m_pData->m_String[nSrcLen] = 0; | 286 m_pData->m_String[nSrcLen] = 0; |
287 } | 287 } |
288 int CFX_WideString::Compare(FX_LPCWSTR lpsz) const | 288 int CFX_WideString::Compare(const FX_WCHAR* lpsz) const |
289 { | 289 { |
290 if (m_pData == NULL) { | 290 if (m_pData == NULL) { |
291 return (lpsz == NULL || lpsz[0] == 0) ? 0 : -1; | 291 return (lpsz == NULL || lpsz[0] == 0) ? 0 : -1; |
292 } | 292 } |
293 return FXSYS_wcscmp(m_pData->m_String, lpsz); | 293 return FXSYS_wcscmp(m_pData->m_String, lpsz); |
294 } | 294 } |
295 CFX_ByteString CFX_WideString::UTF8Encode() const | 295 CFX_ByteString CFX_WideString::UTF8Encode() const |
296 { | 296 { |
297 return FX_UTF8Encode(*this); | 297 return FX_UTF8Encode(*this); |
298 } | 298 } |
299 CFX_ByteString CFX_WideString::UTF16LE_Encode() const | 299 CFX_ByteString CFX_WideString::UTF16LE_Encode() const |
300 { | 300 { |
301 if (m_pData == NULL) { | 301 if (m_pData == NULL) { |
302 return CFX_ByteString(FX_BSTRC("\0\0")); | 302 return CFX_ByteString(FX_BSTRC("\0\0")); |
303 } | 303 } |
304 int len = m_pData->m_nDataLength; | 304 int len = m_pData->m_nDataLength; |
305 CFX_ByteString result; | 305 CFX_ByteString result; |
306 FX_LPSTR buffer = result.GetBuffer(len * 2 + 2); | 306 FX_CHAR* buffer = result.GetBuffer(len * 2 + 2); |
307 for (int i = 0; i < len; i ++) { | 307 for (int i = 0; i < len; i ++) { |
308 buffer[i * 2] = m_pData->m_String[i] & 0xff; | 308 buffer[i * 2] = m_pData->m_String[i] & 0xff; |
309 buffer[i * 2 + 1] = m_pData->m_String[i] >> 8; | 309 buffer[i * 2 + 1] = m_pData->m_String[i] >> 8; |
310 } | 310 } |
311 buffer[len * 2] = 0; | 311 buffer[len * 2] = 0; |
312 buffer[len * 2 + 1] = 0; | 312 buffer[len * 2 + 1] = 0; |
313 result.ReleaseBuffer(len * 2 + 2); | 313 result.ReleaseBuffer(len * 2 + 2); |
314 return result; | 314 return result; |
315 } | 315 } |
316 void CFX_WideString::ConvertFrom(const CFX_ByteString& str, CFX_CharMap* pCharMa
p) | 316 void CFX_WideString::ConvertFrom(const CFX_ByteString& str, CFX_CharMap* pCharMa
p) |
317 { | 317 { |
318 if (pCharMap == NULL) { | 318 if (pCharMap == NULL) { |
319 pCharMap = CFX_CharMap::GetDefaultMapper(); | 319 pCharMap = CFX_CharMap::GetDefaultMapper(); |
320 } | 320 } |
321 *this = pCharMap->m_GetWideString(pCharMap, str); | 321 *this = pCharMap->m_GetWideString(pCharMap, str); |
322 } | 322 } |
323 void CFX_WideString::Reserve(FX_STRSIZE len) | 323 void CFX_WideString::Reserve(FX_STRSIZE len) |
324 { | 324 { |
325 GetBuffer(len); | 325 GetBuffer(len); |
326 ReleaseBuffer(GetLength()); | 326 ReleaseBuffer(GetLength()); |
327 } | 327 } |
328 FX_LPWSTR CFX_WideString::GetBuffer(FX_STRSIZE nMinBufLength) | 328 FX_WCHAR* CFX_WideString::GetBuffer(FX_STRSIZE nMinBufLength) |
329 { | 329 { |
330 if (m_pData == NULL && nMinBufLength == 0) { | 330 if (m_pData == NULL && nMinBufLength == 0) { |
331 return NULL; | 331 return NULL; |
332 } | 332 } |
333 if (m_pData && m_pData->m_nRefs <= 1 && m_pData->m_nAllocLength >= nMinBufLe
ngth) { | 333 if (m_pData && m_pData->m_nRefs <= 1 && m_pData->m_nAllocLength >= nMinBufLe
ngth) { |
334 return m_pData->m_String; | 334 return m_pData->m_String; |
335 } | 335 } |
336 if (m_pData == NULL) { | 336 if (m_pData == NULL) { |
337 m_pData = StringData::Create(nMinBufLength); | 337 m_pData = StringData::Create(nMinBufLength); |
338 if (!m_pData) { | 338 if (!m_pData) { |
(...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
464 if (nCount < 0) { | 464 if (nCount < 0) { |
465 nCount = 0; | 465 nCount = 0; |
466 } | 466 } |
467 if (nCount >= m_pData->m_nDataLength) { | 467 if (nCount >= m_pData->m_nDataLength) { |
468 return *this; | 468 return *this; |
469 } | 469 } |
470 CFX_WideString dest; | 470 CFX_WideString dest; |
471 AllocCopy(dest, nCount, m_pData->m_nDataLength - nCount); | 471 AllocCopy(dest, nCount, m_pData->m_nDataLength - nCount); |
472 return dest; | 472 return dest; |
473 } | 473 } |
474 int CFX_WideString::CompareNoCase(FX_LPCWSTR lpsz) const | 474 int CFX_WideString::CompareNoCase(const FX_WCHAR* lpsz) const |
475 { | 475 { |
476 if (m_pData == NULL) { | 476 if (m_pData == NULL) { |
477 return (lpsz == NULL || lpsz[0] == 0) ? 0 : -1; | 477 return (lpsz == NULL || lpsz[0] == 0) ? 0 : -1; |
478 } | 478 } |
479 return FXSYS_wcsicmp(m_pData->m_String, lpsz); | 479 return FXSYS_wcsicmp(m_pData->m_String, lpsz); |
480 } | 480 } |
481 int CFX_WideString::Compare(const CFX_WideString& str) const | 481 int CFX_WideString::Compare(const CFX_WideString& str) const |
482 { | 482 { |
483 if (m_pData == NULL) { | 483 if (m_pData == NULL) { |
484 if (str.m_pData == NULL) { | 484 if (str.m_pData == NULL) { |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
530 { | 530 { |
531 if (m_pData == NULL) { | 531 if (m_pData == NULL) { |
532 return; | 532 return; |
533 } | 533 } |
534 CopyBeforeWrite(); | 534 CopyBeforeWrite(); |
535 if (GetLength() < 1) { | 535 if (GetLength() < 1) { |
536 return; | 536 return; |
537 } | 537 } |
538 FXSYS_wcsupr(m_pData->m_String); | 538 FXSYS_wcsupr(m_pData->m_String); |
539 } | 539 } |
540 FX_STRSIZE CFX_WideString::Find(FX_LPCWSTR lpszSub, FX_STRSIZE nStart) const | 540 FX_STRSIZE CFX_WideString::Find(const FX_WCHAR* lpszSub, FX_STRSIZE nStart) cons
t |
541 { | 541 { |
542 FX_STRSIZE nLength = GetLength(); | 542 FX_STRSIZE nLength = GetLength(); |
543 if (nLength < 1 || nStart > nLength) { | 543 if (nLength < 1 || nStart > nLength) { |
544 return -1; | 544 return -1; |
545 } | 545 } |
546 FX_LPCWSTR lpsz = FXSYS_wcsstr(m_pData->m_String + nStart, lpszSub); | 546 const FX_WCHAR* lpsz = FXSYS_wcsstr(m_pData->m_String + nStart, lpszSub); |
547 return (lpsz == NULL) ? -1 : (int)(lpsz - m_pData->m_String); | 547 return (lpsz == NULL) ? -1 : (int)(lpsz - m_pData->m_String); |
548 } | 548 } |
549 FX_STRSIZE CFX_WideString::Find(FX_WCHAR ch, FX_STRSIZE nStart) const | 549 FX_STRSIZE CFX_WideString::Find(FX_WCHAR ch, FX_STRSIZE nStart) const |
550 { | 550 { |
551 if (m_pData == NULL) { | 551 if (m_pData == NULL) { |
552 return -1; | 552 return -1; |
553 } | 553 } |
554 FX_STRSIZE nLength = m_pData->m_nDataLength; | 554 FX_STRSIZE nLength = m_pData->m_nDataLength; |
555 if (nStart >= nLength) { | 555 if (nStart >= nLength) { |
556 return -1; | 556 return -1; |
557 } | 557 } |
558 FX_LPCWSTR lpsz = FXSYS_wcschr(m_pData->m_String + nStart, ch); | 558 const FX_WCHAR* lpsz = FXSYS_wcschr(m_pData->m_String + nStart, ch); |
559 return (lpsz == NULL) ? -1 : (int)(lpsz - m_pData->m_String); | 559 return (lpsz == NULL) ? -1 : (int)(lpsz - m_pData->m_String); |
560 } | 560 } |
561 void CFX_WideString::TrimRight(FX_LPCWSTR lpszTargetList) | 561 void CFX_WideString::TrimRight(const FX_WCHAR* lpszTargetList) |
562 { | 562 { |
563 FXSYS_assert(lpszTargetList != NULL); | 563 FXSYS_assert(lpszTargetList != NULL); |
564 if (m_pData == NULL || *lpszTargetList == 0) { | 564 if (m_pData == NULL || *lpszTargetList == 0) { |
565 return; | 565 return; |
566 } | 566 } |
567 CopyBeforeWrite(); | 567 CopyBeforeWrite(); |
568 FX_STRSIZE len = GetLength(); | 568 FX_STRSIZE len = GetLength(); |
569 if (len < 1) { | 569 if (len < 1) { |
570 return; | 570 return; |
571 } | 571 } |
(...skipping 11 matching lines...) Expand all Loading... |
583 } | 583 } |
584 void CFX_WideString::TrimRight(FX_WCHAR chTarget) | 584 void CFX_WideString::TrimRight(FX_WCHAR chTarget) |
585 { | 585 { |
586 FX_WCHAR str[2] = {chTarget, 0}; | 586 FX_WCHAR str[2] = {chTarget, 0}; |
587 TrimRight(str); | 587 TrimRight(str); |
588 } | 588 } |
589 void CFX_WideString::TrimRight() | 589 void CFX_WideString::TrimRight() |
590 { | 590 { |
591 TrimRight(L"\x09\x0a\x0b\x0c\x0d\x20"); | 591 TrimRight(L"\x09\x0a\x0b\x0c\x0d\x20"); |
592 } | 592 } |
593 void CFX_WideString::TrimLeft(FX_LPCWSTR lpszTargets) | 593 void CFX_WideString::TrimLeft(const FX_WCHAR* lpszTargets) |
594 { | 594 { |
595 FXSYS_assert(lpszTargets != NULL); | 595 FXSYS_assert(lpszTargets != NULL); |
596 if (m_pData == NULL || *lpszTargets == 0) { | 596 if (m_pData == NULL || *lpszTargets == 0) { |
597 return; | 597 return; |
598 } | 598 } |
599 CopyBeforeWrite(); | 599 CopyBeforeWrite(); |
600 if (GetLength() < 1) { | 600 if (GetLength() < 1) { |
601 return; | 601 return; |
602 } | 602 } |
603 FX_LPCWSTR lpsz = m_pData->m_String; | 603 const FX_WCHAR* lpsz = m_pData->m_String; |
604 while (*lpsz != 0) { | 604 while (*lpsz != 0) { |
605 if (FXSYS_wcschr(lpszTargets, *lpsz) == NULL) { | 605 if (FXSYS_wcschr(lpszTargets, *lpsz) == NULL) { |
606 break; | 606 break; |
607 } | 607 } |
608 lpsz ++; | 608 lpsz ++; |
609 } | 609 } |
610 if (lpsz != m_pData->m_String) { | 610 if (lpsz != m_pData->m_String) { |
611 int nDataLength = m_pData->m_nDataLength - (FX_STRSIZE)(lpsz - m_pData->
m_String); | 611 int nDataLength = m_pData->m_nDataLength - (FX_STRSIZE)(lpsz - m_pData->
m_String); |
612 FXSYS_memmove32(m_pData->m_String, lpsz, (nDataLength + 1)*sizeof(FX_WCH
AR)); | 612 FXSYS_memmove32(m_pData->m_String, lpsz, (nDataLength + 1)*sizeof(FX_WCH
AR)); |
613 m_pData->m_nDataLength = nDataLength; | 613 m_pData->m_nDataLength = nDataLength; |
614 } | 614 } |
615 } | 615 } |
616 void CFX_WideString::TrimLeft(FX_WCHAR chTarget) | 616 void CFX_WideString::TrimLeft(FX_WCHAR chTarget) |
617 { | 617 { |
618 FX_WCHAR str[2] = {chTarget, 0}; | 618 FX_WCHAR str[2] = {chTarget, 0}; |
619 TrimLeft(str); | 619 TrimLeft(str); |
620 } | 620 } |
621 void CFX_WideString::TrimLeft() | 621 void CFX_WideString::TrimLeft() |
622 { | 622 { |
623 TrimLeft(L"\x09\x0a\x0b\x0c\x0d\x20"); | 623 TrimLeft(L"\x09\x0a\x0b\x0c\x0d\x20"); |
624 } | 624 } |
625 FX_STRSIZE CFX_WideString::Replace(FX_LPCWSTR lpszOld, FX_LPCWSTR lpszNew) | 625 FX_STRSIZE CFX_WideString::Replace(const FX_WCHAR* lpszOld, const FX_WCHAR* lpsz
New) |
626 { | 626 { |
627 if (GetLength() < 1) { | 627 if (GetLength() < 1) { |
628 return 0; | 628 return 0; |
629 } | 629 } |
630 if (lpszOld == NULL) { | 630 if (lpszOld == NULL) { |
631 return 0; | 631 return 0; |
632 } | 632 } |
633 FX_STRSIZE nSourceLen = FXSYS_wcslen(lpszOld); | 633 FX_STRSIZE nSourceLen = FXSYS_wcslen(lpszOld); |
634 if (nSourceLen == 0) { | 634 if (nSourceLen == 0) { |
635 return 0; | 635 return 0; |
636 } | 636 } |
637 FX_STRSIZE nReplacementLen = lpszNew ? FXSYS_wcslen(lpszNew) : 0; | 637 FX_STRSIZE nReplacementLen = lpszNew ? FXSYS_wcslen(lpszNew) : 0; |
638 FX_STRSIZE nCount = 0; | 638 FX_STRSIZE nCount = 0; |
639 FX_LPWSTR lpszStart = m_pData->m_String; | 639 FX_WCHAR* lpszStart = m_pData->m_String; |
640 FX_LPWSTR lpszEnd = m_pData->m_String + m_pData->m_nDataLength; | 640 FX_WCHAR* lpszEnd = m_pData->m_String + m_pData->m_nDataLength; |
641 FX_LPWSTR lpszTarget; | 641 FX_WCHAR* lpszTarget; |
642 { | 642 { |
643 while ((lpszTarget = (FX_LPWSTR)FXSYS_wcsstr(lpszStart, lpszOld)) != NUL
L && lpszStart < lpszEnd) { | 643 while ((lpszTarget = (FX_WCHAR*)FXSYS_wcsstr(lpszStart, lpszOld)) != NUL
L && lpszStart < lpszEnd) { |
644 nCount++; | 644 nCount++; |
645 lpszStart = lpszTarget + nSourceLen; | 645 lpszStart = lpszTarget + nSourceLen; |
646 } | 646 } |
647 } | 647 } |
648 if (nCount > 0) { | 648 if (nCount > 0) { |
649 CopyBeforeWrite(); | 649 CopyBeforeWrite(); |
650 FX_STRSIZE nOldLength = m_pData->m_nDataLength; | 650 FX_STRSIZE nOldLength = m_pData->m_nDataLength; |
651 FX_STRSIZE nNewLength = nOldLength + (nReplacementLen - nSourceLen) * n
Count; | 651 FX_STRSIZE nNewLength = nOldLength + (nReplacementLen - nSourceLen) * n
Count; |
652 if (m_pData->m_nAllocLength < nNewLength || m_pData->m_nRefs > 1) { | 652 if (m_pData->m_nAllocLength < nNewLength || m_pData->m_nRefs > 1) { |
653 StringData* pOldData = m_pData; | 653 StringData* pOldData = m_pData; |
654 FX_LPCWSTR pstr = m_pData->m_String; | 654 const FX_WCHAR* pstr = m_pData->m_String; |
655 m_pData = StringData::Create(nNewLength); | 655 m_pData = StringData::Create(nNewLength); |
656 if (!m_pData) { | 656 if (!m_pData) { |
657 return 0; | 657 return 0; |
658 } | 658 } |
659 FXSYS_memcpy32(m_pData->m_String, pstr, pOldData->m_nDataLength * si
zeof(FX_WCHAR)); | 659 FXSYS_memcpy32(m_pData->m_String, pstr, pOldData->m_nDataLength * si
zeof(FX_WCHAR)); |
660 pOldData->Release(); | 660 pOldData->Release(); |
661 } | 661 } |
662 lpszStart = m_pData->m_String; | 662 lpszStart = m_pData->m_String; |
663 lpszEnd = m_pData->m_String + FX_MAX(m_pData->m_nDataLength, nNewLength)
; | 663 lpszEnd = m_pData->m_String + FX_MAX(m_pData->m_nDataLength, nNewLength)
; |
664 { | 664 { |
665 while ((lpszTarget = (FX_LPWSTR)FXSYS_wcsstr(lpszStart, lpszOld)) !=
NULL && lpszStart < lpszEnd) { | 665 while ((lpszTarget = (FX_WCHAR*)FXSYS_wcsstr(lpszStart, lpszOld)) !=
NULL && lpszStart < lpszEnd) { |
666 FX_STRSIZE nBalance = nOldLength - (FX_STRSIZE)(lpszTarget - m_p
Data->m_String + nSourceLen); | 666 FX_STRSIZE nBalance = nOldLength - (FX_STRSIZE)(lpszTarget - m_p
Data->m_String + nSourceLen); |
667 FXSYS_memmove32(lpszTarget + nReplacementLen, lpszTarget + nSour
ceLen, nBalance * sizeof(FX_WCHAR)); | 667 FXSYS_memmove32(lpszTarget + nReplacementLen, lpszTarget + nSour
ceLen, nBalance * sizeof(FX_WCHAR)); |
668 FXSYS_memcpy32(lpszTarget, lpszNew, nReplacementLen * sizeof(FX_
WCHAR)); | 668 FXSYS_memcpy32(lpszTarget, lpszNew, nReplacementLen * sizeof(FX_
WCHAR)); |
669 lpszStart = lpszTarget + nReplacementLen; | 669 lpszStart = lpszTarget + nReplacementLen; |
670 lpszStart[nBalance] = 0; | 670 lpszStart[nBalance] = 0; |
671 nOldLength += (nReplacementLen - nSourceLen); | 671 nOldLength += (nReplacementLen - nSourceLen); |
672 } | 672 } |
673 } | 673 } |
674 ASSERT(m_pData->m_String[nNewLength] == 0); | 674 ASSERT(m_pData->m_String[nNewLength] == 0); |
675 m_pData->m_nDataLength = nNewLength; | 675 m_pData->m_nDataLength = nNewLength; |
676 } | 676 } |
677 return nCount; | 677 return nCount; |
678 } | 678 } |
679 FX_STRSIZE CFX_WideString::Insert(FX_STRSIZE nIndex, FX_WCHAR ch) | 679 FX_STRSIZE CFX_WideString::Insert(FX_STRSIZE nIndex, FX_WCHAR ch) |
680 { | 680 { |
681 CopyBeforeWrite(); | 681 CopyBeforeWrite(); |
682 if (nIndex < 0) { | 682 if (nIndex < 0) { |
683 nIndex = 0; | 683 nIndex = 0; |
684 } | 684 } |
685 FX_STRSIZE nNewLength = GetLength(); | 685 FX_STRSIZE nNewLength = GetLength(); |
686 if (nIndex > nNewLength) { | 686 if (nIndex > nNewLength) { |
687 nIndex = nNewLength; | 687 nIndex = nNewLength; |
688 } | 688 } |
689 nNewLength++; | 689 nNewLength++; |
690 if (m_pData == NULL || m_pData->m_nAllocLength < nNewLength) { | 690 if (m_pData == NULL || m_pData->m_nAllocLength < nNewLength) { |
691 StringData* pOldData = m_pData; | 691 StringData* pOldData = m_pData; |
692 FX_LPCWSTR pstr = m_pData->m_String; | 692 const FX_WCHAR* pstr = m_pData->m_String; |
693 m_pData = StringData::Create(nNewLength); | 693 m_pData = StringData::Create(nNewLength); |
694 if (!m_pData) { | 694 if (!m_pData) { |
695 return 0; | 695 return 0; |
696 } | 696 } |
697 if(pOldData != NULL) { | 697 if(pOldData != NULL) { |
698 FXSYS_memmove32(m_pData->m_String, pstr, (pOldData->m_nDataLength +
1)*sizeof(FX_WCHAR)); | 698 FXSYS_memmove32(m_pData->m_String, pstr, (pOldData->m_nDataLength +
1)*sizeof(FX_WCHAR)); |
699 pOldData->Release(); | 699 pOldData->Release(); |
700 } else { | 700 } else { |
701 m_pData->m_String[0] = 0; | 701 m_pData->m_String[0] = 0; |
702 } | 702 } |
(...skipping 24 matching lines...) Expand all Loading... |
727 } | 727 } |
728 FX_STRSIZE CFX_WideString::Remove(FX_WCHAR chRemove) | 728 FX_STRSIZE CFX_WideString::Remove(FX_WCHAR chRemove) |
729 { | 729 { |
730 if (m_pData == NULL) { | 730 if (m_pData == NULL) { |
731 return 0; | 731 return 0; |
732 } | 732 } |
733 CopyBeforeWrite(); | 733 CopyBeforeWrite(); |
734 if (GetLength() < 1) { | 734 if (GetLength() < 1) { |
735 return 0; | 735 return 0; |
736 } | 736 } |
737 FX_LPWSTR pstrSource = m_pData->m_String; | 737 FX_WCHAR* pstrSource = m_pData->m_String; |
738 FX_LPWSTR pstrDest = m_pData->m_String; | 738 FX_WCHAR* pstrDest = m_pData->m_String; |
739 FX_LPWSTR pstrEnd = m_pData->m_String + m_pData->m_nDataLength; | 739 FX_WCHAR* pstrEnd = m_pData->m_String + m_pData->m_nDataLength; |
740 while (pstrSource < pstrEnd) { | 740 while (pstrSource < pstrEnd) { |
741 if (*pstrSource != chRemove) { | 741 if (*pstrSource != chRemove) { |
742 *pstrDest = *pstrSource; | 742 *pstrDest = *pstrSource; |
743 pstrDest ++; | 743 pstrDest ++; |
744 } | 744 } |
745 pstrSource ++; | 745 pstrSource ++; |
746 } | 746 } |
747 *pstrDest = 0; | 747 *pstrDest = 0; |
748 FX_STRSIZE nCount = (FX_STRSIZE)(pstrSource - pstrDest); | 748 FX_STRSIZE nCount = (FX_STRSIZE)(pstrSource - pstrDest); |
749 m_pData->m_nDataLength -= nCount; | 749 m_pData->m_nDataLength -= nCount; |
750 return nCount; | 750 return nCount; |
751 } | 751 } |
752 #define FORCE_ANSI 0x10000 | 752 #define FORCE_ANSI 0x10000 |
753 #define FORCE_UNICODE 0x20000 | 753 #define FORCE_UNICODE 0x20000 |
754 #define FORCE_INT64 0x40000 | 754 #define FORCE_INT64 0x40000 |
755 void CFX_WideString::FormatV(FX_LPCWSTR lpszFormat, va_list argList) | 755 void CFX_WideString::FormatV(const FX_WCHAR* lpszFormat, va_list argList) |
756 { | 756 { |
757 va_list argListSave; | 757 va_list argListSave; |
758 #if defined(__ARMCC_VERSION) || (!defined(_MSC_VER) && (_FX_CPU_ == _FX_X64_ ||
_FX_CPU_ == _FX_IA64_ || _FX_CPU_ == _FX_ARM64_)) || defined(__native_client__) | 758 #if defined(__ARMCC_VERSION) || (!defined(_MSC_VER) && (_FX_CPU_ == _FX_X64_ ||
_FX_CPU_ == _FX_IA64_ || _FX_CPU_ == _FX_ARM64_)) || defined(__native_client__) |
759 va_copy(argListSave, argList); | 759 va_copy(argListSave, argList); |
760 #else | 760 #else |
761 argListSave = argList; | 761 argListSave = argList; |
762 #endif | 762 #endif |
763 int nMaxLen = 0; | 763 int nMaxLen = 0; |
764 for (FX_LPCWSTR lpsz = lpszFormat; *lpsz != 0; lpsz ++) { | 764 for (const FX_WCHAR* lpsz = lpszFormat; *lpsz != 0; lpsz ++) { |
765 if (*lpsz != '%' || *(lpsz = lpsz + 1) == '%') { | 765 if (*lpsz != '%' || *(lpsz = lpsz + 1) == '%') { |
766 nMaxLen += FXSYS_wcslen(lpsz); | 766 nMaxLen += FXSYS_wcslen(lpsz); |
767 continue; | 767 continue; |
768 } | 768 } |
769 int nItemLen = 0; | 769 int nItemLen = 0; |
770 int nWidth = 0; | 770 int nWidth = 0; |
771 for (; *lpsz != 0; lpsz ++) { | 771 for (; *lpsz != 0; lpsz ++) { |
772 if (*lpsz == '#') { | 772 if (*lpsz == '#') { |
773 nMaxLen += 2; | 773 nMaxLen += 2; |
774 } else if (*lpsz == '*') { | 774 } else if (*lpsz == '*') { |
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
838 case 'C'|FORCE_ANSI: | 838 case 'C'|FORCE_ANSI: |
839 nItemLen = 2; | 839 nItemLen = 2; |
840 va_arg(argList, int); | 840 va_arg(argList, int); |
841 break; | 841 break; |
842 case 'c'|FORCE_UNICODE: | 842 case 'c'|FORCE_UNICODE: |
843 case 'C'|FORCE_UNICODE: | 843 case 'C'|FORCE_UNICODE: |
844 nItemLen = 2; | 844 nItemLen = 2; |
845 va_arg(argList, int); | 845 va_arg(argList, int); |
846 break; | 846 break; |
847 case 's': { | 847 case 's': { |
848 FX_LPCWSTR pstrNextArg = va_arg(argList, FX_LPCWSTR); | 848 const FX_WCHAR* pstrNextArg = va_arg(argList, const FX_WCHAR
*); |
849 if (pstrNextArg == NULL) { | 849 if (pstrNextArg == NULL) { |
850 nItemLen = 6; | 850 nItemLen = 6; |
851 } else { | 851 } else { |
852 nItemLen = FXSYS_wcslen(pstrNextArg); | 852 nItemLen = FXSYS_wcslen(pstrNextArg); |
853 if (nItemLen < 1) { | 853 if (nItemLen < 1) { |
854 nItemLen = 1; | 854 nItemLen = 1; |
855 } | 855 } |
856 } | 856 } |
857 } | 857 } |
858 break; | 858 break; |
859 case 'S': { | 859 case 'S': { |
860 FX_LPCSTR pstrNextArg = va_arg(argList, FX_LPCSTR); | 860 const FX_CHAR* pstrNextArg = va_arg(argList, const FX_CHAR*)
; |
861 if (pstrNextArg == NULL) { | 861 if (pstrNextArg == NULL) { |
862 nItemLen = 6; | 862 nItemLen = 6; |
863 } else { | 863 } else { |
864 nItemLen = FXSYS_strlen(pstrNextArg); | 864 nItemLen = FXSYS_strlen(pstrNextArg); |
865 if (nItemLen < 1) { | 865 if (nItemLen < 1) { |
866 nItemLen = 1; | 866 nItemLen = 1; |
867 } | 867 } |
868 } | 868 } |
869 } | 869 } |
870 break; | 870 break; |
871 case 's'|FORCE_ANSI: | 871 case 's'|FORCE_ANSI: |
872 case 'S'|FORCE_ANSI: { | 872 case 'S'|FORCE_ANSI: { |
873 FX_LPCSTR pstrNextArg = va_arg(argList, FX_LPCSTR); | 873 const FX_CHAR* pstrNextArg = va_arg(argList, const FX_CHAR*)
; |
874 if (pstrNextArg == NULL) { | 874 if (pstrNextArg == NULL) { |
875 nItemLen = 6; | 875 nItemLen = 6; |
876 } else { | 876 } else { |
877 nItemLen = FXSYS_strlen(pstrNextArg); | 877 nItemLen = FXSYS_strlen(pstrNextArg); |
878 if (nItemLen < 1) { | 878 if (nItemLen < 1) { |
879 nItemLen = 1; | 879 nItemLen = 1; |
880 } | 880 } |
881 } | 881 } |
882 } | 882 } |
883 break; | 883 break; |
884 case 's'|FORCE_UNICODE: | 884 case 's'|FORCE_UNICODE: |
885 case 'S'|FORCE_UNICODE: { | 885 case 'S'|FORCE_UNICODE: { |
886 FX_LPWSTR pstrNextArg = va_arg(argList, FX_LPWSTR); | 886 FX_WCHAR* pstrNextArg = va_arg(argList, FX_WCHAR*); |
887 if (pstrNextArg == NULL) { | 887 if (pstrNextArg == NULL) { |
888 nItemLen = 6; | 888 nItemLen = 6; |
889 } else { | 889 } else { |
890 nItemLen = FXSYS_wcslen(pstrNextArg); | 890 nItemLen = FXSYS_wcslen(pstrNextArg); |
891 if (nItemLen < 1) { | 891 if (nItemLen < 1) { |
892 nItemLen = 1; | 892 nItemLen = 1; |
893 } | 893 } |
894 } | 894 } |
895 } | 895 } |
896 break; | 896 break; |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
957 } | 957 } |
958 nMaxLen += nItemLen; | 958 nMaxLen += nItemLen; |
959 } | 959 } |
960 GetBuffer(nMaxLen); | 960 GetBuffer(nMaxLen); |
961 if (m_pData) { | 961 if (m_pData) { |
962 FXSYS_vswprintf((wchar_t*)m_pData->m_String, nMaxLen + 1, (const wchar_t
*)lpszFormat, argListSave); | 962 FXSYS_vswprintf((wchar_t*)m_pData->m_String, nMaxLen + 1, (const wchar_t
*)lpszFormat, argListSave); |
963 ReleaseBuffer(); | 963 ReleaseBuffer(); |
964 } | 964 } |
965 va_end(argListSave); | 965 va_end(argListSave); |
966 } | 966 } |
967 void CFX_WideString::Format(FX_LPCWSTR lpszFormat, ...) | 967 void CFX_WideString::Format(const FX_WCHAR* lpszFormat, ...) |
968 { | 968 { |
969 va_list argList; | 969 va_list argList; |
970 va_start(argList, lpszFormat); | 970 va_start(argList, lpszFormat); |
971 FormatV(lpszFormat, argList); | 971 FormatV(lpszFormat, argList); |
972 va_end(argList); | 972 va_end(argList); |
973 } | 973 } |
974 FX_FLOAT FX_wtof(FX_LPCWSTR str, int len) | 974 FX_FLOAT FX_wtof(const FX_WCHAR* str, int len) |
975 { | 975 { |
976 if (len == 0) { | 976 if (len == 0) { |
977 return 0.0; | 977 return 0.0; |
978 } | 978 } |
979 int cc = 0; | 979 int cc = 0; |
980 FX_BOOL bNegative = FALSE; | 980 FX_BOOL bNegative = FALSE; |
981 if (str[0] == '+') { | 981 if (str[0] == '+') { |
982 cc++; | 982 cc++; |
983 } else if (str[0] == '-') { | 983 } else if (str[0] == '-') { |
984 bNegative = TRUE; | 984 bNegative = TRUE; |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1021 } | 1021 } |
1022 static CFX_ByteString _DefMap_GetByteString(CFX_CharMap* pCharMap, const CFX_Wid
eString& widestr) | 1022 static CFX_ByteString _DefMap_GetByteString(CFX_CharMap* pCharMap, const CFX_Wid
eString& widestr) |
1023 { | 1023 { |
1024 int src_len = widestr.GetLength(); | 1024 int src_len = widestr.GetLength(); |
1025 int codepage = pCharMap->m_GetCodePage ? pCharMap->m_GetCodePage() : 0; | 1025 int codepage = pCharMap->m_GetCodePage ? pCharMap->m_GetCodePage() : 0; |
1026 int dest_len = FXSYS_WideCharToMultiByte(codepage, 0, widestr.c_str(), src_l
en, NULL, 0, NULL, NULL); | 1026 int dest_len = FXSYS_WideCharToMultiByte(codepage, 0, widestr.c_str(), src_l
en, NULL, 0, NULL, NULL); |
1027 if (dest_len == 0) { | 1027 if (dest_len == 0) { |
1028 return CFX_ByteString(); | 1028 return CFX_ByteString(); |
1029 } | 1029 } |
1030 CFX_ByteString bytestr; | 1030 CFX_ByteString bytestr; |
1031 FX_LPSTR dest_buf = bytestr.GetBuffer(dest_len); | 1031 FX_CHAR* dest_buf = bytestr.GetBuffer(dest_len); |
1032 FXSYS_WideCharToMultiByte(codepage, 0, widestr.c_str(), src_len, dest_buf, d
est_len, NULL, NULL); | 1032 FXSYS_WideCharToMultiByte(codepage, 0, widestr.c_str(), src_len, dest_buf, d
est_len, NULL, NULL); |
1033 bytestr.ReleaseBuffer(dest_len); | 1033 bytestr.ReleaseBuffer(dest_len); |
1034 return bytestr; | 1034 return bytestr; |
1035 } | 1035 } |
1036 static CFX_WideString _DefMap_GetWideString(CFX_CharMap* pCharMap, const CFX_Byt
eString& bytestr) | 1036 static CFX_WideString _DefMap_GetWideString(CFX_CharMap* pCharMap, const CFX_Byt
eString& bytestr) |
1037 { | 1037 { |
1038 int src_len = bytestr.GetLength(); | 1038 int src_len = bytestr.GetLength(); |
1039 int codepage = pCharMap->m_GetCodePage ? pCharMap->m_GetCodePage() : 0; | 1039 int codepage = pCharMap->m_GetCodePage ? pCharMap->m_GetCodePage() : 0; |
1040 int dest_len = FXSYS_MultiByteToWideChar(codepage, 0, bytestr, src_len, NULL
, 0); | 1040 int dest_len = FXSYS_MultiByteToWideChar(codepage, 0, bytestr, src_len, NULL
, 0); |
1041 if (dest_len == 0) { | 1041 if (dest_len == 0) { |
1042 return CFX_WideString(); | 1042 return CFX_WideString(); |
1043 } | 1043 } |
1044 CFX_WideString widestr; | 1044 CFX_WideString widestr; |
1045 FX_LPWSTR dest_buf = widestr.GetBuffer(dest_len); | 1045 FX_WCHAR* dest_buf = widestr.GetBuffer(dest_len); |
1046 FXSYS_MultiByteToWideChar(codepage, 0, bytestr, src_len, dest_buf, dest_len)
; | 1046 FXSYS_MultiByteToWideChar(codepage, 0, bytestr, src_len, dest_buf, dest_len)
; |
1047 widestr.ReleaseBuffer(dest_len); | 1047 widestr.ReleaseBuffer(dest_len); |
1048 return widestr; | 1048 return widestr; |
1049 } | 1049 } |
1050 static int _DefMap_GetGBKCodePage() | 1050 static int _DefMap_GetGBKCodePage() |
1051 { | 1051 { |
1052 return 936; | 1052 return 936; |
1053 } | 1053 } |
1054 static int _DefMap_GetUHCCodePage() | 1054 static int _DefMap_GetUHCCodePage() |
1055 { | 1055 { |
(...skipping 21 matching lines...) Expand all Loading... |
1077 return (CFX_CharMap*)&g_DefaultJISMapper; | 1077 return (CFX_CharMap*)&g_DefaultJISMapper; |
1078 case 936: | 1078 case 936: |
1079 return (CFX_CharMap*)&g_DefaultGBKMapper; | 1079 return (CFX_CharMap*)&g_DefaultGBKMapper; |
1080 case 949: | 1080 case 949: |
1081 return (CFX_CharMap*)&g_DefaultUHCMapper; | 1081 return (CFX_CharMap*)&g_DefaultUHCMapper; |
1082 case 950: | 1082 case 950: |
1083 return (CFX_CharMap*)&g_DefaultBig5Mapper; | 1083 return (CFX_CharMap*)&g_DefaultBig5Mapper; |
1084 } | 1084 } |
1085 return NULL; | 1085 return NULL; |
1086 } | 1086 } |
OLD | NEW |