#ifndef WIN32
#include <langinfo.h>
#endif
#include "EXTERN.h"
#include "perl.h"
#include "XSUB.h"
#include "perliol.h"
#ifdef WIN32
#define get_locale_encoding() newSVpvf("cp%lu", GetACP())
#else
#define get_locale_encoding() newSVpv(nl_langinfo(CODESET), 0)
#endif
IV
PerlIOLocale_pushed(pTHX_ PerlIO *f, const char *mode, SV *arg, PerlIO_funcs *tab)
{
PerlIO_funcs* encoding = PerlIO_find_layer(aTHX_ "encoding", 8, 1);
SV* locale_encoding = sv_2mortal(get_locale_encoding());
return PerlIO_push(aTHX_ f, encoding, mode, locale_encoding) == f ? 0 : -1;
}
PerlIO_funcs PerlIO_locale = {
sizeof(PerlIO_funcs),
"locale",
0,
0,
PerlIOLocale_pushed,
NULL,
#if PERL_VERSION >= 14
PerlIOBase_open,
#else
PerlIOBuf_open,
#endif
};
MODULE = PerlIO::locale PACKAGE = PerlIO::locale
BOOT:
PerlIO_define_layer(aTHX_ &PerlIO_locale);