int mult (int x, int y);
void speak (const char* str);
unsigned char* arr (); // returns (0, 1, 2)
####
module-starter \
--module=XS::Wrap \
--author="Steve Bertrand" \
--email=steveb@cpan.org \
--license=perl
####
package XS::Wrap;
use warnings;
use strict;
our $VERSION = '0.01';
####
use warnings;
use strict;
use Inline Config =>
disable => clean_after_build =>
name => 'XS::Wrap';
use Inline 'C';
__END__
__C__
#include
#include
####
#include "EXTERN.h"
#include "perl.h"
#include "XSUB.h"
#include "INLINE.h"
#include
#include
MODULE = XS::Wrap PACKAGE = main
PROTOTYPES: DISABLE
####
#include "EXTERN.h"
#include "perl.h"
#include "XSUB.h"
#include "INLINE.h"
#include
#include
MODULE = XS::Wrap PACKAGE = XS::Wrap
PROTOTYPES: DISABLE
int mult (x, y)
int x
int y
void speak (str)
const char* str
unsigned char* arr ()
####
use warnings;
use strict;
our $VERSION = '0.01';
require XSLoader;
XSLoader::load('XS::Wrap', $VERSION);
use Exporter qw(import);
our @EXPORT_OK = qw(
my_mult
my_speak
my_arr
);
our %EXPORT_TAGS;
$EXPORT_TAGS{all} = [@EXPORT_OK];
sub my_mult {
my ($x, $y) = @_;
return mult($x, $y);
}
sub my_speak {
my ($str) = @_;
speak($str);
}
sub my_arr {
my @array = arr();
return @array;
}
####
LIBS => ['-lxswrap'],
####
perl Makefile.PL
make
make install
####
use warnings;
use strict;
use feature 'say';
use XS::Wrap qw(:all);
say my_mult(5, 5);
my_speak("hello, world!\n");
my @arr = my_arr();
say $_ for @arr;
####
25
hello, world!
####
use warnings;
use strict;
use Inline config =>
disable => clean_after_build =>
name => 'Test';
use Inline ('C' => 'DATA', libs => '-lxswrap');
print "$_\n" for _arr();
__END__
__C__
#include
#include
void _arr (){
unsigned char* c_array = arr();
inline_stack_vars;
inline_stack_reset;
int i;
for (i=0; i<3; i++){
inline_stack_push(sv_2mortal(newSViv(c_array[i])));
}
free(c_array);
inline_stack_done;
}
####
#include "EXTERN.h"
#include "perl.h"
#include "XSUB.h"
#include "INLINE.h"
#include
#include
void _arr (){
unsigned char* c_array = arr();
inline_stack_vars;
inline_stack_reset;
int i;
for (i=0; i<3; i++){
inline_stack_push(sv_2mortal(newSViv(c_array[i])));
}
free(c_array);
inline_stack_done;
}
MODULE = Test PACKAGE = main
PROTOTYPES: DISABLE
void
_arr ()
PREINIT:
I32* temp;
PPCODE:
temp = PL_markstack_ptr++;
_arr();
if (PL_markstack_ptr != temp) {
/* truly void, because dXSARGS not invoked */
PL_markstack_ptr = temp;
XSRETURN_EMPTY; /* return empty stack */
}
/* must have used dXSARGS; list context implied */
return; /* assume stack size is correct */
####
void _arr (){
unsigned char* c_array = arr();
inline_stack_vars;
inline_stack_reset;
int i;
for (i=0; i<3; i++){
inline_stack_push(sv_2mortal(newSViv(c_array[i])));
}
free(c_array);
inline_stack_done;
}
####
void
_arr ()
PREINIT:
I32* temp;
PPCODE:
temp = PL_markstack_ptr++;
_arr();
if (PL_markstack_ptr != temp) {
PL_markstack_ptr = temp;
XSRETURN_EMPTY;
}
return;
####
#include "EXTERN.h"
#include "perl.h"
#include "XSUB.h"
#include "INLINE.h"
#include
#include
void _arr (){
unsigned char* c_array = arr();
inline_stack_vars;
inline_stack_reset;
int i;
for (i=0; i<3; i++){
inline_stack_push(sv_2mortal(newSViv(c_array[i])));
}
free(c_array);
inline_stack_done;
}
MODULE = XS::Wrap PACKAGE = XS::Wrap
PROTOTYPES: DISABLE
int mult (x, y)
int x
int y
void speak (str)
const char* str
unsigned char* arr ()
void
_arr ()
PREINIT:
I32* temp;
PPCODE:
temp = PL_markstack_ptr++;
_arr();
if (PL_markstack_ptr != temp) {
PL_markstack_ptr = temp;
XSRETURN_EMPTY;
}
return;
####
sub my_arr {
my @array = _arr();
return @array;
}
####
perl example.pl
25
hello, world!
0
1
2
####
rm -rf _Inline
perl Makefile.PL
make
make test
make manifest
make install
make dist