Thomas Busch
2006-11-29 18:55:46 UTC
Hi,
for those who are interested, this typemap for wchar_t
seems to work.
Thomas.
============================================================
INPUT
T_WCHAR
{
// Alloc memory for wide char string. This could be a bit more
// then necessary.
Newz(0, $var, SvLEN($arg), wchar_t);
char* src = 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((U8*) src, &len);
src += len;
}
} else {
// char to wide char mapping
while (*src) {
*dst++ = (wchar_t) *src++;
}
}
*dst = 0;
SAVEFREEPV($var);
}
OUTPUT
T_WCHAR
{
wchar_t* src = (wchar_t*) $var;
U8* dst;
U8* d;
// Alloc memory for wide char string. This is clearly wider
// then necessary in most cases but no choice.
Newz(0, dst, 3 * wcslen(src), U8);
d = dst;
while (*src) {
d = uvuni_to_utf8(d, *src++);
}
*d = 0;
sv_setpv((SV*)$arg, (char*) dst);
sv_utf8_decode($arg);
Safefree(dst);
}
for those who are interested, this typemap for wchar_t
seems to work.
Thomas.
============================================================
INPUT
T_WCHAR
{
// Alloc memory for wide char string. This could be a bit more
// then necessary.
Newz(0, $var, SvLEN($arg), wchar_t);
char* src = 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((U8*) src, &len);
src += len;
}
} else {
// char to wide char mapping
while (*src) {
*dst++ = (wchar_t) *src++;
}
}
*dst = 0;
SAVEFREEPV($var);
}
OUTPUT
T_WCHAR
{
wchar_t* src = (wchar_t*) $var;
U8* dst;
U8* d;
// Alloc memory for wide char string. This is clearly wider
// then necessary in most cases but no choice.
Newz(0, dst, 3 * wcslen(src), U8);
d = dst;
while (*src) {
d = uvuni_to_utf8(d, *src++);
}
*d = 0;
sv_setpv((SV*)$arg, (char*) dst);
sv_utf8_decode($arg);
Safefree(dst);
}