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