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 22:38:53 UTC

svn commit: r387628 - in /incubator/stdcxx/trunk/tests: include/rw_char.h self/0.char.cpp src/char.cpp

Author: sebor
Date: Tue Mar 21 13:38:52 2006
New Revision: 387628

URL: http://svn.apache.org/viewcvs?rev=387628&view=rev
Log:
2006-03-21  Martin Sebor  <se...@roguewave.com>

	* rw_char.h (rw_match): Declared and documented new helpers.
	* src/char.cpp (rw_match): Implemented new helpers.
	* test/char.cpp (test_rw_match): Exercised new helpers.

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=387628&r1=387627&r2=387628&view=diff
==============================================================================
--- incubator/stdcxx/trunk/tests/include/rw_char.h (original)
+++ incubator/stdcxx/trunk/tests/include/rw_char.h Tue Mar 21 13:38:52 2006
@@ -281,6 +281,17 @@
                  const char*   /* src */,
                  _RWSTD_SIZE_T /* len */ = _RWSTD_SIZE_MAX);
 
+// rw_match() compares up to len successive elements of s1 and s2 for
+// equality until it finds a pair that do not compare equal or until
+// len comparisons has been made
+// if (len == SIZE_MAX) is true elements are compared until the first
+// mismatch is found or until the NUL character is encountered
+// returns the number of matching elements
+_TEST_EXPORT
+_RWSTD_SIZE_T rw_match (const char*   /* s1  */,
+                        const char*   /* s2  */,
+                        _RWSTD_SIZE_T /* len */ = _RWSTD_SIZE_MAX);
+
 #ifndef _RWSTD_WCHAR_T
 
 _TEST_EXPORT
@@ -289,6 +300,10 @@
 _TEST_EXPORT
 char* rw_narrow (char*, const wchar_t*, _RWSTD_SIZE_T = _RWSTD_SIZE_MAX);
 
+_TEST_EXPORT
+_RWSTD_SIZE_T rw_match (const char*, const wchar_t*,
+                        _RWSTD_SIZE_T = _RWSTD_SIZE_MAX);
+
 #endif   // _RWSTD_WCHAR_T
 
 _TEST_EXPORT
@@ -296,5 +311,9 @@
 
 _TEST_EXPORT
 char* rw_narrow (char*, const UserChar*, _RWSTD_SIZE_T = _RWSTD_SIZE_MAX);
+
+_TEST_EXPORT
+_RWSTD_SIZE_T rw_match (const 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=387628&r1=387627&r2=387628&view=diff
==============================================================================
--- incubator/stdcxx/trunk/tests/self/0.char.cpp (original)
+++ incubator/stdcxx/trunk/tests/self/0.char.cpp Tue Mar 21 13:38:52 2006
@@ -375,7 +375,7 @@
 /***********************************************************************/
 
 static void
-test_widen ()
+test_rw_widen ()
 {
     //////////////////////////////////////////////////////////////////
     rw_info (0, 0, 0, "rw_widen(char*, const char*, size_t)");
@@ -409,13 +409,12 @@
                "rw_widen(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_widen(wchar_t*, const char*, size_t)");
 
+#ifndef _RWSTD_NO_WCHAR_T
+
     static const wchar_t wsrc [] = L"abcdefgh";
     static const wchar_t wnull [nsrc + 1] = L"";
     wchar_t              wdst [nsrc + 1];
@@ -447,6 +446,10 @@
                0, sizeof wdst, int (sizeof wdst / sizeof *wdst), wnull,
                int (sizeof wdst / sizeof *wdst), wdst);
 
+#else   // if defined (_RWSTD_NO_WCHAR_T)
+
+    rw_note (0, 0, 0, "_RWSTD_NO_WCHAR_T #defined, wchar_t test disabled");
+
 #endif   // _RWSTD_NO_WCHAR_T
 
     //////////////////////////////////////////////////////////////////
@@ -488,7 +491,7 @@
 /***********************************************************************/
 
 static void
-test_narrow ()
+test_rw_narrow ()
 {
     //////////////////////////////////////////////////////////////////
     rw_info (0, 0, 0, "rw_narrow(char*, const char*, size_t)");
@@ -523,12 +526,11 @@
                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)");
 
+#ifndef _RWSTD_NO_WCHAR_T
+
     static const wchar_t wsrc [] = L"abcdefgh";
 
     for (size_t i = 0; i != nsrc + 1; ++i) {
@@ -557,6 +559,10 @@
                0, sizeof cdst, int (sizeof null), null,
                int (sizeof cdst), cdst);
 
+#else   // if defined (_RWSTD_NO_WCHAR_T)
+
+    rw_note (0, 0, 0, "_RWSTD_NO_WCHAR_T #defined, wchar_t test disabled");
+
 #endif   // _RWSTD_NO_WCHAR_T
 
     //////////////////////////////////////////////////////////////////
@@ -595,12 +601,193 @@
 
 /***********************************************************************/
 
+static size_t
+length (const char *s)
+{
+    return strlen (s);
+}
+
+
+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)
+{
+    static UserChar usrbuf [32];
+    memset (usrbuf, 0, sizeof usrbuf);
+
+    if (s) {
+        for (size_t i = 0; i != len; ++i) {
+
+            typedef unsigned char UChar;
+
+            usrbuf [i].f = 0;
+            usrbuf [i].c = UChar (s [i]);
+        }
+        return usrbuf;
+    }
+
+    return 0;
+}
+
+
+static void
+test_rw_match ()
+{
+    //////////////////////////////////////////////////////////////////
+    rw_info (0, 0, 0, "rw_match(char*, const char*, size_t)");
+
+    const size_t size_max = _RWSTD_SIZE_MAX;
+    size_t result;
+
+#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",             \
+             int (size_max == len ? length ((const char*)s1) : len), s1,  \
+             int (size_max == len ? length ((const char*)s2) : len), s2,  \
+             len, expect, result)
+
+    TEST (0,      0,        -1, 0);
+    TEST ("",     0,        -1, 0);
+    TEST (0,      "",       -1, 0);
+    TEST ("",     "",       -1, 0);
+
+    // 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",      -1, 0);
+    TEST ("a",    "",       -1, 0);
+    TEST ("a",    "a",      -1, 1);
+
+    TEST ("a\0bc", "a\0bd", -1, 1);
+    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);
+
+    //////////////////////////////////////////////////////////////////
+    rw_info (0, 0, 0, "rw_match(char*, const wchar_t*, size_t)");
+
+#ifndef _RWSTD_NO_WCHAR_T
+
+#undef TEST
+#define TEST(s1, s2, len, expect)                                            \
+  result = rw_match ((const char*)s1, (const wchar_t*)s2, size_t (len));     \
+  rw_assert (expect == result,                                               \
+             0, __LINE__,                                                    \
+             "rw_match(%{#*s}, L%{#*ls}, %zu) == %zu, got %zu",              \
+             int (size_max == len ? length ((const char*)s1) : len), s1,     \
+             int (size_max == len ? length ((const wchar_t*)s2) : len), 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 ("a\0bc", L"a\0bd", -1, 1);
+    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);
+
+#else   // if defined (_RWSTD_NO_WCHAR_T)
+
+    rw_note (0, 0, 0, "_RWSTD_NO_WCHAR_T #defined, wchar_t test disabled");
+
+#endif   // _RWSTD_NO_WCHAR_T
+
+    //////////////////////////////////////////////////////////////////
+    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",                \
+             int (size_max == len ? length ((const char*)s1) : len), s1,     \
+             int (size_max == len ? length ((const char*)s2) : len), 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 ("a\0bc", "a\0bd", -1, 1);
+    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);
+}
+
+/***********************************************************************/
+
 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 no_rw_match;
 
 
 static int
@@ -632,19 +819,16 @@
         }
     }
 
-    if (no_rw_widen) {
-        rw_note (0, 0, 0, "rw_widen() tests disabled");
-    }
-    else {
-        test_widen ();
-    }
-
-    if (no_rw_narrow) {
-        rw_note (0, 0, 0, "rw_narrow() tests disabled");
-    }
-    else {
-        test_narrow ();
-    }
+#undef TEST
+#define TEST(fun)                                               \
+        if (no_ ## fun)                                         \
+            rw_note (0, 0, 0, "%s() tests disabled", #fun);     \
+        else                                                    \
+            test_ ## fun ()
+
+    TEST (rw_widen);
+    TEST (rw_narrow);
+    TEST (rw_match);
 
     return 0;
 }
@@ -662,12 +846,14 @@
                     "|-no-UserTraits<wchar_t># "
                     "|-no-UserTraits<UserChar># "
                     "|-no-rw_widen# "
-                    "|-no-rw_narrow#",
+                    "|-no-rw_narrow# "
+                    "|-no-rw_macth#",
                     &no_user_traits,
                     &no_user_traits_char,
                     &no_user_traits_wchar_t,
                     &no_user_traits_user_char,
                     &no_rw_widen,
                     &no_rw_narrow,
+                    &no_rw_match,
                     0);
 }

Modified: incubator/stdcxx/trunk/tests/src/char.cpp
URL: http://svn.apache.org/viewcvs/incubator/stdcxx/trunk/tests/src/char.cpp?rev=387628&r1=387627&r2=387628&view=diff
==============================================================================
--- incubator/stdcxx/trunk/tests/src/char.cpp (original)
+++ incubator/stdcxx/trunk/tests/src/char.cpp Tue Mar 21 13:38:52 2006
@@ -255,12 +255,36 @@
 
 
 _TEST_EXPORT
-char* rw_narrow (char *dst, const char *src, size_t len /* = SIZE_MAX */)
+char*
+rw_narrow (char *dst, const char *src, size_t len /* = SIZE_MAX */)
 {
     return rw_widen (dst, src, len);
 }
 
 
+_TEST_EXPORT
+size_t
+rw_match (const char *s1, const char *s2, size_t len /* = SIZE_MAX */)
+{
+    if (0 == s1) {
+        // return the length of s2 if non-null
+        return s2 ? strlen (s2) : 0;
+    }
+
+    if (0 == s2)
+        return strlen (s1);
+
+    size_t n = 0;
+
+    for ( ; n != len && s1 [n] == s2 [n]; ++n) {
+        if (_RWSTD_SIZE_MAX == len && '\0' == s1 [n])
+            break;
+    }
+
+    return n;
+}
+
+
 #ifndef _RWSTD_WCHAR_T
 
 _TEST_EXPORT
@@ -337,6 +361,36 @@
     return dst;
 }
 
+
+_TEST_EXPORT
+size_t
+rw_match (const char *s1, const wchar_t *s2, size_t len /* = SIZE_MAX */)
+{
+    if (0 == s1) {
+        if (s2) {
+            // return the length of s2
+            for (len = 0; s2 [len]; ++len);
+            return len;
+        }
+
+        return 0;
+    }
+
+    if (0 == s2)
+        return strlen (s1);
+
+    typedef unsigned char UChar;
+
+    size_t n = 0;
+
+    for ( ; n != len && UChar (s1 [n]) == unsigned (s2 [n]); ++n) {
+        if (_RWSTD_SIZE_MAX == len && '\0' == s1 [n])
+            break;
+    }
+
+    return n;
+}
+
 #endif   // _RWSTD_WCHAR_T
 
 
@@ -413,4 +467,34 @@
     }
 
     return dst;
+}
+
+
+_TEST_EXPORT
+size_t
+rw_match (const char *s1, const UserChar *s2, size_t len /* = SIZE_MAX */)
+{
+    if (0 == s1) {
+        if (s2) {
+            // return the length of s2
+            for (len = 0; s2 [len].f || s2 [len].c; ++len);
+            return len;
+        }
+
+        return 0;
+    }
+
+    if (0 == s2)
+        return strlen (s1);
+
+    typedef unsigned char UChar;
+
+    size_t n = 0;
+
+    for ( ; n != len && UChar (s1 [n]) == s2 [n].c; ++n) {
+        if (_RWSTD_SIZE_MAX == len && '\0' == s1 [n])
+            break;
+    }
+
+    return n;
 }