1272343Sngie/* $NetBSD: t_strcmp.c,v 1.4 2012/03/25 08:17:54 joerg Exp $ */ 2272343Sngie 3272343Sngie/* 4272343Sngie * Written by J.T. Conklin <jtc@acorntoolworks.com> 5272343Sngie * Public domain. 6272343Sngie */ 7272343Sngie 8272343Sngie#include <atf-c.h> 9272343Sngie#include <string.h> 10272343Sngie#include <unistd.h> 11272343Sngie#include <stdio.h> 12272343Sngie#include <stdlib.h> 13272343Sngie 14272343SngieATF_TC(strcmp_basic); 15272343SngieATF_TC_HEAD(strcmp_basic, tc) 16272343Sngie{ 17272343Sngie atf_tc_set_md_var(tc, "descr", "Test strcmp(3) results, #1"); 18272343Sngie} 19272343Sngie 20272343SngieATF_TC_BODY(strcmp_basic, tc) 21272343Sngie{ 22272343Sngie /* try to trick the compiler */ 23272343Sngie int (*f)(const char *, const char *s) = strcmp; 24272343Sngie 25272343Sngie unsigned int a0, a1, t; 26272343Sngie char buf0[64]; 27272343Sngie char buf1[64]; 28272343Sngie int ret; 29272343Sngie 30272343Sngie struct tab { 31272343Sngie const char* val0; 32272343Sngie const char* val1; 33272343Sngie int ret; 34272343Sngie }; 35272343Sngie 36272343Sngie const struct tab tab[] = { 37272343Sngie { "", "", 0 }, 38272343Sngie 39272343Sngie { "a", "a", 0 }, 40272343Sngie { "a", "b", -1 }, 41272343Sngie { "b", "a", +1 }, 42272343Sngie { "", "a", -1 }, 43272343Sngie { "a", "", +1 }, 44272343Sngie 45272343Sngie { "aa", "aa", 0 }, 46272343Sngie { "aa", "ab", -1 }, 47272343Sngie { "ab", "aa", +1 }, 48272343Sngie { "a", "aa", -1 }, 49272343Sngie { "aa", "a", +1 }, 50272343Sngie 51272343Sngie { "aaa", "aaa", 0 }, 52272343Sngie { "aaa", "aab", -1 }, 53272343Sngie { "aab", "aaa", +1 }, 54272343Sngie { "aa", "aaa", -1 }, 55272343Sngie { "aaa", "aa", +1 }, 56272343Sngie 57272343Sngie { "aaaa", "aaaa", 0 }, 58272343Sngie { "aaaa", "aaab", -1 }, 59272343Sngie { "aaab", "aaaa", +1 }, 60272343Sngie { "aaa", "aaaa", -1 }, 61272343Sngie { "aaaa", "aaa", +1 }, 62272343Sngie 63272343Sngie { "aaaaa", "aaaaa", 0 }, 64272343Sngie { "aaaaa", "aaaab", -1 }, 65272343Sngie { "aaaab", "aaaaa", +1 }, 66272343Sngie { "aaaa", "aaaaa", -1 }, 67272343Sngie { "aaaaa", "aaaa", +1 }, 68272343Sngie 69272343Sngie { "aaaaaa", "aaaaaa", 0 }, 70272343Sngie { "aaaaaa", "aaaaab", -1 }, 71272343Sngie { "aaaaab", "aaaaaa", +1 }, 72272343Sngie { "aaaaa", "aaaaaa", -1 }, 73272343Sngie { "aaaaaa", "aaaaa", +1 }, 74272343Sngie }; 75272343Sngie 76272343Sngie for (a0 = 0; a0 < sizeof(long); ++a0) { 77272343Sngie for (a1 = 0; a1 < sizeof(long); ++a1) { 78272343Sngie for (t = 0; t < __arraycount(tab); ++t) { 79272343Sngie memcpy(&buf0[a0], tab[t].val0, 80272343Sngie strlen(tab[t].val0) + 1); 81272343Sngie memcpy(&buf1[a1], tab[t].val1, 82272343Sngie strlen(tab[t].val1) + 1); 83272343Sngie 84272343Sngie ret = f(&buf0[a0], &buf1[a1]); 85272343Sngie 86272343Sngie if ((ret == 0 && tab[t].ret != 0) || 87272343Sngie (ret < 0 && tab[t].ret >= 0) || 88272343Sngie (ret > 0 && tab[t].ret <= 0)) { 89272343Sngie fprintf(stderr, "a0 %d, a1 %d, t %d\n", 90272343Sngie a0, a1, t); 91272343Sngie fprintf(stderr, "\"%s\" \"%s\" %d\n", 92272343Sngie &buf0[a0], &buf1[a1], ret); 93272343Sngie atf_tc_fail("Check stderr for details"); 94272343Sngie } 95272343Sngie } 96272343Sngie } 97272343Sngie } 98272343Sngie} 99272343Sngie 100272343SngieATF_TC(strcmp_simple); 101272343SngieATF_TC_HEAD(strcmp_simple, tc) 102272343Sngie{ 103272343Sngie atf_tc_set_md_var(tc, "descr", "Test strcmp(3) results, #2"); 104272343Sngie} 105272343Sngie 106272343SngieATF_TC_BODY(strcmp_simple, tc) 107272343Sngie{ 108272343Sngie char buf1[10] = "xxx"; 109272343Sngie char buf2[10] = "xxy"; 110272343Sngie 111272343Sngie ATF_CHECK(strcmp(buf1, buf1) == 0); 112272343Sngie ATF_CHECK(strcmp(buf2, buf2) == 0); 113272343Sngie 114272343Sngie ATF_CHECK(strcmp("x\xf6x", "xox") > 0); 115272343Sngie ATF_CHECK(strcmp("xxx", "xxxyyy") < 0); 116272343Sngie ATF_CHECK(strcmp("xxxyyy", "xxx") > 0); 117272343Sngie 118272343Sngie ATF_CHECK(strcmp(buf1 + 0, buf2 + 0) < 0); 119272343Sngie ATF_CHECK(strcmp(buf1 + 1, buf2 + 1) < 0); 120272343Sngie ATF_CHECK(strcmp(buf1 + 2, buf2 + 2) < 0); 121272343Sngie ATF_CHECK(strcmp(buf1 + 3, buf2 + 3) == 0); 122272343Sngie 123272343Sngie ATF_CHECK(strcmp(buf2 + 0, buf1 + 0) > 0); 124272343Sngie ATF_CHECK(strcmp(buf2 + 1, buf1 + 1) > 0); 125272343Sngie ATF_CHECK(strcmp(buf2 + 2, buf1 + 2) > 0); 126272343Sngie ATF_CHECK(strcmp(buf2 + 3, buf1 + 3) == 0); 127272343Sngie} 128272343Sngie 129272343SngieATF_TP_ADD_TCS(tp) 130272343Sngie{ 131272343Sngie 132272343Sngie ATF_TP_ADD_TC(tp, strcmp_basic); 133272343Sngie ATF_TP_ADD_TC(tp, strcmp_simple); 134272343Sngie 135272343Sngie return atf_no_error(); 136272343Sngie} 137