string test alignment fix by Mahesh Bodapati
[libc-test] / src / functional / string_strchr.c
1 #include <string.h>
2 #include "test.h"
3
4 static char buf[512];
5
6 static void *aligned(void *p)
7 {
8         return (void*)(((uintptr_t)p + 63) & -64);
9 }
10
11 static void *aligncpy(void *p, size_t len, size_t a)
12 {
13         return memcpy((char*)aligned(buf)+a, p, len);
14 }
15
16 #define N(s, c) { \
17         int align; \
18         for (align=0; align<8; align++) { \
19                 char *p = aligncpy(s, sizeof s, align); \
20                 char *q = strchr(p, c); \
21                 if (q) \
22                         t_error("strchr(%s,%s) with align=%d returned str+%d, wanted 0\n", #s, #c, align, q-p); \
23         } \
24 }
25
26 #define T(s, c, n) { \
27         int align; \
28         for (align=0; align<8; align++) { \
29                 char *p = aligncpy(s, sizeof s, align); \
30                 char *q = strchr(p, c); \
31                 if (q == 0) \
32                         t_error("strchr(%s,%s) with align=%d returned 0, wanted str+%d\n", #s, #c, align, n); \
33                 else if (q - p != n) \
34                         t_error("strchr(%s,%s) with align=%d returned str+%d, wanted str+%d\n", #s, #c, align, q-p, n); \
35         } \
36 }
37
38 int main(void)
39 {
40         int i;
41         char a[128];
42         char s[256];
43
44         for (i = 0; i < 128; i++)
45                 a[i] = (i+1) & 127;
46         for (i = 0; i < 256; i++)
47                 *((unsigned char*)s+i) = i+1;
48
49         N("\0aaa", 'a')
50         N("a\0bb", 'b')
51         N("ab\0c", 'c')
52         N("abc\0d", 'd')
53         N("abc abc\0x", 'x')
54         N(a, 128)
55         N(a, 255)
56
57         T("", 0, 0)
58         T("a", 'a', 0)
59         T("a", 'a'+256, 0)
60         T("a", 0, 1)
61         T("abb", 'b', 1)
62         T("aabb", 'b', 2)
63         T("aaabb", 'b', 3)
64         T("aaaabb", 'b', 4)
65         T("aaaaabb", 'b', 5)
66         T("aaaaaabb", 'b', 6)
67         T("abc abc", 'c', 2)
68         T(s, 1, 0)
69         T(s, 2, 1)
70         T(s, 10, 9)
71         T(s, 11, 10)
72         T(s, 127, 126)
73         T(s, 128, 127)
74         T(s, 255, 254)
75         T(s, 0, 255)
76
77         return t_status;
78 }