Add more testing to memcheck/tests/unit_libcbase.c.
Remove VG_(strcmp_ws) and VG_(strncmp_ws); they're no longer needed by CLO
handling, and they're not much use elsewhere.
git-svn-id: svn://svn.valgrind.org/valgrind/trunk@9270 a5019735-40e9-0310-863c-91ae7b9d1cf9
diff --git a/coregrind/m_libcbase.c b/coregrind/m_libcbase.c
index abce99a..e77bbf1 100644
--- a/coregrind/m_libcbase.c
+++ b/coregrind/m_libcbase.c
@@ -247,25 +247,6 @@
}
}
-static Bool isterm ( Char c )
-{
- return ( VG_(isspace)(c) || 0 == c );
-}
-
-Int VG_(strcmp_ws) ( const Char* s1, const Char* s2 )
-{
- while (True) {
- if (isterm(*s1) && isterm(*s2)) return 0;
- if (isterm(*s1)) return -1;
- if (isterm(*s2)) return 1;
-
- if (*(UChar*)s1 < *(UChar*)s2) return -1;
- if (*(UChar*)s1 > *(UChar*)s2) return 1;
-
- s1++; s2++;
- }
-}
-
Int VG_(strncmp) ( const Char* s1, const Char* s2, SizeT nmax )
{
SizeT n = 0;
@@ -282,22 +263,6 @@
}
}
-Int VG_(strncmp_ws) ( const Char* s1, const Char* s2, SizeT nmax )
-{
- Int n = 0;
- while (True) {
- if (n >= nmax) return 0;
- if (isterm(*s1) && isterm(*s2)) return 0;
- if (isterm(*s1)) return -1;
- if (isterm(*s2)) return 1;
-
- if (*(UChar*)s1 < *(UChar*)s2) return -1;
- if (*(UChar*)s1 > *(UChar*)s2) return 1;
-
- s1++; s2++; n++;
- }
-}
-
Char* VG_(strstr) ( const Char* haystack, Char* needle )
{
SizeT n;
diff --git a/include/pub_tool_libcbase.h b/include/pub_tool_libcbase.h
index 96eae4c..49342fe 100644
--- a/include/pub_tool_libcbase.h
+++ b/include/pub_tool_libcbase.h
@@ -93,10 +93,6 @@
extern SizeT VG_(strspn) ( const Char* s, const Char* accept );
extern SizeT VG_(strcspn) ( const Char* s, const char* reject );
-/* Like strcmp() and strncmp(), but stop comparing at any whitespace. */
-extern Int VG_(strcmp_ws) ( const Char* s1, const Char* s2 );
-extern Int VG_(strncmp_ws) ( const Char* s1, const Char* s2, SizeT nmax );
-
/* Like strncpy(), but if 'src' is longer than 'ndest' inserts a '\0' as the
last character. */
extern void VG_(strncpy_safely) ( Char* dest, const Char* src, SizeT ndest );
@@ -139,7 +135,7 @@
Int (*compar)(void*, void*) );
/* Returns the base-2 logarithm of x. Returns -1 if x is not a power
- of two. */
+ of two. Nb: VG_(log2)(1) == 0. */
extern Int VG_(log2) ( UInt x );
// A pseudo-random number generator returning a random UInt. If pSeed
diff --git a/memcheck/tests/unit_libcbase.c b/memcheck/tests/unit_libcbase.c
index 7ceff77..681fb15 100644
--- a/memcheck/tests/unit_libcbase.c
+++ b/memcheck/tests/unit_libcbase.c
@@ -4,19 +4,265 @@
#include <stdio.h>
#include <stdlib.h>
-#include "coregrind/m_libcbase.c"
+#include "pub_tool_vki.h"
+#include "m_libcbase.c"
#define CHECK(x) \
if (!x) { fprintf(stderr, "failure: %s:%d\n", __FILE__, __LINE__); }
-void test_isXYZ(void)
+void test_VG_STREQ(void)
+{
+ CHECK( ! VG_STREQ(NULL, NULL) ); // Nb: strcmp() considers these equal
+ CHECK( ! VG_STREQ(NULL, "ab") ); // Nb: strcmp() seg faults on this
+ CHECK( ! VG_STREQ("ab", NULL) ); // Nb: strcmp() seg faults on this
+ CHECK( ! VG_STREQ("", "a") );
+ CHECK( ! VG_STREQ("a", "") );
+ CHECK( ! VG_STREQ("abc", "abcd"));
+ CHECK( ! VG_STREQ("abcd", "abc") );
+ CHECK( ! VG_STREQ("Abcd", "abcd"));
+ CHECK( ! VG_STREQ("abcd", "Abcd"));
+
+ CHECK( VG_STREQ("", "") );
+ CHECK( VG_STREQ("a", "a") );
+ CHECK( VG_STREQ("abcd", "abcd") );
+}
+
+void test_VG_STREQN(void)
+{
+ CHECK( ! VG_STREQN(0, NULL, NULL) );
+ CHECK( ! VG_STREQN(5, NULL, NULL) );
+ CHECK( ! VG_STREQN(0, NULL, "ab") );
+ CHECK( ! VG_STREQN(5, NULL, "ab") );
+ CHECK( ! VG_STREQN(0, "ab", NULL) );
+ CHECK( ! VG_STREQN(1, "", "a") );
+ CHECK( ! VG_STREQN(1, "a", "") );
+ CHECK( ! VG_STREQN(4, "abc", "abcd"));
+ CHECK( ! VG_STREQN(4, "abcd", "abc") );
+ CHECK( ! VG_STREQN(1, "Abcd", "abcd"));
+ CHECK( ! VG_STREQN(4, "Abcd", "abcd"));
+ CHECK( ! VG_STREQN(4, "abcd", "abce"));
+ CHECK( ! VG_STREQN(9, "abcd", "abce"));
+
+ CHECK( VG_STREQN(0, "", "") );
+ CHECK( VG_STREQN(1, "", "") );
+ CHECK( VG_STREQN(0, "a", "a") );
+ CHECK( VG_STREQN(1, "a", "a") );
+ CHECK( VG_STREQN(2, "a", "a") );
+ CHECK( VG_STREQN(9, "a", "a") );
+ CHECK( VG_STREQN(1, "ab", "ac"));
+ CHECK( VG_STREQN(3, "abcd", "abce"));
+}
+
+void test_VG_IS_XXX_ALIGNED(void)
+{
+ CHECK( VG_IS_2_ALIGNED(0x0) );
+ CHECK( ! VG_IS_2_ALIGNED(0x1) );
+ CHECK( VG_IS_2_ALIGNED(0x2) );
+ CHECK( ! VG_IS_2_ALIGNED(0x3) );
+ CHECK( VG_IS_2_ALIGNED(0x4) );
+ CHECK( ! VG_IS_2_ALIGNED(0x5) );
+ CHECK( VG_IS_2_ALIGNED(0x6) );
+ CHECK( ! VG_IS_2_ALIGNED(0x7) );
+ CHECK( VG_IS_2_ALIGNED(0x8) );
+ CHECK( ! VG_IS_2_ALIGNED(0x9) );
+ CHECK( VG_IS_2_ALIGNED(0xa) );
+ CHECK( ! VG_IS_2_ALIGNED(0xb) );
+ CHECK( VG_IS_2_ALIGNED(0xc) );
+ CHECK( ! VG_IS_2_ALIGNED(0xd) );
+ CHECK( VG_IS_2_ALIGNED(0xe) );
+ CHECK( ! VG_IS_2_ALIGNED(0xf) );
+
+ CHECK( VG_IS_4_ALIGNED(0x0) );
+ CHECK( ! VG_IS_4_ALIGNED(0x1) );
+ CHECK( ! VG_IS_4_ALIGNED(0x2) );
+ CHECK( ! VG_IS_4_ALIGNED(0x3) );
+ CHECK( VG_IS_4_ALIGNED(0x4) );
+ CHECK( ! VG_IS_4_ALIGNED(0x5) );
+ CHECK( ! VG_IS_4_ALIGNED(0x6) );
+ CHECK( ! VG_IS_4_ALIGNED(0x7) );
+ CHECK( VG_IS_4_ALIGNED(0x8) );
+ CHECK( ! VG_IS_4_ALIGNED(0x9) );
+ CHECK( ! VG_IS_4_ALIGNED(0xa) );
+ CHECK( ! VG_IS_4_ALIGNED(0xb) );
+ CHECK( VG_IS_4_ALIGNED(0xc) );
+ CHECK( ! VG_IS_4_ALIGNED(0xd) );
+ CHECK( ! VG_IS_4_ALIGNED(0xe) );
+ CHECK( ! VG_IS_4_ALIGNED(0xf) );
+
+ CHECK( VG_IS_8_ALIGNED(0x0) );
+ CHECK( ! VG_IS_8_ALIGNED(0x1) );
+ CHECK( ! VG_IS_8_ALIGNED(0x2) );
+ CHECK( ! VG_IS_8_ALIGNED(0x3) );
+ CHECK( ! VG_IS_8_ALIGNED(0x4) );
+ CHECK( ! VG_IS_8_ALIGNED(0x5) );
+ CHECK( ! VG_IS_8_ALIGNED(0x6) );
+ CHECK( ! VG_IS_8_ALIGNED(0x7) );
+ CHECK( VG_IS_8_ALIGNED(0x8) );
+ CHECK( ! VG_IS_8_ALIGNED(0x9) );
+ CHECK( ! VG_IS_8_ALIGNED(0xa) );
+ CHECK( ! VG_IS_8_ALIGNED(0xb) );
+ CHECK( ! VG_IS_8_ALIGNED(0xc) );
+ CHECK( ! VG_IS_8_ALIGNED(0xd) );
+ CHECK( ! VG_IS_8_ALIGNED(0xe) );
+ CHECK( ! VG_IS_8_ALIGNED(0xf) );
+
+ CHECK( VG_IS_16_ALIGNED(0x0) );
+ CHECK( ! VG_IS_16_ALIGNED(0x1) );
+ CHECK( ! VG_IS_16_ALIGNED(0x2) );
+ CHECK( ! VG_IS_16_ALIGNED(0x3) );
+ CHECK( ! VG_IS_16_ALIGNED(0x4) );
+ CHECK( ! VG_IS_16_ALIGNED(0x5) );
+ CHECK( ! VG_IS_16_ALIGNED(0x6) );
+ CHECK( ! VG_IS_16_ALIGNED(0x7) );
+ CHECK( ! VG_IS_16_ALIGNED(0x8) );
+ CHECK( ! VG_IS_16_ALIGNED(0x9) );
+ CHECK( ! VG_IS_16_ALIGNED(0xa) );
+ CHECK( ! VG_IS_16_ALIGNED(0xb) );
+ CHECK( ! VG_IS_16_ALIGNED(0xc) );
+ CHECK( ! VG_IS_16_ALIGNED(0xd) );
+ CHECK( ! VG_IS_16_ALIGNED(0xe) );
+ CHECK( ! VG_IS_16_ALIGNED(0xf) );
+
+ CHECK( VG_IS_WORD_ALIGNED(0x0) );
+ CHECK( ! VG_IS_WORD_ALIGNED(0x1) );
+ CHECK( ! VG_IS_WORD_ALIGNED(0x2) );
+ CHECK( ! VG_IS_WORD_ALIGNED(0x3) );
+ // 0x4 case below
+ CHECK( ! VG_IS_WORD_ALIGNED(0x5) );
+ CHECK( ! VG_IS_WORD_ALIGNED(0x6) );
+ CHECK( ! VG_IS_WORD_ALIGNED(0x7) );
+ CHECK( VG_IS_WORD_ALIGNED(0x8) );
+ CHECK( ! VG_IS_WORD_ALIGNED(0x9) );
+ CHECK( ! VG_IS_WORD_ALIGNED(0xa) );
+ CHECK( ! VG_IS_WORD_ALIGNED(0xb) );
+ // 0xc case below
+ CHECK( ! VG_IS_WORD_ALIGNED(0xd) );
+ CHECK( ! VG_IS_WORD_ALIGNED(0xe) );
+ CHECK( ! VG_IS_WORD_ALIGNED(0xf) );
+ if (4 == sizeof(void*)) {
+ CHECK( VG_IS_WORD_ALIGNED(0x4) );
+ CHECK( VG_IS_WORD_ALIGNED(0xc) );
+ } else if (8 == sizeof(void*)) {
+ CHECK( ! VG_IS_WORD_ALIGNED(0x4) );
+ CHECK( ! VG_IS_WORD_ALIGNED(0xc) );
+ } else {
+ assert(0);
+ }
+
+ CHECK( VG_IS_PAGE_ALIGNED(0x0) );
+ CHECK( ! VG_IS_PAGE_ALIGNED(0x1) );
+ CHECK( ! VG_IS_PAGE_ALIGNED(0x2) );
+ CHECK( ! VG_IS_PAGE_ALIGNED(0x3) );
+ CHECK( ! VG_IS_PAGE_ALIGNED(0x4) );
+ CHECK( ! VG_IS_PAGE_ALIGNED(VKI_PAGE_SIZE-1) );
+ CHECK( VG_IS_PAGE_ALIGNED(VKI_PAGE_SIZE ) );
+ CHECK( ! VG_IS_PAGE_ALIGNED(VKI_PAGE_SIZE+1) );
+}
+
+void test_VG_ROUND_et_al()
+{
+ CHECK( 0 == VG_ROUNDDN(0, 1) );
+ CHECK( 1 == VG_ROUNDDN(1, 1) );
+ CHECK( 2 == VG_ROUNDDN(2, 1) );
+ CHECK( 3 == VG_ROUNDDN(3, 1) );
+ CHECK( 4 == VG_ROUNDDN(4, 1) );
+ CHECK( 5 == VG_ROUNDDN(5, 1) );
+ CHECK( 6 == VG_ROUNDDN(6, 1) );
+ CHECK( 7 == VG_ROUNDDN(7, 1) );
+
+ CHECK( 0 == VG_ROUNDUP(0, 1) );
+ CHECK( 1 == VG_ROUNDUP(1, 1) );
+ CHECK( 2 == VG_ROUNDUP(2, 1) );
+ CHECK( 3 == VG_ROUNDUP(3, 1) );
+ CHECK( 4 == VG_ROUNDUP(4, 1) );
+ CHECK( 5 == VG_ROUNDUP(5, 1) );
+ CHECK( 6 == VG_ROUNDUP(6, 1) );
+ CHECK( 7 == VG_ROUNDUP(7, 1) );
+
+ CHECK( 0 == VG_ROUNDDN(0, 2) );
+ CHECK( 0 == VG_ROUNDDN(1, 2) );
+ CHECK( 2 == VG_ROUNDDN(2, 2) );
+ CHECK( 2 == VG_ROUNDDN(3, 2) );
+ CHECK( 4 == VG_ROUNDDN(4, 2) );
+ CHECK( 4 == VG_ROUNDDN(5, 2) );
+ CHECK( 6 == VG_ROUNDDN(6, 2) );
+ CHECK( 6 == VG_ROUNDDN(7, 2) );
+
+ CHECK( 0 == VG_ROUNDUP(0, 2) );
+ CHECK( 2 == VG_ROUNDUP(1, 2) );
+ CHECK( 2 == VG_ROUNDUP(2, 2) );
+ CHECK( 4 == VG_ROUNDUP(3, 2) );
+ CHECK( 4 == VG_ROUNDUP(4, 2) );
+ CHECK( 6 == VG_ROUNDUP(5, 2) );
+ CHECK( 6 == VG_ROUNDUP(6, 2) );
+ CHECK( 8 == VG_ROUNDUP(7, 2) );
+
+ CHECK( 0 == VG_ROUNDDN(0, 4) );
+ CHECK( 0 == VG_ROUNDDN(1, 4) );
+ CHECK( 0 == VG_ROUNDDN(2, 4) );
+ CHECK( 0 == VG_ROUNDDN(3, 4) );
+ CHECK( 4 == VG_ROUNDDN(4, 4) );
+ CHECK( 4 == VG_ROUNDDN(5, 4) );
+ CHECK( 4 == VG_ROUNDDN(6, 4) );
+ CHECK( 4 == VG_ROUNDDN(7, 4) );
+
+ CHECK( 0 == VG_ROUNDUP(0, 4) );
+ CHECK( 4 == VG_ROUNDUP(1, 4) );
+ CHECK( 4 == VG_ROUNDUP(2, 4) );
+ CHECK( 4 == VG_ROUNDUP(3, 4) );
+ CHECK( 4 == VG_ROUNDUP(4, 4) );
+ CHECK( 8 == VG_ROUNDUP(5, 4) );
+ CHECK( 8 == VG_ROUNDUP(6, 4) );
+ CHECK( 8 == VG_ROUNDUP(7, 4) );
+
+ CHECK( 0 == VG_ROUNDDN(0, 8) );
+ CHECK( 0 == VG_ROUNDDN(1, 8) );
+ CHECK( 0 == VG_ROUNDDN(2, 8) );
+ CHECK( 0 == VG_ROUNDDN(3, 8) );
+ CHECK( 0 == VG_ROUNDDN(4, 8) );
+ CHECK( 0 == VG_ROUNDDN(5, 8) );
+ CHECK( 0 == VG_ROUNDDN(6, 8) );
+ CHECK( 0 == VG_ROUNDDN(7, 8) );
+
+ CHECK( 0 == VG_ROUNDUP(0, 8) );
+ CHECK( 8 == VG_ROUNDUP(1, 8) );
+ CHECK( 8 == VG_ROUNDUP(2, 8) );
+ CHECK( 8 == VG_ROUNDUP(3, 8) );
+ CHECK( 8 == VG_ROUNDUP(4, 8) );
+ CHECK( 8 == VG_ROUNDUP(5, 8) );
+ CHECK( 8 == VG_ROUNDUP(6, 8) );
+ CHECK( 8 == VG_ROUNDUP(7, 8) );
+
+ CHECK( 0 == VG_PGROUNDDN(0) );
+ CHECK( 0 == VG_PGROUNDDN(1) );
+ CHECK( 0 == VG_PGROUNDDN(2) );
+ CHECK( 0 == VG_PGROUNDDN(3) );
+ CHECK( 0 == VG_PGROUNDDN(4) );
+ CHECK( 0 == VG_PGROUNDDN(VKI_PAGE_SIZE-1) );
+ CHECK( VKI_PAGE_SIZE == VG_PGROUNDDN(VKI_PAGE_SIZE ) );
+ CHECK( VKI_PAGE_SIZE == VG_PGROUNDDN(VKI_PAGE_SIZE+1) );
+
+ CHECK( 0 == VG_PGROUNDUP(0) );
+ CHECK( VKI_PAGE_SIZE == VG_PGROUNDUP(1) );
+ CHECK( VKI_PAGE_SIZE == VG_PGROUNDUP(2) );
+ CHECK( VKI_PAGE_SIZE == VG_PGROUNDUP(3) );
+ CHECK( VKI_PAGE_SIZE == VG_PGROUNDUP(4) );
+ CHECK( VKI_PAGE_SIZE == VG_PGROUNDUP(VKI_PAGE_SIZE-1) );
+ CHECK( VKI_PAGE_SIZE == VG_PGROUNDUP(VKI_PAGE_SIZE ) );
+ CHECK( VKI_PAGE_SIZE*2 == VG_PGROUNDUP(VKI_PAGE_SIZE+1) );
+}
+
+void test_isspace(void)
{
CHECK( VG_(isspace)(' ') );
CHECK( VG_(isspace)('\n') );
CHECK( VG_(isspace)('\t') );
CHECK( ! VG_(isspace)('3') );
CHECK( ! VG_(isspace)('x') );
+}
+void test_isdigit(void)
+{
CHECK( VG_(isdigit)('0') );
CHECK( VG_(isdigit)('1') );
CHECK( VG_(isdigit)('5') );
@@ -25,14 +271,17 @@
CHECK( ! VG_(isdigit)('!') );
}
-void test_is_XYZ_digit()
+void test_is_dec_digit()
{
Long x;
-
CHECK( is_dec_digit('0', &x) && 0 == x );
CHECK( is_dec_digit('1', &x) && 1 == x );
CHECK( is_dec_digit('9', &x) && 9 == x );
+}
+void test_is_hex_digit()
+{
+ Long x;
CHECK( is_hex_digit('0', &x) && 0 == x );
CHECK( is_hex_digit('1', &x) && 1 == x );
CHECK( is_hex_digit('9', &x) && 9 == x );
@@ -42,7 +291,7 @@
CHECK( is_hex_digit('F', &x) && 15 == x );
}
-void test_strtoll(void)
+void test_strtoll_and_strtod(void)
{
// For VG_(strtoll*)()
typedef struct {
@@ -156,38 +405,99 @@
// XXX: todo
}
+void test_log2(void)
+{
+ CHECK( -1 == VG_(log2)(0) );
+ CHECK( 0 == VG_(log2)(1) );
+ CHECK( 1 == VG_(log2)(2) );
+ CHECK( -1 == VG_(log2)(3) );
+ CHECK( 2 == VG_(log2)(4) );
+ CHECK( -1 == VG_(log2)(5) );
+ CHECK( -1 == VG_(log2)(6) );
+ CHECK( -1 == VG_(log2)(7) );
+ CHECK( 3 == VG_(log2)(8) );
+
+ CHECK( -1 == VG_(log2)( 15) );
+ CHECK( 4 == VG_(log2)( 16) );
+ CHECK( -1 == VG_(log2)( 17) );
+
+ CHECK( -1 == VG_(log2)( 63) );
+ CHECK( 6 == VG_(log2)( 64) );
+ CHECK( -1 == VG_(log2)( 65) );
+
+ CHECK( -1 == VG_(log2)(255) );
+ CHECK( 8 == VG_(log2)(256) );
+ CHECK( -1 == VG_(log2)(257) );
+
+ CHECK( -1 == VG_(log2)(65535) );
+ CHECK( 16 == VG_(log2)(65536) );
+ CHECK( -1 == VG_(log2)(65537) );
+
+ CHECK( -1 == VG_(log2)(16777215) );
+ CHECK( 24 == VG_(log2)(16777216) );
+ CHECK( -1 == VG_(log2)(16777217) );
+
+ CHECK( -1 == VG_(log2)(2147483647U) );
+ CHECK( 31 == VG_(log2)(2147483648U) );
+ CHECK( -1 == VG_(log2)(2147483649U) );
+
+ CHECK( -1 == VG_(log2)(4294967295U) ); // Max UInt
+ CHECK( -1 == VG_(log2)(4294967296U) ); // Wraps to 0, so answer is -1
+}
+
+void test_random(void)
+{
+ // Hmm, it's really hard to unit test a pseudo-random number generator.
+ // So no testing here, sorry.
+}
+
+//-----------------------------------------------------------------------
+// main
+//-----------------------------------------------------------------------
+
int main(void)
{
+ // Nb: the order of the tests is based on the order of the code in
+ // m_libcbase.c, except that macros defined in pub_tool_libcbase.h are
+ // tested first.
+
//--------------------------------------------------------------------
- // Macros in pub_tool_libcbase.h
+ // pub_tool_libcbase.h macros
//--------------------------------------------------------------------
- // XXX: todo
+ test_VG_STREQ();
+ test_VG_STREQN();
+ test_VG_IS_XXX_ALIGNED();
+ test_VG_ROUND_et_al();
//--------------------------------------------------------------------
// Char functions
//--------------------------------------------------------------------
- test_isXYZ();
+ test_isspace();
+ test_isdigit();
//--------------------------------------------------------------------
// String-to-number functions
//--------------------------------------------------------------------
- test_is_XYZ_digit();
- test_strtoll();
+ test_is_dec_digit();
+ test_is_hex_digit();
+ test_strtoll_and_strtod();
//--------------------------------------------------------------------
// String functions
//--------------------------------------------------------------------
- // XXX: todo
+ // XXX: more todo: VG_(str_*)
//--------------------------------------------------------------------
// Mem functions
//--------------------------------------------------------------------
- // XXX: todo
+ // XXX: todo: VG_(mem*)
//--------------------------------------------------------------------
// Miscellaneous functions
//--------------------------------------------------------------------
- // XXX: todo
+ // XXX: todo: VG_(ssort)
+ test_log2();
+ test_random();
return 0;
}