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/03/21 02:46:43 UTC
svn commit: r387379 - in /incubator/stdcxx/trunk/tests: include/rw_char.h
self/0.char.cpp src/char.cpp
Author: sebor
Date: Mon Mar 20 17:46:41 2006
New Revision: 387379
URL: http://svn.apache.org/viewcvs?rev=387379&view=rev
Log:
2006-03-20 Martin Sebor <se...@roguewave.com>
* rw_char.h (rw_narrow): Declared new testsuite helper(s).
* char.cpp (rw_narrow): Implemented new testsuite helper(s).
* 0.char.cpp (test_narrow): Exercised new testsuite helper(s).
Modified:
incubator/stdcxx/trunk/tests/include/rw_char.h
incubator/stdcxx/trunk/tests/self/0.char.cpp
incubator/stdcxx/trunk/tests/src/char.cpp
Modified: incubator/stdcxx/trunk/tests/include/rw_char.h
URL: http://svn.apache.org/viewcvs/incubator/stdcxx/trunk/tests/include/rw_char.h?rev=387379&r1=387378&r2=387379&view=diff
==============================================================================
--- incubator/stdcxx/trunk/tests/include/rw_char.h (original)
+++ incubator/stdcxx/trunk/tests/include/rw_char.h Mon Mar 20 17:46:41 2006
@@ -260,9 +260,9 @@
};
-// widens the string src into the buffer dst; when (dst != 0) the last
-// character in the buffer is guaranteed to be NUL, regardless of the
-// value of str [len]
+// rw_widen() widens successive elements of src into the buffer dst
+// when (dst != 0) the last character in the buffer is guaranteed to be NUL,
+// regardless of the value of str [len]
// when (len == SIZE_MAX && src != 0), computes len as if by evaluating
// len = strlen(src)
// when (src == 0 && len < SIZE_MAX), initializes the first len elements
@@ -274,14 +274,27 @@
const char* /* src */,
_RWSTD_SIZE_T /* len */ = _RWSTD_SIZE_MAX);
+// rw_narrow() narrows successive elements of src into the buffer dst
+// (see rw_widen() for details)
+_TEST_EXPORT
+char* rw_narrow (char* /* dst */,
+ const char* /* src */,
+ _RWSTD_SIZE_T /* len */ = _RWSTD_SIZE_MAX);
+
#ifndef _RWSTD_WCHAR_T
_TEST_EXPORT
wchar_t* rw_widen (wchar_t*, const char*, _RWSTD_SIZE_T = _RWSTD_SIZE_MAX);
+_TEST_EXPORT
+char* rw_narrow (char*, const wchar_t*, _RWSTD_SIZE_T = _RWSTD_SIZE_MAX);
+
#endif // _RWSTD_WCHAR_T
_TEST_EXPORT
UserChar* rw_widen (UserChar*, const char*, _RWSTD_SIZE_T = _RWSTD_SIZE_MAX);
+
+_TEST_EXPORT
+char* rw_narrow (char*, const UserChar*, _RWSTD_SIZE_T = _RWSTD_SIZE_MAX);
#endif // RW_CHAR_INCLUDED
Modified: incubator/stdcxx/trunk/tests/self/0.char.cpp
URL: http://svn.apache.org/viewcvs/incubator/stdcxx/trunk/tests/self/0.char.cpp?rev=387379&r1=387378&r2=387379&view=diff
==============================================================================
--- incubator/stdcxx/trunk/tests/self/0.char.cpp (original)
+++ incubator/stdcxx/trunk/tests/self/0.char.cpp Mon Mar 20 17:46:41 2006
@@ -467,7 +467,7 @@
rw_widen (udst, src, i) : rw_widen (udst, src);
rw_assert (udst == ret, 0, __LINE__,
- "rw_widen(wchar_t*, %{#s}%{?}, %zu%{;})",
+ "rw_widen(UserChar*, %{#s}%{?}, %zu%{;})",
src, i < nsrc, i);
rw_assert ( 0 == memcmp (udst, usrc, i * sizeof *udst)
@@ -487,11 +487,120 @@
/***********************************************************************/
+static void
+test_narrow ()
+{
+ //////////////////////////////////////////////////////////////////
+ rw_info (0, 0, 0, "rw_narrow(char*, const char*, size_t)");
+
+ static const char src [] = "abcdefgh";
+ static const size_t nsrc = sizeof src;
+ static const char null [nsrc + 1] = "";
+ char cdst [nsrc + 1];
+
+ for (size_t i = 0; i != nsrc + 1; ++i) {
+
+ memset (cdst, 0, sizeof cdst);
+
+ const char* const ret = i < nsrc ?
+ rw_narrow (cdst, src, i) : rw_narrow (cdst, src);
+
+ rw_assert (cdst == ret, 0, __LINE__,
+ "rw_narrow(char*, %{#s}%{?}, %zu%{;})",
+ src, i < nsrc);
+
+ rw_assert (0 == memcmp (cdst, src, i) && '\0' == cdst [i],
+ 0, __LINE__,
+ "rw_narrow(char*, %{#s}%{?}, %zu%{;}) == %{#*s}, got %{#*s}",
+ src, i < nsrc, i, int (i), src, int (i + 1), cdst);
+ }
+
+ memset (cdst, '@', sizeof cdst);
+ rw_narrow (cdst, (const char*)0, sizeof cdst);
+
+ rw_assert (0 == memcmp (cdst, null, sizeof cdst), 0, __LINE__,
+ "rw_narrow(char*, %{#s}, %zu) == %{#*s}, got %{#*s}",
+ 0, sizeof cdst, int (sizeof cdst), null,
+ int (sizeof cdst), cdst);
+
+
+#ifndef _RWSTD_NO_WCHAR_T
+
+ //////////////////////////////////////////////////////////////////
+ rw_info (0, 0, 0, "rw_narrow(wchar_t*, const wchar_t*, size_t)");
+
+ static const wchar_t wsrc [] = L"abcdefgh";
+
+ for (size_t i = 0; i != nsrc + 1; ++i) {
+
+ memset (cdst, 0, sizeof cdst);
+
+ const char* const ret = i < nsrc ?
+ rw_narrow (cdst, wsrc, i) : rw_narrow (cdst, wsrc);
+
+ rw_assert (cdst == ret, 0, __LINE__,
+ "rw_narrow(char*, %{#s}%{?}, %zu%{;})",
+ src, i < nsrc, i);
+
+ rw_assert (0 == memcmp (cdst, src, i) && '\0' == cdst [i],
+ 0, __LINE__,
+ "rw_narrow(char*, L%{#*ls}%{?}, %zu%{;}) == %{#*s}, "
+ "got %{#*s}",
+ src, i < nsrc, i, int (i), wsrc, int (i + 1), cdst);
+ }
+
+ memset (cdst, '@', sizeof cdst);
+ rw_narrow (cdst, (const wchar_t*)0, sizeof cdst);
+
+ rw_assert (0 == memcmp (cdst, null, nsrc + 1), 0, __LINE__,
+ "rw_narrow(char*, %{#s}, %zu) == %{#*s}, got %{#*s}",
+ 0, sizeof cdst, int (sizeof null), null,
+ int (sizeof cdst), cdst);
+
+#endif // _RWSTD_NO_WCHAR_T
+
+ //////////////////////////////////////////////////////////////////
+ rw_info (0, 0, 0, "rw_narrow(char*, const UserChar*, size_t)");
+
+ static const UserChar usrc [] = {
+ { 0, 'a' }, { 0, 'b' }, { 0, 'c' }, { 0, 'd' },
+ { 0, 'e' }, { 0, 'f' }, { 0, 'g' }, { 0, 'h' },
+ { 0, '\0' }
+ };
+
+ for (size_t i = 0; i != nsrc + 1; ++i) {
+
+ memset (cdst, 0, sizeof cdst);
+
+ const char* const ret = i < nsrc ?
+ rw_narrow (cdst, usrc, i) : rw_narrow (cdst, usrc);
+
+ rw_assert (cdst == ret, 0, __LINE__,
+ "rw_narrow(char*, %{#s}%{?}, %zu%{;})",
+ src, i < nsrc, i);
+
+ rw_assert (0 == memcmp (cdst, src, i) && 0 == cdst [i],
+ 0, __LINE__,
+ "rw_narrow(char*, %{#s}%{?}, %zu%{;})",
+ src, i < nsrc, i);
+ }
+
+ memset (cdst, '@', sizeof cdst);
+ rw_narrow (cdst, (const UserChar*)0, sizeof cdst);
+
+ rw_assert (0 == memcmp (cdst, null, nsrc + 1), 0, __LINE__,
+ "rw_narrow(char*, %{#s}, %zu)",
+ 0, sizeof cdst);
+}
+
+/***********************************************************************/
+
static int no_user_traits;
static int no_user_traits_char;
static int no_user_traits_wchar_t;
static int no_user_traits_user_char;
static int no_rw_widen;
+static int no_rw_narrow;
static int
@@ -530,6 +639,13 @@
test_widen ();
}
+ if (no_rw_narrow) {
+ rw_note (0, 0, 0, "rw_narrow() tests disabled");
+ }
+ else {
+ test_narrow ();
+ }
+
return 0;
}
@@ -545,10 +661,13 @@
"|-no-UserTraits<char># "
"|-no-UserTraits<wchar_t># "
"|-no-UserTraits<UserChar># "
- "|-no-rw_widen#",
+ "|-no-rw_widen# "
+ "|-no-rw_narrow#",
&no_user_traits,
&no_user_traits_char,
&no_user_traits_wchar_t,
&no_user_traits_user_char,
- &no_rw_widen);
+ &no_rw_widen,
+ &no_rw_narrow,
+ 0);
}
Modified: incubator/stdcxx/trunk/tests/src/char.cpp
URL: http://svn.apache.org/viewcvs/incubator/stdcxx/trunk/tests/src/char.cpp?rev=387379&r1=387378&r2=387379&view=diff
==============================================================================
--- incubator/stdcxx/trunk/tests/src/char.cpp (original)
+++ incubator/stdcxx/trunk/tests/src/char.cpp Mon Mar 20 17:46:41 2006
@@ -229,7 +229,7 @@
_TEST_EXPORT
char*
-rw_widen (char *dst, const char *src, size_t len)
+rw_widen (char *dst, const char *src, size_t len /* = SIZE_MAX */)
{
// compute the length of src if not specified
if (_RWSTD_SIZE_MAX == len)
@@ -254,11 +254,18 @@
}
+_TEST_EXPORT
+char* rw_narrow (char *dst, const char *src, size_t len /* = SIZE_MAX */)
+{
+ return rw_widen (dst, src, len);
+}
+
+
#ifndef _RWSTD_WCHAR_T
_TEST_EXPORT
wchar_t*
-rw_widen (wchar_t *dst, const char *src, size_t len)
+rw_widen (wchar_t *dst, const char *src, size_t len /* = SIZE_MAX */)
{
// compute the length of src if not specified
if (_RWSTD_SIZE_MAX == len)
@@ -290,12 +297,52 @@
return dst;
}
+
+_TEST_EXPORT
+char*
+rw_narrow (char *dst, const wchar_t *src, size_t len /* = SIZE_MAX */)
+{
+ // compute the length of src if not specified
+ if (_RWSTD_SIZE_MAX == len) {
+ if (src) {
+ for (len = 0; src [len]; ++len);
+ }
+ else
+ len = 0;
+ }
+
+ // if len is non-zero dst must be non-0 as well
+ RW_ASSERT (0 == len || 0 != dst);
+
+ if (dst) {
+ if (src) {
+ // narrow src into dst one element at a time
+ for (size_t i = 0; ; ++i) {
+ typedef unsigned char UChar;
+
+ if (i == len) {
+ dst [i] = '\0';
+ break;
+ }
+
+ dst [i] = char (UChar (src [i]));
+ }
+ }
+ else {
+ // set dst to all NUL
+ memset (dst, 0, len);
+ }
+ }
+
+ return dst;
+}
+
#endif // _RWSTD_WCHAR_T
_TEST_EXPORT
UserChar*
-rw_widen (UserChar *dst, const char *src, size_t len)
+rw_widen (UserChar *dst, const char *src, size_t len /* = SIZE_MAX */)
{
// compute the length of src if not specified
if (_RWSTD_SIZE_MAX == len)
@@ -322,6 +369,46 @@
else {
// set dst to all NUL
memset (dst, 0, len * sizeof *dst);
+ }
+ }
+
+ return dst;
+}
+
+
+_TEST_EXPORT
+char*
+rw_narrow (char *dst, const UserChar *src, size_t len /* = SIZE_MAX */)
+{
+ // compute the length of src if not specified
+ if (_RWSTD_SIZE_MAX == len) {
+ if (src) {
+ for (len = 0; src [len].f || src [len].c; ++len);
+ }
+ else
+ len = 0;
+ }
+
+ // if len is non-zero dst must be non-0 as well
+ RW_ASSERT (0 == len || 0 != dst);
+
+ if (dst) {
+ if (src) {
+ // narrow src into dst one element at a time
+ for (size_t i = 0; ; ++i) {
+ typedef unsigned char UChar;
+
+ if (i == len) {
+ dst [i] = '\0';
+ break;
+ }
+
+ dst [i] = char (src [i].c);
+ }
+ }
+ else {
+ // set dst to all NUL
+ memset (dst, 0, len);
}
}