This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
ext/Errno/Errno_pm.PL: fix for GNU hurd
[perl5.git] / ext / Errno / Errno_pm.PL
index 41560d5..39e2c19 100644 (file)
@@ -2,7 +2,7 @@ use ExtUtils::MakeMaker;
 use Config;
 use strict;
 
-our $VERSION = "1.09_00";
+our $VERSION = "1.09_01";
 
 my %err = ();
 my %wsa = ();
@@ -20,6 +20,12 @@ unlink "errno.c" if -f "errno.c";
 sub process_file {
     my($file) = @_;
 
+    # for win32 perl under cygwin, we need to get a windows pathname
+    if ($^O eq 'MSWin32' && $Config{cc} =~ /\B-mno-cygwin\b/ &&
+        defined($file) && !-f $file) {
+        chomp($file = `cygpath -w "$file"`);
+    }
+
     return unless defined $file and -f $file;
 #   warn "Processing $file\n";
 
@@ -109,7 +115,9 @@ sub get_files {
             ) {
        # Some Linuxes have weird errno.hs which generate
        # no #file or #line directives
-       $file{'/usr/include/errno.h'} = 1;
+       my $linux_errno_h = -e '/usr/include/errno.h' ?
+           '/usr/include/errno.h' : '/usr/local/include/errno.h';
+       $file{$linux_errno_h} = 1;
     } elsif ($^O eq 'MacOS') {
        # note that we are only getting the GUSI errno's here ...
        # we might miss out on compiler-specific ones
@@ -206,7 +214,7 @@ sub write_errno_pm {
 
     close(CPPI);
 
-    unless ($^O eq 'MacOS') {  # trust what we have
+    unless ($^O eq 'MacOS' || $^O eq 'beos') { # trust what we have / get later
     # invoke CPP and read the output
 
        if ($^O eq 'VMS') {
@@ -229,26 +237,36 @@ sub write_errno_pm {
            my($name,$expr);
            next unless ($name, $expr) = /"(.*?)"\s*\[\s*\[\s*(.*?)\s*\]\s*\]/;
            next if $name eq $expr;
-           $expr =~ s/(\d+)[LU]+\b/$1/g; # 2147483647L et alia
+           $expr =~ s/\(?\([a-z_]\w*\)([^\)]*)\)?/$1/i; # ((type)0xcafebabe) at alia
+           $expr =~ s/((?:0x)?[0-9a-fA-F]+)[LU]+\b/$1/g; # 2147483647L et alia
+           next if $expr =~ m/^[a-zA-Z]+$/; # skip some Win32 functions
+           if($expr =~ m/^0[xX]/) {
+               $err{$name} = hex $expr;
+           }
+           else {
            $err{$name} = eval $expr;
        }
+           delete $err{$name} unless defined $err{$name};
+       }
        close(CPPO);
     }
 
     # Many of the E constants (including ENOENT, which is being
     # used in the Perl test suite a lot), are available only as
     # enums in BeOS, so compiling and executing some code is about
-    # only way to find out what the numeric Evalues are.
+    # only way to find out what the numeric Evalues are. In fact above, we
+    # didn't even bother to get the values of the ones that have numeric
+    # values, since we can get all of them here, anyway.
 
     if ($^O eq 'beos') {
        if (open(C, ">errno.c")) {
-           my @zero = grep { !$err{$_} } keys %err;
+           my @allerrs = keys %err;
            print C <<EOF;
 #include <errno.h>
 #include <stdio.h>
 int main() {
 EOF
-            for (@zero) {
+            for (@allerrs) {
                print C qq[printf("$_ %d\n", $_);]
            }
             print C "}\n";
@@ -367,7 +385,8 @@ sub FIRSTKEY {
 
 sub EXISTS {
     my ($self, $errname) = @_;
-    my $proto = prototype($errname);
+    my $r = ref $errname;
+    my $proto = !$r || $r eq 'CODE' ? prototype($errname) : undef;
     defined($proto) && $proto eq "";
 }