Index: /trunk/include/iprt/cpp/ministring.h
===================================================================
--- /trunk/include/iprt/cpp/ministring.h	(revision 30317)
+++ /trunk/include/iprt/cpp/ministring.h	(revision 30318)
@@ -228,4 +228,15 @@
 
     /**
+     * Appends the string "that" to "this".
+     *
+     * @param   pszThat         The C string to append.
+     *
+     * @throws  std::bad_alloc  On allocation error.  The object is left unchanged.
+     *
+     * @returns Reference to the object.
+     */
+    MiniString &append(const char *pszThat);
+
+    /**
      * Appends the given character to "this".
      *
Index: /trunk/src/VBox/Runtime/common/string/ministring.cpp
===================================================================
--- /trunk/src/VBox/Runtime/common/string/ministring.cpp	(revision 30317)
+++ /trunk/src/VBox/Runtime/common/string/ministring.cpp	(revision 30318)
@@ -50,4 +50,25 @@
         memcpy(m_psz + lenThis, that.m_psz, lenThat);
         m_psz[lenThis + lenThat] = '\0';
+        m_cbLength = cbBoth - 1;
+    }
+    return *this;
+}
+
+MiniString &MiniString::append(const char *pszThat)
+{
+    size_t cchThat = strlen(pszThat);
+    if (cchThat)
+    {
+        size_t cchThis = length();
+        size_t cbBoth = cchThis + cchThat + 1;
+
+        reserve(cbBoth);
+            // calls realloc(cbBoth) and sets m_cbAllocated; may throw bad_alloc.
+#ifndef RT_EXCEPTIONS_ENABLED
+        AssertRelease(capacity() >= cbBoth);
+#endif
+
+        memcpy(m_psz + cchThis, pszThat, cchThat);
+        m_psz[cbBoth - 1] = '\0';
         m_cbLength = cbBoth - 1;
     }
Index: /trunk/src/VBox/Runtime/testcase/tstUtf8.cpp
===================================================================
--- /trunk/src/VBox/Runtime/testcase/tstUtf8.cpp	(revision 30317)
+++ /trunk/src/VBox/Runtime/testcase/tstUtf8.cpp	(revision 30318)
@@ -948,23 +948,27 @@
 
     iprt::MiniString empty;
-    CHECK( (empty.length() == 0) );
-    CHECK( (empty.capacity() == 0) );
+    CHECK(empty.length() == 0);
+    CHECK(empty.capacity() == 0);
 
     iprt::MiniString sixbytes("12345");
-    CHECK( (sixbytes.length() == 5) );
-    CHECK( (sixbytes.capacity() == 6) );
-
-    sixbytes.append("678");
-    CHECK( (sixbytes.length() == 8) );
-    CHECK( (sixbytes.capacity() == 9) );
+    CHECK(sixbytes.length() == 5);
+    CHECK(sixbytes.capacity() == 6);
+
+    sixbytes.append(iprt::MiniString("678"));
+    CHECK(sixbytes.length() == 8);
+    CHECK(sixbytes.capacity() == 9);
+
+    sixbytes.append("9a");
+    CHECK(sixbytes.length() == 10);
+    CHECK(sixbytes.capacity() == 11);
 
     char *psz = sixbytes.mutableRaw();
-        // 12345678
+        // 123456789a
         //       ^
         // 0123456
     psz[6] = '\0';
     sixbytes.jolt();
-    CHECK( (sixbytes.length() == 6) );
-    CHECK( (sixbytes.capacity() == 7) );
+    CHECK(sixbytes.length() == 6);
+    CHECK(sixbytes.capacity() == 7);
 
     iprt::MiniString morebytes("tobereplaced");
@@ -972,47 +976,46 @@
     morebytes.append(sixbytes);
 
-    CHECK_DUMP( (morebytes == "newstring 123456"), morebytes.c_str() );
+    CHECK_DUMP(morebytes == "newstring 123456", morebytes.c_str());
 
     iprt::MiniString third(morebytes);
     third.reserve(100 * 1024);      // 100 KB
-    CHECK_DUMP( (third == "newstring 123456"), morebytes.c_str() );
-    CHECK( (third.capacity() == 100 * 1024) );
-    CHECK( (third.length() == morebytes.length()) );        // must not have changed
+    CHECK_DUMP(third == "newstring 123456", morebytes.c_str() );
+    CHECK(third.capacity() == 100 * 1024);
+    CHECK(third.length() == morebytes.length());          // must not have changed
 
     iprt::MiniString copy1(morebytes);
     iprt::MiniString copy2 = morebytes;
-    CHECK( (copy1 == copy2) );
+    CHECK(copy1 == copy2);
 
     copy1 = NULL;
-    CHECK( (copy1.length() == 0) );
+    CHECK(copy1.length() == 0);
 
     copy1 = "";
-    CHECK( (copy1.length() == 0) );
-
-    CHECK( (iprt::MiniString("abc") < iprt::MiniString("def")) );
-    CHECK( (iprt::MiniString("abc") != iprt::MiniString("def")) );
-    CHECK_DUMP_I( (iprt::MiniString("def") > iprt::MiniString("abc")) );
+    CHECK(copy1.length() == 0);
+
+    CHECK(iprt::MiniString("abc") <  iprt::MiniString("def"));
+    CHECK(iprt::MiniString("abc") != iprt::MiniString("def"));
+    CHECK_DUMP_I(iprt::MiniString("def") > iprt::MiniString("abc"));
+    CHECK(iprt::MiniString("abc") == iprt::MiniString("abc"));
 
     copy2.setNull();
-    for (int i = 0;
-         i < 100;
-         ++i)
+    for (int i = 0; i < 100; ++i)
     {
         copy2.reserve(50);      // should be ignored after 50 loops
         copy2.append("1");
     }
-    CHECK( (copy2.length() == 100) );
+    CHECK(copy2.length() == 100);
 
     copy2.setNull();
-    for (int i = 0;
-         i < 100;
-         ++i)
+    for (int i = 0; i < 100; ++i)
     {
         copy2.reserve(50);      // should be ignored after 50 loops
         copy2.append('1');
     }
-    CHECK( (copy2.length() == 100) );
+    CHECK(copy2.length() == 100);
 
 #undef CHECK
+#undef CHECK_DUMP
+#undef CHECK_DUMP_I
 }
 
@@ -1099,13 +1102,13 @@
     /* Test Latin1 -> Utf16 */
     const char *pszLat1 = "\x01\x20\x40\x80\x81";
-    RTTEST_CHECK(hTest, (RTLatin1CalcUtf16Len(pszLat1) == 5));
+    RTTEST_CHECK(hTest, RTLatin1CalcUtf16Len(pszLat1) == 5);
     rc = RTLatin1CalcUtf16LenEx(pszLat1, 3, &cchActual);
     RTTEST_CHECK_RC_OK(hTest, rc);
     if (RT_SUCCESS(rc))
-        RTTEST_CHECK(hTest, (cchActual == 3));
+        RTTEST_CHECK(hTest, cchActual == 3);
     rc = RTLatin1CalcUtf16LenEx(pszLat1, RTSTR_MAX, &cchActual);
     RTTEST_CHECK_RC_OK(hTest, rc);
     if (RT_SUCCESS(rc))
-        RTTEST_CHECK(hTest, (cchActual == 5));
+        RTTEST_CHECK(hTest, cchActual == 5);
     RTUTF16 *pwc = NULL;
     RTUTF16 wc[6];
