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);
ATF_TC_HEAD(strrchr_basic,tc)15 ATF_TC_HEAD(strrchr_basic, tc)
16 {
17         atf_tc_set_md_var(tc, "descr", "Test strrchr(3) results");
18 }
19 
ATF_TC_BODY(strrchr_basic,tc)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 
ATF_TP_ADD_TCS(tp)251 ATF_TP_ADD_TCS(tp)
252 {
253 
254           ATF_TP_ADD_TC(tp, strrchr_basic);
255 
256           return atf_no_error();
257 }
258