VirtualBox

Ignore:
Timestamp:
Jun 29, 2017 11:46:07 AM (8 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
116516
Message:

RTCString: Added 4 standard like replace() methods.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Runtime/common/string/ministring.cpp

    r67674 r67688  
    202202}
    203203
     204
     205RTCString &RTCString::replace(size_t offStart, size_t cchLength, const RTCString &rStrReplacement)
     206{
     207    return replaceWorker(offStart, cchLength, rStrReplacement.c_str(), rStrReplacement.length());
     208}
     209
     210RTCString &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
     229RTCString &RTCString::replace(size_t offStart, size_t cchLength, const char *pszReplacement)
     230{
     231    return replaceWorker(offStart, cchLength, pszReplacement, strlen(pszReplacement));
     232}
     233
     234RTCString &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
     239RTCString &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
    204282size_t RTCString::find(const char *pszNeedle, size_t offStart /*= 0*/) const
    205283{
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette