string tests (memcpy, memset)
authorSzabolcs Nagy <nsz@port70.net>
Thu, 1 Aug 2013 22:29:14 +0000 (22:29 +0000)
committerSzabolcs Nagy <nsz@port70.net>
Thu, 1 Aug 2013 22:29:14 +0000 (22:29 +0000)
src/functional/string.c
src/functional/string_memcpy.c [new file with mode: 0644]
src/functional/string_memset.c [new file with mode: 0644]

index 5d5d43c..1d159f4 100644 (file)
@@ -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 (file)
index 0000000..9d8c208
--- /dev/null
@@ -0,0 +1,55 @@
+#include <string.h>
+#include <stdlib.h>
+#include <stdint.h>
+#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 (file)
index 0000000..719f0ca
--- /dev/null
@@ -0,0 +1,68 @@
+#include <string.h>
+#include <stdlib.h>
+#include <stdint.h>
+#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;
+}