Home | History | Annotate | Line # | Download | only in string
      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