diff options
author | Andy Dougherty <doughera@lafcol.lafayette.edu> | 1995-04-14 22:32:18 +0000 |
---|---|---|
committer | Andy Dougherty <doughera@lafcol.lafayette.edu> | 1995-04-14 22:32:18 +0000 |
commit | 5d94fbed3754780f11eb4db2d2379544cacb60e1 (patch) | |
tree | 9d1c81cc2141769c76b61c272f84155723edb002 | |
parent | 232e078e289220085e912e3d740ae77767611478 (diff) | |
download | perl-5d94fbed3754780f11eb4db2d2379544cacb60e1.tar.gz |
perl5.001 patch.1d
This is my patch patch.1d for perl5.001. A complete description is
given below, but here are the basic changes.
1. Linux: more tweaks so dynamic loading works under ELF
or (maybe) under dld. There are so many different dld versions
and so many different tool sets, it's hard to be more specific.
2. perl -e '$v=1e19+0' no longer dumps core on Intel x86
processors.
3. pod stuff:
a. Wrapped pod2* translators in a 'SH' wrapper so that they
have the proper path to perl at the top.
b. Fixed pod/ Makefile to call the pod2html translator
correctly. (Why do pod2man and pod2html work differently?)
c. Include latest (Feb 2, 1995) version of pod2html, fresh from
ftp.metronet.com.
4. MakeMaker 4.093.
5. GIMME and installperl patches from Tim Bunce.
6. Miscellaneous hint file updates.
Configure
Allow ' ' to mean 'none' in a few more places. This provides
a way for hint files to set something to an empty value and to
ensure that the empty value will be maintained when config.sh is
reused.
Fix silly ld typo that prevented hint file from actually setting
$ld.
MANIFEST
Now has pod/pod2*.SH.
Makefile.SH
Remove old libperl.a instead of blindly adding to it. Failure to
do this causes a problem if you originally used perl's malloc but
later changed your mind. The old malloc.o would still be in
libperl.a
ext/DynaLoader/dl_dlopen.xs
Use strerror(errno) instead of dlerror for NetBSD.
handy.h
Clarify & rework HAS_BOOL comments and code. No functionality is
changed, but I hope this is easier to follow.
hints/freebsd.sh
hints/isc.sh
hints/linux.sh
hints/netbsd.sh
hints/next_3_0.sh
hints/next_3_2.sh
hints/sco_3.sh
Miscellaneous updates. See the individual comments in the patches.
installperl
Run ranlib on installed .a libraries.
unlink() old versions of files before installing new ones, in
case the old ones are are write-protected.
lib/ExtUtils/MakeMaker.pm
Updated to 4.092 by Andreas Koenig. This features better
selection of shared library versions and shorter command lines for
static linking of new extensions. It is also more robust against
broken csh on Linux. (There's still a glob in the library
selection loop, however.)
I further updated it to 4.093 because I didn't like the
distclean target :-). It's just a sloppy quick fix, but that's
all I have time for now. I've also worked on the library version
selection stuff and the $(CC) command stuff a little more.
lib/TieHash.pm
Overdue removal of ambiguous ${pack} construction.
perl.h
New U_V macro to cast to the UV type (usually unsigned long).
pod/Makefile
Updated.
pod/pod2html.SH
Updated.
Converted to 'SH' wrapper so correct #!/path/to/perl gets used.
pod/pod2latex.SH
pod/pod2man.SH
Converted to 'SH' wrapper so correct #!/path/to/perl gets used.
pp_hot.c
GIMME patch from Tim Bunce.
pp_sys.c
Allow use of F_FREESP fcntl() directive to truncate files.
If HAS_MKDIR is not defined, the stat() call to check the result
of the system "mkdir" call was failing because the filename
pointer no longer pointed to the right location.
sv.c
Protect some (UV) casts by the new U_V() macro.
util.c
New cast_uv() function to support the U_V() macro, if needed.
cast_iv() and cast_uv() no longer assume 32-bit longs.
The various cast_() functions have also been simplified.
-rwxr-xr-x | Configure | 24 | ||||
-rw-r--r-- | MANIFEST | 6 | ||||
-rw-r--r-- | Makefile.SH | 2 | ||||
-rw-r--r-- | ext/DynaLoader/dl_dlopen.xs | 6 | ||||
-rw-r--r-- | handy.h | 27 | ||||
-rw-r--r-- | hints/cxux.sh | 2 | ||||
-rw-r--r-- | hints/freebsd.sh | 32 | ||||
-rw-r--r-- | hints/isc.sh | 18 | ||||
-rw-r--r-- | hints/linux.sh | 17 | ||||
-rw-r--r-- | hints/netbsd.sh | 2 | ||||
-rw-r--r-- | hints/next_3_0.sh | 5 | ||||
-rw-r--r-- | hints/next_3_2.sh | 5 | ||||
-rw-r--r-- | hints/powerunix.sh | 2 | ||||
-rw-r--r-- | hints/sco_3.sh | 11 | ||||
-rwxr-xr-x | installperl | 6 | ||||
-rw-r--r-- | lib/ExtUtils/MakeMaker.pm | 155 | ||||
-rw-r--r-- | lib/TieHash.pm | 4 | ||||
-rw-r--r-- | perl.h | 3 | ||||
-rw-r--r-- | pod/Makefile | 24 | ||||
-rwxr-xr-x | pod/pod2html.SH (renamed from pod/pod2html) | 101 | ||||
-rwxr-xr-x | pod/pod2latex.SH (renamed from pod/pod2latex) | 30 | ||||
-rwxr-xr-x | pod/pod2man.SH (renamed from pod/pod2man) | 29 | ||||
-rw-r--r-- | pp_hot.c | 6 | ||||
-rw-r--r-- | pp_sys.c | 7 | ||||
-rw-r--r-- | sv.c | 6 | ||||
-rw-r--r-- | util.c | 77 |
26 files changed, 461 insertions, 146 deletions
@@ -20,7 +20,7 @@ # $Id: Head.U,v 3.0.1.7 1995/03/21 08:46:15 ram Exp $ # -# Generated on Thu Apr 6 11:09:32 EDT 1995 [metaconfig 3.0 PL53] +# Generated on Fri Apr 14 15:43:12 EDT 1995 [metaconfig 3.0 PL53] cat >/tmp/c1$$ <<EOF ARGGGHHHH!!!!! @@ -4241,7 +4241,7 @@ EOM rp="Any special flags to pass to $cc -c to compile shared library modules?" . ./myread case "$ans" in - none) cccdlflags='' ;; + none) cccdlflags=' ' ;; *) cccdlflags="$ans" ;; esac @@ -4278,11 +4278,11 @@ EOM fi rm -f try.c a.out ;; - *) dflt=ld + *) dflt="$ld" ;; esac - rp="What comnmand should be used to create dynamic libraries?" + rp="What command should be used to create dynamic libraries?" . ./myread ld="$ans" @@ -4311,7 +4311,7 @@ EOM rp="Any special flags to pass to $ld to create a dynamically loaded library?" . ./myread case "$ans" in - none) lddlflags='' ;; + none) lddlflags=' ' ;; *) lddlflags="$ans" ;; esac @@ -4335,7 +4335,7 @@ EOM rp="Any special flags to pass to $cc to use dynamic loading?" . ./myread case "$ans" in - none) ccdlflags='' ;; + none) ccdlflags=' ' ;; *) ccdlflags="$ans" ;; esac ;; @@ -6438,7 +6438,7 @@ them at all. Answer "none" to include no extensions. EOM case "$dynamic_ext" in - ''|' ') dflt="$avail_ext" ;; + '') dflt="$avail_ext" ;; *) dflt="$dynamic_ext" ;; esac case "$dflt" in @@ -6447,12 +6447,12 @@ EOM rp="What extensions do you wish to load dynamically?" . ./myread case "$ans" in - none) dynamic_ext='' ;; + none) dynamic_ext=' ' ;; *) dynamic_ext="$ans" ;; esac case "$static_ext" in - ''|' ') + '') : Exclude those already listed in dynamic linking dflt='' for xxx in $avail_ext; do @@ -6475,7 +6475,7 @@ EOM rp="What extensions do you wish to load statically?" . ./myread case "$ans" in - none) static_ext='' ;; + none) static_ext=' ' ;; *) static_ext="$ans" ;; esac ;; @@ -6486,7 +6486,7 @@ to include no extensions. EOM case "$static_ext" in - ''|' ') dflt="$avail_ext" ;; + '') dflt="$avail_ext" ;; *) dflt="$static_ext" ;; esac @@ -6496,7 +6496,7 @@ EOM rp="What extensions do you wish to include?" . ./myread case "$ans" in - none) static_ext='' ;; + none) static_ext=' ' ;; *) static_ext="$ans" ;; esac ;; @@ -402,9 +402,9 @@ pod/perlsub.pod Subroutine info pod/perlsyn.pod Syntax info pod/perltrap.pod Trap info pod/perlvar.pod Variable info -pod/pod2html Translator to turn pod into HTML -pod/pod2latex Translator to turn pod into LaTeX -pod/pod2man Translator to turn pod into manpage +pod/pod2html.SH Precursor for translator to turn pod into HTML +pod/pod2latex.SH Precursor for translator to turn pod into LaTeX +pod/pod2man.SH Precursor for translator to turn pod into manpage pod/splitman Splits perlfunc into multiple man pages pp.c Push/Pop code pp.h Push/Pop code defs diff --git a/Makefile.SH b/Makefile.SH index 77b3893889..f5dff60848 100644 --- a/Makefile.SH +++ b/Makefile.SH @@ -227,6 +227,7 @@ $spitshell >>Makefile <<'!NO!SUBS!' ;; *) $spitshell >>Makefile <<'!NO!SUBS!' + rm -f $(perllib) ar rcu $(perllib) perl.o $(obj) @$(ranlib) $(perllib) !NO!SUBS! @@ -329,6 +330,7 @@ clean: realclean: clean -cd x2p; $(MAKE) realclean + -cd pod; $(MAKE) realclean @for x in $(DYNALOADER) $(dynamic_ext) $(static_ext) ; do \ sh ext/util/make_ext realclean $$x ; \ done diff --git a/ext/DynaLoader/dl_dlopen.xs b/ext/DynaLoader/dl_dlopen.xs index ffd3dbc422..0cba08729e 100644 --- a/ext/DynaLoader/dl_dlopen.xs +++ b/ext/DynaLoader/dl_dlopen.xs @@ -115,7 +115,11 @@ #endif #ifndef HAS_DLERROR -#define dlerror() "Unknown error - dlerror() not implemented" +# ifdef __NetBSD__ +# define dlerror() strerror(errno) +# else +# define dlerror() "Unknown error - dlerror() not implemented" +# endif #endif @@ -24,15 +24,26 @@ #define Nullsv Null(SV*) /* bool is built-in for g++-2.6.3, which might be used for an extension. - gcc-2.6.2 under Linux defines _G_HAVE_BOOL to 0, and does not - define bool. */ -#if !defined(HAS_BOOL) && !(_G_HAVE_BOOL) -#ifdef UTS -#define bool int -#else -#define bool char + If the extension includes <_G_config.h> before this file then + _G_HAVE_BOOL will be properly set. If, however, the extension includes + this file first, then you will have to manually set -DHAS_BOOL in + your command line to avoid a conflict. +*/ +#ifdef _G_HAVE_BOOL +# if _G_HAVE_BOOL +# ifndef HAS_BOOL +# define HAS_BOOL 1 +# endif +# endif +#endif + +#ifndef HAS_BOOL +# ifdef UTS +# define bool int +# else +# define bool char +# endif #endif -#endif /* !defined(HAS_BOOL) && !(_G_HAVE_BOOL) */ #ifdef TRUE #undef TRUE diff --git a/hints/cxux.sh b/hints/cxux.sh index a4f397c20e..b4125ae6d2 100644 --- a/hints/cxux.sh +++ b/hints/cxux.sh @@ -72,7 +72,7 @@ glibpth="/usr/sde/elf/usr/lib $glibpth" cc='/bin/cc -Xa' cccdlflags='-Zelf -Zpic' ccdlflags='-Zelf -Zlink=dynamic -Wl,-Bexport -u sigaction' -lddlflags='-G' +lddlflags='-Zlink=so' # Configure imagines that stdio.h is "standard", but it really isn't. # Things like the -T and -B file test operators (on file handles) fail when diff --git a/hints/freebsd.sh b/hints/freebsd.sh index 4efca6a043..f0c5433cca 100644 --- a/hints/freebsd.sh +++ b/hints/freebsd.sh @@ -1,4 +1,4 @@ -# Oringal based on info from +# Original based on info from # Carl M. Fongheiser <cmf@ins.infonet.net> # Date: Thu, 28 Jul 1994 19:17:05 -0500 (CDT) # @@ -6,21 +6,45 @@ # Ollivier Robert <Ollivier.Robert@keltia.frmug.fr.net> # Date: Wed, 28 Sep 1994 00:37:46 +0100 (MET) # +# Additional 2.* defines from +# Ollivier Robert <Ollivier.Robert@keltia.frmug.fr.net> +# Date: Sat, 8 Apr 1995 20:53:41 +0200 (MET DST) +# +# FreeBSD has the dynamic loading dl*() functions in /usr/lib/crt0.o, +# so Configure doesn't find them (unless you abandon the nm scan). +# +# The two flags "-fpic -DPIC" are used to indicate a +# will-be-shared object. Configure will guess the -fpic, (and the +# -DPIC is not used by perl proper) but the full define is included to +# be consistent with the FreeBSD general shared libs building process. +# +# setreuid and friends are inherently broken in all versions of FreeBSD. +# + case "$osvers" in 0.*|1.0*) usedl="$undef" ;; -*) d_dlopen="$define" +1.1*) d_dlopen="$define" cccdlflags='-DPIC -fpic' - lddlflags='-Bshareable' + lddlflags='-Bshareable $lddlflags' malloctype='void *' groupstype='int' d_setregid='undef' d_setreuid='undef' d_setrgid='undef' d_setruid='undef' - i_unistd='undef' + ;; +*) + d_dlopen="$define" + cccdlflags='-DPIC -fpic' + lddlflags='-Bshareable $lddlflags' + d_setregid='undef' + d_setreuid='undef' + d_setrgid='undef' + d_setruid='undef' ;; esac # Avoid telldir prototype conflict in pp_sys.c (FreeBSD uses const DIR *) +# Configure should test for this. Volunteers? pp_sys_cflags='ccflags="$ccflags -DHAS_TELLDIR_PROTOTYPE"' diff --git a/hints/isc.sh b/hints/isc.sh index 7c18380f54..0ecdb7ddc9 100644 --- a/hints/isc.sh +++ b/hints/isc.sh @@ -6,9 +6,19 @@ # # Use Configure -Dcc=gcc to use gcc # -set `echo X "$libswanted "| sed -e 's/ c / /'` + +# We don't want to explicitly mention -lc (since we're using POSIX mode.) +# We also don't want -lx (the Xenix compatability libraries.) The only +# thing that it seems to pick up is chsize(), which has been reported to +# not work. chsize() can also be implemented via fcntl() in perl (if you +# define -D_SYSV3). We'll leave in -lPW since it's harmless. Some +# extension might eventually need it for alloca, though perl doesn't use +# it. + +set `echo X "$libswanted "| sed -e 's/ c / /' -e 's/ x / /'` shift libswanted="$*" + case "$cc" in *gcc*) ccflags="$ccflags -posix" ldflags="$ldflags -posix" @@ -17,5 +27,11 @@ case "$cc" in ldflags="$ldflags -Xp" ;; esac + +# You can also include -D_SYSV3 to pick up "traditionally visible" +# symbols hidden by name-space pollution rules. This raises some +# compilation "redefinition" warnings, but they appear harmless. +# ccflags="$ccflags -D_SYSV3" + # Pick up dbm.h in <rpcsvc/dbm.h> ccflags="$ccflags -I/usr/include/rpcsvc" diff --git a/hints/linux.sh b/hints/linux.sh index 71afccd1f9..46059e0731 100644 --- a/hints/linux.sh +++ b/hints/linux.sh @@ -24,9 +24,10 @@ case "$prefix" in esac # Perl expects BSD style signal handling. -ccflags="-D__USE_BSD_SIGNAL $ccflags" +# gcc defines _G_HAVE_BOOL to 1, but doesn't actually supply bool. +ccflags="-D__USE_BSD_SIGNAL -Dbool=char -DHAS_BOOL $ccflags" -# The following functions are gcc built-ins, but the Configure test +# The following functions are gcc built-ins, but the Configure tests # may fail because it doesn't supply a proper prototype. d_memcmp=define d_memcpy=define @@ -68,17 +69,15 @@ if gcc try.c >/dev/null 2>&1 && ./a.out; then You appear to have ELF support. I'll try to use it for dynamic loading. EOM - # Be careful not to overwrite lddlflags, since the user might - # have specified some -L/path options on the Configure command line. - lddlflags="-shared $lddlflags" - ccdlflags='-rdynamic' - so='so' - dlext='so' - ld=gcc + # Configure now handles these automatically. else echo "You don't have an ELF gcc, using dld if available." # We might possibly have a version of DLD around. lddlflags="-r $lddlflags" + # These empty values are so that Configure doesn't put in the + # Linux ELF values. + ccdlflags=' ' + cccdlflags=' ' so='sa' dlext='o' ## If you are using DLD 3.2.4 which does not support shared libs, diff --git a/hints/netbsd.sh b/hints/netbsd.sh index 33a7bf1c00..67cd95c2ad 100644 --- a/hints/netbsd.sh +++ b/hints/netbsd.sh @@ -1,5 +1,5 @@ # hints/netbsd.sh -# netbsd keeps dynamic loading dl*() functions in /lib/crt0.o, +# netbsd keeps dynamic loading dl*() functions in /usr/lib/crt0.o, # so Configure doesn't find them (unless you abandon the nm scan). case "$osvers" in 0.9*|0.8*) diff --git a/hints/next_3_0.sh b/hints/next_3_0.sh index a34d621449..3a50247e9c 100644 --- a/hints/next_3_0.sh +++ b/hints/next_3_0.sh @@ -21,7 +21,12 @@ POSIX_cflags='ccflags="-posix $ccflags"' useposix='undef' ldflags='-u libsys_s' libswanted='dbm gdbm db' +# lddlflags='-r' +# Give cccdlflags an empty value since Configure will detect we are +# using GNU cc and try to specify -fpic for cccdlflags. +cccdlflags=' ' +# i_utime='undef' groupstype='int' direntrytype='struct direct' diff --git a/hints/next_3_2.sh b/hints/next_3_2.sh index aba25b9ed5..887082e2f3 100644 --- a/hints/next_3_2.sh +++ b/hints/next_3_2.sh @@ -5,7 +5,12 @@ ccflags='-DUSE_NEXT_CTYPE' POSIX_cflags='ccflags="-posix $ccflags"' ldflags='-u libsys_s' libswanted='dbm gdbm db' + lddlflags='-r' +# Give cccdlflags an empty value since Configure will detect we are +# using GNU cc and try to specify -fpic for cccdlflags. +cccdlflags=' ' + i_utime='undef' groupstype='int' direntrytype='struct direct' diff --git a/hints/powerunix.sh b/hints/powerunix.sh index f21e6ae8b8..9ce2462315 100644 --- a/hints/powerunix.sh +++ b/hints/powerunix.sh @@ -49,7 +49,7 @@ d_csh='undef' cc='/bin/cc' cccdlflags='-Zpic' ccdlflags='-Zlink=dynamic -Wl,-Bexport' -lddlflags='-G' +lddlflags='-Zlink=so' # Configure imagines that stdio.h is "standard", but it really isn't. # Things like the -T and -B file test operators (on file handles) fail when diff --git a/hints/sco_3.sh b/hints/sco_3.sh index a89ffbec6a..11682e1968 100644 --- a/hints/sco_3.sh +++ b/hints/sco_3.sh @@ -22,9 +22,20 @@ gcc) ccflags="$ccflags -U M_XENIX" optimize="$optimize -O2" ;; +scocc) ;; + *) ccflags="$ccflags -W0 -U M_XENIX" ;; esac i_varargs=undef + +# I have received one report that nm extraction doesn't work if you're +# using the scocc compiler. This system had the following 'myconfig' +# uname='xxx xxx 3.2 2 i386 ' +# cc='scocc', optimize='-O' +usenm='false' + +# If you want to use nm, you'll probably have to use nm -p. The +# following does that for you: nm_opt='-p' diff --git a/installperl b/installperl index 4348411383..f9d0ecb159 100755 --- a/installperl +++ b/installperl @@ -146,8 +146,9 @@ else { makedir("$installarchlib/CORE"); foreach $file (<*.h libperl*.*>) { cp_if_diff($file,"$installarchlib/CORE/$file"); - if ($file =~ /\.a$/ && $osname eq 'next') { - #on NeXTs we have to rerun ranlib after copying libraries + if ($file =~ /\.a$/ && $osname =~ /^(next|sunos)$/) { + # on NeXTs and Suns we have to rerun ranlib after copying libraries + # (maybe on all platforms which have ranlib ?) &cmd("$ranlib $installarchlib/CORE/$file"); } } @@ -342,6 +343,7 @@ sub cp_if_diff { -f $from || die "$0: $from not found"; system "cmp", "-s", $from, $to; if ($?) { + unlink($to); # In case we don't have write permissions. cmd("cp $from $to"); } } diff --git a/lib/ExtUtils/MakeMaker.pm b/lib/ExtUtils/MakeMaker.pm index 73ad1ddebf..d8d5d6fb30 100644 --- a/lib/ExtUtils/MakeMaker.pm +++ b/lib/ExtUtils/MakeMaker.pm @@ -1,9 +1,8 @@ package ExtUtils::MakeMaker; -$Version = 4.091; # Last edited 31 Mar 1995 by Andreas Koenig +$Version = 4.093; # Last edited 12 Apr 1995 by Andy Dougherty use Config; -check_hints(); use Carp; use Cwd; @@ -48,11 +47,11 @@ Config.pm. In addition the extension may contribute to the C<%Config> hash table of Config.pm by supplying hints files in a C<hints/> directory. The hints files are expected to be named like their counterparts in C<PERL_SRC/hints>, but with an C<.pl> file name -extension (eg. C<next_3_2.sh>). They are simply C<eval>ed by MakeMaker -and can be used to execute commands as well as to include special -variables. If there is no hintsfile for the actual system, but for -some previous releases of the same operating system, the latest one of -those is used. +extension (eg. C<next_3_2.pl>). They are simply C<eval>ed by MakeMaker +within the WriteMakefile() subroutine, and can be used to execute +commands as well as to include special variables. If there is no +hintsfile for the actual system, but for some previous releases of the +same operating system, the latest one of those is used. =head2 Default Makefile Behaviour @@ -80,7 +79,7 @@ Other interesting targets in the generated Makefile are make config # to check if the Makefile is up-to-date make clean # delete local temporary files (Makefile gets renamed) make realclean # delete all derived files (including installed files) - make distclean # produce a gzipped file ready for shipping + make dist # produce a gzipped file ready for shipping The macros in the produced Makefile may be overridden on the command line to the make call as in the following example: @@ -276,8 +275,7 @@ F<perl5-porters@nicoh.com> or F<comp.lang.perl> as appropriate. =cut sub check_hints { - # We allow extension-specific hints files. If we find one we act as if Config.pm - # had read the contents + # We allow extension-specific hints files. # First we look for the best hintsfile we have my(@goodhints); @@ -300,13 +298,15 @@ sub check_hints { closedir DIR; return unless @goodhints; # There was no hintsfile # the last one in lexical ordering is our choice: - $hint=(reverse sort @goodhints)[0]; + $hint=(sort @goodhints)[-1]; # execute the hintsfile: open HINTS, "hints/$hint.pl"; @goodhints = <HINTS>; close HINTS; + print STDOUT "Processing hints file hints/$hint.pl"; eval join('',@goodhints); + print STDOUT $@ if $@; } # Setup dummy package: @@ -444,7 +444,7 @@ normally required: dynamic_lib: {ARMAYBE => 'ar', OTHERLDFLAGS => '...'} clean: {FILES => "*.xyz foo"} realclean: {FILES => '$(INST_ARCHAUTODIR)/*.xyz'} - distclean: {TARNAME=>'MyTarFile', TARFLAGS=>'cvfF', COMPRESS=>'gzip'} + dist: {TARNAME=>'MyTarFile', TARFLAGS=>'cvfF', COMPRESS=>'gzip'} tool_autosplit: {MAXLEN => 8} END @@ -478,7 +478,7 @@ sub help {print $Attrib_Help;} 'subdirs' => {}, 'clean' => {}, 'realclean' => {}, - 'distclean' => {}, + 'dist' => {}, 'test' => {}, 'install' => {}, 'force' => {}, @@ -534,6 +534,9 @@ sub WriteMakefile { parse_args(\%att, @ARGV); my(%initial_att) = %att; # record initial attributes + + check_hints(); + my($key); MY->init_main(); @@ -570,7 +573,7 @@ sub WriteMakefile { } else { my(%a) = %{$att{$section} || {}}; print MAKE "\n# --- MakeMaker $section section:"; - print MAKE "# ",%a if $Verbose; + print MAKE "# ", join ", ", %a if $Verbose; print(MAKE MY->nicetext(MY->$section( %a ))); } } @@ -1003,7 +1006,7 @@ sub lsdir{ sub find_perl{ my($self, $ver, $names, $dirs, $trace) = @_; my($name, $dir); - if ($trace){ + if ($trace >= 2){ print "Looking for perl $ver by these names: "; print "@$names, "; print "in these dirs:"; @@ -1017,7 +1020,7 @@ sub find_perl{ $name .= ".exe" unless -x "$dir/$name"; } next unless -x "$dir/$name"; - print "Executing $dir/$name" if ($trace); + print "Executing $dir/$name" if ($trace >= 2); my($out); if ($Is_VMS) { my($vmscmd) = 'MCR ' . vmsify("$dir/$name"); @@ -1025,7 +1028,10 @@ sub find_perl{ } else { $out = `$dir/$name -e 'require $ver; print "VER_OK\n" ' 2>&1`; } - return "$dir/$name" if $out =~ /VER_OK/; + if ($out =~ /VER_OK/) { + print "Using $dir/$name" if $trace; + return "$dir/$name"; + } } } print STDOUT "Unable to find a perl $ver (by these names: @$names, in these dirs: @$dirs)\n"; @@ -1223,6 +1229,7 @@ sub const_cccmd{ ."Please notify perl5-porters\@nicoh.com\n"; } my($cccmd)=($old) ? $old : $new; + $cccmd =~ s/\b\Q$Config{'cc'}\E\b/\$(CC)/; "CCCMD = $cccmd\n"; } @@ -1617,8 +1624,9 @@ sub subdirs { # This method provides a mechanism to automatically deal with # subdirectories containing further Makefile.PL scripts. # It calls the subdir_x() method for each subdirectory. - foreach(<*/Makefile.PL>){ - s:/Makefile\.PL$:: ; + foreach(grep -d, &lsdir()){ + next if /^\./; + next unless -f "$_/Makefile\.PL" ; print "Including $_ subdirectory" if ($Verbose); push(@m, MY->subdir_x($_)); } @@ -1718,7 +1726,7 @@ realclean purge :: clean } -sub distclean { +sub dist { my($self, %attribs) = @_; # VERSION should be sanitised before use as a file name my($tarname) = $attribs{TARNAME} || '$(DISTNAME)-$(VERSION)'; @@ -1728,7 +1736,7 @@ sub distclean { my($postop) = $attribs{POSTOP} || '@:'; my($mkfiles) = join(' ', map("$_/$att{MAKEFILE} $_/$att{MAKEFILE}.old", ".", @{$att{DIR}})); " -distclean: clean +dist: clean $preop $att{RM_F} $mkfiles cd .. && tar $tarflags $tarname.tar \$(BASEEXT) @@ -1913,7 +1921,7 @@ sub makeaperl { $cccmd .= " $Config{'cccdlflags'}" if ($Config{'d_shrplib'}); # The front matter of the linkcommand... - $linkcmd = join ' ', $Config{'cc'}, + $linkcmd = join ' ', "\$(CC)", grep($_, @Config{qw(large split ldflags ccdlflags)}); $linkcmd =~ s/\s+/ /g; @@ -1935,7 +1943,7 @@ sub makeaperl { for (sort keys %static) { next unless /\.a$/; $_ = dirname($_) . "/extralibs.ld"; - push @$extra, "`cat $_`"; + push @$extra, $_; } grep(s/^/-I/, @$perlinc); @@ -1951,7 +1959,6 @@ MAP_LINKCMD = $linkcmd MAP_PERLINC = @{$perlinc} MAP_STATIC = ", join(" ", sort keys %static), " -MAP_EXTRA = @{$extra} MAP_PRELIBS = $Config{'libs'} $Config{'cryptlib'} "; @@ -1969,8 +1976,18 @@ MAP_LIBPERL = $libperl "; push @m, " -\$(MAP_TARGET): $tmp/perlmain.o \$(MAP_LIBPERL) \$(MAP_STATIC) - \$(MAP_LINKCMD) -o \$\@ $tmp/perlmain.o \$(MAP_LIBPERL) \$(MAP_STATIC) \$(MAP_EXTRA) \$(MAP_PRELIBS) +extralibs.ld: @$extra + \@ $att{RM_F} \$\@ + \@ \$(TOUCH) \$\@ +"; + + foreach (@$extra){ + push @m, "\tcat $_ >> \$\@\n"; + } + + push @m, " +\$(MAP_TARGET): $tmp/perlmain.o \$(MAP_LIBPERL) \$(MAP_STATIC) extralibs.ld + \$(MAP_LINKCMD) -o \$\@ $tmp/perlmain.o \$(MAP_LIBPERL) \$(MAP_STATIC) `cat extralibs.ld` \$(MAP_PRELIBS) @ echo 'To install the new \"\$(MAP_TARGET)\" binary, call' @ echo ' make -f $makefilename inst_perl MAP_TARGET=\$(MAP_TARGET)' @ echo 'To remove the intermediate files say' @@ -1988,12 +2005,12 @@ $tmp/perlmain.c: $makefilename}, q{ }; -# We write MAP_EXTRA outside the perl program to have it eval'd by the shell +# We write EXTRA outside the perl program to have it eval'd by the shell push @m, q{ doc_inst_perl: @ $(FULLPERL) -e 'use ExtUtils::MakeMaker; MM->writedoc("Perl binary",' \\ -e '"$(MAP_TARGET)", "MAP_STATIC=$(MAP_STATIC)",' \\ - -e '"MAP_EXTRA=@ARGV", "MAP_LIBPERL=$(MAP_LIBPERL)")' -- $(MAP_EXTRA) + -e '"MAP_EXTRA=@ARGV", "MAP_LIBPERL=$(MAP_LIBPERL)")' -- `cat extralibs.ld` }; push @m, qq{ @@ -2004,6 +2021,8 @@ pure_inst_perl: \$(MAP_TARGET) realclean :: map_clean +distclean :: realclean + map_clean : $att{RM_F} $tmp/perlmain.o $tmp/perlmain.c $makefilename }; @@ -2068,12 +2087,34 @@ sub extliblist{ # For gcc-2.6.2 on linux (March 1995), DLD can not load # .sa libraries, with the exception of libm.sa, so we # deliberately skip them. - if (@fullname=<${thispth}/lib${thislib}.${so}.[0-9]*>){ - $fullname=$fullname[-1]; #ATTN: 10 looses against 9! + if (@fullname = lsdir($thispth,"^lib$thislib\.$so\.[0-9]+")){ + # Take care that libfoo.so.10 wins against libfoo.so.9. + # Compare two libraries to find the most recent version + # number. E.g. if you have libfoo.so.9.0.7 and + # libfoo.so.10.1, first convert all digits into two + # decimal places. Then we'll add ".00" to the shorter + # strings so that we're comparing strings of equal length + # Thus we'll compare libfoo.so.09.07.00 with + # libfoo.so.10.01.00. Some libraries might have letters + # in the version. We don't know what they mean, but will + # try to skip them gracefully -- we'll set any letter to + # '0'. Finally, sort in reverse so we can take the + # first element. + $fullname = "$thispth/" . + (sort { my($ma) = $a; + my($mb) = $b; + $ma =~ tr/A-Za-z/0/s; + $ma =~ s/\b(\d)\b/0$1/g; + $mb =~ tr/A-Za-z/0/s; + $mb =~ s/\b(\d)\b/0$1/g; + while (length($ma) < length($mb)) { $ma .= ".00"; } + while (length($mb) < length($ma)) { $mb .= ".00"; } + # Comparison deliberately backwards + $mb cmp $ma;} @fullname)[0]; } elsif (-f ($fullname="$thispth/lib$thislib.$so") - && (($Config{'dlsrc'} ne "dl_dld.xs") || ($thislib eq "m"))){ + && (($Config{'dlsrc'} ne "dl_dld.xs") || ($thislib eq "m"))){ } elsif (-f ($fullname="$thispth/lib${thislib}_s.a") - && ($thislib .= "_s") ){ # we must explicitly ask for _s version + && ($thislib .= "_s") ){ # we must explicitly use _s version } elsif (-f ($fullname="$thispth/lib$thislib.a")){ } elsif (-f ($fullname="$thispth/Slib$thislib.a")){ } else { @@ -2092,12 +2133,13 @@ sub extliblist{ # Do not add it into the list if it is already linked in # with the main perl executable. - # We have to special-case the NeXT, because all the math is also in libsys_s - unless ( $in_perl || ($Config{'osname'} eq 'next' && $thislib eq 'm') ){ + # We have to special-case the NeXT, because all the math + # is also in libsys_s + unless ($in_perl || + ($Config{'osname'} eq 'next' && $thislib eq 'm') ){ push(@extralibs, "-l$thislib"); } - # We might be able to load this archive file dynamically if ( $Config{'dlsrc'} =~ /dl_next|dl_dld/){ # We push -l$thislib instead of $fullname because @@ -2120,7 +2162,8 @@ sub extliblist{ } last; # found one here so don't bother looking further } - print STDOUT "Warning (non-fatal): No library found for -l$thislib" unless $found_lib>0; + print STDOUT "Warning (non-fatal): No library found for -l$thislib" + unless $found_lib>0; } return ('','','') unless $found; ("@extralibs", "@bsloadlibs", "@ldloadlibs"); @@ -2393,6 +2436,41 @@ v4.091 April 3 1995 by Andy Dougherty Another attempt to fix writedoc() from Dean Roehrich. + +v4.092 April 11 1994 by Andreas Koenig + +Fixed a docu bug in hint file description. Added printing of a warning +from eval in the hintfile section if the eval has errors. Moved +check_hints() into the WriteMakefile() subroutine to avoid evaling +hintsfiles for other uses of the module (mkbootstrap, mksymlists). + +Eliminated csh globbing to work around buggy Linux csh. + +In extliblist() libfoo.so.10 now wins against libfoo.so.9. + +Use $(CC) instead of $Config{'cc'} everywhere to allow overriding +according to a patch by Dean Roehrich. + +Introduce a ./extralibs.ld file that contains the contents of all +relevant extralibs.ld files for a static build to shorten the command +line for the linking of a new static perl. + +Minor cosmetics. + +v4.093 April 12 1994 by Andy Dougherty + +Rename distclean target to plain dist. Insert a dummy distclean +target that's the same as realclean. This is more consistent with the +main perl makefile. + +Fix up extliblist() so even bizarre names like libfoo.so.10.0.1 +are handled. + +Include Tim's suggestions about $verbose and more careful substitution +of $(CC) for $Config{'cc'}. + +Minor cosmetic fixes for my 80-character wide terminal. + =head1 NOTES MakeMaker development work still to be done: @@ -2402,6 +2480,11 @@ Needs more complete documentation. Add a html: target when there has been found a general solution to installing html files. +Add an uninstall target. + +Add a FLAVOR variable that makes it easier to build debugging, +embedded or multiplicity perls. + =cut # the following keeps AutoSplit happy diff --git a/lib/TieHash.pm b/lib/TieHash.pm index 2d5c2f41f0..1abbe8379a 100644 --- a/lib/TieHash.pm +++ b/lib/TieHash.pm @@ -10,8 +10,8 @@ sub new { sub TIEHASH { my $pack = shift; - if (defined &{"{$pack}::new"}) { - carp "WARNING: calling ${pack}->new since ${pack}->TIEHASH is missing" + if (defined &{"$pack\::new"}) { + carp "WARNING: calling $pack\->new since $pack\->TIEHASH is missing" if $^W; $pack->new(@_); } @@ -647,11 +647,14 @@ U32 cast_ulong _((double)); #ifdef CASTI32 #define I_32(what) ((I32)(what)) #define I_V(what) ((IV)(what)) +#define U_V(what) ((UV)(what)) #else I32 cast_i32 _((double)); #define I_32(what) (cast_i32((double)(what))) IV cast_iv _((double)); #define I_V(what) (cast_iv((double)(what))) +UV cast_uv _((double)); +#define U_V(what) (cast_uv((double)(what))) #endif struct Outrec { diff --git a/pod/Makefile b/pod/Makefile index 077ecd19bb..47fc2e9512 100644 --- a/pod/Makefile +++ b/pod/Makefile @@ -1,5 +1,7 @@ all: man +PERL = ../miniperl + POD = \ perl.pod \ perlapi.pod \ @@ -89,19 +91,35 @@ HTML = \ man: $(MAN) -html: $(HTML) +# pod2html runs on all the pods at once in order to build up +# cross-references. +html: + $(PERL) pod2html *.pod .SUFFIXES: .pod .man .pod.man: - ../miniperl pod2man $*.pod >$*.man + $(PERL) pod2man $*.pod >$*.man .SUFFIXES: .pod .html .pod.html: - ../miniperl pod2html $*.pod >$*.html + $(PERL) pod2html $*.pod clean: rm -f $(MAN) $(HTML) realclean: clean + rm -f pod2man pod2latex pod2html + +distclean: realclean + +# Dependencies. +pod2latex: pod2latex.SH ../config.sh + sh pod2latex.SH + +pod2html: pod2html.SH ../config.sh + sh pod2html.SH + +pod2man: pod2man.SH ../config.sh + sh pod2man.SH diff --git a/pod/pod2html b/pod/pod2html.SH index a2cde18ce4..d37cbbe87c 100755 --- a/pod/pod2html +++ b/pod/pod2html.SH @@ -1,4 +1,28 @@ -#!/usr/bin/perl +case $CONFIG in +'') + if test -f config.sh; then TOP=.; + elif test -f ../config.sh; then TOP=..; + elif test -f ../../config.sh; then TOP=../..; + elif test -f ../../../config.sh; then TOP=../../..; + elif test -f ../../../../config.sh; then TOP=../../../..; + else + echo "Can't find config.sh."; exit 1 + fi + . $TOP/config.sh + ;; +esac +case "$0" in +*/*) cd `expr X$0 : 'X\(.*\)/'` ;; +esac +echo "Extracting pod/pod2html (with variable substitutions)" +rm -f pod2html +$spitshell >pod2html <<!GROK!THIS! +#!$bin/perl +eval 'exec $bin/perl -S \$0 \${1+"\$@"}' + if \$running_under_some_shell; +!GROK!THIS! + +$spitshell >>pod2html <<'!NO!SUBS!' # # pod2html - convert pod format to html # @@ -46,9 +70,11 @@ unless(@Pods){ # loop twice through the pods, first to learn the links, then to produce html for $count (0,1){ + (print "Scanning pods...\n") unless $count; foreach $podfh ( @Pods ) { ($pod = $podfh) =~ s/\.pod$//; Debug("files", "opening 2 $podfh" ); + (print "Creating $pod.html from $podfh\n") if $count; $RS = "\n="; open($podfh,"<".$podfh) || die "can't open $podfh: $ERRNO"; @all=<$podfh>; @@ -60,11 +86,10 @@ for $count (0,1){ $in_list=0; $html=$pod.".html"; if($count){ - #open(HTML,">&STDOUT") || die "can't create $html: $ERRNO"; open(HTML,">$html") || die "can't create $html: $ERRNO"; print HTML <<'HTML__EOQ', <<"HTML__EOQQ"; - <!-- $RCSfile$$Date$ --> - <!-- $Log$ --> + <!-- \$RCSfile\$\$Revision\$\$Date\$ --> + <!-- \$Log\$ --> <HTML> HTML__EOQ <TITLE> \U$pod\E </TITLE> @@ -77,44 +102,45 @@ HTML__EOQQ ($cmd, $title, $rest) = ($1,$2,$3); if ($cmd eq "item") { if($count ){ - ($depth) or &do_list("over",$all[$i],\$in_list,\$depth); - &do_item($title,$rest,$in_list); + ($depth) or do_list("over",$all[$i],\$in_list,\$depth); + do_item($title,$rest,$in_list); } else{ # scan item - &scan_thing("item",$title,$pod); + scan_thing("item",$title,$pod); } } elsif ($cmd =~ /^head([12])/){ $num=$1; if($count){ - &do_hdr($num,$title,$rest,$depth); + do_hdr($num,$title,$rest,$depth); } else{ # header scan - &scan_thing($cmd,$title,$pod); # skip head1 + scan_thing($cmd,$title,$pod); # skip head1 } } elsif ($cmd =~ /^over/) { - $depth and &do_list("over",$all[$i+1],\$in_list,\$depth); + $count and $depth and do_list("over",$all[$i+1],\$in_list,\$depth); } elsif ($cmd =~ /^back/) { if($count){ ($depth) or next; # just skip it - &do_list("back",$all[$i+1],\$in_list,\$depth); - &do_rest("$title.$rest"); + do_list("back",$all[$i+1],\$in_list,\$depth); + do_rest("$title.$rest"); } } elsif ($cmd =~ /^cut/) { - &do_rest($rest); + next; } - else { - warn "unrecognized header: $cmd"; + elsif($Debug){ + (warn "unrecognized header: $cmd") if $Debug; } } + # close open lists without '=back' stmts if($count){ while($depth){ - &do_list("back",$all[$i+1],\$in_list,\$depth); + do_list("back",$all[$i+1],\$in_list,\$depth); } print HTML "\n</HTML>\n"; } @@ -125,7 +151,7 @@ sub do_list{ my($which,$next_one,$list_type,$depth)=@_; my($key); if($which eq "over"){ - ($next_one =~ /^item\s+(.*)/ ) or warn "Bad list, $1\n"; + ($next_one =~ /^item\s+(.*)/ ) or (warn "Bad list, $1\n") if $Debug; $key=$1; if($key =~ /^1\.?/){ $$list_type = "OL"; @@ -137,7 +163,7 @@ sub do_list{ $$list_type="DL"; } else{ - warn "unknown list type for item $key"; + (warn "unknown list type for item $key") if $Debug; } print HTML qq{\n}; print HTML qq{<$$list_type>}; @@ -152,16 +178,16 @@ sub do_list{ sub do_hdr{ my($num,$title,$rest,$depth)=@_; ($num == 1) and print HTML qq{<p><hr>\n}; - &process_thing(\$title,"NAME"); + process_thing(\$title,"NAME"); print HTML qq{\n<H$num> }; print HTML $title; print HTML qq{</H$num>\n}; - &do_rest($rest); + do_rest($rest); } sub do_item{ my($title,$rest,$list_type)=@_; - &process_thing(\$title,"NAME"); + process_thing(\$title,"NAME"); if($list_type eq "DL"){ print HTML qq{\n<DT><STRONG>\n}; print HTML $title; @@ -172,13 +198,13 @@ sub do_item{ print HTML qq{\n<LI>}; ($list_type ne "OL") && (print HTML $title,"\n"); } - &do_rest($rest); + do_rest($rest); print HTML ($list_type eq "DL" )? qq{</DD>} : qq{</LI>}; } sub do_rest{ my($rest)=@_; - my(@lines,$p,$q,$line,@paras,$inpre); + my(@lines,$p,$q,$line,,@paras,$inpre); @paras=split(/\n\n+/,$rest); for($p=0;$p<=$#paras;$p++){ @lines=split(/\n/,$paras[$p]); @@ -207,13 +233,13 @@ inner: foreach $q (@lines){ if($paras[$p]=~/>>|<</){ if($inpre){ - &process_thing(\$q,"HTML"); + process_thing(\$q,"HTML"); } else { print HTML qq{\n</XMP>\n}; print HTML qq{<PRE>\n}; $inpre=1; - &process_thing(\$q,"HTML"); + process_thing(\$q,"HTML"); } } while($q =~ s/\t+/' 'x (length($&) * 8 - length($`) % 8)/e){ @@ -229,7 +255,7 @@ inner: else{ # other text @lines=split(/\n/,$paras[$p]); foreach $line (@lines){ - &process_thing(\$line,"HTML"); + process_thing(\$line,"HTML"); print HTML qq{$line\n}; } } @@ -239,9 +265,9 @@ inner: sub process_thing{ my($thing,$htype)=@_; - &pre_escapes($thing); - &find_refs($thing,$htype); - &post_escapes($thing); + pre_escapes($thing); + find_refs($thing,$htype); + post_escapes($thing); } sub scan_thing{ @@ -284,7 +310,7 @@ sub scan_thing{ Debug("headers", "header $_"); } else { - warn "unrecognized header: $cmd"; + (warn "unrecognized header: $cmd") if $Debug; } } @@ -316,9 +342,11 @@ sub picrefs { } if ($char =~ /[IF]/) { return "<EM> $bigkey </EM>"; + } elsif($char =~ /C/) { + return "<CODE> $bigkey </CODE>"; } else { return "<STRONG> $bigkey </STRONG>"; - } + } } sub find_refs { @@ -329,7 +357,7 @@ sub find_refs { $$thing=~s/L<([^>]*)>/lrefs($1,$htype)/ge; $$thing=~s/([CIBF])<(\W*?(-?\w*).*?)>/picrefs($1, $2, $3, $htype)/ge; $$thing=~s/((\w+)\(\))/picrefs("I", $1, $2,$htype)/ge; - $$thing=~s/([\$\@%]([\w:]+|\W\b))/varrefs($1,$htype)/ge; + $$thing=~s/([\$\@%](?!&[gl]t)([\w:]+|\W\b))/varrefs($1,$htype)/ge; (($$thing eq $orig) && ($htype eq "NAME")) && ($$thing=picrefs("I", $$thing, "", $htype)); } @@ -354,7 +382,7 @@ sub lrefs { if (!defined $section && defined $Podnames{$page}) { return "\n$type$page.html\">\nthe <EM> $page </EM> manpage<\/A>\n"; } else { - warn "Bizarre entry $page/$item"; + (warn "Bizarre entry $page/$item") if $Debug; return "the <EM> $_[0] </EM> manpage\n"; } } @@ -385,7 +413,7 @@ sub lrefs { } } } - warn "No $ref reference for $item (@_)"; + (warn "No $ref reference for $item (@_)") if $Debug; return $text; } @@ -433,7 +461,7 @@ sub noremap { sub post_escapes { my($thing)=@_; $$thing=~s/[^GM]>>/\>\;\>\;/g; - $$thing=~s/([^"MGA])>/$1\>\;/g; + $$thing=~s/([^"MGAE])>/$1\>\;/g; $$thing=~tr/\200-\377/\000-\177/; } @@ -457,3 +485,6 @@ sub trim { } +!NO!SUBS! +chmod 755 pod2html +$eunicefix pod2html diff --git a/pod/pod2latex b/pod/pod2latex.SH index 9dbb2cd27b..7c9d1f6789 100755 --- a/pod/pod2latex +++ b/pod/pod2latex.SH @@ -1,4 +1,29 @@ -#!/usr/bin/perl +case $CONFIG in +'') + if test -f config.sh; then TOP=.; + elif test -f ../config.sh; then TOP=..; + elif test -f ../../config.sh; then TOP=../..; + elif test -f ../../../config.sh; then TOP=../../..; + elif test -f ../../../../config.sh; then TOP=../../../..; + else + echo "Can't find config.sh."; exit 1 + fi + . $TOP/config.sh + ;; +esac +case "$0" in +*/*) cd `expr X$0 : 'X\(.*\)/'` ;; +esac +echo "Extracting pod/pod2latex (with variable substitutions)" +rm -f pod2latex +$spitshell >pod2latex <<!GROK!THIS! +#!$bin/perl +eval 'exec $bin/perl -S \$0 \${1+"\$@"}' + if \$running_under_some_shell; +!GROK!THIS! + +$spitshell >>pod2latex <<'!NO!SUBS!' +# # pod2latex, version 1.1 # by Taro Kawagish (kawagish@imslab.co.jp), Jan 11, 1995. # @@ -630,3 +655,6 @@ BEGIN { "yuml" => '\\"{y}', # small y, dieresis or umlaut mark ); } +!NO!SUBS! +chmod 755 pod2latex +$eunicefix pod2latex diff --git a/pod/pod2man b/pod/pod2man.SH index b375b0184e..1528b0190c 100755 --- a/pod/pod2man +++ b/pod/pod2man.SH @@ -1,4 +1,28 @@ -#!/usr/bin/perl +case $CONFIG in +'') + if test -f config.sh; then TOP=.; + elif test -f ../config.sh; then TOP=..; + elif test -f ../../config.sh; then TOP=../..; + elif test -f ../../../config.sh; then TOP=../../..; + elif test -f ../../../../config.sh; then TOP=../../../..; + else + echo "Can't find config.sh."; exit 1 + fi + . $TOP/config.sh + ;; +esac +case "$0" in +*/*) cd `expr X$0 : 'X\(.*\)/'` ;; +esac +echo "Extracting pod/pod2man (with variable substitutions)" +rm -f pod2man +$spitshell >pod2man <<!GROK!THIS! +#!$bin/perl +eval 'exec $bin/perl -S \$0 \${1+"\$@"}' + if \$running_under_some_shell; +!GROK!THIS! + +$spitshell >>pod2man <<'!NO!SUBS!' $/ = ""; $cutting = 1; @@ -623,3 +647,6 @@ BEGIN { "yuml" => "y\\*:", # small y, dieresis or umlaut mark ); } +!NO!SUBS! +chmod 755 pod2man +$eunicefix pod2man @@ -1560,6 +1560,7 @@ PP(pp_entersub) HV *stash; register CV *cv; register CONTEXT *cx; + I32 gimme; if (!sv) DIE("Not a CODE reference"); @@ -1632,6 +1633,8 @@ PP(pp_entersub) DIE("No DBsub routine"); } + gimme = GIMME; + if (CvXSUB(cv)) { if (CvOLDSTYLE(cv)) { I32 (*fp3)_((int,int,int)); @@ -1655,7 +1658,7 @@ PP(pp_entersub) (void)(*CvXSUB(cv))(cv); /* Enforce some sanity in scalar context. */ - if (GIMME == G_SCALAR && ++markix != stack_sp - stack_base ) { + if (gimme == G_SCALAR && ++markix != stack_sp - stack_base ) { if (markix > stack_sp - stack_base) *(stack_base + markix) = &sv_undef; else @@ -1670,7 +1673,6 @@ PP(pp_entersub) dMARK; register I32 items = SP - MARK; I32 hasargs = (op->op_flags & OPf_STACKED) != 0; - I32 gimme = GIMME; AV* padlist = CvPADLIST(cv); SV** svp = AvARRAY(padlist); push_return(op->op_next); @@ -1116,7 +1116,7 @@ PP(pp_truncate) GV *tmpgv; SETERRNO(0,0); -#if defined(HAS_TRUNCATE) || defined(HAS_CHSIZE) +#if defined(HAS_TRUNCATE) || defined(HAS_CHSIZE) || defined(F_FREESP) #ifdef HAS_TRUNCATE if (op->op_flags & OPf_SPECIAL) { tmpgv = gv_fetchpv(POPp,FALSE, SVt_PVIO); @@ -2321,7 +2321,8 @@ char *cmd; char *filename; { char mybuf[8192]; - char *s, *tmps; + char *s, + *save_filename = filename; int anum = 1; FILE *myfp; @@ -2373,7 +2374,7 @@ char *filename; return 0; } else { /* some mkdirs return no failure indication */ - anum = (Stat(filename, &statbuf) >= 0); + anum = (Stat(save_filename, &statbuf) >= 0); if (op->op_type == OP_RMDIR) anum = !anum; if (anum) @@ -1038,7 +1038,7 @@ register SV *sv; if (SvNVX(sv) < 0.0) return I_V(SvNVX(sv)); else - return (IV)(UV)SvNVX(sv); + return (IV) U_V(SvNVX(sv)); } if (SvPOKp(sv) && SvLEN(sv)) { if (dowarn && !looks_like_number(sv)) @@ -1061,7 +1061,7 @@ register SV *sv; if (SvNVX(sv) < 0.0) return I_V(SvNVX(sv)); else - return (IV)(UV)SvNVX(sv); + return (IV) U_V(SvNVX(sv)); } if (SvPOKp(sv) && SvLEN(sv)) { if (dowarn && !looks_like_number(sv)) @@ -1088,7 +1088,7 @@ register SV *sv; if (SvNVX(sv) < 0.0) SvIVX(sv) = I_V(SvNVX(sv)); else - SvIVX(sv) = (IV)(UV)SvNVX(sv); + SvIVX(sv) = (IV) U_V(SvNVX(sv)); } else if (SvPOKp(sv) && SvLEN(sv)) { if (dowarn && !looks_like_number(sv)) @@ -29,6 +29,10 @@ # include <vfork.h> #endif +#ifdef I_LIMITS /* Needed for cast_xxx() functions below. */ +# include <limits.h> +#endif + /* Put this after #includes because fork and vfork prototypes may conflict. */ @@ -1575,36 +1579,75 @@ double f; #endif #ifndef CASTI32 + +/* Look for MAX and MIN integral values. If we can't find them, + we'll use 32-bit two's complement defaults. +*/ +#ifndef LONG_MAX +# ifdef MAXLONG /* Often used in <values.h> */ +# define LONG_MAX MAXLONG +# else +# define LONG_MAX 2147483647L +# endif +#endif + +#ifndef LONG_MIN +# define LONG_MIN (-LONG_MAX - 1) +#endif + +#ifndef ULONG_MAX +# ifdef MAXULONG +# define LONG_MAX MAXULONG +# else +# define ULONG_MAX 4294967295L +# endif +#endif + +/* Unfortunately, on some systems the cast_uv() function doesn't + work with the system-supplied definition of ULONG_MAX. The + comparison (f >= ULONG_MAX) always comes out true. It must be a + problem with the compiler constant folding. + + In any case, this workaround should be fine on any two's complement + system. If it's not, supply a '-DMY_ULONG_MAX=whatever' in your + ccflags. + --Andy Dougherty <doughera@lafcol.lafayette.edu> +*/ +#ifndef MY_ULONG_MAX +# define MY_ULONG_MAX ((UV)LONG_MAX * (UV)2 + (UV)1) +#endif + I32 cast_i32(f) double f; { -# define BIGDOUBLE 2147483647.0 /* Assume 32 bit int's ! */ -# define BIGNEGDOUBLE (-2147483648.0) - if (f >= BIGDOUBLE) - return (I32) BIGDOUBLE; - if (f <= BIGNEGDOUBLE) - return (I32) BIGNEGDOUBLE; + if (f >= LONG_MAX) + return (I32) LONG_MAX; + if (f <= LONG_MIN) + return (I32) LONG_MIN; return (I32) f; } -# undef BIGDOUBLE -# undef BIGNEGDOUBLE IV cast_iv(f) double f; { - /* XXX This should be fixed. It assumes 32 bit IV's. */ -# define BIGDOUBLE 2147483647.0 /* Assume 32 bit IV's ! */ -# define BIGNEGDOUBLE (-2147483648.0) - if (f >= BIGDOUBLE) - return (IV) BIGDOUBLE; - if (f <= BIGNEGDOUBLE) - return (IV) BIGNEGDOUBLE; + if (f >= LONG_MAX) + return (IV) LONG_MAX; + if (f <= LONG_MIN) + return (IV) LONG_MIN; return (IV) f; } -# undef BIGDOUBLE -# undef BIGNEGDOUBLE + +UV +cast_uv(f) +double f; +{ + if (f >= MY_ULONG_MAX) + return (UV) MY_ULONG_MAX; + return (UV) f; +} + #endif #ifndef HAS_RENAME |