Alberto Simões
2012-02-27 16:29:57 UTC
Hello
I really need to make my code work with XS and wchar_t.
As far as I can tell there is no typemap for that in the core:
xs/NATools.c:733: warning: passing argument 3 of ‘Perl_sv_setpv’ from
incompatible pointer type
I googled for that, and found a typemap, but I do not understand how
typemaps work. My typemap looks like:
------ 8< ----------
TYPEMAP
wchar_t
INPUT
T_WCHAR
{
// Alloc memory for wide char string. This could be a bit more
// then necessary.
Newz(0, $var, SvLEN($arg), wchar_t);
U8* src = (U8*) SvPV_nolen($arg);
wchar_t* dst = (wchar_t*) $var;
if (SvUTF8($arg)) {
// UTF8 to wide char mapping
STRLEN len;
while (*src) {
*dst++ = utf8_to_uvuni(src, &len);
src += len;
}
} else {
// char to wide char mapping
while (*src) {
*dst++ = (wchar_t) *src++;
}
}
*dst = 0;
SAVEFREEPV($var);
}
------ 8< -------------
But then, this seems to be a Perl => wchar only. I would need the other
way around too.
Any help?
Thanks
Ambs
I really need to make my code work with XS and wchar_t.
As far as I can tell there is no typemap for that in the core:
xs/NATools.c:733: warning: passing argument 3 of ‘Perl_sv_setpv’ from
incompatible pointer type
I googled for that, and found a typemap, but I do not understand how
typemaps work. My typemap looks like:
------ 8< ----------
TYPEMAP
wchar_t
INPUT
T_WCHAR
{
// Alloc memory for wide char string. This could be a bit more
// then necessary.
Newz(0, $var, SvLEN($arg), wchar_t);
U8* src = (U8*) SvPV_nolen($arg);
wchar_t* dst = (wchar_t*) $var;
if (SvUTF8($arg)) {
// UTF8 to wide char mapping
STRLEN len;
while (*src) {
*dst++ = utf8_to_uvuni(src, &len);
src += len;
}
} else {
// char to wide char mapping
while (*src) {
*dst++ = (wchar_t) *src++;
}
}
*dst = 0;
SAVEFREEPV($var);
}
------ 8< -------------
But then, this seems to be a Perl => wchar only. I would need the other
way around too.
Any help?
Thanks
Ambs