From 27d6fefdc0441c1fa62318d9a354328e30aa2f87 Mon Sep 17 00:00:00 2001 From: Szabolcs Nagy Date: Thu, 1 Aug 2013 22:29:14 +0000 Subject: [PATCH] string tests (memcpy, memset) --- src/functional/string.c | 3 +- src/functional/string_memcpy.c | 55 +++++++++++++++++++++++++++ src/functional/string_memset.c | 68 ++++++++++++++++++++++++++++++++++ 3 files changed, 124 insertions(+), 2 deletions(-) create mode 100644 src/functional/string_memcpy.c create mode 100644 src/functional/string_memset.c diff --git a/src/functional/string.c b/src/functional/string.c index 5d5d43c..1d159f4 100644 --- a/src/functional/string.c +++ b/src/functional/string.c @@ -78,7 +78,6 @@ int main(void) TEST(s, strtok(NULL, " ;"), b+16, "%p != %p"); TEST_S(s, "foo", "strtok result"); -#ifdef HAVE_BSD_STRL memset(b, 'x', sizeof b); TEST(i, strlcpy(b, "abc", sizeof b - 1), 3, "length %d != %d"); TEST(i, b[3], 0, "strlcpy did not null-terminate short string (%d)"); @@ -111,6 +110,6 @@ int main(void) memcpy(b, "abc\0\0\0x\0", 8); TEST(i, strlcat(b, "123", 3), 6, "length %d != %d"); TEST_S(b, "abc", "strlcat result"); -#endif + return t_status; } diff --git a/src/functional/string_memcpy.c b/src/functional/string_memcpy.c new file mode 100644 index 0000000..9d8c208 --- /dev/null +++ b/src/functional/string_memcpy.c @@ -0,0 +1,55 @@ +#include +#include +#include +#include "test.h" + +static char buf[512]; + +static void *(*volatile pmemcpy)(void *restrict, const void *restrict, size_t); + +static void *aligned(void *p) { + return (void*)(((uintptr_t)p + 63) & -64U); +} + +#define N 80 +static void test_align(int dalign, int salign, int len) +{ + char *src = aligned(buf); + char *dst = aligned(buf + 128); + char *want = aligned(buf + 256); + char *p; + int i; + + if (salign + len > N || dalign + len > N) + abort(); + for (i = 0; i < N; i++) { + src[i] = '#'; + dst[i] = want[i] = ' '; + } + for (i = 0; i < len; i++) + src[salign+i] = want[dalign+i] = '0'+i; + p = pmemcpy(dst+dalign, src+salign, len); + if (p != dst+dalign) + t_error("memcpy(%p,...) returned %p\n", dst+dalign, p); + for (i = 0; i < N; i++) + if (dst[i] != want[i]) { + t_error("memcpy(align %d, align %d, %d) failed\n", dalign, salign, len); + t_printf("got : %.*s\n", dalign+len+1, dst); + t_printf("want: %.*s\n", dalign+len+1, want); + break; + } +} + +int main(void) +{ + int i,j,k; + + pmemcpy = memcpy; + + for (i = 0; i < 16; i++) + for (j = 0; j < 16; j++) + for (k = 0; k < 64; k++) + test_align(i,j,k); + + return t_status; +} diff --git a/src/functional/string_memset.c b/src/functional/string_memset.c new file mode 100644 index 0000000..719f0ca --- /dev/null +++ b/src/functional/string_memset.c @@ -0,0 +1,68 @@ +#include +#include +#include +#include "test.h" + +static char buf[512]; + +static void *(*volatile pmemset)(void *, int, size_t); + +static void *aligned(void *p) +{ + return (void*)(((uintptr_t)p + 63) & -64U); +} + +#define N 80 +static void test_align(int align, int len) +{ + char *s = aligned(buf); + char *want = aligned(buf + 256); + char *p; + int i; + + if (align + len > N) + abort(); + for (i = 0; i < N; i++) + s[i] = want[i] = ' '; + for (i = 0; i < len; i++) + want[align+i] = '#'; + p = pmemset(s+align, '#', len); + if (p != s+align) + t_error("memset(%p,...) returned %p\n", s+align, p); + for (i = 0; i < N; i++) + if (s[i] != want[i]) { + t_error("memset(align %d, '#', %d) failed\n", align, len); + t_printf("got : %.*s\n", align+len+1, s); + t_printf("want: %.*s\n", align+len+1, want); + break; + } +} + +static void test_value(int c) +{ + int i; + + pmemset(buf, c, 10); + for (i = 0; i < 10; i++) + if ((unsigned char)buf[i] != (unsigned char)c) { + t_error("memset(%d) failed: got %d\n", c, buf[i]); + break; + } +} + +int main(void) +{ + int i,j,k; + + pmemset = memset; + + for (i = 0; i < 16; i++) + for (j = 0; j < 64; j++) + test_align(i,j); + + test_value('c'); + test_value(0); + test_value(-1); + test_value(0xab); + return t_status; +} -- 2.20.1