f2d34afa1058d195513e7ab9a6c1f0ce38b4d05bRobert Mustacchi/*
f2d34afa1058d195513e7ab9a6c1f0ce38b4d05bRobert Mustacchi * This file and its contents are supplied under the terms of the
f2d34afa1058d195513e7ab9a6c1f0ce38b4d05bRobert Mustacchi * Common Development and Distribution License ("CDDL"), version 1.0.
f2d34afa1058d195513e7ab9a6c1f0ce38b4d05bRobert Mustacchi * You may only use this file in accordance with the terms of version
f2d34afa1058d195513e7ab9a6c1f0ce38b4d05bRobert Mustacchi * 1.0 of the CDDL.
f2d34afa1058d195513e7ab9a6c1f0ce38b4d05bRobert Mustacchi *
f2d34afa1058d195513e7ab9a6c1f0ce38b4d05bRobert Mustacchi * A full copy of the text of the CDDL should have accompanied this
f2d34afa1058d195513e7ab9a6c1f0ce38b4d05bRobert Mustacchi * source. A copy of the CDDL is also available via the Internet at
f2d34afa1058d195513e7ab9a6c1f0ce38b4d05bRobert Mustacchi * http://www.illumos.org/license/CDDL.
f2d34afa1058d195513e7ab9a6c1f0ce38b4d05bRobert Mustacchi */
f2d34afa1058d195513e7ab9a6c1f0ce38b4d05bRobert Mustacchi
f2d34afa1058d195513e7ab9a6c1f0ce38b4d05bRobert Mustacchi/*
f2d34afa1058d195513e7ab9a6c1f0ce38b4d05bRobert Mustacchi * Copyright 2016 Joyent, Inc.
f2d34afa1058d195513e7ab9a6c1f0ce38b4d05bRobert Mustacchi */
f2d34afa1058d195513e7ab9a6c1f0ce38b4d05bRobert Mustacchi
f2d34afa1058d195513e7ab9a6c1f0ce38b4d05bRobert Mustacchi/*
f2d34afa1058d195513e7ab9a6c1f0ce38b4d05bRobert Mustacchi * General tests for wcsncasecmp(). Test to make sure that the following are
f2d34afa1058d195513e7ab9a6c1f0ce38b4d05bRobert Mustacchi * true:
f2d34afa1058d195513e7ab9a6c1f0ce38b4d05bRobert Mustacchi *
f2d34afa1058d195513e7ab9a6c1f0ce38b4d05bRobert Mustacchi * o Two identical strings are equal
f2d34afa1058d195513e7ab9a6c1f0ce38b4d05bRobert Mustacchi * o Two strings with the same contents are equal
f2d34afa1058d195513e7ab9a6c1f0ce38b4d05bRobert Mustacchi * o Case insensitive in ASCII works
f2d34afa1058d195513e7ab9a6c1f0ce38b4d05bRobert Mustacchi * o Basic cases where strings aren't equal
f2d34afa1058d195513e7ab9a6c1f0ce38b4d05bRobert Mustacchi * o An ASCII string that would compare greater due to case is properly less
f2d34afa1058d195513e7ab9a6c1f0ce38b4d05bRobert Mustacchi * o Comparing with zero characters succeeds even if different strings
f2d34afa1058d195513e7ab9a6c1f0ce38b4d05bRobert Mustacchi * o Characters in a locale / language that don't have a notion of case are
f2d34afa1058d195513e7ab9a6c1f0ce38b4d05bRobert Mustacchi * consistent
f2d34afa1058d195513e7ab9a6c1f0ce38b4d05bRobert Mustacchi */
f2d34afa1058d195513e7ab9a6c1f0ce38b4d05bRobert Mustacchi
f2d34afa1058d195513e7ab9a6c1f0ce38b4d05bRobert Mustacchi#include <wchar.h>
f2d34afa1058d195513e7ab9a6c1f0ce38b4d05bRobert Mustacchi#include <string.h>
f2d34afa1058d195513e7ab9a6c1f0ce38b4d05bRobert Mustacchi#include <strings.h>
f2d34afa1058d195513e7ab9a6c1f0ce38b4d05bRobert Mustacchi#include <stdlib.h>
f2d34afa1058d195513e7ab9a6c1f0ce38b4d05bRobert Mustacchi#include <locale.h>
f2d34afa1058d195513e7ab9a6c1f0ce38b4d05bRobert Mustacchi#include <sys/debug.h>
f2d34afa1058d195513e7ab9a6c1f0ce38b4d05bRobert Mustacchi
f2d34afa1058d195513e7ab9a6c1f0ce38b4d05bRobert Mustacchiint
f2d34afa1058d195513e7ab9a6c1f0ce38b4d05bRobert Mustacchimain(void)
f2d34afa1058d195513e7ab9a6c1f0ce38b4d05bRobert Mustacchi{
f2d34afa1058d195513e7ab9a6c1f0ce38b4d05bRobert Mustacchi int ret;
f2d34afa1058d195513e7ab9a6c1f0ce38b4d05bRobert Mustacchi wchar_t a[32], b[32];
f2d34afa1058d195513e7ab9a6c1f0ce38b4d05bRobert Mustacchi const char *str = "kefka";
f2d34afa1058d195513e7ab9a6c1f0ce38b4d05bRobert Mustacchi const char *caps = "KEFKA";
f2d34afa1058d195513e7ab9a6c1f0ce38b4d05bRobert Mustacchi const char *less = "celes";
f2d34afa1058d195513e7ab9a6c1f0ce38b4d05bRobert Mustacchi const char *more = "terra";
f2d34afa1058d195513e7ab9a6c1f0ce38b4d05bRobert Mustacchi const char *hikari = "光";
f2d34afa1058d195513e7ab9a6c1f0ce38b4d05bRobert Mustacchi const char *awake = "目覚め";
f2d34afa1058d195513e7ab9a6c1f0ce38b4d05bRobert Mustacchi size_t len = strlen(str);
f2d34afa1058d195513e7ab9a6c1f0ce38b4d05bRobert Mustacchi
f2d34afa1058d195513e7ab9a6c1f0ce38b4d05bRobert Mustacchi /*
f2d34afa1058d195513e7ab9a6c1f0ce38b4d05bRobert Mustacchi * Start in en_US.UTF-8, which the test suites deps guarantee is
f2d34afa1058d195513e7ab9a6c1f0ce38b4d05bRobert Mustacchi * present.
f2d34afa1058d195513e7ab9a6c1f0ce38b4d05bRobert Mustacchi */
f2d34afa1058d195513e7ab9a6c1f0ce38b4d05bRobert Mustacchi (void) setlocale(LC_ALL, "en_US.UTF-8");
f2d34afa1058d195513e7ab9a6c1f0ce38b4d05bRobert Mustacchi (void) memset(a, 'a', sizeof (a));
f2d34afa1058d195513e7ab9a6c1f0ce38b4d05bRobert Mustacchi (void) memset(b, 'b', sizeof (b));
f2d34afa1058d195513e7ab9a6c1f0ce38b4d05bRobert Mustacchi
f2d34afa1058d195513e7ab9a6c1f0ce38b4d05bRobert Mustacchi ret = mbstowcs(a, str, len);
f2d34afa1058d195513e7ab9a6c1f0ce38b4d05bRobert Mustacchi VERIFY3U(ret, ==, len);
f2d34afa1058d195513e7ab9a6c1f0ce38b4d05bRobert Mustacchi ret = mbstowcs(b, str, len);
f2d34afa1058d195513e7ab9a6c1f0ce38b4d05bRobert Mustacchi VERIFY3U(ret, ==, len);
f2d34afa1058d195513e7ab9a6c1f0ce38b4d05bRobert Mustacchi
f2d34afa1058d195513e7ab9a6c1f0ce38b4d05bRobert Mustacchi VERIFY0(wcsncasecmp(a, a, len));
f2d34afa1058d195513e7ab9a6c1f0ce38b4d05bRobert Mustacchi VERIFY0(wcsncasecmp(a, b, len));
f2d34afa1058d195513e7ab9a6c1f0ce38b4d05bRobert Mustacchi
f2d34afa1058d195513e7ab9a6c1f0ce38b4d05bRobert Mustacchi ret = mbstowcs(b, caps, len);
f2d34afa1058d195513e7ab9a6c1f0ce38b4d05bRobert Mustacchi VERIFY3U(ret, ==, len);
f2d34afa1058d195513e7ab9a6c1f0ce38b4d05bRobert Mustacchi VERIFY0(wcsncasecmp(a, b, len));
f2d34afa1058d195513e7ab9a6c1f0ce38b4d05bRobert Mustacchi
f2d34afa1058d195513e7ab9a6c1f0ce38b4d05bRobert Mustacchi ret = mbstowcs(b, less, len);
f2d34afa1058d195513e7ab9a6c1f0ce38b4d05bRobert Mustacchi VERIFY3U(ret, ==, len);
f2d34afa1058d195513e7ab9a6c1f0ce38b4d05bRobert Mustacchi VERIFY3S(wcsncasecmp(a, b, len), >, 0);
f2d34afa1058d195513e7ab9a6c1f0ce38b4d05bRobert Mustacchi
f2d34afa1058d195513e7ab9a6c1f0ce38b4d05bRobert Mustacchi ret = mbstowcs(b, more, len);
f2d34afa1058d195513e7ab9a6c1f0ce38b4d05bRobert Mustacchi VERIFY3U(ret, ==, len);
f2d34afa1058d195513e7ab9a6c1f0ce38b4d05bRobert Mustacchi VERIFY3S(wcsncasecmp(a, b, len), <, 0);
f2d34afa1058d195513e7ab9a6c1f0ce38b4d05bRobert Mustacchi
f2d34afa1058d195513e7ab9a6c1f0ce38b4d05bRobert Mustacchi ret = mbstowcs(a, caps, len);
f2d34afa1058d195513e7ab9a6c1f0ce38b4d05bRobert Mustacchi VERIFY3U(ret, ==, len);
f2d34afa1058d195513e7ab9a6c1f0ce38b4d05bRobert Mustacchi ret = mbstowcs(b, less, len);
f2d34afa1058d195513e7ab9a6c1f0ce38b4d05bRobert Mustacchi VERIFY3U(ret, ==, len);
f2d34afa1058d195513e7ab9a6c1f0ce38b4d05bRobert Mustacchi VERIFY3S(wcsncmp(a, b, len), <, 0);
f2d34afa1058d195513e7ab9a6c1f0ce38b4d05bRobert Mustacchi VERIFY3S(wcsncasecmp(a, b, len), >, 0);
f2d34afa1058d195513e7ab9a6c1f0ce38b4d05bRobert Mustacchi
f2d34afa1058d195513e7ab9a6c1f0ce38b4d05bRobert Mustacchi VERIFY3S(wcsncasecmp(a, b, 0), ==, 0);
f2d34afa1058d195513e7ab9a6c1f0ce38b4d05bRobert Mustacchi
f2d34afa1058d195513e7ab9a6c1f0ce38b4d05bRobert Mustacchi /*
f2d34afa1058d195513e7ab9a6c1f0ce38b4d05bRobert Mustacchi * This locale is also guaranteed by the test suite.
f2d34afa1058d195513e7ab9a6c1f0ce38b4d05bRobert Mustacchi */
f2d34afa1058d195513e7ab9a6c1f0ce38b4d05bRobert Mustacchi (void) setlocale(LC_ALL, "ja_JP.UTF-8");
f2d34afa1058d195513e7ab9a6c1f0ce38b4d05bRobert Mustacchi ret = mbstowcs(a, hikari, sizeof (a));
f2d34afa1058d195513e7ab9a6c1f0ce38b4d05bRobert Mustacchi VERIFY3U(ret, >, 0);
f2d34afa1058d195513e7ab9a6c1f0ce38b4d05bRobert Mustacchi ret = mbstowcs(b, hikari, sizeof (b));
f2d34afa1058d195513e7ab9a6c1f0ce38b4d05bRobert Mustacchi VERIFY3U(ret, >, 0);
f2d34afa1058d195513e7ab9a6c1f0ce38b4d05bRobert Mustacchi VERIFY3S(wcsncasecmp(a, b, 1), ==, 0);
f2d34afa1058d195513e7ab9a6c1f0ce38b4d05bRobert Mustacchi
f2d34afa1058d195513e7ab9a6c1f0ce38b4d05bRobert Mustacchi ret = mbstowcs(b, awake, sizeof (b));
f2d34afa1058d195513e7ab9a6c1f0ce38b4d05bRobert Mustacchi VERIFY3U(ret, >, 0);
f2d34afa1058d195513e7ab9a6c1f0ce38b4d05bRobert Mustacchi VERIFY3S(wcsncasecmp(a, b, 1), !=, 0);
f2d34afa1058d195513e7ab9a6c1f0ce38b4d05bRobert Mustacchi
f2d34afa1058d195513e7ab9a6c1f0ce38b4d05bRobert Mustacchi return (0);
f2d34afa1058d195513e7ab9a6c1f0ce38b4d05bRobert Mustacchi}