#include <locale.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <wchar.h>
static int check_ascii(const char *locname);
int
main(void)
{
int result = 0;
setlocale(LC_ALL, "C");
result |= check_ascii(setlocale(LC_ALL, NULL));
setlocale(LC_ALL, "de_DE.UTF-8");
result |= check_ascii(setlocale(LC_ALL, NULL));
setlocale(LC_ALL, "ja_JP.EUC-JP");
result |= check_ascii(setlocale(LC_ALL, NULL));
return result;
}
static int
check_ascii(const char *locname)
{
wchar_t wc;
int res = 0;
printf("Testing locale \"%s\":\n", locname);
for (wc = 0; wc <= 127; ++wc) {
char buf[2 * MB_CUR_MAX];
mbstate_t s;
size_t n;
memset(buf, '\xff', sizeof(buf));
memset(&s, '\0', sizeof(s));
n = wcrtomb(buf, wc, &s);
if (n == (size_t) - 1) {
printf("%s: '\\x%x': encoding error\n", locname, (int) wc);
++res;
} else if (n == 0) {
printf("%s: '\\x%x': 0 returned\n", locname, (int) wc);
++res;
} else if (n != 1) {
printf("%s: '\\x%x': not 1 returned\n", locname, (int) wc);
++res;
} else if (wc != (wchar_t) buf[0]) {
printf("%s: L'\\x%x': buf[0] != '\\x%x'\n", locname, (int) wc,
(int) wc);
++res;
}
}
printf(res == 1 ? "%d error\n" : "%d errors\n", res);
return res != 0;
}