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