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