Various changes to regex diagnostics and testing
[p5sagit/p5-mst-13.2.git] / utils / h2xs.PL
index 20fa9c3..c774d62 100644 (file)
@@ -66,6 +66,9 @@ the library path determined by Configure.  That path can be augmented
 by including arguments of the form B<-L/another/library/path> in the
 extra-libraries argument.
 
+In spite of its name, I<h2xs> may also be used to create a skeleton pure
+Perl module. See the B<-X> option.
+
 =head1 OPTIONS
 
 =over 5
@@ -105,8 +108,8 @@ Omit the autogenerated stub POD section.
 
 =item B<-X>, B<--omit-XS>
 
-Omit the XS portion.  Used to generate templates for a module which is not
-XS-based.  C<-c> and C<-f> are implicitly enabled.
+Omit the XS portion. Used to generate a skeleton pure Perl module.
+C<-c> and C<-f> are implicitly enabled.
 
 =item B<-a>, B<--gen-accessors>
 
@@ -306,6 +309,9 @@ also the section on L<LIMITATIONS of B<-x>>.
     # Extension is ONC::RPC.
     h2xs -cfn ONC::RPC
 
+    # Extension is a pure Perl module with no XS code.
+    h2xs -X My::Module
+
     # Extension is Lib::Foo which works at least with Perl5.005_03.
     # Constants are created for all #defines and enums h2xs can find
     # in foo.h.
@@ -554,6 +560,8 @@ OPTIONS:
         --skip-warnings   Do not use the pragma C<warnings>.
     -v, --version         Specify a version number for this extension.
     -x, --autogen-xsubs   Autogenerate XSUBs using C::Scan.
+        --use-xsloader    Use XSLoader in backward compatible modules (ignored
+                          when used with -X).
 
 extra_libraries
          are any libraries that might be needed for loading the
@@ -593,6 +601,7 @@ my ($opt_A,
     $skip_autoloader,
     $skip_strict,
     $skip_warnings,
+    $use_xsloader
    );
 
 Getopt::Long::Configure('bundling');
@@ -631,6 +640,7 @@ my %options = (
                 'skip-autoloader'    => \$skip_autoloader,
                 'skip-warnings'      => \$skip_warnings,
                 'skip-strict'        => \$skip_strict,
+                'use-xsloader'       => \$use_xsloader,
               );
 
 GetOptions(%options) || usage;
@@ -648,9 +658,7 @@ if( $opt_b ){
            $sub ? sprintf("%d.%03d%02d",$maj,$min,$sub) :
                   sprintf("%d.%03d",    $maj,$min);
     } else {
-        $compat_version =
-           $sub ? sprintf("%d.%03d%03d",$maj,$min,$sub) :
-                  sprintf("%d.%03d",    $maj,$min);
+        $compat_version = sprintf("%d.%03d%03d",$maj,$min,$sub);
     }
 } else {
     my ($maj,$min,$sub) = $compat_version =~ /(\d+)\.(\d\d\d)(\d*)/;
@@ -894,13 +902,13 @@ if( @path_h ){
         # Remove C and C++ comments
         $src =~ s#/\*[^*]*\*+([^/*][^*]*\*+)*/|("(\\.|[^"\\])*"|'(\\.|[^'\\])*'|.[^/"'\\]*)#$2#gs;
 
-        while ($src =~ /(\benum\s*([\w_]*)\s*\{\s([\s\w=,]+)\})/gsc) {
-            my ($enum_name, $enum_body) =
-                $1 =~ /enum\s*([\w_]*)\s*\{\s([\s\w=,]+)\}/gs;
+       while ($src =~ /\benum\s*([\w_]*)\s*\{\s([^}]+)\}/gsc) {
+           my ($enum_name, $enum_body) = ($1, $2);
             # skip enums matching $opt_e
             next if $opt_e && $enum_name =~ /$opt_e/;
             my $val = 0;
             for my $item (split /,/, $enum_body) {
+                next if $item =~ /\A\s*\Z/;
                 my ($key, $declared_val) = $item =~ /(\w+)\s*(?:=\s*(.*))?/;
                 $val = defined($declared_val) && length($declared_val) ? $declared_val : 1 + $val;
                 $seen_define{$key} = $val;
@@ -1101,7 +1109,7 @@ print PM <<'END' unless $skip_exporter;
 require Exporter;
 END
 
-my $use_Dyna = (not $opt_X and $compat_version < 5.006);
+my $use_Dyna = (not $opt_X and $compat_version < 5.006 and not $use_xsloader);
 print PM <<"END" if $use_Dyna;  # use DynaLoader, unless XS was disabled
 require DynaLoader;
 END
@@ -1236,6 +1244,7 @@ eval {
        }
      };
 
+$author =~ s/'/\\'/g if defined $author;
 $author ||= "A. U. Thor";
 $email  ||= 'a.u.thor@a.galaxy.far.far.away';
 
@@ -1884,15 +1893,16 @@ EOP
 warn "Writing $ext$modpname/Makefile.PL\n";
 open(PL, ">Makefile.PL") || die "Can't create $ext$modpname/Makefile.PL: $!\n";
 
-my $prereq_pm;
+my $prereq_pm = '';
 
 if ( $compat_version < 5.00702 and $new_test )
 {
-  $prereq_pm = q%'Test::More'  =>  0%;
+  $prereq_pm .= q%'Test::More'  =>  0, %;
 }
-else
+
+if ( $compat_version < 5.00600 and !$opt_X and $use_xsloader)
 {
-  $prereq_pm = '';
+  $prereq_pm .= q%'XSLoader'  =>  0, %;
 }
 
 print PL <<"END";