ExtUtils-ParseXS
view release on metacpan or search on metacpan
lib/ExtUtils/Typemaps/Cmd.pm view on Meta::CPAN
use 5.006001;
use strict;
use warnings;
our $VERSION = '3.57';
use ExtUtils::Typemaps;
require Exporter;
our @ISA = qw(Exporter);
our @EXPORT = qw(embeddable_typemap);
our %EXPORT_TAGS = (all => \@EXPORT);
sub embeddable_typemap {
my @tms = @_;
# Get typemap objects
my @tm_objs = map [$_, _intuit_typemap_source($_)], @tms;
# merge or short-circuit
my $final_tm;
if (@tm_objs == 1) {
# just one, merge would be pointless
$final_tm = shift(@tm_objs)->[1];
lib/ExtUtils/Typemaps/Cmd.pm view on Meta::CPAN
=head1 NAME
ExtUtils::Typemaps::Cmd - Quick commands for handling typemaps
=head1 SYNOPSIS
From XS:
INCLUDE_COMMAND: $^X -MExtUtils::Typemaps::Cmd \
-e "print embeddable_typemap(q{Excommunicated})"
Loads C<ExtUtils::Typemaps::Excommunicated>, instantiates an object,
and dumps it as an embeddable typemap for use directly in your XS file.
=head1 DESCRIPTION
This is a helper module for L<ExtUtils::Typemaps> for quick
one-liners, specifically for inclusion of shared typemaps
that live on CPAN into an XS file (see SYNOPSIS).
For this reason, the following functions are exported by default:
=head1 EXPORTED FUNCTIONS
=head2 embeddable_typemap
Given a list of identifiers, C<embeddable_typemap>
tries to load typemaps from a file of the given name(s),
or from a module that is an C<ExtUtils::Typemaps> subclass.
Returns a string representation of the merged typemaps that can
be included verbatim into XS. Example:
print embeddable_typemap(
"Excommunicated", "ExtUtils::Typemaps::Basic", "./typemap"
);
This will try to load a module C<ExtUtils::Typemaps::Excommunicated>
and use it as an C<ExtUtils::Typemaps> subclass. If that fails, it'll
try loading C<Excommunicated> as a module, if that fails, it'll try to
read a file called F<Excommunicated>. It'll work similarly for the
second argument, but the third will be loaded as a file first.
After loading all typemap files or modules, it will merge them in the
t/515-t-cmd.t view on Meta::CPAN
my $q = $p or return;
push @idx, reverse splice @idx, $p;
++$q while $idx[$p-1] > $idx[$q];
@idx[$p-1,$q]=@idx[$q,$p-1];
}
}
SCOPE: {
no warnings 'once';
ok(defined(*embeddable_typemap{CODE}), "function exported");
}
my $start = "TYPEMAP: <<END_TYPEMAP;\n";
my $end = "\nEND_TYPEMAP\n";
is(
embeddable_typemap(),
"${start}TYPEMAP\n$end",
"empty call to embeddable_typemap"
);
my $typemap_file = File::Spec->catfile($datadir, "simple.typemap");
is(
embeddable_typemap($typemap_file),
$start . slurp($typemap_file) . $end,
"embeddable typemap from file"
);
my $foo_content = <<HERE;
TYPEMAP
myfoo* T_PV
HERE
is(
embeddable_typemap("TypemapTest::Foo"),
"$start$foo_content$end",
"embeddable typemap from full module name"
);
my $test_content = <<HERE;
TYPEMAP
mytype* T_SV
HERE
is(
embeddable_typemap("Test"),
"$start$test_content$end",
"embeddable typemap from relative module name"
);
SCOPE: {
my $combined = embeddable_typemap("Test", "TypemapTest::Foo");
my @lines = (
'myfoo* T_PV',
'mytype* T_SV',
);
my @exp = map {"TYPEMAP\n" . join("\n", @$_) . "\n"}
(\@lines, [reverse @lines]);
ok(scalar(grep "$start$_$end" eq $combined, @exp), "combined both modules")
or note("Actual output: '$combined'");
}
# in theory, we should test
# embeddable_typemap($typemap_file, "Test", "TypemapTest::Foo"),
# but I can't be bothered.
( run in 0.604 second using v1.01-cache-2.11-cpan-a5abf4f5562 )