1570af302Sopenharmony_ci#include <string.h>
2570af302Sopenharmony_ci#include "test.h"
3570af302Sopenharmony_ci
4570af302Sopenharmony_cistatic char buf[512];
5570af302Sopenharmony_ci
6570af302Sopenharmony_cistatic void *aligned(void *p)
7570af302Sopenharmony_ci{
8570af302Sopenharmony_ci	return (void*)(((uintptr_t)p + 63) & -64);
9570af302Sopenharmony_ci}
10570af302Sopenharmony_ci
11570af302Sopenharmony_cistatic void *aligncpy(void *p, size_t len, size_t a)
12570af302Sopenharmony_ci{
13570af302Sopenharmony_ci	return memcpy((char*)aligned(buf)+a, p, len);
14570af302Sopenharmony_ci}
15570af302Sopenharmony_ci
16570af302Sopenharmony_ci#define N(s, c) { \
17570af302Sopenharmony_ci	int align; \
18570af302Sopenharmony_ci	for (align=0; align<8; align++) { \
19570af302Sopenharmony_ci		char *p = aligncpy(s, sizeof s, align); \
20570af302Sopenharmony_ci		char *q = strchr(p, c); \
21570af302Sopenharmony_ci		if (q) \
22570af302Sopenharmony_ci			t_error("strchr(%s,%s) with align=%d returned str+%d, wanted 0\n", #s, #c, align, q-p); \
23570af302Sopenharmony_ci	} \
24570af302Sopenharmony_ci}
25570af302Sopenharmony_ci
26570af302Sopenharmony_ci#define T(s, c, n) { \
27570af302Sopenharmony_ci	int align; \
28570af302Sopenharmony_ci	for (align=0; align<8; align++) { \
29570af302Sopenharmony_ci		char *p = aligncpy(s, sizeof s, align); \
30570af302Sopenharmony_ci		char *q = strchr(p, c); \
31570af302Sopenharmony_ci		if (q == 0) \
32570af302Sopenharmony_ci			t_error("strchr(%s,%s) with align=%d returned 0, wanted str+%d\n", #s, #c, align, n); \
33570af302Sopenharmony_ci		else if (q - p != n) \
34570af302Sopenharmony_ci			t_error("strchr(%s,%s) with align=%d returned str+%d, wanted str+%d\n", #s, #c, align, q-p, n); \
35570af302Sopenharmony_ci	} \
36570af302Sopenharmony_ci}
37570af302Sopenharmony_ci
38570af302Sopenharmony_ciint main(void)
39570af302Sopenharmony_ci{
40570af302Sopenharmony_ci	int i;
41570af302Sopenharmony_ci	char a[128];
42570af302Sopenharmony_ci	char s[256];
43570af302Sopenharmony_ci
44570af302Sopenharmony_ci	for (i = 0; i < 128; i++)
45570af302Sopenharmony_ci		a[i] = (i+1) & 127;
46570af302Sopenharmony_ci	for (i = 0; i < 256; i++)
47570af302Sopenharmony_ci		*((unsigned char*)s+i) = i+1;
48570af302Sopenharmony_ci
49570af302Sopenharmony_ci	N("\0aaa", 'a')
50570af302Sopenharmony_ci	N("a\0bb", 'b')
51570af302Sopenharmony_ci	N("ab\0c", 'c')
52570af302Sopenharmony_ci	N("abc\0d", 'd')
53570af302Sopenharmony_ci	N("abc abc\0x", 'x')
54570af302Sopenharmony_ci	N(a, 128)
55570af302Sopenharmony_ci	N(a, 255)
56570af302Sopenharmony_ci
57570af302Sopenharmony_ci	T("", 0, 0)
58570af302Sopenharmony_ci	T("a", 'a', 0)
59570af302Sopenharmony_ci	T("a", 'a'+256, 0)
60570af302Sopenharmony_ci	T("a", 0, 1)
61570af302Sopenharmony_ci	T("abb", 'b', 1)
62570af302Sopenharmony_ci	T("aabb", 'b', 2)
63570af302Sopenharmony_ci	T("aaabb", 'b', 3)
64570af302Sopenharmony_ci	T("aaaabb", 'b', 4)
65570af302Sopenharmony_ci	T("aaaaabb", 'b', 5)
66570af302Sopenharmony_ci	T("aaaaaabb", 'b', 6)
67570af302Sopenharmony_ci	T("abc abc", 'c', 2)
68570af302Sopenharmony_ci	T(s, 1, 0)
69570af302Sopenharmony_ci	T(s, 2, 1)
70570af302Sopenharmony_ci	T(s, 10, 9)
71570af302Sopenharmony_ci	T(s, 11, 10)
72570af302Sopenharmony_ci	T(s, 127, 126)
73570af302Sopenharmony_ci	T(s, 128, 127)
74570af302Sopenharmony_ci	T(s, 255, 254)
75570af302Sopenharmony_ci	T(s, 0, 255)
76570af302Sopenharmony_ci
77570af302Sopenharmony_ci	return t_status;
78570af302Sopenharmony_ci}
79