1ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// This module does unit testing of m_libcbase. 2ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 3ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <assert.h> 4ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <stdio.h> 5ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <stdlib.h> 6ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 7ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "pub_tool_basics.h" /* UInt et al, needed for pub_tool_vki.h */ 8ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "pub_tool_vki.h" 9ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "m_libcbase.c" 10ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 11ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define CHECK(x) \ 12ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (!x) { fprintf(stderr, "failure: %s:%d\n", __FILE__, __LINE__); } 13ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 14ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 15ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid test_VG_STREQ(void) 16ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 17ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( ! VG_STREQ(NULL, NULL) ); // Nb: strcmp() considers these equal 18ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( ! VG_STREQ(NULL, "ab") ); // Nb: strcmp() seg faults on this 19ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( ! VG_STREQ("ab", NULL) ); // Nb: strcmp() seg faults on this 20ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( ! VG_STREQ("", "a") ); 21ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( ! VG_STREQ("a", "") ); 22ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( ! VG_STREQ("abc", "abcd")); 23ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( ! VG_STREQ("abcd", "abc") ); 24ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( ! VG_STREQ("Abcd", "abcd")); 25ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( ! VG_STREQ("abcd", "Abcd")); 26ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 27ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( VG_STREQ("", "") ); 28ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( VG_STREQ("a", "a") ); 29ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( VG_STREQ("abcd", "abcd") ); 30ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 31ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 32ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid test_VG_STREQN(void) 33ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 34ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( ! VG_STREQN(0, NULL, NULL) ); 35ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( ! VG_STREQN(5, NULL, NULL) ); 36ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( ! VG_STREQN(0, NULL, "ab") ); 37ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( ! VG_STREQN(5, NULL, "ab") ); 38ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( ! VG_STREQN(0, "ab", NULL) ); 39ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( ! VG_STREQN(1, "", "a") ); 40ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( ! VG_STREQN(1, "a", "") ); 41ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( ! VG_STREQN(4, "abc", "abcd")); 42ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( ! VG_STREQN(4, "abcd", "abc") ); 43ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( ! VG_STREQN(1, "Abcd", "abcd")); 44ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( ! VG_STREQN(4, "Abcd", "abcd")); 45ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( ! VG_STREQN(4, "abcd", "abce")); 46ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( ! VG_STREQN(9, "abcd", "abce")); 47ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 48ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( VG_STREQN(0, "", "") ); 49ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( VG_STREQN(1, "", "") ); 50ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( VG_STREQN(0, "a", "a") ); 51ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( VG_STREQN(1, "a", "a") ); 52ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( VG_STREQN(2, "a", "a") ); 53ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( VG_STREQN(9, "a", "a") ); 54ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( VG_STREQN(1, "ab", "ac")); 55ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( VG_STREQN(3, "abcd", "abce")); 56ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 57ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 58ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// On PPC/Linux VKI_PAGE_SIZE is a variable, not a macro. 59ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if defined(VGP_ppc32_linux) || defined(VGP_ppc64_linux) 60ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownunsigned long VKI_PAGE_SIZE = 1UL << 12; 61ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif 62ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 63ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid test_VG_IS_XYZ_ALIGNED(void) 64ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 65ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( VG_IS_2_ALIGNED(0x0) ); 66ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( ! VG_IS_2_ALIGNED(0x1) ); 67ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( VG_IS_2_ALIGNED(0x2) ); 68ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( ! VG_IS_2_ALIGNED(0x3) ); 69ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( VG_IS_2_ALIGNED(0x4) ); 70ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( ! VG_IS_2_ALIGNED(0x5) ); 71ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( VG_IS_2_ALIGNED(0x6) ); 72ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( ! VG_IS_2_ALIGNED(0x7) ); 73ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( VG_IS_2_ALIGNED(0x8) ); 74ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( ! VG_IS_2_ALIGNED(0x9) ); 75ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( VG_IS_2_ALIGNED(0xa) ); 76ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( ! VG_IS_2_ALIGNED(0xb) ); 77ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( VG_IS_2_ALIGNED(0xc) ); 78ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( ! VG_IS_2_ALIGNED(0xd) ); 79ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( VG_IS_2_ALIGNED(0xe) ); 80ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( ! VG_IS_2_ALIGNED(0xf) ); 81ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 82ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( VG_IS_4_ALIGNED(0x0) ); 83ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( ! VG_IS_4_ALIGNED(0x1) ); 84ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( ! VG_IS_4_ALIGNED(0x2) ); 85ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( ! VG_IS_4_ALIGNED(0x3) ); 86ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( VG_IS_4_ALIGNED(0x4) ); 87ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( ! VG_IS_4_ALIGNED(0x5) ); 88ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( ! VG_IS_4_ALIGNED(0x6) ); 89ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( ! VG_IS_4_ALIGNED(0x7) ); 90ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( VG_IS_4_ALIGNED(0x8) ); 91ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( ! VG_IS_4_ALIGNED(0x9) ); 92ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( ! VG_IS_4_ALIGNED(0xa) ); 93ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( ! VG_IS_4_ALIGNED(0xb) ); 94ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( VG_IS_4_ALIGNED(0xc) ); 95ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( ! VG_IS_4_ALIGNED(0xd) ); 96ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( ! VG_IS_4_ALIGNED(0xe) ); 97ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( ! VG_IS_4_ALIGNED(0xf) ); 98ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 99ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( VG_IS_8_ALIGNED(0x0) ); 100ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( ! VG_IS_8_ALIGNED(0x1) ); 101ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( ! VG_IS_8_ALIGNED(0x2) ); 102ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( ! VG_IS_8_ALIGNED(0x3) ); 103ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( ! VG_IS_8_ALIGNED(0x4) ); 104ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( ! VG_IS_8_ALIGNED(0x5) ); 105ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( ! VG_IS_8_ALIGNED(0x6) ); 106ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( ! VG_IS_8_ALIGNED(0x7) ); 107ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( VG_IS_8_ALIGNED(0x8) ); 108ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( ! VG_IS_8_ALIGNED(0x9) ); 109ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( ! VG_IS_8_ALIGNED(0xa) ); 110ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( ! VG_IS_8_ALIGNED(0xb) ); 111ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( ! VG_IS_8_ALIGNED(0xc) ); 112ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( ! VG_IS_8_ALIGNED(0xd) ); 113ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( ! VG_IS_8_ALIGNED(0xe) ); 114ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( ! VG_IS_8_ALIGNED(0xf) ); 115ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 116ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( VG_IS_16_ALIGNED(0x0) ); 117ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( ! VG_IS_16_ALIGNED(0x1) ); 118ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( ! VG_IS_16_ALIGNED(0x2) ); 119ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( ! VG_IS_16_ALIGNED(0x3) ); 120ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( ! VG_IS_16_ALIGNED(0x4) ); 121ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( ! VG_IS_16_ALIGNED(0x5) ); 122ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( ! VG_IS_16_ALIGNED(0x6) ); 123ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( ! VG_IS_16_ALIGNED(0x7) ); 124ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( ! VG_IS_16_ALIGNED(0x8) ); 125ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( ! VG_IS_16_ALIGNED(0x9) ); 126ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( ! VG_IS_16_ALIGNED(0xa) ); 127ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( ! VG_IS_16_ALIGNED(0xb) ); 128ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( ! VG_IS_16_ALIGNED(0xc) ); 129ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( ! VG_IS_16_ALIGNED(0xd) ); 130ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( ! VG_IS_16_ALIGNED(0xe) ); 131ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( ! VG_IS_16_ALIGNED(0xf) ); 132ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 133ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( VG_IS_WORD_ALIGNED(0x0) ); 134ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( ! VG_IS_WORD_ALIGNED(0x1) ); 135ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( ! VG_IS_WORD_ALIGNED(0x2) ); 136ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( ! VG_IS_WORD_ALIGNED(0x3) ); 137ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // 0x4 case below 138ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( ! VG_IS_WORD_ALIGNED(0x5) ); 139ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( ! VG_IS_WORD_ALIGNED(0x6) ); 140ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( ! VG_IS_WORD_ALIGNED(0x7) ); 141ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( VG_IS_WORD_ALIGNED(0x8) ); 142ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( ! VG_IS_WORD_ALIGNED(0x9) ); 143ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( ! VG_IS_WORD_ALIGNED(0xa) ); 144ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( ! VG_IS_WORD_ALIGNED(0xb) ); 145ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // 0xc case below 146ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( ! VG_IS_WORD_ALIGNED(0xd) ); 147ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( ! VG_IS_WORD_ALIGNED(0xe) ); 148ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( ! VG_IS_WORD_ALIGNED(0xf) ); 149ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (4 == sizeof(void*)) { 150ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( VG_IS_WORD_ALIGNED(0x4) ); 151ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( VG_IS_WORD_ALIGNED(0xc) ); 152ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } else if (8 == sizeof(void*)) { 153ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( ! VG_IS_WORD_ALIGNED(0x4) ); 154ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( ! VG_IS_WORD_ALIGNED(0xc) ); 155ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } else { 156ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown assert(0); 157ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 158ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 159ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( VG_IS_PAGE_ALIGNED(0x0) ); 160ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( ! VG_IS_PAGE_ALIGNED(0x1) ); 161ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( ! VG_IS_PAGE_ALIGNED(0x2) ); 162ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( ! VG_IS_PAGE_ALIGNED(0x3) ); 163ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( ! VG_IS_PAGE_ALIGNED(0x4) ); 164ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( ! VG_IS_PAGE_ALIGNED(VKI_PAGE_SIZE-1) ); 165ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( VG_IS_PAGE_ALIGNED(VKI_PAGE_SIZE ) ); 166ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( ! VG_IS_PAGE_ALIGNED(VKI_PAGE_SIZE+1) ); 167ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 168ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 169ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid test_VG_ROUND_et_al() 170ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 171ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( 0 == VG_ROUNDDN(0, 1) ); 172ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( 1 == VG_ROUNDDN(1, 1) ); 173ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( 2 == VG_ROUNDDN(2, 1) ); 174ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( 3 == VG_ROUNDDN(3, 1) ); 175ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( 4 == VG_ROUNDDN(4, 1) ); 176ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( 5 == VG_ROUNDDN(5, 1) ); 177ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( 6 == VG_ROUNDDN(6, 1) ); 178ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( 7 == VG_ROUNDDN(7, 1) ); 179ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 180ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( 0 == VG_ROUNDUP(0, 1) ); 181ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( 1 == VG_ROUNDUP(1, 1) ); 182ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( 2 == VG_ROUNDUP(2, 1) ); 183ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( 3 == VG_ROUNDUP(3, 1) ); 184ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( 4 == VG_ROUNDUP(4, 1) ); 185ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( 5 == VG_ROUNDUP(5, 1) ); 186ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( 6 == VG_ROUNDUP(6, 1) ); 187ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( 7 == VG_ROUNDUP(7, 1) ); 188ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 189ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( 0 == VG_ROUNDDN(0, 2) ); 190ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( 0 == VG_ROUNDDN(1, 2) ); 191ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( 2 == VG_ROUNDDN(2, 2) ); 192ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( 2 == VG_ROUNDDN(3, 2) ); 193ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( 4 == VG_ROUNDDN(4, 2) ); 194ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( 4 == VG_ROUNDDN(5, 2) ); 195ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( 6 == VG_ROUNDDN(6, 2) ); 196ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( 6 == VG_ROUNDDN(7, 2) ); 197ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 198ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( 0 == VG_ROUNDUP(0, 2) ); 199ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( 2 == VG_ROUNDUP(1, 2) ); 200ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( 2 == VG_ROUNDUP(2, 2) ); 201ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( 4 == VG_ROUNDUP(3, 2) ); 202ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( 4 == VG_ROUNDUP(4, 2) ); 203ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( 6 == VG_ROUNDUP(5, 2) ); 204ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( 6 == VG_ROUNDUP(6, 2) ); 205ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( 8 == VG_ROUNDUP(7, 2) ); 206ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 207ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( 0 == VG_ROUNDDN(0, 4) ); 208ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( 0 == VG_ROUNDDN(1, 4) ); 209ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( 0 == VG_ROUNDDN(2, 4) ); 210ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( 0 == VG_ROUNDDN(3, 4) ); 211ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( 4 == VG_ROUNDDN(4, 4) ); 212ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( 4 == VG_ROUNDDN(5, 4) ); 213ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( 4 == VG_ROUNDDN(6, 4) ); 214ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( 4 == VG_ROUNDDN(7, 4) ); 215ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 216ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( 0 == VG_ROUNDUP(0, 4) ); 217ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( 4 == VG_ROUNDUP(1, 4) ); 218ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( 4 == VG_ROUNDUP(2, 4) ); 219ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( 4 == VG_ROUNDUP(3, 4) ); 220ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( 4 == VG_ROUNDUP(4, 4) ); 221ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( 8 == VG_ROUNDUP(5, 4) ); 222ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( 8 == VG_ROUNDUP(6, 4) ); 223ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( 8 == VG_ROUNDUP(7, 4) ); 224ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 225ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( 0 == VG_ROUNDDN(0, 8) ); 226ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( 0 == VG_ROUNDDN(1, 8) ); 227ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( 0 == VG_ROUNDDN(2, 8) ); 228ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( 0 == VG_ROUNDDN(3, 8) ); 229ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( 0 == VG_ROUNDDN(4, 8) ); 230ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( 0 == VG_ROUNDDN(5, 8) ); 231ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( 0 == VG_ROUNDDN(6, 8) ); 232ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( 0 == VG_ROUNDDN(7, 8) ); 233ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 234ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( 0 == VG_ROUNDUP(0, 8) ); 235ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( 8 == VG_ROUNDUP(1, 8) ); 236ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( 8 == VG_ROUNDUP(2, 8) ); 237ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( 8 == VG_ROUNDUP(3, 8) ); 238ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( 8 == VG_ROUNDUP(4, 8) ); 239ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( 8 == VG_ROUNDUP(5, 8) ); 240ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( 8 == VG_ROUNDUP(6, 8) ); 241ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( 8 == VG_ROUNDUP(7, 8) ); 242ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 243ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( 0 == VG_PGROUNDDN(0) ); 244ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( 0 == VG_PGROUNDDN(1) ); 245ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( 0 == VG_PGROUNDDN(2) ); 246ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( 0 == VG_PGROUNDDN(3) ); 247ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( 0 == VG_PGROUNDDN(4) ); 248ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( 0 == VG_PGROUNDDN(VKI_PAGE_SIZE-1) ); 249ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( VKI_PAGE_SIZE == VG_PGROUNDDN(VKI_PAGE_SIZE ) ); 250ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( VKI_PAGE_SIZE == VG_PGROUNDDN(VKI_PAGE_SIZE+1) ); 251ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 252ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( 0 == VG_PGROUNDUP(0) ); 253ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( VKI_PAGE_SIZE == VG_PGROUNDUP(1) ); 254ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( VKI_PAGE_SIZE == VG_PGROUNDUP(2) ); 255ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( VKI_PAGE_SIZE == VG_PGROUNDUP(3) ); 256ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( VKI_PAGE_SIZE == VG_PGROUNDUP(4) ); 257ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( VKI_PAGE_SIZE == VG_PGROUNDUP(VKI_PAGE_SIZE-1) ); 258ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( VKI_PAGE_SIZE == VG_PGROUNDUP(VKI_PAGE_SIZE ) ); 259ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( VKI_PAGE_SIZE*2 == VG_PGROUNDUP(VKI_PAGE_SIZE+1) ); 260ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 261ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 262ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid test_isspace(void) 263ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 264ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( VG_(isspace)(' ') ); 265ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( VG_(isspace)('\n') ); 266ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( VG_(isspace)('\t') ); 267ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( ! VG_(isspace)('3') ); 268ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( ! VG_(isspace)('x') ); 269ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 270ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 271ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid test_isdigit(void) 272ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 273ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( VG_(isdigit)('0') ); 274ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( VG_(isdigit)('1') ); 275ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( VG_(isdigit)('5') ); 276ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( VG_(isdigit)('9') ); 277ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( ! VG_(isdigit)('a') ); 278ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( ! VG_(isdigit)('!') ); 279ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 280ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 281ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid test_is_dec_digit() 282ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 283ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Long x; 284ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( is_dec_digit('0', &x) && 0 == x ); 285ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( is_dec_digit('1', &x) && 1 == x ); 286ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( is_dec_digit('9', &x) && 9 == x ); 287ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 288ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 289ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid test_is_hex_digit() 290ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 291ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Long x; 292ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( is_hex_digit('0', &x) && 0 == x ); 293ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( is_hex_digit('1', &x) && 1 == x ); 294ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( is_hex_digit('9', &x) && 9 == x ); 295ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( is_hex_digit('a', &x) && 10 == x ); 296ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( is_hex_digit('f', &x) && 15 == x ); 297ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( is_hex_digit('A', &x) && 10 == x ); 298ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( is_hex_digit('F', &x) && 15 == x ); 299ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 300ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 301ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid test_strtoll_and_strtod(void) 302ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 303ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // For VG_(strtoll*)() 304ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown typedef struct { 305ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Char* str; // The string to convert. 306ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Long res; // The result. 307ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Char endptr_val; // The char one past the end of the converted text. 308ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } StrtollInputs; 309ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 310ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // VG_(strtoll10)() 311ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown { 312ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown StrtollInputs a[] = { 313ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // If there's no number at the head of the string, return 0, and 314ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // make 'endptr' point to the start of the string. 315b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov { .str = "", .res = 0, .endptr_val = '\0' }, 316b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov { .str = " \n\t", .res = 0, .endptr_val = ' ' }, 317b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov { .str = "one", .res = 0, .endptr_val = 'o' }, 318b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov { .str = "\ntwo", .res = 0, .endptr_val = '\n' }, 319ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 320ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // Successful conversion. Leading whitespace is ignored. A single 321ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // '-' or '+' is accepted. 322b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov { .str = "0", .res = 0, .endptr_val = '\0' }, 323b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov { .str = "+0", .res = 0, .endptr_val = '\0' }, 324b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov { .str = "-0", .res = 0, .endptr_val = '\0' }, 325b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov { .str = "1", .res = 1, .endptr_val = '\0' }, 326b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov { .str = "+1", .res = 1, .endptr_val = '\0' }, 327b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov { .str = "-1", .res = -1, .endptr_val = '\0' }, 328b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov { .str = "12", .res = 12, .endptr_val = '\0' }, 329b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov { .str = "-567", .res = -567, .endptr_val = '\0' }, 330b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov { .str = "1234567", .res = 1234567, .endptr_val = '\0' }, 331b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov { .str = "007", .res = 7, .endptr_val = '\0' }, 332b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov { .str = " +42", .res = 42, .endptr_val = '\0' }, 333b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov { .str = "\n\t\r\v -56", .res = -56, .endptr_val = '\0' }, 334b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov { .str = "123xyz", .res = 123, .endptr_val = 'x' }, 335b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov { .str = " -123abc", .res = -123, .endptr_val = 'a' }, 336ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 337ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // Whitespace after the +/- is not allowed; conversion fails. 338b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov { .str = "+ 1", .res = 0, .endptr_val = '+' }, 339b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov { .str = "-\n1", .res = 0, .endptr_val = '-' }, 340ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown }; 341ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 342ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // Nb: We test the results against strtoll() as well. 343ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown int i; 344ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown for (i = 0; i < (sizeof(a) / sizeof(StrtollInputs)); i++) { 345ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Char* endptr1; 346ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown char* endptr2; 347ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Long res1 = VG_(strtoll10)(a[i].str, &endptr1); 348ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown long long res2 = strtoll (a[i].str, &endptr2, 10); 349ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown //printf("res1 = %lld, *endptr1 = '%c'\n", res1, *endptr1); 350ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown //printf("res2 = %lld, *endptr2 = '%c'\n", res2, *endptr2); 351ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK(a[i].res == res1 && a[i].endptr_val == *endptr1); 352ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK(res2 == res1 && *endptr2 == *endptr1); 353ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 354ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 355ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 356ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // VG_(strtoll16)() 357ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown { 358ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown StrtollInputs a[] = { 359ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // If there's no number at the head of the string, return 0, and 360ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // make 'endptr' point to the start of the string. 361b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov { .str = "", .res = 0, .endptr_val = '\0' }, 362b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov { .str = " \n\t", .res = 0, .endptr_val = ' ' }, 363b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov { .str = "one", .res = 0, .endptr_val = 'o' }, 364b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov { .str = "\ntwo", .res = 0, .endptr_val = '\n' }, 365ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 366ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // Successful conversion. Leading whitespace is ignored. A single 367ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // '-' or '+' is accepted. "0X" and "0x" are also allowed at the 368ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // front, but if no digits follow, just the "0" is converted. 369b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov { .str = "0", .res = 0, .endptr_val = '\0' }, 370b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov { .str = "0x0", .res = 0, .endptr_val = '\0' }, 371b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov { .str = "0X0", .res = 0, .endptr_val = '\0' }, 372b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov { .str = "0x", .res = 0, .endptr_val = 'x' }, 373b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov { .str = "0Xg", .res = 0, .endptr_val = 'X' }, 374b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov { .str = "0", .res = 0, .endptr_val = '\0' }, 375b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov { .str = "+0", .res = 0, .endptr_val = '\0' }, 376b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov { .str = "-0", .res = 0, .endptr_val = '\0' }, 377b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov { .str = "1", .res = 1, .endptr_val = '\0' }, 378b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov { .str = "+1", .res = 1, .endptr_val = '\0' }, 379b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov { .str = "-1", .res = -1, .endptr_val = '\0' }, 380b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov { .str = "1a", .res = 26, .endptr_val = '\0' }, 381b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov { .str = "-5F7", .res = -1527, .endptr_val = '\0' }, 382b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov { .str = "0x1234567", .res = 19088743, .endptr_val = '\0' }, 383b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov { .str = "007", .res = 7, .endptr_val = '\0' }, 384b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov { .str = "0X00ABCD", .res = 43981, .endptr_val = '\0' }, 385b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov { .str = " +AbC", .res = 2748, .endptr_val = '\0' }, 386b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov { .str = " -0xAbC", .res = -2748, .endptr_val = '\0' }, 387b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov { .str = " -0xxx", .res = 0, .endptr_val = 'x' }, 388b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov { .str = "\n\t\r\v -56", .res = -86, .endptr_val = '\0' }, 389b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov { .str = "123xyz", .res = 291, .endptr_val = 'x' }, 390b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov { .str = " -123defghi", .res = -1195503, .endptr_val = 'g' }, 391ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 392ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // Whitespace after the +/- is not allowed; conversion fails. 393b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov { .str = "+ 1", .res = 0, .endptr_val = '+' }, 394b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov { .str = "-\n0x1", .res = 0, .endptr_val = '-' }, 395ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown }; 396ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 397ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // Nb: We test the results against strtoll() as well. 398ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown int i; 399ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown for (i = 0; i < (sizeof(a) / sizeof(StrtollInputs)); i++) { 400ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Char* endptr1; 401ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown char* endptr2; 402ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Long res1 = VG_(strtoll16)(a[i].str, &endptr1); 403ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown long long res2 = strtoll (a[i].str, &endptr2, 16); 404ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown //printf(" res1 = %lld, *endptr1 = '%c'\n", res1, *endptr1); 405ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown //printf(" res2 = %lld, *endptr2 = '%c'\n", res2, *endptr2); 406ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK(a[i].res == res1 && a[i].endptr_val == *endptr1); 407ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK(res2 == res1 && *endptr2 == *endptr1); 408ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 409ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 410ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 411ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // VG_(strtod)() 412ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // XXX: todo 413ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 414ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 415ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid test_log2(void) 416ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 417ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( -1 == VG_(log2)(0) ); 418ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( 0 == VG_(log2)(1) ); 419ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( 1 == VG_(log2)(2) ); 420ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( -1 == VG_(log2)(3) ); 421ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( 2 == VG_(log2)(4) ); 422ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( -1 == VG_(log2)(5) ); 423ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( -1 == VG_(log2)(6) ); 424ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( -1 == VG_(log2)(7) ); 425ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( 3 == VG_(log2)(8) ); 426ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 427ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( -1 == VG_(log2)( 15) ); 428ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( 4 == VG_(log2)( 16) ); 429ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( -1 == VG_(log2)( 17) ); 430ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 431ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( -1 == VG_(log2)( 63) ); 432ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( 6 == VG_(log2)( 64) ); 433ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( -1 == VG_(log2)( 65) ); 434ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 435ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( -1 == VG_(log2)(255) ); 436ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( 8 == VG_(log2)(256) ); 437ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( -1 == VG_(log2)(257) ); 438ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 439ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( -1 == VG_(log2)(65535) ); 440ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( 16 == VG_(log2)(65536) ); 441ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( -1 == VG_(log2)(65537) ); 442ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 443ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( -1 == VG_(log2)(16777215) ); 444ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( 24 == VG_(log2)(16777216) ); 445ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( -1 == VG_(log2)(16777217) ); 446ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 447ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( -1 == VG_(log2)(2147483647U) ); 448ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( 31 == VG_(log2)(2147483648U) ); 449ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( -1 == VG_(log2)(2147483649U) ); 450ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 451ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CHECK( -1 == VG_(log2)(4294967295U) ); // Max UInt 452ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 453ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 454ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid test_random(void) 455ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 456ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // Hmm, it's really hard to unit test a pseudo-random number generator. 457ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // So no testing here, sorry. 458ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 459ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 460ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//----------------------------------------------------------------------- 461ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// main 462ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//----------------------------------------------------------------------- 463ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 464ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownint main(void) 465ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 466ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // Nb: the order of the tests is based on the order of the code in 467ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // m_libcbase.c, except that macros defined in pub_tool_libcbase.h are 468ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // tested first. 469ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 470ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown //-------------------------------------------------------------------- 471ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // pub_tool_libcbase.h macros 472ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown //-------------------------------------------------------------------- 473ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown test_VG_STREQ(); 474ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown test_VG_STREQN(); 475ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown test_VG_IS_XYZ_ALIGNED(); 476ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown test_VG_ROUND_et_al(); 477ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 478ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown //-------------------------------------------------------------------- 479ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // Char functions 480ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown //-------------------------------------------------------------------- 481ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown test_isspace(); 482ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown test_isdigit(); 483ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 484ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown //-------------------------------------------------------------------- 485ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // String-to-number functions 486ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown //-------------------------------------------------------------------- 487ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown test_is_dec_digit(); 488ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown test_is_hex_digit(); 489ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown test_strtoll_and_strtod(); 490ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 491ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown //-------------------------------------------------------------------- 492ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // String functions 493ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown //-------------------------------------------------------------------- 494ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // XXX: more todo: VG_(str_*) 495ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 496ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown //-------------------------------------------------------------------- 497ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // Mem functions 498ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown //-------------------------------------------------------------------- 499ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // XXX: todo: VG_(mem*) 500ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 501ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown //-------------------------------------------------------------------- 502ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // Miscellaneous functions 503ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown //-------------------------------------------------------------------- 504ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // XXX: todo: VG_(ssort) 505ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown test_log2(); 506ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown test_random(); 507ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 508ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return 0; 509ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 510ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 511