| 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 29 matching lines...) Expand all Loading... |
| 40 for (int ii = 0; ii < len; ii ++) { | 40 for (int ii = 0; ii < len; ii ++) { |
| 41 buf[ii] = buf1[ii + buf_pos + 1]; | 41 buf[ii] = buf1[ii + buf_pos + 1]; |
| 42 } | 42 } |
| 43 return len; | 43 return len; |
| 44 } | 44 } |
| 45 CFX_ByteString CFX_ByteString::FormatInteger(int i, FX_DWORD flags) | 45 CFX_ByteString CFX_ByteString::FormatInteger(int i, FX_DWORD flags) |
| 46 { | 46 { |
| 47 char buf[32]; | 47 char buf[32]; |
| 48 return CFX_ByteStringC(buf, _Buffer_itoa(buf, i, flags)); | 48 return CFX_ByteStringC(buf, _Buffer_itoa(buf, i, flags)); |
| 49 } | 49 } |
| 50 static CFX_StringData* FX_AllocString(int nLen) | 50 |
| 51 // static |
| 52 CFX_ByteString::StringData* CFX_ByteString::StringData::Create(int nLen) |
| 51 { | 53 { |
| 52 // |nLen| is currently declared as in |int|. TODO(palmer): It should be | 54 // |nLen| is currently declared as in |int|. TODO(palmer): It should be |
| 53 // a |size_t|, or at least unsigned. | 55 // a |size_t|, or at least unsigned. |
| 54 if (nLen == 0 || nLen < 0) { | 56 if (nLen == 0 || nLen < 0) { |
| 55 return NULL; | 57 return NULL; |
| 56 } | 58 } |
| 57 | 59 |
| 58 // Fixed portion of header plus a NUL char not included in m_nAllocLength. | 60 // Fixed portion of header plus a NUL char not included in m_nAllocLength. |
| 59 // sizeof(FX_CHAR) is always 1, used for consistency with CFX_Widestring. | 61 // sizeof(FX_CHAR) is always 1, used for consistency with CFX_Widestring. |
| 60 int overhead = offsetof(CFX_StringData, m_String) + sizeof(FX_CHAR); | 62 int overhead = offsetof(StringData, m_String) + sizeof(FX_CHAR); |
| 61 pdfium::base::CheckedNumeric<int> nSize = nLen; | 63 pdfium::base::CheckedNumeric<int> nSize = nLen; |
| 62 nSize += overhead; | 64 nSize += overhead; |
| 63 | 65 |
| 64 // Now round to an 8-byte boundary. We'd expect that this is the minimum | 66 // Now round to an 8-byte boundary. We'd expect that this is the minimum |
| 65 // granularity of any of the underlying allocators, so there may be cases | 67 // granularity of any of the underlying allocators, so there may be cases |
| 66 // where we can save a re-alloc when adding a few characters to a string | 68 // where we can save a re-alloc when adding a few characters to a string |
| 67 // by using this otherwise wasted space. | 69 // by using this otherwise wasted space. |
| 68 nSize += 7; | 70 nSize += 7; |
| 69 int totalSize = nSize.ValueOrDie() & ~7; | 71 int totalSize = nSize.ValueOrDie() & ~7; |
| 70 int usableSize = totalSize - overhead; | 72 int usableSize = totalSize - overhead; |
| 71 FXSYS_assert(usableSize >= nLen); | 73 FXSYS_assert(usableSize >= nLen); |
| 72 | 74 |
| 73 CFX_StringData* pData = (CFX_StringData*)FX_Alloc(FX_BYTE, totalSize); | 75 void* pData = FX_Alloc(FX_BYTE, totalSize); |
| 74 if (!pData) { | 76 if (!pData) { |
| 75 return NULL; | 77 return NULL; |
| 76 } | 78 } |
| 77 pData->m_nAllocLength = usableSize; | 79 return new (pData) StringData(nLen, usableSize); |
| 78 pData->m_nDataLength = nLen; | |
| 79 pData->m_nRefs = 1; | |
| 80 pData->m_String[nLen] = 0; | |
| 81 return pData; | |
| 82 } | |
| 83 static void FX_ReleaseString(CFX_StringData* pData) | |
| 84 { | |
| 85 if (pData == NULL) { | |
| 86 return; | |
| 87 } | |
| 88 pData->m_nRefs --; | |
| 89 if (pData->m_nRefs <= 0) { | |
| 90 FX_Free(pData); | |
| 91 } | |
| 92 } | 80 } |
| 93 CFX_ByteString::~CFX_ByteString() | 81 CFX_ByteString::~CFX_ByteString() |
| 94 { | 82 { |
| 95 if (m_pData == NULL) { | 83 if (m_pData) { |
| 96 return; | 84 m_pData->Release(); |
| 97 } | |
| 98 m_pData->m_nRefs --; | |
| 99 if (m_pData->m_nRefs < 1) { | |
| 100 FX_Free(m_pData); | |
| 101 } | 85 } |
| 102 } | 86 } |
| 103 CFX_ByteString::CFX_ByteString(FX_LPCSTR lpsz, FX_STRSIZE nLen) | 87 CFX_ByteString::CFX_ByteString(FX_LPCSTR lpsz, FX_STRSIZE nLen) |
| 104 { | 88 { |
| 105 if (nLen < 0) { | 89 if (nLen < 0) { |
| 106 nLen = lpsz ? FXSYS_strlen(lpsz) : 0; | 90 nLen = lpsz ? FXSYS_strlen(lpsz) : 0; |
| 107 } | 91 } |
| 108 if (nLen) { | 92 if (nLen) { |
| 109 m_pData = FX_AllocString(nLen); | 93 m_pData = StringData::Create(nLen); |
| 110 if (m_pData) { | 94 if (m_pData) { |
| 111 FXSYS_memcpy32(m_pData->m_String, lpsz, nLen); | 95 FXSYS_memcpy32(m_pData->m_String, lpsz, nLen); |
| 112 } | 96 } |
| 113 } else { | 97 } else { |
| 114 m_pData = NULL; | 98 m_pData = NULL; |
| 115 } | 99 } |
| 116 } | 100 } |
| 117 CFX_ByteString::CFX_ByteString(FX_LPCBYTE lpsz, FX_STRSIZE nLen) | 101 CFX_ByteString::CFX_ByteString(FX_LPCBYTE lpsz, FX_STRSIZE nLen) |
| 118 { | 102 { |
| 119 if (nLen > 0) { | 103 if (nLen > 0) { |
| 120 m_pData = FX_AllocString(nLen); | 104 m_pData = StringData::Create(nLen); |
| 121 if (m_pData) { | 105 if (m_pData) { |
| 122 FXSYS_memcpy32(m_pData->m_String, lpsz, nLen); | 106 FXSYS_memcpy32(m_pData->m_String, lpsz, nLen); |
| 123 } | 107 } |
| 124 } else { | 108 } else { |
| 125 m_pData = NULL; | 109 m_pData = NULL; |
| 126 } | 110 } |
| 127 } | 111 } |
| 128 CFX_ByteString::CFX_ByteString(char ch) | 112 CFX_ByteString::CFX_ByteString(char ch) |
| 129 { | 113 { |
| 130 m_pData = FX_AllocString(1); | 114 m_pData = StringData::Create(1); |
| 131 if (m_pData) { | 115 if (m_pData) { |
| 132 m_pData->m_String[0] = ch; | 116 m_pData->m_String[0] = ch; |
| 133 } | 117 } |
| 134 } | 118 } |
| 135 CFX_ByteString::CFX_ByteString(const CFX_ByteString& stringSrc) | 119 CFX_ByteString::CFX_ByteString(const CFX_ByteString& stringSrc) |
| 136 { | 120 { |
| 137 if (stringSrc.m_pData == NULL) { | 121 if (stringSrc.m_pData == NULL) { |
| 138 m_pData = NULL; | 122 m_pData = NULL; |
| 139 return; | 123 return; |
| 140 } | 124 } |
| 141 if (stringSrc.m_pData->m_nRefs >= 0) { | 125 if (stringSrc.m_pData->m_nRefs >= 0) { |
| 142 m_pData = stringSrc.m_pData; | 126 m_pData = stringSrc.m_pData; |
| 143 m_pData->m_nRefs ++; | 127 m_pData->Retain(); |
| 144 } else { | 128 } else { |
| 145 m_pData = NULL; | 129 m_pData = NULL; |
| 146 *this = stringSrc; | 130 *this = stringSrc; |
| 147 } | 131 } |
| 148 } | 132 } |
| 149 CFX_ByteString::CFX_ByteString(FX_BSTR stringSrc) | 133 CFX_ByteString::CFX_ByteString(FX_BSTR stringSrc) |
| 150 { | 134 { |
| 151 if (stringSrc.IsEmpty()) { | 135 if (stringSrc.IsEmpty()) { |
| 152 m_pData = NULL; | 136 m_pData = NULL; |
| 153 return; | 137 return; |
| 154 } else { | 138 } else { |
| 155 m_pData = NULL; | 139 m_pData = NULL; |
| 156 *this = stringSrc; | 140 *this = stringSrc; |
| 157 } | 141 } |
| 158 } | 142 } |
| 159 CFX_ByteString::CFX_ByteString(FX_BSTR str1, FX_BSTR str2) | 143 CFX_ByteString::CFX_ByteString(FX_BSTR str1, FX_BSTR str2) |
| 160 { | 144 { |
| 161 m_pData = NULL; | 145 m_pData = NULL; |
| 162 int nNewLen = str1.GetLength() + str2.GetLength(); | 146 int nNewLen = str1.GetLength() + str2.GetLength(); |
| 163 if (nNewLen == 0) { | 147 if (nNewLen == 0) { |
| 164 return; | 148 return; |
| 165 } | 149 } |
| 166 m_pData = FX_AllocString(nNewLen); | 150 m_pData = StringData::Create(nNewLen); |
| 167 if (m_pData) { | 151 if (m_pData) { |
| 168 FXSYS_memcpy32(m_pData->m_String, str1.GetCStr(), str1.GetLength()); | 152 FXSYS_memcpy32(m_pData->m_String, str1.GetCStr(), str1.GetLength()); |
| 169 FXSYS_memcpy32(m_pData->m_String + str1.GetLength(), str2.GetCStr(), str
2.GetLength()); | 153 FXSYS_memcpy32(m_pData->m_String + str1.GetLength(), str2.GetCStr(), str
2.GetLength()); |
| 170 } | 154 } |
| 171 } | 155 } |
| 172 const CFX_ByteString& CFX_ByteString::operator=(FX_LPCSTR lpsz) | 156 const CFX_ByteString& CFX_ByteString::operator=(FX_LPCSTR lpsz) |
| 173 { | 157 { |
| 174 if (lpsz == NULL || lpsz[0] == 0) { | 158 if (lpsz == NULL || lpsz[0] == 0) { |
| 175 Empty(); | 159 Empty(); |
| 176 } else { | 160 } else { |
| (...skipping 17 matching lines...) Expand all Loading... |
| 194 } | 178 } |
| 195 if (stringSrc.IsEmpty()) { | 179 if (stringSrc.IsEmpty()) { |
| 196 Empty(); | 180 Empty(); |
| 197 } else if ((m_pData && m_pData->m_nRefs < 0) || | 181 } else if ((m_pData && m_pData->m_nRefs < 0) || |
| 198 (stringSrc.m_pData && stringSrc.m_pData->m_nRefs < 0)) { | 182 (stringSrc.m_pData && stringSrc.m_pData->m_nRefs < 0)) { |
| 199 AssignCopy(stringSrc.m_pData->m_nDataLength, stringSrc.m_pData->m_String
); | 183 AssignCopy(stringSrc.m_pData->m_nDataLength, stringSrc.m_pData->m_String
); |
| 200 } else { | 184 } else { |
| 201 Empty(); | 185 Empty(); |
| 202 m_pData = stringSrc.m_pData; | 186 m_pData = stringSrc.m_pData; |
| 203 if (m_pData) { | 187 if (m_pData) { |
| 204 m_pData->m_nRefs ++; | 188 m_pData->Retain(); |
| 205 } | 189 } |
| 206 } | 190 } |
| 207 return *this; | 191 return *this; |
| 208 } | 192 } |
| 209 const CFX_ByteString& CFX_ByteString::operator=(const CFX_BinaryBuf& buf) | 193 const CFX_ByteString& CFX_ByteString::operator=(const CFX_BinaryBuf& buf) |
| 210 { | 194 { |
| 211 Load(buf.GetBuffer(), buf.GetSize()); | 195 Load(buf.GetBuffer(), buf.GetSize()); |
| 212 return *this; | 196 return *this; |
| 213 } | 197 } |
| 214 void CFX_ByteString::Load(FX_LPCBYTE buf, FX_STRSIZE len) | 198 void CFX_ByteString::Load(FX_LPCBYTE buf, FX_STRSIZE len) |
| 215 { | 199 { |
| 216 Empty(); | 200 Empty(); |
| 217 if (len) { | 201 if (len) { |
| 218 m_pData = FX_AllocString(len); | 202 m_pData = StringData::Create(len); |
| 219 if (m_pData) { | 203 if (m_pData) { |
| 220 FXSYS_memcpy32(m_pData->m_String, buf, len); | 204 FXSYS_memcpy32(m_pData->m_String, buf, len); |
| 221 } | 205 } |
| 222 } else { | 206 } else { |
| 223 m_pData = NULL; | 207 m_pData = NULL; |
| 224 } | 208 } |
| 225 } | 209 } |
| 226 const CFX_ByteString& CFX_ByteString::operator+=(FX_LPCSTR lpsz) | 210 const CFX_ByteString& CFX_ByteString::operator+=(FX_LPCSTR lpsz) |
| 227 { | 211 { |
| 228 if (lpsz) { | 212 if (lpsz) { |
| (...skipping 23 matching lines...) Expand all Loading... |
| 252 return *this; | 236 return *this; |
| 253 } | 237 } |
| 254 bool CFX_ByteString::Equal(const char* ptr) const | 238 bool CFX_ByteString::Equal(const char* ptr) const |
| 255 { | 239 { |
| 256 if (!m_pData) { | 240 if (!m_pData) { |
| 257 return !ptr || ptr[0] == '\0'; | 241 return !ptr || ptr[0] == '\0'; |
| 258 } | 242 } |
| 259 if (!ptr) { | 243 if (!ptr) { |
| 260 return m_pData->m_nDataLength == 0; | 244 return m_pData->m_nDataLength == 0; |
| 261 } | 245 } |
| 262 return strlen(ptr) == m_pData->m_nDataLength && | 246 return FXSYS_strlen(ptr) == m_pData->m_nDataLength && |
| 263 FXSYS_memcmp32(ptr, m_pData->m_String, m_pData->m_nDataLength) == 0; | 247 FXSYS_memcmp32(ptr, m_pData->m_String, m_pData->m_nDataLength) == 0; |
| 264 } | 248 } |
| 265 bool CFX_ByteString::Equal(const CFX_ByteStringC& str) const | 249 bool CFX_ByteString::Equal(const CFX_ByteStringC& str) const |
| 266 { | 250 { |
| 267 if (m_pData == NULL) { | 251 if (m_pData == NULL) { |
| 268 return str.IsEmpty(); | 252 return str.IsEmpty(); |
| 269 } | 253 } |
| 270 return m_pData->m_nDataLength == str.GetLength() && | 254 return m_pData->m_nDataLength == str.GetLength() && |
| 271 FXSYS_memcmp32(m_pData->m_String, str.GetCStr(), str.GetLength()) == 0; | 255 FXSYS_memcmp32(m_pData->m_String, str.GetCStr(), str.GetLength()) == 0; |
| 272 } | 256 } |
| 273 bool CFX_ByteString::Equal(const CFX_ByteString& other) const | 257 bool CFX_ByteString::Equal(const CFX_ByteString& other) const |
| 274 { | 258 { |
| 275 if (IsEmpty()) { | 259 if (IsEmpty()) { |
| 276 return other.IsEmpty(); | 260 return other.IsEmpty(); |
| 277 } | 261 } |
| 278 if (other.IsEmpty()) { | 262 if (other.IsEmpty()) { |
| 279 return false; | 263 return false; |
| 280 } | 264 } |
| 281 return other.m_pData->m_nDataLength == m_pData->m_nDataLength && | 265 return other.m_pData->m_nDataLength == m_pData->m_nDataLength && |
| 282 FXSYS_memcmp32(other.m_pData->m_String, | 266 FXSYS_memcmp32(other.m_pData->m_String, |
| 283 m_pData->m_String, | 267 m_pData->m_String, |
| 284 m_pData->m_nDataLength) == 0; | 268 m_pData->m_nDataLength) == 0; |
| 285 } | 269 } |
| 286 void CFX_ByteString::Empty() | 270 void CFX_ByteString::Empty() |
| 287 { | 271 { |
| 288 if (m_pData == NULL) { | 272 if (m_pData) { |
| 289 return; | 273 m_pData->Release(); |
| 274 m_pData = NULL; |
| 290 } | 275 } |
| 291 if (m_pData->m_nRefs > 1) { | |
| 292 m_pData->m_nRefs --; | |
| 293 } else { | |
| 294 FX_Free(m_pData); | |
| 295 } | |
| 296 m_pData = NULL; | |
| 297 } | 276 } |
| 298 bool CFX_ByteString::EqualNoCase(FX_BSTR str) const | 277 bool CFX_ByteString::EqualNoCase(FX_BSTR str) const |
| 299 { | 278 { |
| 300 if (m_pData == NULL) { | 279 if (m_pData == NULL) { |
| 301 return str.IsEmpty(); | 280 return str.IsEmpty(); |
| 302 } | 281 } |
| 303 FX_STRSIZE len = str.GetLength(); | 282 FX_STRSIZE len = str.GetLength(); |
| 304 if (m_pData->m_nDataLength != len) { | 283 if (m_pData->m_nDataLength != len) { |
| 305 return false; | 284 return false; |
| 306 } | 285 } |
| (...skipping 23 matching lines...) Expand all Loading... |
| 330 AllocBeforeWrite(nSrcLen); | 309 AllocBeforeWrite(nSrcLen); |
| 331 FXSYS_memcpy32(m_pData->m_String, lpszSrcData, nSrcLen); | 310 FXSYS_memcpy32(m_pData->m_String, lpszSrcData, nSrcLen); |
| 332 m_pData->m_nDataLength = nSrcLen; | 311 m_pData->m_nDataLength = nSrcLen; |
| 333 m_pData->m_String[nSrcLen] = 0; | 312 m_pData->m_String[nSrcLen] = 0; |
| 334 } | 313 } |
| 335 void CFX_ByteString::CopyBeforeWrite() | 314 void CFX_ByteString::CopyBeforeWrite() |
| 336 { | 315 { |
| 337 if (m_pData == NULL || m_pData->m_nRefs <= 1) { | 316 if (m_pData == NULL || m_pData->m_nRefs <= 1) { |
| 338 return; | 317 return; |
| 339 } | 318 } |
| 340 CFX_StringData* pData = m_pData; | 319 StringData* pData = m_pData; |
| 341 m_pData->m_nRefs --; | 320 m_pData->Release(); |
| 342 FX_STRSIZE nDataLength = pData->m_nDataLength; | 321 FX_STRSIZE nDataLength = pData->m_nDataLength; |
| 343 m_pData = FX_AllocString(nDataLength); | 322 m_pData = StringData::Create(nDataLength); |
| 344 if (m_pData != NULL) { | 323 if (m_pData != NULL) { |
| 345 FXSYS_memcpy32(m_pData->m_String, pData->m_String, nDataLength + 1); | 324 FXSYS_memcpy32(m_pData->m_String, pData->m_String, nDataLength + 1); |
| 346 } | 325 } |
| 347 } | 326 } |
| 348 void CFX_ByteString::AllocBeforeWrite(FX_STRSIZE nLen) | 327 void CFX_ByteString::AllocBeforeWrite(FX_STRSIZE nLen) |
| 349 { | 328 { |
| 350 if (m_pData && m_pData->m_nRefs <= 1 && m_pData->m_nAllocLength >= nLen) { | 329 if (m_pData && m_pData->m_nRefs <= 1 && m_pData->m_nAllocLength >= nLen) { |
| 351 return; | 330 return; |
| 352 } | 331 } |
| 353 Empty(); | 332 Empty(); |
| 354 m_pData = FX_AllocString(nLen); | 333 m_pData = StringData::Create(nLen); |
| 355 } | 334 } |
| 356 void CFX_ByteString::ReleaseBuffer(FX_STRSIZE nNewLength) | 335 void CFX_ByteString::ReleaseBuffer(FX_STRSIZE nNewLength) |
| 357 { | 336 { |
| 358 if (m_pData == NULL) { | 337 if (m_pData == NULL) { |
| 359 return; | 338 return; |
| 360 } | 339 } |
| 361 CopyBeforeWrite(); | 340 CopyBeforeWrite(); |
| 362 if (nNewLength == -1) { | 341 if (nNewLength == -1) { |
| 363 nNewLength = FXSYS_strlen((FX_LPCSTR)m_pData->m_String); | 342 nNewLength = FXSYS_strlen((FX_LPCSTR)m_pData->m_String); |
| 364 } | 343 } |
| (...skipping 12 matching lines...) Expand all Loading... |
| 377 } | 356 } |
| 378 FX_LPSTR CFX_ByteString::GetBuffer(FX_STRSIZE nMinBufLength) | 357 FX_LPSTR CFX_ByteString::GetBuffer(FX_STRSIZE nMinBufLength) |
| 379 { | 358 { |
| 380 if (m_pData == NULL && nMinBufLength == 0) { | 359 if (m_pData == NULL && nMinBufLength == 0) { |
| 381 return NULL; | 360 return NULL; |
| 382 } | 361 } |
| 383 if (m_pData && m_pData->m_nRefs <= 1 && m_pData->m_nAllocLength >= nMinBufLe
ngth) { | 362 if (m_pData && m_pData->m_nRefs <= 1 && m_pData->m_nAllocLength >= nMinBufLe
ngth) { |
| 384 return m_pData->m_String; | 363 return m_pData->m_String; |
| 385 } | 364 } |
| 386 if (m_pData == NULL) { | 365 if (m_pData == NULL) { |
| 387 m_pData = FX_AllocString(nMinBufLength); | 366 m_pData = StringData::Create(nMinBufLength); |
| 388 if (!m_pData) { | 367 if (!m_pData) { |
| 389 return NULL; | 368 return NULL; |
| 390 } | 369 } |
| 391 m_pData->m_nDataLength = 0; | 370 m_pData->m_nDataLength = 0; |
| 392 m_pData->m_String[0] = 0; | 371 m_pData->m_String[0] = 0; |
| 393 return m_pData->m_String; | 372 return m_pData->m_String; |
| 394 } | 373 } |
| 395 CFX_StringData* pOldData = m_pData; | 374 StringData* pOldData = m_pData; |
| 396 FX_STRSIZE nOldLen = pOldData->m_nDataLength; | 375 FX_STRSIZE nOldLen = pOldData->m_nDataLength; |
| 397 if (nMinBufLength < nOldLen) { | 376 if (nMinBufLength < nOldLen) { |
| 398 nMinBufLength = nOldLen; | 377 nMinBufLength = nOldLen; |
| 399 } | 378 } |
| 400 m_pData = FX_AllocString(nMinBufLength); | 379 m_pData = StringData::Create(nMinBufLength); |
| 401 if (!m_pData) { | 380 if (!m_pData) { |
| 402 return NULL; | 381 return NULL; |
| 403 } | 382 } |
| 404 FXSYS_memcpy32(m_pData->m_String, pOldData->m_String, (nOldLen + 1)); | 383 FXSYS_memcpy32(m_pData->m_String, pOldData->m_String, (nOldLen + 1)); |
| 405 m_pData->m_nDataLength = nOldLen; | 384 m_pData->m_nDataLength = nOldLen; |
| 406 pOldData->m_nRefs --; | 385 pOldData->Release(); |
| 407 if (pOldData->m_nRefs <= 0) { | |
| 408 FX_Free(pOldData); | |
| 409 } | |
| 410 return m_pData->m_String; | 386 return m_pData->m_String; |
| 411 } | 387 } |
| 412 FX_STRSIZE CFX_ByteString::Delete(FX_STRSIZE nIndex, FX_STRSIZE nCount) | 388 FX_STRSIZE CFX_ByteString::Delete(FX_STRSIZE nIndex, FX_STRSIZE nCount) |
| 413 { | 389 { |
| 414 if (m_pData == NULL) { | 390 if (m_pData == NULL) { |
| 415 return 0; | 391 return 0; |
| 416 } | 392 } |
| 417 if (nIndex < 0) { | 393 if (nIndex < 0) { |
| 418 nIndex = 0; | 394 nIndex = 0; |
| 419 } | 395 } |
| (...skipping 11 matching lines...) Expand all Loading... |
| 431 m_pData->m_nDataLength = nOldLength - nCount; | 407 m_pData->m_nDataLength = nOldLength - nCount; |
| 432 } | 408 } |
| 433 return m_pData->m_nDataLength; | 409 return m_pData->m_nDataLength; |
| 434 } | 410 } |
| 435 void CFX_ByteString::ConcatInPlace(FX_STRSIZE nSrcLen, FX_LPCSTR lpszSrcData) | 411 void CFX_ByteString::ConcatInPlace(FX_STRSIZE nSrcLen, FX_LPCSTR lpszSrcData) |
| 436 { | 412 { |
| 437 if (nSrcLen == 0 || lpszSrcData == NULL) { | 413 if (nSrcLen == 0 || lpszSrcData == NULL) { |
| 438 return; | 414 return; |
| 439 } | 415 } |
| 440 if (m_pData == NULL) { | 416 if (m_pData == NULL) { |
| 441 m_pData = FX_AllocString(nSrcLen); | 417 m_pData = StringData::Create(nSrcLen); |
| 442 if (!m_pData) { | 418 if (!m_pData) { |
| 443 return; | 419 return; |
| 444 } | 420 } |
| 445 FXSYS_memcpy32(m_pData->m_String, lpszSrcData, nSrcLen); | 421 FXSYS_memcpy32(m_pData->m_String, lpszSrcData, nSrcLen); |
| 446 return; | 422 return; |
| 447 } | 423 } |
| 448 if (m_pData->m_nRefs > 1 || m_pData->m_nDataLength + nSrcLen > m_pData->m_nA
llocLength) { | 424 if (m_pData->m_nRefs > 1 || m_pData->m_nDataLength + nSrcLen > m_pData->m_nA
llocLength) { |
| 449 CFX_StringData* pOldData = m_pData; | 425 StringData* pOldData = m_pData; |
| 450 ConcatCopy(m_pData->m_nDataLength, m_pData->m_String, nSrcLen, lpszSrcDa
ta); | 426 ConcatCopy(m_pData->m_nDataLength, m_pData->m_String, nSrcLen, lpszSrcDa
ta); |
| 451 FX_ReleaseString(pOldData); | 427 pOldData->Release(); |
| 452 } else { | 428 } else { |
| 453 FXSYS_memcpy32(m_pData->m_String + m_pData->m_nDataLength, lpszSrcData,
nSrcLen); | 429 FXSYS_memcpy32(m_pData->m_String + m_pData->m_nDataLength, lpszSrcData,
nSrcLen); |
| 454 m_pData->m_nDataLength += nSrcLen; | 430 m_pData->m_nDataLength += nSrcLen; |
| 455 m_pData->m_String[m_pData->m_nDataLength] = 0; | 431 m_pData->m_String[m_pData->m_nDataLength] = 0; |
| 456 } | 432 } |
| 457 } | 433 } |
| 458 void CFX_ByteString::ConcatCopy(FX_STRSIZE nSrc1Len, FX_LPCSTR lpszSrc1Data, | 434 void CFX_ByteString::ConcatCopy(FX_STRSIZE nSrc1Len, FX_LPCSTR lpszSrc1Data, |
| 459 FX_STRSIZE nSrc2Len, FX_LPCSTR lpszSrc2Data) | 435 FX_STRSIZE nSrc2Len, FX_LPCSTR lpszSrc2Data) |
| 460 { | 436 { |
| 461 int nNewLen = nSrc1Len + nSrc2Len; | 437 int nNewLen = nSrc1Len + nSrc2Len; |
| 462 if (nNewLen == 0) { | 438 if (nNewLen == 0) { |
| 463 return; | 439 return; |
| 464 } | 440 } |
| 465 m_pData = FX_AllocString(nNewLen); | 441 m_pData = StringData::Create(nNewLen); |
| 466 if (m_pData) { | 442 if (m_pData) { |
| 467 FXSYS_memcpy32(m_pData->m_String, lpszSrc1Data, nSrc1Len); | 443 FXSYS_memcpy32(m_pData->m_String, lpszSrc1Data, nSrc1Len); |
| 468 FXSYS_memcpy32(m_pData->m_String + nSrc1Len, lpszSrc2Data, nSrc2Len); | 444 FXSYS_memcpy32(m_pData->m_String + nSrc1Len, lpszSrc2Data, nSrc2Len); |
| 469 } | 445 } |
| 470 } | 446 } |
| 471 CFX_ByteString CFX_ByteString::Mid(FX_STRSIZE nFirst) const | 447 CFX_ByteString CFX_ByteString::Mid(FX_STRSIZE nFirst) const |
| 472 { | 448 { |
| 473 if (m_pData == NULL) { | 449 if (m_pData == NULL) { |
| 474 return CFX_ByteString(); | 450 return CFX_ByteString(); |
| 475 } | 451 } |
| (...skipping 21 matching lines...) Expand all Loading... |
| 497 return dest; | 473 return dest; |
| 498 } | 474 } |
| 499 void CFX_ByteString::AllocCopy(CFX_ByteString& dest, FX_STRSIZE nCopyLen, FX_STR
SIZE nCopyIndex) const | 475 void CFX_ByteString::AllocCopy(CFX_ByteString& dest, FX_STRSIZE nCopyLen, FX_STR
SIZE nCopyIndex) const |
| 500 { | 476 { |
| 501 // |FX_STRSIZE| is currently typedef'd as in |int|. TODO(palmer): It | 477 // |FX_STRSIZE| is currently typedef'd as in |int|. TODO(palmer): It |
| 502 // should be a |size_t|, or at least unsigned. | 478 // should be a |size_t|, or at least unsigned. |
| 503 if (nCopyLen == 0 || nCopyLen < 0) { | 479 if (nCopyLen == 0 || nCopyLen < 0) { |
| 504 return; | 480 return; |
| 505 } | 481 } |
| 506 ASSERT(dest.m_pData == NULL); | 482 ASSERT(dest.m_pData == NULL); |
| 507 dest.m_pData = FX_AllocString(nCopyLen); | 483 dest.m_pData = StringData::Create(nCopyLen); |
| 508 if (dest.m_pData) { | 484 if (dest.m_pData) { |
| 509 FXSYS_memcpy32(dest.m_pData->m_String, m_pData->m_String + nCopyIndex, n
CopyLen); | 485 FXSYS_memcpy32(dest.m_pData->m_String, m_pData->m_String + nCopyIndex, n
CopyLen); |
| 510 } | 486 } |
| 511 } | 487 } |
| 512 #define FORCE_ANSI 0x10000 | 488 #define FORCE_ANSI 0x10000 |
| 513 #define FORCE_UNICODE 0x20000 | 489 #define FORCE_UNICODE 0x20000 |
| 514 #define FORCE_INT64 0x40000 | 490 #define FORCE_INT64 0x40000 |
| 515 void CFX_ByteString::FormatV(FX_LPCSTR lpszFormat, va_list argList) | 491 void CFX_ByteString::FormatV(FX_LPCSTR lpszFormat, va_list argList) |
| 516 { | 492 { |
| 517 va_list argListSave; | 493 va_list argListSave; |
| (...skipping 220 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 738 CopyBeforeWrite(); | 714 CopyBeforeWrite(); |
| 739 if (nIndex < 0) { | 715 if (nIndex < 0) { |
| 740 nIndex = 0; | 716 nIndex = 0; |
| 741 } | 717 } |
| 742 FX_STRSIZE nNewLength = m_pData ? m_pData->m_nDataLength : 0; | 718 FX_STRSIZE nNewLength = m_pData ? m_pData->m_nDataLength : 0; |
| 743 if (nIndex > nNewLength) { | 719 if (nIndex > nNewLength) { |
| 744 nIndex = nNewLength; | 720 nIndex = nNewLength; |
| 745 } | 721 } |
| 746 nNewLength++; | 722 nNewLength++; |
| 747 if (m_pData == NULL || m_pData->m_nAllocLength < nNewLength) { | 723 if (m_pData == NULL || m_pData->m_nAllocLength < nNewLength) { |
| 748 CFX_StringData* pOldData = m_pData; | 724 StringData* pOldData = m_pData; |
| 749 FX_LPCSTR pstr = m_pData->m_String; | 725 FX_LPCSTR pstr = m_pData->m_String; |
| 750 m_pData = FX_AllocString(nNewLength); | 726 m_pData = StringData::Create(nNewLength); |
| 751 if (!m_pData) { | 727 if (!m_pData) { |
| 752 return 0; | 728 return 0; |
| 753 } | 729 } |
| 754 if(pOldData != NULL) { | 730 if(pOldData != NULL) { |
| 755 FXSYS_memmove32(m_pData->m_String, pstr, (pOldData->m_nDataLength +
1)); | 731 FXSYS_memmove32(m_pData->m_String, pstr, (pOldData->m_nDataLength +
1)); |
| 756 FX_ReleaseString(pOldData); | 732 pOldData->Release(); |
| 757 } else { | 733 } else { |
| 758 m_pData->m_String[0] = 0; | 734 m_pData->m_String[0] = 0; |
| 759 } | 735 } |
| 760 } | 736 } |
| 761 FXSYS_memmove32(m_pData->m_String + nIndex + 1, | 737 FXSYS_memmove32(m_pData->m_String + nIndex + 1, |
| 762 m_pData->m_String + nIndex, (nNewLength - nIndex)); | 738 m_pData->m_String + nIndex, (nNewLength - nIndex)); |
| 763 m_pData->m_String[nIndex] = ch; | 739 m_pData->m_String[nIndex] = ch; |
| 764 m_pData->m_nDataLength = nNewLength; | 740 m_pData->m_nDataLength = nNewLength; |
| 765 return nNewLength; | 741 return nNewLength; |
| 766 } | 742 } |
| (...skipping 155 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 922 pStart = pTarget + nSourceLen; | 898 pStart = pTarget + nSourceLen; |
| 923 } | 899 } |
| 924 if (nCount == 0) { | 900 if (nCount == 0) { |
| 925 return 0; | 901 return 0; |
| 926 } | 902 } |
| 927 FX_STRSIZE nNewLength = m_pData->m_nDataLength + (nReplacementLen - nSource
Len) * nCount; | 903 FX_STRSIZE nNewLength = m_pData->m_nDataLength + (nReplacementLen - nSource
Len) * nCount; |
| 928 if (nNewLength == 0) { | 904 if (nNewLength == 0) { |
| 929 Empty(); | 905 Empty(); |
| 930 return nCount; | 906 return nCount; |
| 931 } | 907 } |
| 932 CFX_StringData* pNewData = FX_AllocString(nNewLength); | 908 StringData* pNewData = StringData::Create(nNewLength); |
| 933 if (!pNewData) { | 909 if (!pNewData) { |
| 934 return 0; | 910 return 0; |
| 935 } | 911 } |
| 936 pStart = m_pData->m_String; | 912 pStart = m_pData->m_String; |
| 937 FX_LPSTR pDest = pNewData->m_String; | 913 FX_LPSTR pDest = pNewData->m_String; |
| 938 for (FX_STRSIZE i = 0; i < nCount; i ++) { | 914 for (FX_STRSIZE i = 0; i < nCount; i ++) { |
| 939 FX_LPCSTR pTarget = FX_strstr(pStart, (FX_STRSIZE)(pEnd - pStart), lpszO
ld.GetCStr(), nSourceLen); | 915 FX_LPCSTR pTarget = FX_strstr(pStart, (FX_STRSIZE)(pEnd - pStart), lpszO
ld.GetCStr(), nSourceLen); |
| 940 FXSYS_memcpy32(pDest, pStart, pTarget - pStart); | 916 FXSYS_memcpy32(pDest, pStart, pTarget - pStart); |
| 941 pDest += pTarget - pStart; | 917 pDest += pTarget - pStart; |
| 942 FXSYS_memcpy32(pDest, lpszNew.GetCStr(), lpszNew.GetLength()); | 918 FXSYS_memcpy32(pDest, lpszNew.GetCStr(), lpszNew.GetLength()); |
| 943 pDest += lpszNew.GetLength(); | 919 pDest += lpszNew.GetLength(); |
| 944 pStart = pTarget + nSourceLen; | 920 pStart = pTarget + nSourceLen; |
| 945 } | 921 } |
| 946 FXSYS_memcpy32(pDest, pStart, pEnd - pStart); | 922 FXSYS_memcpy32(pDest, pStart, pEnd - pStart); |
| 947 FX_ReleaseString(m_pData); | 923 m_pData->Release(); |
| 948 m_pData = pNewData; | 924 m_pData = pNewData; |
| 949 return nCount; | 925 return nCount; |
| 950 } | 926 } |
| 951 void CFX_ByteString::SetAt(FX_STRSIZE nIndex, FX_CHAR ch) | 927 void CFX_ByteString::SetAt(FX_STRSIZE nIndex, FX_CHAR ch) |
| 952 { | 928 { |
| 953 if (m_pData == NULL) { | 929 if (m_pData == NULL) { |
| 954 return; | 930 return; |
| 955 } | 931 } |
| 956 FXSYS_assert(nIndex >= 0); | 932 FXSYS_assert(nIndex >= 0); |
| 957 FXSYS_assert(nIndex < m_pData->m_nDataLength); | 933 FXSYS_assert(nIndex < m_pData->m_nDataLength); |
| (...skipping 192 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1150 scale /= 10; | 1126 scale /= 10; |
| 1151 } | 1127 } |
| 1152 return buf_size; | 1128 return buf_size; |
| 1153 } | 1129 } |
| 1154 CFX_ByteString CFX_ByteString::FormatFloat(FX_FLOAT d, int precision) | 1130 CFX_ByteString CFX_ByteString::FormatFloat(FX_FLOAT d, int precision) |
| 1155 { | 1131 { |
| 1156 FX_CHAR buf[32]; | 1132 FX_CHAR buf[32]; |
| 1157 FX_STRSIZE len = FX_ftoa(d, buf); | 1133 FX_STRSIZE len = FX_ftoa(d, buf); |
| 1158 return CFX_ByteString(buf, len); | 1134 return CFX_ByteString(buf, len); |
| 1159 } | 1135 } |
| OLD | NEW |