Re: Passing scalars to C functions

[email protected] (Josef Moellers)
Newsgroups perl.xs
Organization Fujitsu Technology Solutions
Message-ID <[email protected]>
Reinhard Pagitsch wrote:
> Josef Moellers wrote:
>   
>> Hi,
>>
>> I'm fairly new to the XS business. I have managed to get the skeleton up 
>> (h2xs) and have also managed to write short functions that have ints as 
>> arguments and return strings, but I'd like to pass a full Perl scalar 
>> (my $cdb = pack('C*', 0x12, 0, 0, 0, 128, 0);) and retrieve the length 
>> (6) and the bytes themselves in the C function and also return such a 
>> scalar.
>>
>> How do I do that?
>>
>> Thanks,
>>
>> Josef
>>
>>     
>
>
> Did you looked at the eval_* functions in perlapi.pod?
>
> eval_pv
>
>      Tells Perl to eval the given string and return an SV* result.
>      NOTE: the perl_ form of this function is deprecated.
>              SV*     eval_pv(const char* p, I32 croak_on_error)
>
> eval_sv
>
>      Tells Perl to eval the string in the SV.
>      NOTE: the perl_ form of this function is deprecated.
>              I32     eval_sv(SV* sv, I32 flags)

No,

but some kind soul already pointed me at perlguts and there I found a 
reference to SvPV() which does exactly what I want:

void
scsi_cmd_in(fh, cmd, data_cnt)
        PerlIO *fh
        SV *cmd
        int data_cnt
PREINIT:
...
        unsigned char *scsi_cmd;
        STRLEN cmd_len;
PPCODE:
...
        scsi_cmd = SvPV(cmd, cmd_len);

Josef

-- 
These are my personal views and not those of Fujitsu Technology Solutions!
Josef Möllers (Pinguinpfleger bei FTS)
	If failure had no penalty success would not be a prize (T.  Pratchett)
Company Details: http://de.ts.fujitsu.com/imprint.html
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.