#include <errno.h>
#include <limits.h>
#include <locale.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <wchar.h>
#include <atf-c.h>
ATF_TC_WITHOUT_HEAD(mbrtowc_test);
ATF_TC_BODY(mbrtowc_test, tc)
{
mbstate_t s;
wchar_t wc;
char buf[MB_LEN_MAX + 1];
ATF_REQUIRE(MB_CUR_MAX == 1);
memset(buf, 0xcc, sizeof(buf));
buf[0] = 0;
ATF_REQUIRE(mbrtowc(&wc, buf, 1, NULL) == 0);
ATF_REQUIRE(wc == 0);
memset(&s, 0, sizeof(s));
ATF_REQUIRE(mbrtowc(&wc, buf, 1, &s) == 0);
ATF_REQUIRE(wc == 0);
ATF_REQUIRE(mbrtowc(NULL, 0, 0, NULL) == 0);
buf[0] = 'A';
ATF_REQUIRE(mbrtowc(&wc, buf, 1, NULL) == 1);
ATF_REQUIRE(wc == L'A');
memset(&s, 0, sizeof(s));
ATF_REQUIRE(mbrtowc(&wc, buf, 1, &s) == 1);
ATF_REQUIRE(wc == L'A');
wc = L'z';
memset(&s, 0, sizeof(s));
ATF_REQUIRE(mbrtowc(&wc, buf, 0, &s) == (size_t)-2);
ATF_REQUIRE(wc == L'z');
wc = L'z';
memset(&s, 0, sizeof(s));
buf[0] = '\0';
ATF_REQUIRE(mbrtowc(&wc, buf, 0, &s) == (size_t)-2);
ATF_REQUIRE(wc == L'z');
ATF_REQUIRE(strcmp(setlocale(LC_CTYPE, "ja_JP.eucJP"), "ja_JP.eucJP") == 0);
ATF_REQUIRE(MB_CUR_MAX > 1);
ATF_REQUIRE(mbrtowc(NULL, 0, 0, NULL) == 0);
memset(buf, 0xcc, sizeof(buf));
buf[0] = 0;
ATF_REQUIRE(mbrtowc(&wc, buf, 1, NULL) == 0);
ATF_REQUIRE(wc == 0);
memset(&s, 0, sizeof(s));
ATF_REQUIRE(mbrtowc(&wc, buf, 1, &s) == 0);
ATF_REQUIRE(wc == 0);
ATF_REQUIRE(mbrtowc(NULL, 0, 0, NULL) == 0);
buf[0] = 'A';
ATF_REQUIRE(mbrtowc(&wc, buf, 1, NULL) == 1);
ATF_REQUIRE(wc == L'A');
memset(&s, 0, sizeof(s));
ATF_REQUIRE(mbrtowc(&wc, buf, 1, &s) == 1);
ATF_REQUIRE(wc == L'A');
wc = L'z';
memset(&s, 0, sizeof(s));
ATF_REQUIRE(mbrtowc(&wc, buf, 0, &s) == (size_t)-2);
ATF_REQUIRE(wc == L'z');
memset(buf, 0xcc, sizeof(buf));
buf[0] = 0xa3;
buf[1] = 0x00;
memset(&s, 0, sizeof(s));
wc = 0;
ATF_REQUIRE(mbrtowc(&wc, buf, 1, &s) == (size_t)-2);
buf[1] = 0xc1;
memset(&s, 0, sizeof(s));
wc = 0;
ATF_REQUIRE(mbrtowc(&wc, buf, 2, &s) == 2);
ATF_REQUIRE(wc == 0xa3c1);
memset(buf, 0xcc, sizeof(buf));
buf[0] = 0xa3;
memset(&s, 0, sizeof(s));
wc = 0;
ATF_REQUIRE(mbrtowc(&wc, buf, 1, &s) == (size_t)-2);
ATF_REQUIRE(wc == 0);
buf[0] = 0xc1;
ATF_REQUIRE(mbrtowc(&wc, buf, 1, &s) == 1);
ATF_REQUIRE(wc == 0xa3c1);
}
ATF_TP_ADD_TCS(tp)
{
ATF_TP_ADD_TC(tp, mbrtowc_test);
return (atf_no_error());
}