538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore/*
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore * This file and its contents are supplied under the terms of the
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore * Common Development and Distribution License ("CDDL"), version 1.0.
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore * You may only use this file in accordance with the terms of version
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore * 1.0 of the CDDL.
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore *
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore * A full copy of the text of the CDDL should have accompanied this
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore * source. A copy of the CDDL is also available via the Internet at
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore * http://www.illumos.org/license/CDDL.
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore */
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore/*
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore * Copyright 2014 Garrett D'Amore <garrett@damore.org>
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore */
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore/*
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore * This program tests that newlocale and uselocale work properly in
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore * multi-threaded programs. In order for it to work, it requires that
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore * some additional locales be installed.
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore */
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore#include <stdio.h>
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore#include <stdlib.h>
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore#include <string.h>
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore#include <locale.h>
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore#include <libintl.h>
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore#include <langinfo.h>
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore#include <nl_types.h>
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore#include <err.h>
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore#include <errno.h>
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore#include <unistd.h>
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore#include "test_common.h"
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore/*
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore * Note that on some platforms, different symbols are used. For example,
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore * MacOS Mavericks uses "Eu" for Euro symbol, instead of €. If the locale
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore * data changes, then this program will need to update to reflect that.
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore *
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore * Note also that this file is easiest edited with a UTF-8 capable editor,
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore * as there are embedded UTF-8 symbols in some of the strings.
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore */
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amorestruct langinfo_test {
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore nl_item param;
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore const char *value;
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore};
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amorestruct langinfo_test C_data[] = {
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore { CODESET, "646" },
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore { D_T_FMT, "%a %b %e %H:%M:%S %Y" },
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore { D_FMT, "%m/%d/%y" },
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore { T_FMT, "%H:%M:%S" },
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore { T_FMT_AMPM, "%I:%M:%S %p" },
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore { AM_STR, "AM" },
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore { PM_STR, "PM" },
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore { ERA, "" },
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore { ERA_D_FMT, "" },
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore { ERA_D_T_FMT, "" },
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore { ERA_T_FMT, "" },
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore { DAY_1, "Sunday" },
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore { DAY_7, "Saturday" },
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore { ABDAY_1, "Sun" },
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore { ABDAY_7, "Sat" },
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore { MON_1, "January" },
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore { MON_12, "December" },
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore { ABMON_1, "Jan" },
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore { ABMON_12, "Dec" },
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore { RADIXCHAR, "." },
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore { THOUSEP, "" },
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore { YESSTR, "yes" },
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore { NOSTR, "no" },
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore { YESEXPR, "^[yY]" },
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore { NOEXPR, "^[nN]" },
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore { CRNCYSTR, "" },
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore { -1, NULL }
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore};
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amorestruct langinfo_test en_us_utf8_data[] = {
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore { CODESET, "UTF-8" },
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore { D_T_FMT, "%B %e, %Y %I:%M:%S %p %Z" },
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore { D_FMT, "%m/%e/%y" },
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore { T_FMT, "%I:%M:%S %p" },
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore { T_FMT_AMPM, "%I:%M:%S %p" },
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore { AM_STR, "AM" },
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore { PM_STR, "PM" },
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore { ERA, "" },
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore { ERA_D_FMT, "" },
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore { ERA_D_T_FMT, "" },
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore { ERA_T_FMT, "" },
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore { DAY_1, "Sunday" },
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore { DAY_7, "Saturday" },
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore { ABDAY_1, "Sun" },
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore { ABDAY_7, "Sat" },
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore { MON_1, "January" },
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore { MON_12, "December" },
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore { ABMON_1, "Jan" },
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore { ABMON_12, "Dec" },
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore { RADIXCHAR, "." },
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore { THOUSEP, "," },
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore { YESSTR, "yes" },
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore { NOSTR, "no" },
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore { YESEXPR, "^(([yY]([eE][sS])?))" },
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore { NOEXPR, "^(([nN]([oO])?))" },
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore { CRNCYSTR, "-$" },
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore { -1, NULL }
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore};
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amorestruct langinfo_test en_gb_latin15_data[] = {
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore { CODESET, "ISO8859-15" },
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore { D_T_FMT, "%e %B %Y %H:%M:%S %Z" },
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore { D_FMT, "%d/%m/%Y" },
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore { T_FMT, "%H:%M:%S" },
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore { T_FMT_AMPM, "%I:%M:%S %p" },
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore { AM_STR, "AM" },
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore { PM_STR, "PM" },
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore { ERA, "" },
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore { ERA_D_FMT, "" },
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore { ERA_D_T_FMT, "" },
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore { ERA_T_FMT, "" },
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore { DAY_1, "Sunday" },
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore { DAY_7, "Saturday" },
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore { ABDAY_1, "Sun" },
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore { ABDAY_7, "Sat" },
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore { MON_1, "January" },
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore { MON_12, "December" },
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore { ABMON_1, "Jan" },
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore { ABMON_12, "Dec" },
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore { RADIXCHAR, "." },
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore { THOUSEP, "," },
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore { YESSTR, "yes" },
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore { NOSTR, "no" },
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore { YESEXPR, "^(([yY]([eE][sS])?))" },
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore { NOEXPR, "^(([nN]([oO])?))" },
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore { CRNCYSTR, "-\243" },
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore { -1, NULL }
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore};
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amorestruct langinfo_test ru_ru_utf8_data[] = {
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore { CODESET, "UTF-8" },
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore { D_T_FMT, "%e %B %Y г. %H:%M:%S %Z"},
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore { D_FMT, "%d.%m.%y" },
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore { T_FMT, "%H:%M:%S" },
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore { T_FMT_AMPM, "%I:%M:%S %p" },
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore { AM_STR, "до полудня" },
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore { PM_STR, "после полудня" },
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore { ERA, "" },
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore { ERA_D_FMT, "" },
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore { ERA_D_T_FMT, "" },
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore { ERA_T_FMT, "" },
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore { DAY_1, "воскресенье" },
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore { DAY_7, "суббота" },
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore { ABDAY_1, "вс" },
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore { ABDAY_7, "сб" },
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore { MON_1, "января" },
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore { MON_12, "декабря" },
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore { ABMON_1, "янв" },
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore { ABMON_12, "дек" },
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore { RADIXCHAR, "," },
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore { THOUSEP, " " },
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore { YESSTR, "да" },
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore { NOSTR, "нет" },
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore { YESEXPR, "^(([дД]([аА])?)|([yY]([eE][sS])?))" },
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore { NOEXPR, "^(([нН]([еЕ][тТ])?)|([nN]([oO])?))" },
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore { CRNCYSTR, "+руб." },
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore { -1, NULL }
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore};
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amorestruct {
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore const char *locale;
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore struct langinfo_test *loctest;
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore} locales[] = {
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore { "C", C_data },
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore { "en_US.UTF-8", en_us_utf8_data },
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore { "en_GB.ISO8859-15", en_gb_latin15_data },
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore { "ru_RU.UTF-8", ru_ru_utf8_data },
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore { NULL, NULL }
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore};
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amorevoid
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amoretest_nl_langinfo_1(const char *locale, struct langinfo_test *test)
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore{
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore char tname[128];
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore char *v;
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore test_t t;
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore (void) snprintf(tname, sizeof (tname), "nl_langinfo (locale %s)",
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore locale);
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore t = test_start(tname);
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore v = setlocale(LC_ALL, locale);
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore if (v == NULL) {
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore test_failed(t, "setlocale failed: %s", strerror(errno));
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore }
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore if (strcmp(v, locale) != 0) {
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore test_failed(t, "setlocale got %s instead of %s", v, locale);
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore }
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore for (int i = 0; test[i].value != NULL; i++) {
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore v = nl_langinfo(test[i].param);
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore test_debugf(t, "%d: expect [%s], got [%s]",
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore test[i].param, test[i].value, v);
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore if (strcmp(v, test[i].value) != 0) {
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore test_failed(t,
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore "param %d wrong, expected [%s], got [%s]",
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore test[i].param, test[i].value, v);
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore }
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore }
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore test_passed(t);
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore}
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amorevoid
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amoretest_nl_langinfo_l(const char *locale, struct langinfo_test *test)
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore{
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore char tname[128];
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore char *v;
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore test_t t;
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore locale_t loc;
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore (void) snprintf(tname, sizeof (tname), "nl_langinfo_l (locale %s)",
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore locale);
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore t = test_start(tname);
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore v = setlocale(LC_ALL, "C");
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore if (v == NULL) {
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore test_failed(t, "setlocale failed: %s", strerror(errno));
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore }
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore if (strcmp(v, "C") != 0) {
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore test_failed(t, "setlocale got %s instead of %s", v, "C");
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore }
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore loc = newlocale(LC_ALL_MASK, locale, NULL);
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore if (loc == NULL) {
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore test_failed(t, "newlocale failed: %s", strerror(errno));
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore }
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore for (int i = 0; test[i].value != NULL; i++) {
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore v = nl_langinfo_l(test[i].param, loc);
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore test_debugf(t, "%d: expect [%s], got [%s]",
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore test[i].param, test[i].value, v);
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore if (strcmp(v, test[i].value) != 0) {
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore test_failed(t,
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore "param %d wrong, expected [%s], got [%s]",
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore test[i].param, test[i].value, v);
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore }
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore }
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore test_passed(t);
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore}
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amorevoid
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amoretest_nl_langinfo(void)
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore{
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore for (int i = 0; locales[i].locale != NULL; i++) {
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore test_nl_langinfo_1(locales[i].locale, locales[i].loctest);
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore test_nl_langinfo_l(locales[i].locale, locales[i].loctest);
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore }
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore}
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amoreint
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amoremain(int argc, char **argv)
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore{
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore int optc;
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore while ((optc = getopt(argc, argv, "df")) != EOF) {
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore switch (optc) {
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore case 'd':
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore test_set_debug();
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore break;
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore case 'f':
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore test_set_force();
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore break;
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore default:
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore (void) fprintf(stderr, "Usage: %s [-df]\n", argv[0]);
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore exit(1);
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore }
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore }
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore test_nl_langinfo();
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore exit(0);
538aa54d819fa7751ca82bcc30d4ed8c57ec2ef2Garrett D'Amore}