add memset(buf, -5, 10) test
[libc-test] / src / functional / string_memset.c
1 #include <string.h>
2 #include <stdlib.h>
3 #include <stdint.h>
4 #include "test.h"
5
6 static char buf[512];
7
8 static void *(*volatile pmemset)(void *, int, size_t);
9
10 static void *aligned(void *p)
11 {
12         return (void*)(((uintptr_t)p + 63) & -64U);
13 }
14
15 #define N 80
16 static void test_align(int align, int len)
17 {
18         char *s = aligned(buf);
19         char *want = aligned(buf + 256);
20         char *p;
21         int i;
22
23         if (align + len > N)
24                 abort();
25         for (i = 0; i < N; i++)
26                 s[i] = want[i] = ' ';
27         for (i = 0; i < len; i++)
28                 want[align+i] = '#';
29         p = pmemset(s+align, '#', len);
30         if (p != s+align)
31                 t_error("memset(%p,...) returned %p\n", s+align, p);
32         for (i = 0; i < N; i++)
33                 if (s[i] != want[i]) {
34                         t_error("memset(align %d, '#', %d) failed\n", align, len);
35                         t_printf("got : %.*s\n", align+len+1, s);
36                         t_printf("want: %.*s\n", align+len+1, want);
37                         break;
38                 }
39 }
40
41 static void test_value(int c)
42 {
43         int i;
44
45         pmemset(buf, c, 10);
46         for (i = 0; i < 10; i++)
47                 if ((unsigned char)buf[i] != (unsigned char)c) {
48                         t_error("memset(%d) failed: got %d\n", c, buf[i]);
49                         break;
50                 }
51 }
52
53 int main(void)
54 {
55         int i,j,k;
56
57         pmemset = memset;
58
59         for (i = 0; i < 16; i++)
60                 for (j = 0; j < 64; j++)
61                         test_align(i,j);
62
63         test_value('c');
64         test_value(0);
65         test_value(-1);
66         test_value(-5);
67         test_value(0xab);
68         return t_status;
69 }