in reply to Extending with C functions - some basic questions

One thing to understand is that Perl references and C pointers are two different things (despite the conceptual similarities).  So,

1. Can I pass a reference to a string and have the C-library fill it for me so that I can de-reference it on return and get the string?

The more natural way would to be to create a new scalar value (SV) and place the C string into it, for example using newSVpv(). Then return that SV to the Perl side, where you can access it as a normal Perl string. See perlapi, perlguts and PerlGuts Illustrated.

2. Can I construct and pass a pointer to a C-struct from my perl module and have it return the struct with values filled in?

Perl doesn't have structs in the sense C has. So you have to convert the contents into an appropriate form, such as a hash with keys corresponding to the struct's fields.

3. Can I pass a pointer to a function and have the C library call it

No. See perlcall for how to do it (it comes with several examples).

See also perlxs, perlxstut and Inline::C for the big picture of how to extend Perl with C.

Replies are listed 'Best First'.
Re^2: Extending with C functions - some basic questions
by andal (Hermit) on Dec 17, 2010 at 11:16 UTC

    3. Can I pass a pointer to a function and have the C library call it

    No. See perlcall for how to do it (it comes with several examples).

    Well, the answer really is "Yes. See perlcall for how to do it" :)

    You can do anything with XS, but you have to provide enough "glue" so that the code provided by your C library cooperates nice with the rest of perl interfaces.

      ...depends on how you interpret the word "pointer" that the OP used.

      If you read it as "C pointer" (as I did), i.e. an address of the entry point of the function in the compiled machine code, then the answer is strictly speaking "no", because Perl alone (without the help of XS modules) doesn't provide any direct way to get at the respective address — which in turn means you can't pass it to the C function. (And even if there was a way, it would not be recommended for normal purposes. Also, Perl functions don't directly correspond to compiled machine code.)

      If, OTOH, you read "pointer" as "Perl reference", then yes, sure you can pass it to the C function and use call_sv() to call it.

      Anyhow, it doesn't really matter whether the answer starts with yes or no, as long as the OP reads the referenced manual, in which case everything will become clear (hopefully :)

        Thanks andal and anonymous. Will read perlcall and come back if I have any questions