EU::Typemaps: Implement embedded-typemap dumping
authorSteffen Mueller <smueller@cpan.org>
Thu, 19 Jan 2012 07:46:54 +0000 (08:46 +0100)
committerSteffen Mueller <smueller@cpan.org>
Thu, 19 Jan 2012 08:35:07 +0000 (09:35 +0100)
This method will return a string representation of the typemap object
that can be included *verbatim* in an XS file.

MANIFEST
dist/ExtUtils-ParseXS/lib/ExtUtils/Typemaps.pm
dist/ExtUtils-ParseXS/lib/ExtUtils/Typemaps/Type.pm
dist/ExtUtils-ParseXS/t/514-t-embed.t [new file with mode: 0644]

index 75987af..346a87e 100644 (file)
--- a/MANIFEST
+++ b/MANIFEST
@@ -3144,6 +3144,7 @@ dist/ExtUtils-ParseXS/t/510-t-bare.t                              ExtUtils::Typemaps tests
 dist/ExtUtils-ParseXS/t/511-t-whitespace.t                     ExtUtils::Typemaps tests
 dist/ExtUtils-ParseXS/t/512-t-file.t                           ExtUtils::Typemaps tests
 dist/ExtUtils-ParseXS/t/513-t-merge.t                          ExtUtils::Typemaps tests
+dist/ExtUtils-ParseXS/t/514-t-embed.t                          ExtUtils::Typemaps tests
 dist/ExtUtils-ParseXS/t/600-t-compat.t                         ExtUtils::Typemaps tests
 dist/ExtUtils-ParseXS/t/data/b.typemap                         ExtUtils::Typemaps test data
 dist/ExtUtils-ParseXS/t/data/combined.typemap                  ExtUtils::Typemaps test data
index a338b23..b895efd 100644 (file)
@@ -2,7 +2,7 @@ package ExtUtils::Typemaps;
 use 5.006001;
 use strict;
 use warnings;
-our $VERSION = '1.02';
+our $VERSION = '1.03';
 #use Carp qw(croak);
 
 require ExtUtils::ParseXS;
@@ -590,6 +590,40 @@ sub as_string {
   return join '', @code;
 }
 
+=head2 as_embedded_typemap
+
+Generates and returns the string form of the typemap with the
+appropriate prefix around it for verbatim inclusion into an
+XS file as an embedded typemap. This will return a string like
+
+  TYPEMAP: <<END_OF_TYPEMAP
+  ... typemap here (see as_string) ...
+  END_OF_TYPEMAP
+
+The method takes care not to use a HERE-doc end marker that
+appears in the typemap string itself.
+
+=cut
+
+sub as_embedded_typemap {
+  my $self = shift;
+  my $string = $self->as_string;
+
+  my @ident_cand = qw(END_TYPEMAP END_OF_TYPEMAP END);
+  my $icand = 0;
+  my $cand_suffix = "";
+  while ($string =~ /^\Q$ident_cand[$icand]$cand_suffix\E\s*$/m) {
+    $icand++;
+    if ($icand == @ident_cand) {
+      $icand = 0;
+      ++$cand_suffix;
+    }
+  }
+
+  my $marker = "$ident_cand[$icand]$cand_suffix";
+  return "TYPEMAP: <<$marker;\n$string\n$marker\n";
+}
+
 =head2 merge
 
 Merges a given typemap into the object. Note that a failed merge
index ad57b3a..0f0ed2c 100644 (file)
@@ -2,7 +2,7 @@ package ExtUtils::Typemaps::Type;
 use 5.006001;
 use strict;
 use warnings;
-our $VERSION = '0.05';
+our $VERSION = '0.06';
 #use Carp qw(croak);
 require ExtUtils::Typemaps;
 
diff --git a/dist/ExtUtils-ParseXS/t/514-t-embed.t b/dist/ExtUtils-ParseXS/t/514-t-embed.t
new file mode 100644 (file)
index 0000000..976af31
--- /dev/null
@@ -0,0 +1,24 @@
+#!/usr/bin/perl
+use strict;
+use warnings;
+
+# tests for generating embedded typemaps
+
+use Test::More tests => 1;
+use ExtUtils::Typemaps;
+
+SCOPE: {
+  my $map = ExtUtils::Typemaps->new();
+  $map->add_string(string => <<HERE);
+char* T_PV
+HERE
+  is($map->as_embedded_typemap(), <<'HERE', "Embedded typemap as expected");
+TYPEMAP: <<END_TYPEMAP;
+TYPEMAP
+char*  T_PV
+
+END_TYPEMAP
+HERE
+}
+
+