1*57718be8SEnji Cooper /* $NetBSD: t_strrchr.c,v 1.1 2011/07/07 08:59:33 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(strrchr_basic); 15*57718be8SEnji Cooper ATF_TC_HEAD(strrchr_basic, tc) 16*57718be8SEnji Cooper { 17*57718be8SEnji Cooper atf_tc_set_md_var(tc, "descr", "Test strrchr(3) results"); 18*57718be8SEnji Cooper } 19*57718be8SEnji Cooper 20*57718be8SEnji Cooper ATF_TC_BODY(strrchr_basic, tc) 21*57718be8SEnji Cooper { 22*57718be8SEnji Cooper /* try to trick the compiler */ 23*57718be8SEnji Cooper char * (*f)(const char *, int) = strrchr; 24*57718be8SEnji Cooper 25*57718be8SEnji Cooper unsigned int a, t; 26*57718be8SEnji Cooper char *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 char match; 32*57718be8SEnji Cooper ssize_t f_off; /* offset of first match */ 33*57718be8SEnji Cooper ssize_t l_off; /* offset of last match */ 34*57718be8SEnji Cooper }; 35*57718be8SEnji Cooper 36*57718be8SEnji Cooper const struct tab tab[] = { 37*57718be8SEnji Cooper { "", 0, 0, 0 }, 38*57718be8SEnji Cooper { "a", 0, 0, 0 }, 39*57718be8SEnji Cooper { "aa", 0, 0, 0 }, 40*57718be8SEnji Cooper { "abc", 0, 0, 0 }, 41*57718be8SEnji Cooper { "abcd", 0, 0, 0 }, 42*57718be8SEnji Cooper { "abcde", 0, 0, 0 }, 43*57718be8SEnji Cooper { "abcdef", 0, 0, 0 }, 44*57718be8SEnji Cooper { "abcdefg", 0, 0, 0 }, 45*57718be8SEnji Cooper { "abcdefgh", 0, 0, 0 }, 46*57718be8SEnji Cooper 47*57718be8SEnji Cooper { "/", 1, 0, 0 }, 48*57718be8SEnji Cooper { "//", 1, 0, 1 }, 49*57718be8SEnji Cooper { "/a", 1, 0, 0 }, 50*57718be8SEnji Cooper { "/a/", 1, 0, 2 }, 51*57718be8SEnji Cooper { "/ab", 1, 0, 0 }, 52*57718be8SEnji Cooper { "/ab/", 1, 0, 3 }, 53*57718be8SEnji Cooper { "/abc", 1, 0, 0 }, 54*57718be8SEnji Cooper { "/abc/", 1, 0, 4 }, 55*57718be8SEnji Cooper { "/abcd", 1, 0, 0 }, 56*57718be8SEnji Cooper { "/abcd/", 1, 0, 5 }, 57*57718be8SEnji Cooper { "/abcde", 1, 0, 0 }, 58*57718be8SEnji Cooper { "/abcde/", 1, 0, 6 }, 59*57718be8SEnji Cooper { "/abcdef", 1, 0, 0 }, 60*57718be8SEnji Cooper { "/abcdef/", 1, 0, 7 }, 61*57718be8SEnji Cooper { "/abcdefg", 1, 0, 0 }, 62*57718be8SEnji Cooper { "/abcdefg/", 1, 0, 8 }, 63*57718be8SEnji Cooper { "/abcdefgh", 1, 0, 0 }, 64*57718be8SEnji Cooper { "/abcdefgh/", 1, 0, 9 }, 65*57718be8SEnji Cooper 66*57718be8SEnji Cooper { "a/", 1, 1, 1 }, 67*57718be8SEnji Cooper { "a//", 1, 1, 2 }, 68*57718be8SEnji Cooper { "a/a", 1, 1, 1 }, 69*57718be8SEnji Cooper { "a/a/", 1, 1, 3 }, 70*57718be8SEnji Cooper { "a/ab", 1, 1, 1 }, 71*57718be8SEnji Cooper { "a/ab/", 1, 1, 4 }, 72*57718be8SEnji Cooper { "a/abc", 1, 1, 1 }, 73*57718be8SEnji Cooper { "a/abc/", 1, 1, 5 }, 74*57718be8SEnji Cooper { "a/abcd", 1, 1, 1 }, 75*57718be8SEnji Cooper { "a/abcd/", 1, 1, 6 }, 76*57718be8SEnji Cooper { "a/abcde", 1, 1, 1 }, 77*57718be8SEnji Cooper { "a/abcde/", 1, 1, 7 }, 78*57718be8SEnji Cooper { "a/abcdef", 1, 1, 1 }, 79*57718be8SEnji Cooper { "a/abcdef/", 1, 1, 8 }, 80*57718be8SEnji Cooper { "a/abcdefg", 1, 1, 1 }, 81*57718be8SEnji Cooper { "a/abcdefg/", 1, 1, 9 }, 82*57718be8SEnji Cooper { "a/abcdefgh", 1, 1, 1 }, 83*57718be8SEnji Cooper { "a/abcdefgh/", 1, 1, 10 }, 84*57718be8SEnji Cooper 85*57718be8SEnji Cooper { "ab/", 1, 2, 2 }, 86*57718be8SEnji Cooper { "ab//", 1, 2, 3 }, 87*57718be8SEnji Cooper { "ab/a", 1, 2, 2 }, 88*57718be8SEnji Cooper { "ab/a/", 1, 2, 4 }, 89*57718be8SEnji Cooper { "ab/ab", 1, 2, 2 }, 90*57718be8SEnji Cooper { "ab/ab/", 1, 2, 5 }, 91*57718be8SEnji Cooper { "ab/abc", 1, 2, 2 }, 92*57718be8SEnji Cooper { "ab/abc/", 1, 2, 6 }, 93*57718be8SEnji Cooper { "ab/abcd", 1, 2, 2 }, 94*57718be8SEnji Cooper { "ab/abcd/", 1, 2, 7 }, 95*57718be8SEnji Cooper { "ab/abcde", 1, 2, 2 }, 96*57718be8SEnji Cooper { "ab/abcde/", 1, 2, 8 }, 97*57718be8SEnji Cooper { "ab/abcdef", 1, 2, 2 }, 98*57718be8SEnji Cooper { "ab/abcdef/", 1, 2, 9 }, 99*57718be8SEnji Cooper { "ab/abcdefg", 1, 2, 2 }, 100*57718be8SEnji Cooper { "ab/abcdefg/", 1, 2, 10 }, 101*57718be8SEnji Cooper { "ab/abcdefgh", 1, 2, 2 }, 102*57718be8SEnji Cooper { "ab/abcdefgh/", 1, 2, 11 }, 103*57718be8SEnji Cooper 104*57718be8SEnji Cooper { "abc/", 1, 3, 3 }, 105*57718be8SEnji Cooper { "abc//", 1, 3, 4 }, 106*57718be8SEnji Cooper { "abc/a", 1, 3, 3 }, 107*57718be8SEnji Cooper { "abc/a/", 1, 3, 5 }, 108*57718be8SEnji Cooper { "abc/ab", 1, 3, 3 }, 109*57718be8SEnji Cooper { "abc/ab/", 1, 3, 6 }, 110*57718be8SEnji Cooper { "abc/abc", 1, 3, 3 }, 111*57718be8SEnji Cooper { "abc/abc/", 1, 3, 7 }, 112*57718be8SEnji Cooper { "abc/abcd", 1, 3, 3 }, 113*57718be8SEnji Cooper { "abc/abcd/", 1, 3, 8 }, 114*57718be8SEnji Cooper { "abc/abcde", 1, 3, 3 }, 115*57718be8SEnji Cooper { "abc/abcde/", 1, 3, 9 }, 116*57718be8SEnji Cooper { "abc/abcdef", 1, 3, 3 }, 117*57718be8SEnji Cooper { "abc/abcdef/", 1, 3, 10 }, 118*57718be8SEnji Cooper { "abc/abcdefg", 1, 3, 3 }, 119*57718be8SEnji Cooper { "abc/abcdefg/", 1, 3, 11 }, 120*57718be8SEnji Cooper { "abc/abcdefgh", 1, 3, 3 }, 121*57718be8SEnji Cooper { "abc/abcdefgh/", 1, 3, 12 }, 122*57718be8SEnji Cooper 123*57718be8SEnji Cooper { "abcd/", 1, 4, 4 }, 124*57718be8SEnji Cooper { "abcd//", 1, 4, 5 }, 125*57718be8SEnji Cooper { "abcd/a", 1, 4, 4 }, 126*57718be8SEnji Cooper { "abcd/a/", 1, 4, 6 }, 127*57718be8SEnji Cooper { "abcd/ab", 1, 4, 4 }, 128*57718be8SEnji Cooper { "abcd/ab/", 1, 4, 7 }, 129*57718be8SEnji Cooper { "abcd/abc", 1, 4, 4 }, 130*57718be8SEnji Cooper { "abcd/abc/", 1, 4, 8 }, 131*57718be8SEnji Cooper { "abcd/abcd", 1, 4, 4 }, 132*57718be8SEnji Cooper { "abcd/abcd/", 1, 4, 9 }, 133*57718be8SEnji Cooper { "abcd/abcde", 1, 4, 4 }, 134*57718be8SEnji Cooper { "abcd/abcde/", 1, 4, 10 }, 135*57718be8SEnji Cooper { "abcd/abcdef", 1, 4, 4 }, 136*57718be8SEnji Cooper { "abcd/abcdef/", 1, 4, 11 }, 137*57718be8SEnji Cooper { "abcd/abcdefg", 1, 4, 4 }, 138*57718be8SEnji Cooper { "abcd/abcdefg/", 1, 4, 12 }, 139*57718be8SEnji Cooper { "abcd/abcdefgh", 1, 4, 4 }, 140*57718be8SEnji Cooper { "abcd/abcdefgh/", 1, 4, 13 }, 141*57718be8SEnji Cooper 142*57718be8SEnji Cooper { "abcde/", 1, 5, 5 }, 143*57718be8SEnji Cooper { "abcde//", 1, 5, 6 }, 144*57718be8SEnji Cooper { "abcde/a", 1, 5, 5 }, 145*57718be8SEnji Cooper { "abcde/a/", 1, 5, 7 }, 146*57718be8SEnji Cooper { "abcde/ab", 1, 5, 5 }, 147*57718be8SEnji Cooper { "abcde/ab/", 1, 5, 8 }, 148*57718be8SEnji Cooper { "abcde/abc", 1, 5, 5 }, 149*57718be8SEnji Cooper { "abcde/abc/", 1, 5, 9 }, 150*57718be8SEnji Cooper { "abcde/abcd", 1, 5, 5 }, 151*57718be8SEnji Cooper { "abcde/abcd/", 1, 5, 10 }, 152*57718be8SEnji Cooper { "abcde/abcde", 1, 5, 5 }, 153*57718be8SEnji Cooper { "abcde/abcde/", 1, 5, 11 }, 154*57718be8SEnji Cooper { "abcde/abcdef", 1, 5, 5 }, 155*57718be8SEnji Cooper { "abcde/abcdef/", 1, 5, 12 }, 156*57718be8SEnji Cooper { "abcde/abcdefg", 1, 5, 5 }, 157*57718be8SEnji Cooper { "abcde/abcdefg/", 1, 5, 13 }, 158*57718be8SEnji Cooper { "abcde/abcdefgh", 1, 5, 5 }, 159*57718be8SEnji Cooper { "abcde/abcdefgh/", 1, 5, 14 }, 160*57718be8SEnji Cooper 161*57718be8SEnji Cooper { "abcdef/", 1, 6, 6 }, 162*57718be8SEnji Cooper { "abcdef//", 1, 6, 7 }, 163*57718be8SEnji Cooper { "abcdef/a", 1, 6, 6 }, 164*57718be8SEnji Cooper { "abcdef/a/", 1, 6, 8 }, 165*57718be8SEnji Cooper { "abcdef/ab", 1, 6, 6 }, 166*57718be8SEnji Cooper { "abcdef/ab/", 1, 6, 9 }, 167*57718be8SEnji Cooper { "abcdef/abc", 1, 6, 6 }, 168*57718be8SEnji Cooper { "abcdef/abc/", 1, 6, 10 }, 169*57718be8SEnji Cooper { "abcdef/abcd", 1, 6, 6 }, 170*57718be8SEnji Cooper { "abcdef/abcd/", 1, 6, 11 }, 171*57718be8SEnji Cooper { "abcdef/abcde", 1, 6, 6 }, 172*57718be8SEnji Cooper { "abcdef/abcde/", 1, 6, 12 }, 173*57718be8SEnji Cooper { "abcdef/abcdef", 1, 6, 6 }, 174*57718be8SEnji Cooper { "abcdef/abcdef/", 1, 6, 13 }, 175*57718be8SEnji Cooper { "abcdef/abcdefg", 1, 6, 6 }, 176*57718be8SEnji Cooper { "abcdef/abcdefg/", 1, 6, 14 }, 177*57718be8SEnji Cooper { "abcdef/abcdefgh", 1, 6, 6 }, 178*57718be8SEnji Cooper { "abcdef/abcdefgh/", 1, 6, 15 }, 179*57718be8SEnji Cooper 180*57718be8SEnji Cooper { "abcdefg/", 1, 7, 7 }, 181*57718be8SEnji Cooper { "abcdefg//", 1, 7, 8 }, 182*57718be8SEnji Cooper { "abcdefg/a", 1, 7, 7 }, 183*57718be8SEnji Cooper { "abcdefg/a/", 1, 7, 9 }, 184*57718be8SEnji Cooper { "abcdefg/ab", 1, 7, 7 }, 185*57718be8SEnji Cooper { "abcdefg/ab/", 1, 7, 10 }, 186*57718be8SEnji Cooper { "abcdefg/abc", 1, 7, 7 }, 187*57718be8SEnji Cooper { "abcdefg/abc/", 1, 7, 11 }, 188*57718be8SEnji Cooper { "abcdefg/abcd", 1, 7, 7 }, 189*57718be8SEnji Cooper { "abcdefg/abcd/", 1, 7, 12 }, 190*57718be8SEnji Cooper { "abcdefg/abcde", 1, 7, 7 }, 191*57718be8SEnji Cooper { "abcdefg/abcde/", 1, 7, 13 }, 192*57718be8SEnji Cooper { "abcdefg/abcdef", 1, 7, 7 }, 193*57718be8SEnji Cooper { "abcdefg/abcdef/", 1, 7, 14 }, 194*57718be8SEnji Cooper { "abcdefg/abcdefg", 1, 7, 7 }, 195*57718be8SEnji Cooper { "abcdefg/abcdefg/", 1, 7, 15 }, 196*57718be8SEnji Cooper { "abcdefg/abcdefgh", 1, 7, 7 }, 197*57718be8SEnji Cooper { "abcdefg/abcdefgh/", 1, 7, 16 }, 198*57718be8SEnji Cooper 199*57718be8SEnji Cooper { "abcdefgh/", 1, 8, 8 }, 200*57718be8SEnji Cooper { "abcdefgh//", 1, 8, 9 }, 201*57718be8SEnji Cooper { "abcdefgh/a", 1, 8, 8 }, 202*57718be8SEnji Cooper { "abcdefgh/a/", 1, 8, 10 }, 203*57718be8SEnji Cooper { "abcdefgh/ab", 1, 8, 8 }, 204*57718be8SEnji Cooper { "abcdefgh/ab/", 1, 8, 11 }, 205*57718be8SEnji Cooper { "abcdefgh/abc", 1, 8, 8 }, 206*57718be8SEnji Cooper { "abcdefgh/abc/", 1, 8, 12 }, 207*57718be8SEnji Cooper { "abcdefgh/abcd", 1, 8, 8 }, 208*57718be8SEnji Cooper { "abcdefgh/abcd/", 1, 8, 13 }, 209*57718be8SEnji Cooper { "abcdefgh/abcde", 1, 8, 8 }, 210*57718be8SEnji Cooper { "abcdefgh/abcde/", 1, 8, 14 }, 211*57718be8SEnji Cooper { "abcdefgh/abcdef", 1, 8, 8 }, 212*57718be8SEnji Cooper { "abcdefgh/abcdef/", 1, 8, 15 }, 213*57718be8SEnji Cooper { "abcdefgh/abcdefg", 1, 8, 8 }, 214*57718be8SEnji Cooper { "abcdefgh/abcdefg/", 1, 8, 16 }, 215*57718be8SEnji Cooper { "abcdefgh/abcdefgh", 1, 8, 8 }, 216*57718be8SEnji Cooper { "abcdefgh/abcdefgh/", 1, 8, 17 }, 217*57718be8SEnji Cooper }; 218*57718be8SEnji Cooper 219*57718be8SEnji Cooper for (a = 0; a < sizeof(long); ++a) { 220*57718be8SEnji Cooper for (t = 0; t < (sizeof(tab) / sizeof(tab[0])); ++t) { 221*57718be8SEnji Cooper strcpy(&buf[a], tab[t].val); 222*57718be8SEnji Cooper 223*57718be8SEnji Cooper off = f(&buf[a], '/'); 224*57718be8SEnji Cooper if (tab[t].match == 0) { 225*57718be8SEnji Cooper if (off != 0) { 226*57718be8SEnji Cooper fprintf(stderr, "a %d, t %d\n", a, t); 227*57718be8SEnji Cooper atf_tc_fail("strrchr should not have " 228*57718be8SEnji Cooper "found the character"); 229*57718be8SEnji Cooper } 230*57718be8SEnji Cooper } else if (tab[t].match == 1) { 231*57718be8SEnji Cooper if (tab[t].l_off != (off - &buf[a])) { 232*57718be8SEnji Cooper fprintf(stderr, "a %d, t %d\n", a, t); 233*57718be8SEnji Cooper atf_tc_fail("strrchr returns wrong " 234*57718be8SEnji Cooper "offset"); 235*57718be8SEnji Cooper } 236*57718be8SEnji Cooper } else { 237*57718be8SEnji Cooper fprintf(stderr, "a %d, t %d\n", a, t); 238*57718be8SEnji Cooper atf_tc_fail("bad test case data"); 239*57718be8SEnji Cooper } 240*57718be8SEnji Cooper 241*57718be8SEnji Cooper /* check zero extension of char arg */ 242*57718be8SEnji Cooper off2 = f(&buf[a], 0xffffff00 | '/'); 243*57718be8SEnji Cooper if (off != off2) { 244*57718be8SEnji Cooper fprintf(stderr, "a %d, t %d\n", a, t); 245*57718be8SEnji Cooper atf_tc_fail("zero extension of char arg fails"); 246*57718be8SEnji Cooper } 247*57718be8SEnji Cooper } 248*57718be8SEnji Cooper } 249*57718be8SEnji Cooper } 250*57718be8SEnji Cooper 251*57718be8SEnji Cooper ATF_TP_ADD_TCS(tp) 252*57718be8SEnji Cooper { 253*57718be8SEnji Cooper 254*57718be8SEnji Cooper ATF_TP_ADD_TC(tp, strrchr_basic); 255*57718be8SEnji Cooper 256*57718be8SEnji Cooper return atf_no_error(); 257*57718be8SEnji Cooper } 258