Force RVALUE macros when in PERL_DEBUG_COW
[p5sagit/p5-mst-13.2.git] / utils / h2xs.PL
index 8b43191..bb4f537 100644 (file)
@@ -101,7 +101,7 @@ Allows a pre-existing extension directory to be overwritten.
 
 =item B<-P>, B<--omit-pod>
 
-Omit the autogenerated stub POD section. 
+Omit the autogenerated stub POD section.
 
 =item B<-X>, B<--omit-XS>
 
@@ -169,7 +169,7 @@ not found in standard include directories.
 
 =item B<-g>, B<--global>
 
-Include code for safely storing static data in the .xs file. 
+Include code for safely storing static data in the .xs file.
 Extensions that do no make use of static data can ignore this option.
 
 =item B<-h>, B<-?>, B<--help>
@@ -305,7 +305,7 @@ also the section on L<LIMITATIONS of B<-x>>.
 
     # Extension is ONC::RPC.
     h2xs -cfn ONC::RPC
-    
+
     # 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.
@@ -316,7 +316,7 @@ also the section on L<LIMITATIONS of B<-x>>.
     # whose names do not start with 'bar_'.
     h2xs -b 5.5.3 -e '^bar_' -n Lib::Foo foo.h
 
-    # Makefile.PL will look for library -lrpc in 
+    # Makefile.PL will look for library -lrpc in
     # additional directory /opt/net/lib
     h2xs rpcsvc/rusers -L/opt/net/lib -lrpc
 
@@ -326,7 +326,7 @@ also the section on L<LIMITATIONS of B<-x>>.
 
     # Extension is DCE::rgynbase
     # prefix "sec_rgy_" is dropped from perl function names
-    # subroutines are created for sec_rgy_wildcard_name and 
+    # subroutines are created for sec_rgy_wildcard_name and
     # sec_rgy_wildcard_sid
     h2xs -n DCE::rgynbase -p sec_rgy_ \
     -s sec_rgy_wildcard_name,sec_rgy_wildcard_sid dce/rgynbase
@@ -335,7 +335,7 @@ also the section on L<LIMITATIONS of B<-x>>.
     # visible from perl.h. Name of the extension is perl1.
     # When scanning perl.h, define -DEXT=extern -DdEXT= -DINIT(x)=
     # Extra backslashes below because the string is passed to shell.
-    # Note that a directory with perl header files would 
+    # Note that a directory with perl header files would
     #  be added automatically to include path.
     h2xs -xAn perl1 -F "-DEXT=extern -DdEXT= -DINIT\(x\)=" perl.h
 
@@ -522,18 +522,19 @@ OPTIONS:
     -O, --overwrite-ok    Allow overwriting of a pre-existing extension directory.
     -P, --omit-pod        Omit the stub POD section.
     -X, --omit-XS         Omit the XS portion (implies both -c and -f).
-    -a, --gen-accessors   Generate get/set accessors for struct and union members                           (used with -x).
-    -b, --compat-version  Specify a perl version to be backwards compatibile with
+    -a, --gen-accessors   Generate get/set accessors for struct and union members
+                          (used with -x).
+    -b, --compat-version  Specify a perl version to be backwards compatibile with.
     -c, --omit-constant   Omit the constant() function and specialised AUTOLOAD
                           from the XS file.
     -d, --debugging       Turn on debugging messages.
     -e, --omit-enums      Omit constants from enums in the constant() function.
-                          If a pattern is given, only the matching enums are 
+                          If a pattern is given, only the matching enums are
                           ignored.
     -f, --force           Force creation of the extension even if the C header
                           does not exist.
-    -g, --global          Include code for safely storing static data in the .xs file. 
-    -h, -?, --help        Display this help message
+    -g, --global          Include code for safely storing static data in the .xs file.
+    -h, -?, --help        Display this help message.
     -k, --omit-const-func Omit 'const' attribute on function arguments
                           (used with -x).
     -m, --gen-tied-var    Generate tied variables for access to declared
@@ -543,14 +544,14 @@ OPTIONS:
     -p, --remove-prefix   Specify a prefix which should be removed from the
                           Perl function names.
     -s, --const-subs      Create subroutines for specified macros.
-    -t, --default-type    Default type for autoloaded constants (default is IV)
-        --use-new-tests   Use Test::More in backward compatible modules
-        --use-old-tests   Use the module Test rather than Test::More
-        --skip-exporter   Do not export symbols
-        --skip-ppport     Do not use portability layer
-        --skip-autoloader Do not use the module C<AutoLoader>
-        --skip-strict     Do not use the pragma C<strict>
-        --skip-warnings   Do not use the pragma C<warnings>
+    -t, --default-type    Default type for autoloaded constants (default is IV).
+        --use-new-tests   Use Test::More in backward compatible modules.
+        --use-old-tests   Use the module Test rather than Test::More.
+        --skip-exporter   Do not export symbols.
+        --skip-ppport     Do not use portability layer.
+        --skip-autoloader Do not use the module C<AutoLoader>.
+        --skip-strict     Do not use the pragma C<strict>.
+        --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.
 
@@ -701,7 +702,8 @@ $opt_c = $opt_f = 1 if $opt_X;
 
 $opt_t ||= 'IV';
 
-my %const_xsub = map { $_,1 } split(/,+/, $opt_s) if $opt_s;
+my %const_xsub;
+%const_xsub = map { $_,1 } split(/,+/, $opt_s) if $opt_s;
 
 my $extralibs = '';
 
@@ -825,7 +827,7 @@ if( @path_h ){
     }
 
     if (!$opt_c) {
-      die "Can't find $tmp_path_h in @dirs\n" 
+      die "Can't find $tmp_path_h in @dirs\n"
        if ( ! $opt_f && ! -f "$rel_path_h" );
       # Scan the header file (we should deal with nested header files)
       # Record the names of simple #define constants into const_names
@@ -834,7 +836,7 @@ if( @path_h ){
     defines:
       while (<CH>) {
        if ($pre_sub_tri_graphs) {
-           # Preprocess all tri-graphs 
+           # Preprocess all tri-graphs
            # including things stuck in quoted string constants.
            s/\?\?=/#/g;                         # | ??=|  #|
            s/\?\?\!/|/g;                        # | ??!|  ||
@@ -888,20 +890,20 @@ if( @path_h ){
         my $src = do { local $/; <CH> };
         close CH;
         no warnings 'uninitialized';
-        
-        # Remove C and C++ comments 
+
+        # Remove C and C++ comments
         $src =~ s#/\*[^*]*\*+([^/*][^*]*\*+)*/|("(\\.|[^"\\])*"|'(\\.|[^'\\])*'|.[^/"'\\]*)#$2#gs;
-        
+
         while ($src =~ /(\benum\s*([\w_]*)\s*\{\s([\s\w=,]+)\})/gsc) {
-            my ($enum_name, $enum_body) = 
+            my ($enum_name, $enum_body) =
                 $1 =~ /enum\s*([\w_]*)\s*\{\s([\s\w=,]+)\}/gs;
             # skip enums matching $opt_e
             next if $opt_e && $enum_name =~ /$opt_e/;
             my $val = 0;
             for my $item (split /,/, $enum_body) {
-                my ($key, $declared_val) = $item =~ /(\w*)\s*=\s*(.*)/;
-                $val = length($declared_val) ? $declared_val : 1 + $val;
-                $seen_define{$key} = $declared_val;
+                my ($key, $declared_val) = $item =~ /(\w+)\s*(?:=\s*(.*))?/;
+                $val = defined($declared_val) && length($declared_val) ? $declared_val : 1 + $val;
+                $seen_define{$key} = $val;
                 $const_names{$key}++;
             }
         } # while (...)
@@ -921,13 +923,13 @@ my $constsxsfname = 'const-xs.inc';
 my $fallbackdirname = 'fallback';
 
 my $ext = chdir 'ext' ? 'ext/' : '';
-  
+
 my @modparts  = split(/::/,$module);
 my $modpname  = join('-', @modparts);
 my $modfname  = pop @modparts;
 my $modpmdir  = join '/', 'lib', @modparts;
 my $modpmname = join '/', $modpmdir, $modfname.'.pm';
-  
+
 if ($opt_O) {
        warn "Overwriting existing $ext$modpname!!!\n" if -e $modpname;
 }
@@ -980,6 +982,8 @@ if( ! $opt_X ){  # use XS, unless it was disabled
        'add_cppflags' => $addflags, 'c_styles' => \@styles;
       $c->set('includeDirs' => ["$Config::Config{archlib}/CORE", $cwd]);
 
+      $c->get('keywords')->{'__restrict'} = 1;
+
       push @$fdecls_parsed, @{ $c->get('parsed_fdecls') };
       push(@$fdecls, @{$c->get('fdecls')});
 
@@ -1053,7 +1057,7 @@ if( ! $opt_X ){  # use XS, unless it was disabled
       $n = keys %td;
       my ($k, $v);
       while (($k, $v) = each %seen_define) {
-       # print("found '$k'=>'$v'\n"), 
+       # print("found '$k'=>'$v'\n"),
        $bad_macs{$k} = $td{$k} = $td{$v} if exists $td{$v};
       }
     }
@@ -1123,7 +1127,7 @@ if ( $compat_version < 5.006 ) {
 
 # Determine @ISA.
 my @modISA;
-push @modISA, 'Exporter'       unless $skip_exporter; 
+push @modISA, 'Exporter'       unless $skip_exporter;
 push @modISA, 'DynaLoader'     if $use_Dyna;  # no XS
 my $myISA = "our \@ISA = qw(@modISA);";
 $myISA =~ s/^our // if $compat_version < 5.006;
@@ -1307,7 +1311,8 @@ if ($opt_x && $opt_a) {
 my $licence_hash = $licence;
 $licence_hash =~ s/^/#/gm;
 
-my $pod = <<"END" unless $opt_P;
+my $pod;
+$pod = <<"END" unless $opt_P;
 ## Below is stub documentation for your module. You'd better edit it!
 #
 #=head1 NAME
@@ -1615,7 +1620,7 @@ _to_ptr(THIS)
                croak("Size \%d of packed data != expected \%d",
                        len, sizeof(THIS));
            RETVAL = ($name *)s;
-       }   
+       }
        else
            croak("THIS is not of type $name");
     OUTPUT:
@@ -1748,9 +1753,9 @@ sub get_typemap {
     next unless -e $typemap ;
     # skip directories, binary files etc.
     warn " Scanning $typemap\n";
-    warn("Warning: ignoring non-text typemap file '$typemap'\n"), next 
+    warn("Warning: ignoring non-text typemap file '$typemap'\n"), next
       unless -T $typemap ;
-    open(TYPEMAP, $typemap) 
+    open(TYPEMAP, $typemap)
       or warn ("Warning: could not open typemap file '$typemap': $!\n"), next;
     my $mode = 'Typemap';
     while (<TYPEMAP>) {
@@ -1781,7 +1786,7 @@ sub normalize_type {              # Second arg: do not strip const's before \*
   my $do_keep_deep_const = shift;
   # If $do_keep_deep_const this is heuristical only
   my $keep_deep_const = ($do_keep_deep_const ? '\b(?![^(,)]*\*)' : '');
-  my $ignore_mods 
+  my $ignore_mods
     = "(?:\\b(?:(?:__const__|const)$keep_deep_const|static|inline|__inline__)\\b\\s*)*";
   if ($do_keep_deep_const) {   # Keep different compiled /RExen/o separately!
     $type =~ s/$ignore_mods//go;
@@ -1796,7 +1801,7 @@ sub normalize_type {              # Second arg: do not strip const's before \*
   $type =~ s/\* (?=\*)/*/g;
   $type =~ s/\. \. \./.../g;
   $type =~ s/ ,/,/g;
-  $types_seen{$type}++ 
+  $types_seen{$type}++
     unless $type eq '...' or $type eq 'void' or $std_types{$type};
   $type;
 }
@@ -2102,7 +2107,7 @@ _END_
     print "# pass: \$\@";
   } else {
     print "# fail: \$\@";
-    \$fail = 1;    
+    \$fail = 1;
   }
 }
 if (\$fail) {