Sisyphus <[EMAIL PROTECTED]> writes:
>Hi,
>
>In an Inline C script I'm trying to pass a wide character string from perl.
>
>The perl side would look like (eg):
>
>$s = chr(12345) . chr(54321);

SvPV of s now has two chars utf8 encoded.

>pass_wide_string($s);
>
>and the Inline C function:
>
>void pass_wide_string(SV * w) {
>      wchar_t * widestring = SvPV_nolen(w);
>      .
>      .
>
>Is that a correct way for pass_wide_string() to grab the argument ? 

No.

>I 
>get a compiler warning that the line in question performs an 
>"initialization from incompatible pointer type".

Because SvPV is a char * not a wchar_t *

You need to convert to wide chars somewhere.
Which may mean knowing what kind of wide char it is.

e.g.
    pass_wide_string(encode('UCS-2',$s));   # say
and then cast in XS side:
    wchar_t * widestring = (wchar_t *) SvPV_nolen(w);

Or assuing wchar_t hold Unicode probably more robust leave perl 
side way it is and build a wchar_t string on XS side:

    U8 *src = (U8 *) SvPV_nolen(sv);
    wchar_t *dst;
    STRLEN len;
    wchar_t * widestring;
    Newz(32,widestring,wchar_t,SvCUR(sv)); // Bigger than needed
    dst = widestring;
    while (*src)
    {
     *dst++ = utf8_to_uv(src,&len);
     src += len;
    }  
    *dst++ = 0;
    ...
    Safefree(widestring);
    


Reply via email to