diff options
author | Gurusamy Sarathy <gsar@cpan.org> | 1998-06-28 15:28:29 +0000 |
---|---|---|
committer | Gurusamy Sarathy <gsar@cpan.org> | 1998-06-28 15:28:29 +0000 |
commit | eab60bb1f2e96e200fbded3694574d80930d568e (patch) | |
tree | 8b85eca8f9c2415b91c9359e1123c22bc3fb5b32 /ext/Errno | |
parent | d3cf3892100cfc5e4143b94111b619e8eb2b1937 (diff) | |
download | perl-eab60bb1f2e96e200fbded3694574d80930d568e.tar.gz |
enable Errno build on win32, add Errno-1.08 files to repository
p4raw-id: //depot/perl@1222
Diffstat (limited to 'ext/Errno')
-rw-r--r-- | ext/Errno/ChangeLog | 34 | ||||
-rw-r--r-- | ext/Errno/Errno_pm.PL | 268 | ||||
-rw-r--r-- | ext/Errno/Makefile.PL | 29 |
3 files changed, 331 insertions, 0 deletions
diff --git a/ext/Errno/ChangeLog b/ext/Errno/ChangeLog new file mode 100644 index 0000000000..a1d36e24c2 --- /dev/null +++ b/ext/Errno/ChangeLog @@ -0,0 +1,34 @@ +Change 160 on 1998/06/27 by <gbarr@pobox.com> (Graham Barr) + + - Added patch from Sarathy to support Win32 + - Changed use of $Config{cpp} to $Config{cpprun} as suggested by + Tom Horsley + +Change 159 on 1998/06/27 by <gbarr@pobox.com> (Graham Barr) + + - Changed to use cpp to locate required files + - Moved dummy Errno.pm file into d/ + - Added support for VMS + +Change 158 on 1998/06/27 by <gbarr@pobox.com> (Graham Barr) + + Rename errno.pl to Errno_pm.PL + +Change 146 on 1998/05/31 by <gbarr@pobox.com> (Graham Barr) + + Added ChangeLog to MANIFEST + +Change 140 on 1998/05/23 by <gbarr@pobox.com> (Graham Barr) + + Fix type in errno.pl + +Change 139 on 1998/05/23 by <gbarr@pobox.com> (Graham Barr) + + Moved code to generate Errno.pm into errno.pl + +Change 136 on 1998/05/19 by <gbarr@pobox.com> (Graham Barr) + + Changed to use cpp to locate constants + + Added t/errno.t + diff --git a/ext/Errno/Errno_pm.PL b/ext/Errno/Errno_pm.PL new file mode 100644 index 0000000000..b669790314 --- /dev/null +++ b/ext/Errno/Errno_pm.PL @@ -0,0 +1,268 @@ +#!perl +use ExtUtils::MakeMaker; +use Config; +use strict; + +use vars qw($VERSION); + +$VERSION = "1.08"; + +my %err = (); + +unlink "Errno.pm" if -f "Errno.pm"; +open OUT, ">Errno.pm" or die "Cannot open Errno.pm: $!"; +select OUT; +my $file; +foreach $file (get_files()) { + process_file($file); +} +write_errno_pm(); +unlink "errno.c" if -f "errno.c"; + +sub process_file { + my($file) = @_; + + return unless defined $file; + + local *FH; + if (($^O eq 'VMS') && ($Config{vms_cc_type} ne 'gnuc')) { + unless(open(FH," LIBRARY/EXTRACT=ERRNO/OUTPUT=SYS\$OUTPUT $file |")) { + warn "Cannot open '$file'"; + return; + } + } else { + unless(open(FH,"< $file")) { + warn "Cannot open '$file'"; + return; + } + } + while(<FH>) { + $err{$1} = 1 + if /^#\s*define\s+(E\w+)\s+/; + } + close(FH); +} + +sub get_files { + my %file = (); + # VMS keeps its include files in system libraries (well, except for Gcc) + if ($^O eq 'VMS') { + if ($Config{vms_cc_type} eq 'decc') { + $file{'Sys$Library:DECC$RTLDEF.TLB'} = 1; + } elsif ($Config{vms_cc_type} eq 'vaxc') { + $file{'Sys$Library:vaxcdef.tlb'} = 1; + } elsif ($Config{vms_cc_type} eq 'gcc') { + $file{'gnu_cc_include:[000000]errno.h'} = 1; + } + } else { + open(CPPI,"> errno.c") or + die "Cannot open errno.c"; + + print CPPI "#include <errno.h>\n"; + + close(CPPI); + + # invoke CPP and read the output + + open(CPPO,"$Config{cpprun} $Config{cppflags} errno.c |") or + die "Cannot exec $Config{cpprun}"; + + my $pat; + if ($^O eq 'MSWin32' and $Config{cc} =~ /^bcc/i) { + $pat = '^/\*\s+(.+)\s+\d+\s*:\s+\*/'; + } + else { + $pat = '^#(?:line)?\s+\d+\s+"([^"]+)"'; + } + while(<CPPO>) { + $file{$1} = 1 if /$pat/o; + } + close(CPPO); + } + return keys %file; +} + +sub write_errno_pm { + my $err; + + # create the CPP input + + open(CPPI,"> errno.c") or + die "Cannot open errno.c"; + + print CPPI "#include <errno.h>\n"; + + foreach $err (keys %err) { + print CPPI '"',$err,'" [[',$err,']]',"\n"; + } + + close(CPPI); + + # invoke CPP and read the output + if ($^O eq 'VMS') { + my $cpp = "$Config{cppstdin} $Config{cppflags} $Config{cppminus}"; + $cpp =~ s/sys\$input//i; + open(CPPO,"$cpp errno.c |") or + die "Cannot exec $Config{cppstdin}"; + } else { + open(CPPO,"$Config{cpprun} $Config{cppflags} errno.c |") or + die "Cannot exec $Config{cpprun}"; + } + + %err = (); + + while(<CPPO>) { + my($name,$expr); + next unless ($name, $expr) = /"(.*?)"\s*\[\s*\[\s*(.*?)\s*\]\s*\]/; + next if $name eq $expr; + $err{$name} = eval $expr; + } + close(CPPO); + + # Write Errno.pm + + print <<"EDQ"; +# +# This file is auto-generated. ***ANY*** changes here will be lost +# + +package Errno; +use vars qw(\@EXPORT_OK \%EXPORT_TAGS \@ISA \$VERSION \%errno \$AUTOLOAD); +use Exporter (); +use Config; +use strict; + +\$Config{'myarchname'} eq "$Config{'myarchname'}" or + die "Errno architecture ($Config{'myarchname'}) does not match executable architecture (\$Config{'myarchname'})"; + +\$VERSION = "$VERSION"; +\@ISA = qw(Exporter); + +EDQ + + my $len = 0; + my @err = sort { $err{$a} <=> $err{$b} } keys %err; + map { $len = length if length > $len } @err; + + my $j = "\@EXPORT_OK = qw(" . join(" ",keys %err) . ");\n"; + $j =~ s/(.{50,70})\s/$1\n\t/g; + print $j,"\n"; + +print <<'ESQ'; +%EXPORT_TAGS = ( + POSIX => [qw( +ESQ + + my $k = join(" ", grep { exists $err{$_} } + qw(E2BIG EACCES EADDRINUSE EADDRNOTAVAIL EAFNOSUPPORT + EAGAIN EALREADY EBADF EBUSY ECHILD ECONNABORTED + ECONNREFUSED ECONNRESET EDEADLK EDESTADDRREQ EDOM EDQUOT + EEXIST EFAULT EFBIG EHOSTDOWN EHOSTUNREACH EINPROGRESS + EINTR EINVAL EIO EISCONN EISDIR ELOOP EMFILE EMLINK + EMSGSIZE ENAMETOOLONG ENETDOWN ENETRESET ENETUNREACH + ENFILE ENOBUFS ENODEV ENOENT ENOEXEC ENOLCK ENOMEM + ENOPROTOOPT ENOSPC ENOSYS ENOTBLK ENOTCONN ENOTDIR + ENOTEMPTY ENOTSOCK ENOTTY ENXIO EOPNOTSUPP EPERM + EPFNOSUPPORT EPIPE EPROCLIM EPROTONOSUPPORT EPROTOTYPE + ERANGE EREMOTE ERESTART EROFS ESHUTDOWN ESOCKTNOSUPPORT + ESPIPE ESRCH ESTALE ETIMEDOUT ETOOMANYREFS ETXTBSY + EUSERS EWOULDBLOCK EXDEV)); + + $k =~ s/(.{50,70})\s/$1\n\t/g; + print "\t",$k,"\n )]\n);\n\n"; + + foreach $err (@err) { + printf "sub %s () { %d }\n",,$err,$err{$err}; + } + + print <<'ESQ'; + +sub TIEHASH { bless [] } + +sub FETCH { + my ($self, $errname) = @_; + my $proto = prototype("Errno::$errname"); + if (defined($proto) && $proto eq "") { + no strict 'refs'; + return $! == &$errname; + } + require Carp; + Carp::confess("No errno $errname"); +} + +sub STORE { + require Carp; + Carp::confess("ERRNO hash is read only!"); +} + +*CLEAR = \&STORE; +*DELETE = \&STORE; + +sub NEXTKEY { + my($k,$v); + while(($k,$v) = each %Errno::) { + my $proto = prototype("Errno::$k"); + last if (defined($proto) && $proto eq ""); + + } + $k +} + +sub FIRSTKEY { + my $s = scalar keys %Errno::; + goto &NEXTKEY; +} + +sub EXISTS { + my ($self, $errname) = @_; + my $proto = prototype($errname); + defined($proto) && $proto eq ""; +} + +tie %!, __PACKAGE__; + +1; +__END__ + +=head1 NAME + +Errno - System errno constants + +=head1 SYNOPSIS + + use Errno qw(EINTR EIO :POSIX); + +=head1 DESCRIPTION + +C<Errno> defines and conditionally exports all the error constants +defined in your system C<errno.h> include file. It has a single export +tag, C<:POSIX>, which will export all POSIX defined error numbers. + +C<Errno> also makes C<%!> magic such that each element of C<%!> has a non-zero +value only if C<$!> is set to that value, eg + + use Errno; + + unless (open(FH, "/fangorn/spouse")) { + if ($!{ENOENT}) { + warn "Get a wife!\n"; + } else { + warn "This path is barred: $!"; + } + } + +=head1 AUTHOR + +Graham Barr <gbarr@pobox.com> + +=head1 COPYRIGHT + +Copyright (c) 1997-8 Graham Barr. All rights reserved. +This program is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=cut + +ESQ + +} diff --git a/ext/Errno/Makefile.PL b/ext/Errno/Makefile.PL new file mode 100644 index 0000000000..ffc8c4b7e3 --- /dev/null +++ b/ext/Errno/Makefile.PL @@ -0,0 +1,29 @@ +use ExtUtils::MakeMaker; + +@VMS = ($^O eq 'VMS') ? (MAN3PODS => ' ') : (); + +WriteMakefile( + NAME => 'Errno', + VERSION_FROM => 'Errno_pm.PL', + PL_FILES => {'Errno_pm.PL'=>'Errno.pm'}, + PM => {'Errno.pm' => '$(INST_LIBDIR)/Errno.pm'}, + 'clean' => {FILES => 'Errno.pm'}, + 'dist' => { + COMPRESS => 'gzip -9f', + SUFFIX => '.gz', + DIST_DEFAULT => 'd/Errno.pm tardist', + }, + @VMS, +); + +sub MY::postamble { + my $TARG = MM->catfile('d','Errno.pm'); +qq!$TARG : Makefile + echo '#This is a dummy file so CPAN will find a VERSION' > $TARG + echo 'package Errno;' >> $TARG + echo '\$\$VERSION = "\$(VERSION)";' >>$TARG + echo '#This is to make sure require will return an error' >>$TARG + echo '0;' >>$TARG + +! +} |