Changeset 67688 in vbox for trunk/src/VBox/Runtime/common/string
- Timestamp:
- Jun 29, 2017 11:46:07 AM (8 years ago)
- svn:sync-xref-src-repo-rev:
- 116516
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Runtime/common/string/ministring.cpp
r67674 r67688 202 202 } 203 203 204 205 RTCString &RTCString::replace(size_t offStart, size_t cchLength, const RTCString &rStrReplacement) 206 { 207 return replaceWorker(offStart, cchLength, rStrReplacement.c_str(), rStrReplacement.length()); 208 } 209 210 RTCString &RTCString::replace(size_t offStart, size_t cchLength, const RTCString &rStrReplacement, 211 size_t offReplacement, size_t cchReplacement) 212 { 213 Assert(this != &rStrReplacement); 214 if (cchReplacement > 0) 215 { 216 if (offReplacement < rStrReplacement.length()) 217 { 218 size_t cchMaxReplacement = rStrReplacement.length() - offReplacement; 219 return replaceWorker(offStart, cchLength, rStrReplacement.c_str() + offReplacement, 220 RT_MIN(cchReplacement, cchMaxReplacement)); 221 } 222 /* Our non-standard handling of out_of_range situations. */ 223 AssertMsgFailed(("offReplacement=%zu (cchReplacement=%zu) rStrReplacement.length()=%zu\n", 224 offReplacement, cchReplacement, rStrReplacement.length())); 225 } 226 return replaceWorker(offStart, cchLength, "", 0); 227 } 228 229 RTCString &RTCString::replace(size_t offStart, size_t cchLength, const char *pszReplacement) 230 { 231 return replaceWorker(offStart, cchLength, pszReplacement, strlen(pszReplacement)); 232 } 233 234 RTCString &RTCString::replace(size_t offStart, size_t cchLength, const char *pszReplacement, size_t cchReplacement) 235 { 236 return replaceWorker(offStart, cchLength, pszReplacement, RTStrNLen(pszReplacement, cchReplacement)); 237 } 238 239 RTCString &RTCString::replaceWorker(size_t offStart, size_t cchLength, const char *pszSrc, size_t cchSrc) 240 { 241 /* 242 * Our non-standard handling of out_of_range situations. 243 */ 244 size_t const cchOldLength = length(); 245 AssertMsgReturn(offStart < cchOldLength, ("offStart=%zu (cchLength=%zu); length()=%zu\n", offStart, cchLength, cchOldLength), 246 *this); 247 248 /* 249 * Correct the length parameter. 250 */ 251 size_t cchMaxLength = cchOldLength - offStart; 252 if (cchMaxLength < cchLength) 253 cchLength = cchMaxLength; 254 255 /* 256 * Adjust string allocation if necessary. 257 */ 258 size_t cchNew = cchOldLength - cchLength + cchSrc; 259 if (cchNew >= m_cbAllocated) 260 { 261 reserve(RT_ALIGN_Z(cchNew + 1, IPRT_MINISTRING_APPEND_ALIGNMENT)); 262 // calls realloc(cchBoth + 1) and sets m_cbAllocated; may throw bad_alloc. 263 #ifndef RT_EXCEPTIONS_ENABLED 264 AssertRelease(capacity() > cchNew); 265 #endif 266 } 267 268 /* 269 * Make the change. 270 */ 271 size_t cchAfter = cchOldLength - offStart - cchLength; 272 if (cchAfter > 0) 273 memmove(&m_psz[offStart + cchSrc], &m_psz[offStart + cchLength], cchAfter); 274 memcpy(&m_psz[offStart], pszSrc, cchSrc); 275 m_psz[cchNew] = '\0'; 276 m_cch = cchNew; 277 278 return *this; 279 } 280 281 204 282 size_t RTCString::find(const char *pszNeedle, size_t offStart /*= 0*/) const 205 283 {
Note:
See TracChangeset
for help on using the changeset viewer.