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