On Mon, Feb 27, 2012 at 04:29:57PM +0000, Alberto Simões wrote:
> I googled for that, and found a typemap, but I do not understand how
> typemaps work.
Take a look at the Foo.c file that is generated off of your Foo.xs file. XS
"typemaps" are not very sophisticated -- they're just strings that get
inserted into a template for an XS function and then expanded. It so happens
that some variables are available ($var, $arg), but you seem to be using those
right already.
> 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< -------------
Looks good to me, aside from concerns about 16-bit wchar_t systems and code
points above the BMP.
(Although I don't know what SAVEFREEPV does, I assume it sets up the memory
you allocated to be freed once the function you are wrapping returns.)
Cheers,
Marvin Humphrey