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