1221666fbecd5198908befdb3d21d6c5ea9835a57njn// This module does unit testing of m_libcbase. 2221666fbecd5198908befdb3d21d6c5ea9835a57njn 3221666fbecd5198908befdb3d21d6c5ea9835a57njn#include <assert.h> 4221666fbecd5198908befdb3d21d6c5ea9835a57njn#include <stdio.h> 5221666fbecd5198908befdb3d21d6c5ea9835a57njn#include <stdlib.h> 6421c26e30de64ccf441ec398c1f8beda7afbb47cflorian#include <stddef.h> 7221666fbecd5198908befdb3d21d6c5ea9835a57njn 8cda2f0fbda4c4b2644babc830244be8aed95de1dnjn#include "pub_tool_basics.h" /* UInt et al, needed for pub_tool_vki.h */ 9132fdb03f69d704bb4777831936e169bd2380242njn#include "pub_tool_vki.h" 10132fdb03f69d704bb4777831936e169bd2380242njn#include "m_libcbase.c" 11221666fbecd5198908befdb3d21d6c5ea9835a57njn 12421c26e30de64ccf441ec398c1f8beda7afbb47cflorian/* Provide a stub to not have to pull in m_debuglog.c */ 13421c26e30de64ccf441ec398c1f8beda7afbb47cflorianvoid VG_(debugLog) ( Int level, const HChar* modulename, 14421c26e30de64ccf441ec398c1f8beda7afbb47cflorian const HChar* format, ... ) 15421c26e30de64ccf441ec398c1f8beda7afbb47cflorian{ 16421c26e30de64ccf441ec398c1f8beda7afbb47cflorian va_list args; 17421c26e30de64ccf441ec398c1f8beda7afbb47cflorian va_start(args, format); 18421c26e30de64ccf441ec398c1f8beda7afbb47cflorian fprintf(stderr, "debuglog: %s: ", modulename); 19421c26e30de64ccf441ec398c1f8beda7afbb47cflorian vfprintf(stderr, format, args); 20421c26e30de64ccf441ec398c1f8beda7afbb47cflorian va_end(args); 21421c26e30de64ccf441ec398c1f8beda7afbb47cflorian} 22421c26e30de64ccf441ec398c1f8beda7afbb47cflorian 23421c26e30de64ccf441ec398c1f8beda7afbb47cflorian/* Provide a stub to not have to pull in m_libcassert.c */ 24421c26e30de64ccf441ec398c1f8beda7afbb47cflorianvoid VG_(exit_now)( Int status ) 25421c26e30de64ccf441ec398c1f8beda7afbb47cflorian{ 26421c26e30de64ccf441ec398c1f8beda7afbb47cflorian exit(status); 27421c26e30de64ccf441ec398c1f8beda7afbb47cflorian} 28421c26e30de64ccf441ec398c1f8beda7afbb47cflorian 29421c26e30de64ccf441ec398c1f8beda7afbb47cflorian 302a5a76b43b99c5a62c16140505a7f9fcbc0a5fb4njn#define CHECK(x) \ 313119a2b75cdb58b960c6299f2641dce8023fef5bflorian if (!(x)) { fprintf(stderr, "failure: %s:%d\n", __FILE__, __LINE__); } 32221666fbecd5198908befdb3d21d6c5ea9835a57njn 3324d9863ba4d07d1d131ed621fb6353e08a46485bbart 34132fdb03f69d704bb4777831936e169bd2380242njnvoid test_VG_STREQ(void) 35132fdb03f69d704bb4777831936e169bd2380242njn{ 36132fdb03f69d704bb4777831936e169bd2380242njn CHECK( ! VG_STREQ(NULL, NULL) ); // Nb: strcmp() considers these equal 37132fdb03f69d704bb4777831936e169bd2380242njn CHECK( ! VG_STREQ(NULL, "ab") ); // Nb: strcmp() seg faults on this 38132fdb03f69d704bb4777831936e169bd2380242njn CHECK( ! VG_STREQ("ab", NULL) ); // Nb: strcmp() seg faults on this 39132fdb03f69d704bb4777831936e169bd2380242njn CHECK( ! VG_STREQ("", "a") ); 40132fdb03f69d704bb4777831936e169bd2380242njn CHECK( ! VG_STREQ("a", "") ); 41132fdb03f69d704bb4777831936e169bd2380242njn CHECK( ! VG_STREQ("abc", "abcd")); 42132fdb03f69d704bb4777831936e169bd2380242njn CHECK( ! VG_STREQ("abcd", "abc") ); 43132fdb03f69d704bb4777831936e169bd2380242njn CHECK( ! VG_STREQ("Abcd", "abcd")); 44132fdb03f69d704bb4777831936e169bd2380242njn CHECK( ! VG_STREQ("abcd", "Abcd")); 45132fdb03f69d704bb4777831936e169bd2380242njn 46132fdb03f69d704bb4777831936e169bd2380242njn CHECK( VG_STREQ("", "") ); 47132fdb03f69d704bb4777831936e169bd2380242njn CHECK( VG_STREQ("a", "a") ); 48132fdb03f69d704bb4777831936e169bd2380242njn CHECK( VG_STREQ("abcd", "abcd") ); 49132fdb03f69d704bb4777831936e169bd2380242njn} 50132fdb03f69d704bb4777831936e169bd2380242njn 51132fdb03f69d704bb4777831936e169bd2380242njnvoid test_VG_STREQN(void) 52132fdb03f69d704bb4777831936e169bd2380242njn{ 53132fdb03f69d704bb4777831936e169bd2380242njn CHECK( ! VG_STREQN(0, NULL, NULL) ); 54132fdb03f69d704bb4777831936e169bd2380242njn CHECK( ! VG_STREQN(5, NULL, NULL) ); 55132fdb03f69d704bb4777831936e169bd2380242njn CHECK( ! VG_STREQN(0, NULL, "ab") ); 56132fdb03f69d704bb4777831936e169bd2380242njn CHECK( ! VG_STREQN(5, NULL, "ab") ); 57132fdb03f69d704bb4777831936e169bd2380242njn CHECK( ! VG_STREQN(0, "ab", NULL) ); 58132fdb03f69d704bb4777831936e169bd2380242njn CHECK( ! VG_STREQN(1, "", "a") ); 59132fdb03f69d704bb4777831936e169bd2380242njn CHECK( ! VG_STREQN(1, "a", "") ); 60132fdb03f69d704bb4777831936e169bd2380242njn CHECK( ! VG_STREQN(4, "abc", "abcd")); 61132fdb03f69d704bb4777831936e169bd2380242njn CHECK( ! VG_STREQN(4, "abcd", "abc") ); 62132fdb03f69d704bb4777831936e169bd2380242njn CHECK( ! VG_STREQN(1, "Abcd", "abcd")); 63132fdb03f69d704bb4777831936e169bd2380242njn CHECK( ! VG_STREQN(4, "Abcd", "abcd")); 64132fdb03f69d704bb4777831936e169bd2380242njn CHECK( ! VG_STREQN(4, "abcd", "abce")); 65132fdb03f69d704bb4777831936e169bd2380242njn CHECK( ! VG_STREQN(9, "abcd", "abce")); 66132fdb03f69d704bb4777831936e169bd2380242njn 67132fdb03f69d704bb4777831936e169bd2380242njn CHECK( VG_STREQN(0, "", "") ); 68132fdb03f69d704bb4777831936e169bd2380242njn CHECK( VG_STREQN(1, "", "") ); 69132fdb03f69d704bb4777831936e169bd2380242njn CHECK( VG_STREQN(0, "a", "a") ); 70132fdb03f69d704bb4777831936e169bd2380242njn CHECK( VG_STREQN(1, "a", "a") ); 71132fdb03f69d704bb4777831936e169bd2380242njn CHECK( VG_STREQN(2, "a", "a") ); 72132fdb03f69d704bb4777831936e169bd2380242njn CHECK( VG_STREQN(9, "a", "a") ); 73132fdb03f69d704bb4777831936e169bd2380242njn CHECK( VG_STREQN(1, "ab", "ac")); 74132fdb03f69d704bb4777831936e169bd2380242njn CHECK( VG_STREQN(3, "abcd", "abce")); 75132fdb03f69d704bb4777831936e169bd2380242njn} 76132fdb03f69d704bb4777831936e169bd2380242njn 77f57115c7a0eb64bba945a002a786e8478291eedcnjn// On PPC/Linux VKI_PAGE_SIZE is a variable, not a macro. 78cae0cc22b83ffb260ee8379e92099c5a701944cbcarll#if defined(VGP_ppc32_linux) || defined(VGP_ppc64be_linux) \ 79cae0cc22b83ffb260ee8379e92099c5a701944cbcarll || defined(VGP_ppc64le_linux) 80f57115c7a0eb64bba945a002a786e8478291eedcnjnunsigned long VKI_PAGE_SIZE = 1UL << 12; 8114857fd46dc3e69a1dff772557ac2757059bfb55sewardj#elif defined(VGP_arm64_linux) 8214857fd46dc3e69a1dff772557ac2757059bfb55sewardjunsigned long VKI_PAGE_SIZE = 1UL << 16; 83f57115c7a0eb64bba945a002a786e8478291eedcnjn#endif 84f57115c7a0eb64bba945a002a786e8478291eedcnjn 8529a100cbcd50426b422cac5c855b38384c7c37c5njnvoid test_VG_IS_XYZ_ALIGNED(void) 86132fdb03f69d704bb4777831936e169bd2380242njn{ 87132fdb03f69d704bb4777831936e169bd2380242njn CHECK( VG_IS_2_ALIGNED(0x0) ); 88132fdb03f69d704bb4777831936e169bd2380242njn CHECK( ! VG_IS_2_ALIGNED(0x1) ); 89132fdb03f69d704bb4777831936e169bd2380242njn CHECK( VG_IS_2_ALIGNED(0x2) ); 90132fdb03f69d704bb4777831936e169bd2380242njn CHECK( ! VG_IS_2_ALIGNED(0x3) ); 91132fdb03f69d704bb4777831936e169bd2380242njn CHECK( VG_IS_2_ALIGNED(0x4) ); 92132fdb03f69d704bb4777831936e169bd2380242njn CHECK( ! VG_IS_2_ALIGNED(0x5) ); 93132fdb03f69d704bb4777831936e169bd2380242njn CHECK( VG_IS_2_ALIGNED(0x6) ); 94132fdb03f69d704bb4777831936e169bd2380242njn CHECK( ! VG_IS_2_ALIGNED(0x7) ); 95132fdb03f69d704bb4777831936e169bd2380242njn CHECK( VG_IS_2_ALIGNED(0x8) ); 96132fdb03f69d704bb4777831936e169bd2380242njn CHECK( ! VG_IS_2_ALIGNED(0x9) ); 97132fdb03f69d704bb4777831936e169bd2380242njn CHECK( VG_IS_2_ALIGNED(0xa) ); 98132fdb03f69d704bb4777831936e169bd2380242njn CHECK( ! VG_IS_2_ALIGNED(0xb) ); 99132fdb03f69d704bb4777831936e169bd2380242njn CHECK( VG_IS_2_ALIGNED(0xc) ); 100132fdb03f69d704bb4777831936e169bd2380242njn CHECK( ! VG_IS_2_ALIGNED(0xd) ); 101132fdb03f69d704bb4777831936e169bd2380242njn CHECK( VG_IS_2_ALIGNED(0xe) ); 102132fdb03f69d704bb4777831936e169bd2380242njn CHECK( ! VG_IS_2_ALIGNED(0xf) ); 103132fdb03f69d704bb4777831936e169bd2380242njn 104132fdb03f69d704bb4777831936e169bd2380242njn CHECK( VG_IS_4_ALIGNED(0x0) ); 105132fdb03f69d704bb4777831936e169bd2380242njn CHECK( ! VG_IS_4_ALIGNED(0x1) ); 106132fdb03f69d704bb4777831936e169bd2380242njn CHECK( ! VG_IS_4_ALIGNED(0x2) ); 107132fdb03f69d704bb4777831936e169bd2380242njn CHECK( ! VG_IS_4_ALIGNED(0x3) ); 108132fdb03f69d704bb4777831936e169bd2380242njn CHECK( VG_IS_4_ALIGNED(0x4) ); 109132fdb03f69d704bb4777831936e169bd2380242njn CHECK( ! VG_IS_4_ALIGNED(0x5) ); 110132fdb03f69d704bb4777831936e169bd2380242njn CHECK( ! VG_IS_4_ALIGNED(0x6) ); 111132fdb03f69d704bb4777831936e169bd2380242njn CHECK( ! VG_IS_4_ALIGNED(0x7) ); 112132fdb03f69d704bb4777831936e169bd2380242njn CHECK( VG_IS_4_ALIGNED(0x8) ); 113132fdb03f69d704bb4777831936e169bd2380242njn CHECK( ! VG_IS_4_ALIGNED(0x9) ); 114132fdb03f69d704bb4777831936e169bd2380242njn CHECK( ! VG_IS_4_ALIGNED(0xa) ); 115132fdb03f69d704bb4777831936e169bd2380242njn CHECK( ! VG_IS_4_ALIGNED(0xb) ); 116132fdb03f69d704bb4777831936e169bd2380242njn CHECK( VG_IS_4_ALIGNED(0xc) ); 117132fdb03f69d704bb4777831936e169bd2380242njn CHECK( ! VG_IS_4_ALIGNED(0xd) ); 118132fdb03f69d704bb4777831936e169bd2380242njn CHECK( ! VG_IS_4_ALIGNED(0xe) ); 119132fdb03f69d704bb4777831936e169bd2380242njn CHECK( ! VG_IS_4_ALIGNED(0xf) ); 120132fdb03f69d704bb4777831936e169bd2380242njn 121132fdb03f69d704bb4777831936e169bd2380242njn CHECK( VG_IS_8_ALIGNED(0x0) ); 122132fdb03f69d704bb4777831936e169bd2380242njn CHECK( ! VG_IS_8_ALIGNED(0x1) ); 123132fdb03f69d704bb4777831936e169bd2380242njn CHECK( ! VG_IS_8_ALIGNED(0x2) ); 124132fdb03f69d704bb4777831936e169bd2380242njn CHECK( ! VG_IS_8_ALIGNED(0x3) ); 125132fdb03f69d704bb4777831936e169bd2380242njn CHECK( ! VG_IS_8_ALIGNED(0x4) ); 126132fdb03f69d704bb4777831936e169bd2380242njn CHECK( ! VG_IS_8_ALIGNED(0x5) ); 127132fdb03f69d704bb4777831936e169bd2380242njn CHECK( ! VG_IS_8_ALIGNED(0x6) ); 128132fdb03f69d704bb4777831936e169bd2380242njn CHECK( ! VG_IS_8_ALIGNED(0x7) ); 129132fdb03f69d704bb4777831936e169bd2380242njn CHECK( VG_IS_8_ALIGNED(0x8) ); 130132fdb03f69d704bb4777831936e169bd2380242njn CHECK( ! VG_IS_8_ALIGNED(0x9) ); 131132fdb03f69d704bb4777831936e169bd2380242njn CHECK( ! VG_IS_8_ALIGNED(0xa) ); 132132fdb03f69d704bb4777831936e169bd2380242njn CHECK( ! VG_IS_8_ALIGNED(0xb) ); 133132fdb03f69d704bb4777831936e169bd2380242njn CHECK( ! VG_IS_8_ALIGNED(0xc) ); 134132fdb03f69d704bb4777831936e169bd2380242njn CHECK( ! VG_IS_8_ALIGNED(0xd) ); 135132fdb03f69d704bb4777831936e169bd2380242njn CHECK( ! VG_IS_8_ALIGNED(0xe) ); 136132fdb03f69d704bb4777831936e169bd2380242njn CHECK( ! VG_IS_8_ALIGNED(0xf) ); 137132fdb03f69d704bb4777831936e169bd2380242njn 138132fdb03f69d704bb4777831936e169bd2380242njn CHECK( VG_IS_16_ALIGNED(0x0) ); 139132fdb03f69d704bb4777831936e169bd2380242njn CHECK( ! VG_IS_16_ALIGNED(0x1) ); 140132fdb03f69d704bb4777831936e169bd2380242njn CHECK( ! VG_IS_16_ALIGNED(0x2) ); 141132fdb03f69d704bb4777831936e169bd2380242njn CHECK( ! VG_IS_16_ALIGNED(0x3) ); 142132fdb03f69d704bb4777831936e169bd2380242njn CHECK( ! VG_IS_16_ALIGNED(0x4) ); 143132fdb03f69d704bb4777831936e169bd2380242njn CHECK( ! VG_IS_16_ALIGNED(0x5) ); 144132fdb03f69d704bb4777831936e169bd2380242njn CHECK( ! VG_IS_16_ALIGNED(0x6) ); 145132fdb03f69d704bb4777831936e169bd2380242njn CHECK( ! VG_IS_16_ALIGNED(0x7) ); 146132fdb03f69d704bb4777831936e169bd2380242njn CHECK( ! VG_IS_16_ALIGNED(0x8) ); 147132fdb03f69d704bb4777831936e169bd2380242njn CHECK( ! VG_IS_16_ALIGNED(0x9) ); 148132fdb03f69d704bb4777831936e169bd2380242njn CHECK( ! VG_IS_16_ALIGNED(0xa) ); 149132fdb03f69d704bb4777831936e169bd2380242njn CHECK( ! VG_IS_16_ALIGNED(0xb) ); 150132fdb03f69d704bb4777831936e169bd2380242njn CHECK( ! VG_IS_16_ALIGNED(0xc) ); 151132fdb03f69d704bb4777831936e169bd2380242njn CHECK( ! VG_IS_16_ALIGNED(0xd) ); 152132fdb03f69d704bb4777831936e169bd2380242njn CHECK( ! VG_IS_16_ALIGNED(0xe) ); 153132fdb03f69d704bb4777831936e169bd2380242njn CHECK( ! VG_IS_16_ALIGNED(0xf) ); 154132fdb03f69d704bb4777831936e169bd2380242njn 155132fdb03f69d704bb4777831936e169bd2380242njn CHECK( VG_IS_WORD_ALIGNED(0x0) ); 156132fdb03f69d704bb4777831936e169bd2380242njn CHECK( ! VG_IS_WORD_ALIGNED(0x1) ); 157132fdb03f69d704bb4777831936e169bd2380242njn CHECK( ! VG_IS_WORD_ALIGNED(0x2) ); 158132fdb03f69d704bb4777831936e169bd2380242njn CHECK( ! VG_IS_WORD_ALIGNED(0x3) ); 159132fdb03f69d704bb4777831936e169bd2380242njn // 0x4 case below 160132fdb03f69d704bb4777831936e169bd2380242njn CHECK( ! VG_IS_WORD_ALIGNED(0x5) ); 161132fdb03f69d704bb4777831936e169bd2380242njn CHECK( ! VG_IS_WORD_ALIGNED(0x6) ); 162132fdb03f69d704bb4777831936e169bd2380242njn CHECK( ! VG_IS_WORD_ALIGNED(0x7) ); 163132fdb03f69d704bb4777831936e169bd2380242njn CHECK( VG_IS_WORD_ALIGNED(0x8) ); 164132fdb03f69d704bb4777831936e169bd2380242njn CHECK( ! VG_IS_WORD_ALIGNED(0x9) ); 165132fdb03f69d704bb4777831936e169bd2380242njn CHECK( ! VG_IS_WORD_ALIGNED(0xa) ); 166132fdb03f69d704bb4777831936e169bd2380242njn CHECK( ! VG_IS_WORD_ALIGNED(0xb) ); 167132fdb03f69d704bb4777831936e169bd2380242njn // 0xc case below 168132fdb03f69d704bb4777831936e169bd2380242njn CHECK( ! VG_IS_WORD_ALIGNED(0xd) ); 169132fdb03f69d704bb4777831936e169bd2380242njn CHECK( ! VG_IS_WORD_ALIGNED(0xe) ); 170132fdb03f69d704bb4777831936e169bd2380242njn CHECK( ! VG_IS_WORD_ALIGNED(0xf) ); 171132fdb03f69d704bb4777831936e169bd2380242njn if (4 == sizeof(void*)) { 172132fdb03f69d704bb4777831936e169bd2380242njn CHECK( VG_IS_WORD_ALIGNED(0x4) ); 173132fdb03f69d704bb4777831936e169bd2380242njn CHECK( VG_IS_WORD_ALIGNED(0xc) ); 174132fdb03f69d704bb4777831936e169bd2380242njn } else if (8 == sizeof(void*)) { 175132fdb03f69d704bb4777831936e169bd2380242njn CHECK( ! VG_IS_WORD_ALIGNED(0x4) ); 176132fdb03f69d704bb4777831936e169bd2380242njn CHECK( ! VG_IS_WORD_ALIGNED(0xc) ); 177132fdb03f69d704bb4777831936e169bd2380242njn } else { 178132fdb03f69d704bb4777831936e169bd2380242njn assert(0); 179132fdb03f69d704bb4777831936e169bd2380242njn } 180132fdb03f69d704bb4777831936e169bd2380242njn 181132fdb03f69d704bb4777831936e169bd2380242njn CHECK( VG_IS_PAGE_ALIGNED(0x0) ); 182132fdb03f69d704bb4777831936e169bd2380242njn CHECK( ! VG_IS_PAGE_ALIGNED(0x1) ); 183132fdb03f69d704bb4777831936e169bd2380242njn CHECK( ! VG_IS_PAGE_ALIGNED(0x2) ); 184132fdb03f69d704bb4777831936e169bd2380242njn CHECK( ! VG_IS_PAGE_ALIGNED(0x3) ); 185132fdb03f69d704bb4777831936e169bd2380242njn CHECK( ! VG_IS_PAGE_ALIGNED(0x4) ); 186132fdb03f69d704bb4777831936e169bd2380242njn CHECK( ! VG_IS_PAGE_ALIGNED(VKI_PAGE_SIZE-1) ); 187132fdb03f69d704bb4777831936e169bd2380242njn CHECK( VG_IS_PAGE_ALIGNED(VKI_PAGE_SIZE ) ); 188132fdb03f69d704bb4777831936e169bd2380242njn CHECK( ! VG_IS_PAGE_ALIGNED(VKI_PAGE_SIZE+1) ); 189132fdb03f69d704bb4777831936e169bd2380242njn} 190132fdb03f69d704bb4777831936e169bd2380242njn 191132fdb03f69d704bb4777831936e169bd2380242njnvoid test_VG_ROUND_et_al() 192132fdb03f69d704bb4777831936e169bd2380242njn{ 193132fdb03f69d704bb4777831936e169bd2380242njn CHECK( 0 == VG_ROUNDDN(0, 1) ); 194132fdb03f69d704bb4777831936e169bd2380242njn CHECK( 1 == VG_ROUNDDN(1, 1) ); 195132fdb03f69d704bb4777831936e169bd2380242njn CHECK( 2 == VG_ROUNDDN(2, 1) ); 196132fdb03f69d704bb4777831936e169bd2380242njn CHECK( 3 == VG_ROUNDDN(3, 1) ); 197132fdb03f69d704bb4777831936e169bd2380242njn CHECK( 4 == VG_ROUNDDN(4, 1) ); 198132fdb03f69d704bb4777831936e169bd2380242njn CHECK( 5 == VG_ROUNDDN(5, 1) ); 199132fdb03f69d704bb4777831936e169bd2380242njn CHECK( 6 == VG_ROUNDDN(6, 1) ); 200132fdb03f69d704bb4777831936e169bd2380242njn CHECK( 7 == VG_ROUNDDN(7, 1) ); 201132fdb03f69d704bb4777831936e169bd2380242njn 202132fdb03f69d704bb4777831936e169bd2380242njn CHECK( 0 == VG_ROUNDUP(0, 1) ); 203132fdb03f69d704bb4777831936e169bd2380242njn CHECK( 1 == VG_ROUNDUP(1, 1) ); 204132fdb03f69d704bb4777831936e169bd2380242njn CHECK( 2 == VG_ROUNDUP(2, 1) ); 205132fdb03f69d704bb4777831936e169bd2380242njn CHECK( 3 == VG_ROUNDUP(3, 1) ); 206132fdb03f69d704bb4777831936e169bd2380242njn CHECK( 4 == VG_ROUNDUP(4, 1) ); 207132fdb03f69d704bb4777831936e169bd2380242njn CHECK( 5 == VG_ROUNDUP(5, 1) ); 208132fdb03f69d704bb4777831936e169bd2380242njn CHECK( 6 == VG_ROUNDUP(6, 1) ); 209132fdb03f69d704bb4777831936e169bd2380242njn CHECK( 7 == VG_ROUNDUP(7, 1) ); 210132fdb03f69d704bb4777831936e169bd2380242njn 211132fdb03f69d704bb4777831936e169bd2380242njn CHECK( 0 == VG_ROUNDDN(0, 2) ); 212132fdb03f69d704bb4777831936e169bd2380242njn CHECK( 0 == VG_ROUNDDN(1, 2) ); 213132fdb03f69d704bb4777831936e169bd2380242njn CHECK( 2 == VG_ROUNDDN(2, 2) ); 214132fdb03f69d704bb4777831936e169bd2380242njn CHECK( 2 == VG_ROUNDDN(3, 2) ); 215132fdb03f69d704bb4777831936e169bd2380242njn CHECK( 4 == VG_ROUNDDN(4, 2) ); 216132fdb03f69d704bb4777831936e169bd2380242njn CHECK( 4 == VG_ROUNDDN(5, 2) ); 217132fdb03f69d704bb4777831936e169bd2380242njn CHECK( 6 == VG_ROUNDDN(6, 2) ); 218132fdb03f69d704bb4777831936e169bd2380242njn CHECK( 6 == VG_ROUNDDN(7, 2) ); 219132fdb03f69d704bb4777831936e169bd2380242njn 220132fdb03f69d704bb4777831936e169bd2380242njn CHECK( 0 == VG_ROUNDUP(0, 2) ); 221132fdb03f69d704bb4777831936e169bd2380242njn CHECK( 2 == VG_ROUNDUP(1, 2) ); 222132fdb03f69d704bb4777831936e169bd2380242njn CHECK( 2 == VG_ROUNDUP(2, 2) ); 223132fdb03f69d704bb4777831936e169bd2380242njn CHECK( 4 == VG_ROUNDUP(3, 2) ); 224132fdb03f69d704bb4777831936e169bd2380242njn CHECK( 4 == VG_ROUNDUP(4, 2) ); 225132fdb03f69d704bb4777831936e169bd2380242njn CHECK( 6 == VG_ROUNDUP(5, 2) ); 226132fdb03f69d704bb4777831936e169bd2380242njn CHECK( 6 == VG_ROUNDUP(6, 2) ); 227132fdb03f69d704bb4777831936e169bd2380242njn CHECK( 8 == VG_ROUNDUP(7, 2) ); 228132fdb03f69d704bb4777831936e169bd2380242njn 229132fdb03f69d704bb4777831936e169bd2380242njn CHECK( 0 == VG_ROUNDDN(0, 4) ); 230132fdb03f69d704bb4777831936e169bd2380242njn CHECK( 0 == VG_ROUNDDN(1, 4) ); 231132fdb03f69d704bb4777831936e169bd2380242njn CHECK( 0 == VG_ROUNDDN(2, 4) ); 232132fdb03f69d704bb4777831936e169bd2380242njn CHECK( 0 == VG_ROUNDDN(3, 4) ); 233132fdb03f69d704bb4777831936e169bd2380242njn CHECK( 4 == VG_ROUNDDN(4, 4) ); 234132fdb03f69d704bb4777831936e169bd2380242njn CHECK( 4 == VG_ROUNDDN(5, 4) ); 235132fdb03f69d704bb4777831936e169bd2380242njn CHECK( 4 == VG_ROUNDDN(6, 4) ); 236132fdb03f69d704bb4777831936e169bd2380242njn CHECK( 4 == VG_ROUNDDN(7, 4) ); 237132fdb03f69d704bb4777831936e169bd2380242njn 238132fdb03f69d704bb4777831936e169bd2380242njn CHECK( 0 == VG_ROUNDUP(0, 4) ); 239132fdb03f69d704bb4777831936e169bd2380242njn CHECK( 4 == VG_ROUNDUP(1, 4) ); 240132fdb03f69d704bb4777831936e169bd2380242njn CHECK( 4 == VG_ROUNDUP(2, 4) ); 241132fdb03f69d704bb4777831936e169bd2380242njn CHECK( 4 == VG_ROUNDUP(3, 4) ); 242132fdb03f69d704bb4777831936e169bd2380242njn CHECK( 4 == VG_ROUNDUP(4, 4) ); 243132fdb03f69d704bb4777831936e169bd2380242njn CHECK( 8 == VG_ROUNDUP(5, 4) ); 244132fdb03f69d704bb4777831936e169bd2380242njn CHECK( 8 == VG_ROUNDUP(6, 4) ); 245132fdb03f69d704bb4777831936e169bd2380242njn CHECK( 8 == VG_ROUNDUP(7, 4) ); 246132fdb03f69d704bb4777831936e169bd2380242njn 247132fdb03f69d704bb4777831936e169bd2380242njn CHECK( 0 == VG_ROUNDDN(0, 8) ); 248132fdb03f69d704bb4777831936e169bd2380242njn CHECK( 0 == VG_ROUNDDN(1, 8) ); 249132fdb03f69d704bb4777831936e169bd2380242njn CHECK( 0 == VG_ROUNDDN(2, 8) ); 250132fdb03f69d704bb4777831936e169bd2380242njn CHECK( 0 == VG_ROUNDDN(3, 8) ); 251132fdb03f69d704bb4777831936e169bd2380242njn CHECK( 0 == VG_ROUNDDN(4, 8) ); 252132fdb03f69d704bb4777831936e169bd2380242njn CHECK( 0 == VG_ROUNDDN(5, 8) ); 253132fdb03f69d704bb4777831936e169bd2380242njn CHECK( 0 == VG_ROUNDDN(6, 8) ); 254132fdb03f69d704bb4777831936e169bd2380242njn CHECK( 0 == VG_ROUNDDN(7, 8) ); 255132fdb03f69d704bb4777831936e169bd2380242njn 256132fdb03f69d704bb4777831936e169bd2380242njn CHECK( 0 == VG_ROUNDUP(0, 8) ); 257132fdb03f69d704bb4777831936e169bd2380242njn CHECK( 8 == VG_ROUNDUP(1, 8) ); 258132fdb03f69d704bb4777831936e169bd2380242njn CHECK( 8 == VG_ROUNDUP(2, 8) ); 259132fdb03f69d704bb4777831936e169bd2380242njn CHECK( 8 == VG_ROUNDUP(3, 8) ); 260132fdb03f69d704bb4777831936e169bd2380242njn CHECK( 8 == VG_ROUNDUP(4, 8) ); 261132fdb03f69d704bb4777831936e169bd2380242njn CHECK( 8 == VG_ROUNDUP(5, 8) ); 262132fdb03f69d704bb4777831936e169bd2380242njn CHECK( 8 == VG_ROUNDUP(6, 8) ); 263132fdb03f69d704bb4777831936e169bd2380242njn CHECK( 8 == VG_ROUNDUP(7, 8) ); 264132fdb03f69d704bb4777831936e169bd2380242njn 265132fdb03f69d704bb4777831936e169bd2380242njn CHECK( 0 == VG_PGROUNDDN(0) ); 266132fdb03f69d704bb4777831936e169bd2380242njn CHECK( 0 == VG_PGROUNDDN(1) ); 267132fdb03f69d704bb4777831936e169bd2380242njn CHECK( 0 == VG_PGROUNDDN(2) ); 268132fdb03f69d704bb4777831936e169bd2380242njn CHECK( 0 == VG_PGROUNDDN(3) ); 269132fdb03f69d704bb4777831936e169bd2380242njn CHECK( 0 == VG_PGROUNDDN(4) ); 270132fdb03f69d704bb4777831936e169bd2380242njn CHECK( 0 == VG_PGROUNDDN(VKI_PAGE_SIZE-1) ); 271132fdb03f69d704bb4777831936e169bd2380242njn CHECK( VKI_PAGE_SIZE == VG_PGROUNDDN(VKI_PAGE_SIZE ) ); 272132fdb03f69d704bb4777831936e169bd2380242njn CHECK( VKI_PAGE_SIZE == VG_PGROUNDDN(VKI_PAGE_SIZE+1) ); 273132fdb03f69d704bb4777831936e169bd2380242njn 274132fdb03f69d704bb4777831936e169bd2380242njn CHECK( 0 == VG_PGROUNDUP(0) ); 275132fdb03f69d704bb4777831936e169bd2380242njn CHECK( VKI_PAGE_SIZE == VG_PGROUNDUP(1) ); 276132fdb03f69d704bb4777831936e169bd2380242njn CHECK( VKI_PAGE_SIZE == VG_PGROUNDUP(2) ); 277132fdb03f69d704bb4777831936e169bd2380242njn CHECK( VKI_PAGE_SIZE == VG_PGROUNDUP(3) ); 278132fdb03f69d704bb4777831936e169bd2380242njn CHECK( VKI_PAGE_SIZE == VG_PGROUNDUP(4) ); 279132fdb03f69d704bb4777831936e169bd2380242njn CHECK( VKI_PAGE_SIZE == VG_PGROUNDUP(VKI_PAGE_SIZE-1) ); 280132fdb03f69d704bb4777831936e169bd2380242njn CHECK( VKI_PAGE_SIZE == VG_PGROUNDUP(VKI_PAGE_SIZE ) ); 281132fdb03f69d704bb4777831936e169bd2380242njn CHECK( VKI_PAGE_SIZE*2 == VG_PGROUNDUP(VKI_PAGE_SIZE+1) ); 282132fdb03f69d704bb4777831936e169bd2380242njn} 283132fdb03f69d704bb4777831936e169bd2380242njn 284132fdb03f69d704bb4777831936e169bd2380242njnvoid test_isspace(void) 285221666fbecd5198908befdb3d21d6c5ea9835a57njn{ 2862a5a76b43b99c5a62c16140505a7f9fcbc0a5fb4njn CHECK( VG_(isspace)(' ') ); 2872a5a76b43b99c5a62c16140505a7f9fcbc0a5fb4njn CHECK( VG_(isspace)('\n') ); 2882a5a76b43b99c5a62c16140505a7f9fcbc0a5fb4njn CHECK( VG_(isspace)('\t') ); 2892a5a76b43b99c5a62c16140505a7f9fcbc0a5fb4njn CHECK( ! VG_(isspace)('3') ); 2902a5a76b43b99c5a62c16140505a7f9fcbc0a5fb4njn CHECK( ! VG_(isspace)('x') ); 291132fdb03f69d704bb4777831936e169bd2380242njn} 2922a5a76b43b99c5a62c16140505a7f9fcbc0a5fb4njn 293132fdb03f69d704bb4777831936e169bd2380242njnvoid test_isdigit(void) 294132fdb03f69d704bb4777831936e169bd2380242njn{ 2952a5a76b43b99c5a62c16140505a7f9fcbc0a5fb4njn CHECK( VG_(isdigit)('0') ); 2962a5a76b43b99c5a62c16140505a7f9fcbc0a5fb4njn CHECK( VG_(isdigit)('1') ); 2972a5a76b43b99c5a62c16140505a7f9fcbc0a5fb4njn CHECK( VG_(isdigit)('5') ); 2982a5a76b43b99c5a62c16140505a7f9fcbc0a5fb4njn CHECK( VG_(isdigit)('9') ); 2992a5a76b43b99c5a62c16140505a7f9fcbc0a5fb4njn CHECK( ! VG_(isdigit)('a') ); 3002a5a76b43b99c5a62c16140505a7f9fcbc0a5fb4njn CHECK( ! VG_(isdigit)('!') ); 301221666fbecd5198908befdb3d21d6c5ea9835a57njn} 302221666fbecd5198908befdb3d21d6c5ea9835a57njn 303132fdb03f69d704bb4777831936e169bd2380242njnvoid test_is_dec_digit() 304221666fbecd5198908befdb3d21d6c5ea9835a57njn{ 305221666fbecd5198908befdb3d21d6c5ea9835a57njn Long x; 3062a5a76b43b99c5a62c16140505a7f9fcbc0a5fb4njn CHECK( is_dec_digit('0', &x) && 0 == x ); 3072a5a76b43b99c5a62c16140505a7f9fcbc0a5fb4njn CHECK( is_dec_digit('1', &x) && 1 == x ); 3082a5a76b43b99c5a62c16140505a7f9fcbc0a5fb4njn CHECK( is_dec_digit('9', &x) && 9 == x ); 309132fdb03f69d704bb4777831936e169bd2380242njn} 3102a5a76b43b99c5a62c16140505a7f9fcbc0a5fb4njn 311132fdb03f69d704bb4777831936e169bd2380242njnvoid test_is_hex_digit() 312132fdb03f69d704bb4777831936e169bd2380242njn{ 313132fdb03f69d704bb4777831936e169bd2380242njn Long x; 3142a5a76b43b99c5a62c16140505a7f9fcbc0a5fb4njn CHECK( is_hex_digit('0', &x) && 0 == x ); 3152a5a76b43b99c5a62c16140505a7f9fcbc0a5fb4njn CHECK( is_hex_digit('1', &x) && 1 == x ); 3162a5a76b43b99c5a62c16140505a7f9fcbc0a5fb4njn CHECK( is_hex_digit('9', &x) && 9 == x ); 3172a5a76b43b99c5a62c16140505a7f9fcbc0a5fb4njn CHECK( is_hex_digit('a', &x) && 10 == x ); 3182a5a76b43b99c5a62c16140505a7f9fcbc0a5fb4njn CHECK( is_hex_digit('f', &x) && 15 == x ); 3192a5a76b43b99c5a62c16140505a7f9fcbc0a5fb4njn CHECK( is_hex_digit('A', &x) && 10 == x ); 3202a5a76b43b99c5a62c16140505a7f9fcbc0a5fb4njn CHECK( is_hex_digit('F', &x) && 15 == x ); 321221666fbecd5198908befdb3d21d6c5ea9835a57njn} 322221666fbecd5198908befdb3d21d6c5ea9835a57njn 323132fdb03f69d704bb4777831936e169bd2380242njnvoid test_strtoll_and_strtod(void) 324221666fbecd5198908befdb3d21d6c5ea9835a57njn{ 325221666fbecd5198908befdb3d21d6c5ea9835a57njn // For VG_(strtoll*)() 326221666fbecd5198908befdb3d21d6c5ea9835a57njn typedef struct { 327654b542166d7f2e8e89f1cd8430e7ed2ba96f230florian HChar* str; // The string to convert. 328654b542166d7f2e8e89f1cd8430e7ed2ba96f230florian Long res; // The result. 329654b542166d7f2e8e89f1cd8430e7ed2ba96f230florian HChar endptr_val; // The char one past the end of the converted text. 330221666fbecd5198908befdb3d21d6c5ea9835a57njn } StrtollInputs; 331221666fbecd5198908befdb3d21d6c5ea9835a57njn 332221666fbecd5198908befdb3d21d6c5ea9835a57njn // VG_(strtoll10)() 333221666fbecd5198908befdb3d21d6c5ea9835a57njn { 334221666fbecd5198908befdb3d21d6c5ea9835a57njn StrtollInputs a[] = { 335221666fbecd5198908befdb3d21d6c5ea9835a57njn // If there's no number at the head of the string, return 0, and 336221666fbecd5198908befdb3d21d6c5ea9835a57njn // make 'endptr' point to the start of the string. 337cf0a8b9a81ef7e826f0735341e1b50cbefa27ce0bart { .str = "", .res = 0, .endptr_val = '\0' }, 338cf0a8b9a81ef7e826f0735341e1b50cbefa27ce0bart { .str = " \n\t", .res = 0, .endptr_val = ' ' }, 339cf0a8b9a81ef7e826f0735341e1b50cbefa27ce0bart { .str = "one", .res = 0, .endptr_val = 'o' }, 340cf0a8b9a81ef7e826f0735341e1b50cbefa27ce0bart { .str = "\ntwo", .res = 0, .endptr_val = '\n' }, 341221666fbecd5198908befdb3d21d6c5ea9835a57njn 342221666fbecd5198908befdb3d21d6c5ea9835a57njn // Successful conversion. Leading whitespace is ignored. A single 343221666fbecd5198908befdb3d21d6c5ea9835a57njn // '-' or '+' is accepted. 344cf0a8b9a81ef7e826f0735341e1b50cbefa27ce0bart { .str = "0", .res = 0, .endptr_val = '\0' }, 345cf0a8b9a81ef7e826f0735341e1b50cbefa27ce0bart { .str = "+0", .res = 0, .endptr_val = '\0' }, 346cf0a8b9a81ef7e826f0735341e1b50cbefa27ce0bart { .str = "-0", .res = 0, .endptr_val = '\0' }, 347cf0a8b9a81ef7e826f0735341e1b50cbefa27ce0bart { .str = "1", .res = 1, .endptr_val = '\0' }, 348cf0a8b9a81ef7e826f0735341e1b50cbefa27ce0bart { .str = "+1", .res = 1, .endptr_val = '\0' }, 349cf0a8b9a81ef7e826f0735341e1b50cbefa27ce0bart { .str = "-1", .res = -1, .endptr_val = '\0' }, 350cf0a8b9a81ef7e826f0735341e1b50cbefa27ce0bart { .str = "12", .res = 12, .endptr_val = '\0' }, 351cf0a8b9a81ef7e826f0735341e1b50cbefa27ce0bart { .str = "-567", .res = -567, .endptr_val = '\0' }, 352cf0a8b9a81ef7e826f0735341e1b50cbefa27ce0bart { .str = "1234567", .res = 1234567, .endptr_val = '\0' }, 353cf0a8b9a81ef7e826f0735341e1b50cbefa27ce0bart { .str = "007", .res = 7, .endptr_val = '\0' }, 354cf0a8b9a81ef7e826f0735341e1b50cbefa27ce0bart { .str = " +42", .res = 42, .endptr_val = '\0' }, 355cf0a8b9a81ef7e826f0735341e1b50cbefa27ce0bart { .str = "\n\t\r\v -56", .res = -56, .endptr_val = '\0' }, 356cf0a8b9a81ef7e826f0735341e1b50cbefa27ce0bart { .str = "123xyz", .res = 123, .endptr_val = 'x' }, 357cf0a8b9a81ef7e826f0735341e1b50cbefa27ce0bart { .str = " -123abc", .res = -123, .endptr_val = 'a' }, 358221666fbecd5198908befdb3d21d6c5ea9835a57njn 359221666fbecd5198908befdb3d21d6c5ea9835a57njn // Whitespace after the +/- is not allowed; conversion fails. 360cf0a8b9a81ef7e826f0735341e1b50cbefa27ce0bart { .str = "+ 1", .res = 0, .endptr_val = '+' }, 361cf0a8b9a81ef7e826f0735341e1b50cbefa27ce0bart { .str = "-\n1", .res = 0, .endptr_val = '-' }, 362221666fbecd5198908befdb3d21d6c5ea9835a57njn }; 363221666fbecd5198908befdb3d21d6c5ea9835a57njn 364221666fbecd5198908befdb3d21d6c5ea9835a57njn // Nb: We test the results against strtoll() as well. 365221666fbecd5198908befdb3d21d6c5ea9835a57njn int i; 366221666fbecd5198908befdb3d21d6c5ea9835a57njn for (i = 0; i < (sizeof(a) / sizeof(StrtollInputs)); i++) { 36719f91bbaedb4caef8a60ce94b0f507193cc0bc10florian HChar* endptr1; 36819f91bbaedb4caef8a60ce94b0f507193cc0bc10florian HChar* endptr2; 369221666fbecd5198908befdb3d21d6c5ea9835a57njn Long res1 = VG_(strtoll10)(a[i].str, &endptr1); 370221666fbecd5198908befdb3d21d6c5ea9835a57njn long long res2 = strtoll (a[i].str, &endptr2, 10); 371221666fbecd5198908befdb3d21d6c5ea9835a57njn //printf("res1 = %lld, *endptr1 = '%c'\n", res1, *endptr1); 372221666fbecd5198908befdb3d21d6c5ea9835a57njn //printf("res2 = %lld, *endptr2 = '%c'\n", res2, *endptr2); 3732a5a76b43b99c5a62c16140505a7f9fcbc0a5fb4njn CHECK(a[i].res == res1 && a[i].endptr_val == *endptr1); 3742a5a76b43b99c5a62c16140505a7f9fcbc0a5fb4njn CHECK(res2 == res1 && *endptr2 == *endptr1); 375221666fbecd5198908befdb3d21d6c5ea9835a57njn } 376221666fbecd5198908befdb3d21d6c5ea9835a57njn } 377221666fbecd5198908befdb3d21d6c5ea9835a57njn 378221666fbecd5198908befdb3d21d6c5ea9835a57njn // VG_(strtoll16)() 379221666fbecd5198908befdb3d21d6c5ea9835a57njn { 380221666fbecd5198908befdb3d21d6c5ea9835a57njn StrtollInputs a[] = { 381221666fbecd5198908befdb3d21d6c5ea9835a57njn // If there's no number at the head of the string, return 0, and 382221666fbecd5198908befdb3d21d6c5ea9835a57njn // make 'endptr' point to the start of the string. 383cf0a8b9a81ef7e826f0735341e1b50cbefa27ce0bart { .str = "", .res = 0, .endptr_val = '\0' }, 384cf0a8b9a81ef7e826f0735341e1b50cbefa27ce0bart { .str = " \n\t", .res = 0, .endptr_val = ' ' }, 385cf0a8b9a81ef7e826f0735341e1b50cbefa27ce0bart { .str = "one", .res = 0, .endptr_val = 'o' }, 386cf0a8b9a81ef7e826f0735341e1b50cbefa27ce0bart { .str = "\ntwo", .res = 0, .endptr_val = '\n' }, 387221666fbecd5198908befdb3d21d6c5ea9835a57njn 388221666fbecd5198908befdb3d21d6c5ea9835a57njn // Successful conversion. Leading whitespace is ignored. A single 389221666fbecd5198908befdb3d21d6c5ea9835a57njn // '-' or '+' is accepted. "0X" and "0x" are also allowed at the 390221666fbecd5198908befdb3d21d6c5ea9835a57njn // front, but if no digits follow, just the "0" is converted. 391cf0a8b9a81ef7e826f0735341e1b50cbefa27ce0bart { .str = "0", .res = 0, .endptr_val = '\0' }, 392cf0a8b9a81ef7e826f0735341e1b50cbefa27ce0bart { .str = "0x0", .res = 0, .endptr_val = '\0' }, 393cf0a8b9a81ef7e826f0735341e1b50cbefa27ce0bart { .str = "0X0", .res = 0, .endptr_val = '\0' }, 394cf0a8b9a81ef7e826f0735341e1b50cbefa27ce0bart { .str = "0x", .res = 0, .endptr_val = 'x' }, 395cf0a8b9a81ef7e826f0735341e1b50cbefa27ce0bart { .str = "0Xg", .res = 0, .endptr_val = 'X' }, 396cf0a8b9a81ef7e826f0735341e1b50cbefa27ce0bart { .str = "0", .res = 0, .endptr_val = '\0' }, 397cf0a8b9a81ef7e826f0735341e1b50cbefa27ce0bart { .str = "+0", .res = 0, .endptr_val = '\0' }, 398cf0a8b9a81ef7e826f0735341e1b50cbefa27ce0bart { .str = "-0", .res = 0, .endptr_val = '\0' }, 399cf0a8b9a81ef7e826f0735341e1b50cbefa27ce0bart { .str = "1", .res = 1, .endptr_val = '\0' }, 400cf0a8b9a81ef7e826f0735341e1b50cbefa27ce0bart { .str = "+1", .res = 1, .endptr_val = '\0' }, 401cf0a8b9a81ef7e826f0735341e1b50cbefa27ce0bart { .str = "-1", .res = -1, .endptr_val = '\0' }, 402cf0a8b9a81ef7e826f0735341e1b50cbefa27ce0bart { .str = "1a", .res = 26, .endptr_val = '\0' }, 403cf0a8b9a81ef7e826f0735341e1b50cbefa27ce0bart { .str = "-5F7", .res = -1527, .endptr_val = '\0' }, 404cf0a8b9a81ef7e826f0735341e1b50cbefa27ce0bart { .str = "0x1234567", .res = 19088743, .endptr_val = '\0' }, 405cf0a8b9a81ef7e826f0735341e1b50cbefa27ce0bart { .str = "007", .res = 7, .endptr_val = '\0' }, 406cf0a8b9a81ef7e826f0735341e1b50cbefa27ce0bart { .str = "0X00ABCD", .res = 43981, .endptr_val = '\0' }, 407cf0a8b9a81ef7e826f0735341e1b50cbefa27ce0bart { .str = " +AbC", .res = 2748, .endptr_val = '\0' }, 408cf0a8b9a81ef7e826f0735341e1b50cbefa27ce0bart { .str = " -0xAbC", .res = -2748, .endptr_val = '\0' }, 409cf0a8b9a81ef7e826f0735341e1b50cbefa27ce0bart { .str = " -0xxx", .res = 0, .endptr_val = 'x' }, 410cf0a8b9a81ef7e826f0735341e1b50cbefa27ce0bart { .str = "\n\t\r\v -56", .res = -86, .endptr_val = '\0' }, 411cf0a8b9a81ef7e826f0735341e1b50cbefa27ce0bart { .str = "123xyz", .res = 291, .endptr_val = 'x' }, 412cf0a8b9a81ef7e826f0735341e1b50cbefa27ce0bart { .str = " -123defghi", .res = -1195503, .endptr_val = 'g' }, 413221666fbecd5198908befdb3d21d6c5ea9835a57njn 414221666fbecd5198908befdb3d21d6c5ea9835a57njn // Whitespace after the +/- is not allowed; conversion fails. 415cf0a8b9a81ef7e826f0735341e1b50cbefa27ce0bart { .str = "+ 1", .res = 0, .endptr_val = '+' }, 416cf0a8b9a81ef7e826f0735341e1b50cbefa27ce0bart { .str = "-\n0x1", .res = 0, .endptr_val = '-' }, 417221666fbecd5198908befdb3d21d6c5ea9835a57njn }; 418221666fbecd5198908befdb3d21d6c5ea9835a57njn 419221666fbecd5198908befdb3d21d6c5ea9835a57njn // Nb: We test the results against strtoll() as well. 420221666fbecd5198908befdb3d21d6c5ea9835a57njn int i; 421221666fbecd5198908befdb3d21d6c5ea9835a57njn for (i = 0; i < (sizeof(a) / sizeof(StrtollInputs)); i++) { 42219f91bbaedb4caef8a60ce94b0f507193cc0bc10florian HChar* endptr1; 42319f91bbaedb4caef8a60ce94b0f507193cc0bc10florian HChar* endptr2; 424221666fbecd5198908befdb3d21d6c5ea9835a57njn Long res1 = VG_(strtoll16)(a[i].str, &endptr1); 425221666fbecd5198908befdb3d21d6c5ea9835a57njn long long res2 = strtoll (a[i].str, &endptr2, 16); 426221666fbecd5198908befdb3d21d6c5ea9835a57njn //printf(" res1 = %lld, *endptr1 = '%c'\n", res1, *endptr1); 427221666fbecd5198908befdb3d21d6c5ea9835a57njn //printf(" res2 = %lld, *endptr2 = '%c'\n", res2, *endptr2); 4282a5a76b43b99c5a62c16140505a7f9fcbc0a5fb4njn CHECK(a[i].res == res1 && a[i].endptr_val == *endptr1); 4292a5a76b43b99c5a62c16140505a7f9fcbc0a5fb4njn CHECK(res2 == res1 && *endptr2 == *endptr1); 430221666fbecd5198908befdb3d21d6c5ea9835a57njn } 431221666fbecd5198908befdb3d21d6c5ea9835a57njn } 432221666fbecd5198908befdb3d21d6c5ea9835a57njn 4332a5a76b43b99c5a62c16140505a7f9fcbc0a5fb4njn // VG_(strtod)() 4342a5a76b43b99c5a62c16140505a7f9fcbc0a5fb4njn // XXX: todo 435221666fbecd5198908befdb3d21d6c5ea9835a57njn} 436221666fbecd5198908befdb3d21d6c5ea9835a57njn 437132fdb03f69d704bb4777831936e169bd2380242njnvoid test_log2(void) 438132fdb03f69d704bb4777831936e169bd2380242njn{ 439132fdb03f69d704bb4777831936e169bd2380242njn CHECK( -1 == VG_(log2)(0) ); 440132fdb03f69d704bb4777831936e169bd2380242njn CHECK( 0 == VG_(log2)(1) ); 441132fdb03f69d704bb4777831936e169bd2380242njn CHECK( 1 == VG_(log2)(2) ); 442132fdb03f69d704bb4777831936e169bd2380242njn CHECK( -1 == VG_(log2)(3) ); 443132fdb03f69d704bb4777831936e169bd2380242njn CHECK( 2 == VG_(log2)(4) ); 444132fdb03f69d704bb4777831936e169bd2380242njn CHECK( -1 == VG_(log2)(5) ); 445132fdb03f69d704bb4777831936e169bd2380242njn CHECK( -1 == VG_(log2)(6) ); 446132fdb03f69d704bb4777831936e169bd2380242njn CHECK( -1 == VG_(log2)(7) ); 447132fdb03f69d704bb4777831936e169bd2380242njn CHECK( 3 == VG_(log2)(8) ); 448132fdb03f69d704bb4777831936e169bd2380242njn 449132fdb03f69d704bb4777831936e169bd2380242njn CHECK( -1 == VG_(log2)( 15) ); 450132fdb03f69d704bb4777831936e169bd2380242njn CHECK( 4 == VG_(log2)( 16) ); 451132fdb03f69d704bb4777831936e169bd2380242njn CHECK( -1 == VG_(log2)( 17) ); 452132fdb03f69d704bb4777831936e169bd2380242njn 453132fdb03f69d704bb4777831936e169bd2380242njn CHECK( -1 == VG_(log2)( 63) ); 454132fdb03f69d704bb4777831936e169bd2380242njn CHECK( 6 == VG_(log2)( 64) ); 455132fdb03f69d704bb4777831936e169bd2380242njn CHECK( -1 == VG_(log2)( 65) ); 456132fdb03f69d704bb4777831936e169bd2380242njn 457132fdb03f69d704bb4777831936e169bd2380242njn CHECK( -1 == VG_(log2)(255) ); 458132fdb03f69d704bb4777831936e169bd2380242njn CHECK( 8 == VG_(log2)(256) ); 459132fdb03f69d704bb4777831936e169bd2380242njn CHECK( -1 == VG_(log2)(257) ); 460132fdb03f69d704bb4777831936e169bd2380242njn 461132fdb03f69d704bb4777831936e169bd2380242njn CHECK( -1 == VG_(log2)(65535) ); 462132fdb03f69d704bb4777831936e169bd2380242njn CHECK( 16 == VG_(log2)(65536) ); 463132fdb03f69d704bb4777831936e169bd2380242njn CHECK( -1 == VG_(log2)(65537) ); 464132fdb03f69d704bb4777831936e169bd2380242njn 465132fdb03f69d704bb4777831936e169bd2380242njn CHECK( -1 == VG_(log2)(16777215) ); 466132fdb03f69d704bb4777831936e169bd2380242njn CHECK( 24 == VG_(log2)(16777216) ); 467132fdb03f69d704bb4777831936e169bd2380242njn CHECK( -1 == VG_(log2)(16777217) ); 468132fdb03f69d704bb4777831936e169bd2380242njn 469132fdb03f69d704bb4777831936e169bd2380242njn CHECK( -1 == VG_(log2)(2147483647U) ); 470132fdb03f69d704bb4777831936e169bd2380242njn CHECK( 31 == VG_(log2)(2147483648U) ); 471132fdb03f69d704bb4777831936e169bd2380242njn CHECK( -1 == VG_(log2)(2147483649U) ); 472132fdb03f69d704bb4777831936e169bd2380242njn 473132fdb03f69d704bb4777831936e169bd2380242njn CHECK( -1 == VG_(log2)(4294967295U) ); // Max UInt 474132fdb03f69d704bb4777831936e169bd2380242njn} 475132fdb03f69d704bb4777831936e169bd2380242njn 476132fdb03f69d704bb4777831936e169bd2380242njnvoid test_random(void) 477132fdb03f69d704bb4777831936e169bd2380242njn{ 478132fdb03f69d704bb4777831936e169bd2380242njn // Hmm, it's really hard to unit test a pseudo-random number generator. 479132fdb03f69d704bb4777831936e169bd2380242njn // So no testing here, sorry. 480132fdb03f69d704bb4777831936e169bd2380242njn} 481132fdb03f69d704bb4777831936e169bd2380242njn 482132fdb03f69d704bb4777831936e169bd2380242njn//----------------------------------------------------------------------- 483132fdb03f69d704bb4777831936e169bd2380242njn// main 484132fdb03f69d704bb4777831936e169bd2380242njn//----------------------------------------------------------------------- 485132fdb03f69d704bb4777831936e169bd2380242njn 486221666fbecd5198908befdb3d21d6c5ea9835a57njnint main(void) 487221666fbecd5198908befdb3d21d6c5ea9835a57njn{ 488132fdb03f69d704bb4777831936e169bd2380242njn // Nb: the order of the tests is based on the order of the code in 489132fdb03f69d704bb4777831936e169bd2380242njn // m_libcbase.c, except that macros defined in pub_tool_libcbase.h are 490132fdb03f69d704bb4777831936e169bd2380242njn // tested first. 491132fdb03f69d704bb4777831936e169bd2380242njn 492221666fbecd5198908befdb3d21d6c5ea9835a57njn //-------------------------------------------------------------------- 493132fdb03f69d704bb4777831936e169bd2380242njn // pub_tool_libcbase.h macros 494221666fbecd5198908befdb3d21d6c5ea9835a57njn //-------------------------------------------------------------------- 495132fdb03f69d704bb4777831936e169bd2380242njn test_VG_STREQ(); 496132fdb03f69d704bb4777831936e169bd2380242njn test_VG_STREQN(); 49729a100cbcd50426b422cac5c855b38384c7c37c5njn test_VG_IS_XYZ_ALIGNED(); 498132fdb03f69d704bb4777831936e169bd2380242njn test_VG_ROUND_et_al(); 499221666fbecd5198908befdb3d21d6c5ea9835a57njn 500221666fbecd5198908befdb3d21d6c5ea9835a57njn //-------------------------------------------------------------------- 501221666fbecd5198908befdb3d21d6c5ea9835a57njn // Char functions 502221666fbecd5198908befdb3d21d6c5ea9835a57njn //-------------------------------------------------------------------- 503132fdb03f69d704bb4777831936e169bd2380242njn test_isspace(); 504132fdb03f69d704bb4777831936e169bd2380242njn test_isdigit(); 505221666fbecd5198908befdb3d21d6c5ea9835a57njn 506221666fbecd5198908befdb3d21d6c5ea9835a57njn //-------------------------------------------------------------------- 507221666fbecd5198908befdb3d21d6c5ea9835a57njn // String-to-number functions 508221666fbecd5198908befdb3d21d6c5ea9835a57njn //-------------------------------------------------------------------- 509132fdb03f69d704bb4777831936e169bd2380242njn test_is_dec_digit(); 510132fdb03f69d704bb4777831936e169bd2380242njn test_is_hex_digit(); 511132fdb03f69d704bb4777831936e169bd2380242njn test_strtoll_and_strtod(); 512221666fbecd5198908befdb3d21d6c5ea9835a57njn 513221666fbecd5198908befdb3d21d6c5ea9835a57njn //-------------------------------------------------------------------- 514221666fbecd5198908befdb3d21d6c5ea9835a57njn // String functions 515221666fbecd5198908befdb3d21d6c5ea9835a57njn //-------------------------------------------------------------------- 516132fdb03f69d704bb4777831936e169bd2380242njn // XXX: more todo: VG_(str_*) 517221666fbecd5198908befdb3d21d6c5ea9835a57njn 518221666fbecd5198908befdb3d21d6c5ea9835a57njn //-------------------------------------------------------------------- 519221666fbecd5198908befdb3d21d6c5ea9835a57njn // Mem functions 520221666fbecd5198908befdb3d21d6c5ea9835a57njn //-------------------------------------------------------------------- 521132fdb03f69d704bb4777831936e169bd2380242njn // XXX: todo: VG_(mem*) 522221666fbecd5198908befdb3d21d6c5ea9835a57njn 523221666fbecd5198908befdb3d21d6c5ea9835a57njn //-------------------------------------------------------------------- 524221666fbecd5198908befdb3d21d6c5ea9835a57njn // Miscellaneous functions 525221666fbecd5198908befdb3d21d6c5ea9835a57njn //-------------------------------------------------------------------- 526132fdb03f69d704bb4777831936e169bd2380242njn // XXX: todo: VG_(ssort) 527132fdb03f69d704bb4777831936e169bd2380242njn test_log2(); 528132fdb03f69d704bb4777831936e169bd2380242njn test_random(); 529221666fbecd5198908befdb3d21d6c5ea9835a57njn 530221666fbecd5198908befdb3d21d6c5ea9835a57njn return 0; 531221666fbecd5198908befdb3d21d6c5ea9835a57njn} 532221666fbecd5198908befdb3d21d6c5ea9835a57njn 533