Changeset 80836 in vbox for trunk/src/VBox/Main/glue
- Timestamp:
- Sep 17, 2019 12:26:52 AM (6 years ago)
- svn:sync-xref-src-repo-rev:
- 133406
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Main/glue/string.cpp
r80835 r80836 135 135 { 136 136 cleanup(); 137 137 138 BSTRNOTHROW Args = { this, 0, 0, S_OK }; 138 139 RTStrFormatV(printfOutputCallbackNoThrow, &Args, NULL, NULL, pszFormat, va); … … 143 144 return S_OK; 144 145 } 146 145 147 cleanup(); 146 148 return Args.hrc; … … 301 303 302 304 305 Bstr &Bstr::append(const Bstr &rThat) 306 { 307 if (rThat.isNotEmpty()) 308 return appendWorkerUtf16(rThat.m_bstr, rThat.length()); 309 return *this; 310 } 311 312 313 HRESULT 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 321 Bstr &Bstr::append(const RTCString &rThat) 322 { 323 if (rThat.isNotEmpty()) 324 return appendWorkerUtf8(rThat.c_str(), rThat.length()); 325 return *this; 326 } 327 328 329 HRESULT 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 337 Bstr &Bstr::append(CBSTR pwszSrc) 338 { 339 if (pwszSrc && *pwszSrc) 340 return appendWorkerUtf16(pwszSrc, RTUtf16Len(pwszSrc)); 341 return *this; 342 } 343 344 345 HRESULT Bstr::appendNoThrow(CBSTR pwszSrc) RT_NOEXCEPT 346 { 347 if (pwszSrc && *pwszSrc) 348 return appendWorkerUtf16NoThrow(pwszSrc, RTUtf16Len(pwszSrc)); 349 return S_OK; 350 } 351 352 353 Bstr &Bstr::append(const char *pszSrc) 354 { 355 if (pszSrc && *pszSrc) 356 return appendWorkerUtf8(pszSrc, strlen(pszSrc)); 357 return *this; 358 } 359 360 361 HRESULT 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 369 Bstr &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 378 HRESULT 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 387 Bstr &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 395 HRESULT 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 403 Bstr &Bstr::append(CBSTR pwszThat, size_t cchMax) 404 { 405 return appendWorkerUtf16(pwszThat, RTUtf16NLen(pwszThat, cchMax)); 406 } 407 408 409 HRESULT Bstr::appendNoThrow(CBSTR pwszThat, size_t cchMax) RT_NOEXCEPT 410 { 411 return appendWorkerUtf16NoThrow(pwszThat, RTUtf16NLen(pwszThat, cchMax)); 412 } 413 414 415 Bstr &Bstr::append(const char *pszThat, size_t cchMax) 416 { 417 return appendWorkerUtf8(pszThat, RTStrNLen(pszThat, cchMax)); 418 } 419 420 421 HRESULT Bstr::appendNoThrow(const char *pszThat, size_t cchMax) RT_NOEXCEPT 422 { 423 return appendWorkerUtf8NoThrow(pszThat, RTStrNLen(pszThat, cchMax)); 424 } 425 426 427 Bstr &Bstr::append(char ch) 428 { 429 AssertMsg(ch > 0 && ch < 127, ("%#x\n", ch)); 430 return appendWorkerUtf8(&ch, 1); 431 } 432 433 434 HRESULT Bstr::appendNoThrow(char ch) RT_NOEXCEPT 435 { 436 AssertMsg(ch > 0 && ch < 127, ("%#x\n", ch)); 437 return appendWorkerUtf8NoThrow(&ch, 1); 438 } 439 440 441 Bstr &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 450 HRESULT 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 459 Bstr &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 471 HRESULT 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 486 Bstr &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 506 HRESULT 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 527 Bstr &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 539 HRESULT 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 549 Bstr &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 558 HRESULT 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 303 582 /* static */ 304 583 const Utf8Str Utf8Str::Empty; /* default ctor is OK */
Note:
See TracChangeset
for help on using the changeset viewer.