1#include <string.h> 2#include "test.h" 3 4static char buf[512]; 5 6static void *aligned(void *p) 7{ 8 return (void*)(((uintptr_t)p + 63) & -64); 9} 10 11static 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 38int 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} 79