#include <err.h>
#include <locale.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#define test_setlocale(_e, _c, _l) _test_setlocale(_e, _c, _l, __LINE__)
#define test_MB_CUR_MAX(_e) _test_MB_CUR_MAX(_e, __LINE__)
#define test_isalpha(_e, _c) _test_isalpha(_e, _c, __LINE__)
static void
_test_setlocale(char *expected, int category, char *locale, int line)
{
char *result = setlocale(category, locale);
if ((expected == NULL) || (result == NULL)) {
if (expected == result)
return;
errx(1, "[%d] setlocale(%d, \"%s\")=\"%s\" [expected: \"%s\"]",
line, category, locale, result, expected);
}
if (strcmp(expected, result) != 0)
errx(1, "[%d] setlocale(%d, \"%s\")=\"%s\" [expected: \"%s\"]",
line, category, locale, result, expected);
}
static void
_test_MB_CUR_MAX(size_t expected, int line)
{
if (MB_CUR_MAX != expected)
errx(1, "[%d] MB_CUR_MAX=%ld [expected %ld]",
line, MB_CUR_MAX, expected);
}
static void
_test_isalpha(int expected, int c, int line)
{
int result = isalpha(c);
if (!!result != expected)
errx(1, "[%d] isalpha(%d)=%d [expected %d]",
line, c, result, expected);
}
int
main(int argc, char *argv[])
{
test_setlocale("C", LC_ALL, NULL);
test_MB_CUR_MAX(1);
test_isalpha(0, 0xe9);
test_setlocale("fr_FR.UTF-8", LC_CTYPE, "");
test_setlocale("fr_FR.UTF-8", LC_MESSAGES, "");
test_MB_CUR_MAX(4);
test_isalpha(0, 0xe9);
test_setlocale("C", LC_MESSAGES, "C");
test_MB_CUR_MAX(4);
test_setlocale("C/fr_FR.UTF-8/C/C/C/C", LC_ALL, NULL);
test_setlocale("C", LC_CTYPE, "C");
test_MB_CUR_MAX(1);
test_setlocale("C", LC_ALL, NULL);
test_setlocale("C", LC_ALL, "C");
test_setlocale(NULL, -1, NULL);
test_setlocale(NULL, _LC_LAST, NULL);
test_setlocale(NULL, _LC_LAST+0xff, NULL);
test_setlocale("C", LC_ALL, NULL);
test_setlocale(NULL, -1, "");
test_setlocale(NULL, _LC_LAST, "");
test_setlocale(NULL, _LC_LAST+0xff, "");
test_setlocale("C", LC_ALL, NULL);
test_setlocale("C", LC_ALL, "C");
test_setlocale("invalid", LC_CTYPE, "invalid");
test_setlocale("invalid", LC_CTYPE, NULL);
test_MB_CUR_MAX(1);
test_isalpha(0, 0xe9);
test_setlocale("C", LC_ALL, "C");
test_setlocale("invalid.UTF-8", LC_CTYPE, "invalid.UTF-8");
test_setlocale("invalid.UTF-8", LC_CTYPE, NULL);
test_setlocale("C/invalid.UTF-8/C/C/C/C", LC_ALL, NULL);
test_MB_CUR_MAX(4);
test_setlocale("C", LC_ALL, "C");
test_setlocale(NULL, LC_CTYPE, "fr_FR.invalid");
test_setlocale("C", LC_CTYPE, NULL);
test_MB_CUR_MAX(1);
return (EXIT_SUCCESS);
}