xref: /netbsd-src/tests/lib/libc/string/t_strcmp.c (revision 010e9a3d31c545db0b76b6c0417482a61c0bcff2)
1*010e9a3dSjoerg /* $NetBSD: t_strcmp.c,v 1.4 2012/03/25 08:17:54 joerg Exp $ */
254bb1074Sjruoho 
354bb1074Sjruoho /*
454bb1074Sjruoho  * Written by J.T. Conklin <jtc@acorntoolworks.com>
554bb1074Sjruoho  * Public domain.
654bb1074Sjruoho  */
754bb1074Sjruoho 
854bb1074Sjruoho #include <atf-c.h>
954bb1074Sjruoho #include <string.h>
1054bb1074Sjruoho #include <unistd.h>
1154bb1074Sjruoho #include <stdio.h>
1254bb1074Sjruoho #include <stdlib.h>
1354bb1074Sjruoho 
1454bb1074Sjruoho ATF_TC(strcmp_basic);
ATF_TC_HEAD(strcmp_basic,tc)1554bb1074Sjruoho ATF_TC_HEAD(strcmp_basic, tc)
1654bb1074Sjruoho {
172b91d03eSjruoho         atf_tc_set_md_var(tc, "descr", "Test strcmp(3) results, #1");
1854bb1074Sjruoho }
1954bb1074Sjruoho 
ATF_TC_BODY(strcmp_basic,tc)2054bb1074Sjruoho ATF_TC_BODY(strcmp_basic, tc)
2154bb1074Sjruoho {
2254bb1074Sjruoho 	/* try to trick the compiler */
2354bb1074Sjruoho 	int (*f)(const char *, const char *s) = strcmp;
2454bb1074Sjruoho 
2554bb1074Sjruoho 	unsigned int a0, a1, t;
2654bb1074Sjruoho 	char buf0[64];
2754bb1074Sjruoho 	char buf1[64];
2854bb1074Sjruoho 	int ret;
2954bb1074Sjruoho 
3054bb1074Sjruoho 	struct tab {
3154bb1074Sjruoho 		const char*	val0;
3254bb1074Sjruoho 		const char*	val1;
3354bb1074Sjruoho 		int		ret;
3454bb1074Sjruoho 	};
3554bb1074Sjruoho 
3654bb1074Sjruoho 	const struct tab tab[] = {
3754bb1074Sjruoho 		{ "",			"",			0 },
3854bb1074Sjruoho 
3954bb1074Sjruoho 		{ "a",			"a",			0 },
4054bb1074Sjruoho 		{ "a",			"b",			-1 },
4154bb1074Sjruoho 		{ "b",			"a",			+1 },
4254bb1074Sjruoho 		{ "",			"a",			-1 },
4354bb1074Sjruoho 		{ "a",			"",			+1 },
4454bb1074Sjruoho 
4554bb1074Sjruoho 		{ "aa",			"aa",			0 },
4654bb1074Sjruoho 		{ "aa",			"ab",			-1 },
4754bb1074Sjruoho 		{ "ab",			"aa",			+1 },
4854bb1074Sjruoho 		{ "a",			"aa",			-1 },
4954bb1074Sjruoho 		{ "aa",			"a",			+1 },
5054bb1074Sjruoho 
5154bb1074Sjruoho 		{ "aaa",		"aaa",			0 },
5254bb1074Sjruoho 		{ "aaa",		"aab",			-1 },
5354bb1074Sjruoho 		{ "aab",		"aaa",			+1 },
5454bb1074Sjruoho 		{ "aa",			"aaa",			-1 },
5554bb1074Sjruoho 		{ "aaa",		"aa",			+1 },
5654bb1074Sjruoho 
5754bb1074Sjruoho 		{ "aaaa",		"aaaa",			0 },
5854bb1074Sjruoho 		{ "aaaa",		"aaab",			-1 },
5954bb1074Sjruoho 		{ "aaab",		"aaaa",			+1 },
6054bb1074Sjruoho 		{ "aaa",		"aaaa",			-1 },
6154bb1074Sjruoho 		{ "aaaa",		"aaa",			+1 },
6254bb1074Sjruoho 
6354bb1074Sjruoho 		{ "aaaaa",		"aaaaa",		0 },
6454bb1074Sjruoho 		{ "aaaaa",		"aaaab",		-1 },
6554bb1074Sjruoho 		{ "aaaab",		"aaaaa",		+1 },
6654bb1074Sjruoho 		{ "aaaa",		"aaaaa",		-1 },
6754bb1074Sjruoho 		{ "aaaaa",		"aaaa",			+1 },
6854bb1074Sjruoho 
6954bb1074Sjruoho 		{ "aaaaaa",		"aaaaaa",		0 },
7054bb1074Sjruoho 		{ "aaaaaa",		"aaaaab",		-1 },
7154bb1074Sjruoho 		{ "aaaaab",		"aaaaaa",		+1 },
7254bb1074Sjruoho 		{ "aaaaa",		"aaaaaa",		-1 },
7354bb1074Sjruoho 		{ "aaaaaa",		"aaaaa",		+1 },
7454bb1074Sjruoho 	};
7554bb1074Sjruoho 
7654bb1074Sjruoho 	for (a0 = 0; a0 < sizeof(long); ++a0) {
7754bb1074Sjruoho 		for (a1 = 0; a1 < sizeof(long); ++a1) {
7854bb1074Sjruoho 			for (t = 0; t < __arraycount(tab); ++t) {
7954bb1074Sjruoho 				memcpy(&buf0[a0], tab[t].val0,
8054bb1074Sjruoho 				       strlen(tab[t].val0) + 1);
8154bb1074Sjruoho 				memcpy(&buf1[a1], tab[t].val1,
8254bb1074Sjruoho 				       strlen(tab[t].val1) + 1);
8354bb1074Sjruoho 
8454bb1074Sjruoho 				ret = f(&buf0[a0], &buf1[a1]);
8554bb1074Sjruoho 
8654bb1074Sjruoho 				if ((ret == 0 && tab[t].ret != 0) ||
8754bb1074Sjruoho 				    (ret <  0 && tab[t].ret >= 0) ||
8854bb1074Sjruoho 				    (ret >  0 && tab[t].ret <= 0)) {
8954bb1074Sjruoho 					fprintf(stderr, "a0 %d, a1 %d, t %d\n",
9054bb1074Sjruoho 					    a0, a1, t);
9154bb1074Sjruoho 					fprintf(stderr, "\"%s\" \"%s\" %d\n",
9254bb1074Sjruoho 					    &buf0[a0], &buf1[a1], ret);
9354bb1074Sjruoho 					atf_tc_fail("Check stderr for details");
9454bb1074Sjruoho 				}
9554bb1074Sjruoho 			}
9654bb1074Sjruoho 		}
9754bb1074Sjruoho 	}
9854bb1074Sjruoho }
9954bb1074Sjruoho 
1002b91d03eSjruoho ATF_TC(strcmp_simple);
ATF_TC_HEAD(strcmp_simple,tc)1012b91d03eSjruoho ATF_TC_HEAD(strcmp_simple, tc)
1022b91d03eSjruoho {
1032b91d03eSjruoho         atf_tc_set_md_var(tc, "descr", "Test strcmp(3) results, #2");
1042b91d03eSjruoho }
1052b91d03eSjruoho 
ATF_TC_BODY(strcmp_simple,tc)1062b91d03eSjruoho ATF_TC_BODY(strcmp_simple, tc)
1072b91d03eSjruoho {
1082b91d03eSjruoho 	char buf1[10] = "xxx";
1092b91d03eSjruoho 	char buf2[10] = "xxy";
1102b91d03eSjruoho 
11199db6ea6Sjruoho 	ATF_CHECK(strcmp(buf1, buf1) == 0);
11299db6ea6Sjruoho 	ATF_CHECK(strcmp(buf2, buf2) == 0);
1132b91d03eSjruoho 
114*010e9a3dSjoerg 	ATF_CHECK(strcmp("x\xf6x", "xox") > 0);
11599db6ea6Sjruoho 	ATF_CHECK(strcmp("xxx", "xxxyyy") < 0);
11699db6ea6Sjruoho 	ATF_CHECK(strcmp("xxxyyy", "xxx") > 0);
1172b91d03eSjruoho 
11899db6ea6Sjruoho 	ATF_CHECK(strcmp(buf1 + 0, buf2 + 0) < 0);
11999db6ea6Sjruoho 	ATF_CHECK(strcmp(buf1 + 1, buf2 + 1) < 0);
12099db6ea6Sjruoho 	ATF_CHECK(strcmp(buf1 + 2, buf2 + 2) < 0);
12199db6ea6Sjruoho 	ATF_CHECK(strcmp(buf1 + 3, buf2 + 3) == 0);
1222b91d03eSjruoho 
12399db6ea6Sjruoho 	ATF_CHECK(strcmp(buf2 + 0, buf1 + 0) > 0);
12499db6ea6Sjruoho 	ATF_CHECK(strcmp(buf2 + 1, buf1 + 1) > 0);
12599db6ea6Sjruoho 	ATF_CHECK(strcmp(buf2 + 2, buf1 + 2) > 0);
12699db6ea6Sjruoho 	ATF_CHECK(strcmp(buf2 + 3, buf1 + 3) == 0);
1272b91d03eSjruoho }
1282b91d03eSjruoho 
ATF_TP_ADD_TCS(tp)12954bb1074Sjruoho ATF_TP_ADD_TCS(tp)
13054bb1074Sjruoho {
13154bb1074Sjruoho 
13254bb1074Sjruoho 	ATF_TP_ADD_TC(tp, strcmp_basic);
1332b91d03eSjruoho 	ATF_TP_ADD_TC(tp, strcmp_simple);
13454bb1074Sjruoho 
13554bb1074Sjruoho 	return atf_no_error();
13654bb1074Sjruoho }
137