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.63';

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

lib/perlxstypemap.pod  view on Meta::CPAN

Declare C<ExtUtils::Typemaps::Basic> as a build-time dependency
in C<Makefile.PL> (use C<BUILD_REQUIRES>), or in your C<Build.PL>
(use C<build_requires>).

=item *

Include the following line in the XS section of your XS file:
(don't break the line)

  INCLUDE_COMMAND: $^X -MExtUtils::Typemaps::Cmd
                   -e "print embeddable_typemap(q{Basic})"

=back

=head2 Writing typemap Entries

Each INPUT or OUTPUT typemap entry is a double-quoted Perl string that
will be evaluated in the presence of certain variables to get the
final C code for mapping a certain C type.

This means that you can embed Perl code in your typemap (C) code using

t/515-typemaps-cmd.t  view on Meta::CPAN

#!/usr/bin/perl
#
# Test ExtUtils::Typemaps::Cmd::embeddable_typemap()

use strict;
use warnings;

# tests for the quick-n-dirty interface for XS inclusion

use Test::More tests => 6;
use File::Spec;
use ExtUtils::Typemaps::Cmd;

t/515-typemaps-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 1.251 second using v1.01-cache-2.11-cpan-39bf76dae61 )