t_strchr.c revision 1.3 1 1.3 christos /* $NetBSD: t_strchr.c,v 1.3 2023/01/30 19:49:49 christos 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.2 christos void *dl_handle;
62 1.1 jruoho char *off;
63 1.1 jruoho char buf[32];
64 1.2 christos unsigned int t, a;
65 1.1 jruoho
66 1.1 jruoho const char *tab[] = {
67 1.1 jruoho "",
68 1.1 jruoho "a",
69 1.1 jruoho "aa",
70 1.1 jruoho "abc",
71 1.1 jruoho "abcd",
72 1.1 jruoho "abcde",
73 1.1 jruoho "abcdef",
74 1.1 jruoho "abcdefg",
75 1.1 jruoho "abcdefgh",
76 1.1 jruoho
77 1.1 jruoho "/",
78 1.1 jruoho "//",
79 1.1 jruoho "/a",
80 1.1 jruoho "/a/",
81 1.1 jruoho "/ab",
82 1.1 jruoho "/ab/",
83 1.1 jruoho "/abc",
84 1.1 jruoho "/abc/",
85 1.1 jruoho "/abcd",
86 1.1 jruoho "/abcd/",
87 1.1 jruoho "/abcde",
88 1.1 jruoho "/abcde/",
89 1.1 jruoho "/abcdef",
90 1.1 jruoho "/abcdef/",
91 1.1 jruoho "/abcdefg",
92 1.1 jruoho "/abcdefg/",
93 1.1 jruoho "/abcdefgh",
94 1.1 jruoho "/abcdefgh/",
95 1.1 jruoho
96 1.1 jruoho "a/",
97 1.1 jruoho "a//",
98 1.1 jruoho "a/a",
99 1.1 jruoho "a/a/",
100 1.1 jruoho "a/ab",
101 1.1 jruoho "a/ab/",
102 1.1 jruoho "a/abc",
103 1.1 jruoho "a/abc/",
104 1.1 jruoho "a/abcd",
105 1.1 jruoho "a/abcd/",
106 1.1 jruoho "a/abcde",
107 1.1 jruoho "a/abcde/",
108 1.1 jruoho "a/abcdef",
109 1.1 jruoho "a/abcdef/",
110 1.1 jruoho "a/abcdefg",
111 1.1 jruoho "a/abcdefg/",
112 1.1 jruoho "a/abcdefgh",
113 1.1 jruoho "a/abcdefgh/",
114 1.1 jruoho
115 1.1 jruoho "ab/",
116 1.1 jruoho "ab//",
117 1.1 jruoho "ab/a",
118 1.1 jruoho "ab/a/",
119 1.1 jruoho "ab/ab",
120 1.1 jruoho "ab/ab/",
121 1.1 jruoho "ab/abc",
122 1.1 jruoho "ab/abc/",
123 1.1 jruoho "ab/abcd",
124 1.1 jruoho "ab/abcd/",
125 1.1 jruoho "ab/abcde",
126 1.1 jruoho "ab/abcde/",
127 1.1 jruoho "ab/abcdef",
128 1.1 jruoho "ab/abcdef/",
129 1.1 jruoho "ab/abcdefg",
130 1.1 jruoho "ab/abcdefg/",
131 1.1 jruoho "ab/abcdefgh",
132 1.1 jruoho "ab/abcdefgh/",
133 1.1 jruoho
134 1.1 jruoho "abc/",
135 1.1 jruoho "abc//",
136 1.1 jruoho "abc/a",
137 1.1 jruoho "abc/a/",
138 1.1 jruoho "abc/ab",
139 1.1 jruoho "abc/ab/",
140 1.1 jruoho "abc/abc",
141 1.1 jruoho "abc/abc/",
142 1.1 jruoho "abc/abcd",
143 1.1 jruoho "abc/abcd/",
144 1.1 jruoho "abc/abcde",
145 1.1 jruoho "abc/abcde/",
146 1.1 jruoho "abc/abcdef",
147 1.1 jruoho "abc/abcdef/",
148 1.1 jruoho "abc/abcdefg",
149 1.1 jruoho "abc/abcdefg/",
150 1.1 jruoho "abc/abcdefgh",
151 1.1 jruoho "abc/abcdefgh/",
152 1.1 jruoho
153 1.1 jruoho "abcd/",
154 1.1 jruoho "abcd//",
155 1.1 jruoho "abcd/a",
156 1.1 jruoho "abcd/a/",
157 1.1 jruoho "abcd/ab",
158 1.1 jruoho "abcd/ab/",
159 1.1 jruoho "abcd/abc",
160 1.1 jruoho "abcd/abc/",
161 1.1 jruoho "abcd/abcd",
162 1.1 jruoho "abcd/abcd/",
163 1.1 jruoho "abcd/abcde",
164 1.1 jruoho "abcd/abcde/",
165 1.1 jruoho "abcd/abcdef",
166 1.1 jruoho "abcd/abcdef/",
167 1.1 jruoho "abcd/abcdefg",
168 1.1 jruoho "abcd/abcdefg/",
169 1.1 jruoho "abcd/abcdefgh",
170 1.1 jruoho "abcd/abcdefgh/",
171 1.1 jruoho
172 1.1 jruoho "abcde/",
173 1.1 jruoho "abcde//",
174 1.1 jruoho "abcde/a",
175 1.1 jruoho "abcde/a/",
176 1.1 jruoho "abcde/ab",
177 1.1 jruoho "abcde/ab/",
178 1.1 jruoho "abcde/abc",
179 1.1 jruoho "abcde/abc/",
180 1.1 jruoho "abcde/abcd",
181 1.1 jruoho "abcde/abcd/",
182 1.1 jruoho "abcde/abcde",
183 1.1 jruoho "abcde/abcde/",
184 1.1 jruoho "abcde/abcdef",
185 1.1 jruoho "abcde/abcdef/",
186 1.1 jruoho "abcde/abcdefg",
187 1.1 jruoho "abcde/abcdefg/",
188 1.1 jruoho "abcde/abcdefgh",
189 1.1 jruoho "abcde/abcdefgh/",
190 1.1 jruoho
191 1.1 jruoho "abcdef/",
192 1.1 jruoho "abcdef//",
193 1.1 jruoho "abcdef/a",
194 1.1 jruoho "abcdef/a/",
195 1.1 jruoho "abcdef/ab",
196 1.1 jruoho "abcdef/ab/",
197 1.1 jruoho "abcdef/abc",
198 1.1 jruoho "abcdef/abc/",
199 1.1 jruoho "abcdef/abcd",
200 1.1 jruoho "abcdef/abcd/",
201 1.1 jruoho "abcdef/abcde",
202 1.1 jruoho "abcdef/abcde/",
203 1.1 jruoho "abcdef/abcdef",
204 1.1 jruoho "abcdef/abcdef/",
205 1.1 jruoho "abcdef/abcdefg",
206 1.1 jruoho "abcdef/abcdefg/",
207 1.1 jruoho "abcdef/abcdefgh",
208 1.1 jruoho "abcdef/abcdefgh/",
209 1.1 jruoho
210 1.1 jruoho "abcdefg/",
211 1.1 jruoho "abcdefg//",
212 1.1 jruoho "abcdefg/a",
213 1.1 jruoho "abcdefg/a/",
214 1.1 jruoho "abcdefg/ab",
215 1.1 jruoho "abcdefg/ab/",
216 1.1 jruoho "abcdefg/abc",
217 1.1 jruoho "abcdefg/abc/",
218 1.1 jruoho "abcdefg/abcd",
219 1.1 jruoho "abcdefg/abcd/",
220 1.1 jruoho "abcdefg/abcde",
221 1.1 jruoho "abcdefg/abcde/",
222 1.1 jruoho "abcdefg/abcdef",
223 1.1 jruoho "abcdefg/abcdef/",
224 1.1 jruoho "abcdefg/abcdefg",
225 1.1 jruoho "abcdefg/abcdefg/",
226 1.1 jruoho "abcdefg/abcdefgh",
227 1.1 jruoho "abcdefg/abcdefgh/",
228 1.1 jruoho
229 1.1 jruoho "abcdefgh/",
230 1.1 jruoho "abcdefgh//",
231 1.1 jruoho "abcdefgh/a",
232 1.1 jruoho "abcdefgh/a/",
233 1.1 jruoho "abcdefgh/ab",
234 1.1 jruoho "abcdefgh/ab/",
235 1.1 jruoho "abcdefgh/abc",
236 1.1 jruoho "abcdefgh/abc/",
237 1.1 jruoho "abcdefgh/abcd",
238 1.1 jruoho "abcdefgh/abcd/",
239 1.1 jruoho "abcdefgh/abcde",
240 1.1 jruoho "abcdefgh/abcde/",
241 1.1 jruoho "abcdefgh/abcdef",
242 1.1 jruoho "abcdefgh/abcdef/",
243 1.1 jruoho "abcdefgh/abcdefg",
244 1.1 jruoho "abcdefgh/abcdefg/",
245 1.1 jruoho "abcdefgh/abcdefgh",
246 1.1 jruoho "abcdefgh/abcdefgh/",
247 1.1 jruoho };
248 1.1 jruoho
249 1.2 christos dl_handle = dlopen(NULL, RTLD_LAZY);
250 1.3 christos strchr_fn = dlsym(dl_handle, "test_strchr");
251 1.1 jruoho if (!strchr_fn)
252 1.1 jruoho strchr_fn = strchr;
253 1.1 jruoho
254 1.1 jruoho for (a = 3; a < 3 + sizeof(long); ++a) {
255 1.1 jruoho /* Put char and a \0 before the buffer */
256 1.1 jruoho buf[a-1] = '/';
257 1.1 jruoho buf[a-2] = '0';
258 1.1 jruoho buf[a-3] = 0xff;
259 1.1 jruoho for (t = 0; t < (sizeof(tab) / sizeof(tab[0])); ++t) {
260 1.1 jruoho int len = strlen(tab[t]) + 1;
261 1.1 jruoho memcpy(&buf[a], tab[t], len);
262 1.1 jruoho
263 1.1 jruoho /* Put the char we are looking for after the \0 */
264 1.1 jruoho buf[a + len] = '/';
265 1.1 jruoho
266 1.1 jruoho /* Check search for NUL at end of string */
267 1.1 jruoho verify_strchr(buf + a, 0, t, a);
268 1.1 jruoho
269 1.1 jruoho /* Then for the '/' in the strings */
270 1.1 jruoho verify_strchr(buf + a, '/', t, a);
271 1.1 jruoho
272 1.3 christos /* check zero extension of char arg */
273 1.3 christos verify_strchr(buf + a, 0xffffff00 | '/', t, a);
274 1.1 jruoho
275 1.3 christos /* Replace all the '/' with 0xff */
276 1.3 christos while ((off = slow_strchr(buf + a, '/')) != NULL)
277 1.1 jruoho *off = 0xff;
278 1.1 jruoho
279 1.1 jruoho buf[a + len] = 0xff;
280 1.1 jruoho
281 1.1 jruoho /* Check we can search for 0xff as well as '/' */
282 1.1 jruoho verify_strchr(buf + a, 0xff, t, a);
283 1.1 jruoho }
284 1.1 jruoho }
285 1.2 christos (void)dlclose(dl_handle);
286 1.1 jruoho }
287 1.1 jruoho
288 1.1 jruoho ATF_TP_ADD_TCS(tp)
289 1.1 jruoho {
290 1.1 jruoho
291 1.1 jruoho ATF_TP_ADD_TC(tp, strchr_basic);
292 1.1 jruoho
293 1.1 jruoho return atf_no_error();
294 1.1 jruoho }
295