t_strchr.c revision 1.1 1 1.1 jruoho /* $NetBSD: t_strchr.c,v 1.1 2011/07/07 08:59:33 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 #include <dlfcn.h>
14 1.1 jruoho
15 1.1 jruoho static char *slow_strchr(char *, int);
16 1.1 jruoho static void verify_strchr(char *, int, unsigned int, unsigned int);
17 1.1 jruoho
18 1.1 jruoho char * (*volatile strchr_fn)(const char *, int);
19 1.1 jruoho
20 1.1 jruoho static char *
21 1.1 jruoho slow_strchr(char *buf, int ch)
22 1.1 jruoho {
23 1.1 jruoho unsigned char c = 1;
24 1.1 jruoho
25 1.1 jruoho ch &= 0xff;
26 1.1 jruoho
27 1.1 jruoho for (; c != 0; buf++) {
28 1.1 jruoho c = *buf;
29 1.1 jruoho if (c == ch)
30 1.1 jruoho return buf;
31 1.1 jruoho }
32 1.1 jruoho return 0;
33 1.1 jruoho }
34 1.1 jruoho
35 1.1 jruoho static void
36 1.1 jruoho verify_strchr(char *buf, int ch, unsigned int t, unsigned int a)
37 1.1 jruoho {
38 1.1 jruoho const char *off, *ok_off;
39 1.1 jruoho
40 1.1 jruoho off = strchr_fn(buf, ch);
41 1.1 jruoho ok_off = slow_strchr(buf, ch);
42 1.1 jruoho if (off == ok_off)
43 1.1 jruoho return;
44 1.1 jruoho
45 1.1 jruoho fprintf(stderr, "test_strchr(\"%s\", %#x) gave %zd not %zd (test %d, "
46 1.1 jruoho "alignment %d)\n",
47 1.1 jruoho buf, ch, off ? off - buf : -1, ok_off ? ok_off - buf : -1, t, a);
48 1.1 jruoho
49 1.1 jruoho atf_tc_fail("Check stderr for details");
50 1.1 jruoho }
51 1.1 jruoho
52 1.1 jruoho ATF_TC(strchr_basic);
53 1.1 jruoho ATF_TC_HEAD(strchr_basic, tc)
54 1.1 jruoho {
55 1.1 jruoho
56 1.1 jruoho atf_tc_set_md_var(tc, "descr", "Test strchr(3) results");
57 1.1 jruoho }
58 1.1 jruoho
59 1.1 jruoho ATF_TC_BODY(strchr_basic, tc)
60 1.1 jruoho {
61 1.1 jruoho unsigned int t, a;
62 1.1 jruoho char *off;
63 1.1 jruoho char buf[32];
64 1.1 jruoho
65 1.1 jruoho const char *tab[] = {
66 1.1 jruoho "",
67 1.1 jruoho "a",
68 1.1 jruoho "aa",
69 1.1 jruoho "abc",
70 1.1 jruoho "abcd",
71 1.1 jruoho "abcde",
72 1.1 jruoho "abcdef",
73 1.1 jruoho "abcdefg",
74 1.1 jruoho "abcdefgh",
75 1.1 jruoho
76 1.1 jruoho "/",
77 1.1 jruoho "//",
78 1.1 jruoho "/a",
79 1.1 jruoho "/a/",
80 1.1 jruoho "/ab",
81 1.1 jruoho "/ab/",
82 1.1 jruoho "/abc",
83 1.1 jruoho "/abc/",
84 1.1 jruoho "/abcd",
85 1.1 jruoho "/abcd/",
86 1.1 jruoho "/abcde",
87 1.1 jruoho "/abcde/",
88 1.1 jruoho "/abcdef",
89 1.1 jruoho "/abcdef/",
90 1.1 jruoho "/abcdefg",
91 1.1 jruoho "/abcdefg/",
92 1.1 jruoho "/abcdefgh",
93 1.1 jruoho "/abcdefgh/",
94 1.1 jruoho
95 1.1 jruoho "a/",
96 1.1 jruoho "a//",
97 1.1 jruoho "a/a",
98 1.1 jruoho "a/a/",
99 1.1 jruoho "a/ab",
100 1.1 jruoho "a/ab/",
101 1.1 jruoho "a/abc",
102 1.1 jruoho "a/abc/",
103 1.1 jruoho "a/abcd",
104 1.1 jruoho "a/abcd/",
105 1.1 jruoho "a/abcde",
106 1.1 jruoho "a/abcde/",
107 1.1 jruoho "a/abcdef",
108 1.1 jruoho "a/abcdef/",
109 1.1 jruoho "a/abcdefg",
110 1.1 jruoho "a/abcdefg/",
111 1.1 jruoho "a/abcdefgh",
112 1.1 jruoho "a/abcdefgh/",
113 1.1 jruoho
114 1.1 jruoho "ab/",
115 1.1 jruoho "ab//",
116 1.1 jruoho "ab/a",
117 1.1 jruoho "ab/a/",
118 1.1 jruoho "ab/ab",
119 1.1 jruoho "ab/ab/",
120 1.1 jruoho "ab/abc",
121 1.1 jruoho "ab/abc/",
122 1.1 jruoho "ab/abcd",
123 1.1 jruoho "ab/abcd/",
124 1.1 jruoho "ab/abcde",
125 1.1 jruoho "ab/abcde/",
126 1.1 jruoho "ab/abcdef",
127 1.1 jruoho "ab/abcdef/",
128 1.1 jruoho "ab/abcdefg",
129 1.1 jruoho "ab/abcdefg/",
130 1.1 jruoho "ab/abcdefgh",
131 1.1 jruoho "ab/abcdefgh/",
132 1.1 jruoho
133 1.1 jruoho "abc/",
134 1.1 jruoho "abc//",
135 1.1 jruoho "abc/a",
136 1.1 jruoho "abc/a/",
137 1.1 jruoho "abc/ab",
138 1.1 jruoho "abc/ab/",
139 1.1 jruoho "abc/abc",
140 1.1 jruoho "abc/abc/",
141 1.1 jruoho "abc/abcd",
142 1.1 jruoho "abc/abcd/",
143 1.1 jruoho "abc/abcde",
144 1.1 jruoho "abc/abcde/",
145 1.1 jruoho "abc/abcdef",
146 1.1 jruoho "abc/abcdef/",
147 1.1 jruoho "abc/abcdefg",
148 1.1 jruoho "abc/abcdefg/",
149 1.1 jruoho "abc/abcdefgh",
150 1.1 jruoho "abc/abcdefgh/",
151 1.1 jruoho
152 1.1 jruoho "abcd/",
153 1.1 jruoho "abcd//",
154 1.1 jruoho "abcd/a",
155 1.1 jruoho "abcd/a/",
156 1.1 jruoho "abcd/ab",
157 1.1 jruoho "abcd/ab/",
158 1.1 jruoho "abcd/abc",
159 1.1 jruoho "abcd/abc/",
160 1.1 jruoho "abcd/abcd",
161 1.1 jruoho "abcd/abcd/",
162 1.1 jruoho "abcd/abcde",
163 1.1 jruoho "abcd/abcde/",
164 1.1 jruoho "abcd/abcdef",
165 1.1 jruoho "abcd/abcdef/",
166 1.1 jruoho "abcd/abcdefg",
167 1.1 jruoho "abcd/abcdefg/",
168 1.1 jruoho "abcd/abcdefgh",
169 1.1 jruoho "abcd/abcdefgh/",
170 1.1 jruoho
171 1.1 jruoho "abcde/",
172 1.1 jruoho "abcde//",
173 1.1 jruoho "abcde/a",
174 1.1 jruoho "abcde/a/",
175 1.1 jruoho "abcde/ab",
176 1.1 jruoho "abcde/ab/",
177 1.1 jruoho "abcde/abc",
178 1.1 jruoho "abcde/abc/",
179 1.1 jruoho "abcde/abcd",
180 1.1 jruoho "abcde/abcd/",
181 1.1 jruoho "abcde/abcde",
182 1.1 jruoho "abcde/abcde/",
183 1.1 jruoho "abcde/abcdef",
184 1.1 jruoho "abcde/abcdef/",
185 1.1 jruoho "abcde/abcdefg",
186 1.1 jruoho "abcde/abcdefg/",
187 1.1 jruoho "abcde/abcdefgh",
188 1.1 jruoho "abcde/abcdefgh/",
189 1.1 jruoho
190 1.1 jruoho "abcdef/",
191 1.1 jruoho "abcdef//",
192 1.1 jruoho "abcdef/a",
193 1.1 jruoho "abcdef/a/",
194 1.1 jruoho "abcdef/ab",
195 1.1 jruoho "abcdef/ab/",
196 1.1 jruoho "abcdef/abc",
197 1.1 jruoho "abcdef/abc/",
198 1.1 jruoho "abcdef/abcd",
199 1.1 jruoho "abcdef/abcd/",
200 1.1 jruoho "abcdef/abcde",
201 1.1 jruoho "abcdef/abcde/",
202 1.1 jruoho "abcdef/abcdef",
203 1.1 jruoho "abcdef/abcdef/",
204 1.1 jruoho "abcdef/abcdefg",
205 1.1 jruoho "abcdef/abcdefg/",
206 1.1 jruoho "abcdef/abcdefgh",
207 1.1 jruoho "abcdef/abcdefgh/",
208 1.1 jruoho
209 1.1 jruoho "abcdefg/",
210 1.1 jruoho "abcdefg//",
211 1.1 jruoho "abcdefg/a",
212 1.1 jruoho "abcdefg/a/",
213 1.1 jruoho "abcdefg/ab",
214 1.1 jruoho "abcdefg/ab/",
215 1.1 jruoho "abcdefg/abc",
216 1.1 jruoho "abcdefg/abc/",
217 1.1 jruoho "abcdefg/abcd",
218 1.1 jruoho "abcdefg/abcd/",
219 1.1 jruoho "abcdefg/abcde",
220 1.1 jruoho "abcdefg/abcde/",
221 1.1 jruoho "abcdefg/abcdef",
222 1.1 jruoho "abcdefg/abcdef/",
223 1.1 jruoho "abcdefg/abcdefg",
224 1.1 jruoho "abcdefg/abcdefg/",
225 1.1 jruoho "abcdefg/abcdefgh",
226 1.1 jruoho "abcdefg/abcdefgh/",
227 1.1 jruoho
228 1.1 jruoho "abcdefgh/",
229 1.1 jruoho "abcdefgh//",
230 1.1 jruoho "abcdefgh/a",
231 1.1 jruoho "abcdefgh/a/",
232 1.1 jruoho "abcdefgh/ab",
233 1.1 jruoho "abcdefgh/ab/",
234 1.1 jruoho "abcdefgh/abc",
235 1.1 jruoho "abcdefgh/abc/",
236 1.1 jruoho "abcdefgh/abcd",
237 1.1 jruoho "abcdefgh/abcd/",
238 1.1 jruoho "abcdefgh/abcde",
239 1.1 jruoho "abcdefgh/abcde/",
240 1.1 jruoho "abcdefgh/abcdef",
241 1.1 jruoho "abcdefgh/abcdef/",
242 1.1 jruoho "abcdefgh/abcdefg",
243 1.1 jruoho "abcdefgh/abcdefg/",
244 1.1 jruoho "abcdefgh/abcdefgh",
245 1.1 jruoho "abcdefgh/abcdefgh/",
246 1.1 jruoho };
247 1.1 jruoho
248 1.1 jruoho
249 1.1 jruoho strchr_fn = dlsym(dlopen(0, RTLD_LAZY), "test_strchr");
250 1.1 jruoho if (!strchr_fn)
251 1.1 jruoho strchr_fn = strchr;
252 1.1 jruoho
253 1.1 jruoho for (a = 3; a < 3 + sizeof(long); ++a) {
254 1.1 jruoho /* Put char and a \0 before the buffer */
255 1.1 jruoho buf[a-1] = '/';
256 1.1 jruoho buf[a-2] = '0';
257 1.1 jruoho buf[a-3] = 0xff;
258 1.1 jruoho for (t = 0; t < (sizeof(tab) / sizeof(tab[0])); ++t) {
259 1.1 jruoho int len = strlen(tab[t]) + 1;
260 1.1 jruoho memcpy(&buf[a], tab[t], len);
261 1.1 jruoho
262 1.1 jruoho /* Put the char we are looking for after the \0 */
263 1.1 jruoho buf[a + len] = '/';
264 1.1 jruoho
265 1.1 jruoho /* Check search for NUL at end of string */
266 1.1 jruoho verify_strchr(buf + a, 0, t, a);
267 1.1 jruoho
268 1.1 jruoho /* Then for the '/' in the strings */
269 1.1 jruoho verify_strchr(buf + a, '/', t, a);
270 1.1 jruoho
271 1.1 jruoho /* check zero extension of char arg */
272 1.1 jruoho verify_strchr(buf + a, 0xffffff00 | '/', t, a);
273 1.1 jruoho
274 1.1 jruoho /* Replace all the '/' with 0xff */
275 1.1 jruoho while ((off = slow_strchr(buf + a, '/')) != NULL)
276 1.1 jruoho *off = 0xff;
277 1.1 jruoho
278 1.1 jruoho buf[a + len] = 0xff;
279 1.1 jruoho
280 1.1 jruoho /* Check we can search for 0xff as well as '/' */
281 1.1 jruoho verify_strchr(buf + a, 0xff, t, a);
282 1.1 jruoho }
283 1.1 jruoho }
284 1.1 jruoho }
285 1.1 jruoho
286 1.1 jruoho ATF_TP_ADD_TCS(tp)
287 1.1 jruoho {
288 1.1 jruoho
289 1.1 jruoho ATF_TP_ADD_TC(tp, strchr_basic);
290 1.1 jruoho
291 1.1 jruoho return atf_no_error();
292 1.1 jruoho }
293