Beefy Boxes and Bandwidth Generously Provided by pair Networks
No such thing as a small change
 
PerlMonks  

Re: perlxs help

by kejohm (Hermit)
on Jan 17, 2011 at 11:36 UTC ( [id://882655]=note: print w/replies, xml ) Need Help??


in reply to perlxs help

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.

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://882655]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others scrutinizing the Monastery: (5)
As of 2024-04-23 21:41 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found