1*57718be8SEnji Cooper /* $NetBSD: t_memchr.c,v 1.3 2012/04/06 07:53:10 jruoho Exp $ */ 2*57718be8SEnji Cooper 3*57718be8SEnji Cooper /* 4*57718be8SEnji Cooper * Written by J.T. Conklin <jtc@acorntoolworks.com> 5*57718be8SEnji Cooper * Public domain. 6*57718be8SEnji Cooper */ 7*57718be8SEnji Cooper 8*57718be8SEnji Cooper #include <atf-c.h> 9*57718be8SEnji Cooper #include <string.h> 10*57718be8SEnji Cooper #include <unistd.h> 11*57718be8SEnji Cooper #include <stdio.h> 12*57718be8SEnji Cooper #include <stdlib.h> 13*57718be8SEnji Cooper 14*57718be8SEnji Cooper ATF_TC(memchr_basic); 15*57718be8SEnji Cooper ATF_TC_HEAD(memchr_basic, tc) 16*57718be8SEnji Cooper { 17*57718be8SEnji Cooper atf_tc_set_md_var(tc, "descr", "Test memchr(3) results, #1"); 18*57718be8SEnji Cooper } 19*57718be8SEnji Cooper 20*57718be8SEnji Cooper ATF_TC_BODY(memchr_basic, tc) 21*57718be8SEnji Cooper { 22*57718be8SEnji Cooper /* try to trick the compiler */ 23*57718be8SEnji Cooper void * (*f)(const void *, int, size_t) = memchr; 24*57718be8SEnji Cooper 25*57718be8SEnji Cooper unsigned int a, t; 26*57718be8SEnji Cooper void *off, *off2; 27*57718be8SEnji Cooper char buf[32]; 28*57718be8SEnji Cooper 29*57718be8SEnji Cooper struct tab { 30*57718be8SEnji Cooper const char *val; 31*57718be8SEnji Cooper size_t len; 32*57718be8SEnji Cooper char match; 33*57718be8SEnji Cooper ssize_t off; 34*57718be8SEnji Cooper }; 35*57718be8SEnji Cooper 36*57718be8SEnji Cooper const struct tab tab[] = { 37*57718be8SEnji Cooper { "", 0, 0, 0 }, 38*57718be8SEnji Cooper 39*57718be8SEnji Cooper { "/", 0, 0, 0 }, 40*57718be8SEnji Cooper { "/", 1, 1, 0 }, 41*57718be8SEnji Cooper { "/a", 2, 1, 0 }, 42*57718be8SEnji Cooper { "/ab", 3, 1, 0 }, 43*57718be8SEnji Cooper { "/abc", 4, 1, 0 }, 44*57718be8SEnji Cooper { "/abcd", 5, 1, 0 }, 45*57718be8SEnji Cooper { "/abcde", 6, 1, 0 }, 46*57718be8SEnji Cooper { "/abcdef", 7, 1, 0 }, 47*57718be8SEnji Cooper { "/abcdefg", 8, 1, 0 }, 48*57718be8SEnji Cooper 49*57718be8SEnji Cooper { "a/", 1, 0, 0 }, 50*57718be8SEnji Cooper { "a/", 2, 1, 1 }, 51*57718be8SEnji Cooper { "a/b", 3, 1, 1 }, 52*57718be8SEnji Cooper { "a/bc", 4, 1, 1 }, 53*57718be8SEnji Cooper { "a/bcd", 5, 1, 1 }, 54*57718be8SEnji Cooper { "a/bcde", 6, 1, 1 }, 55*57718be8SEnji Cooper { "a/bcdef", 7, 1, 1 }, 56*57718be8SEnji Cooper { "a/bcdefg", 8, 1, 1 }, 57*57718be8SEnji Cooper 58*57718be8SEnji Cooper { "ab/", 2, 0, 0 }, 59*57718be8SEnji Cooper { "ab/", 3, 1, 2 }, 60*57718be8SEnji Cooper { "ab/c", 4, 1, 2 }, 61*57718be8SEnji Cooper { "ab/cd", 5, 1, 2 }, 62*57718be8SEnji Cooper { "ab/cde", 6, 1, 2 }, 63*57718be8SEnji Cooper { "ab/cdef", 7, 1, 2 }, 64*57718be8SEnji Cooper { "ab/cdefg", 8, 1, 2 }, 65*57718be8SEnji Cooper 66*57718be8SEnji Cooper { "abc/", 3, 0, 0 }, 67*57718be8SEnji Cooper { "abc/", 4, 1, 3 }, 68*57718be8SEnji Cooper { "abc/d", 5, 1, 3 }, 69*57718be8SEnji Cooper { "abc/de", 6, 1, 3 }, 70*57718be8SEnji Cooper { "abc/def", 7, 1, 3 }, 71*57718be8SEnji Cooper { "abc/defg", 8, 1, 3 }, 72*57718be8SEnji Cooper 73*57718be8SEnji Cooper { "abcd/", 4, 0, 0 }, 74*57718be8SEnji Cooper { "abcd/", 5, 1, 4 }, 75*57718be8SEnji Cooper { "abcd/e", 6, 1, 4 }, 76*57718be8SEnji Cooper { "abcd/ef", 7, 1, 4 }, 77*57718be8SEnji Cooper { "abcd/efg", 8, 1, 4 }, 78*57718be8SEnji Cooper 79*57718be8SEnji Cooper { "abcde/", 5, 0, 0 }, 80*57718be8SEnji Cooper { "abcde/", 6, 1, 5 }, 81*57718be8SEnji Cooper { "abcde/f", 7, 1, 5 }, 82*57718be8SEnji Cooper { "abcde/fg", 8, 1, 5 }, 83*57718be8SEnji Cooper 84*57718be8SEnji Cooper { "abcdef/", 6, 0, 0 }, 85*57718be8SEnji Cooper { "abcdef/", 7, 1, 6 }, 86*57718be8SEnji Cooper { "abcdef/g", 8, 1, 6 }, 87*57718be8SEnji Cooper 88*57718be8SEnji Cooper { "abcdefg/", 7, 0, 0 }, 89*57718be8SEnji Cooper { "abcdefg/", 8, 1, 7 }, 90*57718be8SEnji Cooper 91*57718be8SEnji Cooper { "\xff\xff\xff\xff" "efg/", 8, 1, 7 }, 92*57718be8SEnji Cooper { "a" "\xff\xff\xff\xff" "fg/", 8, 1, 7 }, 93*57718be8SEnji Cooper { "ab" "\xff\xff\xff\xff" "g/", 8, 1, 7 }, 94*57718be8SEnji Cooper { "abc" "\xff\xff\xff\xff" "/", 8, 1, 7 }, 95*57718be8SEnji Cooper }; 96*57718be8SEnji Cooper 97*57718be8SEnji Cooper for (a = 1; a < 1 + sizeof(long); ++a) { 98*57718be8SEnji Cooper for (t = 0; t < (sizeof(tab) / sizeof(tab[0])); ++t) { 99*57718be8SEnji Cooper buf[a-1] = '/'; 100*57718be8SEnji Cooper strcpy(&buf[a], tab[t].val); 101*57718be8SEnji Cooper 102*57718be8SEnji Cooper off = f(&buf[a], '/', tab[t].len); 103*57718be8SEnji Cooper if (tab[t].match == 0) { 104*57718be8SEnji Cooper if (off != 0) { 105*57718be8SEnji Cooper fprintf(stderr, "a = %d, t = %d\n", 106*57718be8SEnji Cooper a, t); 107*57718be8SEnji Cooper atf_tc_fail("should not have found " 108*57718be8SEnji Cooper " char past len"); 109*57718be8SEnji Cooper } 110*57718be8SEnji Cooper } else if (tab[t].match == 1) { 111*57718be8SEnji Cooper if (tab[t].off != ((char*)off - &buf[a])) { 112*57718be8SEnji Cooper fprintf(stderr, "a = %d, t = %d\n", 113*57718be8SEnji Cooper a, t); 114*57718be8SEnji Cooper atf_tc_fail("char not found at " 115*57718be8SEnji Cooper "correct offset"); 116*57718be8SEnji Cooper } 117*57718be8SEnji Cooper } else { 118*57718be8SEnji Cooper fprintf(stderr, "a = %d, t = %d\n", a, t); 119*57718be8SEnji Cooper atf_tc_fail("Corrupt test case data"); 120*57718be8SEnji Cooper } 121*57718be8SEnji Cooper 122*57718be8SEnji Cooper /* check zero extension of char arg */ 123*57718be8SEnji Cooper off2 = f(&buf[a], 0xffffff00 | '/', tab[t].len); 124*57718be8SEnji Cooper if (off2 != off) 125*57718be8SEnji Cooper atf_tc_fail("zero extension of char arg " 126*57718be8SEnji Cooper "failed"); 127*57718be8SEnji Cooper } 128*57718be8SEnji Cooper } 129*57718be8SEnji Cooper } 130*57718be8SEnji Cooper 131*57718be8SEnji Cooper ATF_TC(memchr_simple); 132*57718be8SEnji Cooper ATF_TC_HEAD(memchr_simple, tc) 133*57718be8SEnji Cooper { 134*57718be8SEnji Cooper atf_tc_set_md_var(tc, "descr", "Test memchr(3) results, #2"); 135*57718be8SEnji Cooper } 136*57718be8SEnji Cooper 137*57718be8SEnji Cooper ATF_TC_BODY(memchr_simple, tc) 138*57718be8SEnji Cooper { 139*57718be8SEnji Cooper char buf[] = "abcdefg"; 140*57718be8SEnji Cooper short i = 7; 141*57718be8SEnji Cooper 142*57718be8SEnji Cooper ATF_CHECK(memchr(buf, 'a', 0) == NULL); 143*57718be8SEnji Cooper ATF_CHECK(memchr(buf, 'g', 0) == NULL); 144*57718be8SEnji Cooper ATF_CHECK(memchr(buf, 'x', 7) == NULL); 145*57718be8SEnji Cooper 146*57718be8SEnji Cooper ATF_CHECK(memchr("\0", 'x', 0) == NULL); 147*57718be8SEnji Cooper ATF_CHECK(memchr("\0", 'x', 1) == NULL); 148*57718be8SEnji Cooper 149*57718be8SEnji Cooper while (i <= 14) { 150*57718be8SEnji Cooper 151*57718be8SEnji Cooper ATF_CHECK(memchr(buf, 'a', i) == buf + 0); 152*57718be8SEnji Cooper ATF_CHECK(memchr(buf, 'b', i) == buf + 1); 153*57718be8SEnji Cooper ATF_CHECK(memchr(buf, 'c', i) == buf + 2); 154*57718be8SEnji Cooper ATF_CHECK(memchr(buf, 'd', i) == buf + 3); 155*57718be8SEnji Cooper ATF_CHECK(memchr(buf, 'e', i) == buf + 4); 156*57718be8SEnji Cooper ATF_CHECK(memchr(buf, 'f', i) == buf + 5); 157*57718be8SEnji Cooper ATF_CHECK(memchr(buf, 'g', i) == buf + 6); 158*57718be8SEnji Cooper 159*57718be8SEnji Cooper i *= 2; 160*57718be8SEnji Cooper } 161*57718be8SEnji Cooper } 162*57718be8SEnji Cooper 163*57718be8SEnji Cooper ATF_TC(memrchr_simple); 164*57718be8SEnji Cooper ATF_TC_HEAD(memrchr_simple, tc) 165*57718be8SEnji Cooper { 166*57718be8SEnji Cooper atf_tc_set_md_var(tc, "descr", "Test memrchr(3) results"); 167*57718be8SEnji Cooper } 168*57718be8SEnji Cooper 169*57718be8SEnji Cooper ATF_TC_BODY(memrchr_simple, tc) 170*57718be8SEnji Cooper { 171*57718be8SEnji Cooper char buf[] = "abcdabcd"; 172*57718be8SEnji Cooper 173*57718be8SEnji Cooper ATF_CHECK(memrchr(buf, 'a', 0) == NULL); 174*57718be8SEnji Cooper ATF_CHECK(memrchr(buf, 'g', 0) == NULL); 175*57718be8SEnji Cooper ATF_CHECK(memrchr(buf, 'x', 8) == NULL); 176*57718be8SEnji Cooper 177*57718be8SEnji Cooper ATF_CHECK(memrchr("\0", 'x', 0) == NULL); 178*57718be8SEnji Cooper ATF_CHECK(memrchr("\0", 'x', 1) == NULL); 179*57718be8SEnji Cooper 180*57718be8SEnji Cooper ATF_CHECK(memrchr(buf, 'a', 8) == buf + 4); 181*57718be8SEnji Cooper ATF_CHECK(memrchr(buf, 'b', 8) == buf + 5); 182*57718be8SEnji Cooper ATF_CHECK(memrchr(buf, 'c', 8) == buf + 6); 183*57718be8SEnji Cooper ATF_CHECK(memrchr(buf, 'd', 8) == buf + 7); 184*57718be8SEnji Cooper } 185*57718be8SEnji Cooper 186*57718be8SEnji Cooper ATF_TP_ADD_TCS(tp) 187*57718be8SEnji Cooper { 188*57718be8SEnji Cooper 189*57718be8SEnji Cooper ATF_TP_ADD_TC(tp, memchr_basic); 190*57718be8SEnji Cooper ATF_TP_ADD_TC(tp, memchr_simple); 191*57718be8SEnji Cooper ATF_TP_ADD_TC(tp, memrchr_simple); 192*57718be8SEnji Cooper 193*57718be8SEnji Cooper return atf_no_error(); 194*57718be8SEnji Cooper } 195