Home | History | Annotate | Line # | Download | only in string
t_strcmp.c revision 1.3
      1  1.3  jruoho /* $NetBSD: t_strcmp.c,v 1.3 2011/07/14 07:33:20 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 
     14  1.1  jruoho ATF_TC(strcmp_basic);
     15  1.1  jruoho ATF_TC_HEAD(strcmp_basic, tc)
     16  1.1  jruoho {
     17  1.2  jruoho         atf_tc_set_md_var(tc, "descr", "Test strcmp(3) results, #1");
     18  1.1  jruoho }
     19  1.1  jruoho 
     20  1.1  jruoho ATF_TC_BODY(strcmp_basic, tc)
     21  1.1  jruoho {
     22  1.1  jruoho 	/* try to trick the compiler */
     23  1.1  jruoho 	int (*f)(const char *, const char *s) = strcmp;
     24  1.1  jruoho 
     25  1.1  jruoho 	unsigned int a0, a1, t;
     26  1.1  jruoho 	char buf0[64];
     27  1.1  jruoho 	char buf1[64];
     28  1.1  jruoho 	int ret;
     29  1.1  jruoho 
     30  1.1  jruoho 	struct tab {
     31  1.1  jruoho 		const char*	val0;
     32  1.1  jruoho 		const char*	val1;
     33  1.1  jruoho 		int		ret;
     34  1.1  jruoho 	};
     35  1.1  jruoho 
     36  1.1  jruoho 	const struct tab tab[] = {
     37  1.1  jruoho 		{ "",			"",			0 },
     38  1.1  jruoho 
     39  1.1  jruoho 		{ "a",			"a",			0 },
     40  1.1  jruoho 		{ "a",			"b",			-1 },
     41  1.1  jruoho 		{ "b",			"a",			+1 },
     42  1.1  jruoho 		{ "",			"a",			-1 },
     43  1.1  jruoho 		{ "a",			"",			+1 },
     44  1.1  jruoho 
     45  1.1  jruoho 		{ "aa",			"aa",			0 },
     46  1.1  jruoho 		{ "aa",			"ab",			-1 },
     47  1.1  jruoho 		{ "ab",			"aa",			+1 },
     48  1.1  jruoho 		{ "a",			"aa",			-1 },
     49  1.1  jruoho 		{ "aa",			"a",			+1 },
     50  1.1  jruoho 
     51  1.1  jruoho 		{ "aaa",		"aaa",			0 },
     52  1.1  jruoho 		{ "aaa",		"aab",			-1 },
     53  1.1  jruoho 		{ "aab",		"aaa",			+1 },
     54  1.1  jruoho 		{ "aa",			"aaa",			-1 },
     55  1.1  jruoho 		{ "aaa",		"aa",			+1 },
     56  1.1  jruoho 
     57  1.1  jruoho 		{ "aaaa",		"aaaa",			0 },
     58  1.1  jruoho 		{ "aaaa",		"aaab",			-1 },
     59  1.1  jruoho 		{ "aaab",		"aaaa",			+1 },
     60  1.1  jruoho 		{ "aaa",		"aaaa",			-1 },
     61  1.1  jruoho 		{ "aaaa",		"aaa",			+1 },
     62  1.1  jruoho 
     63  1.1  jruoho 		{ "aaaaa",		"aaaaa",		0 },
     64  1.1  jruoho 		{ "aaaaa",		"aaaab",		-1 },
     65  1.1  jruoho 		{ "aaaab",		"aaaaa",		+1 },
     66  1.1  jruoho 		{ "aaaa",		"aaaaa",		-1 },
     67  1.1  jruoho 		{ "aaaaa",		"aaaa",			+1 },
     68  1.1  jruoho 
     69  1.1  jruoho 		{ "aaaaaa",		"aaaaaa",		0 },
     70  1.1  jruoho 		{ "aaaaaa",		"aaaaab",		-1 },
     71  1.1  jruoho 		{ "aaaaab",		"aaaaaa",		+1 },
     72  1.1  jruoho 		{ "aaaaa",		"aaaaaa",		-1 },
     73  1.1  jruoho 		{ "aaaaaa",		"aaaaa",		+1 },
     74  1.1  jruoho 	};
     75  1.1  jruoho 
     76  1.1  jruoho 	for (a0 = 0; a0 < sizeof(long); ++a0) {
     77  1.1  jruoho 		for (a1 = 0; a1 < sizeof(long); ++a1) {
     78  1.1  jruoho 			for (t = 0; t < __arraycount(tab); ++t) {
     79  1.1  jruoho 				memcpy(&buf0[a0], tab[t].val0,
     80  1.1  jruoho 				       strlen(tab[t].val0) + 1);
     81  1.1  jruoho 				memcpy(&buf1[a1], tab[t].val1,
     82  1.1  jruoho 				       strlen(tab[t].val1) + 1);
     83  1.1  jruoho 
     84  1.1  jruoho 				ret = f(&buf0[a0], &buf1[a1]);
     85  1.1  jruoho 
     86  1.1  jruoho 				if ((ret == 0 && tab[t].ret != 0) ||
     87  1.1  jruoho 				    (ret <  0 && tab[t].ret >= 0) ||
     88  1.1  jruoho 				    (ret >  0 && tab[t].ret <= 0)) {
     89  1.1  jruoho 					fprintf(stderr, "a0 %d, a1 %d, t %d\n",
     90  1.1  jruoho 					    a0, a1, t);
     91  1.1  jruoho 					fprintf(stderr, "\"%s\" \"%s\" %d\n",
     92  1.1  jruoho 					    &buf0[a0], &buf1[a1], ret);
     93  1.1  jruoho 					atf_tc_fail("Check stderr for details");
     94  1.1  jruoho 				}
     95  1.1  jruoho 			}
     96  1.1  jruoho 		}
     97  1.1  jruoho 	}
     98  1.1  jruoho }
     99  1.1  jruoho 
    100  1.2  jruoho ATF_TC(strcmp_simple);
    101  1.2  jruoho ATF_TC_HEAD(strcmp_simple, tc)
    102  1.2  jruoho {
    103  1.2  jruoho         atf_tc_set_md_var(tc, "descr", "Test strcmp(3) results, #2");
    104  1.2  jruoho }
    105  1.2  jruoho 
    106  1.2  jruoho ATF_TC_BODY(strcmp_simple, tc)
    107  1.2  jruoho {
    108  1.2  jruoho 	char buf1[10] = "xxx";
    109  1.2  jruoho 	char buf2[10] = "xxy";
    110  1.2  jruoho 
    111  1.3  jruoho 	ATF_CHECK(strcmp(buf1, buf1) == 0);
    112  1.3  jruoho 	ATF_CHECK(strcmp(buf2, buf2) == 0);
    113  1.2  jruoho 
    114  1.3  jruoho 	ATF_CHECK(strcmp("xx", "xox") > 0);
    115  1.3  jruoho 	ATF_CHECK(strcmp("xxx", "xxxyyy") < 0);
    116  1.3  jruoho 	ATF_CHECK(strcmp("xxxyyy", "xxx") > 0);
    117  1.3  jruoho 
    118  1.3  jruoho 	ATF_CHECK(strcmp(buf1 + 0, buf2 + 0) < 0);
    119  1.3  jruoho 	ATF_CHECK(strcmp(buf1 + 1, buf2 + 1) < 0);
    120  1.3  jruoho 	ATF_CHECK(strcmp(buf1 + 2, buf2 + 2) < 0);
    121  1.3  jruoho 	ATF_CHECK(strcmp(buf1 + 3, buf2 + 3) == 0);
    122  1.3  jruoho 
    123  1.3  jruoho 	ATF_CHECK(strcmp(buf2 + 0, buf1 + 0) > 0);
    124  1.3  jruoho 	ATF_CHECK(strcmp(buf2 + 1, buf1 + 1) > 0);
    125  1.3  jruoho 	ATF_CHECK(strcmp(buf2 + 2, buf1 + 2) > 0);
    126  1.3  jruoho 	ATF_CHECK(strcmp(buf2 + 3, buf1 + 3) == 0);
    127  1.2  jruoho }
    128  1.2  jruoho 
    129  1.1  jruoho ATF_TP_ADD_TCS(tp)
    130  1.1  jruoho {
    131  1.1  jruoho 
    132  1.1  jruoho 	ATF_TP_ADD_TC(tp, strcmp_basic);
    133  1.2  jruoho 	ATF_TP_ADD_TC(tp, strcmp_simple);
    134  1.1  jruoho 
    135  1.1  jruoho 	return atf_no_error();
    136  1.1  jruoho }
    137