VirtualBox

Changeset 80836 in vbox for trunk/src/VBox/Main/glue


Ignore:
Timestamp:
Sep 17, 2019 12:26:52 AM (6 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
133406
Message:

Main/glue: Added all the append methods that RTCString have and then some.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Main/glue/string.cpp

    r80835 r80836  
    135135{
    136136    cleanup();
     137
    137138    BSTRNOTHROW Args = { this, 0, 0, S_OK };
    138139    RTStrFormatV(printfOutputCallbackNoThrow, &Args, NULL, NULL, pszFormat, va);
     
    143144            return S_OK;
    144145    }
     146
    145147    cleanup();
    146148    return Args.hrc;
     
    301303
    302304
     305Bstr &Bstr::append(const Bstr &rThat)
     306{
     307    if (rThat.isNotEmpty())
     308        return appendWorkerUtf16(rThat.m_bstr, rThat.length());
     309    return *this;
     310}
     311
     312
     313HRESULT Bstr::appendNoThrow(const Bstr &rThat) RT_NOEXCEPT
     314{
     315    if (rThat.isNotEmpty())
     316        return appendWorkerUtf16NoThrow(rThat.m_bstr, rThat.length());
     317    return S_OK;
     318}
     319
     320
     321Bstr &Bstr::append(const RTCString &rThat)
     322{
     323    if (rThat.isNotEmpty())
     324        return appendWorkerUtf8(rThat.c_str(), rThat.length());
     325    return *this;
     326}
     327
     328
     329HRESULT Bstr::appendNoThrow(const RTCString &rThat) RT_NOEXCEPT
     330{
     331    if (rThat.isNotEmpty())
     332        return appendWorkerUtf8NoThrow(rThat.c_str(), rThat.length());
     333    return S_OK;
     334}
     335
     336
     337Bstr &Bstr::append(CBSTR pwszSrc)
     338{
     339    if (pwszSrc && *pwszSrc)
     340        return appendWorkerUtf16(pwszSrc, RTUtf16Len(pwszSrc));
     341    return *this;
     342}
     343
     344
     345HRESULT Bstr::appendNoThrow(CBSTR pwszSrc) RT_NOEXCEPT
     346{
     347    if (pwszSrc && *pwszSrc)
     348        return appendWorkerUtf16NoThrow(pwszSrc, RTUtf16Len(pwszSrc));
     349    return S_OK;
     350}
     351
     352
     353Bstr &Bstr::append(const char *pszSrc)
     354{
     355    if (pszSrc && *pszSrc)
     356        return appendWorkerUtf8(pszSrc, strlen(pszSrc));
     357    return *this;
     358}
     359
     360
     361HRESULT Bstr::appendNoThrow(const char *pszSrc) RT_NOEXCEPT
     362{
     363    if (pszSrc && *pszSrc)
     364        return appendWorkerUtf8NoThrow(pszSrc, strlen(pszSrc));
     365    return S_OK;
     366}
     367
     368
     369Bstr &Bstr::append(const Bstr &rThat, size_t offStart, size_t cwcMax /*= RTSTR_MAX*/)
     370{
     371    size_t cwcSrc = rThat.length();
     372    if (offStart < cwcSrc)
     373        return appendWorkerUtf16(rThat.raw() + offStart, RT_MIN(cwcSrc - offStart, cwcMax));
     374    return *this;
     375}
     376
     377
     378HRESULT Bstr::appendNoThrow(const Bstr &rThat, size_t offStart, size_t cwcMax /*= RTSTR_MAX*/) RT_NOEXCEPT
     379{
     380    size_t cwcSrc = rThat.length();
     381    if (offStart < cwcSrc)
     382        return appendWorkerUtf16NoThrow(rThat.raw() + offStart, RT_MIN(cwcSrc - offStart, cwcMax));
     383    return S_OK;
     384}
     385
     386
     387Bstr &Bstr::append(const RTCString &rThat, size_t offStart, size_t cchMax /*= RTSTR_MAX*/)
     388{
     389    if (offStart < rThat.length())
     390        return appendWorkerUtf8(rThat.c_str() + offStart, RT_MIN(rThat.length() - offStart, cchMax));
     391    return *this;
     392}
     393
     394
     395HRESULT Bstr::appendNoThrow(const RTCString &rThat, size_t offStart, size_t cchMax /*= RTSTR_MAX*/) RT_NOEXCEPT
     396{
     397    if (offStart < rThat.length())
     398        return appendWorkerUtf8NoThrow(rThat.c_str() + offStart, RT_MIN(rThat.length() - offStart, cchMax));
     399    return S_OK;
     400}
     401
     402
     403Bstr &Bstr::append(CBSTR pwszThat, size_t cchMax)
     404{
     405    return appendWorkerUtf16(pwszThat, RTUtf16NLen(pwszThat, cchMax));
     406}
     407
     408
     409HRESULT Bstr::appendNoThrow(CBSTR pwszThat, size_t cchMax) RT_NOEXCEPT
     410{
     411    return appendWorkerUtf16NoThrow(pwszThat, RTUtf16NLen(pwszThat, cchMax));
     412}
     413
     414
     415Bstr &Bstr::append(const char *pszThat, size_t cchMax)
     416{
     417    return appendWorkerUtf8(pszThat, RTStrNLen(pszThat, cchMax));
     418}
     419
     420
     421HRESULT Bstr::appendNoThrow(const char *pszThat, size_t cchMax) RT_NOEXCEPT
     422{
     423    return appendWorkerUtf8NoThrow(pszThat, RTStrNLen(pszThat, cchMax));
     424}
     425
     426
     427Bstr &Bstr::append(char ch)
     428{
     429    AssertMsg(ch > 0 && ch < 127, ("%#x\n", ch));
     430    return appendWorkerUtf8(&ch, 1);
     431}
     432
     433
     434HRESULT Bstr::appendNoThrow(char ch) RT_NOEXCEPT
     435{
     436    AssertMsg(ch > 0 && ch < 127, ("%#x\n", ch));
     437    return appendWorkerUtf8NoThrow(&ch, 1);
     438}
     439
     440
     441Bstr &Bstr::appendCodePoint(RTUNICP uc)
     442{
     443    RTUTF16 wszTmp[3];
     444    PRTUTF16 pwszEnd = RTUtf16PutCp(wszTmp, uc);
     445    *pwszEnd = '\0';
     446    return appendWorkerUtf16(&wszTmp[0], pwszEnd - &wszTmp[0]);
     447}
     448
     449
     450HRESULT Bstr::appendCodePointNoThrow(RTUNICP uc) RT_NOEXCEPT
     451{
     452    RTUTF16 wszTmp[3];
     453    PRTUTF16 pwszEnd = RTUtf16PutCp(wszTmp, uc);
     454    *pwszEnd = '\0';
     455    return appendWorkerUtf16NoThrow(&wszTmp[0], pwszEnd - &wszTmp[0]);
     456}
     457
     458
     459Bstr &Bstr::appendWorkerUtf16(PCRTUTF16 pwszSrc, size_t cwcSrc)
     460{
     461    size_t cwcOld = length();
     462    size_t cwcTotal = cwcOld + cwcSrc;
     463    reserve(cwcTotal, true /*fForce*/);
     464    if (cwcSrc)
     465        memcpy(&m_bstr[cwcOld], pwszSrc, cwcSrc * sizeof(RTUTF16));
     466    m_bstr[cwcTotal] = '\0';
     467    return *this;
     468}
     469
     470
     471HRESULT Bstr::appendWorkerUtf16NoThrow(PCRTUTF16 pwszSrc, size_t cwcSrc) RT_NOEXCEPT
     472{
     473    size_t cwcOld = length();
     474    size_t cwcTotal = cwcOld + cwcSrc;
     475    HRESULT hrc = reserveNoThrow(cwcTotal, true /*fForce*/);
     476    if (hrc == S_OK)
     477    {
     478        if (cwcSrc)
     479            memcpy(&m_bstr[cwcOld], pwszSrc, cwcSrc * sizeof(RTUTF16));
     480        m_bstr[cwcTotal] = '\0';
     481    }
     482    return hrc;
     483}
     484
     485
     486Bstr &Bstr::appendWorkerUtf8(const char *pszSrc, size_t cchSrc)
     487{
     488    size_t cwcSrc;
     489    int rc = RTStrCalcUtf16LenEx(pszSrc, cchSrc, &cwcSrc);
     490    AssertRCStmt(rc, throw std::bad_alloc());
     491
     492    size_t cwcOld = length();
     493    size_t cwcTotal = cwcOld + cwcSrc;
     494    reserve(cwcTotal, true /*fForce*/);
     495    if (cwcSrc)
     496    {
     497        PRTUTF16 pwszDst = &m_bstr[cwcOld];
     498        rc = RTStrToUtf16Ex(pszSrc, cchSrc, &pwszDst, cwcSrc + 1, NULL);
     499        AssertRCStmt(rc, throw std::bad_alloc());
     500    }
     501    m_bstr[cwcTotal] = '\0';
     502    return *this;
     503}
     504
     505
     506HRESULT Bstr::appendWorkerUtf8NoThrow(const char *pszSrc, size_t cchSrc) RT_NOEXCEPT
     507{
     508    size_t cwcSrc;
     509    int rc = RTStrCalcUtf16LenEx(pszSrc, cchSrc, &cwcSrc);
     510    AssertRCStmt(rc, E_INVALIDARG);
     511
     512    size_t cwcOld = length();
     513    size_t cwcTotal = cwcOld + cwcSrc;
     514    HRESULT hrc = reserveNoThrow(cwcTotal, true /*fForce*/);
     515    AssertReturn(hrc == S_OK, hrc);
     516    if (cwcSrc)
     517    {
     518        PRTUTF16 pwszDst = &m_bstr[cwcOld];
     519        rc = RTStrToUtf16Ex(pszSrc, cchSrc, &pwszDst, cwcSrc + 1, NULL);
     520        AssertRCStmt(rc, E_INVALIDARG);
     521    }
     522    m_bstr[cwcTotal] = '\0';
     523    return S_OK;
     524}
     525
     526
     527Bstr &Bstr::appendPrintf(const char *pszFormat, ...)
     528{
     529    va_list va;
     530    va_start(va, pszFormat);
     531    HRESULT hrc = appendPrintfVNoThrow(pszFormat, va);
     532    va_end(va);
     533    if (hrc != S_OK)
     534        throw std::bad_alloc();
     535    return *this;
     536}
     537
     538
     539HRESULT Bstr::appendPrintfNoThrow(const char *pszFormat, ...) RT_NOEXCEPT
     540{
     541    va_list va;
     542    va_start(va, pszFormat);
     543    HRESULT hrc = appendPrintfVNoThrow(pszFormat, va);
     544    va_end(va);
     545    return hrc;
     546}
     547
     548
     549Bstr &Bstr::appendPrintfV(const char *pszFormat, va_list va)
     550{
     551    HRESULT hrc = appendPrintfVNoThrow(pszFormat, va);
     552    if (hrc != S_OK)
     553        throw std::bad_alloc();
     554    return *this;
     555}
     556
     557
     558HRESULT Bstr::appendPrintfVNoThrow(const char *pszFormat, va_list va) RT_NOEXCEPT
     559{
     560    size_t const cwcOld = length();
     561    BSTRNOTHROW Args = { this, cwcOld, cwcOld, S_OK };
     562
     563    RTStrFormatV(printfOutputCallbackNoThrow, &Args, NULL, NULL, pszFormat, va);
     564    if (Args.hrc == S_OK)
     565    {
     566        Args.hrc = joltNoThrow(Args.offDst);
     567        if (Args.hrc == S_OK)
     568            return S_OK;
     569    }
     570
     571    if (m_bstr)
     572        m_bstr[cwcOld] = '\0';
     573    return Args.hrc;
     574}
     575
     576
     577
     578/*********************************************************************************************************************************
     579*   Utf8Str Implementation                                                                                                       *
     580*********************************************************************************************************************************/
     581
    303582/* static */
    304583const Utf8Str Utf8Str::Empty; /* default ctor is OK */
Note: See TracChangeset for help on using the changeset viewer.

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