C-DynaLib
view release on metacpan or search on metacpan
Makefile.PL view on Meta::CPAN
s/(;|\{|\}) /$1\n\t/g;
}
print OUT;
}
close IN;
close OUT;
$cmd =~ s/testcall.c -o testcall.E.c -E -P/testcall.E1.c -o testcall/;
}
}
AGAIN:
unlink ("testcall$self->{EXE_EXT}", $cdecl_h);
print "$cmd\n" if $Verbose;
system ($cmd);
if ($? == 0 && -x "testcall$self->{EXE_EXT}") {
my $runcmd = $self->{how_to_run};
print "$runcmd\n" if $Verbose;
system ($runcmd);
if ($? == 0 && -e $cdecl_h) {
print "Succeeded.\n" if $Verbose;
return 1;
}
# compiled okay and executable: no need to try the two
# other options no header and malloc
if ($cmd =~ / -DRESERVE/) {
last;
} else {
print "Try again with -DRESERVE\n" if $Verbose;
$cmd .= " -DRESERVE";
goto AGAIN;
}
}
}
return undef;
}
sub write_conv {
# Write conv.xsi, to be included in DynaLib.xs
open XS, ">$conv_xs"
or die "Can't write file \"$conv_xs\": $!\n";
print "Writing $conv_xs\n";
print XS <<XS;
#
# $conv_xs generated by $0. Don't edit this file, edit $0.
#
XS
#
# conv.xsi XS definition for the "glue" function that calls C.
#
for $convention (@convention) {
print XS <<XS;
void
${convention}_call_packed(symref, ret_type, ...)
void * symref
char * ret_type
PROTOTYPE: \$\$\@
PPCODE:
{
SV *sv;
#ifdef HAS_QUAD
Quad_t aquad;
unsigned Quad_t auquad;
#endif
if (*ret_type != '\\0') {
sv = sv_newmortal();
}
switch (*ret_type) {
case '\\0' :
(void) ${convention}_CALL(symref, int);
XSRETURN_EMPTY;
case 'i' :
sv_setiv(sv, (IV) ${convention}_CALL(symref, int));
break;
case 'l' :
sv_setiv(sv, (IV) ${convention}_CALL(symref, I32));
break;
case 's' :
sv_setiv(sv, (IV) ${convention}_CALL(symref, I16));
break;
case 'c' :
sv_setiv(sv, (IV) ${convention}_CALL(symref, char));
break;
case 'I' :
sv_setuv(sv, (UV) ${convention}_CALL(symref, uint));
break;
case 'L' :
sv_setuv(sv, (UV) ${convention}_CALL(symref, U32));
break;
case 'S' :
sv_setuv(sv, (UV) ${convention}_CALL(symref, U16));
break;
case 'C' :
sv_setuv(sv, (UV) ${convention}_CALL(symref, uchar));
break;
#ifdef HAS_QUAD
case 'q' :
aquad = ${convention}_CALL(symref, Quad_t);
if (aquad >= IV_MIN && aquad <= IV_MAX)
sv_setiv(sv, (IV)aquad);
else
sv_setnv(sv, (double)aquad);
break;
case 'Q' :
aquad = ${convention}_CALL(symref, Uquad_t);
if (aquad <= UV_MAX)
sv_setuv(sv, (UV)auquad);
else
sv_setnv(sv, (double)auquad);
break;
#endif
case 'f' :
sv_setnv(sv, (double) ${convention}_CALL(symref, float));
break;
case 'd' :
sv_setnv(sv, ${convention}_CALL(symref, double));
break;
( run in 1.547 second using v1.01-cache-2.11-cpan-71847e10f99 )