Based on your function declaration, I'm guessing that you want to pass in an array of strings. You will need to instead pass a reference to an array containing strings when calling the function from Perl, then extract the strings from the Perl array and insert them into a C array. Maybe something like this (untested):
int function(a,b,sv) int a; unsigned short b; SV * sv; INIT: unsigned char ** c; // check if scalar is a reference and is referencing an array if(SvROK(sv) && SvTYPE(SvRV(sv)) == SVt_PVAV){ // dereference array AV * av = (AV*)SvRV(sv); // get highest array index I32 c_len = av_len(av); // allocate array c = (unsigned char **)malloc(len + 1); // loop through array for(int i = 0; i <= c_len; i++){ // store string in C array c[i] = (char*)SvPV_nolen((SV*)*av_fetch(av, i, 0)); } } OUTPUT: RETVAL
Check out these various manpages regarding the Perl internals and API for more info:
Regarding your 2nd question, callbacks in Perl are simply scalar values, holding references to subroutines, that you pass to your XS functions, and then call using the appropriate Perl functions. See the perlcall manpage for more info.
Update: Links fixed.
In reply to Re: perlxs help
by kejohm
in thread perlxs help
by KVB
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |