You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@stdcxx.apache.org by se...@apache.org on 2006/06/29 01:47:11 UTC

svn commit: r417904 [1/5] - in /incubator/stdcxx/trunk/tests: self/ src/ strings/

Author: sebor
Date: Wed Jun 28 16:47:10 2006
New Revision: 417904

URL: http://svn.apache.org/viewvc?rev=417904&view=rev
Log:
2006-06-28  Martin Sebor  <se...@roguewave.com>

	* src/char.cpp (_rw_get_char): New helper to parse <char>@<count>
	directives and Unicode <Unnn...> sequences denoting UCS characters.
	(_rw_expand): Called _rw_get_char.
	(rw_match): Called _rw_get_char, optimized and simplified.
	* test/0.char.cpp (test_rw_match): Added test cases and exercised
	the handling of <Unnn...> sequences.
	* 21.string.replace.cpp: Made use of the <Unnnn> directive and
	replaced NUL characters embedded in hardcoded string literals with
	the <U0> Unicode sequence (denoting NUL).

2006-06-28  Anton Pevtsov   <an...@moscow.vdiweb.com>

	* 21.string.access.cpp: Made use of the <Unnnn> directive and
	replaced NUL characters embedded in hardcoded string literals with
	the <U0> Unicode sequence (denoting NUL).
	* 21.string.access.cpp: Same.
	* 21.string.append.cpp: Same.
	* 21.string.assign.cpp: Same.
	* 21.string.capacity.cpp: Same.
	* 21.string.cons.cpp: Same.
	* 21.string.copy.cpp: Same.
	* 21.string.erase.cpp: Same.
	* 21.string.insert.cpp: Same.
	* 21.string.iterators.cpp: Same.
	* 21.string.operators.cpp: Same.
	* 21.string.plus.cpp: Same.
	* 21.string.plus_equal.cpp: Same.
	* 21.string.substr.cpp: Same.
	* 21.string.swap.cpp: Same.

Modified:
    incubator/stdcxx/trunk/tests/self/0.char.cpp
    incubator/stdcxx/trunk/tests/src/char.cpp
    incubator/stdcxx/trunk/tests/strings/21.string.access.cpp
    incubator/stdcxx/trunk/tests/strings/21.string.append.cpp
    incubator/stdcxx/trunk/tests/strings/21.string.assign.cpp
    incubator/stdcxx/trunk/tests/strings/21.string.capacity.cpp
    incubator/stdcxx/trunk/tests/strings/21.string.cons.cpp
    incubator/stdcxx/trunk/tests/strings/21.string.copy.cpp
    incubator/stdcxx/trunk/tests/strings/21.string.erase.cpp
    incubator/stdcxx/trunk/tests/strings/21.string.insert.cpp
    incubator/stdcxx/trunk/tests/strings/21.string.iterators.cpp
    incubator/stdcxx/trunk/tests/strings/21.string.op.plus.cpp
    incubator/stdcxx/trunk/tests/strings/21.string.op.plus.equal.cpp
    incubator/stdcxx/trunk/tests/strings/21.string.operators.cpp
    incubator/stdcxx/trunk/tests/strings/21.string.replace.cpp
    incubator/stdcxx/trunk/tests/strings/21.string.substr.cpp
    incubator/stdcxx/trunk/tests/strings/21.string.swap.cpp

Modified: incubator/stdcxx/trunk/tests/self/0.char.cpp
URL: http://svn.apache.org/viewvc/incubator/stdcxx/trunk/tests/self/0.char.cpp?rev=417904&r1=417903&r2=417904&view=diff
==============================================================================
--- incubator/stdcxx/trunk/tests/self/0.char.cpp (original)
+++ incubator/stdcxx/trunk/tests/self/0.char.cpp Wed Jun 28 16:47:10 2006
@@ -732,33 +732,6 @@
 
 /***********************************************************************/
 
-static size_t
-length (const char *s)
-{
-    return s ? strlen (s) : 0;
-}
-
-
-static size_t
-length (const wchar_t *ws)
-{
-    size_t len = 0;
-    if (ws)
-        for (len = 0; ws [len]; ++len);
-    return len;
-}
-
-
-static size_t
-length (const UserChar *us)
-{
-    size_t len = 0;
-    if (us)
-        for (len = 0; us [len].f || us [len].c; ++len);
-    return len;
-}
-
-
 static const UserChar*
 make_user_string (const char *s, size_t len)
 {
@@ -786,48 +759,155 @@
     //////////////////////////////////////////////////////////////////
     rw_info (0, 0, 0, "rw_match(char*, const char*, size_t)");
 
-    const size_t size_max = _RWSTD_SIZE_MAX;
     size_t result;
 
-#define LEN(T, s, len) \
-  int (size_max == size_t (len) ? length ((const T*)s) : size_t (len))
-
 #undef TEST
 #define TEST(s1, s2, len, expect)                                       \
   result = rw_match ((const char*)s1, (const char*)s2, size_t (len));   \
   rw_assert (expect == result,                                          \
              0, __LINE__,                                               \
              "rw_match(%{#*s}, %{#*s}, %zu) == %zu, got %zu",           \
-             LEN (char, s1, len), s1, LEN (char, s2, len),              \
-             s2, len, expect, result)
+             int (sizeof s1 - 1), s1, int (sizeof s2 - 1), s2, len,     \
+             expect, result)
 
     TEST (0,      0,        -1, 0);
     TEST ("",     0,        -1, 0);
     TEST (0,      "",       -1, 0);
-    TEST ("",     "",       -1, 0);
+    TEST ("",     "",       -1, 1);
 
-    // when invoked with NULL as the first string returns
-    // the length of the second string (if non-NULL)
+    // same as above but using the <char>@<count> directive
+    TEST ("a@0",  "",       -1, 1);
+    TEST ("",     "b@0",    -1, 1);
+    TEST ("a@0",  "b@0",    -1, 1);
+
+    // when invoked with NULL as the first argument returns
+    // the length of the second string with all directives
+    // expanded
     TEST (0,      "a",      -1, 1);
     TEST (0,      "ab",     -1, 2);
     TEST (0,      "abc",    -1, 3);
+    TEST (0,      "a@0",    -1, 0);
+    TEST (0,      "a@1",    -1, 1);
+    TEST (0,      "a@2",    -1, 2);
+    TEST (0,      "a@2b@0", -1, 2);
+    TEST (0,      "a@2b@1", -1, 3);
+    TEST (0,      "a@2b@2", -1, 4);
 
     // same as above but with the arguments reversed
-    TEST ("a",    0,        -1, 1);
-    TEST ("ab",   0,        -1, 2);
-    TEST ("abc",  0,        -1, 3);
+    TEST ("a",      0,      -1, 1);
+    TEST ("ab",     0,      -1, 2);
+    TEST ("abc",    0,      -1, 3);
+    TEST ("a@0",    0,      -1, 0);
+    TEST ("a@1",    0,      -1, 1);
+    TEST ("a@2",    0,      -1, 2);
+    TEST ("a@2b@0", 0,      -1, 2);
+    TEST ("a@2b@1", 0,      -1, 3);
+    TEST ("a@2b@2", 0,      -1, 4);
 
     TEST ("",     "a",      -1, 0);
     TEST ("a",    "",       -1, 0);
-    TEST ("a",    "a",      -1, 1);
+    TEST ("a",    "a",      -1, 2);
+
+    // same as above but using the <char>@<count> directive
+    TEST ("",     "a@1",    -1, 0);
+    TEST ("a@1",  "",       -1, 0);
+    TEST ("a",    "a@1",    -1, 2);
+    TEST ("a@1",  "a",      -1, 2);
+    TEST ("a@1",  "a@1",    -1, 2);
+
+    TEST ("\0ab",       "\0ac",   2, 2);
+    TEST ("\0@0ab",     "ab",     2, 2);
+    TEST ("\0@0a\0@0b", "ab",     2, 2);
+    TEST ("\0@1ab",     "\0@1ac", 2, 2);
+    TEST ("\0@1ab",     "\0@1ac", 2, 2);
 
-    TEST ("a\0bc", "a\0bd", -1, 1);
+    TEST ("a\0bc", "a\0bd", -1, 2);
     TEST ("a\0bc", "a\0bd",  0, 0);
     TEST ("a\0bc", "a\0bd",  1, 1);
     TEST ("a\0bc", "a\0bd",  2, 2);
     TEST ("a\0bc", "a\0bd",  3, 3);
     TEST ("a\0bc", "a\0bd",  4, 3);
 
+    TEST ("aaaaa",    "a@5",  -1, 6);
+    TEST ("aaaaaa@0", "a@5",  -1, 6);
+    TEST ("aaaaa@1",  "a@5",  -1, 6);
+    TEST ("aaaa@2",   "a@5",  -1, 6);
+    TEST ("aaa@3",    "a@5",  -1, 6);
+    TEST ("aa@4",     "a@5",  -1, 6);
+    TEST ("a@5",      "a@5",  -1, 6);
+    TEST ("a@4a",     "a@5",  -1, 6);
+    TEST ("a@3aa",    "a@5",  -1, 6);
+    TEST ("a@2aaa",   "a@5",  -1, 6);
+    TEST ("a@1aaaa",  "a@5",  -1, 6);
+    TEST ("a@0aaaaa", "a@5",  -1, 6);
+
+    TEST ("a@0a@1a@2a@3", "a@3a@2a@1a@0", -1, 7);
+    TEST ("a@0a@1a@2a@3", "a@3a@2a@1a@0",  0, 0);
+    TEST ("a@0a@1a@2a@3", "a@3a@2a@1a@0",  1, 1);
+    TEST ("a@0a@1a@2a@3", "a@3a@2a@1a@0",  2, 2);
+    TEST ("a@0a@1a@2a@3", "a@3a@2a@1a@0",  3, 3);
+    TEST ("a@0a@1a@2a@3", "a@3a@2a@1a@0",  4, 4);
+    TEST ("a@0a@1a@2a@3", "a@3a@2a@1a@0",  5, 5);
+    TEST ("a@0a@1a@2a@3", "a@3a@2a@1a@0",  6, 6);
+    TEST ("a@0a@1a@2a@3", "a@3a@2a@1a@0",  7, 7);
+
+    TEST ("a@0\0a@1a@2\0a@3\0", "\0a@3\0a@2a@1a@0\0", 10, 10);
+    TEST ("a@0*a@1a@2\0a@3\0",  "\0a@3\0a@2a@1a@0\0", 10,  0);
+    TEST ("a@0\0a@1a@2*a@3\0",  "\0a@3\0a@2a@1a@0\0", 10,  4);
+    TEST ("a@0\0a@1a@2\0a@3*",  "\0a@3\0a@2a@1a@0\0", 10,  8);
+    TEST ("a@11aa@12aaa@13b",   "a@13aa@12aaa@11c",   -1, 39);
+
+    // invalid directives
+    TEST ("a@b",   "a@0a@b",   -1, 4);
+    TEST ("a@b@c", "a@0a@b@c", -1, 6);
+
+    //////////////////////////////////////////////////////////////////
+    // exercise Unicode escape sequences
+    TEST ("<U0>",     "",        -1, 1);
+    TEST ("<U00>",    "",        -1, 1);
+    TEST ("<U000>",   "",        -1, 1);
+    TEST ("<U0000>",  "",        -1, 1);
+    TEST ("",         "<U0>",    -1, 1);
+    TEST ("",         "<U00>",   -1, 1);
+    TEST ("",         "<U000>",  -1, 1);
+    TEST ("",         "<U0000>", -1, 1);
+    TEST ("<U0>",     "<U0000>", -1, 1);
+    TEST ("<U00>",    "<U000>",  -1, 1);
+    TEST ("<U000>",   "<U00>",   -1, 1);
+    TEST ("<U0000>",  "<U0>",    -1, 1);
+
+    TEST ("<U1>",                   0, -1, 1);
+    TEST ("<U1><U02>",              0, -1, 2);
+    TEST ("<U1><U02><U003>",        0, -1, 3);
+    TEST ("<U1><U02><U003><U0004>", 0, -1, 4);
+
+#if 'A' == 0x41   // ASCII
+    TEST ("<UA>",      "\n",     -1, 2);
+    TEST ("<U0A>",     "\n",     -1, 2);
+    TEST ("<U00A>",    "\n",     -1, 2);
+    TEST ("<U000A>",   "\n",     -1, 2);
+    TEST ("<U0000A>",  "\n",     -1, 2);
+    TEST ("<U41>",     "A",      -1, 2);
+    TEST ("<U41>A",    "AA",     -1, 3);
+    TEST ("A<U41>A",   "AAA",    -1, 4);
+    TEST ("A<U41>@3A", "AAAAA",  -1, 6);
+
+    TEST ("<U41>@0<U42>@1<U43>@2<U44>@3", "BCCDDD", -1, 7);
+#elif 'A' == 0xC1   // EBCDIC
+    TEST ("<U25>",     "\n",     -1, 2);
+    TEST ("<U025>",    "\n",     -1, 2);
+    TEST ("<U025>",    "\n",     -1, 2);
+    TEST ("<U0025>",   "\n",     -1, 2);
+    TEST ("<UC1>",     "A",      -1, 2);
+    TEST ("<UC1>A",    "AA",     -1, 3);
+    TEST ("A<UC1>A",   "AAA",    -1, 4);
+    TEST ("A<UC1>@3A", "AAAAA",  -1, 6);
+
+    TEST ("<UC1>@0<UC2>@1<UC3>@2<UC4>@3", "BCCDDD", -1, 7);
+#else   // unknown
+    rw_warn (0, 0, "unknown character set (neither ASCII nor EBCDIC)");
+#endif
+
     //////////////////////////////////////////////////////////////////
     rw_info (0, 0, 0, "rw_match(char*, const wchar_t*, size_t)");
 
@@ -839,33 +919,92 @@
   rw_assert (expect == result,                                               \
              0, __LINE__,                                                    \
              "rw_match(%{#*s}, L%{#*ls}, %zu) == %zu, got %zu",              \
-             LEN (char, s1, len), s1, LEN (wchar_t, s2, len), s2,            \
-             len, expect, result)
+             int (sizeof s1 - 1), s1,                                        \
+             int (sizeof (s2) / sizeof *(s2) - 1), s2, len,                  \
+             expect, result)
 
-    TEST (0,       0,        -1, 0);
-    TEST ("",      0,        -1, 0);
-    TEST (0,       L"",      -1, 0);
-    TEST ("",      L"",      -1, 0);
-
-    TEST (0,       L"a",     -1, 1);
-    TEST (0,       L"ab",    -1, 2);
-    TEST (0,       L"abc",   -1, 3);
-
-    TEST ("a",     0,        -1, 1);
-    TEST ("ab",    0,        -1, 2);
-    TEST ("abc",   0,        -1, 3);
-
-    TEST ("",      L"a",     -1, 0);
-    TEST ("a",     L"",      -1, 0);
-    TEST ("a",     L"a",     -1, 1);
+    TEST (0,      (wchar_t*)0, -1, 0);
+    TEST ("",     (wchar_t*)0, -1, 0);
+    TEST (0,      L"",         -1, 0);
+    TEST ("",     L"",         -1, 1);
+
+    // same as above but using the <char>@<count> directive
+    TEST ("a@0",  L"",       -1, 1);
+    TEST ("",     L"",       -1, 1);
+    TEST ("a@0",  L"",       -1, 1);
+
+    // when invoked with NULL as the first argument returns
+    // the length of the second string with all directives
+    // expanded
+    TEST (0, L"a",      -1, 1);
+    TEST (0, L"ab",     -1, 2);
+    TEST (0, L"abc",    -1, 3);
+    TEST (0, L"abcd",   -1, 4);
+    TEST (0, L"abcde",  -1, 5);
+    TEST (0, L"abcdef", -1, 6);
+
+    // same as above but with the arguments reversed
+    TEST ("a",      (wchar_t*)0, -1, 1);
+    TEST ("ab",     (wchar_t*)0, -1, 2);
+    TEST ("abc",    (wchar_t*)0, -1, 3);
+    TEST ("a@0",    (wchar_t*)0, -1, 0);
+    TEST ("a@1",    (wchar_t*)0, -1, 1);
+    TEST ("a@2",    (wchar_t*)0, -1, 2);
+    TEST ("a@2b@0", (wchar_t*)0, -1, 2);
+    TEST ("a@2b@1", (wchar_t*)0, -1, 3);
+    TEST ("a@2b@2", (wchar_t*)0, -1, 4);
+
+    TEST ("",     L"a",      -1, 0);
+    TEST ("a",    L"",       -1, 0);
+    TEST ("a",    L"a",      -1, 2);
+
+    // same as above but using the <char>@<count> directive
+    TEST ("a@1",  L"",       -1, 0);
+    TEST ("a@1",  L"a",      -1, 2);
+
+    TEST ("\0ab",       L"\0ac",   2, 2);
+    TEST ("\0@0ab",     L"ab",     2, 2);
+    TEST ("\0@0a\0@0b", L"ab",     2, 2);
 
-    TEST ("a\0bc", L"a\0bd", -1, 1);
+    TEST ("a\0bc", L"a\0bd", -1, 2);
     TEST ("a\0bc", L"a\0bd",  0, 0);
     TEST ("a\0bc", L"a\0bd",  1, 1);
     TEST ("a\0bc", L"a\0bd",  2, 2);
     TEST ("a\0bc", L"a\0bd",  3, 3);
     TEST ("a\0bc", L"a\0bd",  4, 3);
 
+    TEST ("aaaaa",    L"aaaaa",  -1, 6);
+    TEST ("aaaaaa@0", L"aaaaa",  -1, 6);
+    TEST ("aaaaa@1",  L"aaaaa",  -1, 6);
+    TEST ("aaaa@2",   L"aaaaa",  -1, 6);
+    TEST ("aaa@3",    L"aaaaa",  -1, 6);
+    TEST ("aa@4",     L"aaaaa",  -1, 6);
+    TEST ("a@5",      L"aaaaa",  -1, 6);
+    TEST ("a@4a",     L"aaaaa",  -1, 6);
+    TEST ("a@3aa",    L"aaaaa",  -1, 6);
+    TEST ("a@2aaa",   L"aaaaa",  -1, 6);
+    TEST ("a@1aaaa",  L"aaaaa",  -1, 6);
+    TEST ("a@0aaaaa", L"aaaaa",  -1, 6);
+
+    TEST ("a@0a@1a@2a@3", L"aaaaaa", -1, 7);
+    TEST ("a@0a@1a@2a@3", L"aaaaaa",  0, 0);
+    TEST ("a@0a@1a@2a@3", L"aaaaaa",  1, 1);
+    TEST ("a@0a@1a@2a@3", L"aaaaaa",  2, 2);
+    TEST ("a@0a@1a@2a@3", L"aaaaaa",  3, 3);
+    TEST ("a@0a@1a@2a@3", L"aaaaaa",  4, 4);
+    TEST ("a@0a@1a@2a@3", L"aaaaaa",  5, 5);
+    TEST ("a@0a@1a@2a@3", L"aaaaaa",  6, 6);
+    TEST ("a@0a@1a@2a@3", L"aaaaaa",  7, 7);
+
+    TEST ("a@0\0a@1a@2\0a@3\0", L"\0aaa\0aaa\0", 10, 10);
+    TEST ("a@0*a@1a@2\0a@3\0",  L"\0aaa\0aaa\0", 10,  0);
+    TEST ("a@0\0a@1a@2*a@3\0",  L"\0aaa\0aaa\0", 10,  4);
+    TEST ("a@0\0a@1a@2\0a@3*",  L"\0aaa\0aaa\0", 10,  8);
+
+    // invalid directives
+    TEST ("a@b",   L"a@b",   -1, 4);
+    TEST ("a@b@c", L"a@b@c", -1, 6);
+
 #else   // if defined (_RWSTD_NO_WCHAR_T)
 
     rw_note (0, 0, 0, "_RWSTD_NO_WCHAR_T #defined, wchar_t test disabled");
@@ -876,38 +1015,86 @@
     rw_info (0, 0, 0, "rw_match(char*, const UserChar*, size_t)");
 
 #undef TEST
-#define TEST(s1, s2, len, expect)                                            \
-  result = rw_match ((const char*)s1,                                        \
-                     make_user_string (s2, sizeof (s2)), size_t (len));      \
-  rw_assert (expect == result,                                               \
-             0, __LINE__,                                                    \
-             "rw_match(%{#*s}, %{#*s}, %zu) == %zu, got %zu",                \
-             LEN (char, s1, len), s1, LEN (char, s2, len), s2,               \
+#define TEST(s1, s2, len, expect)                                       \
+  result = rw_match ((const char*)s1,                                   \
+                     make_user_string (s2, sizeof (s2)), size_t (len)); \
+  rw_assert (expect == result,                                          \
+             0, __LINE__,                                               \
+             "rw_match(%{#*s}, %{#*s}, %zu) == %zu, got %zu",           \
+             int (sizeof s1 - 1), s1, int (sizeof s2 - 1), s2, len,     \
              expect, result)
 
-    TEST (0,       0,       -1, 0);
-    TEST ("",      0,       -1, 0);
-    TEST (0,       "",      -1, 0);
-    TEST ("",      "",      -1, 0);
-
-    TEST (0,       "a",     -1, 1);
-    TEST (0,       "ab",    -1, 2);
-    TEST (0,       "abc",   -1, 3);
-
-    TEST ("a",     0,       -1, 1);
-    TEST ("ab",    0,       -1, 2);
-    TEST ("abc",   0,       -1, 3);
-
-    TEST ("",      "a",     -1, 0);
-    TEST ("a",     "",      -1, 0);
-    TEST ("a",     "a",     -1, 1);
+    TEST (0,      0,  -1, 0);
+    TEST ("",     0,  -1, 0);
+    TEST (0,      "", -1, 0);
+    TEST ("",     "", -1, 1);
+
+    // same as above but using the <char>@<count> directive
+    TEST ("a@0",  "",       -1, 1);
+    TEST ("",     "",       -1, 1);
+    TEST ("a@0",  "",       -1, 1);
+
+    // when invoked with NULL as the first string returns
+    // the length of the second string (if non-NULL)
+    TEST (0,      "a",      -1, 1);
+    TEST (0,      "ab",     -1, 2);
+    TEST (0,      "abc",    -1, 3);
+
+    // same as above but with the arguments reversed
+    TEST ("a",   0, -1, 1);
+    TEST ("ab",  0, -1, 2);
+    TEST ("abc", 0, -1, 3);
 
-    TEST ("a\0bc", "a\0bd", -1, 1);
+    TEST ("",     "a",      -1, 0);
+    TEST ("a",    "",       -1, 0);
+    TEST ("a",    "a",      -1, 2);
+
+    // same as above but using the <char>@<count> directive
+    TEST ("a@1",  "",       -1, 0);
+    TEST ("a@1",  "a",      -1, 2);
+
+    TEST ("\0ab",       "\0ac",   2, 2);
+    TEST ("\0@0ab",     "ab",     2, 2);
+    TEST ("\0@0a\0@0b", "ab",     2, 2);
+
+    TEST ("a\0bc", "a\0bd", -1, 2);
     TEST ("a\0bc", "a\0bd",  0, 0);
     TEST ("a\0bc", "a\0bd",  1, 1);
     TEST ("a\0bc", "a\0bd",  2, 2);
     TEST ("a\0bc", "a\0bd",  3, 3);
     TEST ("a\0bc", "a\0bd",  4, 3);
+
+    TEST ("aaaaa",    "aaaaa",  -1, 6);
+    TEST ("aaaaaa@0", "aaaaa",  -1, 6);
+    TEST ("aaaaa@1",  "aaaaa",  -1, 6);
+    TEST ("aaaa@2",   "aaaaa",  -1, 6);
+    TEST ("aaa@3",    "aaaaa",  -1, 6);
+    TEST ("aa@4",     "aaaaa",  -1, 6);
+    TEST ("a@5",      "aaaaa",  -1, 6);
+    TEST ("a@4a",     "aaaaa",  -1, 6);
+    TEST ("a@3aa",    "aaaaa",  -1, 6);
+    TEST ("a@2aaa",   "aaaaa",  -1, 6);
+    TEST ("a@1aaaa",  "aaaaa",  -1, 6);
+    TEST ("a@0aaaaa", "aaaaa",  -1, 6);
+
+    TEST ("a@0a@1a@2a@3", "aaaaaa", -1, 7);
+    TEST ("a@0a@1a@2a@3", "aaaaaa",  0, 0);
+    TEST ("a@0a@1a@2a@3", "aaaaaa",  1, 1);
+    TEST ("a@0a@1a@2a@3", "aaaaaa",  2, 2);
+    TEST ("a@0a@1a@2a@3", "aaaaaa",  3, 3);
+    TEST ("a@0a@1a@2a@3", "aaaaaa",  4, 4);
+    TEST ("a@0a@1a@2a@3", "aaaaaa",  5, 5);
+    TEST ("a@0a@1a@2a@3", "aaaaaa",  6, 6);
+    TEST ("a@0a@1a@2a@3", "aaaaaa",  7, 7);
+
+    TEST ("a@0\0a@1a@2\0a@3\0", "\0aaa\0aaa\0", 10, 10);
+    TEST ("a@0*a@1a@2\0a@3\0",  "\0aaa\0aaa\0", 10,  0);
+    TEST ("a@0\0a@1a@2*a@3\0",  "\0aaa\0aaa\0", 10,  4);
+    TEST ("a@0\0a@1a@2\0a@3*",  "\0aaa\0aaa\0", 10,  8);
+
+    // invalid directives
+    TEST ("a@b",   "a@b",   -1, 4);
+    TEST ("a@b@c", "a@b@c", -1, 6);
 }
 
 /***********************************************************************/

Modified: incubator/stdcxx/trunk/tests/src/char.cpp
URL: http://svn.apache.org/viewvc/incubator/stdcxx/trunk/tests/src/char.cpp?rev=417904&r1=417903&r2=417904&view=diff
==============================================================================
--- incubator/stdcxx/trunk/tests/src/char.cpp (original)
+++ incubator/stdcxx/trunk/tests/src/char.cpp Wed Jun 28 16:47:10 2006
@@ -526,6 +526,42 @@
 
 /**************************************************************************/
 
+static unsigned long
+_rw_get_char (const char *src, const char** end, size_t *count)
+{
+    unsigned long ch = UChar (*src++);
+
+    if ('<' == char (ch) && 'U' == src [0] && isxdigit (src [1])) {
+        // this looks like the beginning of a <Unnn...>
+        // sequence encoding a Unicode character, look
+        // for a sequence of digits followed by the
+        // closing '>'
+
+        char *tmp_end;
+        const unsigned long val = strtoul (src + 1, &tmp_end, 16);
+        if ('>' == *tmp_end) {
+            ch  = val;
+            src = tmp_end + 1;
+        }
+    }
+
+    if ('@' == src [0] && isdigit (src [1])) {
+        // <char>@<count> denotes a repeat directive representing
+        // <count> consecutive occurrences of the character <char>
+
+        char* tmp_end;
+        *count = strtoul (src + 1, &tmp_end, 10);
+        src    = tmp_end;
+    }
+    else
+        *count = 1;
+
+    *end = src;
+
+    return ch;
+}
+
+
 static void*
 _rw_expand (void *dst, size_t elemsize,
             const char *src, size_t src_len /* = SIZE_MAX */,
@@ -567,31 +603,17 @@
 
     for (const char *psrc = src; ; ) {
 
-        const char c = *psrc;
-
-        unsigned long count;
-
-        if ('@' == psrc [1] && isdigit (UChar (psrc [2]))) {
-            // process directive
-            psrc += 2;
-
-            char *end = 0;
-            count = strtoul (psrc, &end, 10);
-
-            src_len -= (end - psrc) + 2;
-
-            psrc = end;
-
-        }
-        else {
-            count = 1;
-
-            // decrement length unless it's already 0
-            if (src_len)
-                --src_len;
+        size_t count = 0;
+        const char *end = 0;
+        const unsigned long ch = _rw_get_char (psrc, &end, &count);
+
+        const size_t nchars = size_t (end - psrc);
+        if (nchars <= src_len)
+            src_len -= nchars;
+        else
+            src_len = 0;
 
-            ++psrc;
-        }
+        psrc = end;
 
         if (bufsize - buflen <= count) {
             // increase the size of the buffer
@@ -627,16 +649,76 @@
 
         if (sizeof (WChar) == elemsize) {
             for (size_t i = 0; i != count; ++i)
-                ((WChar*)pnext)[i] = WChar (UChar (c));
+                ((WChar*)pnext)[i] = WChar (ch);
         }
         else if (sizeof (UserChar) == elemsize) {
             for (size_t i = 0; i != count; ++i) {
                 ((UserChar*)pnext)[i].f = 0;
-                ((UserChar*)pnext)[i].c = UChar (c);
+                ((UserChar*)pnext)[i].c = UChar (ch);
             }
         }
-        else
-            memset (pnext, UChar (c), count);
+        else if (ch < 0x80U) {
+            memset (pnext, UChar (ch), count);
+        }
+        else {
+#if 1
+            // narrow the wide character to char
+            memset (pnext, UChar (ch), count);
+
+            pnext   = (char*)pnext + count * elemsize;
+            buflen += count;
+            
+#else   // disabled
+
+            // FIXME: enable UCS to UTF-8 conversion
+            // (need to allocate sufficient storage above)
+
+            const char* const pnext_start = pnext;
+
+            // count the number of UTF-8 bytes
+            size_t nbytes = 0;
+
+            for (size_t i = 0; i != count; ++i) {
+                if (ch < 0x800U) {
+                    *pnext++ = UChar (0xc0U | (ch >> 6));
+                    *pnext++ = UChar (0x80U | (ch & 0x3fU));
+                    nbytes  += 2;
+                }
+                else if (ch < 0x10000U) {
+                    *pnext++ = UChar (0xe0U | (ch >> 12));
+                    *pnext++ = UChar (0x80U | (ch >>  6 & 0x3fU));
+                    *pnext++ = UChar (0x80U | (ch       & 0x3fU));
+                    nbytes  += 3;
+                }
+                else if (ch < 0x200000U) {
+                    *pnext++ = UChar (0xf0U | (ch >> 18));
+                    *pnext++ = UChar (0x80U | (ch >> 12 & 0x3fU));
+                    *pnext++ = UChar (0x80U | (ch >>  6 & 0x3fU));
+                    *pnext++ = UChar (0x80U | (ch       & 0x3fU));
+                    nbytes  += 4;
+                }
+                else if (ch < 0x4000000U) {
+                    *pnext++ = UChar (0xf8U | (ch >> 24));
+                    *pnext++ = UChar (0x80U | (ch >> 18 & 0x3fU));
+                    *pnext++ = UChar (0x80U | (ch >> 12 & 0x3fU));
+                    *pnext++ = UChar (0x80U | (ch >>  6 & 0x3fU));
+                    *pnext++ = UChar (0x80U | (ch       & 0x3fU));
+                    nbytes  += 5;
+                }
+                else {
+                    *pnext++ = UChar (0xfcU | (ch >> 30));
+                    *pnext++ = UChar (0x80U | (ch >> 24 & 0x3fU));
+                    *pnext++ = UChar (0x80U | (ch >> 18 & 0x3fU));
+                    *pnext++ = UChar (0x80U | (ch >> 12 & 0x3fU));
+                    *pnext++ = UChar (0x80U | (ch >>  6 & 0x3fU));
+                    *pnext++ = UChar (0x80U | (ch       & 0x3fU));
+                    nbytes  += 6;
+                }
+            }
+
+#endif   // 0/1
+
+        }
 
         pnext   = (char*)pnext + count * elemsize;
         buflen += count;
@@ -678,59 +760,75 @@
 size_t
 rw_match (const char *s1, const char *s2, size_t len /* = SIZE_MAX */)
 {
+    // the length of the initial subsequence of s1 and s2
+    // consisting solely of characters that compare equal
+    size_t count = 0;
+
     if (0 == s1) {
-        // return the length of s2 if non-null
-        return s2 ? strlen (s2) : 0;
+        s1 = s2;
+        s2 = 0;
     }
 
-    if (0 == s2)
-        return strlen (s1);
+    const char* p1 = s1;
 
-    const char* const s1_save = s1;
+    if (0 == s2) {
+        // when one of the strings is null, compute the length
+        // of the other string when all directives are expanded
+        if (0 == s1 || 0 == *s1)
+            return 0;
 
-    char   s1_buf [256];
-    size_t s1_len = sizeof s1_buf;
+        do {
+            size_t n = 0;
 
-    // see if the first string contains '@' and might need
-    // to be expanded (see rw_expand() for details)
-    bool expand = false;
+            _rw_get_char (p1, &p1, &n);
 
-    if (_RWSTD_SIZE_MAX == len) {
-        expand = 0 != strchr (s1, '@');
-    }
-    else {
-        for (const char *p = s1; *p; ++p) {
-            if (size_t (p - s1) == len)
-                break;
-            if ('@' == *p) {
-                expand = true;
-                break;
-            }
-        }
-    }
+            count += n;
+        } while (p1 && *p1);
 
-    if (expand) {
-        s1  = rw_expand (s1_buf, s1, _RWSTD_SIZE_MAX, &s1_len);
-        len = s1_len;
+        return count;
     }
+    
+    const char* p2 = s2;
+
+    size_t n1 = 0;
+    size_t n2 = 0;
 
-    size_t n = 0;
+    for (unsigned long ch1, ch2; count < len; ) {
 
-    for ( ; n != len && s1 [n] == s2 [n]; ++n) {
-        if (_RWSTD_SIZE_MAX == len && '\0' == s1 [n])
+        while (0 == n1)
+            ch1 = _rw_get_char (p1, &p1, &n1);
+
+        while (0 == n2)
+            ch2 = _rw_get_char (p2, &p2, &n2);
+
+        if (ch1 != ch2)
             break;
-    }
 
-    if (s1 && s1_save != s1 && s1_buf != s1) {
-        // deallocate memory if it was allocated by rw_expand()
-        delete[] s1;
+        if (n1 < n2) {
+            // the repeat count specified by the first directive
+            // is less than the repeat count given by the second
+            count += n1;
+            n2    -= n1;
+            n1     = 0;
+
+        }
+        else if (n2 <= n1) {
+            // the repeat count specified by the second directive
+            // is less than or equal than that given by the first
+            count += n2;
+            n1    -= n2;
+            n2     = 0;
+        }
+
+        if (_RWSTD_SIZE_MAX == len && 0 == ch1)
+            break;
     }
 
-    return n;
+    return len < count ? len : count;
 }
 
 
-#ifndef _RWSTD_WCHAR_T
+#ifndef _RWSTD_NO_WCHAR_T
 
 _TEST_EXPORT
 wchar_t*
@@ -829,35 +927,53 @@
     }
 
     if (0 == s2)
-        return strlen (s1);
+        return rw_match (s1, (char*)0, len);
 
-    const char* const s1_save = s1;
+    const char*    p1 = s1;
+    const wchar_t* p2 = s2;
 
-    char   s1_buf [256];
-    size_t s1_len = sizeof s1_buf;
-    
-    // see if the first string contains '@' and might need
-    // to be expanded  (see rw_expand() for details)
-    if (   _RWSTD_SIZE_MAX == len && strchr (s1, '@')
-        || _RWSTD_SIZE_MAX != len && memchr (s1, '@', len)) {
-        s1 = rw_expand (s1_buf, s1, len, &s1_len);
-        len = s1_len;
-    }
+    // the length of the initial subsequence of s1 and s2
+    // consisting solely of characters that compare equal
+    size_t count = 0;
+
+    size_t n1 = 0;
+    size_t n2 = 0;
 
-    size_t n = 0;
+    for (unsigned long ch1, ch2; count < len; ) {
 
-    for ( ; n != len && UChar (s1 [n]) == unsigned (s2 [n]); ++n) {
-        if (_RWSTD_SIZE_MAX == len && '\0' == s1 [n])
+        while (0 == n1)
+            ch1 = _rw_get_char (p1, &p1, &n1);
+
+        ch2 = _RWSTD_STATIC_CAST (unsigned long, *p2++);
+        n2  = 1;
+
+        if (ch1 != ch2)
             break;
-    }
 
-    if (s1 && s1_save != s1 && s1_buf != s1)
-        delete[] s1;
+        if (n1 < n2) {
+            // the repeat count specified by the first directive
+            // is less than the repeat count given by the second
+            count += n1;
+            n2    -= n1;
+            n1     = 0;
+
+        }
+        else if (n2 <= n1) {
+            // the repeat count specified by the second directive
+            // is less than or equal than that given by the first
+            count += n2;
+            n1    -= n2;
+            n2     = 0;
+        }
+
+        if (_RWSTD_SIZE_MAX == len && L'\0' == ch1)
+            break;
+    }
 
-    return n;
+    return len < count ? len : count;
 }
 
-#endif   // _RWSTD_WCHAR_T
+#endif   // _RWSTD_NO_WCHAR_T
 
 
 _TEST_EXPORT
@@ -958,32 +1074,52 @@
     }
 
     if (0 == s2)
-        return strlen (s1);
+        return rw_match (s1, (char*)0, len);
 
-    const char* const s1_save = s1;
+    const char*     p1 = s1;
+    const UserChar* p2 = s2;
 
-    char   s1_buf [256];
-    size_t s1_len = sizeof s1_buf;
-    
-    // see if the first string contains '@' and might need
-    // to be expanded  (see rw_expand() for details)
-    if (   _RWSTD_SIZE_MAX == len && strchr (s1, '@')
-        || _RWSTD_SIZE_MAX != len && memchr (s1, '@', len)) {
-        s1 = rw_expand (s1_buf, s1, len, &s1_len);
-        len = s1_len;
-    }
+    // the length of the initial subsequence of s1 and s2
+    // consisting solely of characters that compare equal
+    size_t count = 0;
 
-    size_t n = 0;
+    size_t n1 = 0;
+    size_t n2 = 0;
 
-    for ( ; n != len && UChar (s1 [n]) == s2 [n].c; ++n) {
-        if (_RWSTD_SIZE_MAX == len && '\0' == s1 [n])
+    unsigned long ch1;
+
+    for (UserChar ch2; count < len; ) {
+
+        while (0 == n1)
+            ch1 = _rw_get_char (p1, &p1, &n1);
+
+        ch2 = *p2++;
+        n2  = 1;
+
+        if (ch1 != ch2.c)
             break;
-    }
 
-    if (s1 && s1_save != s1 && s1_buf != s1)
-        delete[] s1;
+        if (n1 < n2) {
+            // the repeat count specified by the first directive
+            // is less than the repeat count given by the second
+            count += n1;
+            n2    -= n1;
+            n1     = 0;
+
+        }
+        else if (n2 <= n1) {
+            // the repeat count specified by the second directive
+            // is less than or equal than that given by the first
+            count += n2;
+            n1    -= n2;
+            n2     = 0;
+        }
+
+        if (_RWSTD_SIZE_MAX == len && L'\0' == ch1)
+            break;
+    }
 
-    return n;
+    return len < count ? len : count;
 }
 
 /**************************************************************************/

Modified: incubator/stdcxx/trunk/tests/strings/21.string.access.cpp
URL: http://svn.apache.org/viewvc/incubator/stdcxx/trunk/tests/strings/21.string.access.cpp?rev=417904&r1=417903&r2=417904&view=diff
==============================================================================
--- incubator/stdcxx/trunk/tests/strings/21.string.access.cpp (original)
+++ incubator/stdcxx/trunk/tests/strings/21.string.access.cpp Wed Jun 28 16:47:10 2006
@@ -53,35 +53,35 @@
         0, 0, 0, res, 0                          \
     }
 
-    //    +--------------------------------- controlled sequence
-    //    |               +----------------- index 
-    //    |               |   +------------- expected result 
-    //    |               |   |     
-    //    V               V   V     
-    TEST ("a",            0, 'a' ), 
-
-    TEST ("\0",           0, '\0'),
-
-    TEST ("abc",          0, 'a' ),  
-    TEST ("abc",          1, 'b' ),  
-    TEST ("abc",          2, 'c' ),  
-
-    TEST ("\0ab\0\0c",    0, '\0'), 
-
-    TEST ("a\0b\0\0c",    0, 'a' ),  
-    TEST ("a\0b\0\0c",    1, '\0'),
-    TEST ("a\0b\0\0c",    2, 'b' ),  
-    TEST ("a\0b\0\0c",    3, '\0'), 
-    TEST ("a\0b\0\0c",    4, '\0'),
-    TEST ("a\0b\0\0c",    5, 'c' ),   
-
-    TEST ("a\0bc\0\0",    5, '\0'), 
-
-    TEST ("x@4096",       0, 'x' ),  
-    TEST ("x@4096",    2048, 'x' ), 
-    TEST ("x@4096",    4095, 'x' ), 
+    //    +--------------------------------------- controlled sequence
+    //    |                     +----------------- index 
+    //    |                     |   +------------- expected result 
+    //    |                     |   |     
+    //    V                     V   V     
+    TEST ("a",                  0, 'a' ), 
+
+    TEST ("<U0>",               0, '\0'),
+
+    TEST ("abc",                0, 'a' ),  
+    TEST ("abc",                1, 'b' ),  
+    TEST ("abc",                2, 'c' ),  
+
+    TEST ("<U0>ab<U0><U0>c",    0, '\0'), 
+
+    TEST ("a<U0>b<U0><U0>c",    0, 'a' ),  
+    TEST ("a<U0>b<U0><U0>c",    1, '\0'),
+    TEST ("a<U0>b<U0><U0>c",    2, 'b' ),  
+    TEST ("a<U0>b<U0><U0>c",    3, '\0'), 
+    TEST ("a<U0>b<U0><U0>c",    4, '\0'),
+    TEST ("a<U0>b<U0><U0>c",    5, 'c' ),   
+
+    TEST ("a<U0>bc<U0><U0>",    5, '\0'), 
+
+    TEST ("x@4096",             0, 'x' ),  
+    TEST ("x@4096",          2048, 'x' ), 
+    TEST ("x@4096",          4095, 'x' ), 
 
-    TEST ("last",         3, 't' )  
+    TEST ("last",               3, 't' )  
 };
 
 /**************************************************************************/
@@ -98,42 +98,42 @@
         0, 0, 0, res, 0                          \
     }
 
-    //    +--------------------------------- controlled sequence
-    //    |               +----------------- index 
-    //    |               |   +------------- expected result 
-    //    |               |   |     
-    //    V               V   V     
-    TEST ("a",            0, 'a' ),  
-    TEST ("a",            1, NPOS), 
-
-    TEST ("",             0, NPOS), 
-
-    TEST ("\0",           0, '\0'),
-    TEST ("\0",           1, NPOS), 
-
-    TEST ("abc",          0, 'a' ),  
-    TEST ("abc",          1, 'b' ),  
-    TEST ("abc",          2, 'c' ),  
-    TEST ("abc",          3, NPOS), 
-
-    TEST ("\0ab\0\0c",    0, '\0'), 
-
-    TEST ("a\0b\0\0c",    0, 'a' ),  
-    TEST ("a\0b\0\0c",    1, '\0'),
-    TEST ("a\0b\0\0c",    2, 'b' ),  
-    TEST ("a\0b\0\0c",    3, '\0'), 
-    TEST ("a\0b\0\0c",    4, '\0'),
-    TEST ("a\0b\0\0c",    5, 'c' ),  
-    TEST ("a\0b\0\0c",    6, NPOS), 
-
-    TEST ("a\0bc\0\0",    5, '\0'), 
-
-    TEST ("x@4096",       0, 'x' ),  
-    TEST ("x@4096",    2048, 'x' ), 
-    TEST ("x@4096",    4095, 'x' ), 
-    TEST ("x@4096",    4096, NPOS),
+    //    +--------------------------------------- controlled sequence
+    //    |                     +----------------- index 
+    //    |                     |   +------------- expected result 
+    //    |                     |   |     
+    //    V                     V   V     
+    TEST ("a",                  0, 'a' ),  
+    TEST ("a",                  1, NPOS), 
+
+    TEST ("",                   0, NPOS), 
+
+    TEST ("<U0>",               0, '\0'),
+    TEST ("<U0>",               1, NPOS), 
+
+    TEST ("abc",                0, 'a' ),  
+    TEST ("abc",                1, 'b' ),  
+    TEST ("abc",                2, 'c' ),  
+    TEST ("abc",                3, NPOS), 
+
+    TEST ("<U0>ab<U0><U0>c",    0, '\0'), 
+
+    TEST ("a<U0>b<U0><U0>c",    0, 'a' ),  
+    TEST ("a<U0>b<U0><U0>c",    1, '\0'),
+    TEST ("a<U0>b<U0><U0>c",    2, 'b' ),  
+    TEST ("a<U0>b<U0><U0>c",    3, '\0'), 
+    TEST ("a<U0>b<U0><U0>c",    4, '\0'),
+    TEST ("a<U0>b<U0><U0>c",    5, 'c' ),  
+    TEST ("a<U0>b<U0><U0>c",    6, NPOS), 
+
+    TEST ("a<U0>bc<U0><U0>",    5, '\0'), 
+
+    TEST ("x@4096",             0, 'x' ),  
+    TEST ("x@4096",          2048, 'x' ), 
+    TEST ("x@4096",          4095, 'x' ), 
+    TEST ("x@4096",          4096, NPOS),
 
-    TEST ("last",         3, 't' )  
+    TEST ("last",               3, 't' )  
 };
 
 /**************************************************************************/
@@ -153,45 +153,45 @@
         0, 0, 0, res, bthrow                    \
     }
 
-    //    +--------------------------------- controlled sequence
-    //    |               +----------------- index 
-    //    |               |  +-------------- expected result 
-    //    |               |  |        +----- exception info 
-    //    |               |  |        |      0 - no exception
-    //    |               |  |        |      1 - out_of_range
-    //    |               |  |        |
-    //    V               V  V        V
-    TEST ("a",            0, 'a',     0),
-    TEST ("a",            1, NPOS,    1),
-
-    TEST ("",             0, NPOS,    1),
-
-    TEST ("\0",           0, '\0',    0),
-    TEST ("\0",           1, NPOS,    1),
-
-    TEST ("abc",          0, 'a',     0),
-    TEST ("abc",          1, 'b',     0),
-    TEST ("abc",          2, 'c',     0),
-    TEST ("abc",          3, NPOS,    1),
-
-    TEST ("\0ab\0\0c",    0, '\0',    0),
-
-    TEST ("a\0b\0\0c",    0, 'a',     0),
-    TEST ("a\0b\0\0c",    1, '\0',    0),
-    TEST ("a\0b\0\0c",    2, 'b',     0),
-    TEST ("a\0b\0\0c",    3, '\0',    0),
-    TEST ("a\0b\0\0c",    4, '\0',    0),
-    TEST ("a\0b\0\0c",    5, 'c',     0),
-    TEST ("a\0b\0\0c",    6, NPOS,    1),
-
-    TEST ("a\0bc\0\0",    5, '\0',    0),
-
-    TEST ("x@4096",       0, 'x',     0),
-    TEST ("x@4096",    2048, 'x',     0),
-    TEST ("x@4096",    4095, 'x',     0),
-    TEST ("x@4096",    4096, NPOS,    1),
+    //    +--------------------------------------- controlled sequence
+    //    |                     +----------------- index 
+    //    |                     |  +-------------- expected result 
+    //    |                     |  |        +----- exception info 
+    //    |                     |  |        |      0 - no exception
+    //    |                     |  |        |      1 - out_of_range
+    //    |                     |  |        |
+    //    V                     V  V        V
+    TEST ("a",                  0, 'a',     0),
+    TEST ("a",                  1, NPOS,    1),
+
+    TEST ("",                   0, NPOS,    1),
+
+    TEST ("<U0>",               0, '\0',    0),
+    TEST ("<U0>",               1, NPOS,    1),
+
+    TEST ("abc",                0, 'a',     0),
+    TEST ("abc",                1, 'b',     0),
+    TEST ("abc",                2, 'c',     0),
+    TEST ("abc",                3, NPOS,    1),
+
+    TEST ("<U0>ab<U0><U0>c",    0, '\0',    0),
+
+    TEST ("a<U0>b<U0><U0>c",    0, 'a',     0),
+    TEST ("a<U0>b<U0><U0>c",    1, '\0',    0),
+    TEST ("a<U0>b<U0><U0>c",    2, 'b',     0),
+    TEST ("a<U0>b<U0><U0>c",    3, '\0',    0),
+    TEST ("a<U0>b<U0><U0>c",    4, '\0',    0),
+    TEST ("a<U0>b<U0><U0>c",    5, 'c',     0),
+    TEST ("a<U0>b<U0><U0>c",    6, NPOS,    1),
+
+    TEST ("a<U0>bc<U0><U0>",    5, '\0',    0),
+
+    TEST ("x@4096",             0, 'x',     0),
+    TEST ("x@4096",          2048, 'x',     0),
+    TEST ("x@4096",          4095, 'x',     0),
+    TEST ("x@4096",          4096, NPOS,    1),
 
-    TEST ("last",         3, 't',     0)
+    TEST ("last",               3, 't',     0)
 };
 
 /**************************************************************************/

Modified: incubator/stdcxx/trunk/tests/strings/21.string.append.cpp
URL: http://svn.apache.org/viewvc/incubator/stdcxx/trunk/tests/strings/21.string.append.cpp?rev=417904&r1=417903&r2=417904&view=diff
==============================================================================
--- incubator/stdcxx/trunk/tests/strings/21.string.append.cpp (original)
+++ incubator/stdcxx/trunk/tests/strings/21.string.append.cpp Wed Jun 28 16:47:10 2006
@@ -61,61 +61,61 @@
         arg, sizeof arg - 1, res, sizeof res - 1, bthrow        \
     }
 
-    //    +----------------------------------------- controlled sequence
-    //    |             +--------------------------- sequence to be appended
-    //    |             |             +------------- expected result sequence
-    //    |             |             |        +---- exception info
-    //    |             |             |        |         0 - no exception
-    //    |             |             |        |         1 - out_of_range
-    //    |             |             |        |         2 - length_error
-    //    |             |             |        |        -1 - exc. safety
-    //    |             |             |        |
-    //    |             |             |        +--------------+
-    //    V             V             V                       V
-    TEST ("ab",         "c",          "abc",                  0),
-
-    TEST ("",           "",           "",                     0),
-    TEST ("",           "\0",         "",                     0),
-    TEST ("",           "abc",        "abc",                  0),
-
-    TEST ("\0",         "",           "\0",                   0),
-    TEST ("\0",         "a",          "\0a",                  0),
-    TEST ("\0",         "\0\0",       "\0",                   0),
-
-    TEST ("ab",         "cd",         "abcd",                 0),
-    TEST ("bcd",        "a",          "bcda",                 0),
-    TEST ("cde",        "ab",         "cdeab",                0),
-    TEST ("abc",        "",           "abc",                  0),
-    TEST ("ab",         "c\0e",       "abc",                  0),
-
-    TEST ("\0\0ab",     "cdefghij",   "\0\0abcdefghij",       0),
-    TEST ("a\0\0b",     "cdefghij",   "a\0\0bcdefghij",       0),
-    TEST ("ab\0\0",     "cdefghij",   "ab\0\0cdefghij",       0),
-    TEST ("a\0b\0\0c",  "e\0",        "a\0b\0\0ce",           0),
-    TEST ("\0ab\0\0c",  "e\0",        "\0ab\0\0ce",           0),
-    TEST ("abcdefghij", "abcdefghij", "abcdefghijabcdefghij", 0),
-
-    TEST ("",           "x@4096",     "x@4096",               0),
-    TEST ("x@4096",     "",           "x@4096",               0),
-    TEST ("x@4096",     "x@4096",     "x@8192",               0),
-
-    TEST ("x@10",       "x@118",      "x@128",                0),
-    TEST ("x@128",      "x@79",       "x@207",                0),
-    TEST ("x@207",      "x@127",      "x@334",                0),
-    TEST ("x@334",      "x@206",      "x@540",                0),
-    TEST ("x@540",      "x@333",      "x@873",                0),
-    TEST ("x@539",      "x@873",      "x@1412",               0),
-    TEST ("x@872",      "x@1412",     "x@2284",               0),
-    TEST ("x@1411",     "x@2284",     "x@3695",               0),
-    TEST ("x@1412",     "x@2284",     "x@3696",               0),
-
-    TEST ("",           0,            "",                     0),
-    TEST ("abc",        0,            "abcabc",               0),
-    TEST ("a\0\0bc",    0,            "a\0\0bca",             0),
-    TEST ("\0\0abc",    0,            "\0\0abc",              0),
-    TEST ("abc\0\0",    0,            "abc\0\0abc",           0),
+    //    +------------------------------------------ controlled sequence
+    //    |                  +----------------------- sequence to be appended
+    //    |                  |            +---------- expected result sequence
+    //    |                  |            |        +- exception info
+    //    |                  |            |        |    0 - no exception
+    //    |                  |            |        |    1 - out_of_range
+    //    |                  |            |        |    2 - length_error
+    //    |                  |            |        |   -1 - avoid exc. safety
+    //    |                  |            |        |
+    //    |                  |            |        +--------------+
+    //    V                  V            V                       V
+    TEST ("ab",             "c",          "abc",                  0),
+
+    TEST ("",               "",           "",                     0),
+    TEST ("",               "<U0>",       "",                     0),
+    TEST ("",               "abc",        "abc",                  0),
+
+    TEST ("<U0>",           "",           "<U0>",                 0),
+    TEST ("<U0>",           "a",          "<U0>a",                0),
+    TEST ("<U0>",           "<U0>@2",     "<U0>",                 0),
+
+    TEST ("ab",             "cd",         "abcd",                 0),
+    TEST ("bcd",            "a",          "bcda",                 0),
+    TEST ("cde",            "ab",         "cdeab",                0),
+    TEST ("abc",            "",           "abc",                  0),
+    TEST ("ab",             "c<U0>e",     "abc",                  0),
+
+    TEST ("<U0>@2ab",       "cdefghij",   "<U0>@2abcdefghij",     0),
+    TEST ("a<U0>@2b",       "cdefghij",   "a<U0>@2bcdefghij",     0),
+    TEST ("ab<U0>@2",       "cdefghij",   "ab<U0>@2cdefghij",     0),
+    TEST ("a<U0>b<U0>@2c",  "e<U0>",      "a<U0>b<U0>@2ce",       0),
+    TEST ("<U0>ab<U0>@2c",  "e<U0>",      "<U0>ab<U0>@2ce",       0),
+    TEST ("abcdefghij",     "abcdefghij", "abcdefghijabcdefghij", 0),
+
+    TEST ("",               "x@4096",     "x@4096",               0),
+    TEST ("x@4096",         "",           "x@4096",               0),
+    TEST ("x@4096",         "x@4096",     "x@8192",               0),
+
+    TEST ("x@10",           "x@118",      "x@128",                0),
+    TEST ("x@128",          "x@79",       "x@207",                0),
+    TEST ("x@207",          "x@127",      "x@334",                0),
+    TEST ("x@334",          "x@206",      "x@540",                0),
+    TEST ("x@540",          "x@333",      "x@873",                0),
+    TEST ("x@539",          "x@873",      "x@1412",               0),
+    TEST ("x@872",          "x@1412",     "x@2284",               0),
+    TEST ("x@1411",         "x@2284",     "x@3695",               0),
+    TEST ("x@1412",         "x@2284",     "x@3696",               0),
+
+    TEST ("",                      0,     "",                     0),
+    TEST ("abc",                   0,     "abcabc",               0),
+    TEST ("a<U0>@2bc",             0,     "a<U0>@2bca",           0),
+    TEST ("<U0>@2abc",             0,     "<U0>@2abc",            0),
+    TEST ("abc<U0>@2",             0,     "abc<U0>@2abc",         0),
 
-    TEST ("last",       "test",       "lasttest",             0)
+    TEST ("last",             "test",     "lasttest",             0)
 };
 
 /**************************************************************************/
@@ -132,62 +132,62 @@
         arg, sizeof arg - 1, res, sizeof res - 1, bthrow        \
     }
 
-    //    +----------------------------------------- controlled sequence
-    //    |             +--------------------------- sequence to be appended
-    //    |             |             +------------- expected result sequence
-    //    |             |             |        +---- exception info
-    //    |             |             |        |         0 - no exception
-    //    |             |             |        |         1 - out_of_range
-    //    |             |             |        |         2 - length_error
-    //    |             |             |        |        -1 - exc. safety
-    //    |             |             |        |
-    //    |             |             |        +--------------+
-    //    V             V             V                       V
-    TEST ("ab",         "c",          "abc",                  0),
-
-    TEST ("",           "",           "",                     0),
-    TEST ("",           "\0",         "\0",                   0),
-    TEST ("",           "abc",        "abc",                  0),
-
-    TEST ("\0",         "",           "\0",                   0),
-    TEST ("\0",         "a",          "\0a",                  0),
-    TEST ("\0",         "\0\0",       "\0\0\0",               0),
-
-    TEST ("ab",         "cd",         "abcd",                 0),
-    TEST ("bcd",        "a",          "bcda",                 0),
-    TEST ("cde",        "ab",         "cdeab",                0),
-    TEST ("abc",        "",           "abc",                  0),
-    TEST ("ab",         "c\0e",       "abc\0e",               0),
-
-    TEST ("\0\0ab",     "cdefghij",   "\0\0abcdefghij",       0),
-    TEST ("a\0\0b",     "cdefghij",   "a\0\0bcdefghij",       0),
-    TEST ("ab\0\0",     "cdefghij",   "ab\0\0cdefghij",       0),
-    TEST ("a\0b\0\0c",  "e\0",        "a\0b\0\0ce\0",         0),
-    TEST ("\0ab\0\0c",  "e\0",        "\0ab\0\0ce\0",         0),
-    TEST ("ab\0\0c\0",  "\0e",        "ab\0\0c\0\0e",         0),
-    TEST ("abcdefghij", "abcdefghij", "abcdefghijabcdefghij", 0),
-
-    TEST ("",           "x@4096",     "x@4096",               0),
-    TEST ("x@4096",     "",           "x@4096",               0),
-    TEST ("x@4096",     "x@4096",     "x@8192",               0),
-
-    TEST ("x@10",       "x@118",      "x@128",                0),
-    TEST ("x@128",      "x@79",       "x@207",                0),
-    TEST ("x@207",      "x@127",      "x@334",                0),
-    TEST ("x@334",      "x@206",      "x@540",                0),
-    TEST ("x@540",      "x@333",      "x@873",                0),
-    TEST ("x@539",      "x@873",      "x@1412",               0),
-    TEST ("x@872",      "x@1412",     "x@2284",               0),
-    TEST ("x@1411",     "x@2284",     "x@3695",               0),
-    TEST ("x@1412",     "x@2284",     "x@3696",               0),
-
-    TEST ("",           0,            "",                     0),
-    TEST ("abc",        0,            "abcabc",               0),
-    TEST ("a\0\0bc",    0,            "a\0\0bca\0\0bc",       0),
-    TEST ("\0\0abc",    0,            "\0\0abc\0\0abc",       0),
-    TEST ("abc\0\0",    0,            "abc\0\0abc\0\0",       0),
+    //    +------------------------------------------ controlled sequence
+    //    |                  +----------------------- sequence to be appended
+    //    |                  |            +---------- expected result sequence
+    //    |                  |            |        +- exception info
+    //    |                  |            |        |    0 - no exception
+    //    |                  |            |        |    1 - out_of_range
+    //    |                  |            |        |    2 - length_error
+    //    |                  |            |        |   -1 - avoid exc. safety
+    //    |                  |            |        |
+    //    |                  |            |        +--------------+
+    //    V                  V            V                       V
+    TEST ("ab",             "c",          "abc",                  0),
+
+    TEST ("",               "",           "",                     0),
+    TEST ("",               "<U0>",       "<U0>",                 0),
+    TEST ("",               "abc",        "abc",                  0),
+
+    TEST ("<U0>",           "",           "<U0>",                 0),
+    TEST ("<U0>",           "a",          "<U0>a",                0),
+    TEST ("<U0>",           "<U0>@2",     "<U0>@3",               0),
+
+    TEST ("ab",             "cd",         "abcd",                 0),
+    TEST ("bcd",            "a",          "bcda",                 0),
+    TEST ("cde",            "ab",         "cdeab",                0),
+    TEST ("abc",            "",           "abc",                  0),
+    TEST ("ab",             "c<U0>e",     "abc<U0>e",             0),
+
+    TEST ("<U0>@2ab",       "cdefghij",   "<U0>@2abcdefghij",     0),
+    TEST ("a<U0>@2b",       "cdefghij",   "a<U0>@2bcdefghij",     0),
+    TEST ("ab<U0>@2",       "cdefghij",   "ab<U0>@2cdefghij",     0),
+    TEST ("a<U0>b<U0>@2c",  "e<U0>",      "a<U0>b<U0>@2ce<U0>",   0),
+    TEST ("<U0>ab<U0>@2c",  "e<U0>",      "<U0>ab<U0>@2ce<U0>",   0),
+    TEST ("ab<U0>@2c<U0>",  "<U0>e",      "ab<U0>@2c<U0>@2e",     0),
+    TEST ("abcdefghij",     "abcdefghij", "abcdefghijabcdefghij", 0),
+
+    TEST ("",               "x@4096",     "x@4096",               0),
+    TEST ("x@4096",         "",           "x@4096",               0),
+    TEST ("x@4096",         "x@4096",     "x@8192",               0),
+
+    TEST ("x@10",           "x@118",      "x@128",                0),
+    TEST ("x@128",          "x@79",       "x@207",                0),
+    TEST ("x@207",          "x@127",      "x@334",                0),
+    TEST ("x@334",          "x@206",      "x@540",                0),
+    TEST ("x@540",          "x@333",      "x@873",                0),
+    TEST ("x@539",          "x@873",      "x@1412",               0),
+    TEST ("x@872",          "x@1412",     "x@2284",               0),
+    TEST ("x@1411",         "x@2284",     "x@3695",               0),
+    TEST ("x@1412",         "x@2284",     "x@3696",               0),
+
+    TEST ("",               0,            "",                     0),
+    TEST ("abc",            0,            "abcabc",               0),
+    TEST ("a<U0>@2bc",      0,            "a<U0>@2bca<U0>@2bc",   0),
+    TEST ("<U0>@2abc",      0,            "<U0>@2abc<U0>@2abc",   0),
+    TEST ("abc<U0>@2",      0,            "abc<U0>@2abc<U0>@2",   0),
 
-    TEST ("last",       "test",       "lasttest",             0)
+    TEST ("last",           "test",       "lasttest",             0)
 };
 
 /**************************************************************************/
@@ -204,68 +204,68 @@
         arg, sizeof arg - 1, res, sizeof res - 1, bthrow        \
     }
 
-    //    +-------------------------------------- controlled sequence
-    //    |            +------------------------- sequence to be appended
-    //    |            |            +------------ append() n argument
-    //    |            |            |  +--------- expected result sequence
-    //    |            |            |  |     +--- exception info
-    //    |            |            |  |     |      0 - no exception
-    //    |            |            |  |     |      1 - out_of_range
-    //    |            |            |  |     |      2 - length_error
-    //    |            |            |  |     |     -1 - exc. safety
-    //    |            |            |  |     |
-    //    |            |            |  |     +------------+
-    //    V            V            V  V                  V
-    TEST ("ab",        "c",         1, "abc",             0),
-
-    TEST ("",          "",          0,  "",               0),
-    TEST ("",          "abc",       1,  "a",              0),
-    TEST ("",          "\0",        1,  "\0",             0),
-
-    TEST ("\0",        "",          0,  "\0",             0),
-    TEST ("\0",        "a",         0,  "\0",             0),
-    TEST ("\0",        "a",         1,  "\0a",            0),
-    TEST ("\0",        "\0\0",      1,  "\0\0",           0),
-    TEST ("\0",        "\0\0",      2,  "\0\0\0",         0),
-
-    TEST ("cde",       "ab",        2,  "cdeab",          0),
-    TEST ("cde",       "ab",        1,  "cdea",           0),
-
-    TEST ("\0e\0",     "a\0b\0\0c", 0,  "\0e\0",          0),
-    TEST ("\0e\0",     "\0ab\0\0c", 3,  "\0e\0\0ab",      0),
-
-    TEST ("a\0b\0\0c", "\0e\0",     3,  "a\0b\0\0c\0e\0", 0),
-    TEST ("a\0b\0\0c", "\0\0e\0",   2,  "a\0b\0\0c\0\0",  0),
-    TEST ("\0ab\0\0c", "\0e\0",     1,  "\0ab\0\0c\0",    0),
-    TEST ("a\0bc\0\0", "\0e",       2,  "a\0bc\0\0\0e",   0),
-
-    TEST ("x@10",      "x@118",   118,   "x@128",         0),
-    TEST ("x@128",     "x@79",     79,   "x@207",         0),
-    TEST ("x@207",     "x@127",   127,   "x@334",         0),
-    TEST ("x@207",     "x@207",   127,   "x@334",         0),
-    TEST ("x@334",     "x@206",   206,   "x@540",         0),
-    TEST ("x@540",     "x@333",   333,   "x@873",         0),
-    TEST ("x@539",     "x@873",   873,   "x@1412",        0),
-    TEST ("x@873",     "x@540",   539,   "x@1412",        0),
-    TEST ("x@872",     "x@1412", 1412,   "x@2284",        0),
-    TEST ("x@1411",    "x@2284", 2284,   "x@3695",        0),
-    TEST ("x@1411",    "x@3695", 2284,   "x@3695",        0),
-    TEST ("x@1412",    "x@2284", 2284,   "x@3696",        0),
-
-    TEST ("",          0,           0,  "",               0),
-    TEST ("abc",       0,           0,  "abc",            0),
-    TEST ("abc",       0,           1,  "abca",           0),
-    TEST ("abc",       0,           2,  "abcab",          0),
-    TEST ("a\0bc",     0,           2,  "a\0bca\0",       0),
-    TEST ("\0abc\0\0", 0,           1,  "\0abc\0\0\0",    0),
-    TEST ("a\0bc\0\0", 0,           3,  "a\0bc\0\0a\0b",  0),
-    TEST ("a@4096",    0,        1111,  "a@5207",         0),
-    TEST ("b@4096",    0,        2222,  "b@6318",         0),
+    //    +------------------------------------------ controlled sequence
+    //    |                +------------------------- sequence to be appended
+    //    |                |            +------------ append() n argument
+    //    |                |            |  +--------- expected result sequence
+    //    |                |            |  |    +---- exception info
+    //    |                |            |  |    |       0 - no exception
+    //    |                |            |  |    |       1 - out_of_range
+    //    |                |            |  |    |       2 - length_error
+    //    |                |            |  |    |      -1 - avoid exc. safety
+    //    |                |            |  |    |
+    //    |                |            |  |    +------------+
+    //    V                V            V  V                 V
+    TEST ("ab",            "c",         1, "abc",            0),
+
+    TEST ("",              "",          0,  "",              0),
+    TEST ("",              "abc",       1,  "a",             0),
+    TEST ("",              "<U0>",      1,  "<U0>",          0),
+
+    TEST ("<U0>",          "",          0,  "<U0>",          0),
+    TEST ("<U0>",          "a",         0,  "<U0>",          0),
+    TEST ("<U0>",          "a",         1,  "<U0>a",         0),
+    TEST ("<U0>",          "<U0>@2",    1,  "<U0>@2",        0),
+    TEST ("<U0>",          "<U0>@2",    2,  "<U0>@3",        0),
+
+    TEST ("cde",           "ab",        2,  "cdeab",         0),
+    TEST ("cde",           "ab",        1,  "cdea",          0),
+
+    TEST ("<U0>e<U0>",     "a<U0>b<U0>@2c", 0,  "<U0>e<U0>",              0),
+    TEST ("<U0>e<U0>",     "<U0>ab<U0>@2c", 3,  "<U0>e<U0>@2ab",          0),
+
+    TEST ("a<U0>b<U0>@2c", "<U0>e<U0>",     3,  "a<U0>b<U0>@2c<U0>e<U0>", 0),
+    TEST ("a<U0>b<U0>@2c", "<U0>@2e<U0>",   2,  "a<U0>b<U0>@2c<U0>@2",    0),
+    TEST ("<U0>ab<U0>@2c", "<U0>e<U0>",     1,  "<U0>ab<U0>@2c<U0>",      0),
+    TEST ("a<U0>bc<U0>@2", "<U0>e",         2,  "a<U0>bc<U0>@3e",         0),
+
+    TEST ("x@10",          "x@118",   118,  "x@128",         0),
+    TEST ("x@128",         "x@79",     79,  "x@207",         0),
+    TEST ("x@207",         "x@127",   127,  "x@334",         0),
+    TEST ("x@207",         "x@207",   127,  "x@334",         0),
+    TEST ("x@334",         "x@206",   206,  "x@540",         0),
+    TEST ("x@540",         "x@333",   333,  "x@873",         0),
+    TEST ("x@539",         "x@873",   873,  "x@1412",        0),
+    TEST ("x@873",         "x@540",   539,  "x@1412",        0),
+    TEST ("x@872",         "x@1412", 1412,  "x@2284",        0),
+    TEST ("x@1411",        "x@2284", 2284,  "x@3695",        0),
+    TEST ("x@1411",        "x@3695", 2284,  "x@3695",        0),
+    TEST ("x@1412",        "x@2284", 2284,  "x@3696",        0),
+
+    TEST ("",              0,           0,  "",              0),
+    TEST ("abc",           0,           0,  "abc",           0),
+    TEST ("abc",           0,           1,  "abca",          0),
+    TEST ("abc",           0,           2,  "abcab",         0),
+    TEST ("a<U0>bc",       0,           2,  "a<U0>bca<U0>",         0),
+    TEST ("<U0>abc<U0>@2", 0,           1,  "<U0>abc<U0>@3",        0),
+    TEST ("a<U0>bc<U0>@2", 0,           3,  "a<U0>bc<U0>@2a<U0>b",  0),
+    TEST ("a@4096",        0,        1111,  "a@5207",        0),
+    TEST ("b@4096",        0,        2222,  "b@6318",        0),
 
-    TEST ("",          "x@4096", 4096,  "x@4096",         0),
-    TEST ("x@4096",    "",          0,  "x@4096",         0),
+    TEST ("",              "x@4096", 4096,  "x@4096",        0),
+    TEST ("x@4096",        "",          0,  "x@4096",        0),
 
-    TEST ("last",      "test",      4, "lasttest",        0)
+    TEST ("last",          "test",      4,  "lasttest",      0)
 };
 
 /**************************************************************************/
@@ -286,83 +286,83 @@
         arg, sizeof arg - 1, res, sizeof res - 1, bthrow        \
     }
 
-    //    +-------------------------------------- controlled sequence
-    //    |            +------------------------- sequence to be appended
-    //    |            |            +------------ append() pos argument
-    //    |            |            |  +--------- append() n argument
-    //    |            |            |  |  +------ expected result sequence
-    //    |            |            |  |  |  +--- exception info
-    //    |            |            |  |  |  |       0 - no exception
-    //    |            |            |  |  |  |       1 - out_of_range
-    //    |            |            |  |  |  |       2 - length_error
-    //    |            |            |  |  |  |      -1 - exc. safety
-    //    |            |            |  |  |  |
-    //    |            |            |  |  |  +----------------+
-    //    V            V            V  V  V                   V
-    TEST ("ab",        "c",         0, 1, "abc",              0),
-
-    TEST ("",          "",          0, 0,  "",                0),
-    TEST ("",          "abc",       1, 1,  "b",               0),
-    TEST ("",          "\0",        0, 1,  "\0",              0),
-
-    TEST ("\0",        "",          0, 0,  "\0",              0),
-
-    TEST ("abc",       "",          0, 0,  "abc",             0),
-
-    TEST ("\0",        "a",         0, 1,  "\0a",             0),
-    TEST ("\0",        "\0\0",      1, 1,  "\0\0",            0),
-    TEST ("\0",        "\0\0",      0, 2,  "\0\0\0",          0),
-    TEST ("\0",        "\0\0",      1, 5,  "\0\0",            0),
-
-    TEST ("cde",       "ab",        0, 2,  "cdeab",           0),
-    TEST ("cde",       "ab",        0, 1,  "cdea",            0),
-    TEST ("cde",       "ab",        1, 5,  "cdeb",            0),
-
-    TEST ("ab",        "c\0e",      0, 3,  "abc\0e",          0),
-    TEST ("ab",        "c\0e",      1, 2,  "ab\0e",           0),
-    TEST ("ab",        "c\0e",      0, 2,  "abc\0",           0),
-
-    TEST ("\0e\0",     "\0ab\0\0c", 0, 9,  "\0e\0\0ab\0\0c",  0),
-    TEST ("\0e\0",     "\0ab\0\0c", 0, 3,  "\0e\0\0ab",       0),
-    TEST ("a\0b\0\0c", "\0e\0",     0, 3,  "a\0b\0\0c\0e\0",  0),
-    TEST ("a\0b\0\0c", "\0\0e\0",   0, 2,  "a\0b\0\0c\0\0",   0),
-    TEST ("\0ab\0\0c", "\0e\0",     2, 1,  "\0ab\0\0c\0",     0),
-    TEST ("a\0bc\0\0", "\0e",       0, 2,  "a\0bc\0\0\0e",    0),
-
-    TEST ("",          0,           0, 0,  "",                0),
-    TEST ("abc",       0,           1, 0,  "abc",             0),
-    TEST ("abc",       0,           1, 1,  "abcb",            0),
-    TEST ("abc",       0,           0, 2,  "abcab",           0),
-    TEST ("a\0bc\0\0", 0,           4, 2,  "a\0bc\0\0\0\0",   0),
-    TEST ("a\0bc\0\0", 0,           1, 3,  "a\0bc\0\0\0bc",   0),
-    TEST ("a\0bc\0\0", 0,           3, 9,  "a\0bc\0\0c\0\0",  0),
-    TEST ("abcdef",    0,           1, 2,  "abcdefbc",        0),
-
-    TEST ("a@1000",    "b@1000",    0,  999, "a@1000b@999",   0),
-    TEST ("a@1000",    "b@1001",    0, 1000, "a@1000b@1000",  0),
-    TEST ("a@1000",    "b@1002",    0,  102, "a@1000b@102",   0),
-    TEST ("",          "x@4096",    0, 4096, "x@4096",        0),
-    TEST ("x@4096",    "",          0,    0, "x@4096",        0),
-    TEST ("x@4096",    "a@4096",  100,   10, "x@4096a@10",    0),
-
-    TEST ("x@10",      "x@118",     0,  118, "x@128",         0),
-    TEST ("x@128",     "x@129",    50,   79, "x@207",         0),
-    TEST ("x@207",     "x@127",     0,  127, "x@334",         0),
-    TEST ("x@207",     "x@207",    10,  127, "x@334",         0),
-    TEST ("x@334",     "x@208",     2,  206, "x@540",         0),
-    TEST ("x@540",     "x@336",     3,  333, "x@873",         0),
-    TEST ("x@539",     "x@873",     0,  873, "x@1412",        0),
-    TEST ("x@873",     "x@540",     1,  539, "x@1412",        0),
-    TEST ("x@872",     "x@1412",    0, 1412, "x@2284",        0),
-    TEST ("x@1411",    "x@2288",    4, 2284, "x@3695",        0),
-    TEST ("x@1411",    "x@3695",  128, 2284, "x@3695",        0),
-    TEST ("x@1412",    "x@2284",    0, 2284, "x@3696",        0),
-
-    TEST ("",          "\0",        2,    0, "",              1),
-    TEST ("",          "a",         2,    0, "",              1),
-    TEST ("",          "x@4096", 4106,    0, "",              1),
+    //    +------------------------------------------ controlled sequence
+    //    |                +------------------------- sequence to be appended
+    //    |                |            +------------ append() pos argument
+    //    |                |            |  +--------- append() n argument
+    //    |                |            |  |  +------ expected result sequence
+    //    |                |            |  |  |  +--- exception info
+    //    |                |            |  |  |  |       0 - no exception
+    //    |                |            |  |  |  |       1 - out_of_range
+    //    |                |            |  |  |  |       2 - length_error
+    //    |                |            |  |  |  |      -1 - exc. safety
+    //    |                |            |  |  |  |
+    //    |                |            |  |  |  +----------------+
+    //    V                V            V  V  V                   V
+    TEST ("ab",            "c",         0, 1, "abc",              0),
+
+    TEST ("",              "",          0, 0,  "",                0),
+    TEST ("",              "abc",       1, 1,  "b",               0),
+    TEST ("",              "<U0>",      0, 1,  "<U0>",            0),
+
+    TEST ("<U0>",          "",          0, 0,  "<U0>",            0),
+
+    TEST ("abc",           "",          0, 0,  "abc",             0),
+
+    TEST ("<U0>",          "a",         0, 1,  "<U0>a",           0),
+    TEST ("<U0>",          "<U0>@2",    1, 1,  "<U0>@2",          0),
+    TEST ("<U0>",          "<U0>@2",    0, 2,  "<U0>@3",          0),
+    TEST ("<U0>",          "<U0>@2",    1, 5,  "<U0>@2",          0),
+
+    TEST ("cde",           "ab",        0, 2,  "cdeab",           0),
+    TEST ("cde",           "ab",        0, 1,  "cdea",            0),
+    TEST ("cde",           "ab",        1, 5,  "cdeb",            0),
+
+    TEST ("ab",            "c<U0>e",    0, 3,  "abc<U0>e",        0),
+    TEST ("ab",            "c<U0>e",    1, 2,  "ab<U0>e",         0),
+    TEST ("ab",            "c<U0>e",    0, 2,  "abc<U0>",         0),
+
+    TEST ("<U0>e<U0>",     "<U0>ab<U0>@2c", 0, 9, "<U0>e<U0>@2ab<U0>@2c",   0),
+    TEST ("<U0>e<U0>",     "<U0>ab<U0>@2c", 0, 3, "<U0>e<U0>@2ab",          0),
+    TEST ("a<U0>b<U0>@2c", "<U0>e<U0>",     0, 3, "a<U0>b<U0>@2c<U0>e<U0>", 0),
+    TEST ("a<U0>b<U0>@2c", "<U0>@2e<U0>",   0, 2, "a<U0>b<U0>@2c<U0>@2",    0),
+    TEST ("<U0>ab<U0>@2c", "<U0>e<U0>",     2, 1, "<U0>ab<U0>@2c<U0>",      0),
+    TEST ("a<U0>bc<U0>@2", "<U0>e",         0, 2, "a<U0>bc<U0>@3e",         0),
+
+    TEST ("",              0,           0, 0,  "",                0),
+    TEST ("abc",           0,           1, 0,  "abc",             0),
+    TEST ("abc",           0,           1, 1,  "abcb",            0),
+    TEST ("abc",           0,           0, 2,  "abcab",           0),
+    TEST ("a<U0>bc<U0>@2", 0,           4, 2,  "a<U0>bc<U0>@3<U0>",     0),
+    TEST ("a<U0>bc<U0>@2", 0,           1, 3,  "a<U0>bc<U0>@3bc",       0),
+    TEST ("a<U0>bc<U0>@2", 0,           3, 9,  "a<U0>bc<U0>@2c<U0>@2",  0),
+    TEST ("abcdef",        0,           1, 2,  "abcdefbc",        0),
+
+    TEST ("a@1000",        "b@1000",    0,  999, "a@1000b@999",   0),
+    TEST ("a@1000",        "b@1001",    0, 1000, "a@1000b@1000",  0),
+    TEST ("a@1000",        "b@1002",    0,  102, "a@1000b@102",   0),
+    TEST ("",              "x@4096",    0, 4096, "x@4096",        0),
+    TEST ("x@4096",        "",          0,    0, "x@4096",        0),
+    TEST ("x@4096",        "a@4096",  100,   10, "x@4096a@10",    0),
+
+    TEST ("x@10",          "x@118",     0,  118, "x@128",         0),
+    TEST ("x@128",         "x@129",    50,   79, "x@207",         0),
+    TEST ("x@207",         "x@127",     0,  127, "x@334",         0),
+    TEST ("x@207",         "x@207",    10,  127, "x@334",         0),
+    TEST ("x@334",         "x@208",     2,  206, "x@540",         0),
+    TEST ("x@540",         "x@336",     3,  333, "x@873",         0),
+    TEST ("x@539",         "x@873",     0,  873, "x@1412",        0),
+    TEST ("x@873",         "x@540",     1,  539, "x@1412",        0),
+    TEST ("x@872",         "x@1412",    0, 1412, "x@2284",        0),
+    TEST ("x@1411",        "x@2288",    4, 2284, "x@3695",        0),
+    TEST ("x@1411",        "x@3695",  128, 2284, "x@3695",        0),
+    TEST ("x@1412",        "x@2284",    0, 2284, "x@3696",        0),
+
+    TEST ("",              "<U0>",      2,    0, "",              1),
+    TEST ("",              "a",         2,    0, "",              1),
+    TEST ("",              "x@4096", 4106,    0, "",              1),
 
-    TEST ("last",      "test",      0,    4, "lasttest",      0)
+    TEST ("last",          "test",      0,    4, "lasttest",      0)
 };
 
 /**************************************************************************/
@@ -379,58 +379,58 @@
         0, 0, res, sizeof res - 1, bthrow       \
     }
 
-    //    +-------------------------------------- controlled sequence
-    //    |            +------------------------- append() count argument
-    //    |            |   +--------------------- character to be appended
-    //    |            |   |   +----------------- expected result sequence
-    //    |            |   |   |       +--------- exception info
-    //    |            |   |   |       |             0 - no exception
-    //    |            |   |   |       |             1 - out_of_range
-    //    |            |   |   |       |             2 - length_error
-    //    |            |   |   |       |            -1 - exc. safety
-    //    |            |   |   |       |
-    //    |            |   |   |       +-----------+
-    //    V            V   V   V                   V
-    TEST ("ab",        1, 'c', "abc",              0),
-
-    TEST ("",          0, ' ',  "",                0),
-    TEST ("",          1, 'b',  "b",               0),
-    TEST ("",          3, 'b',  "bbb",             0),
-
-    TEST ("\0",        0, ' ',  "\0",              0),
-    TEST ("",          2, '\0', "\0\0",            0),
-
-    TEST ("\0",        1, 'a',  "\0a",             0),
-    TEST ("\0",        1, '\0', "\0\0",            0),
-    TEST ("\0",        2, '\0', "\0\0\0",          0),
-    TEST ("\0",        0, '\0', "\0",              0),
-
-    TEST ("cde",       1, 'a',  "cdea",            0),
-    TEST ("cde",       2, 'a',  "cdeaa",           0),
-    TEST ("cde",       3, 'a',  "cdeaaa",          0),
-
-    TEST ("ab",        2, '\0', "ab\0\0",          0),
-    TEST ("ab",        1, '\0', "ab\0",            0),
-    TEST ("ab",        2, '\0', "ab\0\0",          0),
-
-    TEST ("a\0b\0\0c", 2, '\0', "a\0b\0\0c\0\0",   0),
-    TEST ("a\0b\0\0c", 1, '\0', "a\0b\0\0c\0",     0),
-    TEST ("\0ab\0\0c", 3, '\0', "\0ab\0\0c\0\0\0", 0),
-    TEST ("a\0bc\0\0", 2, 'a',  "a\0bc\0\0aa",     0),
-
-    TEST ("",       4096, 'x', "x@4096",           0),
-    TEST ("x@4096",    0, 'x', "x@4096",           0),
-
-    TEST ("x@127",     1, 'x', "x@128",            0),
-    TEST ("x@200",     7, 'x', "x@207",            0),
-    TEST ("x@331",     3, 'x', "x@334",            0),
-    TEST ("x@539",     1, 'x', "x@540",            0),
-    TEST ("x@539",   873, 'x', "x@1412",           0),
-    TEST ("x@873",  1411, 'x', "x@2284",           0),
-    TEST ("x@3694",    1, 'x', "x@3695",           0),
-    TEST ("x@540",     1, 'x', "x@541",            0),
+    //    +------------------------------------------ controlled sequence
+    //    |                +------------------------- append() count argument
+    //    |                |   +--------------------- character to be appended
+    //    |                |   |   +----------------- expected result sequence
+    //    |                |   |   |       +--------- exception info
+    //    |                |   |   |       |             0 - no exception
+    //    |                |   |   |       |             1 - out_of_range
+    //    |                |   |   |       |             2 - length_error
+    //    |                |   |   |       |            -1 - exc. safety
+    //    |                |   |   |       |
+    //    |                |   |   |       +-----------+
+    //    V                V   V   V                   V
+    TEST ("ab",            1, 'c', "abc",              0),
+
+    TEST ("",              0, ' ',  "",                0),
+    TEST ("",              1, 'b',  "b",               0),
+    TEST ("",              3, 'b',  "bbb",             0),
+
+    TEST ("<U0>",          0, ' ',  "<U0>",            0),
+    TEST ("",              2, '\0', "<U0>@2",          0),
+
+    TEST ("<U0>",          1, 'a',  "<U0>a",           0),
+    TEST ("<U0>",          1, '\0', "<U0>@2",          0),
+    TEST ("<U0>",          2, '\0', "<U0>@3",          0),
+    TEST ("<U0>",          0, '\0', "<U0>",            0),
+
+    TEST ("cde",           1, 'a',  "cdea",            0),
+    TEST ("cde",           2, 'a',  "cdeaa",           0),
+    TEST ("cde",           3, 'a',  "cdeaaa",          0),
+
+    TEST ("ab",            2, '\0', "ab<U0>@2",        0),
+    TEST ("ab",            1, '\0', "ab<U0>",          0),
+    TEST ("ab",            2, '\0', "ab<U0>@2",        0),
+
+    TEST ("a<U0>b<U0>@2c", 2, '\0', "a<U0>b<U0>@2c<U0>@2", 0),
+    TEST ("a<U0>b<U0>@2c", 1, '\0', "a<U0>b<U0>@2c<U0>",   0),
+    TEST ("<U0>ab<U0>@2c", 3, '\0', "<U0>ab<U0>@2c<U0>@3", 0),
+    TEST ("a<U0>bc<U0>@2", 2, 'a',  "a<U0>bc<U0>@2aa",     0),
+
+    TEST ("",           4096, 'x', "x@4096",           0),
+    TEST ("x@4096",        0, 'x', "x@4096",           0),
+
+    TEST ("x@127",         1, 'x', "x@128",            0),
+    TEST ("x@200",         7, 'x', "x@207",            0),
+    TEST ("x@331",         3, 'x', "x@334",            0),
+    TEST ("x@539",         1, 'x', "x@540",            0),
+    TEST ("x@539",       873, 'x', "x@1412",           0),
+    TEST ("x@873",      1411, 'x', "x@2284",           0),
+    TEST ("x@3694",        1, 'x', "x@3695",           0),
+    TEST ("x@540",         1, 'x', "x@541",            0),
 
-    TEST ("last",      4, 't', "lasttttt",         0)
+    TEST ("last",          4, 't', "lasttttt",         0)
 };
 
 /**************************************************************************/
@@ -447,38 +447,38 @@
         0, 0, res, sizeof res - 1, bthrow       \
     }
 
-    //    +-------------------------------------- controlled sequence
-    //    |            +--------------------- character to be appended
-    //    |            |   +----------------- expected result sequence
-    //    |            |   |       +--------- exception info
-    //    |            |   |       |             0 - no exception
-    //    |            |   |       |            -1 - exc. safety
-    //    |            |   |       |
-    //    |            |   |       +------------+
-    //    V            V   V                    V
-    TEST ("ab",        'c', "abc",              0),
-
-    TEST ("",          'a', "a",                0),
-    TEST ("",          '\0', "\0",              0),
-    TEST ("\0",        'a', "\0a",              0),
-    TEST ("\0",        '\0', "\0\0",            0),
-
-    TEST ("a\0b\0\0c", '\0', "a\0b\0\0c\0",     0),
-    TEST ("a\0bc\0\0", 'a', "a\0bc\0\0a",       0),
-    TEST ("\0abc\0\0", 'a', "\0abc\0\0a",       0),
-
-    TEST ("x@4095",    'x', "x@4096",           0),
-
-    TEST ("x@127",     'x',  "x@128",           0),
-    TEST ("x@206",     'x',  "x@207",           0),
-    TEST ("x@333",     'x',  "x@334",           0),
-    TEST ("x@539",     'x',  "x@540",           0),
-    TEST ("x@1411",    'x',  "x@1412",          0),
-    TEST ("x@2283",    'x',  "x@2284",          0),
-    TEST ("x@3694",    'x',  "x@3695",          0),
-    TEST ("x@540",     'x',  "x@541",           0),
+    //    +---------------------------------------- controlled sequence
+    //    |                 +---------------------- character to be appended
+    //    |                 |    +----------------- expected result sequence
+    //    |                 |    |       +--------- exception info
+    //    |                 |    |       |             0 - no exception
+    //    |                 |    |       |            -1 - exc. safety
+    //    |                 |    |       |
+    //    |                 |    |       +------------+
+    //    V                 V    V                    V
+    TEST ("ab",            'c',  "abc",               0),
+
+    TEST ("",              'a',  "a",                 0),
+    TEST ("",              '\0', "<U0>",              0),
+    TEST ("<U0>",          'a',  "<U0>a",             0),
+    TEST ("<U0>",          '\0', "<U0>@2",            0),
+
+    TEST ("a<U0>b<U0>@2c", '\0', "a<U0>b<U0>@2c<U0>", 0),
+    TEST ("a<U0>bc<U0>@2", 'a',  "a<U0>bc<U0>@2a",    0),
+    TEST ("<U0>abc<U0>@2", 'a',  "<U0>abc<U0>@2a",    0),
+
+    TEST ("x@4095",        'x',  "x@4096",            0),
+
+    TEST ("x@127",         'x',  "x@128",             0),
+    TEST ("x@206",         'x',  "x@207",             0),
+    TEST ("x@333",         'x',  "x@334",             0),
+    TEST ("x@539",         'x',  "x@540",             0),
+    TEST ("x@1411",        'x',  "x@1412",            0),
+    TEST ("x@2283",        'x',  "x@2284",            0),
+    TEST ("x@3694",        'x',  "x@3695",            0),
+    TEST ("x@540",         'x',  "x@541",             0),
 
-    TEST ("last",      't', "lastt",            0)
+    TEST ("last",          't',  "lastt",             0)
 };
 
 /**************************************************************************/
@@ -707,7 +707,7 @@
                 // (and only then), also verify that the modified
                 // string matches the expected result
                 const std::size_t match =
-                    rw_match (tcase.res, str.c_str (), tcase.nres);
+                    rw_match (tcase.res, str.c_str (), str.size ());
 
                 rw_assert (match == tdata.reslen_, 0, tcase.line,
                            "line %d. %{$FUNCALL} expected %{/*.*Gs}, "