# This is a patch for perl5.005_02 to update it to perl5.005_03 # # To apply this patch: # STEP 1: Chdir to the source directory. # STEP 2: Run the 'applypatch' program with this patch file as input. # # If you do not have 'applypatch', it is part of the 'makepatch' package # that you can fetch from the Comprehensive Perl Archive Network: # http://www.perl.com/CPAN/authors/Johan_Vromans/makepatch-x.y.tar.gz # In the above URL, 'x' should be 2 or higher. # # To apply this patch without the use of 'applypatch': # STEP 1: Chdir to the source directory. # If you have a decent Bourne-type shell: # STEP 2: Run the shell with this file as input. # If you don't have such a shell, you may need to manually create/delete # the files/directories as shown below. # STEP 3: Run the 'patch' program with this file as input. # # These are the commands needed to create/delete files/directories: # mkdir 'apollo' chmod 0700 'apollo' mkdir 'apollo/netinet' chmod 0700 'apollo/netinet' mkdir 'ext/DB_File/hints' chmod 0700 'ext/DB_File/hints' mkdir 'ext/GDBM_File/hints' chmod 0700 'ext/GDBM_File/hints' mkdir 'mint' chmod 0700 'mint' mkdir 'mint/sys' chmod 0700 'mint/sys' mkdir 'vos' chmod 0700 'vos' rm -f 'interp.sym' touch 'README.apollo' chmod 0444 'README.apollo' touch 'README.hpux' chmod 0444 'README.hpux' touch 'README.hurd' chmod 0444 'README.hurd' touch 'README.mint' chmod 0444 'README.mint' touch 'README.vos' chmod 0444 'README.vos' touch 'apollo/netinet/in.h' chmod 0444 'apollo/netinet/in.h' touch 'ext/DB_File/hints/dynixptx.pl' chmod 0444 'ext/DB_File/hints/dynixptx.pl' touch 'ext/DynaLoader/dl_beos.xs' chmod 0444 'ext/DynaLoader/dl_beos.xs' touch 'ext/GDBM_File/hints/sco.pl' chmod 0444 'ext/GDBM_File/hints/sco.pl' touch 'ext/POSIX/hints/dynixptx.pl' chmod 0444 'ext/POSIX/hints/dynixptx.pl' touch 'ext/POSIX/hints/mint.pl' chmod 0444 'ext/POSIX/hints/mint.pl' touch 'hints/gnu.sh' chmod 0444 'hints/gnu.sh' touch 'hints/mint.sh' chmod 0444 'hints/mint.sh' touch 'hints/uwin.sh' chmod 0444 'hints/uwin.sh' touch 'lib/Dumpvalue.pm' chmod 0444 'lib/Dumpvalue.pm' touch 'mint/Makefile' chmod 0444 'mint/Makefile' touch 'mint/README' chmod 0444 'mint/README' touch 'mint/errno.h' chmod 0444 'mint/errno.h' touch 'mint/pwd.c' chmod 0444 'mint/pwd.c' touch 'mint/stdio.h' chmod 0444 'mint/stdio.h' touch 'mint/sys/time.h' chmod 0444 'mint/sys/time.h' touch 'mint/time.h' chmod 0444 'mint/time.h' touch 'pod/perlopentut.pod' chmod 0444 'pod/perlopentut.pod' touch 'pod/perlreftut.pod' chmod 0444 'pod/perlreftut.pod' touch 'pod/perlthrtut.pod' chmod 0444 'pod/perlthrtut.pod' touch 't/lib/fatal.t' chmod 0555 't/lib/fatal.t' touch 't/lib/textfill.t' chmod 0555 't/lib/textfill.t' touch 't/op/grep.t' chmod 0555 't/op/grep.t' touch 't/op/tr.t' chmod 0555 't/op/tr.t' touch 'vos/Changes' chmod 0444 'vos/Changes' touch 'vos/build.cm' chmod 0444 'vos/build.cm' touch 'vos/compile_perl.cm' chmod 0444 'vos/compile_perl.cm' touch 'vos/config.h' chmod 0444 'vos/config.h' touch 'vos/config_h.SH_orig' chmod 0555 'vos/config_h.SH_orig' touch 'vos/perl.bind' chmod 0444 'vos/perl.bind' touch 'vos/test_vos_dummies.c' chmod 0444 'vos/test_vos_dummies.c' touch 'vos/vos_accept.c' chmod 0444 'vos/vos_accept.c' touch 'vos/vos_dummies.c' chmod 0444 'vos/vos_dummies.c' touch 'vos/vosish.h' chmod 0444 'vos/vosish.h' # # This command terminates the shell and need not be executed manually. exit # #### End of Preamble #### #### Patch data follows #### diff -c 'perl5.005_02/patchlevel.h' 'perl5.005_03/patchlevel.h' Index: ./patchlevel.h *** ./patchlevel.h Fri Aug 7 22:44:26 1998 --- ./patchlevel.h Sun Mar 28 10:11:58 1999 *************** *** 1,7 **** #ifndef __PATCHLEVEL_H_INCLUDED__ #define PATCHLEVEL 5 #undef SUBVERSION /* OS/390 has a SUBVERSION in a system header */ ! #define SUBVERSION 2 /* local_patches -- list of locally applied less-than-subversion patches. --- 1,7 ---- #ifndef __PATCHLEVEL_H_INCLUDED__ #define PATCHLEVEL 5 #undef SUBVERSION /* OS/390 has a SUBVERSION in a system header */ ! #define SUBVERSION 3 /* local_patches -- list of locally applied less-than-subversion patches. diff -c 'perl5.005_02/Changes' 'perl5.005_03/Changes' Index: ./Changes *** ./Changes Fri Aug 7 22:54:42 1998 --- ./Changes Sun Mar 28 16:33:36 1999 *************** *** 20,26 **** Abigail Kenneth Albanowski Russ Allbery - Graham Barr Spider Boardman Tom Christiansen Hallvard B Furuseth --- 20,25 ---- *************** *** 50,59 **** And the Keepers of the Patch Pumpkin: Charles Bailey Malcolm Beattie Tim Bunce Andy Dougherty ! Gurusamy Sarathy Chip Salzenberg And, of course, the Author of Perl: --- 49,59 ---- And the Keepers of the Patch Pumpkin: Charles Bailey + Graham Barr Malcolm Beattie Tim Bunce Andy Dougherty ! Gurusamy Sarathy Chip Salzenberg And, of course, the Author of Perl: *************** *** 72,77 **** --- 72,3517 ---- +> branched (from elsewhere) !> merged changes (from elsewhere) + + ---------------- + Version 5.005_03 Third maintenance release of 5.005 + ---------------- + + ____________________________________________________________________________ + [ 3198] By: gbarr on 1999/03/28 22:21:49 + Log: redo #3193 which #3195 undid + Branch: maint-5.005/perl + ! pod/perlhist.pod + ____________________________________________________________________________ + [ 3197] By: gbarr on 1999/03/28 21:04:04 + Log: Updated CPAN.pm to 1.48 + Branch: maint-5.005/perl + ! lib/CPAN.pm lib/CPAN/FirstTime.pm lib/CPAN/Nox.pm + ____________________________________________________________________________ + [ 3196] By: gbarr on 1999/03/28 17:21:27 + Log: AIX hints update from Jarkko + Branch: maint-5.005/perl + ! hints/aix.sh + ____________________________________________________________________________ + [ 3195] By: jhi on 1999/03/28 16:42:54 + Log: Update perlhist on 5_03. + Branch: maint-5.005/perl + ! pod/perlhist.pod + ____________________________________________________________________________ + [ 3193] By: gsar on 1999/03/28 09:46:29 + Log: =end needs matching =begin (or installhtml will croak) + Branch: maint-5.005/perl + ! pod/perlhist.pod + ____________________________________________________________________________ + [ 3192] By: gsar on 1999/03/28 09:10:15 + Log: update pod/Makefile + Branch: maint-5.005/perl + ! pod/Makefile + ____________________________________________________________________________ + [ 3191] By: gsar on 1999/03/28 08:43:47 + Log: integrate change#3180 from mainline + + fix bogus OPf_REF context for the BLOCK in C + (sometimes caused bizarreness in the BLOCK) + Branch: maint-5.005/perl + +> t/op/grep.t + !> MANIFEST op.c + ____________________________________________________________________________ + [ 3190] By: gsar on 1999/03/28 08:29:51 + Log: integrate change#3147 from mainline + + warn about newfangled vfork() caveats + Branch: maint-5.005/perl + ! Configure + ____________________________________________________________________________ + [ 3189] By: gsar on 1999/03/28 08:22:00 + Log: various pod niggles + Branch: maint-5.005/perl + ! pod/perl.pod pod/perldebug.pod pod/perldiag.pod + ! pod/perlfunc.pod pod/perlhist.pod + ____________________________________________________________________________ + [ 3188] By: gsar on 1999/03/28 07:37:43 + Log: integrate binary compatible variant of change#3098 from mainline + Branch: maint-5.005/perl + ! op.c perl.h t/base/lex.t toke.c + ____________________________________________________________________________ + [ 3187] By: gsar on 1999/03/28 07:31:16 + Log: regularize CAPI declarations (CAPI extensions now build under + the Borland compiler) + Branch: maint-5.005/perl + ! win32/GenCAPI.pl + ____________________________________________________________________________ + [ 3186] By: gsar on 1999/03/28 07:26:33 + Log: ensure XS_LOCKS stuff happens *before* XSUB is entered under + -DPERL_CAPI + Branch: maint-5.005/perl + ! XSlock.h win32/GenCAPI.pl win32/Makefile win32/makefile.mk + ____________________________________________________________________________ + [ 3185] By: gbarr on 1999/03/28 06:37:41 + Log: integrate change #2846 from mainline + + a modified version of suggested patch for pack template 'Z'; added docs + From: "Valeriy E. Ushakov" + Date: Mon, 16 Jun 1997 03:00:31 +0400 (MSD) + Message-ID: <%lOHpzIuGV@snark.ptc.spbu.ru> + Subject: lack of pack/unpack letter with useful symmetry for C null delimited strings + Branch: maint-5.005/perl + ! pod/perldelta.pod pod/perlfunc.pod pp.c + !> t/op/pack.t + ____________________________________________________________________________ + [ 3184] By: gbarr on 1999/03/28 06:35:50 + Log: integrate change # 3160 from mainline + + better description of OP_UNSTACK (s/unstack/iteration finalizer/) + Branch: maint-5.005/perl + ! opcode.h opcode.pl + ____________________________________________________________________________ + [ 3182] By: gbarr on 1999/03/28 03:40:28 + Log: Integrate changes #3067 and #3106 from mainline + + exempt $foo::a,$foo::b from warnings only if sort() was seen in package foo + From: Graham Barr + Date: Wed, 3 Mar 1999 17:23:56 -0600 + Message-ID: <19990303172356.F7442@dal.asp.ti.com> + Subject: Re: 'use strict' doesn't work for one-letter variables + + change#3067 failed package.t due to needless creation of $a and $b; + fixed to do that only for C, not C + Branch: maint-5.005/perl + ! gv.c op.c t/pragma/warn-1global + ____________________________________________________________________________ + [ 3179] By: gsar on 1999/03/28 02:14:04 + Log: fix thread segfault when passing large number of arguments to child + a la Cnew($foo, 1..1000)> + Branch: maint-5.005/perl + ! ext/Thread/Thread.xs t/lib/thread.t + ____________________________________________________________________________ + [ 3178] By: gbarr on 1999/03/28 01:39:23 + Log: fix $Config{'usethreads'} typo in perlthrtut + + From: Ian Maloney + Date: Thu, 25 Mar 1999 16:40:14 +0100 (MET) + Message-Id: <199903251540.QAA02439@wsblob.> + Subject: perlthrtut documentation error + Branch: maint-5.005/perl + ! pod/perlthrtut.pod + ____________________________________________________________________________ + [ 3177] By: gbarr on 1999/03/28 01:09:59 + Log: Integrate #2910 from mainline + + slurping an empty file should return '' rather than undef, with + commensurate effects on ARGV processing + Branch: maint-5.005/perl + ! pod/perldelta.pod pp_hot.c sv.h + !> t/io/argv.t + ____________________________________________________________________________ + [ 3176] By: gbarr on 1999/03/28 00:00:30 + Log: Integrate relevant doc changes from mainline + Branch: maint-5.005/perl + !> (integrate 34 files) + ____________________________________________________________________________ + [ 3175] By: gbarr on 1999/03/27 19:20:32 + Log: Integrated #2352 and #2397 from mainline + + Implement $^C to allow perl access to -c flag - I think this + was agreed once... + + Update docs and English.pm for $^C + Branch: maint-5.005/perl + ! gv.c mg.c + !> lib/English.pm + ____________________________________________________________________________ + [ 3174] By: gbarr on 1999/03/27 18:21:01 + Log: Update Copyright year + Branch: maint-5.005/perl + ! EXTERN.h INTERN.h README av.c av.h cop.h cv.h deb.c doio.c + ! doop.c dump.c form.h gv.c gv.h handy.h hv.c hv.h mg.c mg.h + ! op.c op.h perl.h perly.y pp.c pp.h pp_ctl.c pp_hot.c pp_sys.c + ! regcomp.c regexec.c run.c scope.c sv.c sv.h toke.c util.c + ! util.h + ____________________________________________________________________________ + [ 3173] By: gbarr on 1999/03/27 18:19:47 + Log: Update Test.pm to VERSION 1.122 from CPAN + Branch: maint-5.005/perl + ! lib/Test.pm + ____________________________________________________________________________ + [ 3154] By: jhi on 1999/03/24 21:40:51 + Log: Reword the shared library search path (LD_LIBRARY_PATH) info + based on suggestions from Andy Dougherty. + Branch: maint-5.005/perl + ! INSTALL + ____________________________________________________________________________ + [ 3146] By: jhi on 1999/03/24 09:20:14 + Log: Bring in changes #2808 and #2812 (from mainline perl) + that enhance the perlbug checklist. + Branch: maint-5.005/perl + ! utils/perlbug.PL + ____________________________________________________________________________ + [ 3130] By: jhi on 1999/03/23 22:02:23 + Log: Don't use config.msg to remind about the + LD_LIBRARY_PATH because Makefile.SH takes + care of that. + + Use shrplib in DEC O^W^Digital U^W^WTru64 UNIX. + This used to be the default but in some MT or another it + was dropped because of some transient error or another. + Branch: maint-5.005/perl + ! Configure hints/dec_osf.sh + ____________________________________________________________________________ + [ 3122] By: jhi on 1999/03/19 21:12:14 + Log: Describe the new Benchmark feature in more detail. + Branch: cfgperl + ! pod/perldelta.pod + Branch: maint-5.005/perl + ! pod/perldelta.pod + ____________________________________________________________________________ + [ 3121] By: jhi on 1999/03/19 08:16:12 + Log: AVAILABILITY tuning. + Branch: cfgperl + ! pod/perl.pod + Branch: maint-5.005/perl + ! pod/perl.pod + ____________________________________________________________________________ + [ 3119] By: jhi on 1999/03/17 14:33:43 + Log: More Apollo fixes. + Branch: maint-5.005/perl + ! README.apollo hints/apollo.sh t/lib/io_udp.t + ____________________________________________________________________________ + [ 3118] By: jhi on 1999/03/16 17:23:39 + Log: Nada. + Branch: maint-5.005/perl + ! README.apollo + ____________________________________________________________________________ + [ 3117] By: jhi on 1999/03/16 17:18:49 + Log: Apollo DomainOS AVAILABILITY. + Branch: cfgperl + ! pod/perl.pod + Branch: maint-5.005/perl + ! pod/perl.pod + ____________________________________________________________________________ + [ 3116] By: jhi on 1999/03/16 17:14:00 + Log: Apollo DomainOS patch + From: Johann Klasek + Subject: Re: DomainPerl + Date: Tue, 16 Mar 1999 17:46:32 +0100 + Message-ID: <19990316174632.A19759@euklid.auto.tuwien.ac.at> + Branch: maint-5.005/perl + + README.apollo apollo/netinet/in.h + ! MANIFEST hints/apollo.sh + ____________________________________________________________________________ + [ 3115] By: jhi on 1999/03/16 14:23:54 + Log: From: Paul Marquess + To: Gurusamy Sarathy , + Graham Barr + Cc: Perl5 Porters , + "Paul.Marquess" + Subject: [PATCH 5.005_56 & 5.005_03_T6] Upgrade DB_File to version 1.65 + Date: Sun, 14 Mar 1999 14:43:57 -0000 + Message-Id: <199903141841.NAA17040@defender.perl.org> + Branch: maint-5.005/perl + ! ext/DB_File/Changes ext/DB_File/DB_File.pm + ! ext/DB_File/DB_File.xs ext/DB_File/typemap + ____________________________________________________________________________ + [ 3114] By: jhi on 1999/03/16 12:42:20 + Log: Mention Rhapsody in 5.005_5X perldelta, + and in Rhapsody and Netware in 5.005_0X and 5.005_5X + *planned* AVAILABILITY. + Branch: cfgperl + ! pod/perl.pod pod/perldelta.pod + Branch: maint-5.005/perl + ! pod/perl.pod + ____________________________________________________________________________ + [ 3113] By: jhi on 1999/03/16 10:38:53 + Log: perldelta niggling. + Branch: cfgperl + ! pod/perldelta.pod + Branch: maint-5.005/perl + ! pod/perldelta.pod + ____________________________________________________________________________ + [ 3111] By: jhi on 1999/03/16 10:28:10 + Log: AVAILABILITY update: still mention PowerUX, + Novell Netware now has sources available. + Branch: cfgperl + ! pod/perl.pod + Branch: maint-5.005/perl + ! pod/perl.pod + ____________________________________________________________________________ + [ 3105] By: jhi on 1999/03/12 15:54:57 + Log: Recognize the NetBSD packages collection. + Branch: maint-5.005/perl + ! hints/netbsd.sh + ____________________________________________________________________________ + [ 3104] By: jhi on 1999/03/12 09:07:04 + Log: From: pvhp@forte.com (Peter Prymmer) + To: jhi@iki.fi, perl-mvs@perl.org, perlbug@perl.com + Subject: [PATCH MT6,_56] was Re: Not OK: perl 5.00503 +MAINT_TRIAL_6 on os390 06.00 (UNINSTALLED) + Date: Thu, 11 Mar 99 14:24:54 PST + Message-Id: <9903112224.AA24346@forte.com> + Branch: maint-5.005/perl + ! README.os390 t/lib/posix.t + ____________________________________________________________________________ + [ 3102] By: jhi on 1999/03/10 11:01:20 + Log: From: pvhp@forte.com (Peter Prymmer) + To: perl5-porters@perl.org + Subject: [5.005_03-MT6]Patch: time passes + Date: Tue, 9 Mar 99 18:42:17 PST + Message-Id: <9903100242.AA29057@forte.com> + Branch: maint-5.005/perl + ! perl.c + ____________________________________________________________________________ + [ 3101] By: jhi on 1999/03/10 10:30:15 + Log: From: Mark-Jason Dominus + To: perl5-porters@perl.com + Subject: Minor fix to perlfunc.pod + Date: Mon, 08 Mar 1999 20:05:53 -0500 + Message-ID: <19990309010553.13757.qmail@plover.com> + Branch: maint-5.005/perl + ! pod/perlfunc.pod + ____________________________________________________________________________ + [ 3094] By: jhi on 1999/03/06 16:16:15 + Log: From: Mark Kettenis + To: jhi@iki.fi + Subject: Oops + Date: Sat, 6 Mar 1999 17:15:35 +0100 (CET) + Message-Id: <199903061615.RAA00207@delius.kettenis.nl> + Branch: maint-5.005/perl + ! README.hurd + ____________________________________________________________________________ + [ 3093] By: jhi on 1999/03/06 15:59:46 + Log: From: Mark Kettenis + To: jhi@iki.fi + Subject: New Hurd README + Date: Sat, 6 Mar 1999 16:46:12 +0100 (CET) + Message-Id: <199903061601.RAA00185@delius.kettenis.nl> + Branch: maint-5.005/perl + ! README.hurd + ____________________________________________________________________________ + [ 3092] By: jhi on 1999/03/06 12:52:06 + Log: From: Paul_Green@stratus.com + To: perl5-porters@perl.org + Cc: jhi@iki.fi, Paul_Green@stratus.com + Subject: [PATCH 5.005_03-MAINT_TRIAL_6]: platform: vos -- updates to VOS port of Perl5 + Date: Fri, 5 Mar 1999 18:08:49 -0500 + Message-ID: <1D1A4EF7AD4DD211A80D00A0C9D7DB665A035A@exna1.stratus.com> + Branch: maint-5.005/perl + ! vos/config.h vos/config_h.SH_orig + ____________________________________________________________________________ + [ 3091] By: jhi on 1999/03/06 12:42:21 + Log: From: Dan Sugalski + To: perl5-porters@perl.org, vmsperl@perl.org + Subject: [PATCH 5.005_03-MT6]VMS build patch + Date: Fri, 05 Mar 1999 12:36:19 -0800 + Message-Id: <3.0.6.32.19990305123619.02d326a0@ous.edu> + Branch: maint-5.005/perl + ! vms/subconfigure.com + ____________________________________________________________________________ + [ 3090] By: gsar on 1999/03/06 04:40:03 + Log: integrate change#3089 from mainline + + tolerate CRs after options + Branch: maint-5.005/perl + !> perl.c + ____________________________________________________________________________ + [ 3086] By: gbarr on 1999/03/05 01:48:05 + Log: #3085 was a bit premature, this is MT6 as 2 files were + missing from MANIFEST + Branch: maint-5.005/perl + ! MANIFEST + ____________________________________________________________________________ + [ 3085] By: gbarr on 1999/03/05 01:41:06 + Log: Trial release 6 + Branch: maint-5.005/perl + ! Changes + ____________________________________________________________________________ + [ 3084] By: gbarr on 1999/03/05 01:34:07 + Log: Don't process - as a file in Errno_pm.PL + + From: Jarkko Hietaniemi + Date: Thu, 4 Mar 1999 13:29:23 +0200 (EET) + Message-ID: <14046.28307.561693.849859@alpha.hut.fi> + Subject: Re: maint-5.005 + Branch: maint-5.005/perl + ! ext/Errno/Errno_pm.PL + ____________________________________________________________________________ + [ 3081] By: gsar on 1999/03/05 00:14:33 + Log: protect against doubled backslashes + Branch: maint-5.005/perl + ! ext/Errno/Errno_pm.PL + ____________________________________________________________________________ + [ 3080] By: gsar on 1999/03/04 23:37:20 + Log: pick up AIX hints from mainline + Branch: maint-5.005/perl + !> hints/aix.sh + ____________________________________________________________________________ + [ 3079] By: gsar on 1999/03/04 21:09:43 + Log: tweak cast and crew + Branch: maint-5.005/perl + ! Changes + ____________________________________________________________________________ + [ 3078] By: gsar on 1999/03/04 21:03:04 + Log: update patchlevel, Changes + Branch: maint-5.005/perl + ! Changes README.win32 patchlevel.h + !> pod/perlhist.pod + ____________________________________________________________________________ + [ 3075] By: gsar on 1999/03/04 07:36:53 + Log: integrate changes#3037,3041 from mainline + + fix longstanding bug: searches for lexicals originating within eval'' + weren't stopping at the subroutine boundary correctly + -- + fix subtle bug in eval'' testsuite + Branch: maint-5.005/perl + !> op.c proto.h t/op/eval.t + ____________________________________________________________________________ + [ 3074] By: gsar on 1999/03/04 07:32:15 + Log: integrate change#3048 from mainline + + updated HP-UX notes from Jeff Okamoto + Branch: maint-5.005/perl + !> MANIFEST README.hpux + ____________________________________________________________________________ + [ 3073] By: gsar on 1999/03/04 07:29:43 + Log: integrate changes#3014,3015,3021,3032,3034,3045 from mainline + + more "correct" utbuf for utime() + -- + avoid modifying readonly values from qw() + -- + ansify perlio.c, fix PerlIO-ish typos + -- + add README.hpux + -- + s/print STDERR/warn/ suggested by abigail@fnx.com; add $VERSION + -- + destroy PL_svref_mutex in perl_destruct() + Branch: maint-5.005/perl + +> README.hpux + !> MANIFEST doio.c ext/DynaLoader/dl_beos.xs + !> ext/DynaLoader/dl_cygwin32.xs iperlsys.h + !> lib/ExtUtils/MM_Unix.pm lib/Getopt/Std.pm perl.c perlio.c + ____________________________________________________________________________ + [ 3072] By: gsar on 1999/03/04 07:12:15 + Log: integrate changes#2978,2979 from mainline + + bring '*' prototype closer to how it behaves internally + -- + doc for change#2978 + Branch: maint-5.005/perl + +> t/lib/fatal.t + !> MANIFEST lib/Fatal.pm op.c pod/perlsub.pod t/comp/proto.t + ____________________________________________________________________________ + [ 3071] By: gsar on 1999/03/04 07:05:50 + Log: integrate changes#2919,2920,2921,2928,2932,2933 from mainline + + applied suggested patch, with several language/readability tweaks + From: Ilya Zakharevich + Date: Fri, 29 Jan 1999 00:25:02 -0500 + Message-ID: <19990129002502.C2898@monk.mps.ohio-state.edu> + Subject: Re: [PATCH 5.005_*] Better parsing docs + -- + tweak READ() docs to mention $buffer must be altered by reference + -- + use New() et al., rather than safemalloc() et al. + From: jan.dubois@ibm.net (Jan Dubois) + Date: Fri, 29 Jan 1999 23:27:22 +0100 + Message-ID: <36bd33f2.51029616@smtp1.ibm.net> + Subject: [PATCH _03-MT5] POSIX.xs memory API + -- + allow the Carp routines to pass through exception objects + -- + clarify what a "line" is + -- + From: "J. van Krieken" + Date: Thu, 4 Feb 1999 17:25:25 +0100 (MET) + Message-Id: <199902041625.RAA14489@atcmpg.ATComputing.nl> + Subject: s2p incorrectly handles hold space commands + Branch: maint-5.005/perl + !> ext/POSIX/POSIX.xs lib/Carp.pm pod/perlfunc.pod pod/perlop.pod + !> pod/perltie.pod pod/perlvar.pod x2p/s2p.PL + ____________________________________________________________________________ + [ 3070] By: gsar on 1999/03/04 06:43:57 + Log: integrate changes#2748,2753,2754,2819,2824,2855,2866,2867,2869,2885,2888,2889 + from mainline + + From: "Jonathan I. Kamens" + Date: Thu, 3 Dec 1998 15:10:17 -0500 + Message-Id: <199812032010.PAA09692@jik.shore.net> + Subject: sample checksum code in "perlfunc" man page is wrong + -- + Todo tweaks + -- + Todo updates from Andy Dougherty + -- + avoid garbage in db->dirbuf + From: Masahiro KAJIURA + Date: Sat, 05 Dec 1998 14:14:54 +0900 + Message-Id: <199812050514.OAA23268@toshiba.co.jp> + Subject: SDBM bug + -- + tweak doc on bitwise ops + -- + applied suggested patch; added tests + From: Adam Krolnik + Date: Sat, 12 Dec 98 15:30:18 -0600 + Message-Id: <9812122130.AA03717@gypsy.eng.cyrix.com> + Subject: Range operation doesn't handle IV_MAX + -- + display full pathname of unreadable files + -- + av_extend() doc tweak from Jan Dubois + -- + update win32/pod.mak + -- + note how to find REG_INFTY limit + -- + add note about test-notty target + -- + tweak PERL_STRICT_CR notes + Branch: maint-5.005/perl + !> Porting/pumpkin.pod README.win32 Todo Todo-5.005 + !> ext/SDBM_File/sdbm/sdbm.c pod/perldelta.pod pod/perlfunc.pod + !> pod/perlguts.pod pod/perlop.pod pod/perlre.pod pp_ctl.c + !> t/op/range.t utils/perldoc.PL win32/pod.mak + ____________________________________________________________________________ + [ 3069] By: gsar on 1999/03/04 06:02:29 + Log: integrate change#2747 from mainline + + typos in Pod/Text.pm + Branch: maint-5.005/perl + !> lib/Pod/Text.pm + ____________________________________________________________________________ + [ 3059] By: jhi on 1999/03/03 22:46:43 + Log: Document HP-UX 11 Y2K patch effect, based on + + From: "Richard L. England" + To: perlbug@perl.com + CC: "England, Richard" + Subject: test io/fs.t number 18 fails on HPUX 11.0 when Y2K patch installed. + Date: Fri, 26 Feb 1999 15:35:49 -0800 + Message-ID: <36D72FD4.4136C84F@mentorg.com> + Branch: maint-5.005/perl + ! INSTALL + ____________________________________________________________________________ + [ 3057] By: jhi on 1999/03/03 21:42:22 + Log: The *symbols patch (for Kurt's h2ph fixes) haunted us in AIX. + Branch: maint-5.005/perl + ! Configure + ____________________________________________________________________________ + [ 3056] By: jhi on 1999/03/03 21:21:46 + Log: Fixed the pthreads_created_joinable test messed up + by the Mach cthreads change. + Branch: maint-5.005/perl + ! Configure + ____________________________________________________________________________ + [ 3055] By: jhi on 1999/03/03 18:17:55 + Log: Configure and make gotchas. + Branch: maint-5.005/perl + ! INSTALL + ____________________________________________________________________________ + [ 3051] By: jhi on 1999/03/02 08:24:52 + Log: From: Dan Sugalski + To: perl5-porters@perl.org, vmsperl@perl.org + Subject: [PATCH 5.005_0x and 5.005_5x]Minor update to README.VMS + Date: Mon, 01 Mar 1999 16:10:57 -0800 + Message-Id: <3.0.6.32.19990301161057.03b1fc00@ous.edu> + Branch: cfgperl + ! README.vms + Branch: maint-5.005/perl + ! README.vms + ____________________________________________________________________________ + [ 3049] By: jhi on 1999/03/02 07:34:21 + Log: From: Spider Boardman + To: perl5-porters@perl.org + Subject: [PATCH] Eliminate (valid) warning in byterun.c + Date: Mon, 01 Mar 1999 17:27:59 -0500 + Message-Id: <199903012227.RAA00181@leggy.zk3.dec.com> + Branch: cfgperl + ! bytecode.h + Branch: maint-5.005/perl + ! bytecode.h + ____________________________________________________________________________ + [ 3028] By: jhi on 1999/02/26 14:40:00 + Log: HP-UX 11 threads. + + From: Jeff Okamoto + To: perl5-porters@perl.org + Cc: jhi@cc.hut.fi + Subject: Maint 5 and _54 with threading on HP-UX 11.00 + Date: Wed, 3 Feb 1999 12:57:18 -0800 (PST) + Message-Id: <199902032057.MAA10218@xfiles.intercon.hp.com> + + NOTE from jhi: the hpux hints could still be more robust by + disabling gdbm when necessary. + + Currently if there's a libgdbm.sl (gdbm 1.7.3) which is pre-11, + linking -lgdbm -lpthread creates an executable that instantly + core dumps on a pthreads internal panic: + + ./gdpt + + Pthread internal error: message: __libc_reinit() failed, file: ../pthreads/pthread.c, line: 1096 + Return Pointer is 0xc082bf33 + 17639 quit (core dumped) ./gdpt + + You don't have to *use* either gdbm or pthreads in the executable, + just linking them together is enough. Workaround is to recompile + the GDBM under HP-UX 11, that makes the problem to go away. + Branch: maint-5.005/perl + ! hints/hpux.sh thread.h + ____________________________________________________________________________ + [ 3027] By: jhi on 1999/02/26 09:04:29 + Log: From: abigail@fnx.com + To: perl5-porters@perl.org (Perl Porters) + Subject: [PATCH 5.005_02 Getopt::Std] warn() instead of print STDERR. + Date: Thu, 25 Feb 1999 22:08:41 -0500 (EST) + Message-ID: <19990226030841.5985.qmail@alexandra.wayne.fnx.com> + Branch: maint-5.005/perl + ! lib/Getopt/Std.pm + ____________________________________________________________________________ + [ 3026] By: jhi on 1999/02/26 08:18:26 + Log: full_ar wasn't propagated. + Branch: maint-5.005/perl + ! Configure + ____________________________________________________________________________ + [ 3013] By: jhi on 1999/02/22 19:27:44 + Log: Fix MacPerl version, change PowerUX to PowerMAX. + + From: Chris Nandor + To: jhi@iki.fi + Cc: perl5-porters@perl.org + Subject: Re: perl current availability as documented by perl.pod + Date: Sun, 21 Feb 1999 11:06:03 -0500 + Message-Id: + + From: Tom Horsley + To: jhi@iki.fi + Cc: perl5-porters@perl.org + Subject: Re: perl current availability as documented by perl.pod + Date: Mon, 22 Feb 1999 13:08:30 GMT + Message-Id: <199902221308.NAA19971@cleo.ccur.com> + Branch: cfgperl + ! pod/perl.pod + Branch: maint-5.005/perl + ! pod/perl.pod + ____________________________________________________________________________ + [ 3010] By: jhi on 1999/02/22 10:21:55 + Log: From: pmarquess@bfsec.bt.co.uk (Paul Marquess) + To: gbarr@pobox.com (Graham Barr) + Cc: perl5-porters@perl.org + Subject: [PATCH 5.005_03-MT5] DB_File 1.64 patch + Date: Mon, 22 Feb 1999 10:12:34 +0000 (GMT) + Message-Id: <9902221012.AA17784@claudius.bfsec.bt.co.uk> + Branch: maint-5.005/perl + ! ext/DB_File/Changes ext/DB_File/DB_File.pm + ! ext/DB_File/DB_File.xs ext/DB_File/typemap t/lib/db-recno.t + ____________________________________________________________________________ + [ 3005] By: jhi on 1999/02/22 08:35:30 + Log: Configure/Perl knew how to look for use Mach cthreads + but Configure didn't let them to be used ($osname 'next'). + Branch: cfgperl + ! Configure config_h.SH + Branch: maint-5.005/perl + ! Configure + ____________________________________________________________________________ + [ 3004] By: jhi on 1999/02/21 15:46:02 + Log: Update Acorn AVAILABILITY. + Branch: cfgperl + ! pod/perl.pod + Branch: maint-5.005/perl + ! pod/perl.pod + ____________________________________________________________________________ + [ 3003] By: jhi on 1999/02/21 14:50:42 + Log: From: rjk@linguist.dartmouth.edu (Ronald J. Kimball) + To: perl5-porters@perl.org (Perl 5 Porters) + Subject: PATCH: perlref.pod - symbolic ref example + Date: Sat, 20 Feb 1999 17:32:11 -0500 (EST) + Message-Id: <199902202232.RAA62306@linguist.dartmouth.edu> + Branch: cfgperl + ! pod/perlref.pod + Branch: maint-5.005/perl + ! pod/perlref.pod + ____________________________________________________________________________ + [ 3000] By: jhi on 1999/02/21 14:15:31 + Log: pack s/l for negative numbers was broken on platforms + where sizeof(short) != 2 or sizeof(long) != 4 (Alpha, Cray). + pack v was broken for sizeof(short) == 8 big-endian platforms + (Cray), only zeros were produced. + Branch: maint-5.005/perl + ! perl.h pod/perlfunc.pod pp.c t/op/pack.t + ____________________________________________________________________________ + [ 2997] By: jhi on 1999/02/20 14:00:26 + Log: Glossary update. + Branch: maint-5.005/perl + ! Porting/Glossary + ____________________________________________________________________________ + [ 2995] By: jhi on 1999/02/20 12:25:10 + Log: Document #2893, Mach cthreads support. + Branch: maint-5.005/perl + ! pod/perldelta.pod + ____________________________________________________________________________ + [ 2986] By: jhi on 1999/02/19 23:26:34 + Log: Remove the unnecessary osf1 -D__LANGUAGE_C__. + Branch: maint-5.005/perl + ! Configure + ____________________________________________________________________________ + [ 2983] By: jhi on 1999/02/19 20:35:51 + Log: Mach cthreads: + From: brie@corp.home.net (Brian Harrison) + Subject: perl5.005_02 patch for mthreads + To: perl5-porters@perl.org + Date: Fri, 23 Oct 1998 14:20:57 -0700 (PDT) + Message-ID: + Branch: maint-5.005/perl + ! Configure Porting/Glossary config_h.SH malloc.c perl.h + ! thread.h + ____________________________________________________________________________ + [ 2981] By: jhi on 1999/02/19 19:49:03 + Log: From: "Kurt D. Starsinic" + To: Chaim Frenkel , + Russ Allbery , + Jarkko Hietaniemi , + Gurusamy Sarathy , + Graham Barr + Cc: bdensch@ameritech.net, perlbug@perl.com + Subject: [PATCH] Re: Solaris 7 for Intel + Message-ID: <19990219124404.A30182@O2.chapin.edu> + + and Glossary update. + Branch: maint-5.005/perl + ! Configure Makefile.SH Porting/Glossary + ____________________________________________________________________________ + [ 2980] By: gbarr on 1999/02/19 16:06:53 + Log: Make result of h2xs work when user adds C + Branch: maint-5.005/perl + ! utils/h2xs.PL + ____________________________________________________________________________ + [ 2976] By: gsar on 1999/02/18 21:54:09 + Log: integrate change#2975 from mainline + + distinguish eval'' from BEGIN|INIT|END CVs (fixes buggy propagation + of lexical searches in BEGIN|INIT|END) + Branch: maint-5.005/perl + !> cop.h cv.h op.c perly.c perly.y pp_ctl.c t/op/misc.t + !> vms/perly_c.vms + ____________________________________________________________________________ + [ 2971] By: jhi on 1999/02/18 11:14:24 + Log: AIX syscalls.exp scan missed explicitly 32/64-bit syscalls. + + From: Joe Buehler + To: perl5-porters@perl.org + Subject: setsid not detected by perl 5.005_02 configure under AIX 4.3 + Date: 12 Feb 1999 11:25:21 -0500 + Message-ID: + Branch: maint-5.005/perl + ! Configure + ____________________________________________________________________________ + [ 2967] By: jhi on 1999/02/17 23:12:59 + Log: Make SCO/Unixware scan to work in Unixware, too. + + From: Tom Hughes + To: perlbug@perl.com + Subject: Not OK: perl 5.00555 on i386-svr4 [actually Unixware 2.1] (UNINSTALLED) + Date: 17 Feb 1999 15:34:15 +0000 + Message-ID: + Branch: maint-5.005/perl + ! Configure + ____________________________________________________________________________ + [ 2956] By: jhi on 1999/02/15 21:03:28 + Log: OpenBSD sparc SHMLBA (like change #2945). + Branch: maint-5.005/perl + ! ext/IPC/SysV/SysV.xs + ____________________________________________________________________________ + [ 2950] By: jhi on 1999/02/15 13:37:28 + Log: AVAILABILITY sync. + Branch: maint-5.005/perl + ! pod/perl.pod + ____________________________________________________________________________ + [ 2906] By: jhi on 1999/02/13 14:55:47 + Log: AVAILABILITY sync. + Branch: maint-5.005/perl + ! pod/perl.pod + ____________________________________________________________________________ + [ 2905] By: gsar on 1999/02/13 00:12:53 + Log: integrate change#2898 from mainline + + support win32_putenv() + Branch: maint-5.005/perl + !> mg.c util.c win32/GenCAPI.pl win32/makedef.pl win32/perlhost.h + !> win32/win32.c win32/win32iop.h + ____________________________________________________________________________ + [ 2904] By: jhi on 1999/02/12 21:23:30 + Log: Add README.hurd, from Mark Kettenis . + Branch: maint-5.005/perl + + README.hurd + ! MANIFEST + ____________________________________________________________________________ + [ 2900] By: jhi on 1999/02/12 12:07:28 + Log: SCO ODT/OSR release scanning. + Branch: maint-5.005/perl + ! Configure + ____________________________________________________________________________ + [ 2897] By: jhi on 1999/02/12 11:24:25 + Log: Undo a big bad paste from change #2884. + Branch: maint-5.005/perl + ! hints/openbsd.sh + ____________________________________________________________________________ + [ 2896] By: jhi on 1999/02/12 11:19:52 + Log: Update the error message of db-recno.t to DB version 1.86 + and the URL to www.sleepycat.com instead of www.bostic.com. + Branch: maint-5.005/perl + ! t/lib/db-recno.t + ____________________________________________________________________________ + [ 2895] By: gsar on 1999/02/12 11:18:59 + Log: integrate change#2854 from mainline + + compatibility fix: magic non-propagation in foreach implicit localization + Branch: maint-5.005/perl + !> pp_ctl.c t/op/local.t + ____________________________________________________________________________ + [ 2884] By: jhi on 1999/02/12 08:36:14 + Log: OpenBSD pthreads awareness, thanks to + David Leonard + Branch: maint-5.005/perl + ! Configure hints/openbsd.sh + ____________________________________________________________________________ + [ 2883] By: jhi on 1999/02/12 08:29:51 + Log: AVAILABILITY sync. + Branch: maint-5.005/perl + ! pod/perl.pod + ____________________________________________________________________________ + [ 2878] By: jhi on 1999/02/11 22:00:50 + Log: Replace changes #2783, #2784, #2785, with a single tested + patch from Francois Desarmenien . + Branch: maint-5.005/perl + ! MANIFEST ext/GDBM_File/hints/sco.pl ext/IPC/SysV/SysV.xs + ! hints/sco.sh + ____________________________________________________________________________ + [ 2876] By: jhi on 1999/02/11 20:43:17 + Log: From: Chris Nandor + To: perl5-porters@perl.org + Subject: [PATCH] perlport.pod 1.39 + Date: Thu, 11 Feb 1999 12:28:35 -0500 + Message-Id: + Branch: maint-5.005/perl + ! pod/perlport.pod + ____________________________________________________________________________ + [ 2875] By: jhi on 1999/02/11 20:35:08 + Log: The fpsetmask() really is SCO5 only. + Branch: maint-5.005/perl + ! unixish.h + ____________________________________________________________________________ + [ 2874] By: jhi on 1999/02/11 20:32:06 + Log: Change #2783 missed these. + Branch: maint-5.005/perl + ! ext/IPC/SysV/SysV.xs unixish.h + ____________________________________________________________________________ + [ 2873] By: jhi on 1999/02/11 20:27:45 + Log: Import the change #2810 from cfgperl. + Branch: maint-5.005/perl + + ext/GDBM_File/hints/sco.pl + ! MANIFEST hints/sco.sh unixish.h + ____________________________________________________________________________ + [ 2872] By: jhi on 1999/02/11 19:57:37 + Log: Sync the current AVAILABILITY. + Branch: maint-5.005/perl + ! pod/perl.pod pod/perldelta.pod + ____________________________________________________________________________ + [ 2871] By: jhi on 1999/02/11 19:42:54 + Log: Copied the GNU/Hurd hints file over from cfgperl + because it works well enough (there are still some + rough edges in Hurd), verified via private + email from Mark Kettenis + Branch: maint-5.005/perl + + hints/gnu.sh + ____________________________________________________________________________ + [ 2864] By: jhi on 1999/02/11 08:45:00 + Log: From: Spider Boardman + To: perlbug@perl.com + Subject: Not OK: perl 5.00503 +MAINT_TRIAL_5 on RISC-ultrix 4.4 (UNINSTALLED) + Date: Wed, 10 Feb 1999 23:33:31 -0500 + Message-Id: <9902110433.AA12816@abyss.zk3.dec.com> + Branch: maint-5.005/perl + ! doio.c ext/IPC/SysV/SysV.xs hints/ultrix_4.sh + ____________________________________________________________________________ + [ 2863] By: jhi on 1999/02/11 08:35:35 + Log: AVAILABILITY. + Branch: maint-5.005/perl + ! pod/perl.pod + ____________________________________________________________________________ + [ 2858] By: gsar on 1999/02/11 07:10:59 + Log: remove dup hunk + Branch: maint-5.005/perl + ! pod/perldelta.pod + ____________________________________________________________________________ + [ 2857] By: gsar on 1999/02/11 07:09:20 + Log: sync with parent version of perldelta.pod + Branch: maint-5.005/perl + !> pod/perldelta.pod + ____________________________________________________________________________ + [ 2853] By: gsar on 1999/02/11 00:33:06 + Log: integrate change#2816 from mainline + + minor bug in dumping blessed subrefs + Branch: maint-5.005/perl + !> ext/Data/Dumper/Dumper.pm + ____________________________________________________________________________ + [ 2852] By: gsar on 1999/02/10 23:17:49 + Log: fair warning about -Dusethreads + Branch: maint-5.005/perl + ! Configure INSTALL README.threads + ____________________________________________________________________________ + [ 2851] By: jhi on 1999/02/10 23:00:39 + Log: Snapshot of the ongoing AVAILABILITY discussion. + Branch: maint-5.005/perl + ! pod/perl.pod + ____________________________________________________________________________ + [ 2850] By: jhi on 1999/02/10 16:07:32 + Log: OS390 and Windows AVAILABILITY entries enhanced. + Branch: maint-5.005/perl + ! pod/perl.pod + ____________________________________________________________________________ + [ 2849] By: jhi on 1999/02/10 12:39:46 + Log: AS/400 and Mac were not described right. + Branch: maint-5.005/perl + ! pod/perl.pod + ____________________________________________________________________________ + [ 2848] By: jhi on 1999/02/10 09:13:49 + Log: Added AVAILABILITY section. + Branch: maint-5.005/perl + ! pod/perl.pod + ____________________________________________________________________________ + [ 2837] By: jhi on 1999/02/08 14:51:39 + Log: Fix typo introduced in change #2836. + Branch: maint-5.005/perl + ! Configure + ____________________________________________________________________________ + [ 2836] By: jhi on 1999/02/08 14:44:31 + Log: Augment change #2809, the h2ph-*symbols patch. + Branch: maint-5.005/perl + ! Configure t/lib/h2ph.pht + ____________________________________________________________________________ + [ 2815] By: gsar on 1999/02/05 03:44:50 + Log: integrate change#2242 from mainline + + fix skipspace() to properly account for newlines in eval''-ed + strings (caused bogus line numbers in diagnostics and debugger) + Branch: maint-5.005/perl + !> toke.c + ____________________________________________________________________________ + [ 2814] By: jhi on 1999/02/04 21:21:39 + Log: Stratus perlport update. + Branch: maint-5.005/perl + ! pod/perlport.pod + ____________________________________________________________________________ + [ 2813] By: jhi on 1999/02/04 21:16:54 + Log: Stratus VOS update. + + From: Paul_Green@stratus.com + To: jhi@iki.fi + Subject: RE: VOS changes for Perl5.005_03 are ready! + Date: Thu, 4 Feb 1999 14:51:07 -0500 + Message-ID: <1D1A4EF7AD4DD211A80D00A0C9D7DB665A0168@exna1.stratus.com> + Branch: maint-5.005/perl + + vos/vos_accept.c + ! MANIFEST README.vos perl.c pod/perlport.pod vos/Changes + ! vos/build.cm vos/compile_perl.cm vos/config.h + ! vos/config_h.SH_orig vos/perl.bind vos/test_vos_dummies.c + ! vos/vos_dummies.c vos/vosish.h + ____________________________________________________________________________ + [ 2809] By: jhi on 1999/02/03 19:54:16 + Log: h2ph fixes + Configure patch to support them. + + From: "Kurt D. Starsinic" + To: Graham Barr , Jarkko Hietaniemi , + Gurusamy Sarathy + Cc: perl5-porters@perl.org + Subject: [PATCH 5.00503_MT5] h2ph.PL + Date: Tue, 2 Feb 1999 19:48:06 -0500 + Message-ID: <19990202194806.E10647@O2.chapin.edu> + Branch: maint-5.005/perl + ! Configure utils/h2ph.PL + ____________________________________________________________________________ + [ 2802] By: jhi on 1999/02/02 17:41:23 + Log: From: John Bley + To: perlbug@perl.org + Subject: [PATCH]5.005_54 (DOC) fix minor typos + Date: Tue, 2 Feb 1999 07:52:52 -0500 (EST) + Message-ID: + Branch: maint-5.005/perl + ! pod/perlre.pod + ____________________________________________________________________________ + [ 2790] By: jhi on 1999/02/02 16:51:45 + Log: Re-introduce the typo corrections (update to CGI 2.46 + overran them). + Branch: maint-5.005/perl + ! lib/CGI.pm + ____________________________________________________________________________ + [ 2781] By: jhi on 1999/02/02 14:27:01 + Log: Update the MkLinux note. + Branch: maint-5.005/perl + ! hints/linux.sh + ____________________________________________________________________________ + [ 2775] By: jhi on 1999/02/02 13:13:24 + Log: Mention lib/Dumpvalue.pm. + Branch: maint-5.005/perl + ! pod/roffitall + ____________________________________________________________________________ + [ 2767] By: jhi on 1999/02/02 12:29:57 + Log: Demangle spaces to tab+space. + Branch: maint-5.005/perl + ! hints/freebsd.sh + ____________________________________________________________________________ + [ 2758] By: jhi on 1999/02/02 10:51:26 + Log: Detypo. + Branch: maint-5.005/perl + ! lib/Math/Trig.pm + ____________________________________________________________________________ + [ 2755] By: jhi on 1999/02/02 09:07:51 + Log: Make FreeBSD 2.2.7 work with -Duseshrplib -ders. + Branch: maint-5.005/perl + ! hints/freebsd.sh + ____________________________________________________________________________ + [ 2752] By: jhi on 1999/02/01 22:15:12 + Log: Add perlthrtut.pod. + + From: Dan Sugalski + To: perl5-porters@perl.org + Subject: perlthrtut.pod + Date: Mon, 01 Feb 1999 10:57:11 -0800 + Message-Id: <3.0.6.32.19990201105711.02e62540@ous.edu> + Branch: maint-5.005/perl + + pod/perlthrtut.pod + ! MANIFEST pod/Makefile pod/buildtoc pod/perldelta.pod + ! pod/roffitall + ____________________________________________________________________________ + [ 2741] By: gbarr on 1999/02/01 03:00:42 + Log: Fix typecasts in #2728 + + From: "G. Del Merritt" + Date: Fri, 29 Jan 1999 11:47:25 -0700 + Message-Id: <199901291847.LAA04828@jhereg.perl.com> + Subject: Not OK: perl 5.00503 +MAINT_TRIAL_5 on MSWin32-x86-object 4.0 (PATCH included) + Branch: maint-5.005/perl + ! ext/POSIX/POSIX.xs + ____________________________________________________________________________ + [ 2740] By: gsar on 1999/02/01 02:43:07 + Log: CAPI inheritance tweak and doc + Branch: maint-5.005/perl + ! lib/ExtUtils/MakeMaker.pm + ____________________________________________________________________________ + [ 2739] By: jhi on 1999/01/31 18:31:54 + Log: Undo changes #2730 and #2731 and replace them + with an extensively tested patch from + Anton Berezin (via private email). + Branch: maint-5.005/perl + ! Makefile.SH hints/freebsd.sh + ____________________________________________________________________________ + [ 2738] By: gsar on 1999/01/31 05:04:32 + Log: fix bogus CAPI inheritance from change#2541 + Branch: maint-5.005/perl + ! lib/ExtUtils/MakeMaker.pm + ____________________________________________________________________________ + [ 2737] By: gsar on 1999/01/31 04:55:06 + Log: remove the big ugly thing jhi sneezed into INSTALL :-) + Branch: maint-5.005/perl + ! INSTALL + ____________________________________________________________________________ + [ 2736] By: jhi on 1999/01/30 12:57:06 + Log: From: pvhp@forte.com (Peter Prymmer) + To: perl-mvs@perl.org, perlbug@perl.com + Subject: Not OK: perl 5.00503 +MAINT_TRIAL_5 on os390 05.00 (UNINSTALLED) + Date: Fri, 29 Jan 99 19:22:31 PST + Message-Id: <9901300322.AA19136@forte.com> + + (slighty edited at the end) + Branch: maint-5.005/perl + ! README.os390 + ____________________________________________________________________________ + [ 2735] By: jhi on 1999/01/30 11:49:54 + Log: Undo 5.005-devel random, srandom mention. + Branch: maint-5.005/perl + ! INSTALL + ____________________________________________________________________________ + [ 2734] By: jhi on 1999/01/29 22:22:00 + Log: Add perlreftut. + Branch: maint-5.005/perl + + pod/perlreftut.pod + ! MANIFEST pod/perl.pod pod/perldelta.pod pod/roffitall + ____________________________________________________________________________ + [ 2732] By: gsar on 1999/01/29 20:09:44 + Log: integrate change#2720 from mainline + + missing space while munging CCFLAGS for PERL_CAPI + Branch: maint-5.005/perl + !> lib/ExtUtils/MM_Unix.pm + ____________________________________________________________________________ + [ 2731] By: jhi on 1999/01/29 14:33:12 + Log: FreeBSD version numbers can be like "2.2.8-release". + Branch: maint-5.005/perl + ! hints/freebsd.sh + ____________________________________________________________________________ + [ 2730] By: jhi on 1999/01/29 12:40:38 + Log: FreeBSD hints iteration (hopefully convergent). + usethreads: require at least FreeBSD 2.2.8. + signal type: mirror change #2429 in cfgperl. + Branch: maint-5.005/perl + ! hints/freebsd.sh + ____________________________________________________________________________ + [ 2729] By: gbarr on 1999/01/29 05:06:32 + Log: Trial release 5 + Branch: maint-5.005/perl + ! Changes patchlevel.h pod/perlhist.pod + ____________________________________________________________________________ + [ 2728] By: gbarr on 1999/01/29 04:10:37 + Log: From: Ted Law + Date: Wed, 27 Jan 1999 14:54:03 -0500 (EST) + Message-Id: <199901271954.OAA07391@dcm2.cibcwg.com> + Subject: POSIX::strftime buffer overflow problem + Branch: maint-5.005/perl + ! ext/POSIX/POSIX.xs + ____________________________________________________________________________ + [ 2728] By: gbarr on 1999/01/29 04:10:37 + Log: From: Ted Law + Date: Wed, 27 Jan 1999 14:54:03 -0500 (EST) + Message-Id: <199901271954.OAA07391@dcm2.cibcwg.com> + Subject: POSIX::strftime buffer overflow problem + Branch: maint-5.005/perl + ! ext/POSIX/POSIX.xs + ____________________________________________________________________________ + [ 2727] By: gbarr on 1999/01/29 04:09:57 + Log: From: Tom Spindler + Date: Thu, 28 Jan 1999 17:15:11 -0800 + Message-ID: <19990128171510.A11778@isi.net> + Subject: [PATCH] BeOS dynamic loading support for perl5.005_03_MT4 + Branch: maint-5.005/perl + + ext/DynaLoader/dl_beos.xs + ! Configure MANIFEST Makefile.SH README.beos hints/beos.sh + ! lib/ExtUtils/MM_Unix.pm + ____________________________________________________________________________ + [ 2726] By: gbarr on 1999/01/29 03:30:51 + Log: Remove use of File::Slurp in t/lib/textfill.t + Branch: maint-5.005/perl + ! t/lib/textfill.t + ____________________________________________________________________________ + [ 2725] By: gbarr on 1999/01/29 03:11:41 + Log: From: Gurusamy Sarathy + Date: Wed, 27 Jan 1999 23:14:33 -0800 + Message-Id: <199901280714.XAA10176@activestate.com> + Subject: Re: NOT OK: "@INC contains: ." after make install - MAINT_TRIAL_4 - 5.005_03 maintenance trial 4 MSWin32-x86-object + Branch: maint-5.005/perl + ! win32/Makefile win32/makefile.mk + ____________________________________________________________________________ + [ 2724] By: jhi on 1999/01/28 19:27:15 + Log: Change jhi@iki.fi to perlbug@perl.com. + Cosmetic change in semctl probing messages. + Branch: maint-5.005/perl + ! Configure hints/freebsd.sh + ____________________________________________________________________________ + [ 2723] By: jhi on 1999/01/28 17:27:49 + Log: Yet another typo in a test program. + Branch: maint-5.005/perl + ! Configure + ____________________________________________________________________________ + [ 2722] By: jhi on 1999/01/28 17:13:52 + Log: The pthreads_created_joinable test had a typo, + by blind luck the default value works almost anywhere. + Branch: maint-5.005/perl + ! Configure + ____________________________________________________________________________ + [ 2721] By: jhi on 1999/01/28 13:04:23 + Log: MinT support, adapted from change #2594. + Branch: maint-5.005/perl + + README.mint ext/POSIX/hints/mint.pl hints/mint.sh + + mint/Makefile mint/README mint/errno.h mint/pwd.c mint/stdio.h + + mint/sys/time.h mint/time.h + ! MANIFEST doio.c malloc.c miniperlmain.c perl.c + ! pod/perldelta.pod t/io/fs.t t/lib/safe2.t t/op/groups.t + ! t/op/mkdir.t t/op/taint.t + ____________________________________________________________________________ + [ 2719] By: jhi on 1999/01/27 19:49:49 + Log: From: "M.J.T. Guy" + To: perl5-porters@perl.org + Subject: Re: [PATCH] perl5.005_03-MAINT_TRIAL_3: clarify Sv[INU]V versus Sv[INU]VX in perlguts + Date: Tue, 26 Jan 1999 22:25:07 +0000 + Message-Id: + Branch: maint-5.005/perl + ! pod/perlguts.pod + ____________________________________________________________________________ + [ 2718] By: jhi on 1999/01/27 19:46:04 + Log: io/fs.t fails test #18 (sense of tests appears to have been + changed incompletely; this patch just skips the test attached, + a la test #17 preceding it). + + From: "G. Del Merritt" + To: perlbug@perl.com + Subject: NOT OK: perl 5.00503 +MAINT_TRIAL_4 on MSWin32-x86-object (PATCHES included) + Date: Tue, 26 Jan 1999 12:09:09 -0700 + Message-Id: <199901261909.MAA25525@jhereg.perl.com> + Branch: maint-5.005/perl + ! t/io/fs.t + ____________________________________________________________________________ + [ 2717] By: jhi on 1999/01/27 19:44:46 + Log: Miniperl fails to build (pp_sys.c was changed and iperlsys.h wasn't) + + From: "G. Del Merritt" + To: perlbug@perl.com + Subject: NOT OK: perl 5.00503 +MAINT_TRIAL_4 on MSWin32-x86-object (PATCHES included) + Date: Tue, 26 Jan 1999 12:09:09 -0700 + Message-Id: <199901261909.MAA25525@jhereg.perl.com> + Branch: maint-5.005/perl + ! iperlsys.h + ____________________________________________________________________________ + [ 2716] By: jhi on 1999/01/27 19:38:36 + Log: From: Dan Sugalski + To: perlbug@perl.com, vmsperl@perl.org + Subject: NOT OK: perl 5.00503 +MAINT_TRIAL_4 on VMSAXP (Patch included, of course) + Date: Tue, 26 Jan 1999 14:40:38 -0800 + Message-Id: <3.0.6.32.19990126144038.02e5d650@ous.edu> + + From: Dan Sugalski + To: perl5-porters@perl.org, vmsperl@perl.org + Subject: [PATCH 5.005_03-MAILT_TRIAL_4]VMS test patches + Date: Tue, 26 Jan 1999 14:55:29 -0800 + Message-Id: <3.0.6.32.19990126145529.02f22280@ous.edu> + Branch: maint-5.005/perl + ! t/lib/textfill.t t/lib/textwrap.t vms/ext/Stdio/test.pl + ! vms/subconfigure.com + ____________________________________________________________________________ + [ 2715] By: jhi on 1999/01/27 19:34:28 + Log: From: Mark Bixby + To: perl5-porters@perl.org + Subject: [PATCH perl5.005_03-MAINT_TRIAL_4] MPE port tweaks + Date: Tue, 26 Jan 1999 16:32:18 -0800 (PST) + Message-Id: <199901270032.QAA13395@spock.dis.cccd.edu> + Branch: maint-5.005/perl + ! hints/mpeix.sh mpeix/relink + ____________________________________________________________________________ + [ 2714] By: jhi on 1999/01/27 19:32:41 + Log: NetBSD does not do setruid, setrgid. + Branch: maint-5.005/perl + ! hints/netbsd.sh + ____________________________________________________________________________ + [ 2713] By: jhi on 1999/01/27 19:28:53 + Log: FreeBSD usethreads, based on private email with + Anton Berezin . + Branch: maint-5.005/perl + ! hints/freebsd.sh + ____________________________________________________________________________ + [ 2712] By: jhi on 1999/01/27 19:26:17 + Log: From: Ilya Zakharevich + To: Mailing list Perl5 + Subject: [PATCH 5.005_*] OS/2 threads + Date: Tue, 26 Jan 1999 13:39:46 -0500 + Message-ID: <19990126133946.A11594@monk.mps.ohio-state.edu> + Branch: maint-5.005/perl + ! os2/os2ish.h + ____________________________________________________________________________ + [ 2711] By: jhi on 1999/01/27 19:24:28 + Log: "make ok", "make okfile", and "make nok" were broken + with -Duseshrplib, because of a shared typo. + + From: Spider Boardman + To: perlbug@perl.com + Subject: Not OK: perl 5.00503 +MAINT_TRIAL_4 on alpha-dec_osf-thread 5.0 (UNINSTALLED) + Date: Wed, 27 Jan 1999 12:27:15 -0500 + Message-Id: <199901271727.MAA233455@web.zk3.dec.com> + Branch: maint-5.005/perl + ! Makefile.SH + ____________________________________________________________________________ + [ 2710] By: jhi on 1999/01/27 19:22:23 + Log: Errno fixes: + + From: Spider Boardman + To: perlbug@perl.com + Subject: Not OK: perl 5.00503 +MAINT_TRIAL_4 on alpha-dec_osf-thread 5.0 (UNINSTALLED) + Date: Wed, 27 Jan 1999 12:27:15 -0500 + Message-Id: <199901271727.MAA233455@web.zk3.dec.com> + + From: Spider Boardman + To: perlbug@perl.com + Subject: Not OK: perl 5.00503 +MAINT_TRIAL_4 on alpha-dec_osf-thread 5.0 (UNINSTALLED) + Date: Wed, 27 Jan 1999 13:31:16 -0500 + Message-Id: <199901271831.NAA241001@web.zk3.dec.com> + Branch: maint-5.005/perl + ! Configure ext/Errno/Errno_pm.PL + ____________________________________________________________________________ + [ 2709] By: jhi on 1999/01/27 19:17:35 + Log: Fix Configure installusrbinperl: + + From: Spider Boardman + To: jhi@iki.fi + cc: perl5-porters@perl.org + Subject: Re: Not OK: perl 5.00503 +MAINT_TRIAL_4 on alpha-dec_osf-thread 5.0 (UNINSTALLED) + Date: Wed, 27 Jan 1999 13:03:35 -0500 + Message-Id: <199901271803.NAA238257@web.zk3.dec.com> + Branch: maint-5.005/perl + ! Configure + ____________________________________________________________________________ + [ 2708] By: gbarr on 1999/01/26 04:14:42 + Log: Trial release 4 + Branch: maint-5.005/perl + ! Changes patchlevel.h pod/perlhist.pod + ____________________________________________________________________________ + [ 2707] By: gbarr on 1999/01/26 02:06:17 + Log: Add redef IO::Handle::* for setv?buf() + Branch: maint-5.005/perl + ! ext/POSIX/POSIX.pm + ____________________________________________________________________________ + [ 2706] By: jhi on 1999/01/24 22:26:12 + Log: Better AIX libc nm scan. + Branch: maint-5.005/perl + ! Configure + ____________________________________________________________________________ + [ 2703] By: jhi on 1999/01/24 14:26:18 + Log: Minor Configure adjustments. + Branch: maint-5.005/perl + ! Configure + ____________________________________________________________________________ + [ 2702] By: jhi on 1999/01/24 13:57:33 + Log: Use usethreads.cbu consistently. + Branch: maint-5.005/perl + ! Configure hints/aix.sh hints/dec_osf.sh hints/dos_djgpp.sh + ! hints/freebsd.sh hints/hpux.sh hints/irix_4.sh hints/irix_5.sh + ! hints/irix_6.sh hints/irix_6_0.sh hints/irix_6_1.sh + ! hints/linux.sh hints/os2.sh hints/solaris_2.sh + ____________________________________________________________________________ + [ 2701] By: jhi on 1999/01/24 13:55:43 + Log: Mention year-1900 and month 0..11 also here. + Branch: maint-5.005/perl + ! lib/Time/Local.pm + ____________________________________________________________________________ + [ 2700] By: jhi on 1999/01/24 13:52:36 + Log: Document Configure -Uinstallusrbinperl. + Branch: maint-5.005/perl + ! INSTALL pod/perldelta.pod + ____________________________________________________________________________ + [ 2699] By: jhi on 1999/01/24 13:01:57 + Log: perlopentut was missing. + Branch: maint-5.005/perl + + pod/perlopentut.pod + ! MANIFEST pod/perldelta.pod + ____________________________________________________________________________ + [ 2697] By: jhi on 1999/01/24 12:31:33 + Log: Remove t/op/grent.t (t/op/pwent.t was removed by #2685). + Branch: maint-5.005/perl + - t/op/grent.t + ! MANIFEST + ____________________________________________________________________________ + [ 2696] By: gsar on 1999/01/24 11:39:39 + Log: integrate changes#2255,2694 from mainline + + another win32 portability fix: make sysread() and syswrite() + work on sockets + + better notes on 'make' on win32 + Branch: maint-5.005/perl + ! README.win32 pp_sys.c win32/win32.h + ____________________________________________________________________________ + [ 2693] By: gbarr on 1999/01/24 00:53:31 + Log: Integrate changes #2646,2647 from cfgperl + + Show LANGUAGE env var when needed. (Augment change #2645). + + SHMLBA strikes back in NetBSD/sparc. + + From: Dave Nelson + To: jhi@iki.fi + Subject: perl5.005_02 + IPC::SysV + NetBSD/Sparc + Date: Mon, 18 Jan 1999 22:07:56 -0600 + Message-Id: <199901190407.WAA02543@longhorn.bellcow.com> + Branch: maint-5.005/perl + ! util.c utils/perlbug.PL + !> ext/IPC/SysV/SysV.xs + ____________________________________________________________________________ + [ 2692] By: gbarr on 1999/01/24 00:28:52 + Log: Integrate #2630 from mainline and an errno save fix + Branch: maint-5.005/perl + !> doio.c + ____________________________________________________________________________ + [ 2691] By: gbarr on 1999/01/24 00:28:37 + Log: Update CGI modules to 2.46 and Getopt::Long to 2.19 + Branch: maint-5.005/perl + ! lib/CGI.pm lib/CGI/Carp.pm lib/CGI/Cookie.pm lib/CGI/Fast.pm + ! lib/CGI/Push.pm lib/Getopt/Long.pm t/lib/cgi-html.t + ____________________________________________________________________________ + [ 2690] By: gbarr on 1999/01/23 23:35:39 + Log: Integrate #2681 from cfgperl + + Better (I hope) LANGUAGE documentation. + Branch: maint-5.005/perl + !> pod/perllocale.pod + ____________________________________________________________________________ + [ 2689] By: gbarr on 1999/01/23 23:31:59 + Log: More nosuid patches + + From: Jarkko Hietaniemi + Date: Fri, 22 Jan 1999 12:12:45 +0200 (EET) + Message-ID: <13992.20253.269284.841300@alpha.hut.fi> + Subject: Re: [PATCH] 5.005*: the "nosuid" problem: v2 + Branch: maint-5.005/perl + ! Configure config_h.SH perl.c perl.h pod/perldelta.pod + ! pod/perldiag.pod + ____________________________________________________________________________ + [ 2688] By: gbarr on 1999/01/23 23:03:39 + Log: From: Anton Berezin + Date: 21 Jan 1999 17:07:28 +0100 + Message-ID: <86emood2yn.fsf@lion.plab.ku.dk> + Subject: [PATCH 5.005_54] hints/freebsd.sh - reflect the birth of version 4.0 + Branch: maint-5.005/perl + ! hints/freebsd.sh + ____________________________________________________________________________ + [ 2687] By: gbarr on 1999/01/23 22:52:58 + Log: overload syntax is no longer experimental + Branch: maint-5.005/perl + ! lib/overload.pm + ____________________________________________________________________________ + [ 2685] By: gbarr on 1999/01/23 22:15:46 + Log: Remove t/op/pwent.t added from cfgperl, but is not robust. + Branch: maint-5.005/perl + - t/op/pwent.t + ! MANIFEST + ____________________________________________________________________________ + [ 2684] By: gbarr on 1999/01/23 22:13:07 + Log: More doc typos from Abigail, and undo some in lib/diagnostics.pm + from change #2672 + + From: abigail@fnx.com + Date: Tue, 19 Jan 1999 19:32:42 -0500 (EST) + Message-Id: <19990120003242.19938.qmail@alexandra.wayne.fnx.com> + Subject: [PATCH 5.005_03 TRIAL3 lib/CGI.pm] Typos + + From: abigail@fnx.com + Date: Tue, 19 Jan 1999 19:40:41 -0500 (EST) + Message-Id: <19990120004041.20052.qmail@alexandra.wayne.fnx.com> + Subject: [PATCH 5.005_03 TRIAL3 lib/CPAN.pm] Typos + Branch: maint-5.005/perl + ! lib/CGI.pm lib/CPAN.pm lib/diagnostics.pm + ____________________________________________________________________________ + [ 2677] By: gbarr on 1999/01/22 03:38:07 + Log: Integrate #2645, #2648 and update patching.pod + + Document the GNU LANGUAGE env var. + + Mention /usr/share/locale. + + From: Daniel Grisinger + Date: 21 Jan 1999 00:17:35 -0700 + Message-Id: + Subject: [PATCH] patching.pod, misc fixes (was Re: Which ? What ? Why ? When ?) + Branch: maint-5.005/perl + ! Porting/patching.pod + !> pod/perllocale.pod + ____________________________________________________________________________ + [ 2676] By: gbarr on 1999/01/22 01:54:02 + Log: Fixup FindBin to use File::Spec + + Message-Id: <19990120185157.D24479@west-tip.transeda.com> + Date: Wed, 20 Jan 1999 18:51:57 +0000 + From: Paul Johnson + Subject: Re: [PATCH] 5005_54 Make FindBin work with UNC paths + Branch: maint-5.005/perl + ! lib/FindBin.pm + ____________________________________________________________________________ + [ 2675] By: gbarr on 1999/01/22 01:38:31 + Log: Add new config values added for nosuid fix into VMS configure + + From: Dan Sugalski + Date: Wed, 20 Jan 1999 12:05:18 -0800 + Message-Id: <3.0.6.32.19990120120518.00a98470@ous.edu> + Subject: [PATCH 5.005_03MT3]VMS configure tweak + Branch: maint-5.005/perl + ! vms/subconfigure.com + ____________________________________________________________________________ + [ 2674] By: gbarr on 1999/01/22 01:36:35 + Log: Fix for buggy compiler optimization on dec for pack("I",...) + + From: Achim Bohnet + Date: Wed, 20 Jan 1999 20:25:53 +0100 + Message-Id: <199901201925.UAA16940@o06.xray.mpe.mpg.de> + Subject: [PATCH] Not OK: perl 5.00503 +MAINT_TRIAL_3 on alpha-dec_osf 4.0 + Branch: maint-5.005/perl + ! pp.c + ____________________________________________________________________________ + [ 2673] By: gbarr on 1999/01/22 01:29:37 + Log: OS/2 patches from Ilya + + Date: Thu, 21 Jan 1999 02:08:27 -0500 + From: Ilya Zakharevich + Subject: [PATCH 5.00*] makedepend + Message-Id: <19990121020827.A25509@monk.mps.ohio-state.edu> + + Date: Thu, 21 Jan 1999 02:46:34 -0500 + From: Ilya Zakharevich + Subject: [PATCH 5.005_*] Errno.pm suffers from \\ too + Message-Id: <19990121024634.A25600@monk.mps.ohio-state.edu> + + Date: Thu, 21 Jan 1999 02:50:16 -0500 + From: Ilya Zakharevich + Subject: [PATCH 5.005_03] Resend of OS/2 patch + Message-Id: <19990121025016.A25612@monk.mps.ohio-state.edu> + + Date: Thu, 21 Jan 1999 03:58:29 -0500 + From: Ilya Zakharevich + Subject: [PATCH 5.005_*] OS2::PrfDB was exploiting a bug in U32 XSUBs + Message-Id: <19990121035829.A25822@monk.mps.ohio-state.edu> + Branch: maint-5.005/perl + ! ext/Errno/Errno_pm.PL makedepend.SH os2/Changes + ! os2/Makefile.SHs os2/OS2/PrfDB/PrfDB.xs os2/os2.c + ____________________________________________________________________________ + [ 2672] By: gbarr on 1999/01/22 01:05:45 + Log: More doc typo patches from Abigail + + From: abigail@fnx.com + Message-Id: <19990120001410.19645.qmail@alexandra.wayne.fnx.com> + Subject: [PATCH 5.005_03 TRIAL 3 lib/AutoLoader.pm] Typos + Date: Tue, 19 Jan 1999 19:14:10 -0500 (EST) + + From: abigail@fnx.com + Message-Id: <19990120004312.20152.qmail@alexandra.wayne.fnx.com> + Subject: [PATCH 5.005_03 TRIAL3 lib/Carp.pm] Typo + Date: Tue, 19 Jan 1999 19:43:12 -0500 (EST) + + From: abigail@fnx.com + Message-Id: <19990120004429.20190.qmail@alexandra.wayne.fnx.com> + Subject: [PATCH 5.005_03 TRIAL3 lib/Cwd.pm] Typo + Date: Tue, 19 Jan 1999 19:44:29 -0500 (EST) + + From: abigail@fnx.com + Message-Id: <19990120005241.20693.qmail@alexandra.wayne.fnx.com> + Subject: [PATCH 5.005_03 TRIAL3 lib/Safe.pm] Typo + Date: Tue, 19 Jan 1999 19:52:41 -0500 (EST) + + From: abigail@fnx.com + Message-Id: <19990120005525.20788.qmail@alexandra.wayne.fnx.com> + Subject: [PATCH 5.005_03 TRIAL3 lib/SelfLoader.pm] Typos + Date: Tue, 19 Jan 1999 19:55:25 -0500 (EST) + + From: abigail@fnx.com + Message-Id: <19990120005821.20926.qmail@alexandra.wayne.fnx.com> + Subject: [PATCH 5.005_03 TRIAL3 lib/Symbol.pm] Typo + Date: Tue, 19 Jan 1999 19:58:21 -0500 (EST) + + From: abigail@fnx.com + Message-Id: <19990120010002.20973.qmail@alexandra.wayne.fnx.com> + Subject: [PATCH 5.005_03 TRIAL3 lib/Test.pm] Typo + Date: Tue, 19 Jan 1999 20:00:02 -0500 (EST) + + From: abigail@fnx.com + Message-Id: <19990120013823.23015.qmail@alexandra.wayne.fnx.com> + Subject: [PATCH 5.005_03 TRIAL3 lib/diagnostics.pm] Typos (ignore + Date: Tue, 19 Jan 1999 20:38:23 -0500 (EST) + + From: abigail@fnx.com + Message-Id: <19990120013909.23085.qmail@alexandra.wayne.fnx.com> + Subject: [PATCH 5.005_03 TRIAL3 lib/ops.pm] Typo + Date: Tue, 19 Jan 1999 20:39:09 -0500 (EST) + + From: abigail@fnx.com + Message-Id: <19990120015817.24306.qmail@alexandra.wayne.fnx.com> + Subject: [PATCH 5.005_03 TRIAL3 lib/overload.pm] Typos + Date: Tue, 19 Jan 1999 20:58:16 -0500 (EST) + + From: abigail@fnx.com + Message-Id: <19990120020326.24373.qmail@alexandra.wayne.fnx.com> + Subject: [PATCH 5.005_03 TRIAL3 lib/re.pm] Typos + Date: Tue, 19 Jan 1999 21:03:26 -0500 (EST) + Branch: maint-5.005/perl + ! ext/Opcode/Safe.pm ext/Opcode/ops.pm ext/re/re.pm + ! lib/AutoLoader.pm lib/Carp.pm lib/Cwd.pm lib/SelfLoader.pm + ! lib/Symbol.pm lib/Test.pm lib/diagnostics.pm lib/overload.pm + ____________________________________________________________________________ + [ 2671] By: gbarr on 1999/01/22 00:40:13 + Log: Fix win32 for Borland compiler and spaces in paths + + From: Gurusamy Sarathy + Date: Mon, 18 Jan 1999 20:33:17 -0800 + Message-Id: <199901190433.UAA03656@activestate.com> + Subject: [PATCH] 5.005_03-trial3 win32 issues + Branch: maint-5.005/perl + ! README.win32 win32/Makefile win32/config_sh.PL + ! win32/makefile.mk win32/runperl.c + ____________________________________________________________________________ + [ 2637] By: gbarr on 1999/01/18 02:52:18 + Log: Update DB_File to 1.63 + + From: pmarquess@bfsec.bt.co.uk (Paul Marquess) + Date: Tue, 29 Dec 1998 16:23:54 +0000 (GMT) + Message-Id: <9812291623.AA20884@claudius.bfsec.bt.co.uk> + Subject: PATCH DB_File 1.63 for 5.005_54 & 5.005_03 + Branch: maint-5.005/perl + ! ext/DB_File/Changes ext/DB_File/DB_File.pm + ! ext/DB_File/DB_File.xs ext/DB_File/dbinfo ext/DB_File/typemap + ____________________________________________________________________________ + [ 2636] By: gbarr on 1999/01/17 18:03:31 + Log: Trial release 3 + Branch: maint-5.005/perl + ! Changes patchlevel.h + ____________________________________________________________________________ + [ 2635] By: gbarr on 1999/01/17 17:32:01 + Log: Update to CPAN-1.44 + + From: Mark-Jason Dominus + Date: Sat, 16 Jan 1999 17:22:06 -0500 + Message-ID: <19990116222206.3674.qmail@plover.com> + Subject: Re: DOC PATCH (5.005_54 perlsub.pod) + Branch: maint-5.005/perl + ! lib/CPAN.pm lib/CPAN/FirstTime.pm lib/CPAN/Nox.pm + ! pod/perlsub.pod + ____________________________________________________________________________ + [ 2634] By: gbarr on 1999/01/17 17:27:12 + Log: Fix for suidperl when script is on a nosuid filesystem + + From: Jarkko Hietaniemi + Date: Sun, 17 Jan 1999 16:27:06 +0200 (EET) + Message-ID: <13985.62266.324824.292401@alpha.hut.fi> + Subject: [PATCH] 5.005*: the "nosuid" problem: v2 + Branch: maint-5.005/perl + ! Configure config_h.SH perl.c perl.h pod/perldiag.pod + ____________________________________________________________________________ + [ 2618] By: gbarr on 1999/01/16 19:18:26 + Log: Added Dumpvalue.pm + + From: Ilya Zakharevich + Date: Mon, 7 Dec 1998 02:44:25 -0500 (EST) + Message-Id: <199812070744.CAA18949@monk.mps.ohio-state.edu> + Subject: [PATCH 5.005_*] Dumpvar.pm + Branch: maint-5.005/perl + + lib/Dumpvalue.pm + ! MANIFEST pod/perldelta.pod + ____________________________________________________________________________ + [ 2617] By: gbarr on 1999/01/16 19:09:36 + Log: Minor change to perlxstut and added perlopentut.pod + + From: Nathan Torkington + Date: Sat, 26 Dec 1998 14:28:21 +1300 (NZDT) + Message-ID: <13956.15285.933914.320849@localhost.frii.com> + Subject: [PATCH] perlxstut.pod fix + + From: Tom Christiansen + Date: Sat, 09 Jan 1999 08:13:18 -0700 + Message-Id: <199901091513.IAA17512@jhereg.perl.com> + Subject: perlopentut.pod + Branch: maint-5.005/perl + ! MANIFEST pod/perl.pod pod/perldelta.pod pod/perlxstut.pod + ! pod/roffitall + ____________________________________________________________________________ + [ 2616] By: gbarr on 1999/01/16 18:59:55 + Log: Win32 changes from Jan + + From: jan.dubois@ibm.net (Jan Dubois) + Date: Fri, 15 Jan 1999 23:38:35 +0100 + Message-ID: <36a7c10d.16311905@smtp1.ibm.net> + Subject: [PATCH 5.005_03m2] Win32 Makefile patches + + From: jan.dubois@ibm.net (Jan Dubois) + Date: Sat, 16 Jan 1999 13:02:45 +0100 + Message-ID: <36a07da6.10722337@smtp1.ibm.net> + Subject: [PATCH 5.005_03m2] minor tweaks to README.win32 + Branch: maint-5.005/perl + ! README.win32 win32/Makefile win32/makefile.mk + ____________________________________________________________________________ + [ 2615] By: gbarr on 1999/01/16 18:48:48 + Log: Jumbo patch from Sarathy for PERL_OBJECT & USE_THREADS + + From: Gurusamy Sarathy + Date: Thu, 07 Jan 1999 00:12:00 -0500 + Message-Id: <199901070512.AAA23568@aatma.engin.umich.edu> + Subject: Re: [PATCH 5.005_03-MAINT_TRIAL2] fixes for PERL_OBJECT and USE_THREADS builds + + From: Gurusamy Sarathy + Date: Thu, 14 Jan 1999 19:21:46 -0500 + Message-Id: <199901150021.TAA01886@aatma.engin.umich.edu> + Subject: Re: [PATCH 5.005_03-MAINT_TRIAL2] fixes for PERL_OBJECT and USE_THREADS builds + Branch: maint-5.005/perl + ! embed.h global.sym lib/ExtUtils/MM_Unix.pm objXSUB.h objpp.h + ! op.c perl.c perl.h perly.c perly.y perly_c.diff pp.c proto.h + ! sv.c t/io/fs.t toke.c win32/GenCAPI.pl win32/config.bc + ! win32/makedef.pl win32/runperl.c win32/win32.c + ____________________________________________________________________________ + [ 2614] By: gbarr on 1999/01/16 16:48:38 + Log: From: Jarkko Hietaniemi + Date: Fri, 15 Jan 1999 17:28:34 +0200 (EET) + Message-Id: <199901151528.RAA08785@alpha.hut.fi> + Subject: [PATCH] 5.005_03-MAINT_TRIAL_2: NetBSD patches + + From: Jarkko Hietaniemi + Date: Fri, 15 Jan 1999 18:44:19 +0200 (EET) + Message-Id: <199901151644.SAA08184@alpha.hut.fi> + Subject: [PATCH] 5.005_03-MAINT_TRIAL_2: allow skipping the "install also as /usr/bin/perl" question of installperl + + From: Jarkko Hietaniemi + Date: Fri, 15 Jan 1999 18:52:29 +0200 (EET) + Message-Id: <199901151652.SAA11259@alpha.hut.fi> + Subject: the promised "installusrbinperl + NetBSD" fix + Branch: maint-5.005/perl + ! Configure Makefile.SH hints/netbsd.sh installperl + ! makedepend.SH unixish.h + ____________________________________________________________________________ + [ 2613] By: gbarr on 1999/01/16 16:28:40 + Log: From: Laszlo Molnar + Date: Thu, 14 Jan 1999 22:37:26 +0100 + Message-ID: <19990114223726.A177@beeblebrox> + Subject: [PATCH for 5.005_03-MAINT_TRIAL_2] dos-djgpp update + Branch: maint-5.005/perl + ! djgpp/config.over djgpp/djgpp.c + ____________________________________________________________________________ + [ 2612] By: gbarr on 1999/01/16 16:27:25 + Log: Hints for sco.sh to automatically support dynamic linking + + From: Peter Wolfe + Date: Mon, 11 Jan 1999 11:50:20 -0800 (PST) + Message-Id: <199901111950.LAA01703@titan.teloseng.com> + Subject: SCO 3.2v5 patch for perl5.005_03-MAINT_TRIAL_1 + Branch: maint-5.005/perl + ! hints/sco.sh + ____________________________________________________________________________ + [ 2610] By: gbarr on 1999/01/14 03:07:33 + Log: Fix login in installperl for pods + + From: Robin Barker + Date: Mon, 4 Jan 1999 13:50:10 GMT + Message-Id: <199901041350.NAA19665@cyclone.cise.npl.co.uk> + Subject: PATCH to installperl + Branch: maint-5.005/perl + ! installperl + ____________________________________________________________________________ + [ 2609] By: gbarr on 1999/01/14 03:04:37 + Log: Fix incorrect "used only once" warnings + + From: Ilya Zakharevich + Date: Fri, 8 Jan 1999 04:37:10 -0500 + Message-ID: <19990108043710.A14390@monk.mps.ohio-state.edu> + Subject: Re: change#965 flakiness + Branch: maint-5.005/perl + ! gv.c + ____________________________________________________________________________ + [ 2608] By: gbarr on 1999/01/14 02:56:46 + Log: Fixed double GLOB de-reference + + From: Gurusamy Sarathy + Date: Sat, 09 Jan 1999 23:40:24 -0500 + Message-Id: <199901100440.XAA12360@aatma.engin.umich.edu> + Subject: Re: IO::Pipe with perl -d (on HPUX) + Branch: maint-5.005/perl + ! ext/IO/lib/IO/Pipe.pm + ____________________________________________________________________________ + [ 2607] By: gbarr on 1999/01/14 02:53:40 + Log: Added Carp::cluck to perldelta.pod + Branch: maint-5.005/perl + ! pod/perldelta.pod + ____________________________________________________________________________ + [ 2606] By: gbarr on 1999/01/14 02:44:04 + Log: New perlfaq*.pod from Tom (private mail) + Branch: maint-5.005/perl + ! pod/perlfaq.pod pod/perlfaq1.pod pod/perlfaq2.pod + ! pod/perlfaq3.pod pod/perlfaq4.pod pod/perlfaq5.pod + ! pod/perlfaq6.pod pod/perlfaq7.pod pod/perlfaq8.pod + ! pod/perlfaq9.pod + ____________________________________________________________________________ + [ 2584] By: gbarr on 1999/01/08 04:50:56 + Log: implemented Ilya's suggested fix, and added a testcase + + From: Ilya Zakharevich + Date: Tue, 5 Jan 1999 00:56:01 -0500 (EST) + Message-Id: <199901050556.AAA02597@monk.mps.ohio-state.edu> + Subject: Re: Text::ParseWords: regex fix + Branch: maint-5.005/perl + ! lib/Text/ParseWords.pm t/lib/parsewords.t + ____________________________________________________________________________ + [ 2583] By: gbarr on 1999/01/08 04:50:03 + Log: From: Jarkko Hietaniemi + Date: Thu, 7 Jan 1999 12:47:38 +0200 (EET) + Message-Id: <199901071047.MAA24100@alpha.hut.fi> + Subject: [PATCH] 5.005_03-MAINT_TRIAL_2: ext/Errno_pm.PL: understand wrapper cppstdins + Branch: maint-5.005/perl + ! ext/Errno/Errno_pm.PL + ____________________________________________________________________________ + [ 2582] By: gbarr on 1999/01/08 03:37:55 + Log: More doc changes from Abigail, and included change #2575 from cfgperl + + From: abigail@fnx.com + Message-ID: <19990107041434.22326.qmail@alexandra.wayne.fnx.com> + Subject: [PATCH 5.005_03 TRIAL2 lib/Time/gmtime.pm] Typo fix + Date: Wed, 6 Jan 1999 23:14:34 -0500 (EST) + + From: abigail@fnx.com + Message-ID: <19990107041746.22376.qmail@alexandra.wayne.fnx.com> + Subject: [PATCH 5.005_03 TRIAL2 lib/Time/localtime.pm] Typo fix + Date: Wed, 6 Jan 1999 23:17:46 -0500 (EST) + + From: abigail@fnx.com + Message-ID: <19990107042105.22527.qmail@alexandra.wayne.fnx.com> + Subject: [PATCH 5.005_03 TRIAL2 lib/User/grent.pm] Typo fix + Date: Wed, 6 Jan 1999 23:21:05 -0500 (EST) + + From: abigail@fnx.com + Message-ID: <19990107042254.22624.qmail@alexandra.wayne.fnx.com> + Subject: [PATCH 5.005_03 TRIAL2 lib/User/pwent.pw] Typo fix + Date: Wed, 6 Jan 1999 23:22:54 -0500 (EST) + Branch: maint-5.005/perl + ! lib/Math/Trig.pm lib/Time/gmtime.pm lib/Time/localtime.pm + ! lib/User/grent.pm lib/User/pwent.pm + ____________________________________________________________________________ + [ 2578] By: gbarr on 1999/01/07 04:30:26 + Log: From: Dan Sugalski + Date: Wed, 06 Jan 1999 13:47:34 -0800 + Message-Id: <3.0.6.32.19990106134734.0334d260@ous.edu> + Subject: [PATCH 5.005_02-MT2, 5.005_5x]VMS.C tweak for occasional system() error + Branch: maint-5.005/perl + ! vms/vms.c + ____________________________________________________________________________ + [ 2577] By: gbarr on 1999/01/07 04:26:28 + Log: Another set of doc patches from Abigail + + From: abigail@fnx.com + Message-ID: <19990107032132.20124.qmail@alexandra.wayne.fnx.com> + Subject: [PATCH 5.005_03 TRAIL2 lib/Net/hostent.pm] Typo fix + Date: Wed, 6 Jan 1999 22:21:32 -0500 (EST) + + From: abigail@fnx.com + Message-ID: <19990107032445.20178.qmail@alexandra.wayne.fnx.com> + Subject: [PATCH 5.005_03 TRIAL2 lib/Net/netent.pm] Typo fix + Date: Wed, 6 Jan 1999 22:24:45 -0500 (EST) + + From: abigail@fnx.com + Message-ID: <19990107032834.20362.qmail@alexandra.wayne.fnx.com> + Subject: [PATCH 5.005_03 TRAIL2 lib/Term/Complete.pm] Typo fix + Date: Wed, 6 Jan 1999 22:28:34 -0500 (EST) + + From: abigail@fnx.com + Message-ID: <19990107033136.20440.qmail@alexandra.wayne.fnx.com> + Subject: [PATCH 5.005_03 TRAIL2 lib/Term/ReadLine.pm] Typo fix + Date: Wed, 6 Jan 1999 22:31:36 -0500 (EST) + + From: abigail@fnx.com + Message-ID: <19990107033351.20540.qmail@alexandra.wayne.fnx.com> + Subject: [PATCH 5.005_03 TRIAL2 lib/CGI/Apache.pm] Typo fix + Date: Wed, 6 Jan 1999 22:33:51 -0500 (EST) + + From: abigail@fnx.com + Message-ID: <19990107033933.20707.qmail@alexandra.wayne.fnx.com> + Subject: [PATCH 5.005_03 TRIAL2 lib/CGI/Push.pm] Typo fix + Date: Wed, 6 Jan 1999 22:39:33 -0500 (EST) + + From: abigail@fnx.com + Message-ID: <19990107034548.20936.qmail@alexandra.wayne.fnx.com> + Subject: [PATCH 5.005_03 TRIAL2 lib/File/Copy.pm] Typo fixes + Date: Wed, 6 Jan 1999 22:45:48 -0500 (EST) + + From: abigail@fnx.com + Message-ID: <19990107034856.21056.qmail@alexandra.wayne.fnx.com> + Subject: [PATCH 5.005_03 TRIAL2 lib/File/Spec.pm] Typo fix + Date: Wed, 6 Jan 1999 22:48:56 -0500 (EST) + + From: abigail@fnx.com + Message-ID: <19990107035113.21174.qmail@alexandra.wayne.fnx.com> + Subject: [PATCH 5.005_03 TRIAL2 lib/File/Spec/Mac.pm] Typo fixes + Date: Wed, 6 Jan 1999 22:51:13 -0500 (EST) + + From: abigail@fnx.com + Message-ID: <19990107035612.21522.qmail@alexandra.wayne.fnx.com> + Subject: [PATCH 5.005_03 TRIAL2 lib/Math/BigFloat.pm] Typo fix + Date: Wed, 6 Jan 1999 22:56:12 -0500 (EST) + + From: abigail@fnx.com + Message-ID: <19990107035842.21585.qmail@alexandra.wayne.fnx.com> + Subject: [PATCH 5.005_03 TRIAL2 lib/Math/BigInt.pm] Typo fixes + Date: Wed, 6 Jan 1999 22:58:41 -0500 (EST) + + From: abigail@fnx.com + Message-ID: <19990107040644.22009.qmail@alexandra.wayne.fnx.com> + Subject: [PATCH 5.005_03 TRIAL2 lib/Text/Wrap.pm] Typo fixes + Date: Wed, 6 Jan 1999 23:06:44 -0500 (EST) + + From: abigail@fnx.com + Message-ID: <19990107040955.22087.qmail@alexandra.wayne.fnx.com> + Subject: [PATCH 5.005_03 TRIAL2 lib/Tie/Array.pm] Typo fixes + Date: Wed, 6 Jan 1999 23:09:55 -0500 (EST) + + From: abigail@fnx.com + Message-ID: <19990107041136.22174.qmail@alexandra.wayne.fnx.com> + Subject: [PATCH 5.005_03 TRIAL2 lib/Tie/Hash.pm] Typo fix + Date: Wed, 6 Jan 1999 23:11:36 -0500 (EST) + Branch: maint-5.005/perl + ! lib/CGI/Apache.pm lib/CGI/Push.pm lib/File/Copy.pm + ! lib/File/Spec.pm lib/File/Spec/Mac.pm lib/Math/BigFloat.pm + ! lib/Math/BigInt.pm lib/Net/hostent.pm lib/Net/netent.pm + ! lib/Term/Complete.pm lib/Term/ReadLine.pm lib/Text/Wrap.pm + ! lib/Tie/Array.pm lib/Tie/Hash.pm + ____________________________________________________________________________ + [ 2568] By: gbarr on 1999/01/06 03:13:15 + Log: From: jan.dubois@ibm.net (Jan Dubois) + Date: Wed, 06 Jan 1999 01:24:09 +0100 + Message-ID: <3696aa85.18259325@smtp1.ibm.net> + Subject: [PATCH 5.005_03-MAINT_TRIAL2] fixes for PERL_OBJECT and USE_THREADS builds + Branch: maint-5.005/perl + ! embed.h global.sym objXSUB.h objpp.h perl.c proto.h + ! win32/GenCAPI.pl win32/makedef.pl + ____________________________________________________________________________ + [ 2567] By: gbarr on 1999/01/06 02:31:28 + Log: From: Dan Sugalski + Date: Tue, 05 Jan 1999 16:47:31 -0800 + Message-Id: <3.0.6.32.19990105164731.00b5b2d0@ous.edu> + Subject: [PATCH 5.005_03-MAINT_TRIAL_2]taint.c fix for VMS + Branch: maint-5.005/perl + ! taint.c + ____________________________________________________________________________ + [ 2566] By: gbarr on 1999/01/06 02:29:05 + Log: From: "W. Phillip Moore" + Date: Tue, 5 Jan 1999 12:40:27 -0500 (EST) + Message-ID: <13970.20107.190314.549471@zappa> + Subject: [PATCH] POSIX getpgrp is not -w clean + Branch: maint-5.005/perl + ! ext/POSIX/POSIX.pm + ____________________________________________________________________________ + [ 2565] By: gbarr on 1999/01/06 02:19:00 + Log: From: Slaven Rezic + Date: Mon, 4 Jan 1999 23:01:46 +0100 (CET) + Message-Id: <199901042201.XAA01875@cabulja.herceg.de> + Subject: FindBin.pm on Win32 systems + Branch: maint-5.005/perl + ! lib/FindBin.pm + ____________________________________________________________________________ + [ 2564] By: gbarr on 1999/01/06 02:13:23 + Log: From: Mark Bixby + Date: Mon, 4 Jan 1999 13:34:58 -0800 (PST) + Message-Id: <199901042134.NAA18852@spock.dis.cccd.edu> + Subject: [PATCH 5.005_03-MAINT_TRIAL_2] t/op/sysio.t for MPE/iX + Branch: maint-5.005/perl + ! t/op/sysio.t + ____________________________________________________________________________ + [ 2563] By: gbarr on 1999/01/06 02:03:44 + Log: From: Jarkko Hietaniemi + Date: Mon, 4 Jan 1999 19:25:03 +0200 (EET) + Message-Id: <199901041725.TAA30462@alpha.hut.fi> + Subject: [PATCH] 5.005_03-MAINT_TRIAL_2: undo untrue HP-UX 64-bitness (mostly harmless but misleading) + Branch: maint-5.005/perl + ! hints/hpux.sh + ____________________________________________________________________________ + [ 2562] By: gbarr on 1999/01/06 02:02:18 + Log: Jumbo doc patch from Abigail + + From: abigail@fnx.com + Message-ID: <19990105170142.4889.qmail@alexandra.wayne.fnx.com> + Subject: [PATCH 5.005_03-TRIAL2 lib/ExtUtils/Liblist.pm] pod fixes + Date: Tue, 5 Jan 1999 12:01:42 -0500 (EST) + + From: abigail@fnx.com + Message-ID: <19990105172855.5115.qmail@alexandra.wayne.fnx.com> + Subject: [PATCH 5.005_03 MAINT2 lib/ExtUtils/Commands.pm] Typo fix. + Date: Tue, 5 Jan 1999 12:28:55 -0500 (EST) + + From: abigail@fnx.com + Message-ID: <19990105173808.5260.qmail@alexandra.wayne.fnx.com> + Subject: [PATCH perl5.005_03 MAINT3 lib/ExtUtils/Embed.pm] Typo fix + Date: Tue, 5 Jan 1999 12:38:08 -0500 (EST) + + From: abigail@fnx.com + Message-ID: <19990105174859.5533.qmail@alexandra.wayne.fnx.com> + Subject: [PATCH 5.005_03 MAINT2 lib/ExtUtils/Install.pm] Typo fix + Date: Tue, 5 Jan 1999 12:48:59 -0500 (EST) + + From: abigail@fnx.com + Message-ID: <19990105174947.5547.qmail@alexandra.wayne.fnx.com> + Subject: [PATCH 5.005_03 lib/ExtUtils/MM_Unix.pm] Typo fixes + Date: Tue, 5 Jan 1999 12:49:46 -0500 (EST) + + From: abigail@fnx.com + Message-ID: <19990105182301.5966.qmail@alexandra.wayne.fnx.com> + Subject: [PATCH 5.005_03 lib/ExtUtils/MakeMaker.pm] Typos fixes. + Date: Tue, 5 Jan 1999 13:23:00 -0500 (EST) + + From: abigail@fnx.com + Message-ID: <19990105183344.6065.qmail@alexandra.wayne.fnx.com> + Subject: [PATCH 5.005_03 TRIAL2 lib/ExtUtils/Manifest.pm] Typo fixes + Date: Tue, 5 Jan 1999 13:33:44 -0500 (EST) + + From: abigail@fnx.com + Message-ID: <19990105184028.6220.qmail@alexandra.wayne.fnx.com> + Subject: [PATCH 5.005_03 TRIAL2 lib/ExtUtils/Mksymlists.pm] Typo fix + Date: Tue, 5 Jan 1999 13:40:28 -0500 (EST) + + From: abigail@fnx.com + Message-ID: <19990106012015.9451.qmail@alexandra.wayne.fnx.com> + Subject: [PATCH 5.005_03 TRIAL2 lib/IO/Pipe.pm] Typo fixes. + Date: Tue, 5 Jan 1999 20:20:15 -0500 (EST) + + From: abigail@fnx.com + Message-ID: <19990106012047.9459.qmail@alexandra.wayne.fnx.com> + Subject: [PATCH 5.005_03 TRAIL2 lib/IO/Seekable.pm] Typo fixes + Date: Tue, 5 Jan 1999 20:20:47 -0500 (EST) + + From: abigail@fnx.com + Message-ID: <19990106012338.9536.qmail@alexandra.wayne.fnx.com> + Subject: [PATCH 5.005_03 TRIAL2 lib/IO/Socket.pm] Typo fix + Date: Tue, 5 Jan 1999 20:23:38 -0500 (EST) + Branch: maint-5.005/perl + ! ext/IO/lib/IO/Pipe.pm ext/IO/lib/IO/Seekable.pm + ! ext/IO/lib/IO/Socket.pm lib/ExtUtils/Command.pm + ! lib/ExtUtils/Embed.pm lib/ExtUtils/Install.pm + ! lib/ExtUtils/Liblist.pm lib/ExtUtils/MM_Unix.pm + ! lib/ExtUtils/MakeMaker.pm lib/ExtUtils/Manifest.pm + ! lib/ExtUtils/Mksymlists.pm + ____________________________________________________________________________ + [ 2560] By: gbarr on 1999/01/03 16:59:01 + Log: Trial release 2 + Branch: maint-5.005/perl + ! Changes patchlevel.h + ____________________________________________________________________________ + [ 2559] By: gbarr on 1999/01/02 15:37:35 + Log: From: Blair Zajac + Date: Wed, 23 Dec 1998 17:13:32 -0800 + Message-ID: <3681953C.8B6A90AA@geostaff.com> + Subject: Tie::SubstrHash patch + Branch: maint-5.005/perl + ! lib/Tie/SubstrHash.pm + ____________________________________________________________________________ + [ 2558] By: gbarr on 1999/01/02 15:30:01 + Log: integrate change #2544 + + From: Tim Bunce + Subject: bug in pod2man search for perl binary [5.005_5x] + Date: Sat, 12 Dec 1998 23:08:51 +0000 + Message-ID: <19981212230851.A20578@ig.co.uk> + Branch: maint-5.005/perl + !> pod/pod2man.PL + ____________________________________________________________________________ + [ 2557] By: gbarr on 1999/01/02 15:20:42 + Log: integrate change #2548 + + From: Hugo van der Sanden + To: perl5-porters@perl.org + cc: hv@crypt0.demon.co.uk + Subject: [bug 5.004_54] duplicate error message + Date: Thu, 31 Dec 1998 04:05:25 +0000 + Message-Id: <199812310405.EAA00386@crypt.compulink.co.uk> + + Message-ID: <13963.60672.134591.383377@alias-2.pr.mcs.net> + From: Stephen McCamant + To: hv@crypt0.demon.co.uk + Cc: perl5-porters@perl.org + Subject: [PATCH _54] Re: duplicate error message + Date: Thu, 31 Dec 1998 16:10:13 -0600 (CST) + + Message-Id: <199901010732.HAA02926@crypt.compulink.co.uk> + From: Hugo van der Sanden + To: Stephen McCamant + cc: hv@crypt0.demon.co.uk, perl5-porters@perl.org + Subject: [TEST PATCH _54] Re: duplicate error message + Date: Fri, 01 Jan 1999 07:32:14 +0000 + Branch: maint-5.005/perl + ! op.c t/pragma/warn-1global taint.c + ____________________________________________________________________________ + [ 2556] By: gbarr on 1999/01/02 15:18:58 + Log: From: abigail@fnx.com + Date: Mon, 28 Dec 1998 14:16:12 -0500 (EST) + Message-ID: <19981228191612.8380.qmail@alexandra.wayne.fnx.com> + Subject: [PATCH 5.005_02; lib/fields.pm] Typos in pod. + Branch: maint-5.005/perl + ! lib/fields.pm + ____________________________________________________________________________ + [ 2555] By: gbarr on 1999/01/02 15:11:45 + Log: intregrate change #2547 + + From: Chris Nandor + Subject: Re: [PATCH] perlport.pod 1.38 + Date: Thu, 31 Dec 1998 09:06:48 -0500 + Message-Id: + Branch: maint-5.005/perl + !> pod/perlport.pod + ____________________________________________________________________________ + [ 2543] By: gbarr on 1998/12/31 06:17:13 + Log: integrated relevant parts og changes #2385 & #2387 from mainline + + various fixes for race conditions under threads: mutex locks based + on PL_threadnum were seriously flawed, since it means more than one + thread could enter the critical region; PL_na was global instead of + thread-local; child thread could finish and free thr structures + before Thread->new() got around to creating the Thread object; + cv_clone() needed locking, as it mucks with PL_comppad and other + global data; new_struct_thread() needed to lock template-thread's + mutex while copying its data + + another threads reliability fix: serialize writes to thr->threadsv + avoid most uses of PL_na (which is much more inefficient than a + simple local); update docs to suit; PL_na now being thr->Tna may + be a minor compatibility issue for extensions--will require dTHR + outside of XSUBs (those get automatic dTHR) + Branch: maint-5.005/perl + ! XSUB.h djgpp/djgpp.c doio.c doop.c dump.c embedvar.h + ! ext/DynaLoader/dl_next.xs ext/IO/IO.xs ext/Opcode/Opcode.xs + ! ext/POSIX/POSIX.xs ext/Thread/Thread.xs ext/attrs/attrs.xs + ! gv.c malloc.c mg.c objXSUB.h op.c os2/OS2/REXX/REXX.xs + ! os2/os2.c perl.c perlvars.h perly.c perly.y pod/perlcall.pod + ! pod/perlembed.pod pod/perlguts.pod pod/perlxs.pod pp.c pp.h + ! pp_ctl.c pp_hot.c pp_sys.c run.c sv.c taint.c thread.h toke.c + ! universal.c util.c vms/ext/Stdio/Stdio.xs vms/perly_c.vms + ! vms/vms.c win32/win32.c win32/win32thread.c + ____________________________________________________________________________ + [ 2542] By: gbarr on 1998/12/30 14:46:40 + Log: doc updates + + From: abigail@fnx.com + Date: Wed, 23 Dec 1998 22:32:07 -0500 (EST) + Message-ID: <19981224033207.16751.qmail@alexandra.wayne.fnx.com> + Subject: [PATCH 5.005_02] Typo in documentation of pod2html. + + From: abigail@fnx.com + Date: Wed, 23 Dec 1998 22:59:59 -0500 (EST) + Message-ID: <19981224035959.16994.qmail@alexandra.wayne.fnx.com> + Subject: [PATCH 5.005_02] Re: m// doc is buggy (was Re: m'$foo' is undocumented) + + pod/perldelta.pod from: + From: Jarkko Hietaniemi + Date: Thu, 17 Dec 1998 16:13:34 +0200 (EET) + Message-ID: <13945.4494.140163.973953@alpha.hut.fi> + Subject: Re: important UNDOC issues for 5.005_54 + Branch: maint-5.005/perl + ! pod/perldelta.pod pod/perlop.pod pod/pod2html.PL + ____________________________________________________________________________ + [ 2541] By: gbarr on 1998/12/30 14:37:14 + Log: From: jan.dubois@ibm.net (Jan Dubois) + Date: Wed, 23 Dec 1998 21:26:38 +0100 + Message-ID: <36895086.8849224@smtp1.ibm.net> + Subject: [PATCH 5.005_03m1] subdirectory Makefiles should inherit CAPI setting from command line + Branch: maint-5.005/perl + ! lib/ExtUtils/MakeMaker.pm + ____________________________________________________________________________ + [ 2538] By: gbarr on 1998/12/29 14:41:29 + Log: From: Jarkko Hietaniemi + Date: Tue, 22 Dec 1998 10:57:48 +0200 (EET) + Message-ID: <13951.24332.932827.831376@alpha.hut.fi> + Subject: Re: x operator broken in DEC Alpha for 8-bit characters (Re: Digest-MD5-2.00 test fails on DEC Alpha - a patch) + Branch: maint-5.005/perl + ! t/op/repeat.t util.c + ____________________________________________________________________________ + [ 2535] By: gbarr on 1998/12/29 14:27:56 + Log: From: Jarkko Hietaniemi + Date: Fri, 18 Dec 1998 16:39:27 +0200 (EET) + Message-ID: <13946.26911.140905.387070@alpha.hut.fi> + Subject: Math::Trig, Math::Complex, Fcntl, addressed (Re: Undocumentation Issues for 5.005) + Branch: maint-5.005/perl + ! pod/perldelta.pod + ____________________________________________________________________________ + [ 2534] By: gbarr on 1998/12/29 14:23:02 + Log: From: Jarkko Hietaniemi + Date: Tue, 15 Dec 1998 17:52:32 +0200 (EET) + Message-ID: <13942.34240.66558.169330@alpha.hut.fi> + Subject: some doc link fixes + Branch: maint-5.005/perl + ! pod/perlcall.pod pod/perldata.pod pod/perldiag.pod + ! pod/perlfaq5.pod pod/perlfaq7.pod pod/perlfunc.pod + ! pod/perlguts.pod pod/perllocale.pod pod/perlobj.pod + ! pod/perlsub.pod pod/perlvar.pod + ____________________________________________________________________________ + [ 2533] By: gbarr on 1998/12/29 14:23:00 + Log: From: Chris Nandor + Date: Sat, 19 Dec 1998 12:54:34 -0500 + Message-Id: + Subject: [PATCH] perlport.pod v1.37 + Branch: maint-5.005/perl + ! pod/perlport.pod + ____________________________________________________________________________ + [ 2531] By: gbarr on 1998/12/29 14:12:25 + Log: change in_pod pattern to /^=\w/ from /^=/ + From: Frank Ridderbusch + Date: Tue, 15 Dec 1998 16:23:12 +0100 (MET) + Message-ID: <13942.32480.700000.640927@utensil> + Subject: Minor Bug in AutoSplit.qm in 5.005 and 5.004 + Branch: maint-5.005/perl + ! lib/AutoSplit.pm + ____________________________________________________________________________ + [ 2530] By: gbarr on 1998/12/29 14:09:51 + Log: undo the "perlsyn intrusion" into perlfunc + Branch: maint-5.005/perl + ! pod/perlfunc.pod + ____________________________________________________________________________ + [ 2529] By: gbarr on 1998/12/29 14:04:35 + Log: From: Jarkko Hietaniemi + Date: Sun, 13 Dec 1998 14:54:56 +0200 (EET) + Message-Id: <199812131254.OAA24494@koah.research.nokia.com> + Subject: ignore_versioned_libs isn't used anywhere (it became ignore_versioned_solibs) + Branch: maint-5.005/perl + ! hints/linux.sh + ____________________________________________________________________________ + [ 2528] By: gbarr on 1998/12/29 13:59:49 + Log: From: Ilya Zakharevich + Date: Wed, 28 Oct 1998 01:20:33 -0500 (EST) + Message-Id: <199810280620.BAA06893@monk.mps.ohio-state.edu> + Subject: [PATCH 5.00552] Make sort respect overloading + Branch: maint-5.005/perl + ! pp_ctl.c t/pragma/overload.t + ____________________________________________________________________________ + [ 2527] By: gbarr on 1998/12/29 13:58:56 + Log: doc update, quads only work on 64-but platforms + Branch: maint-5.005/perl + ! pod/perlfunc.pod + ____________________________________________________________________________ + [ 2526] By: gbarr on 1998/12/29 13:49:55 + Log: From: Andy Dougherty + Date: Tue, 1 Dec 1998 12:50:27 -0500 (EST) + Message-Id: + Subject: [PATCH 5.005_xx] erroneous 'none' in lddlflags + Branch: maint-5.005/perl + ! Configure + ____________________________________________________________________________ + [ 2512] By: gbarr on 1998/12/28 14:56:36 + Log: change t/op/pwent.t to ignore NIS includes + From: achampio@lehman.com (Alan Champion) + Date: Tue, 1 Dec 1998 15:18:03 GMT + Message-Id: <9812011518.AA00005@lonhpov1.lehman.com> + Subject: Not OK: perl 5.00503 +MAINT_TRIAL_1 on sun4-solaris 2.3 (UNINSTALLED) + + From: pvhp@forte.com (Peter Prymmer) + Date: Fri, 4 Dec 98 17:11:41 PST + Message-Id: <9812050111.AA16778@forte.com> + Subject: [PATCH 5.005_03-MAINT_TRIAL_1 && 5.005_54]dumper and searchdict ebcdic style + Branch: maint-5.005/perl + ! t/lib/dumper.t t/lib/searchdict.t t/op/pwent.t + ____________________________________________________________________________ + [ 2511] By: gbarr on 1998/12/28 14:55:28 + Log: From: jan.dubois@ibm.net (Jan Dubois) + Date: Tue, 01 Dec 1998 00:07:33 +0100 + Message-ID: <366921b5.14512598@smtp1.ibm.net> + Subject: Re: 5.005_03-MAINT-TRIAL1, [PATCH] to compile on Win32 + + From: jan.dubois@ibm.net (Jan Dubois) + Date: Wed, 02 Dec 1998 00:24:54 +0100 + Message-ID: <366a77bb.19498126@smtp1.ibm.net> + Subject: Re: 5.005_03-MAINT-TRIAL1, [PATCH] spaces in filenames support + Branch: maint-5.005/perl + ! perl.h proto.h taint.c win32/GenCAPI.pl win32/Makefile + ! win32/config.bc win32/config.gc win32/config.vc + ! win32/config_sh.PL win32/makedef.pl + ____________________________________________________________________________ + [ 2510] By: gbarr on 1998/12/28 14:37:35 + Log: From: Ilya Zakharevich + Date: Tue, 1 Dec 1998 00:34:08 -0500 (EST) + Message-Id: <199812010534.AAA21371@monk.mps.ohio-state.edu> + Subject: [PATCH 5.005_*] Debugger 'v' command + Branch: maint-5.005/perl + ! lib/perl5db.pl + ____________________________________________________________________________ + [ 2478] By: gbarr on 1998/12/13 16:02:24 + Log: From: pvhp@forte.com (Peter Prymmer) + Date: Mon, 30 Nov 98 21:08:36 PST + Message-Id: <9812010508.AA07791@forte.com> + Subject: [PATCH 5.005_03t1 && 5.005_54]dll linkage side decks for OS/390 + Branch: maint-5.005/perl + ! hints/os390.sh + ____________________________________________________________________________ + [ 2477] By: gbarr on 1998/12/13 16:00:23 + Log: From: Dan Sugalski + Date: Mon, 30 Nov 1998 17:08:12 -0800 + Message-Id: <3.0.6.32.19981130170812.00b12b70@ous.edu> + Subject: [PATCH 5.005_03]Minor VMS patches needed to build + Branch: maint-5.005/perl + ! lib/ExtUtils/MM_VMS.pm vms/subconfigure.com + ____________________________________________________________________________ + [ 2476] By: gbarr on 1998/12/13 15:30:58 + Log: From: pvhp@forte.com (Peter Prymmer) + Date: Fri, 4 Dec 98 00:37:32 PST + Message-Id: <9812040837.AA10908@forte.com> + Subject: Re: [PATCH 5.005_03-MAINT-TRIAL1] some tweaks to the build process for OS/390 + Branch: maint-5.005/perl + ! Makefile.SH regcomp.c + ____________________________________________________________________________ + [ 2472] By: gbarr on 1998/12/12 17:12:28 + Log: undo changes to Exporter.pm from #2312 + Branch: maint-5.005/perl + ! lib/Exporter.pm + ____________________________________________________________________________ + [ 2471] By: gbarr on 1998/12/12 17:09:39 + Log: integrate change#2459 from cfgperl + + enclose case want_vtbl_collxfrm with #ifdef USE_LOCALE_COLLATE + + From: hansm@icgroup.nl + Subject: Not OK: perl 5.00503 +MAINT_TRIAL_1 on OPENSTEP-Mach 4_1 (UNINSTALLED) + Date: Sun, 6 Dec 98 22:19:54 +0100 + Message-Id: <9812062116.AA26445@icgned.icgroup.nl> + Branch: maint-5.005/perl + ! util.c + ____________________________________________________________________________ + [ 2470] By: gbarr on 1998/12/12 16:46:03 + Log: re-sync'd Text::Wrap with new version from CPAN + Branch: maint-5.005/perl + +> t/lib/textfill.t + ! MANIFEST + !> lib/Text/Wrap.pm t/lib/textwrap.t + ____________________________________________________________________________ + [ 2469] By: gbarr on 1998/12/12 15:58:43 + Log: integrate changes#2435,2436 from cfgperl + + Pod::Html and Pod::Text were not locale-savvy: + for example in =head1 all non-ASCII-\w-runs were + turned into underscores in NAME tags. This could + result in several NAME tags becoming identical. + Reported by: + + From: Fyodor Krasnov + Subject: pod2html vs Russian Characters + To: Tom.Christiansen@snn.aha.ru, tchrist@perl.com + Date: Tue, 24 Nov 1998 19:00:36 +0300 (MSK) + Message-Id: <199811241600.TAA05149@stat.aha.ru> + + One paste too many in #2435. + Branch: maint-5.005/perl + !> lib/Pod/Html.pm lib/Pod/Text.pm + ____________________________________________________________________________ + [ 2468] By: gbarr on 1998/12/12 15:01:58 + Log: redirect trail program to error msg file in Configure + + From: Andy Dougherty + Date: Tue, 1 Dec 1998 13:40:12 -0500 (EST) + Message-Id: + Subject: [PATCH 5.005_xx] Missing redirection of simple test program + Branch: maint-5.005/perl + ! Configure + ____________________________________________________________________________ + [ 2467] By: gbarr on 1998/12/12 14:52:24 + Log: Change reall_srchlen back to an int from a #define + + From: Graham Barr + Date: Mon, 30 Nov 1998 14:29:14 -0600 + Message-ID: <19981130142914.X1504@asic.sc.ti.com> + Subject: [PATCH 5.005_03-MT!] Re: one compilation warning from 5_03-MT1 + Branch: maint-5.005/perl + ! malloc.c + ____________________________________________________________________________ + [ 2466] By: gbarr on 1998/12/12 14:40:56 + Log: s/SCM_CREDENTIALSS/SCM_CREDENTIALs/ in Socket.xs + + From: Andy Dougherty + Date: Thu, 3 Dec 1998 11:26:25 -0500 (EST) + Message-Id: + Subject: [PATCH 5.005_03-MAINT_TRIAL_1] Trivial grammar patch + Branch: maint-5.005/perl + ! Porting/Glossary + !> ext/Socket/Socket.xs + ____________________________________________________________________________ + [ 2456] By: gsar on 1998/12/06 13:49:02 + Log: branch perldelta.pod + Branch: maint-5.005/perl + +> pod/perldelta.pod + ____________________________________________________________________________ + [ 2455] By: gsar on 1998/12/06 13:47:21 + Log: clobber perldelta.pod to reestablish branch from perl5005delta.pod + Branch: maint-5.005/perl + - pod/perldelta.pod + ____________________________________________________________________________ + [ 2415] By: gbarr on 1998/11/30 02:31:15 + Log: Chnages,patchlevel.h etc... + Branch: maint-5.005/perl + ! Changes MANIFEST patchlevel.h t/op/tr.t win32/Makefile + ! win32/config_H.bc win32/config_H.gc win32/config_H.vc + ! win32/makefile.mk + ____________________________________________________________________________ + [ 2411] By: gbarr on 1998/11/30 01:31:22 + Log: integrated changes#2323,2353,2369 + + From: maeda@src.ricoh.co.jp + Date: Tue, 24 Nov 1998 10:37:45 +0900 + Message-Id: <199811240137.KAA05867@luna.src.ricoh.co.jp> + Subject: format "..." bug + + Locale collation, ctype, and numeric, were initialized wrong + (if LC_ALL or LANG were unset, so were the collation/ctype/numeric), + as reported by + + From: Ilya.Sandler@etak.com (Ilya Sandler) + Subject: a bug in locale handling: LC_COLLATE ignored sometimes + Date: 25 Nov 1998 04:53:52 +0200 + Message-ID: + + allow final period in a file (not followed by a newline) to + terminate format spec + Branch: maint-5.005/perl + ! pp_ctl.c toke.c util.c + !> t/op/write.t + ____________________________________________________________________________ + [ 2408] By: gbarr on 1998/11/30 01:29:19 + Log: integrated ext/B/... changes from mainline + Branch: maint-5.005/perl + !> ext/B/B.pm ext/B/B.xs ext/B/B/Assembler.pm ext/B/B/C.pm + !> ext/B/B/Disassembler.pm + ____________________________________________________________________________ + [ 2404] By: gbarr on 1998/11/30 00:26:36 + Log: integrate some of change#2318 from mainline + Branch: maint-5.005/perl + +> t/op/grent.t t/op/pwent.t + !> ext/DB_File/Changes ext/DB_File/DB_File.pm + !> ext/DB_File/DB_File.xs ext/POSIX/hints/dynixptx.pl + !> ext/Socket/Socket.pm ext/Socket/Socket.xs lib/Benchmark.pm + !> pod/perldata.pod t/op/sort.t + ____________________________________________________________________________ + [ 2398] By: gbarr on 1998/11/29 22:11:16 + Log: integrate changes#2254,2259,2335,2345,2348,2361,2368,2380 from mainline + + win32_recvfrom() compatibility fix + + From: "Kurt D. Starsinic" + Subject: Re: [PATCH] Re: pod2man bug in date generated line + To: Albert Dvornik , "Larry W. Virden" + Cc: perlbug@perl.com + Date: 20 Nov 1998 21:30:17 +0200 + Message-ID: + + make $1 et al readonly under threads; make C fail like + C<$1 = undef> does + + fix typo in pp_defined() causing C to fail + + more conservative version of changes#2345,2346,2347; those break + C which seems to be extensively used in + the libs :-( + + fix uninitialized warnings + From: Brian Callaghan + Date: Thu, 19 Nov 1998 17:49:10 -0800 + Message-Id: <3654CA96.B64FCAEB@itginc.com> + Subject: Complete.pm patch (version 1.1) + + Liblist tweak suggested by Swen Thuemmler ; + add C<$Config{installarchlib}/CORE> to the default locations searched + on win32 + + prefer IO::Handle for IO if FileHandle:: is empty (as suggested by + Tim Bunce) + Branch: maint-5.005/perl + ! gv.c op.c pp.c + !> lib/ExtUtils/Liblist.pm lib/Term/Complete.pm pod/perlfaq4.pod + !> pod/pod2man.PL t/op/undef.t win32/win32sck.c + ____________________________________________________________________________ + [ 2315] By: gbarr on 1998/11/27 05:16:50 + Log: integrate change#2246 from mainline, while still allowing + C + + allow C + Branch: maint-5.005/perl + ! op.c sv.c + !> t/op/sort.t + ____________________________________________________________________________ + [ 2314] By: gbarr on 1998/11/27 04:03:58 + Log: integrate change#2159 from mainline + + Data::Dumper update + Branch: maint-5.005/perl + !> ext/Data/Dumper/Changes ext/Data/Dumper/Dumper.pm + !> ext/Data/Dumper/Dumper.xs ext/Data/Dumper/Todo t/lib/dumper.t + ____________________________________________________________________________ + [ 2313] By: gbarr on 1998/11/27 03:04:21 + Log: Fix typo in change#2312 + Branch: maint-5.005/perl + ! ext/Thread/Thread.xs + ____________________________________________________________________________ + [ 2312] By: gbarr on 1998/11/27 03:03:03 + Log: integrate change#1837,1967,1986,2060,2068,2146,2214,2224,2300,2301 from mainline + + (via private mail) + From: Charles Bailey + Date: Sat, 05 Sep 1998 01:23:58 -0400 (EDT) + Message-id: <01J1FH7R43NS002F14@cor.newman.upenn.edu> + Subject: [Patch 5.005_02] Miscellaneous VMS cleanup + + correct bugs exposed in MM_Unix.pm by commenting out Selfloader + (MAN3PODS cannot be set to ' '; stray stricture violation) + + qualify names of builtins + + handle '::' in section names properly + From: Graham Barr + Date: Sat, 17 Oct 1998 12:57:54 -0500 + Message-ID: <19981017125754.C510@pobox.com> + Subject: Re: pod2html + + From: Zachary Miller + Date: Tue, 20 Oct 1998 20:52:20 -0500 + Message-Id: <199810210152.UAA07792@simon.er.usgs.gov> + Subject: Exporter.pm's export_to_level() argument handling buggy + + hand-apply whitespace-mutiliated patch + From: "vishal bhatia" + Date: Wed, 28 Oct 1998 23:45:32 PST + Message-ID: <19981029074534.2334.qmail@hotmail.com> + Subject: [PATCH 5.005_52]Compiling modules,more bugfixes for B + + typo in newHVhv() + + avoid endless loops in Text::Wrap (from a suggestion by Lupe + Christoph ) + + properly free temporaries created by threads + + fix PL_defoutgv leak under threads + Branch: maint-5.005/perl + !> (integrate 31 files) + ____________________________________________________________________________ + [ 2311] By: gbarr on 1998/11/27 01:31:36 + Log: integrate change#2210 from mainline + + fix AvREALISH bogusness + Branch: maint-5.005/perl + ! av.c + !> t/op/array.t + ____________________________________________________________________________ + [ 2310] By: gbarr on 1998/11/27 00:20:21 + Log: integrate changes#2235,2299,2300 from mainline + + catch a neophyte trap: open(), close() etc. + + fix C misoptimization that fails + to set the package for the block properly + + properly free temporaries created by threads + Branch: maint-5.005/perl + ! ext/Thread/Thread.xs op.c perl.h util.c + !> t/comp/package.t + ____________________________________________________________________________ + [ 2309] By: gbarr on 1998/11/27 00:16:36 + Log: integrate change#2298 from mainline + Branch: maint-5.005/perl + !> universal.c + ____________________________________________________________________________ + [ 2308] By: gbarr on 1998/11/27 00:11:44 + Log: Updates for MPE/iX DynaLoader and installperl, via private mail + forwarded by Jarkko Hietaniemi from Mark Bixby + Branch: maint-5.005/perl + ! ext/DynaLoader/dl_mpeix.xs installperl + ____________________________________________________________________________ + [ 2307] By: gbarr on 1998/11/27 00:07:27 + Log: Remove docs for feature not in _0* + Branch: maint-5.005/perl + ! pod/perlfunc.pod + ____________________________________________________________________________ + [ 2306] By: gbarr on 1998/11/26 23:44:47 + Log: Allow PL_FILES to have multiple targets from one source by allowing + an array ref as the value in the hash + Branch: maint-5.005/perl + ! lib/ExtUtils/MM_Unix.pm lib/ExtUtils/MM_VMS.pm + ! lib/ExtUtils/MakeMaker.pm + ____________________________________________________________________________ + [ 2305] By: gbarr on 1998/11/26 23:38:06 + Log: fix unsigned variables to use SvUV and sv_setuv + Branch: maint-5.005/perl + ! lib/ExtUtils/typemap + ____________________________________________________________________________ + [ 2304] By: gbarr on 1998/11/26 23:36:17 + Log: Fix embeded \n in ABSTRACT and <> in AUTHOR + Branch: maint-5.005/perl + ! lib/ExtUtils/MM_Unix.pm + ____________________________________________________________________________ + [ 2302] By: gbarr on 1998/11/26 15:27:03 + Log: integrate changes#2177,2189,2228,2229 from cfgperl + + 0**0 = 1, from + + From: d-lewart@uiuc.edu (Daniel S. Lewart) + Subject: Math::Complex 0**0 patches + Date: Sun, 1 Nov 1998 19:21:48 -0600 (CST) + Message-Id: <199811020121.TAA28310@staff2.cso.uiuc.edu> + + sysio.t failure: fix undefined order of evaluation, from + + From: Spider Boardman + Subject: Not OK: perl 5.00553 on alpha-thread 5.0 [PATCH] + Date: 4 Nov 1998 01:22:30 +0200 + Message-ID: + + From: "Martin J. Bligh" + Message-ID: <187803647.910720870@w-186d219.rhe.sequent.com> + Subject: Re: Making Perl work on DYNIX/ptx + Date: Tue, 10 Nov 1998 18:01:10 -0800 + + From: "Martin J. Bligh" + Subject: Re: Making Perl work on DYNIX/ptx + Date: Tue, 10 Nov 1998 16:24:26 -0800 + Message-ID: <181999655.910715066@w-186d219.rhe.sequent.com> + Branch: maint-5.005/perl + +> ext/DB_File/hints/dynixptx.pl ext/POSIX/hints/dynixptx.pl + ! pp_sys.c + !> hints/dynixptx.sh lib/Math/Complex.pm t/lib/complex.t + ____________________________________________________________________________ + [ 2297] By: gbarr on 1998/11/24 02:32:38 + Log: integrate change#2266 from cfgperl + From: John Tobey + Subject: [PATCH] perlfaq typos + To: perl5-porters@perl.com + Date: 22 Nov 1998 04:25:15 +0200 + Message-ID: + Branch: maint-5.005/perl + !> pod/perlfaq3.pod pod/perlfaq4.pod pod/perlfaq5.pod + !> pod/perlfaq7.pod pod/perlfaq8.pod + ____________________________________________________________________________ + [ 2296] By: gbarr on 1998/11/24 01:39:18 + Log: integrated changes#2011,2092,2106,2108,2143 from cfgperl + + More robust yacc/bison failure output handling. + + More robustness. + + Bison says 'parse error', not 'parser error'. + + The "parse error" must be converted to "syntax error", + just matching it aint' enough. + + There can be multiple yacc/bison errors. + Branch: maint-5.005/perl + !> t/comp/require.t t/op/misc.t t/pragma/subs.t + !> t/pragma/warning.t + ____________________________________________________________________________ + [ 2295] By: gbarr on 1998/11/24 00:49:28 + Log: integrate change#1823 from mainline + From: Joe Buehler + Date: 29 Aug 1998 17:13:28 -0400 + Message-ID: + Subject: patches for perl 5.005_51 under U/WIN + Branch: maint-5.005/perl + +> hints/uwin.sh + ! Configure + !> installman makedepend.SH t/lib/posix.t + ____________________________________________________________________________ + [ 2258] By: gbarr on 1998/11/21 20:48:02 + Log: Another Configure patch from Jarkko + Branch: maint-5.005/perl + ! Configure + ____________________________________________________________________________ + [ 2257] By: gbarr on 1998/11/21 17:23:13 + Log: Big Configure patch from Jarkko Hietaniemi via + private mail + Branch: maint-5.005/perl + ! Configure Makefile.SH config_h.SH hints/dec_osf.sh + ! hints/freebsd.sh hints/irix_6.sh hints/linux.sh + ! hints/next_3.sh hints/os390.sh pp_sys.c + ____________________________________________________________________________ + [ 2239] By: gbarr on 1998/11/14 03:59:58 + Log: more doc changes from mainline + Branch: maint-5.005/perl + ! pod/perldiag.pod pod/perlfunc.pod pod/perlre.pod + !> INSTALL README.vms vms/ext/Stdio/Stdio.pm + ____________________________________________________________________________ + [ 2238] By: gbarr on 1998/11/14 02:51:51 + Log: integrate doc changes from mainline, including + changes#1796,1811,1830,1831,1844,1846,1876,1905,2149,2152 + Branch: maint-5.005/perl + !> README.os390 pod/perl.pod pod/perldelta.pod pod/perlfaq1.pod + !> pod/perlform.pod pod/perlfunc.pod pod/perlguts.pod + !> pod/perlipc.pod pod/perllocale.pod pod/perlport.pod + !> pod/perlref.pod pod/perlrun.pod pod/perlvar.pod pod/perlxs.pod + !> pod/pod2man.PL + ____________________________________________________________________________ + [ 2237] By: gbarr on 1998/11/14 02:51:49 + Log: integrate change#1847 from mainline + From: Roderick Schertler + Date: Wed, 09 Sep 1998 23:52:48 -0400 + Message-ID: <20567.905399568@eeyore.ibcinc.com> + Subject: seed srand from /dev/urandom when possible + Branch: maint-5.005/perl + ! pp.c + ____________________________________________________________________________ + [ 2232] By: gbarr on 1998/11/13 03:12:37 + Log: integrate change#2215 from mainline + set close-on-exec bit on pipe() FDs + Branch: maint-5.005/perl + ! pod/perlfunc.pod pod/perlvar.pod pp_sys.c + ____________________________________________________________________________ + [ 2231] By: gbarr on 1998/11/13 02:16:03 + Log: integrate change#2188 from mainline + fix return value of win32_pclose() + Branch: maint-5.005/perl + !> win32/win32.c + ____________________________________________________________________________ + [ 2218] By: gbarr on 1998/11/08 16:48:44 + Log: From: Graham Barr + Date: Mon, 2 Nov 1998 07:38:52 -0600 + Message-ID: <19981102073852.A12751@asic.sc.ti.com> + Subject: [PATCH 5.005_*] Re: IPC::Msg 1.03 + Branch: maint-5.005/perl + ! ext/IPC/SysV/Msg.pm + ____________________________________________________________________________ + [ 2217] By: gbarr on 1998/11/08 05:22:39 + Log: fix changes in 2213 not to break binary compat + Branch: maint-5.005/perl + ! pp_ctl.c proto.h + ____________________________________________________________________________ + [ 2216] By: gbarr on 1998/11/08 04:21:01 + Log: integrate change#2192 from mainline + indeterminate order-of-evaluation fixes + Branch: maint-5.005/perl + ! mg.c + ____________________________________________________________________________ + [ 2213] By: gbarr on 1998/11/08 00:39:44 + Log: integrate change#2051 from mainline + properly restore PL_rsfp_filters after require + Branch: maint-5.005/perl + ! embed.h global.sym objXSUB.h objpp.h pp_ctl.c proto.h scope.c + ! scope.h + ____________________________________________________________________________ + [ 2212] By: gbarr on 1998/11/07 23:13:29 + Log: integrate changes#1914,1925,1926,1945,1956,1987 from mainline + + normalize tm struct passed to strftime() with mktime() + From: Spider Boardman + Date: Wed, 30 Sep 1998 15:12:09 -0400 + Message-Id: <199809301912.PAA26119@Orb.Nashua.NH.US> + Subject: [PATCH 5.005_52] Re: POSIX::strftime returns incorrect date + + disable USE_THREADS when PERL_OBJECT is enabled + + From: Mark-Jason Dominus + Date: Sun, 04 Oct 1998 14:48:11 -0400 + Message-ID: <19981004184811.16048.qmail@plover.com> + Subject: PATCH: perldoc -f does not locate -e, -r, -x, etc. + + defer "deep recursion" warnings until CXt_SUB context is properly + set up + + Mutexen should be initialized only once. + + perldoc pod update + From: Daniel Grisinger + Date: 06 Oct 1998 23:56:51 -0600 + Message-ID: + Subject: [PATCH _02 and _52] perldoc + Branch: maint-5.005/perl + ! gv.c op.c pp_hot.c + !> ext/POSIX/POSIX.pod ext/POSIX/POSIX.xs utils/perldoc.PL + !> win32/Makefile win32/makefile.mk + ____________________________________________________________________________ + [ 2207] By: gbarr on 1998/11/06 01:36:17 + Log: integrate changes#1912,1948 from mainline + change warning about glob process failure + Branch: maint-5.005/perl + ! pod/perldiag.pod pp_hot.c + ____________________________________________________________________________ + [ 2200] By: gbarr on 1998/11/05 04:26:26 + Log: integrate changes#1840,1855,1860,1882,1884,1891,1900,1907 from mainline + pl2bat tweak from Tye McQueen + + reset errno after C search (as suggested by Larry) + + upgrade to CPAN-1.40 + + missing file in last submit (1881) + + temporarily disable perl malloc for a2p until we clean up + conflicting malloc() declarations everywhere + + Fixed apostrophe problem from Mark Knutsen. + + use SETERRNO() to reset errno (suggested by Charles Bailey) + + applied patches, but retained old behavior for win32 (where compilers + can't read from stdin at all) + From: Graham Barr + Date: Mon, 28 Sep 1998 09:41:49 -0500 + Message-ID: <19980928094149.B26576@asic.sc.ti.com> + Subject: Re: 5.005_51 Errno invokes cpprun incorrectly + -- + Date: Tue, 29 Sep 1998 12:35:43 -0500 + Message-ID: <19980929123543.Z26576@asic.sc.ti.com> + Subject: Re: 5.005_51 Errno invokes cpprun incorrectly + + and ext/Errno/Errno_pm.PL from change#2050 + Branch: maint-5.005/perl + ! perl.h pp_ctl.c proto.h sv.h + !> ext/Errno/Errno_pm.PL lib/CPAN.pm lib/CPAN/FirstTime.pm + !> win32/bin/pl2bat.pl x2p/Makefile.SH + ____________________________________________________________________________ + [ 2199] By: gbarr on 1998/11/05 03:35:00 + Log: integrate changes#1817,1856,1869,1909 from mainline + updated usethreads hints for hpux 10.X + From: Matthew T Harden + Date: Fri, 28 Aug 1998 14:10:42 GMT + Message-Id: <199808281410.AA11058@mthard1.monsanto.com> + Subject: Re: OK: perl 5.00502 on PA-RISC1.1-thread 10.20 (UNINSTALLED) + + update hints for OPENSTEP 4.2 on i386 + From: Gerben Wierda + Date: Sun, 20 Sep 1998 01:03:18 +0200 + Message-Id: <9809192303.AA29190@Spike> + Subject: Perl 5.005_02 compilation problems + + use STRICT_ALIGNMENT on IRIX to allow usemymalloc=y again + From: Scott Henry + Date: 13 Aug 1998 09:52:15 PDT + Message-Id: + Subject: [PATCH] Irix USE_LONG_LONG/malloc.c incompatibility (was...) + + update SCO hints for dynamic loading + From: Andy Dougherty + Date: Mon, 28 Sep 1998 16:50:38 -0400 (EDT) + Message-Id: + Subject: [PATCH 5.004_04-MAINT_TRIAL_5 and 5.005_xx] Re: Perl on SCO_SV + -- + Date: Tue, 29 Sep 1998 16:48:55 -0400 (EDT) + Message-Id: + Subject: Re: [PATCH 5.004_04-MAINT_TRIAL_5 and 5.005_xx] Re: Perl on SCO_SV + Branch: maint-5.005/perl + !> hints/hpux.sh hints/irix_6.sh hints/next_4.sh hints/sco.sh + ____________________________________________________________________________ + [ 2198] By: gbarr on 1998/11/05 03:00:51 + Log: integrate OS2 changes from mainline, change#1836,1930,1996,2063 + and os2/os2,c from #2145 + + From: Ilya Zakharevich + Date: Sat, 5 Sep 1998 00:14:51 -0400 (EDT) + Message-Id: <199809050414.AAA19801@monk.mps.ohio-state.edu> + Subject: [PATCH 5.005_*] OS/2 spawning typos + + From: Ilya Zakharevich + Message-Id: <199810050637.CAA07781@monk.mps.ohio-state.edu> + Date: Mon, 5 Oct 1998 02:37:43 -0400 (EDT) + Subject: [PATCH 5.005_52] Cumulative OS/2-related patch + + From: Ilya Zakharevich + Date: Tue, 13 Oct 1998 04:46:00 -0400 (EDT) + Message-Id: <199810130846.EAA00769@monk.mps.ohio-state.edu> + Subject: [PATCH 5.005_52] Memory overrun in os2.c + + From: Ilya Zakharevich + Date: Sun, 18 Oct 1998 23:20:57 -0400 (EDT) + Message-Id: <199810190320.XAA28249@monk.mps.ohio-state.edu> + Subject: [PATCH 5.005_*] Improve sbrk() on OS/2 + + remaining PL_foo stragglers + Branch: maint-5.005/perl + ! mg.c perl_exp.SH util.c + !> hints/os2.sh os2/Changes os2/Makefile.SHs os2/os2.c + ____________________________________________________________________________ + [ 2197] By: gbarr on 1998/11/05 02:15:53 + Log: integrate changes#1826,1862 from mainline + + From: Jarkko Hietaniemi + Date: Wed, 12 Aug 1998 22:41:37 +0300 (EET DST) + Message-Id: <199808121941.WAA06263@alpha.hut.fi> + Subject: [PATCH] 5.004_50 or 5.005_02: get rid of interp.sym because not even AIX needs it + + remove bogus warn() + Branch: maint-5.005/perl + - interp.sym + ! MANIFEST Makefile.SH embed.pl perl_exp.SH + ____________________________________________________________________________ + [ 2194] By: gbarr on 1998/11/05 01:26:46 + Log: integarte malloc.c changes from mainline change#1807,2112,2133 + Branch: maint-5.005/perl + !> malloc.c + ____________________________________________________________________________ + [ 2193] By: gbarr on 1998/11/05 01:25:31 + Log: integrate changes#1763,1778,1801,1804 from mainline + + From: Stephen McCamant + Date: Sun, 2 Aug 1998 16:33:18 -0500 (CDT) + Message-ID: <13764.55116.921952.837027@alias-2.pr.mcs.net> + Subject: [PATCH] Eliminate superfluous RV2p[AH]Vs in oops[AH]V() + + Implicit require during compile reset line numbering + + silence redefined warning for XS(INIT) {} + + From: Laszlo Molnar + Date: Sun, 9 Aug 1998 22:38:23 +0200 + Message-ID: <19980809223823.A215@cdata.tvnet.hu> + Subject: [PATCH 5.5002] dos-djgpp update + Branch: maint-5.005/perl + ! op.c pp_ctl.c + !> t/io/fs.t + ____________________________________________________________________________ + [ 2176] By: gbarr on 1998/11/02 04:51:48 + Log: integrate change#2030 from mainline + + fix handling of mayhaps-extended @_ in goto &sub + Branch: maint-5.005/perl + ! av.c pp_ctl.c + !> t/op/goto.t + ____________________________________________________________________________ + [ 2175] By: gbarr on 1998/11/02 04:32:02 + Log: integrate chnage#1934,1935 from mainline + fix USE_THREADS coredump due to uninitialized PL_hv_fetch_ent_mh + add test for previous fix + Branch: maint-5.005/perl + ! util.c + !> ext/Thread/create.t + ____________________________________________________________________________ + [ 2174] By: gbarr on 1998/11/02 04:22:20 + Log: integrate change#1863,1881 from mainline + + provide locked access to string table for USE_THREADS + + serial access to PL_x[inpr]v_root for USE_THREADS + Branch: maint-5.005/perl + ! embedvar.h objXSUB.h perl.c proto.h sv.c + !> hv.c intrpvar.h thread.h + ____________________________________________________________________________ + [ 2173] By: gbarr on 1998/11/02 04:10:46 + Log: integrate change#1990 from mainline + + provide option to enable optimization with VC (suggested by Jan + Dubois) + Branch: maint-5.005/perl + !> win32/Makefile win32/makefile.mk + ____________________________________________________________________________ + [ 2172] By: gbarr on 1998/11/02 02:52:29 + Log: integrate changes#1944,1948,1966 from mainline + + change#1614 merely disabled earlier fix (doh!); undo it and properly + fixup the cop_seq value that must be seen by lexical lookups that + emanate within eval'' + + tweak to make fix in change#1944 behave correctly for closures + created within eval'' + Branch: maint-5.005/perl + ! op.c pp_ctl.c pp_hot.c scope.c + !> cop.h t/op/eval.t + ____________________________________________________________________________ + [ 2171] By: gbarr on 1998/11/01 03:59:39 + Log: integrate changes 1835,2003,2067 and File::Find change in 1938 + warn on C + + silence -w noises (suggested by Greg Bacon) Term::Complete + + From: jan.dubois@ibm.net (Jan Dubois) + Date: Wed, 21 Oct 1998 00:55:51 +0200 + Message-ID: <36380269.55370608@smtp1.ibm.net> + Subject: Make _really_ sure Dynaloader.xs code is initialized only once + Branch: maint-5.005/perl + ! op.c pod/perldiag.pod + !> ext/DynaLoader/DynaLoader_pm.PL lib/File/Find.pm + !> lib/Term/Complete.pm + ____________________________________________________________________________ + [ 2170] By: gbarr on 1998/11/01 03:48:38 + Log: integrate change 1992 from mainline + + applied suggested patch with small doc tweak + From: Gisle Aas + Date: 11 Oct 1998 12:53:13 +0200 + Message-ID: + Subject: Re: [PATCH 5.005_52] Optional syswrite LENGTH argument + Branch: maint-5.005/perl + ! pod/perlfunc.pod pp_sys.c + !> opcode.h opcode.pl t/op/sysio.t t/op/tiehandle.t + ____________________________________________________________________________ + [ 2168] By: gbarr on 1998/11/01 01:58:58 + Log: From: jan.dubois@ibm.net (Jan Dubois) + Date: Fri, 09 Oct 1998 23:28:31 +0200 + Message-ID: <36217b7f.3193091@smtp1.ibm.net> + Subject: [PATCH 5.005_02] Allow XS access to vtbl_*s when compiled with PERL_OBJECT + Branch: maint-5.005/perl + ! XSUB.h + ____________________________________________________________________________ + [ 2167] By: gbarr on 1998/11/01 01:22:41 + Log: integrate change#2029 from mainline + restore sanity to "constant" references + Branch: maint-5.005/perl + ! op.c pod/perldiag.pod + !> lib/constant.pm t/pragma/constant.t + ____________________________________________________________________________ + [ 2166] By: gbarr on 1998/11/01 01:04:24 + Log: integrate changes#1895,1896,2066,2147,2148 from mainline + fix win32_stat() to do the right thing for share names + + small tweak on last change + + recognize '%' as a shell metachar for win32 + From: jan.dubois@ibm.net (Jan Dubois) + Date: Tue, 20 Oct 1998 21:57:35 +0200 + Message-ID: <3636ea31.49170453@smtp1.ibm.net> + Subject: [PATCH 5.005_02, Win32] Re: %ENV% not expanded in backquotes? + + tweaked version of suggested patch + From: Anton Berezin + Date: 29 Oct 1998 14:48:54 +0100 + Message-ID: <86yapzv5q1.fsf@lion.plab.ku.dk> + Subject: [PATCH 5.005_52] One more problem with win32_stat and MSVC + + From: Anton Berezin + Date: 29 Oct 1998 17:06:25 +0100 + Message-ID: <86pvbbuzcu.fsf@lion.plab.ku.dk> + Subject: [PATCH 5.005_52] win32_opendir() fails on empty drives + Branch: maint-5.005/perl + !> win32/win32.c + ____________________________________________________________________________ + [ 2165] By: gbarr on 1998/11/01 00:10:15 + Log: integrated changes#1941,1942,1943,1975,2061,2111,2151 from mainline + + don't longjmp() in pp_goto() (regressive bug from old single-stack + implementation) + + force copy of substrings when matching against temporaries + + ensure recursive attempts to findlex()icals know enough about where + the last eval'' context was encountered + + propagate typeness of lexicals while cloning them + + From: Graham Barr + Date: Sat, 17 Oct 1998 22:22:02 -0500 + Message-ID: <19981017222202.J510@pobox.com> + Subject: Re: '*' prototype does not allow bareword with strict + + smarter C<$SIG{FOO} = BAREWORD;> warning + + From: Mark-Jason Dominus + Date: Fri, 30 Oct 1998 14:24:23 EST + Message-Id: <19981030192423.27276.qmail@plover.com> + Subject: PATCH: (5.005_02) a2p should use `chomp' instead of `chop' + Branch: maint-5.005/perl + ! op.c pp_ctl.c pp_hot.c t/op/pat.t toke.c + !> t/op/eval.t t/op/runlevel.t x2p/walk.c + ____________________________________________________________________________ + [ 2158] By: gbarr on 1998/10/31 05:03:02 + Log: integrate changes#1821 & 1857 from mainline + + s/runops/CALLRUNOPS/ + + From: Ilya Zakharevich + Date: Tue, 22 Sep 1998 17:30:16 -0400 (EDT) + Message-Id: <199809222130.RAA17034@monk.mps.ohio-state.edu> + Subject: More verbose Test::Harness [PATCH] + Branch: maint-5.005/perl + !> cc_runtime.h lib/Test/Harness.pm + ____________________________________________________________________________ + [ 2157] By: gbarr on 1998/10/31 02:35:07 + Log: integrate change#1839 from mainline + From: Drago Goricanec + Date: Mon, 7 Sep 1998 17:36:09 +0900 + Message-Id: <199809070836.RAA14631@raptor.otsd.ts.fujitsu.co.jp> + Subject: Thread::cond_wait bug in 5.005.51 causes deadlock + Branch: maint-5.005/perl + ! ext/Thread/Thread.xs + ____________________________________________________________________________ + [ 2156] By: gbarr on 1998/10/31 02:22:11 + Log: integrate change#1829 from mainline + fix problematic typecast in filter_del() + From: Mark P Lutz + Date: Mon, 31 Aug 1998 21:13:11 GMT + Message-Id: <199808312113.VAA53356@triton.ca.boeing.com> + Subject: perl5.005_02 does not build on Cray T90 + Branch: maint-5.005/perl + ! toke.c + ____________________________________________________________________________ + [ 2155] By: gbarr on 1998/10/31 01:59:08 + Log: integrate chnages#1824,2118 from mainline + From: Ilya Zakharevich + Date: Sat, 29 Aug 1998 17:38:30 -0400 (EDT) + Message-Id: <199808292138.RAA18359@monk.mps.ohio-state.edu> + Subject: [PATCH 5.005_*] Protect debugger from nonlocal exits + + From: Ilya Zakharevich + Date: Wed, 28 Oct 1998 01:23:27 -0500 (EST) + Message-Id: <199810280623.BAA06968@monk.mps.ohio-state.edu> + Subject: [PATCH 5.00552] Minor debugger tweaks + Branch: maint-5.005/perl + !> lib/perl5db.pl + ____________________________________________________________________________ + [ 2154] By: gbarr on 1998/10/31 01:06:35 + Log: integrate all lib/ExtUtils/... changes from mainline + Branch: maint-5.005/perl + !> lib/ExtUtils/MM_OS2.pm lib/ExtUtils/MM_Unix.pm + !> lib/ExtUtils/MM_VMS.pm lib/ExtUtils/MM_Win32.pm + !> lib/ExtUtils/MakeMaker.pm lib/ExtUtils/Mkbootstrap.pm + !> lib/ExtUtils/Mksymlists.pm lib/ExtUtils/xsubpp + ____________________________________________________________________________ + [ 2139] By: gbarr on 1998/10/30 04:17:53 + Log: apply chnage#2071 from mainline + From: Graham Barr + Date: Sat, 17 Oct 1998 20:42:41 -0500 + Message-ID: <19981017204241.G510@pobox.com> + Subject: Re: taint checking for: use lib "$ENV{'EVIL'}" + Branch: maint-5.005/perl + ! pp_ctl.c + ____________________________________________________________________________ + [ 2138] By: gbarr on 1998/10/30 04:14:35 + Log: apply change#2077 from mainline + From: Graham Barr + Date: Sat, 24 Oct 1998 21:45:50 -0500 + Message-ID: <19981024214550.C508@pobox.com> + Subject: Re: die with a reference should use overload "" operator + Branch: maint-5.005/perl + ! pp_ctl.c + ____________________________________________________________________________ + [ 2137] By: gbarr on 1998/10/30 04:01:06 + Log: integrate change#1937 from mainline + fix $/ init for USE_THREADS + Branch: maint-5.005/perl + ! perl.c + ____________________________________________________________________________ + [ 2136] By: gbarr on 1998/10/30 03:40:55 + Log: apply change#2076 from mainline + From: Graham Barr + Date: Sat, 24 Oct 1998 12:45:21 -0500 + Message-ID: <19981024124521.C512@pobox.com> + Subject: [PATCH 5.005_02] Re: Auto-incrementing tied scalar causes SEGV + Branch: maint-5.005/perl + ! sv.c + ____________________________________________________________________________ + [ 2135] By: gbarr on 1998/10/30 03:28:29 + Log: integrate change#1873 from mainline + From: Ilya Zakharevich + Date: Tue, 25 Aug 1998 04:29:49 -0400 (EDT) + Message-Id: <199808250829.EAA02470@monk.mps.ohio-state.edu> + Subject: [PATCH 5.005_*] Extraneous warning for (?()A|B) + Branch: maint-5.005/perl + ! regcomp.c + ____________________________________________________________________________ + [ 2134] By: gbarr on 1998/10/30 03:15:12 + Log: integrate change#1816 from mainline + don't create empty directories in installperl + From: Robin Barker + Date: Fri, 21 Aug 1998 11:29:24 +0100 (BST) + Message-Id: <199808211029.LAA00551@cyclone.cise.npl.co.uk> + Subject: [PATCH 5.005_02] install: empty dirs + Branch: maint-5.005/perl + !> installperl + ____________________________________________________________________________ + [ 2132] By: gbarr on 1998/10/30 01:39:00 + Log: integrate changes#1815 & 1828 from mainline + make behavior of /(a{3})+/ like /(aaa)+/ w.r.t where it matches + From: Ilya Zakharevich + Date: Fri, 21 Aug 1998 05:41:02 -0400 (EDT) + Message-Id: <199808210941.FAA16467@monk.mps.ohio-state.edu> + Subject: Re: your mail + + From: Ilya Zakharevich + Date: Mon, 31 Aug 1998 14:52:10 -0400 (EDT) + Message-Id: <199808311852.OAA24676@monk.mps.ohio-state.edu> + Subject: [PATCH 5.005_5*] (?>) broken in RE + Branch: maint-5.005/perl + ! regexec.c + !> t/op/re_tests + ____________________________________________________________________________ + [ 2131] By: gbarr on 1998/10/30 01:09:19 + Log: integrate change#1947 from mainline + let docatch() pass the buck when restartop turns out to be null, + making exceptions in BEGIN{} propagate as expected + Branch: maint-5.005/perl + ! pp_ctl.c + !> t/op/misc.t + ____________________________________________________________________________ + [ 2129] By: gbarr on 1998/10/29 14:53:11 + Log: integrate change#1810 from mainline + fix bogus integerization of pop()'s return value + From: Gurusamy Sarathy + Date: Sat, 15 Aug 1998 23:27:54 -0400 + Message-Id: <199808160327.XAA05186@aatma.engin.umich.edu> + Subject: Re: Complex expression does integer arithmetic + Branch: maint-5.005/perl + !> opcode.h opcode.pl + ____________________________________________________________________________ + [ 2128] By: gbarr on 1998/10/29 14:28:13 + Log: integrate change#1870 from mainline + From: Dan Sugalski + Date: Fri, 14 Aug 1998 09:20:16 PDT + Message-Id: <3.0.5.32.19980814092016.00b37dc0@ous.edu> + Subject: [PATCH 5.005_02] (and _5x I expect) VMS config procedure patch + Branch: maint-5.005/perl + !> configure.com + ____________________________________________________________________________ + [ 2127] By: gbarr on 1998/10/29 13:36:29 + Log: Integrate change#1789 from mainline + delay freeing itervar so C works + Branch: maint-5.005/perl + !> cop.h t/cmd/for.t + ____________________________________________________________________________ + [ 2123] By: gbarr on 1998/10/29 02:43:01 + Log: Apply change#2075 from mainline + fix C etc. + Branch: maint-5.005/perl + ! toke.c + ____________________________________________________________________________ + [ 2122] By: gbarr on 1998/10/29 02:40:31 + Log: Apply change#2070 from mainline + avoid bogus line number in XSUB redefined warnings + Branch: maint-5.005/perl + ! op.c + ____________________________________________________________________________ + [ 2121] By: gbarr on 1998/10/29 02:38:59 + Log: Apply change#2052 from mainline + avoid the circular refcnt logic in magic_mutexfree() + Branch: maint-5.005/perl + ! mg.c pp.c pp_hot.c + ____________________________________________________________________________ + [ 2120] By: gbarr on 1998/10/29 02:36:23 + Log: Remove "5.005" hard-coded and expose vtbl_* from the perl DLL + From: "Douglas Lankshear" + Date: Mon, 28 Sep 1998 08:49:13 -0700 + Message-ID: <000001bdeaf7$8a189350$a32fa8c0@tau.Active> + Subject: PATCH [5.005_02] update + Branch: maint-5.005/perl + ! embed.h global.sym objXSUB.h objpp.h perl.h proto.h util.c + ! win32/win32.c + ____________________________________________________________________________ + [ 2084] By: gbarr on 1998/10/25 19:09:11 + Log: Integrate change#2069 from mainline + From: Martijn Koster + Date: Wed, 21 Oct 1998 13:12:03 +0100 + Message-ID: <19981021131203.A15661@excitecorp.com> + Subject: File::Path::mkpath reports the wrong error + Branch: maint-5.005/perl + !> lib/File/Path.pm + ____________________________________________________________________________ + [ 2083] By: gbarr on 1998/10/25 18:48:39 + Log: Integrate change#1965 from mainline + use better numbers for exitstatus test + Branch: maint-5.005/perl + !> t/op/die_exit.t + ____________________________________________________________________________ + [ 2082] By: gbarr on 1998/10/25 18:22:54 + Log: Apply change 2054 from mainline + disallow 'x' in hex numbers (except leading '0x') + From: Gisle Aas + Date: 16 Oct 1998 16:33:12 +0200 + Message-ID: + Subject: Re: [PATCH 5.005_52] 'x' is not a legal hex digit + Branch: maint-5.005/perl + ! perlvars.h util.c + !> t/op/oct.t + ____________________________________________________________________________ + [ 2081] By: gbarr on 1998/10/25 17:58:04 + Log: Apply change #1998 from mainline + skip readonly vars and unref references when doing a reset() + Branch: maint-5.005/perl + ! sv.c + ____________________________________________________________________________ + [ 2080] By: gbarr on 1998/10/25 16:06:35 + Log: Integrate changes #2072 & #1993 from mainline + fix bug in B::CC::pp_sassign() + From: "vishal bhatia" + Date: Sun, 11 Oct 1998 18:41:38 PDT + Message-ID: <19981012014139.19614.qmail@hotmail.com> + Subject: B::CC problems with pp_sassign routine + implement C and other fixes (via private mail) + From: "vishal bhatia" + Date: Wed, 21 Oct 1998 22:59:03 PDT + Message-Id: <19981022055904.20083.qmail@hotmail.com> + Subject: [PATCH 5.005_52] More fixes for B + Branch: maint-5.005/perl + !> ext/B/B.pm ext/B/B.xs ext/B/B/C.pm ext/B/B/CC.pm + ____________________________________________________________________________ + [ 2079] By: gbarr on 1998/10/25 14:08:00 + Log: integrate from mainline more FSF address changes + Branch: maint-5.005/perl + !> Copying ext/B/README lib/Getopt/Long.pm + ____________________________________________________________________________ + [ 2053] By: gbarr on 1998/10/25 04:56:47 + Log: From: Graham Barr + Date: Sat, 17 Oct 1998 23:05:18 -0500 + Message-ID: <19981017230518.K510@pobox.com> + Subject: Re: redo LOOP not restoring $` $' $& + Branch: maint-5.005/perl + ! cop.h t/cmd/while.t + ____________________________________________________________________________ + [ 2048] By: gbarr on 1998/10/24 04:20:10 + Log: Change Free Software Foundation address in README + Branch: maint-5.005/perl + !> README + ____________________________________________________________________________ + [ 2047] By: gbarr on 1998/10/24 04:02:20 + Log: Remove #ifdef DEBUGGING around SvTEMP_off + From: Gurusamy Sarathy + Date: Mon, 28 Sep 1998 15:23:39 -0400 + Message-Id: <199809281923.PAA10303@aatma.engin.umich.edu> + Subject: Re: [PATCH] Re: 5.005_52: the miniperl coredump: touch magic and you're toast + Branch: maint-5.005/perl + ! scope.c + ____________________________________________________________________________ + [ 2046] By: gbarr on 1998/10/24 04:00:54 + Log: use cpp symbols instead of hardwired constants + From: Hugo van der Sanden + Date: Mon, 05 Oct 1998 09:23:33 +0100 + Message-Id: <199810050823.JAA00891@crypt.compulink.co.uk> + Subject: [PATCH 5.005_52] By the numbers (resend) + Branch: maint-5.005/perl + ! op.c + ____________________________________________________________________________ + [ 2045] By: gbarr on 1998/10/24 03:50:25 + Log: squelch undef warnings + From: Hugo van der Sanden + Date: Fri, 02 Oct 1998 11:01:14 +0100 + Message-Id: <199810021001.LAA19214@crypt.compulink.co.uk> + Subject: [PATCH] Re: Apparent bug in Math::BigInt + Branch: maint-5.005/perl + !> lib/Math/BigInt.pm + ____________________________________________________________________________ + [ 2044] By: gbarr on 1998/10/24 03:47:24 + Log: Add note to INSTALL about ANSI C + Branch: maint-5.005/perl + ! INSTALL + ____________________________________________________________________________ + [ 2043] By: gbarr on 1998/10/24 02:38:12 + Log: make C AUTOLOAD-aware (autouse now works for modules + that are autoloaded) + From: Gurusamy Sarathy + Date: Thu, 24 Sep 1998 03:01:01 -0400 + Message-Id: <199809240701.DAA16223@aatma.engin.umich.edu> + Subject: Re: autouse and Getopt::Long don't work together anymore + Branch: maint-5.005/perl + ! pp_ctl.c t/op/goto.t + ____________________________________________________________________________ + [ 2042] By: gbarr on 1998/10/24 02:16:26 + Log: From: jarkko.hietaniemi@research.nokia.com (Jarkko Hietaniemi) + Date: Wed, 12 Aug 1998 15:42:35 +0300 + Message-Id: <199808121242.PAA29761@comanche.spices> + Subject: [PATCH] 5.004_02 or 5.005_51: fix regexp and tr character ranges in non-ASCII lands + Branch: maint-5.005/perl + + t/op/tr.t + ! MANIFEST perl.h pod/perllocale.pod pod/perlop.pod + ! pod/perlre.pod regcomp.c t/pragma/locale.t toke.c + ____________________________________________________________________________ + [ 2021] By: gbarr on 1998/10/20 01:25:23 + Log: From: Chip Salzenberg + Date: Tue, 6 Oct 1998 13:33:05 -0400 + Message-ID: <19981006133305.A2348@perlsupport.com> + Subject: [PATCH] 5.005_02: Eliminate leak on self-ties + Branch: maint-5.005/perl + ! av.c doop.c hv.c mg.c mg.h pp.c pp_hot.c pp_sys.c scope.c + ! t/op/tie.t + ____________________________________________________________________________ + [ 2015] By: gbarr on 1998/10/17 21:49:56 + Log: make h2xs generate ANSI prototypes + Branch: maint-5.005/perl + !> utils/h2xs.PL + ____________________________________________________________________________ + [ 2014] By: gbarr on 1998/10/17 20:31:42 + Log: Fix POSIX::sigprocmask not to check type of $old parameter + as it is output only + Branch: maint-5.005/perl + ! ext/POSIX/POSIX.xs + ____________________________________________________________________________ + [ 2013] By: gbarr on 1998/10/17 17:51:16 + Log: From: "Kurt D. Starsinic" + Date: Thu, 20 Aug 1998 20:59:03 -0400 + Message-ID: <19980820205903.A12908@O2.chapin.edu> + Subject: [PATCH] h2ph misquotes #error directives + + fix h2ph handling of C<#error "foo"> + From: SAKAI Kiyotaka + Date: Thu, 10 Sep 1998 09:59:33 +0900 + Message-Id: <19980910095933N.ksakai@netwk.ntt-at.co.jp> + Subject: [5.005_02] h2ph problem + Branch: maint-5.005/perl + !> t/lib/h2ph.pht utils/h2ph.PL + ____________________________________________________________________________ + [ 1985] By: gbarr on 1998/10/17 00:41:40 + Log: s/last/first/ typo in append_list() + Branch: maint-5.005/perl + ! op.c + ____________________________________________________________________________ + [ 1984] By: gbarr on 1998/10/17 00:36:51 + Log: From: "Green, Paul" + Date: Thu, 10 Sep 1998 00:02:07 -0400 + Message-ID: <646CD0392810D211B04A00A024BF26FB1022EB@terminator.sw.stratus.com> + Subject: RE: [PATCH] 5.005_02 and 5.005_51: Stratus VOS port + Branch: maint-5.005/perl + + README.vos vos/Changes vos/build.cm vos/compile_perl.cm + + vos/config.h vos/config_h.SH_orig vos/perl.bind + + vos/test_vos_dummies.c vos/vos_dummies.c vos/vosish.h + ! MANIFEST perl.c perl.h pod/perlport.pod + ____________________________________________________________________________ + [ 1983] By: gbarr on 1998/10/17 00:23:31 + Log: define PUT_svindex(), PUT_opindex() + Branch: maint-5.005/perl + !> ext/B/B/Assembler.pm + ____________________________________________________________________________ + [ 1982] By: gbarr on 1998/10/17 00:20:57 + Log: From: Jochen Wiedmann + Date: Thu, 17 Sep 1998 17:16:06 +0200 + Message-ID: <360127B6.E44564A@ispsoft.de> + Subject: [PATCH] ExtUtils::MakeMaker::prompt cannot return 0 + Branch: maint-5.005/perl + ! lib/ExtUtils/MakeMaker.pm + ____________________________________________________________________________ + [ 1981] By: gbarr on 1998/10/16 02:58:10 + Log: better CR-handling on shebang line and in formats (fixed variant of + patch suggested by Igor Sysoev ) + Branch: maint-5.005/perl + ! perl.c toke.c + ____________________________________________________________________________ + [ 1980] By: gbarr on 1998/10/16 02:21:57 + Log: From: Roderick Schertler + Date: 11 Sep 1998 16:19:21 -0400 + Message-ID: + Subject: Re: Open2 and memory leaks + Branch: maint-5.005/perl + !> lib/IPC/Open3.pm + ____________________________________________________________________________ + [ 1979] By: gbarr on 1998/10/16 02:15:54 + Log: integrate change #1908 from mainline + Branch: maint-5.005/perl + !> lib/File/Find.pm + ____________________________________________________________________________ + [ 1977] By: gbarr on 1998/10/16 01:52:46 + Log: tests missing from change #1794 + Branch: maint-5.005/perl + ! t/op/re_tests + ____________________________________________________________________________ + [ 1794] By: gbarr on 1998/09/20 15:59:20 + Log: From: Ilya Zakharevich + Date: Tue, 11 Aug 1998 18:43:29 -0400 (EDT) + Message-Id: <199808112243.SAA14243@monk.mps.ohio-state.edu> + Subject: Re: Segmentation fault for /a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz/ + Branch: maint-5.005/perl + ! regcomp.c t/op/re_tests + ____________________________________________________________________________ + [ 1793] By: gbarr on 1998/09/20 15:39:41 + Log: From: Peter Prymmer + Date: Mon, 10 Aug 98 16:58:22 PDT + Message-Id: <9808102358.AA10616@forte.com> + Subject: fix for unpack('u') failures on OS/390 + Branch: maint-5.005/perl + ! pp.c + ____________________________________________________________________________ + [ 1792] By: gbarr on 1998/09/20 15:11:33 + Log: From: "M.J.T. Guy" + Date: Sun, 9 Aug 1998 15:51:48 +0100 + Message-Id: + Subject: Fix typo, change "an array" to "a hash" + Branch: maint-5.005/perl + ! pod/perlfunc.pod + ____________________________________________________________________________ + [ 1791] By: gbarr on 1998/09/20 14:49:26 + Log: From: Gurusamy Sarathy + Date: Wed, 16 Sep 1998 22:13:17 -0400 + Message-Id: <199809170213.WAA10546@aatma.engin.umich.edu> + Subject: fill gaps in sig_* entries in win32/config.?c + and resync win32/config.?c with Porting/config.sh to pick up apiversion + Branch: maint-5.005/perl + ! win32/config.bc win32/config.gc win32/config.vc + ____________________________________________________________________________ + [ 1790] By: gbarr on 1998/09/20 14:40:56 + Log: From: Gurusamy Sarathy + Date: Sun, 06 Sep 1998 15:35:11 -0400 + Message-Id: <199809061935.PAA21531@aatma.engin.umich.edu> + Subject: suppress bogus warning on C + Branch: maint-5.005/perl + ! toke.c + ____________________________________________________________________________ + [ 1784] By: nick on 1998/09/12 09:53:36 + Log: Two tweaks to allow quiet compile qith egcs-1.1 + Branch: maint-5.005/perl + ! win32/win32.h + ____________________________________________________________________________ + [ 1783] By: gbarr on 1998/09/07 20:33:11 + Log: Subject: index() applied BM optimization to wrong argument + From: larry@wall.org (Larry Wall) + Date: Thu, 3 Sep 1998 12:49:13 -0700 + Message-Id: <199809031949.MAA29566@wall.org>, <199809060004.RAA23792@wall.org> + Branch: maint-5.005/perl + ! op.c util.c + ____________________________________________________________________________ + [ 1782] By: gbarr on 1998/09/07 18:54:49 + Log: From: Gurusamy Sarathy + Date: Fri, 28 Aug 1998 00:33:15 -0400 + Mssage-Id: <199808280433.AAA06767@aatma.engin.umich.edu> + Subject: socket problems on NT + Branch: maint-5.005/perl + ! objXSUB.h + ____________________________________________________________________________ + [ 1759] By: gsar on 1998/08/08 20:57:47 + Log: pending submit of 5.005_02 + Branch: maint-5.005/perl + ! Changes ---------------- Version 5.005_02 Second maintenance release of 5.005 diff -c 'perl5.005_02/Configure' 'perl5.005_03/Configure' Index: ./Configure Prereq: 3.0.1.9 *** ./Configure Fri Aug 7 16:38:53 1998 --- ./Configure Sun Mar 28 10:12:57 1999 *************** *** 21,27 **** # $Id: Head.U,v 3.0.1.9 1997/02/28 15:02:09 ram Exp $ # # Generated on Tue Jul 7 10:10:21 EDT 1998 [metaconfig 3.0 PL70] ! # (with additional metaconfig patches by doughera@lafayette.edu) cat >/tmp/c1$$ </tmp/c1$$ </dev/null`" in - foox) - trnl='\n' - ;; - esac - fi - if test X"$trnl" = X; then - case "`echo foo|tr '\012' x 2>/dev/null`" in - foox) - trnl='\012' - ;; - esac - fi - if test -n "$DJGPP"; then - trnl='\012' - fi - if test X"$trnl" = X; then - cat <&2 - - $me: Fatal Error: cannot figure out how to translate newlines with 'tr'. - - EOM - exit 1 - fi - : Proper separator for the PATH environment variable p_=: : On OS/2 this directory should exist if this is not floppy only system :-] --- 56,61 ---- *************** *** 193,198 **** --- 166,172 ---- eunicefix='' Mcc='' ar='' + full_ar='' awk='' bash='' bison='' *************** *** 359,364 **** --- 333,346 ---- d_flock='' d_fork='' d_fsetpos='' + i_sysmount='' + d_fstatfs='' + d_statfsflags='' + i_sysstatvfs='' + d_fstatvfs='' + i_mntent='' + d_getmntent='' + d_hasmntopt='' d_ftime='' d_gettimeod='' d_Gconvert='' *************** *** 391,397 **** d_getsbyname='' d_getsbyport='' d_gnulibc='' - i_arpainet='' d_htonl='' d_inetaton='' d_isascii='' --- 373,378 ---- *************** *** 431,436 **** --- 412,419 ---- d_pthread_yield='' d_sched_yield='' d_pthreads_created_joinable='' + i_pthread='' + i_machcthreads='' d_readdir='' d_rewinddir='' d_seekdir='' *************** *** 540,545 **** --- 523,529 ---- ld='' lddlflags='' usedl='' + ebcdic='' doublesize='' fpostype='' gidtype='' *************** *** 548,553 **** --- 532,538 ---- h_sysfile='' db_hashtype='' db_prefixtype='' + i_arpainet='' i_db='' i_dbm='' i_rpcsvcdbm='' *************** *** 633,638 **** --- 618,624 ---- loclibpth='' plibpth='' xlibpth='' + ignore_versioned_solibs='' libs='' lns='' lseektype='' *************** *** 697,707 **** --- 683,695 ---- installscript='' scriptdir='' scriptdirexp='' + selectminbits='' selecttype='' sh='' sig_name='' sig_name_init='' sig_num='' + sig_num_init='' installsitearch='' sitearch='' sitearchexp='' *************** *** 719,724 **** --- 707,713 ---- startsh='' stdchar='' sysman='' + trnl='' uidtype='' nm_opt='' nm_so_opt='' *************** *** 733,739 **** usrinc='' defvoidused='' voidflags='' - ebcdic='' CONFIG='' define='define' --- 722,727 ---- *************** *** 741,746 **** --- 729,740 ---- smallmach='pdp11 i8086 z8000 i80286 iAPX286' rmlist='' + installusrbinperl='' + + ccsymbols='' + cppsymbols='' + cppccsymbols='' + : We must find out about Eunice early eunicefix=':' if test -f /etc/unixtovms; then *************** *** 836,841 **** --- 830,837 ---- : default library list libswanted='' + : some systems want only to use the non-versioned libso:s + ignore_versioned_solibs='' : Possible local include directories to search. : Set locincpth to "" in a hint file to defeat local include searches. locincpth="/usr/local/include /opt/local/include /usr/gnu/include" *************** *** 904,911 **** $me: Fatal Error: I can't find a Bourne Shell anywhere. Usually it's in /bin/sh. How did you even get this far? ! Please contact me (Andy Dougherty) at doughera@lafayette.edu and ! we'll try to straighten this all out. EOM exit 1 ;; --- 900,906 ---- $me: Fatal Error: I can't find a Bourne Shell anywhere. Usually it's in /bin/sh. How did you even get this far? ! Please contact perlbug@perl.com and we'll try to straighten this all out. EOM exit 1 ;; *************** *** 1240,1246 **** CONFIG=true echo "Doing variable substitutions on .SH files..." if test -f $src/MANIFEST; then ! set x `awk '{print $1}' <$src/MANIFEST | grep '\.SH'` else echo "(Looking for .SH files under the source directory.)" set x `(cd $src; find . -name "*.SH" -print)` --- 1235,1241 ---- CONFIG=true echo "Doing variable substitutions on .SH files..." if test -f $src/MANIFEST; then ! set x `awk '{print $1}' <$src/MANIFEST | grep '\.SH$'` else echo "(Looking for .SH files under the source directory.)" set x `(cd $src; find . -name "*.SH" -print)` *************** *** 1373,1379 **** You have the option of continuing the configuration process, despite the distinct possibility that your kit is damaged, by typing 'y'es. If you do, don't blame me if something goes wrong. I advise you to type 'n'o ! and contact the author (doughera@lafayette.edu). EOM echo $n "Continue? [n] $c" >&4 --- 1368,1374 ---- You have the option of continuing the configuration process, despite the distinct possibility that your kit is damaged, by typing 'y'es. If you do, don't blame me if something goes wrong. I advise you to type 'n'o ! and then contact perlbug@perl.com. EOM echo $n "Continue? [n] $c" >&4 *************** *** 1396,1401 **** --- 1391,1420 ---- fi rm -f missing x?? + echo " " + : Find the appropriate value for a newline for tr + if test -n "$DJGPP"; then + trnl='\012' + fi + if test X"$trnl" = X; then + case "`echo foo|tr '\n' x 2>/dev/null`" in + foox) trnl='\n' ;; + esac + fi + if test X"$trnl" = X; then + case "`echo foo|tr '\012' x 2>/dev/null`" in + foox) trnl='\012' ;; + esac + fi + if test X"$trnl" = X; then + cat <&2 + + $me: Fatal Error: cannot figure out how to translate newlines with 'tr'. + + EOM + exit 1 + fi + : compute the number of columns on the terminal for proper question formatting case "$COLUMNS" in '') COLUMNS='80';; *************** *** 1574,1580 **** Unix system. If despite that it blows up on yours, your best bet is to edit Configure and run it again. If you can't run Configure for some reason, you'll have to generate a config.sh file by hand. Whatever problems you ! have, let me (doughera@lafayette.edu) know how I blew it. This installation script affects things in two ways: --- 1593,1599 ---- Unix system. If despite that it blows up on yours, your best bet is to edit Configure and run it again. If you can't run Configure for some reason, you'll have to generate a config.sh file by hand. Whatever problems you ! have, let perlbug@perl.com know how I blew it. This installation script affects things in two ways: *************** *** 1841,1854 **** *C9D1*|*c9d1*) echo "Hey, this might be EBCDIC." >&4 if test "X$up" = X -o "X$low" = X; then ! case "`echo IJ | tr '[A-IJ-RS-Z]' '[a-ij-rs-z]' 2>/dev/null`" in ij) up='[A-IJ-RS-Z]' low='[a-ij-rs-z]' ;; esac fi if test "X$up" = X -o "X$low" = X; then ! case "`echo IJ | tr A-IJ-RS-Z a-ij-rs-z 2>/dev/null`" in ij) up='A-IJ-RS-Z' low='a-ij-rs-z' ;; --- 1860,1873 ---- *C9D1*|*c9d1*) echo "Hey, this might be EBCDIC." >&4 if test "X$up" = X -o "X$low" = X; then ! case "`echo IJ | $tr '[A-IJ-RS-Z]' '[a-ij-rs-z]' 2>/dev/null`" in ij) up='[A-IJ-RS-Z]' low='[a-ij-rs-z]' ;; esac fi if test "X$up" = X -o "X$low" = X; then ! case "`echo IJ | $tr A-IJ-RS-Z a-ij-rs-z 2>/dev/null`" in ij) up='A-IJ-RS-Z' low='a-ij-rs-z' ;; *************** *** 1941,1947 **** (cd $src/hints; ls -C *.sh) | $sed 's/\.sh/ /g' >&4 dflt='' : Half the following guesses are probably wrong... If you have better ! : tests or hints, please send them to doughera@lafayette.edu : The metaconfig authors would also appreciate a copy... $test -f /irix && osname=irix $test -f /xenix && osname=sco_xenix --- 1960,1966 ---- (cd $src/hints; ls -C *.sh) | $sed 's/\.sh/ /g' >&4 dflt='' : Half the following guesses are probably wrong... If you have better ! : tests or hints, please send them to perlbug@perl.com : The metaconfig authors would also appreciate a copy... $test -f /irix && osname=irix $test -f /xenix && osname=sco_xenix *************** *** 1968,1973 **** --- 1987,1998 ---- osvers="$2.$3" fi fi + $test -f /sys/posix.dll && + $test -f /usr/bin/what && + set X `/usr/bin/what /sys/posix.dll` && + $test "$3" = UWIN && + osname=uwin && + osvers="$5" if $test -f $uname; then set X $myuname shift *************** *** 1982,1988 **** [23]100) osname=mips ;; next*) osname=next ;; i386*) ! if $test -f /etc/kconfig; then osname=isc if test "$lns" = "ln -s"; then osvers=4 --- 2007,2017 ---- [23]100) osname=mips ;; next*) osname=next ;; i386*) ! tmp=`/bin/uname -X 2>/dev/null|awk '/3\.2v[45]/{ print $(NF) }'` ! if $test "$tmp" != "" -a "$3" = "3.2" -a -f '/etc/systemid'; then ! osname='sco' ! osvers=$tmp ! elif $test -f /etc/kconfig; then osname=isc if test "$lns" = "ln -s"; then osvers=4 *************** *** 1992,1997 **** --- 2021,2027 ---- osvers=2 fi fi + unset tmp ;; pc*) if test -n "$DJGPP"; then *************** *** 2025,2031 **** osvers="$3" ;; dynixptx*) osname=dynixptx ! osvers="$3" ;; freebsd) osname=freebsd osvers="$3" ;; --- 2055,2061 ---- osvers="$3" ;; dynixptx*) osname=dynixptx ! osvers=`echo "$4" | $sed 's/^v//'` ;; freebsd) osname=freebsd osvers="$3" ;; *************** *** 2386,2411 **** Perl can be built to take advantage of threads, on some systems. To do so, Configure must be run with -Dusethreads. ! (See README.threads for details.) EOM case "$usethreads" in ! $define|true|[yY]*) dflt='y';; *) dflt='n';; esac rp='Build a threading Perl?' . ./myread case "$ans" in ! y|Y) val="$define" ;; *) val="$undef" ;; esac set usethreads eval $setvar ! : Look for a hint-file generated 'call-back-unit'. Now that the ! : user has specified if a threading perl is to be built, we may need ! : to set or change some other defaults. ! if $test -f usethreads.cbu; then ! . ./usethreads.cbu ! fi case "$d_oldpthreads" in '') : Configure tests would be welcome here. For now, assume undef. val="$undef" ;; --- 2416,2441 ---- Perl can be built to take advantage of threads, on some systems. To do so, Configure must be run with -Dusethreads. ! ! Note that threading is a highly experimental feature, and ! some known race conditions still remain. If you choose to try ! it, be very sure to not actually deploy it for production ! purposes. README.threads has more details, and is required ! reading if you enable threads. EOM case "$usethreads" in ! $define|true|[yY]*) dflt='y';; *) dflt='n';; esac rp='Build a threading Perl?' . ./myread case "$ans" in ! y|Y) val="$define" ;; *) val="$undef" ;; esac set usethreads eval $setvar ! case "$d_oldpthreads" in '') : Configure tests would be welcome here. For now, assume undef. val="$undef" ;; *************** *** 2414,2419 **** --- 2444,2475 ---- set d_oldpthreads eval $setvar + + case "$usethreads" in + "$define"|true|[yY]*) + : Look for a hint-file generated 'call-back-unit'. If the + : user has specified that a threading perl is to be built, + : we may need to set or change some other defaults. + if $test -f usethreads.cbu; then + . ./usethreads.cbu + fi + case "$osname" in + aix|dec_osf|dos_djgpp|freebsd|hpux|irix|linux|next|openbsd|os2|solaris|vmesa) + # Known thread-capable platforms. + ;; + *) + cat >&4 <pdp11.c <<'EOP' ! main() { #ifdef pdp11 exit(0); #else --- 3213,3219 ---- case "$models" in '') $cat >pdp11.c <<'EOP' ! int main() { #ifdef pdp11 exit(0); #else *************** *** 3442,3448 **** --- 3498,3508 ---- ABC.XYZ EOT cd .. + if test ! -f cppstdin; then echo 'cat >.$$.c; '"$cc"' -E ${1+"$@"} .$$.c; rm .$$.c' >cppstdin + else + echo "Keeping your $hint cppstdin wrapper." + fi chmod 755 cppstdin wrapper=`pwd`/cppstdin ok='false' *************** *** 3566,3572 **** esac case "$cppstdin" in ! "$wrapper") ;; *) $rm -f $wrapper;; esac $rm -f testcpp.c testcpp.out --- 3626,3632 ---- esac case "$cppstdin" in ! "$wrapper"|'cppstdin') ;; *) $rm -f $wrapper;; esac $rm -f testcpp.c testcpp.out *************** *** 3693,3699 **** esac for thislib in $libswanted; do ! if xxx=`./loc lib$thislib.$so.[0-9]'*' X $libpth`; $test -f "$xxx"; then echo "Found -l$thislib (shared)." case " $dflt " in *"-l$thislib "*);; --- 3753,3760 ---- esac for thislib in $libswanted; do ! if xxx=`./loc lib$thislib.$so.[0-9]'*' X $libpth`; ! $test -f "$xxx" -a "X$ignore_versioned_solibs" = "X"; then echo "Found -l$thislib (shared)." case " $dflt " in *"-l$thislib "*);; *************** *** 3838,3848 **** esac; fi' ! if ./osf1; then ! set signal.h __LANGUAGE_C__; eval $inctest ! else ! set signal.h LANGUAGE_C; eval $inctest ! fi case "$hint" in none|recommended) dflt="$ccflags $dflt" ;; --- 3899,3905 ---- esac; fi' ! set signal.h LANGUAGE_C; eval $inctest case "$hint" in none|recommended) dflt="$ccflags $dflt" ;; *************** *** 3980,3989 **** : coherency check echo " " echo "Checking your choice of C compiler and flags for coherency..." >&4 set X $cc $optimize $ccflags -o try $ldflags try.c $libs shift ! $cat >try.msg <&4 + $cat > try.c <<'EOF' + #include + int main() { printf("Ok\n"); exit(0); } + EOF set X $cc $optimize $ccflags -o try $ldflags try.c $libs shift ! $cat >try.msg <<'EOM' ! I've tried to compile and run the following simple program: ! ! EOM ! $cat try.c >> try.msg ! ! $cat >> try.msg < try.c <<'EOF' - #include - main() { printf("Ok\n"); exit(0); } - EOF dflt=y if sh -c "$cc $optimize $ccflags -o try $ldflags try.c $libs" >>try.msg 2>&1; then if sh -c './try' >>try.msg 2>&1; then --- 4059,4064 ---- *************** *** 4031,4037 **** $cat try.msg >&4 case "$knowitall" in '') ! echo "(The supplied flags might be incorrect with this C compiler.)" ;; *) dflt=n;; esac --- 4095,4101 ---- $cat try.msg >&4 case "$knowitall" in '') ! echo "(The supplied flags or libraries might be incorrect.)" ;; *) dflt=n;; esac *************** *** 4149,4157 **** : determine which malloc to compile in echo " " case "$usemymalloc" in ! ''|y*|true) dflt='y' ;; ! n*|false) dflt='n' ;; ! *) dflt="$usemymalloc" ;; esac rp="Do you wish to attempt to use the malloc that comes with $package?" . ./myread --- 4213,4220 ---- : determine which malloc to compile in echo " " case "$usemymalloc" in ! ''|[yY]*|true|$define) dflt='y' ;; ! *) dflt='n' ;; esac rp="Do you wish to attempt to use the malloc that comes with $package?" . ./myread *************** *** 4227,4233 **** echo " " echo "Checking out function prototypes..." >&4 $cat >prototype.c <<'EOCP' ! main(int argc, char *argv[]) { exit(0);} EOCP if $cc $ccflags -c prototype.c >prototype.out 2>&1 ; then --- 4290,4296 ---- echo " " echo "Checking out function prototypes..." >&4 $cat >prototype.c <<'EOCP' ! int main(int argc, char *argv[]) { exit(0);} EOCP if $cc $ccflags -c prototype.c >prototype.out 2>&1 ; then *************** *** 4253,4259 **** $cc $ccflags doesn't seem to understand them. Sorry about that. ! If GNU cc is avaiable for your system, perhaps you could try that instead. Eventually, we hope to support building Perl with pre-ANSI compilers. If you would like to help in that effort, please contact . --- 4316,4322 ---- $cc $ccflags doesn't seem to understand them. Sorry about that. ! If GNU cc is available for your system, perhaps you could try that instead. Eventually, we hope to support building Perl with pre-ANSI compilers. If you would like to help in that effort, please contact . *************** *** 4296,4301 **** --- 4359,4387 ---- installbin="$binexp" fi + echo " " + if test -d /usr/bin -a "X$installbin" != X/usr/bin; then + $cat <&4 - cat >tebcdic.c <&4 - val="$define" - else - echo "Nope, no EBCDIC. Assuming ASCII or some ISO Latin." >&4 - fi - else - echo "I'm unable to compile the test program." >&4 - echo "I'll asuume ASCII or some ISO Latin." >&4 - fi - $rm -f tebcdic.c tebcdic - set ebcdic - eval $setvar - - echo " " echo "Checking for GNU C Library..." >&4 cat >gnulibc.c < ! int ! main() { #ifdef __GLIBC__ exit(0); --- 4394,4403 ---- $cc $optimize $ccflags $ldflags -o ${mc_file} $* ${mc_file}.c $libs;' echo " " echo "Checking for GNU C Library..." >&4 cat >gnulibc.c < ! int main() { #ifdef __GLIBC__ exit(0); *************** *** 4664,4669 **** --- 4723,4732 ---- eval $xscan;\ $contains '^fprintf$' libc.list >/dev/null 2>&1; then eval $xrun + elif com="sed -n -e 's/^__.*//' -e 's/[ ]*D[ ]*[0-9]*.*//p'";\ + eval $xscan;\ + $contains '^fprintf$' libc.list >/dev/null 2>&1; then + eval $xrun else $nm -p $* 2>/dev/null >libc.tmp $grep fprintf libc.tmp > libc.ptf *************** *** 4719,4725 **** if $test -f /lib/syscalls.exp; then echo " " echo "Also extracting names from /lib/syscalls.exp for good ole AIX..." >&4 ! $sed -n 's/^\([^ ]*\)[ ]*syscall$/\1/p' /lib/syscalls.exp >>libc.list fi ;; esac --- 4782,4788 ---- if $test -f /lib/syscalls.exp; then echo " " echo "Also extracting names from /lib/syscalls.exp for good ole AIX..." >&4 ! $sed -n 's/^\([^ ]*\)[ ]*syscall[0-9]*$/\1/p' /lib/syscalls.exp >>libc.list fi ;; esac *************** *** 4750,4756 **** else tval=false; fi;; *) ! echo "main() { extern short $1$tdc; printf(\"%hd\", $1$tc); }" > t.c; if $cc $optimize $ccflags $ldflags -o t t.c $libs >/dev/null 2>&1; then tval=true; else tval=false; --- 4813,4819 ---- else tval=false; fi;; *) ! echo "int main() { extern short $1$tdc; printf(\"%hd\", $1$tc); }" > t.c; if $cc $optimize $ccflags $ldflags -o t t.c $libs >/dev/null 2>&1; then tval=true; else tval=false; *************** *** 4899,4905 **** /* Test for whether ELF binaries are produced */ #include #include ! main() { char b[4]; int i = open("a.out",O_RDONLY); if(i == -1) --- 4962,4968 ---- /* Test for whether ELF binaries are produced */ #include #include ! int main() { char b[4]; int i = open("a.out",O_RDONLY); if(i == -1) *************** *** 4944,4949 **** --- 5007,5013 ---- linux|irix*) dflt='-shared' ;; next) dflt='none' ;; solaris) dflt='-G' ;; + beos) dflt='-nostart' ;; sunos) dflt='-assert nodefinitions' ;; svr4*|esix*) dflt="-G $ldflags" ;; *) dflt='none' ;; *************** *** 4953,4958 **** --- 5017,5026 ---- esac : Try to guess additional flags to pick up local libraries. + : Be careful not to append to a plain 'none' + case "$dflt" in + none) dflt='' ;; + esac for thisflag in $ldflags; do case "$thisflag" in -L*) *************** *** 5016,5022 **** ;; *) case "$useshrplib" in '') case "$osname" in ! svr4*|dgux|dynixptx|esix|powerux) dflt=y also='Building a shared libperl is required for dynamic loading to work on your system.' ;; --- 5084,5090 ---- ;; *) case "$useshrplib" in '') case "$osname" in ! svr4*|dgux|dynixptx|esix|powerux|beos) dflt=y also='Building a shared libperl is required for dynamic loading to work on your system.' ;; *************** *** 5061,5081 **** case "${osname}${osvers}" in next4*) xxx='DYLD_LIBRARY_PATH' ;; os2*) xxx='' ;; # Nothing special needed. *) xxx='LD_LIBRARY_PATH' ;; esac - if test X"$xxx" != "X"; then - $cat <&4 - - To build perl, you must add the current working directory to your - $xxx environment variable before running make. You can do - this with - $xxx=\`pwd\`; export $xxx - for Bourne-style shells, or - setenv $xxx \`pwd\` - for Csh-style shells. You *MUST* do this before running make. - - EOM - fi ;; *) useshrplib='false' ;; esac --- 5129,5137 ---- case "${osname}${osvers}" in next4*) xxx='DYLD_LIBRARY_PATH' ;; os2*) xxx='' ;; # Nothing special needed. + beos*) xxx='' ;; *) xxx='LD_LIBRARY_PATH' ;; esac ;; *) useshrplib='false' ;; esac *************** *** 5147,5153 **** *) $cat >&4 <&4 < #endif ! main() { exit(R_OK); } EOCP --- 6179,6185 ---- #ifdef I_UNISTD #include #endif ! int main() { exit(R_OK); } EOCP *************** *** 6197,6203 **** #ifdef I_UNISTD # include #endif ! main() { if (getuid() == 0) { printf("(I see you are running Configure as super-user...)\n"); --- 6255,6261 ---- #ifdef I_UNISTD # include #endif ! int main() { if (getuid() == 0) { printf("(I see you are running Configure as super-user...)\n"); *************** *** 6259,6265 **** #ifdef I_UNISTD # include #endif ! main() { if (getuid() == 0) { printf("(I see you are running Configure as super-user...)\n"); --- 6317,6323 ---- #ifdef I_UNISTD # include #endif ! int main() { if (getuid() == 0) { printf("(I see you are running Configure as super-user...)\n"); *************** *** 6317,6323 **** echo "Checking to see how big your integers are..." >&4 $cat >intsize.c <<'EOCP' #include ! main() { printf("intsize=%d;\n", sizeof(int)); printf("longsize=%d;\n", sizeof(long)); --- 6375,6381 ---- echo "Checking to see how big your integers are..." >&4 $cat >intsize.c <<'EOCP' #include ! int main() { printf("intsize=%d;\n", sizeof(int)); printf("longsize=%d;\n", sizeof(long)); *************** *** 6413,6419 **** #include #include $signal_t blech(s) int s; { exit(3); } ! main() { $xxx i32; double f, g; --- 6471,6477 ---- #include #include $signal_t blech(s) int s; { exit(3); } ! int main() { $xxx i32; double f, g; *************** *** 6471,6477 **** unsigned long dummy_long(p) unsigned long p; { return p; } unsigned int dummy_int(p) unsigned int p; { return p; } unsigned short dummy_short(p) unsigned short p; { return p; } ! main() { double f; unsigned long along; --- 6529,6535 ---- unsigned long dummy_long(p) unsigned long p; { return p; } unsigned int dummy_int(p) unsigned int p; { return p; } unsigned short dummy_short(p) unsigned short p; { return p; } ! int main() { double f; unsigned long along; *************** *** 6563,6569 **** $cat >vprintf.c <<'EOF' #include ! main() { xxx("foo"); } xxx(va_alist) va_dcl --- 6621,6627 ---- $cat >vprintf.c <<'EOF' #include ! int main() { xxx("foo"); } xxx(va_alist) va_dcl *************** *** 6611,6617 **** echo 'Checking to see if your C compiler knows about "const"...' >&4 $cat >const.c <<'EOCP' typedef struct spug { int drokk; } spug; ! main() { const char *foo; const spug y; --- 6669,6675 ---- echo 'Checking to see if your C compiler knows about "const"...' >&4 $cat >const.c <<'EOCP' typedef struct spug { int drokk; } spug; ! int main() { const char *foo; const spug y; *************** *** 6703,6708 **** --- 6761,6770 ---- set difftime d_difftime eval $inlibc + : see if sys/stat.h is available + set sys/stat.h i_sysstat + eval $inhdr + : see if this is a dirent system echo " " if xinc=`./findhdr dirent.h`; $test "$xinc"; then *************** *** 6771,6776 **** --- 6833,6855 ---- eval $setvar $rm -f try.c + hasfield='varname=$1; struct=$2; field=$3; shift; shift; shift; + while $test $# -ge 2; do + case "$1" in + $define) echo "#include <$2>";; + esac ; + shift 2; + done > try.c; + echo "int main () { struct $struct foo; foo.$field = 0; }" >> try.c; + if eval $cc $optimize $ccflags -c try.c >/dev/null 2>&1; then + val="$define"; + else + val="$undef"; + fi; + set $varname; + eval $setvar; + $rm -f try.c try.o' + : see if dlerror exists xxx_runnm="$runnm" runnm=false *************** *** 6829,6835 **** extern int fred() ; ! main() { void * handle ; void * symbol ; --- 6908,6914 ---- extern int fred() ; ! int main() { void * handle ; void * symbol ; *************** *** 6917,6923 **** #ifdef I_SYS_FILE #include #endif ! main() { if(O_RDONLY); #ifdef O_TRUNC exit(0); --- 6996,7002 ---- #ifdef I_SYS_FILE #include #endif ! int main() { if(O_RDONLY); #ifdef O_TRUNC exit(0); *************** *** 6973,6979 **** '') $cat head.c > try.c $cat >>try.c <<'EOCP' ! main() { #ifdef O_NONBLOCK printf("O_NONBLOCK\n"); exit(0); --- 7052,7058 ---- '') $cat head.c > try.c $cat >>try.c <<'EOCP' ! int main() { #ifdef O_NONBLOCK printf("O_NONBLOCK\n"); exit(0); *************** *** 7020,7026 **** $signal_t blech(x) int x; { exit(3); } EOCP $cat >> try.c <<'EOCP' ! main() { int pd[2]; int pu[2]; --- 7099,7105 ---- $signal_t blech(x) int x; { exit(3); } EOCP $cat >> try.c <<'EOCP' ! int main() { int pd[2]; int pu[2]; *************** *** 7178,7183 **** --- 7257,7287 ---- set gethostbyname d_gethbyname eval $inlibc + : see if this is a sys/param system + set sys/param.h i_sysparam + eval $inhdr + + : see if this is a sys/mount.h system + set sys/mount.h i_sysmount + eval $inhdr + + : see if fstatfs exists + set fstatfs d_fstatfs + eval $inlibc + + : see if statfs knows about mount flags + echo " " + set d_statfsflags statfs f_flags $i_sysparam sys/param.h $i_sysmount sys/mount.h + eval $hasfield + + : see if this is a sysstatvfs.h system + set sys/statvfs.h i_sysstatvfs + eval $inhdr + + : see if fstatvfs exists + set fstatvfs d_fstatvfs + eval $inlibc + : see if gethostent exists set gethostent d_gethent eval $inlibc *************** *** 7244,7249 **** --- 7348,7365 ---- set getprotoent d_getpent eval $inlibc + : see if this is a mntent.h system + set mntent.h i_mntent + eval $inhdr + + : see if getmntent exists + set getmntent d_getmntent + eval $inlibc + + : see if hasmntopt exists + set hasmntopt d_hasmntopt + eval $inlibc + : see if getpgid exists set getpgid d_getpgid eval $inlibc *************** *** 7305,7311 **** set netinet/in.h i_niin sys/in.h i_sysin eval $inhdr ! : see if this is an arpa/inet.h set arpa/inet.h i_arpainet eval $inhdr --- 7421,7427 ---- set netinet/in.h i_niin sys/in.h i_sysin eval $inhdr ! : see if arpa/inet.h has to be included set arpa/inet.h i_arpainet eval $inhdr *************** *** 7411,7417 **** $cat >isascii.c <<'EOCP' #include #include ! main() { int c = 'A'; if (isascii(c)) exit(0); --- 7527,7533 ---- $cat >isascii.c <<'EOCP' #include #include ! int main() { int c = 'A'; if (isascii(c)) exit(0); *************** *** 7501,7507 **** $echo $n "Checking to see how big your long doubles are...$c" >&4 $cat >try.c <<'EOCP' #include ! main() { printf("%d\n", sizeof(long double)); } --- 7617,7623 ---- $echo $n "Checking to see how big your long doubles are...$c" >&4 $cat >try.c <<'EOCP' #include ! int main() { printf("%d\n", sizeof(long double)); } *************** *** 7518,7523 **** --- 7634,7642 ---- . ./myread longdblsize="$ans" fi + if $test "X$doublesize" = "X$longdblsize"; then + echo "(That isn't any different from an ordinary double.)" + fi ;; esac $rm -f try.c try *************** *** 7544,7550 **** $echo $n "Checking to see how big your long longs are...$c" >&4 $cat >try.c <<'EOCP' #include ! main() { printf("%d\n", sizeof(long long)); } --- 7663,7669 ---- $echo $n "Checking to see how big your long longs are...$c" >&4 $cat >try.c <<'EOCP' #include ! int main() { printf("%d\n", sizeof(long long)); } *************** *** 7561,7566 **** --- 7680,7688 ---- . ./myread longlongsize="$ans" fi + if $test "X$longsize" = "X$longlongsize"; then + echo "(That isn't any different from an ordinary long.)" + fi ;; esac $rm -f try.c try *************** *** 7635,7641 **** freebsd) case "`ipcs 2>&1`" in "SVID messages"*"not configured"*) ! echo "But your FreeBSD kernel does not have the msg*(2) configured." >&4 h_msg=false val="$undef" set msgctl d_msgctl --- 7757,7763 ---- freebsd) case "`ipcs 2>&1`" in "SVID messages"*"not configured"*) ! echo "Your $osname does not have the msg*(2) configured." >&4 h_msg=false val="$undef" set msgctl d_msgctl *************** *** 7678,7687 **** eval $inlibc ! : see whether the various POSIXish _yields exist within given cccmd $cat >try.c < ! main() { YIELD(); exit(0); } --- 7800,7809 ---- eval $inlibc ! : see whether the various POSIXish _yields exist $cat >try.c < ! int main() { YIELD(); exit(0); } *************** *** 7713,7722 **** eval $setvar $rm -f try try.* : test whether pthreads are created in joinable -- aka undetached -- state ! if test "X$usethreads" = "X$define"; then echo $n "Checking whether pthreads are created joinable. $c" >&4 ! $cat >try.c <<'EOCP' #include #include int main() { --- 7835,7852 ---- eval $setvar $rm -f try try.* + : see if this is a pthread.h system + set pthread.h i_pthread + eval $inhdr + + : see if this is a mach/cthreads.h system + set mach/cthreads.h i_machcthreads + eval $inhdr + : test whether pthreads are created in joinable -- aka undetached -- state ! if test "X$usethreads" = "X$define" -a "X$i_pthread" = "X$define"; then echo $n "Checking whether pthreads are created joinable. $c" >&4 ! $cat >try.c < #include int main() { *************** *** 7930,7936 **** #ifdef I_UNISTD # include /* Needed for NetBSD */ #endif ! main() { char buf[128], abc[128]; char *b; --- 8060,8066 ---- #ifdef I_UNISTD # include /* Needed for NetBSD */ #endif ! int main() { char buf[128], abc[128]; char *b; *************** *** 8006,8012 **** #ifdef I_UNISTD # include /* Needed for NetBSD */ #endif ! main() { char buf[128], abc[128]; char *b; --- 8136,8142 ---- #ifdef I_UNISTD # include /* Needed for NetBSD */ #endif ! int main() { char buf[128], abc[128]; char *b; *************** *** 8084,8090 **** #ifdef I_UNISTD # include /* Needed for NetBSD */ #endif ! main() { char a = -1; char b = 0; --- 8214,8220 ---- #ifdef I_UNISTD # include /* Needed for NetBSD */ #endif ! int main() { char a = -1; char b = 0; *************** *** 8136,8142 **** freebsd) case "`ipcs 2>&1`" in "SVID messages"*"not configured"*) ! echo "But your FreeBSD kernel does not have the sem*(2) configured." >&4 h_sem=false val="$undef" set semctl d_semctl --- 8266,8272 ---- freebsd) case "`ipcs 2>&1`" in "SVID messages"*"not configured"*) ! echo "Your $osname does not have the sem*(2) configured." >&4 h_sem=false val="$undef" set semctl d_semctl *************** *** 8185,8190 **** --- 8315,8345 ---- $define) : see whether semctl IPC_STAT can use union semun echo " " + $cat > try.h <>3) + # define S_IWGRP (S_IWUSR>>3) + # define S_IXGRP (S_IXUSR>>3) + # define S_IROTH (S_IRUSR>>6) + # define S_IWOTH (S_IWUSR>>6) + # define S_IXOTH (S_IXUSR>>6) + #endif + #ifndef S_IRWXU + # define S_IRWXU (S_IRUSR|S_IWUSR|S_IXUSR) + # define S_IRWXG (S_IRGRP|S_IWGRP|S_IXGRP) + # define S_IRWXO (S_IROTH|S_IWOTH|S_IXOTH) + #endif + END + $cat > try.c < #include *************** *** 8244,8250 **** case "$d_semctl_semun" in $define) echo "You can use union semun for semctl IPC_STAT." >&4 ! also='also' ;; *) echo "You cannot use union semun for semctl IPC_STAT." >&4 also='' --- 8399,8405 ---- case "$d_semctl_semun" in $define) echo "You can use union semun for semctl IPC_STAT." >&4 ! also='also ' ;; *) echo "You cannot use union semun for semctl IPC_STAT." >&4 also='' *************** *** 8259,8264 **** --- 8414,8420 ---- #include #include #include + #include "try.h" #ifndef errno extern int errno; #endif *************** *** 8300,8310 **** eval $setvar case "$d_semctl_semid_ds" in $define) ! echo "You can $also use struct semid_ds * for semctl IPC_STAT." >&4 ;; ! *) echo "You cannot use struct semid_ds * for semctl IPC_STAT." >&4 ;; esac ;; *) val="$undef" --- 8456,8467 ---- eval $setvar case "$d_semctl_semid_ds" in $define) ! echo "You can ${also}use struct semid_ds* for semctl IPC_STAT." >&4 ;; ! *) echo "You cannot use struct semid_ds* for semctl IPC_STAT." >&4 ;; esac + $rm -f try.h ;; *) val="$undef" *************** *** 8499,8505 **** freebsd) case "`ipcs 2>&1`" in "SVID shared memory"*"not configured"*) ! echo "But your FreeBSD kernel does not have the shm*(2) configured." >&4 h_shm=false val="$undef" set shmctl d_shmctl --- 8656,8662 ---- freebsd) case "`ipcs 2>&1`" in "SVID shared memory"*"not configured"*) ! echo "But your $osname does not have the shm*(2) configured." >&4 h_shm=false val="$undef" set shmctl d_shmctl *************** *** 8533,8539 **** #include #include #include ! main() { struct sigaction act, oact; } --- 8690,8696 ---- #include #include #include ! int main() { struct sigaction act, oact; } *************** *** 8560,8566 **** #include sigjmp_buf env; int set = 1; ! main() { if (sigsetjmp(env,1)) exit(set); --- 8717,8723 ---- #include sigjmp_buf env; int set = 1; ! int main() { if (sigsetjmp(env,1)) exit(set); *************** *** 8619,8644 **** d_oldsock="$undef" else echo "You don't have Berkeley networking in libc$_a..." >&4 ! if test -f /usr/lib/libnet$_a; then ! ( ($nm $nm_opt /usr/lib/libnet$_a | eval $nm_extract) || \ ! $ar t /usr/lib/libnet$_a) 2>/dev/null >> libc.list ! if $contains socket libc.list >/dev/null 2>&1; then ! echo "...but the Wollongong group seems to have hacked it in." >&4 ! socketlib="-lnet" ! sockethdr="-I/usr/netinclude" ! d_socket="$define" ! if $contains setsockopt libc.list >/dev/null 2>&1; then ! d_oldsock="$undef" ! else ! echo "...using the old 4.1c interface, rather than 4.2" >&4 ! d_oldsock="$define" fi - else - echo "or even in libnet$_a, which is peculiar." >&4 - d_socket="$undef" - d_oldsock="$undef" fi ! else echo "or anywhere else I see." >&4 d_socket="$undef" d_oldsock="$undef" --- 8776,8807 ---- d_oldsock="$undef" else echo "You don't have Berkeley networking in libc$_a..." >&4 ! for net in net socket ! do ! if test -f /usr/lib/lib$net$_a; then ! ( ($nm $nm_opt /usr/lib/lib$net$_a | eval $nm_extract) || \ ! $ar t /usr/lib/lib$net$_a) 2>/dev/null >> libc.list ! if $contains socket libc.list >/dev/null 2>&1; then ! d_socket="$define" ! case "$net" in ! net) ! echo "...but the Wollongong group seems to have hacked it in." >&4 ! socketlib="-lnet" ! sockethdr="-I/usr/netinclude" ! ;; ! esac ! echo "Found Berkeley sockets interface in lib$net." >& 4 ! if $contains setsockopt libc.list >/dev/null 2>&1; then ! d_oldsock="$undef" ! else ! echo "...using the old 4.1c interface, rather than 4.2" >&4 ! d_oldsock="$define" ! fi ! break fi fi ! done ! if test "X$d_socket" != "X$define"; then echo "or anywhere else I see." >&4 d_socket="$undef" d_oldsock="$undef" *************** *** 8652,8672 **** : see if stat knows about block sizes echo " " ! xxx=`./findhdr sys/stat.h` ! if $contains 'st_blocks;' "$xxx" >/dev/null 2>&1 ; then ! if $contains 'st_blksize;' "$xxx" >/dev/null 2>&1 ; then ! echo "Your stat() knows about block sizes." >&4 ! val="$define" ! else ! echo "Your stat() doesn't know about block sizes." >&4 ! val="$undef" ! fi ! else ! echo "Your stat() doesn't know about block sizes." >&4 ! val="$undef" ! fi ! set d_statblks ! eval $setvar : see if _ptr and _cnt from stdio act std echo " " --- 8815,8822 ---- : see if stat knows about block sizes echo " " ! set d_statblks stat st_blocks $i_sysstat sys/stat.h ! eval $hasfield : see if _ptr and _cnt from stdio act std echo " " *************** *** 8716,8722 **** #include #define FILE_ptr(fp) $stdio_ptr #define FILE_cnt(fp) $stdio_cnt ! main() { FILE *fp = fopen("try.c", "r"); char c = getc(fp); if ( --- 8866,8872 ---- #include #define FILE_ptr(fp) $stdio_ptr #define FILE_cnt(fp) $stdio_cnt ! int main() { FILE *fp = fopen("try.c", "r"); char c = getc(fp); if ( *************** *** 8767,8773 **** #include #define FILE_base(fp) $stdio_base #define FILE_bufsiz(fp) $stdio_bufsiz ! main() { FILE *fp = fopen("try.c", "r"); char c = getc(fp); if ( --- 8917,8923 ---- #include #define FILE_base(fp) $stdio_base #define FILE_bufsiz(fp) $stdio_bufsiz ! int main() { FILE *fp = fopen("try.c", "r"); char c = getc(fp); if ( *************** *** 8803,8809 **** echo " " echo "Checking to see if your C compiler can copy structs..." >&4 $cat >try.c <<'EOCP' ! main() { struct blurfl { int dyick; --- 8953,8959 ---- echo " " echo "Checking to see if your C compiler can copy structs..." >&4 $cat >try.c <<'EOCP' ! int main() { struct blurfl { int dyick; *************** *** 9056,9062 **** false) dflt='n';; *) dflt='y';; esac ! rp="Some systems have problems with vfork(). Do you want to use it?" . ./myread case "$ans" in y|Y) ;; --- 9206,9221 ---- false) dflt='n';; *) dflt='y';; esac ! cat <<'EOM' ! ! Perl can only use a vfork() that doesn't suffer from strict ! restrictions on calling functions or modifying global data in ! the child. For example, glibc-2.1 contains such a vfork() ! that is unsuitable. If your system provides a proper fork() ! call, chances are that you do NOT want perl to use vfork(). ! ! EOM ! rp="Do you still want to use vfork()?" . ./myread case "$ans" in y|Y) ;; *************** *** 9148,9154 **** echo " " echo 'Checking to see if your C compiler knows about "volatile"...' >&4 $cat >try.c <<'EOCP' ! main() { typedef struct _goo_struct goo_struct; goo_struct * volatile goo = ((goo_struct *)0); --- 9307,9313 ---- echo " " echo 'Checking to see if your C compiler knows about "volatile"...' >&4 $cat >try.c <<'EOCP' ! int main() { typedef struct _goo_struct goo_struct; goo_struct * volatile goo = ((goo_struct *)0); *************** *** 9207,9213 **** char foo; double bar; } try; ! main() { printf("%d\n", (char *)&try.bar - (char *)&try.foo); } --- 9366,9372 ---- char foo; double bar; } try; ! int main() { printf("%d\n", (char *)&try.bar - (char *)&try.foo); } *************** *** 9242,9248 **** EOM $cat >try.c <<'EOCP' #include ! main() { int i; union { --- 9401,9407 ---- EOM $cat >try.c <<'EOCP' #include ! int main() { int i; union { *************** *** 9337,9343 **** #include #include #include ! main() { #ifdef DB_VERSION_MAJOR /* DB version >= 2 */ int Major, Minor, Patch ; --- 9496,9502 ---- #include #include #include ! int main() { #ifdef DB_VERSION_MAJOR /* DB version >= 2 */ int Major, Minor, Patch ; *************** *** 9420,9426 **** { } HASHINFO info; ! main() { info.hash = hash_cb; } --- 9579,9585 ---- { } HASHINFO info; ! int main() { info.hash = hash_cb; } *************** *** 9465,9471 **** { } BTREEINFO info; ! main() { info.prefix = prefix_cb; } --- 9624,9630 ---- { } BTREEINFO info; ! int main() { info.prefix = prefix_cb; } *************** *** 9518,9524 **** #endif exit(0); } ! main() { sub(); } EOCP if $cc $ccflags -c -DTRY=$defvoidused try.c >.out 2>&1 ; then voidflags=$defvoidused --- 9677,9683 ---- #endif exit(0); } ! int main() { sub(); } EOCP if $cc $ccflags -c -DTRY=$defvoidused try.c >.out 2>&1 ; then voidflags=$defvoidused *************** *** 9590,9596 **** $echo $n "Checking to see how big your double precision numbers are...$c" >&4 $cat >try.c <<'EOCP' #include ! main() { printf("%d\n", sizeof(double)); } --- 9749,9755 ---- $echo $n "Checking to see how big your double precision numbers are...$c" >&4 $cat >try.c <<'EOCP' #include ! int main() { printf("%d\n", sizeof(double)); } *************** *** 9610,9615 **** --- 9769,9800 ---- esac $rm -f try.c try + echo " " + echo "Determining whether or not we are on an EBCDIC system..." >&4 + $cat >tebcdic.c <&4 + val="$define" + else + echo "Nope, no EBCDIC. Assuming ASCII or some ISO Latin." >&4 + fi + else + echo "I'm unable to compile the test program." >&4 + echo "I'll assume ASCII or some ISO Latin." >&4 + fi + $rm -f tebcdic.c tebcdic + set ebcdic + eval $setvar + : see what type file positions are declared as in the library rp="What is the type for file position used by fsetpos()?" set fpos_t fpostype long stdio.h sys/types.h *************** *** 9630,9635 **** --- 9815,9826 ---- : Store the full pathname to the sed program for use in the C program full_sed=$sed + : Store the full pathname to the ar program for use in the Makefile.SH + : Respect a hint or command line value for full_ar. + case "$full_ar" in + '') full_ar=$ar ;; + esac + : see what type gids are declared as in the kernel echo " " echo "Looking for the type for group ids returned by getgid()." *************** *** 9928,9934 **** fi $cat >>try.c <<'EOCP' #include ! main() { printf("%d\n", sizeof(VOID_PTR)); exit(0); --- 10119,10125 ---- fi $cat >>try.c <<'EOCP' #include ! int main() { printf("%d\n", sizeof(VOID_PTR)); exit(0); *************** *** 9966,9972 **** #endif EOCP $cat >>try.c <<'EOCP' ! main() { register int i; register unsigned long tmp; --- 10157,10163 ---- #endif EOCP $cat >>try.c <<'EOCP' ! int main() { register int i; register unsigned long tmp; *************** *** 10004,10010 **** echo 'int bar1() { return bar2(); }' > bar1.c echo 'int bar2() { return 2; }' > bar2.c $cat > foo.c <<'EOP' ! main() { printf("%d\n", bar1()); exit(0); } EOP $cc $ccflags -c bar1.c >/dev/null 2>&1 $cc $ccflags -c bar2.c >/dev/null 2>&1 --- 10195,10201 ---- echo 'int bar1() { return bar2(); }' > bar1.c echo 'int bar2() { return 2; }' > bar2.c $cat > foo.c <<'EOP' ! int main() { printf("%d\n", bar1()); exit(0); } EOP $cc $ccflags -c bar1.c >/dev/null 2>&1 $cc $ccflags -c bar2.c >/dev/null 2>&1 *************** *** 10064,10070 **** #ifdef I_SYSSELECT #include #endif ! main() { struct tm foo; #ifdef S_TIMEVAL --- 10255,10261 ---- #ifdef I_SYSSELECT #include #endif ! int main() { struct tm foo; #ifdef S_TIMEVAL *************** *** 10148,10154 **** #ifdef I_SYS_SELECT #include #endif ! main() { fd_set fds; #ifdef TRYBITS --- 10339,10345 ---- #ifdef I_SYS_SELECT #include #endif ! int main() { fd_set fds; #ifdef TRYBITS *************** *** 10217,10224 **** : The first arg can be int, unsigned, or size_t : The last arg may or may not be 'const' val='' for xxx in 'fd_set *' 'int *'; do ! for nfd in 'int' 'size_t' 'unsigned' ; do for tmo in 'struct timeval *' 'const struct timeval *'; do case "$val" in '') try="extern select _(($nfd, $xxx, $xxx, $xxx, $tmo));" --- 10408,10417 ---- : The first arg can be int, unsigned, or size_t : The last arg may or may not be 'const' val='' + : void pointer has been seen but using that + : breaks the selectminbits test for xxx in 'fd_set *' 'int *'; do ! for nfd in 'int' 'size_t' 'unsigned' 'unsigned long'; do for tmo in 'struct timeval *' 'const struct timeval *'; do case "$val" in '') try="extern select _(($nfd, $xxx, $xxx, $xxx, $tmo));" *************** *** 10250,10255 **** --- 10443,10542 ---- ;; esac + : check for the select 'width' + case "$selectminbits" in + '') case "$d_select" in + $define) + $cat <try.c < + #$i_time I_TIME + #$i_systime I_SYS_TIME + #$i_systimek I_SYS_TIME_KERNEL + #ifdef I_TIME + # include + #endif + #ifdef I_SYS_TIME + # ifdef I_SYS_TIME_KERNEL + # define KERNEL + # endif + # include + # ifdef I_SYS_TIME_KERNEL + # undef KERNEL + # endif + #endif + #$i_sysselct I_SYS_SELECT + #ifdef I_SYS_SELECT + #include + #endif + #include + $selecttype b; + #define S sizeof(*(b)) + #define MINBITS 64 + #define NBYTES (S * 8 > MINBITS ? S : MINBITS/8) + #define NBITS (NBYTES * 8) + int main() { + char s[NBYTES]; + struct timeval t; + int i; + FILE* fp; + int fd; + + fclose(stdin); + fp = fopen("try.c", "r"); + if (fp == 0) + exit(1); + fd = fileno(fp); + if (fd < 0) + exit(2); + b = ($selecttype)s; + for (i = 0; i < NBITS; i++) + FD_SET(i, b); + t.tv_sec = 0; + t.tv_usec = 0; + select(fd + 1, b, 0, 0, &t); + for (i = NBITS - 1; i > fd && FD_ISSET(i, b); i--); + printf("%d\n", i + 1); + return 0; + } + EOCP + set try + if eval $compile_ok; then + selectminbits=`./try` + case "$selectminbits" in + '') cat >&4 <&4 + else + rp='What is the minimum number of bits your select() operates on?' + case "$byteorder" in + 1234|12345678) dflt=32 ;; + *) dflt=1 ;; + esac + . ./myread + val=$ans + selectminbits="$val" + fi + $rm -f try.* try + ;; + *) : no select, so pick a harmless default + selectminbits='32' + ;; + esac + ;; + esac + : Trace out the files included by signal.h, then look for SIGxxx names. : Remove SIGARRAYSIZE used by HPUX. : Remove SIGTYP void lines used by OS2. *************** *** 10458,10464 **** : generate list of signal names echo " " case "$sig_name_init" in ! '') echo "Generating a list of signal names and numbers..." >&4 . ./signal_cmd sig_name=`$awk '{printf "%s ", $1}' signal.lst` --- 10745,10757 ---- : generate list of signal names echo " " case "$sig_name_init" in ! '') doinit=yes ;; ! *) case "$sig_num_init" in ! ''|*,*) doinit=yes ;; ! esac ;; ! esac ! case "$doinit" in ! yes) echo "Generating a list of signal names and numbers..." >&4 . ./signal_cmd sig_name=`$awk '{printf "%s ", $1}' signal.lst` *************** *** 10466,10472 **** sig_name_init=`$awk 'BEGIN { printf "\"ZERO\", " } { printf "\"%s\", ", $1 } END { printf "0\n" }' signal.lst` ! sig_num=`$awk 'BEGIN { printf "0, " } { printf "%d, ", $2} END { printf "0\n"}' signal.lst` ;; --- 10759,10767 ---- sig_name_init=`$awk 'BEGIN { printf "\"ZERO\", " } { printf "\"%s\", ", $1 } END { printf "0\n" }' signal.lst` ! sig_num=`$awk '{printf "%d ", $2}' signal.lst` ! sig_num="0 $sig_num" ! sig_num_init=`$awk 'BEGIN { printf "0, " } { printf "%d, ", $2} END { printf "0\n"}' signal.lst` ;; *************** *** 10498,10504 **** #include #define Size_t $sizetype #define SSize_t $dflt ! main() { if (sizeof(Size_t) == sizeof(SSize_t)) printf("$dflt\n"); --- 10793,10799 ---- #include #define Size_t $sizetype #define SSize_t $dflt ! int main() { if (sizeof(Size_t) == sizeof(SSize_t)) printf("$dflt\n"); *************** *** 10814,10825 **** ./Cppsym -l $al | $sort | $grep -v '^$' >Cppsym.true : now check the C compiler for additional symbols $cat >ccsym <tmp.c <&1\` do case "\$i" in -D*) echo "\$i" | $sed 's/^-D//';; --- 11109,11124 ---- ./Cppsym -l $al | $sort | $grep -v '^$' >Cppsym.true : now check the C compiler for additional symbols + postprocess_cc_v='' + case "$osname" in + aix) postprocess_cc_v="|$tr , ' '" ;; + esac $cat >ccsym <tmp.c <&1 $postprocess_cc_v\` do case "\$i" in -D*) echo "\$i" | $sed 's/^-D//';; *************** *** 10828,10836 **** done $rm -f try.c EOS chmod +x ccsym $eunicefix ccsym ! ./ccsym | $sort | $uniq >ccsym.raw $awk '/\=/ { print $0; next } { print $0"=1" }' ccsym.raw >ccsym.list $awk '{ print $0"=1" }' Cppsym.true >ccsym.true --- 11127,11142 ---- done $rm -f try.c EOS + unset postprocess_cc_v chmod +x ccsym $eunicefix ccsym ! ./ccsym > ccsym1.raw ! if $test -s ccsym1.raw; then ! $sort ccsym1.raw | $uniq >ccsym.raw ! else ! mv ccsym1.raw ccsym.raw ! fi ! $awk '/\=/ { print $0; next } { print $0"=1" }' ccsym.raw >ccsym.list $awk '{ print $0"=1" }' Cppsym.true >ccsym.true *************** *** 10838,10849 **** $comm -12 ccsym.true ccsym.list >ccsym.com $comm -23 ccsym.true ccsym.list >ccsym.cpp also='' - symbols='symbols' if $test -z ccsym.raw; then echo "Your C compiler doesn't seem to define any symbol!" >&4 echo " " echo "However, your C preprocessor defines the following ones:" $cat Cppsym.true else if $test -s ccsym.com; then echo "Your C compiler and pre-processor define these symbols:" --- 11144,11158 ---- $comm -12 ccsym.true ccsym.list >ccsym.com $comm -23 ccsym.true ccsym.list >ccsym.cpp also='' if $test -z ccsym.raw; then echo "Your C compiler doesn't seem to define any symbol!" >&4 echo " " echo "However, your C preprocessor defines the following ones:" $cat Cppsym.true + ccsymbols='' + cppsymbols=`$cat Cppsym.true` + cppsymbols=`echo $cppsymbols` + cppccsymbols="$cppsymbols" else if $test -s ccsym.com; then echo "Your C compiler and pre-processor define these symbols:" *************** *** 10851,10870 **** also='also ' symbols='ones' $test "$silent" || sleep 1 fi if $test -s ccsym.cpp; then $test "$also" && echo " " ! echo "Your C pre-processor ${also}defines the following $symbols:" $sed -e 's/\(.*\)=.*/\1/' ccsym.cpp also='further ' $test "$silent" || sleep 1 fi if $test -s ccsym.own; then $test "$also" && echo " " ! echo "Your C compiler ${also}defines the following cpp variables:" $sed -e 's/\(.*\)=1/\1/' ccsym.own $sed -e 's/\(.*\)=.*/\1/' ccsym.own | $uniq >>Cppsym.true $test "$silent" || sleep 1 fi fi $rm -f ccsym* --- 11160,11185 ---- also='also ' symbols='ones' $test "$silent" || sleep 1 + cppccsymbols=`$cat ccsym.com` + cppccsymbols=`echo $cppccsymbols` fi if $test -s ccsym.cpp; then $test "$also" && echo " " ! echo "Your C pre-processor ${also}defines the following symbols:" $sed -e 's/\(.*\)=.*/\1/' ccsym.cpp also='further ' $test "$silent" || sleep 1 + cppsymbols=`$cat ccsym.cpp` + cppsymbols=`echo $cppsymbols` fi if $test -s ccsym.own; then $test "$also" && echo " " ! echo "Your C compiler ${also}defines the following cpp symbols:" $sed -e 's/\(.*\)=1/\1/' ccsym.own $sed -e 's/\(.*\)=.*/\1/' ccsym.own | $uniq >>Cppsym.true $test "$silent" || sleep 1 + ccsymbols=`$cat ccsym.own` + ccsymbols=`echo $ccsymbols` fi fi $rm -f ccsym* *************** *** 11047,11064 **** set i_sysioctl eval $setvar - : see if this is a sys/param system - set sys/param.h i_sysparam - eval $inhdr - : see if sys/resource.h has to be included set sys/resource.h i_sysresrc eval $inhdr - : see if sys/stat.h is available - set sys/stat.h i_sysstat - eval $inhdr - : see if this is a sys/un.h system set sys/un.h i_sysun eval $inhdr --- 11362,11371 ---- *************** *** 11195,11200 **** --- 11502,11508 ---- esac ;; IPC/SysV|ipc/sysv) + : XXX Do we need a useipcsysv variable here case "${d_msg}${d_sem}${d_shm}" in *"${define}"*) avail_ext="$avail_ext $xxx" ;; esac *************** *** 11441,11446 **** --- 11749,11755 ---- cccdlflags='$cccdlflags' ccdlflags='$ccdlflags' ccflags='$ccflags' + ccsymbols='$ccsymbols' cf_by='$cf_by' cf_email='$cf_email' cf_time='$cf_time' *************** *** 11460,11465 **** --- 11769,11776 ---- cppminus='$cppminus' cpprun='$cpprun' cppstdin='$cppstdin' + cppsymbols='$cppsymbols' + cppccsymbols='$cppccsymbols' cryptlib='$cryptlib' csh='$csh' d_Gconvert='$d_Gconvert' *************** *** 11512,11517 **** --- 11823,11833 ---- d_fork='$d_fork' d_fpathconf='$d_fpathconf' d_fsetpos='$d_fsetpos' + d_fstatfs='$d_fstatfs' + d_statfsflags='$d_statfsflags' + d_fstatvfs='$d_fstatvfs' + d_getmntent='$d_getmntent' + d_hasmntopt='$d_hasmntopt' d_ftime='$d_ftime' d_getgrent='$d_getgrent' d_getgrps='$d_getgrps' *************** *** 11706,11711 **** --- 12022,12028 ---- flex='$flex' fpostype='$fpostype' freetype='$freetype' + full_ar='$full_ar' full_csh='$full_csh' full_sed='$full_sed' gccversion='$gccversion' *************** *** 11734,11746 **** --- 12051,12066 ---- i_limits='$i_limits' i_locale='$i_locale' i_malloc='$i_malloc' + i_machcthreads='$i_machcthreads' i_math='$i_math' i_memory='$i_memory' + i_mntent='$i_mntent' i_ndbm='$i_ndbm' i_netdb='$i_netdb' i_neterrno='$i_neterrno' i_niin='$i_niin' i_pwd='$i_pwd' + i_pthread='$i_pthread' i_rpcsvcdbm='$i_rpcsvcdbm' i_sfio='$i_sfio' i_sgtty='$i_sgtty' *************** *** 11753,11764 **** --- 12073,12086 ---- i_sysfilio='$i_sysfilio' i_sysin='$i_sysin' i_sysioctl='$i_sysioctl' + i_sysmount='$i_sysmount' i_sysndir='$i_sysndir' i_sysparam='$i_sysparam' i_sysresrc='$i_sysresrc' i_sysselct='$i_sysselct' i_syssockio='$i_syssockio' i_sysstat='$i_sysstat' + i_sysstatvfs='$i_sysstatvfs' i_systime='$i_systime' i_systimek='$i_systimek' i_systimes='$i_systimes' *************** *** 11774,11779 **** --- 12096,12102 ---- i_varargs='$i_varargs' i_varhdr='$i_varhdr' i_vfork='$i_vfork' + ignore_versioned_solibs='$ignore_versioned_solibs' incpath='$incpath' inews='$inews' installarchlib='$installarchlib' *************** *** 11784,11789 **** --- 12107,12113 ---- installscript='$installscript' installsitearch='$installsitearch' installsitelib='$installsitelib' + installusrbinperl='$installusrbinperl' intsize='$intsize' known_extensions='$known_extensions' ksh='$ksh' *************** *** 11882,11887 **** --- 12206,12212 ---- scriptdir='$scriptdir' scriptdirexp='$scriptdirexp' sed='$sed' + selectminbits='$selectminbits' selecttype='$selecttype' sendmail='$sendmail' sh='$sh' *************** *** 11894,11899 **** --- 12219,12225 ---- sig_name='$sig_name' sig_name_init='$sig_name_init' sig_num='$sig_num' + sig_num_init='$sig_num_init' signal_t='$signal_t' sitearch='$sitearch' sitearchexp='$sitearchexp' *************** *** 12022,12072 **** : if this fails, just run all the .SH files by hand . ./config.sh - - case "$ebcdic" in - $define) - xxx='' - echo "This is an EBCDIC system, checking if any parser files need regenerating." >&4 - rm -f y.tab.c y.tab.h - yacc -d perly.y >/dev/null 2>&1 - if cmp -s y.tab.c perly.c; then - rm -f y.tab.c - else - echo "perly.y -> perly.c" >&4 - mv -f y.tab.c perly.c - chmod u+w perly.c - sed -e 's/fprintf *( *stderr *,/PerlIO_printf(Perl_debug_log,/g' \ - -e 's/y\.tab/perly/g' perly.c >perly.tmp && mv perly.tmp perly.c - xxx="$xxx perly.c" - fi - if cmp -s y.tab.h perly.h; then - rm -f y.tab.h - else - echo "perly.y -> perly.h" >&4 - mv -f y.tab.h perly.h - xxx="$xxx perly.h" - fi - echo "x2p/a2p.y" >&4 - cd x2p - rm -f y.tab.c - yacc a2p.y >/dev/null 2>&1 - if cmp -s y.tab.c a2p.c - then - rm -f y.tab.c - else - echo "a2p.y -> a2p.c" >&4 - mv -f y.tab.c a2p.c - chmod u+w a2p.c - sed -e 's/fprintf *( *stderr *,/PerlIO_printf(Perl_debug_log,/g' \ - -e 's/y\.tab/a2p/g' a2p.c >a2p.tmp && mv a2p.tmp a2p.c - xxx="$xxx a2p.c" - fi - cd .. - case "$xxx" in - '') echo "No parser files were regenerated. That's okay." >&4 ;; - esac - ;; - esac echo " " exec 1>&4 --- 12348,12353 ---- diff -c 'perl5.005_02/Copying' 'perl5.005_03/Copying' Index: ./Copying *** ./Copying Thu Jul 23 22:59:27 1998 --- ./Copying Sun Oct 25 08:23:54 1998 *************** *** 2,8 **** Version 1, February 1989 Copyright (C) 1989 Free Software Foundation, Inc. ! 675 Mass Ave, Cambridge, MA 02139, USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. --- 2,8 ---- Version 1, February 1989 Copyright (C) 1989 Free Software Foundation, Inc. ! 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. *************** *** 215,222 **** GNU General Public License for more details. You should have received a copy of the GNU General Public License ! along with this program; if not, write to the Free Software ! Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. Also add information on how to contact you by electronic and paper mail. --- 215,222 ---- GNU General Public License for more details. You should have received a copy of the GNU General Public License ! along with this program; if not, write to the Free Software Foundation, ! Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. Also add information on how to contact you by electronic and paper mail. diff -c 'perl5.005_02/EXTERN.h' 'perl5.005_03/EXTERN.h' Index: ./EXTERN.h *** ./EXTERN.h Thu Jul 23 22:59:27 1998 --- ./EXTERN.h Sat Mar 27 11:57:35 1999 *************** *** 1,6 **** /* EXTERN.h * ! * Copyright (c) 1991-1997, Larry Wall * * You may distribute under the terms of either the GNU General Public * License or the Artistic License, as specified in the README file. --- 1,6 ---- /* EXTERN.h * ! * Copyright (c) 1991-1999, Larry Wall * * You may distribute under the terms of either the GNU General Public * License or the Artistic License, as specified in the README file. diff -c 'perl5.005_02/INSTALL' 'perl5.005_03/INSTALL' Index: ./INSTALL Prereq: 1.42 *** ./INSTALL Wed Aug 5 16:57:37 1998 --- ./INSTALL Thu Mar 25 23:45:35 1999 *************** *** 64,69 **** --- 64,86 ---- changes in the Perl language in the current release. Please see pod/perldelta.pod for a description of what's changed. + =head1 WARNING: This version requires a compiler that supports ANSI C. + + If you find that your C compiler is not ANSI-capable, try obtaining + GCC, available from GNU mirrors worldwide (e.g. ftp://ftp.gnu.org/pub/gnu). + Another alternative may be to use a tool like C to convert the + sources back to K&R style, but there is no guarantee this route will get + you anywhere, since the prototypes are not the only ANSI features used + in the Perl sources. C is usually found as part of the freely + available C distribution. Another similar tool is + C, distributed with GCC. Since C requires GCC to + run, you may have to run it on a platform where GCC is available, and move + the sources back to the platform without GCC. + + If you succeed in automatically converting the sources to a K&R compatible + form, be sure to email perlbug@perl.com to let us know the steps you + followed. This will enable us to officially support this option. + =head1 Space Requirements The complete perl5 source tree takes up about 10 MB of disk space. The *************** *** 167,172 **** --- 184,192 ---- into a directory typically found along a user's PATH, or in another obvious and convenient place. + You can use "Configure -Uinstallusrbinperl" which causes installperl + to skip installing perl also as /usr/bin/perl. + By default, Configure will compile perl to use dynamic loading if your system supports it. If you want to force perl to be compiled statically, you can either choose this when Configure prompts you or *************** *** 472,494 **** If you need to install perl on many identical systems, it is convenient to compile it once and create an archive that can be ! installed on multiple systems. Here's one way to do that: # Set up config.over to install perl into a different directory, # e.g. /tmp/perl5 (see previous part). ! sh Configure -des make make test ! make install cd /tmp/perl5 ! # Edit $archlib/Config.pm to change all the # install* variables back to reflect where everything will ! # really be installed. ! # Edit any of the scripts in $scriptdir to have the correct # #!/wherever/perl line. tar cvf ../perl5-archive.tar . # Then, on each machine where you want to install perl, ! cd /usr/local # Or wherever you specified as $prefix tar xvf perl5-archive.tar =head2 Site-wide Policy settings --- 492,517 ---- If you need to install perl on many identical systems, it is convenient to compile it once and create an archive that can be ! installed on multiple systems. Suppose, for example, that you want to ! create an archive that can be installed in /opt/perl. ! Here's one way to do that: # Set up config.over to install perl into a different directory, # e.g. /tmp/perl5 (see previous part). ! sh Configure -Dprefix=/opt/perl -des make make test ! make install # This will install everything into /tmp/perl5. cd /tmp/perl5 ! # Edit $archlib/Config.pm and $archlib/.packlist to change all the # install* variables back to reflect where everything will ! # really be installed. (That is, change /tmp/perl5 to /opt/perl ! # everywhere in those files.) ! # Check the scripts in $scriptdir to make sure they have the correct # #!/wherever/perl line. tar cvf ../perl5-archive.tar . # Then, on each machine where you want to install perl, ! cd /opt/perl # Or wherever you specified as $prefix tar xvf perl5-archive.tar =head2 Site-wide Policy settings *************** *** 518,525 **** =head2 Threads ! On some platforms, perl5.005 can be compiled to use threads. To ! enable this, read the file README.threads, and then try sh Configure -Dusethreads --- 541,549 ---- =head2 Threads ! On some platforms, perl5.005 can be compiled with experimental support ! for threads. To enable this, read the file README.threads, and then ! try: sh Configure -Dusethreads *************** *** 653,661 **** sh Configure -Duseshrplib ! To actually build perl, you must add the current working directory to your ! LD_LIBRARY_PATH environment variable before running make. You can do ! this with LD_LIBRARY_PATH=`pwd`:$LD_LIBRARY_PATH; export LD_LIBRARY_PATH --- 677,700 ---- sh Configure -Duseshrplib ! To build a shared libperl, the environment variable controlling shared ! library search (LD_LIBRARY_PATH in most systems, DYLD_LIBRARY_PATH for ! NeXTSTEP/OPENSTEP, LIBRARY_PATH for BeOS) must be set up to include ! the Perl build directory because that's where the shared libperl will ! be created. Configure arranges Makefile to have the correct shared ! library search settings. ! ! However, there are some special cases where manually setting the ! shared library path might be required. For example, if you want to run ! something like the following with the newly-built but not-yet-installed ! ./perl: ! ! cd t; ./perl misc/failing_test.t ! or ! ./perl -Ilib ~/my_mission_critical_test ! ! then you need to set up the shared library path explicitly. ! You can do this with LD_LIBRARY_PATH=`pwd`:$LD_LIBRARY_PATH; export LD_LIBRARY_PATH *************** *** 663,671 **** setenv LD_LIBRARY_PATH `pwd` ! for Csh-style shells. You *MUST* do this before running make. ! Folks running NeXT OPENSTEP must substitute DYLD_LIBRARY_PATH for ! LD_LIBRARY_PATH above. There is also an potential problem with the shared perl library if you want to have more than one "flavor" of the same version of perl (e.g. --- 702,714 ---- setenv LD_LIBRARY_PATH `pwd` ! for Csh-style shells. (This procedure may also be needed if for some ! unexpected reason Configure fails to set up Makefile correctly.) ! ! You can often recognize failures to build/use a shared libperl from error ! messages complaining about a missing libperl.so (or libperl.sl in HP-UX), ! for example: ! 18126:./miniperl: /sbin/loader: Fatal Error: cannot map libperl.so There is also an potential problem with the shared perl library if you want to have more than one "flavor" of the same version of perl (e.g. *************** *** 771,791 **** by adding appropriate -D directives to your ccflags variable in config.sh. - For example, you can replace the rand() and srand() functions in the - perl source by any other random number generator by a trick such as the - following (this should all be on one line): - - sh Configure -Dccflags='-Dmy_rand=random -Dmy_srand=srandom' \ - -Drandbits=31 - - or you can use the drand48 family of functions with - - sh Configure -Dccflags='-Dmy_rand=lrand48 -Dmy_srand=srand48' \ - -Drandbits=31 - - or by adding the -D flags to your ccflags at the appropriate Configure - prompt. (Read pp.c to see how this works.) - You should also run Configure interactively to verify that a hint file doesn't inadvertently override your ccflags setting. (Hints files shouldn't do that, but some might.) --- 814,819 ---- *************** *** 920,925 **** --- 948,989 ---- You'll probably also have to extensively modify the extension building mechanism. + =item Environment variable clashes + + Configure uses a CONFIG variable that is reported to cause trouble on + ReliantUnix 5.44. If your system sets this variable, you can try + unsetting it before you run Configure. Configure should eventually + be fixed to avoid polluting the namespace of the environment. + + =item Digital UNIX/Tru64 UNIX and BIN_SH + + In Digital UNIX/Tru64 UNIX Configure might abort with + + Build a threading Perl? [n] + Configure[2437]: Syntax error at line 1 : `config.sh' is not expected. + + This indicates that Configure is being run with a broken Korn shell + (even though you think you are using a Bourne shell by using + "sh Configure" or "./Configure"). The Korn shell bug has been reported + to Compaq as of February 1999 but in the meanwhile, the reason ksh is + being used is that you have the environment variable BIN_SH set to + 'xpg4'. This causes /bin/sh to delegate its duties to /bin/posix/sh + (a ksh). Unset the environment variable and rerun Configure. + + =item HP-UX 11, pthreads, and libgdbm + + If you are running Configure with -Dusethreads in HP-UX 11, be warned + that POSIX threads and libgdbm (the GNU dbm library) compiled before + HP-UX 11 do not mix. This will cause a basic test run by Configure to + fail + + Pthread internal error: message: __libc_reinit() failed, file: ../pthreads/pthread.c, line: 1096 + Return Pointer is 0xc082bf33 + sh: 5345 Quit(coredump) + + and Configure will give up. The cure is to recompile and install + libgdbm under HP-UX 11. + =item Porting information Specific information for the OS/2, Plan9, VMS and Win32 ports is in the *************** *** 1218,1223 **** --- 1282,1298 ---- with "ipcrm -s SEMAPHORE_ID_HERE" or configure more semaphores to your system. + =item GNU binutils + + If you mix GNU binutils (nm, ld, ar) with equivalent vendor-supplied + tools you may be in for some trouble. For example creating archives + with an old GNU 'ar' and then using a new current vendor-supplied 'ld' + may lead into linking problems. Either recompile your GNU binutils + under your current operating system release, or modify your PATH not + to include the GNU utils before running Configure, or specify the + vendor-supplied utilities explicitly to Configure, for example by + Configure -Dar=/bin/ar. + =item Miscellaneous Some additional things that have been reported for either perl4 or perl5: *************** *** 1236,1241 **** --- 1311,1322 ---- Machines with half-implemented dbm routines will need to #undef I_ODBM + HP-UX 11 Y2K patch "Y2K-1100 B.11.00.B0125 HP-UX Core OS Year 2000 + Patch Bundle" has been reported to break the io/fs test #18 which + tests whether utime() can change timestamps. The Y2K patch seems to + break utime() so that over NFS the timestamps do not get changed + (on local filesystems utime() still works). + =back =head1 make test diff -c 'perl5.005_02/INTERN.h' 'perl5.005_03/INTERN.h' Index: ./INTERN.h *** ./INTERN.h Thu Jul 23 22:59:28 1998 --- ./INTERN.h Sat Mar 27 11:57:33 1999 *************** *** 1,6 **** /* INTERN.h * ! * Copyright (c) 1991-1997, Larry Wall * * You may distribute under the terms of either the GNU General Public * License or the Artistic License, as specified in the README file. --- 1,6 ---- /* INTERN.h * ! * Copyright (c) 1991-1999, Larry Wall * * You may distribute under the terms of either the GNU General Public * License or the Artistic License, as specified in the README file. diff -c 'perl5.005_02/MANIFEST' 'perl5.005_03/MANIFEST' Index: ./MANIFEST *** ./MANIFEST Tue Aug 4 18:08:11 1998 --- ./MANIFEST Sun Mar 28 10:12:59 1999 *************** *** 29,37 **** --- 29,41 ---- Porting/pumpkin.pod Guidelines and hints for Perl maintainers README The Instructions README.amiga Notes about AmigaOS port + README.apollo Notes about Apollo DomainOS port README.beos Notes about BeOS port README.cygwin32 Notes about Cygwin32 port README.dos Notes about dos/djgpp port + README.hpux Notes about HP-UX port + README.hurd Notes about GNU/Hurd port + README.mint Notes about Atari MiNT port README.mpeix Notes about MPE/iX port README.os2 Notes about OS/2 port README.os390 Notes about OS/390 (nee MVS) port *************** *** 39,49 **** --- 43,55 ---- README.qnx Notes about QNX port README.threads Notes about multithreading README.vms Notes about VMS port + README.vos Notes about Stratus VOS port README.win32 Notes about Win32 port Todo The Wishlist Todo-5.005 What needs doing before 5.005 release XSlock.h Include file for extensions built with PERL_OBJECT defined XSUB.h Include file for extension subroutines + apollo/netinet/in.h Apollo DomainOS port: C header file frontend av.c Array value code av.h Array value header beos/nm.c BeOS port *************** *** 65,72 **** cygwin32/perlgcc Cygwin32 port cygwin32/perlld Cygwin32 port deb.c Debugging routines ! djgpp/config.over DOS/DJGPP port ! djgpp/configure.bat DOS/DJGPP port djgpp/djgpp.c DOS/DJGPP port djgpp/djgppsed.sh DOS/DJGPP port djgpp/fixpmain DOS/DJGPP port --- 71,78 ---- cygwin32/perlgcc Cygwin32 port cygwin32/perlld Cygwin32 port deb.c Debugging routines ! djgpp/config.over DOS/DJGPP port ! djgpp/configure.bat DOS/DJGPP port djgpp/djgpp.c DOS/DJGPP port djgpp/djgppsed.sh DOS/DJGPP port djgpp/fixpmain DOS/DJGPP port *************** *** 185,190 **** --- 191,197 ---- ext/DB_File/DB_File_BS Berkeley DB extension mkbootstrap fodder ext/DB_File/Makefile.PL Berkeley DB extension makefile writer ext/DB_File/dbinfo Berkeley DB database version checker + ext/DB_File/hints/dynixptx.pl Hints for DB_File for named architecture ext/DB_File/typemap Berkeley DB extension interface types ext/Data/Dumper/Changes Data pretty printer, changelog ext/Data/Dumper/Dumper.pm Data pretty printer, module *************** *** 195,200 **** --- 202,208 ---- ext/DynaLoader/Makefile.PL Dynamic Loader makefile writer ext/DynaLoader/README Dynamic Loader notes and intro ext/DynaLoader/dl_aix.xs AIX implementation + ext/DynaLoader/dl_beos.xs BeOS implementation ext/DynaLoader/dl_cygwin32.xs Cygwin32 implementation ext/DynaLoader/dl_dld.xs GNU dld style implementation ext/DynaLoader/dl_dlopen.xs BSD/SunOS4&5 dlopen() style implementation *************** *** 213,218 **** --- 221,227 ---- ext/GDBM_File/GDBM_File.pm GDBM extension Perl module ext/GDBM_File/GDBM_File.xs GDBM extension external subroutines ext/GDBM_File/Makefile.PL GDBM extension makefile writer + ext/GDBM_File/hints/sco.pl Hint for GDBM_File for named architecture ext/GDBM_File/typemap GDBM extension interface types ext/IO/IO.pm Top-level interface to IO::* classes ext/IO/IO.xs IO extension external subroutines *************** *** 262,269 **** --- 271,280 ---- ext/POSIX/POSIX.pod POSIX extension documentation ext/POSIX/POSIX.xs POSIX extension external subroutines ext/POSIX/hints/bsdos.pl Hint for POSIX for named architecture + ext/POSIX/hints/dynixptx.pl Hint for POSIX for named architecture ext/POSIX/hints/freebsd.pl Hint for POSIX for named architecture ext/POSIX/hints/linux.pl Hint for POSIX for named architecture + ext/POSIX/hints/mint.pl Hint for POSIX for named architecture ext/POSIX/hints/netbsd.pl Hint for POSIX for named architecture ext/POSIX/hints/next_3.pl Hint for POSIX for named architecture ext/POSIX/hints/openbsd.pl Hint for POSIX for named architecture *************** *** 380,385 **** --- 391,397 ---- hints/fps.sh Hints for named architecture hints/freebsd.sh Hints for named architecture hints/genix.sh Hints for named architecture + hints/gnu.sh Hints for named architecture hints/greenhills.sh Hints for named architecture hints/hpux.sh Hints for named architecture hints/i386.sh Hints for named architecture *************** *** 394,399 **** --- 406,412 ---- hints/lynxos.sh Hints for named architecture hints/machten.sh Hints for named architecture hints/machten_2.sh Hints for named architecture + hints/mint.sh Hints for named architecture hints/mips.sh Hints for named architecture hints/mpc.sh Hints for named architecture hints/mpeix.sh Hints for named architecture *************** *** 429,440 **** hints/unisysdynix.sh Hints for named architecture hints/utekv.sh Hints for named architecture hints/uts.sh Hints for named architecture hv.c Hash value code hv.h Hash value header installhtml Perl script to install html files for pods installman Perl script to install man pages for pods installperl Perl script to do "make install" dirty work - interp.sym Interpreter specific symbols to hide in a struct intrpvar.h Variables held in each interpreter instance iperlsys.h Perl's interface to the system keywords.h The keyword numbers --- 442,453 ---- hints/unisysdynix.sh Hints for named architecture hints/utekv.sh Hints for named architecture hints/uts.sh Hints for named architecture + hints/uwin.sh Hints for named architecture hv.c Hash value code hv.h Hash value header installhtml Perl script to install html files for pods installman Perl script to install man pages for pods installperl Perl script to do "make install" dirty work intrpvar.h Variables held in each interpreter instance iperlsys.h Perl's interface to the system keywords.h The keyword numbers *************** *** 456,463 **** lib/Carp.pm Error message base class lib/Class/Struct.pm Declare struct-like datatypes as Perl classes lib/Cwd.pm Various cwd routines (getcwd, fastcwd, chdir) ! lib/Devel/SelfStubber.pm Generate stubs for SelfLoader.pm lib/DirHandle.pm like FileHandle only for directories lib/English.pm Readable aliases for short variables lib/Env.pm Map environment into ordinary variables lib/Exporter.pm Exporter base class --- 469,477 ---- lib/Carp.pm Error message base class lib/Class/Struct.pm Declare struct-like datatypes as Perl classes lib/Cwd.pm Various cwd routines (getcwd, fastcwd, chdir) ! lib/Devel/SelfStubber.pm Generate stubs for SelfLoader.pm lib/DirHandle.pm like FileHandle only for directories + lib/Dumpvalue.pm Screen dump of perl values lib/English.pm Readable aliases for short variables lib/Env.pm Map environment into ordinary variables lib/Exporter.pm Exporter base class *************** *** 553,559 **** lib/bigrat.pl An arbitrary precision rational arithmetic package lib/blib.pm For "use blib" lib/cacheout.pl Manages output filehandles when you need too many ! lib/chat2.pl Obsolete ipc library (use Comm.pm etc instead) lib/complete.pl A command completion subroutine lib/constant.pm For "use constant" lib/ctime.pl A ctime workalike --- 567,573 ---- lib/bigrat.pl An arbitrary precision rational arithmetic package lib/blib.pm For "use blib" lib/cacheout.pl Manages output filehandles when you need too many ! lib/chat2.pl Obsolete ipc library (use Comm.pm etc instead) lib/complete.pl A command completion subroutine lib/constant.pm For "use constant" lib/ctime.pl A ctime workalike *************** *** 602,607 **** --- 616,628 ---- mg.h Magic header minimod.pl Writes lib/ExtUtils/Miniperl.pm miniperlmain.c Basic perl w/o dynamic loading or extensions + mint/errno.h MiNT port + mint/Makefile MiNT port + mint/pwd.c MiNT port + mint/README MiNT port + mint/stdio.h MiNT port + mint/sys/time.h MiNT port + mint/time.h MiNT port mpeix/mpeixish.h MPE/iX port mpeix/nm MPE/iX port mpeix/relink MPE/iX port *************** *** 725,739 **** --- 746,763 ---- pod/perlmodlib.pod Module policy info pod/perlobj.pod Object info pod/perlop.pod Operator info + pod/perlopentut.pod open() tutorial pod/perlpod.pod Pod info pod/perlport.pod Portability guide pod/perlre.pod Regular expression info pod/perlref.pod References info + pod/perlreftut.pod References tutorial pod/perlrun.pod Execution info pod/perlsec.pod Security info pod/perlstyle.pod Style info pod/perlsub.pod Subroutine info pod/perlsyn.pod Syntax info + pod/perlthrtut.pod Threads tutorial pod/perltie.pod Tieing an object class into a simple variable pod/perltoc.pod Table of Contents info pod/perltoot.pod Tom's object-oriented tutorial *************** *** 829,834 **** --- 853,859 ---- t/lib/english.t See if English works t/lib/env.t See if Env works t/lib/errno.t See if Errno works + t/lib/fatal.t See if Fatal works t/lib/fields.t See if base/fields works t/lib/filecache.t See if FileCache works t/lib/filecopy.t See if File::Copy works *************** *** 870,876 **** t/lib/soundex.t See if Soundex works t/lib/symbol.t See if Symbol works t/lib/texttabs.t See if Text::Tabs works ! t/lib/textwrap.t See if Text::Wrap works t/lib/thread.t Basic test of threading (skipped if no threads) t/lib/tie-push.t Test for Tie::Array t/lib/tie-stdarray.t Test for Tie::StdArray --- 895,902 ---- t/lib/soundex.t See if Soundex works t/lib/symbol.t See if Symbol works t/lib/texttabs.t See if Text::Tabs works ! t/lib/textfill.t See if Text::Wrap::fill works ! t/lib/textwrap.t See if Text::Wrap::wrap works t/lib/thread.t Basic test of threading (skipped if no threads) t/lib/tie-push.t Test for Tie::Array t/lib/tie-stdarray.t Test for Tie::StdArray *************** *** 903,908 **** --- 929,935 ---- t/op/glob.t See if <*> works t/op/goto.t See if goto works t/op/goto_xs.t See if "goto &sub" works on XSUBs + t/op/grep.t See if grep() and map() work t/op/groups.t See if $( works t/op/gv.t See if typeglobs work t/op/hashwarn.t See if warnings for bad hash assignments work *************** *** 938,944 **** t/op/runlevel.t See if die() works from perl_call_*() t/op/sleep.t See if sleep works t/op/sort.t See if sort works ! t/op/splice.t See if splice works t/op/split.t See if split works t/op/sprintf.t See if sprintf works t/op/stat.t See if stat works --- 965,971 ---- t/op/runlevel.t See if die() works from perl_call_*() t/op/sleep.t See if sleep works t/op/sort.t See if sort works ! t/op/splice.t See if splice works t/op/split.t See if split works t/op/sprintf.t See if sprintf works t/op/stat.t See if stat works *************** *** 951,956 **** --- 978,984 ---- t/op/tiearray.t See if tie for arrays works t/op/tiehandle.t See if tie for handles works t/op/time.t See if time functions work + t/op/tr.t See if tr works t/op/undef.t See if undef works t/op/universal.t See if UNIVERSAL class works t/op/unshift.t See if unshift works *************** *** 1006,1024 **** vms/genopt.com hack to write options files in case of broken makes vms/make_command.com record MM[SK] command used to build Perl vms/mms2make.pl convert descrip.mms to make syntax ! vms/munchconfig.c performs shell $var substitution for VMS vms/myconfig.com record local configuration info for bug report vms/perlvms.pod VMS-specific additions to Perl documentation vms/perly_c.vms perly.c with fixed declarations for global syms vms/perly_h.vms perly.h with fixed declarations for global syms vms/sockadapt.c glue for SockshShr socket support vms/sockadapt.h glue for SockshShr socket support ! vms/subconfigure.com performs compiler checks and writes config.sh, config.h, and descrip.mms vms/test.com DCL driver for regression tests vms/vms.c VMS-specific C code for Perl core vms/vms_yfix.pl convert Unix perly.[ch] to VMS perly_[ch].vms vms/vmsish.h VMS-specific C header for Perl core vms/writemain.pl Generate perlmain.c from miniperlmain.c+extensions win32/GenCAPI.pl Win32 port for C API with PERL_OBJECT win32/Makefile Win32 makefile for NMAKE (Visual C++ build) win32/TEST Win32 port --- 1034,1062 ---- vms/genopt.com hack to write options files in case of broken makes vms/make_command.com record MM[SK] command used to build Perl vms/mms2make.pl convert descrip.mms to make syntax ! vms/munchconfig.c performs shell $var substitution for VMS vms/myconfig.com record local configuration info for bug report vms/perlvms.pod VMS-specific additions to Perl documentation vms/perly_c.vms perly.c with fixed declarations for global syms vms/perly_h.vms perly.h with fixed declarations for global syms vms/sockadapt.c glue for SockshShr socket support vms/sockadapt.h glue for SockshShr socket support ! vms/subconfigure.com performs compiler checks and writes config.sh, config.h, and descrip.mms vms/test.com DCL driver for regression tests vms/vms.c VMS-specific C code for Perl core vms/vms_yfix.pl convert Unix perly.[ch] to VMS perly_[ch].vms vms/vmsish.h VMS-specific C header for Perl core vms/writemain.pl Generate perlmain.c from miniperlmain.c+extensions + vos/build.cm VOS command macro to build Perl + vos/Changes Changes made to port Perl to the VOS operating system + vos/compile_perl.cm VOS commnad macro to build multiple version of Perl + vos/config.h config.h for VOS + vos/config_h.SH_orig config_h.SH at the time config.h was created + vos/perl.bind VOS bind control file + vos/test_vos_dummies.c Test program for "vos_dummies.c" + vos/vos_accept.c Wrapper to fixup nonstandard VOS _accept function + vos/vos_dummies.c Wrappers to soak up undefined functions + vos/vosish.h VOS-specific header file win32/GenCAPI.pl Win32 port for C API with PERL_OBJECT win32/Makefile Win32 makefile for NMAKE (Visual C++ build) win32/TEST Win32 port diff -c 'perl5.005_02/Makefile.SH' 'perl5.005_03/Makefile.SH' Index: ./Makefile.SH *** ./Makefile.SH Thu Jul 23 22:59:30 1998 --- ./Makefile.SH Wed Mar 3 20:35:25 1999 *************** *** 43,54 **** # NeXT uses a different name. ldlibpth="DYLD_LIBRARY_PATH=`pwd`:$DYLD_LIBRARY_PATH" ;; os2*) # OS/2 doesn't need anything special for LD_LIBRARY_PATH. ldlibpth='' ;; ! sunos*|freebsd[23]*|netbsd*) linklibperl="-lperl" ;; aix*) shrpldflags="-H512 -T512 -bhalt:4 -bM:SRE -bE:perl.exp" case "$osvers" in --- 43,59 ---- # NeXT uses a different name. ldlibpth="DYLD_LIBRARY_PATH=`pwd`:$DYLD_LIBRARY_PATH" ;; + beos*) ldlibpth="LIBRARY_PATH=`pwd`:$LIBRARY_PATH" + ;; os2*) # OS/2 doesn't need anything special for LD_LIBRARY_PATH. ldlibpth='' ;; ! sunos*) linklibperl="-lperl" ;; + netbsd*|freebsd[234]*) + linklibperl="-L. -lperl" + ;; aix*) shrpldflags="-H512 -T512 -bhalt:4 -bM:SRE -bE:perl.exp" case "$osvers" in *************** *** 161,167 **** $make_set_make # These variables may need to be manually set for non-Unix systems. ! AR = $ar EXE_EXT = $_exe LIB_EXT = $_a OBJ_EXT = $_o --- 166,172 ---- $make_set_make # These variables may need to be manually set for non-Unix systems. ! AR = $full_ar EXE_EXT = $_exe LIB_EXT = $_a OBJ_EXT = $_o *************** *** 450,463 **** -@sh -c true # No compat3.sym here since and including the 5.004_50. ! SYM = global.sym interp.sym perlio.sym thread.sym SYMH = perlvars.h thrdvar.h # The following files are generated automatically # keywords.h: keywords.pl # opcode.h: opcode.pl ! # embed.h: embed.pl global.sym interp.sym # byterun.h: bytecode.pl # byterun.c: bytecode.pl # lib/B/Asmdata.pm: bytecode.pl --- 455,469 ---- -@sh -c true # No compat3.sym here since and including the 5.004_50. ! # No interp.sym since 5.005_03. ! SYM = global.sym perlio.sym thread.sym SYMH = perlvars.h thrdvar.h # The following files are generated automatically # keywords.h: keywords.pl # opcode.h: opcode.pl ! # embed.h: embed.pl global.sym # byterun.h: bytecode.pl # byterun.c: bytecode.pl # lib/B/Asmdata.pm: bytecode.pl *************** *** 598,610 **** # Please *don't* use this unless all tests pass. # If you want to report test failures, use "make nok" instead. ok: utilities ! $(LBLIBPTH) ./perl -Ilib utils/perlbug -ok -s '(UNINSTALLED)' okfile: utilities ! $(LBLIBPTH) ./perl -Ilib utils/perlbug -ok -s '(UNINSTALLED)' -F perl.ok nok: utilities ! $(LBLIBPTH) ./perl -Ilib utils/perlbug -nok -s '(UNINSTALLED)' clist: $(c) echo $(c) | tr ' ' $(TRNL) >.clist --- 604,616 ---- # Please *don't* use this unless all tests pass. # If you want to report test failures, use "make nok" instead. ok: utilities ! $(LDLIBPTH) ./perl -Ilib utils/perlbug -ok -s '(UNINSTALLED)' okfile: utilities ! $(LDLIBPTH) ./perl -Ilib utils/perlbug -ok -s '(UNINSTALLED)' -F perl.ok nok: utilities ! $(LDLIBPTH) ./perl -Ilib utils/perlbug -nok -s '(UNINSTALLED)' clist: $(c) echo $(c) | tr ' ' $(TRNL) >.clist *************** *** 644,646 **** --- 650,719 ---- ;; esac $rm -f $firstmakefile + + # Now do any special processing required before building. + + case "$ebcdic" in + $define) + xxx='' + echo "This is an EBCDIC system, checking if any parser files need regenerating." >&4 + case "$osname" in + os390) + rm -f y.tab.c y.tab.h + yacc -d perly.y >/dev/null 2>&1 + if cmp -s y.tab.c perly.c; then + rm -f y.tab.c + else + echo "perly.y -> perly.c" >&2 + mv -f y.tab.c perly.c + chmod u+w perly.c + sed -e 's/fprintf *( *stderr *,/PerlIO_printf(Perl_debug_log,/g' \ + -e 's/y\.tab/perly/g' perly.c >perly.tmp && mv perly.tmp perly.c + xxx="$xxx perly.c" + fi + if cmp -s y.tab.h perly.h; then + rm -f y.tab.h + else + echo "perly.y -> perly.h" >&2 + mv -f y.tab.h perly.h + xxx="$xxx perly.h" + fi + if cd x2p + then + rm -f y.tab.c y.tab.h + yacc a2p.y >/dev/null 2>&1 + if cmp -s y.tab.c a2p.c + then + rm -f y.tab.c + else + echo "a2p.y -> a2p.c" >&2 + mv -f y.tab.c a2p.c + chmod u+w a2p.c + sed -e 's/fprintf *( *stderr *,/PerlIO_printf(Perl_debug_log,/g' \ + -e 's/y\.tab/a2p/g' a2p.c >a2p.tmp && mv a2p.tmp a2p.c + xxx="$xxx a2p.c" + fi + # In case somebody yacc -d:ed the a2p.y. + if test -f y.tab.h + then + if cmp -s y.tab.h a2p.h + then + rm -f y.tab.h + else + echo "a2p.h -> a2p.h" >&2 + mv -f y.tab.h a2p.h + xxx="$xxx a2p.h" + fi + fi + cd .. + fi + ;; + *) + echo "'$osname' is an EBCDIC system I don't know that well." >&4 + ;; + esac + case "$xxx" in + '') echo "No parser files were regenerated. That's okay." >&2 ;; + esac + ;; + esac diff -c 'perl5.005_02/Porting/Glossary' 'perl5.005_03/Porting/Glossary' Index: ./Porting/Glossary *** ./Porting/Glossary Thu Jul 23 22:59:32 1998 --- ./Porting/Glossary Wed Mar 3 20:35:29 1999 *************** *** 5,11 **** the formatting regular.] Mcc (Loc.U): ! This variable is be used internally by Configure to determine the full pathname (if any) of the Mcc program. After Configure runs, the value is reset to a plain "Mcc" and is not useful. --- 5,11 ---- the formatting regular.] Mcc (Loc.U): ! This variable is used internally by Configure to determine the full pathname (if any) of the Mcc program. After Configure runs, the value is reset to a plain "Mcc" and is not useful. *************** *** 52,58 **** will retain binary compatibility. ar (Loc.U): ! This variable is be used internally by Configure to determine the full pathname (if any) of the ar program. After Configure runs, the value is reset to a plain "ar" and is not useful. --- 52,58 ---- will retain binary compatibility. ar (Loc.U): ! This variable is used internally by Configure to determine the full pathname (if any) of the ar program. After Configure runs, the value is reset to a plain "ar" and is not useful. *************** *** 79,85 **** include os2/os2.obj. awk (Loc.U): ! This variable is be used internally by Configure to determine the full pathname (if any) of the awk program. After Configure runs, the value is reset to a plain "awk" and is not useful. --- 79,85 ---- include os2/os2.obj. awk (Loc.U): ! This variable is used internally by Configure to determine the full pathname (if any) of the awk program. After Configure runs, the value is reset to a plain "awk" and is not useful. *************** *** 105,111 **** The value is a plain '' and is not useful. byacc (Loc.U): ! This variable is be used internally by Configure to determine the full pathname (if any) of the byacc program. After Configure runs, the value is reset to a plain "byacc" and is not useful. --- 105,111 ---- The value is a plain '' and is not useful. byacc (Loc.U): ! This variable is used internally by Configure to determine the full pathname (if any) of the byacc program. After Configure runs, the value is reset to a plain "byacc" and is not useful. *************** *** 129,135 **** 4 = couldn't cast in argument expression list cat (Loc.U): ! This variable is be used internally by Configure to determine the full pathname (if any) of the cat program. After Configure runs, the value is reset to a plain "cat" and is not useful. --- 129,135 ---- 4 = couldn't cast in argument expression list cat (Loc.U): ! This variable is used internally by Configure to determine the full pathname (if any) of the cat program. After Configure runs, the value is reset to a plain "cat" and is not useful. *************** *** 154,159 **** --- 154,165 ---- This variable contains any additional C compiler flags desired by the user. It is up to the Makefile to use this. + ccsymbols (Cppsym.U): + The variable contains the symbols defined by the C compiler alone. + The symbols defined by cpp or by cc when it calls cpp are not in + this list, see cppsymbols and cppccsymbols. + The list is a space-separated list of symbol=value tokens. + cf_by (cf_who.U): Login name of the person who ran the Configure script and answered the questions. This is used to tag both config.sh and config_h.SH. *************** *** 184,190 **** included). comm (Loc.U): ! This variable is be used internally by Configure to determine the full pathname (if any) of the comm program. After Configure runs, the value is reset to a plain "comm" and is not useful. --- 190,196 ---- included). comm (Loc.U): ! This variable is used internally by Configure to determine the full pathname (if any) of the comm program. After Configure runs, the value is reset to a plain "comm" and is not useful. *************** *** 199,205 **** is primarily for the use of other Configure units. cp (Loc.U): ! This variable is be used internally by Configure to determine the full pathname (if any) of the cp program. After Configure runs, the value is reset to a plain "cp" and is not useful. --- 205,211 ---- is primarily for the use of other Configure units. cp (Loc.U): ! This variable is used internally by Configure to determine the full pathname (if any) of the cp program. After Configure runs, the value is reset to a plain "cp" and is not useful. *************** *** 208,214 **** The value is a plain '' and is not useful. cpp (Loc.U): ! This variable is be used internally by Configure to determine the full pathname (if any) of the cpp program. After Configure runs, the value is reset to a plain "cpp" and is not useful. --- 214,220 ---- The value is a plain '' and is not useful. cpp (Loc.U): ! This variable is used internally by Configure to determine the full pathname (if any) of the cpp program. After Configure runs, the value is reset to a plain "cpp" and is not useful. *************** *** 244,256 **** It is primarily used by other Configure units that ask about preprocessor symbols. cryptlib (d_crypt.U): This variable holds -lcrypt or the path to a libcrypt.a archive if the crypt() function is not defined in the standard C library. It is up to the Makefile to use this. csh (Loc.U): ! This variable is be used internally by Configure to determine the full pathname (if any) of the csh program. After Configure runs, the value is reset to a plain "csh" and is not useful. --- 250,274 ---- It is primarily used by other Configure units that ask about preprocessor symbols. + cppsymbols (Cppsym.U): + The variable contains the symbols defined by the C preprocessor + alone. The symbols defined by cc or by cc when it calls cpp are + not in this list, see ccsymbols and cppccsymbols. + The list is a space-separated list of symbol=value tokens. + + cppccsymbols (Cppsym.U): + The variable contains the symbols defined by the C compiler when + when it calls cpp. The symbols defined by the cc alone or cpp + alone are not in this list, see ccsymbols and cppsymbols. + The list is a space-separated list of symbol=value tokens. + cryptlib (d_crypt.U): This variable holds -lcrypt or the path to a libcrypt.a archive if the crypt() function is not defined in the standard C library. It is up to the Makefile to use this. csh (Loc.U): ! This variable is used internally by Configure to determine the full pathname (if any) of the csh program. After Configure runs, the value is reset to a plain "csh" and is not useful. *************** *** 477,482 **** --- 495,508 ---- This variable conditionally defines HAS_FSETPOS if fsetpos() is available to set the file position indicator. + d_fstatfs (d_statfs.U): + This variable conditionally defines the HAS_FSTATFS symbol, which + indicates to the C program that the fstatfs() routine is available. + + d_fstatvfs (d_statvfs.U): + This variable conditionally defines the HAS_FSTATVFS symbol, which + indicates to the C program that the fstatvfs() routine is available. + d_ftime (d_ftime.U): This variable conditionally defines the HAS_FTIME symbol, which indicates that the ftime() routine exists. The ftime() routine is basically *************** *** 522,527 **** --- 548,558 ---- indicates to the C program that the getlogin() routine is available to get the login name. + d_getmntent (d_getmntent.U): + This variable conditionally defines the HAS_GETMNTENT symbol, which + indicates to the C program that the getmntent() routine is available + to iterate through mounted files. + d_getnbyaddr (d_getnbyad.U): This variable conditionally defines the HAS_GETNETBYADDR symbol, which indicates to the C program that the getnetbyaddr() routine is available *************** *** 626,631 **** --- 657,667 ---- This variable conditionally defines GRPASSWD, which indicates that struct group in contains gr_passwd. + d_hasmntopt (d_hasmntopt.U): + This variable conditionally defines the HAS_HASMNTOPT symbol, which + indicates to the C program that the hasmntopt() routine is available + to query the mount options of file systems. + d_htonl (d_htonl.U): This variable conditionally defines HAS_HTONL if htonl() and its friends are available to do network order byte swapping. *************** *** 1072,1077 **** --- 1108,1123 ---- This variable conditionally defines USE_STAT_BLOCKS if this system has a stat structure declaring st_blksize and st_blocks. + d_statfsflags (d_statfs.U): + This variable conditionally defines the HAS_STRUCT_STATFS_FLAGS + symbol, which indicates to struct statfs from has f_flags member. + This kind of struct statfs is coming from sys/mount.h (BSD), + not from sys/statfs.h (SYSV). + + d_statvfs (d_statvfs.U): + This variable conditionally defines the HAS_STATVFS symbol, which + indicates to the C program that the statvfs() routine is available. + d_stdio_cnt_lval (d_stdstdio.U): This variable conditionally defines STDIO_CNT_LVALUE if the FILE_cnt macro can be used as an lvalue. *************** *** 1260,1266 **** the C program that it runs under Xenix. date (Loc.U): ! This variable is be used internally by Configure to determine the full pathname (if any) of the date program. After Configure runs, the value is reset to a plain "date" and is not useful. --- 1306,1312 ---- the C program that it runs under Xenix. date (Loc.U): ! This variable is used internally by Configure to determine the full pathname (if any) of the date program. After Configure runs, the value is reset to a plain "date" and is not useful. *************** *** 1307,1318 **** See trnl.U echo (Loc.U): ! This variable is be used internally by Configure to determine the full pathname (if any) of the echo program. After Configure runs, the value is reset to a plain "echo" and is not useful. egrep (Loc.U): ! This variable is be used internally by Configure to determine the full pathname (if any) of the egrep program. After Configure runs, the value is reset to a plain "egrep" and is not useful. --- 1353,1364 ---- See trnl.U echo (Loc.U): ! This variable is used internally by Configure to determine the full pathname (if any) of the echo program. After Configure runs, the value is reset to a plain "echo" and is not useful. egrep (Loc.U): ! This variable is used internally by Configure to determine the full pathname (if any) of the egrep program. After Configure runs, the value is reset to a plain "egrep" and is not useful. *************** *** 1329,1335 **** This is an old synonym for _exe. expr (Loc.U): ! This variable is be used internally by Configure to determine the full pathname (if any) of the expr program. After Configure runs, the value is reset to a plain "expr" and is not useful. --- 1375,1381 ---- This is an old synonym for _exe. expr (Loc.U): ! This variable is used internally by Configure to determine the full pathname (if any) of the expr program. After Configure runs, the value is reset to a plain "expr" and is not useful. *************** *** 1340,1346 **** is available. find (Loc.U): ! This variable is be used internally by Configure to determine the full pathname (if any) of the find program. After Configure runs, the value is reset to a plain "find" and is not useful. --- 1386,1392 ---- is available. find (Loc.U): ! This variable is used internally by Configure to determine the full pathname (if any) of the find program. After Configure runs, the value is reset to a plain "find" and is not useful. *************** *** 1362,1367 **** --- 1408,1418 ---- This variable contains the return type of free(). It is usually void, but occasionally int. + full_ar (Loc_ar.U): + This variable contains the full pathname to 'ar', whether or + not the user has specified 'portability'. This is only used + in the Makefile.SH. + full_csh (d_csh.U): This variable contains the full pathname to 'csh', whether or not the user has specified 'portability'. This is only used *************** *** 1387,1393 **** of getgid(). Typically, it is the type of group ids in the kernel. grep (Loc.U): ! This variable is be used internally by Configure to determine the full pathname (if any) of the grep program. After Configure runs, the value is reset to a plain "grep" and is not useful. --- 1438,1444 ---- of getgid(). Typically, it is the type of group ids in the kernel. grep (Loc.U): ! This variable is used internally by Configure to determine the full pathname (if any) of the grep program. After Configure runs, the value is reset to a plain "grep" and is not useful. *************** *** 1403,1409 **** gidtype (gid_t), but sometimes it isn't. gzip (Loc.U): ! This variable is be used internally by Configure to determine the full pathname (if any) of the gzip program. After Configure runs, the value is reset to a plain "gzip" and is not useful. --- 1454,1460 ---- gidtype (gid_t), but sometimes it isn't. gzip (Loc.U): ! This variable is used internally by Configure to determine the full pathname (if any) of the gzip program. After Configure runs, the value is reset to a plain "gzip" and is not useful. *************** *** 1489,1494 **** --- 1540,1549 ---- This variable conditionally defines the I_LOCALE symbol, and indicates whether a C program should include . + i_machcthr (i_machcthr.U): + This variable conditionally defines the I_MACH_CTHREADS symbol, + and indicates whether a C program should include . + i_malloc (i_malloc.U): This variable conditionally defines the I_MALLOC symbol, and indicates whether a C program should include . *************** *** 1501,1506 **** --- 1556,1565 ---- This variable conditionally defines the I_MEMORY symbol, and indicates whether a C program should include . + i_mntent (i_mntent.U): + This variable conditionally defines the I_MNTENT symbol, and indicates + whether a C program should include . + i_ndbm (i_ndbm.U): This variable conditionally defines the I_NDBM symbol, which indicates to the C program that exists and should *************** *** 1580,1585 **** --- 1639,1648 ---- indicates to the C program that exists and should be included. + i_sysmount (i_sysmount.U): + This variable conditionally defines the I_SYSMOUNT symbol, + and indicates whether a C program should include . + i_sysndir (i_sysndir.U): This variable conditionally defines the I_SYS_NDIR symbol, and indicates whether a C program should include . *************** *** 1606,1611 **** --- 1669,1682 ---- This variable conditionally defines the I_SYS_STAT symbol, and indicates whether a C program should include . + i_sysstatfs (i_sysstatfs.U): + This variable conditionally defines the I_SYSSTATFS symbol, + and indicates whether a C program should include . + + i_sysstatvfs (i_sysstatvfs.U): + This variable conditionally defines the I_SYSSTATVFS symbol, + and indicates whether a C program should include . + i_systime (i_time.U): This variable conditionally defines I_SYS_TIME, which indicates to the C program that it should include . *************** *** 1671,1676 **** --- 1742,1752 ---- This variable conditionally defines the I_VFORK symbol, and indicates whether a C program should include vfork.h. + ignore_versioned_solibs (libs.U): + This variable should be non-empty if non-versioned shared + libraries (libfoo.so.x.y) are to be ignored (because they + cannot be linked against). + incpath (usrinc.U): This variable must preceed the normal include path to get hte right one, as in "$incpath/usr/include" or "$incpath/usr/lib". *************** *** 1722,1727 **** --- 1798,1808 ---- those systems using AFS. For extra portability, only this variable should be used in makefiles. + installusrbinperl (instubperl.U): + This variable tells whether Perl should be installed also as + /usr/bin/perl in addition to + $installbin/perl + intsize (intsize.U): This variable contains the value of the INTSIZE symbol, which indicates to the C program how many bytes there are in an int. *************** *** 1756,1762 **** the user. It is up to the Makefile to use this. less (Loc.U): ! This variable is be used internally by Configure to determine the full pathname (if any) of the less program. After Configure runs, the value is reset to a plain "less" and is not useful. --- 1837,1843 ---- the user. It is up to the Makefile to use this. less (Loc.U): ! This variable is used internally by Configure to determine the full pathname (if any) of the less program. After Configure runs, the value is reset to a plain "less" and is not useful. *************** *** 1788,1794 **** ahead of ucb or bsd libraries for SVR4. line (Loc.U): ! This variable is be used internally by Configure to determine the full pathname (if any) of the line program. After Configure runs, the value is reset to a plain "line" and is not useful. --- 1869,1875 ---- ahead of ucb or bsd libraries for SVR4. line (Loc.U): ! This variable is used internally by Configure to determine the full pathname (if any) of the line program. After Configure runs, the value is reset to a plain "line" and is not useful. *************** *** 1801,1807 **** the user. It is up to the Makefile to use this. ln (Loc.U): ! This variable is be used internally by Configure to determine the full pathname (if any) of the ln program. After Configure runs, the value is reset to a plain "ln" and is not useful. --- 1882,1888 ---- the user. It is up to the Makefile to use this. ln (Loc.U): ! This variable is used internally by Configure to determine the full pathname (if any) of the ln program. After Configure runs, the value is reset to a plain "ln" and is not useful. *************** *** 1845,1851 **** The value is a plain '' and is not useful. ls (Loc.U): ! This variable is be used internally by Configure to determine the full pathname (if any) of the ls program. After Configure runs, the value is reset to a plain "ls" and is not useful. --- 1926,1932 ---- The value is a plain '' and is not useful. ls (Loc.U): ! This variable is used internally by Configure to determine the full pathname (if any) of the ls program. After Configure runs, the value is reset to a plain "ls" and is not useful. *************** *** 1863,1869 **** The value is a plain '' and is not useful. make (Loc.U): ! This variable is be used internally by Configure to determine the full pathname (if any) of the make program. After Configure runs, the value is reset to a plain "make" and is not useful. --- 1944,1950 ---- The value is a plain '' and is not useful. make (Loc.U): ! This variable is used internally by Configure to determine the full pathname (if any) of the make program. After Configure runs, the value is reset to a plain "make" and is not useful. *************** *** 1934,1940 **** Possible values are "BSD 4.3" and "System V". mkdir (Loc.U): ! This variable is be used internally by Configure to determine the full pathname (if any) of the mkdir program. After Configure runs, the value is reset to a plain "mkdir" and is not useful. --- 2015,2021 ---- Possible values are "BSD 4.3" and "System V". mkdir (Loc.U): ! This variable is used internally by Configure to determine the full pathname (if any) of the mkdir program. After Configure runs, the value is reset to a plain "mkdir" and is not useful. *************** *** 1949,1955 **** modes for system calls. more (Loc.U): ! This variable is be used internally by Configure to determine the full pathname (if any) of the more program. After Configure runs, the value is reset to a plain "more" and is not useful. --- 2030,2036 ---- modes for system calls. more (Loc.U): ! This variable is used internally by Configure to determine the full pathname (if any) of the more program. After Configure runs, the value is reset to a plain "more" and is not useful. *************** *** 2006,2012 **** This is only useful if you have getnetbyaddr(), naturally. nm (Loc.U): ! This variable is be used internally by Configure to determine the full pathname (if any) of the nm program. After Configure runs, the value is reset to a plain "nm" and is not useful. --- 2087,2093 ---- This is only useful if you have getnetbyaddr(), naturally. nm (Loc.U): ! This variable is used internally by Configure to determine the full pathname (if any) of the nm program. After Configure runs, the value is reset to a plain "nm" and is not useful. *************** *** 2026,2032 **** in the package. All of them will be built. nroff (Loc.U): ! This variable is be used internally by Configure to determine the full pathname (if any) of the nroff program. After Configure runs, the value is reset to a plain "nroff" and is not useful. --- 2107,2113 ---- in the package. All of them will be built. nroff (Loc.U): ! This variable is used internally by Configure to determine the full pathname (if any) of the nroff program. After Configure runs, the value is reset to a plain "nroff" and is not useful. *************** *** 2086,2092 **** used to separate elements in the command shell search PATH. perl (Loc.U): ! This variable is be used internally by Configure to determine the full pathname (if any) of the perl program. After Configure runs, the value is reset to a plain "perl" and is not useful. --- 2167,2173 ---- used to separate elements in the command shell search PATH. perl (Loc.U): ! This variable is used internally by Configure to determine the full pathname (if any) of the perl program. After Configure runs, the value is reset to a plain "perl" and is not useful. *************** *** 2099,2105 **** shell scripts and in the "eval 'exec'" idiom. pg (Loc.U): ! This variable is be used internally by Configure to determine the full pathname (if any) of the pg program. After Configure runs, the value is reset to a plain "pg" and is not useful. --- 2180,2186 ---- shell scripts and in the "eval 'exec'" idiom. pg (Loc.U): ! This variable is used internally by Configure to determine the full pathname (if any) of the pg program. After Configure runs, the value is reset to a plain "pg" and is not useful. *************** *** 2172,2178 **** no data and an EOF.. Sigh! rm (Loc.U): ! This variable is be used internally by Configure to determine the full pathname (if any) of the rm program. After Configure runs, the value is reset to a plain "rm" and is not useful. --- 2253,2259 ---- no data and an EOF.. Sigh! rm (Loc.U): ! This variable is used internally by Configure to determine the full pathname (if any) of the rm program. After Configure runs, the value is reset to a plain "rm" and is not useful. *************** *** 2197,2206 **** at configuration time, for programs not wanting to bother with it. sed (Loc.U): ! This variable is be used internally by Configure to determine the full pathname (if any) of the sed program. After Configure runs, the value is reset to a plain "sed" and is not useful. selecttype (selecttype.U): This variable holds the type used for the 2nd, 3rd, and 4th arguments to select. Usually, this is 'fd_set *', if HAS_FD_SET --- 2278,2294 ---- at configuration time, for programs not wanting to bother with it. sed (Loc.U): ! This variable is used internally by Configure to determine the full pathname (if any) of the sed program. After Configure runs, the value is reset to a plain "sed" and is not useful. + selectminbits (selectminbits.U): + This variable holds the minimum number of bits operated by select. + That is, if you do select(n, ...), how many bits at least will be + cleared in the masks if some activity is detected. Usually this + is either n or 32*ceil(n/32), especially many little-endians do + the latter. This is only useful if you have select(), naturally. + selecttype (selecttype.U): This variable holds the type used for the 2nd, 3rd, and 4th arguments to select. Usually, this is 'fd_set *', if HAS_FD_SET *************** *** 2208,2214 **** have select(), naturally. sendmail (Loc.U): ! This variable is be used internally by Configure to determine the full pathname (if any) of the sendmail program. After Configure runs, the value is reset to a plain "sendmail" and is not useful. --- 2296,2302 ---- have select(), naturally. sendmail (Loc.U): ! This variable is used internally by Configure to determine the full pathname (if any) of the sendmail program. After Configure runs, the value is reset to a plain "sendmail" and is not useful. *************** *** 2277,2282 **** --- 2365,2376 ---- the value of the signal listed in the same place within the sig_name list. + sig_num_init (sig_name.U): + This variable holds the signal numbers, enclosed in double quotes and + separated by commas, suitable for use in the SIG_NUM definition + below. A "ZERO" is prepended to the list, and the list is + terminated with a plain 0. + signal_t (d_voidsig.U): This variable holds the type of the signal handler (void or int). *************** *** 2329,2335 **** This variable has the names of any libraries needed for socket support. sort (Loc.U): ! This variable is be used internally by Configure to determine the full pathname (if any) of the sort program. After Configure runs, the value is reset to a plain "sort" and is not useful. --- 2423,2429 ---- This variable has the names of any libraries needed for socket support. sort (Loc.U): ! This variable is used internally by Configure to determine the full pathname (if any) of the sort program. After Configure runs, the value is reset to a plain "sort" and is not useful. *************** *** 2440,2451 **** The value is a plain '' and is not useful. tee (Loc.U): ! This variable is be used internally by Configure to determine the full pathname (if any) of the tee program. After Configure runs, the value is reset to a plain "tee" and is not useful. test (Loc.U): ! This variable is be used internally by Configure to determine the full pathname (if any) of the test program. After Configure runs, the value is reset to a plain "test" and is not useful. --- 2534,2545 ---- The value is a plain '' and is not useful. tee (Loc.U): ! This variable is used internally by Configure to determine the full pathname (if any) of the tee program. After Configure runs, the value is reset to a plain "tee" and is not useful. test (Loc.U): ! This variable is used internally by Configure to determine the full pathname (if any) of the test program. After Configure runs, the value is reset to a plain "test" and is not useful. *************** *** 2458,2469 **** included). Anyway, the type Time_t should be used. touch (Loc.U): ! This variable is be used internally by Configure to determine the full pathname (if any) of the touch program. After Configure runs, the value is reset to a plain "touch" and is not useful. tr (Loc.U): ! This variable is be used internally by Configure to determine the full pathname (if any) of the tr program. After Configure runs, the value is reset to a plain "tr" and is not useful. --- 2552,2563 ---- included). Anyway, the type Time_t should be used. touch (Loc.U): ! This variable is used internally by Configure to determine the full pathname (if any) of the touch program. After Configure runs, the value is reset to a plain "touch" and is not useful. tr (Loc.U): ! This variable is used internally by Configure to determine the full pathname (if any) of the tr program. After Configure runs, the value is reset to a plain "tr" and is not useful. *************** *** 2482,2493 **** ushort, or whatever type is used to declare user ids in the kernel. uname (Loc.U): ! This variable is be used internally by Configure to determine the full pathname (if any) of the uname program. After Configure runs, the value is reset to a plain "uname" and is not useful. uniq (Loc.U): ! This variable is be used internally by Configure to determine the full pathname (if any) of the uniq program. After Configure runs, the value is reset to a plain "uniq" and is not useful. --- 2576,2587 ---- ushort, or whatever type is used to declare user ids in the kernel. uname (Loc.U): ! This variable is used internally by Configure to determine the full pathname (if any) of the uname program. After Configure runs, the value is reset to a plain "uname" and is not useful. uniq (Loc.U): ! This variable is used internally by Configure to determine the full pathname (if any) of the uniq program. After Configure runs, the value is reset to a plain "uniq" and is not useful. *************** *** 2574,2580 **** The value is a plain '' and is not useful. zip (Loc.U): ! This variable is be used internally by Configure to determine the full pathname (if any) of the zip program. After Configure runs, the value is reset to a plain "zip" and is not useful. --- 2668,2674 ---- The value is a plain '' and is not useful. zip (Loc.U): ! This variable is used internally by Configure to determine the full pathname (if any) of the zip program. After Configure runs, the value is reset to a plain "zip" and is not useful. diff -c 'perl5.005_02/Porting/patching.pod' 'perl5.005_03/Porting/patching.pod' Index: ./Porting/patching.pod *** ./Porting/patching.pod Thu Jul 23 22:59:34 1998 --- ./Porting/patching.pod Thu Jan 21 21:37:42 1999 *************** *** 10,16 **** =head2 How to contribute to this document You may mail corrections, additions, and suggestions to me ! at dgris@tdrenterprises.com but the preferred method would be to follow the instructions set forth in this document and submit a patch 8-). --- 10,16 ---- =head2 How to contribute to this document You may mail corrections, additions, and suggestions to me ! at dgris@dimensional.com but the preferred method would be to follow the instructions set forth in this document and submit a patch 8-). *************** *** 36,41 **** --- 36,47 ---- =head1 Proper Patch Guidelines + =head2 What to patch + + Generally speaking you should patch the latest development release + of perl. The maintainers of the individual branches will see to it + that patches are picked up and applied as appropriate. + =head2 How to prepare your patch =over 4 *************** *** 159,176 **** Interpret results strictly. Use unrelated features (this will flush out bizarre interactions). Use non-standard idioms (otherwise you are not testing TIMTOWTDI). ! Avoid using hardcoded test umbers whenever possible (the EXPECTED/GOT style ! found in t/op/tie.t is much more maintainable, and gives better failure ! reports). Give meaningful error messages when a test fails. Avoid using qx// and system() unless you are testing for them. If you do use them, make sure that you cover _all_ perl platforms. Unlink any temporary files you create. Promote unforeseen warnings to errors with $SIG{__WARN__}. ! Be sure to use the libraries and modules shipped with version being tested, ! not those that were already installed. Add comments to the code explaining what you are testing for. ! Make updating the '1..42' string unnecessary. Or make sure that you update it. Test _all_ behaviors of a given operator, library, or function- All optional arguments Return values in various contexts (boolean, scalar, list, lvalue) --- 165,183 ---- Interpret results strictly. Use unrelated features (this will flush out bizarre interactions). Use non-standard idioms (otherwise you are not testing TIMTOWTDI). ! Avoid using hardcoded test numbers whenever possible (the ! EXPECTED/GOT found in t/op/tie.t is much more maintainable, ! and gives better failure reports). Give meaningful error messages when a test fails. Avoid using qx// and system() unless you are testing for them. If you do use them, make sure that you cover _all_ perl platforms. Unlink any temporary files you create. Promote unforeseen warnings to errors with $SIG{__WARN__}. ! Be sure to use the libraries and modules shipped with version ! being tested, not those that were already installed. Add comments to the code explaining what you are testing for. ! Make updating the '1..42' string unnecessary. Or make sure that ! you update it. Test _all_ behaviors of a given operator, library, or function- All optional arguments Return values in various contexts (boolean, scalar, list, lvalue) *************** *** 289,311 **** for the maintainers to coordinate the occasionally large numbers of patches received. ! Also, just because you're not a brilliant coder doesn't mean that you can't ! contribute. As valuable as code patches are there is always a need for better ! documentation (especially considering the general level of joy that most ! programmers feel when forced to sit down and write docs). If all you do ! is patch the documentation you have still contributed more than the person ! who sent in an amazing new feature that noone can use because noone understands ! the code (what I'm getting at is that documentation is both the hardest part to ! do (because everyone hates doing it) and the most valuable). ! ! Mostly, when contributing patches, imagine that it is B receiving hundreds ! of patches and that it is B responsibility to integrate them into the source. ! Obviously you'd want the patches to be as easy to apply as possible. Keep that in ! mind. 8-) =head1 Last Modified ! Last modified 21 May 1998 by Daniel Grisinger =head1 Author and Copyright Information --- 296,320 ---- for the maintainers to coordinate the occasionally large numbers of patches received. ! Also, just because you're not a brilliant coder doesn't mean that you ! can't contribute. As valuable as code patches are there is always a ! need for better documentation (especially considering the general ! level of joy that most programmers feel when forced to sit down and ! write docs). If all you do is patch the documentation you have still ! contributed more than the person who sent in an amazing new feature ! that no one can use because no one understands the code (what I'm ! getting at is that documentation is both the hardest part to do ! (because everyone hates doing it) and the most valuable). ! ! Mostly, when contributing patches, imagine that it is B receiving ! hundreds of patches and that it is B responsibility to integrate ! them into the source. Obviously you'd want the patches to be as easy ! to apply as possible. Keep that in mind. 8-) =head1 Last Modified ! Last modified 21 January 1999 ! Daniel Grisinger =head1 Author and Copyright Information *************** *** 314,319 **** Adapted from a posting to perl5-porters by Tim Bunce (Tim.Bunce@ig.co.uk). I'd like to thank the perl5-porters for their suggestions. - - - --- 323,325 ---- diff -c 'perl5.005_02/Porting/pumpkin.pod' 'perl5.005_03/Porting/pumpkin.pod' Index: ./Porting/pumpkin.pod Prereq: 1.22 *** ./Porting/pumpkin.pod Thu Jul 23 22:59:35 1998 --- ./Porting/pumpkin.pod Thu Mar 4 18:34:07 1999 *************** *** 1178,1183 **** --- 1178,1193 ---- back into the main distribution, but various parts of the perl Configure/build/install process still assume src='.'. + =item Directory for vendor-supplied modules? + + If a vendor supplies perl, but wants to leave $siteperl and $sitearch + for the local user to use, where should the vendor put vendor-supplied + modules (such as Tk.so?) If the vendor puts them in $archlib, then + they need to be updated each time the perl version is updated. + Perhaps we need a set of libries $vendorperl and $vendorarch that + track $apiversion (like the $sitexxx directories do) rather than + just $version (like the main perl directory). + =item Hint file fixes Various hint files work around Configure problems. We ought to fix diff -c 'perl5.005_02/README' 'perl5.005_03/README' Index: ./README *** ./README Thu Jul 23 22:59:35 1998 --- ./README Sat Mar 27 11:47:57 1999 *************** *** 1,7 **** Perl Kit, Version 5.0 ! Copyright 1989-1997, Larry Wall All rights reserved. This program is free software; you can redistribute it and/or modify --- 1,7 ---- Perl Kit, Version 5.0 ! Copyright 1989-1999, Larry Wall All rights reserved. This program is free software; you can redistribute it and/or modify *************** *** 22,29 **** Kit, in the file named "Artistic". If not, I'll be glad to provide one. You should also have received a copy of the GNU General Public License ! along with this program; if not, write to the Free Software ! Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. For those of you that choose to use the GNU General Public License, my interpretation of the GNU General Public License is that no Perl --- 22,29 ---- Kit, in the file named "Artistic". If not, I'll be glad to provide one. You should also have received a copy of the GNU General Public License ! along with this program; if not, write to the Free Software Foundation, ! Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. For those of you that choose to use the GNU General Public License, my interpretation of the GNU General Public License is that no Perl diff -c /dev/null 'perl5.005_03/README.apollo' Index: README.apollo *** README.apollo Wed Dec 31 18:00:00 1969 --- README.apollo Wed Mar 17 18:05:55 1999 *************** *** 0 **** --- 1,11 ---- + The following tests are known to fail as of Perl 5.005_03: + + comp/decl..........FAILED at test 0 + op/write...........FAILED at test 0 + lib/filefind.......FAILED at test 2 + lib/io_udp.........FAILED at test 2 + lib/findbin........stat(/ressel/ABT/USER/vta/jk/proj.local/perl/perl5.005_03-MAINT_TRIAL_5/t/lib/): No such file or directory at ../lib/FindBin.pm line 162 + stat(/ressel/ABT/USER/vta/jk/proj.local/perl/perl5.005_03-MAINT_TRIAL_5/t/lib/): No such file or directory at ../lib/FindBin.pm line 163 + FAILED at test 1 + + Johann Klasek diff -c 'perl5.005_02/README.beos' 'perl5.005_03/README.beos' Index: ./README.beos Prereq: 1.2 *** ./README.beos Thu Jul 23 22:59:35 1998 --- ./README.beos Thu Jan 28 21:19:54 1999 *************** *** 1,75 **** - $Id: README.beos,v 1.2 1998/05/02 01:55:04 dogcow Exp dogcow $ - Notes on building perl under BeOS: GENERAL ISSUES -------------- ! perl will almost compile straight out of the box with ./Configure -d, but ! there are a few gotchas: ! Currently, you have to edit config.sh and remove SDBM_File from the ! dynamic_ext= and extensions= lines. SDBM_File does not build properly ! at this time. You need to run ./Configure -S after editing config.sh. ! ! In addition, with mwcc, after doing `make depend`, you need to edit ! makefile and x2p/makefile and remove the lines that mention 'Bletch:'. ! This is not necessary if you're using gnu cpp. ! ! in short: ! ./Configure -d ! remove SDBM_File from config.sh ! ./Configure -S ! make depend ! remove Bletch: from makefile and x2p/makefile ! make ! Other than that, perl should build without problems. There are some ! technical comments in hints/beos.sh. ! OS RELEASE-SPECIFIC NOTES ! ------------------------- ! PR1/PPC: ! See R3/X86. Same bug, different form. ! PR2/PPC: ! Signals are somewhat unreliable, but they can work. Use caution. ! The POSIX module is still somewhat buggy. ! ! R3/X86: ! Under R3 x86, there are some serious problems with the math routines ! such that numbers are incorrectly printed. This causes problems with ! modules that encode their version numbers - in particular, IO.pm will ! probably not work properly. This should be fixed under R3.1. ! ! The problem has manifested itself if you see something similar to the ! following during the compile: ! ! cc -c -I/usr/local/include -O -DVERSION=\"1.1504\" -DXS_VERSION=\"1.1499999999\" -fpic -I../.. IO.c ! (lots of 9's are the indication of the problem.) ! ! In the meantime, you can use the following workaround: ! ! make perl ! cd ext/IO ! cc -c -I/usr/local/include -O -DVERSION=\"1.1504\" -DXS_VERSION=\"1.15\" -fpic -I../.. IO.c ! cd .. ! make ! ! (Substitute the correct numbers if IO has been updated.) ! ! R3/PPC- ! There's math problems, but of a different kind. In particular, ! perl -e 'print (240000 - (3e4<<3))' gives a non-zero answer. ! I'm looking into this. There is no workaround as yet. Hopefully, ! this will be fixed in R3.1. CONTACT INFORMATION ------------------- If you have comments, problem reports, or even patches or bugfixes (gasp!) please email me. ! 1 May 1998 Tom Spindler ! dogcow@merit.edu --- 1,43 ---- Notes on building perl under BeOS: GENERAL ISSUES -------------- ! how to compile perl: ! To compile perl under BeOS R4 x86: ! `./Configure -d` and hit ^C when it asks you if you want to make changes ! to config.sh; ! edit config.sh and do the following: ! change d_socket='define' to ='undef'; ! remove SDBM, Errno, and Socket from dynamic_ext= and nonxs_ext=; ! ! add '#define bool short' to x2p/a2p.h; ! ../Configure -S; make; make install ! cd ~/config/lib; ln -s 5.00502/BeOS-BePC/CORE/libperl.so . ! (substitute 5.00502 with the appropriate filename) ! ! OS RELEASE-SPECIFIC NOTES ! ------------------------- ! R4 x86 - dynamic loading finally works! Yay! This means you can compile ! your own modules into perl. However, Sockets and Errno still don't work. ! (Hopefully, sockets will at least work by R5, if not sooner.) ! ! R4 PPC - I have not tested this. I rather severely doubt that dynamic ! loading will work. (My BeBox is in pieces right now, following a nasty ! disk crash.) You may have to disable dynamic loading to get the thing ! to compile at all. (use `./Configure` without -d, and say 'no' to ! 'Build a shared libperl.so'.) CONTACT INFORMATION ------------------- If you have comments, problem reports, or even patches or bugfixes (gasp!) please email me. ! 28 Jan 1999 Tom Spindler ! dogcow@isi.net diff -c /dev/null 'perl5.005_03/README.hpux' Index: README.hpux *** README.hpux Wed Dec 31 18:00:00 1969 --- README.hpux Thu Mar 4 18:34:08 1999 *************** *** 0 **** --- 1,226 ---- + If you read this file _as_is_, just ignore the funny characters you + see. It is written in the POD format (see pod/perlpod.pod) which is + specially designed to be readable as is. + + =head1 NAME + + README.hpux - Perl version 5 on Hewlett-Packard Unix (HP-UX) systems + + =head1 DESCRIPTION + + This document describes various features of HP's Unix operating system (HP-UX) + that will affect how Perl version 5 (hereafter just Perl) is compiled and/or + runs. + + =head2 Compiling Perl 5 on HP-UX + + When compiling Perl, the use of an ANSI C compiler is highly recommended. + The C compiler that ships with all HP-UX systems is a K&R compiler that + should only be used to build new kernels. + + Perl can be compiled with either HP's ANSI C compiler or with gcc. The + former is recommended, as not only can it compile Perl with no difficulty, + but also can take advantage of features listed later that require the use + of HP compiler-specific command-line flags. + + If you decide to use gcc, make sure your installation is recent and complete, + and be sure to read the Perl README file for more gcc-specific details. + + =head2 PA-RISC + + HP's current Unix systems run on its own Precision Architecture (PA-RISC) chip. + HP-UX used to run on the Motorola MC68000 family of chips, but any machine with + this chip in it is quite obsolete and this document will not attempt to address + issues for compiling Perl on the Motorola chipset. + + The most recent version of PA-RISC at the time of this document's last update + is 2.0. + + =head2 PA-RISC 1.0 + + The original version of PA-RISC, HP no longer sells any system with this chip. + + The following systems contain PA-RISC 1.0 chips: + + 600, 635, 645, 800, 808, 815, 822, 825, 832, 834, 835, 840, + 842, 845, 850, 852, 855, 860, 865, 870, 890 + + =head2 PA-RISC 1.1 + + An upgrade to the PA-RISC design, it shipped for many years in many different + system. + + The following systems contain with PA-RISC 1.1 chips: + + 705, 710, 712, 715, 720, 722, 725, 728, 730, 735, 743, 745, 747, 750, + 755, 770, 807S, 817S, 827S, 837S, 847S, 857S, 867S, 877S, 887S, 897S, + D200, D210, D220, D230, D250, D260, D310, D320, D330, D350, D360, D400, + E25, E35, E45, E55, F10, F20, F30, G30, G40, G50, G60, G70, H30, H40, + H50, H60, H70, I30, I40, I50, I60, I70, K100, K200, K210, K220, K400, + K410, K420, T500, T520 + + + =head2 PA-RISC 2.0 + + The most recent upgrade to the PA-RISC design, it added support for 64-bit + integer data. + + The following systems contain PA-RISC 2.0 chips (this is very likely to be + out of date): + + D270, D280, D370, D380, K250, K260, K370, K380, K450, K460, K570, K580, + T600, V2200 + + A complete list of models at the time the OS was built is in the file + /opt/langtools/lib/sched.models. + The first column corresponds to the output of the "uname -m" command + (without the leading "9000/"). + The second column is the PA-RISC version + and the third column is the exact chip type used. + + =head2 Portability Between PA-RISC Versions + + An executable compiled on a PA-RISC 2.0 platform will not execute on a + PA-RISC 1.1 platform, even if they are running the same version of HP-UX. + If you are building Perl on a PA-RISC 2.0 platform and want that Perl to + to also run on a PA-RISC 1.1, the compiler flags +DAportable and +DS32 + should be used. + + It is no longer possible to compile PA-RISC 1.0 executables on either the + PA-RISC 1.1 or 2.0 platforms. + + =head2 Building Dynamic Extensions on HP-UX + + HP-UX supports dynamically loadable libraries (shared libraries). + Shared libraries end with the suffix .sl. + + Shared libraries created on a platform using a particular PA-RISC version + are not usable on platforms using an earlier PA-RISC version by default. + However, this backwards compatibility may be enabled using the same + +DAportable compiler flag (with the same PA-RISC 1.0 caveat mentioned above). + + To create a shared library, the following steps must be performed: + + 1. Compile source modules with +z or +Z flag to create a .o module + which contains Position-Independent Code (PIC). The linker will + tell you in the next step if +Z was needed. + + 2. Link the shared library using the -b flag. If the code calls + any functions in other system libraries (e.g., libm), it must + be included on this line. + + (Note that these steps are usually handled automatically by the extension's + Makefile). + + If these dependent libraries are not listed at shared library creation + time, you will get fatal "Unresolved symbol" errors at run time when the + library is loaded. + + You may create a shared library that referers to another library, which + may be either an archive library or a shared library. If it is a + shared library, this is called a "dependent library". + The dependent library's name is recorded in the main shared library, + but it is not linked into the shared library. + Instead, it is loaded when the main shared library is loaded. + + If the referred library is an archive library, then it is treated as a + simple collection of .o modules (all of which must contain PIC). These + modules are then linked into the shared library. + + Note that it is okay to create a library which contains a dependent library + that is already linked into perl. + + It is no longer possible to link PA-RISC 1.0 shared libraries. + + =head2 The HP ANSI C Compiler + + When using this compiler to build Perl, you should make sure that + the flag -Aa is added to the cpprun and cppstdin variables in the + config.sh file. + + =head2 Using Large Files with Perl + + Beginning with HP-UX version 10.20, files larger than 2GB (2^31) may be + created and manipulated. + Three separate methods of doing this are available. + Of these methods, + the best method for Perl is to compile using the -D_FILE_OFFSET_BITS=64 + compiler flag. + This causes Perl to be compiled using structures and functions in which + these are 64 bits wide, rather than 32 bits wide. + + There are only two drawbacks to this approach: + the first is that the seek and tell functions (both the builtin version + and the POSIX module's version) will not correctly + function for these large files + (the offset arguments in seek and tell are implemented as type long). + The second is that any extension which calls any file-manipulating C function + will need to be recompiled using the above-mentioned -D_FILE_OFFSET_BITS=64 + flag. + The list of functions that will need to recompiled is: + creat, fgetpos, fopen, + freopen, fsetpos, fstat, + fstatvfs, fstatvfsdev, ftruncate, + ftw, lockf, lseek, + lstat, mmap, nftw, + open, prealloc, stat, + statvfs, statvfsdev, tmpfile, + truncate, getrlimit, setrlimit + + =head2 Threaded Perl + + It is impossible to compile a version of threaded Perl on any version of + HP-UX before 10.30, and it is strongly suggested that you be running on + HP-UX 11.00 at least. + + To compile Perl with thread, add -Dusethreads to the arguments of Configure. + Ensure that the -D_POSIX_C_SOURCE=199506L compiler flag is automatically + added to the list of flags. Also make sure that -lpthread is listed before + -lc in the list of libraries to link Perl with. + + As of the date of this document, Perl threads are not fully supported on HP-UX. + + =head2 64-bit Perl + + Beginning with HP-UX 11.00, programs compiled under HP-UX can take advantage + of the LP64 programming environment (LP64 means Longs and Pointers are 64 bits + wide). + + Work is being performed on Perl to make it 64-bit compliant on all versions + of Unix. Once this is complete, scalar variables will be able to hold + numbers larger than 2^32 with complete precision. + + As of the date of this document, Perl is not 64-bit compliant on HP-UX. + + Should a user wish to experiment with compiling Perl in the LP64 environment, + the following steps must be taken: libraries must be searched only within + /lib/pa20_64, the compiler flag +DD64 must be used, and the C library is + now located at /lib/pa20_64/libc.sl. + + On the brighter side, the large file problem goes away, as longs are now + 64 bits wide. + + =head2 GDBM and Threads + + If you attempt to compile Perl with threads on an 11.X system and also link + in the GDBM library, then Perl will immediately core dump when it starts up. + The only workaround at this point is to relink the GDBM library under 11.X, + then relink it into Perl. + + =head2 NFS filesystems and utime(2) + + If you are compiling Perl on a remotely-mounted NFS filesystem, the test + io/fs.t may fail on test #18. + This appears to be a bug in HP-UX and no fix is currently available. + + =head1 AUTHOR + + Jeff Okamoto + + With much assistance regarding shared libraries from Marc Sabatella. + + =head1 DATE + + Version 0.2: 1999/03/01 + + =cut diff -c /dev/null 'perl5.005_03/README.hurd' Index: README.hurd *** README.hurd Wed Dec 31 18:00:00 1969 --- README.hurd Sun Mar 14 15:01:09 1999 *************** *** 0 **** --- 1,40 ---- + Notes on Perl on the Hurd + Last Updated: Sat, 6 Mar 1999 16:07:59 +0100 + Written by: Mark Kettenis + + If you want to use Perl on the Hurd, I recommend using the Debian + GNU/Hurd distribution (see http://www.debian.org), even if an + official, stable release has not yet been made. The old `gnu-0.2' + binary distribution will most certainly have additional problems. + + * Known Problems + + The Perl testsuite may still report some errors on the Hurd. The + `lib/anydbm.t' and `op/stat.t' tests will most certainly fail. The + first fails because Berkeley DB 2 does not allow empty keys and the + test tries to use them anyway. This is not really a Hurd bug. The + same test fails on Linux with version 2.1 of the GNU C Library. The + second failure is caused by a bug in the Hurd's filesystem servers, + that we have not been able to fix yet. I don't think it is crucial. + + The socket tests may fail if the network is not configured. You have + to make `/hurd/pfinet' the translator for `/servers/socket/2', giving + it the right arguments. Try `/hurd/pfinet --help' for more + information. + + Here are the statistics for Perl 5.005_03 on my system: + + Failed Test Status Wstat Total Fail Failed List of failed + ------------------------------------------------------------------------------- + lib/anydbm.t 12 1 8.33% 12 + op/stat.t 58 1 1.72% 4 + 5 tests skipped, plus 14 subtests skipped. + Failed 2/189 test scripts, 98.94% okay. 2/6669 subtests failed, 99.97% okay. + + There are quite a few systems out there that do worse! + + However, since I am running a very recent Hurd snapshot, in which a lot of + bugs that were exposed by the Perl testsuite have been fixed, you may + encounter more failures. Likely candidates are: `lib/io_pipe.t', + `lib/io_sock.t', `lib/io_udp.t' and `lib/time.t'. + diff -c /dev/null 'perl5.005_03/README.mint' Index: README.mint *** README.mint Wed Dec 31 18:00:00 1969 --- README.mint Thu Jan 28 19:13:32 1999 *************** *** 0 **** --- 1,222 ---- + ########################################################################## + # *** README.mint + ########################################################################## + + If you want to build perl yourself on MiNT (or maybe on an Atari without + MiNT) you may want to accept some advice from somebody who already did it... + + There was a perl port for Atari ST done by ++jrb bammi@cadence.com. + This port tried very hard to build on non-MiNT-systems. For the + sake of efficiency I've left this way. Yet, I haven't removed bammi's + patches but left them intact. Unfortunately some of the files that + bammi contributed to the perl distribution seem to have vanished? + + So, how can you distinguish my patches from bammi's patches? All of + bammi's stuff is embedded in "#ifdef atarist" preprocessor macros. + My MiNT port uses "#ifdef __MINT__" instead (and unconditionally + undefines "atarist". If you want to continue on bammi's port, all + you have to do is to swap the "-D" and "-U" switches for "__MINT__" + and "atarist" in the variable ccflags. + + However, I think that my version will still run on non-MiNT-systems + provided that the user has a Eunuchs-like environment (i.e. the + standard envariables like $PATH, $HOME, ... are set, there is a + POSIX compliant shell in /bin/sh, and...) + + Known problems + ============== + + The problems you may encounter when building perl on your machine + are most probably due to deficiencies in MiNT resp. the Atari + platform in general. + + First of all, if you have less than 8 MB of RAM you shouldn't + even try to build Perl yourself. Better grab a binary pre-compiled + version somewhere. Even if you have more memory you should take + some care. Try to run in a fresh environment (without memory + fragmented too much) with as few daemons, accessories, xcontrol + modules etc. as possible. If you run some AES you should + consider to start a console based environment instead. + + A problem has been reported with sed. Sed is used to create + some configuration files based on the answers you have given + to the Configure script. Unfortunately the Perl Configure script + shows sed on MiNT its limits. I have sed 2.05 with a stacksize + of 64k and I have encountered no problems. If sed crashes + during your configuration process you should first try to + augment sed's stacksize: + + fixstk 64k /usr/bin/sed + + (or similar). If it still doesn't help you may have a look + which other versions of sed are installed on your system. + If you have a KGMD 1.0 installation you will find three + in /usr/bin. Have a look there. + + Perl has some "mammut" C files. If gcc reports "internal + compiler error: program cc1 got fatal signal 10" this is very + likely due to a stack overflow in program cc1. Find cc1 + and fix its stack. I have made good experiences with + + fixstk 2 cc1 + + This doesn't establish a stack of 2 Bytes only as you might + think. It really reserves one half of the available memory + for cc1's stack. A setting of 1 would reserve the entire + memory for cc1, 3 would reserve three thirds. You will have + to find out the value that suits to your system yourself. + + BTW, cc1 is maybe a little hard to find. It is generally installed + as + /usr/local/lib/gcc-lib///cc1 + + where is probably something like "m68k-atari-mint" + and is the gcc version you use (find out with + "gcc --version"). Maybe "gcc-lib" is not installed in + "/usr/local/lib" but "/usr/lib" on your system. + + Now run make (maybe "make -k"). If you get a fatal signal 10 + increase cc1's stacksize, if you run out of memory you should + either decrease the stacksize or follow some more hints: + + Perl's building process is very handy on machines with a lot + of virtual memory but may result in a desaster if you are short + of memory. If gcc fails to compile many source files you should + reduce the optimization. Grep for "optimize" in the file + config.sh and change the flags. + + If only several huge files cause problems (actually it is not a + matter of the file size resp. the amount of code but depends on + the size of the individual funtions) it is useful to bypass + the make program and compile these files directly from the + command line. For example if you got something like the + following from make: + + CCCMD = gcc -DPERL_CORE .... + ... + ...: virtual memory exhausted + + you should hack into the shell: + + gcc -DPERL_CORE ... toke.c + + Please note that you have to add the name of the source file + (here toke.c) at the end. + + If none of this helps, you're helpless. Wait for a binary + release. If you have succeded you may encounter another problem + at the linking process. If gcc complains that it can't find + some libraries within the perl distribution you probably have + an old linker. If it complains for example about "file not + found for xxx.olb" you should cd into the directory in + question and + + ln -s libxxx.a xxx.olb + + This will fix the problem. + + This version (5.00402) of perl has passed most of the tests on my system: + + Failed Test Status Wstat Total Fail Failed List of failed + ------------------------------------------------------------------------------ + io/pipe.t 10 2 20.00% 7, 9 + io/tell.t 13 1 7.69% 12 + lib/complex.t 762 13 1.71% 84-85, 248-251, 257, 272-273, + 371, 380, 419-420 + lib/io_pipe.t 10 1 10.00% 9 + lib/io_tell.t 13 1 7.69% 12 + op/magic.t 30 2 6.67% 29-30 + Failed 6/152 test scripts, 96.05% okay. 20/4359 subtests failed, 99.54% okay. + + Pipes always cause problems with MiNT, it's actually a surprise that + most of the tests did work. I've got no idea why the "tell" test failed, + this shouldn't mean too big a problem however. + + Most of the failures of lib/complex seem to be harmless, actually errors + far right to the decimal point... Two failures seem to be serious: + The sign of the results is reversed. I would say that this is due + to minor bugs in the portable math lib that I compiled perl with. + + I haven't bothered very much to find the reason for the failures + with op/magic.t and op/stat.t. Maybe you'll find it out. + + ########################################################################## + + Another possible problem may arise from the implementation of the "pwd" + command. It happened to add a carriage return and newline to its output + no matter what the setting of $UNIXMODE is. This is quite annoying since many + library modules for perl take the output of pwd, chop off the + trailing newline character and then expect to see a valid path in + that. But the carriage return (last but second character!) isn't + chopped off. You can either try to patch all library modules (at + the price of performance for the extra transformation) or you can + use my version of pwd that doesn't suffer from this deficiency. + + The fixed implementation is in the mint subdirectory. Running + "Configure" will attempt to build and install it if necessary + (hints/mint.sh will do this work) but you can build and install it + explicitly by: + + cd mint + make install + + This is the fastest solution. + + Just in case you want to go the hard way: perl won't even build with a + broken pwd! You will have to fix the library modules + (ext/POSIX/POSIX.pm, lib/Cwd.pm, lib/pwd.pl) at last after building + miniperl. + + A major nuisance of current MiNTLib versions is the implementation + of system() which is far from being POSIX compliant. A real system() + should fork and then exec /bin/sh with its argument as a command + line to the shell. The MiNTLib system() however doesn't expect + that every user has a POSIX shell in /bin/sh. It tries to work + around the problem by forking and exec'ing the first token in its argument + string. To get a little bit of compliance to POSIX system() it + tries to handle at least redirection ("<" or ">") on its own + behalf. + + This isn't a good idea since many programs expect that they can + pass a command line to system() that exploits all features of a + POSIX shell. If you use the MiNTLib version of system() with + perl the Perl function system() will suffer from the same deficiencies. + + You will find a fixed version of system() in the mint subdirectory. + You can easily insert this version into your system libc: + + cd mint + make system.o + ar r /usr/lib/libc.a + ranlib /usr/lib/libc.a + + If you are suspicious you should either back up your libc before + or extract the original system.o from your libc with + "ar x /usr/lib/libc.a system.o". You can then backup the system.o + module somewhere before you succeed. + + Anything missing? Yep, I've almost forgotten... + No file in this distribution without a fine saying. Take this one: + + "From a thief you should learn: (1) to work at night; + (2) if one cannot gain what one wants in one night to + try again the next night; (3) to love one's coworkers + just as thieves love each other; (4) to be willing to + risk one's life even for a little thing; (5) not to + attach too much value to things even though one has + risked one's life for them - just as a thief will resell + a stolen article for a fraction of its real value; + (6) to withstand all kinds of beatings and tortures + but to remain what you are; and (7) to believe your + work is worthwhile and not be willing to change it." + + -- Rabbi Dov Baer, Maggid of Mezeritch + + OK, this was my motto while working on Perl for MiNT, especially rule (1)... + + Have fun with Perl! + + Guido Flohr + -- + mailto:gufl0000@stud.uni-sb.de + http://stud.uni-sb.de/~gufl0000 diff -c 'perl5.005_02/README.os390' 'perl5.005_03/README.os390' Index: ./README.os390 *** ./README.os390 Sun Aug 2 00:15:06 1998 --- ./README.os390 Sun Mar 14 15:01:09 1999 *************** *** 1,12 **** ! This is a fully ported perl for OS/390 Release 3. It may work on ! other versions, but that's the one we've tested it on. ! If you've downloaded the binary distribution, it needs to be ! installed below /usr/local. Source code distributions have an ! automated `make install` step that means you do not need to extract ! the source code below /usr/local (though that is where it will be ! installed by default). You may need to worry about the networking ! configuration files discussed in the last bullet below. Gunzip/gzip for OS/390 is discussed at: --- 1,28 ---- ! This document is written in pod format hence there are punctuation ! characters in in odd places. Do not worry, you've apparently got ! the ASCII->EBCDIC translation worked out correctly. You can read ! more about pod in pod/perlpod.pod or the short summary in the ! INSTALL file. ! =head1 NAME ! ! README.os390 - building and installing Perl for OS/390. ! ! =head1 SYNOPSIS ! ! This document will help you Configure, build, test and install Perl ! on OS/390 Unix System Services. ! ! =head1 DESCRIPTION ! ! This is a fully ported perl for OS/390 Release 3, 5 and 6. ! It may work on other versions, but those are the ones we've ! tested it on. ! ! You may need to carry out some system configuration tasks before ! running the Configure script for perl. ! ! =head2 Unpacking Gunzip/gzip for OS/390 is discussed at: *************** *** 16,52 **** pax -o to=IBM-1047,from=ISO8859-1 -r < latest.tar GNU make for OS/390, which may be required for the build of perl, is available from: http://www.mks.com/s390/gnu/index.htm ! Once you've unpacked the distribution, run Configure (see INSTALL for ! full discussion of the Configure options), and then run make, then ! "make test" then "make install" (this last step may require UID=0 ! privileges) ! ! There is a "hints" file for os390 that specifies the correct values ! for most things. Some things to watch out for are ! ! - this port doesn't support dynamic loading. Although ! OS/390 has support for DLLs, there are some differences ! that cause problems for perl. ! ! - You may see a "WHOA THERE!!!" message for $d_shmatprototype ! it is OK to keep the recommended "define". ! ! - Don't turn on the compiler optimization flag "-O". There's ! a bug in either the optimizer or perl that causes perl to ! not work correctly when the optimizer is on. ! ! - Some of the configuration files in /etc used by the ! networking APIs are either missing or have the wrong ! names. In particular, make sure that there's either ! an /etc/resolv.conf or and /etc/hosts, so that ! gethostbyname() works, and make sure that the file ! /etc/proto has been renamed to /etc/protocol (NOT ! /etc/protocols, as used by other Unix systems). When using perl on OS/390 please keep in mind that the EBCDIC and ASCII character sets are different. Perl builtin functions that may behave --- 32,114 ---- pax -o to=IBM-1047,from=ISO8859-1 -r < latest.tar + =head2 Setup and utilities + + Be sure that your yacc installation is in place including any necessary + parser template files. If you have not already done so then be sure to: + + cp /samples/yyparse.c /etc + + This may also be a good time to ensure that your /etc/protocol file + and either your /etc/resolv.conf or /etc/hosts files are in place. + GNU make for OS/390, which may be required for the build of perl, is available from: http://www.mks.com/s390/gnu/index.htm ! =head2 Configure ! ! Once you've unpacked the distribution, run "sh Configure" (see INSTALL ! for a full discussion of the Configure options). There is a "hints" file ! for os390 that specifies the correct values for most things. Some things ! to watch out for include: ! ! =over 4 ! ! =item * ! ! Some of the parser default template files in /samples are needed in /etc. ! In particular be sure that you at least copy /samples/yyparse.c to /etc ! before running perl's Configure. This step ensures successful extraction ! of EBCDIC versions of parser files such as perly.c. ! ! =item * ! ! This port doesn't support dynamic loading. Although ! OS/390 has support for DLLs, there are some differences ! that cause problems for perl. ! ! =item * ! ! You may see a "WHOA THERE!!!" message for $d_shmatprototype ! it is OK to keep the recommended "define". ! ! =item * ! ! Don't turn on the compiler optimization flag "-O". There's ! a bug in either the optimizer or perl that causes perl to ! not work correctly when the optimizer is on. ! ! =item * ! ! Some of the configuration files in /etc used by the ! networking APIs are either missing or have the wrong ! names. In particular, make sure that there's either ! an /etc/resolv.conf or and /etc/hosts, so that ! gethostbyname() works, and make sure that the file ! /etc/proto has been renamed to /etc/protocol (NOT ! /etc/protocols, as used by other Unix systems). ! ! =back ! ! =head2 Build, test, install ! ! Simply put: ! ! sh Configure ! make ! make test ! ! if everything looks ok then: ! ! make install ! ! this last step may or may not require UID=0 privileges depending ! on how you answered the questions that Configure asked and whether ! or not you have write access to the directories you specified. ! ! =head2 Usage Hints When using perl on OS/390 please keep in mind that the EBCDIC and ASCII character sets are different. Perl builtin functions that may behave *************** *** 61,83 **** for an example of how to use the "eval exec" trick to ask the shell to have perl run your scripts for you. ! perl-mvs mailing list: The Perl Institute (http://www.perl.org/) ! maintains a mailing list of interest to all folks building and/or using perl on EBCDIC platforms. To subscibe, send a message of: subscribe perl-mvs to majordomo@perl.org. ! Regression tests: as the 5.005 kit was was being assembled ! the following "failures" were known to appear on some machines ! during `make test` (mostly due to ASCII vs. EBCDIC conflicts), ! your results may differ: ! ! comp/cpp..........FAILED at test 0 ! op/pack...........FAILED at test 58 ! op/stat...........Out of memory! ! op/taint..........FAILED at test 73 ! lib/errno.........FAILED at test 1 ! lib/posix.........FAILED at test 19 ! lib/searchdict....FAILED at test 1 --- 123,158 ---- for an example of how to use the "eval exec" trick to ask the shell to have perl run your scripts for you. ! =head2 Extensions ! ! You can build xs based extensions to Perl for OS/390 but will need to ! follow the instructions in ExtUtils::MakeMaker for building statically ! linked perl binaries. In most cases people have reported better ! results with GNU make rather than the system's /bin/make. ! ! =head1 AUTHORS ! ! David Fiander and Peter Prymmer. ! ! =head1 SEE ALSO ! ! L, L, L. ! ! =head2 Mailing list ! ! The Perl Institute (http://www.perl.org/) maintains a perl-mvs ! mailing list of interest to all folks building and/or using perl on EBCDIC platforms. To subscibe, send a message of: subscribe perl-mvs to majordomo@perl.org. ! =head1 HISTORY ! ! This document was originally written by David Fiander for the 5.005 ! release of Perl. ! ! This document was podified for the 5.005_03 release of perl 11 March 1999. ! ! =cut diff -c 'perl5.005_02/README.threads' 'perl5.005_03/README.threads' Index: ./README.threads *** ./README.threads Sun Aug 2 18:30:17 1998 --- ./README.threads Thu Feb 11 18:05:41 1999 *************** *** 1,3 **** --- 1,10 ---- + NOTE + + Threading is a highly experimental feature. There are still a + few race conditions that show up under high contention on SMP + machines. Internal implementation is still subject to changes. + It is not recommended for production use at this time. + Building If you want to build with multi-threading support and you are *************** *** 27,33 **** POSIX.1c threads then read on. Additional information may be in a platform-specific "hints" file in the hints/ subdirectory. ! Omit the -d from your ./Configure arguments. For example, use ./Configure -Dusethreads --- 34,41 ---- POSIX.1c threads then read on. Additional information may be in a platform-specific "hints" file in the hints/ subdirectory. ! On other platforms that use Configure to build perl, omit the -d ! from your ./Configure arguments. For example, use: ./Configure -Dusethreads *************** *** 92,97 **** --- 100,109 ---- Add -lc_r to libswanted Change -lc in lddflags to be -lpthread -lc_r -lc + For Win32: + See README.win32, and the notes at the beginning of win32/Makefile + or win32/makefile.mk. + Now you can do a make *************** *** 147,157 **** Bugs * FAKE_THREADS should produce a working perl but the Thread ! extension won't build with it yet. ! ! * There's a known memory leak (curstack isn't freed at the end ! of each thread because it causes refcount problems that I ! haven't tracked down yet) and there are very probably others too. * There may still be races where bugs show up under contention. --- 159,166 ---- Bugs * FAKE_THREADS should produce a working perl but the Thread ! extension won't build with it yet. (FAKE_THREADS has not been ! tested at all in recent times.) * There may still be races where bugs show up under contention. *************** *** 275,277 **** --- 284,289 ---- Configure-related info updated 16 July 1998 by Andy Dougherty + + Other minor updates 10 Feb 1999 by + Gurusamy Sarathy diff -c 'perl5.005_02/README.vms' 'perl5.005_03/README.vms' Index: ./README.vms *** ./README.vms Sat Jul 25 21:28:39 1998 --- ./README.vms Wed Mar 3 20:35:30 1999 *************** *** 1,4 **** ! Last Revised 21-July-1998 by Dan Sugalski Originally by Charles Bailey * Important safety tip --- 1,4 ---- ! Last Revised 01-March-1999 by Dan Sugalski Originally by Charles Bailey * Important safety tip *************** *** 31,37 **** to lend a hand we'd love to have you. Join the Perl Porting Team Now! The current sources and build procedures have been tested on a VAX using ! VaxC and Dec C, and on an AXP using Dec C. If you run into problems with other compilers, please let us know. There are issues with varions versions of Dec C, so if you're not running a --- 31,37 ---- to lend a hand we'd love to have you. Join the Perl Porting Team Now! The current sources and build procedures have been tested on a VAX using ! Dec C, and on an AXP using Dec C. If you run into problems with other compilers, please let us know. There are issues with varions versions of Dec C, so if you're not running a *************** *** 41,53 **** * Other required software In addition to VMS, you'll need: ! 1) A C compiler. Dec C for AXP, or Dec C, or gcc for the VAX. 2) A make tool. Dec's MMS (v2.6 or later), or MadGoat's free MMS analog MMK (available from ftp.madgoat.com/madgoat) both work just fine. Gnu Make might work, but it's been so long since anyone's tested it that we're not sure. MMK's free, though, so go ahead and use that. If you want to include socket support, you'll need a TCP stack and either Dec C, or socket libraries. See the Socket Support topic for more details. --- 41,78 ---- * Other required software In addition to VMS, you'll need: ! 1) A C compiler. Dec C or gcc for AXP or the VAX. 2) A make tool. Dec's MMS (v2.6 or later), or MadGoat's free MMS analog MMK (available from ftp.madgoat.com/madgoat) both work just fine. Gnu Make might work, but it's been so long since anyone's tested it that we're not sure. MMK's free, though, so go ahead and use that. + You may also want to have on hand: + 1) UNZIP.EXE for VMS available from a number of web/ftp sites. + http://www.cdrom.com/pub/infozip/UnZip.html + http://www.openvms.digital.com/cd/INFO-ZIP/ + ftp://ftp.digital.com/pub/VMS/ + ftp://ftp.openvms.digital.com/ + ftp://ftp.madgoat.com/madgoat/ + ftp://ftp.wku.edu/vms/ + 2) GUNZIP/GZIP.EXE for VMS available from a number of web/ftp sites. + http://www.fsf.org/order/ftp.html + ftp://ftp.uu.net/archive/systems/gnu/diffutils*.tar.gz + ftp://gatekeeper.dec.com/pub/GNU/diffutils*.tar.gz + ftp://ftp.gnu.org/pub/gnu/diffutils*.tar.gz + http://www.openvms.digital.com/cd/GZIP/ + ftp://ftp.digital.com/pub/VMS/ + 3) VMS TAR also available from a number of web/ftp sites. + ftp://ftp.lp.se/vms/ + http://www.openvms.digital.com/cd/VMSTAR/ + ftp://ftp.digital.com/pub/VMS/ + Please note that UNZIP and GUNZIP are not the same thing (they work with + different formats). Most of the useful files from CPAN (the Comprehensive + Perl Archive Network) are in .tar.gz format (this includes copies of the + source code for perl as well as modules and scripts that you may wish to + add later) hence you probably want to have GUNZIP.EXE and VMSTAR.EXE on + your VMS machine. If you want to include socket support, you'll need a TCP stack and either Dec C, or socket libraries. See the Socket Support topic for more details. *************** *** 81,88 **** @CONFIGURE "-des" ! (note the quotes and case) will choose reasonable defaults. (It takes Dec C ! over Gnu C, Dec C sockets over SOCKETSHR sockets, and either over no sockets) * Testing Perl --- 106,114 ---- @CONFIGURE "-des" ! (note the quotation marks and case) will choose reasonable defaults. (It ! takes Dec C over Gnu C, Dec C sockets over SOCKETSHR sockets, and either ! over no sockets) * Testing Perl *************** *** 96,106 **** Compile Command: ! $MMS/Macro=("__AXP__=1","decc=1","DECCRTL_SOCKETS=1") Test Command: ! $MMS/Macro=("__AXP__=1","decc=1","DECCRTL_SOCKETS=1") test MMS will run all the tests. This may take some time, as there are a lot of tests. If any tests fail, there will be a note made on-screen. At the end --- 122,132 ---- Compile Command: ! $MMS Test Command: ! $MMS test MMS will run all the tests. This may take some time, as there are a lot of tests. If any tests fail, there will be a note made on-screen. At the end *************** *** 109,115 **** If any tests fail, it means something's wrong with Perl. If the test suite hangs (some tests can take upwards of two or three minutes, or more if ! you're on an especially slow machine, depending on you machine speed, so don't be hasty), then the test *after* the last one displayed failed. Don't install Perl unless you're confident that you're OK. Regardless of how confident you are, make a bug report to the VMSPerl mailing list. --- 135,141 ---- If any tests fail, it means something's wrong with Perl. If the test suite hangs (some tests can take upwards of two or three minutes, or more if ! you're on an especially slow machine, depending on your machine speed, so don't be hasty), then the test *after* the last one displayed failed. Don't install Perl unless you're confident that you're OK. Regardless of how confident you are, make a bug report to the VMSPerl mailing list. *************** *** 133,138 **** --- 159,167 ---- Note that "-V" really is a capital V in double quotes. This will dump out a couple of screens worth of config info, and can help us diagnose the problem. + If (and only if) that did not work then try enclosing the output of: + + @[.vms]myconfig * Cleaning up and starting fresh *************** *** 142,152 **** Compile Command: ! $MMS/Macro=("__AXP__=1","decc=1","DECCRTL_SOCKETS=1") Cleanup Command: ! $MMS/Macro=("__AXP__=1","decc=1","DECCRTL_SOCKETS=1") realclean If you don't do this, things may behave erratically. They might not, too, so it's best to be sure and do it. --- 171,181 ---- Compile Command: ! $MMS Cleanup Command: ! $MMS realclean If you don't do this, things may behave erratically. They might not, too, so it's best to be sure and do it. *************** *** 170,201 **** If for some reason it complains about target INSTALL being up to date, throw a /FORCE switch on the MMS or MMK command. 3) Either define the symbol PERL somewhere, such as SYS$MANAGER:SYLOGIN.COM, to be "PERL :== $PERL_ROOT:[000000]PERL.EXE", or install Perl into DCLTABLES.EXE (Check out the section "Installing Perl into DCLTABLES" for more info), or put the image in a directory that's in your DCL$PATH (if you're using VMS 6.2 or higher). ! 4) Optionally define the command PERLDOC as ! PERLDOC :== "$PERL_ROOT:[000000]PERL PERL_ROOT:[LIB.POD]PERLDOC.COM -T" Note that if you wish to use most as a pager please see ! ftp://space.mit.edu/pub/davis/ for both most and slang. ! 5) Optionally define the command PERLBUG (the Perl bug report generator) as ! PERLBUG :== "$PERL_ROOT:[000000]PERL PERL_ROOT:[LIB]PERLBUG.COM" ! 6) Optionally define the command POD2MAN (Converts POD files to nroff source suitable for converting to man pages. Also quiets complaints during module builds) as DEFINE/NOLOG POD2MAN PERL_ROOT:[LIB.POD]POD2MAN.COM ! POD2MAN :== "$PERL_ROOT:[000000]PERL POD2MAN" ! 7) Optionally define the command POD2TEXT (Converts POD files to text, which is required for perldoc -f to work properly) as DEFINE/NOLOG POD2TEXT PERL_ROOT:[LIB.POD]POD2TEXT.COM ! POD2TEXT :== "$PERL_ROOT:[000000]PERL POD2TEXT" In all these cases, if you've got PERL defined as a foreign command, you can replace $PERL_ROOT:[000000]PERL with ''perl'. If you've installed perl --- 199,239 ---- If for some reason it complains about target INSTALL being up to date, throw a /FORCE switch on the MMS or MMK command. + The script [.VMS]PERL_SETUP.COM that is written by CONFIGURE.COM + will take care of most of the following: + 3) Either define the symbol PERL somewhere, such as SYS$MANAGER:SYLOGIN.COM, to be "PERL :== $PERL_ROOT:[000000]PERL.EXE", or install Perl into DCLTABLES.EXE (Check out the section "Installing Perl into DCLTABLES" for more info), or put the image in a directory that's in your DCL$PATH (if you're using VMS 6.2 or higher). ! 4) Either define the logical name PERLSHR somewhere ! (such as in PERL_SETUP.COM) like so: ! DEFINE/NOLOG PERLSHR PERL_ROOT:[000000]PERLSHR.EXE ! or copy perl_root:[000000]perlshr.exe sys$share:. ! ! 5) Optionally define the command PERLDOC as ! PERLDOC == "$PERL_ROOT:[000000]PERL PERL_ROOT:[LIB.POD]PERLDOC.COM -t" Note that if you wish to use most as a pager please see ! ftp://space.mit.edu/pub/davis/ for both most and slang (or perhaps ! ftp://ftp.wku.edu/vms/narnia/most.zip ). ! 6) Optionally define the command PERLBUG (the Perl bug report generator) as ! PERLBUG == "$PERL_ROOT:[000000]PERL PERL_ROOT:[LIB]PERLBUG.COM" ! 7) Optionally define the command POD2MAN (Converts POD files to nroff source suitable for converting to man pages. Also quiets complaints during module builds) as DEFINE/NOLOG POD2MAN PERL_ROOT:[LIB.POD]POD2MAN.COM ! POD2MAN == "$PERL_ROOT:[000000]PERL POD2MAN" ! 8) Optionally define the command POD2TEXT (Converts POD files to text, which is required for perldoc -f to work properly) as DEFINE/NOLOG POD2TEXT PERL_ROOT:[LIB.POD]POD2TEXT.COM ! POD2TEXT == "$PERL_ROOT:[000000]PERL POD2TEXT" In all these cases, if you've got PERL defined as a foreign command, you can replace $PERL_ROOT:[000000]PERL with ''perl'. If you've installed perl *************** *** 233,252 **** The one exception is the various *DIR install locations. Changing those requires changes in genconfig.pl as well. Be really careful if you need to ! change these,a s they can cause some fairly subtle problems. * Extra things in the Perl distribution In addition to the standard stuff that gets installed, there are two optional extensions, DCLSYM and STDIO, that are handy. Instructions for these two modules are in [.VMS.EXT.DCLSYM] and [.VMS.EXT.STDIO], ! respectively. * Socket Support Perl includes a number of functions for IP sockets, which are available if ! you choose to compile Perl with socket support. (See the section Compiling ! Perl for more info on selecting a socket stack) Since IP networking is an optional addition to VMS, there are several different IP stacks available. How well integrated they are into the system depends on the stack, your version of VMS, and the version of your C compiler. --- 271,314 ---- The one exception is the various *DIR install locations. Changing those requires changes in genconfig.pl as well. Be really careful if you need to ! change these, as they can cause some fairly subtle problems. ! ! * INSTALLing images ! ! On systems that are using perl quite a bit, and particularly those with ! minimal RAM, you can boost the performance of perl by INSTALLing it as ! a known image. PERLSHR.EXE is typically larger than 1500 blocks ! and that is a reasonably large amount of IO to load each time perl is ! invoked. ! ! INSTALL ADD PERLSHR/SHARE ! ! should be enough for PERLSHR.EXE (/share implies /header and /open), ! while /HEADER should do for PERL.EXE (perl.exe is not a shared image). ! ! If your code 'use's modules, check to see if there's an executable for ! them, too. In the base perl build, POSIX, IO, Fcntl, Opcode, SDBM_File, ! DCLsym, and Stdio all have shared images that can be installed /SHARE. ! ! How much of a win depends on your memory situation, but if you're firing ! off perl with any regularity (like more than once every 20 seconds or so) ! it's probably a win. ! ! While there is code in perl to remove privileges as it runs you are advised ! to NOT INSTALL PERL.EXE with PRIVs! * Extra things in the Perl distribution In addition to the standard stuff that gets installed, there are two optional extensions, DCLSYM and STDIO, that are handy. Instructions for these two modules are in [.VMS.EXT.DCLSYM] and [.VMS.EXT.STDIO], ! respectively. They are built automatically for versions of perl >= 5.005. * Socket Support Perl includes a number of functions for IP sockets, which are available if ! you choose to compile Perl with socket support (see the section Compiling ! Perl for more info on selecting a socket stack). Since IP networking is an optional addition to VMS, there are several different IP stacks available. How well integrated they are into the system depends on the stack, your version of VMS, and the version of your C compiler. *************** *** 272,278 **** it. There's a script in PERL_ROOT:[UTILS], perlbug, that walks you through the process of creating a bug report. This script includes details of your installation, and is very handy. Completed bug reports should go to ! PERLBUG@PERL.COM. * Gotchas to watch out for --- 334,340 ---- it. There's a script in PERL_ROOT:[UTILS], perlbug, that walks you through the process of creating a bug report. This script includes details of your installation, and is very handy. Completed bug reports should go to ! perlbug@perl.com. * Gotchas to watch out for *************** *** 286,292 **** $DEFINE/TRANS=(CONC,TERM) PERLSRC disk:[dir.dir.dir.perldir.]" (note the trailing period) and $SET DEFAULT PERLSRC:[000000] before building. Perl modules can be just as bad (or worse), so watch out for them, too. The ! configuration script will warn if it thinks you're too deep. Finally, the third thing that bites people is leftover pieces from a failed build. If things go wrong, make sure you do a "(MMK|MMS|make) realclean" --- 348,355 ---- $DEFINE/TRANS=(CONC,TERM) PERLSRC disk:[dir.dir.dir.perldir.]" (note the trailing period) and $SET DEFAULT PERLSRC:[000000] before building. Perl modules can be just as bad (or worse), so watch out for them, too. The ! configuration script will warn if it thinks you're too deep (at least on ! versions of VMS prior to 7.2). Finally, the third thing that bites people is leftover pieces from a failed build. If things go wrong, make sure you do a "(MMK|MMS|make) realclean" *************** *** 323,334 **** The VMSPERL mailing list address is VMSPERL@NEWMAN.UPENN.EDU. Any mail sent there gets echoed to all subscribers of the list. ! The Perl5-Porters list is for anyone involved in porting Perl to a ! platform. This includes you, if you want to participate. It's a high-volume ! list (60-100 messages a day during active development times), so be sure ! you want to be there. The subscription address is ! Perl5-Porters-request@perl.org. Send a message with just the word SUBSCRIBE ! in the body. The posting address is Perl5-Porters@perl.org. * Acknowledgements --- 386,395 ---- The VMSPERL mailing list address is VMSPERL@NEWMAN.UPENN.EDU. Any mail sent there gets echoed to all subscribers of the list. ! To unsubscribe from VMSPERL send the message UNSUBSCRIBE VMSPERL to ! VMSPERL-REQUEST@NEWMAN.UPENN.EDU. Be sure to do so from the subscribed ! account that you are cancelling. ! * Acknowledgements *************** *** 348,363 **** for the getredirection() code Rich Salz for readdir() and related routines ! Peter Prymmer for extensive contributions to recent version support, development of VMS-specific extensions, and dissemination of information about VMS Perl, the Stanford Synchrotron Radiation Laboratory and the Laboratory of Nuclear Studies at Cornell University for ! the the opportunity to test and develop for the AXP, and to the entire VMSperl group for useful advice and suggestions. In addition the perl5-porters deserve credit for their creativity and willingness to work with the VMS newcomers. Finally, the greatest debt of --- 409,424 ---- for the getredirection() code Rich Salz for readdir() and related routines ! Peter Prymmer or for extensive testing, as well as development work on configuration and documentation for VMS Perl, ! Dan Sugalski for extensive contributions to recent version support, development of VMS-specific extensions, and dissemination of information about VMS Perl, the Stanford Synchrotron Radiation Laboratory and the Laboratory of Nuclear Studies at Cornell University for ! the opportunity to test and develop for the AXP, and to the entire VMSperl group for useful advice and suggestions. In addition the perl5-porters deserve credit for their creativity and willingness to work with the VMS newcomers. Finally, the greatest debt of diff -c /dev/null 'perl5.005_03/README.vos' Index: README.vos *** README.vos Wed Dec 31 18:00:00 1969 --- README.vos Thu Feb 11 18:05:42 1999 *************** *** 0 **** --- 1,139 ---- + Perl 5 README file for the Stratus VOS operating system. + Paul Green (Paul_Green@stratus.com) + February 4, 1999 + + + Introduction + ------------ + This is a port of Perl version 5, revision 005-03, to VOS. Perl + is a scripting or macro language that is popular on many + systems. See your local computer bookstore for a number of good + books on Perl. + + Most of the Perl features should work on VOS. However, any + attempt by perl.pm to call the following unimplemented POSIX + functions will result in an error message and an immediate and + fatal call to the VOS debugger. They are "dup", "fork", and + "waitpid". The lack of these functions pretty much prevents you + from starting VOS commands and grabbing their output in perl. + The workaround is to run the commands outside of perl, then have + perl process the output file. + + + Compiling Perl 5 on VOS + ----------------------- + Before you can build Perl 5 on VOS, you need to have or acquire the + following additional items. + + 1. The VOS Standard C Compiler and Runtime, or the VOS Standard C + Cross-Compiler. This is a standard Stratus product. + + 2. The VOS OS TCP/IP product set. While the necessary header + files are included with VOS POSIX.1, you still need the + appropriate object files in order to bind perl.pm. This is + a standard Stratus product. + + 3. The VOS POSIX.1 environment. As of this writing, this is + available on the VOS FTP site. Login anonymously to + ftp.stratus.com and get the file + /pub/vos/alpha/posix.save.evf.gz in binary file-transfer + mode. Or use the Uniform Resource Locator (URL) + ftp://ftp.stratus.com/pub/vos/alpha/posix.save.evf.gz from + your web browser. This is not a standard Stratus product. + + Instructions for unbundling this file are at + ftp://ftp.stratus.com/pub/vos/utility/utility.html. + + To build perl 5, change to the "vos" subdirectory and type the + command "compile_perl -processor X", where X is the processor + type (mc68020, i80860, pa7100, pa8000) that you wish to use. + + + Installing Perl 5 on VOS + ------------------------ + 1. Create the directory >system>ported>command_library. + + 2. Copy the appropriate version of the perl program module to + this directory. For example, with your current directory + set to the top-level directory of Perl 5, to install the + executable program module for the Motorola 68K + architecture, enter: + + !copy_file vos>obj>perl.pm >system>ported>command_library>* + + (If you wish to use both Perl version 4 and Perl version 5, + you must give them different names; for example, perl.pm + and perl5.pm). + + 3. Create the directory >system>ported>perl>lib. + + 4. Copy all of the files and subdirectories from the lib + subdirectory into this new directory. For example, with + the current directory set to the top-level directory of the + perl distribution, enter: + + !copy_dir lib >system>ported>perl>lib>5.005 + + 5. While there are currently no architecture-specific + extensions or modules distributed with perl, the following + directories can be used to hold such files: + + >system>ported>perl>lib>5.005.68k + >system>ported>perl>lib>5.005.860 + >system>ported>perl>lib>5.005.7100 + >system>ported>perl>lib>5.005.8000 + + 6. Site-specific perl extensions and modules can be installed + in one of two places. Put architecture-independent files + into: + + >system>ported>perl>lib>site>5.005 + + Put architecture-dependent files into one of the following + directories: + + >system>ported>perl>lib>site>5.005.68k + >system>ported>perl>lib>site>5.005.860 + >system>ported>perl>lib>site>5.005.7100 + >system>ported>perl>lib>site>5.005.8000 + + 7. You can examine the @INC variable from within a perl program + to see the order in which Perl searches these directories. + + + Unimplemented Features + ---------------------- + If Perl 5 attempts to call an unimplemented VOS POSIX.1 function, + it will print a fatal error message and enter the VOS debugger. + This error is not recoverable. See vos_dummies.c for a list of + the unimplemented POSIX.1 functions. To see what functions are + unimplemented and what the error message looks like, compile and + execute "test_vos_dummies.c". + + + Restrictions + ------------ + This port of Perl version 5 to VOS prefers Unix-style, + slash-separated pathnames over VOS-style greater-than-separated + pathnames. VOS-style pathnames should work in most contexts, but + if you have trouble, replace all greater-than characters by slash + characters. Because the slash character is used as a pathname + delimiter, Perl cannot process VOS pathnames containing a slash + character in a directory or file name; these must be renamed. + + This port of Perl also uses Unix-epoch date values internally. + As long as you are dealing with ASCII character string + representations of dates, this should not be an issue. The + supported epoch is January 1, 1980 to January 17, 2038. + + See the file pod/perlport.pod for more information about the VOS + port of Perl. + + + Support Status + -------------- + I'm offering this port "as is". You can ask me questions, but I + can't guarantee I'll be able to answer them; I don't know much + about Perl itself; I'm still learning that. + + (end) diff -c 'perl5.005_02/README.win32' 'perl5.005_03/README.win32' Index: ./README.win32 *** ./README.win32 Fri Aug 7 22:57:52 1998 --- ./README.win32 Sun Mar 28 16:36:42 1999 *************** *** 47,53 **** Borland C++ version 5.02 or later Microsoft Visual C++ version 4.2 or later ! Mingw32 with EGCS version 1.0.2 Mingw32 with GCC version 2.8.1 The last two of these are high quality freeware compilers. Support --- 47,53 ---- Borland C++ version 5.02 or later Microsoft Visual C++ version 4.2 or later ! Mingw32 with EGCS versions 1.0.2, 1.1 Mingw32 with GCC version 2.8.1 The last two of these are high quality freeware compilers. Support *************** *** 75,80 **** --- 75,83 ---- The surest way to build it is on WindowsNT, using the cmd shell. + Make sure the path to the build directory does not contain spaces. The + build usually works in this circumstance, but some tests will fail. + =item Borland C++ If you are using the Borland compiler, you will need dmake, a freely *************** *** 104,110 **** =item Mingw32 with EGCS or GCC ! ECGS-1.0.2 binaries can be downloaded from: ftp://ftp.xraylith.wisc.edu/pub/khan/gnu-win32/mingw32/ --- 107,113 ---- =item Mingw32 with EGCS or GCC ! ECGS binaries can be downloaded from: ftp://ftp.xraylith.wisc.edu/pub/khan/gnu-win32/mingw32/ *************** *** 121,126 **** --- 124,131 ---- above. You will need to set up a few environment variables (usually run from a batch file). + You also need dmake. See L above on how to get it. + =back =head2 Building *************** *** 146,152 **** ActiveState Tool Corp.) PERL_OBJECT uses C++, and the binaries are therefore incompatible with the regular C build. However, the PERL_OBJECT build does provide something called the C-API, for linking ! it with extensions that won't compile under PERL_OBJECT. PERL_OBJECT is not yet supported under GCC or EGCS. WARNING: Binaries built with PERL_OBJECT enabled are B compatible with binaries built without. Perl installs PERL_OBJECT binaries under a distinct architecture name, --- 151,162 ---- ActiveState Tool Corp.) PERL_OBJECT uses C++, and the binaries are therefore incompatible with the regular C build. However, the PERL_OBJECT build does provide something called the C-API, for linking ! it with extensions that won't compile under PERL_OBJECT. Using the C_API ! is typically requested through: ! ! perl Makefile.PL CAPI=TRUE ! ! PERL_OBJECT requires VC++ 5.0 (Service Pack 3 recommended) or later. It is not yet supported under GCC or EGCS. WARNING: Binaries built with PERL_OBJECT enabled are B compatible with binaries built without. Perl installs PERL_OBJECT binaries under a distinct architecture name, *************** *** 184,189 **** --- 194,203 ---- You will also have to make sure CCHOME points to wherever you installed your compiler. + The default value for CCHOME in the makefiles for Visual C++ + may not be correct for some versions. Make sure the default exists + and is valid. + Other options are explained in the makefiles. Be sure to read the instructions carefully. *************** *** 211,219 **** themselves use the C Runtime heavily, or want to free() pointers malloc()-ed by perl. ! You can avoid the perl95.exe problems completely if you use Borland ! C++ for building perl (perl95.exe is not needed and will not be built ! in that case). =back --- 225,233 ---- themselves use the C Runtime heavily, or want to free() pointers malloc()-ed by perl. ! You can avoid the perl95.exe problems completely if you either enable ! USE_PERLCRT with Visual C++, or use Borland C++ for building perl. In ! those cases, perl95.exe is not needed and will not be built. =back *************** *** 223,239 **** the testsuite (many tests will be skipped, and but no test should fail). If some tests do fail, it may be because you are using a different command ! shell than the native "cmd.exe". ! If you used the Borland compiler, you may see a failure in op/taint.t arising from the inability to find the Borland Runtime DLLs on the system default path. You will need to copy the DLLs reported by the messages from where Borland chose to install it, into the Windows system directory (usually somewhere like C:\WINNT\SYSTEM32), and rerun the test. The Visual C runtime apparently has a bug that causes posix.t to fail ! one it test#2. This usually happens only if you extracted the files in ! text mode. Please report any other failures as described under L. --- 237,257 ---- the testsuite (many tests will be skipped, and but no test should fail). If some tests do fail, it may be because you are using a different command ! shell than the native "cmd.exe", or because you are building from a path ! that contains spaces. So don't do that. ! If you are running the tests from a emacs shell window, you may see ! failures in op/stat.t. Run "dmake test-notty" in that case. ! ! If you're using the Borland compiler, you may see a failure in op/taint.t arising from the inability to find the Borland Runtime DLLs on the system default path. You will need to copy the DLLs reported by the messages from where Borland chose to install it, into the Windows system directory (usually somewhere like C:\WINNT\SYSTEM32), and rerun the test. The Visual C runtime apparently has a bug that causes posix.t to fail ! test#2. This usually happens only if you extracted the files in text ! mode. Enable the USE_PERLCRT option in the Makefile to fix this bug. Please report any other failures as described under L. *************** *** 248,254 **** C<$INST_TOP\$VERSION\bin>, and C<$INST_TOP\$VERSION\bin\$ARCHNAME>. For example: ! set PATH c:\perl\5.005\bin;c:\perl\5.005\bin\MSWin32-x6;%PATH% =head2 Usage Hints --- 266,272 ---- C<$INST_TOP\$VERSION\bin>, and C<$INST_TOP\$VERSION\bin\$ARCHNAME>. For example: ! set PATH c:\perl\5.005\bin;c:\perl\5.005\bin\MSWin32-x86;%PATH% =head2 Usage Hints *************** *** 269,277 **** You can also control the shell that perl uses to run system() and backtick commands via PERL5SHELL. See L. ! Currently, Perl does not depend on the registry, but can look up ! values if you choose to put them there. [XXX add registry locations ! that perl looks at here.] =item File Globbing --- 287,307 ---- You can also control the shell that perl uses to run system() and backtick commands via PERL5SHELL. See L. ! Perl does not depend on the registry, but it can look up certain default ! values if you choose to put them there. Perl attempts to read entries from ! C and C. ! Entries in the former override entries in the latter. One or more of the ! following entries (of type REG_SZ or REG_EXPAND_SZ) may be set: ! ! lib-$] version-specific path to add to @INC ! lib path to add to @INC ! sitelib-$] version-specific path to add to @INC ! sitelib path to add to @INC ! PERL* fallback for all %ENV lookups that begin with "PERL" ! ! Note the C<$]> in the above is not literal. Substitute whatever version ! of perl you want to honor that entry, e.g. C<5.00502>. Paths must be ! separated with semicolons, as usual on win32. =item File Globbing *************** *** 378,386 **** $MAKE test $MAKE install ! where $MAKE stands for NMAKE or DMAKE. Some extensions may not ! provide a testsuite (so "$MAKE test" may not do anything, or fail), ! but most serious ones do. If a module implements XSUBs, you will need one of the supported C compilers. You must make sure you have set up the environment for --- 408,441 ---- $MAKE test $MAKE install ! where $MAKE is whatever 'make' program you have configured perl to ! use. Use "perl -V:make" to find out what this is. Some extensions ! may not provide a testsuite (so "$MAKE test" may not do anything, or ! fail), but most serious ones do. ! ! It is important that you use a supported 'make' program, and ! ensure Config.pm knows about it. If you don't have nmake, you can ! either get dmake from the location mentioned earlier, or get an ! old version of nmake reportedly available from: ! ! ftp://ftp.microsoft.com/Softlib/MSLFILES/nmake15.exe ! ! Another option is to use the make written in Perl, available from ! CPAN: ! ! http://www.perl.com/CPAN/authors/id/NI-S/Make-0.03.tar.gz ! ! Note that MakeMaker actually emits makefiles with different syntax ! depending on what 'make' it thinks you are using. Therefore, it is ! important that one of the following values appears in Config.pm: ! ! make='nmake' # MakeMaker emits nmake syntax ! make='dmake' # MakeMaker emits dmake syntax ! any other value # MakeMaker emits generic make syntax ! (e.g GNU make, or Perl make) ! ! If the value doesn't match the 'make' program you want to use, ! edit Config.pm to fix it. If a module implements XSUBs, you will need one of the supported C compilers. You must make sure you have set up the environment for *************** *** 461,467 **** CPAN in source form, along with many added bugfixes, and with MakeMaker support. This bundle is available at: ! http://www.perl.com/CPAN/authors/id/GSAR/libwin32-0.12.zip See the README in that distribution for building and installation instructions. Look for later versions that may be available at the --- 516,522 ---- CPAN in source form, along with many added bugfixes, and with MakeMaker support. This bundle is available at: ! http://www.perl.com/CPAN/authors/id/GSAR/libwin32-0.14.zip See the README in that distribution for building and installation instructions. Look for later versions that may be available at the *************** *** 693,699 **** Borland support was added in 5.004_01 (Gurusamy Sarathy). ! Last updated: 12 July 1998 =cut --- 748,758 ---- Borland support was added in 5.004_01 (Gurusamy Sarathy). ! GCC/mingw32 support was added in 5.005 (Nick Ing-Simmons). ! ! Support for PERL_OBJECT was added in 5.005 (ActiveState Tool Corp). ! ! Last updated: 18 January 1999 =cut diff -c 'perl5.005_02/Todo' 'perl5.005_03/Todo' Index: ./Todo *** ./Todo Thu Jul 23 22:59:39 1998 --- ./Todo Thu Mar 4 18:34:09 1999 *************** *** 10,18 **** lexperl Bundled perl preprocessor Use posix calls internally where possible ! gettimeofday format BOTTOM - -iprefix. -i rename file only when successfully changed All ARGV input should act like <> report HANDLE [formats]. --- 10,17 ---- lexperl Bundled perl preprocessor Use posix calls internally where possible ! gettimeofday (possibly best left for a module?) format BOTTOM -i rename file only when successfully changed All ARGV input should act like <> report HANDLE [formats]. *************** *** 23,28 **** --- 22,29 ---- lvalue functions regression/sanity tests for suidperl Full 64 bit support (i.e. "long long") + Generalise Errno way of extracting cpp symbols and use that in + Errno and Fcntl (ExtUtils::CppSymbol?) Possible pragmas debugger diff -c 'perl5.005_02/Todo-5.005' 'perl5.005_03/Todo-5.005' Index: ./Todo-5.005 *** ./Todo-5.005 Thu Jul 23 22:59:39 1998 --- ./Todo-5.005 Thu Mar 4 18:34:09 1999 *************** *** 1,26 **** Multi-threading $AUTOLOAD. Hmm. - without USE_THREADS, change extern variable for dTHR consistent semantics for exit/die in threads SvREFCNT_dec(curstack) in threadstart() in Thread.xs better support for externally created threads Thread::Pool - more Configure support spot-check globals like statcache and global GVs for thread-safety Compiler auto-produce executable typed lexicals should affect B::CC::load_pad workarounds to help Win32 - $^C to track compiler/checker status END blocks need saving in compiled output _AUTOLOAD prodding fix comppadlist (names in comppad_name can have fake SvCUR from where newASSIGNOP steals the field) Namespace cleanup - symbol-space: "pl_" prefix for all global vars - "Perl_" prefix for all functions CPP-space: restrict what we export from headers stop malloc()/free() pollution unless asked header-space: move into CORE/perl/ --- 1,21 ---- *************** *** 28,36 **** MULTIPLICITY support complete work on safe recursive interpreters, Cnew()> ! ! Configure ! installation layout changes to avoid overwriting old versions Reliable Signals alternate runops() for signal despatch --- 23,29 ---- MULTIPLICITY support complete work on safe recursive interpreters, Cnew()> ! revisit extra implicit arg that provides curthread/curinterp context Reliable Signals alternate runops() for signal despatch *************** *** 38,68 **** add tests for Thread::Signal Win32 stuff - automate maintenance of most PERL_OBJECT code get PERL_OBJECT building under gcc rename new headers to be consistent with the rest sort out the spawnvp() mess work out DLL versioning - put perlobject in $ARCHNAME so it can coexist with rest - get PERL_OBJECT building on non-win32? style-check Miscellaneous rename and alter ISA.pm magic_setisa should be made to update %FIELDS [???] ! be generous in accepting foreign line terminations ! make filenames 8.3 friendly, where feasible ! upgrade to newer versions of all independently maintained modules ! add new modules (Data-Dumper, Storable?) ! test it with large parts of CPAN fix pod2html to generate relative URLs ! Documentation comprehensive perldelta.pod describe new age patterns update perl{guts,call,embed,xs} with additions, changes to API document Win32 choices - rework INSTALL to reflect changes in installation structure spot-check all new modules for completeness better docs for pack()/unpack() ! add perlport.pod --- 31,61 ---- add tests for Thread::Signal Win32 stuff get PERL_OBJECT building under gcc + get PERL_OBJECT building on non-win32 + automate generation of 'protected' prototypes for CPerlObj rename new headers to be consistent with the rest sort out the spawnvp() mess work out DLL versioning style-check Miscellaneous rename and alter ISA.pm magic_setisa should be made to update %FIELDS [???] ! add new modules (Archive::Tar, Compress::Zlib, CPAN::FTP?) fix pod2html to generate relative URLs + automate testing with large parts of CPAN ! Ongoing ! keep filenames 8.3 friendly, where feasible ! upgrade to newer versions of all independently maintained modules comprehensive perldelta.pod + + Documentation describe new age patterns update perl{guts,call,embed,xs} with additions, changes to API document Win32 choices spot-check all new modules for completeness better docs for pack()/unpack() ! reorg tutorials vs. reference sections ! diff -c 'perl5.005_02/XSUB.h' 'perl5.005_03/XSUB.h' Index: ./XSUB.h *** ./XSUB.h Thu Jul 23 22:59:39 1998 --- ./XSUB.h Wed Dec 30 10:58:42 1998 *************** *** 57,64 **** #ifdef XS_VERSION # define XS_VERSION_BOOTCHECK \ STMT_START { \ ! SV *tmpsv; \ ! char *vn = Nullch, *module = SvPV(ST(0),PL_na); \ if (items >= 2) /* version supplied as bootstrap arg */ \ tmpsv = ST(1); \ else { \ --- 57,64 ---- #ifdef XS_VERSION # define XS_VERSION_BOOTCHECK \ STMT_START { \ ! SV *tmpsv; STRLEN n_a; \ ! char *vn = Nullch, *module = SvPV(ST(0),n_a); \ if (items >= 2) /* version supplied as bootstrap arg */ \ tmpsv = ST(1); \ else { \ *************** *** 69,75 **** tmpsv = perl_get_sv(form("%s::%s", module, \ vn = "VERSION"), FALSE); \ } \ ! if (tmpsv && (!SvOK(tmpsv) || strNE(XS_VERSION, SvPV(tmpsv, PL_na)))) \ croak("%s object version %s does not match %s%s%s%s %_", \ module, XS_VERSION, \ vn ? "$" : "", vn ? module : "", vn ? "::" : "", \ --- 69,75 ---- tmpsv = perl_get_sv(form("%s::%s", module, \ vn = "VERSION"), FALSE); \ } \ ! if (tmpsv && (!SvOK(tmpsv) || strNE(XS_VERSION, SvPV(tmpsv, n_a)))) \ croak("%s object version %s does not match %s%s%s%s %_", \ module, XS_VERSION, \ vn ? "$" : "", vn ? module : "", vn ? "::" : "", \ *************** *** 77,82 **** --- 77,146 ---- } STMT_END #else # define XS_VERSION_BOOTCHECK + #endif + + #ifdef PERL_CAPI + # define VTBL_sv get_vtbl(want_vtbl_sv) + # define VTBL_env get_vtbl(want_vtbl_env) + # define VTBL_envelem get_vtbl(want_vtbl_envelem) + # define VTBL_sig get_vtbl(want_vtbl_sig) + # define VTBL_sigelem get_vtbl(want_vtbl_sigelem) + # define VTBL_pack get_vtbl(want_vtbl_pack) + # define VTBL_packelem get_vtbl(want_vtbl_packelem) + # define VTBL_dbline get_vtbl(want_vtbl_dbline) + # define VTBL_isa get_vtbl(want_vtbl_isa) + # define VTBL_isaelem get_vtbl(want_vtbl_isaelem) + # define VTBL_arylen get_vtbl(want_vtbl_arylen) + # define VTBL_glob get_vtbl(want_vtbl_glob) + # define VTBL_mglob get_vtbl(want_vtbl_mglob) + # define VTBL_nkeys get_vtbl(want_vtbl_nkeys) + # define VTBL_taint get_vtbl(want_vtbl_taint) + # define VTBL_substr get_vtbl(want_vtbl_substr) + # define VTBL_vec get_vtbl(want_vtbl_vec) + # define VTBL_pos get_vtbl(want_vtbl_pos) + # define VTBL_bm get_vtbl(want_vtbl_bm) + # define VTBL_fm get_vtbl(want_vtbl_fm) + # define VTBL_uvar get_vtbl(want_vtbl_uvar) + # define VTBL_defelem get_vtbl(want_vtbl_defelem) + # define VTBL_regexp get_vtbl(want_vtbl_regexp) + # ifdef USE_LOCALE_COLLATE + # define VTBL_collxfrm get_vtbl(want_vtbl_collxfrm) + # endif + # ifdef OVERLOAD + # define VTBL_amagic get_vtbl(want_vtbl_amagic) + # define VTBL_amagicelem get_vtbl(want_vtbl_amagicelem) + # endif + #else + # define VTBL_sv &vtbl_sv + # define VTBL_env &vtbl_env + # define VTBL_envelem &vtbl_envelem + # define VTBL_sig &vtbl_sig + # define VTBL_sigelem &vtbl_sigelem + # define VTBL_pack &vtbl_pack + # define VTBL_packelem &vtbl_packelem + # define VTBL_dbline &vtbl_dbline + # define VTBL_isa &vtbl_isa + # define VTBL_isaelem &vtbl_isaelem + # define VTBL_arylen &vtbl_arylen + # define VTBL_glob &vtbl_glob + # define VTBL_mglob &vtbl_mglob + # define VTBL_nkeys &vtbl_nkeys + # define VTBL_taint &vtbl_taint + # define VTBL_substr &vtbl_substr + # define VTBL_vec &vtbl_vec + # define VTBL_pos &vtbl_pos + # define VTBL_bm &vtbl_bm + # define VTBL_fm &vtbl_fm + # define VTBL_uvar &vtbl_uvar + # define VTBL_defelem &vtbl_defelem + # define VTBL_regexp &vtbl_regexp + # ifdef USE_LOCALE_COLLATE + # define VTBL_collxfrm &vtbl_collxfrm + # endif + # ifdef OVERLOAD + # define VTBL_amagic &vtbl_amagic + # define VTBL_amagicelem &vtbl_amagicelem + # endif #endif #ifdef PERL_OBJECT diff -c 'perl5.005_02/XSlock.h' 'perl5.005_03/XSlock.h' Index: ./XSlock.h *** ./XSlock.h Thu Jul 23 22:59:39 1998 --- ./XSlock.h Sun Mar 28 01:57:09 1999 *************** *** 13,35 **** }; XSLockManager g_XSLock; class XSLock { public: ! XSLock() { g_XSLock.Enter(); }; ~XSLock() { g_XSLock.Leave(); }; }; ! CPerlObj* pPerl; ! #undef dXSARGS #define dXSARGS \ ! dSP; dMARK; \ ! I32 ax = mark - PL_stack_base + 1; \ ! I32 items = sp - mark; \ ! XSLock localLock; \ ! ::pPerl = pPerl ! #endif --- 13,38 ---- }; XSLockManager g_XSLock; + CPerlObj* pPerl; class XSLock { public: ! XSLock(CPerlObj *p) { ! g_XSLock.Enter(); ! ::pPerl = p; ! }; ~XSLock() { g_XSLock.Leave(); }; }; ! /* PERL_CAPI does its own locking in xs_handler() */ ! #if defined(PERL_OBJECT) && !defined(PERL_CAPI) #undef dXSARGS #define dXSARGS \ ! XSLock localLock(pPerl); \ ! dSP; dMARK; \ ! I32 ax = mark - PL_stack_base + 1; \ ! I32 items = sp - mark ! #endif /* PERL_OBJECT && !PERL_CAPI */ #endif diff -c /dev/null 'perl5.005_03/apollo/netinet/in.h' Index: apollo/netinet/in.h *** apollo/netinet/in.h Wed Dec 31 18:00:00 1969 --- apollo/netinet/in.h Wed Mar 17 18:05:56 1999 *************** *** 0 **** --- 1,8 ---- + /* Apollo's isn't protected against multiple inclusion. */ + + #ifndef _NETINET_IN_INCLUDED + #define _NETINET_IN_INCLUDED + + #include "/bsd4.3/usr/include/netinet/in.h" + + #endif /* _NETINET_IN_INCLUDED */ diff -c 'perl5.005_02/av.c' 'perl5.005_03/av.c' Index: ./av.c *** ./av.c Thu Jul 23 22:59:39 1998 --- ./av.c Sat Mar 27 11:57:31 1999 *************** *** 1,6 **** /* av.c * ! * Copyright (c) 1991-1997, Larry Wall * * You may distribute under the terms of either the GNU General Public * License or the Artistic License, as specified in the README file. --- 1,6 ---- /* av.c * ! * Copyright (c) 1991-1999, Larry Wall * * You may distribute under the terms of either the GNU General Public * License or the Artistic License, as specified in the README file. *************** *** 24,30 **** if (AvREAL(av)) return; #ifdef DEBUGGING ! if (SvRMAGICAL(av) && mg_find((SV*)av,'P')) warn("av_reify called on tied array"); #endif key = AvMAX(av) + 1; --- 24,30 ---- if (AvREAL(av)) return; #ifdef DEBUGGING ! if (SvTIED_mg((SV*)av, 'P')) warn("av_reify called on tied array"); #endif key = AvMAX(av) + 1; *************** *** 41,46 **** --- 41,47 ---- key = AvARRAY(av) - AvALLOC(av); while (key) AvALLOC(av)[--key] = &PL_sv_undef; + AvREIFY_off(av); AvREAL_on(av); } *************** *** 49,62 **** { dTHR; /* only necessary if we have to extend stack */ MAGIC *mg; ! if (SvRMAGICAL(av) && (mg = mg_find((SV*)av,'P'))) { dSP; ENTER; SAVETMPS; PUSHSTACKi(PERLSI_MAGIC); PUSHMARK(SP); EXTEND(SP,2); ! PUSHs(mg->mg_obj); PUSHs(sv_2mortal(newSViv(key+1))); PUTBACK; perl_call_method("EXTEND", G_SCALAR|G_DISCARD); --- 50,63 ---- { dTHR; /* only necessary if we have to extend stack */ MAGIC *mg; ! if (mg = SvTIED_mg((SV*)av, 'P')) { dSP; ENTER; SAVETMPS; PUSHSTACKi(PERLSI_MAGIC); PUSHMARK(SP); EXTEND(SP,2); ! PUSHs(SvTIED_obj((SV*)av, mg)); PUSHs(sv_2mortal(newSViv(key+1))); PUTBACK; perl_call_method("EXTEND", G_SCALAR|G_DISCARD); *************** *** 174,183 **** if (key > AvFILLp(av)) { if (!lval) return 0; ! if (AvREALISH(av)) ! sv = NEWSV(5,0); ! else ! sv = sv_newmortal(); return av_store(av,key,sv); } if (AvARRAY(av)[key] == &PL_sv_undef) { --- 175,181 ---- if (key > AvFILLp(av)) { if (!lval) return 0; ! sv = NEWSV(5,0); return av_store(av,key,sv); } if (AvARRAY(av)[key] == &PL_sv_undef) { *************** *** 370,376 **** /*SUPPRESS 560*/ /* Give any tie a chance to cleanup first */ ! if (SvRMAGICAL(av) && mg_find((SV*)av,'P')) av_fill(av, -1); /* mg_clear() ? */ if (AvREAL(av)) { --- 368,374 ---- /*SUPPRESS 560*/ /* Give any tie a chance to cleanup first */ ! if (SvTIED_mg((SV*)av, 'P')) av_fill(av, -1); /* mg_clear() ? */ if (AvREAL(av)) { *************** *** 397,408 **** if (SvREADONLY(av)) croak(no_modify); ! if (SvRMAGICAL(av) && (mg = mg_find((SV*)av,'P'))) { dSP; PUSHSTACKi(PERLSI_MAGIC); PUSHMARK(SP); EXTEND(SP,2); ! PUSHs(mg->mg_obj); PUSHs(val); PUTBACK; ENTER; --- 395,406 ---- if (SvREADONLY(av)) croak(no_modify); ! if (mg = SvTIED_mg((SV*)av, 'P')) { dSP; PUSHSTACKi(PERLSI_MAGIC); PUSHMARK(SP); EXTEND(SP,2); ! PUSHs(SvTIED_obj((SV*)av, mg)); PUSHs(val); PUTBACK; ENTER; *************** *** 424,434 **** return &PL_sv_undef; if (SvREADONLY(av)) croak(no_modify); ! if (SvRMAGICAL(av) && (mg = mg_find((SV*)av,'P'))) { dSP; PUSHSTACKi(PERLSI_MAGIC); PUSHMARK(SP); ! XPUSHs(mg->mg_obj); PUTBACK; ENTER; if (perl_call_method("POP", G_SCALAR)) { --- 422,432 ---- return &PL_sv_undef; if (SvREADONLY(av)) croak(no_modify); ! if (mg = SvTIED_mg((SV*)av, 'P')) { dSP; PUSHSTACKi(PERLSI_MAGIC); PUSHMARK(SP); ! XPUSHs(SvTIED_obj((SV*)av, mg)); PUTBACK; ENTER; if (perl_call_method("POP", G_SCALAR)) { *************** *** 459,470 **** if (SvREADONLY(av)) croak(no_modify); ! if (SvRMAGICAL(av) && (mg = mg_find((SV*)av,'P'))) { dSP; PUSHSTACKi(PERLSI_MAGIC); PUSHMARK(SP); EXTEND(SP,1+num); ! PUSHs(mg->mg_obj); while (num-- > 0) { PUSHs(&PL_sv_undef); } --- 457,468 ---- if (SvREADONLY(av)) croak(no_modify); ! if (mg = SvTIED_mg((SV*)av, 'P')) { dSP; PUSHSTACKi(PERLSI_MAGIC); PUSHMARK(SP); EXTEND(SP,1+num); ! PUSHs(SvTIED_obj((SV*)av, mg)); while (num-- > 0) { PUSHs(&PL_sv_undef); } *************** *** 510,520 **** return &PL_sv_undef; if (SvREADONLY(av)) croak(no_modify); ! if (SvRMAGICAL(av) && (mg = mg_find((SV*)av,'P'))) { dSP; PUSHSTACKi(PERLSI_MAGIC); PUSHMARK(SP); ! XPUSHs(mg->mg_obj); PUTBACK; ENTER; if (perl_call_method("SHIFT", G_SCALAR)) { --- 508,518 ---- return &PL_sv_undef; if (SvREADONLY(av)) croak(no_modify); ! if (mg = SvTIED_mg((SV*)av, 'P')) { dSP; PUSHSTACKi(PERLSI_MAGIC); PUSHMARK(SP); ! XPUSHs(SvTIED_obj((SV*)av, mg)); PUTBACK; ENTER; if (perl_call_method("SHIFT", G_SCALAR)) { *************** *** 551,564 **** croak("panic: null array"); if (fill < 0) fill = -1; ! if (SvRMAGICAL(av) && (mg = mg_find((SV*)av,'P'))) { dSP; ENTER; SAVETMPS; PUSHSTACKi(PERLSI_MAGIC); PUSHMARK(SP); EXTEND(SP,2); ! PUSHs(mg->mg_obj); PUSHs(sv_2mortal(newSViv(fill+1))); PUTBACK; perl_call_method("STORESIZE", G_SCALAR|G_DISCARD); --- 549,562 ---- croak("panic: null array"); if (fill < 0) fill = -1; ! if (mg = SvTIED_mg((SV*)av, 'P')) { dSP; ENTER; SAVETMPS; PUSHSTACKi(PERLSI_MAGIC); PUSHMARK(SP); EXTEND(SP,2); ! PUSHs(SvTIED_obj((SV*)av, mg)); PUSHs(sv_2mortal(newSViv(fill+1))); PUTBACK; perl_call_method("STORESIZE", G_SCALAR|G_DISCARD); diff -c 'perl5.005_02/av.h' 'perl5.005_03/av.h' Index: ./av.h *** ./av.h Thu Jul 23 22:59:39 1998 --- ./av.h Sat Mar 27 11:47:28 1999 *************** *** 1,6 **** /* av.h * ! * Copyright (c) 1991-1998, Larry Wall * * You may distribute under the terms of either the GNU General Public * License or the Artistic License, as specified in the README file. --- 1,6 ---- /* av.h * ! * Copyright (c) 1991-1999, Larry Wall * * You may distribute under the terms of either the GNU General Public * License or the Artistic License, as specified in the README file. diff -c 'perl5.005_02/bytecode.h' 'perl5.005_03/bytecode.h' Index: ./bytecode.h *** ./bytecode.h Thu Jul 23 22:59:39 1998 --- ./bytecode.h Wed Mar 3 20:35:30 1999 *************** *** 64,70 **** BGET_U32(hi); \ BGET_U32(lo); \ if (sizeof(IV) == 8) \ ! arg = (IV) (hi << (sizeof(IV)*4) | lo); \ else if (((I32)hi == -1 && (I32)lo < 0) \ || ((I32)hi == 0 && (I32)lo >= 0)) { \ arg = (I32)lo; \ --- 64,70 ---- BGET_U32(hi); \ BGET_U32(lo); \ if (sizeof(IV) == 8) \ ! arg = ((IV)hi << (sizeof(IV)*4) | lo); \ else if (((I32)hi == -1 && (I32)lo < 0) \ || ((I32)hi == 0 && (I32)lo >= 0)) { \ arg = (I32)lo; \ diff -c 'perl5.005_02/cc_runtime.h' 'perl5.005_03/cc_runtime.h' Index: ./cc_runtime.h *** ./cc_runtime.h Thu Jul 23 22:59:40 1998 --- ./cc_runtime.h Fri Oct 30 21:55:12 1998 *************** *** 45,51 **** case 0: \ PL_op = ppaddr(ARGS); \ PL_retstack[PL_retstack_ix - 1] = Nullop; \ ! if (PL_op != nxt) runops(); \ JMPENV_POP; \ break; \ case 1: JMPENV_POP; JMPENV_JUMP(1); \ --- 45,51 ---- case 0: \ PL_op = ppaddr(ARGS); \ PL_retstack[PL_retstack_ix - 1] = Nullop; \ ! if (PL_op != nxt) CALLRUNOPS(); \ JMPENV_POP; \ break; \ case 1: JMPENV_POP; JMPENV_JUMP(1); \ diff -c 'perl5.005_02/config_h.SH' 'perl5.005_03/config_h.SH' Index: ./config_h.SH Prereq: 3.0.1.5 *** ./config_h.SH Thu Jul 23 22:59:41 1998 --- ./config_h.SH Wed Mar 3 20:35:32 1999 *************** *** 239,244 **** --- 239,292 ---- */ #$d_fsetpos HAS_FSETPOS /**/ + /* I_SYS_MOUNT: + * This symbol, if defined, indicates to the C program that it should + * include . + */ + #$i_sysmount I_SYS_MOUNT /**/ + + /* HAS_FSTATFS: + * This symbol, if defined, indicates that the fstatfs routine is + * available to stat the filesystem of a file descriptor. + */ + #$d_fstatfs HAS_FSTATFS /**/ + + /* HAS_STRUCT_STATFS_FLAGS: + * This symbol, if defined, indicates that the struct statfs has + * the f_flags member for mount flags. + */ + #$d_statfsflags HAS_STRUCT_STATFS_FLAGS /**/ + + /* I_SYS_STATVFS: + * This symbol, if defined, indicates to the C program that it should + * include . + */ + #$i_sysstatvfs I_SYS_STATVFS /**/ + + /* HAS_FSTATVFS: + * This symbol, if defined, indicates that the fstatvfs routine is + * available to stat the filesystem of a file descriptor. + */ + #$d_fstatvfs HAS_FSTATVFS /**/ + + /* I_MNTENT: + * This symbol, if defined, indicates to the C program that it should + * include . + */ + #$i_mntent I_MNTENT /**/ + + /* HAS_GETMNTENT: + * This symbol, if defined, indicates that the getmntent routine is + * available to lookup mount entries in some data base or other. + */ + #$d_getmntent HAS_GETMNTENT /**/ + + /* HAS_HASMNTOPT: + * This symbol, if defined, indicates that the hasmntopt routine is + * available to query mount entries returned by getmntent. + */ + #$d_hasmntopt HAS_HASMNTOPT /**/ + /* HAS_GETTIMEOFDAY: * This symbol, if defined, indicates that the gettimeofday() system * call is available for a sub-second accuracy clock. Usually, the file *************** *** 1813,1819 **** * the sig_name list. */ #define SIG_NAME $sig_name_init /**/ ! #define SIG_NUM $sig_num /**/ /* VOIDFLAGS: * This symbol indicates how much support of the void type is given by this --- 1861,1867 ---- * the sig_name list. */ #define SIG_NAME $sig_name_init /**/ ! #define SIG_NUM $sig_num_init /**/ /* VOIDFLAGS: * This symbol indicates how much support of the void type is given by this *************** *** 1902,1907 **** --- 1950,1964 ---- #define PRIVLIB "$privlib" /**/ #define PRIVLIB_EXP "$privlibexp" /**/ + /* SELECT_MIN_BITS: + * This symbol holds the minimum number of bits operated by select. + * That is, if you do select(n, ...), how many bits at least will be + * cleared in the masks if some activity is detected. Usually this + * is either n or 32*ceil(n/32), especially many little-endians do + * the latter. This is only useful if you have select(), naturally. + */ + #define SELECT_MIN_BITS $selectminbits /**/ + /* SITEARCH: * This symbol contains the name of the private library for this package. * The library is private in the sense that it needn't be in anyone's *************** *** 2016,2021 **** --- 2073,2090 ---- * instance. */ #define ARCHNAME "$archname" /**/ + + /* I_MACH_CTHREADS: + * This symbol, if defined, indicates to the C program that it should + * include . + */ + #$i_machcthreads I_MACH_CTHREADS /**/ + + /* I_PTHREAD: + * This symbol, if defined, indicates to the C program that it should + * include . + */ + #$i_pthread I_PTHREAD /**/ /* HAS_PTHREAD_YIELD: * This symbol, if defined, indicates that the pthread_yield diff -c 'perl5.005_02/configure.com' 'perl5.005_03/configure.com' Index: ./configure.com *** ./configure.com Sun Aug 2 00:07:00 1998 --- ./configure.com Thu Oct 29 08:36:13 1998 *************** *** 974,980 **** $ patchlevel = F$EXTRACT(18,F$LENGTH(line)-18,line) $ got_patch = "true" $ ENDIF ! $ IF ((F$LOCATE("SUBVERSION",line).NE.F$LENGTH(line)).AND.(.NOT.got_sub)) $ THEN $ line = F$EDIT(line,"COMPRESS, TRIM") $ subversion = F$EXTRACT(18,F$LENGTH(line)-18,line) --- 974,980 ---- $ patchlevel = F$EXTRACT(18,F$LENGTH(line)-18,line) $ got_patch = "true" $ ENDIF ! $ IF ((F$LOCATE("#define SUBVERSION",line).NE.F$LENGTH(line)).AND.(.NOT.got_sub)) $ THEN $ line = F$EDIT(line,"COMPRESS, TRIM") $ subversion = F$EXTRACT(18,F$LENGTH(line)-18,line) diff -c 'perl5.005_02/cop.h' 'perl5.005_03/cop.h' Index: ./cop.h *** ./cop.h Thu Jul 23 22:59:43 1998 --- ./cop.h Sat Mar 27 11:57:30 1999 *************** *** 1,6 **** /* cop.h * ! * Copyright (c) 1991-1997, Larry Wall * * You may distribute under the terms of either the GNU General Public * License or the Artistic License, as specified in the README file. --- 1,6 ---- /* cop.h * ! * Copyright (c) 1991-1999, Larry Wall * * You may distribute under the terms of either the GNU General Public * License or the Artistic License, as specified in the README file. *************** *** 142,148 **** #define POPLOOP2() \ SvREFCNT_dec(cxloop.iterlval); \ if (cxloop.itervar) { \ ! SvREFCNT_dec(*cxloop.itervar); \ *cxloop.itervar = cxloop.itersave; \ } \ if (cxloop.iterary && cxloop.iterary != PL_curstack) \ --- 142,148 ---- #define POPLOOP2() \ SvREFCNT_dec(cxloop.iterlval); \ if (cxloop.itervar) { \ ! sv_2mortal(*cxloop.itervar); \ *cxloop.itervar = cxloop.itersave; \ } \ if (cxloop.iterary && cxloop.iterary != PL_curstack) \ *************** *** 180,196 **** cx->cx_type = t, \ cx->blk_oldsp = sp - PL_stack_base, \ cx->blk_oldcop = PL_curcop, \ ! cx->blk_oldmarksp = PL_markstack_ptr - PL_markstack, \ cx->blk_oldscopesp = PL_scopestack_ix, \ ! cx->blk_oldretsp = PL_retstack_ix, \ cx->blk_oldpm = PL_curpm, \ cx->blk_gimme = gimme; \ DEBUG_l( PerlIO_printf(PerlIO_stderr(), "Entering block %ld, type %s\n", \ ! (long)cxstack_ix, block_type[t]); ) /* Exit a block (RETURN and LAST). */ #define POPBLOCK(cx,pm) cx = &cxstack[cxstack_ix--], \ ! newsp = PL_stack_base + cx->blk_oldsp, \ PL_curcop = cx->blk_oldcop, \ PL_markstack_ptr = PL_markstack + cx->blk_oldmarksp, \ PL_scopestack_ix = cx->blk_oldscopesp, \ --- 180,196 ---- cx->cx_type = t, \ cx->blk_oldsp = sp - PL_stack_base, \ cx->blk_oldcop = PL_curcop, \ ! cx->blk_oldmarksp = PL_markstack_ptr - PL_markstack, \ cx->blk_oldscopesp = PL_scopestack_ix, \ ! cx->blk_oldretsp = PL_retstack_ix, \ cx->blk_oldpm = PL_curpm, \ cx->blk_gimme = gimme; \ DEBUG_l( PerlIO_printf(PerlIO_stderr(), "Entering block %ld, type %s\n", \ ! (long)cxstack_ix, block_type[CxTYPE(cx)]); ) /* Exit a block (RETURN and LAST). */ #define POPBLOCK(cx,pm) cx = &cxstack[cxstack_ix--], \ ! newsp = PL_stack_base + cx->blk_oldsp, \ PL_curcop = cx->blk_oldcop, \ PL_markstack_ptr = PL_markstack + cx->blk_oldmarksp, \ PL_scopestack_ix = cx->blk_oldscopesp, \ *************** *** 198,211 **** pm = cx->blk_oldpm, \ gimme = cx->blk_gimme; \ DEBUG_l( PerlIO_printf(PerlIO_stderr(), "Leaving block %ld, type %s\n", \ ! (long)cxstack_ix+1,block_type[cx->cx_type]); ) /* Continue a block elsewhere (NEXT and REDO). */ #define TOPBLOCK(cx) cx = &cxstack[cxstack_ix], \ ! PL_stack_sp = PL_stack_base + cx->blk_oldsp, \ PL_markstack_ptr = PL_markstack + cx->blk_oldmarksp, \ PL_scopestack_ix = cx->blk_oldscopesp, \ ! PL_retstack_ix = cx->blk_oldretsp /* substitution context */ struct subst { --- 198,212 ---- pm = cx->blk_oldpm, \ gimme = cx->blk_gimme; \ DEBUG_l( PerlIO_printf(PerlIO_stderr(), "Leaving block %ld, type %s\n", \ ! (long)cxstack_ix+1,block_type[CxTYPE(cx)]); ) /* Continue a block elsewhere (NEXT and REDO). */ #define TOPBLOCK(cx) cx = &cxstack[cxstack_ix], \ ! PL_stack_sp = PL_stack_base + cx->blk_oldsp, \ PL_markstack_ptr = PL_markstack + cx->blk_oldmarksp, \ PL_scopestack_ix = cx->blk_oldscopesp, \ ! PL_retstack_ix = cx->blk_oldretsp, \ ! PL_curpm = cx->blk_oldpm /* substitution context */ struct subst { *************** *** 261,278 **** rxres_free(&cx->sb_rxres) struct context { ! I32 cx_type; /* what kind of context this is */ union { struct block cx_blk; struct subst cx_subst; } cx_u; }; #define CXt_NULL 0 #define CXt_SUB 1 #define CXt_EVAL 2 #define CXt_LOOP 3 #define CXt_SUBST 4 #define CXt_BLOCK 5 #define CXINC (cxstack_ix < cxstack_max ? ++cxstack_ix : (cxstack_ix = cxinc())) --- 262,287 ---- rxres_free(&cx->sb_rxres) struct context { ! U32 cx_type; /* what kind of context this is */ union { struct block cx_blk; struct subst cx_subst; } cx_u; }; + + #define CXTYPEMASK 0xff #define CXt_NULL 0 #define CXt_SUB 1 #define CXt_EVAL 2 #define CXt_LOOP 3 #define CXt_SUBST 4 #define CXt_BLOCK 5 + + /* private flags for CXt_EVAL */ + #define CXp_REAL 0x00000100 /* truly eval'', not a lookalike */ + + #define CxTYPE(c) ((c)->cx_type & CXTYPEMASK) + #define CxREALEVAL(c) (((c)->cx_type & (CXt_EVAL|CXp_REAL)) == (CXt_EVAL|CXp_REAL)) #define CXINC (cxstack_ix < cxstack_max ? ++cxstack_ix : (cxstack_ix = cxinc())) diff -c 'perl5.005_02/cv.h' 'perl5.005_03/cv.h' Index: ./cv.h *** ./cv.h Thu Jul 23 22:59:43 1998 --- ./cv.h Sat Mar 27 11:57:28 1999 *************** *** 1,6 **** /* cv.h * ! * Copyright (c) 1991-1997, Larry Wall * * You may distribute under the terms of either the GNU General Public * License or the Artistic License, as specified in the README file. --- 1,6 ---- /* cv.h * ! * Copyright (c) 1991-1999, Larry Wall * * You may distribute under the terms of either the GNU General Public * License or the Artistic License, as specified in the README file. *************** *** 94,96 **** --- 94,105 ---- #define CvLOCKED(cv) (CvFLAGS(cv) & CVf_LOCKED) #define CvLOCKED_on(cv) (CvFLAGS(cv) |= CVf_LOCKED) #define CvLOCKED_off(cv) (CvFLAGS(cv) &= ~CVf_LOCKED) + + #define CvEVAL(cv) (CvUNIQUE(cv) && !SvFAKE(cv)) + #define CvEVAL_on(cv) (CvUNIQUE_on(cv),SvFAKE_off(cv)) + #define CvEVAL_off(cv) CvUNIQUE_off(cv) + + /* BEGIN|INIT|END */ + #define CvSPECIAL(cv) (CvUNIQUE(cv) && SvFAKE(cv)) + #define CvSPECIAL_on(cv) (CvUNIQUE_on(cv),SvFAKE_on(cv)) + #define CvSPECIAL_off(cv) (CvUNIQUE_off(cv),SvFAKE_off(cv)) diff -c 'perl5.005_02/deb.c' 'perl5.005_03/deb.c' Index: ./deb.c *** ./deb.c Thu Jul 23 22:59:44 1998 --- ./deb.c Sat Mar 27 11:57:26 1999 *************** *** 1,6 **** /* deb.c * ! * Copyright (c) 1991-1997, Larry Wall * * You may distribute under the terms of either the GNU General Public * License or the Artistic License, as specified in the README file. --- 1,6 ---- /* deb.c * ! * Copyright (c) 1991-1999, Larry Wall * * You may distribute under the terms of either the GNU General Public * License or the Artistic License, as specified in the README file. diff -c 'perl5.005_02/djgpp/config.over' 'perl5.005_03/djgpp/config.over' Index: ./djgpp/config.over *** ./djgpp/config.over Thu Jul 23 22:59:44 1998 --- ./djgpp/config.over Sat Jan 16 10:29:13 1999 *************** *** 15,21 **** -e 's/fcntl/Fcntl/'\ -e 's/gdbm_fil/GDBM_File/'\ -e 's/io/IO/'\ ! -e 's=ipc/sysv=IPC/SysV='\ -e 's/ndbm_fil/NDBM_File/'\ -e 's/odbm_fil/ODBM_File/'\ -e 's/opcode/Opcode/'\ --- 15,24 ---- -e 's/fcntl/Fcntl/'\ -e 's/gdbm_fil/GDBM_File/'\ -e 's/io/IO/'\ ! -e 's/SysV//'\ ! -e 's/sysv//'\ ! -e 's=ipc/=='\ ! -e 's=IPC/=='\ -e 's/ndbm_fil/NDBM_File/'\ -e 's/odbm_fil/ODBM_File/'\ -e 's/opcode/Opcode/'\ *************** *** 31,33 **** --- 34,39 ---- # I use Dos::UseLFN in AutoSplit.pm to override this under win0.95 d_flexfnam='undef' + + # under W95 + bash the test program returns bogus result + d_casti32='undef' diff -c 'perl5.005_02/djgpp/djgpp.c' 'perl5.005_03/djgpp/djgpp.c' Index: ./djgpp/djgpp.c *** ./djgpp/djgpp.c Thu Jul 23 22:59:44 1998 --- ./djgpp/djgpp.c Sat Jan 16 10:29:13 1999 *************** *** 133,139 **** { dTHR; int rc; ! char **a,*tmps,**argv; if (sp<=mark) return -1; --- 133,140 ---- { dTHR; int rc; ! char **a,*tmps,**argv; ! STRLEN n_a; if (sp<=mark) return -1; *************** *** 141,147 **** while (++mark <= sp) if (*mark) ! *a++ = SvPVx(*mark, PL_na); else *a++ = ""; *a = Nullch; --- 142,148 ---- while (++mark <= sp) if (*mark) ! *a++ = SvPVx(*mark, n_a); else *a++ = ""; *a = Nullch; *************** *** 152,158 **** ) /* will swawnvp use PATH? */ TAINT_ENV(); /* testing IFS here is overkill, probably */ ! if (really && *(tmps = SvPV(really, PL_na))) rc=spawnvp (P_WAIT,tmps,argv); else rc=spawnvp (P_WAIT,argv[0],argv); --- 153,159 ---- ) /* will swawnvp use PATH? */ TAINT_ENV(); /* testing IFS here is overkill, probably */ ! if (really && *(tmps = SvPV(really, n_a))) rc=spawnvp (P_WAIT,tmps,argv); else rc=spawnvp (P_WAIT,argv[0],argv); *************** *** 250,255 **** --- 251,257 ---- int fd; char *matches; size_t size; + fpos_t pos; }; #define MAXOPENGLOBS 10 *************** *** 284,289 **** --- 286,292 ---- if ((gi=searchfd (-1)) == NULL) break; + gi->pos=0; pattern=alloca (strlen (name+=13)+1); strcpy (pattern,name); if (!_USE_LFN) *************** *** 330,340 **** if ((gi=searchfd (fd))==NULL) break; ! ic=tell (fd); ! if (siz+ic>=gi->size) ! siz=gi->size-ic; ! memcpy (buf,ic+gi->matches,siz); ! lseek (fd,siz,1); *rv=siz; return 1; } --- 333,342 ---- if ((gi=searchfd (fd))==NULL) break; ! if (siz+gi->pos>gi->size) ! siz=gi->size-gi->pos; ! memcpy (buf,gi->pos+gi->matches,siz); ! gi->pos+=siz; *rv=siz; return 1; } diff -c 'perl5.005_02/doio.c' 'perl5.005_03/doio.c' Index: ./doio.c *** ./doio.c Sun Aug 2 00:15:06 1998 --- ./doio.c Sat Mar 27 11:57:24 1999 *************** *** 1,6 **** /* doio.c * ! * Copyright (c) 1991-1997, Larry Wall * * You may distribute under the terms of either the GNU General Public * License or the Artistic License, as specified in the README file. --- 1,6 ---- /* doio.c * ! * Copyright (c) 1991-1999, Larry Wall * * You may distribute under the terms of either the GNU General Public * License or the Artistic License, as specified in the README file. *************** *** 18,30 **** #include "perl.h" #if defined(HAS_MSG) || defined(HAS_SEM) || defined(HAS_SHM) #include #ifdef HAS_MSG #include #endif - #ifdef HAS_SEM - #include - #endif #ifdef HAS_SHM #include # ifndef HAS_SHMAT_PROTOTYPE --- 18,29 ---- #include "perl.h" #if defined(HAS_MSG) || defined(HAS_SEM) || defined(HAS_SHM) + #ifndef HAS_SEM #include + #endif #ifdef HAS_MSG #include #endif #ifdef HAS_SHM #include # ifndef HAS_SHMAT_PROTOTYPE *************** *** 359,366 **** PerlIO_clearerr(fp); } #if defined(HAS_FCNTL) && defined(F_SETFD) ! fd = PerlIO_fileno(fp); ! fcntl(fd,F_SETFD,fd > PL_maxsysfd); #endif IoIFP(io) = fp; if (writing) { --- 358,369 ---- PerlIO_clearerr(fp); } #if defined(HAS_FCNTL) && defined(F_SETFD) ! { ! int save_errno = errno; ! fd = PerlIO_fileno(fp); ! fcntl(fd,F_SETFD,fd > PL_maxsysfd); /* can change errno */ ! errno = save_errno; ! } #endif IoIFP(io) = fp; if (writing) { *************** *** 545,551 **** } else PerlIO_printf(PerlIO_stderr(), "Can't open %s: %s\n", ! SvPV(sv, PL_na), Strerror(errno)); } if (PL_inplace) { (void)do_close(PL_argvoutgv,FALSE); --- 548,554 ---- } else PerlIO_printf(PerlIO_stderr(), "Can't open %s: %s\n", ! SvPV(sv, oldlen), Strerror(errno)); } if (PL_inplace) { (void)do_close(PL_argvoutgv,FALSE); *************** *** 759,765 **** if (flag != TRUE) croak("panic: unsetting binmode"); /* Not implemented yet */ #ifdef DOSISH ! #ifdef atarist if (!PerlIO_flush(fp) && (fp->_flag |= _IOBIN)) return 1; else --- 762,768 ---- if (flag != TRUE) croak("panic: unsetting binmode"); /* Not implemented yet */ #ifdef DOSISH ! #if defined(atarist) || defined(__MINT__) if (!PerlIO_flush(fp) && (fp->_flag |= _IOBIN)) return 1; else *************** *** 920,925 **** --- 923,929 ---- else { SV* sv = POPs; char *s; + STRLEN n_a; PUTBACK; if (SvTYPE(sv) == SVt_PVGV) { tmpgv = (GV*)sv; *************** *** 930,936 **** goto do_fstat; } ! s = SvPV(sv, PL_na); PL_statgv = Nullgv; sv_setpv(PL_statname, s); PL_laststype = OP_STAT; --- 934,940 ---- goto do_fstat; } ! s = SvPV(sv, n_a); PL_statgv = Nullgv; sv_setpv(PL_statname, s); PL_laststype = OP_STAT; *************** *** 946,951 **** --- 950,956 ---- { djSP; SV *sv; + STRLEN n_a; if (PL_op->op_flags & OPf_REF) { EXTEND(SP,1); if (cGVOP->op_gv == PL_defgv) { *************** *** 960,972 **** PL_statgv = Nullgv; sv = POPs; PUTBACK; ! sv_setpv(PL_statname,SvPV(sv, PL_na)); #ifdef HAS_LSTAT ! PL_laststatval = PerlLIO_lstat(SvPV(sv, PL_na),&PL_statcache); #else ! PL_laststatval = PerlLIO_stat(SvPV(sv, PL_na),&PL_statcache); #endif ! if (PL_laststatval < 0 && PL_dowarn && strchr(SvPV(sv, PL_na), '\n')) warn(warn_nl, "lstat"); return PL_laststatval; } --- 965,977 ---- PL_statgv = Nullgv; sv = POPs; PUTBACK; ! sv_setpv(PL_statname,SvPV(sv, n_a)); #ifdef HAS_LSTAT ! PL_laststatval = PerlLIO_lstat(SvPV(sv, n_a),&PL_statcache); #else ! PL_laststatval = PerlLIO_stat(SvPV(sv, n_a),&PL_statcache); #endif ! if (PL_laststatval < 0 && PL_dowarn && strchr(SvPV(sv, n_a), '\n')) warn(warn_nl, "lstat"); return PL_laststatval; } *************** *** 976,981 **** --- 981,987 ---- { register char **a; char *tmps; + STRLEN n_a; if (sp > mark) { dTHR; *************** *** 983,996 **** a = PL_Argv; while (++mark <= sp) { if (*mark) ! *a++ = SvPVx(*mark, PL_na); else *a++ = ""; } *a = Nullch; if (*PL_Argv[0] != '/') /* will execvp use PATH? */ TAINT_ENV(); /* testing IFS here is overkill, probably */ ! if (really && *(tmps = SvPV(really, PL_na))) PerlProc_execvp(tmps,PL_Argv); else PerlProc_execvp(PL_Argv[0],PL_Argv); --- 989,1002 ---- a = PL_Argv; while (++mark <= sp) { if (*mark) ! *a++ = SvPVx(*mark, n_a); else *a++ = ""; } *a = Nullch; if (*PL_Argv[0] != '/') /* will execvp use PATH? */ TAINT_ENV(); /* testing IFS here is overkill, probably */ ! if (really && *(tmps = SvPV(really, n_a))) PerlProc_execvp(tmps,PL_Argv); else PerlProc_execvp(PL_Argv[0],PL_Argv); *************** *** 1116,1125 **** char *what; char *s; SV **oldmark = mark; #define APPLY_TAINT_PROPER() \ STMT_START { \ ! if (PL_tainting && PL_tainted) { goto taint_proper_label; } \ } STMT_END /* This is a first heuristic; it doesn't catch tainting magic. */ --- 1122,1132 ---- char *what; char *s; SV **oldmark = mark; + STRLEN n_a; #define APPLY_TAINT_PROPER() \ STMT_START { \ ! if (PL_tainted) { TAINT_PROPER(what); } \ } STMT_END /* This is a first heuristic; it doesn't catch tainting magic. */ *************** *** 1141,1147 **** APPLY_TAINT_PROPER(); tot = sp - mark; while (++mark <= sp) { ! char *name = SvPVx(*mark, PL_na); APPLY_TAINT_PROPER(); if (PerlLIO_chmod(name, val)) tot--; --- 1148,1154 ---- APPLY_TAINT_PROPER(); tot = sp - mark; while (++mark <= sp) { ! char *name = SvPVx(*mark, n_a); APPLY_TAINT_PROPER(); if (PerlLIO_chmod(name, val)) tot--; *************** *** 1158,1164 **** APPLY_TAINT_PROPER(); tot = sp - mark; while (++mark <= sp) { ! char *name = SvPVx(*mark, PL_na); APPLY_TAINT_PROPER(); if (PerlLIO_chown(name, val, val2)) tot--; --- 1165,1171 ---- APPLY_TAINT_PROPER(); tot = sp - mark; while (++mark <= sp) { ! char *name = SvPVx(*mark, n_a); APPLY_TAINT_PROPER(); if (PerlLIO_chown(name, val, val2)) tot--; *************** *** 1178,1184 **** APPLY_TAINT_PROPER(); if (mark == sp) break; ! s = SvPVx(*++mark, PL_na); if (isUPPER(*s)) { if (*s == 'S' && s[1] == 'I' && s[2] == 'G') s += 3; --- 1185,1191 ---- APPLY_TAINT_PROPER(); if (mark == sp) break; ! s = SvPVx(*++mark, n_a); if (isUPPER(*s)) { if (*s == 'S' && s[1] == 'I' && s[2] == 'G') s += 3; *************** *** 1248,1254 **** APPLY_TAINT_PROPER(); tot = sp - mark; while (++mark <= sp) { ! s = SvPVx(*mark, PL_na); APPLY_TAINT_PROPER(); if (PL_euid || PL_unsafe) { if (UNLINK(s)) --- 1255,1261 ---- APPLY_TAINT_PROPER(); tot = sp - mark; while (++mark <= sp) { ! s = SvPVx(*mark, n_a); APPLY_TAINT_PROPER(); if (PL_euid || PL_unsafe) { if (UNLINK(s)) *************** *** 1277,1299 **** struct utimbuf utbuf; #else struct { ! long actime; ! long modtime; } utbuf; #endif Zero(&utbuf, sizeof utbuf, char); #ifdef BIG_TIME ! utbuf.actime = (Time_t)SvNVx(*++mark); /* time accessed */ ! utbuf.modtime = (Time_t)SvNVx(*++mark); /* time modified */ #else ! utbuf.actime = SvIVx(*++mark); /* time accessed */ ! utbuf.modtime = SvIVx(*++mark); /* time modified */ #endif APPLY_TAINT_PROPER(); tot = sp - mark; while (++mark <= sp) { ! char *name = SvPVx(*mark, PL_na); APPLY_TAINT_PROPER(); if (PerlLIO_utime(name, &utbuf)) tot--; --- 1284,1306 ---- struct utimbuf utbuf; #else struct { ! Time_t actime; ! Time_t modtime; } utbuf; #endif Zero(&utbuf, sizeof utbuf, char); #ifdef BIG_TIME ! utbuf.actime = (Time_t)SvNVx(*++mark); /* time accessed */ ! utbuf.modtime = (Time_t)SvNVx(*++mark); /* time modified */ #else ! utbuf.actime = (Time_t)SvIVx(*++mark); /* time accessed */ ! utbuf.modtime = (Time_t)SvIVx(*++mark); /* time modified */ #endif APPLY_TAINT_PROPER(); tot = sp - mark; while (++mark <= sp) { ! char *name = SvPVx(*mark, n_a); APPLY_TAINT_PROPER(); if (PerlLIO_utime(name, &utbuf)) tot--; *************** *** 1305,1314 **** #endif } return tot; - - taint_proper_label: - TAINT_PROPER(what); - return 0; /* this should never happen */ #undef APPLY_TAINT_PROPER } --- 1312,1317 ---- diff -c 'perl5.005_02/doop.c' 'perl5.005_03/doop.c' Index: ./doop.c *** ./doop.c Thu Jul 23 22:59:45 1998 --- ./doop.c Sat Mar 27 11:57:19 1999 *************** *** 1,6 **** /* doop.c * ! * Copyright (c) 1991-1997, Larry Wall * * You may distribute under the terms of either the GNU General Public * License or the Artistic License, as specified in the README file. --- 1,6 ---- /* doop.c * ! * Copyright (c) 1991-1999, Larry Wall * * You may distribute under the terms of either the GNU General Public * License or the Artistic License, as specified in the README file. *************** *** 352,358 **** len = leftlen < rightlen ? leftlen : rightlen; lensave = len; if (SvOK(sv) || SvTYPE(sv) > SVt_PVMG) { ! dc = SvPV_force(sv, PL_na); if (SvCUR(sv) < len) { dc = SvGROW(sv, len + 1); (void)memzero(dc + SvCUR(sv), len - SvCUR(sv) + 1); --- 352,359 ---- len = leftlen < rightlen ? leftlen : rightlen; lensave = len; if (SvOK(sv) || SvTYPE(sv) > SVt_PVMG) { ! STRLEN n_a; ! dc = SvPV_force(sv, n_a); if (SvCUR(sv) < len) { dc = SvGROW(sv, len + 1); (void)memzero(dc + SvCUR(sv), len - SvCUR(sv) + 1); *************** *** 491,497 **** RETURN; } ! if (!SvRMAGICAL(keys) || !mg_find((SV*)keys,'P')) i = HvKEYS(keys); else { i = 0; --- 492,498 ---- RETURN; } ! if (! SvTIED_mg((SV*)keys, 'P')) i = HvKEYS(keys); else { i = 0; diff -c 'perl5.005_02/dump.c' 'perl5.005_03/dump.c' Index: ./dump.c *** ./dump.c Thu Jul 23 22:59:45 1998 --- ./dump.c Sat Mar 27 11:57:17 1999 *************** *** 1,6 **** /* dump.c * ! * Copyright (c) 1991-1997, Larry Wall * * You may distribute under the terms of either the GNU General Public * License or the Artistic License, as specified in the README file. --- 1,6 ---- /* dump.c * ! * Copyright (c) 1991-1999, Larry Wall * * You may distribute under the terms of either the GNU General Public * License or the Artistic License, as specified in the README file. *************** *** 239,249 **** case OP_GVSV: case OP_GV: if (cGVOPo->op_gv) { SV *tmpsv = NEWSV(0,0); ENTER; SAVEFREESV(tmpsv); gv_fullname3(tmpsv, cGVOPo->op_gv, Nullch); ! dump("GV = %s\n", SvPV(tmpsv, PL_na)); LEAVE; } else --- 239,250 ---- case OP_GVSV: case OP_GV: if (cGVOPo->op_gv) { + STRLEN n_a; SV *tmpsv = NEWSV(0,0); ENTER; SAVEFREESV(tmpsv); gv_fullname3(tmpsv, cGVOPo->op_gv, Nullch); ! dump("GV = %s\n", SvPV(tmpsv, n_a)); LEAVE; } else diff -c 'perl5.005_02/embed.h' 'perl5.005_03/embed.h' Index: ./embed.h *** ./embed.h Tue Aug 4 15:16:27 1998 --- ./embed.h Sat Jan 16 12:13:37 1999 *************** *** 159,164 **** --- 159,165 ---- #define do_trans Perl_do_trans #define do_vecset Perl_do_vecset #define do_vop Perl_do_vop + #define dofile Perl_dofile #define dofindlabel Perl_dofindlabel #define dopoptoeval Perl_dopoptoeval #define dounwind Perl_dounwind *************** *** 204,209 **** --- 205,211 ---- #define get_op_names Perl_get_op_names #define get_opargs Perl_get_opargs #define get_specialsv_list Perl_get_specialsv_list + #define get_vtbl Perl_get_vtbl #define gp_free Perl_gp_free #define gp_ref Perl_gp_ref #define gt_amg Perl_gt_amg *************** *** 859,864 **** --- 861,867 ---- #define save_freeop Perl_save_freeop #define save_freepv Perl_save_freepv #define save_freesv Perl_save_freesv + #define save_generic_svref Perl_save_generic_svref #define save_gp Perl_save_gp #define save_hash Perl_save_hash #define save_helem Perl_save_helem diff -c 'perl5.005_02/embed.pl' 'perl5.005_03/embed.pl' Index: ./embed.pl *** ./embed.pl Thu Jul 23 22:59:54 1998 --- ./embed.pl Wed Nov 4 19:47:31 1998 *************** *** 37,43 **** } readsyms %global, 'global.sym'; - readsyms %interp, 'interp.sym'; sub readvars(\%$$) { my ($syms, $file,$pre) = @_; --- 37,42 ---- *************** *** 63,73 **** foreach my $sym (sort keys %intrp) { - warn "$sym not in interp.sym\n" unless exists $interp{$sym}; if (exists $global{$sym}) { delete $global{$sym}; ! warn "$sym in global.sym as well as interp\n"; } } --- 62,71 ---- foreach my $sym (sort keys %intrp) { if (exists $global{$sym}) { delete $global{$sym}; ! warn "$sym in global.sym as well as intrpvar.h\n"; } } *************** *** 80,98 **** } } - foreach my $sym (keys %interp) - { - warn "extra $sym in interp.sym\n" - unless exists $intrp{$sym} || exists $thread{$sym}; - } - foreach my $sym (sort keys %thread) { ! warn "$sym in intrpvar.h\n" if exists $intrp{$sym}; if (exists $global{$sym}) { delete $global{$sym}; ! warn "$sym in global.sym as well as thread\n"; } } --- 78,90 ---- } } foreach my $sym (sort keys %thread) { ! warn "$sym in intrpvar.h as well as thrdvar.h\n" if exists $intrp{$sym}; if (exists $global{$sym}) { delete $global{$sym}; ! warn "$sym in global.sym as well as thrdvar.h\n"; } } diff -c 'perl5.005_02/embedvar.h' 'perl5.005_03/embedvar.h' Index: ./embedvar.h *** ./embedvar.h Tue Aug 4 15:19:02 1998 --- ./embedvar.h Tue Jan 5 21:02:41 1999 *************** *** 250,255 **** --- 250,256 ---- #define PL_stdingv (PL_curinterp->Istdingv) #define PL_strchop (PL_curinterp->Istrchop) #define PL_strtab (PL_curinterp->Istrtab) + #define PL_strtab_mutex (PL_curinterp->Istrtab_mutex) #define PL_sub_generation (PL_curinterp->Isub_generation) #define PL_sublex_info (PL_curinterp->Isublex_info) #define PL_sv_arenaroot (PL_curinterp->Isv_arenaroot) *************** *** 384,389 **** --- 385,391 ---- #define PL_Istdingv PL_stdingv #define PL_Istrchop PL_strchop #define PL_Istrtab PL_strtab + #define PL_Istrtab_mutex PL_strtab_mutex #define PL_Isub_generation PL_sub_generation #define PL_Isublex_info PL_sublex_info #define PL_Isv_arenaroot PL_sv_arenaroot *************** *** 647,652 **** --- 649,655 ---- #define PL_collxfrm_base (PL_Vars.Gcollxfrm_base) #define PL_collxfrm_mult (PL_Vars.Gcollxfrm_mult) #define PL_cop_seqmax (PL_Vars.Gcop_seqmax) + #define PL_cred_mutex (PL_Vars.Gcred_mutex) #define PL_cryptseen (PL_Vars.Gcryptseen) #define PL_cshlen (PL_Vars.Gcshlen) #define PL_cshname (PL_Vars.Gcshname) *************** *** 757,762 **** --- 760,766 ---- #define PL_Gcollxfrm_base PL_collxfrm_base #define PL_Gcollxfrm_mult PL_collxfrm_mult #define PL_Gcop_seqmax PL_cop_seqmax + #define PL_Gcred_mutex PL_cred_mutex #define PL_Gcryptseen PL_cryptseen #define PL_Gcshlen PL_cshlen #define PL_Gcshname PL_cshname diff -c 'perl5.005_02/ext/B/B.pm' 'perl5.005_03/ext/B/B.pm' Index: ./ext/B/B.pm *** ./ext/B/B.pm Thu Jul 23 22:59:55 1998 --- ./ext/B/B.pm Sun Nov 29 19:15:08 1998 *************** *** 13,19 **** class peekop cast_I32 cstring cchar hash threadsv_names main_root main_start main_cv svref_2object walkoptree walkoptree_slow walkoptree_exec walksymtable ! parents comppadlist sv_undef compile_stats timing_info); use strict; @B::SV::ISA = 'B::OBJECT'; --- 13,19 ---- class peekop cast_I32 cstring cchar hash threadsv_names main_root main_start main_cv svref_2object walkoptree walkoptree_slow walkoptree_exec walksymtable ! parents comppadlist sv_undef compile_stats timing_info init_av); use strict; @B::SV::ISA = 'B::OBJECT'; *************** *** 530,535 **** --- 530,537 ---- =item XSUBANY + =item CvFLAGS + =back =head2 B::HV METHODS *************** *** 576,582 **** =item desc ! This returns the op description from the global C op_desc array (e.g. "addition" "array deref"). =item targ --- 578,584 ---- =item desc ! This returns the op description from the global C PL_op_desc array (e.g. "addition" "array deref"). =item targ *************** *** 719,724 **** --- 721,730 ---- Return the (faked) CV corresponding to the main part of the Perl program. + + =item init_av + + Returns the AV object (i.e. in class B::AV) representing INIT blocks. =item main_root diff -c 'perl5.005_02/ext/B/B.xs' 'perl5.005_03/ext/B/B.xs' Index: ./ext/B/B.xs *** ./ext/B/B.xs Thu Jul 23 22:59:55 1998 --- ./ext/B/B.xs Wed Dec 30 22:54:17 1998 *************** *** 267,273 **** cchar(SV *sv) { SV *sstr = newSVpv("'", 0); ! char *s = SvPV(sv, PL_na); if (*s == '\'') sv_catpv(sstr, "\\'"); --- 267,274 ---- cchar(SV *sv) { SV *sstr = newSVpv("'", 0); ! STRLEN n_a; ! char *s = SvPV(sv, n_a); if (*s == '\'') sv_catpv(sstr, "\\'"); *************** *** 437,442 **** --- 438,444 ---- INIT_SPECIALSV_LIST; #define B_main_cv() PL_main_cv + #define B_init_av() PL_initav #define B_main_root() PL_main_root #define B_main_start() PL_main_start #define B_comppadlist() (PL_main_cv ? CvPADLIST(PL_main_cv) : CvPADLIST(PL_compcv)) *************** *** 444,449 **** --- 446,454 ---- #define B_sv_yes() &PL_sv_yes #define B_sv_no() &PL_sv_no + B::AV + B_init_av() + B::CV B_main_cv() *************** *** 1163,1168 **** --- 1168,1180 ---- B::CV cv CODE: ST(0) = sv_2mortal(newSViv(CvXSUBANY(cv).any_iv)); + + MODULE = B PACKAGE = B::CV + + U8 + CvFLAGS(cv) + B::CV cv + MODULE = B PACKAGE = B::HV PREFIX = Hv diff -c 'perl5.005_02/ext/B/B/Assembler.pm' 'perl5.005_03/ext/B/B/Assembler.pm' Index: ./ext/B/B/Assembler.pm *** ./ext/B/B/Assembler.pm Thu Jul 23 22:59:55 1998 --- ./ext/B/B/Assembler.pm Sun Nov 29 19:18:23 1998 *************** *** 53,58 **** --- 53,60 ---- sub B::Asmdata::PUT_U32 { pack("N", $_[0]) } sub B::Asmdata::PUT_I32 { pack("N", $_[0]) } sub B::Asmdata::PUT_objindex { pack("N", $_[0]) } # could allow names here + sub B::Asmdata::PUT_svindex { &B::Asmdata::PUT_objindex } + sub B::Asmdata::PUT_opindex { &B::Asmdata::PUT_objindex } sub B::Asmdata::PUT_strconst { my $arg = shift; *************** *** 78,84 **** error "bad string argument: $arg" unless defined($arg); return pack("N", length($arg)) . $arg; } ! sub B::Asmdata::PUT_comment { my $arg = shift; $arg = uncstring($arg); error "bad string argument: $arg" unless defined($arg); --- 80,86 ---- error "bad string argument: $arg" unless defined($arg); return pack("N", length($arg)) . $arg; } ! sub B::Asmdata::PUT_comment_t { my $arg = shift; $arg = uncstring($arg); error "bad string argument: $arg" unless defined($arg); diff -c 'perl5.005_02/ext/B/B/C.pm' 'perl5.005_03/ext/B/B/C.pm' Index: ./ext/B/B/C.pm *** ./ext/B/B/C.pm Thu Jul 23 22:59:57 1998 --- ./ext/B/B/C.pm Sun Nov 29 19:19:29 1998 *************** *** 13,19 **** use B qw(minus_c sv_undef walkoptree walksymtable main_root main_start peekop class cstring cchar svref_2object compile_stats comppadlist hash ! threadsv_names); use B::Asmdata qw(@specialsv_name); use FileHandle; --- 13,19 ---- use B qw(minus_c sv_undef walkoptree walksymtable main_root main_start peekop class cstring cchar svref_2object compile_stats comppadlist hash ! threadsv_names main_cv init_av); use B::Asmdata qw(@specialsv_name); use FileHandle; *************** *** 44,50 **** $gvopsect, $listopsect, $logopsect, $loopsect, $opsect, $pmopsect, $pvopsect, $svopsect, $unopsect, $svsect, $xpvsect, $xpvavsect, $xpvhvsect, $xpvcvsect, $xpvivsect, $xpvnvsect, $xpvmgsect, $xpvlvsect, ! $xrvsect, $xpvbmsect, $xpviosect); sub walk_and_save_optree; my $saveoptree_callback = \&walk_and_save_optree; --- 44,50 ---- $gvopsect, $listopsect, $logopsect, $loopsect, $opsect, $pmopsect, $pvopsect, $svopsect, $unopsect, $svsect, $xpvsect, $xpvavsect, $xpvhvsect, $xpvcvsect, $xpvivsect, $xpvnvsect, $xpvmgsect, $xpvlvsect, ! $xrvsect, $xpvbmsect, $xpviosect, $bootstrap); sub walk_and_save_optree; my $saveoptree_callback = \&walk_and_save_optree; *************** *** 596,605 **** warn sprintf("No definition for sub %s::%s (unable to autoload)\n", $cvstashname, $cvname); # debug } ! $symsect->add(sprintf("xpvcvix%d\t%s, %u, 0, %d, %s, 0, Nullhv, Nullhv, %s, s\\_%x, $xsub, $xsubany, Nullgv, Nullgv, %d, s\\_%x, (CV*)s\\_%x, 0", $xpvcv_ix, cstring($pv), length($pv), $cv->IVX, $cv->NVX, $startfield, ${$cv->ROOT}, $cv->DEPTH, ! $$padlist, ${$cv->OUTSIDE})); if ($$gv) { $gv->save; $init->add(sprintf("CvGV(s\\_%x) = s\\_%x;",$$cv,$$gv)); --- 596,610 ---- warn sprintf("No definition for sub %s::%s (unable to autoload)\n", $cvstashname, $cvname); # debug } ! $symsect->add(sprintf("xpvcvix%d\t%s, %u, 0, %d, %s, 0, Nullhv, Nullhv, %s, s\\_%x, $xsub, $xsubany, Nullgv, Nullgv, %d, s\\_%x, (CV*)s\\_%x, 0x%x", $xpvcv_ix, cstring($pv), length($pv), $cv->IVX, $cv->NVX, $startfield, ${$cv->ROOT}, $cv->DEPTH, ! $$padlist, ${$cv->OUTSIDE}, $cv->CvFLAGS)); ! ! if (${$cv->OUTSIDE} == ${main_cv()}){ ! $init->add(sprintf("CvOUTSIDE(s\\_%x)=PL_main_cv;",$$cv)); ! } ! if ($$gv) { $gv->save; $init->add(sprintf("CvGV(s\\_%x) = s\\_%x;",$$cv,$$gv)); *************** *** 691,697 **** } my $gvfilegv = $gv->FILEGV; if ($$gvfilegv) { ! $init->add(sprintf("GvFILEGV($sym) = s\\_%x;",$$gvfilegv)); # warn "GV::save GvFILEGV(*$name)\n"; # debug $gvfilegv->save; } --- 696,702 ---- } my $gvfilegv = $gv->FILEGV; if ($$gvfilegv) { ! $init->add(sprintf("GvFILEGV($sym) = (GV*)s\\_%x;",$$gvfilegv)); # warn "GV::save GvFILEGV(*$name)\n"; # debug $gvfilegv->save; } *************** *** 847,852 **** --- 852,858 ---- $cvopsect, $loopsect, $copsect, $svsect, $xpvsect, $xpvavsect, $xpvhvsect, $xpvcvsect, $xpvivsect, $xpvnvsect, $xpvmgsect, $xpvlvsect, $xrvsect, $xpvbmsect, $xpviosect); + $bootstrap->output(\*STDOUT, "/* bootstrap %s */\n"); $symsect->output(\*STDOUT, "#define %s\n"); print "\n"; output_declarations(); *************** *** 1046,1075 **** foreach $sv (@_) { svref_2object($sv)->save; } ! } sub B::GV::savecv { my $gv = shift; my $cv = $gv->CV; my $name = $gv->NAME; ! if ($$cv && !objsym($cv) && !($name eq "bootstrap" && $cv->XSUB)) { if ($debug_cv) { warn sprintf("saving extra CV &%s::%s (0x%x) from GV 0x%x\n", $gv->STASH->NAME, $name, $$cv, $$gv); } $gv->save; } } sub save_unused_subs { my %search_pack; map { $search_pack{$_} = 1 } @_; no strict qw(vars refs); walksymtable(\%{"main::"}, "savecv", sub { my $package = shift; $package =~ s/::$//; #warn "Considering $package\n";#debug return 1 if exists $search_pack{$package}; #warn " (nothing explicit)\n";#debug # Omit the packages which we use (and which cause grief # because of fancy "goto &$AUTOLOAD" stuff). --- 1052,1112 ---- foreach $sv (@_) { svref_2object($sv)->save; } ! } ! ! sub Dummy_BootStrap { } sub B::GV::savecv { my $gv = shift; my $cv = $gv->CV; my $name = $gv->NAME; ! if ($$cv) { ! if ($name eq "bootstrap" && $cv->XSUB) { ! my $file = $cv->FILEGV->SV->PV; ! $bootstrap->add($file); ! my $name = $gv->STASH->NAME.'::'.$name; ! no strict 'refs'; ! *{$name} = \&Dummy_BootStrap; ! $cv = $gv->CV; ! } if ($debug_cv) { warn sprintf("saving extra CV &%s::%s (0x%x) from GV 0x%x\n", $gv->STASH->NAME, $name, $$cv, $$gv); } + my $package=$gv->STASH->NAME; + # This seems to undo all the ->isa and prefix stuff we do below + # so disable again for now + if (0 && ! grep(/^$package$/,@unused_sub_packages)){ + warn sprintf("omitting cv in superclass %s", $gv->STASH->NAME) + if $debug_cv; + return ; + } $gv->save; } + elsif ($name eq 'ISA') + { + $gv->save; + } + } + + sub save_unused_subs { my %search_pack; map { $search_pack{$_} = 1 } @_; + @unused_sub_packages=@_; no strict qw(vars refs); walksymtable(\%{"main::"}, "savecv", sub { my $package = shift; $package =~ s/::$//; + return 0 if ($package =~ /::::/); # skip ::::ISA::CACHE etc. #warn "Considering $package\n";#debug return 1 if exists $search_pack{$package}; + #sub try for a partial match + if (grep(/^$package\:\:/,@unused_sub_packages)){ + return 1; + } #warn " (nothing explicit)\n";#debug # Omit the packages which we use (and which cause grief # because of fancy "goto &$AUTOLOAD" stuff). *************** *** 1079,1088 **** || $package eq "SelectSaver") { return 0; } ! my $m; ! foreach $m (qw(new DESTROY TIESCALAR TIEARRAY TIEHASH)) { if (defined(&{$package."::$m"})) { warn "$package has method $m: -u$package assumed\n";#debug return 1; } } --- 1116,1136 ---- || $package eq "SelectSaver") { return 0; } ! foreach my $u (keys %search_pack) { ! if ($package =~ /^${u}::/) { ! warn "$package starts with $u\n"; ! return 1 ! } ! if ($package->isa($u)) { ! warn "$package isa $u\n"; ! return 1 ! } ! return 1 if $package->isa($u); ! } ! foreach my $m (qw(new DESTROY TIESCALAR TIEARRAY TIEHASH)) { if (defined(&{$package."::$m"})) { warn "$package has method $m: -u$package assumed\n";#debug + push @unused_sub_package, $package; return 1; } } *************** *** 1091,1104 **** } sub save_main { my $curpad_sym = (comppadlist->ARRAY)[1]->save; walkoptree(main_root, "save"); warn "done main optree, walking symtable for extras\n" if $debug_cv; save_unused_subs(@unused_sub_packages); $init->add(sprintf("PL_main_root = s\\_%x;", ${main_root()}), sprintf("PL_main_start = s\\_%x;", ${main_start()}), ! "PL_curpad = AvARRAY($curpad_sym);"); output_boilerplate(); print "\n"; output_all("perl_init"); --- 1139,1163 ---- } sub save_main { + warn "Walking tree\n"; + my $curpad_nam = (comppadlist->ARRAY)[0]->save; my $curpad_sym = (comppadlist->ARRAY)[1]->save; + my $init_av = init_av->save; + my $inc_hv = svref_2object(\%INC)->save; + my $inc_av = svref_2object(\@INC)->save; walkoptree(main_root, "save"); warn "done main optree, walking symtable for extras\n" if $debug_cv; save_unused_subs(@unused_sub_packages); $init->add(sprintf("PL_main_root = s\\_%x;", ${main_root()}), sprintf("PL_main_start = s\\_%x;", ${main_start()}), ! "PL_curpad = AvARRAY($curpad_sym);", ! "PL_initav = $init_av;", ! "GvHV(PL_incgv) = $inc_hv;", ! "GvAV(PL_incgv) = $inc_av;", ! "av_store(CvPADLIST(PL_main_cv),0,SvREFCNT_inc($curpad_nam));", ! "av_store(CvPADLIST(PL_main_cv),1,SvREFCNT_inc($curpad_sym));"); ! warn "Writing output\n"; output_boilerplate(); print "\n"; output_all("perl_init"); *************** *** 1118,1124 **** xpviv => \$xpvivsect, xpvnv => \$xpvnvsect, xpvmg => \$xpvmgsect, xpvlv => \$xpvlvsect, xrv => \$xrvsect, xpvbm => \$xpvbmsect, ! xpvio => \$xpviosect); my ($name, $sectref); while (($name, $sectref) = splice(@sections, 0, 2)) { $$sectref = new B::Section $name, \%symtable, 0; --- 1177,1183 ---- xpviv => \$xpvivsect, xpvnv => \$xpvnvsect, xpvmg => \$xpvmgsect, xpvlv => \$xpvlvsect, xrv => \$xrvsect, xpvbm => \$xpvbmsect, ! xpvio => \$xpviosect, bootstrap => \$bootstrap); my ($name, $sectref); while (($name, $sectref) = splice(@sections, 0, 2)) { $$sectref = new B::Section $name, \%symtable, 0; diff -c 'perl5.005_02/ext/B/B/CC.pm' 'perl5.005_03/ext/B/B/CC.pm' Index: ./ext/B/B/CC.pm *** ./ext/B/B/CC.pm Thu Jul 23 22:59:57 1998 --- ./ext/B/B/CC.pm Thu Nov 26 20:00:38 1998 *************** *** 878,884 **** } runtime("SvSETMAGIC(TOPs);"); } else { ! my $dst = pop @stack; my $type = $dst->{type}; runtime("sv = POPs;"); runtime("MAYBE_TAINT_SASSIGN_SRC(sv);"); --- 878,884 ---- } runtime("SvSETMAGIC(TOPs);"); } else { ! my $dst = $stack[-1]; my $type = $dst->{type}; runtime("sv = POPs;"); runtime("MAYBE_TAINT_SASSIGN_SRC(sv);"); *************** *** 946,958 **** write_back_lexicals(REGISTER|TEMPORARY); write_back_stack(); my $sym = doop($op); ! runtime("if (PL_op != ($sym)->op_next) PL_op = (*PL_op->op_ppaddr)(ARGS);"); ! runtime("SPAGAIN;"); $know_op = 0; invalidate_lexicals(REGISTER|TEMPORARY); return $op->next; } sub pp_enterwrite { my $op = shift; pp_entersub($op); --- 946,970 ---- write_back_lexicals(REGISTER|TEMPORARY); write_back_stack(); my $sym = doop($op); ! runtime("while (PL_op != ($sym)->op_next && PL_op != (OP*)0 ){"); ! runtime("PL_op = (*PL_op->op_ppaddr)(ARGS);"); ! runtime("SPAGAIN;}"); $know_op = 0; invalidate_lexicals(REGISTER|TEMPORARY); return $op->next; } + sub pp_goto{ + + my $op = shift; + my $ppname = $op->ppaddr; + write_back_lexicals() unless $skip_lexicals{$ppname}; + write_back_stack() unless $skip_stack{$ppname}; + my $sym=doop($op); + runtime("if (PL_op != ($sym)->op_next && PL_op != (OP*)0){return PL_op;}"); + invalidate_lexicals() unless $skip_invalidate{$ppname}; + return $op->next; + } sub pp_enterwrite { my $op = shift; pp_entersub($op); *************** *** 1051,1057 **** write_back_lexicals(REGISTER|TEMPORARY); write_back_stack(); doop($op); ! runtime("PUTBACK;", "return 0;"); $know_op = 0; return $op->next; } --- 1063,1069 ---- write_back_lexicals(REGISTER|TEMPORARY); write_back_stack(); doop($op); ! runtime("PUTBACK;", "return (PL_op)?PL_op->op_next:0;"); $know_op = 0; return $op->next; } *************** *** 1344,1350 **** $need_freetmps = 0; } if (!$$op) { ! runtime("PUTBACK;", "return 0;"); } elsif ($done{$$op}) { runtime(sprintf("goto %s;", label($op))); } --- 1356,1362 ---- $need_freetmps = 0; } if (!$$op) { ! runtime("PUTBACK;","return (PL_op)?PL_op->op_next:0;"); } elsif ($done{$$op}) { runtime(sprintf("goto %s;", label($op))); } *************** *** 1375,1380 **** --- 1387,1393 ---- sub cc_main { my @comppadlist = comppadlist->ARRAY; + my $curpad_nam = $comppadlist[0]->save; my $curpad_sym = $comppadlist[1]->save; my $start = cc_recurse("pp_main", main_root, main_start, @comppadlist); save_unused_subs(@unused_sub_packages); *************** *** 1384,1390 **** if (!defined($module)) { $init->add(sprintf("PL_main_root = s\\_%x;", ${main_root()}), "PL_main_start = $start;", ! "PL_curpad = AvARRAY($curpad_sym);"); } output_boilerplate(); print "\n"; --- 1397,1405 ---- if (!defined($module)) { $init->add(sprintf("PL_main_root = s\\_%x;", ${main_root()}), "PL_main_start = $start;", ! "PL_curpad = AvARRAY($curpad_sym);", ! "av_store(CvPADLIST(PL_main_cv),0,SvREFCNT_inc($curpad_nam));", ! "av_store(CvPADLIST(PL_main_cv),1,SvREFCNT_inc($curpad_sym));"); } output_boilerplate(); print "\n"; diff -c 'perl5.005_02/ext/B/B/Disassembler.pm' 'perl5.005_03/ext/B/B/Disassembler.pm' Index: ./ext/B/B/Disassembler.pm *** ./ext/B/B/Disassembler.pm Thu Jul 23 22:59:59 1998 --- ./ext/B/B/Disassembler.pm Sun Nov 29 19:20:35 1998 *************** *** 77,83 **** } } ! sub GET_comment { my $fh = shift; my ($str, $c); while (defined($c = $fh->getc) && $c ne "\n") { --- 77,83 ---- } } ! sub GET_comment_t { my $fh = shift; my ($str, $c); while (defined($c = $fh->getc) && $c ne "\n") { diff -c 'perl5.005_02/ext/B/Makefile.PL' 'perl5.005_03/ext/B/Makefile.PL' Index: ./ext/B/Makefile.PL *** ./ext/B/Makefile.PL Thu Jul 23 23:00:00 1998 --- ./ext/B/Makefile.PL Thu Nov 26 20:11:59 1998 *************** *** 16,22 **** WriteMakefile( NAME => "B", VERSION => "a5", ! MAN3PODS => ' ', clean => { FILES => "perl$e byteperl$e *$o B.c *~" } --- 16,22 ---- WriteMakefile( NAME => "B", VERSION => "a5", ! MAN3PODS => {}, clean => { FILES => "perl$e byteperl$e *$o B.c *~" } diff -c 'perl5.005_02/ext/B/README' 'perl5.005_03/ext/B/README' Index: ./ext/B/README *** ./ext/B/README Thu Jul 23 23:00:00 1998 --- ./ext/B/README Sun Oct 25 08:25:46 1998 *************** *** 20,27 **** in the file named "Artistic". If not, you can get one from the Perl distribution. You should also have received a copy of the GNU General Public License, in the file named "Copying". If not, you can get one ! from the Perl distribution or else write to the Free Software ! Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. CHANGES --- 20,27 ---- in the file named "Artistic". If not, you can get one from the Perl distribution. You should also have received a copy of the GNU General Public License, in the file named "Copying". If not, you can get one ! from the Perl distribution or else write to the Free Software Foundation, ! Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. CHANGES diff -c 'perl5.005_02/ext/DB_File/Changes' 'perl5.005_03/ext/DB_File/Changes' Index: ./ext/DB_File/Changes *** ./ext/DB_File/Changes Thu Jul 23 23:00:01 1998 --- ./ext/DB_File/Changes Wed Mar 17 18:05:56 1999 *************** *** 203,205 **** --- 203,234 ---- 1.60 Changed the test to check for full tied array support + + 1.61 19th November 1998 + + Added a note to README about how to build Berkeley DB 2.x when + using HP-UX. + Minor modifications to get the module to build with DB 2.5.x + Fixed a typo in the definition of O_RDONLY, courtesy of Mark Kettenis. + + 1.62 30th November 1998 + + Added hints/dynixptx.pl. + Fixed typemap -- 1.61 used PL_na instead of na + + 1.63 19th December 1998 + + * Fix to allow DB 2.6.x to build with DB_File + * Documentation updated to use push,pop etc in the RECNO example & + to include the find_dup & del_dup methods. + + 1.64 21st February 1999 + + * Tidied the 1.x to 2.x flag mapping code. + * Added a patch from Mark Kettenis to fix a flag + mapping problem with O_RDONLY on the Hurd + * Updated the message that db-recno.t prints when tests 51, 53 or 55 fail. + + 1.65 6th March 1999 + * Fixed a bug in the recno PUSH logic. + * The BOOT version check now needs 2.3.4 when using Berkeley DB version 2 diff -c 'perl5.005_02/ext/DB_File/DB_File.pm' 'perl5.005_03/ext/DB_File/DB_File.pm' Index: ./ext/DB_File/DB_File.pm *** ./ext/DB_File/DB_File.pm Thu Jul 23 23:00:02 1998 --- ./ext/DB_File/DB_File.pm Wed Mar 17 18:05:58 1999 *************** *** 1,10 **** # DB_File.pm -- Perl 5 interface to Berkeley DB # ! # written by Paul Marquess (pmarquess@bfsec.bt.co.uk) ! # last modified 16th May 1998 ! # version 1.60 # ! # Copyright (c) 1995-8 Paul Marquess. All rights reserved. # This program is free software; you can redistribute it and/or # modify it under the same terms as Perl itself. --- 1,10 ---- # DB_File.pm -- Perl 5 interface to Berkeley DB # ! # written by Paul Marquess (Paul.Marquess@btinternet.com) ! # last modified 6th March 1999 ! # version 1.65 # ! # Copyright (c) 1995-9 Paul Marquess. All rights reserved. # This program is free software; you can redistribute it and/or # modify it under the same terms as Perl itself. *************** *** 145,151 **** use Carp; ! $VERSION = "1.60" ; #typedef enum { DB_BTREE, DB_HASH, DB_RECNO } DBTYPE; $DB_BTREE = new DB_File::BTREEINFO ; --- 145,151 ---- use Carp; ! $VERSION = "1.65" ; #typedef enum { DB_BTREE, DB_HASH, DB_RECNO } DBTYPE; $DB_BTREE = new DB_File::BTREEINFO ; *************** *** 300,305 **** --- 300,339 ---- } } + sub find_dup + { + croak "Usage: \$db->find_dup(key,value)\n" + unless @_ == 3 ; + + my $db = shift ; + my ($origkey, $value_wanted) = @_ ; + my ($key, $value) = ($origkey, 0); + my ($status) = 0 ; + + for ($status = $db->seq($key, $value, R_CURSOR() ) ; + $status == 0 ; + $status = $db->seq($key, $value, R_NEXT() ) ) { + + return 0 if $key eq $origkey and $value eq $value_wanted ; + } + + return $status ; + } + + sub del_dup + { + croak "Usage: \$db->del_dup(key,value)\n" + unless @_ == 3 ; + + my $db = shift ; + my ($key, $value) = @_ ; + my ($status) = $db->find_dup($key, $value) ; + return $status if $status != 0 ; + + $status = $db->del($key, R_CURSOR() ) ; + return $status ; + } + sub get_dup { croak "Usage: \$db->get_dup(key [,flag])\n" *************** *** 364,369 **** --- 398,405 ---- $count = $X->get_dup($key) ; @list = $X->get_dup($key) ; %list = $X->get_dup($key, 1) ; + $status = $X->find_dup($key, $value) ; + $status = $X->del_dup($key, $value) ; # RECNO only $a = $X->length; *************** *** 443,453 **** B The database file format has changed in Berkeley DB version 2. If you cannot recreate your databases, you must dump any existing databases with the C utility that comes with Berkeley DB. ! Once you have upgraded DB_File to use Berkeley DB version 2, your databases can be recreated using C. Refer to the Berkeley DB documentation for further details. ! Please read L before using version 2.x of Berkeley DB with DB_File. =head2 Interface to Berkeley DB --- 479,489 ---- B The database file format has changed in Berkeley DB version 2. If you cannot recreate your databases, you must dump any existing databases with the C utility that comes with Berkeley DB. ! Once you have rebuilt DB_File to use Berkeley DB version 2, your databases can be recreated using C. Refer to the Berkeley DB documentation for further details. ! Please read L<"COPYRIGHT"> before using version 2.x of Berkeley DB with DB_File. =head2 Interface to Berkeley DB *************** *** 837,845 **** This time we have got all the key/value pairs, including the multiple values associated with the key C. =head2 The get_dup() Method ! B comes with a utility method, called C, to assist in reading duplicate values from BTREE databases. The method can take the following forms: --- 873,884 ---- This time we have got all the key/value pairs, including the multiple values associated with the key C. + To make life easier when dealing with duplicate keys, B comes with + a few utility methods. + =head2 The get_dup() Method ! The C method assists in reading duplicate values from BTREE databases. The method can take the following forms: *************** *** 888,893 **** --- 927,1005 ---- Smith => [John] Dog => [] + =head2 The find_dup() Method + + $status = $X->find_dup($key, $value) ; + + This method checks for the existance of a specific key/value pair. If the + pair exists, the cursor is left pointing to the pair and the method + returns 0. Otherwise the method returns a non-zero value. + + Assuming the database from the previous example: + + use strict ; + use DB_File ; + + use vars qw($filename $x %h $found) ; + + my $filename = "tree" ; + + # Enable duplicate records + $DB_BTREE->{'flags'} = R_DUP ; + + $x = tie %h, "DB_File", $filename, O_RDWR|O_CREAT, 0640, $DB_BTREE + or die "Cannot open $filename: $!\n"; + + $found = ( $x->find_dup("Wall", "Larry") == 0 ? "" : "not") ; + print "Larry Wall is $found there\n" ; + + $found = ( $x->find_dup("Wall", "Harry") == 0 ? "" : "not") ; + print "Harry Wall is $found there\n" ; + + undef $x ; + untie %h ; + + prints this + + Larry Wall is there + Harry Wall is not there + + + =head2 The del_dup() Method + + $status = $X->del_dup($key, $value) ; + + This method deletes a specific key/value pair. It returns + 0 if they exist and have been deleted successfully. + Otherwise the method returns a non-zero value. + + Again assuming the existance of the C database + + use strict ; + use DB_File ; + + use vars qw($filename $x %h $found) ; + + my $filename = "tree" ; + + # Enable duplicate records + $DB_BTREE->{'flags'} = R_DUP ; + + $x = tie %h, "DB_File", $filename, O_RDWR|O_CREAT, 0640, $DB_BTREE + or die "Cannot open $filename: $!\n"; + + $x->del_dup("Wall", "Larry") ; + + $found = ( $x->find_dup("Wall", "Larry") == 0 ? "" : "not") ; + print "Larry Wall is $found there\n" ; + + undef $x ; + untie %h ; + + prints this + + Larry Wall is not there + =head2 Matching Partial Keys The BTREE interface has a feature which allows partial keys to be *************** *** 970,976 **** DB_RECNO provides an interface to flat text files. Both variable and fixed length records are supported. ! In order to make RECNO more compatible with Perl the array offset for all RECNO arrays begins at 0 rather than 1 as in Berkeley DB. As with normal Perl arrays, a RECNO array can be accessed using --- 1082,1088 ---- DB_RECNO provides an interface to flat text files. Both variable and fixed length records are supported. ! In order to make RECNO more compatible with Perl, the array offset for all RECNO arrays begins at 0 rather than 1 as in Berkeley DB. As with normal Perl arrays, a RECNO array can be accessed using *************** *** 999,1005 **** That clarifies the situation with regards Berkeley DB itself. What about B? Well, the behavior defined in the quote above is ! quite useful, so B conforms it. That means that you can specify other options (e.g. cachesize) and still have bval default to C<"\n"> for variable length records, and --- 1111,1117 ---- That clarifies the situation with regards Berkeley DB itself. What about B? Well, the behavior defined in the quote above is ! quite useful, so B conforms to it. That means that you can specify other options (e.g. cachesize) and still have bval default to C<"\n"> for variable length records, and *************** *** 1007,1013 **** =head2 A Simple Example ! Here is a simple example that uses RECNO. use strict ; use DB_File ; --- 1119,1127 ---- =head2 A Simple Example ! Here is a simple example that uses RECNO (if you are using a version ! of Perl earlier than 5.004_57 this example won't work -- see ! L for a workaround). use strict ; use DB_File ; *************** *** 1021,1026 **** --- 1135,1152 ---- $h[1] = "blue" ; $h[2] = "yellow" ; + push @h, "green", "black" ; + + my $elements = scalar @h ; + print "The array contains $elements entries\n" ; + + my $last = pop @h ; + print "popped $last\n" ; + + unshift @h, "white" ; + my $first = shift @h ; + print "shifted $first\n" ; + # Check for existence of a key print "Element 1 Exists with value $h[1]\n" if $h[1] ; *************** *** 1032,1048 **** Here is the output from the script: ! Element 1 Exists with value blue ! The last element is yellow ! The 2nd last element is blue ! =head2 Extra Methods If you are using a version of Perl earlier than 5.004_57, the tied ! array interface is quite limited. The example script above will work, ! but you won't be able to use C, C, C, C ! etc. with the tied array. To make the interface more useful for older versions of Perl, a number of methods are supplied with B to simulate the missing array --- 1158,1176 ---- Here is the output from the script: ! The array contains 5 entries ! popped black ! unshifted white Element 1 Exists with value blue ! The last element is green ! The 2nd last element is yellow ! =head2 Extra RECNO Methods If you are using a version of Perl earlier than 5.004_57, the tied ! array interface is quite limited. In the example script above ! C, C, C, C ! or determining the array length will not work with a tied array. To make the interface more useful for older versions of Perl, a number of methods are supplied with B to simulate the missing array *************** *** 1657,1663 **** =head1 COPYRIGHT ! Copyright (c) 1995-8 Paul Marquess. All rights reserved. This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. --- 1785,1791 ---- =head1 COPYRIGHT ! Copyright (c) 1995-9 Paul Marquess. All rights reserved. This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. *************** *** 1688,1694 **** =head1 AUTHOR The DB_File interface was written by Paul Marquess ! Epmarquess@bfsec.bt.co.ukE. Questions about the DB system itself may be addressed to Edb@sleepycat.com. --- 1816,1822 ---- =head1 AUTHOR The DB_File interface was written by Paul Marquess ! EPaul.Marquess@btinternet.comE. Questions about the DB system itself may be addressed to Edb@sleepycat.com. diff -c 'perl5.005_02/ext/DB_File/DB_File.xs' 'perl5.005_03/ext/DB_File/DB_File.xs' Index: ./ext/DB_File/DB_File.xs *** ./ext/DB_File/DB_File.xs Thu Jul 23 23:00:03 1998 --- ./ext/DB_File/DB_File.xs Wed Mar 17 18:05:59 1999 *************** *** 2,14 **** DB_File.xs -- Perl 5 interface to Berkeley DB ! written by Paul Marquess (pmarquess@bfsec.bt.co.uk) ! last modified 16th May 1998 ! version 1.60 All comments/suggestions/problems are welcome ! Copyright (c) 1995, 1996, 1997, 1998 Paul Marquess. All rights reserved. This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. --- 2,14 ---- DB_File.xs -- Perl 5 interface to Berkeley DB ! written by Paul Marquess ! last modified 6th March 1999 ! version 1.65 All comments/suggestions/problems are welcome ! Copyright (c) 1995-9 Paul Marquess. All rights reserved. This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. *************** *** 56,61 **** --- 56,70 ---- This was ok for DB 1.x, but isn't for DB 2.x. 1.59 - No change to DB_File.xs 1.60 - Some code tidy up + 1.61 - added flagSet macro for DB 2.5.x + fixed typo in O_RDONLY test. + 1.62 - No change to DB_File.xs + 1.63 - Fix to alllow DB 2.6.x to build. + 1.64 - Tidied up the 1.x to 2.x flags mapping code. + Added a patch from Mark Kettenis + to fix a flag mapping problem with O_RDONLY on the Hurd + 1.65 - Fixed a bug in the PUSH logic. + Added BOOT check that using 2.3.4 or greater *************** *** 65,70 **** --- 74,93 ---- #include "perl.h" #include "XSUB.h" + #ifndef PERL_VERSION + #include "patchlevel.h" + #define PERL_REVISION 5 + #define PERL_VERSION PATCHLEVEL + #define PERL_SUBVERSION SUBVERSION + #endif + + #if PERL_REVISION == 5 && (PERL_VERSION < 4 || (PERL_VERSION == 4 && PERL_SUBVERSION <= 75 )) + + # define PL_sv_undef sv_undef + # define PL_na na + + #endif + /* Being the Berkeley DB we prefer the (which will be * shortly #included by the ) __attribute__ to the possibly * already defined __attribute__, for example by GNUC or by Perl. */ *************** *** 153,158 **** --- 176,187 ---- #define DBT_flags(x) x.flags = 0 #define DB_flags(x, v) x |= v + #if DB_VERSION_MAJOR == 2 && DB_VERSION_MINOR < 5 + #define flagSet(flags, bitmask) ((flags) & (bitmask)) + #else + #define flagSet(flags, bitmask) (((flags) & DB_OPFLAGS_MASK) == (bitmask)) + #endif + #else /* db version 1.x */ typedef union INFO { *************** *** 205,210 **** --- 234,240 ---- #define do_SEQ(db, key, value, flag) (db->dbp->seq)(db->dbp, &key, &value, flag) #define DBT_flags(x) #define DB_flags(x, v) + #define flagSet(flags, bitmask) ((flags) & (bitmask)) #endif /* db version 1 */ *************** *** 216,225 **** #define db_sync(db, flags) ((db->dbp)->sync)(db->dbp, flags) #define db_get(db, key, value, flags) ((db->dbp)->get)(db->dbp, TXN &key, &value, flags) #ifdef DB_VERSION_MAJOR #define db_DESTROY(db) ((db->dbp)->close)(db->dbp, 0) #define db_close(db) ((db->dbp)->close)(db->dbp, 0) ! #define db_del(db, key, flags) ((flags & R_CURSOR) \ ? ((db->cursor)->c_del)(db->cursor, 0) \ : ((db->dbp)->del)(db->dbp, NULL, &key, flags) ) --- 246,256 ---- #define db_sync(db, flags) ((db->dbp)->sync)(db->dbp, flags) #define db_get(db, key, value, flags) ((db->dbp)->get)(db->dbp, TXN &key, &value, flags) + #ifdef DB_VERSION_MAJOR #define db_DESTROY(db) ((db->dbp)->close)(db->dbp, 0) #define db_close(db) ((db->dbp)->close)(db->dbp, 0) ! #define db_del(db, key, flags) (flagSet(flags, R_CURSOR) \ ? ((db->cursor)->c_del)(db->cursor, 0) \ : ((db->dbp)->del)(db->dbp, NULL, &key, flags) ) *************** *** 232,237 **** --- 263,269 ---- #endif + #define db_seq(db, key, value, flags) do_SEQ(db, key, value, flags) typedef struct { *************** *** 288,299 **** { int status ; ! if (flags & R_CURSOR) { status = ((db->cursor)->c_del)(db->cursor, 0); if (status != 0) return status ; flags &= ~R_CURSOR ; } return ((db->dbp)->put)(db->dbp, NULL, &key, &value, flags) ; --- 320,336 ---- { int status ; ! if (flagSet(flags, R_CURSOR)) { status = ((db->cursor)->c_del)(db->cursor, 0); if (status != 0) return status ; + #if DB_VERSION_MAJOR == 2 && DB_VERSION_MINOR < 5 flags &= ~R_CURSOR ; + #else + flags &= ~DB_OPFLAGS_MASK ; + #endif + } return ((db->dbp)->put)(db->dbp, NULL, &key, &value, flags) ; *************** *** 311,322 **** (void)db_version(&Major, &Minor, &Patch) ; ! /* check that libdb is recent enough */ ! if (Major == 2 && Minor == 0 && Patch < 5) ! croak("DB_File needs Berkeley DB 2.0.5 or greater, you have %d.%d.%d\n", Major, Minor, Patch) ; ! #if PATCHLEVEL > 3 sv_setpvf(ver_sv, "%d.%d", Major, Minor) ; #else { --- 348,359 ---- (void)db_version(&Major, &Minor, &Patch) ; ! /* check that libdb is recent enough -- we need 2.3.4 or greater */ ! if (Major == 2 && (Minor < 3 || (Minor == 3 && Patch < 4))) ! croak("DB_File needs Berkeley DB 2.3.4 or greater, you have %d.%d.%d\n", Major, Minor, Patch) ; ! #if PERL_VERSION > 3 sv_setpvf(ver_sv, "%d.%d", Major, Minor) ; #else { *************** *** 577,582 **** --- 614,620 ---- DB_File RETVAL = (DB_File)safemalloc(sizeof(DB_File_type)) ; void * openinfo = NULL ; INFO * info = &RETVAL->info ; + STRLEN n_a; /* printf("In ParseOpenInfo name=[%s] flags=[%d] mode = [%d]\n", name, flags, mode) ; */ Zero(RETVAL, 1, DB_File_type) ; *************** *** 718,728 **** #endif svp = hv_fetch(action, "bfname", 6, FALSE); if (svp && SvOK(*svp)) { ! char * ptr = SvPV(*svp,PL_na) ; #ifdef DB_VERSION_MAJOR ! name = (char*) PL_na ? ptr : NULL ; #else ! info->db_RE_bfname = (char*) (PL_na ? ptr : NULL) ; #endif } else --- 756,766 ---- #endif svp = hv_fetch(action, "bfname", 6, FALSE); if (svp && SvOK(*svp)) { ! char * ptr = SvPV(*svp,n_a) ; #ifdef DB_VERSION_MAJOR ! name = (char*) n_a ? ptr : NULL ; #else ! info->db_RE_bfname = (char*) (n_a ? ptr : NULL) ; #endif } else *************** *** 738,744 **** { int value ; if (SvPOK(*svp)) ! value = (int)*SvPV(*svp, PL_na) ; else value = SvIV(*svp) ; --- 776,782 ---- { int value ; if (SvPOK(*svp)) ! value = (int)*SvPV(*svp, n_a) ; else value = SvIV(*svp) ; *************** *** 756,762 **** if (svp && SvOK(*svp)) { if (SvPOK(*svp)) ! info->db_RE_bval = (u_char)*SvPV(*svp, PL_na) ; else info->db_RE_bval = (u_char)(unsigned long) SvIV(*svp) ; DB_flags(info->flags, DB_DELIMITER) ; --- 794,800 ---- if (svp && SvOK(*svp)) { if (SvPOK(*svp)) ! info->db_RE_bval = (u_char)*SvPV(*svp, n_a) ; else info->db_RE_bval = (u_char)(unsigned long) SvIV(*svp) ; DB_flags(info->flags, DB_DELIMITER) ; *************** *** 800,825 **** if ((flags & O_CREAT) == O_CREAT) Flags |= DB_CREATE ; - #ifdef O_NONBLOCK - if ((flags & O_NONBLOCK) == O_NONBLOCK) - Flags |= DB_EXCL ; - #endif - #if O_RDONLY == 0 if (flags == O_RDONLY) #else ! if (flags & O_RDONLY) == O_RDONLY) #endif Flags |= DB_RDONLY ; ! #ifdef O_NONBLOCK if ((flags & O_TRUNC) == O_TRUNC) Flags |= DB_TRUNCATE ; #endif status = db_open(name, RETVAL->type, Flags, mode, NULL, openinfo, &RETVAL->dbp) ; if (status == 0) status = (RETVAL->dbp->cursor)(RETVAL->dbp, NULL, &RETVAL->cursor) ; if (status) RETVAL->dbp = NULL ; --- 838,863 ---- if ((flags & O_CREAT) == O_CREAT) Flags |= DB_CREATE ; #if O_RDONLY == 0 if (flags == O_RDONLY) #else ! if ((flags & O_RDONLY) == O_RDONLY && (flags & O_RDWR) != O_RDWR) #endif Flags |= DB_RDONLY ; ! #ifdef O_TRUNC if ((flags & O_TRUNC) == O_TRUNC) Flags |= DB_TRUNCATE ; #endif status = db_open(name, RETVAL->type, Flags, mode, NULL, openinfo, &RETVAL->dbp) ; if (status == 0) + #if DB_VERSION_MAJOR == 2 && DB_VERSION_MINOR < 6 status = (RETVAL->dbp->cursor)(RETVAL->dbp, NULL, &RETVAL->cursor) ; + #else + status = (RETVAL->dbp->cursor)(RETVAL->dbp, NULL, &RETVAL->cursor, + 0) ; + #endif if (status) RETVAL->dbp = NULL ; *************** *** 1100,1108 **** { char * name = (char *) NULL ; SV * sv = (SV *) NULL ; if (items >= 3 && SvOK(ST(2))) ! name = (char*) SvPV(ST(2), PL_na) ; if (items == 6) sv = ST(5) ; --- 1138,1147 ---- { char * name = (char *) NULL ; SV * sv = (SV *) NULL ; + STRLEN n_a; if (items >= 3 && SvOK(ST(2))) ! name = (char*) SvPV(ST(2), n_a) ; if (items == 6) sv = ST(5) ; *************** *** 1191,1197 **** { DBTKEY key ; DBT value ; - DB * Db = db->dbp ; DBT_flags(key) ; DBT_flags(value) ; --- 1230,1235 ---- *************** *** 1208,1214 **** CODE: { DBT value ; - DB * Db = db->dbp ; DBT_flags(value) ; CurrentDB = db ; --- 1246,1251 ---- *************** *** 1232,1237 **** --- 1269,1275 ---- int i ; int One ; DB * Db = db->dbp ; + STRLEN n_a; DBT_flags(key) ; DBT_flags(value) ; *************** *** 1245,1252 **** #endif for (i = items-1 ; i > 0 ; --i) { ! value.data = SvPV(ST(i), PL_na) ; ! value.size = PL_na ; One = 1 ; key.data = &One ; key.size = sizeof(int) ; --- 1283,1290 ---- #endif for (i = items-1 ; i > 0 ; --i) { ! value.data = SvPV(ST(i), n_a) ; ! value.size = n_a ; One = 1 ; key.data = &One ; key.size = sizeof(int) ; *************** *** 1270,1276 **** { DBTKEY key ; DBT value ; - DB * Db = db->dbp ; DBT_flags(key) ; DBT_flags(value) ; --- 1308,1313 ---- *************** *** 1298,1304 **** { DBT value ; DBTKEY key ; - DB * Db = db->dbp ; DBT_flags(key) ; DBT_flags(value) ; --- 1335,1340 ---- *************** *** 1325,1366 **** CODE: { DBTKEY key ; - DBTKEY * keyptr = &key ; DBT value ; DB * Db = db->dbp ; int i ; DBT_flags(key) ; DBT_flags(value) ; CurrentDB = db ; - /* Set the Cursor to the Last element */ - RETVAL = do_SEQ(db, key, value, R_LAST) ; - if (RETVAL >= 0) - { - if (RETVAL == 1) - keyptr = &empty ; #ifdef DB_VERSION_MAJOR for (i = 1 ; i < items ; ++i) { ! ! ++ (* (int*)key.data) ; ! value.data = SvPV(ST(i), PL_na) ; ! value.size = PL_na ; ! RETVAL = (Db->put)(Db, NULL, &key, &value, 0) ; if (RETVAL != 0) break; } #else for (i = items - 1 ; i > 0 ; --i) { ! value.data = SvPV(ST(i), PL_na) ; ! value.size = PL_na ; ! RETVAL = (Db->put)(Db, keyptr, &value, R_IAFTER) ; if (RETVAL != 0) break; } - #endif } } OUTPUT: RETVAL --- 1361,1402 ---- CODE: { DBTKEY key ; DBT value ; DB * Db = db->dbp ; int i ; + STRLEN n_a; DBT_flags(key) ; DBT_flags(value) ; CurrentDB = db ; #ifdef DB_VERSION_MAJOR + RETVAL = 0 ; + key = empty ; for (i = 1 ; i < items ; ++i) { ! value.data = SvPV(ST(i), n_a) ; ! value.size = n_a ; ! RETVAL = (Db->put)(Db, NULL, &key, &value, DB_APPEND) ; if (RETVAL != 0) break; } #else + /* Set the Cursor to the Last element */ + RETVAL = do_SEQ(db, key, value, R_LAST) ; + if (RETVAL >= 0) + { + if (RETVAL == 1) + key = empty ; for (i = items - 1 ; i > 0 ; --i) { ! value.data = SvPV(ST(i), n_a) ; ! value.size = n_a ; ! RETVAL = (Db->put)(Db, &key, &value, R_IAFTER) ; if (RETVAL != 0) break; } } + #endif } OUTPUT: RETVAL *************** *** 1436,1442 **** #endif OUTPUT: RETVAL ! key if (flags & (R_IAFTER|R_IBEFORE)) OutputKey(ST(1), key); int db_fd(db) --- 1472,1478 ---- #endif OUTPUT: RETVAL ! key if (flagSet(flags, R_IAFTER) || flagSet(flags, R_IBEFORE)) OutputKey(ST(1), key); int db_fd(db) diff -c 'perl5.005_02/ext/DB_File/Makefile.PL' 'perl5.005_03/ext/DB_File/Makefile.PL' Index: ./ext/DB_File/Makefile.PL *** ./ext/DB_File/Makefile.PL Thu Jul 23 23:00:03 1998 --- ./ext/DB_File/Makefile.PL Thu Nov 26 20:12:09 1998 *************** *** 11,17 **** WriteMakefile( NAME => 'DB_File', LIBS => ["-L/usr/local/lib $LIB"], ! MAN3PODS => ' ', # Pods will be built by installman. #INC => '-I/usr/local/include', VERSION_FROM => 'DB_File.pm', XSPROTOARG => '-noprototypes', --- 11,17 ---- WriteMakefile( NAME => 'DB_File', LIBS => ["-L/usr/local/lib $LIB"], ! MAN3PODS => {}, # Pods will be built by installman. #INC => '-I/usr/local/include', VERSION_FROM => 'DB_File.pm', XSPROTOARG => '-noprototypes', diff -c 'perl5.005_02/ext/DB_File/dbinfo' 'perl5.005_03/ext/DB_File/dbinfo' Index: ./ext/DB_File/dbinfo *** ./ext/DB_File/dbinfo Thu Jul 23 23:00:03 1998 --- ./ext/DB_File/dbinfo Sun Jan 17 19:24:24 1999 *************** *** 3,9 **** # Name: dbinfo -- identify berkeley DB version used to create # a database file # ! # Author: Paul Marquess # Version: 1.01 # Date 16th April 1998 # --- 3,9 ---- # Name: dbinfo -- identify berkeley DB version used to create # a database file # ! # Author: Paul Marquess # Version: 1.01 # Date 16th April 1998 # diff -c /dev/null 'perl5.005_03/ext/DB_File/hints/dynixptx.pl' Index: ext/DB_File/hints/dynixptx.pl *** ext/DB_File/hints/dynixptx.pl Wed Dec 31 18:00:00 1969 --- ext/DB_File/hints/dynixptx.pl Thu Nov 26 09:22:54 1998 *************** *** 0 **** --- 1,3 ---- + # Need to add an extra '-lc' to the end to work around a DYNIX/ptx bug + + $self->{LIBS} = ['-lm -lc']; diff -c 'perl5.005_02/ext/DB_File/typemap' 'perl5.005_03/ext/DB_File/typemap' Index: ./ext/DB_File/typemap *** ./ext/DB_File/typemap Thu Jul 23 23:00:03 1998 --- ./ext/DB_File/typemap Wed Mar 17 18:06:00 1999 *************** *** 1,8 **** # typemap for Perl 5 interface to Berkeley # ! # written by Paul Marquess (pmarquess@bfsec.bt.co.uk) ! # last modified 13th May 1998 ! # version 1.59 # #################################### DB SECTION # --- 1,8 ---- # typemap for Perl 5 interface to Berkeley # ! # written by Paul Marquess ! # last modified 21st February 1999 ! # version 1.65 # #################################### DB SECTION # diff -c 'perl5.005_02/ext/Data/Dumper/Changes' 'perl5.005_03/ext/Data/Dumper/Changes' Index: ./ext/Data/Dumper/Changes *** ./ext/Data/Dumper/Changes Thu Jul 23 23:00:03 1998 --- ./ext/Data/Dumper/Changes Thu Nov 26 21:41:34 1998 *************** *** 6,11 **** --- 6,29 ---- =over 8 + =item 2.10 (31 Oct 1998) + + Bugfixes for dumping related undef values, globs, and better double + quoting: three patches suggested by Gisle Aas . + + Escaping of single quotes in the XS version could get tripped up + by the presence of nulls in the string. Fix suggested by + Slaven Rezic . + + Rather large scale reworking of the logic in how seen values + are stashed. Anonymous scalars that may be encountered while + traversing the structure are properly tracked, in case they become + used in data dumped in a later pass. There used to be a problem + with the previous logic that prevented such structures from being + dumped correctly. + + Various additions to the testsuite. + =item 2.09 (9 July 1998) Implement $Data::Dumper::Bless, suggested by Mark Daku . diff -c 'perl5.005_02/ext/Data/Dumper/Dumper.pm' 'perl5.005_03/ext/Data/Dumper/Dumper.pm' Index: ./ext/Data/Dumper/Dumper.pm *** ./ext/Data/Dumper/Dumper.pm Thu Jul 23 23:00:03 1998 --- ./ext/Data/Dumper/Dumper.pm Thu Feb 11 18:05:47 1999 *************** *** 9,15 **** package Data::Dumper; ! $VERSION = $VERSION = '2.09'; #$| = 1; --- 9,15 ---- package Data::Dumper; ! $VERSION = $VERSION = '2.101'; #$| = 1; *************** *** 208,215 **** my($sname); my($out, $realpack, $realtype, $type, $ipad, $id, $blesspad); - return "undef" unless defined $val; - $type = ref $val; $out = ""; --- 208,213 ---- *************** *** 218,264 **** # prep it, if it looks like an object if ($type =~ /[a-z_:]/) { my $freezer = $s->{freezer}; ! # UNIVERSAL::can should be used here, when we can require 5.004 ! if ($freezer) { ! eval { $val->$freezer() }; ! carp "WARNING(Freezer method call failed): $@" if $@; ! } } ($realpack, $realtype, $id) = (overload::StrVal($val) =~ /^(?:(.*)\=)?([^=]*)\(([^\(]*)\)$/); ! # keep a tab on it so that we dont fall into recursive pit ! if (exists $s->{seen}{$id}) { ! # if ($s->{expdepth} < $s->{level}) { ! if ($s->{purity} and $s->{level} > 0) { ! $out = ($realtype eq 'HASH') ? '{}' : ! ($realtype eq 'ARRAY') ? '[]' : ! "''" ; ! push @post, $name . " = " . $s->{seen}{$id}[0]; ! } ! else { ! $out = $s->{seen}{$id}[0]; ! if ($name =~ /^([\@\%])/) { ! my $start = $1; ! if ($out =~ /^\\$start/) { ! $out = substr($out, 1); } else { ! $out = $start . '{' . $out . '}'; ! } ! } } - return $out; - # } - } - else { - # store our name - $s->{seen}{$id} = [ (($name =~ /^[@%]/) ? ('\\' . $name ) : - ($realtype eq 'CODE' and - $name =~ /^[*](.*)$/) ? ('\\&' . $1 ) : - $name ), - $val ]; } $s->{level}++; --- 216,262 ---- # prep it, if it looks like an object if ($type =~ /[a-z_:]/) { my $freezer = $s->{freezer}; ! $val->$freezer() if $freezer && UNIVERSAL::can($val, $freezer); } ($realpack, $realtype, $id) = (overload::StrVal($val) =~ /^(?:(.*)\=)?([^=]*)\(([^\(]*)\)$/); ! # if it has a name, we need to either look it up, or keep a tab ! # on it so we know when we hit it later ! if (defined($name) and length($name)) { ! # keep a tab on it so that we dont fall into recursive pit ! if (exists $s->{seen}{$id}) { ! # if ($s->{expdepth} < $s->{level}) { ! if ($s->{purity} and $s->{level} > 0) { ! $out = ($realtype eq 'HASH') ? '{}' : ! ($realtype eq 'ARRAY') ? '[]' : ! "''" ; ! push @post, $name . " = " . $s->{seen}{$id}[0]; } else { ! $out = $s->{seen}{$id}[0]; ! if ($name =~ /^([\@\%])/) { ! my $start = $1; ! if ($out =~ /^\\$start/) { ! $out = substr($out, 1); ! } ! else { ! $out = $start . '{' . $out . '}'; ! } ! } ! } ! return $out; ! # } ! } ! else { ! # store our name ! $s->{seen}{$id} = [ (($name =~ /^[@%]/) ? ('\\' . $name ) : ! ($realtype eq 'CODE' and ! $name =~ /^[*](.*)$/) ? ('\\&' . $1 ) : ! $name ), ! $val ]; } } $s->{level}++; *************** *** 272,285 **** if ($realtype eq 'SCALAR') { if ($realpack) { ! $out .= 'do{\\(my $o = ' . $s->_dump($$val, "") . ')}'; } else { ! $out .= '\\' . $s->_dump($$val, ""); } } elsif ($realtype eq 'GLOB') { ! $out .= '\\' . $s->_dump($$val, ""); } elsif ($realtype eq 'ARRAY') { my($v, $pad, $mname); --- 270,283 ---- if ($realtype eq 'SCALAR') { if ($realpack) { ! $out .= 'do{\\(my $o = ' . $s->_dump($$val, "\${$name}") . ')}'; } else { ! $out .= '\\' . $s->_dump($$val, "\${$name}"); } } elsif ($realtype eq 'GLOB') { ! $out .= '\\' . $s->_dump($$val, "*{$name}"); } elsif ($realtype eq 'ARRAY') { my($v, $pad, $mname); *************** *** 287,293 **** $out .= ($name =~ /^\@/) ? '(' : '['; $pad = $s->{sep} . $s->{pad} . $s->{apad}; ($name =~ /^\@(.*)$/) ? ($mname = "\$" . $1) : ! ($name =~ /[]}]$/) ? ($mname = $name) : ($mname = $name . '->'); $mname .= '->' if $mname =~ /^\*.+\{[A-Z]+\}$/; for $v (@$val) { $sname = $mname . '[' . $i . ']'; --- 285,293 ---- $out .= ($name =~ /^\@/) ? '(' : '['; $pad = $s->{sep} . $s->{pad} . $s->{apad}; ($name =~ /^\@(.*)$/) ? ($mname = "\$" . $1) : ! # omit -> if $foo->[0]->{bar}, but not ${$foo->[0]}->{bar} ! ($name =~ /^\\?[\%\@\*\$][^{].*[]}]$/) ? ($mname = $name) : ! ($mname = $name . '->'); $mname .= '->' if $mname =~ /^\*.+\{[A-Z]+\}$/; for $v (@$val) { $sname = $mname . '[' . $i . ']'; *************** *** 303,310 **** $out .= ($name =~ /^\%/) ? '(' : '{'; $pad = $s->{sep} . $s->{pad} . $s->{apad}; $lpad = $s->{apad}; ! ($name =~ /^\%(.*)$/) ? ($mname = "\$" . $1) : ! ($name =~ /[]}]$/) ? ($mname = $name) : ($mname = $name . '->'); $mname .= '->' if $mname =~ /^\*.+\{[A-Z]+\}$/; while (($k, $v) = each %$val) { my $nk = $s->_dump($k, ""); --- 303,312 ---- $out .= ($name =~ /^\%/) ? '(' : '{'; $pad = $s->{sep} . $s->{pad} . $s->{apad}; $lpad = $s->{apad}; ! ($name =~ /^\%(.*)$/) ? ($mname = "\$" . $1) : ! # omit -> if $foo->[0]->{bar}, but not ${$foo->[0]}->{bar} ! ($name =~ /^\\?[\%\@\*\$][^{].*[]}]$/) ? ($mname = $name) : ! ($mname = $name . '->'); $mname .= '->' if $mname =~ /^\*.+\{[A-Z]+\}$/; while (($k, $v) = each %$val) { my $nk = $s->_dump($k, ""); *************** *** 324,331 **** $out .= ($name =~ /^\%/) ? ')' : '}'; } elsif ($realtype eq 'CODE') { ! $out .= '"DUMMY"'; ! $out = 'sub { ' . $out . ' }'; carp "Encountered CODE ref, using dummy placeholder" if $s->{purity}; } else { --- 326,332 ---- $out .= ($name =~ /^\%/) ? ')' : '}'; } elsif ($realtype eq 'CODE') { ! $out .= 'sub { "DUMMY" }'; carp "Encountered CODE ref, using dummy placeholder" if $s->{purity}; } else { *************** *** 347,357 **** if ($name ne '') { ($id) = ("$ref" =~ /\(([^\(]*)\)$/); if (exists $s->{seen}{$id}) { ! $out = $s->{seen}{$id}[0]; ! return $out; } else { ! $s->{seen}{$id} = ["\\$name", $val]; } } if (ref($ref) eq 'GLOB' or "$ref" =~ /=GLOB\([^()]+\)$/) { # glob --- 348,362 ---- if ($name ne '') { ($id) = ("$ref" =~ /\(([^\(]*)\)$/); if (exists $s->{seen}{$id}) { ! if ($s->{seen}{$id}[2]) { ! $out = $s->{seen}{$id}[0]; ! #warn "[<$out]\n"; ! return "\${$out}"; ! } } else { ! #warn "[>\\$name]\n"; ! $s->{seen}{$id} = ["\\$name", $ref]; } } if (ref($ref) eq 'GLOB' or "$ref" =~ /=GLOB\([^()]+\)$/) { # glob *************** *** 368,388 **** my $k; local ($s->{level}) = 0; for $k (qw(SCALAR ARRAY HASH)) { # _dump can push into @post, so we hold our place using $postlen my $postlen = scalar @post; $post[$postlen] = "\*$sname = "; local ($s->{apad}) = " " x length($post[$postlen]) if $s->{indent} >= 2; ! $post[$postlen] .= $s->_dump(*{$name}{$k}, "\*$sname\{$k\}"); } } $out .= '*' . $sname; } elsif ($val =~ /^-?[1-9]\d{0,8}$/) { # safe decimal number $out .= $val; } else { # string if ($s->{useqq}) { ! $out .= qquote($val); } else { $val =~ s/([\\\'])/\\$1/g; --- 373,400 ---- my $k; local ($s->{level}) = 0; for $k (qw(SCALAR ARRAY HASH)) { + my $gval = *$val{$k}; + next unless defined $gval; + next if $k eq "SCALAR" && ! defined $$gval; # always there + # _dump can push into @post, so we hold our place using $postlen my $postlen = scalar @post; $post[$postlen] = "\*$sname = "; local ($s->{apad}) = " " x length($post[$postlen]) if $s->{indent} >= 2; ! $post[$postlen] .= $s->_dump($gval, "\*$sname\{$k\}"); } } $out .= '*' . $sname; } + elsif (!defined($val)) { + $out .= "undef"; + } elsif ($val =~ /^-?[1-9]\d{0,8}$/) { # safe decimal number $out .= $val; } else { # string if ($s->{useqq}) { ! $out .= qquote($val, $s->{useqq}); } else { $val =~ s/([\\\'])/\\$1/g; *************** *** 390,399 **** } } } ! ! # if we made it this far, $id was added to seen list at current ! # level, so remove it to get deep copies ! delete($s->{seen}{$id}) if $id and $s->{deepcopy}; return $out; } --- 402,417 ---- } } } ! if ($id) { ! # if we made it this far, $id was added to seen list at current ! # level, so remove it to get deep copies ! if ($s->{deepcopy}) { ! delete($s->{seen}{$id}); ! } ! elsif ($name) { ! $s->{seen}{$id}[2] = 1; ! } ! } return $out; } *************** *** 493,514 **** defined($v) ? (($s->{'bless'} = $v), return $s) : $s->{'bless'}; } # put a string value in double quotes sub qquote { local($_) = shift; ! s/([\\\"\@\$\%])/\\$1/g; ! s/\a/\\a/g; ! s/[\b]/\\b/g; ! s/\t/\\t/g; ! s/\n/\\n/g; ! s/\f/\\f/g; ! s/\r/\\r/g; ! s/\e/\\e/g; ! ! # this won't work! ! # s/([^\a\b\t\n\f\r\e\038-\176])/'\\'.sprintf('%03o',ord($1))/eg; ! s/([\000-\006\013\016-\032\034-\037\177\200-\377])/'\\'.sprintf('%03o',ord($1))/eg; ! return "\"$_\""; } 1; --- 511,551 ---- defined($v) ? (($s->{'bless'} = $v), return $s) : $s->{'bless'}; } + # used by qquote below + my %esc = ( + "\a" => "\\a", + "\b" => "\\b", + "\t" => "\\t", + "\n" => "\\n", + "\f" => "\\f", + "\r" => "\\r", + "\e" => "\\e", + ); + # put a string value in double quotes sub qquote { local($_) = shift; ! s/([\\\"\@\$])/\\$1/g; ! return qq("$_") unless /[^\040-\176]/; # fast exit ! ! my $high = shift || ""; ! s/([\a\b\t\n\f\r\e])/$esc{$1}/g; ! ! # no need for 3 digits in escape for these ! s/([\0-\037])(?!\d)/'\\'.sprintf('%o',ord($1))/eg; ! ! s/([\0-\037\177])/'\\'.sprintf('%03o',ord($1))/eg; ! if ($high eq "iso8859") { ! s/([\200-\240])/'\\'.sprintf('%o',ord($1))/eg; ! } elsif ($high eq "utf8") { ! # use utf8; ! # $str =~ s/([^\040-\176])/sprintf "\\x{%04x}", ord($1)/ge; ! } elsif ($high eq "8bit") { ! # leave it as it is ! } else { ! s/([\0-\037\177-\377])/'\\'.sprintf('%03o',ord($1))/eg; ! } ! return qq("$_"); } 1; *************** *** 954,960 **** =head1 VERSION ! Version 2.09 (9 July 1998) =head1 SEE ALSO --- 991,997 ---- =head1 VERSION ! Version 2.10 (31 Oct 1998) =head1 SEE ALSO diff -c 'perl5.005_02/ext/Data/Dumper/Dumper.xs' 'perl5.005_03/ext/Data/Dumper/Dumper.xs' Index: ./ext/Data/Dumper/Dumper.xs *** ./ext/Data/Dumper/Dumper.xs Sun Aug 2 02:01:28 1998 --- ./ext/Data/Dumper/Dumper.xs Thu Nov 26 21:43:08 1998 *************** *** 2,9 **** #include "perl.h" #include "XSUB.h" ! static SV *freezer; ! static SV *toaster; static I32 num_q _((char *s, STRLEN slen)); static I32 esc_q _((char *dest, char *src, STRLEN slen)); --- 2,20 ---- #include "perl.h" #include "XSUB.h" ! #include "patchlevel.h" ! ! #if PATCHLEVEL < 5 ! # ifndef PL_sv_undef ! # define PL_sv_undef sv_undef ! # endif ! # ifndef ERRSV ! # define ERRSV GvSV(errgv) ! # endif ! # ifndef newSVpvn ! # define newSVpvn newSVpv ! # endif ! #endif static I32 num_q _((char *s, STRLEN slen)); static I32 esc_q _((char *dest, char *src, STRLEN slen)); *************** *** 84,90 **** sv_x(SV *sv, register char *str, STRLEN len, I32 n) { if (sv == Nullsv) ! sv = newSVpv("", 0); else assert(SvTYPE(sv) >= SVt_PV); --- 95,101 ---- sv_x(SV *sv, register char *str, STRLEN len, I32 n) { if (sv == Nullsv) ! sv = newSVpvn("", 0); else assert(SvTYPE(sv) >= SVt_PV); *************** *** 121,131 **** U32 i; char *c, *r, *realpack, id[128]; SV **svp; ! SV *sv; SV *blesspad = Nullsv; ! SV *ipad; ! SV *ival; ! AV *seenentry; char *iname; STRLEN inamelen, idlen = 0; U32 flags; --- 132,140 ---- U32 i; char *c, *r, *realpack, id[128]; SV **svp; ! SV *sv, *ipad, *ival; SV *blesspad = Nullsv; ! AV *seenentry = Nullav; char *iname; STRLEN inamelen, idlen = 0; U32 flags; *************** *** 139,148 **** if (SvGMAGICAL(val)) mg_get(val); - if (val == &PL_sv_undef || !SvOK(val)) { - sv_catpvn(retval, "undef", 5); - return 1; - } if (SvROK(val)) { if (SvOBJECT(SvRV(val)) && freezer && --- 148,153 ---- *************** *** 152,160 **** XPUSHs(val); PUTBACK; i = perl_call_method(SvPVX(freezer), G_EVAL|G_SCALAR); SPAGAIN; ! if (SvTRUE(GvSV(PL_errgv))) warn("WARNING(Freezer method call failed): %s", ! SvPVX(GvSV(PL_errgv))); else if (i) val = newSVsv(POPs); PUTBACK; FREETMPS; LEAVE; --- 157,165 ---- XPUSHs(val); PUTBACK; i = perl_call_method(SvPVX(freezer), G_EVAL|G_SCALAR); SPAGAIN; ! if (SvTRUE(ERRSV)) warn("WARNING(Freezer method call failed): %s", ! SvPVX(ERRSV)); else if (i) val = newSVsv(POPs); PUTBACK; FREETMPS; LEAVE; *************** *** 171,237 **** realpack = HvNAME(SvSTASH(ival)); else realpack = Nullch; ! if ((svp = hv_fetch(seenhv, id, idlen, FALSE)) && ! (sv = *svp) && SvROK(sv) && ! (seenentry = (AV*)SvRV(sv))) { ! SV *othername; ! if ((svp = av_fetch(seenentry, 0, FALSE)) && (othername = *svp)) { ! if (purity && *levelp > 0) { ! SV *postentry; ! ! if (realtype == SVt_PVHV) ! sv_catpvn(retval, "{}", 2); ! else if (realtype == SVt_PVAV) ! sv_catpvn(retval, "[]", 2); ! else ! sv_catpvn(retval, "''", 2); ! postentry = newSVpv(name, namelen); ! sv_catpvn(postentry, " = ", 3); ! sv_catsv(postentry, othername); ! av_push(postav, postentry); ! } ! else { ! if (name[0] == '@' || name[0] == '%') { ! if ((SvPVX(othername))[0] == '\\' && ! (SvPVX(othername))[1] == name[0]) { ! sv_catpvn(retval, SvPVX(othername)+1, SvCUR(othername)-1); } ! else { ! sv_catpvn(retval, name, 1); ! sv_catpvn(retval, "{", 1); sv_catsv(retval, othername); - sv_catpvn(retval, "}", 1); - } } ! else ! sv_catsv(retval, othername); } - return 1; - } - else { - warn("ref name not found for %s", id); - return 0; - } - } - else { /* store our name and continue */ - SV *namesv; - if (name[0] == '@' || name[0] == '%') { - namesv = newSVpv("\\", 1); - sv_catpvn(namesv, name, namelen); } ! else if (realtype == SVt_PVCV && name[0] == '*') { ! namesv = newSVpv("\\", 2); ! sv_catpvn(namesv, name, namelen); ! (SvPVX(namesv))[1] = '&'; } - else - namesv = newSVpv(name, namelen); - seenentry = newAV(); - av_push(seenentry, namesv); - (void)SvREFCNT_inc(val); - av_push(seenentry, val); - (void)hv_store(seenhv, id, strlen(id), newRV((SV*)seenentry), 0); - SvREFCNT_dec(seenentry); } (*levelp)++; --- 176,252 ---- realpack = HvNAME(SvSTASH(ival)); else realpack = Nullch; ! ! /* if it has a name, we need to either look it up, or keep a tab ! * on it so we know when we hit it later ! */ ! if (namelen) { ! if ((svp = hv_fetch(seenhv, id, idlen, FALSE)) ! && (sv = *svp) && SvROK(sv) && (seenentry = (AV*)SvRV(sv))) ! { ! SV *othername; ! if ((svp = av_fetch(seenentry, 0, FALSE)) ! && (othername = *svp)) ! { ! if (purity && *levelp > 0) { ! SV *postentry; ! ! if (realtype == SVt_PVHV) ! sv_catpvn(retval, "{}", 2); ! else if (realtype == SVt_PVAV) ! sv_catpvn(retval, "[]", 2); ! else ! sv_catpvn(retval, "''", 2); ! postentry = newSVpvn(name, namelen); ! sv_catpvn(postentry, " = ", 3); ! sv_catsv(postentry, othername); ! av_push(postav, postentry); ! } ! else { ! if (name[0] == '@' || name[0] == '%') { ! if ((SvPVX(othername))[0] == '\\' && ! (SvPVX(othername))[1] == name[0]) { ! sv_catpvn(retval, SvPVX(othername)+1, ! SvCUR(othername)-1); ! } ! else { ! sv_catpvn(retval, name, 1); ! sv_catpvn(retval, "{", 1); ! sv_catsv(retval, othername); ! sv_catpvn(retval, "}", 1); ! } } ! else sv_catsv(retval, othername); } ! return 1; ! } ! else { ! warn("ref name not found for %s", id); ! return 0; } } ! else { /* store our name and continue */ ! SV *namesv; ! if (name[0] == '@' || name[0] == '%') { ! namesv = newSVpvn("\\", 1); ! sv_catpvn(namesv, name, namelen); ! } ! else if (realtype == SVt_PVCV && name[0] == '*') { ! namesv = newSVpvn("\\", 2); ! sv_catpvn(namesv, name, namelen); ! (SvPVX(namesv))[1] = '&'; ! } ! else ! namesv = newSVpvn(name, namelen); ! seenentry = newAV(); ! av_push(seenentry, namesv); ! (void)SvREFCNT_inc(val); ! av_push(seenentry, val); ! (void)hv_store(seenhv, id, strlen(id), ! newRV((SV*)seenentry), 0); ! SvREFCNT_dec(seenentry); } } (*levelp)++; *************** *** 249,268 **** } } ! if (realtype <= SVt_PVBM || realtype == SVt_PVGV) { /* scalars */ ! if (realpack && realtype != SVt_PVGV) { /* blessed */ sv_catpvn(retval, "do{\\(my $o = ", 13); ! DD_dump(ival, "", 0, retval, seenhv, postav, ! levelp, indent, pad, xpad, apad, sep, freezer, toaster, purity, deepcopy, quotekeys, bless); sv_catpvn(retval, ")}", 2); ! } else { sv_catpvn(retval, "\\", 1); ! DD_dump(ival, "", 0, retval, seenhv, postav, ! levelp, indent, pad, xpad, apad, sep, freezer, toaster, purity, deepcopy, quotekeys, bless); } } else if (realtype == SVt_PVAV) { SV *totpad; --- 264,297 ---- } } ! if (realtype <= SVt_PVBM) { /* scalar ref */ ! SV *namesv = newSVpvn("${", 2); ! sv_catpvn(namesv, name, namelen); ! sv_catpvn(namesv, "}", 1); ! if (realpack) { /* blessed */ sv_catpvn(retval, "do{\\(my $o = ", 13); ! DD_dump(ival, SvPVX(namesv), SvCUR(namesv), retval, seenhv, ! postav, levelp, indent, pad, xpad, apad, sep, freezer, toaster, purity, deepcopy, quotekeys, bless); sv_catpvn(retval, ")}", 2); ! } /* plain */ else { sv_catpvn(retval, "\\", 1); ! DD_dump(ival, SvPVX(namesv), SvCUR(namesv), retval, seenhv, ! postav, levelp, indent, pad, xpad, apad, sep, freezer, toaster, purity, deepcopy, quotekeys, bless); } + SvREFCNT_dec(namesv); + } + else if (realtype == SVt_PVGV) { /* glob ref */ + SV *namesv = newSVpvn("*{", 2); + sv_catpvn(namesv, name, namelen); + sv_catpvn(namesv, "}", 1); + sv_catpvn(retval, "\\", 1); + DD_dump(ival, SvPVX(namesv), SvCUR(namesv), retval, seenhv, + postav, levelp, indent, pad, xpad, apad, sep, + freezer, toaster, purity, deepcopy, quotekeys, bless); + SvREFCNT_dec(namesv); } else if (realtype == SVt_PVAV) { SV *totpad; *************** *** 280,286 **** } else { sv_catpvn(retval, "[", 1); ! if (namelen > 0 && name[namelen-1] != ']' && name[namelen-1] != '}') { iname[inamelen++] = '-'; iname[inamelen++] = '>'; iname[inamelen] = '\0'; } --- 309,324 ---- } else { sv_catpvn(retval, "[", 1); ! /* omit "->" in $foo{bar}->[0], but not in ${$foo}->[0] */ ! /*if (namelen > 0 ! && name[namelen-1] != ']' && name[namelen-1] != '}' ! && (namelen < 4 || (name[1] != '{' && name[2] != '{')))*/ ! if ((namelen > 0 ! && name[namelen-1] != ']' && name[namelen-1] != '}') ! || (namelen > 4 ! && (name[1] == '{' ! || (name[0] == '\\' && name[2] == '{')))) ! { iname[inamelen++] = '-'; iname[inamelen++] = '>'; iname[inamelen] = '\0'; } *************** *** 346,359 **** I32 klen; SV *hval; ! iname = newSVpv(name, namelen); if (name[0] == '%') { sv_catpvn(retval, "(", 1); (SvPVX(iname))[0] = '$'; } else { sv_catpvn(retval, "{", 1); ! if (namelen > 0 && name[namelen-1] != ']' && name[namelen-1] != '}') { sv_catpvn(iname, "->", 2); } } --- 384,403 ---- I32 klen; SV *hval; ! iname = newSVpvn(name, namelen); if (name[0] == '%') { sv_catpvn(retval, "(", 1); (SvPVX(iname))[0] = '$'; } else { sv_catpvn(retval, "{", 1); ! /* omit "->" in $foo[0]->{bar}, but not in ${$foo}->{bar} */ ! if ((namelen > 0 ! && name[namelen-1] != ']' && name[namelen-1] != '}') ! || (namelen > 4 ! && (name[1] == '{' ! || (name[0] == '\\' && name[2] == '{')))) ! { sv_catpvn(iname, "->", 2); } } *************** *** 472,504 **** (void) sprintf(id, "0x%lx", (unsigned long)val); if ((svp = hv_fetch(seenhv, id, (idlen = strlen(id)), FALSE)) && (sv = *svp) && SvROK(sv) && ! (seenentry = (AV*)SvRV(sv))) { SV *othername; ! if ((svp = av_fetch(seenentry, 0, FALSE)) && (othername = *svp)) { sv_catsv(retval, othername); return 1; } } else { SV *namesv; ! namesv = newSVpv("\\", 1); sv_catpvn(namesv, name, namelen); seenentry = newAV(); av_push(seenentry, namesv); ! (void)SvREFCNT_inc(val); ! av_push(seenentry, val); (void)hv_store(seenhv, id, strlen(id), newRV((SV*)seenentry), 0); SvREFCNT_dec(seenentry); } } ! if (SvIOK(val)) { STRLEN len; i = SvIV(val); (void) sprintf(tmpbuf, "%d", i); len = strlen(tmpbuf); sv_catpvn(retval, tmpbuf, len); - return 1; } else if (realtype == SVt_PVGV) {/* GLOBs can end up with scribbly names */ c = SvPV(val, i); --- 516,551 ---- (void) sprintf(id, "0x%lx", (unsigned long)val); if ((svp = hv_fetch(seenhv, id, (idlen = strlen(id)), FALSE)) && (sv = *svp) && SvROK(sv) && ! (seenentry = (AV*)SvRV(sv))) ! { SV *othername; ! if ((svp = av_fetch(seenentry, 0, FALSE)) && (othername = *svp) ! && (svp = av_fetch(seenentry, 2, FALSE)) && *svp && SvIV(*svp) > 0) ! { ! sv_catpvn(retval, "${", 2); sv_catsv(retval, othername); + sv_catpvn(retval, "}", 1); return 1; } } else { SV *namesv; ! namesv = newSVpvn("\\", 1); sv_catpvn(namesv, name, namelen); seenentry = newAV(); av_push(seenentry, namesv); ! av_push(seenentry, newRV(val)); (void)hv_store(seenhv, id, strlen(id), newRV((SV*)seenentry), 0); SvREFCNT_dec(seenentry); } } ! if (SvIOK(val)) { STRLEN len; i = SvIV(val); (void) sprintf(tmpbuf, "%d", i); len = strlen(tmpbuf); sv_catpvn(retval, tmpbuf, len); } else if (realtype == SVt_PVGV) {/* GLOBs can end up with scribbly names */ c = SvPV(val, i); *************** *** 522,542 **** r[0] = '*'; strcpy(r+1, c); i++; } if (purity) { static char *entries[] = { "{SCALAR}", "{ARRAY}", "{HASH}" }; static STRLEN sizes[] = { 8, 7, 6 }; SV *e; ! SV *nname = newSVpv("", 0); ! SV *newapad = newSVpv("", 0); GV *gv = (GV*)val; I32 j; for (j=0; j<3; j++) { e = ((j == 0) ? GvSV(gv) : (j == 1) ? (SV*)GvAV(gv) : (SV*)GvHV(gv)); ! if (e) { I32 nlevel = 0; ! SV *postentry = newSVpv(r,i); sv_setsv(nname, postentry); sv_catpvn(nname, entries[j], sizes[j]); --- 569,595 ---- r[0] = '*'; strcpy(r+1, c); i++; } + SvCUR_set(retval, SvCUR(retval)+i); if (purity) { static char *entries[] = { "{SCALAR}", "{ARRAY}", "{HASH}" }; static STRLEN sizes[] = { 8, 7, 6 }; SV *e; ! SV *nname = newSVpvn("", 0); ! SV *newapad = newSVpvn("", 0); GV *gv = (GV*)val; I32 j; for (j=0; j<3; j++) { e = ((j == 0) ? GvSV(gv) : (j == 1) ? (SV*)GvAV(gv) : (SV*)GvHV(gv)); ! if (!e) ! continue; ! if (j == 0 && !SvOK(e)) ! continue; ! ! { I32 nlevel = 0; ! SV *postentry = newSVpvn(r,i); sv_setsv(nname, postentry); sv_catpvn(nname, entries[j], sizes[j]); *************** *** 560,565 **** --- 613,621 ---- SvREFCNT_dec(nname); } } + else if (val == &PL_sv_undef || !SvOK(val)) { + sv_catpvn(retval, "undef", 5); + } else { c = SvPV(val, i); sv_grow(retval, SvCUR(retval)+3+2*i); *************** *** 569,581 **** ++i; r[i++] = '\''; r[i] = '\0'; } - SvCUR_set(retval, SvCUR(retval)+i); } ! if (deepcopy && idlen) ! (void)hv_delete(seenhv, id, idlen, G_DISCARD); ! return 1; } --- 625,642 ---- ++i; r[i++] = '\''; r[i] = '\0'; + SvCUR_set(retval, SvCUR(retval)+i); } } ! if (idlen) { ! if (deepcopy) ! (void)hv_delete(seenhv, id, idlen, G_DISCARD); ! else if (namelen && seenentry) { ! SV *mark = *av_fetch(seenentry, 2, TRUE); ! sv_setiv(mark,1); ! } ! } return 1; } *************** *** 647,653 **** terse = useqq = purity = deepcopy = 0; quotekeys = 1; ! retval = newSVpv("", 0); if (SvROK(href) && (hv = (HV*)SvRV((SV*)href)) && SvTYPE(hv) == SVt_PVHV) { --- 708,714 ---- terse = useqq = purity = deepcopy = 0; quotekeys = 1; ! retval = newSVpvn("", 0); if (SvROK(href) && (hv = (HV*)SvRV((SV*)href)) && SvTYPE(hv) == SVt_PVHV) { *************** *** 692,698 **** imax = av_len(todumpav); else imax = -1; ! valstr = newSVpv("",0); for (i = 0; i <= imax; ++i) { SV *newapad; --- 753,759 ---- imax = av_len(todumpav); else imax = -1; ! valstr = newSVpvn("",0); for (i = 0; i <= imax; ++i) { SV *newapad; *************** *** 787,793 **** if (gimme == G_ARRAY) { XPUSHs(sv_2mortal(retval)); if (i < imax) /* not the last time thro ? */ ! retval = newSVpv("",0); } } SvREFCNT_dec(postav); --- 848,854 ---- if (gimme == G_ARRAY) { XPUSHs(sv_2mortal(retval)); if (i < imax) /* not the last time thro ? */ ! retval = newSVpvn("",0); } } SvREFCNT_dec(postav); diff -c 'perl5.005_02/ext/Data/Dumper/Makefile.PL' 'perl5.005_03/ext/Data/Dumper/Makefile.PL' Index: ./ext/Data/Dumper/Makefile.PL *** ./ext/Data/Dumper/Makefile.PL Thu Jul 23 23:00:04 1998 --- ./ext/Data/Dumper/Makefile.PL Thu Nov 26 20:12:18 1998 *************** *** 7,11 **** SUFFIX => 'gz', DIST_DEFAULT => 'all tardist', }, ! MAN3PODS => ' ', ); --- 7,11 ---- SUFFIX => 'gz', DIST_DEFAULT => 'all tardist', }, ! MAN3PODS => {}, ); diff -c 'perl5.005_02/ext/Data/Dumper/Todo' 'perl5.005_03/ext/Data/Dumper/Todo' Index: ./ext/Data/Dumper/Todo *** ./ext/Data/Dumper/Todo Thu Jul 23 23:00:04 1998 --- ./ext/Data/Dumper/Todo Thu Nov 26 21:43:15 1998 *************** *** 29,32 **** --- 29,34 ---- =item Implement redesign that allows various backends (Perl, Lisp, some-binary-data-format, graph-description-languages, etc.) + =item Dump traversal in breadth-first order + =back diff -c 'perl5.005_02/ext/DynaLoader/DynaLoader_pm.PL' 'perl5.005_03/ext/DynaLoader/DynaLoader_pm.PL' Index: ./ext/DynaLoader/DynaLoader_pm.PL *** ./ext/DynaLoader/DynaLoader_pm.PL Thu Jul 23 23:00:04 1998 --- ./ext/DynaLoader/DynaLoader_pm.PL Sat Oct 31 21:19:56 1998 *************** *** 101,107 **** # No prizes for guessing why we don't say 'bootstrap DynaLoader;' here. ! boot_DynaLoader('DynaLoader') if defined(&boot_DynaLoader); if ($dl_debug) { --- 101,108 ---- # No prizes for guessing why we don't say 'bootstrap DynaLoader;' here. ! boot_DynaLoader('DynaLoader') if defined(&boot_DynaLoader) && ! !defined(&dl_load_file); if ($dl_debug) { diff -c 'perl5.005_02/ext/DynaLoader/Makefile.PL' 'perl5.005_03/ext/DynaLoader/Makefile.PL' Index: ./ext/DynaLoader/Makefile.PL *** ./ext/DynaLoader/Makefile.PL Thu Jul 23 23:00:04 1998 --- ./ext/DynaLoader/Makefile.PL Thu Nov 26 20:12:26 1998 *************** *** 4,10 **** NAME => 'DynaLoader', LINKTYPE => 'static', DEFINE => '-DPERL_CORE -DLIBC="$(LIBC)"', ! MAN3PODS => ' ', # Pods will be built by installman. SKIP => [qw(dynamic dynamic_lib dynamic_bs)], XSPROTOARG => '-noprototypes', # XXX remove later? VERSION_FROM => 'DynaLoader_pm.PL', --- 4,10 ---- NAME => 'DynaLoader', LINKTYPE => 'static', DEFINE => '-DPERL_CORE -DLIBC="$(LIBC)"', ! MAN3PODS => {}, # Pods will be built by installman. SKIP => [qw(dynamic dynamic_lib dynamic_bs)], XSPROTOARG => '-noprototypes', # XXX remove later? VERSION_FROM => 'DynaLoader_pm.PL', diff -c /dev/null 'perl5.005_03/ext/DynaLoader/dl_beos.xs' Index: ext/DynaLoader/dl_beos.xs *** ext/DynaLoader/dl_beos.xs Wed Dec 31 18:00:00 1969 --- ext/DynaLoader/dl_beos.xs Thu Mar 4 18:34:11 1999 *************** *** 0 **** --- 1,115 ---- + /* + * dl_beos.xs, by Tom Spindler + * based on dl_dlopen.xs, by Paul Marquess + * $Id:$ + */ + + #include "EXTERN.h" + #include "perl.h" + #include "XSUB.h" + + #include + #include + #include + #include + + #define dlerror() strerror(errno) + + #include "dlutils.c" /* SaveError() etc */ + + static void + dl_private_init() + { + (void)dl_generic_private_init(); + } + + MODULE = DynaLoader PACKAGE = DynaLoader + + BOOT: + (void)dl_private_init(); + + + void * + dl_load_file(filename, flags=0) + char * filename + int flags + CODE: + { image_id bogo; + char *path; + path = malloc(PATH_MAX); + if (*filename != '/') { + getcwd(path, PATH_MAX); + strcat(path, "/"); + strcat(path, filename); + } else { + strcpy(path, filename); + } + + DLDEBUG(1,PerlIO_printf(PerlIO_stderr(), "dl_load_file(%s,%x):\n", path, flags)); + bogo = load_add_on(path); + DLDEBUG(2,PerlIO_printf(PerlIO_stderr(), " libref=%lx\n", (unsigned long) RETVAL)); + ST(0) = sv_newmortal() ; + if (bogo < 0) { + SaveError("%s", strerror(bogo)); + PerlIO_printf(PerlIO_stderr(), "load_add_on(%s) : %d (%s)\n", path, bogo, strerror(bogo)); + } else { + RETVAL = (void *) bogo; + sv_setiv( ST(0), (IV)RETVAL); + } + free(path); + } + + void * + dl_find_symbol(libhandle, symbolname) + void * libhandle + char * symbolname + CODE: + status_t retcode; + void *adr = 0; + #ifdef DLSYM_NEEDS_UNDERSCORE + symbolname = form("_%s", symbolname); + #endif + RETVAL = NULL; + DLDEBUG(2, PerlIO_printf(PerlIO_stderr(), + "dl_find_symbol(handle=%lx, symbol=%s)\n", + (unsigned long) libhandle, symbolname)); + retcode = get_image_symbol((image_id) libhandle, symbolname, + B_SYMBOL_TYPE_TEXT, (void **) &adr); + RETVAL = adr; + DLDEBUG(2, PerlIO_printf(PerlIO_stderr(), + " symbolref = %lx\n", (unsigned long) RETVAL)); + ST(0) = sv_newmortal() ; + if (RETVAL == NULL) { + SaveError("%s", strerror(retcode)) ; + PerlIO_printf(PerlIO_stderr(), "retcode = %p (%s)\n", retcode, strerror(retcode)); + } else + sv_setiv( ST(0), (IV)RETVAL); + + + void + dl_undef_symbols() + PPCODE: + + + + # These functions should not need changing on any platform: + + void + dl_install_xsub(perl_name, symref, filename="$Package") + char * perl_name + void * symref + char * filename + CODE: + DLDEBUG(2,PerlIO_printf(PerlIO_stderr(), "dl_install_xsub(name=%s, symref=%lx)\n", + perl_name, (unsigned long) symref)); + ST(0)=sv_2mortal(newRV((SV*)newXS(perl_name, (void(*)_((CV *)))symref, filename))); + + + char * + dl_error() + CODE: + RETVAL = LastError ; + OUTPUT: + RETVAL + + # end. diff -c 'perl5.005_02/ext/DynaLoader/dl_cygwin32.xs' 'perl5.005_03/ext/DynaLoader/dl_cygwin32.xs' Index: ./ext/DynaLoader/dl_cygwin32.xs *** ./ext/DynaLoader/dl_cygwin32.xs Thu Jul 23 23:00:05 1998 --- ./ext/DynaLoader/dl_cygwin32.xs Thu Mar 4 18:34:11 1999 *************** *** 82,92 **** int flags PREINIT: CODE: ! DLDEBUG(1,fprintf(stderr,"dl_load_file(%s):\n", filename)); RETVAL = (void*) LoadLibraryExA(filename, NULL, LOAD_WITH_ALTERED_SEARCH_PATH ) ; ! DLDEBUG(2,fprintf(stderr," libref=%x\n", RETVAL)); ST(0) = sv_newmortal() ; if (RETVAL == NULL){ SaveError("%d",GetLastError()) ; --- 82,92 ---- int flags PREINIT: CODE: ! DLDEBUG(1,PerlIO_printf(PerlIO_stderr(),"dl_load_file(%s):\n", filename)); RETVAL = (void*) LoadLibraryExA(filename, NULL, LOAD_WITH_ALTERED_SEARCH_PATH ) ; ! DLDEBUG(2,PerlIO_printf(PerlIO_stderr()," libref=%x\n", RETVAL)); ST(0) = sv_newmortal() ; if (RETVAL == NULL){ SaveError("%d",GetLastError()) ; *************** *** 113,122 **** void * libhandle char * symbolname CODE: ! DLDEBUG(2,fprintf(stderr,"dl_find_symbol(handle=%x, symbol=%s)\n", libhandle, symbolname)); RETVAL = (void*) GetProcAddress((HINSTANCE) libhandle, symbolname); ! DLDEBUG(2,fprintf(stderr," symbolref = %x\n", RETVAL)); ST(0) = sv_newmortal() ; if (RETVAL == NULL) SaveError("%d",GetLastError()) ; --- 113,122 ---- void * libhandle char * symbolname CODE: ! DLDEBUG(2,PerlIO_printf(PerlIO_stderr(),"dl_find_symbol(handle=%x, symbol=%s)\n", libhandle, symbolname)); RETVAL = (void*) GetProcAddress((HINSTANCE) libhandle, symbolname); ! DLDEBUG(2,PerlIO_printf(PerlIO_stderr()," symbolref = %x\n", RETVAL)); ST(0) = sv_newmortal() ; if (RETVAL == NULL) SaveError("%d",GetLastError()) ; *************** *** 138,144 **** void * symref char * filename CODE: ! DLDEBUG(2,fprintf(stderr,"dl_install_xsub(name=%s, symref=%x)\n", perl_name, symref)); ST(0)=sv_2mortal(newRV((SV*)newXS(perl_name, (void(*)())symref, filename))); --- 138,144 ---- void * symref char * filename CODE: ! DLDEBUG(2,PerlIO_printf(PerlIO_stderr(),"dl_install_xsub(name=%s, symref=%x)\n", perl_name, symref)); ST(0)=sv_2mortal(newRV((SV*)newXS(perl_name, (void(*)())symref, filename))); diff -c 'perl5.005_02/ext/DynaLoader/dl_mpeix.xs' 'perl5.005_03/ext/DynaLoader/dl_mpeix.xs' Index: ./ext/DynaLoader/dl_mpeix.xs *** ./ext/DynaLoader/dl_mpeix.xs Thu Jul 23 23:00:05 1998 --- ./ext/DynaLoader/dl_mpeix.xs Thu Nov 26 18:23:10 1998 *************** *** 2,7 **** --- 2,8 ---- * Author: Mark Klein (mklein@dis.com) * Version: 2.1, 1996/07/25 * Version: 2.2, 1997/09/25 Mark Bixby (markb@cccd.edu) + * Version: 2.3, 1998/11/19 Mark Bixby (markb@cccd.edu) */ #include "EXTERN.h" *************** *** 59,71 **** ",filename); obj = (p_mpe_dld) safemalloc(sizeof(t_mpe_dld)); memzero(obj, sizeof(t_mpe_dld)); ! if (filename[0] == '.') { getcwd(buf,sizeof(buf)); ! sprintf(obj->filename,"$%s/%s$",buf,filename); } else ! sprintf(obj->filename,"$%s$",filename); DLDEBUG(2,PerlIO_printf(PerlIO_stderr()," libref=%x\n", obj)); --- 60,72 ---- ",filename); obj = (p_mpe_dld) safemalloc(sizeof(t_mpe_dld)); memzero(obj, sizeof(t_mpe_dld)); ! if (filename[0] != '/') { getcwd(buf,sizeof(buf)); ! sprintf(obj->filename," %s/%s ",buf,filename); } else ! sprintf(obj->filename," %s ",filename); DLDEBUG(2,PerlIO_printf(PerlIO_stderr()," libref=%x\n", obj)); *************** *** 90,100 **** ST(0) = sv_newmortal() ; errno = 0; ! sprintf(symname, "$%s$", symbolname); HPGETPROCPLABEL(8, symname, &symaddr, &status, obj->filename, 1, 0, &datalen, 1, 0, 0); ! DLDEBUG(2,PerlIO_printf(PerlIO_stderr()," symbolref(PROCEDURE) = %x\n", symaddr)); if (status != 0) { SaveError("%s",(errno) ? Strerror(errno) : "Symbol not found") ; --- 91,101 ---- ST(0) = sv_newmortal() ; errno = 0; ! sprintf(symname, " %s ", symbolname); HPGETPROCPLABEL(8, symname, &symaddr, &status, obj->filename, 1, 0, &datalen, 1, 0, 0); ! DLDEBUG(2,PerlIO_printf(PerlIO_stderr()," symbolref(PROCEDURE) = %x, status=%x\n", symaddr, status)); if (status != 0) { SaveError("%s",(errno) ? Strerror(errno) : "Symbol not found") ; diff -c 'perl5.005_02/ext/DynaLoader/dl_next.xs' 'perl5.005_03/ext/DynaLoader/dl_next.xs' Index: ./ext/DynaLoader/dl_next.xs *** ./ext/DynaLoader/dl_next.xs Thu Jul 23 23:00:05 1998 --- ./ext/DynaLoader/dl_next.xs Wed Dec 30 11:08:09 1998 *************** *** 172,177 **** --- 172,178 ---- I32 i, psize; char *result; char **p; + STRLEN n_a; /* Do not load what is already loaded into this process */ if (hv_fetch(dl_loaded_files, path, strlen(path), 0)) *************** *** 182,188 **** p = (char **) safemalloc(psize * sizeof(char*)); p[0] = path; for(i=1; icatfile(File::Spec->updir, + File::Spec->updir, + "cppstdin"); + my $cppstdin_is_wrapper = + ($cppstdin eq 'cppstdin' + and -f $upup_cppstdin + and -x $upup_cppstdin); + $cppstdin = $upup_cppstdin if $cppstdin_is_wrapper; + } + return "$cppstdin $Config{cppflags} $Config{cppminus}"; + } + sub get_files { my %file = (); # VMS keeps its include files in system libraries (well, except for Gcc) *************** *** 56,61 **** --- 76,84 ---- } elsif ($^O eq 'os390') { # OS/390 C compiler doesn't generate #file or #line directives $file{'/usr/include/errno.h'} = 1; + } elsif ($^O eq 'vmesa') { + # OS/390 C compiler doesn't generate #file or #line directives + $file{'../../vmesa/errno.h'} = 1; } else { open(CPPI,"> errno.c") or die "Cannot open errno.c"; *************** *** 65,73 **** 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) { --- 88,101 ---- close(CPPI); # invoke CPP and read the output ! if ($^O eq 'MSWin32') { ! open(CPPO,"$Config{cpprun} $Config{cppflags} errno.c |") or ! die "Cannot run '$Config{cpprun} $Config{cppflags} errno.c'"; ! } else { ! my $cpp = default_cpp(); ! open(CPPO,"$cpp < errno.c |") or ! die "Cannot exec $cpp"; ! } my $pat; if ($^O eq 'MSWin32' and $Config{cc} =~ /^bcc/i) { *************** *** 77,83 **** $pat = '^#(?:line)?\s*\d+\s+"([^"]+)"'; } while() { ! $file{$1} = 1 if /$pat/o; } close(CPPO); } --- 105,120 ---- $pat = '^#(?:line)?\s*\d+\s+"([^"]+)"'; } while() { ! if ($^O eq 'os2' or $^O eq 'MSWin32') { ! if (/$pat/o) { ! my $f = $1; ! $f =~ s,\\\\,/,g; ! $file{$f} = 1; ! } ! } ! else { ! $file{$1} = 1 if /$pat/o; ! } } close(CPPO); } *************** *** 87,92 **** --- 124,133 ---- sub write_errno_pm { my $err; + # quick sanity check + + die "No error definitions found" unless keys %err; + # create the CPP input open(CPPI,"> errno.c") or *************** *** 107,120 **** $cpp =~ s/sys\$input//i; open(CPPO,"$cpp errno.c |") or die "Cannot exec $Config{cppstdin}"; ! } elsif(!$Config{'cpprun'} or $^O eq 'next') { ! # NeXT will do syntax checking unless it is reading from stdin ! my $cpp = "$Config{cppstdin} $Config{cppflags} $Config{cppminus}"; open(CPPO,"$cpp < errno.c |") or die "Cannot exec $cpp"; - } else { - open(CPPO,"$Config{cpprun} $Config{cppflags} errno.c |") or - die "Cannot exec $Config{cpprun}"; } %err = (); --- 148,160 ---- $cpp =~ s/sys\$input//i; open(CPPO,"$cpp errno.c |") or die "Cannot exec $Config{cppstdin}"; ! } elsif ($^O eq 'MSWin32') { ! open(CPPO,"$Config{cpprun} $Config{cppflags} errno.c |") or ! die "Cannot run '$Config{cpprun} $Config{cppflags} errno.c'"; ! } else { ! my $cpp = default_cpp(); open(CPPO,"$cpp < errno.c |") or die "Cannot exec $cpp"; } %err = (); diff -c 'perl5.005_02/ext/Errno/Makefile.PL' 'perl5.005_03/ext/Errno/Makefile.PL' Index: ./ext/Errno/Makefile.PL *** ./ext/Errno/Makefile.PL Thu Jul 23 23:00:06 1998 --- ./ext/Errno/Makefile.PL Thu Nov 26 20:12:33 1998 *************** *** 1,10 **** 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'}, --- 1,11 ---- use ExtUtils::MakeMaker; ! @VMS = ($^O eq 'VMS') ? (MAN3PODS => {}) : (); WriteMakefile( NAME => 'Errno', VERSION_FROM => 'Errno_pm.PL', + MAN3PODS => {}, # Pods will be built by installman. PL_FILES => {'Errno_pm.PL'=>'Errno.pm'}, PM => {'Errno.pm' => '$(INST_LIBDIR)/Errno.pm'}, 'clean' => {FILES => 'Errno.pm'}, diff -c 'perl5.005_02/ext/Fcntl/Makefile.PL' 'perl5.005_03/ext/Fcntl/Makefile.PL' Index: ./ext/Fcntl/Makefile.PL *** ./ext/Fcntl/Makefile.PL Thu Jul 23 23:00:06 1998 --- ./ext/Fcntl/Makefile.PL Thu Nov 26 20:12:40 1998 *************** *** 1,7 **** use ExtUtils::MakeMaker; WriteMakefile( NAME => 'Fcntl', ! MAN3PODS => ' ', # Pods will be built by installman. XSPROTOARG => '-noprototypes', # XXX remove later? VERSION_FROM => 'Fcntl.pm', ); --- 1,7 ---- use ExtUtils::MakeMaker; WriteMakefile( NAME => 'Fcntl', ! MAN3PODS => {}, # Pods will be built by installman. XSPROTOARG => '-noprototypes', # XXX remove later? VERSION_FROM => 'Fcntl.pm', ); diff -c 'perl5.005_02/ext/GDBM_File/Makefile.PL' 'perl5.005_03/ext/GDBM_File/Makefile.PL' Index: ./ext/GDBM_File/Makefile.PL *** ./ext/GDBM_File/Makefile.PL Thu Jul 23 23:00:06 1998 --- ./ext/GDBM_File/Makefile.PL Thu Nov 26 20:12:45 1998 *************** *** 2,8 **** WriteMakefile( NAME => 'GDBM_File', LIBS => ["-L/usr/local/lib -lgdbm", "-ldbm"], ! MAN3PODS => ' ', # Pods will be built by installman. XSPROTOARG => '-noprototypes', # XXX remove later? VERSION_FROM => 'GDBM_File.pm', ); --- 2,8 ---- WriteMakefile( NAME => 'GDBM_File', LIBS => ["-L/usr/local/lib -lgdbm", "-ldbm"], ! MAN3PODS => {}, # Pods will be built by installman. XSPROTOARG => '-noprototypes', # XXX remove later? VERSION_FROM => 'GDBM_File.pm', ); diff -c /dev/null 'perl5.005_03/ext/GDBM_File/hints/sco.pl' Index: ext/GDBM_File/hints/sco.pl *** ext/GDBM_File/hints/sco.pl Wed Dec 31 18:00:00 1969 --- ext/GDBM_File/hints/sco.pl Thu Feb 11 18:05:47 1999 *************** *** 0 **** --- 1,2 ---- + # SCO OSR5 needs to link with libc.so again to have C defined + $self->{LIBS} = ['-lgdbm -lc']; diff -c 'perl5.005_02/ext/IO/IO.xs' 'perl5.005_03/ext/IO/IO.xs' Index: ./ext/IO/IO.xs *** ./ext/IO/IO.xs Thu Jul 23 23:00:06 1998 --- ./ext/IO/IO.xs Wed Dec 30 22:52:40 1998 *************** *** 111,117 **** SV * pos CODE: char *p; ! if (handle && (p = SvPVx(pos, PL_na)) && PL_na == sizeof(Fpos_t)) #ifdef PerlIO RETVAL = PerlIO_setpos(handle, (Fpos_t*)p); #else --- 111,118 ---- SV * pos CODE: char *p; ! STRLEN n_a; ! if (handle && (p = SvPVx(pos, n_a)) && n_a == sizeof(Fpos_t)) #ifdef PerlIO RETVAL = PerlIO_setpos(handle, (Fpos_t*)p); #else diff -c 'perl5.005_02/ext/IO/Makefile.PL' 'perl5.005_03/ext/IO/Makefile.PL' Index: ./ext/IO/Makefile.PL *** ./ext/IO/Makefile.PL Thu Jul 23 23:00:06 1998 --- ./ext/IO/Makefile.PL Thu Nov 26 20:12:51 1998 *************** *** 1,7 **** use ExtUtils::MakeMaker; WriteMakefile( NAME => 'IO', ! MAN3PODS => ' ', # Pods will be built by installman. XSPROTOARG => '-noprototypes', # XXX remove later? VERSION_FROM => 'lib/IO/Handle.pm', XS_VERSION => 1.15 --- 1,7 ---- use ExtUtils::MakeMaker; WriteMakefile( NAME => 'IO', ! MAN3PODS => {}, # Pods will be built by installman. XSPROTOARG => '-noprototypes', # XXX remove later? VERSION_FROM => 'lib/IO/Handle.pm', XS_VERSION => 1.15 diff -c 'perl5.005_02/ext/IO/lib/IO/Pipe.pm' 'perl5.005_03/ext/IO/lib/IO/Pipe.pm' Index: ./ext/IO/lib/IO/Pipe.pm *** ./ext/IO/lib/IO/Pipe.pm Thu Jul 23 23:00:07 1998 --- ./ext/IO/lib/IO/Pipe.pm Wed Jan 13 20:55:53 1999 *************** *** 14,20 **** use Carp; use Symbol; ! $VERSION = "1.0901"; sub new { my $type = shift; --- 14,20 ---- use Carp; use Symbol; ! $VERSION = "1.0902"; sub new { my $type = shift; *************** *** 96,102 **** close ${*$me}[1]; bless $me, ref($fh); ! *{*$me} = *{*$fh}; # Alias self to handle bless $fh; # Really wan't un-bless here ${*$me}{'io_pipe_pid'} = $pid if defined $pid; --- 96,102 ---- close ${*$me}[1]; bless $me, ref($fh); ! *$me = *$fh; # Alias self to handle bless $fh; # Really wan't un-bless here ${*$me}{'io_pipe_pid'} = $pid if defined $pid; *************** *** 113,119 **** close ${*$me}[0]; bless $me, ref($fh); ! *{*$me} = *{*$fh}; # Alias self to handle bless $fh; # Really wan't un-bless here ${*$me}{'io_pipe_pid'} = $pid if defined $pid; --- 113,119 ---- close ${*$me}[0]; bless $me, ref($fh); ! *$me = *$fh; # Alias self to handle bless $fh; # Really wan't un-bless here ${*$me}{'io_pipe_pid'} = $pid if defined $pid; *************** *** 177,186 **** =head1 DESCRIPTION ! C provides an interface to createing pipes between processes. ! =head1 CONSTRCUTOR =over 4 --- 177,186 ---- =head1 DESCRIPTION ! C provides an interface to creating pipes between processes. ! =head1 CONSTRUCTOR =over 4 diff -c 'perl5.005_02/ext/IO/lib/IO/Seekable.pm' 'perl5.005_03/ext/IO/lib/IO/Seekable.pm' Index: ./ext/IO/lib/IO/Seekable.pm *** ./ext/IO/lib/IO/Seekable.pm Thu Jul 23 23:00:07 1998 --- ./ext/IO/lib/IO/Seekable.pm Tue Jan 5 20:18:27 1999 *************** *** 14,20 **** =head1 DESCRIPTION ! C does not have a constuctor of its own as is intended to be inherited by other C based objects. It provides methods which allow seeking of the file descriptors. --- 14,20 ---- =head1 DESCRIPTION ! C does not have a constructor of its own as it is intended to be inherited by other C based objects. It provides methods which allow seeking of the file descriptors. diff -c 'perl5.005_02/ext/IO/lib/IO/Socket.pm' 'perl5.005_03/ext/IO/lib/IO/Socket.pm' Index: ./ext/IO/lib/IO/Socket.pm *** ./ext/IO/lib/IO/Socket.pm Thu Jul 23 23:00:07 1998 --- ./ext/IO/lib/IO/Socket.pm Tue Jan 5 20:18:29 1999 *************** *** 664,670 **** =item peerpath() ! Returns the pathanme to the fifo at the peer end =back --- 664,670 ---- =item peerpath() ! Returns the pathname to the fifo at the peer end =back diff -c 'perl5.005_02/ext/IPC/SysV/Makefile.PL' 'perl5.005_03/ext/IPC/SysV/Makefile.PL' Index: ./ext/IPC/SysV/Makefile.PL Prereq: 1.3 *** ./ext/IPC/SysV/Makefile.PL Thu Jul 23 23:00:08 1998 --- ./ext/IPC/SysV/Makefile.PL Thu Nov 26 20:12:59 1998 *************** *** 22,27 **** --- 22,28 ---- WriteMakefile( VERSION_FROM => "SysV.pm", NAME => "IPC::SysV", + MAN3PODS => {}, # Pods will be built by installman. 'dist' => {COMPRESS => 'gzip -9f', SUFFIX => 'gz', diff -c 'perl5.005_02/ext/IPC/SysV/Msg.pm' 'perl5.005_03/ext/IPC/SysV/Msg.pm' Index: ./ext/IPC/SysV/Msg.pm *** ./ext/IPC/SysV/Msg.pm Thu Jul 23 23:00:08 1998 --- ./ext/IPC/SysV/Msg.pm Sun Nov 8 10:55:16 1998 *************** *** 84,90 **** } sub rcv { ! @_ == 5 || croak '$msg->rcv( BUF, LEN, TYPE, FLAGS )'; my $self = shift; my $buf = ""; msgrcv($$self,$buf,$_[1],$_[2] || 0, $_[3] || 0) or --- 84,90 ---- } sub rcv { ! @_ <= 5 && @_ >= 3 or croak '$msg->rcv( BUF, LEN, TYPE, FLAGS )'; my $self = shift; my $buf = ""; msgrcv($$self,$buf,$_[1],$_[2] || 0, $_[3] || 0) or *************** *** 95,101 **** } sub snd { ! @_ == 4 || croak '$msg->snd( TYPE, BUF, FLAGS )'; my $self = shift; msgsnd($$self,pack("L a*",$_[0],$_[1]), $_[2] || 0); } --- 95,101 ---- } sub snd { ! @_ <= 4 && @_ >= 3 or croak '$msg->snd( TYPE, BUF, FLAGS )'; my $self = shift; msgsnd($$self,pack("L a*",$_[0],$_[1]), $_[2] || 0); } diff -c 'perl5.005_02/ext/IPC/SysV/SysV.xs' 'perl5.005_03/ext/IPC/SysV/SysV.xs' Index: ./ext/IPC/SysV/SysV.xs *** ./ext/IPC/SysV/SysV.xs Tue Aug 4 21:30:03 1998 --- ./ext/IPC/SysV/SysV.xs Tue Feb 16 11:52:47 1999 *************** *** 4,35 **** #include #ifdef __linux__ ! #include #endif #if defined(HAS_MSG) || defined(HAS_SEM) || defined(HAS_SHM) ! #include ! #ifdef HAS_MSG ! #include #endif ! #ifdef HAS_SEM ! #include ! #endif ! #ifdef HAS_SHM ! #if defined(PERL_SCO5) || defined(PERL_ISC) ! #include ! #endif ! #include ! # ifndef HAS_SHMAT_PROTOTYPE ! extern Shmat_t shmat _((int, char *, int)); ! # endif #endif #endif /* Required in BSDI to get PAGE_SIZE definition for SHMLBA. * Ugly. More beautiful solutions welcome. * Shouting at BSDI sounds quite beautiful. */ #ifdef __bsdi__ ! # include #endif MODULE=IPC::SysV PACKAGE=IPC::Msg::stat --- 4,55 ---- #include #ifdef __linux__ ! # include #endif #if defined(HAS_MSG) || defined(HAS_SEM) || defined(HAS_SHM) ! #ifndef HAS_SEM ! # include #endif ! # ifdef HAS_MSG ! # include ! # endif ! # ifdef HAS_SHM ! # if defined(PERL_SCO) || defined(PERL_ISC) ! # include /* SHMLBA */ ! # endif ! # include ! # ifndef HAS_SHMAT_PROTOTYPE ! extern Shmat_t shmat _((int, char *, int)); ! # endif ! # if defined(__sparc__) && (defined(__NetBSD__) || defined(__OpenBSD__)) ! # undef SHMLBA /* not static: determined at boot time */ ! # define SHMLBA getpagesize() ! # endif ! # endif #endif + + /* Required to get 'struct pte' for SHMLBA on ULTRIX. */ + #if defined(__ultrix) || defined(__ultrix__) || defined(ultrix) + # include #endif /* Required in BSDI to get PAGE_SIZE definition for SHMLBA. * Ugly. More beautiful solutions welcome. * Shouting at BSDI sounds quite beautiful. */ #ifdef __bsdi__ ! # include /* move upwards under HAS_SHM? */ ! #endif ! ! #ifndef S_IRWXU ! # ifdef S_IRUSR ! # define S_IRWXU (S_IRUSR|S_IWUSR|S_IWUSR) ! # define S_IRWXG (S_IRGRP|S_IWGRP|S_IWGRP) ! # define S_IRWXO (S_IROTH|S_IWOTH|S_IWOTH) ! # else ! # define S_IRWXU 0700 ! # define S_IRWXG 0070 ! # define S_IRWXO 0007 ! # endif #endif MODULE=IPC::SysV PACKAGE=IPC::Msg::stat diff -c 'perl5.005_02/ext/NDBM_File/Makefile.PL' 'perl5.005_03/ext/NDBM_File/Makefile.PL' Index: ./ext/NDBM_File/Makefile.PL *** ./ext/NDBM_File/Makefile.PL Thu Jul 23 23:00:08 1998 --- ./ext/NDBM_File/Makefile.PL Thu Nov 26 20:13:06 1998 *************** *** 2,8 **** WriteMakefile( NAME => 'NDBM_File', LIBS => ["-L/usr/local/lib -lndbm", "-ldbm -lucb"], ! MAN3PODS => ' ', # Pods will be built by installman. XSPROTOARG => '-noprototypes', # XXX remove later? VERSION_FROM => 'NDBM_File.pm', ); --- 2,8 ---- WriteMakefile( NAME => 'NDBM_File', LIBS => ["-L/usr/local/lib -lndbm", "-ldbm -lucb"], ! MAN3PODS => {}, # Pods will be built by installman. XSPROTOARG => '-noprototypes', # XXX remove later? VERSION_FROM => 'NDBM_File.pm', ); diff -c 'perl5.005_02/ext/ODBM_File/Makefile.PL' 'perl5.005_03/ext/ODBM_File/Makefile.PL' Index: ./ext/ODBM_File/Makefile.PL *** ./ext/ODBM_File/Makefile.PL Thu Jul 23 23:00:08 1998 --- ./ext/ODBM_File/Makefile.PL Thu Nov 26 20:13:13 1998 *************** *** 2,8 **** WriteMakefile( NAME => 'ODBM_File', LIBS => ["-ldbm -lucb"], ! MAN3PODS => ' ', # Pods will be built by installman. XSPROTOARG => '-noprototypes', # XXX remove later? VERSION_FROM => 'ODBM_File.pm', ); --- 2,8 ---- WriteMakefile( NAME => 'ODBM_File', LIBS => ["-ldbm -lucb"], ! MAN3PODS => {}, # Pods will be built by installman. XSPROTOARG => '-noprototypes', # XXX remove later? VERSION_FROM => 'ODBM_File.pm', ); diff -c 'perl5.005_02/ext/Opcode/Makefile.PL' 'perl5.005_03/ext/Opcode/Makefile.PL' Index: ./ext/Opcode/Makefile.PL *** ./ext/Opcode/Makefile.PL Thu Jul 23 23:00:09 1998 --- ./ext/Opcode/Makefile.PL Thu Nov 26 20:13:19 1998 *************** *** 1,7 **** use ExtUtils::MakeMaker; WriteMakefile( NAME => 'Opcode', ! MAN3PODS => ' ', VERSION_FROM => 'Opcode.pm', XS_VERSION => '1.03' ); --- 1,7 ---- use ExtUtils::MakeMaker; WriteMakefile( NAME => 'Opcode', ! MAN3PODS => {}, VERSION_FROM => 'Opcode.pm', XS_VERSION => '1.03' ); diff -c 'perl5.005_02/ext/Opcode/Opcode.xs' 'perl5.005_03/ext/Opcode/Opcode.xs' Index: ./ext/Opcode/Opcode.xs *** ./ext/Opcode/Opcode.xs Thu Jul 23 23:00:09 1998 --- ./ext/Opcode/Opcode.xs Wed Dec 30 11:08:43 1998 *************** *** 400,406 **** } else if (SvPOK(bitspec) && SvCUR(bitspec) == opset_len) { int b, j; ! char *bitmap = SvPV(bitspec,PL_na); myopcode = 0; for (b=0; b < opset_len; b++) { U16 bits = bitmap[b]; --- 400,407 ---- } else if (SvPOK(bitspec) && SvCUR(bitspec) == opset_len) { int b, j; ! STRLEN n_a; ! char *bitmap = SvPV(bitspec,n_a); myopcode = 0; for (b=0; b < opset_len; b++) { U16 bits = bitmap[b]; diff -c 'perl5.005_02/ext/Opcode/Safe.pm' 'perl5.005_03/ext/Opcode/Safe.pm' Index: ./ext/Opcode/Safe.pm *** ./ext/Opcode/Safe.pm Thu Jul 23 23:00:09 1998 --- ./ext/Opcode/Safe.pm Thu Jan 21 19:03:55 1999 *************** *** 283,290 **** Evaluating perl code (e.g. via "eval" or "do 'file'") causes the code to be compiled into an internal format and then, provided there was no error in the compilation, executed. ! Code evaulated in a compartment compiles subject to the ! compartment's operator mask. Attempting to evaulate code in a compartment which contains a masked operator will cause the compilation to fail with an error. The code will not be executed. --- 283,290 ---- Evaluating perl code (e.g. via "eval" or "do 'file'") causes the code to be compiled into an internal format and then, provided there was no error in the compilation, executed. ! Code evaluated in a compartment compiles subject to the ! compartment's operator mask. Attempting to evaluate code in a compartment which contains a masked operator will cause the compilation to fail with an error. The code will not be executed. diff -c 'perl5.005_02/ext/Opcode/ops.pm' 'perl5.005_03/ext/Opcode/ops.pm' Index: ./ext/Opcode/ops.pm *** ./ext/Opcode/ops.pm Thu Jul 23 23:00:09 1998 --- ./ext/Opcode/ops.pm Thu Jan 21 19:03:55 1999 *************** *** 31,37 **** =head1 DESCRIPTION ! Since the ops pragma currently has an irreversable global effect, it is only of significant practical use with the C<-M> option on the command line. See the L module for information about opcodes, optags, opmasks --- 31,37 ---- =head1 DESCRIPTION ! Since the ops pragma currently has an irreversible global effect, it is only of significant practical use with the C<-M> option on the command line. See the L module for information about opcodes, optags, opmasks diff -c 'perl5.005_02/ext/POSIX/Makefile.PL' 'perl5.005_03/ext/POSIX/Makefile.PL' Index: ./ext/POSIX/Makefile.PL *** ./ext/POSIX/Makefile.PL Thu Jul 23 23:00:09 1998 --- ./ext/POSIX/Makefile.PL Thu Nov 26 20:13:25 1998 *************** *** 2,8 **** WriteMakefile( NAME => 'POSIX', ($^O eq 'MSWin32' ? () : (LIBS => ["-lm -lposix -lcposix"])), ! MAN3PODS => ' ', # Pods will be built by installman. XSPROTOARG => '-noprototypes', # XXX remove later? VERSION_FROM => 'POSIX.pm', ); --- 2,8 ---- WriteMakefile( NAME => 'POSIX', ($^O eq 'MSWin32' ? () : (LIBS => ["-lm -lposix -lcposix"])), ! MAN3PODS => {}, # Pods will be built by installman. XSPROTOARG => '-noprototypes', # XXX remove later? VERSION_FROM => 'POSIX.pm', ); diff -c 'perl5.005_02/ext/POSIX/POSIX.pm' 'perl5.005_03/ext/POSIX/POSIX.pm' Index: ./ext/POSIX/POSIX.pm *** ./ext/POSIX/POSIX.pm Sat Aug 1 22:56:30 1998 --- ./ext/POSIX/POSIX.pm Mon Jan 25 20:07:38 1999 *************** *** 268,292 **** sub closedir { usage "closedir(dirhandle)" if @_ != 1; ! closedir($_[0]); } sub opendir { usage "opendir(directory)" if @_ != 1; my $dirhandle = gensym; ! opendir($dirhandle, $_[0]) ? $dirhandle : undef; } sub readdir { usage "readdir(dirhandle)" if @_ != 1; ! readdir($_[0]); } sub rewinddir { usage "rewinddir(dirhandle)" if @_ != 1; ! rewinddir($_[0]); } sub errno { --- 268,292 ---- sub closedir { usage "closedir(dirhandle)" if @_ != 1; ! CORE::closedir($_[0]); } sub opendir { usage "opendir(directory)" if @_ != 1; my $dirhandle = gensym; ! CORE::opendir($dirhandle, $_[0]) ? $dirhandle : undef; } sub readdir { usage "readdir(dirhandle)" if @_ != 1; ! CORE::readdir($_[0]); } sub rewinddir { usage "rewinddir(dirhandle)" if @_ != 1; ! CORE::rewinddir($_[0]); } sub errno { *************** *** 301,342 **** sub fcntl { usage "fcntl(filehandle, cmd, arg)" if @_ != 3; ! fcntl($_[0], $_[1], $_[2]); } sub getgrgid { usage "getgrgid(gid)" if @_ != 1; ! getgrgid($_[0]); } sub getgrnam { usage "getgrnam(name)" if @_ != 1; ! getgrnam($_[0]); } sub atan2 { usage "atan2(x,y)" if @_ != 2; ! atan2($_[0], $_[1]); } sub cos { usage "cos(x)" if @_ != 1; ! cos($_[0]); } sub exp { usage "exp(x)" if @_ != 1; ! exp($_[0]); } sub fabs { usage "fabs(x)" if @_ != 1; ! abs($_[0]); } sub log { usage "log(x)" if @_ != 1; ! log($_[0]); } sub pow { --- 301,342 ---- sub fcntl { usage "fcntl(filehandle, cmd, arg)" if @_ != 3; ! CORE::fcntl($_[0], $_[1], $_[2]); } sub getgrgid { usage "getgrgid(gid)" if @_ != 1; ! CORE::getgrgid($_[0]); } sub getgrnam { usage "getgrnam(name)" if @_ != 1; ! CORE::getgrnam($_[0]); } sub atan2 { usage "atan2(x,y)" if @_ != 2; ! CORE::atan2($_[0], $_[1]); } sub cos { usage "cos(x)" if @_ != 1; ! CORE::cos($_[0]); } sub exp { usage "exp(x)" if @_ != 1; ! CORE::exp($_[0]); } sub fabs { usage "fabs(x)" if @_ != 1; ! CORE::abs($_[0]); } sub log { usage "log(x)" if @_ != 1; ! CORE::log($_[0]); } sub pow { *************** *** 346,367 **** sub sin { usage "sin(x)" if @_ != 1; ! sin($_[0]); } sub sqrt { usage "sqrt(x)" if @_ != 1; ! sqrt($_[0]); } sub getpwnam { usage "getpwnam(name)" if @_ != 1; ! getpwnam($_[0]); } sub getpwuid { usage "getpwuid(uid)" if @_ != 1; ! getpwuid($_[0]); } sub longjmp { --- 346,367 ---- sub sin { usage "sin(x)" if @_ != 1; ! CORE::sin($_[0]); } sub sqrt { usage "sqrt(x)" if @_ != 1; ! CORE::sqrt($_[0]); } sub getpwnam { usage "getpwnam(name)" if @_ != 1; ! CORE::getpwnam($_[0]); } sub getpwuid { usage "getpwuid(uid)" if @_ != 1; ! CORE::getpwuid($_[0]); } sub longjmp { *************** *** 382,393 **** sub kill { usage "kill(pid, sig)" if @_ != 2; ! kill $_[1], $_[0]; } sub raise { usage "raise(sig)" if @_ != 1; ! kill $_[0], $$; # Is this good enough? } sub offsetof { --- 382,393 ---- sub kill { usage "kill(pid, sig)" if @_ != 2; ! CORE::kill $_[1], $_[0]; } sub raise { usage "raise(sig)" if @_ != 1; ! CORE::kill $_[0], $$; # Is this good enough? } sub offsetof { *************** *** 480,491 **** sub getc { usage "getc(handle)" if @_ != 1; ! getc($_[0]); } sub getchar { usage "getchar()" if @_ != 0; ! getc(STDIN); } sub gets { --- 480,491 ---- sub getc { usage "getc(handle)" if @_ != 1; ! CORE::getc($_[0]); } sub getchar { usage "getchar()" if @_ != 0; ! CORE::getc(STDIN); } sub gets { *************** *** 500,506 **** sub printf { usage "printf(pattern, args...)" if @_ < 1; ! printf STDOUT @_; } sub putc { --- 500,506 ---- sub printf { usage "printf(pattern, args...)" if @_ < 1; ! CORE::printf STDOUT @_; } sub putc { *************** *** 517,533 **** sub remove { usage "remove(filename)" if @_ != 1; ! unlink($_[0]); } sub rename { usage "rename(oldfilename, newfilename)" if @_ != 2; ! rename($_[0], $_[1]); } sub rewind { usage "rewind(filehandle)" if @_ != 1; ! seek($_[0],0,0); } sub scanf { --- 517,533 ---- sub remove { usage "remove(filename)" if @_ != 1; ! CORE::unlink($_[0]); } sub rename { usage "rename(oldfilename, newfilename)" if @_ != 2; ! CORE::rename($_[0], $_[1]); } sub rewind { usage "rewind(filehandle)" if @_ != 1; ! CORE::seek($_[0],0,0); } sub scanf { *************** *** 536,542 **** sub sprintf { usage "sprintf(pattern,args)" if @_ == 0; ! sprintf(shift,@_); } sub sscanf { --- 536,542 ---- sub sprintf { usage "sprintf(pattern,args)" if @_ == 0; ! CORE::sprintf(shift,@_); } sub sscanf { *************** *** 565,571 **** sub abs { usage "abs(x)" if @_ != 1; ! abs($_[0]); } sub atexit { --- 565,571 ---- sub abs { usage "abs(x)" if @_ != 1; ! CORE::abs($_[0]); } sub atexit { *************** *** 598,604 **** sub exit { usage "exit(status)" if @_ != 1; ! exit($_[0]); } sub free { --- 598,604 ---- sub exit { usage "exit(status)" if @_ != 1; ! CORE::exit($_[0]); } sub free { *************** *** 640,646 **** sub system { usage "system(command)" if @_ != 1; ! system($_[0]); } sub memchr { --- 640,646 ---- sub system { usage "system(command)" if @_ != 1; ! CORE::system($_[0]); } sub memchr { *************** *** 719,725 **** sub strstr { usage "strstr(big, little)" if @_ != 2; ! index($_[0], $_[1]); } sub strtok { --- 719,725 ---- sub strstr { usage "strstr(big, little)" if @_ != 2; ! CORE::index($_[0], $_[1]); } sub strtok { *************** *** 728,798 **** sub chmod { usage "chmod(mode, filename)" if @_ != 2; ! chmod($_[0], $_[1]); } sub fstat { usage "fstat(fd)" if @_ != 1; local *TMP; open(TMP, "<&$_[0]"); # Gross. ! my @l = stat(TMP); close(TMP); @l; } sub mkdir { usage "mkdir(directoryname, mode)" if @_ != 2; ! mkdir($_[0], $_[1]); } sub stat { usage "stat(filename)" if @_ != 1; ! stat($_[0]); } sub umask { usage "umask(mask)" if @_ != 1; ! umask($_[0]); } sub wait { usage "wait()" if @_ != 0; ! wait(); } sub waitpid { usage "waitpid(pid, options)" if @_ != 2; ! waitpid($_[0], $_[1]); } sub gmtime { usage "gmtime(time)" if @_ != 1; ! gmtime($_[0]); } sub localtime { usage "localtime(time)" if @_ != 1; ! localtime($_[0]); } sub time { usage "time()" if @_ != 0; ! time; } sub alarm { usage "alarm(seconds)" if @_ != 1; ! alarm($_[0]); } sub chdir { usage "chdir(directory)" if @_ != 1; ! chdir($_[0]); } sub chown { usage "chown(filename, uid, gid)" if @_ != 3; ! chown($_[0], $_[1], $_[2]); } sub execl { --- 728,798 ---- sub chmod { usage "chmod(mode, filename)" if @_ != 2; ! CORE::chmod($_[0], $_[1]); } sub fstat { usage "fstat(fd)" if @_ != 1; local *TMP; open(TMP, "<&$_[0]"); # Gross. ! my @l = CORE::stat(TMP); close(TMP); @l; } sub mkdir { usage "mkdir(directoryname, mode)" if @_ != 2; ! CORE::mkdir($_[0], $_[1]); } sub stat { usage "stat(filename)" if @_ != 1; ! CORE::stat($_[0]); } sub umask { usage "umask(mask)" if @_ != 1; ! CORE::umask($_[0]); } sub wait { usage "wait()" if @_ != 0; ! CORE::wait(); } sub waitpid { usage "waitpid(pid, options)" if @_ != 2; ! CORE::waitpid($_[0], $_[1]); } sub gmtime { usage "gmtime(time)" if @_ != 1; ! CORE::gmtime($_[0]); } sub localtime { usage "localtime(time)" if @_ != 1; ! CORE::localtime($_[0]); } sub time { usage "time()" if @_ != 0; ! CORE::time; } sub alarm { usage "alarm(seconds)" if @_ != 1; ! CORE::alarm($_[0]); } sub chdir { usage "chdir(directory)" if @_ != 1; ! CORE::chdir($_[0]); } sub chown { usage "chown(filename, uid, gid)" if @_ != 3; ! CORE::chown($_[0], $_[1], $_[2]); } sub execl { *************** *** 821,827 **** sub fork { usage "fork()" if @_ != 0; ! fork; } sub getcwd --- 821,827 ---- sub fork { usage "fork()" if @_ != 0; ! CORE::fork; } sub getcwd *************** *** 861,872 **** sub getlogin { usage "getlogin()" if @_ != 0; ! getlogin(); } sub getpgrp { usage "getpgrp()" if @_ != 0; ! getpgrp($_[0]); } sub getpid { --- 861,872 ---- sub getlogin { usage "getlogin()" if @_ != 0; ! CORE::getlogin(); } sub getpgrp { usage "getpgrp()" if @_ != 0; ! CORE::getpgrp; } sub getpid { *************** *** 876,882 **** sub getppid { usage "getppid()" if @_ != 0; ! getppid; } sub getuid { --- 876,882 ---- sub getppid { usage "getppid()" if @_ != 0; ! CORE::getppid; } sub getuid { *************** *** 891,902 **** sub link { usage "link(oldfilename, newfilename)" if @_ != 2; ! link($_[0], $_[1]); } sub rmdir { usage "rmdir(directoryname)" if @_ != 1; ! rmdir($_[0]); } sub setgid { --- 891,906 ---- sub link { usage "link(oldfilename, newfilename)" if @_ != 2; ! CORE::link($_[0], $_[1]); } sub rmdir { usage "rmdir(directoryname)" if @_ != 1; ! CORE::rmdir($_[0]); ! } ! ! sub setbuf { ! redef "IO::Handle::setbuf()"; } sub setgid { *************** *** 909,926 **** $< = $_[0]; } sub sleep { usage "sleep(seconds)" if @_ != 1; ! sleep($_[0]); } sub unlink { usage "unlink(filename)" if @_ != 1; ! unlink($_[0]); } sub utime { usage "utime(filename, atime, mtime)" if @_ != 3; ! utime($_[1], $_[2], $_[0]); } --- 913,934 ---- $< = $_[0]; } + sub setvbuf { + redef "IO::Handle::setvbuf()"; + } + sub sleep { usage "sleep(seconds)" if @_ != 1; ! CORE::sleep($_[0]); } sub unlink { usage "unlink(filename)" if @_ != 1; ! CORE::unlink($_[0]); } sub utime { usage "utime(filename, atime, mtime)" if @_ != 3; ! CORE::utime($_[1], $_[2], $_[0]); } diff -c 'perl5.005_02/ext/POSIX/POSIX.pod' 'perl5.005_03/ext/POSIX/POSIX.pod' Index: ./ext/POSIX/POSIX.pod *** ./ext/POSIX/POSIX.pod Thu Jul 23 23:00:10 1998 --- ./ext/POSIX/POSIX.pod Sat Nov 7 15:41:30 1998 *************** *** 1009,1021 **** Synopsis: ! strftime(fmt, sec, min, hour, mday, mon, year, wday = 0, yday = 0, isdst = 0) The month (C), weekday (C), and yearday (C) begin at zero. I.e. January is 0, not 1; Sunday is 0, not 1; January 1st is 0, not 1. The ! year (C) is given in years since 1900. I.e. The year 1995 is 95; the year 2001 is 101. Consult your system's C manpage for details ! about these and the other arguments. The string for Tuesday, December 12, 1995. --- 1009,1022 ---- Synopsis: ! strftime(fmt, sec, min, hour, mday, mon, year, wday = -1, yday = -1, isdst = -1) The month (C), weekday (C), and yearday (C) begin at zero. I.e. January is 0, not 1; Sunday is 0, not 1; January 1st is 0, not 1. The ! year (C) is given in years since 1900. I.e., the year 1995 is 95; the year 2001 is 101. Consult your system's C manpage for details ! about these and the other arguments. The given arguments are made consistent ! by calling C before calling your system's C function. The string for Tuesday, December 12, 1995. diff -c 'perl5.005_02/ext/POSIX/POSIX.xs' 'perl5.005_03/ext/POSIX/POSIX.xs' Index: ./ext/POSIX/POSIX.xs *** ./ext/POSIX/POSIX.xs Sat Aug 1 23:03:23 1998 --- ./ext/POSIX/POSIX.xs Thu Mar 4 18:34:14 1999 *************** *** 10,17 **** # undef open # undef setmode # define open PerlLIO_open3 - # undef TAINT_PROPER - # define TAINT_PROPER(a) #endif #include #ifdef I_DIRENT /* XXX maybe better to just rely on perl.h? */ --- 10,15 ---- *************** *** 2569,2575 **** CODE: { int i; ! RETVAL = (sigset_t*)safemalloc(sizeof(sigset_t)); sigemptyset(RETVAL); for (i = 1; i < items; i++) sigaddset(RETVAL, SvIV(ST(i))); --- 2567,2573 ---- CODE: { int i; ! New(0, RETVAL, 1, sigset_t); sigemptyset(RETVAL); for (i = 1; i < items; i++) sigaddset(RETVAL, SvIV(ST(i))); *************** *** 2581,2587 **** DESTROY(sigset) POSIX::SigSet sigset CODE: ! safefree((char *)sigset); SysRet sigaddset(sigset, sig) --- 2579,2585 ---- DESTROY(sigset) POSIX::SigSet sigset CODE: ! Safefree(sigset); SysRet sigaddset(sigset, sig) *************** *** 2615,2621 **** CODE: { #ifdef I_TERMIOS ! RETVAL = (struct termios*)safemalloc(sizeof(struct termios)); #else not_here("termios"); RETVAL = 0; --- 2613,2619 ---- CODE: { #ifdef I_TERMIOS ! New(0, RETVAL, 1, struct termios); #else not_here("termios"); RETVAL = 0; *************** *** 2629,2635 **** POSIX::Termios termios_ref CODE: #ifdef I_TERMIOS ! safefree((char *)termios_ref); #else not_here("termios"); #endif --- 2627,2633 ---- POSIX::Termios termios_ref CODE: #ifdef I_TERMIOS ! Safefree(termios_ref); #else not_here("termios"); #endif *************** *** 3181,3190 **** sig_name[sig], strlen(sig_name[sig]), TRUE); /* Remember old handler name if desired. */ if (oldaction) { ! char *hand = SvPVx(*sigsvp, PL_na); svp = hv_fetch(oldaction, "HANDLER", 7, TRUE); sv_setpv(*svp, *hand ? hand : "DEFAULT"); } --- 3179,3189 ---- sig_name[sig], strlen(sig_name[sig]), TRUE); + STRLEN n_a; /* Remember old handler name if desired. */ if (oldaction) { ! char *hand = SvPVx(*sigsvp, n_a); svp = hv_fetch(oldaction, "HANDLER", 7, TRUE); sv_setpv(*svp, *hand ? hand : "DEFAULT"); } *************** *** 3195,3201 **** svp = hv_fetch(action, "HANDLER", 7, FALSE); if (!svp) croak("Can't supply an action without a HANDLER"); ! sv_setpv(*sigsvp, SvPV(*svp, PL_na)); mg_set(*sigsvp); /* handles DEFAULT and IGNORE */ act.sa_handler = sighandler; --- 3194,3200 ---- svp = hv_fetch(action, "HANDLER", 7, FALSE); if (!svp) croak("Can't supply an action without a HANDLER"); ! sv_setpv(*sigsvp, SvPV(*svp, n_a)); mg_set(*sigsvp); /* handles DEFAULT and IGNORE */ act.sa_handler = sighandler; *************** *** 3234,3240 **** sigset = (sigset_t*) tmp; } else { ! sigset = (sigset_t*)safemalloc(sizeof(sigset_t)); sv_setptrobj(*svp, sigset, "POSIX::SigSet"); } *sigset = oact.sa_mask; --- 3233,3239 ---- sigset = (sigset_t*) tmp; } else { ! New(0, sigset, 1, sigset_t); sv_setptrobj(*svp, sigset, "POSIX::SigSet"); } *sigset = oact.sa_mask; *************** *** 3256,3262 **** sigprocmask(how, sigset, oldsigset = 0) int how POSIX::SigSet sigset ! POSIX::SigSet oldsigset SysRet sigsuspend(signal_mask) --- 3255,3274 ---- sigprocmask(how, sigset, oldsigset = 0) int how POSIX::SigSet sigset ! POSIX::SigSet oldsigset = NO_INIT ! INIT: ! if ( items < 3 ) { ! oldsigset = 0; ! } ! else if (sv_derived_from(ST(2), "POSIX::SigSet")) { ! IV tmp = SvIV((SV*)SvRV(ST(2))); ! oldsigset = (POSIX__SigSet) tmp; ! } ! else { ! New(0, oldsigset, 1, sigset_t); ! sigemptyset(oldsigset); ! sv_setref_pv(ST(2), "POSIX::SigSet", (void*)oldsigset); ! } SysRet sigsuspend(signal_mask) *************** *** 3591,3597 **** RETVAL char * ! strftime(fmt, sec, min, hour, mday, mon, year, wday = 0, yday = 0, isdst = 0) char * fmt int sec int min --- 3603,3609 ---- RETVAL char * ! strftime(fmt, sec, min, hour, mday, mon, year, wday = -1, yday = -1, isdst = -1) char * fmt int sec int min *************** *** 3617,3624 **** mytm.tm_wday = wday; mytm.tm_yday = yday; mytm.tm_isdst = isdst; len = strftime(tmpbuf, sizeof tmpbuf, fmt, &mytm); ! ST(0) = sv_2mortal(newSVpv(tmpbuf, len)); } void --- 3629,3673 ---- mytm.tm_wday = wday; mytm.tm_yday = yday; mytm.tm_isdst = isdst; + (void) mktime(&mytm); len = strftime(tmpbuf, sizeof tmpbuf, fmt, &mytm); ! /* ! ** The following is needed to handle to the situation where ! ** tmpbuf overflows. Basically we want to allocate a buffer ! ** and try repeatedly. The reason why it is so complicated ! ** is that getting a return value of 0 from strftime can indicate ! ** one of the following: ! ** 1. buffer overflowed, ! ** 2. illegal conversion specifier, or ! ** 3. the format string specifies nothing to be returned(not ! ** an error). This could be because format is an empty string ! ** or it specifies %p that yields an empty string in some locale. ! ** If there is a better way to make it portable, go ahead by ! ** all means. ! */ ! if ( ( len > 0 && len < sizeof(tmpbuf) ) ! || ( len == 0 && strlen(fmt) == 0 ) ) { ! ST(0) = sv_2mortal(newSVpv(tmpbuf, len)); ! } else { ! /* Possibly buf overflowed - try again with a bigger buf */ ! int bufsize = strlen(fmt) + sizeof(tmpbuf); ! char* buf; ! int buflen; ! ! New(0, buf, bufsize, char); ! while( buf ) { ! buflen = strftime(buf, bufsize, fmt, &mytm); ! if ( buflen > 0 && buflen < bufsize ) break; ! bufsize *= 2; ! Renew(buf, bufsize, char); ! } ! if ( buf ) { ! ST(0) = sv_2mortal(newSVpv(buf, buflen)); ! Safefree(buf); ! } else { ! ST(0) = sv_2mortal(newSVpv(tmpbuf, len)); ! } ! } } void diff -c /dev/null 'perl5.005_03/ext/POSIX/hints/dynixptx.pl' Index: ext/POSIX/hints/dynixptx.pl *** ext/POSIX/hints/dynixptx.pl Wed Dec 31 18:00:00 1969 --- ext/POSIX/hints/dynixptx.pl Sun Nov 29 18:20:36 1998 *************** *** 0 **** --- 1,4 ---- + # Need to add an extra '-lc' to the end to work around a DYNIX/ptx bug + # PR#227670 - linker error on fpgetround() + + $self->{LIBS} = ['-ldb -lm -lc']; diff -c /dev/null 'perl5.005_03/ext/POSIX/hints/mint.pl' Index: ext/POSIX/hints/mint.pl *** ext/POSIX/hints/mint.pl Wed Dec 31 18:00:00 1969 --- ext/POSIX/hints/mint.pl Thu Jan 28 19:13:52 1999 *************** *** 0 **** --- 1,2 ---- + $self->{CCFLAGS} = $Config{ccflags} . ' -DNO_LOCALECONV_GROUPING -DNO_LOCALECONV_MON_GROUPING'; + diff -c 'perl5.005_02/ext/SDBM_File/Makefile.PL' 'perl5.005_03/ext/SDBM_File/Makefile.PL' Index: ./ext/SDBM_File/Makefile.PL *** ./ext/SDBM_File/Makefile.PL Thu Jul 23 23:00:12 1998 --- ./ext/SDBM_File/Makefile.PL Thu Nov 26 20:13:32 1998 *************** *** 12,18 **** WriteMakefile( NAME => 'SDBM_File', MYEXTLIB => $myextlib, ! MAN3PODS => ' ', # Pods will be built by installman. XSPROTOARG => '-noprototypes', # XXX remove later? VERSION_FROM => 'SDBM_File.pm', DEFINE => $define, --- 12,18 ---- WriteMakefile( NAME => 'SDBM_File', MYEXTLIB => $myextlib, ! MAN3PODS => {}, # Pods will be built by installman. XSPROTOARG => '-noprototypes', # XXX remove later? VERSION_FROM => 'SDBM_File.pm', DEFINE => $define, diff -c 'perl5.005_02/ext/SDBM_File/sdbm/sdbm.c' 'perl5.005_03/ext/SDBM_File/sdbm/sdbm.c' Index: ./ext/SDBM_File/sdbm/sdbm.c *** ./ext/SDBM_File/sdbm/sdbm.c Tue Aug 4 15:09:27 1998 --- ./ext/SDBM_File/sdbm/sdbm.c Thu Mar 4 18:34:14 1999 *************** *** 437,442 **** --- 437,443 ---- dirb = c / DBLKSIZ; if (dirb != db->dirbno) { + (void) memset(db->dirbuf, 0, DBLKSIZ); if (lseek(db->dirf, OFF_DIR(dirb), SEEK_SET) < 0 || read(db->dirf, db->dirbuf, DBLKSIZ) < 0) return 0; diff -c 'perl5.005_02/ext/Socket/Makefile.PL' 'perl5.005_03/ext/Socket/Makefile.PL' Index: ./ext/Socket/Makefile.PL *** ./ext/Socket/Makefile.PL Thu Jul 23 23:00:14 1998 --- ./ext/Socket/Makefile.PL Thu Nov 26 20:13:37 1998 *************** *** 2,7 **** WriteMakefile( NAME => 'Socket', VERSION_FROM => 'Socket.pm', ! MAN3PODS => ' ', # Pods will be built by installman. XSPROTOARG => '-noprototypes', # XXX remove later? ); --- 2,7 ---- WriteMakefile( NAME => 'Socket', VERSION_FROM => 'Socket.pm', ! MAN3PODS => {}, # Pods will be built by installman. XSPROTOARG => '-noprototypes', # XXX remove later? ); diff -c 'perl5.005_02/ext/Socket/Socket.pm' 'perl5.005_03/ext/Socket/Socket.pm' Index: ./ext/Socket/Socket.pm *** ./ext/Socket/Socket.pm Thu Jul 23 23:00:14 1998 --- ./ext/Socket/Socket.pm Sun Nov 29 18:21:01 1998 *************** *** 193,202 **** --- 193,217 ---- AF_UNIX AF_UNSPEC AF_X25 + MSG_CTLFLAGS + MSG_CTLIGNORE + MSG_CTRUNC MSG_DONTROUTE + MSG_DONTWAIT + MSG_EOF + MSG_EOR + MSG_ERRQUEUE + MSG_FIN MSG_MAXIOVLEN + MSG_NOSIGNAL MSG_OOB MSG_PEEK + MSG_PROXY + MSG_RST + MSG_SYN + MSG_TRUNC + MSG_URG + MSG_WAITALL PF_802 PF_APPLETALK PF_CCITT *************** *** 221,226 **** --- 236,246 ---- PF_UNIX PF_UNSPEC PF_X25 + SCM_CONNECT + SCM_CREDENTIALS + SCM_CREDS + SCM_RIGHTS + SCM_TIMESTAMP SOCK_DGRAM SOCK_RAW SOCK_RDM diff -c 'perl5.005_02/ext/Socket/Socket.xs' 'perl5.005_03/ext/Socket/Socket.xs' Index: ./ext/Socket/Socket.xs *** ./ext/Socket/Socket.xs Thu Jul 23 23:00:14 1998 --- ./ext/Socket/Socket.xs Sat Dec 12 08:54:54 1998 *************** *** 330,371 **** case 'L': break; case 'M': if (strEQ(name, "MSG_CTRUNC")) ! #if defined(MSG_CTRUNC) || defined(HAS_GNULIBC) /* XXX it's an enum */ return MSG_CTRUNC; #else goto not_there; #endif if (strEQ(name, "MSG_DONTROUTE")) ! #if defined(MSG_DONTROUTE) || defined(HAS_GNULIBC) /* XXX it's an enum */ return MSG_DONTROUTE; #else goto not_there; #endif if (strEQ(name, "MSG_MAXIOVLEN")) #ifdef MSG_MAXIOVLEN return MSG_MAXIOVLEN; #else goto not_there; #endif if (strEQ(name, "MSG_OOB")) ! #if defined(MSG_OOB) || defined(HAS_GNULIBC) /* XXX it's an enum */ return MSG_OOB; #else goto not_there; #endif if (strEQ(name, "MSG_PEEK")) ! #if defined(MSG_PEEK) || defined(HAS_GNULIBC) /* XXX it's an enum */ return MSG_PEEK; #else goto not_there; #endif if (strEQ(name, "MSG_PROXY")) ! #if defined(MSG_PROXY) || defined(HAS_GNULIBC) /* XXX it's an enum */ return MSG_PROXY; #else goto not_there; #endif break; case 'N': break; --- 330,443 ---- case 'L': break; case 'M': + if (strEQ(name, "MSG_CTLFLAGS")) + #ifdef MSG_CTLFLAGS + return MSG_CTLFLAGS; + #else + goto not_there; + #endif + if (strEQ(name, "MSG_CTLIGNORE")) + #ifdef MSG_CTLIGNORE + return MSG_CTLIGNORE; + #else + goto not_there; + #endif if (strEQ(name, "MSG_CTRUNC")) ! #if defined(MSG_TRUNC) || defined(HAS_MSG_CTRUNC) /* might be an enum */ return MSG_CTRUNC; #else goto not_there; #endif if (strEQ(name, "MSG_DONTROUTE")) ! #if defined(MSG_DONTROUTE) || defined(HAS_MSG_DONTROUTE) /* might be an enum */ return MSG_DONTROUTE; #else goto not_there; #endif + if (strEQ(name, "MSG_DONTWAIT")) + #ifdef MSG_DONTWAIT + return MSG_DONTWAIT; + #else + goto not_there; + #endif + if (strEQ(name, "MSG_EOF")) + #ifdef MSG_EOF + return MSG_EOF; + #else + goto not_there; + #endif + if (strEQ(name, "MSG_EOR")) + #ifdef MSG_EOR + return MSG_EOR; + #else + goto not_there; + #endif + if (strEQ(name, "MSG_ERRQUEUE")) + #ifdef MSG_ERRQUEUE + return MSG_ERRQUEUE; + #else + goto not_there; + #endif + if (strEQ(name, "MSG_FIN")) + #ifdef MSG_FIN + return MSG_FIN; + #else + goto not_there; + #endif if (strEQ(name, "MSG_MAXIOVLEN")) #ifdef MSG_MAXIOVLEN return MSG_MAXIOVLEN; #else goto not_there; #endif + if (strEQ(name, "MSG_NOSIGNAL")) + #ifdef MSG_NOSIGNAL + return MSG_NOSIGNAL; + #else + goto not_there; + #endif if (strEQ(name, "MSG_OOB")) ! #if defined(MSG_OOB) || defined(HAS_MSG_OOB) /* might be an enum */ return MSG_OOB; #else goto not_there; #endif if (strEQ(name, "MSG_PEEK")) ! #if defined(MSG_PEEK) || defined(HAS_MSG_PEEK) /* might be an enum */ return MSG_PEEK; #else goto not_there; #endif if (strEQ(name, "MSG_PROXY")) ! #if defined(MSG_PROXY) || defined(HAS_MSG_PROXY) /* might be an enum */ return MSG_PROXY; #else goto not_there; #endif + if (strEQ(name, "MSG_RST")) + #ifdef MSG_RST + return MSG_RST; + #else + goto not_there; + #endif + if (strEQ(name, "MSG_SYN")) + #ifdef MSG_SYN + return MSG_SYN; + #else + goto not_there; + #endif + if (strEQ(name, "MSG_TRUNC")) + #ifdef MSG_TRUNC + return MSG_TRUNC; + #else + goto not_there; + #endif + if (strEQ(name, "MSG_WAITALL")) + #ifdef MSG_WAITALL + return MSG_WAITALL; + #else + goto not_there; + #endif break; case 'N': break; *************** *** 522,527 **** --- 594,629 ---- case 'R': break; case 'S': + if (strEQ(name, "SCM_CONNECT")) + #ifdef SCM_CONNECT + return SCM_CONNECT; + #else + goto not_there; + #endif + if (strEQ(name, "SCM_CREDENTIALS")) + #ifdef SCM_CREDENTIALS + return SCM_CREDENTIALS; + #else + goto not_there; + #endif + if (strEQ(name, "SCM_CREDS")) + #ifdef SCM_CREDS + return SCM_CREDS; + #else + goto not_there; + #endif + if (strEQ(name, "SCM_RIGHTS")) + #if defined(SCM_RIGHTS) || defined(HAS_SCM_RIGHTS) /* might be an enum */ + return SCM_RIGHTS; + #else + goto not_there; + #endif + if (strEQ(name, "SCM_TIMESTAMP")) + #ifdef SCM_TIMESTAMP + return SCM_TIMESTAMP; + #else + goto not_there; + #endif if (strEQ(name, "SOCK_DGRAM")) #ifdef SOCK_DGRAM return SOCK_DGRAM; diff -c 'perl5.005_02/ext/Thread/Makefile.PL' 'perl5.005_03/ext/Thread/Makefile.PL' Index: ./ext/Thread/Makefile.PL *** ./ext/Thread/Makefile.PL Thu Jul 23 23:00:14 1998 --- ./ext/Thread/Makefile.PL Thu Nov 26 20:13:44 1998 *************** *** 2,7 **** WriteMakefile( NAME => 'Thread', VERSION_FROM => 'Thread.pm', ! MAN3PODS => ' ' ); --- 2,7 ---- WriteMakefile( NAME => 'Thread', VERSION_FROM => 'Thread.pm', ! MAN3PODS => {} ); diff -c 'perl5.005_02/ext/Thread/Thread.xs' 'perl5.005_03/ext/Thread/Thread.xs' Index: ./ext/Thread/Thread.xs *** ./ext/Thread/Thread.xs Sun Aug 2 01:09:57 1998 --- ./ext/Thread/Thread.xs Sat Mar 27 22:21:29 1999 *************** *** 115,132 **** sv = POPs; PUTBACK; perl_call_sv(sv, G_ARRAY|G_EVAL); SPAGAIN; retval = SP - (PL_stack_base + oldmark); SP = PL_stack_base + oldmark + 1; if (SvCUR(thr->errsv)) { MUTEX_LOCK(&thr->mutex); thr->flags |= THRf_DID_DIE; MUTEX_UNLOCK(&thr->mutex); av_store(av, 0, &PL_sv_no); av_store(av, 1, newSVsv(thr->errsv)); DEBUG_S(PerlIO_printf(PerlIO_stderr(), "%p died: %s\n", ! thr, SvPV(thr->errsv, PL_na))); } else { DEBUG_S(STMT_START { for (i = 1; i <= retval; i++) { --- 115,135 ---- sv = POPs; PUTBACK; + ENTER; + SAVETMPS; perl_call_sv(sv, G_ARRAY|G_EVAL); SPAGAIN; retval = SP - (PL_stack_base + oldmark); SP = PL_stack_base + oldmark + 1; if (SvCUR(thr->errsv)) { + STRLEN n_a; MUTEX_LOCK(&thr->mutex); thr->flags |= THRf_DID_DIE; MUTEX_UNLOCK(&thr->mutex); av_store(av, 0, &PL_sv_no); av_store(av, 1, newSVsv(thr->errsv)); DEBUG_S(PerlIO_printf(PerlIO_stderr(), "%p died: %s\n", ! thr, SvPV(thr->errsv, n_a))); } else { DEBUG_S(STMT_START { for (i = 1; i <= retval; i++) { *************** *** 138,143 **** --- 141,148 ---- for (i = 1; i <= retval; i++, SP++) sv_setsv(*av_fetch(av, i, TRUE), SvREFCNT_inc(*SP)); } + FREETMPS; + LEAVE; finishoff: #if 0 *************** *** 174,180 **** Safefree(PL_screamnext); Safefree(PL_reg_start_tmp); SvREFCNT_dec(PL_lastscream); ! /*SvREFCNT_dec(PL_defoutgv);*/ MUTEX_LOCK(&thr->mutex); DEBUG_S(PerlIO_printf(PerlIO_stderr(), --- 179,185 ---- Safefree(PL_screamnext); Safefree(PL_reg_start_tmp); SvREFCNT_dec(PL_lastscream); ! SvREFCNT_dec(PL_defoutgv); MUTEX_LOCK(&thr->mutex); DEBUG_S(PerlIO_printf(PerlIO_stderr(), *************** *** 233,238 **** --- 238,248 ---- savethread = thr; thr = new_struct_thread(thr); + /* temporarily pretend to be the child thread in case the + * XPUSHs() below want to grow the child's stack. This is + * safe, since the other thread is not yet created, and we + * are the only ones who know about it */ + SET_THR(thr); SPAGAIN; DEBUG_S(PerlIO_printf(PerlIO_stderr(), "%p: newthread (%p), tid is %u, preparing stack\n", *************** *** 244,254 **** XPUSHs(SvREFCNT_inc(*av_fetch(initargs, i, FALSE))); XPUSHs(SvREFCNT_inc(startsv)); PUTBACK; #ifdef THREAD_CREATE err = THREAD_CREATE(thr, threadstart); #else - /* On your marks... */ - MUTEX_LOCK(&thr->mutex); /* Get set... */ sigfillset(&fullmask); if (sigprocmask(SIG_SETMASK, &fullmask, &oldmask) == -1) --- 254,267 ---- XPUSHs(SvREFCNT_inc(*av_fetch(initargs, i, FALSE))); XPUSHs(SvREFCNT_inc(startsv)); PUTBACK; + + /* On your marks... */ + SET_THR(savethread); + MUTEX_LOCK(&thr->mutex); + #ifdef THREAD_CREATE err = THREAD_CREATE(thr, threadstart); #else /* Get set... */ sigfillset(&fullmask); if (sigprocmask(SIG_SETMASK, &fullmask, &oldmask) == -1) *************** *** 279,288 **** #else err = pthread_create(&thr->self, &attr, threadstart, (void*) thr); #endif - /* Go */ - MUTEX_UNLOCK(&thr->mutex); #endif if (err) { DEBUG_S(PerlIO_printf(PerlIO_stderr(), "%p: create of %p failed %d\n", savethread, thr, err)); --- 292,300 ---- #else err = pthread_create(&thr->self, &attr, threadstart, (void*) thr); #endif #endif if (err) { + MUTEX_UNLOCK(&thr->mutex); DEBUG_S(PerlIO_printf(PerlIO_stderr(), "%p: create of %p failed %d\n", savethread, thr, err)); *************** *** 295,310 **** SvREFCNT_dec(startsv); return NULL; } #ifdef THREAD_POST_CREATE THREAD_POST_CREATE(thr); #else if (sigprocmask(SIG_SETMASK, &oldmask, 0)) croak("panic: sigprocmask"); #endif sv = newSViv(thr->tid); sv_magic(sv, thr->oursv, '~', 0, 0); SvMAGIC(sv)->mg_private = Thread_MAGIC_SIGNATURE; ! return sv_bless(newRV_noinc(sv), gv_stashpv(classname, TRUE)); #else croak("No threads in this perl"); return &PL_sv_undef; --- 307,329 ---- SvREFCNT_dec(startsv); return NULL; } + #ifdef THREAD_POST_CREATE THREAD_POST_CREATE(thr); #else if (sigprocmask(SIG_SETMASK, &oldmask, 0)) croak("panic: sigprocmask"); #endif + sv = newSViv(thr->tid); sv_magic(sv, thr->oursv, '~', 0, 0); SvMAGIC(sv)->mg_private = Thread_MAGIC_SIGNATURE; ! sv = sv_bless(newRV_noinc(sv), gv_stashpv(classname, TRUE)); ! ! /* Go */ ! MUTEX_UNLOCK(&thr->mutex); ! ! return sv; #else croak("No threads in this perl"); return &PL_sv_undef; *************** *** 371,377 **** for (i = 1; i <= AvFILL(av); i++) XPUSHs(sv_2mortal(*av_fetch(av, i, FALSE))); } else { ! char *mess = SvPV(*av_fetch(av, 1, FALSE), PL_na); DEBUG_S(PerlIO_printf(PerlIO_stderr(), "%p: join propagating die message: %s\n", thr, mess)); --- 390,397 ---- for (i = 1; i <= AvFILL(av); i++) XPUSHs(sv_2mortal(*av_fetch(av, i, FALSE))); } else { ! STRLEN n_a; ! char *mess = SvPV(*av_fetch(av, 1, FALSE), n_a); DEBUG_S(PerlIO_printf(PerlIO_stderr(), "%p: join propagating die message: %s\n", thr, mess)); *************** *** 483,488 **** --- 503,509 ---- croak("cond_wait for lock that we don't own\n"); } MgOWNER(mg) = 0; + COND_SIGNAL(MgOWNERCONDP(mg)); COND_WAIT(MgCONDP(mg), MgMUTEXP(mg)); while (MgOWNER(mg)) COND_WAIT(MgOWNERCONDP(mg), MgMUTEXP(mg)); diff -c 'perl5.005_02/ext/Thread/create.t' 'perl5.005_03/ext/Thread/create.t' Index: ./ext/Thread/create.t *** ./ext/Thread/create.t Thu Jul 23 23:00:15 1998 --- ./ext/Thread/create.t Sun Nov 1 22:24:36 1998 *************** *** 1,4 **** ! use Thread; sub start_here { my $i; print "In start_here with args: @_\n"; --- 1,7 ---- ! use Thread 'async'; ! use Config; ! use Tie::Hash; ! sub start_here { my $i; print "In start_here with args: @_\n"; *************** *** 7,12 **** --- 10,21 ---- sleep 1; } } + + async { + tie my(%h), 'Tie::StdHash'; + %h = %Config; + print "running on $h{archname}\n"; + }; print "Starting new thread now\n"; $t = new Thread \&start_here, qw(foo bar baz); diff -c 'perl5.005_02/ext/attrs/Makefile.PL' 'perl5.005_03/ext/attrs/Makefile.PL' Index: ./ext/attrs/Makefile.PL *** ./ext/attrs/Makefile.PL Thu Jul 23 23:00:16 1998 --- ./ext/attrs/Makefile.PL Thu Nov 26 20:14:15 1998 *************** *** 2,7 **** WriteMakefile( NAME => 'attrs', VERSION_FROM => 'attrs.pm', ! MAN3PODS => ' ', # Pods will be built by installman. XSPROTOARG => '-noprototypes' ); --- 2,7 ---- WriteMakefile( NAME => 'attrs', VERSION_FROM => 'attrs.pm', ! MAN3PODS => {}, # Pods will be built by installman. XSPROTOARG => '-noprototypes' ); diff -c 'perl5.005_02/ext/attrs/attrs.xs' 'perl5.005_03/ext/attrs/attrs.xs' Index: ./ext/attrs/attrs.xs *** ./ext/attrs/attrs.xs Thu Jul 23 23:00:16 1998 --- ./ext/attrs/attrs.xs Wed Dec 30 11:12:33 1998 *************** *** 27,33 **** if (!PL_compcv || !(cv = CvOUTSIDE(PL_compcv))) croak("can't set attributes outside a subroutine scope"); for (i = 1; i < items; i++) { ! char *attr = SvPV(ST(i), PL_na); cv_flags_t flag = get_flag(attr); if (!flag) croak("invalid attribute name %s", attr); --- 27,34 ---- if (!PL_compcv || !(cv = CvOUTSIDE(PL_compcv))) croak("can't set attributes outside a subroutine scope"); for (i = 1; i < items; i++) { ! STRLEN n_a; ! char *attr = SvPV(ST(i), n_a); cv_flags_t flag = get_flag(attr); if (!flag) croak("invalid attribute name %s", attr); *************** *** 47,53 **** sub = Nullsv; } else { ! char *name = SvPV(sub, PL_na); sub = (SV*)perl_get_cv(name, FALSE); } if (!sub) --- 48,55 ---- sub = Nullsv; } else { ! STRLEN n_a; ! char *name = SvPV(sub, n_a); sub = (SV*)perl_get_cv(name, FALSE); } if (!sub) diff -c 'perl5.005_02/ext/re/Makefile.PL' 'perl5.005_03/ext/re/Makefile.PL' Index: ./ext/re/Makefile.PL *** ./ext/re/Makefile.PL Thu Jul 23 23:00:16 1998 --- ./ext/re/Makefile.PL Thu Nov 26 20:14:24 1998 *************** *** 2,8 **** WriteMakefile( NAME => 're', VERSION_FROM => 're.pm', ! MAN3PODS => ' ', # Pods will be built by installman. XSPROTOARG => '-noprototypes', OBJECT => 're_exec$(OBJ_EXT) re_comp$(OBJ_EXT) re$(OBJ_EXT)', DEFINE => '-DPERL_EXT_RE_BUILD', --- 2,8 ---- WriteMakefile( NAME => 're', VERSION_FROM => 're.pm', ! MAN3PODS => {}, # Pods will be built by installman. XSPROTOARG => '-noprototypes', OBJECT => 're_exec$(OBJ_EXT) re_comp$(OBJ_EXT) re$(OBJ_EXT)', DEFINE => '-DPERL_EXT_RE_BUILD', diff -c 'perl5.005_02/ext/re/re.pm' 'perl5.005_03/ext/re/re.pm' Index: ./ext/re/re.pm *** ./ext/re/re.pm Tue Aug 4 21:33:43 1998 --- ./ext/re/re.pm Thu Jan 21 19:03:56 1999 *************** *** 41,51 **** other transformations. When C is in effect, a regex is allowed to contain ! C<(?{ ... })> zero-width assertions even if regular expression contains ! variable interpolation. That is normally disallowed, since it is a potential security risk. Note that this pragma is ignored when the regular expression is obtained from tainted data, i.e. evaluation is always ! disallowed with tainted regular expresssions. See L. For the purpose of this pragma, interpolation of precompiled regular expressions (i.e., the result of C) is I considered variable --- 41,51 ---- other transformations. When C is in effect, a regex is allowed to contain ! C<(?{ ... })> zero-width assertions even if the regex contains ! variable interpolation. This is normally disallowed, since it is a potential security risk. Note that this pragma is ignored when the regular expression is obtained from tainted data, i.e. evaluation is always ! disallowed with tainted regular expressions. See L. For the purpose of this pragma, interpolation of precompiled regular expressions (i.e., the result of C) is I considered variable diff -c 'perl5.005_02/form.h' 'perl5.005_03/form.h' Index: ./form.h *** ./form.h Thu Jul 23 23:00:16 1998 --- ./form.h Sat Mar 27 11:57:09 1999 *************** *** 1,6 **** /* form.h * ! * Copyright (c) 1991-1997, Larry Wall * * You may distribute under the terms of either the GNU General Public * License or the Artistic License, as specified in the README file. --- 1,6 ---- /* form.h * ! * Copyright (c) 1991-1999, Larry Wall * * You may distribute under the terms of either the GNU General Public * License or the Artistic License, as specified in the README file. diff -c 'perl5.005_02/global.sym' 'perl5.005_03/global.sym' Index: ./global.sym *** ./global.sym Tue Aug 4 15:16:12 1998 --- ./global.sym Sat Jan 16 12:13:37 1999 *************** *** 276,281 **** --- 276,282 ---- do_trans do_vecset do_vop + dofile dofindlabel dopoptoeval dounwind *************** *** 312,317 **** --- 313,319 ---- get_no_modify get_opargs get_specialsv_list + get_vtbl gp_free gp_ref gv_AVadd *************** *** 914,919 **** --- 916,922 ---- save_freeop save_freepv save_freesv + save_generic_svref save_gp save_hash save_helem diff -c 'perl5.005_02/gv.c' 'perl5.005_03/gv.c' Index: ./gv.c *** ./gv.c Tue Aug 4 15:07:44 1998 --- ./gv.c Sat Mar 27 19:16:55 1999 *************** *** 1,6 **** /* gv.c * ! * Copyright (c) 1991-1997, Larry Wall * * You may distribute under the terms of either the GNU General Public * License or the Artistic License, as specified in the README file. --- 1,6 ---- /* gv.c * ! * Copyright (c) 1991-1999, Larry Wall * * You may distribute under the terms of either the GNU General Public * License or the Artistic License, as specified in the README file. *************** *** 107,117 **** GvSTASH(gv) = (HV*)SvREFCNT_inc(stash); GvNAME(gv) = savepvn(name, len); GvNAMELEN(gv) = len; ! if (multi) GvMULTI_on(gv); if (doproto) { /* Replicate part of newSUB here. */ SvIOK_off(gv); ENTER; start_subparse(0,0); /* Create CV in compcv. */ GvCV(gv) = PL_compcv; LEAVE; --- 107,118 ---- GvSTASH(gv) = (HV*)SvREFCNT_inc(stash); GvNAME(gv) = savepvn(name, len); GvNAMELEN(gv) = len; ! if (multi || doproto) /* doproto means it _was_ mentioned */ GvMULTI_on(gv); if (doproto) { /* Replicate part of newSUB here. */ SvIOK_off(gv); ENTER; + /* XXX unsafe for threads if eval_owner isn't held */ start_subparse(0,0); /* Create CV in compcv. */ GvCV(gv) = PL_compcv; LEAVE; *************** *** 122,130 **** CvSTASH(GvCV(gv)) = PL_curstash; #ifdef USE_THREADS CvOWNER(GvCV(gv)) = 0; ! if (!CvMUTEXP(GvCV(gv))) New(666, CvMUTEXP(GvCV(gv)), 1, perl_mutex); ! MUTEX_INIT(CvMUTEXP(GvCV(gv))); #endif /* USE_THREADS */ if (proto) { sv_setpv((SV*)GvCV(gv), proto); --- 123,132 ---- CvSTASH(GvCV(gv)) = PL_curstash; #ifdef USE_THREADS CvOWNER(GvCV(gv)) = 0; ! if (!CvMUTEXP(GvCV(gv))) { New(666, CvMUTEXP(GvCV(gv)), 1, perl_mutex); ! MUTEX_INIT(CvMUTEXP(GvCV(gv))); ! } #endif /* USE_THREADS */ if (proto) { sv_setpv((SV*)GvCV(gv), proto); *************** *** 614,625 **** IoFLAGS(GvIOn(gv)) |= IOf_ARGV|IOf_START; } break; - - case 'a': - case 'b': - if (len == 1) - GvMULTI_on(gv); - break; case 'E': if (strnEQ(name, "EXPORT", 6)) GvMULTI_on(gv); --- 616,621 ---- *************** *** 747,752 **** --- 743,749 ---- case '/': case '|': case '\001': + case '\003': case '\004': case '\005': case '\006': *************** *** 850,856 **** SvREFCNT(io) = 1; SvOBJECT_on(io); iogv = gv_fetchpv("FileHandle::", FALSE, SVt_PVHV); ! if (!iogv) iogv = gv_fetchpv("IO::Handle::", TRUE, SVt_PVHV); SvSTASH(io) = (HV*)SvREFCNT_inc(GvHV(iogv)); return io; --- 847,854 ---- SvREFCNT(io) = 1; SvOBJECT_on(io); iogv = gv_fetchpv("FileHandle::", FALSE, SVt_PVHV); ! /* unless exists($main::{FileHandle}) and defined(%main::FileHandle::) */ ! if (!(iogv && GvHV(iogv) && HvARRAY(GvHV(iogv)))) iogv = gv_fetchpv("IO::Handle::", TRUE, SVt_PVHV); SvSTASH(io) = (HV*)SvREFCNT_inc(GvHV(iogv)); return io; *************** *** 991,996 **** --- 989,995 ---- MAGIC* mg=mg_find((SV*)stash,'c'); AMT *amtp = (mg) ? (AMT*)mg->mg_ptr: (AMT *) NULL; AMT amt; + STRLEN n_a; if (mg && amtp->was_ok_am == PL_amagic_generation && amtp->was_ok_sub == PL_sub_generation) *************** *** 1038,1044 **** default: if (!SvROK(sv)) { if (!SvOK(sv)) break; ! gv = gv_fetchmethod(stash, SvPV(sv, PL_na)); if (gv) cv = GvCV(gv); break; } --- 1037,1043 ---- default: if (!SvROK(sv)) { if (!SvOK(sv)) break; ! gv = gv_fetchmethod(stash, SvPV(sv, n_a)); if (gv) cv = GvCV(gv); break; } *************** *** 1099,1105 **** GV *ngv; DEBUG_o( deb("Resolving method `%.256s' for overloaded `%s' in package `%.256s'\n", ! SvPV(GvSV(gv), PL_na), cp, HvNAME(stash)) ); if (!SvPOK(GvSV(gv)) || !(ngv = gv_fetchmethod_autoload(stash, SvPVX(GvSV(gv)), FALSE))) --- 1098,1104 ---- GV *ngv; DEBUG_o( deb("Resolving method `%.256s' for overloaded `%s' in package `%.256s'\n", ! SvPV(GvSV(gv), n_a), cp, HvNAME(stash)) ); if (!SvPOK(GvSV(gv)) || !(ngv = gv_fetchmethod_autoload(stash, SvPVX(GvSV(gv)), FALSE))) diff -c 'perl5.005_02/gv.h' 'perl5.005_03/gv.h' Index: ./gv.h *** ./gv.h Thu Jul 23 23:00:18 1998 --- ./gv.h Sat Mar 27 11:57:04 1999 *************** *** 1,6 **** /* gv.h * ! * Copyright (c) 1991-1997, Larry Wall * * You may distribute under the terms of either the GNU General Public * License or the Artistic License, as specified in the README file. --- 1,6 ---- /* gv.h * ! * Copyright (c) 1991-1999, Larry Wall * * You may distribute under the terms of either the GNU General Public * License or the Artistic License, as specified in the README file. diff -c 'perl5.005_02/handy.h' 'perl5.005_03/handy.h' Index: ./handy.h *** ./handy.h Sun Aug 2 00:15:06 1998 --- ./handy.h Sat Mar 27 11:57:02 1999 *************** *** 1,6 **** /* handy.h * ! * Copyright (c) 1991-1997, Larry Wall * * You may distribute under the terms of either the GNU General Public * License or the Artistic License, as specified in the README file. --- 1,6 ---- /* handy.h * ! * Copyright (c) 1991-1999, Larry Wall * * You may distribute under the terms of either the GNU General Public * License or the Artistic License, as specified in the README file. diff -c 'perl5.005_02/hints/aix.sh' 'perl5.005_03/hints/aix.sh' Index: ./hints/aix.sh *** ./hints/aix.sh Thu Jul 23 23:00:18 1998 --- ./hints/aix.sh Sun Mar 28 11:28:09 1999 *************** *** 19,24 **** --- 19,28 ---- usemymalloc='n' + # Intuiting the existence of system calls under AIX is difficult, + # at best; the safest technique is to find them empirically. + usenm='undef' + so="a" dlext="so" *************** *** 63,102 **** # symbol: boot_$(EXP) can it be auto-generated? case "$osvers" in 3*) ! lddlflags='-H512 -T512 -bhalt:4 -bM:SRE -bI:$(PERL_INC)/perl.exp -bE:$(BASEEXT).exp -e _nostart -lc' ;; *) ! lddlflags='-bhalt:4 -bM:SRE -bI:$(PERL_INC)/perl.exp -bE:$(BASEEXT).exp -b noentry -lc' ! ! ;; esac ! if [ "X$usethreads" = "X$define" ]; then ! ccflags="$ccflags -DNEED_PTHREAD_INIT" ! case "$cc" in ! xlc_r | cc_r) ! ;; ! cc | '') ! cc=xlc_r # Let us be stricter. ! ;; ! *) ! cat >&4 < UU/usethreads.cbu <<'EOCBU' ! case "$usethreads" in ! $define|true|[yY]*) ! ccflags="$ccflags -DNEED_PTHREAD_INIT" ! case "$cc" in ! cc_r) ;; ! cc|xlc_r) ! echo >&4 "Switching cc to cc_r because of POSIX threads." ! # xlc_r has been known to produce buggy code in AIX 4.3.2. ! # (e.g. pragma/overload core dumps) ! # --jhi@iki.fi ! cc=cc_r ! ;; ! '') ! cc=cc_r ! ;; ! *) ! cat >&4 < # Merged by Andy Dougherty ! # Last revised Fri Jun 2 11:21:27 EDT 1995 # uname -a looks like # DomainOS newton 10.4.1 bsd4.3 425t # We want to use both BSD includes and some of the features from the # /sys5 includes. ! ccflags="$ccflags -A cpu,mathchip -I/usr/include -I/sys5/usr/include" # These adjustments are necessary (why?) to compile malloc.c. freetype='void' --- 1,17 ---- # Info from Johann Klasek # Merged by Andy Dougherty ! # Last revised Tue Mar 16 19:12:22 EET 1999 by ! # Jarkko Hietaniemi # uname -a looks like # DomainOS newton 10.4.1 bsd4.3 425t # We want to use both BSD includes and some of the features from the # /sys5 includes. ! ccflags="$ccflags -A cpu,mathchip -I`pwd`/apollo -I/usr/include -I/sys5/usr/include" ! ! # When Apollo runs a script with "#!", it sets argv[0] to the script name. ! toke_cflags='ccflags="$ccflags -DARG_ZERO_IS_SCRIPT"' # These adjustments are necessary (why?) to compile malloc.c. freetype='void' diff -c 'perl5.005_02/hints/beos.sh' 'perl5.005_03/hints/beos.sh' Index: ./hints/beos.sh Prereq: 1.1 *** ./hints/beos.sh Sat Jul 25 21:17:47 1998 --- ./hints/beos.sh Thu Jan 28 21:18:08 1999 *************** *** 1,11 **** # BeOS hints file # $Id: beos.sh,v 1.1 1998/02/16 03:51:45 dogcow Exp $ ! if [ ! -f beos/nm ]; then mwcc -w all -o beos/nm beos/nm.c; fi prefix="/boot/home/config" ! cpp="mwcc -e" libpth='/boot/beos/system/lib /boot/home/config/lib' usrinc='/boot/develop/headers/posix' --- 1,12 ---- # BeOS hints file # $Id: beos.sh,v 1.1 1998/02/16 03:51:45 dogcow Exp $ ! if [ ! -f beos/nm ]; then mwcc -w all -o beos/nm beos/nm.c 2>/dev/null; fi ! # If this fails, that's all right - it's only for PPC. prefix="/boot/home/config" ! #cpp="mwcc -e" libpth='/boot/beos/system/lib /boot/home/config/lib' usrinc='/boot/develop/headers/posix' *************** *** 37,45 **** # the array syserrlst[] is useless for the most part. # large negative numbers really kind of suck in arrays. ! #d_socket='undef' # Sockets really don't work with the current version of perl and the # current BeOS sockets; I suspect that a new module a la GSAR's WIN32 port # will be required. export PATH="$PATH:$PWD/beos" --- 38,53 ---- # the array syserrlst[] is useless for the most part. # large negative numbers really kind of suck in arrays. ! d_socket='undef' ! d_gethbyaddr='undef' ! d_gethbyname='undef' ! d_getsbyname='undef' ! ! ld='gcc' ! # Sockets really don't work with the current version of perl and the # current BeOS sockets; I suspect that a new module a la GSAR's WIN32 port # will be required. + # Of course, this may also change with R5. export PATH="$PATH:$PWD/beos" diff -c 'perl5.005_02/hints/dec_osf.sh' 'perl5.005_03/hints/dec_osf.sh' Index: ./hints/dec_osf.sh *** ./hints/dec_osf.sh Thu Jul 23 23:00:19 1998 --- ./hints/dec_osf.sh Thu Mar 25 23:45:35 1999 *************** *** 177,206 **** ;; esac - if [ "X$usethreads" = "X$define" ]; then - # Threads interfaces changed with V4.0. - case "$_DEC_uname_r" in - *[123].*) libswanted="$libswanted pthreads mach exc c_r" - ccflags="-threads $ccflags" - ;; - *) libswanted="$libswanted pthread exc" - ccflags="-pthread $ccflags" - ;; - esac - usemymalloc='n' - fi - # # Make embedding in things like INN and Apache more memory friendly. # Keep it overridable on the Configure command line, though, so that # "-Uuseshrplib" prevents this default. # ! # This or the glibpth change above breaks the build. Commented out ! # for this snapshot. ! #case "$_DEC_cc_style.$useshrplib" in ! # new.) useshrplib="$define" ;; ! #esac # # Unset temporary variables no more needed. --- 177,213 ---- ;; esac # # Make embedding in things like INN and Apache more memory friendly. # Keep it overridable on the Configure command line, though, so that # "-Uuseshrplib" prevents this default. # ! case "$_DEC_cc_style.$useshrplib" in ! new.) useshrplib="$define" ;; ! esac ! ! # This script UU/usethreads.cbu will get 'called-back' by Configure ! # after it has prompted the user for whether to use threads. ! cat > UU/usethreads.cbu <<'EOCBU' ! case "$usethreads" in ! $define|true|[yY]*) ! # Threads interfaces changed with V4.0. ! case "`uname -r`" in ! *[123].*) ! libswanted="$libswanted pthreads mach exc c_r" ! ccflags="-threads $ccflags" ! ;; ! *) ! libswanted="$libswanted pthread exc" ! ccflags="-pthread $ccflags" ! ;; ! esac ! ! usemymalloc='n' ! ;; ! esac ! EOCBU # # Unset temporary variables no more needed. *************** *** 216,222 **** # # 19-Dec-1997 Spider Boardman # ! # * Newer Digial UNIX compilers enforce signaling for NaN without # -ieee. Added -fprm d at the same time since it's friendlier for # embedding. # --- 223,229 ---- # # 19-Dec-1997 Spider Boardman # ! # * Newer Digital UNIX compilers enforce signaling for NaN without # -ieee. Added -fprm d at the same time since it's friendlier for # embedding. # diff -c 'perl5.005_02/hints/dos_djgpp.sh' 'perl5.005_03/hints/dos_djgpp.sh' Index: ./hints/dos_djgpp.sh *** ./hints/dos_djgpp.sh Thu Jul 23 23:00:19 1998 --- ./hints/dos_djgpp.sh Sun Jan 24 08:47:35 1999 *************** *** 52,59 **** eagain='EAGAIN' rd_nodata='-1' ! if [ "X$usethreads" = "X$define" ]; then ! set `echo X "$libswanted "| sed -e 's/ c / gthreads c /'` ! shift ! libswanted="$*" ! fi --- 52,65 ---- eagain='EAGAIN' rd_nodata='-1' ! # This script UU/usethreads.cbu will get 'called-back' by Configure ! # after it has prompted the user for whether to use threads. ! cat > UU/usethreads.cbu <<'EOCBU' ! case "$usethreads" in ! $define|true|[yY]*) ! set `echo X "$libswanted "| sed -e 's/ c / gthreads c /'` ! shift ! libswanted="$*" ! ;; ! esac ! EOCBU diff -c 'perl5.005_02/hints/dynixptx.sh' 'perl5.005_03/hints/dynixptx.sh' Index: ./hints/dynixptx.sh *** ./hints/dynixptx.sh Thu Jul 23 23:00:19 1998 --- ./hints/dynixptx.sh Thu Nov 26 09:28:12 1998 *************** *** 1,5 **** --- 1,9 ---- # Sequent Dynix/Ptx v. 4 hints # Created 1996/03/15 by Brad Howerter, bhower@wgc.woodward.com + + # Modified 1998/11/10 by Martin J. Bligh, mbligh@sequent.com + # to incorporate work done by Kurtis D. Rader & myself. + # Use Configure -Dcc=gcc to use gcc. # cc wants -G for dynamic loading *************** *** 15,24 **** # Configure defaults to usenm='y', which doesn't work very well usenm='n' ! # Reported by bruce@aps.org ("Bruce P. Schuck") as needed for ! # DYNIX/ptx 4.0 V4.2.1 to get socket i/o to work ! # Not defined by default in case they break other versions. ! # These probably need to be worked into a piece of code that ! # checks for the need for this setting. ! # cppflags='-Wc,+abi-socket -I/usr/local/include' ! # ccflags='-Wc,+abi-socket -I/usr/local/include' --- 19,59 ---- # Configure defaults to usenm='y', which doesn't work very well usenm='n' ! # for performance, apparently this makes a huge difference (~krader) ! ! d_vfork='define' ! optimize='-Wc,-O3 -W0,-xstring' ! ! # We override d_socket because it's very hard for Configure to get it right ! # in Dynix/Ptx, for several reasons. ! # (1) the socket interface is in libsocket.so -- this wouldn't be so hard ! # for Configure to fathom...but it gets more tangled. ! # (2) if the system has been patched there can be libsocket.so.1.FOO.BAR, ! # the FOO.BAR being the old version of the system before the patching. ! # Configure picks up the old broken version. ! # (3) libsocket.so points to either libsocket.so.1 (v4.2) ! # or libsocket.so.1.1 (v4.4) The socket call in libsocket.so.1.1 ! # (BSD socket library) is called bsd_socket(), and has a macro wrapper ! # to hide this. ! # This information kindly provided by Martin J. Bligh of Sequent. ! # As he puts it: ! # "Sequent has unusual capabilities, taking it above and beyond ! # the complexity of any other vendor" :-) ! # ! # Jarkko Hietaniemi November 1998 ! ! case "$osvers" in ! 4.4*) # configure doesn't find sockets, as they're in libsocket, not libc ! d_socket='define' ! d_oldsock='undef' ! d_sockpair='define' ! ;; ! 4.2*) # on ptx/TCP 4.2, we can use BSD sockets, but they're not the default. ! cppflags='-Wc,+bsd-socket' ! ccflags='-Wc,+bsd-socket' ! ldflags='-Wc,+bsd-socket' ! d_socket='define' ! d_oldsock='undef' ! d_sockpair='define' ! ;; ! esac diff -c 'perl5.005_02/hints/freebsd.sh' 'perl5.005_03/hints/freebsd.sh' Index: ./hints/freebsd.sh *** ./hints/freebsd.sh Thu Jul 23 23:00:19 1998 --- ./hints/freebsd.sh Thu Feb 11 18:05:48 1999 *************** *** 23,28 **** --- 23,32 ---- # Andy Dougherty # Date: Tue Mar 10 16:07:00 EST 1998 # + # Support for FreeBSD/ELF + # Ollivier Robert + # Date: Wed Sep 2 16:22:12 CEST 1998 + # # 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 *************** *** 95,106 **** case "$osvers" in 0.*|1.0*) ;; ! 3.0*) if [ -e /usr/lib/aout ]; then libpth="/usr/lib/aout /usr/local/lib /usr/lib" glibpth="/usr/lib/aout /usr/local/lib /usr/lib" fi - cccdlflags='-DPIC -fpic' lddlflags='-Bshareable' ;; *) cccdlflags='-DPIC -fpic' --- 99,119 ---- case "$osvers" in 0.*|1.0*) ;; ! 3.*|4.0*) ! objformat=`/usr/bin/objformat` ! if [ x$objformat = xelf ]; then ! libpth="/usr/lib /usr/local/lib" ! glibpth="/usr/lib /usr/local/lib" ! ldflags="-Wl,-E " ! lddlflags="-shared " ! else ! if [ -e /usr/lib/aout ]; then libpth="/usr/lib/aout /usr/local/lib /usr/lib" glibpth="/usr/lib/aout /usr/local/lib /usr/lib" fi lddlflags='-Bshareable' + fi + cccdlflags='-DPIC -fpic' ;; *) cccdlflags='-DPIC -fpic' *************** *** 118,155 **** EOM ! # XXX EXPERIMENTAL A.D. 03/09/1998 ! # XXX This script UU/usethreads.cbu will get 'called-back' by Configure ! # XXX after it has prompted the user for whether to use threads. ! cat > UU/usethreads.cbu <<'EOSH' case "$usethreads" in ! $define) ! case "$osvers" in ! 3.0*) ldflags="-pthread $ldflags" ! ;; ! 2.2*) if [ ! -r /usr/lib/libc_r ]; then ! cat <<'EOM' >&4 ! POSIX threads are not supported by default on FreeBSD $uname_r. Follow the ! instructions in 'man pthread' to build and install the needed libraries. EOM ! exit 1 ! fi ! set `echo X "$libswanted "| sed -e 's/ c / c_r /'` ! shift ! libswanted="$*" ! # Configure will probably pick the wrong libc to use for nm ! # scan. ! # The safest quick-fix is just to not use nm at all. ! usenm=false ! ;; ! *) cat <<'EOM' >&4 ! It is not known if FreeBSD $uname_r supports POSIX threads or not. Consider ! upgrading to the latest STABLE release. EOM ! exit 1 ! ;; ! esac ! ;; esac ! EOSH ! # XXX EXPERIMENTAL --end of call-back --- 131,221 ---- EOM ! # From: Anton Berezin ! # To: perl5-porters@perl.org ! # Subject: [PATCH 5.005_54] Configure - hints/freebsd.sh signal handler type ! # Date: 30 Nov 1998 19:46:24 +0100 ! # Message-ID: <864srhhvcv.fsf@lion.plab.ku.dk> ! ! signal_t='void' ! d_voidsig='define' ! ! # set libperl.so.X.X for 2.2.X ! case "$osvers" in ! 2.2*) ! # unfortunately this code gets executed before ! # the equivalent in the main Configure so we copy a little ! # from Configure XXX Configure should be fixed. ! if $test -r $src/patchlevel.h;then ! patchlevel=`awk '/define[ ]+PATCHLEVEL/ {print $3}' $src/patchlevel.h` ! subversion=`awk '/define[ ]+SUBVERSION/ {print $3}' $src/patchlevel.h` ! else ! patchlevel=0 ! subversion=0 ! fi ! libperl="libperl.so.$patchlevel.$subversion" ! unset patchlevel ! unset subversion ! ;; ! esac ! ! # This script UU/usethreads.cbu will get 'called-back' by Configure ! # after it has prompted the user for whether to use threads. ! cat > UU/usethreads.cbu <<'EOCBU' case "$usethreads" in ! $define|true|[yY]*) ! lc_r=`/sbin/ldconfig -r|grep ':-lc_r'|awk '{print $NF}'` ! case "$osvers" in ! 2.2.8*|3.*|4.*) ! if [ ! -r "$lc_r" ]; then ! cat <&4 ! POSIX threads should be supported by FreeBSD $osvers -- ! but your system is missing the shared libc_r. ! (/sbin/ldconfig -r doesn't find any). ! ! Consider using the latest STABLE release. EOM ! exit 1 ! fi ! ldflags="-pthread $ldflags" ! ;; ! 2.2*) ! cat <&4 ! POSIX threads are not supported well by FreeBSD $osvers. ! ! Please consider upgrading to at least FreeBSD 2.2.8, ! or preferably to 3.something. ! ! (While 2.2.7 does have pthreads, it has some problems ! with the combination of threads and pipes and therefore ! many Perl tests will either hang or fail.) EOM ! exit 1 ! ;; ! *) cat <&4 ! I did not know that FreeBSD $osvers supports POSIX threads. ! ! Feel free to tell perlbug@perl.com otherwise. ! EOM ! exit 1 ! ;; ! esac ! ! set `echo X "$libswanted "| sed -e 's/ c / c_r /'` ! shift ! libswanted="$*" ! # Configure will probably pick the wrong libc to use for nm scan. ! # The safest quick-fix is just to not use nm at all... ! usenm=false ! ! case "$osvers" in ! 2.2.8*) ! # ... but this does not apply for 2.2.8 - we know it's safe ! libc="$lc_r" ! usenm=true ! ;; ! esac ! ! unset lc_r esac ! EOCBU diff -c /dev/null 'perl5.005_03/hints/gnu.sh' Index: hints/gnu.sh *** hints/gnu.sh Wed Dec 31 18:00:00 1969 --- hints/gnu.sh Thu Feb 11 18:05:48 1999 *************** *** 0 **** --- 1,33 ---- + # hints/gnu.sh + # Last modified: Thu Dec 10 20:47:28 CET 1998 + # Mark Kettenis + + # libnsl is unusable on the Hurd. + # XXX remove this once SUNRPC is implemented. + set `echo X "$libswanted "| sed -e 's/ nsl / /'` + shift + libswanted="$*" + + case "$optimize" in + '') optimize='-O2' ;; + esac + + # Flags needed to produce shared libraries. + lddlflags='-shared' + + # Flags needed by programs that use dynamic linking. + ccdlflags='-Wl,-E' + + # The following routines are only available as stubs in GNU libc. + # XXX remove this once metaconf detects the GNU libc stubs. + d_msgctl='undef' + d_msgget='undef' + d_msgrcv='undef' + d_msgsnd='undef' + d_semctl='undef' + d_semget='undef' + d_semop='undef' + d_shmat='undef' + d_shmctl='undef' + d_shmdt='undef' + d_shmget='undef' diff -c 'perl5.005_02/hints/hpux.sh' 'perl5.005_03/hints/hpux.sh' Index: ./hints/hpux.sh *** ./hints/hpux.sh Thu Jul 23 23:00:20 1998 --- ./hints/hpux.sh Wed Mar 3 20:35:36 1999 *************** *** 20,25 **** --- 20,26 ---- # Distinguish between MC68020, MC68030, MC68040 # Don't assume every OS != 10 is < 10, (e.g., 11). # From: Chuck Phillips + # HP-UX 10 pthreads hints: Matthew T Harden # This version: August 15, 1997 # Current maintainer: Jeff Okamoto *************** *** 80,85 **** --- 81,96 ---- esac else ccflags="$ccflags -Aa" # The add-on compiler supports ANSI C + # cppstdin and cpprun need the -Aa option if you use the unbundled + # ANSI C compiler (*not* the bundled K&R compiler or gcc) + # [XXX this should be set automatically by Configure, but isn't yet.] + # [XXX This is reported not to work. You may have to edit config.sh. + # After running Configure, set cpprun and cppstdin in config.sh, + # run "Configure -S" and then "make".] + cpprun="${cc:-cc} -E -Aa" + cppstdin="$cpprun" + cppminus='-' + cpplast='-' fi # For HP's ANSI C compiler, up to "+O3" is safe for everything # except shared libraries (PIC code). Max safe for PIC is "+O2". *************** *** 128,133 **** --- 139,198 ---- selecttype='int *' fi + # This script UU/usethreads.cbu will get 'called-back' by Configure + # after it has prompted the user for whether to use threads. + cat > UU/usethreads.cbu <<'EOCBU' + case "$usethreads" in + $define|true|[yY]*) + if [ "$xxOsRevMajor" -lt 10 ]; then + cat <&4 + HP-UX $xxOsRevMajor cannot support POSIX threads. + Consider upgrading to at least HP-UX 11. + Cannot continue, aborting. + EOM + exit 1 + fi + case "$xxOsRevMajor" in + 10) + # Under 10.X, a threaded perl can be built, but it needs + # libcma and OLD_PTHREADS_API. Also needs to + # be #included before any other includes (in perl.h) + if [ ! -f /usr/include/pthread.h -o ! -f /usr/lib/libcma.sl ]; then + cat <&4 + In HP-UX 10.X for POSIX threads you need both of the files + /usr/include/pthread.h and /usr/lib/libcma.sl. + Either you must install the CMA package or you must upgrade to HP-UX 11. + Cannot continue, aborting. + EOM + exit 1 + fi + + # HP-UX 10.X uses the old pthreads API + case "$d_oldpthreads" in + '') d_oldpthreads="$define" ;; + esac + + # include libcma before all the others + libswanted="cma $libswanted" + + # tell perl.h to include before other include files + ccflags="$ccflags -DPTHREAD_H_FIRST" + + # CMA redefines select to cma_select, and cma_select expects int * + # instead of fd_set * (just like 9.X) + selecttype='int *' + ;; + 11 | 12) # 12 may want upping the _POSIX_C_SOURCE datestamp... + ccflags=" -D_POSIX_C_SOURCE=199506L $ccflags" + set `echo X "$libswanted "| sed -e 's/ c / pthread c /'` + shift + libswanted="$*" + ;; + esac + usemymalloc='n' + ;; + esac + EOCBU # Remove bad libraries that will cause problems # (This doesn't remove libraries that don't actually exist) *************** *** 183,206 **** # assembler of the form: # (warning) Use of GR3 when frame >= 8192 may cause conflict. # These warnings are harmless and can be safely ignored. - - # - # cppstdin and cpprun need the -Aa option if you use the unbundled - # ANSI C compiler (*not* the bundled K&R compiler or gcc) - # [XXX this should be enabled automatically by Configure, but isn't yet.] - # [XXX This is reported not to work. You may have to edit config.sh. - # After running Configure, set cpprun and cppstdin in config.sh, - # run "Configure -S" and then "make".] - # - case "$cppstdin" in - '') - case "$ccflags" in - *-Aa*) - cpprun="${cc:-cc} -E -Aa" - cppstdin="$cpprun" - cppminus='-' - cpplast='-' - ;; - esac - ;; - esac --- 248,250 ---- diff -c 'perl5.005_02/hints/irix_4.sh' 'perl5.005_03/hints/irix_4.sh' Index: ./hints/irix_4.sh *** ./hints/irix_4.sh Thu Jul 23 23:00:20 1998 --- ./hints/irix_4.sh Sun Jan 24 08:47:39 1999 *************** *** 22,24 **** --- 22,35 ---- -DSTANDARD_C -cckr in ccflags. EOM + + case "$usethreads" in + $define|true|[yY]*) + cat >&4 <&4 <&1`" in *7.0*) # Mongoose 7.0 ccflags="$ccflags -D_BSD_TYPES -D_BSD_TIME -woff 1009,1042,1048,1110,1116,1184 -OPT:Olimit=0" ! optimize='none' ;; *7.1*|*7.2|*7.20) # Mongoose 7.1+ ccflags="$ccflags -D_BSD_TYPES -D_BSD_TIME -woff 1009,1110,1184 -OPT:Olimit=0" ! optimize='-O3' # This is a temporary fix for 5.005. # Leave pp_ctl_cflags line at left margin for Configure. See # hints/README.hints, especially the section --- 53,63 ---- case "`$cc -version 2>&1`" in *7.0*) # Mongoose 7.0 ccflags="$ccflags -D_BSD_TYPES -D_BSD_TIME -woff 1009,1042,1048,1110,1116,1184 -OPT:Olimit=0" ! optimize='none' ;; *7.1*|*7.2|*7.20) # Mongoose 7.1+ ccflags="$ccflags -D_BSD_TYPES -D_BSD_TIME -woff 1009,1110,1184 -OPT:Olimit=0" ! optimize='-O3' # This is a temporary fix for 5.005. # Leave pp_ctl_cflags line at left margin for Configure. See # hints/README.hints, especially the section *************** *** 65,76 **** pp_ctl_cflags='optimize=-O' ;; *7.*) # Mongoose 7.2.1+ ! ccflags="$ccflags -D_BSD_TYPES -D_BSD_TIME -woff 1009,1110,1184 -OPT:Olimit=0:space=on" ! optimize='-O3' ;; *6.2*) # Ragnarok 6.2 ccflags="$ccflags -D_BSD_TYPES -D_BSD_TIME -woff 1009,1110,1184" ! optimize='none' ;; *) # Be safe and not optimize ccflags="$ccflags -D_BSD_TYPES -D_BSD_TIME -woff 1009,1110,1184 -OPT:Olimit=0" --- 65,76 ---- pp_ctl_cflags='optimize=-O' ;; *7.*) # Mongoose 7.2.1+ ! ccflags="$ccflags -D_BSD_TYPES -D_BSD_TIME -woff 1009,1110,1184 -OPT:Olimit=0:space=ON" ! optimize='-O3' ;; *6.2*) # Ragnarok 6.2 ccflags="$ccflags -D_BSD_TYPES -D_BSD_TIME -woff 1009,1110,1184" ! optimize='none' ;; *) # Be safe and not optimize ccflags="$ccflags -D_BSD_TYPES -D_BSD_TIME -woff 1009,1110,1184 -OPT:Olimit=0" *************** *** 78,86 **** ;; esac ! ld=ld # perl's malloc can return improperly aligned buffer ! usemymalloc='undef' # NOTE: -L/usr/lib32 -L/lib32 are automatically selected by the linker ldflags=' -L/usr/local/lib32 -L/usr/local/lib' cccdlflags=' ' --- 78,107 ---- ;; esac ! # this is to accommodate the 'modules' capability of the ! # 7.2 MIPSPro compilers, which allows for the compilers to be installed ! # in a nondefault location. Almost everything works as expected, but ! # /usr/include isn't caught properly. Hence see the /usr/include/pthread.h ! # change below to include TOOLROOT (a modules environment variable), ! # and the following code. Additional ! # code to accommodate the 'modules' environment should probably be added ! # here if possible, or be inserted as a ${TOOLROOT} reference before ! # absolute paths (again, see the pthread.h change below). ! # -- krishna@sgi.com, 8/23/98 ! ! if [ "X${TOOLROOT}" != "X" ]; then ! # we cant set cppflags because it gets overwritten ! # we dont actually need $TOOLROOT/usr/include on the cc line cuz the ! # modules functionality already includes it but ! # XXX - how do I change cppflags in the hints file? ! ccflags="$ccflags -I${TOOLROOT}/usr/include" ! usrinc="${TOOLROOT}/usr/include" ! fi ! ! ld=$cc # perl's malloc can return improperly aligned buffer ! # usemymalloc='undef' ! malloc_cflags='ccflags="-DSTRICT_ALIGNMENT $ccflags"' # NOTE: -L/usr/lib32 -L/lib32 are automatically selected by the linker ldflags=' -L/usr/local/lib32 -L/usr/local/lib' cccdlflags=' ' *************** *** 138,159 **** shift libswanted="$*" ! if [ "X$usethreads" = "X$define" -o "X$usethreads" = "Xy" ]; then ! if test ! -f /usr/include/pthread.h -o ! -f /usr/lib/libpthread.so; then ! uname_r=`uname -r` ! case "`uname -r`" in ! 5*|6.0|6.1) ! echo >&4 "IRIX $uname_r does not have the POSIX threads." ! echo >&4 "You should upgrade to at least IRIX 6.2 with pthread patches." ! echo >&4 "Cannot continue, aborting." ! exit 1 ! ;; ! 6.2) ! echo >&4 "" ! cat >&4 < UU/usethreads.cbu <<'EOCBU' ! case "$usethreads" in ! $define|true|[yY]*) ! if test ! -f ${TOOLROOT}/usr/include/pthread.h -o ! -f /usr/lib/libpthread.so; then ! case "`uname -r`" in ! [1-5].*|6.[01]) ! cat >&4 <&4 <&4 "IRIX $uname_r should have the POSIX threads." - echo >&4 "But somehow you do not seem to have them installed." - echo >&4 "Cannot continue, aborting." - exit 1 - ;; - esac - unset uname_r - fi - # -lpthread needs to come before -lc but after other libraries such - # as -lgdbm and such like. We assume here that -lc is present in - # libswanted. If that fails to be true in future, then this can be - # changed to add pthread to the very end of libswanted. - set `echo X "$libswanted "| sed -e 's/ c / pthread /'` - ld="${cc:-cc}" - shift - libswanted="$*" - usemymalloc='n' - fi --- 185,211 ---- Without patch 2401, a kernel bug in IRIX 6.2 will cause your machine to panic and crash when running threaded perl. IRIX 6.3 and up should be OK. + EOM + ;; + [67].*) + cat >&4 <&4 <&4 "IRIX 6.0 does not have POSIX threads." ! echo >&4 "You should upgrade to at least IRIX 6.3." ! echo >&4 "Cannot continue, aborting." ! exit 1 ! fi --- 42,54 ---- # shift # libswanted="$*" ! case "$usethreads" in ! $define|true|[yY]*) ! cat >&4 <&4 "IRIX 6.1 does not have POSIX threads." ! echo >&4 "You should upgrade to at least IRIX 6.3." ! echo >&4 "Cannot continue, aborting." ! exit 1 ! fi --- 42,54 ---- # shift # libswanted="$*" ! case "$usethreads" in ! $define|true|[yY]*) ! cat >&4 < # Message-Id: <33EF1634.B36B6500@pobox.com> # ! # MkLinux (osname=linux,archname=ppc-linux), which differs slightly from other ! # linuces, needs special flags passed in order for dynamic loading to work. # instead of the recommended: # ccdlflags='-rdynamic' # # it should be: # ccdlflags='-Wl,-E' ! ! # XXX EXPERIMENTAL A.D. 2/27/1998 ! # XXX This script UU/usethreads.cbu will get 'called-back' by Configure ! # XXX after it has prompted the user for whether to use threads. ! cat > UU/usethreads.cbu <<'EOSH' case "$usethreads" in $define|true|[yY]*) ! ccflags="-D_REENTRANT $ccflags" ! # -lpthread needs to come before -lc but after other libraries such ! # as -lgdbm and such like. We assume here that -lc is present in ! # libswanted. If that fails to be true in future, then this can be ! # changed to add pthread to the very end of libswanted. ! set `echo X "$libswanted "| sed -e 's/ c / pthread c /'` ! shift ! libswanted="$*" ! ;; esac ! EOSH ! # XXX EXPERIMENTAL --end of call-back --- 208,238 ---- # Shimpei Yamashita # Message-Id: <33EF1634.B36B6500@pobox.com> # ! # The DR2 of MkLinux (osname=linux,archname=ppc-linux) may need ! # special flags passed in order for dynamic loading to work. # instead of the recommended: + # # ccdlflags='-rdynamic' # # it should be: # ccdlflags='-Wl,-E' ! # ! # So if your DR2 (DR3 came out summer 1998, consider upgrading) ! # has problems with dynamic loading, uncomment the ! # following three lines, make distclean, and re-Configure: ! #case "`uname -r | sed 's/^[0-9.-]*//'``arch`" in ! #'osfmach3ppc') ccdlflags='-Wl,-E' ;; ! #esac ! ! # This script UU/usethreads.cbu will get 'called-back' by Configure ! # after it has prompted the user for whether to use threads. ! cat > UU/usethreads.cbu <<'EOCBU' case "$usethreads" in $define|true|[yY]*) ! ccflags="-D_REENTRANT $ccflags" ! set `echo X "$libswanted "| sed -e 's/ c / pthread c /'` ! shift ! libswanted="$*" ! ;; esac ! EOCBU diff -c /dev/null 'perl5.005_03/hints/mint.sh' Index: hints/mint.sh *** hints/mint.sh Wed Dec 31 18:00:00 1969 --- hints/mint.sh Thu Jan 28 19:13:55 1999 *************** *** 0 **** --- 1,94 ---- + # hints/mint.sh + # + # talk to gufl0000@stud.uni-sb.de if you want to change this file. + # Please read the README.mint file. + # + # misc stuff + + case `uname -m` in + atarist*) archname="m68000-mint" + ;; + *) archname="m68k-mint" + ;; + esac + + here=`pwd | tr -d '\015'` + + cc='gcc' + + # The weird include path is really to work around some bugs in + # broken system header files. + ccflags="-D__MINT__ -Uatarist -DDEBUGGING -I$here/../mint" + + # libs + + libpth="$prefix/lib /usr/lib /usr/local/lib" + glibpth="$libpth" + xlibpth="$libpth" + + libswanted='gdbm socket port m' + so='none' + + # + # compiler & linker flags + # + optimize='-O2 -fomit-frame-pointer -fno-defer-pop -fstrength-reduce' + + # The setlocale function in the MiNTLib is actually a bad joke. We + # lend a workaround from Ultrix. If neither LC_ALL nor LANG is + # set in the environment, perl won't complain. If one is set to + # anything but "C" you will see a warning. Note that you can + # still use the GNU extension "$LANGUAGE" if you want to use + # the i18n features of some GNU packages. + util_cflags='ccflags="$ccflags -DLOCALE_ENVIRON_REQUIRED"' + + # + # Some good answers to the questions in Configure: + usenm='true' + d_suidsafe='true' + clocktype='long' + usevfork='true' + d_fsetpos='fpos_t' + gidtype='gid_t' + groupstype='gid_t' + lseektype='long' + models='none' + modetype='mode_t' + sizetype='size_t' + timetype='time_t' + uidtype='uid_t' + + # Don't remove that leading tab character (Configure Black Magic (TM)). + broken_pwd= + case "`/bin/pwd|tr -d xy|tr '\015\012' 'xy'`" in + *xy) broken_pwd=yes ;; + esac + + if test X"$broken_pwd" = Xyes + then + echo " " + echo "*** Building fixed 'pwd'... (as described in README.mint) ***" + echo " " + cd mint + make pwd + cd .. + if test -x mint/pwd -a -w /usr/bin + then + echo " " + echo "*** Installing fixed 'pwd'... ***" + echo " " + cd mint + make install + cd .. + if cmp -s mint/pwd /usr/bin/pwd + then + echo "*** Installed fixed 'pwd' successfully. ***" + else + echo "*** Failed to install fixed 'pwd'. Aborting. ***" + exit 1 + fi + else + echo "*** Cannot install fixed 'pwd'. Aborting. ***" + exit 1 + fi + fi diff -c 'perl5.005_02/hints/mpeix.sh' 'perl5.005_03/hints/mpeix.sh' Index: ./hints/mpeix.sh *** ./hints/mpeix.sh Thu Jul 23 23:00:20 1998 --- ./hints/mpeix.sh Thu Jan 28 19:13:55 1999 *************** *** 51,58 **** # Linking. # lddlflags='-b' ! libs='-lbind -lsvipc -lsocket -lm -lc' ! loclibpth='/usr/local/lib /usr/contrib/lib /BIND/PUB/lib' # # External functions and data items. # --- 51,58 ---- # Linking. # lddlflags='-b' ! libs='-lbind -lsyslog -lcurses -lsvipc -lsocket -lm -lc' ! loclibpth='/usr/local/lib /usr/contrib/lib /BIND/PUB/lib /SYSLOG/PUB' # # External functions and data items. # diff -c 'perl5.005_02/hints/netbsd.sh' 'perl5.005_03/hints/netbsd.sh' Index: ./hints/netbsd.sh *** ./hints/netbsd.sh Thu Jul 23 23:00:21 1998 --- ./hints/netbsd.sh Sun Mar 14 15:01:09 1999 *************** *** 1,12 **** # hints/netbsd.sh # ! # talk to mrg@eterna.com.au if you want to change this file. # # netbsd keeps dynamic loading dl*() functions in /usr/lib/crt0.o, # so Configure doesn't find them (unless you abandon the nm scan). # this should be *just* 0.9 below as netbsd 0.9a was the first to ! # introduce shared libraries. however, they don't work/build on ! # pmax, powerpc and alpha ports correctly, yet. case "$archname" in '') --- 1,11 ---- # hints/netbsd.sh # ! # talk to packages@netbsd.org if you want to change this file. # # netbsd keeps dynamic loading dl*() functions in /usr/lib/crt0.o, # so Configure doesn't find them (unless you abandon the nm scan). # this should be *just* 0.9 below as netbsd 0.9a was the first to ! # introduce shared libraries. case "$archname" in '') *************** *** 19,52 **** usedl="$undef" ;; *) ! case `uname -m` in ! alpha|powerpc|pmax) d_dlopen=$undef ! ;; ! # this doesn't work (yet). ! # alpha) ! # d_dlopen=$define ! # d_dlerror=$define ! # cccdlflags="-DPIC -fPIC $cccdlflags" ! # lddlflags="-shared $lddlflags" ! # ;; ! *) d_dlopen=$define d_dlerror=$define # we use -fPIC here because -fpic is *NOT* enough for some of the # extensions like Tk on some netbsd platforms (the sparc is one) cccdlflags="-DPIC -fPIC $cccdlflags" lddlflags="-Bforcearchive -Bshareable $lddlflags" ! ;; ! esac ! ;; ! esac ! # netbsd 1.3 linker warns about setr[gu]id being deprecated. ! # (setregid, setreuid, preferred?) ! case "$osvers" in ! 1.3|1.3*) ! d_setrgid="$undef" ! d_setruid="$undef" ;; esac --- 18,43 ---- usedl="$undef" ;; *) ! if [ -f /usr/libexec/ld.elf_so ]; then ! d_dlopen=$define ! d_dlerror=$define ! ccdlflags="-Wl,-E -Wl,-R${PREFIX}/lib $ccdlflags" ! cccdlflags="-DPIC -fPIC $cccdlflags" ! lddlflags="--whole-archive -shared $lddlflags" ! elif [ "`uname -m`" = "pmax" ]; then ! # NetBSD 1.3 and 1.3.1 on pmax shipped an `old' ld.so, which will not work. d_dlopen=$undef ! elif [ -f /usr/libexec/ld.so ]; then d_dlopen=$define d_dlerror=$define + ccdlflags="-Wl,-R${PREFIX}/lib $ccdlflags" # we use -fPIC here because -fpic is *NOT* enough for some of the # extensions like Tk on some netbsd platforms (the sparc is one) cccdlflags="-DPIC -fPIC $cccdlflags" lddlflags="-Bforcearchive -Bshareable $lddlflags" ! else ! d_dlopen=$undef ! fi ;; esac *************** *** 55,79 **** # way to make perl call setuid() or setgid(). if they aren't, then # ($<, $>) = ($u, $u); will work (same for $(/$)). this is because # you can not change the real userid of a process under 4.4BSD. ! # netbsd fixed this in 1.2A. case "$osvers" in ! 0.9*|1.0*|1.1*|1.2_*|1.2|1.2.*) d_setregid="$undef" d_setreuid="$undef" - d_setrgid="$undef" - d_setruid="$undef" - ;; - esac - # netbsd 1.3 linker warns about setr[gu]id being deprecated. - # (setregid, setreuid, preferred?) - case "$osvers" in - 1.3|1.3*) - d_setrgid="$undef" - d_setruid="$undef" ;; esac ! # vfork is ok on NetBSD. case "$usevfork" in '') usevfork=true ;; esac --- 46,76 ---- # way to make perl call setuid() or setgid(). if they aren't, then # ($<, $>) = ($u, $u); will work (same for $(/$)). this is because # you can not change the real userid of a process under 4.4BSD. ! # netbsd fixed this in 1.3.2. case "$osvers" in ! 0.9*|1.[012]*|1.3|1.3.1) d_setregid="$undef" d_setreuid="$undef" ;; esac ! # These are obsolete in any netbsd. ! d_setrgid="$undef" ! d_setruid="$undef" ! ! # there's no problem with vfork. case "$usevfork" in '') usevfork=true ;; esac + + # Avoid telldir prototype conflict in pp_sys.c (NetBSD uses const DIR *) + # Configure should test for this. Volunteers? + pp_sys_cflags='ccflags="$ccflags -DHAS_TELLDIR_PROTOTYPE"' + + # Pre-empt the /usr/bin/perl question of installperl. + installusrbinperl='n' + + # Recognize the NetBSD packages collection. + # GDBM might be here. + test -d /usr/pkg/lib && loclibpth="$loclibpth /usr/pkg/lib" + test -d /usr/pkg/include && locincpth="$locincpth /usr/pkg/include" diff -c 'perl5.005_02/hints/next_3.sh' 'perl5.005_03/hints/next_3.sh' Index: ./hints/next_3.sh *** ./hints/next_3.sh Thu Jul 23 23:00:21 1998 --- ./hints/next_3.sh Sat Nov 21 12:45:41 1998 *************** *** 129,131 **** --- 129,141 ---- # This is true whether we're on an HPPA machine or cross-compiling # for one. pp_cflags='optimize=""' + + # The SysV IPC is optional (ftp://ftp.nluug.nl/pub/comp/next/SysVIPC/) + # Gerben_Wierda@RnA.nl + if [ -f /usr/local/lib/libIPC.a ]; then + libswanted="$libswanted IPC" + # As of Sep 1998 d_msg wasn't supported in that library, + # only d_sem and d_shm, but Configure should be able to + # figure that out. --jhi + # Note also the next3 ext/IPC/SysV hints file. + fi diff -c 'perl5.005_02/hints/next_4.sh' 'perl5.005_03/hints/next_4.sh' Index: ./hints/next_4.sh *** ./hints/next_4.sh Thu Jul 23 23:00:21 1998 --- ./hints/next_4.sh Wed Nov 4 21:22:39 1998 *************** *** 12,18 **** # useposix='undef' ! libpth='/lib /usr/lib' libswanted=' ' libc='/NextLibrary/Frameworks/System.framework/System' --- 12,18 ---- # useposix='undef' ! libpth='/lib /usr/lib /usr/local/lib' libswanted=' ' libc='/NextLibrary/Frameworks/System.framework/System' *************** *** 35,41 **** # # archs='m68k i386' # ! archs=`/bin/lipo -info /usr/lib/libm.a | sed -n 's/^[^:]*:[^:]*: //p'` # # leave the following part alone --- 35,54 ---- # # archs='m68k i386' # ! ! # On m68k machines, toke.c cannot be compiled at all for i386 and it can ! # only be compiled for m68k itself without optimization (this is under ! # OPENSTEP 4.2). ! # ! if [ `hostinfo | grep 'NeXT Mach.*:' | sed 's/.*RELEASE_//'` = M68K ] ! then ! echo "Cross compilation is impossible on m68k hardware under OS 4" ! echo "Forcing architecture to m68k only" ! toke_cflags='optimize=""' ! archs='m68k' ! else ! archs=`/bin/lipo -info /usr/lib/libm.a | sed -n 's/^[^:]*:[^:]*: //p'` ! fi # # leave the following part alone diff -c 'perl5.005_02/hints/openbsd.sh' 'perl5.005_03/hints/openbsd.sh' Index: ./hints/openbsd.sh *** ./hints/openbsd.sh Thu Jul 23 23:00:21 1998 --- ./hints/openbsd.sh Sat Feb 13 12:05:51 1999 *************** *** 48,51 **** --- 48,61 ---- # Allow a command-line override, such as -Doptimize=-g test "$optimize" || optimize='-O2' + # This script UU/usethreads.cbu will get 'called-back' by Configure + # after it has prompted the user for whether to use threads. + cat > UU/usethreads.cbu <<'EOCBU' + case "$usethreads" in + $define|true|[yY]*) + # any openbsd version dependencies with pthreads? + libswanted="$libswanted pthread" + esac + EOCBU + # end diff -c 'perl5.005_02/hints/os2.sh' 'perl5.005_03/hints/os2.sh' Index: ./hints/os2.sh *** ./hints/os2.sh Thu Jul 23 23:00:21 1998 --- ./hints/os2.sh Sun Jan 24 08:47:47 1999 *************** *** 113,122 **** aout_ar='ar' aout_plibext='.a' aout_lddlflags="-Zdll $ld_dll_optimize" if [ $emxcrtrev -ge 50 ]; then ! aout_ldflags='-Zexe -Zsmall-conv -Zstack 32000' else ! aout_ldflags='-Zexe -Zstack 32000' fi # To get into config.sh: --- 113,123 ---- aout_ar='ar' aout_plibext='.a' aout_lddlflags="-Zdll $ld_dll_optimize" + # Cannot have 32000K stack: get SYS0170 ?! if [ $emxcrtrev -ge 50 ]; then ! aout_ldflags='-Zexe -Zsmall-conv -Zstack 16000' else ! aout_ldflags='-Zexe -Zstack 16000' fi # To get into config.sh: *************** *** 249,263 **** d_getprior='define' d_setprior='define' - if [ "X$usethreads" = "X$define" ]; then - ccflags="-Zmt $ccflags" - cppflags="-Zmt $cppflags" # Do we really need to set this? - aout_ccflags="-DUSE_THREADS $aout_ccflags" - aout_cppflags="-DUSE_THREADS $aout_cppflags" - aout_lddlflags="-Zmt $aout_lddlflags" - aout_ldflags="-Zmt $aout_ldflags" - fi - # The next two are commented. pdksh handles #!, extproc gives no path part. # sharpbang='extproc ' # shsharp='false' --- 250,255 ---- *************** *** 268,273 **** --- 260,280 ---- # Copy pod: cp ./README.os2 ./pod/perlos2.pod + + # This script UU/usethreads.cbu will get 'called-back' by Configure + # after it has prompted the user for whether to use threads. + cat > UU/usethreads.cbu <<'EOCBU' + case "$usethreads" in + $define|true|[yY]*) + ccflags="-Zmt $ccflags" + cppflags="-Zmt $cppflags" # Do we really need to set this? + aout_ccflags="-DUSE_THREADS $aout_ccflags" + aout_cppflags="-DUSE_THREADS $aout_cppflags" + aout_lddlflags="-Zmt $aout_lddlflags" + aout_ldflags="-Zmt $aout_ldflags" + ;; + esac + EOCBU # Now install the external modules. We are in the ./hints directory. diff -c 'perl5.005_02/hints/os390.sh' 'perl5.005_03/hints/os390.sh' Index: ./hints/os390.sh *** ./hints/os390.sh Sun Aug 2 00:15:07 1998 --- ./hints/os390.sh Sun Dec 13 10:19:23 1998 *************** *** 17,22 **** --- 17,24 ---- # To get ANSI C, we need to use c89, and ld doesn't exist cc='c89' ld='c89' + # To link via definition side decks we need the dll option + cccdlflags='-W 0,dll,"langlvl(extended)"' # c89 hides most of the useful header stuff, _ALL_SOURCE turns it on again, # YYDYNAMIC ensures that the OS/390 yacc generated parser is reentrant. # -DEBCDIC should come from Configure. *************** *** 54,56 **** --- 56,61 ---- esac archobjs=ebcdic.o + + # We have our own cppstdin. + echo 'cat >.$$.c; '"$cc"' -E -Wc,NOLOC ${1+"$@"} .$$.c; rm .$$.c' > cppstdin diff -c 'perl5.005_02/hints/sco.sh' 'perl5.005_03/hints/sco.sh' Index: ./hints/sco.sh *** ./hints/sco.sh Thu Jul 23 23:00:21 1998 --- ./hints/sco.sh Thu Feb 11 18:05:49 1999 *************** *** 1,140 **** ! # sco.sh # Courtesy of Joel Rosi-Schwartz ! # Additional SCO version info from # Peter Wolfe - # Last revised # Fri Jul 19 14:54:25 EDT 1996 ! # by Andy Dougherty ! ! # To use gcc, use sh Configure -Dcc=gcc ! # But gcc will *not* do dynamic laoding on 3.2.5, ! # for that use sh Configure -Dcc=icc ! # See below for more details. # figure out what SCO version we are. The output of uname -X is # something like: # System = SCO_SV # Node = xxxxx # Release = 3.2v5.0.0 # KernelID = 95/08/08 ! # Machine = Pentium # BusType = ISA # Serial = xxxxx # Users = 5-user # OEM# = 0 # Origin# = 1 ! # NumCPU = 1 ! ! # Use /bin/uname (because Gnu may be first on the path and # it does not support -X) to figure out what SCO version we are: ! case `/bin/uname -X | egrep '^Release'` in ! *3.2v4.*) scorls=3 ;; # I don't know why this is 3 instead of 4 :-) ! *3.2v5.*) scorls=5 ;; ! *) scorls=3 ;; # this probabaly shouldn't happen esac # Try to use libintl.a since it has strcoll and strxfrm libswanted="intl $libswanted" # Try to use libdbm.nfs.a since it has dbmclose. - # if test -f /usr/lib/libdbm.nfs.a ; then libswanted=`echo "dbm.nfs $libswanted " | sed -e 's/ dbm / /'` fi - set X $libswanted - shift - libswanted="$*" # We don't want Xenix cross-development libraries glibpth=`echo $glibpth | sed -e 's! /usr/lib/386 ! !' -e 's! /lib/386 ! !'` xlibpth='' ! case "$cc" in ! *gcc*) ccflags="$ccflags -U M_XENIX" ! optimize="$optimize -O2" ! ;; ! scocc) ;; ! ! # On SCO 3.2v5 both cc and icc can build dynamic load, but cc core ! # dumps if optimised, so I am only setting this up for icc. ! # It is possible that some 3.2v4.2 system have icc, I seem to ! # recall it was available as a seperate product but I have no ! # knowledge if it can do dynamic loading and if so how. ! # Joel Rosi-Schwartz ! icc)# Apparently, SCO's cc gives rather verbose warnings ! # Set -w0 to turn them off. ! case $scorls in ! 3) ccflags="$ccflags -W0 -quiet -U M_XENIX" ;; ! 5) ccflags="$ccflags -belf -w0 -U M_XENIX" ! optimize="-O1" # -g -O1 will not work ! # optimize="-O0" may be needed for pack test to pass. ! lddlflags='-G -L/usr/local/lib' ! ldflags=' -W l,-Bexport -L/usr/local/lib' ! dlext='so' ! dlsrc='dl_dlopen.xs' ! usedl='define' ! ;; ! esac ! ;; ! ! *) # Apparently, miniperl core dumps if -O is used. ! case "$optimize" in ! '') optimize=none ;; ! esac ! # Apparently, SCO's cc gives rather verbose warnings ! # Set -w0 to turn them off. ! case $scorls in ! 3) ccflags="$ccflags -W0 -quiet -U M_XENIX" ;; ! 5) ccflags="$ccflags -w0 -U M_XENIX -DPERL_SCO5" ;; ! esac ! ;; ! 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' # I have received one report that you can't include utime.h in # pp_sys.c. Uncomment the following line if that happens to you: # i_utime=undef ! # Apparently, some versions of SCO include both .so and .a libraries, ! # but they don't mix as they do on other ELF systems. The upshot is ! # that Configure finds -ldl (libdl.so) but 'ld' complains it can't ! # find libdl.a. ! # I don't know which systems have this feature, so I'll just remove ! # -dl from libswanted for all SCO systems until someone can figure ! # out how to get dynamic loading working on SCO. ! # ! # The output of uname -X on one such system was ! # System = SCO_SV ! # Node = xxxxx ! # Release = 3.2v5.0.0 ! # KernelID = 95/08/08 ! # Machine = Pentium ! # BusType = ISA ! # Serial = xxxxx ! # Users = 5-user ! # OEM# = 0 ! # Origin# = 1 ! # NumCPU = 1 ! # ! # The 5.0.0 on the Release= line is probably the thing to watch. ! # Andy Dougherty ! # Thu Feb 1 15:06:56 EST 1996 ! libswanted=`echo " $libswanted " | sed -e 's/ dl / /'` ! set X $libswanted ! shift ! libswanted="$*" ! # Perl 5.003_05 and later try to include both and # in pp_sys.c, but that fails due to a redefinition of struct timeval. # This will generate a WHOA THERE. Accept the default. i_sysselct=$undef --- 1,233 ---- ! # sco.sh # Courtesy of Joel Rosi-Schwartz ! ############################################################### # Additional SCO version info from # Peter Wolfe # Fri Jul 19 14:54:25 EDT 1996 ! # and again Tue Sep 29 16:37:25 EDT 1998 ! # by Andy Dougherty ! # Mostly rewritten on ! # Tue Jan 19 23:00:00 CET 1999 ! # by Francois Desarmenien ! ############################################################### ! # ! # To use cc, use sh Configure ! # To use gcc, use sh Configure -Dcc=gcc ! # ! # Default on 3.2v4 is to use static link (dynamic loading unsupported). ! # Default on 3.2v5 is to use dynamic loading. ! # To use static linkink instead, use to sh Configure -Dusedl=n ! # ! # Warning: - to use dynamic loading with gcc, you need gcc 2.8.0 or later ! # ******** - to compile with older releases of gcc, use Configure -Dusedl=n ! # or it wont compile properly ! # ! ############################################################### ! # NOTES: ! # ----- ! # ! # I Have removed inclusion of ODBM_File for OSR5 ! # because it core dumps and make tests fails. ! # ! # Support for icc compiler has been removed, because it 'breaks' ! # a lot of code :-( ! # ! # It's *always* a good idea to first make a static link to be sure to ! # have all symbols resolved with the current choice of libraries, since ! # with dynamic linking, unresolved symbols are allowed an will be detected ! # only at runtime (when you try to load the module or worse, when you call ! # the symbol) ! # ! # The best choice of compiler on OSR 5 (3.2v5.*) seems to be gcc >= 2.8.0: ! # -You cannot optimize with genuine sco cc (miniperl core dumps), ! # so Perl is faster if compiled with gcc. ! # -Even optimized for speed, gcc generated code is smaller (!!!) ! # -gcc is free ! # -I use ld to link which is distributed with the core OS distribution, so you ! # don't need to buy the developement kit, just find someone kind enough to ! # give you a binary release of gcc. ! # ! # + ############################################################### # figure out what SCO version we are. The output of uname -X is # something like: # System = SCO_SV # Node = xxxxx # Release = 3.2v5.0.0 # KernelID = 95/08/08 ! # Machine = Pentium # BusType = ISA # Serial = xxxxx # Users = 5-user # OEM# = 0 # Origin# = 1 ! # NumCPU = 1 ! ! # Use /bin/uname (because GNU uname may be first in $PATH and # it does not support -X) to figure out what SCO version we are: ! # Matching '^Release' is broken by locale setting: ! # matching '3.2v' should be enough -- FD ! case `/bin/uname -X | egrep '3\.2v'` in ! *3.2v4.*) scorls=3 ;; # OSR 3 ! *3.2v5.*) scorls=5 ;; # OSR 5 ! *) ! # Future of SCO OSR is SCO UnixWare: there should not be new OSR releases ! echo "************************************************************" >&4 ! echo "" >&4 ! echo " sco.sh hints file only supports:" >&4 ! echo "" >&4 ! echo " - SCO Unix 3.2v4.x (OSR 3)" >&4 ! echo " - SCO Unix 3.2v5.x (OSR 5)" >&4 ! echo "" >&4 ! echo "" >&4 ! echo " For UnixWare, use svr4.sh hints instead" >&4 ! echo "" >&4 ! echo "***********************************************************" >&4 ! exit ! ;; esac + ############################################################### + # Common fixes for all compilers an releases: + + ############################################################### + # What is true for SCO5 is true for SCO3 too today, so let's have a single + # symbol for both + ccflags="-U M_XENIX -D PERL_SCO" + + ############################################################### + # Compilers options section: + if test "$scorls" = "3" + then + dlext='' + case "$cc" in + gcc) optimize='-O2' ;; + *) ccflags="$ccflags -W0 -quiet" + optimize='-O' ;; + esac + else + ############################################################### + # Need this in release 5 because of changed fpu exeption rules + ccflags="$ccflags -D PERL_SCO5" + + ############################################################### + # In Release 5, always compile ELF objects + case "$cc" in + gcc) + ccflags="$ccflags -melf" + optimize='-O2' + ;; + *) + ccflags="$ccflags -w0 -belf" + optimize='-O0' + ;; + esac + ############################################################### + # Dynamic loading section: + # + # We use ld to build shared libraries as it is always available + # and seems to work better than GNU's one on SCO + # + # ccdlflags : must tell the linker to export all global symbols + # cccdlflags: must tell the compiler to generate relocatable code + # lddlflags : must tell the linker to output a shared library + # + # /usr/local/lib is added for convenience, since 'foreign' libraries + # are usually put there in sco + # + if test "$usedl" != "n"; then + ld='ld' + case "$cc" in + gcc) + ccdlflags='-Xlinker -Bexport -L/usr/local/lib' + cccdlflags='-fpic' + lddlflags='-G -L/usr/local/lib' + ;; + *) + ccdlflags='-Bexport -L/usr/local/lib' + cccdlflags='-Kpic' + lddlflags='-G -L/usr/local/lib' + ;; + esac + + ############################################################### + # Use dynamic loading + usedl='define' + dlext='so' + dlsrc='dl_dlopen.xs' + + ############################################################### + # Force to define those symbols, as they are #defines and not + # catched by Configure, and they are useful + d_dlopen='define' + d_dlerror='define' + fi + fi + + + ############################################################### + # Various hints, common to all releases, to have it work better: + + ############################################################### + # We need to remove libdl, as libdl.so exists, but ld complains + # it can't find libdl.a ! Bug or feature ? :-) + libswanted=`echo " $libswanted " | sed -e 's/ dl / /'` + set X $libswanted + shift + libswanted="$*" + + ############################################################### # Try to use libintl.a since it has strcoll and strxfrm libswanted="intl $libswanted" + + ############################################################### # Try to use libdbm.nfs.a since it has dbmclose. if test -f /usr/lib/libdbm.nfs.a ; then libswanted=`echo "dbm.nfs $libswanted " | sed -e 's/ dbm / /'` + set X $libswanted + shift + libswanted="$*" + fi + + ############################################################### + # We disable ODBM_File if OSR5 because it's mostly broken + # but keep it for ODT3 as it seems to work. + if test "$scorls" = "5"; then + i_dbm='undef' fi + ############################################################### # We don't want Xenix cross-development libraries glibpth=`echo $glibpth | sed -e 's! /usr/lib/386 ! !' -e 's! /lib/386 ! !'` xlibpth='' ! ############################################################### # 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' ! # You can override this with Configure -Dusenm. ! case "$usenm" in ! '') usenm='false' ;; ! esac + ############################################################### # If you want to use nm, you'll probably have to use nm -p. The # following does that for you: nm_opt='-p' + ############################################################### # I have received one report that you can't include utime.h in # pp_sys.c. Uncomment the following line if that happens to you: # i_utime=undef ! ############################################################### # Perl 5.003_05 and later try to include both and # in pp_sys.c, but that fails due to a redefinition of struct timeval. # This will generate a WHOA THERE. Accept the default. i_sysselct=$undef + + + ############################################################### + #END of hint file diff -c 'perl5.005_02/hints/solaris_2.sh' 'perl5.005_03/hints/solaris_2.sh' Index: ./hints/solaris_2.sh *** ./hints/solaris_2.sh Sat Aug 1 23:50:40 1998 --- ./hints/solaris_2.sh Sun Jan 24 08:47:49 1999 *************** *** 261,285 **** # XXX EOSH ! if [ "X$usethreads" = "X$define" ]; then ! ccflags="-D_REENTRANT $ccflags" ! # -lpthread needs to come before -lc but after other libraries such ! # as -lgdbm and such like. We assume here that -lc is present in ! # libswanted. If that fails to be true in future, then this can be ! # changed to add pthread to the very end of libswanted. ! # sched_yield is in -lposix4 ! set `echo X "$libswanted "| sed -e 's/ c / posix4 pthread c /'` ! shift ! libswanted="$*" ! # On Solaris 2.6 x86 there is a bug with sigsetjmp() and siglongjmp() ! # when linked with the threads library, such that whatever positive value ! # you pass to siglongjmp(), sigsetjmp() returns 1. ! # Thanks to Simon Parsons for this report. ! # Sun BugID is 4117946, "sigsetjmp always returns 1 when called by ! # siglongjmp in a MT program". As of 19980622, there is no patch ! # available. ! cat >try.c <<'EOM' /* Test for sig(set|long)jmp bug. */ #include --- 261,286 ---- # XXX EOSH ! # This script UU/usethreads.cbu will get 'called-back' by Configure ! # after it has prompted the user for whether to use threads. ! cat > UU/usethreads.cbu <<'EOCBU' ! case "$usethreads" in ! $define|true|[yY]*) ! ccflags="-D_REENTRANT $ccflags" ! # sched_yield is in -lposix4 ! set `echo X "$libswanted "| sed -e 's/ c / posix4 pthread c /'` ! shift ! libswanted="$*" ! ! # On Solaris 2.6 x86 there is a bug with sigsetjmp() and siglongjmp() ! # when linked with the threads library, such that whatever positive ! # value you pass to siglongjmp(), sigsetjmp() returns 1. ! # Thanks to Simon Parsons for this report. ! # Sun BugID is 4117946, "sigsetjmp always returns 1 when called by ! # siglongjmp in a MT program". As of 19980622, there is no patch ! # available. ! cat >try.c <<'EOM' /* Test for sig(set|long)jmp bug. */ #include *************** *** 293,310 **** siglongjmp(env, 2); } EOM ! if test "`arch`" = i86pc -a "$osvers" = 2.6 \ ! && ${cc:-cc} try.c -lpthread >/dev/null 2>&1 && ./a.out; then ! d_sigsetjmp=$undef ! cat << 'EOM' >&2 You will see a *** WHOA THERE!!! *** message from Configure for d_sigsetjmp. Keep the recommended value. See hints/solaris_2.sh for more information. EOM ! fi ! fi # This is just a trick to include some useful notes. cat > /dev/null <<'End_of_Solaris_Notes' --- 294,313 ---- siglongjmp(env, 2); } EOM ! if test "`arch`" = i86pc -a "$osvers" = 2.6 && \ ! ${cc:-cc} try.c -lpthread >/dev/null 2>&1 && ./a.out; then ! d_sigsetjmp=$undef ! cat << 'EOM' >&2 You will see a *** WHOA THERE!!! *** message from Configure for d_sigsetjmp. Keep the recommended value. See hints/solaris_2.sh for more information. EOM ! fi ! ;; ! esac ! EOCBU # This is just a trick to include some useful notes. cat > /dev/null <<'End_of_Solaris_Notes' diff -c 'perl5.005_02/hints/ultrix_4.sh' 'perl5.005_03/hints/ultrix_4.sh' Index: ./hints/ultrix_4.sh *** ./hints/ultrix_4.sh Thu Jul 23 23:00:22 1998 --- ./hints/ultrix_4.sh Thu Feb 11 18:05:49 1999 *************** *** 34,49 **** *gcc*) ;; *) case "$osvers" in ! *4.1*) ccflags="$ccflags -DLANGUAGE_C -Olimit 3200" ;; ! *4.2*) ccflags="$ccflags -DLANGUAGE_C -Olimit 3200" # Prototypes sometimes cause compilation errors in 4.2. prototype=undef case "$myuname" in *risc*) d_volatile=undef ;; esac ;; ! *4.3*) ccflags="$ccflags -std1 -DLANGUAGE_C -Olimit 3200" ;; ! *) ccflags="$ccflags -std -Olimit 3200" ;; esac ;; esac --- 34,49 ---- *gcc*) ;; *) case "$osvers" in ! *4.1*) ccflags="$ccflags -DLANGUAGE_C -Olimit 3400" ;; ! *4.2*) ccflags="$ccflags -DLANGUAGE_C -Olimit 3400" # Prototypes sometimes cause compilation errors in 4.2. prototype=undef case "$myuname" in *risc*) d_volatile=undef ;; esac ;; ! *4.3*) ccflags="$ccflags -std1 -DLANGUAGE_C -Olimit 3400" ;; ! *) ccflags="$ccflags -std -Olimit 3400" ;; esac ;; esac diff -c /dev/null 'perl5.005_03/hints/uwin.sh' Index: hints/uwin.sh *** hints/uwin.sh Wed Dec 31 18:00:00 1969 --- hints/uwin.sh Mon Nov 23 19:02:20 1998 *************** *** 0 **** --- 1,36 ---- + # + # hint file for U/WIN (UNIX for Windows 95/NT) + # + # created for U/WIN version 1.55 + # running under Windows NT 4.0 SP 3 + # using MSVC++ 5.0 for the compiler + # + # created by Joe Buehler (jbuehler@hekimian.com) + # + # for information about U/WIN see www.gtlinc.com + # + + #ccflags=-D_BSDCOMPAT + # confusion in Configure over preprocessor + cppstdin=`pwd`/cppstdin + cpprun=`pwd`/cppstdin + # pwd.h confuses Configure + d_pwcomment=undef + d_pwgecos=define + # work around case-insensitive file names + firstmakefile=GNUmakefile + # avoid compilation error + i_utime=undef + # compile/link flags + ldflags=-g + optimize=-g + static_ext="B Data/Dumper Fcntl IO IPC/SysV Opcode POSIX SDBM_File Socket attrs" + #static_ext=none + # dynamic loading needs work + usedl=undef + # perl malloc will not work + usemymalloc=n + # cannot use nm + usenm=undef + # vfork() is buggy (as of 1.55 anyway) + usevfork=false diff -c 'perl5.005_02/hv.c' 'perl5.005_03/hv.c' Index: ./hv.c *** ./hv.c Thu Jul 23 23:00:23 1998 --- ./hv.c Sat Mar 27 11:57:00 1999 *************** *** 1,6 **** /* hv.c * ! * Copyright (c) 1991-1997, Larry Wall * * You may distribute under the terms of either the GNU General Public * License or the Artistic License, as specified in the README file. --- 1,6 ---- /* hv.c * ! * Copyright (c) 1991-1999, Larry Wall * * You may distribute under the terms of either the GNU General Public * License or the Artistic License, as specified in the README file. *************** *** 18,24 **** #ifndef PERL_OBJECT static void hsplit _((HV *hv)); static void hfreeentries _((HV *hv)); ! static HE* more_he _((void)); #endif #if defined(STRANGE_MALLOC) || defined(MYMALLOC) --- 18,24 ---- #ifndef PERL_OBJECT static void hsplit _((HV *hv)); static void hfreeentries _((HV *hv)); ! static void more_he _((void)); #endif #if defined(STRANGE_MALLOC) || defined(MYMALLOC) *************** *** 32,53 **** new_he(void) { HE* he; ! if (PL_he_root) { ! he = PL_he_root; ! PL_he_root = HeNEXT(he); ! return he; ! } ! return more_he(); } STATIC void del_he(HE *p) { HeNEXT(p) = (HE*)PL_he_root; PL_he_root = p; } ! STATIC HE* more_he(void) { register HE* he; --- 32,56 ---- new_he(void) { HE* he; ! LOCK_SV_MUTEX; ! if (!PL_he_root) ! more_he(); ! he = PL_he_root; ! PL_he_root = HeNEXT(he); ! UNLOCK_SV_MUTEX; ! return he; } STATIC void del_he(HE *p) { + LOCK_SV_MUTEX; HeNEXT(p) = (HE*)PL_he_root; PL_he_root = p; + UNLOCK_SV_MUTEX; } ! STATIC void more_he(void) { register HE* he; *************** *** 60,66 **** he++; } HeNEXT(he) = 0; - return new_he(); } STATIC HEK * --- 63,68 ---- *************** *** 830,848 **** newHVhv(HV *ohv) { register HV *hv; - register XPVHV* xhv; STRLEN hv_max = ohv ? HvMAX(ohv) : 0; STRLEN hv_fill = ohv ? HvFILL(ohv) : 0; hv = newHV(); while (hv_max && hv_max + 1 >= hv_fill * 2) hv_max = hv_max / 2; /* Is always 2^n-1 */ ! ((XPVHV*)SvANY(hv))->xhv_max = hv_max; if (!hv_fill) return hv; #if 0 ! if (!SvRMAGICAL(ohv) || !mg_find((SV*)ohv,'P')) { /* Quick way ???*/ } else --- 832,849 ---- newHVhv(HV *ohv) { register HV *hv; STRLEN hv_max = ohv ? HvMAX(ohv) : 0; STRLEN hv_fill = ohv ? HvFILL(ohv) : 0; hv = newHV(); while (hv_max && hv_max + 1 >= hv_fill * 2) hv_max = hv_max / 2; /* Is always 2^n-1 */ ! HvMAX(hv) = hv_max; if (!hv_fill) return hv; #if 0 ! if (! SvTIED_mg((SV*)ohv, 'P')) { /* Quick way ???*/ } else *************** *** 853,859 **** HE *hv_eiter = HvEITER(ohv); /* current entry of iterator */ /* Slow way */ ! hv_iterinit(hv); while (entry = hv_iternext(ohv)) { hv_store(hv, HeKEY(entry), HeKLEN(entry), SvREFCNT_inc(HeVAL(entry)), HeHASH(entry)); --- 854,860 ---- HE *hv_eiter = HvEITER(ohv); /* current entry of iterator */ /* Slow way */ ! hv_iterinit(ohv); while (entry = hv_iternext(ohv)) { hv_store(hv, HeKEY(entry), HeKLEN(entry), SvREFCNT_inc(HeVAL(entry)), HeHASH(entry)); *************** *** 1014,1020 **** xhv = (XPVHV*)SvANY(hv); oldentry = entry = xhv->xhv_eiter; ! if (SvRMAGICAL(hv) && (mg = mg_find((SV*)hv,'P'))) { SV *key = sv_newmortal(); if (entry) { sv_setsv(key, HeSVKEY_force(entry)); --- 1015,1021 ---- xhv = (XPVHV*)SvANY(hv); oldentry = entry = xhv->xhv_eiter; ! if (mg = SvTIED_mg((SV*)hv, 'P')) { SV *key = sv_newmortal(); if (entry) { sv_setsv(key, HeSVKEY_force(entry)); *************** *** 1149,1154 **** --- 1150,1156 ---- } */ xhv = (XPVHV*)SvANY(PL_strtab); /* assert(xhv_array != 0) */ + LOCK_STRTAB_MUTEX; oentry = &((HE**)xhv->xhv_array)[hash & (I32) xhv->xhv_max]; for (entry = *oentry; entry; i=0, oentry = &HeNEXT(entry), entry = *oentry) { if (HeHASH(entry) != hash) /* strings can't be equal */ *************** *** 1168,1173 **** --- 1170,1176 ---- } break; } + UNLOCK_STRTAB_MUTEX; if (!found) warn("Attempt to free non-existent shared string"); *************** *** 1193,1198 **** --- 1196,1202 ---- */ xhv = (XPVHV*)SvANY(PL_strtab); /* assert(xhv_array != 0) */ + LOCK_STRTAB_MUTEX; oentry = &((HE**)xhv->xhv_array)[hash & (I32) xhv->xhv_max]; for (entry = *oentry; entry; i=0, entry = HeNEXT(entry)) { if (HeHASH(entry) != hash) /* strings can't be equal */ *************** *** 1219,1224 **** --- 1223,1229 ---- } ++HeVAL(entry); /* use value slot as REFCNT */ + UNLOCK_STRTAB_MUTEX; return HeKEY_hek(entry); } diff -c 'perl5.005_02/hv.h' 'perl5.005_03/hv.h' Index: ./hv.h *** ./hv.h Thu Jul 23 23:00:23 1998 --- ./hv.h Sat Mar 27 11:56:57 1999 *************** *** 1,6 **** /* hv.h * ! * Copyright (c) 1991-1997, Larry Wall * * You may distribute under the terms of either the GNU General Public * License or the Artistic License, as specified in the README file. --- 1,6 ---- /* hv.h * ! * Copyright (c) 1991-1999, Larry Wall * * You may distribute under the terms of either the GNU General Public * License or the Artistic License, as specified in the README file. diff -c 'perl5.005_02/installman' 'perl5.005_03/installman' Index: ./installman *** ./installman Thu Jul 23 23:00:23 1998 --- ./installman Mon Nov 23 18:18:57 1998 *************** *** 134,140 **** # Convert name from File/Basename.pm to File::Basename.3 format, # if necessary. $manpage =~ s#\.p(m|od)$##; ! if ($^O eq 'os2' || $^O eq 'amigaos') { $manpage =~ s#/#.#g; } else { $manpage =~ s#/#::#g; --- 134,140 ---- # Convert name from File/Basename.pm to File::Basename.3 format, # if necessary. $manpage =~ s#\.p(m|od)$##; ! if ($^O eq 'os2' || $^O eq 'amigaos' || $^O eq 'uwin') { $manpage =~ s#/#.#g; } else { $manpage =~ s#/#::#g; diff -c 'perl5.005_02/installperl' 'perl5.005_03/installperl' Index: ./installperl *** ./installperl Thu Jul 23 23:00:24 1998 --- ./installperl Sat Jan 16 10:31:26 1999 *************** *** 220,225 **** --- 220,230 ---- @corefiles = <*.h libperl*.*>; # AIX needs perl.exp installed as well. push(@corefiles,'perl.exp') if $^O eq 'aix'; + if ($^O eq 'mpeix') { + # MPE needs mpeixish.h installed as well. + mkpath("$installarchlib/CORE/mpeix", 1, 0777); + push(@corefiles,'mpeix/mpeixish.h'); + } # If they have built sperl.o... push(@corefiles,'sperl.o') if -f 'sperl.o'; } *************** *** 251,257 **** my $mainperl_is_instperl = 0; ! if (!$versiononly && !$nonono && !$Is_W32 && !$Is_VMS && -t STDIN && -t STDERR && -w $mainperldir && ! samepath($mainperldir, $installbin)) { my($usrbinperl) = "$mainperldir/$perl$exe_ext"; my($instperl) = "$installbin/$perl$exe_ext"; --- 256,263 ---- my $mainperl_is_instperl = 0; ! if ($Config{installusrbinperl} eq 'define' && ! !$versiononly && !$nonono && !$Is_W32 && !$Is_VMS && -t STDIN && -t STDERR && -w $mainperldir && ! samepath($mainperldir, $installbin)) { my($usrbinperl) = "$mainperldir/$perl$exe_ext"; my($instperl) = "$installbin/$perl$exe_ext"; *************** *** 327,333 **** # Install pod pages. Where? I guess in $installprivlib/pod. ! if (! $versiononly || !($installprivlib =~ m/\Q$]/)) { mkpath("${installprivlib}/pod", 1, 0777); # If Perl 5.003's perldiag.pod is there, rename it. --- 333,339 ---- # Install pod pages. Where? I guess in $installprivlib/pod. ! unless ( $versiononly && !($installprivlib =~ m/\Q$]/)) { # as line 200 mkpath("${installprivlib}/pod", 1, 0777); # If Perl 5.003's perldiag.pod is there, rename it. *************** *** 564,571 **** and chmod($name =~ /\.(so|$dlext)$/o ? 0555 : 0444, "$installlib/$name"); } - } elsif (-d $_) { - mkpath("$installlib/$name", 1, 0777); } } --- 570,575 ---- diff -c 'perl5.005_02/intrpvar.h' 'perl5.005_03/intrpvar.h' Index: ./intrpvar.h *** ./intrpvar.h Thu Jul 23 23:00:24 1998 --- ./intrpvar.h Sun Nov 1 21:07:30 1998 *************** *** 199,204 **** --- 199,205 ---- #ifdef USE_THREADS PERLVAR(Ithrsv, SV *) /* struct perl_thread for main thread */ PERLVARI(Ithreadnum, U32, 0) /* incremented each thread creation */ + PERLVAR(Istrtab_mutex, perl_mutex) /* Mutex for string table access */ #endif /* USE_THREADS */ PERLVARI(Ibytecode_iv_overflows,int, 0) /* from bytecode.h */ diff -c 'perl5.005_02/iperlsys.h' 'perl5.005_03/iperlsys.h' Index: ./iperlsys.h *** ./iperlsys.h Thu Jul 23 23:00:24 1998 --- ./iperlsys.h Thu Mar 4 18:34:16 1999 *************** *** 114,120 **** virtual int Printf(PerlIO*, int &err, const char *,...) = 0; virtual int Vprintf(PerlIO*, int &err, const char *, va_list) = 0; virtual long Tell(PerlIO*, int &err) = 0; ! virtual int Seek(PerlIO*, off_t, int, int &err) = 0; virtual void Rewind(PerlIO*, int &err) = 0; virtual PerlIO * Tmpfile(int &err) = 0; virtual int Getpos(PerlIO*, Fpos_t *, int &err) = 0; --- 114,120 ---- virtual int Printf(PerlIO*, int &err, const char *,...) = 0; virtual int Vprintf(PerlIO*, int &err, const char *, va_list) = 0; virtual long Tell(PerlIO*, int &err) = 0; ! virtual int Seek(PerlIO*, Off_t, int, int &err) = 0; virtual void Rewind(PerlIO*, int &err) = 0; virtual PerlIO * Tmpfile(int &err) = 0; virtual int Getpos(PerlIO*, Fpos_t *, int &err) = 0; *************** *** 322,331 **** extern int PerlIO_vprintf _((PerlIO *, const char *, va_list)); #endif #ifndef PerlIO_tell ! extern long PerlIO_tell _((PerlIO *)); #endif #ifndef PerlIO_seek ! extern int PerlIO_seek _((PerlIO *,off_t,int)); #endif #ifndef PerlIO_rewind extern void PerlIO_rewind _((PerlIO *)); --- 322,331 ---- extern int PerlIO_vprintf _((PerlIO *, const char *, va_list)); #endif #ifndef PerlIO_tell ! extern Off_t PerlIO_tell _((PerlIO *)); #endif #ifndef PerlIO_seek ! extern int PerlIO_seek _((PerlIO *, Off_t, int)); #endif #ifndef PerlIO_rewind extern void PerlIO_rewind _((PerlIO *)); *************** *** 907,912 **** --- 907,913 ---- #define PerlSock_inet_addr(c) inet_addr(c) #define PerlSock_inet_ntoa(i) inet_ntoa(i) #define PerlSock_listen(s, b) listen(s, b) + #define PerlSock_recv(s, b, l, f) recv(s, b, l, f) #define PerlSock_recvfrom(s, b, l, f, from, fromlen) \ recvfrom(s, b, l, f, from, fromlen) #define PerlSock_select(n, r, w, e, t) select(n, r, w, e, t) diff -c 'perl5.005_02/lib/AutoLoader.pm' 'perl5.005_03/lib/AutoLoader.pm' Index: ./lib/AutoLoader.pm *** ./lib/AutoLoader.pm Thu Jul 23 23:00:25 1998 --- ./lib/AutoLoader.pm Thu Jan 21 19:03:55 1999 *************** *** 178,184 **** thus (presumably) defining the needed subroutine. AUTOLOAD will then C the newly defined subroutine. ! Once this process completes for a given funtion, it is defined, so future calls to the subroutine will bypass the AUTOLOAD mechanism. =head2 Subroutine Stubs --- 178,184 ---- thus (presumably) defining the needed subroutine. AUTOLOAD will then C the newly defined subroutine. ! Once this process completes for a given function, it is defined, so future calls to the subroutine will bypass the AUTOLOAD mechanism. =head2 Subroutine Stubs *************** *** 266,272 **** handle multiple packages in a file. B only reads code as it is requested, and in many cases ! should be faster, but requires a machanism like B be used to create the individual files. L will invoke B automatically if B is used in a module source file. --- 266,272 ---- handle multiple packages in a file. B only reads code as it is requested, and in many cases ! should be faster, but requires a mechanism like B be used to create the individual files. L will invoke B automatically if B is used in a module source file. diff -c 'perl5.005_02/lib/AutoSplit.pm' 'perl5.005_03/lib/AutoSplit.pm' Index: ./lib/AutoSplit.pm *** ./lib/AutoSplit.pm Fri Aug 7 19:09:12 1998 --- ./lib/AutoSplit.pm Tue Dec 29 08:30:55 1998 *************** *** 11,17 **** $Verbose $Keep $Maxlen $CheckForAutoloader $CheckModTime ); ! $VERSION = "1.0302"; @ISA = qw(Exporter); @EXPORT = qw(&autosplit &autosplit_lib_modules); @EXPORT_OK = qw($Verbose $Keep $Maxlen $CheckForAutoloader $CheckModTime); --- 11,17 ---- $Verbose $Keep $Maxlen $CheckForAutoloader $CheckModTime ); ! $VERSION = "1.0303"; @ISA = qw(Exporter); @EXPORT = qw(&autosplit &autosplit_lib_modules); @EXPORT_OK = qw($Verbose $Keep $Maxlen $CheckForAutoloader $CheckModTime); *************** *** 219,225 **** while () { # Skip pod text. $fnr++; ! $in_pod = 1 if /^=/; $in_pod = 0 if /^=cut/; next if ($in_pod || /^=cut/); --- 219,225 ---- while () { # Skip pod text. $fnr++; ! $in_pod = 1 if /^=\w/; $in_pod = 0 if /^=cut/; next if ($in_pod || /^=cut/); diff -c 'perl5.005_02/lib/Benchmark.pm' 'perl5.005_03/lib/Benchmark.pm' Index: ./lib/Benchmark.pm *** ./lib/Benchmark.pm Fri Aug 7 22:02:41 1998 --- ./lib/Benchmark.pm Sun Nov 29 18:22:12 1998 *************** *** 124,129 **** --- 124,134 ---- Returns the difference between two Benchmark times as a Benchmark object suitable for passing to timestr(). + =item timesum ( T1, T2 ) + + Returns the sum of two Benchmark times as a Benchmark object suitable + for passing to timestr(). + =item timestr ( TIMEDIFF, [ STYLE, [ FORMAT ] ] ) Returns a string that formats the times in the TIMEDIFF object in *************** *** 291,296 **** --- 296,310 ---- push(@r, $a->[$i] - $b->[$i]); } bless \@r; + } + + sub timesum { + my($a, $b) = @_; + my @r; + for (my $i=0; $i < @$a; ++$i) { + push(@r, $a->[$i] + $b->[$i]); + } + bless \@r; } sub timestr { diff -c 'perl5.005_02/lib/CGI.pm' 'perl5.005_03/lib/CGI.pm' Index: ./lib/CGI.pm Prereq: 1.32 *** ./lib/CGI.pm Thu Jul 23 23:00:29 1998 --- ./lib/CGI.pm Thu Feb 11 18:05:57 1999 *************** *** 15,25 **** # listing the modifications you have made. # The most recent version and complete docs are available at: ! # http://www.genome.wi.mit.edu/ftp/pub/software/WWW/cgi_docs.html ! # ftp://ftp-genome.wi.mit.edu/pub/software/WWW/ ! $CGI::revision = '$Id: CGI.pm,v 1.32 1998/05/28 21:55:43 lstein Exp lstein $'; ! $CGI::VERSION='2.42'; # HARD-CODED LOCATION FOR FILE UPLOAD TEMPORARY FILES. # UNCOMMENT THIS ONLY IF YOU KNOW WHAT YOU'RE DOING. --- 15,24 ---- # listing the modifications you have made. # The most recent version and complete docs are available at: ! # http://stein.cshl.org/WWW/software/CGI/ ! $CGI::revision = '$Id: CGI.pm,v 1.5 1998/12/06 10:19:48 lstein Exp $'; ! $CGI::VERSION='2.46'; # HARD-CODED LOCATION FOR FILE UPLOAD TEMPORARY FILES. # UNCOMMENT THIS ONLY IF YOU KNOW WHAT YOU'RE DOING. *************** *** 59,64 **** --- 58,69 ---- # Change this to 1 to disable uploads entirely: $DISABLE_UPLOADS = 0; + # Change this to 1 to suppress redundant HTTP headers + $HEADERS_ONCE = 0; + + # separate the name=value pairs by semicolons rather than ampersands + $USE_PARAM_SEMICOLONS = 0; + # Other globals that you shouldn't worry about. undef $Q; $BEEN_THERE = 0; *************** *** 116,123 **** $IIS++ if defined($ENV{'SERVER_SOFTWARE'}) && $ENV{'SERVER_SOFTWARE'}=~/IIS/; # Turn on special checking for Doug MacEachern's modperl ! if (defined($ENV{'GATEWAY_INTERFACE'}) && ! ($MOD_PERL = $ENV{'GATEWAY_INTERFACE'} =~ /^CGI-Perl\//)) { $| = 1; require Apache; --- 121,129 ---- $IIS++ if defined($ENV{'SERVER_SOFTWARE'}) && $ENV{'SERVER_SOFTWARE'}=~/IIS/; # Turn on special checking for Doug MacEachern's modperl ! if (exists $ENV{'GATEWAY_INTERFACE'} ! && ! ($MOD_PERL = $ENV{'GATEWAY_INTERFACE'} =~ /^CGI-Perl/)) { $| = 1; require Apache; *************** *** 151,170 **** tt u i b blockquote pre img a address cite samp dfn html head base body Link nextid title meta kbd start_html end_html input Select option comment/], ! ':html3'=>[qw/div table caption th td TR Tr sup sub strike applet Param embed basefont style span layer ilayer font frameset frame script small big/], ':netscape'=>[qw/blink fontsize center/], ':form'=>[qw/textfield textarea filefield password_field hidden checkbox checkbox_group submit reset defaults radio_group popup_menu button autoEscape scrolling_list image_button start_form end_form startform endform ! start_multipart_form isindex tmpFileName uploadInfo URL_ENCODED MULTIPART/], ! ':cgi'=>[qw/param path_info path_translated url self_url script_name cookie dump ! raw_cookie request_method query_string accept user_agent remote_host remote_addr referer server_name server_software server_port server_protocol virtual_host remote_ident auth_type http use_named_parameters save_parameters restore_parameters param_fetch remote_user user_name header redirect import_names put Delete Delete_all url_param/], ':ssl' => [qw/https/], ':cgi-lib' => [qw/ReadParse PrintHeader HtmlTop HtmlBot SplitParam/], ':html' => [qw/:html2 :html3 :netscape/], ':standard' => [qw/:html2 :html3 :form :cgi/], --- 157,177 ---- tt u i b blockquote pre img a address cite samp dfn html head base body Link nextid title meta kbd start_html end_html input Select option comment/], ! ':html3'=>[qw/div table caption th td TR Tr sup Sub strike applet Param embed basefont style span layer ilayer font frameset frame script small big/], ':netscape'=>[qw/blink fontsize center/], ':form'=>[qw/textfield textarea filefield password_field hidden checkbox checkbox_group submit reset defaults radio_group popup_menu button autoEscape scrolling_list image_button start_form end_form startform endform ! start_multipart_form end_multipart_form isindex tmpFileName uploadInfo URL_ENCODED MULTIPART/], ! ':cgi'=>[qw/param path_info path_translated url self_url script_name cookie Dump ! raw_cookie request_method query_string Accept user_agent remote_host remote_addr referer server_name server_software server_port server_protocol virtual_host remote_ident auth_type http use_named_parameters save_parameters restore_parameters param_fetch remote_user user_name header redirect import_names put Delete Delete_all url_param/], ':ssl' => [qw/https/], + ':imagemap' => [qw/Area Map/], ':cgi-lib' => [qw/ReadParse PrintHeader HtmlTop HtmlBot SplitParam/], ':html' => [qw/:html2 :html3 :netscape/], ':standard' => [qw/:html2 :html3 :form :cgi/], *************** *** 206,211 **** --- 213,219 ---- sub expand_tags { my($tag) = @_; + return ("start_$1","end_$1") if $tag=~/^(?:\*|start_|end_)(.+)/; my(@r); return ($tag) unless $EXPORT_TAGS{$tag}; foreach (@{$EXPORT_TAGS{$tag}}) { *************** *** 273,279 **** $name = $p[0]; } ! return () unless defined($name) && $self->{$name}; return wantarray ? @{$self->{$name}} : $self->{$name}->[0]; } --- 281,287 ---- $name = $p[0]; } ! return unless defined($name) && $self->{$name}; return wantarray ? @{$self->{$name}} : $self->{$name}->[0]; } *************** *** 315,320 **** --- 323,329 ---- sub init { my($self,$initializer) = @_; my($query_string,$meth,$content_length,$fh,@lines) = ('','','',''); + local($/) = "\n"; # if we get called more than once, we want to initialize # ourselves from the original query (which may be gone *************** *** 341,347 **** && $ENV{'CONTENT_TYPE'}=~m|^multipart/form-data| && !defined($initializer) ) { ! my($boundary) = $ENV{'CONTENT_TYPE'} =~ /boundary=\"?([^\";]+)\"?/; $self->read_multipart($boundary,$content_length); last METHOD; } --- 350,356 ---- && $ENV{'CONTENT_TYPE'}=~m|^multipart/form-data| && !defined($initializer) ) { ! my($boundary) = $ENV{'CONTENT_TYPE'} =~ /boundary=\"?([^\";,]+)\"?/; $self->read_multipart($boundary,$content_length); last METHOD; } *************** *** 496,502 **** sub parse_params { my($self,$tosplit) = @_; ! my(@pairs) = split('&',$tosplit); my($param,$value); foreach (@pairs) { ($param,$value) = split('=',$_,2); --- 505,511 ---- sub parse_params { my($self,$tosplit) = @_; ! my(@pairs) = split(/[&;]/,$tosplit); my($param,$value); foreach (@pairs) { ($param,$value) = split('=',$_,2); *************** *** 526,536 **** } sub _make_tag_func { ! my $tagname = shift; ! return qq{ sub $tagname { - # handle various cases in which we're called - # most of this bizarre stuff is to avoid -w errors shift if \$_[0] && (!ref(\$_[0]) && \$_[0] eq \$CGI::DefaultClass) || (ref(\$_[0]) && --- 535,543 ---- } sub _make_tag_func { ! my ($self,$tagname) = @_; ! my $func = qq# sub $tagname { shift if \$_[0] && (!ref(\$_[0]) && \$_[0] eq \$CGI::DefaultClass) || (ref(\$_[0]) && *************** *** 542,553 **** my(\@attr) = make_attributes( '',shift() ); \$attr = " \@attr" if \@attr; } my(\$tag,\$untag) = ("\U<$tagname\E\$attr>","\U\E"); return \$tag unless \@_; my \@result = map { "\$tag\$_\$untag" } (ref(\$_[0]) eq 'ARRAY') ? \@{\$_[0]} : "\@_"; return "\@result"; ! } ! } } sub AUTOLOAD { --- 549,568 ---- my(\@attr) = make_attributes( '',shift() ); \$attr = " \@attr" if \@attr; } + #; + if ($tagname=~/start_(\w+)/i) { + $func .= qq! return "<\U$1\E\$attr>";} !; + } elsif ($tagname=~/end_(\w+)/i) { + $func .= qq! return "<\U/$1\E>"; } !; + } else { + $func .= qq# my(\$tag,\$untag) = ("\U<$tagname\E\$attr>","\U\E"); return \$tag unless \@_; my \@result = map { "\$tag\$_\$untag" } (ref(\$_[0]) eq 'ARRAY') ? \@{\$_[0]} : "\@_"; return "\@result"; ! }#; ! } ! return $func; } sub AUTOLOAD { *************** *** 619,630 **** $code = "sub $AUTOLOAD { }" if (!$code and $func_name eq 'DESTROY'); if (!$code) { if ($EXPORT{':any'} || $EXPORT{'-any'} || ! $EXPORT{$func_name} || (%EXPORT_OK || grep(++$EXPORT_OK{$_},&expand_tags(':html'))) ! && $EXPORT_OK{$func_name}) { ! $code = _make_tag_func($func_name); } } die "Undefined subroutine $AUTOLOAD\n" unless $code; --- 634,646 ---- $code = "sub $AUTOLOAD { }" if (!$code and $func_name eq 'DESTROY'); if (!$code) { + (my $base = $func_name) =~ s/^(start_|end_)//i; if ($EXPORT{':any'} || $EXPORT{'-any'} || ! $EXPORT{$base} || (%EXPORT_OK || grep(++$EXPORT_OK{$_},&expand_tags(':html'))) ! && $EXPORT_OK{$base}) { ! $code = $CGI::DefaultClass->_make_tag_func($func_name); } } die "Undefined subroutine $AUTOLOAD\n" unless $code; *************** *** 644,657 **** my $self = shift; my $compile = 0; foreach (@_) { ! $NPH++, next if /^[:-]nph$/; ! $NO_DEBUG++, next if /^[:-]no_?[Dd]ebug$/; ! $PRIVATE_TEMPFILES++, next if /^[:-]private_tempfiles$/; ! $EXPORT{$_}++, next if /^[:-]any$/; ! $compile++, next if /^[:-]compile$/; ! # This is probably extremely evil code -- to be deleted ! # some day. if (/^[-]autoload$/) { my($pkg) = caller(1); *{"${pkg}::AUTOLOAD"} = sub { --- 660,674 ---- my $self = shift; my $compile = 0; foreach (@_) { ! $HEADERS_ONCE++, next if /^[:-]unique_headers$/; ! $NPH++, next if /^[:-]nph$/; ! $NO_DEBUG++, next if /^[:-]no_?[Dd]ebug$/; ! $USE_PARAM_SEMICOLONS++, next if /^[:-]newstyle_urls$/; ! $PRIVATE_TEMPFILES++, next if /^[:-]private_tempfiles$/; ! $EXPORT{$_}++, next if /^[:-]any$/; ! $compile++, next if /^[:-]compile$/; ! # This is probably extremely evil code -- to be deleted some day. if (/^[-]autoload$/) { my($pkg) = caller(1); *{"${pkg}::AUTOLOAD"} = sub { *************** *** 978,984 **** unless (exists($self->{'.url_param'})) { $self->{'.url_param'}={}; # empty hash if ($ENV{QUERY_STRING} =~ /=/) { ! my(@pairs) = split('&',$ENV{QUERY_STRING}); my($param,$value); foreach (@pairs) { ($param,$value) = split('=',$_,2); --- 995,1001 ---- unless (exists($self->{'.url_param'})) { $self->{'.url_param'}={}; # empty hash if ($ENV{QUERY_STRING} =~ /=/) { ! my(@pairs) = split(/[&;]/,$ENV{QUERY_STRING}); my($param,$value); foreach (@pairs) { ($param,$value) = split('=',$_,2); *************** *** 1043,1048 **** --- 1060,1066 ---- $filehandle = to_filehandle($filehandle); my($param); local($,) = ''; # set print field separator back to a sane value + local($\) = ''; # set output line separator to a sane value foreach $param ($self->param) { my($escaped_param) = escape($param); my($value); *************** *** 1141,1158 **** my($self,@p) = self_or_default(@_); my(@header); my($type,$status,$cookie,$target,$expires,$nph,@other) = ! $self->rearrange([TYPE,STATUS,[COOKIE,COOKIES],TARGET,EXPIRES,NPH],@p); $nph ||= $NPH; # rearrange() was designed for the HTML portion, so we # need to fix it up a little. foreach (@other) { ! next unless my($header,$value) = /([^\s=]+)=\"?([^\"]+)\"?/; ($_ = $header) =~ s/^(\w)(.*)/$1 . lc ($2) . ": $value"/e; } ! $type = $type || 'text/html'; # Maybe future compatibility. Maybe not. my $protocol = $ENV{SERVER_PROTOCOL} || 'HTTP/1.0'; --- 1159,1179 ---- my($self,@p) = self_or_default(@_); my(@header); + return undef if $self->{'.header_printed'}++ and $HEADERS_ONCE; + my($type,$status,$cookie,$target,$expires,$nph,@other) = ! $self->rearrange([['TYPE','CONTENT_TYPE','CONTENT-TYPE'], ! STATUS,[COOKIE,COOKIES],TARGET,EXPIRES,NPH],@p); $nph ||= $NPH; # rearrange() was designed for the HTML portion, so we # need to fix it up a little. foreach (@other) { ! next unless my($header,$value) = /([^\s=]+)=\"?(.+?)\"?$/; ($_ = $header) =~ s/^(\w)(.*)/$1 . lc ($2) . ": $value"/e; } ! $type ||= 'text/html' unless defined($type); # Maybe future compatibility. Maybe not. my $protocol = $ENV{SERVER_PROTOCOL} || 'HTTP/1.0'; *************** *** 1164,1170 **** if ($cookie) { my(@cookie) = ref($cookie) && ref($cookie) eq 'ARRAY' ? @{$cookie} : $cookie; foreach (@cookie) { ! push(@header,"Set-Cookie: " . (UNIVERSAL::isa($_,'CGI::Cookie') ? $_->as_string : $_)); } } # if the user indicates an expiration time, then we need --- 1185,1192 ---- if ($cookie) { my(@cookie) = ref($cookie) && ref($cookie) eq 'ARRAY' ? @{$cookie} : $cookie; foreach (@cookie) { ! my $cs = UNIVERSAL::isa($_,'CGI::Cookie') ? $_->as_string : $_; ! push(@header,"Set-Cookie: $cs") if $cs ne ''; } } # if the user indicates an expiration time, then we need *************** *** 1175,1181 **** push(@header,"Date: " . expires(0,'http')) if $expires || $cookie; push(@header,"Pragma: no-cache") if $self->cache(); push(@header,@other); ! push(@header,"Content-Type: $type"); my $header = join($CRLF,@header)."${CRLF}${CRLF}"; if ($MOD_PERL and not $nph) { --- 1197,1203 ---- push(@header,"Date: " . expires(0,'http')) if $expires || $cookie; push(@header,"Pragma: no-cache") if $self->cache(); push(@header,@other); ! push(@header,"Content-Type: $type") if $type ne ''; my $header = join($CRLF,@header)."${CRLF}${CRLF}"; if ($MOD_PERL and not $nph) { *************** *** 1221,1226 **** --- 1243,1249 ---- '-nph'=>$nph); unshift(@o,'-Target'=>$target) if $target; unshift(@o,'-Cookie'=>$cookie) if $cookie; + unshift(@o,'-Type'=>''); return $self->header(@o); } END_OF_FUNC *************** *** 1407,1412 **** --- 1430,1440 ---- } END_OF_FUNC + 'end_multipart_form' => <<'END_OF_FUNC', + sub end_multipart_form { + &endform; + } + END_OF_FUNC #### Method: start_multipart_form # synonym for startform *************** *** 1459,1466 **** $name = defined($name) ? $self->escapeHTML($name) : ''; my($s) = defined($size) ? qq/ SIZE=$size/ : ''; my($m) = defined($maxlength) ? qq/ MAXLENGTH=$maxlength/ : ''; ! my($other) = @other ? " @other" : ''; ! return qq//; } END_OF_FUNC --- 1487,1497 ---- $name = defined($name) ? $self->escapeHTML($name) : ''; my($s) = defined($size) ? qq/ SIZE=$size/ : ''; my($m) = defined($maxlength) ? qq/ MAXLENGTH=$maxlength/ : ''; ! my($other) = @other ? " @other" : ''; ! # this entered at cristy's request to fix problems with file upload fields ! # and WebTV -- not sure it won't break stuff ! my($value) = $current ne '' ? qq(VALUE="$current") : ''; ! return qq//; } END_OF_FUNC *************** *** 1787,1798 **** sub unescapeHTML { my $string = ref($_[0]) ? $_[1] : $_[0]; return undef unless defined($string); ! $string=~s/&/&/ig; ! $string=~s/"/\"/ig; ! $string=~s/>/>/ig; ! $string=~s/</" : ! /^lt$/i ? "<" : ! /^#(\d+)$/ ? chr($1) : ! /^#x([0-9a-f]+)$/i ? chr(hex($1)) : ! $_ ! }gex; return $string; } END_OF_FUNC *************** *** 1867,1880 **** } else { $checked = $default; } - # If no check array is specified, check the first by default - $checked = $values->[0] unless defined($checked) && $checked ne ''; - $name=$self->escapeHTML($name); - my(@elements,@values); - @values = $self->_set_values_and_labels($values,\$labels,$name); my($other) = @other ? " @other" : ''; foreach (@values) { my($checkit) = $checked eq $_ ? ' CHECKED' : ''; --- 1903,1915 ---- } else { $checked = $default; } my(@elements,@values); @values = $self->_set_values_and_labels($values,\$labels,$name); + # If no check array is specified, check the first by default + $checked = $values[0] unless defined($checked) && $checked ne ''; + $name=$self->escapeHTML($name); + my($other) = @other ? " @other" : ''; foreach (@values) { my($checkit) = $checked eq $_ ? ' CHECKED' : ''; *************** *** 2321,2327 **** push(@pairs,"$eparam=$value"); } } ! return join("&",@pairs); } END_OF_FUNC --- 2356,2362 ---- push(@pairs,"$eparam=$value"); } } ! return join($USE_PARAM_SEMICOLONS ? ';' : '&',@pairs); } END_OF_FUNC *************** *** 2337,2344 **** # declares a quantitative score for it. # This handles MIME type globs correctly. #### ! 'accept' => <<'END_OF_FUNC', ! sub accept { my($self,$search) = self_or_CGI(@_); my(%prefs,$type,$pref,$pat); --- 2372,2379 ---- # declares a quantitative score for it. # This handles MIME type globs correctly. #### ! 'Accept' => <<'END_OF_FUNC', ! sub Accept { my($self,$search) = self_or_CGI(@_); my(%prefs,$type,$pref,$pat); *************** *** 2758,2763 **** --- 2793,2799 ---- chmod 0600,$tmp; # only the owner can tamper with it my ($data); + local($\) = ''; while (defined($data = $buffer->read)) { print $filehandle $data; } *************** *** 2841,2850 **** 'asString' => <<'END_OF_FUNC', sub asString { my $self = shift; ! my $i = $$self; ! $i=~ s/^\*(\w+::)+//; # get rid of package name $i =~ s/\\(.)/$1/g; return $i; } END_OF_FUNC --- 2877,2894 ---- 'asString' => <<'END_OF_FUNC', sub asString { my $self = shift; ! # get rid of package name ! (my $i = $$self) =~ s/^\*(\w+::)+//; $i =~ s/\\(.)/$1/g; return $i; + # BEGIN DEAD CODE + # This was an extremely clever patch that allowed "use strict refs". + # Unfortunately it relied on another bug that caused leaky file descriptors. + # The underlying bug has been fixed, so this no longer works. However + # "strict refs" still works for some reason. + # my $self = shift; + # return ${*{$self}{SCALAR}}; + # END DEAD CODE } END_OF_FUNC *************** *** 2861,2871 **** my($pack,$name,$file,$delete) = @_; require Fcntl unless defined &Fcntl::O_RDWR; ++$FH; ! *{$FH} = quotemeta($name); ! sysopen($FH,$file,Fcntl::O_RDWR()|Fcntl::O_CREAT()|Fcntl::O_EXCL()) || die "CGI open of $file: $!\n"; unlink($file) if $delete; ! return bless \*{$FH},$pack; } END_OF_FUNC --- 2905,2916 ---- my($pack,$name,$file,$delete) = @_; require Fcntl unless defined &Fcntl::O_RDWR; ++$FH; ! my $ref = \*{'Fh::' . quotemeta($name)}; ! sysopen($ref,$file,Fcntl::O_RDWR()|Fcntl::O_CREAT()|Fcntl::O_EXCL()) || die "CGI open of $file: $!\n"; unlink($file) if $delete; ! delete $Fh::{$FH}; ! return bless $ref,$pack; } END_OF_FUNC *************** *** 2883,2892 **** package MultipartBuffer; # how many bytes to read at a time. We use ! # a 5K buffer by default. ! $INITIAL_FILLUNIT = 1024 * 5; ! $TIMEOUT = 10*60; # 10 minute timeout ! $SPIN_LOOP_MAX = 1000; # bug fix for some Netscape servers $CRLF=$CGI::CRLF; #reuse the autoload function --- 2928,2937 ---- package MultipartBuffer; # how many bytes to read at a time. We use ! # a 4K buffer by default. ! $INITIAL_FILLUNIT = 1024 * 4; ! $TIMEOUT = 240*60; # 4 hour timeout for big files ! $SPIN_LOOP_MAX = 2000; # bug fix for some Netscape servers $CRLF=$CGI::CRLF; #reuse the autoload function *************** *** 2930,2937 **** # characters "--" PLUS the Boundary string # BUG: IE 3.01 on the Macintosh uses just the boundary -- not ! # the two extra spaces. We do a special case here on the user-agent!!!! ! $boundary = "--$boundary" unless CGI::user_agent('MSIE 3\.0[12]; Mac'); } else { # otherwise we find it ourselves my($old); --- 2975,2982 ---- # characters "--" PLUS the Boundary string # BUG: IE 3.01 on the Macintosh uses just the boundary -- not ! # the two extra hyphens. We do a special case here on the user-agent!!!! ! $boundary = "--$boundary" unless CGI::user_agent('MSIE 3\.0[12]; ?Mac'); } else { # otherwise we find it ourselves my($old); *************** *** 3088,3093 **** --- 3133,3139 ---- \$self->{BUFFER}, $bytesToRead, $bufferLength); + $self->{BUFFER} = '' unless defined $self->{BUFFER}; # An apparent bug in the Apache server causes the read() # to return zero bytes repeatedly without blocking if the *************** *** 3129,3135 **** my ($vol) = $MAC ? MacPerl::Volumes() =~ /:(.*)/ : ""; unless ($TMPDIRECTORY) { @TEMP=("${SL}usr${SL}tmp","${SL}var${SL}tmp", ! "${SL}tmp","${SL}temp","${vol}${SL}Temporary Items", "${SL}WWW_ROOT"); foreach (@TEMP) { do {$TMPDIRECTORY = $_; last} if -d $_ && -w _; --- 3175,3181 ---- my ($vol) = $MAC ? MacPerl::Volumes() =~ /:(.*)/ : ""; unless ($TMPDIRECTORY) { @TEMP=("${SL}usr${SL}tmp","${SL}var${SL}tmp", ! "C:${SL}temp","${SL}tmp","${SL}temp","${vol}${SL}Temporary Items", "${SL}WWW_ROOT"); foreach (@TEMP) { do {$TMPDIRECTORY = $_; last} if -d $_ && -w _; *************** *** 3273,3282 **** independent of the others, this allows you to save the state of the script and restore it later. ! For example, using the object oriented style, here is now you create a simple "Hello World" HTML page: ! #!/usr/local/bin/pelr use CGI; # load CGI routines $q = new CGI; # create new CGI object print $q->header, # create the HTTP header --- 3319,3328 ---- independent of the others, this allows you to save the state of the script and restore it later. ! For example, using the object oriented style, here is how you create a simple "Hello World" HTML page: ! #!/usr/local/bin/perl use CGI; # load CGI routines $q = new CGI; # create new CGI object print $q->header, # create the HTTP header *************** *** 3294,3300 **** into our name space (usually the "standard" functions), and we don't need to create the CGI object. ! #!/usr/local/bin/pelr use CGI qw/:standard/; # load standard CGI routines print header, # create the HTTP header start_html('hello world'), # start the HTML --- 3340,3346 ---- into our name space (usually the "standard" functions), and we don't need to create the CGI object. ! #!/usr/local/bin/perl use CGI qw/:standard/; # load standard CGI routines print header, # create the HTTP header start_html('hello world'), # start the HTML *************** *** 3319,3325 **** dash. If a dash is present in the first argument, CGI.pm assumes dashes for the subsequent ones. ! You don't have to use the hyphen at allif you don't want to. After creating a CGI object, call the B method with a nonzero value. This will tell CGI.pm that you intend to use named parameters exclusively: --- 3365,3371 ---- dash. If a dash is present in the first argument, CGI.pm assumes dashes for the subsequent ones. ! You don't have to use the hyphen at all if you don't want to. After creating a CGI object, call the B method with a nonzero value. This will tell CGI.pm that you intend to use named parameters exclusively: *************** *** 3667,3673 **** $zipcode = param('zipcode'); More frequently, you'll import common sets of functions by referring ! to the gropus by name. All function sets are preceded with a ":" character as in ":html3" (for tags defined in the HTML 3 standard). Here is a list of the function sets you can import: --- 3713,3719 ---- $zipcode = param('zipcode'); More frequently, you'll import common sets of functions by referring ! to the groups by name. All function sets are preceded with a ":" character as in ":html3" (for tags defined in the HTML 3 standard). Here is a list of the function sets you can import: *************** *** 3719,3725 **** Microsoft comes out with a new tag called (which causes the user's desktop to be flooded with a rotating gradient fill until his machine reboots). You don't need to wait for a new version of CGI.pm ! to start using it immeidately: use CGI qw/:standard :html3 gradient/; print gradient({-start=>'red',-end=>'blue'}); --- 3765,3771 ---- Microsoft comes out with a new tag called (which causes the user's desktop to be flooded with a rotating gradient fill until his machine reboots). You don't need to wait for a new version of CGI.pm ! to start using it immediately: use CGI qw/:standard :html3 gradient/; print gradient({-start=>'red',-end=>'blue'}); *************** *** 3799,3805 **** rather than deferred to later. This is useful for scripts that run for an extended period of time under FastCGI or mod_perl, and for those destined to be crunched by Malcom Beattie's Perl compiler. Use ! it in conjunction with the methods or method familes you plan to use. use CGI qw(-compile :standard :html3); --- 3845,3851 ---- rather than deferred to later. This is useful for scripts that run for an extended period of time under FastCGI or mod_perl, and for those destined to be crunched by Malcom Beattie's Perl compiler. Use ! it in conjunction with the methods or method families you plan to use. use CGI qw(-compile :standard :html3); *************** *** 3819,3824 **** --- 3865,3881 ---- to tell the server that the script is NPH. See the discussion of NPH scripts below. + =item -newstyle_urls + + Separate the name=value pairs in CGI parameter query strings with + semicolons rather than ampersands. For example: + + ?name=fred;age=24;favorite_color=3 + + Semicolon-delimited query strings are always accepted, but will not be + emitted by self_url() and query_string() unless the -newstyle_urls + pragma is specified. + =item -autoload This overrides the autoloader so that any function in your program *************** *** 3859,3865 **** the -private_tempfiles pragma will cause the temporary file to be unlinked as soon as it is opened and before any data is written into it, eliminating the risk of eavesdropping. ! n =back =head1 GENERATING DYNAMIC DOCUMENTS --- 3916,3966 ---- the -private_tempfiles pragma will cause the temporary file to be unlinked as soon as it is opened and before any data is written into it, eliminating the risk of eavesdropping. ! ! =back ! ! =head2 SPECIAL FORMS FOR IMPORTING HTML-TAG FUNCTIONS ! ! Many of the methods generate HTML tags. As described below, tag ! functions automatically generate both the opening and closing tags. ! For example: ! ! print h1('Level 1 Header'); ! ! produces ! !

Level 1 Header

! ! There will be some times when you want to produce the start and end ! tags yourself. In this case, you can use the form start_I ! and end_I, as in: ! ! print start_h1,'Level 1 Header',end_h1; ! ! With a few exceptions (described below), start_I and ! end_I functions are not generated automatically when you ! I. However, you can specify the tags you want to generate ! I functions for by putting an asterisk in front of their ! name, or, alternatively, requesting either "start_I" or ! "end_I" in the import list. ! ! Example: ! ! use CGI qw/:standard *table start_ul/; ! ! In this example, the following functions are generated in addition to ! the standard ones: ! ! =over 4 ! ! =item 1. start_table() (generates a tag) ! ! =item 2. end_table() (generates a
tag) ! ! =item 3. start_ul() (generates a
    tag) ! ! =item 4. end_ul() (generates a
tag) ! =back =head1 GENERATING DYNAMIC DOCUMENTS *************** *** 4247,4252 **** --- 4348,4372 ---- =back + =head2 MIXING POST AND URL PARAMETERS + + $color = $query->url_param('color'); + + It is possible for a script to receive CGI parameters in the URL as + well as in the fill-out form by creating a form that POSTs to a URL + containing a query string (a "?" mark followed by arguments). The + B method will always return the contents of the POSTed + fill-out form, ignoring the URL's query string. To retrieve URL + parameters, call the B method. Use it in the same way as + B. The main difference is that it allows you to read the + parameters, but not set them. + + + Under no circumstances will the contents of the URL query string + interfere with similarly-named CGI parameters in POSTed forms. If you + try to mix a URL query string with a form submitted with the GET + method, the results will not be what you expect. + =head1 CREATING STANDARD HTML ELEMENTS: CGI.pm defines general HTML shortcut methods for most, if not all of *************** *** 4325,4331 **** Prior to CGI.pm version 2.41, providing an empty ('') string as an attribute argument was the same as providing undef. However, this has ! changed in order to accomodate those who want to create tags of the form . The difference is shown in these two pieces of code: CODE RESULT --- 4445,4451 ---- Prior to CGI.pm version 2.41, providing an empty ('') string as an attribute argument was the same as providing undef. However, this has ! changed in order to accommodate those who want to create tags of the form . The difference is shown in these two pieces of code: CODE RESULT *************** *** 4410,4420 **** --- 4530,4550 ---- Tr Link Delete + Accept + Sub In addition, start_html(), end_html(), start_form(), end_form(), start_multipart_form() and all the fill-out form tags are special. See their respective sections. + =head2 PRETTY-PRINTING HTML + + By default, all the HTML produced by these functions comes out as one + long line without carriage returns or indentation. This is yuck, but + it does reduce the size of the documents by 10-20%. To get + pretty-printed output, please use L, a subclass + contributed by Brian Paulsen. + =head1 CREATING FILL-OUT FORMS: I The various form-creating methods all return strings *************** *** 4469,4475 **** print $query->startform(-method=>$method, -action=>$action, ! -encoding=>$encoding); <... various form stuff ...> print $query->endform; --- 4599,4605 ---- print $query->startform(-method=>$method, -action=>$action, ! -enctype=>$encoding); <... various form stuff ...> print $query->endform; *************** *** 4484,4494 **** method: POST action: this script ! encoding: application/x-www-form-urlencoded endform() returns the closing tag. ! Startform()'s encoding method tells the browser how to package the various fields of the form before sending the form to the server. Two values are possible: --- 4614,4624 ---- method: POST action: this script ! enctype: application/x-www-form-urlencoded endform() returns the closing tag. ! Startform()'s enctype argument tells the browser how to package the various fields of the form before sending the form to the server. Two values are possible: *************** *** 4671,4682 **** The optional second parameter is the starting value for the field contents to be used as the default file name (-default). ! The beta2 version of Netscape 2.0 currently doesn't pay any attention ! to this field, and so the starting value will always be blank. Worse, ! the field loses its "sticky" behavior and forgets its previous ! contents. The starting value field is called for in the HTML ! specification, however, and possibly later versions of Netscape will ! honor it. =item 3. --- 4801,4811 ---- The optional second parameter is the starting value for the field contents to be used as the default file name (-default). ! For security reasons, browsers don't pay any attention to this field, ! and so the starting value will always be blank. Worse, the field ! loses its "sticky" behavior and forgets its previous contents. The ! starting value field is called for in the HTML specification, however, ! and possibly some browser will eventually provide support for it. =item 3. *************** *** 5093,5099 **** can use the B<-rowheader> and B<-colheader> parameters. Both of these accept a pointer to an array of headings to use. The headings are just decorative. They don't reorganize the ! interpetation of the radio buttons -- they're still a single named unit. =back --- 5222,5228 ---- can use the B<-rowheader> and B<-colheader> parameters. Both of these accept a pointer to an array of headings to use. The headings are just decorative. They don't reorganize the ! interpretation of the radio buttons -- they're still a single named unit. =back *************** *** 5157,5162 **** --- 5286,5294 ---- form to its value from the last time the script was called, NOT necessarily to the defaults. + Note that this conflicts with the Perl reset() built-in. Use + CORE::reset() to get the original reset function. + =head2 CREATING A DEFAULT BUTTON print $query->defaults('button_label') *************** *** 5263,5273 **** non-Netscape browsers this form element will probably not even display. ! =head1 NETSCAPE COOKIES ! Netscape browsers versions 1.1 and higher support a so-called ! "cookie" designed to help maintain state within a browser session. ! CGI.pm has several methods that support cookies. A cookie is a name=value pair much like the named parameters in a CGI query string. CGI scripts create one or more cookies and send --- 5395,5406 ---- non-Netscape browsers this form element will probably not even display. ! =head1 HTTP COOKIES ! Netscape browsers versions 1.1 and higher, and all versions of ! Internet Explorer, support a so-called "cookie" designed to help ! maintain state within a browser session. CGI.pm has several methods ! that support cookies. A cookie is a name=value pair much like the named parameters in a CGI query string. CGI scripts create one or more cookies and send *************** *** 5285,5299 **** This is a time/date string (in a special GMT format) that indicates when a cookie expires. The cookie will be saved and returned to your script until this expiration date is reached if the user exits ! Netscape and restarts it. If an expiration date isn't specified, the cookie ! will remain active until the user quits Netscape. =item 2. a domain This is a partial or complete domain name for which the cookie is valid. The browser will return the cookie to any host that matches the partial domain name. For example, if you specify a domain name ! of ".capricorn.com", then Netscape will return the cookie to Web servers running on any of the machines "www.capricorn.com", "www2.capricorn.com", "feckless.capricorn.com", etc. Domain names must contain at least two periods to prevent attempts to match --- 5418,5432 ---- This is a time/date string (in a special GMT format) that indicates when a cookie expires. The cookie will be saved and returned to your script until this expiration date is reached if the user exits ! the browser and restarts it. If an expiration date isn't specified, the cookie ! will remain active until the user quits the browser. =item 2. a domain This is a partial or complete domain name for which the cookie is valid. The browser will return the cookie to any host that matches the partial domain name. For example, if you specify a domain name ! of ".capricorn.com", then the browser will return the cookie to Web servers running on any of the machines "www.capricorn.com", "www2.capricorn.com", "feckless.capricorn.com", etc. Domain names must contain at least two periods to prevent attempts to match *************** *** 5318,5324 **** =back ! The interface to Netscape cookies is the B method: $cookie = $query->cookie(-name=>'sessionID', -value=>'xyzzy', --- 5451,5457 ---- =back ! The interface to HTTP cookies is the B method: $cookie = $query->cookie(-name=>'sessionID', -value=>'xyzzy', *************** *** 5335,5341 **** =item B<-name> The name of the cookie (required). This can be any string at all. ! Although Netscape limits its cookie names to non-whitespace alphanumeric characters, CGI.pm removes this restriction by escaping and unescaping cookies behind the scenes. --- 5468,5474 ---- =item B<-name> The name of the cookie (required). This can be any string at all. ! Although browsers limit their cookie names to non-whitespace alphanumeric characters, CGI.pm removes this restriction by escaping and unescaping cookies behind the scenes. *************** *** 5406,5424 **** See the B example script for some ideas on how to use cookies effectively. ! B There appear to be some (undocumented) restrictions on ! Netscape cookies. In Netscape 2.01, at least, I haven't been able to ! set more than three cookies at a time. There may also be limits on ! the length of cookies. If you need to store a lot of information, ! it's probably better to create a unique session ID, store it in a ! cookie, and use the session ID to locate an external file/database ! saved on the server's side of the connection. ! ! =head1 WORKING WITH NETSCAPE FRAMES ! ! It's possible for CGI.pm scripts to write into several browser ! panels and windows using Netscape's frame mechanism. ! There are three techniques for defining new frames programmatically: =over 4 --- 5539,5549 ---- See the B example script for some ideas on how to use cookies effectively. ! =head1 WORKING WITH FRAMES ! ! It's possible for CGI.pm scripts to write into several browser panels ! and windows using the HTML 4 frame mechanism. There are three ! techniques for defining new frames programmatically: =over 4 *************** *** 5441,5452 **** print $q->header(-target=>'ResultsWindow'); ! This will tell Netscape to load the output of your script into the ! frame named "ResultsWindow". If a frame of that name doesn't ! already exist, Netscape will pop up a new window and load your ! script's document into that. There are a number of magic names ! that you can use for targets. See the frame documents on Netscape's ! home pages for details. =item 3. Specify the destination for the document in the
tag --- 5566,5577 ---- print $q->header(-target=>'ResultsWindow'); ! This will tell the browser to load the output of your script into the ! frame named "ResultsWindow". If a frame of that name doesn't already ! exist, the browser will pop up a new window and load your script's ! document into that. There are a number of magic names that you can ! use for targets. See the frame documents on Netscape's home pages for ! details. =item 3. Specify the destination for the document in the tag *************** *** 5591,5603 **** ! You can pass a value of 'true' to dump() in order to get it to ! print the results out as plain text, suitable for incorporating ! into a
 section.
! 
! As a shortcut, as of version 1.56 you can interpolate the entire CGI
! object into a string and it will be replaced with the a nice HTML dump
! shown above:
  
      $query=new CGI;
      print "

Current Values

$query\n"; --- 5716,5723 ---- ! As a shortcut, you can interpolate the entire CGI object into a string ! and it will be replaced with the a nice HTML dump shown above: $query=new CGI; print "

Current Values

$query\n"; *************** *** 5609,5632 **** =over 4 ! =item B ! Return a list of MIME types that the remote browser ! accepts. If you give this method a single argument ! corresponding to a MIME type, as in ! $query->accept('text/html'), it will return a ! floating point value corresponding to the browser's ! preference for this type from 0.0 (don't want) to 1.0. ! Glob types (e.g. text/*) in the browser's accept list ! are handled correctly. =item B Returns the HTTP_COOKIE variable, an HTTP extension implemented by ! Netscape browsers version 1.1 and higher. Cookies have a special ! format, and this method call just returns the raw form (?cookie ! dough). See cookie() for ways of setting and retrieving cooked ! cookies. Called with no parameters, raw_cookie() returns the packed cookie structure. You can separate it into individual cookies by splitting --- 5729,5753 ---- =over 4 ! =item B ! ! Return a list of MIME types that the remote browser accepts. If you ! give this method a single argument corresponding to a MIME type, as in ! $query->Accept('text/html'), it will return a floating point value ! corresponding to the browser's preference for this type from 0.0 ! (don't want) to 1.0. Glob types (e.g. text/*) in the browser's accept ! list are handled correctly. ! Note that the capitalization changed between version 2.43 and 2.44 in ! order to avoid conflict with Perl's accept() function. =item B Returns the HTTP_COOKIE variable, an HTTP extension implemented by ! Netscape browsers version 1.1 and higher, and all versions of Internet ! Explorer. Cookies have a special format, and this method call just ! returns the raw form (?cookie dough). See cookie() for ways of ! setting and retrieving cooked cookies. Called with no parameters, raw_cookie() returns the packed cookie structure. You can separate it into individual cookies by splitting *************** *** 5708,5717 **** =item B ! Attempt to obtain the remote user's name, using a variety ! of different techniques. This only works with older browsers ! such as Mosaic. Netscape does not reliably report the user ! name! =item B --- 5829,5837 ---- =item B ! Attempt to obtain the remote user's name, using a variety of different ! techniques. This only works with older browsers such as Mosaic. ! Newer browsers do not report the user name for privacy reasons! =item B *************** *** 5935,5948 **** =head1 AUTHOR INFORMATION ! Copyright 1995-1997, Lincoln D. Stein. All rights reserved. It may ! be used and modified freely, but I do request that this copyright ! notice remain attached to the file. You may modify this module as you ! wish, but if you redistribute a modified version, please attach a note ! listing the modifications you have made. ! Address bug reports and comments to: ! lstein@genome.wi.mit.edu =head1 CREDITS --- 6055,6071 ---- =head1 AUTHOR INFORMATION ! Copyright 1995-1998, Lincoln D. Stein. All rights reserved. ! ! This library is free software; you can redistribute it and/or modify ! it under the same terms as Perl itself. ! Address bug reports and comments to: lstein@cshl.org. When sending ! bug reports, please provide the version of CGI.pm, the version of ! Perl, the name and version of your Web server, and the name and ! version of the operating system you are using. If the problem is even ! remotely browser dependent, please provide information about the ! affected browers as well. =head1 CREDITS *************** *** 5962,5968 **** =item Joergen Haegg (jh@axis.se) ! =item Laurent Delfosse (delfosse@csgrad1.cs.wvu.edu) =item Richard Resnick (applepi1@aol.com) --- 6085,6091 ---- =item Joergen Haegg (jh@axis.se) ! =item Laurent Delfosse (delfosse@delfosse.com) =item Richard Resnick (applepi1@aol.com) *************** *** 6054,6060 **** -rows=>10, -columns=>50); ! print "

",$query->reset; print $query->submit('Action','Shout'); print $query->submit('Action','Scream'); print $query->endform; --- 6177,6183 ---- -rows=>10, -columns=>50); ! print "

",$query->Reset; print $query->submit('Action','Shout'); print $query->submit('Action','Scream'); print $query->endform; *************** *** 6095,6102 **** =head1 SEE ALSO L, L, L, L, ! L, L, L, L, ! L, L =cut --- 6218,6225 ---- =head1 SEE ALSO L, L, L, L, ! L, L, L, L, ! L =cut diff -c 'perl5.005_02/lib/CGI/Apache.pm' 'perl5.005_03/lib/CGI/Apache.pm' Index: ./lib/CGI/Apache.pm *** ./lib/CGI/Apache.pm Thu Jul 23 23:00:29 1998 --- ./lib/CGI/Apache.pm Wed Jan 6 22:41:53 1999 *************** *** 78,84 **** =head1 DESCRIPTION When using the Perl-Apache API, your applications are faster, but the ! enviroment is different than CGI. This module attempts to set-up that environment as best it can. =head1 NOTE 1 --- 78,84 ---- =head1 DESCRIPTION When using the Perl-Apache API, your applications are faster, but the ! environment is different than CGI. This module attempts to set-up that environment as best it can. =head1 NOTE 1 diff -c 'perl5.005_02/lib/CGI/Carp.pm' 'perl5.005_03/lib/CGI/Carp.pm' Index: ./lib/CGI/Carp.pm *** ./lib/CGI/Carp.pm Thu Jul 23 23:00:29 1998 --- ./lib/CGI/Carp.pm Sat Jan 23 17:44:44 1999 *************** *** 14,19 **** --- 14,25 ---- warn "I'm confused"; die "I'm dying.\n"; + use CGI::Carp qw(cluck); + cluck "I wouldn't do that if I were you"; + + use CGI::Carp qw(fatalsToBrowser); + die "Fatal error messages are now sent to browser"; + =head1 DESCRIPTION CGI scripts have a nasty habit of leaving warning messages in the error *************** *** 155,165 **** 1.10 Patch from Chris Dean (ctdean@cogit.com) to allow module to run correctly under mod_perl. =head1 AUTHORS ! Lincoln D. Stein . Feel free to redistribute ! this under the Perl Artistic License. =head1 SEE ALSO --- 161,181 ---- 1.10 Patch from Chris Dean (ctdean@cogit.com) to allow module to run correctly under mod_perl. + 1.11 Changed order of > and < escapes. + + 1.12 Changed die() on line 217 to CORE::die to avoid B<-w> warning. + + 1.13 Added cluck() to make the module orthogonal with Carp. + More mod_perl related fixes. + =head1 AUTHORS ! Copyright 1995-1998, Lincoln D. Stein. All rights reserved. ! ! This library is free software; you can redistribute it and/or modify ! it under the same terms as Perl itself. + Address bug reports and comments to: lstein@cshl.org =head1 SEE ALSO *************** *** 174,184 **** @ISA = qw(Exporter); @EXPORT = qw(confess croak carp); ! @EXPORT_OK = qw(carpout fatalsToBrowser wrap set_message); $main::SIG{__WARN__}=\&CGI::Carp::warn; $main::SIG{__DIE__}=\&CGI::Carp::die; ! $CGI::Carp::VERSION = '1.101'; $CGI::Carp::CUSTOM_MSG = undef; # fancy import routine detects and handles 'errorWrap' specially. --- 190,200 ---- @ISA = qw(Exporter); @EXPORT = qw(confess croak carp); ! @EXPORT_OK = qw(carpout fatalsToBrowser wrap set_message cluck); $main::SIG{__WARN__}=\&CGI::Carp::warn; $main::SIG{__DIE__}=\&CGI::Carp::die; ! $CGI::Carp::VERSION = '1.13'; $CGI::Carp::CUSTOM_MSG = undef; # fancy import routine detects and handles 'errorWrap' specially. *************** *** 194,200 **** } # These are the originals - # XXX Why not just use CORE::die etc., instead of these two? GSAR sub realwarn { CORE::warn(@_); } sub realdie { CORE::die(@_); } --- 210,215 ---- *************** *** 230,237 **** # eval. These evals don't count when looking at the stack backtrace. sub _longmess { my $message = Carp::longmess(); ! my $mod_perl = ($ENV{'GATEWAY_INTERFACE'} ! && $ENV{'GATEWAY_INTERFACE'} =~ /^CGI-Perl\//); $message =~ s,eval[^\n]+Apache/Registry\.pm.*,,s if $mod_perl; return( $message ); } --- 245,251 ---- # eval. These evals don't count when looking at the stack backtrace. sub _longmess { my $message = Carp::longmess(); ! my $mod_perl = exists $ENV{MOD_PERL}; $message =~ s,eval[^\n]+Apache/Registry\.pm.*,,s if $mod_perl; return( $message ); } *************** *** 240,246 **** my $message = shift; my $time = scalar(localtime); my($file,$line,$id) = id(1); ! $message .= " at $file line $line.\n" unless $message=~/\n$/; &fatalsToBrowser($message) if $WRAP && _longmess() !~ /eval [{\']/m; my $stamp = stamp; $message=~s/^/$stamp/gm; --- 254,260 ---- my $message = shift; my $time = scalar(localtime); my($file,$line,$id) = id(1); ! $message .= " at $file line $line." unless $message=~/\n$/; &fatalsToBrowser($message) if $WRAP && _longmess() !~ /eval [{\']/m; my $stamp = stamp; $message=~s/^/$stamp/gm; *************** *** 258,265 **** local $^W=0; eval <&STDERR"); open(STDERR, ">&$no") or --- 284,290 ---- sub carpout { my($in) = @_; my($no) = fileno(to_filehandle($in)); ! realdie("Invalid filehandle $in\n") unless defined $no; open(SAVEERR, ">&STDERR"); open(STDERR, ">&$no") or *************** *** 279,287 **** # headers sub fatalsToBrowser { my($msg) = @_; $msg=~s/>/>/g; $msg=~s/$ENV{SERVER_ADMIN})] : --- 294,302 ---- # headers sub fatalsToBrowser { my($msg) = @_; + $msg=~s/&/&/g; $msg=~s/>/>/g; $msg=~s/$ENV{SERVER_ADMIN})] : *************** *** 291,297 **** and the time and date of the error. END ; ! print STDOUT "Content-type: text/html\n\n"; if ($CUSTOM_MSG) { if (ref($CUSTOM_MSG) eq 'CODE') { --- 306,314 ---- and the time and date of the error. END ; ! my $mod_perl = exists $ENV{MOD_PERL}; ! print STDOUT "Content-type: text/html\n\n" ! unless $mod_perl; if ($CUSTOM_MSG) { if (ref($CUSTOM_MSG) eq 'CODE') { *************** *** 302,314 **** } } ! print STDOUT <Software error: $msg

! $outer_message; END ; } # Cut and paste from CGI.pm so that we don't have the overhead of --- 319,348 ---- } } ! my $mess = <Software error: $msg

! $outer_message END ; + + if ($mod_perl) { + my $r = Apache->request; + # If bytes have already been sent, then + # we print the message out directly. + # Otherwise we make a custom error + # handler to produce the doc for us. + if ($r->bytes_sent) { + $r->print($mess); + $r->exit; + } else { + $r->status(500); + $r->custom_response(500,$mess); + } + } else { + print STDOUT $mess; + } } # Cut and paste from CGI.pm so that we don't have the overhead of diff -c 'perl5.005_02/lib/CGI/Cookie.pm' 'perl5.005_03/lib/CGI/Cookie.pm' Index: ./lib/CGI/Cookie.pm *** ./lib/CGI/Cookie.pm Thu Jul 23 23:00:29 1998 --- ./lib/CGI/Cookie.pm Sat Jan 23 17:44:44 1999 *************** *** 69,75 **** my($key,$value) = split("="); my(@values) = map CGI::unescape($_),split('&',$value); $key = CGI::unescape($key); ! $results{$key} = $self->new(-name=>$key,-value=>\@values); } return \%results unless wantarray; return %results; --- 69,77 ---- my($key,$value) = split("="); my(@values) = map CGI::unescape($_),split('&',$value); $key = CGI::unescape($key); ! # A bug in Netscape can cause several cookies with same name to ! # appear. The FIRST one in HTTP_COOKIE is the most recent version. ! $results{$key} ||= $self->new(-name=>$key,-value=>\@values); } return \%results unless wantarray; return %results; *************** *** 399,411 **** =head1 AUTHOR INFORMATION ! be used and modified freely, but I do request that this copyright ! notice remain attached to the file. You may modify this module as you ! wish, but if you redistribute a modified version, please attach a note ! listing the modifications you have made. ! Address bug reports and comments to: ! lstein@genome.wi.mit.edu =head1 BUGS --- 401,412 ---- =head1 AUTHOR INFORMATION ! Copyright 1997-1998, Lincoln D. Stein. All rights reserved. ! This library is free software; you can redistribute it and/or modify ! it under the same terms as Perl itself. ! ! Address bug reports and comments to: lstein@cshl.org =head1 BUGS diff -c 'perl5.005_02/lib/CGI/Fast.pm' 'perl5.005_03/lib/CGI/Fast.pm' Index: ./lib/CGI/Fast.pm *** ./lib/CGI/Fast.pm Thu Jul 23 23:00:30 1998 --- ./lib/CGI/Fast.pm Sat Jan 23 17:44:44 1999 *************** *** 16,22 **** # The most recent version and complete docs are available at: # http://www.genome.wi.mit.edu/ftp/pub/software/WWW/cgi_docs.html # ftp://ftp-genome.wi.mit.edu/pub/software/WWW/ ! $CGI::Fast::VERSION='1.00a'; use CGI; use FCGI; --- 16,22 ---- # The most recent version and complete docs are available at: # http://www.genome.wi.mit.edu/ftp/pub/software/WWW/cgi_docs.html # ftp://ftp-genome.wi.mit.edu/pub/software/WWW/ ! $CGI::Fast::VERSION='1.01'; use CGI; use FCGI; *************** *** 34,42 **** # New is slightly different in that it calls FCGI's # accept() method. sub new { ! return undef unless FCGI::accept() >= 0; ! my($self,@param) = @_; ! return $CGI::Q = $self->SUPER::new(@param); } 1; --- 34,44 ---- # New is slightly different in that it calls FCGI's # accept() method. sub new { ! my ($self, $initializer, @param) = @_; ! unless (defined $initializer) { ! return undef unless FCGI::accept() >= 0; ! } ! return $CGI::Q = $self->SUPER::new($initializer, @param); } 1; *************** *** 154,166 **** =head1 AUTHOR INFORMATION ! be used and modified freely, but I do request that this copyright ! notice remain attached to the file. You may modify this module as you ! wish, but if you redistribute a modified version, please attach a note ! listing the modifications you have made. ! Address bug reports and comments to: ! lstein@genome.wi.mit.edu =head1 BUGS --- 156,167 ---- =head1 AUTHOR INFORMATION ! Copyright 1996-1998, Lincoln D. Stein. All rights reserved. ! This library is free software; you can redistribute it and/or modify ! it under the same terms as Perl itself. ! ! Address bug reports and comments to: lstein@cshl.org =head1 BUGS diff -c 'perl5.005_02/lib/CGI/Push.pm' 'perl5.005_03/lib/CGI/Push.pm' Index: ./lib/CGI/Push.pm *** ./lib/CGI/Push.pm Thu Jul 23 23:00:30 1998 --- ./lib/CGI/Push.pm Sat Jan 23 17:44:44 1999 *************** *** 14,21 **** # listing the modifications you have made. # The most recent version and complete docs are available at: ! # http://www.genome.wi.mit.edu/ftp/pub/software/WWW/cgi_docs.html ! # ftp://ftp-genome.wi.mit.edu/pub/software/WWW/ $CGI::Push::VERSION='1.01'; use CGI; --- 14,20 ---- # listing the modifications you have made. # The most recent version and complete docs are available at: ! # http://stein.cshl.org/WWW/software/CGI/ $CGI::Push::VERSION='1.01'; use CGI; *************** *** 287,305 **** Microsoft IIS. Users of other servers should see their documentation for help. - =head1 CAVEATS - - This is a new module. It hasn't been extensively tested. - =head1 AUTHOR INFORMATION ! be used and modified freely, but I do request that this copyright ! notice remain attached to the file. You may modify this module as you ! wish, but if you redistribute a modified version, please attach a note ! listing the modifications you have made. ! Address bug reports and comments to: ! lstein@genome.wi.mit.edu =head1 BUGS --- 286,299 ---- Microsoft IIS. Users of other servers should see their documentation for help. =head1 AUTHOR INFORMATION ! Copyright 1995-1998, Lincoln D. Stein. All rights reserved. ! ! This library is free software; you can redistribute it and/or modify ! it under the same terms as Perl itself. ! Address bug reports and comments to: lstein@cshl.org =head1 BUGS diff -c 'perl5.005_02/lib/CPAN.pm' 'perl5.005_03/lib/CPAN.pm' Index: ./lib/CPAN.pm Prereq: 1.226 *** ./lib/CPAN.pm Thu Jul 23 23:00:32 1998 --- ./lib/CPAN.pm Sun Mar 28 14:26:32 1999 *************** *** 1,24 **** package CPAN; ! use vars qw{$Try_autoload $Revision $META $Signal $Cwd $End $Suppress_readline %Dontload $Frontend $Defaultsite ! }; ! $VERSION = '1.3901'; ! # $Id: CPAN.pm,v 1.226 1998/07/08 22:29:29 k Exp k $ # only used during development: $Revision = ""; ! # $Revision = "[".substr(q$Revision: 1.226 $, 10)."]"; use Carp (); use Config (); use Cwd (); use DirHandle; use Exporter (); ! use ExtUtils::MakeMaker (); use File::Basename (); use File::Copy (); use File::Find; --- 1,25 ---- package CPAN; ! use vars qw{$Try_autoload ! $Revision $META $Signal $Cwd $End $Suppress_readline %Dontload $Frontend $Defaultsite ! }; #}; ! $VERSION = '1.48'; ! # $Id: CPAN.pm,v 1.260 1999/03/06 19:31:02 k Exp $ # only used during development: $Revision = ""; ! # $Revision = "[".substr(q$Revision: 1.260 $, 10)."]"; use Carp (); use Config (); use Cwd (); use DirHandle; use Exporter (); ! use ExtUtils::MakeMaker (); # $SelfLoader::DEBUG=1; use File::Basename (); use File::Copy (); use File::Find; *************** *** 27,36 **** use Safe (); use Text::ParseWords (); use Text::Wrap; END { $End++; &cleanup; } ! %CPAN::DEBUG = qw( CPAN 1 Index 2 InfoObj 4 --- 28,38 ---- use Safe (); use Text::ParseWords (); use Text::Wrap; + use File::Spec; END { $End++; &cleanup; } ! %CPAN::DEBUG = qw[ CPAN 1 Index 2 InfoObj 4 *************** *** 45,51 **** Eval 2048 Config 4096 Tarzip 8192 ! ); $CPAN::DEBUG ||= 0; $CPAN::Signal ||= 0; --- 47,53 ---- Eval 2048 Config 4096 Tarzip 8192 ! ]; $CPAN::DEBUG ||= 0; $CPAN::Signal ||= 0; *************** *** 56,68 **** use vars qw($VERSION @EXPORT $AUTOLOAD $DEBUG $META $term); use strict qw(vars); ! @CPAN::ISA = qw(CPAN::Debug Exporter MM); # MM will go away ! # soonish. Already version ! # 1.29 doesn't rely on ! # catfile and catdir being ! # available via ! # inheritance. Anything else ! # in danger? @EXPORT = qw( autobundle bundle expand force get --- 58,64 ---- use vars qw($VERSION @EXPORT $AUTOLOAD $DEBUG $META $term); use strict qw(vars); ! @CPAN::ISA = qw(CPAN::Debug Exporter); @EXPORT = qw( autobundle bundle expand force get *************** *** 75,80 **** --- 71,77 ---- $l =~ s/.*:://; my(%EXPORT); @EXPORT{@EXPORT} = ''; + CPAN::Config->load unless $CPAN::Config_loaded++; if (exists $EXPORT{$l}){ CPAN::Shell->$l(@_); } else { *************** *** 92,98 **** --- 89,97 ---- #-> sub CPAN::shell ; sub shell { + my($self) = @_; $Suppress_readline ||= ! -t STDIN; + CPAN::Config->load unless $CPAN::Config_loaded++; my $prompt = "cpan> "; local($^W) = 1; *************** *** 100,107 **** require Term::ReadLine; # import Term::ReadLine; $term = Term::ReadLine->new('CPAN Monitor'); ! $readline::rl_completion_function = ! $readline::rl_completion_function = 'CPAN::Complete::cpl'; } no strict; --- 99,118 ---- require Term::ReadLine; # import Term::ReadLine; $term = Term::ReadLine->new('CPAN Monitor'); ! if ($term->ReadLine eq "Term::ReadLine::Gnu") { ! my $attribs = $term->Attribs; ! # $attribs->{completion_entry_function} = ! # $attribs->{'list_completion_function'}; ! $attribs->{attempted_completion_function} = sub { ! &CPAN::Complete::gnu_cpl; ! } ! # $attribs->{completion_word} = ! # [qw(help me somebody to find out how ! # to use completion with GNU)]; ! } else { ! $readline::rl_completion_function = ! $readline::rl_completion_function = 'CPAN::Complete::cpl'; ! } } no strict; *************** *** 109,114 **** --- 120,126 ---- my $getcwd; $getcwd = $CPAN::Config->{'getcwd'} || 'cwd'; my $cwd = CPAN->$getcwd(); + my $try_detect_readline = $term->ReadLine eq "Term::ReadLine::Stub"; my $rl_avail = $Suppress_readline ? "suppressed" : ($term->ReadLine ne "Term::ReadLine::Stub") ? "enabled" : "available (try ``install Bundle::CPAN'')"; *************** *** 131,137 **** $_ = "$continuation$_" if $continuation; s/^\s+//; next if /^$/; ! $_ = 'h' if $_ eq '?'; if (/^(?:q(?:uit)?|bye|exit)$/i) { last; } elsif (s/\\$//s) { --- 143,149 ---- $_ = "$continuation$_" if $continuation; s/^\s+//; next if /^$/; ! $_ = 'h' if /^\s*\?/; if (/^(?:q(?:uit)?|bye|exit)$/i) { last; } elsif (s/\\$//s) { *************** *** 168,173 **** --- 180,199 ---- } } continue { $Signal=0; + CPAN::Queue->nullify_queue; + if ($try_detect_readline) { + if ($CPAN::META->has_inst("Term::ReadLine::Gnu") + || + $CPAN::META->has_inst("Term::ReadLine::Perl") + ) { + delete $INC{"Term/ReadLine.pm"}; + my $redef; + local($SIG{__WARN__}) = CPAN::Shell::dotdot_onreload(\$redef); + require Term::ReadLine; + $CPAN::Frontend->myprint("\n$redef subroutines in Term::ReadLine redefined\n"); + goto &shell; + } + } } } *************** *** 230,236 **** $CPAN::Frontend->mywarn(qq{ Commands starting with "w" require CPAN::WAIT to be installed. Please consider installing CPAN::WAIT to use the fulltext index. ! For this you just need to type install CPAN::WAIT }); } --- 256,262 ---- $CPAN::Frontend->mywarn(qq{ Commands starting with "w" require CPAN::WAIT to be installed. Please consider installing CPAN::WAIT to use the fulltext index. ! For this you just need to type install CPAN::WAIT }); } *************** *** 260,266 **** if (defined($name=$INC{"$pkg.pm"})) { $name =~ s|^(.*)$pkg\.pm$|$1auto/$pkg/$func.al|; ! $name = undef unless (-r $name); } unless (defined $name) { --- 286,292 ---- if (defined($name=$INC{"$pkg.pm"})) { $name =~ s|^(.*)$pkg\.pm$|$1auto/$pkg/$func.al|; ! $name = undef unless (-r $name); } unless (defined $name) { *************** *** 275,281 **** *$autoload = sub {}; $ok = 1; } else { ! if ($name =~ s/(\w{12,})\.al$/substr($1,0,11).".al"/e){ eval {local $SIG{__DIE__};require $name}; } if ($@){ --- 301,307 ---- *$autoload = sub {}; $ok = 1; } else { ! if ($name =~ s{(\w{12,})\.al$}{substr($1,0,11).".al"}e){ eval {local $SIG{__DIE__};require $name}; } if ($@){ *************** *** 286,292 **** } } } else { ! $ok = 1; } $@ = $save; # my $lm = Carp::longmess(); --- 312,320 ---- } } } else { ! ! $ok = 1; ! } $@ = $save; # my $lm = Carp::longmess(); *************** *** 303,309 **** # $Try_autoload = 1; if ($CPAN::Try_autoload) { ! my $p; for $p (qw( CPAN::Author CPAN::Bundle CPAN::CacheMgr CPAN::Complete CPAN::Config CPAN::Debug CPAN::Distribution CPAN::FTP --- 331,337 ---- # $Try_autoload = 1; if ($CPAN::Try_autoload) { ! my $p; for $p (qw( CPAN::Author CPAN::Bundle CPAN::CacheMgr CPAN::Complete CPAN::Config CPAN::Debug CPAN::Distribution CPAN::FTP *************** *** 318,338 **** @CPAN::Tarzip::ISA = qw(CPAN::Debug); package CPAN::Queue; ! # currently only used to determine if we should or shouldn't announce ! # the availability of a new CPAN module sub new { my($class,$mod) = @_; ! # warn "Queue object for mod[$mod]"; ! bless {mod => $mod}, $class; } ! package CPAN; - $META ||= CPAN->new; # In case we reeval ourselves we - # need a || ! # Do this after you have set up the whole inheritance ! CPAN::Config->load unless defined $CPAN::No_Config_is_ok; 1; --- 346,472 ---- @CPAN::Tarzip::ISA = qw(CPAN::Debug); package CPAN::Queue; ! ! # One use of the queue is to determine if we should or shouldn't ! # announce the availability of a new CPAN module ! ! # Now we try to use it for dependency tracking. For that to happen ! # we need to draw a dependency tree and do the leaves first. This can ! # easily be reached by running CPAN.pm recursively, but we don't want ! # to waste memory and run into deep recursion. So what we can do is ! # this: ! ! # CPAN::Queue is the package where the queue is maintained. Dependencies ! # often have high priority and must be brought to the head of the queue, ! # possibly by jumping the queue if they are already there. My first code ! # attempt tried to be extremely correct. Whenever a module needed ! # immediate treatment, I either unshifted it to the front of the queue, ! # or, if it was already in the queue, I spliced and let it bypass the ! # others. This became a too correct model that made it impossible to put ! # an item more than once into the queue. Why would you need that? Well, ! # you need temporary duplicates as the manager of the queue is a loop ! # that ! # ! # (1) looks at the first item in the queue without shifting it off ! # ! # (2) cares for the item ! # ! # (3) removes the item from the queue, *even if its agenda failed and ! # even if the item isn't the first in the queue anymore* (that way ! # protecting against never ending queues) ! # ! # So if an item has prerequisites, the installation fails now, but we ! # want to retry later. That's easy if we have it twice in the queue. ! # ! # I also expect insane dependency situations where an item gets more ! # than two lives in the queue. Simplest example is triggered by 'install ! # Foo Foo Foo'. People make this kind of mistakes and I don't want to ! # get in the way. I wanted the queue manager to be a dumb servant, not ! # one that knows everything. ! # ! # Who would I tell in this model that the user wants to be asked before ! # processing? I can't attach that information to the module object, ! # because not modules are installed but distributions. So I'd have to ! # tell the distribution object that it should ask the user before ! # processing. Where would the question be triggered then? Most probably ! # in CPAN::Distribution::rematein. ! # Hope that makes sense, my head is a bit off:-) -- AK ! ! use vars qw{ @All }; ! sub new { my($class,$mod) = @_; ! my $self = bless {mod => $mod}, $class; ! push @All, $self; ! # my @all = map { $_->{mod} } @All; ! # warn "Adding Queue object for mod[$mod] all[@all]"; ! return $self; ! } ! ! sub first { ! my $obj = $All[0]; ! $obj->{mod}; ! } ! ! sub delete_first { ! my($class,$what) = @_; ! my $i; ! for my $i (0..$#All) { ! if ( $All[$i]->{mod} eq $what ) { ! splice @All, $i, 1; ! return; ! } ! } } ! sub jumpqueue { ! my $class = shift; ! my @what = @_; ! my $obj; ! WHAT: for my $what (reverse @what) { ! my $jumped = 0; ! for (my $i=0; $i<$#All;$i++) { #prevent deep recursion ! if ($All[$i]->{mod} eq $what){ ! $jumped++; ! if ($jumped > 100) { # one's OK if e.g. just processing now; ! # more are OK if user typed it several ! # times ! $CPAN::Frontend->mywarn( ! qq{Object [$what] queued more than 100 times, ignoring} ! ); ! next WHAT; ! } ! } ! } ! my $obj = bless { mod => $what }, $class; ! unshift @All, $obj; ! } ! } ! ! sub exists { ! my($self,$what) = @_; ! my @all = map { $_->{mod} } @All; ! my $exists = grep { $_->{mod} eq $what } @All; ! # warn "Checking exists in Queue object for mod[$what] all[@all] exists[$exists]"; ! $exists; ! } ! ! sub delete { ! my($self,$mod) = @_; ! @All = grep { $_->{mod} ne $mod } @All; ! # my @all = map { $_->{mod} } @All; ! # warn "Deleting Queue object for mod[$mod] all[@all]"; ! } ! ! sub nullify_queue { ! @All = (); ! } ! ! package CPAN; ! ! $META ||= CPAN->new; # In case we re-eval ourselves we need the || 1; *************** *** 356,367 **** sub test; #-> sub CPAN::all ; ! sub all { my($mgr,$class) = @_; CPAN->debug("mgr[$mgr] class[$class]") if $CPAN::DEBUG; CPAN::Index->reload; values %{ $META->{$class} }; } # Called by shell, not in batch mode. Not clean XXX #-> sub CPAN::checklock ; --- 490,503 ---- sub test; #-> sub CPAN::all ; ! sub all_objects { my($mgr,$class) = @_; + CPAN::Config->load unless $CPAN::Config_loaded++; CPAN->debug("mgr[$mgr] class[$class]") if $CPAN::DEBUG; CPAN::Index->reload; values %{ $META->{$class} }; } + *all = \&all_objects; # Called by shell, not in batch mode. Not clean XXX #-> sub CPAN::checklock ; *************** *** 434,441 **** $self->{LOCK} = $lockfile; $fh->close; $SIG{'TERM'} = sub { ! &cleanup; ! $CPAN::Frontend->mydie("Got SIGTERM, leaving"); }; $SIG{'INT'} = sub { # no blocks!!! --- 570,577 ---- $self->{LOCK} = $lockfile; $fh->close; $SIG{'TERM'} = sub { ! &cleanup; ! $CPAN::Frontend->mydie("Got SIGTERM, leaving"); }; $SIG{'INT'} = sub { # no blocks!!! *************** *** 491,503 **** $file =~ s|/|\\|g if $^O eq 'MSWin32'; $file .= ".pm"; if ($INC{$file}) { ! # warn "$file in %INC"; #debug return 1; } elsif (eval { require $file }) { # eval is good: if we haven't yet read the database it's # perfect and if we have installed the module in the meantime, # it tries again. The second require is only a NOOP returning # 1 if we had success, otherwise it's retrying $CPAN::Frontend->myprint("CPAN: $mod loaded ok\n"); if ($mod eq "CPAN::WAIT") { push @CPAN::Shell::ISA, CPAN::WAIT; --- 627,644 ---- $file =~ s|/|\\|g if $^O eq 'MSWin32'; $file .= ".pm"; if ($INC{$file}) { ! # checking %INC is wrong, because $INC{LWP} may be true ! # although $INC{"URI/URL.pm"} may have failed. But as ! # I really want to say "bla loaded OK", I have to somehow ! # cache results. ! ### warn "$file in %INC"; #debug return 1; } elsif (eval { require $file }) { # eval is good: if we haven't yet read the database it's # perfect and if we have installed the module in the meantime, # it tries again. The second require is only a NOOP returning # 1 if we had success, otherwise it's retrying + $CPAN::Frontend->myprint("CPAN: $mod loaded ok\n"); if ($mod eq "CPAN::WAIT") { push @CPAN::Shell::ISA, CPAN::WAIT; *************** *** 518,523 **** --- 659,666 ---- }); sleep 2; + } else { + delete $INC{$file}; # if it inc'd LWP but failed during, say, URI } return 0; } *************** *** 537,552 **** #-> sub CPAN::cleanup ; sub cleanup { ! local $SIG{__DIE__} = ''; ! my $i = 0; my $ineval = 0; my $sub; ! while ((undef,undef,undef,$sub) = caller(++$i)) { ! $ineval = 1, last if $sub eq '(eval)'; ! } ! return if $ineval && !$End; ! return unless defined $META->{'LOCK'}; ! return unless -f $META->{'LOCK'}; ! unlink $META->{'LOCK'}; ! $CPAN::Frontend->mywarn("Lockfile removed.\n"); } package CPAN::CacheMgr; --- 680,709 ---- #-> sub CPAN::cleanup ; sub cleanup { ! # warn "cleanup called with arg[@_] End[$End] Signal[$Signal]"; ! local $SIG{__DIE__} = ''; ! my($message) = @_; ! my $i = 0; ! my $ineval = 0; ! if ( ! 0 && # disabled, try reload cpan with it ! $] > 5.004_60 # thereabouts ! ) { ! $ineval = $^S; ! } else { ! my($subroutine); ! while ((undef,undef,undef,$subroutine) = caller(++$i)) { ! $ineval = 1, last if ! $subroutine eq '(eval)'; ! } ! } ! return if $ineval && !$End; ! return unless defined $META->{'LOCK'}; ! return unless -f $META->{'LOCK'}; ! unlink $META->{'LOCK'}; ! # require Carp; ! # Carp::cluck("DEBUGGING"); ! $CPAN::Frontend->mywarn("Lockfile removed.\n"); } package CPAN::CacheMgr; *************** *** 597,603 **** $getcwd = $CPAN::Config->{'getcwd'} || 'cwd'; my($cwd) = CPAN->$getcwd(); chdir $dir or Carp::croak("Can't chdir to $dir: $!"); ! my $dh = DirHandle->new(".") or Carp::croak("Couldn't opendir $dir: $!"); my(@entries); for ($dh->read) { next if $_ eq "." || $_ eq ".."; --- 754,761 ---- $getcwd = $CPAN::Config->{'getcwd'} || 'cwd'; my($cwd) = CPAN->$getcwd(); chdir $dir or Carp::croak("Can't chdir to $dir: $!"); ! my $dh = DirHandle->new(File::Spec->curdir) ! or Carp::croak("Couldn't opendir $dir: $!"); my(@entries); for ($dh->read) { next if $_ eq "." || $_ eq ".."; *************** *** 621,629 **** my($Du) = 0; find( sub { ! $File::Find::prune++ if $CPAN::Signal; ! return if -l $_; ! $Du += -s _; }, $dir ); --- 779,793 ---- my($Du) = 0; find( sub { ! $File::Find::prune++ if $CPAN::Signal; ! return if -l $_; ! if ($^O eq 'MacOS') { ! require Mac::Files; ! my $cat = Mac::Files::FSpGetCatInfo($_); ! $Du += $cat->ioFlLgLen() + $cat->ioFlRLgLen(); ! } else { ! $Du += (-s _); ! } }, $dir ); *************** *** 655,680 **** my $self = { ID => $CPAN::Config->{'build_dir'}, MAX => $CPAN::Config->{'build_cache'}, DU => 0 }; File::Path::mkpath($self->{ID}); my $dh = DirHandle->new($self->{ID}); bless $self, $class; ! my $e; $CPAN::Frontend->myprint( sprintf("Scanning cache %s for sizes\n", $self->{ID})); for $e ($self->entries($self->{ID})) { next if $e eq ".." || $e eq "."; $self->disk_usage($e); return if $CPAN::Signal; } $self->tidyup; - $t2 = time; - $debug .= "timing of CacheMgr->new: ".($t2 - $time); - $time = $t2; - CPAN->debug($debug) if $CPAN::DEBUG; - $self; } package CPAN::Debug; --- 819,854 ---- my $self = { ID => $CPAN::Config->{'build_dir'}, MAX => $CPAN::Config->{'build_cache'}, + SCAN => $CPAN::Config->{'scan_cache'} || 'atstart', DU => 0 }; File::Path::mkpath($self->{ID}); my $dh = DirHandle->new($self->{ID}); bless $self, $class; ! $self->scan_cache; ! $t2 = time; ! $debug .= "timing of CacheMgr->new: ".($t2 - $time); ! $time = $t2; ! CPAN->debug($debug) if $CPAN::DEBUG; ! $self; ! } ! ! #-> sub CPAN::CacheMgr::scan_cache ; ! sub scan_cache { ! my $self = shift; ! return if $self->{SCAN} eq 'never'; ! $CPAN::Frontend->mydie("Unknown scan_cache argument: $self->{SCAN}") ! unless $self->{SCAN} eq 'atstart'; $CPAN::Frontend->myprint( sprintf("Scanning cache %s for sizes\n", $self->{ID})); + my $e; for $e ($self->entries($self->{ID})) { next if $e eq ".." || $e eq "."; $self->disk_usage($e); return if $CPAN::Signal; } $self->tidyup; } package CPAN::Debug; *************** *** 755,761 **** unless (defined $configpm){ $configpm ||= $INC{"CPAN/MyConfig.pm"}; $configpm ||= $INC{"CPAN/Config.pm"}; ! $configpm || Carp::confess(qq{ CPAN::Config::commit called without an argument. Please specify a filename where to save the configuration or try "o conf init" to have an interactive course through configing. --- 929,935 ---- unless (defined $configpm){ $configpm ||= $INC{"CPAN/MyConfig.pm"}; $configpm ||= $INC{"CPAN/Config.pm"}; ! $configpm || Carp::confess(q{ CPAN::Config::commit called without an argument. Please specify a filename where to save the configuration or try "o conf init" to have an interactive course through configing. *************** *** 779,784 **** --- 953,959 ---- EOF $msg ||= "\n"; my($fh) = FileHandle->new; + rename $configpm, "$configpm~" if -f $configpm; open $fh, ">$configpm" or warn "Couldn't open >$configpm: $!"; $fh->print(qq[$msg\$CPAN::Config = \{\n]); foreach (sort keys %$CPAN::Config) { *************** *** 823,828 **** --- 998,1004 ---- sub load { my($self) = shift; my(@miss); + use Carp; eval {require CPAN::Config;}; # We eval because of some # MakeMaker problems unless ($dot_cpan++){ *************** *** 887,897 **** } } local($") = ", "; ! $CPAN::Frontend->myprint(qq{ We have to reconfigure CPAN.pm due to following uninitialized parameters: @miss ! }) if $redo && ! $theycalled; $CPAN::Frontend->myprint(qq{ $configpm initialized. }); --- 1063,1073 ---- } } local($") = ", "; ! $CPAN::Frontend->myprint(<myprint(qq{ $configpm initialized. }); *************** *** 903,911 **** sub not_loaded { my(@miss); for (qw( ! cpan_home keep_source_where build_dir build_cache index_expire ! gzip tar unzip make pager makepl_arg make_arg make_install_arg ! urllist inhibit_startup_message ftp_proxy http_proxy no_proxy )) { push @miss, $_ unless defined $CPAN::Config->{$_}; } --- 1079,1088 ---- sub not_loaded { my(@miss); for (qw( ! cpan_home keep_source_where build_dir build_cache scan_cache ! index_expire gzip tar unzip make pager makepl_arg make_arg ! make_install_arg urllist inhibit_startup_message ! ftp_proxy http_proxy no_proxy prerequisites_policy )) { push @miss, $_ unless defined $CPAN::Config->{$_}; } *************** *** 918,927 **** delete $INC{'CPAN/Config.pm'}; } - *h = \&help; #-> sub CPAN::Config::help ; sub help { ! $CPAN::Frontend->myprint(qq{ Known options: defaults reload default config values from disk commit commit session changes to disk --- 1095,1103 ---- delete $INC{'CPAN/Config.pm'}; } #-> sub CPAN::Config::help ; sub help { ! $CPAN::Frontend->myprint(q[ Known options: defaults reload default config values from disk commit commit session changes to disk *************** *** 937,943 **** o conf urllist unshift ftp://ftp.foo.bar/ ! }); undef; #don't reprint CPAN::Config } --- 1113,1119 ---- o conf urllist unshift ftp://ftp.foo.bar/ ! ]); undef; #don't reprint CPAN::Config } *************** *** 1024,1030 **** #-> sub CPAN::Shell::d ; sub d { $CPAN::Frontend->myprint(shift->format_result('Distribution',@_));} #-> sub CPAN::Shell::m ; ! sub m { $CPAN::Frontend->myprint(shift->format_result('Module',@_));} #-> sub CPAN::Shell::i ; sub i { --- 1200,1208 ---- #-> sub CPAN::Shell::d ; sub d { $CPAN::Frontend->myprint(shift->format_result('Distribution',@_));} #-> sub CPAN::Shell::m ; ! sub m { # emacs confused here }; sub mimimimimi { # emacs in sync here ! $CPAN::Frontend->myprint(shift->format_result('Module',@_)); ! } #-> sub CPAN::Shell::i ; sub i { *************** *** 1139,1144 **** --- 1317,1337 ---- } } + sub dotdot_onreload { + my($ref) = shift; + sub { + if ( $_[0] =~ /Subroutine (\w+) redefined/ ) { + my($subr) = $1; + ++$$ref; + local($|) = 1; + # $CPAN::Frontend->myprint(".($subr)"); + $CPAN::Frontend->myprint("."); + return; + } + warn @_; + }; + } + #-> sub CPAN::Shell::reload ; sub reload { my($self,$command,@arg) = @_; *************** *** 1148,1174 **** CPAN->debug("reloading the whole CPAN.pm") if $CPAN::DEBUG; my $fh = FileHandle->new($INC{'CPAN.pm'}); local($/); - undef $/; $redef = 0; ! local($SIG{__WARN__}) ! = sub { ! if ( $_[0] =~ /Subroutine \w+ redefined/ ) { ! ++$redef; ! local($|) = 1; ! $CPAN::Frontend->myprint("."); ! return; ! } ! warn @_; ! }; eval <$fh>; warn $@ if $@; $CPAN::Frontend->myprint("\n$redef subroutines redefined\n"); } elsif ($command =~ /index/) { ! CPAN::Index->force_reload; } else { ! $CPAN::Frontend->myprint(qq{cpan re-evals the CPAN.pm file ! index re-reads the index files ! }); } } --- 1341,1356 ---- CPAN->debug("reloading the whole CPAN.pm") if $CPAN::DEBUG; my $fh = FileHandle->new($INC{'CPAN.pm'}); local($/); $redef = 0; ! local($SIG{__WARN__}) = dotdot_onreload(\$redef); eval <$fh>; warn $@ if $@; $CPAN::Frontend->myprint("\n$redef subroutines redefined\n"); } elsif ($command =~ /index/) { ! CPAN::Index->force_reload; } else { ! $CPAN::Frontend->myprint(qq{cpan re-evals the CPAN.pm file ! index re-reads the index files\n}); } } *************** *** 1323,1328 **** --- 1505,1511 ---- #-> sub CPAN::Shell::autobundle ; sub autobundle { my($self) = shift; + CPAN::Config->load unless $CPAN::Config_loaded++; my(@bundle) = $self->_u_r_common("a",@_); my($todir) = MM->catdir($CPAN::Config->{'cpan_home'},"Bundle"); File::Path::mkpath($todir); *************** *** 1379,1385 **** my $class = "CPAN::$type"; my $obj; if (defined $regex) { ! for $obj ( sort {$a->id cmp $b->id} $CPAN::META->all($class)) { push @m, $obj if $obj->id =~ /$regex/i --- 1562,1568 ---- my $class = "CPAN::$type"; my $obj; if (defined $regex) { ! for $obj ( sort {$a->id cmp $b->id} $CPAN::META->all_objects($class)) { push @m, $obj if $obj->id =~ /$regex/i *************** *** 1500,1521 **** CPAN->debug("pragma[$pragma]meth[$meth] some[@some]") if $CPAN::DEBUG; my($s,@s); foreach $s (@some) { my $obj; if (ref $s) { $obj = $s; } elsif ($s =~ m|/|) { # looks like a file $obj = $CPAN::META->instance('CPAN::Distribution',$s); } elsif ($s =~ m|^Bundle::|) { - $CPAN::META->{'CPAN::Queue'}{$s} ||= CPAN::Queue->new($s); $obj = $CPAN::META->instance('CPAN::Bundle',$s); } else { - $CPAN::META->{'CPAN::Queue'}{$s} ||= CPAN::Queue->new($s); $obj = $CPAN::META->instance('CPAN::Module',$s) if $CPAN::META->exists('CPAN::Module',$s); } if (ref $obj) { CPAN->debug( ! qq{pragma[$pragma] meth[$meth] obj[$obj] as_string\[}. $obj->as_string. qq{\]} ) if $CPAN::DEBUG; --- 1683,1705 ---- CPAN->debug("pragma[$pragma]meth[$meth] some[@some]") if $CPAN::DEBUG; my($s,@s); foreach $s (@some) { + CPAN::Queue->new($s); + } + while ($s = CPAN::Queue->first) { my $obj; if (ref $s) { $obj = $s; } elsif ($s =~ m|/|) { # looks like a file $obj = $CPAN::META->instance('CPAN::Distribution',$s); } elsif ($s =~ m|^Bundle::|) { $obj = $CPAN::META->instance('CPAN::Bundle',$s); } else { $obj = $CPAN::META->instance('CPAN::Module',$s) if $CPAN::META->exists('CPAN::Module',$s); } if (ref $obj) { CPAN->debug( ! qq{pragma[$pragma]meth[$meth]obj[$obj]as_string\[}. $obj->as_string. qq{\]} ) if $CPAN::DEBUG; *************** *** 1530,1536 **** if ($]>=5.00303 && $obj->can('called_for')) { $obj->called_for($s); } ! $obj->$meth(); } elsif ($CPAN::META->exists('CPAN::Author',$s)) { $obj = $CPAN::META->instance('CPAN::Author',$s); $CPAN::Frontend->myprint( --- 1714,1722 ---- if ($]>=5.00303 && $obj->can('called_for')) { $obj->called_for($s); } ! CPAN::Queue->delete($s) if $obj->$meth(); # if it is more ! # than once in ! # the queue } elsif ($CPAN::META->exists('CPAN::Author',$s)) { $obj = $CPAN::META->instance('CPAN::Author',$s); $CPAN::Frontend->myprint( *************** *** 1540,1546 **** " ;-)\n" ); } else { ! $CPAN::Frontend->myprint(qq{Warning: Cannot $meth $s, don\'t know what it is. Try the command i /$s/ --- 1726,1734 ---- " ;-)\n" ); } else { ! $CPAN::Frontend ! ->myprint(qq{Warning: Cannot $meth $s, }. ! qq{don\'t know what it is. Try the command i /$s/ *************** *** 1548,1553 **** --- 1736,1742 ---- to find objects with similar identifiers. }); } + CPAN::Queue->delete_first($s); } } *************** *** 1572,1606 **** #-> sub CPAN::FTP::ftp_get ; sub ftp_get { ! my($class,$host,$dir,$file,$target) = @_; ! $class->debug( ! qq[Going to fetch file [$file] from dir [$dir] on host [$host] as local [$target]\n] ) if $CPAN::DEBUG; ! my $ftp = Net::FTP->new($host); ! return 0 unless defined $ftp; ! $ftp->debug(1) if $CPAN::DEBUG{'FTP'} & $CPAN::DEBUG; ! $class->debug(qq[Going to ->login("anonymous","$Config::Config{'cf_email'}")\n]); ! unless ( $ftp->login("anonymous",$Config::Config{'cf_email'}) ){ ! warn "Couldn't login on $host"; ! return; ! } ! unless ( $ftp->cwd($dir) ){ ! warn "Couldn't cwd $dir"; ! return; ! } ! $ftp->binary; ! $class->debug(qq[Going to ->get("$file","$target")\n]) if $CPAN::DEBUG; ! unless ( $ftp->get($file,$target) ){ ! warn "Couldn't fetch $file from $host\n"; ! return; ! } ! $ftp->quit; # it's ok if this fails ! return 1; } # If more accuracy is wanted/needed, Chris Leach sent me this patch... ! # leach,> *** /install/perl/live/lib/CPAN.pm- Wed Sep 24 13:08:48 1997 # leach,> --- /tmp/cp Wed Sep 24 13:26:40 1997 # leach,> *************** --- 1761,1795 ---- #-> sub CPAN::FTP::ftp_get ; sub ftp_get { ! my($class,$host,$dir,$file,$target) = @_; ! $class->debug( ! qq[Going to fetch file [$file] from dir [$dir] on host [$host] as local [$target]\n] ) if $CPAN::DEBUG; ! my $ftp = Net::FTP->new($host); ! return 0 unless defined $ftp; ! $ftp->debug(1) if $CPAN::DEBUG{'FTP'} & $CPAN::DEBUG; ! $class->debug(qq[Going to ->login("anonymous","$Config::Config{'cf_email'}")\n]); ! unless ( $ftp->login("anonymous",$Config::Config{'cf_email'}) ){ ! warn "Couldn't login on $host"; ! return; ! } ! unless ( $ftp->cwd($dir) ){ ! warn "Couldn't cwd $dir"; ! return; ! } ! $ftp->binary; ! $class->debug(qq[Going to ->get("$file","$target")\n]) if $CPAN::DEBUG; ! unless ( $ftp->get($file,$target) ){ ! warn "Couldn't fetch $file from $host\n"; ! return; ! } ! $ftp->quit; # it's ok if this fails ! return 1; } # If more accuracy is wanted/needed, Chris Leach sent me this patch... ! # leach,> *** /install/perl/live/lib/CPAN.pm- Wed Sep 24 13:08:48 1997 # leach,> --- /tmp/cp Wed Sep 24 13:26:40 1997 # leach,> *************** *************** *** 1664,1669 **** --- 1853,1872 ---- $self->debug("file[$file] aslocal[$aslocal] force[$force]") if $CPAN::DEBUG; + if ($^O eq 'MacOS') { + my($name, $path) = File::Basename::fileparse($aslocal, ''); + if (length($name) > 31) { + $name =~ s/(\.(readme(\.(gz|Z))?|(tar\.)?(gz|Z)|tgz|zip|pm\.(gz|Z)))$//; + my $suf = $1; + my $size = 31 - length($suf); + while (length($name) > $size) { + chop $name; + } + $name .= $suf; + $aslocal = File::Spec->catfile($path, $name); + } + } + return $aslocal if -f $aslocal && -r _ && !($force & 1); my($restore) = 0; if (-f $aslocal){ *************** *** 1679,1685 **** to insufficient permissions.\n}) unless -w $aslocal_dir; # Inheritance is not easier to manage than a few if/else branches ! if ($CPAN::META->has_inst('LWP')) { require LWP::UserAgent; unless ($Ua) { $Ua = LWP::UserAgent->new; --- 1882,1888 ---- to insufficient permissions.\n}) unless -w $aslocal_dir; # Inheritance is not easier to manage than a few if/else branches ! if ($CPAN::META->has_inst('LWP::UserAgent')) { require LWP::UserAgent; unless ($Ua) { $Ua = LWP::UserAgent->new; *************** *** 1704,1710 **** @reordered = sort { (substr($CPAN::Config->{urllist}[$b],0,4) eq "file") ! <=> (substr($CPAN::Config->{urllist}[$a],0,4) eq "file") or defined($Thesite) --- 1907,1913 ---- @reordered = sort { (substr($CPAN::Config->{urllist}[$b],0,4) eq "file") ! <=> (substr($CPAN::Config->{urllist}[$a],0,4) eq "file") or defined($Thesite) *************** *** 1713,1723 **** <=> ($a == $Thesite) } 0..$last; - - # ((grep { substr($CPAN::Config->{urllist}[$_],0,4) - # eq "file" } 0..$last), - # (grep { substr($CPAN::Config->{urllist}[$_],0,4) - # ne "file" } 0..$last)); } my($level,@levels); if ($Themethod) { --- 1916,1921 ---- *************** *** 1725,1730 **** --- 1923,1929 ---- } else { @levels = qw/easy hard hardest/; } + @levels = qw/easy/ if $^O eq 'MacOS'; for $level (@levels) { my $method = "host$level"; my @host_seq = $level eq "easy" ? *************** *** 1732,1740 **** @host_seq = (0) unless @host_seq; my $ret = $self->$method(\@host_seq,$file,$aslocal); if ($ret) { ! $Themethod = $level; ! $self->debug("level[$level]") if $CPAN::DEBUG; ! return $ret; } } my(@mess); --- 1931,1941 ---- @host_seq = (0) unless @host_seq; my $ret = $self->$method(\@host_seq,$file,$aslocal); if ($ret) { ! $Themethod = $level; ! $self->debug("level[$level]") if $CPAN::DEBUG; ! return $ret; ! } else { ! unlink $aslocal; } } my(@mess); *************** *** 1780,1787 **** # fileurl = "file://" [ host | "localhost" ] "/" fpath # Thanks to "Mark D. Baushke" for # the code ! ($l = $url) =~ s,^file://[^/]+,,; # discard the host part ! $l =~ s/^file://; # assume they meant file://localhost } if ( -f $l && -r _) { $Thesite = $i; --- 1981,1991 ---- # fileurl = "file://" [ host | "localhost" ] "/" fpath # Thanks to "Mark D. Baushke" for # the code ! ($l = $url) =~ s|^file://[^/]*/|/|; # discard the host part ! $l =~ s|^file:||; # assume they ! # meant ! # file://localhost ! $l =~ s|^/|| unless -f $l; # e.g. /P: } if ( -f $l && -r _) { $Thesite = $i; *************** *** 1797,1806 **** } } } ! if ($CPAN::META->has_inst('LWP')) { $CPAN::Frontend->myprint("Fetching with LWP: $url "); my $res = $Ua->mirror($url, $aslocal); if ($res->is_success) { $Thesite = $i; --- 2001,2014 ---- } } } ! if ($CPAN::META->has_inst('LWP')) { $CPAN::Frontend->myprint("Fetching with LWP: $url "); + unless ($Ua) { + require LWP::UserAgent; + $Ua = LWP::UserAgent->new; + } my $res = $Ua->mirror($url, $aslocal); if ($res->is_success) { $Thesite = $i; *************** *** 1847,1853 **** $CPAN::Frontend->myprint("Fetching with Net::FTP $url.gz "); ! if (CPAN::FTP->ftp_get($host, $dir, "$getfile.gz", $gz) && --- 2055,2061 ---- $CPAN::Frontend->myprint("Fetching with Net::FTP $url.gz "); ! if (CPAN::FTP->ftp_get($host, $dir, "$getfile.gz", $gz) && *************** *** 1864,1878 **** } sub hosthard { ! my($self,$host_seq,$file,$aslocal) = @_; ! # Came back if Net::FTP couldn't establish connection (or ! # failed otherwise) Maybe they are behind a firewall, but they ! # gave us a socksified (or other) ftp program... ! ! my($i); ! my($aslocal_dir) = File::Basename::dirname($aslocal); ! File::Path::mkpath($aslocal_dir); HOSTHARD: for $i (@$host_seq) { my $url = $CPAN::Config->{urllist}[$i] || $CPAN::Defaultsite; unless ($self->is_reachable($url)) { --- 2072,2088 ---- } sub hosthard { ! my($self,$host_seq,$file,$aslocal) = @_; ! # Came back if Net::FTP couldn't establish connection (or ! # failed otherwise) Maybe they are behind a firewall, but they ! # gave us a socksified (or other) ftp program... ! ! my($i); ! my($devnull) = $CPAN::Config->{devnull} || ""; ! # < /dev/null "; ! my($aslocal_dir) = File::Basename::dirname($aslocal); ! File::Path::mkpath($aslocal_dir); HOSTHARD: for $i (@$host_seq) { my $url = $CPAN::Config->{urllist}[$i] || $CPAN::Defaultsite; unless ($self->is_reachable($url)) { *************** *** 1894,1900 **** } $self->debug("localizing funkyftpwise[$url]") if $CPAN::DEBUG; my($f,$funkyftp); ! for $f ('lynx','ncftp') { next unless exists $CPAN::Config->{$f}; $funkyftp = $CPAN::Config->{$f}; next unless defined $funkyftp; --- 2104,2110 ---- } $self->debug("localizing funkyftpwise[$url]") if $CPAN::DEBUG; my($f,$funkyftp); ! for $f ('lynx','ncftpget','ncftp') { next unless exists $CPAN::Config->{$f}; $funkyftp = $CPAN::Config->{$f}; next unless defined $funkyftp; *************** *** 1903,1916 **** my $aslocal_uncompressed; ($aslocal_uncompressed = $aslocal) =~ s/\.gz//; my($source_switch) = ""; ! $source_switch = "-source" if $funkyftp =~ /\blynx$/; ! $source_switch = "-c" if $funkyftp =~ /\bncftp$/; $CPAN::Frontend->myprint( ! qq{ ! Trying with "$funkyftp $source_switch" to get $url ! }); ! my($system) = "$funkyftp $source_switch '$url' > ". "$aslocal_uncompressed"; $self->debug("system[$system]") if $CPAN::DEBUG; my($wstatus); --- 2113,2126 ---- my $aslocal_uncompressed; ($aslocal_uncompressed = $aslocal) =~ s/\.gz//; my($source_switch) = ""; ! $source_switch = " -source" if $funkyftp =~ /\blynx$/; ! $source_switch = " -c" if $funkyftp =~ /\bncftp$/; $CPAN::Frontend->myprint( ! qq[ ! Trying with "$funkyftp$source_switch" to get $url ! ]); ! my($system) = "$funkyftp$source_switch '$url' $devnull > ". "$aslocal_uncompressed"; $self->debug("system[$system]") if $CPAN::DEBUG; my($wstatus); *************** *** 1929,1964 **** CPAN::Tarzip->gzip($aslocal_uncompressed, "$aslocal_uncompressed.gz"); } - $Thesite = $i; - return $aslocal; } } elsif ($url !~ /\.gz$/) { ! my $gz = "$aslocal.gz"; ! my $gzurl = "$url.gz"; ! $CPAN::Frontend->myprint( ! qq{ ! Trying with "$funkyftp $source_switch" to get $url.gz ! }); ! my($system) = "$funkyftp $source_switch '$url.gz' > ". ! "$aslocal_uncompressed.gz"; ! $self->debug("system[$system]") if $CPAN::DEBUG; ! my($wstatus); ! if (($wstatus = system($system)) == 0 ! && ! -s "$aslocal_uncompressed.gz" ! ) { ! # test gzip integrity ! if (CPAN::Tarzip->gtest("$aslocal_uncompressed.gz")) { ! CPAN::Tarzip->gunzip("$aslocal_uncompressed.gz", ! $aslocal); ! } else { ! rename $aslocal_uncompressed, $aslocal; ! } ! #line 1739 ! $Thesite = $i; ! return $aslocal; } } else { my $estatus = $wstatus >> 8; my $size = -f $aslocal ? ", left\n$aslocal with size ".-s _ : ""; --- 2139,2178 ---- CPAN::Tarzip->gzip($aslocal_uncompressed, "$aslocal_uncompressed.gz"); } } + $Thesite = $i; + return $aslocal; } elsif ($url !~ /\.gz$/) { ! unlink $aslocal_uncompressed if ! -f $aslocal_uncompressed && -s _ == 0; ! my $gz = "$aslocal.gz"; ! my $gzurl = "$url.gz"; ! $CPAN::Frontend->myprint( ! qq[ ! Trying with "$funkyftp$source_switch" to get $url.gz ! ]); ! my($system) = "$funkyftp$source_switch '$url.gz' $devnull > ". ! "$aslocal_uncompressed.gz"; ! $self->debug("system[$system]") if $CPAN::DEBUG; ! my($wstatus); ! if (($wstatus = system($system)) == 0 ! && ! -s "$aslocal_uncompressed.gz" ! ) { ! # test gzip integrity ! if (CPAN::Tarzip->gtest("$aslocal_uncompressed.gz")) { ! CPAN::Tarzip->gunzip("$aslocal_uncompressed.gz", ! $aslocal); ! } else { ! rename $aslocal_uncompressed, $aslocal; } + $Thesite = $i; + return $aslocal; + } else { + unlink "$aslocal_uncompressed.gz" if + -f "$aslocal_uncompressed.gz"; + } } else { my $estatus = $wstatus >> 8; my $size = -f $aslocal ? ", left\n$aslocal with size ".-s _ : ""; *************** *** 2047,2053 **** $CPAN::Frontend->mywarn("Your ~/.netrc neither contains $host nor does it have a default entry\n"); } ! # OK, they don't have a valid ~/.netrc. Use 'ftp -n' # then and login manually to host, using e-mail as # password. --- 2261,2267 ---- $CPAN::Frontend->mywarn("Your ~/.netrc neither contains $host nor does it have a default entry\n"); } ! # OK, they don't have a valid ~/.netrc. Use 'ftp -n' # then and login manually to host, using e-mail as # password. *************** *** 2085,2091 **** Subprocess "|$command" returned status $estatus (wstat $wstatus) }) if $wstatus; - } # find2perl needs modularization, too, all the following is stolen --- 2299,2304 ---- *************** *** 2212,2217 **** --- 2425,2451 ---- package CPAN::Complete; + sub gnu_cpl { + my($text, $line, $start, $end) = @_; + my(@perlret) = cpl($text, $line, $start); + # find longest common match. Can anybody show me how to peruse + # T::R::Gnu to have this done automatically? Seems expensive. + return () unless @perlret; + my($newtext) = $text; + for (my $i = length($text)+1;;$i++) { + last unless length($perlret[0]) && length($perlret[0]) >= $i; + my $try = substr($perlret[0],0,$i); + my @tries = grep {substr($_,0,$i) eq $try} @perlret; + # warn "try[$try]tries[@tries]"; + if (@tries == @perlret) { + $newtext = $try; + } else { + last; + } + } + ($newtext,@perlret); + } + #-> sub CPAN::Complete::cpl ; sub cpl { my($word,$line,$pos) = @_; *************** *** 2257,2263 **** #-> sub CPAN::Complete::cplx ; sub cplx { my($class, $word) = @_; ! grep /^\Q$word\E/, map { $_->id } $CPAN::META->all($class); } #-> sub CPAN::Complete::cpl_any ; --- 2491,2497 ---- #-> sub CPAN::Complete::cplx ; sub cplx { my($class, $word) = @_; ! grep /^\Q$word\E/, map { $_->id } $CPAN::META->all_objects($class); } #-> sub CPAN::Complete::cpl_any ; *************** *** 2327,2352 **** my $needshort = $^O eq "dos"; ! $cl->rd_authindex($cl->reload_x( ! "authors/01mailrc.txt.gz", ! $needshort ? "01mailrc.gz" : "", ! $force)); $t2 = time; $debug = "timing reading 01[".($t2 - $time)."]"; $time = $t2; return if $CPAN::Signal; # this is sometimes lengthy ! $cl->rd_modpacks($cl->reload_x( ! "modules/02packages.details.txt.gz", ! $needshort ? "02packag.gz" : "", ! $force)); $t2 = time; $debug .= "02[".($t2 - $time)."]"; $time = $t2; return if $CPAN::Signal; # this is sometimes lengthy ! $cl->rd_modlist($cl->reload_x( ! "modules/03modlist.data.gz", ! $needshort ? "03mlist.gz" : "", ! $force)); $t2 = time; $debug .= "03[".($t2 - $time)."]"; $time = $t2; --- 2561,2595 ---- my $needshort = $^O eq "dos"; ! $cl->rd_authindex($cl ! ->reload_x( ! "authors/01mailrc.txt.gz", ! $needshort ? ! File::Spec->catfile('authors', '01mailrc.gz') : ! File::Spec->catfile('authors', '01mailrc.txt.gz'), ! $force)); $t2 = time; $debug = "timing reading 01[".($t2 - $time)."]"; $time = $t2; return if $CPAN::Signal; # this is sometimes lengthy ! $cl->rd_modpacks($cl ! ->reload_x( ! "modules/02packages.details.txt.gz", ! $needshort ? ! File::Spec->catfile('modules', '02packag.gz') : ! File::Spec->catfile('modules', '02packages.details.txt.gz'), ! $force)); $t2 = time; $debug .= "02[".($t2 - $time)."]"; $time = $t2; return if $CPAN::Signal; # this is sometimes lengthy ! $cl->rd_modlist($cl ! ->reload_x( ! "modules/03modlist.data.gz", ! $needshort ? ! File::Spec->catfile('modules', '03mlist.gz') : ! File::Spec->catfile('modules', '03modlist.data.gz'), ! $force)); $t2 = time; $debug .= "03[".($t2 - $time)."]"; $time = $t2; *************** *** 2379,2385 **** #-> sub CPAN::Index::rd_authindex ; sub rd_authindex { ! my($cl,$index_target) = @_; return unless defined $index_target; $CPAN::Frontend->myprint("Going to read $index_target\n"); # my $fh = CPAN::Tarzip->TIEHANDLE($index_target); --- 2622,2629 ---- #-> sub CPAN::Index::rd_authindex ; sub rd_authindex { ! my($cl, $index_target) = @_; ! my @lines; return unless defined $index_target; $CPAN::Frontend->myprint("Going to read $index_target\n"); # my $fh = CPAN::Tarzip->TIEHANDLE($index_target); *************** *** 2388,2397 **** local(*FH); tie *FH, CPAN::Tarzip, $index_target; local($/) = "\n"; ! while () { ! chomp; my($userid,$fullname,$email) = ! /alias\s+(\S+)\s+\"([^\"\<]+)\s+<([^\>]+)\>\"/; next unless $userid && $fullname && $email; # instantiate an author object --- 2632,2641 ---- local(*FH); tie *FH, CPAN::Tarzip, $index_target; local($/) = "\n"; ! push @lines, split /\012/ while ; ! foreach (@lines) { my($userid,$fullname,$email) = ! m/alias\s+(\S+)\s+\"([^\"\<]+)\s+\<([^\>]+)\>\"/; next unless $userid && $fullname && $email; # instantiate an author object *************** *** 2410,2435 **** #-> sub CPAN::Index::rd_modpacks ; sub rd_modpacks { ! my($cl,$index_target) = @_; return unless defined $index_target; $CPAN::Frontend->myprint("Going to read $index_target\n"); my $fh = CPAN::Tarzip->TIEHANDLE($index_target); local($/) = "\n"; while ($_ = $fh->READLINE) { ! last if /^\s*$/; } ! while ($_ = $fh->READLINE) { chomp; my($mod,$version,$dist) = split; ### $version =~ s/^\+//; # if it is a bundle, instatiate a bundle object my($bundle,$id,$userid); ! if ($mod eq 'CPAN' && ! ( ! $CPAN::META->exists('CPAN::Queue','Bundle::CPAN') || ! $CPAN::META->exists('CPAN::Queue','CPAN') ) ) { local($^W)= 0; --- 2654,2687 ---- #-> sub CPAN::Index::rd_modpacks ; sub rd_modpacks { ! my($cl, $index_target) = @_; ! my @lines; return unless defined $index_target; $CPAN::Frontend->myprint("Going to read $index_target\n"); my $fh = CPAN::Tarzip->TIEHANDLE($index_target); local($/) = "\n"; while ($_ = $fh->READLINE) { ! s/\012/\n/g; ! my @ls = map {"$_\n"} split /\n/, $_; ! unshift @ls, "\n" x length($1) if /^(\n+)/; ! push @lines, @ls; ! } ! while (@lines) { ! my $shift = shift(@lines); ! last if $shift =~ /^\s*$/; } ! foreach (@lines) { chomp; my($mod,$version,$dist) = split; ### $version =~ s/^\+//; # if it is a bundle, instatiate a bundle object my($bundle,$id,$userid); ! if ($mod eq 'CPAN' && ! ( ! CPAN::Queue->exists('Bundle::CPAN') || ! CPAN::Queue->exists('CPAN') ) ) { local($^W)= 0; *************** *** 2452,2460 **** --- 2704,2714 ---- if ($bundle){ $id = $CPAN::META->instance('CPAN::Bundle',$mod); + # warn "made mod[$mod]a bundle"; # Let's make it a module too, because bundles have so much # in common with modules $CPAN::META->instance('CPAN::Module',$mod); + # warn "made mod[$mod]a module"; # This "next" makes us faster but if the job is running long, we ignore # rereads which is bad. So we have to be a bit slower again. *************** *** 2499,2511 **** my @eval; local($/) = "\n"; while ($_ = $fh->READLINE) { ! if (/^Date:\s+(.*)/){ return if $date_of_03 eq $1; ($date_of_03) = $1; } ! last if /^\s*$/; } - push @eval, $_ while $_ = $fh->READLINE; undef $fh; push @eval, q{CPAN::Modulelist->data;}; local($^W) = 0; --- 2753,2771 ---- my @eval; local($/) = "\n"; while ($_ = $fh->READLINE) { ! s/\012/\n/g; ! my @ls = map {"$_\n"} split /\n/, $_; ! unshift @ls, "\n" x length($1) if /^(\n+)/; ! push @eval, @ls; ! } ! while (@eval) { ! my $shift = shift(@eval); ! if ($shift =~ /^Date:\s+(.*)/){ return if $date_of_03 eq $1; ($date_of_03) = $1; } ! last if $shift =~ /^\s*$/; } undef $fh; push @eval, q{CPAN::Modulelist->data;}; local($^W) = 0; *************** *** 2604,2609 **** --- 2864,2870 ---- #-> sub CPAN::Author::fullname ; sub fullname { shift->{'FULLNAME'} } *name = \&fullname; + #-> sub CPAN::Author::email ; sub email { shift->{'EMAIL'} } *************** *** 2667,2677 **** } else { $self->{archived} = "NO"; } ! chdir ".."; if ($self->{archived} ne 'NO') { ! chdir "tmp"; # Let's check if the package has its own directory. ! my $dh = DirHandle->new(".") or Carp::croak("Couldn't opendir .: $!"); my @readdir = grep $_ !~ /^\.\.?$/, $dh->read; ### MAC?? $dh->close; my ($distdir,$packagedir); --- 2928,2939 ---- } else { $self->{archived} = "NO"; } ! chdir File::Spec->updir; if ($self->{archived} ne 'NO') { ! chdir File::Spec->catdir(File::Spec->curdir, "tmp"); # Let's check if the package has its own directory. ! my $dh = DirHandle->new(File::Spec->curdir) ! or Carp::croak("Couldn't opendir .: $!"); my @readdir = grep $_ !~ /^\.\.?$/, $dh->read; ### MAC?? $dh->close; my ($distdir,$packagedir); *************** *** 2694,2700 **** } } $self->{'build_dir'} = $packagedir; ! chdir ".."; $self->debug("Changed directory to .. (self is $self [".$self->as_string."])") if $CPAN::DEBUG; --- 2956,2962 ---- } } $self->{'build_dir'} = $packagedir; ! chdir File::Spec->updir; $self->debug("Changed directory to .. (self is $self [".$self->as_string."])") if $CPAN::DEBUG; *************** *** 2783,2788 **** --- 3045,3056 ---- #-> sub CPAN::Distribution::look ; sub look { my($self) = @_; + + if ($^O eq 'MacOS') { + $self->ExtUtils::MM_MacOS::look; + return; + } + if ( $CPAN::Config->{'shell'} ) { $CPAN::Frontend->myprint(qq{ Trying to open a subshell in the build directory... *************** *** 2825,2830 **** --- 3093,3104 ---- $local_file = CPAN::FTP->localize("authors/id/$sans.readme", $local_wanted) or $CPAN::Frontend->mydie(qq{No $sans.readme found});; + + if ($^O eq 'MacOS') { + ExtUtils::MM_MacOS::launch_file($local_file); + return; + } + my $fh_pager = FileHandle->new; local($SIG{PIPE}) = "IGNORE"; $fh_pager->open("|$CPAN::Config->{'pager'}") *************** *** 2891,2896 **** --- 3165,3171 ---- if (open $fh, $chk_file){ local($/); my $eval = <$fh>; + $eval =~ s/\015?\012/\n/g; close $fh; my($comp) = Safe->new(); $cksum = $comp->reval($eval); *************** *** 2978,2993 **** #-> sub CPAN::Distribution::force ; sub force { ! my($self) = @_; ! $self->{'force_update'}++; ! delete $self->{'MD5_STATUS'}; ! delete $self->{'archived'}; ! delete $self->{'build_dir'}; ! delete $self->{'localfile'}; ! delete $self->{'make'}; ! delete $self->{'install'}; ! delete $self->{'unwrapped'}; ! delete $self->{'writemakefile'}; } sub isa_perl { --- 3253,3266 ---- #-> sub CPAN::Distribution::force ; sub force { ! my($self) = @_; ! $self->{'force_update'}++; ! for my $att (qw( ! MD5_STATUS archived build_dir localfile make install unwrapped ! writemakefile have_sponsored ! )) { ! delete $self->{$att}; ! } } sub isa_perl { *************** *** 3078,3083 **** --- 3351,3361 ---- chdir $builddir or Carp::croak("Couldn't chdir $builddir: $!"); $self->debug("Changed directory to $builddir") if $CPAN::DEBUG; + if ($^O eq 'MacOS') { + ExtUtils::MM_MacOS::make($self); + return; + } + my $system; if ($self->{'configure'}) { $system = $self->{'configure'}; *************** *** 3097,3106 **** if ($CPAN::Config->{inactivity_timeout}) { eval { alarm $CPAN::Config->{inactivity_timeout}; ! local $SIG{CHLD} = sub { wait }; if (defined($pid = fork)) { if ($pid) { #parent ! wait; } else { #child # note, this exec isn't necessary if # inactivity_timeout is 0. On the Mac I'd --- 3375,3385 ---- if ($CPAN::Config->{inactivity_timeout}) { eval { alarm $CPAN::Config->{inactivity_timeout}; ! local $SIG{CHLD}; # = sub { wait }; if (defined($pid = fork)) { if ($pid) { #parent ! # wait; ! waitpid $pid, 0; } else { #child # note, this exec isn't necessary if # inactivity_timeout is 0. On the Mac I'd *************** *** 3122,3158 **** return; } } else { ! if (0) { ! warn "Trying to intercept the output of 'perl Makefile.PL'"; ! require IO::File; ! # my $fh = FileHandle->new("$system 2>&1 |") or ! my $fh = IO::File->new("$system 2>&1 |") or ! die "Couldn't run '$system': $!"; ! local($|) = 1; ! while (length($_ = getc($fh))) { ! print $_; # we want to parse that some day! ! # unfortunately we have Makefile.PLs that want to talk ! # and we can't emulate that reliably. I think, we have ! # to parse Makefile.PL directly ! } ! $ret = $fh->close; ! unless ($ret) { ! warn $! ? "Error during 'perl Makefile.PL' subprocess: $!" : ! "Exit status of 'perl Makefile.PL': $?"; ! $self->{writemakefile} = "NO"; ! return; ! } ! } else { ! $ret = system($system); ! if ($ret != 0) { ! $self->{writemakefile} = "NO"; ! return; ! } } } $self->{writemakefile} = "YES"; } return if $CPAN::Signal; $system = join " ", $CPAN::Config->{'make'}, $CPAN::Config->{make_arg}; if (system($system) == 0) { $CPAN::Frontend->myprint(" $system -- OK\n"); --- 3401,3441 ---- return; } } else { ! $ret = system($system); ! if ($ret != 0) { ! $self->{writemakefile} = "NO"; ! return; } } $self->{writemakefile} = "YES"; } return if $CPAN::Signal; + if (my @prereq = $self->needs_prereq){ + my $id = $self->id; + $CPAN::Frontend->myprint("---- Dependencies detected ". + "during [$id] -----\n"); + + for my $p (@prereq) { + $CPAN::Frontend->myprint(" $p\n"); + } + my $follow = 0; + if ($CPAN::Config->{prerequisites_policy} eq "follow") { + $follow = 1; + } elsif ($CPAN::Config->{prerequisites_policy} eq "ask") { + require ExtUtils::MakeMaker; + my $answer = ExtUtils::MakeMaker::prompt( + "Shall I follow them and prepend them to the queue + of modules we are processing right now?", "yes"); + $follow = $answer =~ /^\s*y/i; + } else { + local($") = ", "; + $CPAN::Frontend->myprint(" Ignoring dependencies on modules @prereq\n"); + } + if ($follow) { + CPAN::Queue->jumpqueue(@prereq,$id); # requeue yourself + return; + } + } $system = join " ", $CPAN::Config->{'make'}, $CPAN::Config->{make_arg}; if (system($system) == 0) { $CPAN::Frontend->myprint(" $system -- OK\n"); *************** *** 3164,3169 **** --- 3447,3490 ---- } } + #-> sub CPAN::Distribution::needs_prereq ; + sub needs_prereq { + my($self) = @_; + return unless -f "Makefile"; # we cannot say much + my $fh = FileHandle->new("mydie("Couldn't open Makefile: $!"); + local($/) = "\n"; + + my(@p,@need); + while (<$fh>) { + last if /MakeMaker post_initialize section/; + my($p) = m{^[\#] + \s+PREREQ_PM\s+=>\s+(.+) + }x; + next unless $p; + # warn "Found prereq expr[$p]"; + + while ( $p =~ m/(?:\s)([\w\:]+)=>q\[.*?\],?/g ){ + push @p, $1; + } + last; + } + for my $p (@p) { + my $mo = $CPAN::META->instance("CPAN::Module",$p); + next if $mo->uptodate; + # it's not needed, so don't push it. We cannot omit this step, because + # if 'force' is in effect, nobody else will check. + if ($self->{'have_sponsored'}{$p}++){ + # We have already sponsored it and for some reason it's still + # not available. So we do nothing. Or what should we do? + # if we push it again, we have a potential infinite loop + next; + } + push @need, $p; + } + return @need; + } + #-> sub CPAN::Distribution::test ; sub test { my($self) = @_; *************** *** 3186,3191 **** --- 3507,3518 ---- Carp::croak("Couldn't chdir to $self->{'build_dir'}"); $self->debug("Changed directory to $self->{'build_dir'}") if $CPAN::DEBUG; + + if ($^O eq 'MacOS') { + ExtUtils::MM_MacOS::make_test($self); + return; + } + my $system = join " ", $CPAN::Config->{'make'}, "test"; if (system($system) == 0) { $CPAN::Frontend->myprint(" $system -- OK\n"); *************** *** 3208,3213 **** --- 3535,3546 ---- chdir $self->{'build_dir'} or Carp::croak("Couldn't chdir to $self->{'build_dir'}"); $self->debug("Changed directory to $self->{'build_dir'}") if $CPAN::DEBUG; + + if ($^O eq 'MacOS') { + ExtUtils::MM_MacOS::make_clean($self); + return; + } + my $system = join " ", $CPAN::Config->{'make'}, "clean"; if (system($system) == 0) { $CPAN::Frontend->myprint(" $system -- OK\n"); *************** *** 3250,3258 **** Carp::croak("Couldn't chdir to $self->{'build_dir'}"); $self->debug("Changed directory to $self->{'build_dir'}") if $CPAN::DEBUG; my $system = join(" ", $CPAN::Config->{'make'}, "install", $CPAN::Config->{make_install_arg}); ! my($pipe) = FileHandle->new("$system 2>&1 |"); my($makeout) = ""; while (<$pipe>){ $CPAN::Frontend->myprint($_); --- 3583,3598 ---- Carp::croak("Couldn't chdir to $self->{'build_dir'}"); $self->debug("Changed directory to $self->{'build_dir'}") if $CPAN::DEBUG; + + if ($^O eq 'MacOS') { + ExtUtils::MM_MacOS::make_install($self); + return; + } + my $system = join(" ", $CPAN::Config->{'make'}, "install", $CPAN::Config->{make_install_arg}); ! my($stderr) = $^O =~ /Win/i ? "" : " 2>&1 "; ! my($pipe) = FileHandle->new("$system $stderr |"); my($makeout) = ""; while (<$pipe>){ $CPAN::Frontend->myprint($_); *************** *** 3261,3267 **** $pipe->close; if ($?==0) { $CPAN::Frontend->myprint(" $system -- OK\n"); ! $self->{'install'} = "YES"; } else { $self->{'install'} = "NO"; $CPAN::Frontend->myprint(" $system -- NOT OK\n"); --- 3601,3607 ---- $pipe->close; if ($?==0) { $CPAN::Frontend->myprint(" $system -- OK\n"); ! return $self->{'install'} = "YES"; } else { $self->{'install'} = "NO"; $CPAN::Frontend->myprint(" $system -- NOT OK\n"); *************** *** 3289,3346 **** #-> sub CPAN::Bundle::contains ; sub contains { ! my($self) = @_; ! my($parsefile) = $self->inst_file; ! my($id) = $self->id; ! $self->debug("parsefile[$parsefile]id[$id]") if $CPAN::DEBUG; ! unless ($parsefile) { ! # Try to get at it in the cpan directory ! $self->debug("no parsefile") if $CPAN::DEBUG; ! Carp::confess "I don't know a $id" unless $self->{CPAN_FILE}; ! my $dist = $CPAN::META->instance('CPAN::Distribution', ! $self->{CPAN_FILE}); ! $dist->get; ! $self->debug($dist->as_string) if $CPAN::DEBUG; ! my($todir) = $CPAN::Config->{'cpan_home'}; ! my(@me,$from,$to,$me); ! @me = split /::/, $self->id; ! $me[-1] .= ".pm"; ! $me = MM->catfile(@me); ! $from = $self->find_bundle_file($dist->{'build_dir'},$me); ! $to = MM->catfile($todir,$me); ! File::Path::mkpath(File::Basename::dirname($to)); ! File::Copy::copy($from, $to) ! or Carp::confess("Couldn't copy $from to $to: $!"); ! $parsefile = $to; ! } ! my @result; ! my $fh = FileHandle->new; ! local $/ = "\n"; ! open($fh,$parsefile) or die "Could not open '$parsefile': $!"; ! my $inpod = 0; ! $self->debug("parsefile[$parsefile]") if $CPAN::DEBUG; ! while (<$fh>) { ! $inpod = /^=(?!head1\s+CONTENTS)/ ? 0 : ! /^=head1\s+CONTENTS/ ? 1 : $inpod; ! next unless $inpod; ! next if /^=/; ! next if /^\s+$/; ! chomp; ! push @result, (split " ", $_, 2)[0]; ! } ! close $fh; ! delete $self->{STATUS}; ! $self->{CONTAINS} = join ", ", @result; ! $self->debug("CONTAINS[@result]") if $CPAN::DEBUG; ! @result; } #-> sub CPAN::Bundle::find_bundle_file sub find_bundle_file { my($self,$where,$what) = @_; $self->debug("where[$where]what[$what]") if $CPAN::DEBUG; ! my $bu = MM->catfile($where,$what); ! return $bu if -f $bu; my $manifest = MM->catfile($where,"MANIFEST"); unless (-f $manifest) { require ExtUtils::Manifest; --- 3629,3695 ---- #-> sub CPAN::Bundle::contains ; sub contains { ! my($self) = @_; ! my($parsefile) = $self->inst_file; ! my($id) = $self->id; ! $self->debug("parsefile[$parsefile]id[$id]") if $CPAN::DEBUG; ! unless ($parsefile) { ! # Try to get at it in the cpan directory ! $self->debug("no parsefile") if $CPAN::DEBUG; ! Carp::confess "I don't know a $id" unless $self->{CPAN_FILE}; ! my $dist = $CPAN::META->instance('CPAN::Distribution', ! $self->{CPAN_FILE}); ! $dist->get; ! $self->debug($dist->as_string) if $CPAN::DEBUG; ! my($todir) = $CPAN::Config->{'cpan_home'}; ! my(@me,$from,$to,$me); ! @me = split /::/, $self->id; ! $me[-1] .= ".pm"; ! $me = MM->catfile(@me); ! $from = $self->find_bundle_file($dist->{'build_dir'},$me); ! $to = MM->catfile($todir,$me); ! File::Path::mkpath(File::Basename::dirname($to)); ! File::Copy::copy($from, $to) ! or Carp::confess("Couldn't copy $from to $to: $!"); ! $parsefile = $to; ! } ! my @result; ! my $fh = FileHandle->new; ! local $/ = "\n"; ! open($fh,$parsefile) or die "Could not open '$parsefile': $!"; ! my $inpod = 0; ! $self->debug("parsefile[$parsefile]") if $CPAN::DEBUG; ! while (<$fh>) { ! $inpod = m/^=(?!head1\s+CONTENTS)/ ? 0 : ! m/^=head1\s+CONTENTS/ ? 1 : $inpod; ! next unless $inpod; ! next if /^=/; ! next if /^\s+$/; ! chomp; ! push @result, (split " ", $_, 2)[0]; ! } ! close $fh; ! delete $self->{STATUS}; ! $self->{CONTAINS} = join ", ", @result; ! $self->debug("CONTAINS[@result]") if $CPAN::DEBUG; ! unless (@result) { ! $CPAN::Frontend->mywarn(qq{ ! The bundle file "$parsefile" may be a broken ! bundlefile. It seems not to contain any bundle definition. ! Please check the file and if it is bogus, please delete it. ! Sorry for the inconvenience. ! }); ! } ! @result; } #-> sub CPAN::Bundle::find_bundle_file sub find_bundle_file { my($self,$where,$what) = @_; $self->debug("where[$where]what[$what]") if $CPAN::DEBUG; ! ### The following two lines let CPAN.pm become Bundle/CPAN.pm :-( ! ### my $bu = MM->catfile($where,$what); ! ### return $bu if -f $bu; my $manifest = MM->catfile($where,"MANIFEST"); unless (-f $manifest) { require ExtUtils::Manifest; *************** *** 3353,3372 **** my $fh = FileHandle->new($manifest) or Carp::croak("Couldn't open $manifest: $!"); local($/) = "\n"; while (<$fh>) { next if /^\s*\#/; my($file) = /(\S+)/; if ($file =~ m|\Q$what\E$|) { $bu = $file; ! return MM->catfile($where,$bu); ! } elsif ($what =~ s|Bundle/||) { # retry if she managed to ! # have no Bundle directory ! if ($file =~ m|\Q$what\E$|) { ! $bu = $file; ! return MM->catfile($where,$bu); ! } } } Carp::croak("Couldn't find a Bundle file in $where"); } --- 3702,3731 ---- my $fh = FileHandle->new($manifest) or Carp::croak("Couldn't open $manifest: $!"); local($/) = "\n"; + my $what2 = $what; + if ($^O eq 'MacOS') { + $what =~ s/^://; + $what2 =~ tr|:|/|; + $what2 =~ s/:Bundle://; + $what2 =~ tr|:|/|; + } else { + $what2 =~ s|Bundle/||; + } + my $bu; while (<$fh>) { next if /^\s*\#/; my($file) = /(\S+)/; if ($file =~ m|\Q$what\E$|) { $bu = $file; ! # return MM->catfile($where,$bu); # bad ! last; } + # retry if she managed to + # have no Bundle directory + $bu = $file if $file =~ m|\Q$what2\E$|; } + $bu =~ tr|/|:| if $^O eq 'MacOS'; + return MM->catfile($where, $bu) if $bu; Carp::croak("Couldn't find a Bundle file in $where"); } *************** *** 3395,3401 **** my($id) = $self->id; Carp::croak "Can't $meth $id, don't have an associated bundle file. :-(\n" unless $self->inst_file || $self->{CPAN_FILE}; ! my($s); for $s ($self->contains) { my($type) = $s =~ m|/| ? 'CPAN::Distribution' : $s =~ m|^Bundle::| ? 'CPAN::Bundle' : 'CPAN::Module'; --- 3754,3760 ---- my($id) = $self->id; Carp::croak "Can't $meth $id, don't have an associated bundle file. :-(\n" unless $self->inst_file || $self->{CPAN_FILE}; ! my($s,%fail); for $s ($self->contains) { my($type) = $s =~ m|/| ? 'CPAN::Distribution' : $s =~ m|^Bundle::| ? 'CPAN::Bundle' : 'CPAN::Module'; *************** *** 3406,3412 **** }); sleep 3; } ! $CPAN::META->instance($type,$s)->$meth(); } } --- 3765,3790 ---- }); sleep 3; } ! # possibly noisy action: ! my $obj = $CPAN::META->instance($type,$s); ! $obj->$meth(); ! my $success = $obj->can("uptodate") ? $obj->uptodate : 0; ! $success ||= $obj->{'install'} && $obj->{'install'} eq "YES"; ! $fail{$s} = 1 unless $success; ! } ! # recap with less noise ! if ( $meth eq "install") { ! if (%fail) { ! $CPAN::Frontend->myprint(qq{\nBundle summary: }. ! qq{The following items seem to }. ! qq{have had installation problems:\n}); ! for $s ($self->contains) { ! $CPAN::Frontend->myprint( "$s " ) if $fail{$s}; ! } ! $CPAN::Frontend->myprint(qq{\n}); ! } else { ! $self->{'install'} = 'YES'; ! } } } *************** *** 3429,3435 **** sub install { my $self = shift; $self->rematein('install',@_); - $CPAN::META->delete('CPAN::Queue',$self->id); } #-> sub CPAN::Bundle::clean ; sub clean { shift->rematein('clean',@_); } --- 3807,3812 ---- *************** *** 3496,3504 **** pre-alpha alpha beta released mature standard,; @stats{qw,? m d u n,} = qw,unknown mailing-list developer comp.lang.perl.* none,; ! @statl{qw,? p c + o,} = qw,unknown perl C C++ other,; ! @stati{qw,? f r O,} = qw,unknown functions ! references+ties object-oriented,; $statd{' '} = 'unknown'; $stats{' '} = 'unknown'; $statl{' '} = 'unknown'; --- 3873,3881 ---- pre-alpha alpha beta released mature standard,; @stats{qw,? m d u n,} = qw,unknown mailing-list developer comp.lang.perl.* none,; ! @statl{qw,? p c + o h,} = qw,unknown perl C C++ other hybrid,; ! @stati{qw,? f r O h,} = qw,unknown functions ! references+ties object-oriented hybrid,; $statd{' '} = 'unknown'; $stats{' '} = 'unknown'; $statl{' '} = 'unknown'; *************** *** 3544,3551 **** my $inpod = 0; local $/ = "\n"; while (<$fh>) { ! $inpod = /^=(?!head1\s+NAME)/ ? 0 : ! /^=head1\s+NAME/ ? 1 : $inpod; next unless $inpod; next if /^=/; next if /^\s+$/; --- 3921,3928 ---- my $inpod = 0; local $/ = "\n"; while (<$fh>) { ! $inpod = m/^=(?!head1\s+NAME)/ ? 0 : ! m/^=head1\s+NAME/ ? 1 : $inpod; next unless $inpod; next if /^=/; next if /^\s+$/; *************** *** 3586,3592 **** #-> sub CPAN::Module::cpan_version ; sub cpan_version { my $self = shift; ! $self->{'CPAN_VERSION'} = 'undef' unless defined $self->{'CPAN_VERSION'}; # I believe this is # always a bug in the # index and should be --- 3963,3969 ---- #-> sub CPAN::Module::cpan_version ; sub cpan_version { my $self = shift; ! $self->{'CPAN_VERSION'} = 'undef' unless defined $self->{'CPAN_VERSION'}; # I believe this is # always a bug in the # index and should be *************** *** 3640,3649 **** sub make { shift->rematein('make') } #-> sub CPAN::Module::test ; sub test { shift->rematein('test') } ! #-> sub CPAN::Module::install ; ! sub install { my($self) = @_; - my($doit) = 0; my($latest) = $self->cpan_version; $latest ||= 0; my($inst_file) = $self->inst_file; --- 4017,4025 ---- sub make { shift->rematein('make') } #-> sub CPAN::Module::test ; sub test { shift->rematein('test') } ! #-> sub CPAN::Module::uptodate ; ! sub uptodate { my($self) = @_; my($latest) = $self->cpan_version; $latest ||= 0; my($inst_file) = $self->inst_file; *************** *** 3651,3672 **** if (defined $inst_file) { $have = $self->inst_version; } ! if (1){ # A block for scoping $^W, the if is just for the visual ! # appeal ! local($^W)=0; ! if ($inst_file ! && ! $have >= $latest ! && ! not exists $self->{'force_update'} ! ) { ! $CPAN::Frontend->myprint( $self->id. " is up to date.\n"); ! } else { ! $doit = 1; ! } } $self->rematein('install') if $doit; - $CPAN::META->delete('CPAN::Queue',$self->id); } #-> sub CPAN::Module::clean ; sub clean { shift->rematein('clean') } --- 4027,4054 ---- if (defined $inst_file) { $have = $self->inst_version; } ! local($^W)=0; ! if ($inst_file ! && ! $have >= $latest ! ) { ! return 1; ! } ! return; ! } ! #-> sub CPAN::Module::install ; ! sub install { ! my($self) = @_; ! my($doit) = 0; ! if ($self->uptodate ! && ! not exists $self->{'force_update'} ! ) { ! $CPAN::Frontend->myprint( $self->id. " is up to date.\n"); ! } else { ! $doit = 1; } $self->rematein('install') if $doit; } #-> sub CPAN::Module::clean ; sub clean { shift->rematein('clean') } *************** *** 3707,3712 **** --- 4089,4095 ---- my($self) = @_; my $parsefile = $self->inst_file or return; local($^W) = 0 if $] < 5.00303 && $ExtUtils::MakeMaker::VERSION < 5.38; + # warn "HERE"; my $have = MM->parse_version($parsefile) || "undef"; $have =~ s/\s+//g; $have; *************** *** 3728,3734 **** $fhw->close; return 1; } else { ! system("$CPAN::Config->{'gzip'} -c $read > $write")==0; } } --- 4111,4117 ---- $fhw->close; return 1; } else { ! system("$CPAN::Config->{'gzip'} -c $read > $write")==0; } } *************** *** 3830,3844 **** if (MM->maybe_command($CPAN::Config->{'gzip'}) && MM->maybe_command($CPAN::Config->{'tar'})) { ! my $system = "$CPAN::Config->{'gzip'} --decompress --stdout " . ! "$file | $CPAN::Config->{tar} xvf -"; ! return system($system) == 0; } elsif ($CPAN::META->has_inst("Archive::Tar") && $CPAN::META->has_inst("Compress::Zlib") ) { my $tar = Archive::Tar->new($file,1); $tar->extract($tar->list_files); # I'm pretty sure we have nothing # that isn't compressed return 1; } else { $CPAN::Frontend->mydie(qq{ --- 4213,4252 ---- if (MM->maybe_command($CPAN::Config->{'gzip'}) && MM->maybe_command($CPAN::Config->{'tar'})) { ! if ($^O =~ /win/i) { # irgggh ! # people find the most curious tar binaries that cannot handle ! # pipes ! my $system = "$CPAN::Config->{'gzip'} --decompress $file"; ! if (system($system)==0) { ! $CPAN::Frontend->myprint(qq{Uncompressed $file successfully\n}); ! } else { ! $CPAN::Frontend->mydie( ! qq{Couldn\'t uncompress $file\n} ! ); ! } ! $file =~ s/\.gz$//; ! $system = "$CPAN::Config->{tar} xvf $file"; ! if (system($system)==0) { ! $CPAN::Frontend->myprint(qq{Untarred $file successfully\n}); ! } else { ! $CPAN::Frontend->mydie(qq{Couldn\'t untar $file\n}); ! } ! return 1; ! } else { ! my $system = "$CPAN::Config->{'gzip'} --decompress --stdout " . ! "< $file | $CPAN::Config->{tar} xvf -"; ! return system($system) == 0; ! } } elsif ($CPAN::META->has_inst("Archive::Tar") && $CPAN::META->has_inst("Compress::Zlib") ) { my $tar = Archive::Tar->new($file,1); $tar->extract($tar->list_files); # I'm pretty sure we have nothing # that isn't compressed + + ExtUtils::MM_MacOS::convert_files([$tar->list_files], 1) + if ($^O eq 'MacOS'); + return 1; } else { $CPAN::Frontend->mydie(qq{ *************** *** 3893,3899 **** the make processes and deletes excess space according to a simple FIFO mechanism. ! All methods provided are accessible in a programmer style and in an interactive shell style. =head2 Interactive Mode --- 4301,4315 ---- the make processes and deletes excess space according to a simple FIFO mechanism. ! For extended searching capabilities there's a plugin for CPAN available, ! L. C is a full-text search engine that indexes ! all documents available in CPAN authors directories. If C ! is installed on your system, the interactive shell of will ! enable the C, C, C, C, and C commands which send ! queries to the WAIT server that has been configured for your ! installation. ! ! All other methods provided are accessible in a programmer style and in an interactive shell style. =head2 Interactive Mode *************** *** 3949,3959 **** =item make, test, install, clean modules or distributions ! These commands take any number of arguments and investigate what is necessary to perform the action. If the argument is a distribution ! file name (recognized by embedded slashes), it is processed. If it is a ! module, CPAN determines the distribution file in which this module is ! included and processes that. Any C or C are run unconditionally. An --- 4365,4377 ---- =item make, test, install, clean modules or distributions ! These commands take any number of arguments and investigates what is necessary to perform the action. If the argument is a distribution ! file name (recognized by embedded slashes), it is processed. If it is ! a module, CPAN determines the distribution file in which this module ! is included and processes that, following any dependencies named in ! the module's Makefile.PL (this behavior is controlled by ! I.) Any C or C are run unconditionally. An *************** *** 3983,3989 **** OpenGL-0.4/COPYRIGHT [...] ! A C command results in a make clean --- 4401,4407 ---- OpenGL-0.4/COPYRIGHT [...] ! A C command results in a make clean *************** *** 4133,4139 **** =back ! =head2 Methods in the four =head2 Cache Manager --- 4551,4557 ---- =back ! =head2 Methods in the four Classes =head2 Cache Manager *************** *** 4212,4218 **** version use something like this perl -MExtUtils::MakeMaker -le \ ! 'print MM->parse_version($ARGV[0])' filename If you are author of a package and wonder if your $VERSION can be parsed, please try the above method. --- 4630,4636 ---- version use something like this perl -MExtUtils::MakeMaker -le \ ! 'print MM->parse_version(shift)' filename If you are author of a package and wonder if your $VERSION can be parsed, please try the above method. *************** *** 4239,4245 **** worth to give it a try and send me more specific output. You should know that "o debug" has built-in completion support. ! =head2 Floppy, Zip, and all that Jazz CPAN.pm works nicely without network too. If you maintain machines that are not networked at all, you should consider working with file: --- 4657,4663 ---- worth to give it a try and send me more specific output. You should know that "o debug" has built-in completion support. ! =head2 Floppy, Zip, Offline Mode CPAN.pm works nicely without network too. If you maintain machines that are not networked at all, you should consider working with file: *************** *** 4278,4287 **** --- 4696,4712 ---- make_install_arg same as make_arg for 'make install' makepl_arg arguments passed to 'perl Makefile.PL' pager location of external program more (or any pager) + prerequisites_policy + what to do if you are missing module prerequisites + ('follow' automatically, 'ask' me, or 'ignore') + scan_cache controls scanning of cache ('atstart' or 'never') tar location of external program tar unzip location of external program unzip urllist arrayref to nearby CPAN sites (or equivalent locations) wait_list arrayref to a wait server to try (See CPAN::WAIT) + ftp_proxy, } the three usual variables for configuring + http_proxy, } proxy requests. Both as CPAN::Config variables + no_proxy } and as environment variables configurable. You can set and query each of these options interactively in the cpan shell with the command set defined within the C command: *************** *** 4311,4317 **** =back ! =head2 CD-ROM support The C parameter of the configuration table contains a list of URLs that are to be used for downloading. If the list contains any --- 4736,4742 ---- =back ! =head2 urllist parameter has CD-ROM support The C parameter of the configuration table contains a list of URLs that are to be used for downloading. If the list contains any *************** *** 4326,4331 **** --- 4751,4764 ---- that come at the beginning of urllist. It will later check for each module if there is a local copy of the most recent version. + Another peculiarity of urllist is that the site that we could + successfully fetch the last file from automatically gets a preference + token and is tried as the first site for the next request. So if you + add a new site at runtime it may happen that the previously preferred + site will be tried another time. This means that if you want to disallow + a site for the next transfer, it must be explicitly removed from + urllist. + =head1 SECURITY There's no strong security layer in CPAN.pm. CPAN.pm helps you to *************** *** 4333,4339 **** to a checksum that comes from the net just as the distribution file itself. If somebody has managed to tamper with the distribution file, they may have as well tampered with the CHECKSUMS file. Future ! development will go towards strong authentification. =head1 EXPORT --- 4766,4772 ---- to a checksum that comes from the net just as the distribution file itself. If somebody has managed to tamper with the distribution file, they may have as well tampered with the CHECKSUMS file. Future ! development will go towards strong authentication. =head1 EXPORT *************** *** 4341,4346 **** --- 4774,4863 ---- for this is that the primary use is intended for the cpan shell or for oneliners. + =head1 POPULATE AN INSTALLATION WITH LOTS OF MODULES + + To populate a freshly installed perl with my favorite modules is pretty + easiest by maintaining a private bundle definition file. To get a useful + blueprint of a bundle definition file, the command autobundle can be used + on the CPAN shell command line. This command writes a bundle definition + file for all modules that re installed for the currently running perl + interpreter. It's recommended to run this command only once and from then + on maintain the file manually under a private name, say + Bundle/my_bundle.pm. With a clever bundle file you can then simply say + + cpan> install Bundle::my_bundle + + then answer a few questions and then go out. + + Maintaining a bundle definition file means to keep track of two things: + dependencies and interactivity. CPAN.pm (currently) does not take into + account dependencies between distributions, so a bundle definition file + should specify distributions that depend on others B the others. + On the other hand, it's a bit annoying that many distributions need some + interactive configuring. So what I try to accomplish in my private bundle + file is to have the packages that need to be configured early in the file + and the gentle ones later, so I can go out after a few minutes and leave + CPAN.pm unattained. + + =head1 WORKING WITH CPAN.pm BEHIND FIREWALLS + + Thanks to Graham Barr for contributing the firewall following howto. + + Firewalls can be categorized into three basic types. + + =over + + =item http firewall + + This is where the firewall machine runs a web server and to access the + outside world you must do it via the web server. If you set environment + variables like http_proxy or ftp_proxy to a values beginning with http:// + or in your web browser you have to set proxy information then you know + you are running a http firewall. + + To access servers outside these types of firewalls with perl (even for + ftp) you will need to use LWP. + + =item ftp firewall + + This where the firewall machine runs a ftp server. This kind of firewall will + only let you access ftp serves outside the firewall. This is usually done by + connecting to the firewall with ftp, then entering a username like + "user@outside.host.com" + + To access servers outside these type of firewalls with perl you + will need to use Net::FTP. + + =item One way visibility + + I say one way visibility as these firewalls try to make themselve look + invisible to the users inside the firewall. An FTP data connection is + normally created by sending the remote server your IP address and then + listening for the connection. But the remote server will not be able to + connect to you because of the firewall. So for these types of firewall + FTP connections need to be done in a passive mode. + + There are two that I can think off. + + =over + + =item SOCKS + + If you are using a SOCKS firewall you will need to compile perl and link + it with the SOCKS library, this is what is normally called a ``socksified'' + perl. With this executable you will be able to connect to servers outside + the firewall as if it is not there. + + =item IP Masquerade + + This is the firewall implemented in the Linux kernel, it allows you to + hide a complete network behind one IP address. With this firewall no + special compiling is need as you can access hosts directly. + + =back + + =back + =head1 BUGS We should give coverage for _all_ of the CPAN and not just the PAUSE *************** *** 4358,4364 **** =head1 AUTHOR ! Andreas König Ea.koenig@mind.deE =head1 SEE ALSO --- 4875,4881 ---- =head1 AUTHOR ! Andreas König Ea.koenig@kulturbox.deE =head1 SEE ALSO diff -c 'perl5.005_02/lib/CPAN/FirstTime.pm' 'perl5.005_03/lib/CPAN/FirstTime.pm' Index: ./lib/CPAN/FirstTime.pm *** ./lib/CPAN/FirstTime.pm Thu Jul 23 23:00:33 1998 --- ./lib/CPAN/FirstTime.pm Sun Mar 28 14:26:41 1999 *************** *** 16,22 **** use File::Basename (); use File::Path (); use vars qw($VERSION); ! $VERSION = substr q$Revision: 1.29 $, 10; =head1 NAME --- 16,22 ---- use File::Basename (); use File::Path (); use vars qw($VERSION); ! $VERSION = substr q$Revision: 1.36 $, 10; =head1 NAME *************** *** 37,43 **** sub init { my($configpm) = @_; use Config; ! require CPAN::Nox; eval {require CPAN::Config;}; $CPAN::Config ||= {}; local($/) = "\n"; --- 37,45 ---- sub init { my($configpm) = @_; use Config; ! unless ($CPAN::VERSION) { ! require CPAN::Nox; ! } eval {require CPAN::Config;}; $CPAN::Config ||= {}; local($/) = "\n"; *************** *** 45,56 **** local($|) = 1; my($ans,$default,$local,$cont,$url,$expected_size); ! # # Files, directories # ! print qq{ CPAN is the world-wide archive of perl resources. It consists of about 100 sites that all replicate the same contents all around the globe. --- 47,58 ---- local($|) = 1; my($ans,$default,$local,$cont,$url,$expected_size); ! # # Files, directories # ! print qq[ CPAN is the world-wide archive of perl resources. It consists of about 100 sites that all replicate the same contents all around the globe. *************** *** 62,68 **** question and I\'ll try to autoconfigure. (Note: you can revisit this dialog anytime later by typing 'o conf init' at the cpan prompt.) ! }; my $manual_conf = ExtUtils::MakeMaker::prompt("Are you ready for manual configuration?", --- 64,70 ---- question and I\'ll try to autoconfigure. (Note: you can revisit this dialog anytime later by typing 'o conf init' at the cpan prompt.) ! ]; my $manual_conf = ExtUtils::MakeMaker::prompt("Are you ready for manual configuration?", *************** *** 111,126 **** $default = $cpan_home; while ($ans = prompt("CPAN build and cache directory?",$default)) { ! File::Path::mkpath($ans); # dies if it can't ! if (-d $ans && -w _) { ! last; ! } else { ! warn "Couldn't find directory $ans or directory is not writable. Please retry.\n"; ! } } $CPAN::Config->{cpan_home} = $ans; ! print qq{ If you want, I can keep the source files after a build in the cpan --- 113,133 ---- $default = $cpan_home; while ($ans = prompt("CPAN build and cache directory?",$default)) { ! eval { File::Path::mkpath($ans); }; # dies if it can't ! if ($@) { ! warn "Couldn't create directory $ans. ! Please retry.\n"; ! next; ! } ! if (-d $ans && -w _) { ! last; ! } else { ! warn "Couldn't find directory $ans or directory is not writable. Please retry.\n"; ! } } $CPAN::Config->{cpan_home} = $ans; ! print qq{ If you want, I can keep the source files after a build in the cpan *************** *** 151,156 **** --- 158,199 ---- # XXX This the time when we refetch the index files (in days) $CPAN::Config->{'index_expire'} = 1; + print qq{ + + By default, each time the CPAN module is started, cache scanning + is performed to keep the cache size in sync. To prevent from this, + disable the cache scanning with 'never'. + + }; + + $default = $CPAN::Config->{scan_cache} || 'atstart'; + do { + $ans = prompt("Perform cache scanning (atstart or never)?", $default); + } while ($ans ne 'atstart' && $ans ne 'never'); + $CPAN::Config->{scan_cache} = $ans; + + # + # prerequisites_policy + # Do we follow PREREQ_PM? + # + print qq{ + + The CPAN module can detect when a module that which you are trying to + build depends on prerequisites. If this happens, it can build the + prerequisites for you automatically ('follow'), ask you for + confirmation ('ask'), or just ignore them ('ignore'). Please set your + policy to one of the three values. + + }; + + $default = $CPAN::Config->{prerequisites_policy} || 'follow'; + do { + $ans = + prompt("Policy on building prerequisites (follow, ask or ignore)?", + $default); + } while ($ans ne 'follow' && $ans ne 'ask' && $ans ne 'ignore'); + $CPAN::Config->{prerequisites_policy} = $ans; + # # External programs # *************** *** 164,199 **** }; my(@path) = split /$Config{'path_sep'}/, $ENV{'PATH'}; my $progname; ! for $progname (qw/gzip tar unzip make lynx ncftp ftp/){ my $progcall = $progname; ! my $path = $CPAN::Config->{$progname} ! || $Config::Config{$progname} ! || ""; ! if (MM->file_name_is_absolute($path)) { ! # testing existence is not good enough, some have these exe ! # extensions ! ! # warn "Warning: configured $path does not exist\n" unless -e $path; ! # $path = ""; ! } else { ! $path = ''; ! } ! unless ($path) { ! # e.g. make -> nmake ! $progcall = $Config::Config{$progname} if $Config::Config{$progname}; ! } ! $path ||= find_exe($progcall,[@path]); ! warn "Warning: $progcall not found in PATH\n" unless ! $path; # not -e $path, because find_exe already checked that ! $ans = prompt("Where is your $progname program?",$path) || $path; ! $CPAN::Config->{$progname} = $ans; } my $path = $CPAN::Config->{'pager'} || $ENV{PAGER} || find_exe("less",[@path]) || ! find_exe("more",[@path]) || "more"; $ans = prompt("What is your favorite pager program?",$path); $CPAN::Config->{'pager'} = $ans; $path = $CPAN::Config->{'shell'}; --- 207,252 ---- }; + my $old_warn = $^W; + local $^W if $^O eq 'MacOS'; my(@path) = split /$Config{'path_sep'}/, $ENV{'PATH'}; + local $^W = $old_warn; my $progname; ! for $progname (qw/gzip tar unzip make lynx ncftpget ncftp ftp/){ ! if ($^O eq 'MacOS') { ! $CPAN::Config->{$progname} = 'not_here'; ! next; ! } my $progcall = $progname; ! # we don't need ncftp if we have ncftpget ! next if $progname eq "ncftp" && $CPAN::Config->{ncftpget} gt " "; ! my $path = $CPAN::Config->{$progname} ! || $Config::Config{$progname} ! || ""; ! if (MM->file_name_is_absolute($path)) { ! # testing existence is not good enough, some have these exe ! # extensions ! # warn "Warning: configured $path does not exist\n" unless -e $path; ! # $path = ""; ! } else { ! $path = ''; ! } ! unless ($path) { ! # e.g. make -> nmake ! $progcall = $Config::Config{$progname} if $Config::Config{$progname}; ! } ! ! $path ||= find_exe($progcall,[@path]); ! warn "Warning: $progcall not found in PATH\n" unless ! $path; # not -e $path, because find_exe already checked that ! $ans = prompt("Where is your $progname program?",$path) || $path; ! $CPAN::Config->{$progname} = $ans; } my $path = $CPAN::Config->{'pager'} || $ENV{PAGER} || find_exe("less",[@path]) || ! find_exe("more",[@path]) || ($^O eq 'MacOS' ? $ENV{EDITOR} : 0 ) ! || "more"; $ans = prompt("What is your favorite pager program?",$path); $CPAN::Config->{'pager'} = $ans; $path = $CPAN::Config->{'shell'}; *************** *** 202,210 **** $path = ""; } $path ||= $ENV{SHELL}; ! $path =~ s,\\,/,g if $^O eq 'os2'; # Cosmetic only ! $ans = prompt("What is your favorite shell?",$path); ! $CPAN::Config->{'shell'} = $ans; # # Arguments to make etc. --- 255,267 ---- $path = ""; } $path ||= $ENV{SHELL}; ! if ($^O eq 'MacOS') { ! $CPAN::Config->{'shell'} = 'not_here'; ! } else { ! $path =~ s,\\,/,g if $^O eq 'os2'; # Cosmetic only ! $ans = prompt("What is your favorite shell?",$path); ! $CPAN::Config->{'shell'} = $ans; ! } # # Arguments to make etc. *************** *** 327,337 **** --- 384,421 ---- } } + sub picklist { + my($items,$prompt,$default,$require_nonempty,$empty_warning)=@_; + $default ||= ''; + + my ($item, $i); + for $item (@$items) { + printf "(%d) %s\n", ++$i, $item; + } + + my @nums; + while (1) { + my $num = prompt($prompt,$default); + @nums = split (' ', $num); + (warn "invalid items entered, try again\n"), next + if grep (/\D/ || $_ < 1 || $_ > $i, @nums); + if ($require_nonempty) { + (warn "$empty_warning\n"), next + unless @nums; + } + last; + } + print "\n"; + for (@nums) { $_-- } + @{$items}[@nums]; + } + sub read_mirrored_by { my($local) = @_; my(%all,$url,$expected_size,$default,$ans,$host,$dst,$country,$continent,@location); my $fh = FileHandle->new; $fh->open($local) or die "Couldn't open $local: $!"; + local $/ = "\012"; while (<$fh>) { ($host) = /^([\w\.\-]+)/ unless defined $host; next unless defined $host; *************** *** 339,344 **** --- 423,429 ---- /location\s+=\s+\"([^\"]+)/ and @location = (split /\s*,\s*/, $1) and ($continent, $country) = @location[-1,-2]; $continent =~ s/\s\(.*//; + $continent =~ s/\W+$//; # if Jarkko doesn't know latitude/longitude /dst_dst\s+=\s+\"([^\"]+)/ and $dst = $1; next unless $host && $dst && $continent && $country; $all{$continent}{$country}{$dst} = CPAN::Mirrored::By->new($continent,$country,$dst); *************** *** 347,439 **** } $fh->close; $CPAN::Config->{urllist} ||= []; ! if ($expected_size = @{$CPAN::Config->{urllist}}) { ! for $url (@{$CPAN::Config->{urllist}}) { ! # sanity check, scheme+colon, not "q" there: ! next unless $url =~ /^\w+:\/./; ! $all{"[From previous setup]"}{"found URL"}{$url}=CPAN::Mirrored::By->new('[From previous setup]','found URL',$url); ! } $CPAN::Config->{urllist} = []; - } else { - $expected_size = 6; } ! print qq{ ! Now we need to know, where your favorite CPAN sites are located. Push a few sites onto the array (just in case the first on the array won\'t work). If you are mirroring CPAN to your local workstation, specify a file: URL. ! You can enter the number in front of the URL on the next screen, a ! file:, ftp: or http: URL, or "q" to finish selecting. ! ! }; ! ! $ans = prompt("Press RETURN to continue"); ! my $other; ! $ans = $other = ""; ! my(%seen); ! ! my $pipe = -t *STDIN ? "| $CPAN::Config->{'pager'}" : ">/dev/null"; ! while () { ! my(@valid,$previous_best); ! my $fh = FileHandle->new; ! $fh->open($pipe); ! { ! my($cont,$country,$url,$item); ! my(@cont) = sort keys %all; ! for $cont (@cont) { ! $fh->print(" $cont\n"); ! for $country (sort {lc $a cmp lc $b} keys %{$all{$cont}}) { ! for $url (sort {lc $a cmp lc $b} keys %{$all{$cont}{$country}}) { ! my $t = sprintf( ! " %-16s (%2d) %s\n", ! $country, ! ++$item, ! $url ! ); ! if ($cont =~ /^\[/) { ! $previous_best ||= $item; ! } ! push @valid, $all{$cont}{$country}{$url}; ! $fh->print($t); ! } ! } ! } ! } ! $fh->close; ! $previous_best ||= ""; ! $default = ! @{$CPAN::Config->{urllist}} >= ! $expected_size ? "q" : $previous_best; ! $ans = prompt( ! "\nSelect an$other ftp or file URL or a number (q to finish)", ! $default ! ); ! my $sel; ! if ($ans =~ /^\d/) { ! my $this = $valid[$ans-1]; ! my($con,$cou,$url) = ($this->continent,$this->country,$this->url); ! push @{$CPAN::Config->{urllist}}, $url unless $seen{$url}++; ! delete $all{$con}{$cou}{$url}; ! # print "Was a number [$ans] con[$con] cou[$cou] url[$url]\n"; ! } elsif ($ans =~ /^q/i) { ! last; ! } else { ! $ans =~ s|/?$|/|; # has to end with one slash ! $ans = "file:$ans" unless $ans =~ /:/; # without a scheme is a file: ! if ($ans =~ /^\w+:\/./) { ! push @{$CPAN::Config->{urllist}}, $ans unless $seen{$ans}++; ! } else { ! print qq{"$ans" doesn\'t look like an URL at first sight. ! I\'ll ignore it for now. You can add it to lib/CPAN/Config.pm ! later and report a bug in my Makefile.PL to me (andreas koenig). ! Thanks.\n}; ! } ! } ! $other ||= "other"; ! } } 1; --- 432,528 ---- } $fh->close; $CPAN::Config->{urllist} ||= []; ! my(@previous_urls); ! if (@previous_urls = @{$CPAN::Config->{urllist}}) { $CPAN::Config->{urllist} = []; } ! print qq{ ! Now we need to know where your favorite CPAN sites are located. Push a few sites onto the array (just in case the first on the array won\'t work). If you are mirroring CPAN to your local workstation, specify a file: URL. ! First, pick a nearby continent and country (you can pick several of ! each, separated by spaces, or none if you just want to keep your ! existing selections). Then, you will be presented with a list of URLs ! of CPAN mirrors in the countries you selected, along with previously ! selected URLs. Select some of those URLs, or just keep the old list. ! Finally, you will be prompted for any extra URLs -- file:, ftp:, or ! http: -- that host a CPAN mirror. ! ! }; ! ! my (@cont, $cont, %cont, @countries, @urls, %seen); ! my $no_previous_warn = ! "Sorry! since you don't have any existing picks, you must make a\n" . ! "geographic selection."; ! @cont = picklist([sort keys %all], ! "Select your continent (or several nearby continents)", ! '', ! ! @previous_urls, ! $no_previous_warn); ! ! ! foreach $cont (@cont) { ! my @c = sort keys %{$all{$cont}}; ! @cont{@c} = map ($cont, 0..$#c); ! @c = map ("$_ ($cont)", @c) if @cont > 1; ! push (@countries, @c); ! } ! ! if (@countries) { ! @countries = picklist (\@countries, ! "Select your country (or several nearby countries)", ! '', ! ! @previous_urls, ! $no_previous_warn); ! %seen = map (($_ => 1), @previous_urls); ! # hmmm, should take list of defaults from CPAN::Config->{'urllist'}... ! foreach $country (@countries) { ! (my $bare_country = $country) =~ s/ \(.*\)//; ! my @u = sort keys %{$all{$cont{$bare_country}}{$bare_country}}; ! @u = grep (! $seen{$_}, @u); ! @u = map ("$_ ($bare_country)", @u) ! if @countries > 1; ! push (@urls, @u); ! } ! } ! push (@urls, map ("$_ (previous pick)", @previous_urls)); ! my $prompt = "Select as many URLs as you like"; ! if (@previous_urls) { ! $default = join (' ', ((scalar @urls) - (scalar @previous_urls) + 1) .. ! (scalar @urls)); ! $prompt .= "\n(or just hit RETURN to keep your previous picks)"; ! } ! ! @urls = picklist (\@urls, $prompt, $default); ! foreach (@urls) { s/ \(.*\)//; } ! %seen = map (($_ => 1), @urls); ! ! do { ! $ans = prompt ("Enter another URL or RETURN to quit:", ""); ! ! if ($ans) { ! $ans =~ s|/?$|/|; # has to end with one slash ! $ans = "file:$ans" unless $ans =~ /:/; # without a scheme is a file: ! if ($ans =~ /^\w+:\/./) { ! push @urls, $ans ! unless $seen{$ans}; ! } ! else { ! print qq{"$ans" doesn\'t look like an URL at first sight. ! I\'ll ignore it for now. You can add it to $INC{'CPAN/MyConfig.pm'} ! later if you\'re sure it\'s right.\n}; ! } ! } ! } while $ans; ! ! push @{$CPAN::Config->{urllist}}, @urls; ! # xxx delete or comment these out when you're happy that it works ! print "New set of picks:\n"; ! map { print " $_\n" } @{$CPAN::Config->{urllist}}; } 1; diff -c 'perl5.005_02/lib/CPAN/Nox.pm' 'perl5.005_03/lib/CPAN/Nox.pm' Index: ./lib/CPAN/Nox.pm *** ./lib/CPAN/Nox.pm Thu Jul 23 23:00:33 1998 --- ./lib/CPAN/Nox.pm Sun Mar 28 14:26:41 1999 *************** *** 1,7 **** --- 1,10 ---- + package CPAN::Nox; + BEGIN{$CPAN::Suppress_readline=1 unless defined $CPAN::term;} use CPAN; + $VERSION = "1.00"; $CPAN::META->has_inst('MD5','no'); $CPAN::META->has_inst('LWP','no'); $CPAN::META->has_inst('Compress::Zlib','no'); diff -c 'perl5.005_02/lib/Carp.pm' 'perl5.005_03/lib/Carp.pm' Index: ./lib/Carp.pm *** ./lib/Carp.pm Thu Jul 23 23:00:33 1998 --- ./lib/Carp.pm Thu Mar 4 18:34:17 1999 *************** *** 35,41 **** detailed stack trace to be given. This can be very helpful when trying to understand why, or from where, a warning or error is being generated. ! This feature is enabled by 'importing' the non-existant symbol 'verbose'. You would typically enable it by saying perl -MCarp=verbose script.pl --- 35,41 ---- detailed stack trace to be given. This can be very helpful when trying to understand why, or from where, a warning or error is being generated. ! This feature is enabled by 'importing' the non-existent symbol 'verbose'. You would typically enable it by saying perl -MCarp=verbose script.pl *************** *** 43,48 **** --- 43,54 ---- or by including the string C in the L environment variable. + =head1 BUGS + + The Carp routines don't handle exception objects currently. + If called with a first argument that is a reference, they simply + call die() or warn(), as appropriate. + =cut # This package is heavily used. Be small. Be fast. Be good. *************** *** 88,93 **** --- 94,100 ---- # each function call on the stack. sub longmess { + return @_ if ref $_[0]; my $error = join '', @_; my $mess = ""; my $i = 1 + $CarpLevel; *************** *** 190,195 **** --- 197,203 ---- sub shortmess { # Short-circuit &longmess if called via multiple packages goto &longmess if $Verbose; + return @_ if ref $_[0]; my $error = join '', @_; my ($prevpack) = caller(1); my $extra = $CarpLevel; diff -c 'perl5.005_02/lib/Cwd.pm' 'perl5.005_03/lib/Cwd.pm' Index: ./lib/Cwd.pm *** ./lib/Cwd.pm Thu Jul 23 23:00:33 1998 --- ./lib/Cwd.pm Thu Jan 21 19:03:55 1999 *************** *** 32,38 **** in Perl. The abs_path() function takes a single argument and returns the ! absolute pathname for that argument. It uses the same algoritm as getcwd(). (actually getcwd() is abs_path(".")) The fastcwd() function looks the same as getcwd(), but runs faster. --- 32,38 ---- in Perl. The abs_path() function takes a single argument and returns the ! absolute pathname for that argument. It uses the same algorithm as getcwd(). (actually getcwd() is abs_path(".")) The fastcwd() function looks the same as getcwd(), but runs faster. *************** *** 269,275 **** # --- PORTING SECTION --- # VMS: $ENV{'DEFAULT'} points to default directory at all times ! # 06-Mar-1996 Charles Bailey bailey@genetics.upenn.edu # Note: Use of Cwd::chdir() causes the logical name PWD to be defined # in the process logical name table as the default device and directory # seen by Perl. This may not be the same as the default device --- 269,275 ---- # --- PORTING SECTION --- # VMS: $ENV{'DEFAULT'} points to default directory at all times ! # 06-Mar-1996 Charles Bailey bailey@newman.upenn.edu # Note: Use of Cwd::chdir() causes the logical name PWD to be defined # in the process logical name table as the default device and directory # seen by Perl. This may not be the same as the default device diff -c /dev/null 'perl5.005_03/lib/Dumpvalue.pm' Index: lib/Dumpvalue.pm *** lib/Dumpvalue.pm Wed Dec 31 18:00:00 1969 --- lib/Dumpvalue.pm Sat Jan 16 13:16:50 1999 *************** *** 0 **** --- 1,600 ---- + require 5.005; # For (defined ref) and $#$v + package Dumpvalue; + use strict; + use vars qw(%address *stab %subs); + + # translate control chars to ^X - Randal Schwartz + # Modifications to print types by Peter Gordon v1.0 + + # Ilya Zakharevich -- patches after 5.001 (and some before ;-) + + # Won't dump symbol tables and contents of debugged files by default + + # (IZ) changes for objectification: + # c) quote() renamed to method set_quote(); + # d) unctrlSet() renamed to method set_unctrl(); + # f) Compiles with `use strict', but in two places no strict refs is needed: + # maybe more problems are waiting... + + my %defaults = ( + globPrint => 0, + printUndef => 1, + tick => "auto", + unctrl => 'quote', + subdump => 1, + dumpReused => 0, + bareStringify => 1, + hashDepth => '', + arrayDepth => '', + dumpDBFiles => '', + dumpPackages => '', + quoteHighBit => '', + usageOnly => '', + compactDump => '', + veryCompact => '', + stopDbSignal => '', + ); + + sub new { + my $class = shift; + my %opt = (%defaults, @_); + bless \%opt, $class; + } + + sub set { + my $self = shift; + my %opt = @_; + @$self{keys %opt} = values %opt; + } + + sub get { + my $self = shift; + wantarray ? @$self{@_} : $$self{pop @_}; + } + + sub dumpValue { + my $self = shift; + die "usage: \$dumper->dumpValue(value)" unless @_ == 1; + local %address; + local $^W=0; + (print "undef\n"), return unless defined $_[0]; + (print $self->stringify($_[0]), "\n"), return unless ref $_[0]; + $self->unwrap($_[0],0); + } + + sub dumpValues { + my $self = shift; + local %address; + local $^W=0; + (print "undef\n"), return unless defined $_[0]; + $self->unwrap(\@_,0); + } + + # This one is good for variable names: + + sub unctrl { + local($_) = @_; + + return \$_ if ref \$_ eq "GLOB"; + s/([\001-\037\177])/'^'.pack('c',ord($1)^64)/eg; + $_; + } + + sub stringify { + my $self = shift; + local $_ = shift; + my $noticks = shift; + my $tick = $self->{tick}; + + return 'undef' unless defined $_ or not $self->{printUndef}; + return $_ . "" if ref \$_ eq 'GLOB'; + { no strict 'refs'; + $_ = &{'overload::StrVal'}($_) + if $self->{bareStringify} and ref $_ + and defined %overload:: and defined &{'overload::StrVal'}; + } + + if ($tick eq 'auto') { + if (/[\000-\011\013-\037\177]/) { + $tick = '"'; + } else { + $tick = "'"; + } + } + if ($tick eq "'") { + s/([\'\\])/\\$1/g; + } elsif ($self->{unctrl} eq 'unctrl') { + s/([\"\\])/\\$1/g ; + s/([\000-\037\177])/'^'.pack('c',ord($1)^64)/eg; + s/([\200-\377])/'\\0x'.sprintf('%2X',ord($1))/eg + if $self->{quoteHighBit}; + } elsif ($self->{unctrl} eq 'quote') { + s/([\"\\\$\@])/\\$1/g if $tick eq '"'; + s/\033/\\e/g; + s/([\000-\037\177])/'\\c'.chr(ord($1)^64)/eg; + } + s/([\200-\377])/'\\'.sprintf('%3o',ord($1))/eg if $self->{quoteHighBit}; + ($noticks || /^\d+(\.\d*)?\Z/) + ? $_ + : $tick . $_ . $tick; + } + + sub DumpElem { + my ($self, $v) = (shift, shift); + my $short = $self->stringify($v, ref $v); + my $shortmore = ''; + if ($self->{veryCompact} && ref $v + && (ref $v eq 'ARRAY' and !grep(ref $_, @$v) )) { + my $depth = $#$v; + ($shortmore, $depth) = (' ...', $self->{arrayDepth} - 1) + if $self->{arrayDepth} and $depth >= $self->{arrayDepth}; + my @a = map $self->stringify($_), @$v[0..$depth]; + print "0..$#{$v} @a$shortmore\n"; + } elsif ($self->{veryCompact} && ref $v + && (ref $v eq 'HASH') and !grep(ref $_, values %$v)) { + my @a = sort keys %$v; + my $depth = $#a; + ($shortmore, $depth) = (' ...', $self->{hashDepth} - 1) + if $self->{hashDepth} and $depth >= $self->{hashDepth}; + my @b = map {$self->stringify($_) . " => " . $self->stringify($$v{$_})} + @a[0..$depth]; + local $" = ', '; + print "@b$shortmore\n"; + } else { + print "$short\n"; + $self->unwrap($v,shift); + } + } + + sub unwrap { + my $self = shift; + return if $DB::signal and $self->{stopDbSignal}; + my ($v) = shift ; + my ($s) = shift ; # extra no of spaces + my $sp; + my (%v,@v,$address,$short,$fileno); + + $sp = " " x $s ; + $s += 3 ; + + # Check for reused addresses + if (ref $v) { + my $val = $v; + { no strict 'refs'; + $val = &{'overload::StrVal'}($v) + if defined %overload:: and defined &{'overload::StrVal'}; + } + ($address) = $val =~ /(0x[0-9a-f]+)\)$/ ; + if (!$self->{dumpReused} && defined $address) { + $address{$address}++ ; + if ( $address{$address} > 1 ) { + print "${sp}-> REUSED_ADDRESS\n" ; + return ; + } + } + } elsif (ref \$v eq 'GLOB') { + $address = "$v" . ""; # To avoid a bug with globs + $address{$address}++ ; + if ( $address{$address} > 1 ) { + print "${sp}*DUMPED_GLOB*\n" ; + return ; + } + } + + if ( UNIVERSAL::isa($v, 'HASH') ) { + my @sortKeys = sort keys(%$v) ; + my $more; + my $tHashDepth = $#sortKeys ; + $tHashDepth = $#sortKeys < $self->{hashDepth}-1 ? $#sortKeys : $self->{hashDepth}-1 + unless $self->{hashDepth} eq '' ; + $more = "....\n" if $tHashDepth < $#sortKeys ; + my $shortmore = ""; + $shortmore = ", ..." if $tHashDepth < $#sortKeys ; + $#sortKeys = $tHashDepth ; + if ($self->{compactDump} && !grep(ref $_, values %{$v})) { + $short = $sp; + my @keys; + for (@sortKeys) { + push @keys, $self->stringify($_) . " => " . $self->stringify($v->{$_}); + } + $short .= join ', ', @keys; + $short .= $shortmore; + (print "$short\n"), return if length $short <= $self->{compactDump}; + } + for my $key (@sortKeys) { + return if $DB::signal and $self->{stopDbSignal}; + my $value = $ {$v}{$key} ; + print $sp, $self->stringify($key), " => "; + $self->DumpElem($value, $s); + } + print "$sp empty hash\n" unless @sortKeys; + print "$sp$more" if defined $more ; + } elsif ( UNIVERSAL::isa($v, 'ARRAY') ) { + my $tArrayDepth = $#{$v} ; + my $more ; + $tArrayDepth = $#$v < $self->{arrayDepth}-1 ? $#$v : $self->{arrayDepth}-1 + unless $self->{arrayDepth} eq '' ; + $more = "....\n" if $tArrayDepth < $#{$v} ; + my $shortmore = ""; + $shortmore = " ..." if $tArrayDepth < $#{$v} ; + if ($self->{compactDump} && !grep(ref $_, @{$v})) { + if ($#$v >= 0) { + $short = $sp . "0..$#{$v} " . + join(" ", + map {$self->stringify($_)} @{$v}[0..$tArrayDepth]) + . "$shortmore"; + } else { + $short = $sp . "empty array"; + } + (print "$short\n"), return if length $short <= $self->{compactDump}; + } + for my $num ($[ .. $tArrayDepth) { + return if $DB::signal and $self->{stopDbSignal}; + print "$sp$num "; + $self->DumpElem($v->[$num], $s); + } + print "$sp empty array\n" unless @$v; + print "$sp$more" if defined $more ; + } elsif ( UNIVERSAL::isa($v, 'SCALAR') or ref $v eq 'REF' ) { + print "$sp-> "; + $self->DumpElem($$v, $s); + } elsif ( UNIVERSAL::isa($v, 'CODE') ) { + print "$sp-> "; + $self->dumpsub(0, $v); + } elsif ( UNIVERSAL::isa($v, 'GLOB') ) { + print "$sp-> ",$self->stringify($$v,1),"\n"; + if ($self->{globPrint}) { + $s += 3; + $self->dumpglob('', $s, "{$$v}", $$v, 1); + } elsif (defined ($fileno = fileno($v))) { + print( (' ' x ($s+3)) . "FileHandle({$$v}) => fileno($fileno)\n" ); + } + } elsif (ref \$v eq 'GLOB') { + if ($self->{globPrint}) { + $self->dumpglob('', $s, "{$v}", $v, 1); + } elsif (defined ($fileno = fileno(\$v))) { + print( (' ' x $s) . "FileHandle({$v}) => fileno($fileno)\n" ); + } + } + } + + sub matchvar { + $_[0] eq $_[1] or + ($_[1] =~ /^([!~])(.)([\x00-\xff]*)/) and + ($1 eq '!') ^ (eval {($_[2] . "::" . $_[0]) =~ /$2$3/}); + } + + sub compactDump { + my $self = shift; + $self->{compactDump} = shift if @_; + $self->{compactDump} = 6*80-1 + if $self->{compactDump} and $self->{compactDump} < 2; + $self->{compactDump}; + } + + sub veryCompact { + my $self = shift; + $self->{veryCompact} = shift if @_; + $self->compactDump(1) if !$self->{compactDump} and $self->{veryCompact}; + $self->{veryCompact}; + } + + sub set_unctrl { + my $self = shift; + if (@_) { + my $in = shift; + if ($in eq 'unctrl' or $in eq 'quote') { + $self->{unctrl} = $in; + } else { + print "Unknown value for `unctrl'.\n"; + } + } + $self->{unctrl}; + } + + sub set_quote { + my $self = shift; + if (@_ and $_[0] eq '"') { + $self->{tick} = '"'; + $self->{unctrl} = 'quote'; + } elsif (@_ and $_[0] eq 'auto') { + $self->{tick} = 'auto'; + $self->{unctrl} = 'quote'; + } elsif (@_) { # Need to set + $self->{tick} = "'"; + $self->{unctrl} = 'unctrl'; + } + $self->{tick}; + } + + sub dumpglob { + my $self = shift; + return if $DB::signal and $self->{stopDbSignal}; + my ($package, $off, $key, $val, $all) = @_; + local(*stab) = $val; + my $fileno; + if (($key !~ /^_{dumpDBFiles}) and defined $stab) { + print( (' ' x $off) . "\$", &unctrl($key), " = " ); + $self->DumpElem($stab, 3+$off); + } + if (($key !~ /^_{dumpDBFiles}) and defined @stab) { + print( (' ' x $off) . "\@$key = (\n" ); + $self->unwrap(\@stab,3+$off) ; + print( (' ' x $off) . ")\n" ); + } + if ($key ne "main::" && $key ne "DB::" && defined %stab + && ($self->{dumpPackages} or $key !~ /::$/) + && ($key !~ /^_{dumpDBFiles}) + && !($package eq "Dumpvalue" and $key eq "stab")) { + print( (' ' x $off) . "\%$key = (\n" ); + $self->unwrap(\%stab,3+$off) ; + print( (' ' x $off) . ")\n" ); + } + if (defined ($fileno = fileno(*stab))) { + print( (' ' x $off) . "FileHandle($key) => fileno($fileno)\n" ); + } + if ($all) { + if (defined &stab) { + $self->dumpsub($off, $key); + } + } + } + + sub dumpsub { + my $self = shift; + my ($off,$sub) = @_; + $sub = $1 if $sub =~ /^\{\*(.*)\}$/; + my $subref = \&$sub; + my $place = $DB::sub{$sub} || (($sub = $subs{"$subref"}) && $DB::sub{$sub}) + || ($self->{subdump} && ($sub = $self->findsubs("$subref")) + && $DB::sub{$sub}); + $place = '???' unless defined $place; + print( (' ' x $off) . "&$sub in $place\n" ); + } + + sub findsubs { + my $self = shift; + return undef unless defined %DB::sub; + my ($addr, $name, $loc); + while (($name, $loc) = each %DB::sub) { + $addr = \&$name; + $subs{"$addr"} = $name; + } + $self->{subdump} = 0; + $subs{ shift() }; + } + + sub dumpvars { + my $self = shift; + my ($package,@vars) = @_; + local(%address,$^W); + my ($key,$val); + $package .= "::" unless $package =~ /::$/; + *stab = *main::; + + while ($package =~ /(\w+?::)/g) { + *stab = $ {stab}{$1}; + } + $self->{TotalStrings} = 0; + $self->{Strings} = 0; + $self->{CompleteTotal} = 0; + while (($key,$val) = each(%stab)) { + return if $DB::signal and $self->{stopDbSignal}; + next if @vars && !grep( matchvar($key, $_), @vars ); + if ($self->{usageOnly}) { + $self->globUsage(\$val, $key) + unless $package eq 'Dumpvalue' and $key eq 'stab'; + } else { + $self->dumpglob($package, 0,$key, $val); + } + } + if ($self->{usageOnly}) { + print <{TotalStrings} bytes in $self->{Strings} strings. + EOP + $self->{CompleteTotal} += $self->{TotalStrings}; + print <{CompleteTotal} bytes (1 level deep) + overhead. + EOP + } + } + + sub scalarUsage { + my $self = shift; + my $size = length($_[0]); + $self->{TotalStrings} += $size; + $self->{Strings}++; + $size; + } + + sub arrayUsage { # array ref, name + my $self = shift; + my $size = 0; + map {$size += $self->scalarUsage($_)} @{$_[0]}; + my $len = @{$_[0]}; + print "\@$_[1] = $len item", ($len > 1 ? "s" : ""), " (data: $size bytes)\n" + if defined $_[1]; + $self->{CompleteTotal} += $size; + $size; + } + + sub hashUsage { # hash ref, name + my $self = shift; + my @keys = keys %{$_[0]}; + my @values = values %{$_[0]}; + my $keys = $self->arrayUsage(\@keys); + my $values = $self->arrayUsage(\@values); + my $len = @keys; + my $total = $keys + $values; + print "\%$_[1] = $len item", ($len > 1 ? "s" : ""), + " (keys: $keys; values: $values; total: $total bytes)\n" + if defined $_[1]; + $total; + } + + sub globUsage { # glob ref, name + my $self = shift; + local *stab = *{$_[0]}; + my $total = 0; + $total += $self->scalarUsage($stab) if defined $stab; + $total += $self->arrayUsage(\@stab, $_[1]) if defined @stab; + $total += $self->hashUsage(\%stab, $_[1]) + if defined %stab and $_[1] ne "main::" and $_[1] ne "DB::"; + #and !($package eq "Dumpvalue" and $key eq "stab")); + $total; + } + + 1; + + =head1 NAME + + Dumpvalue - provides screen dump of Perl data. + + =head1 SYNOPSYS + + use Dumpvalue; + my $dumper = new Dumpvalue; + $dumper->set(globPrint => 1); + $dumper->dumpValue(\*::); + $dumper->dumpvars('main'); + + =head1 DESCRIPTION + + =head2 Creation + + A new dumper is created by a call + + $d = new Dumpvalue(option1 => value1, option2 => value2) + + Recognized options: + + =over + + =item C, C + + Print only first N elements of arrays and hashes. If false, prints all the + elements. + + =item C, C + + Change style of array and hash dump. If true, short array + may be printed on one line. + + =item C + + Whether to print contents of globs. + + =item C + + Dump arrays holding contents of debugged files. + + =item C + + Dump symbol tables of packages. + + =item C + + Dump contents of "reused" addresses. + + =item C, C, C + + Change style of string dump. Default value of C is C, one + can enable either double-quotish dump, or single-quotish by setting it + to C<"> or C<'>. By default, characters with high bit set are printed + I. + + =item C + + I rudimentally per-package memory usage dump. If set, + C calculates total size of strings in variables in the package. + + =item unctrl + + Changes the style of printout of strings. Possible values are + C and C. + + =item subdump + + Whether to try to find the subroutine name given the reference. + + =item bareStringify + + Whether to write the non-overloaded form of the stringify-overloaded objects. + + =item quoteHighBit + + Whether to print chars with high bit set in binary or "as is". + + =item stopDbSignal + + Whether to abort printing if debugger signal flag is raised. + + =back + + Later in the life of the object the methods may be queries with get() + method and set() method (which accept multiple arguments). + + =head2 Methods + + =over + + =item dumpValue + + $dumper->dumpValue($value); + $dumper->dumpValue([$value1, $value2]); + + =item dumpValues + + $dumper->dumpValues($value1, $value2); + + =item dumpvars + + $dumper->dumpvars('my_package'); + $dumper->dumpvars('my_package', 'foo', '~bar$', '!......'); + + The optional arguments are considered as literal strings unless they + start with C<~> or C, in which case they are interpreted as regular + expressions (possibly negated). + + The second example prints entries with names C, and also entries + with names which ends on C, or are shorter than 5 chars. + + =item set_quote + + $d->set_quote('"'); + + Sets C and C options to suitable values for printout with the + given quote char. Possible values are C, C<'> and C<">. + + =item set_unctrl + + $d->set_unctrl('"'); + + Sets C option with checking for an invalid argument. + Possible values are C and C. + + =item compactDump + + $d->compactDump(1); + + Sets C option. If the value is 1, sets to a reasonable + big number. + + =item veryCompact + + $d->veryCompact(1); + + Sets C and C options simultaneously. + + =item set + + $d->set(option1 => value1, option2 => value2); + + =item get + + @values = $d->get('option1', 'option2'); + + =back + + =cut + diff -c 'perl5.005_02/lib/English.pm' 'perl5.005_03/lib/English.pm' Index: ./lib/English.pm *** ./lib/English.pm Thu Jul 23 23:00:34 1998 --- ./lib/English.pm Sat Mar 27 12:38:47 1999 *************** *** 15,20 **** --- 15,28 ---- =head1 DESCRIPTION + You should I use this module in programs intended to be portable + among Perl versions, programs that must perform regular expression + matching operations efficiently, or libraries intended for use with + such programs. In a sense, this module is deprecated. The reasons + for this have to do with implementation details of the Perl + interpreter which are too thorny to go into here. Perhaps someday + they will be fixed to make "C" more practical. + This module provides aliases for the built-in variables whose names no one seems to like to read. Variables with side-effects which get triggered just by accessing them (like $0) will still *************** *** 160,165 **** --- 168,174 ---- *PERL_VERSION = *] ; *ACCUMULATOR = *^A ; + *COMPILING = *^C ; *DEBUGGING = *^D ; *SYSTEM_FD_MAX = *^F ; *INPLACE_EDIT = *^I ; diff -c 'perl5.005_02/lib/ExtUtils/Command.pm' 'perl5.005_03/lib/ExtUtils/Command.pm' Index: ./lib/ExtUtils/Command.pm *** ./lib/ExtUtils/Command.pm Thu Jul 23 23:00:34 1998 --- ./lib/ExtUtils/Command.pm Tue Jan 5 20:17:48 1999 *************** *** 31,38 **** =head1 DESCRIPTION ! The module is used in Win32 port to replace common UNIX commands. ! Most commands are wrapers on generic modules File::Path and File::Basename. =over 4 --- 31,38 ---- =head1 DESCRIPTION ! The module is used in the Win32 port to replace common UNIX commands. ! Most commands are wrappers on generic modules File::Path and File::Basename. =over 4 diff -c 'perl5.005_02/lib/ExtUtils/Embed.pm' 'perl5.005_03/lib/ExtUtils/Embed.pm' Index: ./lib/ExtUtils/Embed.pm Prereq: 1.2501 *** ./lib/ExtUtils/Embed.pm Thu Jul 23 23:00:34 1998 --- ./lib/ExtUtils/Embed.pm Tue Jan 5 20:17:50 1999 *************** *** 416,422 **** extensions found in B<$Config{static_ext}>. This includes libraries found in B<$Config{libs}> and the first ModuleName.a library for each extension that is found by searching B<@INC> or the path ! specifed by the B<-I> option. In addition, when ModuleName.a is found, additional linker arguments are picked up from the B file in the same directory. --- 416,422 ---- extensions found in B<$Config{static_ext}>. This includes libraries found in B<$Config{libs}> and the first ModuleName.a library for each extension that is found by searching B<@INC> or the path ! specified by the B<-I> option. In addition, when ModuleName.a is found, additional linker arguments are picked up from the B file in the same directory. diff -c 'perl5.005_02/lib/ExtUtils/Install.pm' 'perl5.005_03/lib/ExtUtils/Install.pm' Index: ./lib/ExtUtils/Install.pm *** ./lib/ExtUtils/Install.pm Thu Jul 23 23:00:35 1998 --- ./lib/ExtUtils/Install.pm Tue Jan 5 20:17:51 1999 *************** *** 354,360 **** This function calls install() with the same arguments as the defaults the MakeMaker would use. ! The argumement-less form is convenient for install scripts like perl -MExtUtils::Install -e install_default Tk/Canvas --- 354,360 ---- This function calls install() with the same arguments as the defaults the MakeMaker would use. ! The argument-less form is convenient for install scripts like perl -MExtUtils::Install -e install_default Tk/Canvas diff -c 'perl5.005_02/lib/ExtUtils/Liblist.pm' 'perl5.005_03/lib/ExtUtils/Liblist.pm' Index: ./lib/ExtUtils/Liblist.pm *** ./lib/ExtUtils/Liblist.pm Wed Aug 5 18:02:22 1998 --- ./lib/ExtUtils/Liblist.pm Tue Jan 5 20:17:47 1999 *************** *** 225,230 **** --- 225,233 ---- my $search = 1; my($fullname, $thislib, $thispth); + # add "$Config{installarchlib}/CORE" to default search path + push @libpath, "$Config{installarchlib}/CORE"; + foreach (Text::ParseWords::quotewords('\s+', 0, $potential_libs)){ $thislib = $_; *************** *** 240,247 **** # if searching is disabled, do compiler-specific translations unless ($search) { - s/^-L/-libpath:/ if $VC; s/^-l(.+)$/$1.lib/ unless $GC; push(@extralibs, $_); $found++; next; --- 243,250 ---- # if searching is disabled, do compiler-specific translations unless ($search) { s/^-l(.+)$/$1.lib/ unless $GC; + s/^-L/-libpath:/ if $VC; push(@extralibs, $_); $found++; next; *************** *** 575,581 **** =item * Input library and path specifications are accepted with or without the ! C<-l> and C<-L> prefices used by Unix linkers. If neither prefix is present, a token is considered a directory to search if it is in fact a directory, and a library to search for otherwise. Authors who wish their extensions to be portable to Unix or OS/2 should use the Unix --- 578,584 ---- =item * Input library and path specifications are accepted with or without the ! C<-l> and C<-L> prefixes used by Unix linkers. If neither prefix is present, a token is considered a directory to search if it is in fact a directory, and a library to search for otherwise. Authors who wish their extensions to be portable to Unix or OS/2 should use the Unix *************** *** 586,592 **** Wherever possible, shareable images are preferred to object libraries, and object libraries to plain object files. In accordance with VMS naming conventions, ext() looks for files named Ishr and Irtl; ! it also looks for Ilib and libI to accomodate Unix conventions used in some ported software. =item * --- 589,595 ---- Wherever possible, shareable images are preferred to object libraries, and object libraries to plain object files. In accordance with VMS naming conventions, ext() looks for files named Ishr and Irtl; ! it also looks for Ilib and libI to accommodate Unix conventions used in some ported software. =item * *************** *** 625,638 **** If C<$potential_libs> is empty, the return value will be empty. Otherwise, the libraries specified by C<$Config{libs}> (see Config.pm) will be appended to the list of C<$potential_libs>. The libraries ! will be searched for in the directories specified in C<$potential_libs> ! as well as in C<$Config{libpth}>. For each library that is found, a ! space-separated list of fully qualified library pathnames is generated. =item * Input library and path specifications are accepted with or without the ! C<-l> and C<-L> prefices used by Unix linkers. An entry of the form C<-La:\foo> specifies the C directory to look for the libraries that follow. --- 628,642 ---- If C<$potential_libs> is empty, the return value will be empty. Otherwise, the libraries specified by C<$Config{libs}> (see Config.pm) will be appended to the list of C<$potential_libs>. The libraries ! will be searched for in the directories specified in C<$potential_libs>, ! C<$Config{libpth}>, and in C<$Config{installarchlib}/CORE>. ! For each library that is found, a space-separated list of fully qualified ! library pathnames is generated. =item * Input library and path specifications are accepted with or without the ! C<-l> and C<-L> prefixes used by Unix linkers. An entry of the form C<-La:\foo> specifies the C directory to look for the libraries that follow. *************** *** 651,657 **** be appended to any entries that are not directories and don't already have the suffix. ! Note that the C<-L> and <-l> prefixes are B, but authors who wish their extensions to be portable to Unix or OS/2 should use the prefixes, since the Unix-OS/2 version of ext() requires them. --- 655,661 ---- be appended to any entries that are not directories and don't already have the suffix. ! Note that the C<-L> and C<-l> prefixes are B, but authors who wish their extensions to be portable to Unix or OS/2 should use the prefixes, since the Unix-OS/2 version of ext() requires them. diff -c 'perl5.005_02/lib/ExtUtils/MM_OS2.pm' 'perl5.005_03/lib/ExtUtils/MM_OS2.pm' Index: ./lib/ExtUtils/MM_OS2.pm *** ./lib/ExtUtils/MM_OS2.pm Thu Jul 23 23:00:35 1998 --- ./lib/ExtUtils/MM_OS2.pm Fri Oct 30 18:52:33 1998 *************** *** 15,20 **** --- 15,21 ---- my($funcs) = $attribs{DL_FUNCS} || $self->{DL_FUNCS} || {}; my($vars) = $attribs{DL_VARS} || $self->{DL_VARS} || []; + my($funclist) = $attribs{FUNCLIST} || $self->{FUNCLIST} || []; my($imports) = $attribs{IMPORTS} || $self->{IMPORTS} || {}; my(@m); (my $boot = $self->{NAME}) =~ s/:/_/g; *************** *** 27,38 **** --- 28,71 ---- Mksymlists("NAME" => "', $self->{NAME}, '", "DLBASE" => "',$self->{DLBASE}, '", "DL_FUNCS" => ',neatvalue($funcs), + ', "FUNCLIST" => ',neatvalue($funclist), ', "IMPORTS" => ',neatvalue($imports), ', "VERSION" => "',$self->{VERSION}, '", "DL_VARS" => ', neatvalue($vars), ');\' '); } + if (%{$self->{IMPORTS}}) { + # Make import files (needed for static build) + -d 'tmp_imp' or mkdir 'tmp_imp', 0777 or die "Can't mkdir tmp_imp"; + open IMP, '>tmpimp.imp' or die "Can't open tmpimp.imp"; + my ($name, $exp); + while (($name, $exp)= each %{$self->{IMPORTS}}) { + my ($lib, $id) = ($exp =~ /(.*)\.(.*)/) or die "Malformed IMPORT `$exp'"; + print IMP "$name $lib $id ?\n"; + } + close IMP or die "Can't close tmpimp.imp"; + # print "emximp -o tmpimp$Config::Config{lib_ext} tmpimp.imp\n"; + system "emximp -o tmpimp$Config::Config{lib_ext} tmpimp.imp" + and die "Cannot make import library: $!, \$?=$?"; + unlink ; + system "cd tmp_imp; $Config::Config{ar} x ../tmpimp$Config::Config{lib_ext}" + and die "Cannot extract import objects: $!, \$?=$?"; + } join('',@m); + } + + sub static_lib { + my($self) = @_; + my $old = $self->ExtUtils::MM_Unix::static_lib(); + return $old unless %{$self->{IMPORTS}}; + + my @chunks = split /\n{2,}/, $old; + shift @chunks unless length $chunks[0]; # Empty lines at the start + $chunks[0] .= <<'EOC'; + + $(AR) $(AR_STATIC_ARGS) $@ tmp_imp/* && $(RANLIB) $@ + EOC + return join "\n\n". '', @chunks; } sub replace_manpage_separator { diff -c 'perl5.005_02/lib/ExtUtils/MM_Unix.pm' 'perl5.005_03/lib/ExtUtils/MM_Unix.pm' Index: ./lib/ExtUtils/MM_Unix.pm Prereq: 1.126 *** ./lib/ExtUtils/MM_Unix.pm Thu Jul 23 23:00:37 1998 --- ./lib/ExtUtils/MM_Unix.pm Thu Mar 4 18:34:20 1999 *************** *** 8,14 **** use vars qw($VERSION $Is_Mac $Is_OS2 $Is_VMS $Is_Win32 $Is_Dos $Is_PERL_OBJECT $Verbose %pm %static $Xsubpp_Version); ! $VERSION = substr q$Revision: 1.12601 $, 10; # $Id: MM_Unix.pm,v 1.126 1998/06/28 21:32:49 k Exp k $ Exporter::import('ExtUtils::MakeMaker', --- 8,14 ---- use vars qw($VERSION $Is_Mac $Is_OS2 $Is_VMS $Is_Win32 $Is_Dos $Is_PERL_OBJECT $Verbose %pm %static $Xsubpp_Version); ! $VERSION = substr q$Revision: 1.12602 $, 10; # $Id: MM_Unix.pm,v 1.126 1998/06/28 21:32:49 k Exp k $ Exporter::import('ExtUtils::MakeMaker', *************** *** 19,25 **** $Is_Win32 = $^O eq 'MSWin32'; $Is_Dos = $^O eq 'dos'; ! $Is_PERL_OBJECT = 1 if $Config{'ccflags'} =~ /-DPERL_OBJECT/; if ($Is_VMS = $^O eq 'VMS') { require VMS::Filespec; --- 19,25 ---- $Is_Win32 = $^O eq 'MSWin32'; $Is_Dos = $^O eq 'dos'; ! $Is_PERL_OBJECT = $Config{'ccflags'} =~ /-DPERL_OBJECT/; if ($Is_VMS = $^O eq 'VMS') { require VMS::Filespec; *************** *** 84,93 **** if ( $^O eq 'qnx' && $path =~ s|^(//\d+)/|/| ) { $node = $1; } ! $path =~ s|/+|/|g ; # xx////xx -> xx/xx $path =~ s|(/\.)+/|/|g ; # xx/././xx -> xx/xx $path =~ s|^(\./)+|| unless $path eq "./"; # ./xx -> xx ! $path =~ s|/$|| unless $path eq "/"; # xx/ -> xx "$node$path"; } --- 84,93 ---- if ( $^O eq 'qnx' && $path =~ s|^(//\d+)/|/| ) { $node = $1; } ! $path =~ s|(?<=[^/])/+|/|g ; # xx////xx -> xx/xx $path =~ s|(/\.)+/|/|g ; # xx/././xx -> xx/xx $path =~ s|^(\./)+|| unless $path eq "./"; # ./xx -> xx ! $path =~ s|(?<=[^/])/$|| ; # xx/ -> xx "$node$path"; } *************** *** 233,238 **** --- 233,239 ---- sub ExtUtils::MM_Unix::top_targets ; sub ExtUtils::MM_Unix::writedoc ; sub ExtUtils::MM_Unix::xs_c ; + sub ExtUtils::MM_Unix::xs_cpp ; sub ExtUtils::MM_Unix::xs_o ; sub ExtUtils::MM_Unix::xsubpp_version ; *************** *** 374,382 **** $self->{uc $_} ||= $cflags{$_} } ! if ($self->{CAPI} && $Is_PERL_OBJECT == 1) { $self->{CCFLAGS} =~ s/-DPERL_OBJECT(\s|$)//; ! $self->{CCFLAGS} .= '-DPERL_CAPI'; if ($Is_Win32 && $Config{'cc'} =~ /^cl.exe/i) { # Turn off C++ mode of the MSC compiler $self->{CCFLAGS} =~ s/-TP(\s|$)//; --- 375,383 ---- $self->{uc $_} ||= $cflags{$_} } ! if ($self->{CAPI} && $Is_PERL_OBJECT) { $self->{CCFLAGS} =~ s/-DPERL_OBJECT(\s|$)//; ! $self->{CCFLAGS} .= ' -DPERL_CAPI '; if ($Is_Win32 && $Config{'cc'} =~ /^cl.exe/i) { # Turn off C++ mode of the MSC compiler $self->{CCFLAGS} =~ s/-TP(\s|$)//; *************** *** 818,824 **** =item dist_core (o) ! Defeines the targets dist, tardist, zipdist, uutardist, shdist =cut --- 819,825 ---- =item dist_core (o) ! Defines the targets dist, tardist, zipdist, uutardist, shdist =cut *************** *** 915,920 **** --- 916,922 ---- my($funcs) = $attribs{DL_FUNCS} || $self->{DL_FUNCS} || {}; my($vars) = $attribs{DL_VARS} || $self->{DL_VARS} || []; + my($funclist) = $attribs{FUNCLIST} || $self->{FUNCLIST} || []; my(@m); push(@m," *************** *** 931,937 **** $self->{BASEEXT}.exp: Makefile.PL ",' $(PERL) "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" -e \'use ExtUtils::Mksymlists; \\ Mksymlists("NAME" => "',$self->{NAME},'", "DL_FUNCS" => ', ! neatvalue($funcs),', "DL_VARS" => ', neatvalue($vars), ');\' '); join('',@m); --- 933,940 ---- $self->{BASEEXT}.exp: Makefile.PL ",' $(PERL) "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" -e \'use ExtUtils::Mksymlists; \\ Mksymlists("NAME" => "',$self->{NAME},'", "DL_FUNCS" => ', ! neatvalue($funcs), ', "FUNCLIST" => ', neatvalue($funclist), ! ', "DL_VARS" => ', neatvalue($vars), ');\' '); join('',@m); *************** *** 2018,2024 **** =item installbin (o) ! Defines targets to install EXE_FILES. =cut --- 2021,2027 ---- =item installbin (o) ! Defines targets to make and to install EXE_FILES. =cut *************** *** 2045,2051 **** } : q{FIXIN = $(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) -MExtUtils::MakeMaker \ -e "MY->fixin(shift)" }).qq{ ! all :: @to $self->{NOECHO}\$(NOOP) realclean :: --- 2048,2054 ---- } : q{FIXIN = $(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) -MExtUtils::MakeMaker \ -e "MY->fixin(shift)" }).qq{ ! pure_all :: @to $self->{NOECHO}\$(NOOP) realclean :: *************** *** 2347,2353 **** $tmp/perlmain.c: $makefilename}, q{ }.$self->{NOECHO}.q{echo Writing $@ }.$self->{NOECHO}.q{$(PERL) $(MAP_PERLINC) -MExtUtils::Miniperl \\ ! -e "writemain(grep s#.*/auto/##, qw|$(MAP_STATIC)|)" > $@t && $(MV) $@t $@ }; push @m, "\t",$self->{NOECHO}.q{$(PERL) $(INSTALLSCRIPT)/fixpmain --- 2350,2356 ---- $tmp/perlmain.c: $makefilename}, q{ }.$self->{NOECHO}.q{echo Writing $@ }.$self->{NOECHO}.q{$(PERL) $(MAP_PERLINC) -MExtUtils::Miniperl \\ ! -e "writemain(grep s#.*/auto/##, split(q| |, q|$(MAP_STATIC)|))" > $@t && $(MV) $@t $@ }; push @m, "\t",$self->{NOECHO}.q{$(PERL) $(INSTALLSCRIPT)/fixpmain *************** *** 2746,2755 **** --- 2749,2761 ---- push(@m, "\t\@\$(PERL) -e \"print qq{{DISTNAME}\\\" VERSION=\\\"$pack_ver\\\">\\n}"); push(@m, ". qq{\\t$self->{DISTNAME}\\n}"); my $abstract = $self->{ABSTRACT}; + $abstract =~ s/\n/\\n/sg; $abstract =~ s//>/g; push(@m, ". qq{\\t$abstract\\n}"); my ($author) = $self->{AUTHOR}; + $author =~ s//>/g; $author =~ s/@/\\@/g; push(@m, ". qq{\\t$author\\n}"); push(@m, ". qq{\\t\\n}"); *************** *** 2757,2765 **** foreach $prereq (sort keys %{$self->{PREREQ_PM}}) { my $pre_req = $prereq; $pre_req =~ s/::/-/g; ! push(@m, ". qq{\\t\\t\\n}"); } push(@m, ". qq{\\t\\t\\n}"); my ($bin_location) = $self->{BINARY_LOCATION}; $bin_location =~ s/\\/\\\\/g; if ($self->{PPM_INSTALL_SCRIPT}) { --- 2763,2773 ---- foreach $prereq (sort keys %{$self->{PREREQ_PM}}) { my $pre_req = $prereq; $pre_req =~ s/::/-/g; ! my ($dep_ver) = join ",", (split (/\./, $self->{PREREQ_PM}{$prereq}), (0) x 4) [0 .. 3]; ! push(@m, ". qq{\\t\\t\\n}"); } push(@m, ". qq{\\t\\t\\n}"); + push(@m, ". qq{\\t\\t\\n}"); my ($bin_location) = $self->{BINARY_LOCATION}; $bin_location =~ s/\\/\\\\/g; if ($self->{PPM_INSTALL_SCRIPT}) { *************** *** 2783,2789 **** Used as the string that is passed to the C command to set the permissions for read/writeable files. MakeMaker chooses C<644> because it has turned out in the past that ! relying on the umask provokes hard-to-track bugreports. When the return value is used by the perl function C, it is interpreted as an octal value. --- 2791,2797 ---- Used as the string that is passed to the C command to set the permissions for read/writeable files. MakeMaker chooses C<644> because it has turned out in the past that ! relying on the umask provokes hard-to-track bug reports. When the return value is used by the perl function C, it is interpreted as an octal value. *************** *** 2889,2901 **** return "" unless $self->{PL_FILES}; my(@m, $plfile); foreach $plfile (sort keys %{$self->{PL_FILES}}) { push @m, " ! all :: $self->{PL_FILES}->{$plfile} $self->{NOECHO}\$(NOOP) ! $self->{PL_FILES}->{$plfile} :: $plfile ! \$(PERL) -I\$(INST_ARCHLIB) -I\$(INST_LIB) -I\$(PERL_ARCHLIB) -I\$(PERL_LIB) $plfile "; } join "", @m; } --- 2897,2914 ---- return "" unless $self->{PL_FILES}; my(@m, $plfile); foreach $plfile (sort keys %{$self->{PL_FILES}}) { + my $list = ref($self->{PL_FILES}->{$plfile}) + ? $self->{PL_FILES}->{$plfile} + : [$self->{PL_FILES}->{$plfile}]; + foreach $target (@$list) { push @m, " ! all :: $target $self->{NOECHO}\$(NOOP) ! $target :: $plfile ! \$(PERL) -I\$(INST_ARCHLIB) -I\$(INST_LIB) -I\$(PERL_ARCHLIB) -I\$(PERL_LIB) $plfile $target "; + } } join "", @m; } *************** *** 2943,2949 **** sub replace_manpage_separator { my($self,$man) = @_; ! $man =~ s,/+,::,g; $man; } --- 2956,2966 ---- sub replace_manpage_separator { my($self,$man) = @_; ! if ($^O eq 'uwin') { ! $man =~ s,/+,.,g; ! } else { ! $man =~ s,/+,::,g; ! } $man; } *************** *** 3304,3310 **** } } ! $xsubpp = $self->{CAPI} ? "xsubpp -object_capi" : "xsubpp"; return qq{ XSUBPPDIR = $xsdir --- 3321,3327 ---- } } ! my $xsubpp = $self->{CAPI} ? "xsubpp -object_capi" : "xsubpp"; return qq{ XSUBPPDIR = $xsdir *************** *** 3454,3460 **** =item writedoc ! Obsolete, depecated method. Not used since Version 5.21. =cut --- 3471,3477 ---- =item writedoc ! Obsolete, deprecated method. Not used since Version 5.21. =cut *************** *** 3478,3484 **** return '' unless $self->needs_linking(); ' .xs.c: ! $(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) $(XSUBPP) $(XSPROTOARG) $(XSUBPPARGS) $*.xs >$*.tc && $(MV) $*.tc $@ '; } --- 3495,3516 ---- return '' unless $self->needs_linking(); ' .xs.c: ! $(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) $(XSUBPP) $(XSPROTOARG) $(XSUBPPARGS) $*.xs >xstmp.c && $(MV) xstmp.c $*.c ! '; ! } ! ! =item xs_cpp (o) ! ! Defines the suffix rules to compile XS files to C++. ! ! =cut ! ! sub xs_cpp { ! my($self) = shift; ! return '' unless $self->needs_linking(); ! ' ! .xs.cpp: ! $(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) $(XSUBPP) $(XSPROTOARG) $(XSUBPPARGS) $*.xs >xstmp.c && $(MV) xstmp.c $*.cpp '; } *************** *** 3509,3514 **** --- 3541,3547 ---- sub perl_archive { + return '$(PERL_INC)' . "/$Config{libperl}" if $^O eq "beos"; return ""; } diff -c 'perl5.005_02/lib/ExtUtils/MM_VMS.pm' 'perl5.005_03/lib/ExtUtils/MM_VMS.pm' Index: ./lib/ExtUtils/MM_VMS.pm *** ./lib/ExtUtils/MM_VMS.pm Thu Jul 23 23:00:39 1998 --- ./lib/ExtUtils/MM_VMS.pm Sun Dec 13 10:16:29 1998 *************** *** 3,9 **** # This package is inserted into @ISA of MakeMaker's MM before the # built-in ExtUtils::MM_Unix methods if MakeMaker.pm is run under VMS. # ! # Author: Charles Bailey bailey@genetics.upenn.edu package ExtUtils::MM_VMS; --- 3,9 ---- # This package is inserted into @ISA of MakeMaker's MM before the # built-in ExtUtils::MM_Unix methods if MakeMaker.pm is run under VMS. # ! # Author: Charles Bailey bailey@newman.upenn.edu package ExtUtils::MM_VMS; *************** *** 14,20 **** use File::Basename; use vars qw($Revision); ! $Revision = '5.42 (31-Mar-1997)'; unshift @MM::ISA, 'ExtUtils::MM_VMS'; --- 14,20 ---- use File::Basename; use vars qw($Revision); ! $Revision = '5.52 (12-Sep-1998)'; unshift @MM::ISA, 'ExtUtils::MM_VMS'; *************** *** 829,835 **** $quals =~ s/ -$type$def\s*//; $def =~ s/"/""/g; if ($type eq 'D') { $definestr .= qq["$def",]; } ! elsif ($type eq 'I') { $flagincstr .= ',' . $self->fixpath($def,1); } else { $undefstr .= qq["$def",]; } } } --- 829,835 ---- $quals =~ s/ -$type$def\s*//; $def =~ s/"/""/g; if ($type eq 'D') { $definestr .= qq["$def",]; } ! elsif ($type eq 'I') { $incstr .= ',' . $self->fixpath($def,1); } else { $undefstr .= qq["$def",]; } } } *************** *** 869,875 **** my(@includes) = split(/\s+/,$self->{INC}); foreach (@includes) { s/^-I//; ! $incstr .= ', '.$self->fixpath($_,1); } } $quals .= "$incstr)"; --- 869,875 ---- my(@includes) = split(/\s+/,$self->{INC}); foreach (@includes) { s/^-I//; ! $incstr .= ','.$self->fixpath($_,1); } } $quals .= "$incstr)"; *************** *** 1322,1327 **** --- 1322,1328 ---- my($funcs) = $attribs{DL_FUNCS} || $self->{DL_FUNCS} || {}; my($vars) = $attribs{DL_VARS} || $self->{DL_VARS} || []; + my($funclist) = $attribs{FUNCLIST} || $self->{FUNCLIST} || []; my(@m); unless ($self->{SKIPHASH}{'dynamic'}) { *************** *** 1343,1349 **** $(BASEEXT).opt : Makefile.PL $(PERL) "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" -e "use ExtUtils::Mksymlists;" - ',qq[-e "Mksymlists('NAME' => '$self->{NAME}', 'DL_FUNCS' => ], ! neatvalue($funcs),q[, 'DL_VARS' => ],neatvalue($vars),')" $(PERL) -e "print ""$(INST_STATIC)/Include=$(BASEEXT)\n$(INST_STATIC)/Library\n"";" >>$(MMS$TARGET) '); --- 1344,1351 ---- $(BASEEXT).opt : Makefile.PL $(PERL) "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" -e "use ExtUtils::Mksymlists;" - ',qq[-e "Mksymlists('NAME' => '$self->{NAME}', 'DL_FUNCS' => ], ! neatvalue($funcs),q[, 'DL_VARS' => ],neatvalue($vars), ! q[, 'FUNCLIST' => ],neatvalue($funclist),')" $(PERL) -e "print ""$(INST_STATIC)/Include=$(BASEEXT)\n$(INST_STATIC)/Library\n"";" >>$(MMS$TARGET) '); *************** *** 1389,1395 **** push @m, ' $(INST_DYNAMIC) : $(INST_STATIC) $(PERL_INC)perlshr_attr.opt $(INST_ARCHAUTODIR).exists $(EXPORT_LIST) $(PERL_ARCHIVE) $(INST_DYNAMIC_DEP) $(NOECHO) $(MKPATH) $(INST_ARCHAUTODIR) ! $(NOECHO) If F$TrnLNm("',$shr,'").eqs."" Then Define/NoLog/User ',"$shr Sys\$Share:$shr.$Config{'dlext'}",' Link $(LDFLAGS) /Shareable=$(MMS$TARGET)$(OTHERLDFLAGS) $(BASEEXT).opt/Option,$(PERL_INC)perlshr_attr.opt/Option '; --- 1391,1397 ---- push @m, ' $(INST_DYNAMIC) : $(INST_STATIC) $(PERL_INC)perlshr_attr.opt $(INST_ARCHAUTODIR).exists $(EXPORT_LIST) $(PERL_ARCHIVE) $(INST_DYNAMIC_DEP) $(NOECHO) $(MKPATH) $(INST_ARCHAUTODIR) ! If F$TrnLNm("',$shr,'").eqs."" Then Define/NoLog/User ',"$shr Sys\$Share:$shr.$Config{'dlext'}",' Link $(LDFLAGS) /Shareable=$(MMS$TARGET)$(OTHERLDFLAGS) $(BASEEXT).opt/Option,$(PERL_INC)perlshr_attr.opt/Option '; *************** *** 1441,1447 **** $(NOECHO) $(NOOP) ' unless ($self->{OBJECT} or @{$self->{C} || []} or $self->{MYEXTLIB}); ! my(@m); push @m,' # Rely on suffix rule for update action $(OBJECT) : $(INST_ARCHAUTODIR).exists --- 1443,1449 ---- $(NOECHO) $(NOOP) ' unless ($self->{OBJECT} or @{$self->{C} || []} or $self->{MYEXTLIB}); ! my(@m,$lib); push @m,' # Rely on suffix rule for update action $(OBJECT) : $(INST_ARCHAUTODIR).exists *************** *** 1463,1469 **** push(@m,"\t",'Library/Object/Replace $(MMS$TARGET) $(MMS$SOURCE_LIST)',"\n"); } ! push(@m,"\t",'$(NOECHO) $(PERL) -e "open F,\'>>$(INST_ARCHAUTODIR)extralibs.ld\';print F qq{$(EXTRALIBS)\n};close F;"',"\n"); push @m, $self->dir_target('$(INST_ARCHAUTODIR)'); join('',@m); } --- 1465,1474 ---- push(@m,"\t",'Library/Object/Replace $(MMS$TARGET) $(MMS$SOURCE_LIST)',"\n"); } ! foreach $lib (split $self->{EXTRALIBS}) { ! $lib = '""' if $lib eq '"'; ! push(@m,"\t",'$(NOECHO) $(PERL) -e "print qq{',$lib,'\n}" >>$(INST_ARCHAUTODIR)extralibs.ld',"\n"); ! } push @m, $self->dir_target('$(INST_ARCHAUTODIR)'); join('',@m); } *************** *** 1530,1544 **** return "" unless $self->{PL_FILES}; my(@m, $plfile); foreach $plfile (sort keys %{$self->{PL_FILES}}) { ! my $vmsplfile = vmsify($plfile); ! my $vmsfile = vmsify($self->{PL_FILES}->{$plfile}); ! push @m, " all :: $vmsfile \$(NOECHO) \$(NOOP) $vmsfile :: $vmsplfile ! ",' $(PERL) "-I$(INST_ARCHLIB)" "-I$(INST_LIB)" "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" '," $vmsplfile "; } join "", @m; } --- 1535,1554 ---- return "" unless $self->{PL_FILES}; my(@m, $plfile); foreach $plfile (sort keys %{$self->{PL_FILES}}) { ! my $list = ref($self->{PL_FILES}->{$plfile}) ! ? $self->{PL_FILES}->{$plfile} ! : [$self->{PL_FILES}->{$plfile}]; ! foreach $target (@$list) { ! my $vmsplfile = vmsify($plfile); ! my $vmsfile = vmsify($target); ! push @m, " all :: $vmsfile \$(NOECHO) \$(NOOP) $vmsfile :: $vmsplfile ! ",' $(PERL) "-I$(INST_ARCHLIB)" "-I$(INST_LIB)" "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" '," $vmsplfile $vmsfile "; + } } join "", @m; } *************** *** 2188,2194 **** } ! my($linkcmd,@staticopts,@staticpkgs,$extralist,$targdir,$libperldir); # The front matter of the linkcommand... $linkcmd = join ' ', $Config{'ld'}, --- 2198,2205 ---- } ! my($linkcmd,@optlibs,@staticpkgs,$extralist,$targdir,$libperldir,%libseen); ! local($_); # The front matter of the linkcommand... $linkcmd = join ' ', $Config{'ld'}, *************** *** 2251,2278 **** # (e.g. Intuit::DWIM will precede Intuit, so unresolved # references from [.intuit.dwim]dwim.obj can be found # in [.intuit]intuit.olb). ! for (sort keys %olbs) { next unless $olbs{$_} =~ /\Q$self->{LIB_EXT}\E$/; my($dir) = $self->fixpath($_,1); my($extralibs) = $dir . "extralibs.ld"; my($extopt) = $dir . $olbs{$_}; $extopt =~ s/$self->{LIB_EXT}$/.opt/; if (-f $extralibs ) { open LIST,$extralibs or warn $!,next; ! push @$extra, ; close LIST; } if (-f $extopt) { open OPT,$extopt or die $!; while () { next unless /(?:UNIVERSAL|VECTOR)=boot_([\w_]+)/; ! # ExtUtils::Miniperl expects Unix paths ! (my($pkg) = "$1_$1$self->{LIB_EXT}") =~ s#_*#/#g; push @staticpkgs,$pkg; } - push @staticopts, $extopt; } } $target = "Perl$Config{'exe_ext'}" unless $target; ($shrtarget,$targdir) = fileparse($target); --- 2262,2307 ---- # (e.g. Intuit::DWIM will precede Intuit, so unresolved # references from [.intuit.dwim]dwim.obj can be found # in [.intuit]intuit.olb). ! for (sort { length($a) <=> length($b) } keys %olbs) { next unless $olbs{$_} =~ /\Q$self->{LIB_EXT}\E$/; my($dir) = $self->fixpath($_,1); my($extralibs) = $dir . "extralibs.ld"; my($extopt) = $dir . $olbs{$_}; $extopt =~ s/$self->{LIB_EXT}$/.opt/; + push @optlibs, "$dir$olbs{$_}"; + # Get external libraries this extension will need if (-f $extralibs ) { + my %seenthis; open LIST,$extralibs or warn $!,next; ! while () { ! chomp; ! # Include a library in the link only once, unless it's mentioned ! # multiple times within a single extension's options file, in which ! # case we assume the builder needed to search it again later in the ! # link. ! my $skip = exists($libseen{$_}) && !exists($seenthis{$_}); ! $libseen{$_}++; $seenthis{$_}++; ! next if $skip; ! push @$extra,$_; ! } close LIST; } + # Get full name of extension for ExtUtils::Miniperl if (-f $extopt) { open OPT,$extopt or die $!; while () { next unless /(?:UNIVERSAL|VECTOR)=boot_([\w_]+)/; ! my $pkg = $1; ! $pkg =~ s#__*#::#g; push @staticpkgs,$pkg; } } } + # Place all of the external libraries after all of the Perl extension + # libraries in the final link, in order to maximize the opportunity + # for XS code from multiple extensions to resolve symbols against the + # same external library while only including that library once. + push @optlibs, @$extra; $target = "Perl$Config{'exe_ext'}" unless $target; ($shrtarget,$targdir) = fileparse($target); *************** *** 2281,2291 **** $target = "Perlshr.$Config{'dlext'}" unless $target; $tmp = "[]" unless $tmp; $tmp = $self->fixpath($tmp,1); ! if (@$extra) { ! $extralist = join(' ',@$extra); ! $extralist =~ s/[,\s\n]+/, /g; ! } ! else { $extralist = ''; } if ($libperl) { unless (-f $libperl || -f ($libperl = $self->catfile($Config{'installarchlib'},'CORE',$libperl))) { print STDOUT "Warning: $libperl not found\n"; --- 2310,2320 ---- $target = "Perlshr.$Config{'dlext'}" unless $target; $tmp = "[]" unless $tmp; $tmp = $self->fixpath($tmp,1); ! if (@optlibs) { $extralist = join(' ',@optlibs); } ! else { $extralist = ''; } ! # Let ExtUtils::Liblist find the necessary for us (but skip PerlShr; ! # that's what we're building here). ! push @optlibs, grep { !/PerlShr/i } split +($self->ext())[2]; if ($libperl) { unless (-f $libperl || -f ($libperl = $self->catfile($Config{'installarchlib'},'CORE',$libperl))) { print STDOUT "Warning: $libperl not found\n"; *************** *** 2309,2327 **** MAP_TARGET = ',$self->fixpath($target,0),' MAP_SHRTARGET = ',$self->fixpath($shrtarget,0)," MAP_LINKCMD = $linkcmd ! MAP_PERLINC = ", $perlinc ? map('"$_" ',@{$perlinc}) : '',' ! # We use the linker options files created with each extension, rather than ! #specifying the object files directly on the command line. ! MAP_STATIC = ',@staticopts ? join(' ', @staticopts) : '',' ! MAP_OPTS = ',@staticopts ? ','.join(',', map($_.'/Option', @staticopts)) : ''," MAP_EXTRA = $extralist MAP_LIBPERL = ",$self->fixpath($libperl,0),' '; ! push @m,' ! $(MAP_SHRTARGET) : $(MAP_LIBPERL) $(MAP_STATIC) ',"${libperldir}Perlshr_Attr.Opt",' ! $(MAP_LINKCMD)/Shareable=$(MMS$TARGET) $(MAP_OPTS), $(MAP_EXTRA), $(MAP_LIBPERL) ',"${libperldir}Perlshr_Attr.Opt",' $(MAP_TARGET) : $(MAP_SHRTARGET) ',"${tmp}perlmain\$(OBJ_EXT) ${tmp}PerlShr.Opt",' $(MAP_LINKCMD) ',"${tmp}perlmain\$(OBJ_EXT)",', PerlShr.Opt/Option $(NOECHO) $(SAY) "To install the new ""$(MAP_TARGET)"" binary, say" --- 2338,2359 ---- MAP_TARGET = ',$self->fixpath($target,0),' MAP_SHRTARGET = ',$self->fixpath($shrtarget,0)," MAP_LINKCMD = $linkcmd ! MAP_PERLINC = ", $perlinc ? map('"$_" ',@{$perlinc}) : ''," MAP_EXTRA = $extralist MAP_LIBPERL = ",$self->fixpath($libperl,0),' '; ! push @m,"\n${tmp}Makeaperl.Opt : \$(MAP_EXTRA)\n"; ! foreach (@optlibs) { ! push @m,' $(NOECHO) $(PERL) -e "print q{',$_,'}" >>$(MMS$TARGET)',"\n"; ! } ! push @m,"\n${tmp}PerlShr.Opt :\n\t"; ! push @m,'$(NOECHO) $(PERL) -e "print q{$(MAP_SHRTARGET)}" >$(MMS$TARGET)',"\n"; ! ! push @m,' ! $(MAP_SHRTARGET) : $(MAP_LIBPERL) Makeaperl.Opt ',"${libperldir}Perlshr_Attr.Opt",' ! $(MAP_LINKCMD)/Shareable=$(MMS$TARGET) $(MAP_LIBPERL), Makeaperl.Opt/Option ',"${libperldir}Perlshr_Attr.Opt/Option",' $(MAP_TARGET) : $(MAP_SHRTARGET) ',"${tmp}perlmain\$(OBJ_EXT) ${tmp}PerlShr.Opt",' $(MAP_LINKCMD) ',"${tmp}perlmain\$(OBJ_EXT)",', PerlShr.Opt/Option $(NOECHO) $(SAY) "To install the new ""$(MAP_TARGET)"" binary, say" *************** *** 2329,2341 **** $(NOECHO) $(SAY) "To remove the intermediate files, say $(NOECHO) $(SAY) " $(MMS)$(MMSQUALIFIERS)$(USEMAKEFILE)$(MAKEFILE) map_clean" '; ! push @m,' ! ',"${tmp}perlmain.c",' : $(MAKEFILE) ! $(NOECHO) $(PERL) $(MAP_PERLINC) -e "use ExtUtils::Miniperl; writemain(qw|',@staticpkgs,'|)" >$(MMS$TARGET) ! '; push @m, q[ ! # More from the 255-char line length limit doc_inst_perl : $(NOECHO) $(PERL) -e "print 'Perl binary $(MAP_TARGET)|'" >.MM_tmp $(NOECHO) $(PERL) -e "print 'MAP_STATIC|$(MAP_STATIC)|'" >>.MM_tmp --- 2361,2377 ---- $(NOECHO) $(SAY) "To remove the intermediate files, say $(NOECHO) $(SAY) " $(MMS)$(MMSQUALIFIERS)$(USEMAKEFILE)$(MAKEFILE) map_clean" '; ! push @m,"\n${tmp}perlmain.c : \$(MAKEFILE)\n\t\$(NOECHO) \$(PERL) -e 1 >${tmp}Writemain.tmp\n"; ! push @m, "# More from the 255-char line length limit\n"; ! foreach (@staticpkgs) { ! push @m,' $(NOECHO) $(PERL) -e "print q{',$_,qq[}" >>${tmp}Writemain.tmp\n]; ! } ! push @m,' ! $(NOECHO) $(PERL) $(MAP_PERLINC) -ane "use ExtUtils::Miniperl; writemain(@F)" ',$tmp,'Writemain.tmp >$(MMS$TARGET) ! $(NOECHO) $(RM_F) ',"${tmp}Writemain.tmp\n"; push @m, q[ ! # Still more from the 255-char line length limit doc_inst_perl : $(NOECHO) $(PERL) -e "print 'Perl binary $(MAP_TARGET)|'" >.MM_tmp $(NOECHO) $(PERL) -e "print 'MAP_STATIC|$(MAP_STATIC)|'" >>.MM_tmp *************** *** 2358,2364 **** map_clean : \$(RM_F) ${tmp}perlmain\$(OBJ_EXT) ${tmp}perlmain.c \$(MAKEFILE) ! \$(RM_F) ${tmp}PerlShr.Opt \$(MAP_TARGET) "; join '', @m; --- 2394,2400 ---- map_clean : \$(RM_F) ${tmp}perlmain\$(OBJ_EXT) ${tmp}perlmain.c \$(MAKEFILE) ! \$(RM_F) ${tmp}Makeaperl.Opt ${tmp}PerlShr.Opt \$(MAP_TARGET) "; join '', @m; diff -c 'perl5.005_02/lib/ExtUtils/MM_Win32.pm' 'perl5.005_03/lib/ExtUtils/MM_Win32.pm' Index: ./lib/ExtUtils/MM_Win32.pm *** ./lib/ExtUtils/MM_Win32.pm Wed Aug 5 17:34:20 1998 --- ./lib/ExtUtils/MM_Win32.pm Fri Oct 30 19:02:22 1998 *************** *** 33,38 **** --- 33,39 ---- $GCC = 1 if $Config{'cc'} =~ /^gcc/i; $DMAKE = 1 if $Config{'make'} =~ /^dmake/i; $NMAKE = 1 if $Config{'make'} =~ /^nmake/i; + $PERLMAKE = 1 if $Config{'make'} =~ /^pmake/i; $OBJ = 1 if $Config{'ccflags'} =~ /PERL_OBJECT/i; sub dlsyms { *************** *** 40,45 **** --- 41,47 ---- my($funcs) = $attribs{DL_FUNCS} || $self->{DL_FUNCS} || {}; my($vars) = $attribs{DL_VARS} || $self->{DL_VARS} || []; + my($funclist) = $attribs{FUNCLIST} || $self->{FUNCLIST} || []; my($imports) = $attribs{IMPORTS} || $self->{IMPORTS} || {}; my(@m); (my $boot = $self->{NAME}) =~ s/:/_/g; *************** *** 52,57 **** --- 54,60 ---- -e "Mksymlists('NAME' => '!, $self->{NAME}, q!', 'DLBASE' => '!,$self->{DLBASE}, q!', 'DL_FUNCS' => !,neatvalue($funcs), + q!, 'FUNCLIST' => !,neatvalue($funclist), q!, 'IMPORTS' => !,neatvalue($imports), q!, 'DL_VARS' => !, neatvalue($vars), q!);" !); *************** *** 445,455 **** $(LD) -o $@ -Wl,--base-file -Wl,dll.base $(LDDLFLAGS) }.$ldfrom.q{ $(OTHERLDFLAGS) $(MYEXTLIB) $(PERL_ARCHIVE) $(LDLOADLIBS) dll.exp dlltool --def $(EXPORT_LIST) --base-file dll.base --output-exp dll.exp $(LD) -o $@ $(LDDLFLAGS) }.$ldfrom.q{ $(OTHERLDFLAGS) $(MYEXTLIB) $(PERL_ARCHIVE) $(LDLOADLIBS) dll.exp }); ! } else { ! push(@m, $BORLAND ? ! q{ $(LD) $(LDDLFLAGS) $(OTHERLDFLAGS) }.$ldfrom.q{,$@,,$(PERL_ARCHIVE:s,/,\,) $(LDLOADLIBS:s,/,\,) $(MYEXTLIB:s,/,\,),$(EXPORT_LIST:s,/,\,),$(RESFILES)} : ! q{ $(LD) -out:$@ $(LDDLFLAGS) }.$ldfrom.q{ $(OTHERLDFLAGS) $(MYEXTLIB) $(PERL_ARCHIVE) $(LDLOADLIBS) -def:$(EXPORT_LIST)} ! ); } push @m, ' $(CHMOD) 755 $@ --- 448,465 ---- $(LD) -o $@ -Wl,--base-file -Wl,dll.base $(LDDLFLAGS) }.$ldfrom.q{ $(OTHERLDFLAGS) $(MYEXTLIB) $(PERL_ARCHIVE) $(LDLOADLIBS) dll.exp dlltool --def $(EXPORT_LIST) --base-file dll.base --output-exp dll.exp $(LD) -o $@ $(LDDLFLAGS) }.$ldfrom.q{ $(OTHERLDFLAGS) $(MYEXTLIB) $(PERL_ARCHIVE) $(LDLOADLIBS) dll.exp }); ! } elsif ($BORLAND) { ! push(@m, ! q{ $(LD) $(LDDLFLAGS) $(OTHERLDFLAGS) }.$ldfrom.q{,$@,,} ! .($DMAKE ? q{$(PERL_ARCHIVE:s,/,\,) $(LDLOADLIBS:s,/,\,) } ! .q{$(MYEXTLIB:s,/,\,),$(EXPORT_LIST:s,/,\,)} ! : q{$(subst /,\,$(PERL_ARCHIVE)) $(subst /,\,$(LDLOADLIBS)) } ! .q{$(subst /,\,$(MYEXTLIB)),$(subst /,\,$(EXPORT_LIST))}) ! .q{,$(RESFILES)}); ! } else { # VC ! push(@m, ! q{ $(LD) -out:$@ $(LDDLFLAGS) }.$ldfrom.q{ $(OTHERLDFLAGS) } ! .q{$(MYEXTLIB) $(PERL_ARCHIVE) $(LDLOADLIBS) -def:$(EXPORT_LIST)}); } push @m, ' $(CHMOD) 755 $@ *************** *** 463,469 **** { my ($self) = @_; if($OBJ) { ! if ($self->{CAPI} eq 'TRUE') { return '$(PERL_INC)\perlCAPI$(LIB_EXT)'; } } --- 473,479 ---- { my ($self) = @_; if($OBJ) { ! if ($self->{CAPI}) { return '$(PERL_INC)\perlCAPI$(LIB_EXT)'; } } *************** *** 524,533 **** pm_to_blib: $(TO_INST_PM) }.$self->{NOECHO}.q{$(PERL) "-I$(INST_ARCHLIB)" "-I$(INST_LIB)" \ "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" -MExtUtils::Install \ ! -e "pm_to_blib(qw[ }. ! ($NMAKE ? '<{NOECHO}.q{$(PERL) "-I$(INST_ARCHLIB)" "-I$(INST_LIB)" \ "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" -MExtUtils::Install \ ! -e "pm_to_blib(}. ! ($NMAKE ? 'qw[ < 'TRUE' - # in their Makefile.pl - $CAPI_support = 1; - require ExtUtils::MM_Unix; if ($Is_VMS) { --- 71,76 ---- *************** *** 192,198 **** } else { print "$def\n"; } ! return $ans || $def; } sub eval_in_subdirs { --- 186,192 ---- } else { print "$def\n"; } ! return ($ans ne '') ? $ans : $def; } sub eval_in_subdirs { *************** *** 241,269 **** @Attrib_help = qw/ ! AUTHOR ABSTRACT ABSTRACT_FROM BINARY_LOCATION LICENSE_HREF CAPI ! C CCFLAGS CONFIG CONFIGURE DEFINE DIR DISTNAME DL_FUNCS DL_VARS ! EXE_FILES EXCLUDE_EXT INCLUDE_EXT NO_VC FIRST_MAKEFILE FULLPERL H ! INC INSTALLARCHLIB INSTALLBIN INSTALLDIRS INSTALLMAN1DIR INSTALLMAN3DIR INSTALLPRIVLIB INSTALLSCRIPT INSTALLSITEARCH INSTALLSITELIB INST_ARCHLIB INST_BIN INST_EXE INST_LIB ! INST_MAN1DIR INST_MAN3DIR INST_SCRIPT LDFROM LIBPERL_A LIB LIBS LINKTYPE MAKEAPERL MAKEFILE MAN1PODS MAN3PODS MAP_TARGET MYEXTLIB ! NAME NEEDS_LINKING NOECHO NORECURS OBJECT OPTIMIZE PERL PERLMAINCC PERL_ARCHLIB PERL_LIB PERL_SRC PERM_RW PERM_RWX ! PL_FILES PM PMLIBDIRS PREFIX PREREQ_PM SKIP TYPEMAPS VERSION VERSION_FROM XS XSOPT XSPROTOARG XS_VERSION clean depend dist dynamic_lib linkext macro realclean ! tool_autosplit PPM_INSTALL_SCRIPT PPM_INSTALL_EXEC ! ! IMPORTS ! ! installpm /; ! # IMPORTS is used under OS/2 ! ! # ^^^ installpm is deprecated, will go about Summer 96 # @Overridable is close to @MM_Sections but not identical. The # order is important. Many subroutines declare macros. These --- 235,257 ---- @Attrib_help = qw/ ! AUTHOR ABSTRACT ABSTRACT_FROM BINARY_LOCATION ! C CAPI CCFLAGS CONFIG CONFIGURE DEFINE DIR DISTNAME DL_FUNCS DL_VARS ! EXCLUDE_EXT EXE_FILES FIRST_MAKEFILE FULLPERL FUNCLIST H IMPORTS ! INC INCLUDE_EXT INSTALLARCHLIB INSTALLBIN INSTALLDIRS INSTALLMAN1DIR INSTALLMAN3DIR INSTALLPRIVLIB INSTALLSCRIPT INSTALLSITEARCH INSTALLSITELIB INST_ARCHLIB INST_BIN INST_EXE INST_LIB ! INST_MAN1DIR INST_MAN3DIR INST_SCRIPT LDFROM LIB LIBPERL_A LIBS LINKTYPE MAKEAPERL MAKEFILE MAN1PODS MAN3PODS MAP_TARGET MYEXTLIB ! NAME NEEDS_LINKING NOECHO NORECURS NO_VC OBJECT OPTIMIZE PERL PERLMAINCC PERL_ARCHLIB PERL_LIB PERL_SRC PERM_RW PERM_RWX ! PL_FILES PM PMLIBDIRS PPM_INSTALL_EXEC PPM_INSTALL_SCRIPT PREFIX PREREQ_PM SKIP TYPEMAPS VERSION VERSION_FROM XS XSOPT XSPROTOARG XS_VERSION clean depend dist dynamic_lib linkext macro realclean ! tool_autosplit /; ! # IMPORTS is used under OS/2 and Win32 # @Overridable is close to @MM_Sections but not identical. The # order is important. Many subroutines declare macros. These *************** *** 428,433 **** --- 416,422 ---- } my $newclass = ++$PACKNAME; + local @Parent = @Parent; # Protect against non-local exits { # no strict; print "Blessing Object into class [$newclass]\n" if $Verbose>=2; *************** *** 450,458 **** unless $self->file_name_is_absolute($self->{$key}) || ($^O eq 'VMS' and ($key =~ /PERL$/ && $self->{$key} =~ /^[\w\-\$]+$/)); } ! $self->{PARENT}->{CHILDREN}->{$newclass} = $self if $self->{PARENT}; } else { ! parse_args($self,@ARGV); } $self->{NAME} ||= $self->guess_name; --- 439,455 ---- unless $self->file_name_is_absolute($self->{$key}) || ($^O eq 'VMS' and ($key =~ /PERL$/ && $self->{$key} =~ /^[\w\-\$]+$/)); } ! if ($self->{PARENT}) { ! $self->{PARENT}->{CHILDREN}->{$newclass} = $self; ! if (exists $self->{PARENT}->{CAPI} ! and not exists $self->{CAPI}) ! { ! # inherit, but only if already unspecified ! $self->{CAPI} = $self->{PARENT}->{CAPI}; ! } ! } } else { ! parse_args($self,split(' ', $ENV{PERL_MM_OPT} || ''),@ARGV); } $self->{NAME} ||= $self->guess_name; *************** *** 487,492 **** --- 484,492 ---- $self->init_dirscan(); $self->init_others(); + my($argv) = neatvalue(\@ARGV); + $argv =~ s/^\[/(/; + $argv =~ s/\]$/)/; push @{$self->{RESULT}}, <{NAME} extension to perl. *************** *** 497,502 **** --- 497,504 ---- # # ANY CHANGES MADE HERE WILL BE LOST! # + # MakeMaker ARGV: $argv + # # MakeMaker Parameters: END *************** *** 541,547 **** } push @{$self->{RESULT}}, "\n# End."; - pop @Parent; $self; } --- 543,548 ---- *************** *** 1026,1032 **** $Config{install*} values. Note, that in both cases the tilde expansion is done by MakeMaker, not ! by perl by default, nor by make. Conflicts between parmeters LIB, PREFIX and the various INSTALL* arguments are resolved so that XXX --- 1027,1033 ---- $Config{install*} values. Note, that in both cases the tilde expansion is done by MakeMaker, not ! by perl by default, nor by make. Conflicts between parameters LIB, PREFIX and the various INSTALL* arguments are resolved so that XXX *************** *** 1176,1187 **** The following attributes can be specified as arguments to WriteMakefile() or as NAME=VALUE pairs on the command line: ! =cut ! # The following "=item C" is used by the attrib_help routine ! # likewise the "=back" below. So be careful when changing it! ! =over 2 =item C --- 1177,1209 ---- The following attributes can be specified as arguments to WriteMakefile() or as NAME=VALUE pairs on the command line: ! =over 2 ! =item AUTHOR ! String containing name (and email address) of package author(s). Is used ! in PPD (Perl Package Description) files for PPM (Perl Package Manager). ! ! =item ABSTRACT ! ! One line description of the module. Will be included in PPD file. ! ! =item ABSTRACT_FROM ! ! Name of the file that contains the package description. MakeMaker looks ! for a line in the POD matching /^($package\s-\s)(.*)/. This is typically ! the first line in the "=head1 NAME" section. $2 becomes the abstract. ! ! =item BINARY_LOCATION ! ! Used when creating PPD files for binary packages. It can be set to a ! full or relative path or URL to the binary archive for a particular ! architecture. For example: ! ! perl Makefile.PL BINARY_LOCATION=x86/Agent.tar.gz ! ! builds a PPD package that references a binary of the C package, ! located in the C directory relative to the PPD itself. =item C *************** *** 1189,1194 **** --- 1211,1224 ---- and the values portion of the XS attribute hash. This is not currently used by MakeMaker but may be handy in Makefile.PLs. + =item CAPI + + Switch to force usage of the Perl C API even when compiling for PERL_OBJECT. + + Note that this attribute is passed through to any recursive build, + but if and only if the submodule's Makefile.PL itself makes no mention + of the 'CAPI' attribute. + =item CCFLAGS String that will be included in the compiler call command line between *************** *** 1237,1248 **** =item DL_FUNCS ! Hashref of symbol names for routines to be made available as ! universal symbols. Each key/value pair consists of the package name ! and an array of routine names in that package. Used only under AIX ! (export lists) and VMS (linker options) at present. The routine ! names supplied will be expanded in the same way as XSUB names are ! expanded by the XS() macro. Defaults to {"$(NAME)" => ["boot_$(NAME)" ] } --- 1267,1278 ---- =item DL_FUNCS ! Hashref of symbol names for routines to be made available as universal ! symbols. Each key/value pair consists of the package name and an ! array of routine names in that package. Used only under AIX, OS/2, ! VMS and Win32 at present. The routine names supplied will be expanded ! in the same way as XSUB names are expanded by the XS() macro. ! Defaults to {"$(NAME)" => ["boot_$(NAME)" ] } *************** *** 1251,1262 **** {"RPC" => [qw( boot_rpcb rpcb_gettime getnetconfigent )], "NetconfigPtr" => [ 'DESTROY'] } =item DL_VARS ! Array of symbol names for variables to be made available as ! universal symbols. Used only under AIX (export lists) and VMS ! (linker options) at present. Defaults to []. (e.g. [ qw( ! Foo_version Foo_numstreams Foo_tree ) ]) =item EXCLUDE_EXT --- 1281,1294 ---- {"RPC" => [qw( boot_rpcb rpcb_gettime getnetconfigent )], "NetconfigPtr" => [ 'DESTROY'] } + Please see the L documentation for more information + about the DL_FUNCS, DL_VARS and FUNCLIST attributes. + =item DL_VARS ! Array of symbol names for variables to be made available as universal symbols. ! Used only under AIX, OS/2, VMS and Win32 at present. Defaults to []. ! (e.g. [ qw(Foo_version Foo_numstreams Foo_tree ) ]) =item EXCLUDE_EXT *************** *** 1265,1271 **** details. (e.g. [ qw( Socket POSIX ) ] ) This attribute may be most useful when specified as a string on the ! commandline: perl Makefile.PL EXCLUDE_EXT='Socket Safe' =item EXE_FILES --- 1297,1303 ---- details. (e.g. [ qw( Socket POSIX ) ] ) This attribute may be most useful when specified as a string on the ! command line: perl Makefile.PL EXCLUDE_EXT='Socket Safe' =item EXE_FILES *************** *** 1273,1285 **** INST_SCRIPT directory. Make realclean will delete them from there again. - =item NO_VC - - In general any generated Makefile checks for the current version of - MakeMaker and the version the Makefile was built under. If NO_VC is - set, the version check is neglected. Do not write this into your - Makefile.PL, use it interactively instead. - =item FIRST_MAKEFILE The name of the Makefile to be produced. Defaults to the contents of --- 1305,1310 ---- *************** *** 1290,1302 **** Perl binary able to run this extension. =item H Ref to array of *.h file names. Similar to C. =item IMPORTS ! IMPORTS is only used on OS/2. =item INC --- 1315,1335 ---- Perl binary able to run this extension. + =item FUNCLIST + + This provides an alternate means to specify function names to be + exported from the extension. Its value is a reference to an + array of function names to be exported by the extension. These + names are passed through unaltered to the linker options file. + =item H Ref to array of *.h file names. Similar to C. =item IMPORTS ! This attribute is used to specify names to be imported into the ! extension. It is only used on OS/2 and Win32. =item INC *************** *** 1315,1321 **** only DynaLoader and the current extension will be included in the build. This attribute may be most useful when specified as a string on the ! commandline: perl Makefile.PL INCLUDE_EXT='POSIX Socket Devel::Peek' =item INSTALLARCHLIB --- 1348,1354 ---- only DynaLoader and the current extension will be included in the build. This attribute may be most useful when specified as a string on the ! command line: perl Makefile.PL INCLUDE_EXT='POSIX Socket Devel::Peek' =item INSTALLARCHLIB *************** *** 1353,1366 **** Used by 'make install' which copies files from INST_SCRIPT to this directory. ! =item INSTALLSITELIB ! Used by 'make install', which copies files from INST_LIB to this directory if INSTALLDIRS is set to site (default). ! =item INSTALLSITEARCH ! Used by 'make install', which copies files from INST_ARCHLIB to this directory if INSTALLDIRS is set to site (default). =item INST_ARCHLIB --- 1386,1399 ---- Used by 'make install' which copies files from INST_SCRIPT to this directory. ! =item INSTALLSITEARCH ! Used by 'make install', which copies files from INST_ARCHLIB to this directory if INSTALLDIRS is set to site (default). ! =item INSTALLSITELIB ! Used by 'make install', which copies files from INST_LIB to this directory if INSTALLDIRS is set to site (default). =item INST_ARCHLIB *************** *** 1403,1418 **** what files to link/load from (also see dynamic_lib below for how to specify ld flags) - =item LIBPERL_A - - The filename of the perllibrary that will be used together with this - extension. Defaults to libperl.a. - =item LIB LIB can only be set at C time. It has the effect of setting both INSTALLPRIVLIB and INSTALLSITELIB to that value regardless any =item LIBS An anonymous array of alternative library --- 1436,1451 ---- what files to link/load from (also see dynamic_lib below for how to specify ld flags) =item LIB LIB can only be set at C time. It has the effect of setting both INSTALLPRIVLIB and INSTALLSITELIB to that value regardless any + =item LIBPERL_A + + The filename of the perllibrary that will be used together with this + extension. Defaults to libperl.a. + =item LIBS An anonymous array of alternative library *************** *** 1497,1502 **** --- 1530,1542 ---- Boolean. Attribute to inhibit descending into subdirectories. + =item NO_VC + + In general any generated Makefile checks for the current version of + MakeMaker and the version the Makefile was built under. If NO_VC is + set, the version check is neglected. Do not write this into your + Makefile.PL, use it interactively instead. + =item OBJECT List of object files, defaults to '$(BASEEXT)$(OBJ_EXT)', but can be a long *************** *** 1532,1538 **** =item PERM_RW ! Desired Permission for read/writable files. Defaults to C<644>. See also L. =item PERM_RWX --- 1572,1578 ---- =item PERM_RW ! Desired permission for read/writable files. Defaults to C<644>. See also L. =item PERM_RWX *************** *** 1549,1555 **** {'foobar.PL' => 'foobar'} The *.PL files are expected to produce output to the target files ! themselves. =item PM --- 1589,1599 ---- {'foobar.PL' => 'foobar'} The *.PL files are expected to produce output to the target files ! themselves. If multiple files can be generated from the same *.PL ! file then the value in the hash can be a reference to an array of ! target file names. E.g. ! ! {'foobar.PL' => ['foobar1','foobar2']} =item PM *************** *** 1569,1574 **** --- 1613,1627 ---- library. A libscan() method can be used to alter the behaviour. Defining PM in the Makefile.PL will override PMLIBDIRS. + =item PPM_INSTALL_EXEC + + Name of the executable used to run C below. (e.g. perl) + + =item PPM_INSTALL_SCRIPT + + Name of the script that gets executed by the Perl Package Manager after + the installation of a package. + =item PREFIX Can be used to set the three INSTALL* attributes in one go (except for *************** *** 1703,1712 **** {ARMAYBE => 'ar', OTHERLDFLAGS => '...', INST_DYNAMIC_DEP => '...'} - =item installpm - - Deprecated as of MakeMaker 5.23. See L. - =item linkext {LINKTYPE => 'static', 'dynamic' or ''} --- 1756,1761 ---- *************** *** 1733,1744 **** =back - =cut - - # bug in pod2html, so leave the =back - - # Don't delete this cut, MM depends on it! - =head2 Overriding MakeMaker Methods If you cannot achieve the desired Makefile behaviour by specifying --- 1782,1787 ---- *************** *** 1916,1921 **** --- 1959,1976 ---- dependency in a CPAN::Bundle, but the functionality is supported by different means on the current architecture). + =head1 ENVIRONMENT + + =over 8 + + =item PERL_MM_OPT + + Command line options used by Cnew()>, and thus by + C. The string is split on whitespace, and the result + is processed before any actual command line arguments are processed. + + =back + =head1 SEE ALSO ExtUtils::MM_Unix, ExtUtils::Manifest, ExtUtils::testlib, *************** *** 1925,1931 **** Andy Dougherty >, Andreas KEnig >, Tim Bunce >. ! VMS support by Charles Bailey >. OS/2 support by Ilya Zakharevich >. Contact the makemaker mailing list C, if you have any questions. --- 1980,1986 ---- Andy Dougherty >, Andreas KEnig >, Tim Bunce >. ! VMS support by Charles Bailey >. OS/2 support by Ilya Zakharevich >. Contact the makemaker mailing list C, if you have any questions. diff -c 'perl5.005_02/lib/ExtUtils/Manifest.pm' 'perl5.005_03/lib/ExtUtils/Manifest.pm' Index: ./lib/ExtUtils/Manifest.pm *** ./lib/ExtUtils/Manifest.pm Thu Jul 23 23:00:40 1998 --- ./lib/ExtUtils/Manifest.pm Tue Jan 5 20:17:54 1999 *************** *** 298,304 **** includes any comments that are found in the existing C file in the new one. Anything between white space and an end of line within a C file is considered to be a comment. Filenames and ! comments are seperated by one or more TAB characters in the output. All files that match any regular expression in a file C (if such a file exists) are ignored. --- 298,304 ---- includes any comments that are found in the existing C file in the new one. Anything between white space and an end of line within a C file is considered to be a comment. Filenames and ! comments are separated by one or more TAB characters in the output. All files that match any regular expression in a file C (if such a file exists) are ignored. *************** *** 317,323 **** Skipcheck() lists all the files that are skipped due to your C file. ! Manifind() retruns a hash reference. The keys of the hash are the files found below the current directory. Maniread($file) reads a named C file (defaults to --- 317,323 ---- Skipcheck() lists all the files that are skipped due to your C file. ! Manifind() returns a hash reference. The keys of the hash are the files found below the current directory. Maniread($file) reads a named C file (defaults to diff -c 'perl5.005_02/lib/ExtUtils/Mkbootstrap.pm' 'perl5.005_03/lib/ExtUtils/Mkbootstrap.pm' Index: ./lib/ExtUtils/Mkbootstrap.pm *** ./lib/ExtUtils/Mkbootstrap.pm Thu Jul 23 23:00:40 1998 --- ./lib/ExtUtils/Mkbootstrap.pm Fri Oct 30 19:04:47 1998 *************** *** 1,6 **** package ExtUtils::Mkbootstrap; ! $VERSION = substr q$Revision: 1.13 $, 10; # $Date: 1996/09/03 17:04:43 $ use Config; --- 1,6 ---- package ExtUtils::Mkbootstrap; ! $VERSION = substr q$Revision: 1.14 $, 10; # $Date: 1996/09/03 17:04:43 $ use Config; *************** *** 49,55 **** print BS "# $baseext DynaLoader bootstrap file for $^O architecture.\n"; print BS "# Do not edit this file, changes will be lost.\n"; print BS "# This file was automatically generated by the\n"; ! print BS "# Mkbootstrap routine in ExtUtils::Mkbootstrap (v$Version).\n"; print BS "\@DynaLoader::dl_resolve_using = "; # If @all contains names in the form -lxxx or -Lxxx then it's asking for # runtime library location so we automatically add a call to dl_findfile() --- 49,55 ---- print BS "# $baseext DynaLoader bootstrap file for $^O architecture.\n"; print BS "# Do not edit this file, changes will be lost.\n"; print BS "# This file was automatically generated by the\n"; ! print BS "# Mkbootstrap routine in ExtUtils::Mkbootstrap (v$VERSION).\n"; print BS "\@DynaLoader::dl_resolve_using = "; # If @all contains names in the form -lxxx or -Lxxx then it's asking for # runtime library location so we automatically add a call to dl_findfile() diff -c 'perl5.005_02/lib/ExtUtils/Mksymlists.pm' 'perl5.005_03/lib/ExtUtils/Mksymlists.pm' Index: ./lib/ExtUtils/Mksymlists.pm *** ./lib/ExtUtils/Mksymlists.pm Thu Jul 23 23:00:41 1998 --- ./lib/ExtUtils/Mksymlists.pm Tue Jan 5 20:17:55 1999 *************** *** 19,28 **** $spec{DL_VARS} = [] unless $spec{DL_VARS}; ($spec{FILE} = $spec{NAME}) =~ s/.*::// unless $spec{FILE}; $spec{DL_FUNCS} = { $spec{NAME} => [] } unless ( ($spec{DL_FUNCS} and keys %{$spec{DL_FUNCS}}) or ! $spec{FUNCLIST}); ! $spec{FUNCLIST} = [] unless $spec{FUNCLIST}; if (defined $spec{DL_FUNCS}) { my($package); foreach $package (keys %{$spec{DL_FUNCS}}) { --- 19,28 ---- $spec{DL_VARS} = [] unless $spec{DL_VARS}; ($spec{FILE} = $spec{NAME}) =~ s/.*::// unless $spec{FILE}; + $spec{FUNCLIST} = [] unless $spec{FUNCLIST}; $spec{DL_FUNCS} = { $spec{NAME} => [] } unless ( ($spec{DL_FUNCS} and keys %{$spec{DL_FUNCS}}) or ! @{$spec{FUNCLIST}}); if (defined $spec{DL_FUNCS}) { my($package); foreach $package (keys %{$spec{DL_FUNCS}}) { *************** *** 89,98 **** print DEF join("\n ",@{$data->{FUNCLIST}}, "\n") if @{$data->{FUNCLIST}}; if (%{$data->{IMPORTS}}) { print DEF "IMPORTS\n"; ! my ($name, $exp); ! while (($name, $exp)= each %{$data->{IMPORTS}}) { ! print DEF " $name=$exp\n"; ! } } close DEF; } --- 89,98 ---- print DEF join("\n ",@{$data->{FUNCLIST}}, "\n") if @{$data->{FUNCLIST}}; if (%{$data->{IMPORTS}}) { print DEF "IMPORTS\n"; ! my ($name, $exp); ! while (($name, $exp)= each %{$data->{IMPORTS}}) { ! print DEF " $name=$exp\n"; ! } } close DEF; } *************** *** 207,216 **** =over ! =item NAME ! This gives the name of the extension (I Tk::Canvas) for which ! the linker option file will be produced. =item DL_FUNCS --- 207,219 ---- =over ! =item DLBASE ! This item specifies the name by which the linker knows the ! extension, which may be different from the name of the ! extension itself (for instance, some linkers add an '_' to the ! name of the extension). If it is not specified, it is derived ! from the NAME attribute. It is presently used only by OS2 and Win32. =item DL_FUNCS *************** *** 219,225 **** associative array, in which each key is the name of a package, and each value is an a reference to an array of function names which should be exported by the extension. For instance, one might say ! C { Homer::Iliad =E [ qw(trojans greeks) ], Homer::Odyssey =E [ qw(travellers family suitors) ] }>. The function names should be identical to those in the XSUB code; C will alter the names written to the linker option --- 222,228 ---- associative array, in which each key is the name of a package, and each value is an a reference to an array of function names which should be exported by the extension. For instance, one might say ! C { Homer::Iliad =E [ qw(trojans greeks) ], Homer::Odyssey =E [ qw(travellers family suitors) ] }>. The function names should be identical to those in the XSUB code; C will alter the names written to the linker option *************** *** 243,249 **** This key can be used to specify the name of the linker option file (minus the OS-specific extension), if for some reason you do not want to use the default value, which is the last word of the NAME ! attribute (I for Tk::Canvas, FILE defaults to 'Canvas'). =item FUNCLIST --- 246,252 ---- This key can be used to specify the name of the linker option file (minus the OS-specific extension), if for some reason you do not want to use the default value, which is the last word of the NAME ! attribute (I for C, FILE defaults to C). =item FUNCLIST *************** *** 251,264 **** exported from the extension. Its value is a reference to an array of function names to be exported by the extension. These names are passed through unaltered to the linker options file. ! =item DLBASE ! This item specifies the name by which the linker knows the ! extension, which may be different from the name of the ! extension itself (for instance, some linkers add an '_' to the ! name of the extension). If it is not specified, it is derived ! from the NAME attribute. It is presently used only by OS2. =back --- 254,278 ---- exported from the extension. Its value is a reference to an array of function names to be exported by the extension. These names are passed through unaltered to the linker options file. + Specifying a value for the FUNCLIST attribute suppresses automatic + generation of the bootstrap function for the package. To still create + the bootstrap name you have to specify the package name in the + DL_FUNCS hash: ! Mksymlists({ NAME => $name , ! FUNCLIST => [ $func1, $func2 ], ! DL_FUNCS => { $pkg => [] } }); ! ! =item IMPORTS ! ! This attribute is used to specify names to be imported into the ! extension. It is currently only used by OS/2 and Win32. ! ! =item NAME ! ! This gives the name of the extension (I C) for which ! the linker option file will be produced. =back *************** *** 269,275 **** =head1 AUTHOR ! Charles Bailey Ibailey@genetics.upenn.eduE> =head1 REVISION --- 283,289 ---- =head1 AUTHOR ! Charles Bailey Ibailey@newman.upenn.eduE> =head1 REVISION diff -c 'perl5.005_02/lib/ExtUtils/typemap' 'perl5.005_03/lib/ExtUtils/typemap' Index: ./lib/ExtUtils/typemap *** ./lib/ExtUtils/typemap Thu Jul 23 23:00:41 1998 --- ./lib/ExtUtils/typemap Thu Nov 26 17:51:57 1998 *************** *** 1,12 **** # $Header$ # basic C types int T_IV ! unsigned T_IV ! unsigned int T_IV long T_IV ! unsigned long T_IV short T_IV ! unsigned short T_IV char T_CHAR unsigned char T_U_CHAR char * T_PV --- 1,12 ---- # $Header$ # basic C types int T_IV ! unsigned T_UV ! unsigned int T_UV long T_IV ! unsigned long T_UV short T_IV ! unsigned short T_UV char T_CHAR unsigned char T_U_CHAR char * T_PV *************** *** 34,40 **** I8 T_IV U32 T_U_LONG U16 T_U_SHORT ! U8 T_IV Result T_U_CHAR Boolean T_IV double T_DOUBLE --- 34,40 ---- I8 T_IV U32 T_U_LONG U16 T_U_SHORT ! U8 T_UV Result T_U_CHAR Boolean T_IV double T_DOUBLE *************** *** 73,78 **** --- 73,80 ---- croak(\"$var is not of type ${ntype}\") T_SYSRET $var NOT IMPLEMENTED + T_UV + $var = ($type)SvUV($arg) T_IV $var = ($type)SvIV($arg) T_INT *************** *** 82,100 **** T_BOOL $var = (int)SvIV($arg) T_U_INT ! $var = (unsigned int)SvIV($arg) T_SHORT $var = (short)SvIV($arg) T_U_SHORT ! $var = (unsigned short)SvIV($arg) T_LONG $var = (long)SvIV($arg) T_U_LONG ! $var = (unsigned long)SvIV($arg) T_CHAR $var = (char)*SvPV($arg,PL_na) T_U_CHAR ! $var = (unsigned char)SvIV($arg) T_FLOAT $var = (float)SvNV($arg) T_NV --- 84,102 ---- T_BOOL $var = (int)SvIV($arg) T_U_INT ! $var = (unsigned int)SvUV($arg) T_SHORT $var = (short)SvIV($arg) T_U_SHORT ! $var = (unsigned short)SvUV($arg) T_LONG $var = (long)SvIV($arg) T_U_LONG ! $var = (unsigned long)SvUV($arg) T_CHAR $var = (char)*SvPV($arg,PL_na) T_U_CHAR ! $var = (unsigned char)SvUV($arg) T_FLOAT $var = (float)SvNV($arg) T_NV *************** *** 191,196 **** --- 193,200 ---- $arg = newRV((SV*)$var); T_IV sv_setiv($arg, (IV)$var); + T_UV + sv_setuv($arg, (UV)$var); T_INT sv_setiv($arg, (IV)$var); T_SYSRET *************** *** 205,223 **** T_BOOL $arg = boolSV($var); T_U_INT ! sv_setiv($arg, (IV)$var); T_SHORT sv_setiv($arg, (IV)$var); T_U_SHORT ! sv_setiv($arg, (IV)$var); T_LONG sv_setiv($arg, (IV)$var); T_U_LONG ! sv_setiv($arg, (IV)$var); T_CHAR sv_setpvn($arg, (char *)&$var, 1); T_U_CHAR ! sv_setiv($arg, (IV)$var); T_FLOAT sv_setnv($arg, (double)$var); T_NV --- 209,227 ---- T_BOOL $arg = boolSV($var); T_U_INT ! sv_setuv($arg, (UV)$var); T_SHORT sv_setiv($arg, (IV)$var); T_U_SHORT ! sv_setuv($arg, (UV)$var); T_LONG sv_setiv($arg, (IV)$var); T_U_LONG ! sv_setuv($arg, (UV)$var); T_CHAR sv_setpvn($arg, (char *)&$var, 1); T_U_CHAR ! sv_setuv($arg, (UV)$var); T_FLOAT sv_setnv($arg, (double)$var); T_NV diff -c 'perl5.005_02/lib/ExtUtils/xsubpp' 'perl5.005_03/lib/ExtUtils/xsubpp' Index: ./lib/ExtUtils/xsubpp *** ./lib/ExtUtils/xsubpp Thu Jul 23 23:00:42 1998 --- ./lib/ExtUtils/xsubpp Fri Oct 30 19:15:50 1998 *************** *** 776,782 **** /^MODULE\s*=\s*([\w:]+)(?:\s+PACKAGE\s*=\s*([\w:]+))?(?:\s+PREFIX\s*=\s*(\S+))?\s*$/; if ($OBJ) { ! s/#if(?:def|\s+defined)\s+(\(__cplusplus\)|__cplusplus)/#if defined(__cplusplus) && !defined(PERL_OBJECT)/; } print $_; } --- 776,782 ---- /^MODULE\s*=\s*([\w:]+)(?:\s+PACKAGE\s*=\s*([\w:]+))?(?:\s+PREFIX\s*=\s*(\S+))?\s*$/; if ($OBJ) { ! s/#if(?:def\s|\s+defined)\s*(\(__cplusplus\)|__cplusplus)/#if defined(__cplusplus) && !defined(PERL_OBJECT)/; } print $_; } *************** *** 1254,1283 **** } # print initialization routine ! if ($WantCAPI) { print Q<<"EOF"; - # ##ifdef __cplusplus #extern "C" ##endif #XS(boot__CAPI_entry) ! #[[ ! # dXSARGS; ! # char* file = __FILE__; ! # EOF ! } else { print Q<<"EOF"; - ##ifdef __cplusplus - #extern "C" - ##endif #XS(boot_$Module_cname) #[[ # dXSARGS; # char* file = __FILE__; # EOF - } print Q<<"EOF" if $WantVersionChk ; # XS_VERSION_BOOTCHECK ; --- 1254,1290 ---- } # print initialization routine ! print Q<<"EOF"; ##ifdef __cplusplus #extern "C" ##endif + EOF + + if ($WantCAPI) { + print Q<<"EOF"; + ##ifdef PERL_CAPI #XS(boot__CAPI_entry) ! ##else EOF ! } ! print Q<<"EOF"; #XS(boot_$Module_cname) + EOF + + if ($WantCAPI) { + print Q<<"EOF"; + ##endif /* PERL_CAPI */ + EOF + } + + print Q<<"EOF"; #[[ # dXSARGS; # char* file = __FILE__; # EOF print Q<<"EOF" if $WantVersionChk ; # XS_VERSION_BOOTCHECK ; *************** *** 1312,1318 **** if ($WantCAPI) { print Q<<"EOF"; ! # ##define XSCAPI(name) void name(CV* cv, void* pPerl) # ##ifdef __cplusplus --- 1319,1325 ---- if ($WantCAPI) { print Q<<"EOF"; ! ##ifdef PERL_CAPI ##define XSCAPI(name) void name(CV* cv, void* pPerl) # ##ifdef __cplusplus *************** *** 1323,1329 **** # SetCPerlObj(pPerl); # boot__CAPI_entry(cv); #]] ! # EOF } --- 1330,1336 ---- # SetCPerlObj(pPerl); # boot__CAPI_entry(cv); #]] ! ##endif /* PERL_CAPI */ EOF } diff -c 'perl5.005_02/lib/Fatal.pm' 'perl5.005_03/lib/Fatal.pm' Index: ./lib/Fatal.pm *** ./lib/Fatal.pm Thu Jul 23 23:00:42 1998 --- ./lib/Fatal.pm Thu Mar 4 18:34:20 1999 *************** *** 111,121 **** $code .= write_invocation($core, $call, $name, @protos); $code .= "}\n"; print $code if $Debug; ! $code = eval($code); ! die if $@; ! local($^W) = 0; # to avoid: Subroutine foo redefined ... ! no strict 'refs'; # to avoid: Can't use string (...) as a symbol ref ... ! *{$sub} = $code; } 1; --- 111,123 ---- $code .= write_invocation($core, $call, $name, @protos); $code .= "}\n"; print $code if $Debug; ! { ! no strict 'refs'; # to avoid: Can't use string (...) as a symbol ref ... ! $code = eval("package $pkg; use Carp; $code"); ! die if $@; ! local($^W) = 0; # to avoid: Subroutine foo redefined ... ! *{$sub} = $code; ! } } 1; diff -c 'perl5.005_02/lib/File/Copy.pm' 'perl5.005_03/lib/File/Copy.pm' Index: ./lib/File/Copy.pm *** ./lib/File/Copy.pm Thu Jul 23 23:00:43 1998 --- ./lib/File/Copy.pm Wed Jan 6 22:41:53 1999 *************** *** 235,241 **** files as handles instead of names may lead to loss of information on some operating systems; it is recommended that you use file names whenever possible.> Files are opened in binary mode where ! applicable. To get a consistent behavour when copying from a filehandle to a file, use C on the filehandle. An optional third parameter can be used to specify the buffer --- 235,241 ---- files as handles instead of names may lead to loss of information on some operating systems; it is recommended that you use file names whenever possible.> Files are opened in binary mode where ! applicable. To get a consistent behaviour when copying from a filehandle to a file, use C on the filehandle. An optional third parameter can be used to specify the buffer *************** *** 274,280 **** routine (see below). For OS/2 systems, this calls the C XSUB directly. ! =head2 Special behavior if C is defined (VMS and OS/2) If both arguments to C are not file handles, then C will perform a "system copy" of --- 274,280 ---- routine (see below). For OS/2 systems, this calls the C XSUB directly. ! =head2 Special behaviour if C is defined (VMS and OS/2) If both arguments to C are not file handles, then C will perform a "system copy" of *************** *** 336,342 **** =head1 AUTHOR File::Copy was written by Aaron Sherman Iajs@ajs.comE> in 1995, ! and updated by Charles Bailey Ibailey@genetics.upenn.eduE> in 1996. =cut --- 336,342 ---- =head1 AUTHOR File::Copy was written by Aaron Sherman Iajs@ajs.comE> in 1995, ! and updated by Charles Bailey Ibailey@newman.upenn.eduE> in 1996. =cut diff -c 'perl5.005_02/lib/File/Find.pm' 'perl5.005_03/lib/File/Find.pm' Index: ./lib/File/Find.pm *** ./lib/File/Find.pm Thu Jul 23 23:00:43 1998 --- ./lib/File/Find.pm Sat Oct 31 20:55:13 1998 *************** *** 22,31 **** =head1 DESCRIPTION The first argument to find() is either a hash reference describing the ! operations to be performed for each file, or a code reference. If it ! is a hash reference, then the value for the key C should be a ! code reference. This code reference is called I below. Currently the only other supported key for the above hash is C, in presense of which the walk over directories is --- 22,31 ---- =head1 DESCRIPTION The first argument to find() is either a hash reference describing the ! operations to be performed for each file, a code reference, or a string ! that contains a subroutine name. If it is a hash reference, then the ! value for the key C should be a code reference. This code ! reference is called I below. Currently the only other supported key for the above hash is C, in presense of which the walk over directories is *************** *** 177,182 **** --- 177,184 ---- --$subcount; next if $prune; + # Untaint $_, so that we can do a chdir + $_ = $1 if /^(.*)/; if (chdir $_) { $name =~ s/\.dir$// if $Is_VMS; &finddir($wanted,$name,$nlink, $bydepth); *************** *** 194,200 **** sub wrap_wanted { my $wanted = shift; ! defined &$wanted ? {wanted => $wanted} : $wanted; } sub find { --- 196,202 ---- sub wrap_wanted { my $wanted = shift; ! ref($wanted) eq 'HASH' ? $wanted : { wanted => $wanted }; } sub find { diff -c 'perl5.005_02/lib/File/Path.pm' 'perl5.005_03/lib/File/Path.pm' Index: ./lib/File/Path.pm *** ./lib/File/Path.pm Thu Jul 23 23:00:43 1998 --- ./lib/File/Path.pm Sun Oct 25 13:31:38 1998 *************** *** 88,94 **** =head1 AUTHORS Tim Bunce > and ! Charles Bailey > =head1 REVISION --- 88,94 ---- =head1 AUTHORS Tim Bunce > and ! Charles Bailey > =head1 REVISION *************** *** 135,142 **** } print "mkdir $path\n" if $verbose; unless (mkdir($path,$mode)) { ! # allow for another process to have created it meanwhile ! croak "mkdir $path: $!" unless -d $path; } push(@created, $path); } --- 135,143 ---- } print "mkdir $path\n" if $verbose; unless (mkdir($path,$mode)) { ! my $e = $!; ! # allow for another process to have created it meanwhile ! croak "mkdir $path: $e" unless -d $path; } push(@created, $path); } diff -c 'perl5.005_02/lib/File/Spec.pm' 'perl5.005_03/lib/File/Spec.pm' Index: ./lib/File/Spec.pm *** ./lib/File/Spec.pm Thu Jul 23 23:00:43 1998 --- ./lib/File/Spec.pm Wed Jan 6 22:41:53 1999 *************** *** 91,97 **** File::Spec->catfile('a','b'); ! For a reference of available functions, pleaes consult L, which contains the entire set, and inherited by the modules for other platforms. For further information, please see L, L, L, or L. --- 91,97 ---- File::Spec->catfile('a','b'); ! For a reference of available functions, please consult L, which contains the entire set, and inherited by the modules for other platforms. For further information, please see L, L, L, or L. *************** *** 106,112 **** Kenneth Albanowski >, Andy Dougherty >, Andreas KEnig >, Tim Bunce >. VMS ! support by Charles Bailey >. OS/2 support by Ilya Zakharevich >. Mac support by Paul Schinder >. --- 106,112 ---- Kenneth Albanowski >, Andy Dougherty >, Andreas KEnig >, Tim Bunce >. VMS ! support by Charles Bailey >. OS/2 support by Ilya Zakharevich >. Mac support by Paul Schinder >. diff -c 'perl5.005_02/lib/File/Spec/Mac.pm' 'perl5.005_03/lib/File/Spec/Mac.pm' Index: ./lib/File/Spec/Mac.pm *** ./lib/File/Spec/Mac.pm Thu Jul 23 23:00:43 1998 --- ./lib/File/Spec/Mac.pm Wed Jan 6 22:41:53 1999 *************** *** 52,58 **** File::Spec->catdir(split(":",$path)) eq $path But because of the nature of Macintosh paths, some additional ! possibilities are allowed to make using this routine give resonable results for some common situations. Here are the rules that are used. Each argument has its trailing ":" removed. Each argument, except the first, has its leading ":" removed. They are then joined together by a ":". --- 52,58 ---- File::Spec->catdir(split(":",$path)) eq $path But because of the nature of Macintosh paths, some additional ! possibilities are allowed to make using this routine give reasonable results for some common situations. Here are the rules that are used. Each argument has its trailing ":" removed. Each argument, except the first, has its leading ":" removed. They are then joined together by a ":". *************** *** 78,84 **** File::Spec->catfile("LWP","Protocol","http.pm") be relative or absolute? There's no way of telling except by checking for the ! existance of LWP: or :LWP, and even there he may mean a dismounted volume or a relative path in a different directory (like in @INC). So those checks aren't done here. This routine will treat this as absolute. --- 78,84 ---- File::Spec->catfile("LWP","Protocol","http.pm") be relative or absolute? There's no way of telling except by checking for the ! existence of LWP: or :LWP, and even there he may mean a dismounted volume or a relative path in a different directory (like in @INC). So those checks aren't done here. This routine will treat this as absolute. diff -c 'perl5.005_02/lib/FindBin.pm' 'perl5.005_03/lib/FindBin.pm' Index: ./lib/FindBin.pm *** ./lib/FindBin.pm Thu Jul 23 23:00:44 1998 --- ./lib/FindBin.pm Thu Jan 21 19:54:12 1999 *************** *** 55,61 **** =head1 AUTHORS ! Graham Barr EFE Nick Ing-Simmons EFE =head1 COPYRIGHT --- 55,64 ---- =head1 AUTHORS ! FindBin is supported as part of the core perl distribution. Please send bug ! reports to EFE using the perlbug program included with perl. ! ! Graham Barr EFE Nick Ing-Simmons EFE =head1 COPYRIGHT *************** *** 64,73 **** This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. - =head1 REVISION - - $Revision: 1.4 $ - =cut package FindBin; --- 67,72 ---- *************** *** 77,107 **** use Cwd qw(getcwd abs_path); use Config; use File::Basename; @EXPORT_OK = qw($Bin $Script $RealBin $RealScript $Dir $RealDir); %EXPORT_TAGS = (ALL => [qw($Bin $Script $RealBin $RealScript $Dir $RealDir)]); @ISA = qw(Exporter); ! $VERSION = $VERSION = sprintf("%d.%02d", q$Revision: 1.41 $ =~ /(\d+)\.(\d+)/); ! ! sub is_abs_path ! { ! local $_ = shift if (@_); ! if ($^O eq 'MSWin32' || $^O eq 'dos') ! { ! return m#^[a-z]:[\\/]#i; ! } ! elsif ($^O eq 'VMS') ! { ! # If it's a logical name, expand it. ! $_ = $ENV{$_} while /^[\w\$\-]+$/ and $ENV{$_}; ! return m!^/! or m![<\[][^.\-\]>]! or /:[^<\[]/; ! } ! else ! { ! return m#^/#; ! } ! } BEGIN { --- 76,88 ---- use Cwd qw(getcwd abs_path); use Config; use File::Basename; + use File::Spec; @EXPORT_OK = qw($Bin $Script $RealBin $RealScript $Dir $RealDir); %EXPORT_TAGS = (ALL => [qw($Bin $Script $RealBin $RealScript $Dir $RealDir)]); @ISA = qw(Exporter); ! $VERSION = $VERSION = "1.42"; BEGIN { *************** *** 131,143 **** && -f $script) { my $dir; ! my $pathvar = 'PATH'; ! ! foreach $dir (split(/$Config{'path_sep'}/,$ENV{$pathvar})) { ! if(-r "$dir/$script" && (!$IsWin32 || -x _)) { ! $script = "$dir/$script"; if (-f $0) { --- 112,123 ---- && -f $script) { my $dir; ! foreach $dir (File::Spec->path) { ! my $scr = File::Spec->catfile($dir, $script); ! if(-r $scr && (!$IsWin32 || -x _)) { ! $script = $scr; if (-f $0) { *************** *** 160,166 **** # Ensure $script contains the complete path incase we C ! $script = getcwd() . "/" . $script unless is_abs_path($script); ($Script,$Bin) = fileparse($script); --- 140,147 ---- # Ensure $script contains the complete path incase we C ! $script = File::Spec->catfile(getcwd(), $script) ! unless File::Spec->file_name_is_absolute($script); ($Script,$Bin) = fileparse($script); *************** *** 172,180 **** ($RealScript,$RealBin) = fileparse($script); last unless defined $linktext; ! $script = (is_abs_path($linktext)) ? $linktext ! : $RealBin . "/" . $linktext; } # Get absolute paths to directories --- 153,161 ---- ($RealScript,$RealBin) = fileparse($script); last unless defined $linktext; ! $script = (File::Spec->file_name_is_absolute($linktext)) ? $linktext ! : File::Spec->catfile($RealBin, $linktext); } # Get absolute paths to directories diff -c 'perl5.005_02/lib/Getopt/Long.pm' 'perl5.005_03/lib/Getopt/Long.pm' Index: ./lib/Getopt/Long.pm Prereq: 2.18 *** ./lib/Getopt/Long.pm Thu Jul 23 23:00:45 1998 --- ./lib/Getopt/Long.pm Sat Jan 23 17:41:48 1999 *************** *** 6,18 **** # Author : Johan Vromans # Created On : Tue Sep 11 15:00:12 1990 # Last Modified By: Johan Vromans ! # Last Modified On: Sun Jun 14 13:17:22 1998 ! # Update Count : 705 # Status : Released ################ Copyright ################ ! # This program is Copyright 1990,1998 by Johan Vromans. # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 --- 6,18 ---- # Author : Johan Vromans # Created On : Tue Sep 11 15:00:12 1990 # Last Modified By: Johan Vromans ! # Last Modified On: Fri Jan 8 14:48:43 1999 ! # Update Count : 707 # Status : Released ################ Copyright ################ ! # This program is Copyright 1990,1999 by Johan Vromans. # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 *************** *** 35,41 **** require 5.004; use Exporter (); use vars qw($VERSION @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS); ! $VERSION = "2.17"; @ISA = qw(Exporter); @EXPORT = qw(&GetOptions $REQUIRE_ORDER $PERMUTE $RETURN_IN_ORDER); --- 35,41 ---- require 5.004; use Exporter (); use vars qw($VERSION @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS); ! $VERSION = "2.19"; @ISA = qw(Exporter); @EXPORT = qw(&GetOptions $REQUIRE_ORDER $PERMUTE $RETURN_IN_ORDER); *************** *** 547,552 **** --- 547,553 ---- # If bundling == 2, long options can override bundles. if ( $bundling == 2 and + defined ($rest) and defined ($type = $opctl->{$tryopt.$rest}) ) { print STDERR ("=> $starter$tryopt rebundled to ", "$starter$tryopt$rest\n") if $debug; *************** *** 1363,1369 **** =head1 COPYRIGHT AND DISCLAIMER ! This program is Copyright 1990,1998 by Johan Vromans. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 --- 1364,1370 ---- =head1 COPYRIGHT AND DISCLAIMER ! This program is Copyright 1990,1999 by Johan Vromans. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 diff -c 'perl5.005_02/lib/Getopt/Std.pm' 'perl5.005_03/lib/Getopt/Std.pm' Index: ./lib/Getopt/Std.pm *** ./lib/Getopt/Std.pm Thu Jul 23 23:00:45 1998 --- ./lib/Getopt/Std.pm Thu Mar 4 18:34:21 1999 *************** *** 42,49 **** @ISA = qw(Exporter); @EXPORT = qw(getopt getopts); ! ! # $RCSfile: getopt.pl,v $$Revision: 4.1 $$Date: 92/08/07 18:23:58 $ # Process single-character switches with switch clustering. Pass one argument # which is a string containing all switches that take an argument. For each --- 42,48 ---- @ISA = qw(Exporter); @EXPORT = qw(getopt getopts); ! $VERSION = $VERSION = '1.01'; # Process single-character switches with switch clustering. Pass one argument # which is a string containing all switches that take an argument. For each *************** *** 145,151 **** } } else { ! print STDERR "Unknown option: $first\n"; ++$errs; if($rest ne '') { $ARGV[0] = "-$rest"; --- 144,150 ---- } } else { ! warn "Unknown option: $first\n"; ++$errs; if($rest ne '') { $ARGV[0] = "-$rest"; diff -c 'perl5.005_02/lib/IPC/Open3.pm' 'perl5.005_03/lib/IPC/Open3.pm' Index: ./lib/IPC/Open3.pm Prereq: 1.1 *** ./lib/IPC/Open3.pm Thu Jul 23 23:00:45 1998 --- ./lib/IPC/Open3.pm Thu Oct 15 21:44:41 1998 *************** *** 2,16 **** use strict; no strict 'refs'; # because users pass me bareword filehandles ! use vars qw($VERSION @ISA @EXPORT $Fh $Me); require 5.001; require Exporter; use Carp; ! use Symbol 'qualify'; ! $VERSION = 1.0102; @ISA = qw(Exporter); @EXPORT = qw(open3); --- 2,16 ---- use strict; no strict 'refs'; # because users pass me bareword filehandles ! use vars qw($VERSION @ISA @EXPORT $Me); require 5.001; require Exporter; use Carp; ! use Symbol qw(gensym qualify); ! $VERSION = 1.0103; @ISA = qw(Exporter); @EXPORT = qw(open3); *************** *** 94,100 **** # rdr or wtr are null # a system call fails - $Fh = 'FHOPEN000'; # package static in case called more than once $Me = 'open3 (bug)'; # you should never see this, it's always localized # Fatal.pm needs to be fixed WRT prototypes. --- 94,99 ---- *************** *** 140,148 **** $dad_rdr = qualify $dad_rdr, $package; $dad_err = qualify $dad_err, $package; ! my $kid_rdr = ++$Fh; ! my $kid_wtr = ++$Fh; ! my $kid_err = ++$Fh; xpipe $kid_rdr, $dad_wtr if !$dup_wtr; xpipe $dad_rdr, $kid_wtr if !$dup_rdr; --- 139,147 ---- $dad_rdr = qualify $dad_rdr, $package; $dad_err = qualify $dad_err, $package; ! my $kid_rdr = gensym; ! my $kid_wtr = gensym; ! my $kid_err = gensym; xpipe $kid_rdr, $dad_wtr if !$dup_wtr; xpipe $dad_rdr, $kid_wtr if !$dup_rdr; *************** *** 154,160 **** # save a copy of her stdout before I put something else there. if ($dad_rdr ne $dad_err && $dup_err && fileno($dad_err) == fileno(STDOUT)) { ! my $tmp = ++$Fh; xopen($tmp, ">&$dad_err"); $dad_err = $tmp; } --- 153,159 ---- # save a copy of her stdout before I put something else there. if ($dad_rdr ne $dad_err && $dup_err && fileno($dad_err) == fileno(STDOUT)) { ! my $tmp = gensym; xopen($tmp, ">&$dad_err"); $dad_err = $tmp; } *************** *** 163,186 **** xopen \*STDIN, "<&$dad_wtr" if fileno(STDIN) != fileno($dad_wtr); } else { xclose $dad_wtr; ! xopen \*STDIN, "<&$kid_rdr"; ! xclose $kid_rdr; } if ($dup_rdr) { xopen \*STDOUT, ">&$dad_rdr" if fileno(STDOUT) != fileno($dad_rdr); } else { xclose $dad_rdr; ! xopen \*STDOUT, ">&$kid_wtr"; ! xclose $kid_wtr; } if ($dad_rdr ne $dad_err) { if ($dup_err) { ! xopen \*STDERR, ">&$dad_err" if fileno(STDERR) != fileno($dad_err); } else { xclose $dad_err; ! xopen \*STDERR, ">&$kid_err"; ! xclose $kid_err; } } else { xopen \*STDERR, ">&STDOUT" if fileno(STDERR) != fileno(STDOUT); --- 162,185 ---- xopen \*STDIN, "<&$dad_wtr" if fileno(STDIN) != fileno($dad_wtr); } else { xclose $dad_wtr; ! xopen \*STDIN, "<&=" . fileno $kid_rdr; } if ($dup_rdr) { xopen \*STDOUT, ">&$dad_rdr" if fileno(STDOUT) != fileno($dad_rdr); } else { xclose $dad_rdr; ! xopen \*STDOUT, ">&=" . fileno $kid_wtr; } if ($dad_rdr ne $dad_err) { if ($dup_err) { ! # I have to use a fileno here because in this one case ! # I'm doing a dup but the filehandle might be a reference ! # (from the special case above). ! xopen \*STDERR, ">&" . fileno $dad_err if fileno(STDERR) != fileno($dad_err); } else { xclose $dad_err; ! xopen \*STDERR, ">&=" . fileno $kid_err; } } else { xopen \*STDERR, ">&STDOUT" if fileno(STDERR) != fileno(STDOUT); *************** *** 194,216 **** my @close; if ($dup_wtr) { ! $kid_rdr = $dad_wtr; ! push @close, \*{$kid_rdr}; } else { ! push @close, \*{$dad_wtr}, \*{$kid_rdr}; } if ($dup_rdr) { ! $kid_wtr = $dad_rdr; ! push @close, \*{$kid_wtr}; } else { ! push @close, \*{$dad_rdr}, \*{$kid_wtr}; } if ($dad_rdr ne $dad_err) { if ($dup_err) { ! $kid_err = $dad_err ; ! push @close, \*{$kid_err}; } else { ! push @close, \*{$dad_err}, \*{$kid_err}; } } else { $kid_err = $kid_wtr; --- 193,215 ---- my @close; if ($dup_wtr) { ! $kid_rdr = \*{$dad_wtr}; ! push @close, $kid_rdr; } else { ! push @close, \*{$dad_wtr}, $kid_rdr; } if ($dup_rdr) { ! $kid_wtr = \*{$dad_rdr}; ! push @close, $kid_wtr; } else { ! push @close, \*{$dad_rdr}, $kid_wtr; } if ($dad_rdr ne $dad_err) { if ($dup_err) { ! $kid_err = \*{$dad_err}; ! push @close, $kid_err; } else { ! push @close, \*{$dad_err}, $kid_err; } } else { $kid_err = $kid_wtr; *************** *** 218,230 **** require IO::Pipe; $kidpid = eval { spawn_with_handles( [ { mode => 'r', ! open_as => \*{$kid_rdr}, handle => \*STDIN }, { mode => 'w', ! open_as => \*{$kid_wtr}, handle => \*STDOUT }, { mode => 'w', ! open_as => \*{$kid_err}, handle => \*STDERR }, ], \@close, @cmd); }; --- 217,229 ---- require IO::Pipe; $kidpid = eval { spawn_with_handles( [ { mode => 'r', ! open_as => $kid_rdr, handle => \*STDIN }, { mode => 'w', ! open_as => $kid_wtr, handle => \*STDOUT }, { mode => 'w', ! open_as => $kid_err, handle => \*STDERR }, ], \@close, @cmd); }; diff -c 'perl5.005_02/lib/Math/BigFloat.pm' 'perl5.005_03/lib/Math/BigFloat.pm' Index: ./lib/Math/BigFloat.pm *** ./lib/Math/BigFloat.pm Thu Jul 23 23:00:45 1998 --- ./lib/Math/BigFloat.pm Wed Jan 6 22:41:53 1999 *************** *** 301,307 **** =item number format canonical strings have the form /[+-]\d+E[+-]\d+/ . Input values can ! have inbedded whitespace. =item Error returns 'NaN' --- 301,307 ---- =item number format canonical strings have the form /[+-]\d+E[+-]\d+/ . Input values can ! have imbedded whitespace. =item Error returns 'NaN' diff -c 'perl5.005_02/lib/Math/BigInt.pm' 'perl5.005_03/lib/Math/BigInt.pm' Index: ./lib/Math/BigInt.pm *** ./lib/Math/BigInt.pm Sat Jul 25 21:08:46 1998 --- ./lib/Math/BigInt.pm Wed Jan 6 22:41:53 1999 *************** *** 258,266 **** else { push(@x, 0); } ! @q = (); ($v2,$v1) = @y[-2,-1]; while ($#x > $#y) { ! ($u2,$u1,$u0) = @x[-3..-1]; $q = (($u0 == $v1) ? 99999 : int(($u0*1e5+$u1)/$v1)); --$q while ($v2*$q > ($u0*1e5+$u1-$q*$v1)*1e5+$u2); if ($q) { --- 258,266 ---- else { push(@x, 0); } ! @q = (); ($v2,$v1) = ($y[-2] || 0, $y[-1]); while ($#x > $#y) { ! ($u2,$u1,$u0) = ($x[-3] || 0, $x[-2] || 0, $x[-1]); $q = (($u0 == $v1) ? 99999 : int(($u0*1e5+$u1)/$v1)); --$q while ($v2*$q > ($u0*1e5+$u1-$q*$v1)*1e5+$u2); if ($q) { *************** *** 400,407 **** perl -MMath::BigInt=:constant -e 'print 2**100' ! print the integer value of C<2**100>. Note that without convertion of ! constants the expression 2**100 will be calculatted as floating point number. =head1 BUGS --- 400,407 ---- perl -MMath::BigInt=:constant -e 'print 2**100' ! print the integer value of C<2**100>. Note that without conversion of ! constants the expression 2**100 will be calculated as floating point number. =head1 BUGS diff -c 'perl5.005_02/lib/Math/Complex.pm' 'perl5.005_03/lib/Math/Complex.pm' Index: ./lib/Math/Complex.pm Prereq: 1.25 *** ./lib/Math/Complex.pm Sat Aug 1 22:42:27 1998 --- ./lib/Math/Complex.pm Thu Nov 26 08:54:06 1998 *************** *** 14,20 **** my ( $i, $ip2, %logn ); ! $VERSION = sprintf("%s", q$Id: Complex.pm,v 1.25 1998/02/05 16:07:37 jhi Exp $ =~ /(\d+\.\d+)/); @ISA = qw(Exporter); --- 14,20 ---- my ( $i, $ip2, %logn ); ! $VERSION = sprintf("%s", q$Id: Complex.pm,v 1.26 1998/11/01 00:00:00 dsl Exp $ =~ /(\d+\.\d+)/); @ISA = qw(Exporter); *************** *** 401,438 **** } # - # _zerotozero - # - # Die on zero raised to the zeroth. - # - sub _zerotozero { - my $mess = "The zero raised to the zeroth power is not defined.\n"; - - my @up = caller(1); - - $mess .= "Died at $up[1] line $up[2].\n"; - - die $mess; - } - - # # (power) # # Computes z1**z2 = exp(z2 * log z1)). # sub power { my ($z1, $z2, $inverted) = @_; - my $z1z = $z1 == 0; - my $z2z = $z2 == 0; - _zerotozero if ($z1z and $z2z); if ($inverted) { ! return 0 if ($z2z); ! return 1 if ($z1z or $z2 == 1); } else { ! return 0 if ($z1z); ! return 1 if ($z2z or $z1 == 1); } ! my $w = $inverted ? CORE::exp($z1 * CORE::log($z2)) : CORE::exp($z2 * CORE::log($z1)); # If both arguments cartesian, return cartesian, else polar. return $z1->{c_dirty} == 0 && (not ref $z2 or $z2->{c_dirty} == 0) ? --- 401,421 ---- } # # (power) # # Computes z1**z2 = exp(z2 * log z1)). # sub power { my ($z1, $z2, $inverted) = @_; if ($inverted) { ! return 1 if $z1 == 0 || $z2 == 1; ! return 0 if $z2 == 0 && Re($z1) > 0; } else { ! return 1 if $z2 == 0 || $z1 == 1; ! return 0 if $z1 == 0 && Re($z2) > 0; } ! my $w = $inverted ? CORE::exp($z1 * CORE::log($z2)) ! : CORE::exp($z2 * CORE::log($z1)); # If both arguments cartesian, return cartesian, else polar. return $z1->{c_dirty} == 0 && (not ref $z2 or $z2->{c_dirty} == 0) ? *************** *** 443,449 **** # (spaceship) # # Computes z1 <=> z2. ! # Sorts on the real part first, then on the imaginary part. Thus 2-4i > 3+8i. # sub spaceship { my ($z1, $z2, $inverted) = @_; --- 426,432 ---- # (spaceship) # # Computes z1 <=> z2. ! # Sorts on the real part first, then on the imaginary part. Thus 2-4i < 3+8i. # sub spaceship { my ($z1, $z2, $inverted) = @_; *************** *** 1273,1279 **** my ($a, $b) = @_; my $id = "$a $b"; ! unless (exists $gcd{$id}) { $gcd{$id} = _gcd($a, $b); $gcd{"$b $a"} = $gcd{$id}; --- 1256,1262 ---- my ($a, $b) = @_; my $id = "$a $b"; ! unless (exists $gcd{$id}) { $gcd{$id} = _gcd($a, $b); $gcd{"$b $a"} = $gcd{$id}; *************** *** 1702,1708 **** The division (/) and the following functions log ln log10 logn ! tan sec csc cot atan asec acsc acot tanh sech csch coth atanh asech acsch acoth --- 1685,1691 ---- The division (/) and the following functions log ln log10 logn ! tan sec csc cot atan asec acsc acot tanh sech csch coth atanh asech acsch acoth diff -c 'perl5.005_02/lib/Math/Trig.pm' 'perl5.005_03/lib/Math/Trig.pm' Index: ./lib/Math/Trig.pm *** ./lib/Math/Trig.pm Thu Jul 23 23:00:47 1998 --- ./lib/Math/Trig.pm Thu Feb 11 18:06:01 1999 *************** *** 314,322 **** coordinate. The angle from the I-axis is B, also known as the I coordinate. The `North Pole' is therefore I<0, 0, rho>, and the `Bay of Guinea' (think of the missing big chunk of Africa) I<0, ! pi/2, rho>. ! B: some texts define I and I the other way round, some texts define the I to start from the horizontal plane, some texts use I in place of I. --- 314,324 ---- coordinate. The angle from the I-axis is B, also known as the I coordinate. The `North Pole' is therefore I<0, 0, rho>, and the `Bay of Guinea' (think of the missing big chunk of Africa) I<0, ! pi/2, rho>. In geographical terms I is latitude (northward ! positive, southward negative) and I is longitude (eastward ! positive, westward negative). ! B: some texts define I and I the other way round, some texts define the I to start from the horizontal plane, some texts use I in place of I. *************** *** 374,386 **** use Math::Trig 'great_circle_distance' ! $distance = great_circle_distance($theta0, $phi0, $theta1, $phi, [, $rho]); The I is the shortest distance between two points on a sphere. The distance is in C<$rho> units. The C<$rho> is optional, it defaults to 1 (the unit sphere), therefore the distance defaults to radians. =head1 EXAMPLES To calculate the distance between London (51.3N 0.5W) and Tokyo (35.7N --- 376,400 ---- use Math::Trig 'great_circle_distance' ! $distance = great_circle_distance($theta0, $phi0, $theta1, $phi1, [, $rho]); The I is the shortest distance between two points on a sphere. The distance is in C<$rho> units. The C<$rho> is optional, it defaults to 1 (the unit sphere), therefore the distance defaults to radians. + If you think geographically the I are longitudes: zero at the + Greenwhich meridian, eastward positive, westward negative--and the + I are latitudes: zero at the North Pole, northward positive, + southward negative. B: this formula thinks in mathematics, not + geographically: the I zero is at the North Pole, not at the + Equator on the west coast of Africa (Bay of Guinea). You need to + subtract your geographical coordinates from I (also known as 90 + degrees). + + $distance = great_circle_distance($lon0, pi/2 - $lat0, + $lon1, pi/2 - $lat1, $rho); + =head1 EXAMPLES To calculate the distance between London (51.3N 0.5W) and Tokyo (35.7N *************** *** 394,401 **** $km = great_circle_distance(@L, @T, 6378); ! The answer may be off by up to 0.3% because of the irregular (slightly ! aspherical) form of the Earth. =head1 BUGS --- 408,415 ---- $km = great_circle_distance(@L, @T, 6378); ! The answer may be off by few percentages because of the irregular ! (slightly aspherical) form of the Earth. =head1 BUGS diff -c 'perl5.005_02/lib/Net/hostent.pm' 'perl5.005_03/lib/Net/hostent.pm' Index: ./lib/Net/hostent.pm *** ./lib/Net/hostent.pm Thu Jul 23 23:00:47 1998 --- ./lib/Net/hostent.pm Wed Jan 6 22:41:53 1999 *************** *** 89,95 **** regular array variables, so for example C<@{ $host_obj-Ealiases() }> would be simply @h_aliases. ! The gethost() funtion is a simple front-end that forwards a numeric argument to gethostbyaddr() by way of Socket::inet_aton, and the rest to gethostbyname(). --- 89,95 ---- regular array variables, so for example C<@{ $host_obj-Ealiases() }> would be simply @h_aliases. ! The gethost() function is a simple front-end that forwards a numeric argument to gethostbyaddr() by way of Socket::inet_aton, and the rest to gethostbyname(). diff -c 'perl5.005_02/lib/Net/netent.pm' 'perl5.005_03/lib/Net/netent.pm' Index: ./lib/Net/netent.pm *** ./lib/Net/netent.pm Thu Jul 23 23:00:47 1998 --- ./lib/Net/netent.pm Wed Jan 6 22:41:53 1999 *************** *** 92,98 **** regular array variables, so for example C<@{ $net_obj-Ealiases() }> would be simply @n_aliases. ! The getnet() funtion is a simple front-end that forwards a numeric argument to getnetbyaddr(), and the rest to getnetbyname(). --- 92,98 ---- regular array variables, so for example C<@{ $net_obj-Ealiases() }> would be simply @n_aliases. ! The getnet() function is a simple front-end that forwards a numeric argument to getnetbyaddr(), and the rest to getnetbyname(). diff -c 'perl5.005_02/lib/Pod/Html.pm' 'perl5.005_03/lib/Pod/Html.pm' Index: ./lib/Pod/Html.pm *** ./lib/Pod/Html.pm Tue Aug 4 14:59:32 1998 --- ./lib/Pod/Html.pm Sat Dec 12 10:14:08 1998 *************** *** 11,16 **** --- 11,18 ---- use Carp; + use locale; # make \w work right in non-ASCII lands + use strict; use Config; *************** *** 300,317 **** open(HTML, ">$htmlfile") || die "$0: cannot open $htmlfile file for output: $!\n"; ! # put a title in the HTML file ! $title = ''; ! TITLE_SEARCH: { ! for (my $i = 0; $i < @poddata; $i++) { ! if ($poddata[$i] =~ /^=head1\s*NAME\b/m) { ! for my $para ( @poddata[$i, $i+1] ) { ! last TITLE_SEARCH if ($title) = $para =~ /(\S+\s+-+.*\S)/s; ! } ! } ! } ! } if (!$title and $podfile =~ /\.pod$/) { # probably a split pod so take first =head[12] as title for (my $i = 0; $i < @poddata; $i++) { --- 302,321 ---- open(HTML, ">$htmlfile") || die "$0: cannot open $htmlfile file for output: $!\n"; ! # put a title in the HTML file if one wasn't specified ! if ($title eq '') { ! TITLE_SEARCH: { ! for (my $i = 0; $i < @poddata; $i++) { ! if ($poddata[$i] =~ /^=head1\s*NAME\b/m) { ! for my $para ( @poddata[$i, $i+1] ) { ! last TITLE_SEARCH ! if ($title) = $para =~ /(\S+\s+-+.*\S)/s; ! } ! } ! } ! } ! } if (!$title and $podfile =~ /\.pod$/) { # probably a split pod so take first =head[12] as title for (my $i = 0; $i < @poddata; $i++) { *************** *** 1371,1379 **** # LREF: a la HREF L $linktext = $1 if s:^([^|]+)\|::; - # a :: acts like a / - s,::,/,; - # make sure sections start with a / s,^",/",g; s,^,/,g if (!m,/, && / /); --- 1375,1380 ---- *************** *** 1397,1402 **** --- 1398,1408 ---- if ($page eq "") { $link = "#" . htmlify(0,$section); $linktext = $section unless defined($linktext); + } elsif ( $page =~ /::/ ) { + $linktext = ($section ? "$section" : "$page"); + $page =~ s,::,/,g; + $link = "$htmlroot/$page.html"; + $link .= "#" . htmlify(0,$section) if ($section); } elsif (!defined $pages{$page}) { warn "$0: $podfile: cannot resolve L<$str> in paragraph $paragraph: no such page '$page'\n"; $link = ""; diff -c 'perl5.005_02/lib/Pod/Text.pm' 'perl5.005_03/lib/Pod/Text.pm' Index: ./lib/Pod/Text.pm *** ./lib/Pod/Text.pm Thu Jul 23 23:00:49 1998 --- ./lib/Pod/Text.pm Thu Mar 4 18:34:22 1999 *************** *** 52,57 **** --- 52,59 ---- use vars qw($VERSION); $VERSION = "1.0203"; + use locale; # make \w work right in non-ASCII lands + $termcap=0; $opt_alt_format = 0; *************** *** 273,286 **** my $paratag = $_; $_ = ; if (/^=/) { # tricked! ! local($indent) = $indent[$#index - 1] || $DEF_INDENT; output($paratag); redo POD_DIRECTIVE; } &prepare_for_output; IP_output($paratag, $_); } else { ! local($indent) = $indent[$#index - 1] || $DEF_INDENT; output($_, 0); } } --- 275,288 ---- my $paratag = $_; $_ = ; if (/^=/) { # tricked! ! local($indent) = $indent[$#indent - 1] || $DEF_INDENT; output($paratag); redo POD_DIRECTIVE; } &prepare_for_output; IP_output($paratag, $_); } else { ! local($indent) = $indent[$#indent - 1] || $DEF_INDENT; output($_, 0); } } *************** *** 368,374 **** sub IP_output { local($tag, $_) = @_; ! local($tag_indent) = $indent[$#index - 1] || $DEF_INDENT; $tag_cols = $SCREEN - $tag_indent; $cols = $SCREEN - $indent; $tag =~ s/\s*$//; --- 370,376 ---- sub IP_output { local($tag, $_) = @_; ! local($tag_indent) = $indent[$#indent - 1] || $DEF_INDENT; $tag_cols = $SCREEN - $tag_indent; $cols = $SCREEN - $indent; $tag =~ s/\s*$//; diff -c 'perl5.005_02/lib/SelfLoader.pm' 'perl5.005_03/lib/SelfLoader.pm' Index: ./lib/SelfLoader.pm *** ./lib/SelfLoader.pm Thu Jul 23 23:00:50 1998 --- ./lib/SelfLoader.pm Thu Jan 21 19:03:55 1999 *************** *** 133,139 **** where FOOBAR is the name of the current package when the C<__DATA__> token is reached. This works just the same as C<__END__> does in package 'main', but for other modules data after C<__END__> is not ! automatically retreivable , whereas data after C<__DATA__> is. The C<__DATA__> token is not recognized in versions of perl prior to 5.001m. --- 133,139 ---- where FOOBAR is the name of the current package when the C<__DATA__> token is reached. This works just the same as C<__END__> does in package 'main', but for other modules data after C<__END__> is not ! automatically retrievable, whereas data after C<__DATA__> is. The C<__DATA__> token is not recognized in versions of perl prior to 5.001m. *************** *** 203,209 **** The B works similarly to the AutoLoader, but picks up the subs from after the C<__DATA__> instead of in the 'lib/auto' directory. ! There is a maintainance gain in not needing to run AutoSplit on the module at installation, and a runtime gain in not needing to keep opening and closing files to load subs. There is a runtime loss in needing to parse the code after the C<__DATA__>. Details of the B and --- 203,209 ---- The B works similarly to the AutoLoader, but picks up the subs from after the C<__DATA__> instead of in the 'lib/auto' directory. ! There is a maintenance gain in not needing to run AutoSplit on the module at installation, and a runtime gain in not needing to keep opening and closing files to load subs. There is a runtime loss in needing to parse the code after the C<__DATA__>. Details of the B and diff -c 'perl5.005_02/lib/Symbol.pm' 'perl5.005_03/lib/Symbol.pm' Index: ./lib/Symbol.pm *** ./lib/Symbol.pm Thu Jul 23 23:00:50 1998 --- ./lib/Symbol.pm Thu Jan 21 19:03:55 1999 *************** *** 46,52 **** variable names (e.g. "myvar" -E "MyPackage::myvar"). If it is given a second parameter, C uses it as the default package; otherwise, it uses the package of its caller. Regardless, global ! variable names (e.g. "STDOUT", "ENV", "SIG") are always qualfied with "main::". Qualification applies only to symbol names (strings). References are --- 46,52 ---- variable names (e.g. "myvar" -E "MyPackage::myvar"). If it is given a second parameter, C uses it as the default package; otherwise, it uses the package of its caller. Regardless, global ! variable names (e.g. "STDOUT", "ENV", "SIG") are always qualified with "main::". Qualification applies only to symbol names (strings). References are diff -c 'perl5.005_02/lib/Term/Complete.pm' 'perl5.005_03/lib/Term/Complete.pm' Index: ./lib/Term/Complete.pm *** ./lib/Term/Complete.pm Thu Jul 23 23:00:51 1998 --- ./lib/Term/Complete.pm Wed Jan 6 22:41:53 1999 *************** *** 5,11 **** @ISA = qw(Exporter); @EXPORT = qw(Complete); ! # @(#)complete.pl,v1.1 (me@anywhere.EBay.Sun.COM) 09/23/91 =head1 NAME --- 5,11 ---- @ISA = qw(Exporter); @EXPORT = qw(Complete); ! # @(#)complete.pl,v1.2 (me@anywhere.EBay.Sun.COM) 09/23/91 =head1 NAME *************** *** 13,20 **** =head1 SYNOPSIS ! $input = complete('prompt_string', \@completion_list); ! $input = complete('prompt_string', @completion_list); =head1 DESCRIPTION --- 13,20 ---- =head1 SYNOPSIS ! $input = Complete('prompt_string', \@completion_list); ! $input = Complete('prompt_string', @completion_list); =head1 DESCRIPTION *************** *** 56,62 **** =head1 BUGS ! The completion charater EtabE cannot be changed. =head1 AUTHOR --- 56,62 ---- =head1 BUGS ! The completion character EtabE cannot be changed. =head1 AUTHOR *************** *** 72,78 **** } sub Complete { ! my($prompt, @cmp_list, $return, @match, $l, $test, $cmp, $r); $prompt = shift; if (ref $_[0] || $_[0] =~ /^\*/) { --- 72,82 ---- } sub Complete { ! my($prompt, @cmp_list, $cmp, $test, $l, @match); ! my ($return, $r) = ("", 0); ! ! $return = ""; ! $r = 0; $prompt = shift; if (ref $_[0] || $_[0] =~ /^\*/) { *************** *** 90,106 **** # (TAB) attempt completion $_ eq "\t" && do { @match = grep(/^$return/, @cmp_lst); - $l = length($test = shift(@match)); unless ($#match < 0) { foreach $cmp (@match) { until (substr($cmp, 0, $l) eq substr($test, 0, $l)) { $l--; } } print("\a"); } - print($test = substr($test, $r, $l - $r)); - $r = length($return .= $test); last CASE; }; --- 94,110 ---- # (TAB) attempt completion $_ eq "\t" && do { @match = grep(/^$return/, @cmp_lst); unless ($#match < 0) { + $l = length($test = shift(@match)); foreach $cmp (@match) { until (substr($cmp, 0, $l) eq substr($test, 0, $l)) { $l--; } } print("\a"); + print($test = substr($test, $r, $l - $r)); + $r = length($return .= $test); } last CASE; }; *************** *** 113,120 **** # (^U) kill $_ eq $kill && do { if ($r) { ! undef $r; ! undef $return; print("\r\n"); redo LOOP; } --- 117,124 ---- # (^U) kill $_ eq $kill && do { if ($r) { ! $r = 0; ! $return = ""; print("\r\n"); redo LOOP; } diff -c 'perl5.005_02/lib/Term/ReadLine.pm' 'perl5.005_03/lib/Term/ReadLine.pm' Index: ./lib/Term/ReadLine.pm *** ./lib/Term/ReadLine.pm Thu Jul 23 23:00:51 1998 --- ./lib/Term/ReadLine.pm Wed Jan 6 22:41:53 1999 *************** *** 139,145 **** =head1 ENVIRONMENT ! The envrironment variable C governs which ReadLine clone is loaded. If the value is false, a dummy interface is used. If the value is true, it should be tail of the name of the package to use, such as C or C. --- 139,145 ---- =head1 ENVIRONMENT ! The environment variable C governs which ReadLine clone is loaded. If the value is false, a dummy interface is used. If the value is true, it should be tail of the name of the package to use, such as C or C. diff -c 'perl5.005_02/lib/Test.pm' 'perl5.005_03/lib/Test.pm' Index: ./lib/Test.pm *** ./lib/Test.pm Fri Aug 7 16:40:39 1998 --- ./lib/Test.pm Sat Mar 27 11:27:46 1999 *************** *** 2,18 **** package Test; use Test::Harness 1.1601 (); use Carp; ! use vars (qw($VERSION @ISA @EXPORT $ntest $TestLevel), #public-ish ! qw($ONFAIL %todo %history $planned @FAILDETAIL)); #private-ish ! $VERSION = '1.04'; require Exporter; @ISA=('Exporter'); ! @EXPORT= qw(&plan &ok &skip $ntest); $TestLevel = 0; # how many extra stack frames to skip $|=1; #$^W=1; ? $ntest=1; # Use of this variable is strongly discouraged. It is set mainly to # help test coverage analyzers know which test is running. --- 2,20 ---- package Test; use Test::Harness 1.1601 (); use Carp; ! use vars (qw($VERSION @ISA @EXPORT @EXPORT_OK $ntest $TestLevel), #public-ish ! qw($TESTOUT $ONFAIL %todo %history $planned @FAILDETAIL)); #private-ish ! $VERSION = '1.122'; require Exporter; @ISA=('Exporter'); ! @EXPORT=qw(&plan &ok &skip); ! @EXPORT_OK=qw($ntest $TESTOUT); $TestLevel = 0; # how many extra stack frames to skip $|=1; #$^W=1; ? $ntest=1; + $TESTOUT = *STDOUT{IO}; # Use of this variable is strongly discouraged. It is set mainly to # help test coverage analyzers know which test is running. *************** *** 35,43 **** } my @todo = sort { $a <=> $b } keys %todo; if (@todo) { ! print "1..$max todo ".join(' ', @todo).";\n"; } else { ! print "1..$max\n"; } ++$planned; } --- 37,45 ---- } my @todo = sort { $a <=> $b } keys %todo; if (@todo) { ! print $TESTOUT "1..$max todo ".join(' ', @todo).";\n"; } else { ! print $TESTOUT "1..$max\n"; } ++$planned; } *************** *** 47,55 **** (ref $v or '') eq 'CODE' ? $v->() : $v; } - # STDERR is NOT used for diagnostic output which should have been - # fixed before release. Is this appropriate? - sub ok ($;$$) { croak "ok: plan before you test!" if !$planned; my ($pkg,$file,$line) = caller($TestLevel); --- 49,54 ---- *************** *** 63,111 **** $ok = $result; } else { $expected = to_value(shift); - # until regex can be manipulated like objects... my ($regex,$ignore); ! if (($regex) = ($expected =~ m,^ / (.+) / $,sx) or ($ignore, $regex) = ($expected =~ m,^ m([^\w\s]) (.+) \1 $,sx)) { $ok = $result =~ /$regex/; } else { $ok = $result eq $expected; } } ! if ($todo{$ntest}) { ! if ($ok) { ! print "ok $ntest # Wow! ($context)\n"; ! } else { ! $diag = to_value(shift) if @_; ! if (!$diag) { ! print "not ok $ntest # (failure expected in $context)\n"; ! } else { ! print "not ok $ntest # (failure expected: $diag)\n"; ! } ! } } else { ! print "not " if !$ok; ! print "ok $ntest\n"; if (!$ok) { my $detail = { 'repetition' => $repetition, 'package' => $pkg, ! 'result' => $result }; $$detail{expected} = $expected if defined $expected; $diag = $$detail{diagnostic} = to_value(shift) if @_; if (!defined $expected) { if (!$diag) { ! print STDERR "# Failed test $ntest in $context\n"; } else { ! print STDERR "# Failed test $ntest in $context: $diag\n"; } } else { my $prefix = "Test $ntest"; ! print STDERR "# $prefix got: '$result' ($context)\n"; $prefix = ' ' x (length($prefix) - 5); if (!$diag) { ! print STDERR "# $prefix Expected: '$expected'\n"; } else { ! print STDERR "# $prefix Expected: '$expected' ($diag)\n"; } } push @FAILDETAIL, $detail; --- 62,110 ---- $ok = $result; } else { $expected = to_value(shift); my ($regex,$ignore); ! if ((ref($expected)||'') eq 'Regexp') { ! $ok = $result =~ /$expected/; ! } elsif (($regex) = ($expected =~ m,^ / (.+) / $,sx) or ($ignore, $regex) = ($expected =~ m,^ m([^\w\s]) (.+) \1 $,sx)) { $ok = $result =~ /$regex/; } else { $ok = $result eq $expected; } } ! my $todo = $todo{$ntest}; ! if ($todo and $ok) { ! $context .= ' TODO?!' if $todo; ! print $TESTOUT "ok $ntest # ($context)\n"; } else { ! print $TESTOUT "not " if !$ok; ! print $TESTOUT "ok $ntest\n"; if (!$ok) { my $detail = { 'repetition' => $repetition, 'package' => $pkg, ! 'result' => $result, 'todo' => $todo }; $$detail{expected} = $expected if defined $expected; $diag = $$detail{diagnostic} = to_value(shift) if @_; + $context .= ' *TODO*' if $todo; if (!defined $expected) { if (!$diag) { ! print $TESTOUT "# Failed test $ntest in $context\n"; } else { ! print $TESTOUT "# Failed test $ntest in $context: $diag\n"; } } else { my $prefix = "Test $ntest"; ! print $TESTOUT "# $prefix got: '$result' ($context)\n"; $prefix = ' ' x (length($prefix) - 5); + if ((ref($expected)||'') eq 'Regexp') { + $expected = 'qr/'.$expected.'/' + } else { + $expected = "'$expected'"; + } if (!$diag) { ! print $TESTOUT "# $prefix Expected: $expected\n"; } else { ! print $TESTOUT "# $prefix Expected: $expected ($diag)\n"; } } push @FAILDETAIL, $detail; *************** *** 116,123 **** } sub skip ($$;$$) { ! if (to_value(shift)) { ! print "ok $ntest # skip\n"; ++ $ntest; 1; } else { --- 115,124 ---- } sub skip ($$;$$) { ! my $whyskip = to_value(shift); ! if ($whyskip) { ! $whyskip = 'skip' if $whyskip =~ m/^\d+$/; ! print $TESTOUT "ok $ntest # $whyskip\n"; ++ $ntest; 1; } else { *************** *** 141,147 **** use strict; use Test; ! BEGIN { plan tests => 13, todo => [3,4] } ok(0); # failure ok(1); # success --- 142,153 ---- use strict; use Test; ! ! # use a BEGIN block so we print our plan before MyModule is loaded ! BEGIN { plan tests => 14, todo => [3,4] } ! ! # load your module... ! use MyModule; ok(0); # failure ok(1); # success *************** *** 152,161 **** ok(0,1); # failure: '0' ne '1' ok('broke','fixed'); # failure: 'broke' ne 'fixed' ok('fixed','fixed'); # success: 'fixed' eq 'fixed' ok(sub { 1+1 }, 2); # success: '2' eq '2' ok(sub { 1+1 }, 3); # failure: '2' ne '3' ! ok(0, int(rand(2)); # (just kidding! :-) my @list = (0,0); ok @list, 3, "\@list=".join(',',@list); #extra diagnostics --- 158,168 ---- ok(0,1); # failure: '0' ne '1' ok('broke','fixed'); # failure: 'broke' ne 'fixed' ok('fixed','fixed'); # success: 'fixed' eq 'fixed' + ok('fixed',qr/x/); # success: 'fixed' =~ qr/x/ ok(sub { 1+1 }, 2); # success: '2' eq '2' ok(sub { 1+1 }, 3); # failure: '2' ne '3' ! ok(0, int(rand(2)); # (just kidding :-) my @list = (0,0); ok @list, 3, "\@list=".join(',',@list); #extra diagnostics *************** *** 165,173 **** =head1 DESCRIPTION ! Test::Harness expects to see particular output when it executes tests. ! This module aims to make writing proper test scripts just a little bit ! easier (and less error prone :-). =head1 TEST TYPES --- 172,180 ---- =head1 DESCRIPTION ! L expects to see particular output when it executes ! tests. This module aims to make writing proper test scripts just a ! little bit easier (and less error prone :-). =head1 TEST TYPES *************** *** 175,231 **** =item * NORMAL TESTS ! These tests are expected to succeed. If they don't, something's screwed up! =item * SKIPPED TESTS ! Skip tests need a platform specific feature that might or might not be ! available. The first argument should evaluate to true if the required ! feature is NOT available. After the first argument, skip tests work exactly the same way as do normal tests. =item * TODO TESTS ! TODO tests are designed for maintaining an executable TODO list. ! These tests are expected NOT to succeed (otherwise the feature they ! test would be on the new feature list, not the TODO list). ! Packages should NOT be released with successful TODO tests. As soon as a TODO test starts working, it should be promoted to a normal test ! and the newly minted feature should be documented in the release ! notes. =back =head1 ONFAIL BEGIN { plan test => 4, onfail => sub { warn "CALL 911!" } } ! The test failures can trigger extra diagnostics at the end of the test ! run. C is passed an array ref of hash refs that describe each ! test failure. Each hash will contain at least the following fields: ! package, repetition, and result. (The file, line, and test number are ! not included because their correspondance to a particular test is ! fairly weak.) If the test had an expected value or a diagnostic ! string, these will also be included. ! ! This optional feature might be used simply to print out the version of ! your package and/or how to report problems. It might also be used to ! generate extremely sophisticated diagnostics for a particular test ! failure. It's not a panacea, however. Core dumps or other ! unrecoverable errors will prevent the C hook from running. ! (It is run inside an END block.) Besides, C is probably ! over-kill in the majority of cases. (Your test code should be simpler than the code it is testing, yes?) =head1 SEE ALSO ! L and various test coverage analysis tools. =head1 AUTHOR ! Copyright (C) 1998 Joshua Nathaniel Pritikin. All rights reserved. This package is free software and is provided "as is" without express or implied warranty. It may be used, redistributed and/or modified --- 182,245 ---- =item * NORMAL TESTS ! These tests are expected to succeed. If they don't something's screwed up! =item * SKIPPED TESTS ! Skip is for tests that might or might not be possible to run depending ! on the availability of platform specific features. The first argument ! should evaluate to true (think "yes, please skip") if the required ! feature is not available. After the first argument, skip works exactly the same way as do normal tests. =item * TODO TESTS ! TODO tests are designed for maintaining an B. ! These tests are expected NOT to succeed. If a TODO test does succeed, ! the feature in question should not be on the TODO list, now should it? ! Packages should NOT be released with succeeding TODO tests. As soon as a TODO test starts working, it should be promoted to a normal test ! and the newly working feature should be documented in the release ! notes or change log. =back + =head1 RETURN VALUE + + Both C and C return true if their test succeeds and false + otherwise in a scalar context. + =head1 ONFAIL BEGIN { plan test => 4, onfail => sub { warn "CALL 911!" } } ! While test failures should be enough, extra diagnostics can be ! triggered at the end of a test run. C is passed an array ref ! of hash refs that describe each test failure. Each hash will contain ! at least the following fields: C, C, and ! C. (The file, line, and test number are not included because ! their correspondance to a particular test is tenuous.) If the test ! had an expected value or a diagnostic string, these will also be ! included. ! ! The B C hook might be used simply to print out the ! version of your package and/or how to report problems. It might also ! be used to generate extremely sophisticated diagnostics for a ! particularly bizarre test failure. However it's not a panacea. Core ! dumps or other unrecoverable errors prevent the C hook from ! running. (It is run inside an C block.) Besides, C is ! probably over-kill in most cases. (Your test code should be simpler than the code it is testing, yes?) =head1 SEE ALSO ! L and, perhaps, test coverage analysis tools. =head1 AUTHOR ! Copyright (c) 1998 Joshua Nathaniel Pritikin. All rights reserved. This package is free software and is provided "as is" without express or implied warranty. It may be used, redistributed and/or modified diff -c 'perl5.005_02/lib/Test/Harness.pm' 'perl5.005_03/lib/Test/Harness.pm' Index: ./lib/Test/Harness.pm *** ./lib/Test/Harness.pm Tue Aug 4 22:15:42 1998 --- ./lib/Test/Harness.pm Fri Oct 30 21:56:33 1998 *************** *** 160,166 **** } else { push @failed, $next..$max; $failed = @failed; ! (my $txt, $canon) = canonfailed($max,@failed); $percent = 100*(scalar @failed)/$max; print "DIED. ",$txt; } --- 160,166 ---- } else { push @failed, $next..$max; $failed = @failed; ! (my $txt, $canon) = canonfailed($max,$skipped,@failed); $percent = 100*(scalar @failed)/$max; print "DIED. ",$txt; } *************** *** 173,179 **** } elsif ($ok == $max && $next == $max+1) { if ($max and $skipped + $bonus) { my @msg; ! push(@msg, "$skipped subtest".($skipped>1?'s':'')." skipped") if $skipped; push(@msg, "$bonus subtest".($bonus>1?'s':''). " unexpectedly succeeded") --- 173,179 ---- } elsif ($ok == $max && $next == $max+1) { if ($max and $skipped + $bonus) { my @msg; ! push(@msg, "$skipped/$max subtest".($skipped>1?'s':'')." skipped") if $skipped; push(@msg, "$bonus subtest".($bonus>1?'s':''). " unexpectedly succeeded") *************** *** 191,197 **** push @failed, $next..$max; } if (@failed) { ! my ($txt, $canon) = canonfailed($max,@failed); print $txt; $failedtests{$test} = { canon => $canon, max => $max, failed => scalar @failed, --- 191,197 ---- push @failed, $next..$max; } if (@failed) { ! my ($txt, $canon) = canonfailed($max,$skipped,@failed); print $txt; $failedtests{$test} = { canon => $canon, max => $max, failed => scalar @failed, *************** *** 300,306 **** } sub canonfailed ($@) { ! my($max,@failed) = @_; my %seen; @failed = sort {$a <=> $b} grep !$seen{$_}++, @failed; my $failed = @failed; --- 300,306 ---- } sub canonfailed ($@) { ! my($max,$skipped,@failed) = @_; my %seen; @failed = sort {$a <=> $b} grep !$seen{$_}++, @failed; my $failed = @failed; *************** *** 330,336 **** } push @result, "\tFailed $failed/$max tests, "; ! push @result, sprintf("%.2f",100*(1-$failed/$max)), "% okay\n"; my $txt = join "", @result; ($txt, $canon); } --- 330,341 ---- } push @result, "\tFailed $failed/$max tests, "; ! push @result, sprintf("%.2f",100*(1-$failed/$max)), "% okay"; ! my $ender = 's' x ($skipped > 1); ! my $good = $max - $failed - $skipped; ! my $goodper = sprintf("%.2f",100*($good/$max)); ! push @result, " (-$skipped skipped test$ender: $good okay, $goodper%)" if $skipped; ! push @result, "\n"; my $txt = join "", @result; ($txt, $canon); } diff -c 'perl5.005_02/lib/Text/ParseWords.pm' 'perl5.005_03/lib/Text/ParseWords.pm' Index: ./lib/Text/ParseWords.pm *** ./lib/Text/ParseWords.pm Thu Jul 23 23:00:51 1998 --- ./lib/Text/ParseWords.pm Thu Jan 7 22:07:45 1999 *************** *** 63,69 **** ([\000-\377]*) # and the rest | # --OR-- ^((?:\\.|[^\\"'])*?) # an $unquoted text ! (\Z(?!\n)|$delimiter|(?!^)(?=["'])) # plus EOL, delimiter, or quote ([\000-\377]*) # the rest /x; # extended layout --- 63,69 ---- ([\000-\377]*) # and the rest | # --OR-- ^((?:\\.|[^\\"'])*?) # an $unquoted text ! (\Z(?!\n)|(?-x:$delimiter)|(?!^)(?=["'])) # plus EOL, delimiter, or quote ([\000-\377]*) # the rest /x; # extended layout diff -c 'perl5.005_02/lib/Text/Wrap.pm' 'perl5.005_03/lib/Text/Wrap.pm' Index: ./lib/Text/Wrap.pm *** ./lib/Text/Wrap.pm Thu Jul 23 23:00:52 1998 --- ./lib/Text/Wrap.pm Wed Jan 6 22:41:53 1999 *************** *** 1,57 **** package Text::Wrap; ! use vars qw(@ISA @EXPORT @EXPORT_OK $VERSION $columns $debug); ! use strict; ! use Exporter; - $VERSION = "97.02"; @ISA = qw(Exporter); ! @EXPORT = qw(wrap); ! @EXPORT_OK = qw($columns $tabstop fill); ! use Text::Tabs qw(expand unexpand $tabstop); BEGIN { ! $columns = 76; # <= screen width ! $debug = 0; } sub wrap { ! my ($ip, $xp, @t) = @_; ! ! my @rv; ! my $t = expand(join(" ",@t)); ! my $lead = $ip; ! my $ll = $columns - length(expand($lead)) - 1; ! my $nl = ""; ! ! $t =~ s/^\s+//; ! while(length($t) > $ll) { ! # remove up to a line length of things that ! # aren't new lines and tabs. ! if ($t =~ s/^([^\n]{0,$ll})(\s|\Z(?!\n))//) { ! my ($l,$r) = ($1,$2); ! $l =~ s/\s+$//; ! print "WRAP $lead$l..($r)\n" if $debug; ! push @rv, unexpand($lead . $l), "\n"; ! ! } elsif ($t =~ s/^([^\n]{$ll})//) { ! print "SPLIT $lead$1..\n" if $debug; ! push @rv, unexpand($lead . $1),"\n"; } ! # recompute the leader ! $lead = $xp; ! $ll = $columns - length(expand($lead)) - 1; ! $t =~ s/^\s+//; ! } ! print "TAIL $lead$t\n" if $debug; ! push @rv, $lead.$t if $t ne ""; ! return join '', @rv; ! } sub fill { --- 1,65 ---- package Text::Wrap; ! require Exporter; @ISA = qw(Exporter); ! @EXPORT = qw(wrap fill); ! @EXPORT_OK = qw($columns $break $huge); ! $VERSION = 98.112902; + use vars qw($VERSION $columns $debug $break $huge); + use strict; BEGIN { ! $columns = 76; # <= screen width ! $debug = 0; ! $break = '\s'; ! $huge = 'wrap'; # alternatively: 'die' } + use Text::Tabs qw(expand unexpand); + sub wrap { ! my ($ip, $xp, @t) = @_; ! my $r = ""; ! my $t = expand(join(" ",@t)); ! my $lead = $ip; ! my $ll = $columns - length(expand($ip)) - 1; ! my $nll = $columns - length(expand($xp)) - 1; ! my $nl = ""; ! my $remainder = ""; ! ! while ($t !~ /^\s*$/) { ! if ($t =~ s/^([^\n]{0,$ll})($break|\Z(?!\n))//xm) { ! $r .= unexpand($nl . $lead . $1); ! $remainder = $2; ! } elsif ($huge eq 'wrap' && $t =~ s/^([^\n]{$ll})//) { ! $r .= unexpand($nl . $lead . $1); ! $remainder = "\n"; ! } elsif ($huge eq 'die') { ! die "couldn't wrap '$t'"; ! } else { ! die "This shouldn't happen"; ! } ! ! $lead = $xp; ! $ll = $nll; ! $nl = "\n"; } ! $r .= $remainder; ! ! print "-----------$r---------\n" if $debug; ! ! print "Finish up with '$lead', '$t'\n" if $debug; ! ! $r .= $lead . $t if $t ne ""; + print "-----------$r---------\n" if $debug;; + return $r; + } sub fill { *************** *** 83,108 **** use Text::Wrap print wrap($initial_tab, $subsequent_tab, @text); ! use Text::Wrap qw(wrap $columns $tabstop fill); $columns = 132; ! $tabstop = 4; ! ! print fill($initial_tab, $subsequent_tab, @text); ! print fill("", "", `cat book`); =head1 DESCRIPTION Text::Wrap::wrap() is a very simple paragraph formatter. It formats a ! single paragraph at a time by breaking lines at word boundries. Indentation is controlled for the first line ($initial_tab) and ! all subsquent lines ($subsequent_tab) independently. $Text::Wrap::columns ! should be set to the full width of your output device. Text::Wrap::fill() is a simple multi-paragraph formatter. It formats each paragraph separately and then joins them together when it's done. It ! will destory any whitespace in the original text. It breaks text into paragraphs by looking for whitespace after a newline. In other respects it acts like wrap(). --- 91,122 ---- use Text::Wrap print wrap($initial_tab, $subsequent_tab, @text); + print fill($initial_tab, $subsequent_tab, @text); ! use Text::Wrap qw(wrap $columns $huge); $columns = 132; ! $huge = 'die'; ! $huge = 'wrap'; =head1 DESCRIPTION Text::Wrap::wrap() is a very simple paragraph formatter. It formats a ! single paragraph at a time by breaking lines at word boundaries. Indentation is controlled for the first line ($initial_tab) and ! all subsequent lines ($subsequent_tab) independently. ! ! Lines are wrapped at $Text::Wrap::columns columns. ! $Text::Wrap::columns should be set to the full width of your output device. ! ! When words that are longer than $columns are encountered, they ! are broken up. Previous versions of wrap() die()ed instead. ! To restore the old (dying) behavior, set $Text::Wrap::huge to ! 'die'. Text::Wrap::fill() is a simple multi-paragraph formatter. It formats each paragraph separately and then joins them together when it's done. It ! will destroy any whitespace in the original text. It breaks text into paragraphs by looking for whitespace after a newline. In other respects it acts like wrap(). *************** *** 111,125 **** print wrap("\t","","This is a bit of text that forms a normal book-style paragraph"); - =head1 BUGS - - It's not clear what the correct behavior should be when Wrap() is - presented with a word that is longer than a line. The previous - behavior was to die. Now the word is now split at line-length. - =head1 AUTHOR David Muir Sharnoff with help from Tim Pierce and ! others. Updated by Jacqui Caren. - =cut --- 125,132 ---- print wrap("\t","","This is a bit of text that forms a normal book-style paragraph"); =head1 AUTHOR David Muir Sharnoff with help from Tim Pierce and ! many many others. diff -c 'perl5.005_02/lib/Tie/Array.pm' 'perl5.005_03/lib/Tie/Array.pm' Index: ./lib/Tie/Array.pm *** ./lib/Tie/Array.pm Thu Jul 23 23:00:52 1998 --- ./lib/Tie/Array.pm Wed Jan 6 22:41:53 1999 *************** *** 176,198 **** =item STORE this, index, value ! Store datum I into I for the tied array assoicated with object I. If this makes the array larger then class's mapping of C should be returned for new positions. =item FETCH this, index ! Retrieve the datum in I for the tied array assoicated with object I. =item FETCHSIZE this ! Returns the total number of items in the tied array assoicated with object I. (Equivalent to C). =item STORESIZE this, count ! Sets the total number of items in the tied array assoicated with object I to be I. If this makes the array larger then class's mapping of C should be returned for new positions. If the array becomes smaller then entries beyond count should be --- 176,198 ---- =item STORE this, index, value ! Store datum I into I for the tied array associated with object I. If this makes the array larger then class's mapping of C should be returned for new positions. =item FETCH this, index ! Retrieve the datum in I for the tied array associated with object I. =item FETCHSIZE this ! Returns the total number of items in the tied array associated with object I. (Equivalent to C). =item STORESIZE this, count ! Sets the total number of items in the tied array associated with object I to be I. If this makes the array larger then class's mapping of C should be returned for new positions. If the array becomes smaller then entries beyond count should be *************** *** 205,211 **** =item CLEAR this ! Clear (remove, delete, ...) all values from the tied array assoicated with object I. =item DESTROY this --- 205,211 ---- =item CLEAR this ! Clear (remove, delete, ...) all values from the tied array associated with object I. =item DESTROY this *************** *** 227,233 **** =item UNSHIFT this, LIST ! Insert LIST elements at the begining of the array, moving existing elements up to make room. =item SPLICE this, offset, length, LIST --- 227,233 ---- =item UNSHIFT this, LIST ! Insert LIST elements at the beginning of the array, moving existing elements up to make room. =item SPLICE this, offset, length, LIST diff -c 'perl5.005_02/lib/Tie/Hash.pm' 'perl5.005_03/lib/Tie/Hash.pm' Index: ./lib/Tie/Hash.pm *** ./lib/Tie/Hash.pm Thu Jul 23 23:00:52 1998 --- ./lib/Tie/Hash.pm Wed Jan 6 22:41:54 1999 *************** *** 92,98 **** =head1 MORE INFORMATION ! The packages relating to various DBM-related implemetations (F, F, etc.) show examples of general tied hashes, as does the L module. While these do not utilize B, they serve as good working examples. --- 92,98 ---- =head1 MORE INFORMATION ! The packages relating to various DBM-related implementations (F, F, etc.) show examples of general tied hashes, as does the L module. While these do not utilize B, they serve as good working examples. diff -c 'perl5.005_02/lib/Tie/SubstrHash.pm' 'perl5.005_03/lib/Tie/SubstrHash.pm' Index: ./lib/Tie/SubstrHash.pm *** ./lib/Tie/SubstrHash.pm Thu Jul 23 23:00:52 1998 --- ./lib/Tie/SubstrHash.pm Sat Jan 2 09:57:02 1999 *************** *** 69,75 **** sub STORE { local($self,$key,$val) = @_; local($klen, $vlen, $tsize, $rlen) = @$self[1..4]; ! croak("Table is full") if $self[5] == $tsize; croak(qq/Value "$val" is not $vlen characters long./) if length($val) != $vlen; my $writeoffset; --- 69,75 ---- sub STORE { local($self,$key,$val) = @_; local($klen, $vlen, $tsize, $rlen) = @$self[1..4]; ! croak("Table is full") if $$self[5] == $tsize; croak(qq/Value "$val" is not $vlen characters long./) if length($val) != $vlen; my $writeoffset; diff -c 'perl5.005_02/lib/Time/Local.pm' 'perl5.005_03/lib/Time/Local.pm' Index: ./lib/Time/Local.pm *** ./lib/Time/Local.pm Thu Jul 23 23:00:52 1998 --- ./lib/Time/Local.pm Sun Jan 24 08:47:49 1999 *************** *** 17,32 **** =head1 DESCRIPTION ! These routines are quite efficient and yet are always guaranteed to agree ! with localtime() and gmtime(). We manage this by caching the start times ! of any months we've seen before. If we know the start time of the month, ! we can always calculate any time within the month. The start times ! themselves are guessed by successive approximation starting at the ! current time, since most dates seen in practice are close to the ! current date. Unlike algorithms that do a binary search (calling gmtime ! once for each bit of the time value, resulting in 32 calls), this algorithm ! calls it at most 6 times, and usually only once or twice. If you hit ! the month cache, of course, it doesn't call it at all. timelocal is implemented using the same cache. We just assume that we're translating a GMT time, and then fudge it when we're done for the timezone --- 17,34 ---- =head1 DESCRIPTION ! These routines are quite efficient and yet are always guaranteed to ! agree with localtime() and gmtime(), the most notable points being ! that year is year-1900 and month is 0..11. We manage this by caching ! the start times of any months we've seen before. If we know the start ! time of the month, we can always calculate any time within the month. ! The start times themselves are guessed by successive approximation ! starting at the current time, since most dates seen in practice are ! close to the current date. Unlike algorithms that do a binary search ! (calling gmtime once for each bit of the time value, resulting in 32 ! calls), this algorithm calls it at most 6 times, and usually only once ! or twice. If you hit the month cache, of course, it doesn't call it ! at all. timelocal is implemented using the same cache. We just assume that we're translating a GMT time, and then fudge it when we're done for the timezone diff -c 'perl5.005_02/lib/Time/gmtime.pm' 'perl5.005_03/lib/Time/gmtime.pm' Index: ./lib/Time/gmtime.pm *** ./lib/Time/gmtime.pm Thu Jul 23 23:00:52 1998 --- ./lib/Time/gmtime.pm Thu Jan 7 21:54:05 1999 *************** *** 69,75 **** named with a preceding C in front their method names. Thus, C<$tm_obj-Emday()> corresponds to $tm_mday if you import the fields. ! The gmctime() funtion provides a way of getting at the scalar sense of the original CORE::gmtime() function. To access this functionality without the core overrides, --- 69,75 ---- named with a preceding C in front their method names. Thus, C<$tm_obj-Emday()> corresponds to $tm_mday if you import the fields. ! The gmctime() function provides a way of getting at the scalar sense of the original CORE::gmtime() function. To access this functionality without the core overrides, diff -c 'perl5.005_02/lib/Time/localtime.pm' 'perl5.005_03/lib/Time/localtime.pm' Index: ./lib/Time/localtime.pm *** ./lib/Time/localtime.pm Thu Jul 23 23:00:52 1998 --- ./lib/Time/localtime.pm Thu Jan 7 21:54:05 1999 *************** *** 65,71 **** Thus, C<$tm_obj-Emday()> corresponds to $tm_mday if you import the fields. ! The ctime() funtion provides a way of getting at the scalar sense of the original CORE::localtime() function. To access this functionality without the core overrides, --- 65,71 ---- Thus, C<$tm_obj-Emday()> corresponds to $tm_mday if you import the fields. ! The ctime() function provides a way of getting at the scalar sense of the original CORE::localtime() function. To access this functionality without the core overrides, diff -c 'perl5.005_02/lib/User/grent.pm' 'perl5.005_03/lib/User/grent.pm' Index: ./lib/User/grent.pm *** ./lib/User/grent.pm Thu Jul 23 23:00:52 1998 --- ./lib/User/grent.pm Thu Jan 7 21:54:05 1999 *************** *** 74,80 **** regular array variables, so C<@{ $group_obj-Emembers() }> would be simply @gr_members. ! The getpw() funtion is a simple front-end that forwards a numeric argument to getpwuid() and the rest to getpwnam(). To access this functionality without the core overrides, --- 74,80 ---- regular array variables, so C<@{ $group_obj-Emembers() }> would be simply @gr_members. ! The getpw() function is a simple front-end that forwards a numeric argument to getpwuid() and the rest to getpwnam(). To access this functionality without the core overrides, diff -c 'perl5.005_02/lib/User/pwent.pm' 'perl5.005_03/lib/User/pwent.pm' Index: ./lib/User/pwent.pm *** ./lib/User/pwent.pm Thu Jul 23 23:00:52 1998 --- ./lib/User/pwent.pm Thu Jan 7 21:54:05 1999 *************** *** 84,90 **** Thus, C<$passwd_obj-Eshell()> corresponds to $pw_shell if you import the fields. ! The getpw() funtion is a simple front-end that forwards a numeric argument to getpwuid() and the rest to getpwnam(). To access this functionality without the core overrides, --- 84,90 ---- Thus, C<$passwd_obj-Eshell()> corresponds to $pw_shell if you import the fields. ! The getpw() function is a simple front-end that forwards a numeric argument to getpwuid() and the rest to getpwnam(). To access this functionality without the core overrides, diff -c 'perl5.005_02/lib/constant.pm' 'perl5.005_03/lib/constant.pm' Index: ./lib/constant.pm *** ./lib/constant.pm Thu Jul 23 23:00:53 1998 --- ./lib/constant.pm Sat Oct 31 19:23:15 1998 *************** *** 20,25 **** --- 20,37 ---- print "This line does nothing" unless DEBUGGING; + # references can be declared constant + use constant CHASH => { foo => 42 }; + use constant CARRAY => [ 1,2,3,4 ]; + use constant CPSEUDOHASH => [ { foo => 1}, 42 ]; + use constant CCODE => sub { "bite $_[0]\n" }; + + print CHASH->{foo}; + print CARRAY->[$i]; + print CPSEUDOHASH->{foo}; + print CCODE->("me"); + print CHASH->[10]; # compile-time error + =head1 DESCRIPTION This will declare a symbol to be a constant with the given scalar *************** *** 85,90 **** --- 97,104 ---- use constant E2BIG => ($! = 7); print E2BIG, "\n"; # something like "Arg list too long" print 0+E2BIG, "\n"; # "7" + + Errors in dereferencing constant references are trapped at compile-time. =head1 TECHNICAL NOTE diff -c 'perl5.005_02/lib/diagnostics.pm' 'perl5.005_03/lib/diagnostics.pm' Index: ./lib/diagnostics.pm *** ./lib/diagnostics.pm Thu Jul 23 23:00:54 1998 --- ./lib/diagnostics.pm Sat Jan 23 16:09:05 1999 *************** *** 27,33 **** =head2 The C Pragma This module extends the terse diagnostics normally emitted by both the ! perl compiler and the perl interpeter, augmenting them with the more explicative and endearing descriptions found in L. Like the other pragmata, it affects the compilation phase of your program rather than merely the execution phase. --- 27,33 ---- =head2 The C Pragma This module extends the terse diagnostics normally emitted by both the ! perl compiler and the perl interpreter, augmenting them with the more explicative and endearing descriptions found in L. Like the other pragmata, it affects the compilation phase of your program rather than merely the execution phase. diff -c 'perl5.005_02/lib/fields.pm' 'perl5.005_03/lib/fields.pm' Index: ./lib/fields.pm *** ./lib/fields.pm Thu Jul 23 23:00:54 1998 --- ./lib/fields.pm Sat Jan 2 09:38:31 1999 *************** *** 32,38 **** If a typed lexical variable holding a reference is used to access a hash element and the %FIELDS hash of the given type exists, then the operation is turned into an array access at compile time. The %FIELDS ! hash map from hash element names to the array indices. If the hash element is not present in the %FIELDS hash, then a compile-time error is signaled. --- 32,38 ---- If a typed lexical variable holding a reference is used to access a hash element and the %FIELDS hash of the given type exists, then the operation is turned into an array access at compile time. The %FIELDS ! hash maps from hash element names to the array indices. If the hash element is not present in the %FIELDS hash, then a compile-time error is signaled. *************** *** 57,63 **** { my $class = shift; no strict 'refs'; ! my $self = bless [\%{"$class\::FIELDS"], $class; $self; } --- 57,63 ---- { my $class = shift; no strict 'refs'; ! my $self = bless [\%{"$class\::FIELDS"}], $class; $self; } diff -c 'perl5.005_02/lib/overload.pm' 'perl5.005_03/lib/overload.pm' Index: ./lib/overload.pm *** ./lib/overload.pm Sat Aug 1 14:58:04 1998 --- ./lib/overload.pm Sat Jan 23 16:54:00 1999 *************** *** 167,179 **** ... $strval = overload::StrVal $b; - =head1 CAVEAT SCRIPTOR - - Overloading of operators is a subject not to be taken lightly. - Neither its precise implementation, syntax, nor semantics are - 100% endorsed by Larry Wall. So any of these may be changed - at some point in the future. - =head1 DESCRIPTION =head2 Declaration of overloaded functions --- 167,172 ---- *************** *** 274,280 **** to be assigned to the value in the left-hand-side if different from this value. ! This allows for the same method to be used as averloaded C<+=> and C<+>. Note that this is I, but not recommended, since by the semantic of L<"Fallback"> Perl will call the method for C<+> anyway, if C<+=> is not overloaded. --- 267,273 ---- to be assigned to the value in the left-hand-side if different from this value. ! This allows for the same method to be used as overloaded C<+=> and C<+>. Note that this is I, but not recommended, since by the semantic of L<"Fallback"> Perl will call the method for C<+> anyway, if C<+=> is not overloaded. *************** *** 283,289 **** B Due to the presense of assignment versions of operations, routines which may be called in assignment context may create ! self-referencial structures. Currently Perl will not free self-referential structures until cycles are C broken. You may get problems when traversing your structures too. --- 276,282 ---- B Due to the presense of assignment versions of operations, routines which may be called in assignment context may create ! self-referential structures. Currently Perl will not free self-referential structures until cycles are C broken. You may get problems when traversing your structures too. *************** *** 537,543 **** =back ! Same behaviour is triggered by C<$b = $a++>, which is consider a synonim for C<$b = $a; ++$a>. =head1 MAGIC AUTOGENERATION --- 530,536 ---- =back ! Same behaviour is triggered by C<$b = $a++>, which is consider a synonym for C<$b = $a; ++$a>. =head1 MAGIC AUTOGENERATION *************** *** 748,754 **** size penalty if overload is used in some package is that I the packages acquire a magic during the next Cing into the package. This magic is three-words-long for packages without ! overloading, and carries the cache tabel if the package is overloaded. Copying (C<$a=$b>) is shallow; however, a one-level-deep copying is carried out before any operation that can imply an assignment to the --- 741,747 ---- size penalty if overload is used in some package is that I the packages acquire a magic during the next Cing into the package. This magic is three-words-long for packages without ! overloading, and carries the cache table if the package is overloaded. Copying (C<$a=$b>) is shallow; however, a one-level-deep copying is carried out before any operation that can imply an assignment to the *************** *** 760,767 **** =head1 Metaphor clash ! One may wonder why the semantic of overloaded C<=> is so counterintuive. ! If it I counterintuive to you, you are subject to a metaphor clash. Here is a Perl object metaphor: --- 753,760 ---- =head1 Metaphor clash ! One may wonder why the semantic of overloaded C<=> is so counter intuitive. ! If it I counter intuitive to you, you are subject to a metaphor clash. Here is a Perl object metaphor: *************** *** 868,874 **** This module is very unusual as overloaded modules go: it does not provide any usual overloaded operators, instead it provides the L operator C. In this example the corresponding ! subroutine returns an object which encupsulates operations done over the objects: C contains C<['n', 3]>, C<2 + new symbolic 3> contains C<['+', 2, ['n', 3]]>. --- 861,867 ---- This module is very unusual as overloaded modules go: it does not provide any usual overloaded operators, instead it provides the L operator C. In this example the corresponding ! subroutine returns an object which encapsulates operations done over the objects: C contains C<['n', 3]>, C<2 + new symbolic 3> contains C<['+', 2, ['n', 3]]>. *************** *** 955,961 **** conversion routine. Here is the text of F with such a routine added (and ! slightly modifed str()): package symbolic; # Primitive symbolic calculator use overload --- 948,954 ---- conversion routine. Here is the text of F with such a routine added (and ! slightly modified str()): package symbolic; # Primitive symbolic calculator use overload *************** *** 994,1000 **** } All the work of numeric conversion is done in %subr and num(). Of ! course, %subr is not complete, it contains only operators used in teh example below. Here is the extra-credit question: why do we need an explicit recursion in num()? (Answer is at the end of this section.) --- 987,993 ---- } All the work of numeric conversion is done in %subr and num(). Of ! course, %subr is not complete, it contains only operators used in the example below. Here is the extra-credit question: why do we need an explicit recursion in num()? (Answer is at the end of this section.) *************** *** 1024,1030 **** (not required without mutators!), and implements only those arithmetic operations which are used in the example. ! To implement most arithmetic operattions is easy, one should just use the tables of operations, and change the code which fills %subr to my %subr = ( 'n' => sub {$_[0]} ); --- 1017,1023 ---- (not required without mutators!), and implements only those arithmetic operations which are used in the example. ! To implement most arithmetic operations is easy, one should just use the tables of operations, and change the code which fills %subr to my %subr = ( 'n' => sub {$_[0]} ); *************** *** 1102,1109 **** If you wonder why defaults for conversion are different for str() and num(), note how easy it was to write the symbolic calculator. This simplicity is due to an appropriate choice of defaults. One extra ! note: due to teh explicit recursion num() is more fragile than sym(): ! we need to explicitly check for the type of $a and $b. If componets $a and $b happen to be of some related type, this may lead to problems. =head2 I symbolic calculator --- 1095,1102 ---- If you wonder why defaults for conversion are different for str() and num(), note how easy it was to write the symbolic calculator. This simplicity is due to an appropriate choice of defaults. One extra ! note: due to the explicit recursion num() is more fragile than sym(): ! we need to explicitly check for the type of $a and $b. If components $a and $b happen to be of some related type, this may lead to problems. =head2 I symbolic calculator diff -c 'perl5.005_02/lib/perl5db.pl' 'perl5.005_03/lib/perl5db.pl' Index: ./lib/perl5db.pl *** ./lib/perl5db.pl Sat Aug 1 23:38:35 1998 --- ./lib/perl5db.pl Mon Dec 28 08:55:36 1998 *************** *** 2,8 **** # Debugger for Perl 5.00x; perl5db.pl patch level: ! $VERSION = 1.0401; $header = "perl5db.pl version $VERSION"; # Enhanced by ilya@math.ohio-state.edu (Ilya Zakharevich) --- 2,8 ---- # Debugger for Perl 5.00x; perl5db.pl patch level: ! $VERSION = 1.0402; $header = "perl5db.pl version $VERSION"; # Enhanced by ilya@math.ohio-state.edu (Ilya Zakharevich) *************** *** 235,241 **** warnLevel($warnLevel); dieLevel($dieLevel); signalLevel($signalLevel); ! &pager(defined($ENV{PAGER}) ? $ENV{PAGER} : "|more") unless defined $pager; &recallCommand("!") unless defined $prc; &shellBang("!") unless defined $psh; $maxtrace = 400 unless defined $maxtrace; --- 235,245 ---- warnLevel($warnLevel); dieLevel($dieLevel); signalLevel($signalLevel); ! &pager((defined($ENV{PAGER}) ! ? $ENV{PAGER} ! : ($^O eq 'os2' ! ? 'cmd /c more' ! : 'more'))) unless defined $pager; &recallCommand("!") unless defined $prc; &shellBang("!") unless defined $psh; $maxtrace = 400 unless defined $maxtrace; *************** *** 361,367 **** # _After_ the perl program is compiled, $single is set to 1: if ($single and not $second_time++) { if ($runnonstop) { # Disable until signal ! for ($i=0; $i <= $#stack; ) { $stack[$i++] &= ~1; } $single = 0; --- 365,371 ---- # _After_ the perl program is compiled, $single is set to 1: if ($single and not $second_time++) { if ($runnonstop) { # Disable until signal ! for ($i=0; $i <= $stack_depth; ) { $stack[$i++] &= ~1; } $single = 0; *************** *** 412,422 **** $was_signal = $signal; $signal = 0; if ($single || ($trace & 1) || $was_signal) { - $term || &setterm; if ($emacs) { $position = "\032\032$filename:$line:0\n"; print $LINEINFO $position; } elsif ($package eq 'DB::fake') { print_help(< to quit or B to restart, use B I to avoid stopping after program termination, --- 416,426 ---- $was_signal = $signal; $signal = 0; if ($single || ($trace & 1) || $was_signal) { if ($emacs) { $position = "\032\032$filename:$line:0\n"; print $LINEINFO $position; } elsif ($package eq 'DB::fake') { + $term || &setterm; print_help(< to quit or B to restart, use B I to avoid stopping after program termination, *************** *** 439,445 **** $position = "$prefix$line$infix$dbline[$line]$after"; } if ($frame) { ! print $LINEINFO ' ' x $#stack, "$line:\t$dbline[$line]$after"; } else { print $LINEINFO $position; } --- 443,449 ---- $position = "$prefix$line$infix$dbline[$line]$after"; } if ($frame) { ! print $LINEINFO ' ' x $stack_depth, "$line:\t$dbline[$line]$after"; } else { print $LINEINFO $position; } *************** *** 450,456 **** $incr_pos = "$prefix$i$infix$dbline[$i]$after"; $position .= $incr_pos; if ($frame) { ! print $LINEINFO ' ' x $#stack, "$i:\t$dbline[$i]$after"; } else { print $LINEINFO $incr_pos; } --- 454,460 ---- $incr_pos = "$prefix$i$infix$dbline[$i]$after"; $position .= $incr_pos; if ($frame) { ! print $LINEINFO ' ' x $stack_depth, "$i:\t$dbline[$i]$after"; } else { print $LINEINFO $incr_pos; } *************** *** 463,469 **** foreach $evalarg (@$pre) { &eval; } ! print $OUT $#stack . " levels deep in subroutine calls!\n" if $single & 4; $start = $line; $incr = -1; # for backward motion. --- 467,473 ---- foreach $evalarg (@$pre) { &eval; } ! print $OUT $stack_depth . " levels deep in subroutine calls!\n" if $single & 4; $start = $line; $incr = -1; # for backward motion. *************** *** 640,647 **** $arrow .= 'b' if $stop; $arrow .= 'a' if $action; print $OUT "$i$arrow\t", $dbline[$i]; ! last if $signal; } } $start = $i; # remember in case they want more $start = $max if $start > $max; --- 644,652 ---- $arrow .= 'b' if $stop; $arrow .= 'a' if $action; print $OUT "$i$arrow\t", $dbline[$i]; ! $i++, last if $signal; } + print $OUT "\n" unless $dbline[$i-1] =~ /\n$/; } $start = $i; # remember in case they want more $start = $max if $start > $max; *************** *** 879,892 **** } $dbline{$i} =~ s/($|\0)/;9$1/; # add one-time-only b.p. } ! for ($i=0; $i <= $#stack; ) { $stack[$i++] &= ~1; } last CMD; }; $cmd =~ /^r$/ && do { end_report(), next CMD if $finished and $level <= 1; ! $stack[$#stack] |= 1; ! $doret = $option{PrintRet} ? $#stack - 1 : -2; last CMD; }; $cmd =~ /^R$/ && do { print $OUT "Warning: some settings and command-line options may be lost!\n"; --- 884,897 ---- } $dbline{$i} =~ s/($|\0)/;9$1/; # add one-time-only b.p. } ! for ($i=0; $i <= $stack_depth; ) { $stack[$i++] &= ~1; } last CMD; }; $cmd =~ /^r$/ && do { end_report(), next CMD if $finished and $level <= 1; ! $stack[$stack_depth] |= 1; ! $doret = $option{PrintRet} ? $stack_depth - 1 : -2; last CMD; }; $cmd =~ /^R$/ && do { print $OUT "Warning: some settings and command-line options may be lost!\n"; *************** *** 1169,1192 **** if (length($sub) > 10 && substr($sub, -10, 10) eq '::AUTOLOAD') { $al = " for $$sub"; } ! push(@stack, $single); $single &= 1; ! $single |= 4 if $#stack == $deep; ($frame & 4 ! ? ( (print $LINEINFO ' ' x ($#stack - 1), "in "), # Why -1? But it works! :-( print_trace($LINEINFO, -1, 1, 1, "$sub$al") ) ! : print $LINEINFO ' ' x ($#stack - 1), "entering $sub$al\n") if $frame; if (wantarray) { @ret = &$sub; ! $single |= pop(@stack); ($frame & 4 ! ? ( (print $LINEINFO ' ' x $#stack, "out "), print_trace($LINEINFO, -1, 1, 1, "$sub$al") ) ! : print $LINEINFO ' ' x $#stack, "exited $sub$al\n") if $frame & 2; ! if ($doret eq $#stack or $frame & 16) { ! my $fh = ($doret eq $#stack ? $OUT : $LINEINFO); ! print $fh ' ' x $#stack if $frame & 16; print $fh "list context return from $sub:\n"; dumpit($fh, \@ret ); $doret = -2; --- 1174,1199 ---- if (length($sub) > 10 && substr($sub, -10, 10) eq '::AUTOLOAD') { $al = " for $$sub"; } ! local $stack_depth = $stack_depth + 1; # Protect from non-local exits ! $#stack = $stack_depth; ! $stack[-1] = $single; $single &= 1; ! $single |= 4 if $stack_depth == $deep; ($frame & 4 ! ? ( (print $LINEINFO ' ' x ($stack_depth - 1), "in "), # Why -1? But it works! :-( print_trace($LINEINFO, -1, 1, 1, "$sub$al") ) ! : print $LINEINFO ' ' x ($stack_depth - 1), "entering $sub$al\n") if $frame; if (wantarray) { @ret = &$sub; ! $single |= $stack[$stack_depth--]; ($frame & 4 ! ? ( (print $LINEINFO ' ' x $stack_depth, "out "), print_trace($LINEINFO, -1, 1, 1, "$sub$al") ) ! : print $LINEINFO ' ' x $stack_depth, "exited $sub$al\n") if $frame & 2; ! if ($doret eq $stack_depth or $frame & 16) { ! my $fh = ($doret eq $stack_depth ? $OUT : $LINEINFO); ! print $fh ' ' x $stack_depth if $frame & 16; print $fh "list context return from $sub:\n"; dumpit($fh, \@ret ); $doret = -2; *************** *** 1198,1211 **** } else { &$sub; undef $ret; }; ! $single |= pop(@stack); ($frame & 4 ! ? ( (print $LINEINFO ' ' x $#stack, "out "), print_trace($LINEINFO, -1, 1, 1, "$sub$al") ) ! : print $LINEINFO ' ' x $#stack, "exited $sub$al\n") if $frame & 2; ! if ($doret eq $#stack or $frame & 16 and defined wantarray) { ! my $fh = ($doret eq $#stack ? $OUT : $LINEINFO); ! print $fh (' ' x $#stack) if $frame & 16; print $fh (defined wantarray ? "scalar context return from $sub: " : "void context return from $sub\n"); --- 1205,1218 ---- } else { &$sub; undef $ret; }; ! $single |= $stack[$stack_depth--]; ($frame & 4 ! ? ( (print $LINEINFO ' ' x $stack_depth, "out "), print_trace($LINEINFO, -1, 1, 1, "$sub$al") ) ! : print $LINEINFO ' ' x $stack_depth, "exited $sub$al\n") if $frame & 2; ! if ($doret eq $stack_depth or $frame & 16 and defined wantarray) { ! my $fh = ($doret eq $stack_depth ? $OUT : $LINEINFO); ! print $fh (' ' x $stack_depth) if $frame & 16; print $fh (defined wantarray ? "scalar context return from $sub: " : "void context return from $sub\n"); *************** *** 1226,1232 **** sub eval { my @res; { - local (@stack) = @stack; # guard against recursive debugging my $otrace = $trace; my $osingle = $single; my $od = $^D; --- 1233,1238 ---- *************** *** 1284,1290 **** $filename =~ s/^_.clist) for file in `$cat .clist`; do # for file in `cat /dev/null`; do + if [ "$osname" = uwin ]; then + uwinfix="-e s,\\\\\\\\,/,g -e s,\\([a-zA-Z]\\):/,/\\1/,g" + else + if [ "$osname" = os2 ]; then + uwinfix="-e s,\\\\\\\\,/,g" + else + uwinfix= + fi + fi case "$file" in *.c) filebase=`basename $file .c` ;; *.y) filebase=`basename $file .y` ;; *************** *** 126,132 **** -e 's/^.*"\(.*\)".*$/'$filebase'\$(OBJ_EXT): \1/' \ -e 's/^# *[0-9][0-9]* \(.*\)$/'$filebase'\$(OBJ_EXT): \1/' \ -e 's|: \./|: |' \ ! -e 's|\.c\.c|.c|' | \ $uniq | $sort | $uniq >> .deptmp done --- 136,142 ---- -e 's/^.*"\(.*\)".*$/'$filebase'\$(OBJ_EXT): \1/' \ -e 's/^# *[0-9][0-9]* \(.*\)$/'$filebase'\$(OBJ_EXT): \1/' \ -e 's|: \./|: |' \ ! -e 's|\.c\.c|.c|' $uwinfix | \ $uniq | $sort | $uniq >> .deptmp done diff -c 'perl5.005_02/malloc.c' 'perl5.005_03/malloc.c' Index: ./malloc.c *** ./malloc.c Sun Aug 2 04:35:23 1998 --- ./malloc.c Wed Mar 3 20:35:39 1999 *************** *** 141,147 **** #define MIN_BUC_POW2 (sizeof(void*) > 4 ? 3 : 2) /* Allow for 4-byte arena. */ #define MIN_BUCKET (MIN_BUC_POW2 * BUCKETS_PER_POW2) ! #if !(defined(I286) || defined(atarist)) /* take 2k unless the block is bigger than that */ # define LOG_OF_MIN_ARENA 11 #else --- 141,147 ---- #define MIN_BUC_POW2 (sizeof(void*) > 4 ? 3 : 2) /* Allow for 4-byte arena. */ #define MIN_BUCKET (MIN_BUC_POW2 * BUCKETS_PER_POW2) ! #if !(defined(I286) || defined(atarist) || defined(__MINT__)) /* take 2k unless the block is bigger than that */ # define LOG_OF_MIN_ARENA 11 #else *************** *** 247,253 **** #define u_short unsigned short /* 286 and atarist like big chunks, which gives too much overhead. */ ! #if (defined(RCHECK) || defined(I286) || defined(atarist)) && defined(PACK_MALLOC) # undef PACK_MALLOC #endif --- 247,253 ---- #define u_short unsigned short /* 286 and atarist like big chunks, which gives too much overhead. */ ! #if (defined(RCHECK) || defined(I286) || defined(atarist) || defined(__MINT__)) && defined(PACK_MALLOC) # undef PACK_MALLOC #endif *************** *** 570,581 **** # define BIG_SIZE (1<<16) /* 64K */ # endif static char *emergency_buffer; static MEM_SIZE emergency_buffer_size; static Malloc_t ! emergency_sbrk(size) ! MEM_SIZE size; { MEM_SIZE rsize = (((size - 1)>>LOG_OF_MIN_ARENA) + 1)<>LOG_OF_MIN_ARENA) + 1)<'s whole list */ Malloc_t realloc(void *mp, size_t nbytes) --- 1263,1269 ---- * is extern so the caller can modify it). If that fails we just copy * however many bytes was given to realloc() and hope it's not huge. */ ! int reall_srchlen = 4; /* 4 should be plenty, -1 =>'s whole list */ Malloc_t realloc(void *mp, size_t nbytes) *************** *** 1572,1582 **** #ifdef USE_PERL_SBRK ! # ifdef NeXT ! # define PERL_SBRK_VIA_MALLOC ! # endif ! ! # ifdef __MACHTEN_PPC__ # define PERL_SBRK_VIA_MALLOC /* * MachTen's malloc() returns a buffer aligned on a two-byte boundary. --- 1581,1587 ---- #ifdef USE_PERL_SBRK ! # if defined(__MACHTEN_PPC__) || defined(__NeXT__) # define PERL_SBRK_VIA_MALLOC /* * MachTen's malloc() returns a buffer aligned on a two-byte boundary. *************** *** 1619,1626 **** # define PERLSBRK_64_K (1<<16) Malloc_t ! Perl_sbrk(size) ! int size; { IV got; int small, reqsize; --- 1624,1630 ---- # define PERLSBRK_64_K (1<<16) Malloc_t ! Perl_sbrk(int size) { IV got; int small, reqsize; diff -c 'perl5.005_02/mg.c' 'perl5.005_03/mg.c' Index: ./mg.c *** ./mg.c Sun Aug 2 01:08:10 1998 --- ./mg.c Sat Mar 27 12:36:36 1999 *************** *** 1,6 **** /* mg.c * ! * Copyright (c) 1991-1997, Larry Wall * * You may distribute under the terms of either the GNU General Public * License or the Artistic License, as specified in the README file. --- 1,6 ---- /* mg.c * ! * Copyright (c) 1991-1999, Larry Wall * * You may distribute under the terms of either the GNU General Public * License or the Artistic License, as specified in the README file. *************** *** 248,254 **** MAGIC* mg; for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) { if (isUPPER(mg->mg_type)) { ! sv_magic(nsv, mg->mg_obj, toLOWER(mg->mg_type), key, klen); count++; } } --- 248,256 ---- MAGIC* mg; for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) { if (isUPPER(mg->mg_type)) { ! sv_magic(nsv, ! mg->mg_type == 'P' ? SvTIED_obj(sv, mg) : mg->mg_obj, ! toLOWER(mg->mg_type), key, klen); count++; } } *************** *** 339,346 **** return (STRLEN)PL_orslen; } magic_get(sv,mg); ! if (!SvPOK(sv) && SvNIOK(sv)) ! sv_2pv(sv, &PL_na); if (SvPOK(sv)) return SvCUR(sv); return 0; --- 341,350 ---- return (STRLEN)PL_orslen; } magic_get(sv,mg); ! if (!SvPOK(sv) && SvNIOK(sv)) { ! STRLEN n_a; ! sv_2pv(sv, &n_a); ! } if (SvPOK(sv)) return SvCUR(sv); return 0; *************** *** 360,365 **** --- 364,372 ---- case '\001': /* ^A */ sv_setsv(sv, PL_bodytarget); break; + case '\003': /* ^C */ + sv_setiv(sv, (IV)PL_minus_c); + break; case '\004': /* ^D */ sv_setiv(sv, (IV)(PL_debug & 32767)); break; *************** *** 382,389 **** sv_setnv(sv, (double)errno); sv_setpv(sv, errno ? Strerror(errno) : ""); } else { ! if (errno != errno_isOS2) ! Perl_rc = _syserrno(); sv_setnv(sv, (double)Perl_rc); sv_setpv(sv, os2error(Perl_rc)); } --- 389,399 ---- sv_setnv(sv, (double)errno); sv_setpv(sv, errno ? Strerror(errno) : ""); } else { ! if (errno != errno_isOS2) { ! int tmp = _syserrno(); ! if (tmp) /* 2nd call to _syserrno() makes it 0 */ ! Perl_rc = tmp; ! } sv_setnv(sv, (double)Perl_rc); sv_setpv(sv, os2error(Perl_rc)); } *************** *** 716,722 **** int magic_clearenv(SV *sv, MAGIC *mg) { ! my_setenv(MgPV(mg,PL_na),Nullch); return 0; } --- 726,733 ---- int magic_clearenv(SV *sv, MAGIC *mg) { ! STRLEN n_a; ! my_setenv(MgPV(mg,n_a),Nullch); return 0; } *************** *** 729,740 **** dTHR; if (PL_localizing) { HE* entry; magic_clear_all_env(sv,mg); hv_iterinit((HV*)sv); while (entry = hv_iternext((HV*)sv)) { I32 keylen; my_setenv(hv_iterkey(entry, &keylen), ! SvPV(hv_iterval((HV*)sv, entry), PL_na)); } } #endif --- 740,752 ---- dTHR; if (PL_localizing) { HE* entry; + STRLEN n_a; magic_clear_all_env(sv,mg); hv_iterinit((HV*)sv); while (entry = hv_iternext((HV*)sv)) { I32 keylen; my_setenv(hv_iterkey(entry, &keylen), ! SvPV(hv_iterval((HV*)sv, entry), n_a)); } } #endif *************** *** 757,763 **** *end = '\0'; my_setenv(cur,Nullch); *end = '='; ! cur += strlen(end+1)+1; } else if ((len = strlen(cur))) cur += len+1; --- 769,775 ---- *end = '\0'; my_setenv(cur,Nullch); *end = '='; ! cur = end + strlen(end+1)+2; } else if ((len = strlen(cur))) cur += len+1; *************** *** 782,789 **** magic_getsig(SV *sv, MAGIC *mg) { I32 i; /* Are we fetching a signal entry? */ ! i = whichsig(MgPV(mg,PL_na)); if (i) { if(psig_ptr[i]) sv_setsv(sv,psig_ptr[i]); --- 794,802 ---- magic_getsig(SV *sv, MAGIC *mg) { I32 i; + STRLEN n_a; /* Are we fetching a signal entry? */ ! i = whichsig(MgPV(mg,n_a)); if (i) { if(psig_ptr[i]) sv_setsv(sv,psig_ptr[i]); *************** *** 805,812 **** magic_clearsig(SV *sv, MAGIC *mg) { I32 i; /* Are we clearing a signal entry? */ ! i = whichsig(MgPV(mg,PL_na)); if (i) { if(psig_ptr[i]) { SvREFCNT_dec(psig_ptr[i]); --- 818,826 ---- magic_clearsig(SV *sv, MAGIC *mg) { I32 i; + STRLEN n_a; /* Are we clearing a signal entry? */ ! i = whichsig(MgPV(mg,n_a)); if (i) { if(psig_ptr[i]) { SvREFCNT_dec(psig_ptr[i]); *************** *** 827,834 **** register char *s; I32 i; SV** svp; ! s = MgPV(mg,PL_na); if (*s == '_') { if (strEQ(s,"__DIE__")) svp = &PL_diehook; --- 841,849 ---- register char *s; I32 i; SV** svp; + STRLEN n_a; ! s = MgPV(mg,n_a); if (*s == '_') { if (strEQ(s,"__DIE__")) svp = &PL_diehook; *************** *** 865,871 **** *svp = SvREFCNT_inc(sv); return 0; } ! s = SvPV_force(sv,PL_na); if (strEQ(s,"IGNORE")) { if (i) (void)rsignal(i, SIG_IGN); --- 880,886 ---- *svp = SvREFCNT_inc(sv); return 0; } ! s = SvPV_force(sv,n_a); if (strEQ(s,"IGNORE")) { if (i) (void)rsignal(i, SIG_IGN); *************** *** 922,928 **** if (hv) { (void) hv_iterinit(hv); ! if (!SvRMAGICAL(hv) || !mg_find((SV*)hv,'P')) i = HvKEYS(hv); else { /*SUPPRESS 560*/ --- 937,943 ---- if (hv) { (void) hv_iterinit(hv); ! if (! SvTIED_mg((SV*)hv, 'P')) i = HvKEYS(hv); else { /*SUPPRESS 560*/ *************** *** 947,959 **** /* caller is responsible for stack switching/cleanup */ STATIC int ! magic_methcall(MAGIC *mg, char *meth, I32 flags, int n, SV *val) { dSP; PUSHMARK(SP); EXTEND(SP, n); ! PUSHs(mg->mg_obj); if (n > 1) { if (mg->mg_ptr) { if (mg->mg_len >= 0) --- 962,974 ---- /* caller is responsible for stack switching/cleanup */ STATIC int ! magic_methcall(SV *sv, MAGIC *mg, char *meth, I32 flags, int n, SV *val) { dSP; PUSHMARK(SP); EXTEND(SP, n); ! PUSHs(SvTIED_obj(sv, mg)); if (n > 1) { if (mg->mg_ptr) { if (mg->mg_len >= 0) *************** *** 982,988 **** SAVETMPS; PUSHSTACKi(PERLSI_MAGIC); ! if (magic_methcall(mg, meth, G_SCALAR, 2, NULL)) { sv_setsv(sv, *PL_stack_sp--); } --- 997,1003 ---- SAVETMPS; PUSHSTACKi(PERLSI_MAGIC); ! if (magic_methcall(sv, mg, meth, G_SCALAR, 2, NULL)) { sv_setsv(sv, *PL_stack_sp--); } *************** *** 1007,1013 **** dSP; ENTER; PUSHSTACKi(PERLSI_MAGIC); ! magic_methcall(mg, "STORE", G_SCALAR|G_DISCARD, 3, sv); POPSTACK; LEAVE; return 0; --- 1022,1028 ---- dSP; ENTER; PUSHSTACKi(PERLSI_MAGIC); ! magic_methcall(sv, mg, "STORE", G_SCALAR|G_DISCARD, 3, sv); POPSTACK; LEAVE; return 0; *************** *** 1029,1035 **** ENTER; SAVETMPS; PUSHSTACKi(PERLSI_MAGIC); ! if (magic_methcall(mg, "FETCHSIZE", G_SCALAR, 2, NULL)) { sv = *PL_stack_sp--; retval = (U32) SvIV(sv)-1; } --- 1044,1050 ---- ENTER; SAVETMPS; PUSHSTACKi(PERLSI_MAGIC); ! if (magic_methcall(sv, mg, "FETCHSIZE", G_SCALAR, 2, NULL)) { sv = *PL_stack_sp--; retval = (U32) SvIV(sv)-1; } *************** *** 1046,1052 **** ENTER; PUSHSTACKi(PERLSI_MAGIC); PUSHMARK(SP); ! XPUSHs(mg->mg_obj); PUTBACK; perl_call_method("CLEAR", G_SCALAR|G_DISCARD); POPSTACK; --- 1061,1067 ---- ENTER; PUSHSTACKi(PERLSI_MAGIC); PUSHMARK(SP); ! XPUSHs(SvTIED_obj(sv, mg)); PUTBACK; perl_call_method("CLEAR", G_SCALAR|G_DISCARD); POPSTACK; *************** *** 1065,1071 **** PUSHSTACKi(PERLSI_MAGIC); PUSHMARK(SP); EXTEND(SP, 2); ! PUSHs(mg->mg_obj); if (SvOK(key)) PUSHs(key); PUTBACK; --- 1080,1086 ---- PUSHSTACKi(PERLSI_MAGIC); PUSHMARK(SP); EXTEND(SP, 2); ! PUSHs(SvTIED_obj(sv, mg)); if (SvOK(key)) PUSHs(key); PUTBACK; *************** *** 1093,1103 **** I32 i; GV* gv; SV** svp; gv = PL_DBline; i = SvTRUE(sv); svp = av_fetch(GvAV(gv), ! atoi(MgPV(mg,PL_na)), FALSE); if (svp && SvIOKp(*svp) && (o = (OP*)SvSTASH(*svp))) o->op_private = i; else --- 1108,1119 ---- I32 i; GV* gv; SV** svp; + STRLEN n_a; gv = PL_DBline; i = SvTRUE(sv); svp = av_fetch(GvAV(gv), ! atoi(MgPV(mg,n_a)), FALSE); if (svp && SvIOKp(*svp) && (o = (OP*)SvSTASH(*svp))) o->op_private = i; else *************** *** 1193,1202 **** { register char *s; GV* gv; if (!SvOK(sv)) return 0; ! s = SvPV(sv, PL_na); if (*s == '*' && s[1]) s++; gv = gv_fetchpv(s,TRUE, SVt_PVGV); --- 1209,1219 ---- { register char *s; GV* gv; + STRLEN n_a; if (!SvOK(sv)) return 0; ! s = SvPV(sv, n_a); if (*s == '*' && s[1]) s++; gv = gv_fetchpv(s,TRUE, SVt_PVGV); *************** *** 1406,1413 **** if (svp) value = *svp; } ! if (!value || value == &PL_sv_undef) ! croak(no_helem, SvPV(mg->mg_obj, PL_na)); } else { AV* av = (AV*)LvTARG(sv); --- 1423,1432 ---- if (svp) value = *svp; } ! if (!value || value == &PL_sv_undef) { ! STRLEN n_a; ! croak(no_helem, SvPV(mg->mg_obj, n_a)); ! } } else { AV* av = (AV*)LvTARG(sv); *************** *** 1498,1503 **** --- 1517,1525 ---- case '\001': /* ^A */ sv_setsv(PL_bodytarget, sv); break; + case '\003': /* ^C */ + PL_minus_c = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv); + break; case '\004': /* ^D */ PL_debug = (SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv)) | 0x80000000; DEBUG_x(dump_all()); *************** *** 1524,1530 **** if (PL_inplace) Safefree(PL_inplace); if (SvOK(sv)) ! PL_inplace = savepv(SvPV(sv,PL_na)); else PL_inplace = Nullch; break; --- 1546,1552 ---- if (PL_inplace) Safefree(PL_inplace); if (SvOK(sv)) ! PL_inplace = savepv(SvPV(sv,len)); else PL_inplace = Nullch; break; *************** *** 1532,1538 **** if (PL_osname) Safefree(PL_osname); if (SvOK(sv)) ! PL_osname = savepv(SvPV(sv,PL_na)); else PL_osname = Nullch; break; --- 1554,1560 ---- if (PL_osname) Safefree(PL_osname); if (SvOK(sv)) ! PL_osname = savepv(SvPV(sv,len)); else PL_osname = Nullch; break; *************** *** 1559,1570 **** break; case '^': Safefree(IoTOP_NAME(GvIOp(PL_defoutgv))); ! IoTOP_NAME(GvIOp(PL_defoutgv)) = s = savepv(SvPV(sv,PL_na)); IoTOP_GV(GvIOp(PL_defoutgv)) = gv_fetchpv(s,TRUE, SVt_PVIO); break; case '~': Safefree(IoFMT_NAME(GvIOp(PL_defoutgv))); ! IoFMT_NAME(GvIOp(PL_defoutgv)) = s = savepv(SvPV(sv,PL_na)); IoFMT_GV(GvIOp(PL_defoutgv)) = gv_fetchpv(s,TRUE, SVt_PVIO); break; case '=': --- 1581,1592 ---- break; case '^': Safefree(IoTOP_NAME(GvIOp(PL_defoutgv))); ! IoTOP_NAME(GvIOp(PL_defoutgv)) = s = savepv(SvPV(sv,len)); IoTOP_GV(GvIOp(PL_defoutgv)) = gv_fetchpv(s,TRUE, SVt_PVIO); break; case '~': Safefree(IoFMT_NAME(GvIOp(PL_defoutgv))); ! IoFMT_NAME(GvIOp(PL_defoutgv)) = s = savepv(SvPV(sv,len)); IoFMT_GV(GvIOp(PL_defoutgv)) = gv_fetchpv(s,TRUE, SVt_PVIO); break; case '=': *************** *** 1621,1627 **** case '#': if (PL_ofmt) Safefree(PL_ofmt); ! PL_ofmt = savepv(SvPV(sv,PL_na)); break; case '[': PL_compiling.cop_arybase = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv); --- 1643,1649 ---- case '#': if (PL_ofmt) Safefree(PL_ofmt); ! PL_ofmt = savepv(SvPV(sv,len)); break; case '[': PL_compiling.cop_arybase = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv); *************** *** 1729,1735 **** case ')': #ifdef HAS_SETGROUPS { ! char *p = SvPV(sv, PL_na); Groups_t gary[NGROUPS]; SET_NUMERIC_STANDARD(); --- 1751,1757 ---- case ')': #ifdef HAS_SETGROUPS { ! char *p = SvPV(sv, len); Groups_t gary[NGROUPS]; SET_NUMERIC_STANDARD(); *************** *** 1777,1783 **** PL_tainting |= (PL_uid && (PL_euid != PL_uid || PL_egid != PL_gid)); break; case ':': ! PL_chopset = SvPV_force(sv,PL_na); break; case '0': if (!PL_origalen) { --- 1799,1805 ---- PL_tainting |= (PL_uid && (PL_euid != PL_uid || PL_egid != PL_gid)); break; case ':': ! PL_chopset = SvPV_force(sv,len); break; case '0': if (!PL_origalen) { *************** *** 1790,1796 **** || PL_origargv[i] == s + 2 #endif ) ! s += strlen(++s); /* this one is ok too */ else break; } --- 1812,1821 ---- || PL_origargv[i] == s + 2 #endif ) ! { ! ++s; ! s += strlen(s); /* this one is ok too */ ! } else break; } *************** *** 1803,1810 **** my_setenv("NoNe SuCh", Nullch); /* force copy of environment */ for (i = 0; PL_origenviron[i]; i++) ! if (PL_origenviron[i] == s + 1) ! s += strlen(++s); else break; } --- 1828,1837 ---- my_setenv("NoNe SuCh", Nullch); /* force copy of environment */ for (i = 0; PL_origenviron[i]; i++) ! if (PL_origenviron[i] == s + 1) { ! ++s; ! s += strlen(s); ! } else break; } *************** *** 1851,1857 **** croak("panic: magic_mutexfree"); MUTEX_DESTROY(MgMUTEXP(mg)); COND_DESTROY(MgCONDP(mg)); - SvREFCNT_dec(sv); return 0; } #endif /* USE_THREADS */ --- 1878,1883 ---- diff -c 'perl5.005_02/mg.h' 'perl5.005_03/mg.h' Index: ./mg.h *** ./mg.h Thu Jul 23 23:01:00 1998 --- ./mg.h Sat Mar 27 11:56:50 1999 *************** *** 1,6 **** /* mg.h * ! * Copyright (c) 1991-1997, Larry Wall * * You may distribute under the terms of either the GNU General Public * License or the Artistic License, as specified in the README file. --- 1,6 ---- /* mg.h * ! * Copyright (c) 1991-1999, Larry Wall * * You may distribute under the terms of either the GNU General Public * License or the Artistic License, as specified in the README file. *************** *** 43,45 **** --- 43,50 ---- #define MgPV(mg,lp) (((lp = (mg)->mg_len) == HEf_SVKEY) ? \ SvPV((SV*)((mg)->mg_ptr),lp) : \ (mg)->mg_ptr) + + #define SvTIED_mg(sv,how) \ + (SvRMAGICAL(sv) ? mg_find((sv),(how)) : Null(MAGIC*)) + #define SvTIED_obj(sv,mg) \ + ((mg)->mg_obj ? (mg)->mg_obj : sv_2mortal(newRV(sv))) diff -c 'perl5.005_02/miniperlmain.c' 'perl5.005_03/miniperlmain.c' Index: ./miniperlmain.c *** ./miniperlmain.c Thu Jul 23 23:01:00 1998 --- ./miniperlmain.c Thu Jan 28 19:14:22 1999 *************** *** 13,18 **** --- 13,24 ---- static void xs_init _((void)); static PerlInterpreter *my_perl; + #if defined (__MINT__) || defined (atarist) + /* The Atari operating system doesn't have a dynamic stack. The + stack size is determined from this value. */ + long _stksize = 64 * 1024; + #endif + int main(int argc, char **argv, char **env) { diff -c /dev/null 'perl5.005_03/mint/Makefile' Index: mint/Makefile *** mint/Makefile Wed Dec 31 18:00:00 1969 --- mint/Makefile Thu Jan 28 19:14:22 1999 *************** *** 0 **** --- 1,15 ---- + # IMPORTANT: This Makefile is not intended to build Perl itself but + # only to replace a broken pwd command! + + all: pwd + + pwd: pwd.c + $(CC) -O3 -o pwd pwd.c + + install: pwd + (new_pwd=`which pwd` && cp -f $$new_pwd $$new_pwd.broken \ + && cp -f pwd $$new_pwd) + + clean: + rm -f pwd.o pwd + diff -c /dev/null 'perl5.005_03/mint/README' Index: mint/README *** mint/README Wed Dec 31 18:00:00 1969 --- mint/README Thu Jan 28 19:14:22 1999 *************** *** 0 **** --- 1,14 ---- + This subdirectory contains some additional files which are necessary + (or at least useful) when compiling Perl on MiNT. + + "Makefile" and "pwd.c" will build and install a fixed version of the + pwd command if your system pwd is broken. + + The header files are wrappers around broken system header files. Make + sure that this directory stands at first place in your include path + when compiling Perl. + + The file system.c is an enhanced version of the system() function + in the MiNTLib. It is strongly recommended that you insert this + version into your libc before you compile Perl (see README.MiNT + in the toplevel directory for details). diff -c /dev/null 'perl5.005_03/mint/errno.h' Index: mint/errno.h *** mint/errno.h Wed Dec 31 18:00:00 1969 --- mint/errno.h Thu Jan 28 19:14:22 1999 *************** *** 0 **** --- 1,32 ---- + /* Wrapper around broken system errno.h. */ + + #ifndef _PERL_WRAPPER_AROUND_ERRNO_H + # define _PERL_WRAPPER_AROUND_ERRNO_H 1 + + /* First include the system file. */ + #include_next + + /* Now add the missing stuff. + #ifndef EAGAIN + # define EAGAIN EWOULDBLOCK + #endif + + /* This one is problematic. If you open() a directory with the + MiNTLib you can't detect from errno if it is really a directory + or if the file simply doesn't exist. You'll get ENOENT + ("file not found") in either case. + + Defining EISDIR as ENOENT is actually a bad idea but works fine + in general. In praxi, if code checks for errno == EISDIR it + will attempt an opendir() call on the file in question and this + call will also file if the file really can't be found. But + you may get compile-time errors if the errno checking is embedded + in a switch statement ("duplicate case value in switch"). + + Anyway, here the define works alright. */ + #ifndef EISDIR + # define EISDIR ENOENT + #endif + + #endif + diff -c /dev/null 'perl5.005_03/mint/pwd.c' Index: mint/pwd.c *** mint/pwd.c Wed Dec 31 18:00:00 1969 --- mint/pwd.c Thu Jan 28 19:14:23 1999 *************** *** 0 **** --- 1,43 ---- + /* pwd.c - replacement for broken pwd command. + * Copyright 1997 Guido Flohr, . + * Do with it as you please. + */ + #include + #include + #include + #include + #include + + #if defined(__STDC__) || defined(__cplusplus) + int main (int argc, char* argv[]) + #else + int main (argc, argv) + int argc; + char* argv[]; + #endif + { + char path_buf[PATH_MAX + 1]; + + if (argc > 1) { + int i; + + fflush (stdout); + fputs (argv[0], stderr); + fputs (": ignoring garbage arguments\n", stderr); + } + + if (!getcwd (path_buf, PATH_MAX + 1)) { + fflush (stdout); + /* Save space, memory and the whales, avoid fprintf. */ + fputs (argv[0], stderr); + fputs (": can\'t get current working directory: ", stderr); + fputs (strerror (errno), stderr); + fputc ('\n', stderr); + return 1; + } + if (puts (path_buf) < 0) { + return 1; + } + return 0; + } + /* End of pwd.c. */ diff -c /dev/null 'perl5.005_03/mint/stdio.h' Index: mint/stdio.h *** mint/stdio.h Wed Dec 31 18:00:00 1969 --- mint/stdio.h Thu Jan 28 19:14:23 1999 *************** *** 0 **** --- 1,21 ---- + /* Wrapper around broken system stdio.h. */ + + #ifndef _PERL_WRAPPER_AROUND_STDIO_H + # define _PERL_WRAPPER_AROUND_STDIO_H 1 + + /* The MiNTLib has a macro called EOS in stdio.h. This conflicts + with regnode.h. Who had this glorious idea. */ + #ifdef EOS + # define PERL_EOS EOS + #endif + + /* First include the system file. */ + #include_next + + #ifdef EOS + # undef EOS + # define EOS PERL_EOS + #endif + + #endif + diff -c /dev/null 'perl5.005_03/mint/sys/time.h' Index: mint/sys/time.h *** mint/sys/time.h Wed Dec 31 18:00:00 1969 --- mint/sys/time.h Thu Jan 28 19:14:25 1999 *************** *** 0 **** --- 1,2 ---- + #include + diff -c /dev/null 'perl5.005_03/mint/time.h' Index: mint/time.h *** mint/time.h Wed Dec 31 18:00:00 1969 --- mint/time.h Thu Jan 28 19:14:25 1999 *************** *** 0 **** --- 1,22 ---- + /* Wrapper around broken system time.h. */ + + #ifndef _PERL_WRAPPER_AROUND_TIME_H + # define _PERL_WRAPPER_AROUND_TIME_H 1 + + /* Recent versions of the MiNTLib have a macro HAS_TZNAME in + time.h resp. sys/time.h. Wow, I wonder why they didn't + define HAVE_CONFIG_H ... */ + #ifdef HAS_TZNAME + # define PERL_HAS_TZNAME HAS_TZNAME + #endif + + /* First include the system file. */ + #include_next + + #ifdef HAS_TZNAME + # undef HAS_TZNAME + # define HAS_TZNAME PERL_HAS_TZNAME + #endif + + #endif + diff -c 'perl5.005_02/mpeix/relink' 'perl5.005_03/mpeix/relink' Index: ./mpeix/relink *** ./mpeix/relink Thu Jul 23 23:01:00 1998 --- ./mpeix/relink Thu Jan 28 19:14:25 1999 *************** *** 4,8 **** # libraries via gcc or ld. For now, re-run gcc without the external library # list, and then run the native linker with the list of dynamic libraries. ! gcc -o perl perlmain.o lib/auto/DynaLoader/DynaLoader.a libperl.a `cat ext.libs` -L/BIND/PUB/lib -lbind ! callci 'linkedit "altprog ./perl;xl=/lib/libsvipc.sl,/usr/lib/libsocket.sl,/lib/libm.sl,/lib/libc.sl"' --- 4,8 ---- # libraries via gcc or ld. For now, re-run gcc without the external library # list, and then run the native linker with the list of dynamic libraries. ! gcc -o perl perlmain.o lib/auto/DynaLoader/DynaLoader.a libperl.a `cat ext.libs` -L/BIND/PUB/lib -lbind -L/SYSLOG/PUB -lsyslog ! callci 'linkedit "altprog ./perl;xl=/usr/lib/libcurses.sl,/lib/libsvipc.sl,/usr/lib/libsocket.sl,/lib/libm.sl,/lib/libc.sl"' diff -c 'perl5.005_02/objXSUB.h' 'perl5.005_03/objXSUB.h' Index: ./objXSUB.h *** ./objXSUB.h Thu Jul 23 23:01:01 1998 --- ./objXSUB.h Sat Jan 16 12:13:37 1999 *************** *** 19,24 **** --- 19,26 ---- #define PL_colors pPerl->PL_colors #undef PL_colorset #define PL_colorset pPerl->PL_colorset + #undef PL_cred_mutex + #define PL_cred_mutex pPerl->PL_cred_mutex #undef PL_curcop #define PL_curcop pPerl->PL_curcop #undef PL_curpad *************** *** 443,448 **** --- 445,452 ---- #define PL_strchop pPerl->PL_strchop #undef PL_strtab #define PL_strtab pPerl->PL_strtab + #undef PL_strtab_mutex + #define PL_strtab_mutex pPerl->PL_strtab_mutex #undef PL_sub_generation #define PL_sub_generation pPerl->PL_sub_generation #undef PL_sublex_info *************** *** 902,907 **** --- 906,913 ---- #define do_vecset pPerl->Perl_do_vecset #undef do_vop #define do_vop pPerl->Perl_do_vop + #undef dofile + #define dofile pPerl->Perl_dofile #undef dowantarray #define dowantarray pPerl->Perl_dowantarray #undef dump_all *************** *** 966,971 **** --- 972,979 ---- #define get_opargs pPerl->Perl_get_opargs #undef get_specialsv_list #define get_specialsv_list pPerl->Perl_get_specialsv_list + #undef get_vtbl + #define get_vtbl pPerl->Perl_get_vtbl #undef gp_free #define gp_free pPerl->Perl_gp_free #undef gp_ref *************** *** 1569,1574 **** --- 1577,1584 ---- #define save_freeop pPerl->Perl_save_freeop #undef save_freepv #define save_freepv pPerl->Perl_save_freepv + #undef save_generic_svref + #define save_generic_svref pPerl->Perl_generic_save_svref #undef save_gp #define save_gp pPerl->Perl_save_gp #undef save_hash *************** *** 1977,1984 **** #define signal PerlProc_signal #define htonl PerlSock_htonl #define htons PerlSock_htons ! #define ntohs PerlSock_ntohl ! #define ntohl PerlSock_ntohs #define accept PerlSock_accept #define bind PerlSock_bind #define connect PerlSock_connect --- 1987,1994 ---- #define signal PerlProc_signal #define htonl PerlSock_htonl #define htons PerlSock_htons ! #define ntohl PerlSock_ntohl ! #define ntohs PerlSock_ntohs #define accept PerlSock_accept #define bind PerlSock_bind #define connect PerlSock_connect diff -c 'perl5.005_02/objpp.h' 'perl5.005_03/objpp.h' Index: ./objpp.h *** ./objpp.h Thu Jul 23 23:01:02 1998 --- ./objpp.h Sat Jan 16 12:13:37 1999 *************** *** 3,8 **** --- 3,12 ---- #undef amagic_call #define amagic_call CPerlObj::Perl_amagic_call + #undef amagic_cmp + #define amagic_cmp CPerlObj::amagic_cmp + #undef amagic_cmp_locale + #define amagic_cmp_locale CPerlObj::amagic_cmp_locale #undef Gv_AMupdate #define Gv_AMupdate CPerlObj::Perl_Gv_AMupdate #undef add_data *************** *** 289,294 **** --- 293,300 ---- #define do_vecset CPerlObj::Perl_do_vecset #undef do_vop #define do_vop CPerlObj::Perl_do_vop + #undef dofile + #define dofile CPerlObj::Perl_dofile #undef do_clean_all #define do_clean_all CPerlObj::do_clean_all #undef do_clean_named_objs *************** *** 375,380 **** --- 381,388 ---- #define get_opargs CPerlObj::Perl_get_opargs #undef get_specialsv_list #define get_specialsv_list CPerlObj::Perl_get_specialsv_list + #undef get_vtbl + #define get_vtbl CPerlObj::Perl_get_vtbl #undef getlogin #define getlogin CPerlObj::getlogin #undef gp_free *************** *** 1095,1100 **** --- 1103,1110 ---- #define save_freeop CPerlObj::Perl_save_freeop #undef save_freepv #define save_freepv CPerlObj::Perl_save_freepv + #undef save_generic_svref + #define save_generic_svref CPerlObj::Perl_save_generic_svref #undef save_gp #define save_gp CPerlObj::Perl_save_gp #undef save_hash diff -c 'perl5.005_02/op.c' 'perl5.005_03/op.c' Index: ./op.c *** ./op.c Mon Aug 3 11:36:04 1998 --- ./op.c Sun Mar 28 10:13:03 1999 *************** *** 1,6 **** /* op.c * ! * Copyright (c) 1991-1997, Larry Wall * * You may distribute under the terms of either the GNU General Public * License or the Artistic License, as specified in the README file. --- 1,6 ---- /* op.c * ! * Copyright (c) 1991-1999, Larry Wall * * You may distribute under the terms of either the GNU General Public * License or the Artistic License, as specified in the README file. *************** *** 35,40 **** --- 35,42 ---- Nullop ) \ : (CHECKCALL[type])((OP*)o)) + #define PAD_MAX 999999999 + static bool scalar_mod_type _((OP *o, I32 type)); #ifndef PERL_OBJECT static I32 list_assignment _((OP *o)); *************** *** 46,52 **** static OP *too_many_arguments _((OP *o, char* name)); static void null _((OP* o)); static PADOFFSET pad_findlex _((char* name, PADOFFSET newoff, U32 seq, ! CV* startcv, I32 cx_ix)); static OP *newDEFSVOP _((void)); static OP *new_logop _((I32 type, I32 flags, OP **firstp, OP **otherp)); #endif --- 48,54 ---- static OP *too_many_arguments _((OP *o, char* name)); static void null _((OP* o)); static PADOFFSET pad_findlex _((char* name, PADOFFSET newoff, U32 seq, ! CV* startcv, I32 cx_ix, I32 saweval, U32 flags)); static OP *newDEFSVOP _((void)); static OP *new_logop _((I32 type, I32 flags, OP **firstp, OP **otherp)); #endif *************** *** 55,62 **** gv_ename(GV *gv) { SV* tmpsv = sv_newmortal(); gv_efullname3(tmpsv, gv, Nullch); ! return SvPV(tmpsv,PL_na); } STATIC OP * --- 57,65 ---- gv_ename(GV *gv) { SV* tmpsv = sv_newmortal(); + STRLEN n_a; gv_efullname3(tmpsv, gv, Nullch); ! return SvPV(tmpsv,n_a); } STATIC OP * *************** *** 131,140 **** for (off = AvFILLp(PL_comppad_name); off > PL_comppad_name_floor; off--) { if ((sv = svp[off]) && sv != &PL_sv_undef ! && SvIVX(sv) == 999999999 /* var is in open scope */ && strEQ(name, SvPVX(sv))) { ! warn("\"my\" variable %s masks earlier declaration in same scope", name); break; } } --- 134,144 ---- for (off = AvFILLp(PL_comppad_name); off > PL_comppad_name_floor; off--) { if ((sv = svp[off]) && sv != &PL_sv_undef ! && (SvIVX(sv) == PAD_MAX || SvIVX(sv) == 0) && strEQ(name, SvPVX(sv))) { ! warn("\"my\" variable %s masks earlier declaration in same %s", ! name, (SvIVX(sv) == PAD_MAX ? "scope" : "statement")); break; } } *************** *** 152,158 **** PL_sv_objcount++; } av_store(PL_comppad_name, off, sv); ! SvNVX(sv) = (double)999999999; SvIVX(sv) = 0; /* Not yet introduced--see newSTATEOP */ if (!PL_min_intro_pending) PL_min_intro_pending = off; --- 156,162 ---- PL_sv_objcount++; } av_store(PL_comppad_name, off, sv); ! SvNVX(sv) = (double)PAD_MAX; SvIVX(sv) = 0; /* Not yet introduced--see newSTATEOP */ if (!PL_min_intro_pending) PL_min_intro_pending = off; *************** *** 165,172 **** return off; } STATIC PADOFFSET ! pad_findlex(char *name, PADOFFSET newoff, U32 seq, CV* startcv, I32 cx_ix) { dTHR; CV *cv; --- 169,179 ---- return off; } + #define FINDLEX_NOSEARCH 1 /* don't search outer contexts */ + STATIC PADOFFSET ! pad_findlex(char *name, PADOFFSET newoff, U32 seq, CV* startcv, I32 cx_ix, I32 saweval, ! U32 flags) { dTHR; CV *cv; *************** *** 174,180 **** SV *sv; register I32 i; register PERL_CONTEXT *cx; - int saweval; for (cv = startcv; cv; cv = CvOUTSIDE(cv)) { AV *curlist = CvPADLIST(cv); --- 181,186 ---- *************** *** 214,221 **** sv_setpv(namesv, name); av_store(PL_comppad_name, newoff, namesv); SvNVX(namesv) = (double)PL_curcop->cop_seq; ! SvIVX(namesv) = 999999999; /* A ref, intro immediately */ SvFAKE_on(namesv); /* A ref, not a real var */ if (CvANON(PL_compcv) || SvTYPE(PL_compcv) == SVt_PVFM) { /* "It's closures all the way down." */ CvCLONE_on(PL_compcv); --- 220,233 ---- sv_setpv(namesv, name); av_store(PL_comppad_name, newoff, namesv); SvNVX(namesv) = (double)PL_curcop->cop_seq; ! SvIVX(namesv) = PAD_MAX; /* A ref, intro immediately */ SvFAKE_on(namesv); /* A ref, not a real var */ + if (SvOBJECT(svp[off])) { /* A typed var */ + SvOBJECT_on(namesv); + (void)SvUPGRADE(namesv, SVt_PVMG); + SvSTASH(namesv) = (HV*)SvREFCNT_inc((SV*)SvSTASH(svp[off])); + PL_sv_objcount++; + } if (CvANON(PL_compcv) || SvTYPE(PL_compcv) == SVt_PVFM) { /* "It's closures all the way down." */ CvCLONE_on(PL_compcv); *************** *** 227,240 **** CV *bcv; for (bcv = startcv; bcv && bcv != cv && !CvCLONE(bcv); ! bcv = CvOUTSIDE(bcv)) { if (CvANON(bcv)) CvCLONE_on(bcv); else { ! if (PL_dowarn && !CvUNIQUE(cv)) warn( "Variable \"%s\" may be unavailable", name); break; } } --- 239,256 ---- CV *bcv; for (bcv = startcv; bcv && bcv != cv && !CvCLONE(bcv); ! bcv = CvOUTSIDE(bcv)) ! { if (CvANON(bcv)) CvCLONE_on(bcv); else { ! if (PL_dowarn ! && !CvUNIQUE(bcv) && !CvUNIQUE(cv)) ! { warn( "Variable \"%s\" may be unavailable", name); + } break; } } *************** *** 251,275 **** } } /* Nothing in current lexical context--try eval's context, if any. * This is necessary to let the perldb get at lexically scoped variables. * XXX This will also probably interact badly with eval tree caching. */ - saweval = 0; for (i = cx_ix; i >= 0; i--) { cx = &cxstack[i]; ! switch (cx->cx_type) { default: if (i == 0 && saweval) { seq = cxstack[saweval].blk_oldcop->cop_seq; ! return pad_findlex(name, newoff, seq, PL_main_cv, 0); } break; case CXt_EVAL: switch (cx->blk_eval.old_op_type) { case OP_ENTEREVAL: ! saweval = i; break; case OP_REQUIRE: /* require must have its own scope */ --- 267,294 ---- } } + if (flags & FINDLEX_NOSEARCH) + return 0; + /* Nothing in current lexical context--try eval's context, if any. * This is necessary to let the perldb get at lexically scoped variables. * XXX This will also probably interact badly with eval tree caching. */ for (i = cx_ix; i >= 0; i--) { cx = &cxstack[i]; ! switch (CxTYPE(cx)) { default: if (i == 0 && saweval) { seq = cxstack[saweval].blk_oldcop->cop_seq; ! return pad_findlex(name, newoff, seq, PL_main_cv, -1, saweval, 0); } break; case CXt_EVAL: switch (cx->blk_eval.old_op_type) { case OP_ENTEREVAL: ! if (CxREALEVAL(cx)) ! saweval = i; break; case OP_REQUIRE: /* require must have its own scope */ *************** *** 285,291 **** continue; } seq = cxstack[saweval].blk_oldcop->cop_seq; ! return pad_findlex(name, newoff, seq, cv, i-1); } } --- 304,310 ---- continue; } seq = cxstack[saweval].blk_oldcop->cop_seq; ! return pad_findlex(name, newoff, seq, cv, i-1, saweval,FINDLEX_NOSEARCH); } } *************** *** 301,306 **** --- 320,327 ---- SV *sv; SV **svp = AvARRAY(PL_comppad_name); U32 seq = PL_cop_seqmax; + PERL_CONTEXT *cx; + CV *outside; #ifdef USE_THREADS /* *************** *** 330,337 **** } } /* See if it's in a nested scope */ ! off = pad_findlex(name, 0, seq, CvOUTSIDE(PL_compcv), cxstack_ix); if (off) { /* If there is a pending local definition, this new alias must die */ if (pendoff) --- 351,370 ---- } } + outside = CvOUTSIDE(PL_compcv); + + /* Check if if we're compiling an eval'', and adjust seq to be the + * eval's seq number. This depends on eval'' having a non-null + * CvOUTSIDE() while it is being compiled. The eval'' itself is + * identified by CvEVAL being true and CvGV being null. */ + if (outside && CvEVAL(PL_compcv) && !CvGV(PL_compcv) && cxstack_ix >= 0) { + cx = &cxstack[cxstack_ix]; + if (CxREALEVAL(cx)) + seq = cx->blk_oldcop->cop_seq; + } + /* See if it's in a nested scope */ ! off = pad_findlex(name, 0, seq, outside, cxstack_ix, 0, 0); if (off) { /* If there is a pending local definition, this new alias must die */ if (pendoff) *************** *** 355,361 **** } /* "Deintroduce" my variables that are leaving with this scope. */ for (off = AvFILLp(PL_comppad_name); off > fill; off--) { ! if ((sv = svp[off]) && sv != &PL_sv_undef && SvIVX(sv) == 999999999) SvIVX(sv) = PL_cop_seqmax; } } --- 388,394 ---- } /* "Deintroduce" my variables that are leaving with this scope. */ for (off = AvFILLp(PL_comppad_name); off > fill; off--) { ! if ((sv = svp[off]) && sv != &PL_sv_undef && SvIVX(sv) == PAD_MAX) SvIVX(sv) = PL_cop_seqmax; } } *************** *** 517,527 **** if (!p) return NOT_IN_PAD; key = p - PL_threadsv_names; svp = av_fetch(thr->threadsv, key, FALSE); ! if (!svp) { SV *sv = NEWSV(0, 0); av_store(thr->threadsv, key, sv); thr->threadsvp = AvARRAY(thr->threadsv); /* * Some magic variables used to be automagically initialised * in gv_fetchpv. Those which are now per-thread magicals get --- 550,564 ---- if (!p) return NOT_IN_PAD; key = p - PL_threadsv_names; + MUTEX_LOCK(&thr->mutex); svp = av_fetch(thr->threadsv, key, FALSE); ! if (svp) ! MUTEX_UNLOCK(&thr->mutex); ! else { SV *sv = NEWSV(0, 0); av_store(thr->threadsv, key, sv); thr->threadsvp = AvARRAY(thr->threadsv); + MUTEX_UNLOCK(&thr->mutex); /* * Some magic variables used to be automagically initialised * in gv_fetchpv. Those which are now per-thread magicals get *************** *** 538,543 **** --- 575,590 ---- case '`': case '\'': PL_sawampersand = TRUE; + /* FALL THROUGH */ + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': SvREADONLY_on(sv); /* FALL THROUGH */ *************** *** 774,780 **** SV* sv; /* assumes no premature commitment */ ! if (!o || (o->op_flags & OPf_WANT) == OPf_WANT_LIST || PL_error_count || o->op_type == OP_RETURN) return o; --- 821,828 ---- SV* sv; /* assumes no premature commitment */ ! U8 want = o->op_flags & OPf_WANT; ! if (!o || (want && want != OPf_WANT_SCALAR) || PL_error_count || o->op_type == OP_RETURN) return o; *************** *** 1076,1081 **** --- 1124,1130 ---- dTHR; OP *kid; SV *sv; + STRLEN n_a; if (!o || PL_error_count) return o; *************** *** 1202,1208 **** PL_modcount++; if (!type) croak("Can't localize lexical variable %s", ! SvPV(*av_fetch(PL_comppad_name, o->op_targ, 4), PL_na)); break; #ifdef USE_THREADS --- 1251,1257 ---- PL_modcount++; if (!type) croak("Can't localize lexical variable %s", ! SvPV(*av_fetch(PL_comppad_name, o->op_targ, 4), n_a)); break; #ifdef USE_THREADS *************** *** 1866,1872 **** first->op_last = last->op_last; first->op_children += last->op_children; if (first->op_children) ! last->op_flags |= OPf_KIDS; Safefree(last); return (OP*)first; --- 1915,1921 ---- first->op_last = last->op_last; first->op_children += last->op_children; if (first->op_children) ! first->op_flags |= OPf_KIDS; Safefree(last); return (OP*)first; *************** *** 2179,2186 **** if (repl) { OP *curop; ! if (pm->op_pmflags & PMf_EVAL) curop = 0; #ifdef USE_THREADS else if (repl->op_type == OP_THREADSV && strchr("&`'123456789+", --- 2228,2238 ---- if (repl) { OP *curop; ! if (pm->op_pmflags & PMf_EVAL) { curop = 0; + if (PL_curcop->cop_line < PL_multi_end) + PL_curcop->cop_line = PL_multi_end; + } #ifdef USE_THREADS else if (repl->op_type == OP_THREADSV && strchr("&`'123456789+", *************** *** 2339,2344 **** --- 2391,2397 ---- sv_setpv(PL_curstname,""); PL_curstash = Nullhv; } + PL_hints |= HINT_BLOCK_SCOPE; PL_copline = NOLINE; PL_expect = XSTATE; } *************** *** 2351,2356 **** --- 2404,2410 ---- OP *rqop; OP *imop; OP *veop; + GV *gv; if (id->op_type != OP_CONST) croak("Module name must be constant"); *************** *** 2402,2409 **** newUNOP(OP_METHOD, 0, meth))); } ! /* Fake up a require */ ! rqop = newUNOP(OP_REQUIRE, 0, id); /* Fake up the BEGIN {}, which does its thing immediately. */ newSUB(floor, --- 2456,2476 ---- newUNOP(OP_METHOD, 0, meth))); } ! /* Fake up a require, handle override, if any */ ! gv = gv_fetchpv("require", FALSE, SVt_PVCV); ! if (!(gv && GvIMPORTED_CV(gv))) ! gv = gv_fetchpv("CORE::GLOBAL::require", FALSE, SVt_PVCV); ! ! if (gv && GvIMPORTED_CV(gv)) { ! rqop = ck_subr(newUNOP(OP_ENTERSUB, OPf_STACKED, ! append_elem(OP_LIST, id, ! scalar(newUNOP(OP_RV2CV, 0, ! newGVOP(OP_GV, 0, ! gv)))))); ! } ! else { ! rqop = newUNOP(OP_REQUIRE, 0, id); ! } /* Fake up the BEGIN {}, which does its thing immediately. */ newSUB(floor, *************** *** 2420,2425 **** --- 2487,2515 ---- } OP * + dofile(OP *term) + { + OP *doop; + GV *gv; + + gv = gv_fetchpv("do", FALSE, SVt_PVCV); + if (!(gv && GvIMPORTED_CV(gv))) + gv = gv_fetchpv("CORE::GLOBAL::do", FALSE, SVt_PVCV); + + if (gv && GvIMPORTED_CV(gv)) { + doop = ck_subr(newUNOP(OP_ENTERSUB, OPf_STACKED, + append_elem(OP_LIST, term, + scalar(newUNOP(OP_RV2CV, 0, + newGVOP(OP_GV, 0, + gv)))))); + } + else { + doop = newUNOP(OP_DOFILE, 0, scalar(term)); + } + return doop; + } + + OP * newSLICEOP(I32 flags, OP *subscript, OP *listval) { return newBINOP(OP_LSLICE, flags, *************** *** 2663,2669 **** svp = AvARRAY(PL_comppad_name); for (i = PL_min_intro_pending; i <= PL_max_intro_pending; i++) { if ((sv = svp[i]) && sv != &PL_sv_undef && !SvIVX(sv)) { ! SvIVX(sv) = 999999999; /* Don't know scope end yet. */ SvNVX(sv) = (double)PL_cop_seqmax; } } --- 2753,2759 ---- svp = AvARRAY(PL_comppad_name); for (i = PL_min_intro_pending; i <= PL_max_intro_pending; i++) { if ((sv = svp[i]) && sv != &PL_sv_undef && !SvIVX(sv)) { ! SvIVX(sv) = PAD_MAX; /* Don't know scope end yet. */ SvNVX(sv) = (double)PL_cop_seqmax; } } *************** *** 3115,3127 **** { dTHR; OP *o; if (type != OP_GOTO || label->op_type == OP_CONST) { /* "last()" means "last" */ if (label->op_type == OP_STUB && (label->op_flags & OPf_PARENS)) o = newOP(type, OPf_SPECIAL); else { o = newPVOP(type, 0, savepv(label->op_type == OP_CONST ! ? SvPVx(((SVOP*)label)->op_sv, PL_na) : "")); } op_free(label); --- 3205,3218 ---- { dTHR; OP *o; + STRLEN n_a; if (type != OP_GOTO || label->op_type == OP_CONST) { /* "last()" means "last" */ if (label->op_type == OP_STUB && (label->op_flags & OPf_PARENS)) o = newOP(type, OPf_SPECIAL); else { o = newPVOP(type, 0, savepv(label->op_type == OP_CONST ! ? SvPVx(((SVOP*)label)->op_sv, n_a) : "")); } op_free(label); *************** *** 3211,3217 **** cv, (CvANON(cv) ? "ANON" : (cv == PL_main_cv) ? "MAIN" ! : CvUNIQUE(outside) ? "UNIQUE" : CvGV(cv) ? GvNAME(CvGV(cv)) : "UNDEFINED"), outside, (!outside ? "null" --- 3302,3308 ---- cv, (CvANON(cv) ? "ANON" : (cv == PL_main_cv) ? "MAIN" ! : CvUNIQUE(cv) ? "UNIQUE" : CvGV(cv) ? GvNAME(CvGV(cv)) : "UNDEFINED"), outside, (!outside ? "null" *************** *** 3311,3317 **** char *name = SvPVX(namesv); /* XXX */ if (SvFLAGS(namesv) & SVf_FAKE) { /* lexical from outside? */ I32 off = pad_findlex(name, ix, SvIVX(namesv), ! CvOUTSIDE(cv), cxstack_ix); if (!off) PL_curpad[ix] = SvREFCNT_inc(ppad[ix]); else if (off != ix) --- 3402,3408 ---- char *name = SvPVX(namesv); /* XXX */ if (SvFLAGS(namesv) & SVf_FAKE) { /* lexical from outside? */ I32 off = pad_findlex(name, ix, SvIVX(namesv), ! CvOUTSIDE(cv), cxstack_ix, 0, 0); if (!off) PL_curpad[ix] = SvREFCNT_inc(ppad[ix]); else if (off != ix) *************** *** 3375,3381 **** CV * cv_clone(CV *proto) { ! return cv_clone2(proto, CvOUTSIDE(proto)); } void --- 3466,3476 ---- CV * cv_clone(CV *proto) { ! CV *cv; ! MUTEX_LOCK(&PL_cred_mutex); /* XXX create separate mutex */ ! cv = cv_clone2(proto, CvOUTSIDE(proto)); ! MUTEX_UNLOCK(&PL_cred_mutex); /* XXX create separate mutex */ ! return cv; } void *************** *** 3451,3460 **** newSUB(I32 floor, OP *o, OP *proto, OP *block) { dTHR; ! char *name = o ? SvPVx(cSVOPo->op_sv, PL_na) : Nullch; GV *gv = gv_fetchpv(name ? name : "__ANON__", GV_ADDMULTI | (block ? 0 : GV_NOINIT), SVt_PVCV); ! char *ps = proto ? SvPVx(((SVOP*)proto)->op_sv, PL_na) : Nullch; register CV *cv=0; I32 ix; --- 3546,3556 ---- newSUB(I32 floor, OP *o, OP *proto, OP *block) { dTHR; ! STRLEN n_a; ! char *name = o ? SvPVx(cSVOPo->op_sv, n_a) : Nullch; GV *gv = gv_fetchpv(name ? name : "__ANON__", GV_ADDMULTI | (block ? 0 : GV_NOINIT), SVt_PVCV); ! char *ps = proto ? SvPVx(((SVOP*)proto)->op_sv, n_a) : Nullch; register CV *cv=0; I32 ix; *************** *** 3536,3544 **** CvSTASH(cv) = PL_curstash; #ifdef USE_THREADS CvOWNER(cv) = 0; ! if (!CvMUTEXP(cv)) New(666, CvMUTEXP(cv), 1, perl_mutex); ! MUTEX_INIT(CvMUTEXP(cv)); #endif /* USE_THREADS */ if (ps) --- 3632,3641 ---- CvSTASH(cv) = PL_curstash; #ifdef USE_THREADS CvOWNER(cv) = 0; ! if (!CvMUTEXP(cv)) { New(666, CvMUTEXP(cv), 1, perl_mutex); ! MUTEX_INIT(CvMUTEXP(cv)); ! } #endif /* USE_THREADS */ if (ps) *************** *** 3558,3564 **** else { /* force display of errors found but not reported */ sv_catpv(ERRSV, not_safe); ! croak("%s", SvPVx(ERRSV, PL_na)); } } } --- 3655,3661 ---- else { /* force display of errors found but not reported */ sv_catpv(ERRSV, not_safe); ! croak("%s", SvPVx(ERRSV, n_a)); } } } *************** *** 3683,3688 **** --- 3780,3786 ---- return cv; } + /* XXX unsafe for threads if eval_owner isn't held */ void newCONSTSUB(HV *stash, char *name, SV *sv) { *************** *** 3729,3735 **** && HvNAME(GvSTASH(CvGV(cv))) && strEQ(HvNAME(GvSTASH(CvGV(cv))), "autouse"))) { line_t oldline = PL_curcop->cop_line; ! PL_curcop->cop_line = PL_copline; warn("Subroutine %s redefined",name); PL_curcop->cop_line = oldline; } --- 3827,3834 ---- && HvNAME(GvSTASH(CvGV(cv))) && strEQ(HvNAME(GvSTASH(CvGV(cv))), "autouse"))) { line_t oldline = PL_curcop->cop_line; ! if (PL_copline != NOLINE) ! PL_curcop->cop_line = PL_copline; warn("Subroutine %s redefined",name); PL_curcop->cop_line = oldline; } *************** *** 3781,3786 **** --- 3880,3886 ---- if (!PL_initav) PL_initav = newAV(); av_push(PL_initav, (SV *)cv); + GvCV(gv) = 0; } } else *************** *** 3797,3805 **** char *name; GV *gv; I32 ix; if (o) ! name = SvPVx(cSVOPo->op_sv, PL_na); else name = "STDOUT"; gv = gv_fetchpv(name,TRUE, SVt_PVFM); --- 3897,3906 ---- char *name; GV *gv; I32 ix; + STRLEN n_a; if (o) ! name = SvPVx(cSVOPo->op_sv, n_a); else name = "STDOUT"; gv = gv_fetchpv(name,TRUE, SVt_PVFM); *************** *** 3861,3867 **** case OP_PADSV: o->op_type = OP_PADAV; o->op_ppaddr = ppaddr[OP_PADAV]; ! return ref(newUNOP(OP_RV2AV, 0, scalar(o)), OP_RV2AV); case OP_RV2SV: o->op_type = OP_RV2AV; --- 3962,3968 ---- case OP_PADSV: o->op_type = OP_PADAV; o->op_ppaddr = ppaddr[OP_PADAV]; ! return ref(o, OP_RV2AV); case OP_RV2SV: o->op_type = OP_RV2AV; *************** *** 3884,3890 **** case OP_PADAV: o->op_type = OP_PADHV; o->op_ppaddr = ppaddr[OP_PADHV]; ! return ref(newUNOP(OP_RV2HV, 0, scalar(o)), OP_RV2HV); case OP_RV2SV: case OP_RV2AV: --- 3985,3991 ---- case OP_PADAV: o->op_type = OP_PADHV; o->op_ppaddr = ppaddr[OP_PADHV]; ! return ref(o, OP_RV2HV); case OP_RV2SV: case OP_RV2AV: *************** *** 3914,3920 **** OP * newGVREF(I32 type, OP *o) { ! if (type == OP_MAPSTART) return newUNOP(OP_NULL, 0, o); return ref(newUNOP(OP_RV2GV, OPf_REF, o), type); } --- 4015,4021 ---- OP * newGVREF(I32 type, OP *o) { ! if (type == OP_MAPSTART || type == OP_GREPSTART) return newUNOP(OP_NULL, 0, o); return ref(newUNOP(OP_RV2GV, OPf_REF, o), type); } *************** *** 4145,4152 **** char *name; int iscv; GV *gv; - name = SvPV(kid->op_sv, PL_na); if ((PL_hints & HINT_STRICT_REFS) && (kid->op_private & OPpCONST_BARE)) { char *badthing = Nullch; switch (o->op_type) { --- 4246,4293 ---- char *name; int iscv; GV *gv; + SV *kidsv = kid->op_sv; + STRLEN n_a; + + /* Is it a constant from cv_const_sv()? */ + if (SvROK(kidsv) && SvREADONLY(kidsv)) { + SV *rsv = SvRV(kidsv); + int svtype = SvTYPE(rsv); + char *badtype = Nullch; + + switch (o->op_type) { + case OP_RV2SV: + if (svtype > SVt_PVMG) + badtype = "a SCALAR"; + break; + case OP_RV2AV: + if (svtype != SVt_PVAV) + badtype = "an ARRAY"; + break; + case OP_RV2HV: + if (svtype != SVt_PVHV) { + if (svtype == SVt_PVAV) { /* pseudohash? */ + SV **ksv = av_fetch((AV*)rsv, 0, FALSE); + if (ksv && SvROK(*ksv) + && SvTYPE(SvRV(*ksv)) == SVt_PVHV) + { + break; + } + } + badtype = "a HASH"; + } + break; + case OP_RV2CV: + if (svtype != SVt_PVCV) + badtype = "a CODE"; + break; + } + if (badtype) + croak("Constant is not %s reference", badtype); + return o; + } + name = SvPV(kidsv, n_a); if ((PL_hints & HINT_STRICT_REFS) && (kid->op_private & OPpCONST_BARE)) { char *badthing = Nullch; switch (o->op_type) { *************** *** 4209,4216 **** SVOP *kid = (SVOP*)cUNOPo->op_first; if (kid->op_type == OP_CONST && (kid->op_private & OPpCONST_BARE)) { OP *newop = newGVOP(type, OPf_REF, ! gv_fetchpv(SvPVx(kid->op_sv, PL_na), TRUE, SVt_PVIO)); op_free(o); return newop; } --- 4350,4358 ---- SVOP *kid = (SVOP*)cUNOPo->op_first; if (kid->op_type == OP_CONST && (kid->op_private & OPpCONST_BARE)) { + STRLEN n_a; OP *newop = newGVOP(type, OPf_REF, ! gv_fetchpv(SvPVx(kid->op_sv, n_a), TRUE, SVt_PVIO)); op_free(o); return newop; } *************** *** 4245,4250 **** --- 4387,4393 ---- } if (o->op_flags & OPf_KIDS) { + STRLEN n_a; tokid = &cLISTOPo->op_first; kid = cLISTOPo->op_first; if (kid->op_type == OP_PUSHMARK || *************** *** 4274,4280 **** case OA_AVREF: if (kid->op_type == OP_CONST && (kid->op_private & OPpCONST_BARE)) { ! char *name = SvPVx(((SVOP*)kid)->op_sv, PL_na); OP *newop = newAVREF(newGVOP(OP_GV, 0, gv_fetchpv(name, TRUE, SVt_PVAV) )); if (PL_dowarn) --- 4417,4423 ---- case OA_AVREF: if (kid->op_type == OP_CONST && (kid->op_private & OPpCONST_BARE)) { ! char *name = SvPVx(((SVOP*)kid)->op_sv, n_a); OP *newop = newAVREF(newGVOP(OP_GV, 0, gv_fetchpv(name, TRUE, SVt_PVAV) )); if (PL_dowarn) *************** *** 4292,4298 **** case OA_HVREF: if (kid->op_type == OP_CONST && (kid->op_private & OPpCONST_BARE)) { ! char *name = SvPVx(((SVOP*)kid)->op_sv, PL_na); OP *newop = newHVREF(newGVOP(OP_GV, 0, gv_fetchpv(name, TRUE, SVt_PVHV) )); if (PL_dowarn) --- 4435,4441 ---- case OA_HVREF: if (kid->op_type == OP_CONST && (kid->op_private & OPpCONST_BARE)) { ! char *name = SvPVx(((SVOP*)kid)->op_sv, n_a); OP *newop = newHVREF(newGVOP(OP_GV, 0, gv_fetchpv(name, TRUE, SVt_PVHV) )); if (PL_dowarn) *************** *** 4323,4333 **** if (kid->op_type == OP_CONST && (kid->op_private & OPpCONST_BARE)) { OP *newop = newGVOP(OP_GV, 0, ! gv_fetchpv(SvPVx(((SVOP*)kid)->op_sv, PL_na), TRUE, SVt_PVIO) ); op_free(kid); kid = newop; } else { kid->op_sibling = 0; kid = newUNOP(OP_RV2GV, 0, scalar(kid)); --- 4466,4480 ---- if (kid->op_type == OP_CONST && (kid->op_private & OPpCONST_BARE)) { OP *newop = newGVOP(OP_GV, 0, ! gv_fetchpv(SvPVx(((SVOP*)kid)->op_sv, n_a), TRUE, SVt_PVIO) ); op_free(kid); kid = newop; } + else if (kid->op_type == OP_READLINE) { + /* neophyte patrol: open(), close() etc. */ + bad_type(numargs, "HANDLE", op_desc[o->op_type], kid); + } else { kid->op_sibling = 0; kid = newUNOP(OP_RV2GV, 0, scalar(kid)); *************** *** 4376,4382 **** --- 4523,4531 ---- gv = gv_fetchpv("CORE::GLOBAL::glob", FALSE, SVt_PVCV); if (gv && GvIMPORTED_CV(gv)) { + #ifndef PERL_OBJECT static int glob_index; + #endif append_elem(OP_GLOB, o, newSVOP(OP_CONST, 0, newSViv(glob_index++))); *************** *** 4455,4460 **** --- 4604,4611 ---- { if (o->op_flags & OPf_KIDS) { OP *kid = cLISTOPo->op_first->op_sibling; /* get past pushmark */ + if (kid) + kid = kid->op_sibling; /* get past "big" */ if (kid && kid->op_type == OP_CONST) fbm_compile(((SVOP*)kid)->op_sv, 0); } *************** *** 4661,4666 **** --- 4812,4822 ---- if (o->op_flags & OPf_STACKED) { OP *kid = cLISTOPo->op_first->op_sibling; /* get past pushmark */ OP *k; + + if (o->op_type == OP_SORT) { + GvMULTI_on(gv_fetchpv("a", TRUE, SVt_PV)); + GvMULTI_on(gv_fetchpv("b", TRUE, SVt_PV)); + } kid = kUNOP->op_first; /* get past rv2gv */ if (kid->op_type == OP_SCOPE || kid->op_type == OP_LEAVE) { *************** *** 4693,4699 **** kid->op_next = k; o->op_flags |= OPf_SPECIAL; } ! } return o; } --- 4849,4857 ---- kid->op_next = k; o->op_flags |= OPf_SPECIAL; } ! else if (kid->op_type == OP_RV2SV || kid->op_type == OP_PADSV) ! null(cLISTOPo->op_first->op_sibling); ! } return o; } *************** *** 4762,4767 **** --- 4920,4926 ---- GV *namegv = 0; int optional = 0; I32 arg = 0; + STRLEN n_a; for (cvop = o2; cvop->op_sibling; cvop = cvop->op_sibling) ; if (cvop->op_type == OP_RV2CV) { *************** *** 4773,4779 **** cv = GvCVu(tmpop->op_sv); if (cv && SvPOK(cv) && !(o->op_private & OPpENTERSUB_AMPER)) { namegv = CvANON(cv) ? (GV*)tmpop->op_sv : CvGV(cv); ! proto = SvPV((SV*)cv, PL_na); } } } --- 4932,4938 ---- cv = GvCVu(tmpop->op_sv); if (cv && SvPOK(cv) && !(o->op_private & OPpENTERSUB_AMPER)) { namegv = CvANON(cv) ? (GV*)tmpop->op_sv : CvGV(cv); ! proto = SvPV((SV*)cv, n_a); } } } *************** *** 4806,4824 **** bad_type(arg, "block", gv_ename(namegv), o2); break; case '*': proto++; arg++; if (o2->op_type == OP_RV2GV) ! goto wrapref; ! { ! OP* kid = o2; ! OP* sib = kid->op_sibling; ! kid->op_sibling = 0; ! o2 = newUNOP(OP_RV2GV, 0, kid); ! o2->op_sibling = sib; ! prev->op_sibling = o2; ! } ! goto wrapref; case '\\': proto++; arg++; --- 4965,4977 ---- bad_type(arg, "block", gv_ename(namegv), o2); break; case '*': + /* '*' allows any scalar type, including bareword */ proto++; arg++; if (o2->op_type == OP_RV2GV) ! goto wrapref; /* autoconvert GLOB -> GLOBref */ ! scalar(o2); ! break; case '\\': proto++; arg++; *************** *** 4865,4871 **** default: oops: croak("Malformed prototype for %s: %s", ! gv_ename(namegv), SvPV((SV*)cv, PL_na)); } } else --- 5018,5024 ---- default: oops: croak("Malformed prototype for %s: %s", ! gv_ename(namegv), SvPV((SV*)cv, n_a)); } } else *************** *** 4909,4914 **** --- 5062,5068 ---- { dTHR; register OP* oldop = 0; + STRLEN n_a; if (!o || o->op_seq) return; ENTER; *************** *** 4997,5020 **** o->op_seq = PL_op_seqmax++; break; - case OP_PADAV: - if (o->op_next->op_type == OP_RV2AV - && (o->op_next->op_flags & OPf_REF)) - { - null(o->op_next); - o->op_next = o->op_next->op_next; - } - break; - - case OP_PADHV: - if (o->op_next->op_type == OP_RV2HV - && (o->op_next->op_flags & OPf_REF)) - { - null(o->op_next); - o->op_next = o->op_next->op_next; - } - break; - case OP_MAPWHILE: case OP_GREPWHILE: case OP_AND: --- 5151,5156 ---- *************** *** 5088,5094 **** indsvp = hv_fetch(GvHV(*fields), key, keylen, FALSE); if (!indsvp) { croak("No such field \"%s\" in variable %s of type %s", ! key, SvPV(lexname, PL_na), HvNAME(SvSTASH(lexname))); } ind = SvIV(*indsvp); if (ind < 1) --- 5224,5230 ---- indsvp = hv_fetch(GvHV(*fields), key, keylen, FALSE); if (!indsvp) { croak("No such field \"%s\" in variable %s of type %s", ! key, SvPV(lexname, n_a), HvNAME(SvSTASH(lexname))); } ind = SvIV(*indsvp); if (ind < 1) diff -c 'perl5.005_02/op.h' 'perl5.005_03/op.h' Index: ./op.h *** ./op.h Thu Jul 23 23:01:05 1998 --- ./op.h Sat Mar 27 11:56:40 1999 *************** *** 1,6 **** /* op.h * ! * Copyright (c) 1991-1997, Larry Wall * * You may distribute under the terms of either the GNU General Public * License or the Artistic License, as specified in the README file. --- 1,6 ---- /* op.h * ! * Copyright (c) 1991-1999, Larry Wall * * You may distribute under the terms of either the GNU General Public * License or the Artistic License, as specified in the README file. diff -c 'perl5.005_02/opcode.h' 'perl5.005_03/opcode.h' Index: ./opcode.h *** ./opcode.h Fri Aug 7 19:05:17 1998 --- ./opcode.h Sat Mar 27 22:31:18 1999 *************** *** 891,897 **** "line sequence", "next statement", "debug next statement", ! "unstack", "block entry", "block exit", "block", --- 891,897 ---- "line sequence", "next statement", "debug next statement", ! "iteration finalizer", "block entry", "block exit", "block", *************** *** 2320,2326 **** 0x00002505, /* anonhash */ 0x02993501, /* splice */ 0x0002351d, /* push */ ! 0x00003c14, /* pop */ 0x00003c04, /* shift */ 0x0002351d, /* unshift */ 0x0002d501, /* sort */ --- 2320,2326 ---- 0x00002505, /* anonhash */ 0x02993501, /* splice */ 0x0002351d, /* push */ ! 0x00003c04, /* pop */ 0x00003c04, /* shift */ 0x0002351d, /* unshift */ 0x0002d501, /* sort */ *************** *** 2385,2391 **** 0x09116504, /* sysopen */ 0x00116504, /* sysseek */ 0x0917651d, /* sysread */ ! 0x0911651d, /* syswrite */ 0x0911651d, /* send */ 0x0117651d, /* recv */ 0x0000ec14, /* eof */ --- 2385,2391 ---- 0x09116504, /* sysopen */ 0x00116504, /* sysseek */ 0x0917651d, /* sysread */ ! 0x0991651d, /* syswrite */ 0x0911651d, /* send */ 0x0117651d, /* recv */ 0x0000ec14, /* eof */ diff -c 'perl5.005_02/opcode.pl' 'perl5.005_03/opcode.pl' Index: ./opcode.pl *** ./opcode.pl Fri Aug 7 19:03:54 1998 --- ./opcode.pl Sat Mar 27 22:31:09 1999 *************** *** 432,438 **** splice splice ck_fun m@ A S? S? L push push ck_fun imst@ A L ! pop pop ck_shift si% A shift shift ck_shift s% A unshift unshift ck_fun imst@ A L sort sort ck_sort m@ C? L --- 432,438 ---- splice splice ck_fun m@ A S? S? L push push ck_fun imst@ A L ! pop pop ck_shift s% A shift shift ck_shift s% A unshift unshift ck_fun imst@ A L sort sort ck_sort m@ C? L *************** *** 470,476 **** lineseq line sequence ck_null @ nextstate next statement ck_null s; dbstate debug next statement ck_null s; ! unstack unstack ck_null s0 enter block entry ck_null 0 leave block exit ck_null @ scope block ck_null @ --- 470,476 ---- lineseq line sequence ck_null @ nextstate next statement ck_null s; dbstate debug next statement ck_null s; ! unstack iteration finalizer ck_null s0 enter block entry ck_null 0 leave block exit ck_null @ scope block ck_null @ *************** *** 519,525 **** sysopen sysopen ck_fun s@ F S S S? sysseek sysseek ck_fun s@ F S S sysread sysread ck_fun imst@ F R S S? ! syswrite syswrite ck_fun imst@ F S S S? send send ck_fun imst@ F S S S? recv recv ck_fun imst@ F R S S --- 519,525 ---- sysopen sysopen ck_fun s@ F S S S? sysseek sysseek ck_fun s@ F S S sysread sysread ck_fun imst@ F R S S? ! syswrite syswrite ck_fun imst@ F S S? S? send send ck_fun imst@ F S S S? recv recv ck_fun imst@ F R S S diff -c 'perl5.005_02/os2/Changes' 'perl5.005_03/os2/Changes' Index: ./os2/Changes *** ./os2/Changes Thu Jul 23 23:01:06 1998 --- ./os2/Changes Thu Jan 21 19:10:23 1999 *************** *** 198,200 **** --- 198,223 ---- metachars, or if magic-line asks for sh, or there is no magic line and EXECSHELL is set to sh. Shell is supplied the original command line if possible. + + after 5.005_02: + Can start PM programs from non-PM sessions by plain system() + and friends. Can start DOS/Win programs. Can start + fullscreen programs from non-fullscreen sessions too. + In fact system(P_PM,...) was broken. + We mangle the name of perl*.DLL, to allow coexistence of different + versions of Perl executables on the system. Mangling of + names of extension DLL is also changed, thus running two + different versions of the executable with loaded + extensions should not lead to conflicts (since + extension-full-name and Perl-version mangling work in the + same set ot 576 possible keys, this may lead to clashes). + $^E was reset on the second read, and contained ".\r\n" at the end. + after 5.005_53: + Would segfault system()ing non-existing program; + AOUT build was hosed; + warning-test for getpriority() might lock the system hard on + pre-fixpak22 configuration (calling getpriority() on + non-existing process triggers a system-wide bug). + + + PrfDB was using a bug in processing XSUBs returning U32. diff -c 'perl5.005_02/os2/Makefile.SHs' 'perl5.005_03/os2/Makefile.SHs' Index: ./os2/Makefile.SHs *** ./os2/Makefile.SHs Thu Jul 23 23:01:06 1998 --- ./os2/Makefile.SHs Thu Jan 21 19:10:23 1999 *************** *** 8,23 **** perl_version="5.00${PATCHLEVEL}_$SUBVERSION" case "$archname" in ! *-thread) dll_post=_thr ! perl_version="${perl_version}-threaded";; ! *) dll_post='' ;; esac $spitshell >>Makefile <>Makefile <> $@ echo 'emx_realloc emxlibcm 403 ?' >> $@ $(PERL_DLL): $(obj) perl5.def perl$(OBJ_EXT) $(LD) $(LD_OPT) $(LDDLFLAGS) -o $@ perl$(OBJ_EXT) $(obj) $(libs) perl5.def perl5.def: perl.linkexp echo "LIBRARY '$(PERL_DLL_BASE)' INITINSTANCE TERMINSTANCE" > $@ ! echo DESCRIPTION "'Perl interpreter v$(PERL_VERSION), export autogenerated'" >>$@ echo STACKSIZE 32768 >>$@ echo CODE LOADONCALL >>$@ echo DATA LOADONCALL NONSHARED MULTIPLE >>$@ --- 53,66 ---- echo 'emx_malloc emxlibcm 402 ?' >> $@ echo 'emx_realloc emxlibcm 403 ?' >> $@ + perl_dll: $(PERL_DLL) + $(PERL_DLL): $(obj) perl5.def perl$(OBJ_EXT) $(LD) $(LD_OPT) $(LDDLFLAGS) -o $@ perl$(OBJ_EXT) $(obj) $(libs) perl5.def perl5.def: perl.linkexp echo "LIBRARY '$(PERL_DLL_BASE)' INITINSTANCE TERMINSTANCE" > $@ ! echo DESCRIPTION "'Perl interpreter v$(PERL_VERSION), export autogenerated, built with $(CONFIG_ARGS)'" >>$@ echo STACKSIZE 32768 >>$@ echo CODE LOADONCALL >>$@ echo DATA LOADONCALL NONSHARED MULTIPLE >>$@ *************** *** 160,167 **** sh writemain $(DYNALOADER) $(aout_static_lib) > tmp sh mv-if-diff tmp aout_perlmain.c ! miniperl_: $& miniperlmain$(AOUT_OBJ_EXT) $(AOUT_LIBPERL) ext.libs ! $(CC) $(LARGE) $(AOUT_CLDFLAGS) $(CCDLFLAGS) -o miniperl_ miniperlmain$(AOUT_OBJ_EXT) $(AOUT_LIBPERL) `cat ext.libs` $(libs) perl_: $& aout_perlmain$(AOUT_OBJ_EXT) $(AOUT_LIBPERL) $(AOUT_DYNALOADER) $(aout_static_ext) ext.libs $(CC) $(LARGE) $(AOUT_CLDFLAGS) $(CCDLFLAGS) -o perl_ aout_perlmain$(AOUT_OBJ_EXT) $(AOUT_DYNALOADER) $(aout_static_ext) $(AOUT_LIBPERL) `cat ext.libs` $(libs) --- 165,172 ---- sh writemain $(DYNALOADER) $(aout_static_lib) > tmp sh mv-if-diff tmp aout_perlmain.c ! miniperl_: $& miniperlmain$(AOUT_OBJ_EXT) $(AOUT_LIBPERL) ! $(CC) $(LARGE) $(AOUT_CLDFLAGS) $(CCDLFLAGS) -o miniperl_ miniperlmain$(AOUT_OBJ_EXT) $(AOUT_LIBPERL) $(libs) perl_: $& aout_perlmain$(AOUT_OBJ_EXT) $(AOUT_LIBPERL) $(AOUT_DYNALOADER) $(aout_static_ext) ext.libs $(CC) $(LARGE) $(AOUT_CLDFLAGS) $(CCDLFLAGS) -o perl_ aout_perlmain$(AOUT_OBJ_EXT) $(AOUT_DYNALOADER) $(aout_static_ext) $(AOUT_LIBPERL) `cat ext.libs` $(libs) *************** *** 197,214 **** sys_harness: perl_sys - cd t && (rm -f perl_$(EXE_EXT); $(LNS) ../perl_sys$(EXE_EXT) perl$(EXE_EXT)) && env HARNESS_BAD_EXITCODE=2 ./perl harness >Makefile <>Makefile <>Makefile <<'!NO!SUBS!' ! lib/auto/*/%.a : ext/%/Makefile.aout ! @cd ext/$(basename $(notdir $@)) ; make -f Makefile.aout config || echo "\$(MAKE) config failed, continuing anyway..." ! cd ext/$(basename $(notdir $@)) ; make -f Makefile.aout LINKTYPE=static CCCDLFLAGS= ext/%/Makefile.aout : miniperl_ cd $(dir $@) ; ../../miniperl_ -I ../../lib Makefile.PL MAKEFILE=Makefile.aout INSTALLDIRS=perl diff -c 'perl5.005_02/os2/OS2/PrfDB/PrfDB.xs' 'perl5.005_03/os2/OS2/PrfDB/PrfDB.xs' Index: ./os2/OS2/PrfDB/PrfDB.xs *** ./os2/OS2/PrfDB/PrfDB.xs Thu Jul 23 23:01:07 1998 --- ./os2/OS2/PrfDB/PrfDB.xs Thu Jan 21 19:10:23 1999 *************** *** 33,39 **** return sv; } ! U32 Prf_GetLength(HINI hini, PSZ app, PSZ key) { U32 len; --- 33,39 ---- return sv; } ! I32 Prf_GetLength(HINI hini, PSZ app, PSZ key) { U32 len; *************** *** 110,116 **** PSZ s; ULONG l; ! U32 Prf_GetLength(hini, app, key) HINI hini; PSZ app; --- 110,116 ---- PSZ s; ULONG l; ! I32 Prf_GetLength(hini, app, key) HINI hini; PSZ app; diff -c 'perl5.005_02/os2/OS2/REXX/REXX.xs' 'perl5.005_03/os2/OS2/REXX/REXX.xs' Index: ./os2/OS2/REXX/REXX.xs *** ./os2/OS2/REXX/REXX.xs Thu Jul 23 23:01:08 1998 --- ./os2/OS2/REXX/REXX.xs Wed Dec 30 21:17:05 1998 *************** *** 96,102 **** } if (rc || SvTRUE(GvSV(PL_errgv))) { if (SvTRUE(GvSV(PL_errgv))) { ! die ("Error inside perl function called from REXX compartment.\n%s", SvPV(GvSV(PL_errgv), PL_na)) ; } die ("REXX compartment returned non-zero status %li", rc); } --- 96,103 ---- } if (rc || SvTRUE(GvSV(PL_errgv))) { if (SvTRUE(GvSV(PL_errgv))) { ! STRLEN n_a; ! die ("Error inside perl function called from REXX compartment.\n%s", SvPV(GvSV(PL_errgv), n_a)) ; } die ("REXX compartment returned non-zero status %li", rc); } diff -c 'perl5.005_02/os2/os2.c' 'perl5.005_03/os2/os2.c' Index: ./os2/os2.c *** ./os2/os2.c Thu Jul 23 23:01:10 1998 --- ./os2/os2.c Thu Jan 21 19:10:23 1999 *************** *** 5,10 **** --- 5,12 ---- #define INCL_DOSERRORS #include + #include + /* * Various Unix compatibility functions for OS/2 */ *************** *** 160,166 **** os2_cond_wait(perl_cond *c, perl_mutex *m) { int rc; ! if ((rc = DosResetEventSem(*c,&PL_na)) && (rc != ERROR_ALREADY_RESET)) croak("panic: COND_WAIT-reset: rc=%i", rc); if (m) MUTEX_UNLOCK(m); if (CheckOSError(DosWaitEventSem(*c,SEM_INDEFINITE_WAIT)) --- 162,169 ---- os2_cond_wait(perl_cond *c, perl_mutex *m) { int rc; ! STRLEN n_a; ! if ((rc = DosResetEventSem(*c,&n_a)) && (rc != ERROR_ALREADY_RESET)) croak("panic: COND_WAIT-reset: rc=%i", rc); if (m) MUTEX_UNLOCK(m); if (CheckOSError(DosWaitEventSem(*c,SEM_INDEFINITE_WAIT)) *************** *** 378,383 **** --- 381,428 ---- #define EXECF_TRUEEXEC 2 #define EXECF_SPAWN_NOWAIT 3 + /* const char* const ptypes[] = { "FS", "DOS", "VIO", "PM", "DETACH" }; */ + + static int + my_type() + { + int rc; + TIB *tib; + PIB *pib; + + if (!(_emx_env & 0x200)) return 1; /* not OS/2. */ + if (CheckOSError(DosGetInfoBlocks(&tib, &pib))) + return -1; + + return (pib->pib_ultype); + } + + static ULONG + file_type(char *path) + { + int rc; + ULONG apptype; + + if (!(_emx_env & 0x200)) + croak("file_type not implemented on DOS"); /* not OS/2. */ + if (CheckOSError(DosQueryAppType(path, &apptype))) { + switch (rc) { + case ERROR_FILE_NOT_FOUND: + case ERROR_PATH_NOT_FOUND: + return -1; + case ERROR_ACCESS_DENIED: /* Directory with this name found? */ + return -3; + default: /* Found, but not an + executable, or some other + read error. */ + return -2; + } + } + return apptype; + } + + static ULONG os2_mytype; + /* Spawn/exec a program, revert to shell if needed. */ /* global PL_Argv[] contains arguments. */ *************** *** 390,403 **** { dTHR; int trueflag = flag; ! int rc, pass = 1, err; char *tmps; ! char buf[256], *s = 0; char *args[4]; static char * fargs[4] = { "/bin/sh", "-c", "\"$@\"", "spawn-via-shell", }; char **argsp = fargs; char nargs = 4; if (flag == P_WAIT) flag = P_NOWAIT; --- 435,450 ---- { dTHR; int trueflag = flag; ! int rc, pass = 1; char *tmps; ! char buf[256], *s = 0, scrbuf[280]; char *args[4]; static char * fargs[4] = { "/bin/sh", "-c", "\"$@\"", "spawn-via-shell", }; char **argsp = fargs; char nargs = 4; + int force_shell; + STRLEN n_a; if (flag == P_WAIT) flag = P_NOWAIT; *************** *** 412,419 **** ) /* will spawnvp use PATH? */ TAINT_ENV(); /* testing IFS here is overkill, probably */ /* We should check PERL_SH* and PERLLIB_* as well? */ ! if (!really || !*(tmps = SvPV(really, PL_na))) tmps = PL_Argv[0]; #if 0 rc = result(trueflag, spawnvp(flag,tmps,PL_Argv)); #else --- 459,531 ---- ) /* will spawnvp use PATH? */ TAINT_ENV(); /* testing IFS here is overkill, probably */ /* We should check PERL_SH* and PERLLIB_* as well? */ ! if (!really || !*(tmps = SvPV(really, n_a))) tmps = PL_Argv[0]; + + reread: + force_shell = 0; + if (_emx_env & 0x200) { /* OS/2. */ + int type = file_type(tmps); + type_again: + if (type == -1) { /* Not found */ + errno = ENOENT; + rc = -1; + goto do_script; + } + else if (type == -2) { /* Not an EXE */ + errno = ENOEXEC; + rc = -1; + goto do_script; + } + else if (type == -3) { /* Is a directory? */ + /* Special-case this */ + char tbuf[512]; + int l = strlen(tmps); + + if (l + 5 <= sizeof tbuf) { + strcpy(tbuf, tmps); + strcpy(tbuf + l, ".exe"); + type = file_type(tbuf); + if (type >= -3) + goto type_again; + } + + errno = ENOEXEC; + rc = -1; + goto do_script; + } + switch (type & 7) { + /* Ignore WINDOWCOMPAT and FAPI, start them the same type we are. */ + case FAPPTYP_WINDOWAPI: + { + if (os2_mytype != 3) { /* not PM */ + if (flag == P_NOWAIT) + flag = P_PM; + else if ((flag & 7) != P_PM && (flag & 7) != P_SESSION) + warn("Starting PM process with flag=%d, mytype=%d", + flag, os2_mytype); + } + } + break; + case FAPPTYP_NOTWINDOWCOMPAT: + { + if (os2_mytype != 0) { /* not full screen */ + if (flag == P_NOWAIT) + flag = P_SESSION; + else if ((flag & 7) != P_SESSION) + warn("Starting Full Screen process with flag=%d, mytype=%d", + flag, os2_mytype); + } + } + break; + case FAPPTYP_NOTSPEC: + /* Let the shell handle this... */ + force_shell = 1; + goto doshell_args; + break; + } + } + #if 0 rc = result(trueflag, spawnvp(flag,tmps,PL_Argv)); #else *************** *** 422,435 **** else if (execf == EXECF_EXEC) rc = spawnvp(trueflag | P_OVERLAY,tmps,PL_Argv); else if (execf == EXECF_SPAWN_NOWAIT) ! rc = spawnvp(trueflag | P_NOWAIT,tmps,PL_Argv); else /* EXECF_SPAWN */ rc = result(trueflag, ! spawnvp(trueflag | P_NOWAIT,tmps,PL_Argv)); #endif if (rc < 0 && pass == 1 && (tmps == PL_Argv[0])) { /* Cannot transfer `really' via shell. */ ! err = errno; if (err == ENOENT || err == ENOEXEC) { /* No such file, or is a script. */ /* Try adding script extensions to the file name, and --- 534,550 ---- else if (execf == EXECF_EXEC) rc = spawnvp(trueflag | P_OVERLAY,tmps,PL_Argv); else if (execf == EXECF_SPAWN_NOWAIT) ! rc = spawnvp(flag,tmps,PL_Argv); else /* EXECF_SPAWN */ rc = result(trueflag, ! spawnvp(flag,tmps,PL_Argv)); #endif if (rc < 0 && pass == 1 && (tmps == PL_Argv[0])) { /* Cannot transfer `really' via shell. */ ! do_script: ! { ! int err = errno; ! if (err == ENOENT || err == ENOEXEC) { /* No such file, or is a script. */ /* Try adding script extensions to the file name, and *************** *** 437,451 **** char *scr = find_script(PL_Argv[0], TRUE, NULL, 0); if (scr) { ! FILE *file = fopen(scr, "r"); char *s = 0, *s1; PL_Argv[0] = scr; if (!file) goto panic_file; ! if (!fgets(buf, sizeof buf, file)) { fclose(file); ! goto panic_file; } if (fclose(file) != 0) { /* Failure */ panic_file: --- 552,597 ---- char *scr = find_script(PL_Argv[0], TRUE, NULL, 0); if (scr) { ! FILE *file; char *s = 0, *s1; + int l; + l = strlen(scr); + + if (l >= sizeof scrbuf) { + Safefree(scr); + longbuf: + croak("Size of scriptname too big: %d", l); + } + strcpy(scrbuf, scr); + Safefree(scr); + scr = scrbuf; + + file = fopen(scr, "r"); PL_Argv[0] = scr; if (!file) goto panic_file; ! if (!fgets(buf, sizeof buf, file)) { /* Empty... */ ! ! buf[0] = 0; fclose(file); ! /* Special case: maybe from -Zexe build, so ! there is an executable around (contrary to ! documentation, DosQueryAppType sometimes (?) ! does not append ".exe", so we could have ! reached this place). */ ! if (l + 5 < sizeof scrbuf) { ! strcpy(scrbuf + l, ".exe"); ! if (PerlLIO_stat(scrbuf,&PL_statbuf) >= 0 ! && !S_ISDIR(PL_statbuf.st_mode)) { ! /* Found */ ! tmps = scr; ! pass++; ! goto reread; ! } else ! scrbuf[l] = 0; ! } else ! goto longbuf; } if (fclose(file) != 0) { /* Failure */ panic_file: *************** *** 503,509 **** char **a = PL_Argv; char *exec_args[2]; ! if (!buf[0] && file) { /* File without magic */ /* In fact we tried all what pdksh would try. There is no point in calling pdksh, we may just emulate its logic. */ --- 649,656 ---- char **a = PL_Argv; char *exec_args[2]; ! if (force_shell ! || (!buf[0] && file)) { /* File without magic */ /* In fact we tried all what pdksh would try. There is no point in calling pdksh, we may just emulate its logic. */ *************** *** 581,587 **** /* Not found: restore errno */ errno = err; } ! } else if (rc < 0 && pass == 2 && err == ENOENT) { /* File not found */ char *no_dir = strrchr(PL_Argv[0], '/'); /* Do as pdksh port does: if not found with /, try without --- 728,735 ---- /* Not found: restore errno */ errno = err; } ! } ! } else if (rc < 0 && pass == 2 && errno == ENOENT) { /* File not found */ char *no_dir = strrchr(PL_Argv[0], '/'); /* Do as pdksh port does: if not found with /, try without *************** *** 596,602 **** warn("Can't %s \"%s\": %s\n", ((execf != EXECF_EXEC && execf != EXECF_TRUEEXEC) ? "spawn" : "exec"), ! PL_Argv[0], Strerror(err)); if (rc < 0 && (execf != EXECF_SPAWN_NOWAIT) && ((trueflag & 0xFF) == P_WAIT)) rc = 255 << 8; /* Emulate the fork(). */ --- 744,750 ---- warn("Can't %s \"%s\": %s\n", ((execf != EXECF_EXEC && execf != EXECF_TRUEEXEC) ? "spawn" : "exec"), ! PL_Argv[0], Strerror(errno)); if (rc < 0 && (execf != EXECF_SPAWN_NOWAIT) && ((trueflag & 0xFF) == P_WAIT)) rc = 255 << 8; /* Emulate the fork(). */ *************** *** 616,621 **** --- 764,770 ---- char *tmps = NULL; int rc; int flag = P_WAIT, trueflag, err, secondtry = 0; + STRLEN n_a; if (sp > mark) { New(1301,PL_Argv, sp - mark + 3, char*); *************** *** 628,634 **** while (++mark <= sp) { if (*mark) ! *a++ = SvPVx(*mark, PL_na); else *a++ = ""; } --- 777,783 ---- while (++mark <= sp) { if (*mark) ! *a++ = SvPVx(*mark, n_a); else *a++ = ""; } *************** *** 773,779 **** do_exec(cmd) char *cmd; { ! return do_spawn2(cmd, EXECF_EXEC); } bool --- 922,929 ---- do_exec(cmd) char *cmd; { ! do_spawn2(cmd, EXECF_EXEC); ! return FALSE; } bool *************** *** 865,871 **** int fork(void) { ! die(no_func, "Unsupported function fork"); errno = EINVAL; return -1; } --- 1015,1021 ---- int fork(void) { ! die(PL_no_func, "Unsupported function fork"); errno = EINVAL; return -1; } *************** *** 1004,1011 **** if (items < 2 || items > 3) croak("Usage: File::Copy::syscopy(src,dst,flag=0)"); { ! char * src = (char *)SvPV(ST(0),PL_na); ! char * dst = (char *)SvPV(ST(1),PL_na); U32 flag; int RETVAL, rc; --- 1154,1162 ---- if (items < 2 || items > 3) croak("Usage: File::Copy::syscopy(src,dst,flag=0)"); { ! STRLEN n_a; ! char * src = (char *)SvPV(ST(0),n_a); ! char * dst = (char *)SvPV(ST(1),n_a); U32 flag; int RETVAL, rc; *************** *** 1022,1027 **** --- 1173,1180 ---- XSRETURN(1); } + #include "patchlevel.h" + char * mod2fname(sv) SV *sv; *************** *** 1032,1037 **** --- 1185,1191 ---- AV *av; SV *svp; char *s; + STRLEN n_a; if (!SvROK(sv)) croak("Not a reference given to mod2fname"); sv = SvRV(sv); *************** *** 1042,1048 **** if (avlen < 0) croak("Empty array reference given to mod2fname"); ! s = SvPV(*av_fetch((AV*)sv, avlen, FALSE), PL_na); strncpy(fname, s, 8); len = strlen(s); if (len < 6) pos = len; --- 1196,1202 ---- if (avlen < 0) croak("Empty array reference given to mod2fname"); ! s = SvPV(*av_fetch((AV*)sv, avlen, FALSE), n_a); strncpy(fname, s, 8); len = strlen(s); if (len < 6) pos = len; *************** *** 1052,1058 **** } avlen --; while (avlen >= 0) { ! s = SvPV(*av_fetch((AV*)sv, avlen, FALSE), PL_na); while (*s) { sum = 33 * sum + *(s++); /* 7 is primitive mod 13. */ } --- 1206,1212 ---- } avlen --; while (avlen >= 0) { ! s = SvPV(*av_fetch((AV*)sv, avlen, FALSE), n_a); while (*s) { sum = 33 * sum + *(s++); /* 7 is primitive mod 13. */ } *************** *** 1061,1066 **** --- 1215,1221 ---- #ifdef USE_THREADS sum++; /* Avoid conflict of DLLs in memory. */ #endif + sum += PATCHLEVEL * 200 + SUBVERSION * 2; /* */ fname[pos] = 'A' + (sum % 26); fname[pos + 1] = 'A' + (sum / 26 % 26); fname[pos + 2] = '\0'; *************** *** 1096,1101 **** --- 1251,1262 ---- sprintf(buf, "OS/2 system error code %d=0x%x", rc, rc); else buf[len] = '\0'; + if (len > 0 && buf[len - 1] == '\n') + buf[len - 1] = '\0'; + if (len > 1 && buf[len - 2] == '\r') + buf[len - 2] = '\0'; + if (len > 2 && buf[len - 3] == '.') + buf[len - 3] = '\0'; return buf; } *************** *** 1182,1188 **** if (items != 1) croak("Usage: Cwd::sys_chdir(path)"); { ! char * path = (char *)SvPV(ST(0),PL_na); bool RETVAL; RETVAL = sys_chdir(path); --- 1343,1350 ---- if (items != 1) croak("Usage: Cwd::sys_chdir(path)"); { ! STRLEN n_a; ! char * path = (char *)SvPV(ST(0),n_a); bool RETVAL; RETVAL = sys_chdir(path); *************** *** 1198,1204 **** if (items != 1) croak("Usage: Cwd::change_drive(d)"); { ! char d = (char)*SvPV(ST(0),PL_na); bool RETVAL; RETVAL = change_drive(d); --- 1360,1367 ---- if (items != 1) croak("Usage: Cwd::change_drive(d)"); { ! STRLEN n_a; ! char d = (char)*SvPV(ST(0),n_a); bool RETVAL; RETVAL = change_drive(d); *************** *** 1214,1220 **** if (items != 1) croak("Usage: Cwd::sys_is_absolute(path)"); { ! char * path = (char *)SvPV(ST(0),PL_na); bool RETVAL; RETVAL = sys_is_absolute(path); --- 1377,1384 ---- if (items != 1) croak("Usage: Cwd::sys_is_absolute(path)"); { ! STRLEN n_a; ! char * path = (char *)SvPV(ST(0),n_a); bool RETVAL; RETVAL = sys_is_absolute(path); *************** *** 1230,1236 **** if (items != 1) croak("Usage: Cwd::sys_is_rooted(path)"); { ! char * path = (char *)SvPV(ST(0),PL_na); bool RETVAL; RETVAL = sys_is_rooted(path); --- 1394,1401 ---- if (items != 1) croak("Usage: Cwd::sys_is_rooted(path)"); { ! STRLEN n_a; ! char * path = (char *)SvPV(ST(0),n_a); bool RETVAL; RETVAL = sys_is_rooted(path); *************** *** 1246,1252 **** if (items != 1) croak("Usage: Cwd::sys_is_relative(path)"); { ! char * path = (char *)SvPV(ST(0),PL_na); bool RETVAL; RETVAL = sys_is_relative(path); --- 1411,1418 ---- if (items != 1) croak("Usage: Cwd::sys_is_relative(path)"); { ! STRLEN n_a; ! char * path = (char *)SvPV(ST(0),n_a); bool RETVAL; RETVAL = sys_is_relative(path); *************** *** 1277,1283 **** if (items < 1 || items > 2) croak("Usage: Cwd::sys_abspath(path, dir = NULL)"); { ! char * path = (char *)SvPV(ST(0),PL_na); char * dir; char p[MAXPATHLEN]; char * RETVAL; --- 1443,1450 ---- if (items < 1 || items > 2) croak("Usage: Cwd::sys_abspath(path, dir = NULL)"); { ! STRLEN n_a; ! char * path = (char *)SvPV(ST(0),n_a); char * dir; char p[MAXPATHLEN]; char * RETVAL; *************** *** 1285,1291 **** if (items < 2) dir = NULL; else { ! dir = (char *)SvPV(ST(1),PL_na); } if (path[0] == '.' && (path[1] == '/' || path[1] == '\\')) { path += 2; --- 1452,1458 ---- if (items < 2) dir = NULL; else { ! dir = (char *)SvPV(ST(1),n_a); } if (path[0] == '.' && (path[1] == '/' || path[1] == '\\')) { path += 2; *************** *** 1425,1431 **** if (items < 1 || items > 2) croak("Usage: Cwd::extLibpath_set(s, type = 0)"); { ! char * s = (char *)SvPV(ST(0),PL_na); bool type; U32 rc; bool RETVAL; --- 1592,1599 ---- if (items < 1 || items > 2) croak("Usage: Cwd::extLibpath_set(s, type = 0)"); { ! STRLEN n_a; ! char * s = (char *)SvPV(ST(0),n_a); bool type; U32 rc; bool RETVAL; *************** *** 1482,1487 **** --- 1650,1656 ---- MALLOC_INIT; settmppath(); OS2_Perl_data.xs_init = &Xs_OS2_init; + _uflags (_UF_SBRK_MODEL, _UF_SBRK_ARBITRARY); if (environ == NULL) { environ = env; } *************** *** 1502,1507 **** --- 1671,1677 ---- } } MUTEX_INIT(&start_thread_mutex); + os2_mytype = my_type(); /* Do it before morphing. Needed? */ } #undef tmpnam diff -c 'perl5.005_02/os2/os2ish.h' 'perl5.005_03/os2/os2ish.h' Index: ./os2/os2ish.h *** ./os2/os2ish.h Sun Aug 2 01:28:28 1998 --- ./os2/os2ish.h Thu Jan 28 19:14:27 1999 *************** *** 152,158 **** #define pthread_setspecific(k,v) (*_threadstore()=v,0) #define pthread_self() _gettid() #define pthread_key_create(keyp,flag) (*keyp=_gettid(),0) ! #define sched_yield() DosSleep(0) #ifdef PTHREADS_INCLUDED /* For ./x2p stuff. */ int pthread_join(pthread_t tid, void **status); --- 152,158 ---- #define pthread_setspecific(k,v) (*_threadstore()=v,0) #define pthread_self() _gettid() #define pthread_key_create(keyp,flag) (*keyp=_gettid(),0) ! #define YIELD DosSleep(0) #ifdef PTHREADS_INCLUDED /* For ./x2p stuff. */ int pthread_join(pthread_t tid, void **status); diff -c 'perl5.005_02/perl.c' 'perl5.005_03/perl.c' Index: ./perl.c *** ./perl.c Fri Aug 7 17:28:48 1998 --- ./perl.c Sat Mar 27 11:49:17 1999 *************** *** 1,6 **** /* perl.c * ! * Copyright (c) 1987-1998 Larry Wall * * You may distribute under the terms of either the GNU General Public * License or the Artistic License, as specified in the README file. --- 1,6 ---- /* perl.c * ! * Copyright (c) 1987-1999 Larry Wall * * You may distribute under the terms of either the GNU General Public * License or the Artistic License, as specified in the README file. *************** *** 64,69 **** --- 64,72 ---- static void nuke_stacks _((void)); static void open_script _((char *, bool, SV *, int *fd)); static void usage _((char *)); + #ifdef IAMSUID + static int fd_on_nosuid_fs _((int)); + #endif static void validate_suid _((char *, char*, int)); static I32 read_e_script _((int idx, SV *buf_sv, int maxlen)); #endif *************** *** 126,131 **** --- 129,135 ---- croak("panic: pthread_key_create"); #endif MUTEX_INIT(&PL_sv_mutex); + MUTEX_INIT(&PL_cred_mutex); /* * Safe to use basic SV functions from now on (though * not things like mortals or tainting yet). *************** *** 551,559 **** --- 555,568 ---- DEBUG_P(debprofdump()); #ifdef USE_THREADS + MUTEX_DESTROY(&PL_strtab_mutex); MUTEX_DESTROY(&PL_sv_mutex); + MUTEX_DESTROY(&PL_cred_mutex); MUTEX_DESTROY(&PL_eval_mutex); COND_DESTROY(&PL_eval_cond); + #ifdef EMULATE_ATOMIC_REFCOUNTS + MUTEX_DESTROY(&PL_svref_mutex); + #endif /* EMULATE_ATOMIC_REFCOUNTS */ /* As the penultimate thing, free the non-arena SV for thrsv */ Safefree(SvPVX(PL_thrsv)); *************** *** 719,724 **** --- 728,736 ---- s = argv[0]+1; reswitch: switch (*s) { + #ifndef PERL_STRICT_CR + case '\r': + #endif case ' ': case '0': case 'F': *************** *** 1138,1143 **** --- 1150,1156 ---- perl_get_cv(char *name, I32 create) { GV* gv = gv_fetchpv(name, create, SVt_PVCV); + /* XXX unsafe for threads if eval_owner isn't held */ if (create && !GvCVu(gv)) return newSUB(start_subparse(FALSE, 0), newSVOP(OP_CONST, 0, newSVpv(name,0)), *************** *** 1440,1447 **** sv = POPs; PUTBACK; ! if (croak_on_error && SvTRUE(ERRSV)) ! croak(SvPVx(ERRSV, PL_na)); return sv; } --- 1453,1462 ---- sv = POPs; PUTBACK; ! if (croak_on_error && SvTRUE(ERRSV)) { ! STRLEN n_a; ! croak(SvPVx(ERRSV, n_a)); ! } return sv; } *************** *** 1713,1719 **** LOCAL_PATCH_COUNT, (LOCAL_PATCH_COUNT!=1) ? "es" : ""); #endif ! printf("\n\nCopyright 1987-1998, Larry Wall\n"); #ifdef MSDOS printf("\nMS-DOS port Copyright (c) 1989, 1990, Diomidis Spinellis\n"); #endif --- 1728,1734 ---- LOCAL_PATCH_COUNT, (LOCAL_PATCH_COUNT!=1) ? "es" : ""); #endif ! printf("\n\nCopyright 1987-1999, Larry Wall\n"); #ifdef MSDOS printf("\nMS-DOS port Copyright (c) 1989, 1990, Diomidis Spinellis\n"); #endif *************** *** 1737,1742 **** --- 1752,1763 ---- #ifdef OEMVS printf("MVS (OS390) port by Mortice Kern Systems, 1997-1998\n"); #endif + #ifdef __VOS__ + printf("Stratus VOS port by Paul_Green@stratus.com, 1997-1999\n"); + #endif + #ifdef __MINT__ + printf("MiNT port by Guido Flohr, 1997\n"); + #endif #ifdef BINARY_BUILD_NOTICE BINARY_BUILD_NOTICE; #endif *************** *** 1758,1764 **** break; case '-': case 0: ! #ifdef WIN32 case '\r': #endif case '\n': --- 1779,1785 ---- break; case '-': case 0: ! #if defined(WIN32) || !defined(PERL_STRICT_CR) case '\r': #endif case '\n': *************** *** 1886,1891 **** --- 1907,1915 ---- about not iterating on it, and not adding tie magic to it. It is properly deallocated in perl_destruct() */ PL_strtab = newHV(); + #ifdef USE_THREADS + MUTEX_INIT(&PL_strtab_mutex); + #endif HvSHAREKEYS_off(PL_strtab); /* mandatory */ hv_ksplit(PL_strtab, 512); *************** *** 1913,1919 **** PL_debstash = GvHV(gv_fetchpv("DB::", GV_ADDMULTI, SVt_PVHV)); PL_globalstash = GvHV(gv_fetchpv("CORE::GLOBAL::", GV_ADDMULTI, SVt_PVHV)); /* We must init $/ before switches are processed. */ ! sv_setpvn(GvSV(gv_fetchpv("/", TRUE, SVt_PV)), "\n", 1); } STATIC void --- 1937,1943 ---- PL_debstash = GvHV(gv_fetchpv("DB::", GV_ADDMULTI, SVt_PVHV)); PL_globalstash = GvHV(gv_fetchpv("CORE::GLOBAL::", GV_ADDMULTI, SVt_PVHV)); /* We must init $/ before switches are processed. */ ! sv_setpvn(perl_get_sv("/", TRUE), "\n", 1); } STATIC void *************** *** 2056,2061 **** --- 2080,2150 ---- } } + #ifdef IAMSUID + static int + fd_on_nosuid_fs(int fd) + { + int on_nosuid = 0; + int check_okay = 0; + /* + * Preferred order: fstatvfs(), fstatfs(), getmntent(). + * fstatvfs() is UNIX98. + * fstatfs() is BSD. + * getmntent() is O(number-of-mounted-filesystems) and can hang. + */ + + # ifdef HAS_FSTATVFS + struct statvfs stfs; + check_okay = fstatvfs(fd, &stfs) == 0; + on_nosuid = check_okay && (stfs.f_flag & ST_NOSUID); + # else + # if defined(HAS_FSTATFS) && defined(HAS_STRUCT_STATFS_FLAGS) + struct statfs stfs; + check_okay = fstatfs(fd, &stfs) == 0; + # undef PERL_MOUNT_NOSUID + # if !defined(PERL_MOUNT_NOSUID) && defined(MNT_NOSUID) + # define PERL_MOUNT_NOSUID MNT_NOSUID + # endif + # if !defined(PERL_MOUNT_NOSUID) && defined(MS_NOSUID) + # define PERL_MOUNT_NOSUID MS_NOSUID + # endif + # if !defined(PERL_MOUNT_NOSUID) && defined(M_NOSUID) + # define PERL_MOUNT_NOSUID M_NOSUID + # endif + # ifdef PERL_MOUNT_NOSUID + on_nosuid = check_okay && (stfs.f_flags & PERL_MOUNT_NOSUID); + # endif + # else + # if defined(HAS_GETMNTENT) && defined(HAS_HASMNTOPT) && defined(MNTOPT_NOSUID) + FILE *mtab = fopen("/etc/mtab", "r"); + struct mntent *entry; + struct stat stb, fsb; + + if (mtab && (fstat(fd, &stb) == 0)) { + while (entry = getmntent(mtab)) { + if (stat(entry->mnt_dir, &fsb) == 0 + && fsb.st_dev == stb.st_dev) + { + /* found the filesystem */ + check_okay = 1; + if (hasmntopt(entry, MNTOPT_NOSUID)) + on_nosuid = 1; + break; + } /* A single fs may well fail its stat(). */ + } + } + if (mtab) + fclose(mtab); + # endif /* mntent */ + # endif /* statfs */ + # endif /* statvfs */ + if (!check_okay) + croak("Can't check filesystem of script \"%s\" for nosuid", + PL_origfilename); + return on_nosuid; + } + #endif /* IAMSUID */ + STATIC void validate_suid(char *validarg, char *scriptname, int fdscript) { *************** *** 2089,2094 **** --- 2178,2184 ---- croak("Can't stat script \"%s\"",PL_origfilename); if (fdscript < 0 && PL_statbuf.st_mode & (S_ISUID|S_ISGID)) { I32 len; + STRLEN n_a; #ifdef IAMSUID #ifndef HAS_SETREUID *************** *** 2123,2128 **** --- 2213,2222 ---- croak("Can't swap uid and euid"); /* really paranoid */ if (PerlLIO_stat(SvPVX(GvSV(PL_curcop->cop_filegv)),&tmpstatbuf) < 0) croak("Permission denied"); /* testing full pathname here */ + #if defined(IAMSUID) && !defined(NO_NOSUID_CHECK) + if (fd_on_nosuid_fs(PerlIO_fileno(PL_rsfp))) + croak("Permission denied"); + #endif if (tmpstatbuf.st_dev != PL_statbuf.st_dev || tmpstatbuf.st_ino != PL_statbuf.st_ino) { (void)PerlIO_close(PL_rsfp); *************** *** 2161,2172 **** PL_doswitches = FALSE; /* -s is insecure in suid */ PL_curcop->cop_line++; if (sv_gets(PL_linestr, PL_rsfp, 0) == Nullch || ! strnNE(SvPV(PL_linestr,PL_na),"#!",2) ) /* required even on Sys V */ croak("No #! line"); ! s = SvPV(PL_linestr,PL_na)+2; if (*s == ' ') s++; while (!isSPACE(*s)) s++; ! for (s2 = s; (s2 > SvPV(PL_linestr,PL_na)+2 && (isDIGIT(s2[-1]) || strchr("._-", s2[-1]))); s2--) ; if (strnNE(s2-4,"perl",4) && strnNE(s-9,"perl",4)) /* sanity check */ croak("Not a perl script"); --- 2255,2266 ---- PL_doswitches = FALSE; /* -s is insecure in suid */ PL_curcop->cop_line++; if (sv_gets(PL_linestr, PL_rsfp, 0) == Nullch || ! strnNE(SvPV(PL_linestr,n_a),"#!",2) ) /* required even on Sys V */ croak("No #! line"); ! s = SvPV(PL_linestr,n_a)+2; if (*s == ' ') s++; while (!isSPACE(*s)) s++; ! for (s2 = s; (s2 > SvPV(PL_linestr,n_a)+2 && (isDIGIT(s2[-1]) || strchr("._-", s2[-1]))); s2--) ; if (strnNE(s2-4,"perl",4) && strnNE(s-9,"perl",4)) /* sanity check */ croak("Not a perl script"); *************** *** 2705,2711 **** char *unix; STRLEN len; ! if ((unix = tounixspec_ts(SvPV(libdir,PL_na),Nullch)) != Nullch) { len = strlen(unix); while (unix[len-1] == '/') len--; /* Cosmetic */ sv_usepvn(libdir,unix,len); --- 2799,2805 ---- char *unix; STRLEN len; ! if ((unix = tounixspec_ts(SvPV(libdir,len),Nullch)) != Nullch) { len = strlen(unix); while (unix[len-1] == '/') len--; /* Cosmetic */ sv_usepvn(libdir,unix,len); *************** *** 2713,2719 **** else PerlIO_printf(PerlIO_stderr(), "Failed to unixify @INC element \"%s\"\n", ! SvPV(libdir,PL_na)); #endif /* .../archname/version if -d .../archname/version/auto */ sv_setsv(subdir, libdir); --- 2807,2813 ---- else PerlIO_printf(PerlIO_stderr(), "Failed to unixify @INC element \"%s\"\n", ! SvPV(libdir,len)); #endif /* .../archname/version if -d .../archname/version/auto */ sv_setsv(subdir, libdir); diff -c 'perl5.005_02/perl.h' 'perl5.005_03/perl.h' Index: ./perl.h *** ./perl.h Sun Aug 2 01:12:18 1998 --- ./perl.h Sun Mar 28 01:57:16 1999 *************** *** 1,6 **** /* perl.h * ! * Copyright (c) 1987-1997, Larry Wall * * You may distribute under the terms of either the GNU General Public * License or the Artistic License, as specified in the README file. --- 1,6 ---- /* perl.h * ! * Copyright (c) 1987-1999, Larry Wall * * You may distribute under the terms of either the GNU General Public * License or the Artistic License, as specified in the README file. *************** *** 209,214 **** --- 209,220 ---- # define LIBERAL 1 #endif + #if 'A' == 65 && 'I' == 73 && 'J' == 74 && 'Z' == 90 + #define ASCIIish + #else + #undef ASCIIish + #endif + /* * The following contortions are brought to you on behalf of all the * standards, semi-standards, de facto standards, not-so-de-facto standards *************** *** 244,250 **** #define TAINT_NOT (PL_tainted = FALSE) #define TAINT_IF(c) if (c) { PL_tainted = TRUE; } #define TAINT_ENV() if (PL_tainting) { taint_env(); } ! #define TAINT_PROPER(s) if (PL_tainting) { taint_proper(no_security, s); } /* XXX All process group stuff is handled in pp_sys.c. Should these defines move there? If so, I could simplify this a lot. --AD 9/96. --- 250,256 ---- #define TAINT_NOT (PL_tainted = FALSE) #define TAINT_IF(c) if (c) { PL_tainted = TRUE; } #define TAINT_ENV() if (PL_tainting) { taint_env(); } ! #define TAINT_PROPER(s) if (PL_tainting) { taint_proper(Nullch, s); } /* XXX All process group stuff is handled in pp_sys.c. Should these defines move there? If so, I could simplify this a lot. --AD 9/96. *************** *** 585,591 **** set_vaxc_errno(vmserrcode); \ } STMT_END #else ! # define SETERRNO(errcode,vmserrcode) errno = (errcode) #endif #ifdef USE_THREADS --- 591,597 ---- set_vaxc_errno(vmserrcode); \ } STMT_END #else ! # define SETERRNO(errcode,vmserrcode) (errno = (errcode)) #endif #ifdef USE_THREADS *************** *** 1109,1115 **** # if defined(MPE) # include "mpeix/mpeixish.h" # else ! # include "unixish.h" # endif # endif # endif --- 1115,1125 ---- # if defined(MPE) # include "mpeix/mpeixish.h" # else ! # if defined(__VOS__) ! # include "vosish.h" ! # else ! # include "unixish.h" ! # endif # endif # endif # endif *************** *** 1140,1150 **** # ifdef OS2 # include "os2thread.h" # else ! # include ! typedef pthread_t perl_os_thread; ! typedef pthread_mutex_t perl_mutex; ! typedef pthread_cond_t perl_cond; ! typedef pthread_key_t perl_key; # endif /* OS2 */ # endif /* WIN32 */ # endif /* FAKE_THREADS */ --- 1150,1171 ---- # ifdef OS2 # include "os2thread.h" # else ! # ifdef I_MACH_CTHREADS ! # include ! # ifdef NeXT ! # define MUTEX_INIT_CALLS_MALLOC ! # endif ! typedef cthread_t perl_os_thread; ! typedef mutex_t perl_mutex; ! typedef condition_t perl_cond; ! typedef void * perl_key; ! # else /* Posix threads */ ! # include ! typedef pthread_t perl_os_thread; ! typedef pthread_mutex_t perl_mutex; ! typedef pthread_cond_t perl_cond; ! typedef pthread_key_t perl_key; ! # endif /* I_MACH_CTHREADS */ # endif /* OS2 */ # endif /* WIN32 */ # endif /* FAKE_THREADS */ *************** *** 1360,1366 **** # define HAS_VTOHS # define HAS_HTOVL # define HAS_HTOVS ! # if BYTEORDER == 0x4321 # define vtohl(x) ((((x)&0xFF)<<24) \ +(((x)>>24)&0xFF) \ +(((x)&0x0000FF00)<<8) \ --- 1381,1387 ---- # define HAS_VTOHS # define HAS_HTOVL # define HAS_HTOVS ! # if BYTEORDER == 0x4321 || BYTEORDER == 0x87654321 # define vtohl(x) ((((x)&0xFF)<<24) \ +(((x)>>24)&0xFF) \ +(((x)&0x0000FF00)<<8) \ *************** *** 1545,1551 **** #define UNLINK unlnk I32 unlnk _((char*)); #else ! #define UNLINK unlink #endif #ifndef HAS_SETREUID --- 1566,1572 ---- #define UNLINK unlnk I32 unlnk _((char*)); #else ! #define UNLINK PerlLIO_unlink #endif #ifndef HAS_SETREUID *************** *** 1585,1592 **** #endif #ifdef MYMALLOC ! # define MALLOC_INIT MUTEX_INIT(&PL_malloc_mutex) ! # define MALLOC_TERM MUTEX_DESTROY(&PL_malloc_mutex) #else # define MALLOC_INIT # define MALLOC_TERM --- 1606,1627 ---- #endif #ifdef MYMALLOC ! # ifdef MUTEX_INIT_CALLS_MALLOC ! # define MALLOC_INIT \ ! STMT_START { \ ! PL_malloc_mutex = NULL; \ ! MUTEX_INIT(&PL_malloc_mutex); \ ! } STMT_END ! # define MALLOC_TERM \ ! STMT_START { \ ! perl_mutex tmp = PL_malloc_mutex; \ ! PL_malloc_mutex = NULL; \ ! MUTEX_DESTROY(&tmp); \ ! } STMT_END ! # else ! # define MALLOC_INIT MUTEX_INIT(&PL_malloc_mutex) ! # define MALLOC_TERM MUTEX_DESTROY(&PL_malloc_mutex) ! # endif #else # define MALLOC_INIT # define MALLOC_TERM *************** *** 1903,1908 **** --- 1938,1976 ---- XTERMBLOCK } expectation; + enum { /* pass one of these to get_vtbl */ + want_vtbl_sv, + want_vtbl_env, + want_vtbl_envelem, + want_vtbl_sig, + want_vtbl_sigelem, + want_vtbl_pack, + want_vtbl_packelem, + want_vtbl_dbline, + want_vtbl_isa, + want_vtbl_isaelem, + want_vtbl_arylen, + want_vtbl_glob, + want_vtbl_mglob, + want_vtbl_nkeys, + want_vtbl_taint, + want_vtbl_substr, + want_vtbl_vec, + want_vtbl_pos, + want_vtbl_bm, + want_vtbl_fm, + want_vtbl_uvar, + want_vtbl_defelem, + want_vtbl_regexp, + want_vtbl_collxfrm, + want_vtbl_amagic, + want_vtbl_amagicelem + #ifdef USE_THREADS + , + want_vtbl_mutex + #endif + }; + /* Note: the lowest 8 bits are reserved for stuffing into op->op_private */ *************** *** 2075,2080 **** --- 2143,2192 ---- #endif #ifdef PERL_OBJECT + /* from perly.c */ + #undef yydebug + #undef yynerrs + #undef yyerrflag + #undef yychar + #undef yyssp + #undef yyvsp + #undef yyval + #undef yylval + #define yydebug PL_yydebug + #define yynerrs PL_yynerrs + #define yyerrflag PL_yyerrflag + #define yychar PL_yychar + #define yyssp PL_yyssp + #define yyvsp PL_yyvsp + #define yyval PL_yyval + #define yylval PL_yylval + PERLVAR(yydebug, int) + PERLVAR(yynerrs, int) + PERLVAR(yyerrflag, int) + PERLVAR(yychar, int) + PERLVAR(yyssp, short*) + PERLVAR(yyvsp, YYSTYPE*) + PERLVAR(yyval, YYSTYPE) + PERLVAR(yylval, YYSTYPE) + + #define efloatbuf PL_efloatbuf + #define efloatsize PL_efloatsize + PERLVAR(efloatbuf, char *) + PERLVAR(efloatsize, STRLEN) + + #define glob_index PL_glob_index + #define srand_called PL_srand_called + #define uudmap PL_uudmap + #define bitcount PL_bitcount + #define filter_debug PL_filter_debug + PERLVAR(glob_index, int) + PERLVAR(srand_called, bool) + PERLVAR(uudmap[256], char) + PERLVAR(bitcount, char*) + PERLVAR(filter_debug, int) + PERLVAR(super_bufptr, char*) /* PL_bufptr that was */ + PERLVAR(super_bufend, char*) /* PL_bufend that was */ + /* * The following is a buffer where new variables must * be defined to maintain binary compatibility with PERL_OBJECT *************** *** 2448,2452 **** --- 2560,2578 ---- # define Semctl(id, num, cmd, semun) semctl(id, num, cmd, semun) # endif #endif + + #ifdef IAMSUID + + #ifdef I_SYS_STATVFS + # include /* for f?statvfs() */ + #endif + #ifdef I_SYS_MOUNT + # include /* for *BSD f?statfs() */ + #endif + #ifdef I_MNTENT + # include /* for getmntent() */ + #endif + + #endif /* IAMSUID */ #endif /* Include guard */ diff -c 'perl5.005_02/perl_exp.SH' 'perl5.005_03/perl_exp.SH' Index: ./perl_exp.SH *** ./perl_exp.SH Thu Jul 23 23:01:14 1998 --- ./perl_exp.SH Wed Nov 4 20:46:02 1998 *************** *** 49,56 **** echo "#!" > perl.exp # No compat3 since 5.004_50. ! # perlio.sym will added below if needed. ! syms="global.sym interp.sym thread.sym" sed -n '/^[A-Za-z]/ s/^/Perl_/p' $syms >> perl.exp --- 49,58 ---- echo "#!" > perl.exp # No compat3 since 5.004_50. ! # No interp.sym since 5.005_03. ! # perlio.sym will added later if needed. ! ! syms="global.sym thread.sym" sed -n '/^[A-Za-z]/ s/^/Perl_/p' $syms >> perl.exp *************** *** 59,65 **** sed -n 's/^PERLVAR.*(T\([^[,]*\).*/PL_\1/p' thrdvar.h >> perl.exp # ! # If we use the PerlIO abstraction layer, add its symbols # if [ $useperlio = "define" ] --- 61,67 ---- sed -n 's/^PERLVAR.*(T\([^[,]*\).*/PL_\1/p' thrdvar.h >> perl.exp # ! # If we use the PerlIO abstraction layer, add its symbols. # if [ $useperlio = "define" ] *************** *** 72,78 **** # not actually be defined, but there's no harm in that). # ! cat <> perl.exp perl_init_i18nl10n perl_init_i18nl14n perl_new_collate --- 74,80 ---- # not actually be defined, but there's no harm in that). # ! cat >> perl.exp <>perl.exp <>perl.exp <yyvs = yyvs = ! (YYSTYPE*)realloc((char*)yyvs,yystacksize * sizeof(YYSTYPE)); ysave->yyss = yyss = ! (short*)realloc((char*)yyss,yystacksize * sizeof(short)); if (!yyvs || !yyss) goto yyoverflow; yyssp = yyss + yyps_index; --- 1407,1415 ---- int yypv_index = (yyvsp - yyvs); yystacksize += YYSTACKSIZE; ysave->yyvs = yyvs = ! (YYSTYPE*)PerlMem_realloc((char*)yyvs,yystacksize * sizeof(YYSTYPE)); ysave->yyss = yyss = ! (short*)PerlMem_realloc((char*)yyss,yystacksize * sizeof(short)); if (!yyvs || !yyss) goto yyoverflow; yyssp = yyss + yyps_index; *************** *** 1460,1468 **** int yyps_index = (yyssp - yyss); int yypv_index = (yyvsp - yyvs); yystacksize += YYSTACKSIZE; ! ysave->yyvs = yyvs = (YYSTYPE*)realloc((char*)yyvs, yystacksize * sizeof(YYSTYPE)); ! ysave->yyss = yyss = (short*)realloc((char*)yyss, yystacksize * sizeof(short)); if (!yyvs || !yyss) goto yyoverflow; --- 1462,1470 ---- int yyps_index = (yyssp - yyss); int yypv_index = (yyvsp - yyvs); yystacksize += YYSTACKSIZE; ! ysave->yyvs = yyvs = (YYSTYPE*)PerlMem_realloc((char*)yyvs, yystacksize * sizeof(YYSTYPE)); ! ysave->yyss = yyss = (short*)PerlMem_realloc((char*)yyss, yystacksize * sizeof(short)); if (!yyvs || !yyss) goto yyoverflow; *************** *** 1772,1781 **** break; case 57: #line 302 "perly.y" ! { char *name = SvPV(((SVOP*)yyvsp[0].opval)->op_sv, PL_na); if (strEQ(name, "BEGIN") || strEQ(name, "END") || strEQ(name, "INIT")) ! CvUNIQUE_on(PL_compcv); yyval.opval = yyvsp[0].opval; } break; case 58: --- 1774,1783 ---- break; case 57: #line 302 "perly.y" ! { STRLEN n_a; char *name = SvPV(((SVOP*)yyvsp[0].opval)->op_sv, n_a); if (strEQ(name, "BEGIN") || strEQ(name, "END") || strEQ(name, "INIT")) ! CvSPECIAL_on(PL_compcv); yyval.opval = yyvsp[0].opval; } break; case 58: *************** *** 1800,1806 **** break; case 64: #line 325 "perly.y" ! { CvUNIQUE_on(PL_compcv); /* It's a BEGIN {} */ } break; case 65: #line 327 "perly.y" --- 1802,1808 ---- break; case 64: #line 325 "perly.y" ! { CvSPECIAL_on(PL_compcv); /* It's a BEGIN {} */ } break; case 65: #line 327 "perly.y" *************** *** 2109,2115 **** break; case 135: #line 515 "perly.y" ! { yyval.opval = newUNOP(OP_DOFILE, 0, scalar(yyvsp[0].opval)); } break; case 136: #line 517 "perly.y" --- 2111,2117 ---- break; case 135: #line 515 "perly.y" ! { yyval.opval = dofile(yyvsp[0].opval); } break; case 136: #line 517 "perly.y" *************** *** 2346,2354 **** int yypv_index = (yyvsp - yyvs); yystacksize += YYSTACKSIZE; ysave->yyvs = yyvs = ! (YYSTYPE*)realloc((char*)yyvs,yystacksize * sizeof(YYSTYPE)); ysave->yyss = yyss = ! (short*)realloc((char*)yyss,yystacksize * sizeof(short)); if (!yyvs || !yyss) goto yyoverflow; yyssp = yyss + yyps_index; --- 2348,2356 ---- int yypv_index = (yyvsp - yyvs); yystacksize += YYSTACKSIZE; ysave->yyvs = yyvs = ! (YYSTYPE*)PerlMem_realloc((char*)yyvs,yystacksize * sizeof(YYSTYPE)); ysave->yyss = yyss = ! (short*)PerlMem_realloc((char*)yyss,yystacksize * sizeof(short)); if (!yyvs || !yyss) goto yyoverflow; yyssp = yyss + yyps_index; diff -c 'perl5.005_02/perly.y' 'perl5.005_03/perly.y' Index: ./perly.y *** ./perly.y Sun Aug 2 00:15:07 1998 --- ./perly.y Sat Mar 27 12:04:11 1999 *************** *** 1,6 **** /* perly.y * ! * Copyright (c) 1991-1997, Larry Wall * * You may distribute under the terms of either the GNU General Public * License or the Artistic License, as specified in the README file. --- 1,6 ---- /* perly.y * ! * Copyright (c) 1991-1999, Larry Wall * * You may distribute under the terms of either the GNU General Public * License or the Artistic License, as specified in the README file. *************** *** 299,308 **** { $$ = start_subparse(TRUE, 0); } ; ! subname : WORD { char *name = SvPV(((SVOP*)$1)->op_sv, PL_na); if (strEQ(name, "BEGIN") || strEQ(name, "END") || strEQ(name, "INIT")) ! CvUNIQUE_on(PL_compcv); $$ = $1; } ; --- 299,308 ---- { $$ = start_subparse(TRUE, 0); } ; ! subname : WORD { STRLEN n_a; char *name = SvPV(((SVOP*)$1)->op_sv, n_a); if (strEQ(name, "BEGIN") || strEQ(name, "END") || strEQ(name, "INIT")) ! CvSPECIAL_on(PL_compcv); $$ = $1; } ; *************** *** 322,328 **** ; use : USE startsub ! { CvUNIQUE_on(PL_compcv); /* It's a BEGIN {} */ } WORD WORD listexpr ';' { utilize($1, $2, $4, $5, $6); } ; --- 322,328 ---- ; use : USE startsub ! { CvSPECIAL_on(PL_compcv); /* It's a BEGIN {} */ } WORD WORD listexpr ';' { utilize($1, $2, $4, $5, $6); } ; *************** *** 512,518 **** { $$ = newUNOP(OP_ENTERSUB, OPf_STACKED, append_elem(OP_LIST, $3, scalar($2))); } | DO term %prec UNIOP ! { $$ = newUNOP(OP_DOFILE, 0, scalar($2)); } | DO block %prec '(' { $$ = newUNOP(OP_NULL, OPf_SPECIAL, scope($2)); } | DO WORD '(' ')' --- 512,518 ---- { $$ = newUNOP(OP_ENTERSUB, OPf_STACKED, append_elem(OP_LIST, $3, scalar($2))); } | DO term %prec UNIOP ! { $$ = dofile($2); } | DO block %prec '(' { $$ = newUNOP(OP_NULL, OPf_SPECIAL, scope($2)); } | DO WORD '(' ')' diff -c 'perl5.005_02/perly_c.diff' 'perl5.005_03/perly_c.diff' Index: ./perly_c.diff *** ./perly_c.diff Sun Aug 2 00:15:07 1998 --- ./perly_c.diff Sat Jan 16 11:02:31 1999 *************** *** 1,23 **** ! *** perly.c.orig Tue Jul 28 15:02:41 1998 ! --- perly.c Tue Jul 28 15:14:54 1998 *************** ! *** 7,11 **** ! --- 7,19 ---- #include "perl.h" - + #ifdef PERL_OBJECT static void - + Dep(CPerlObj *pPerl) - + { - + pPerl->deprecate("\"do\" to call subroutines"); - + } - + #define dep() Dep(this) - + #else - + static void dep(void) { - *************** - *** 12,86 **** deprecate("\"do\" to call subroutines"); } --- 1,12 ---- ! *** perly.c.old Wed Jan 06 20:03:41 1999 ! --- perly.c Wed Jan 06 18:51:20 1999 *************** ! *** 7,86 **** #include "perl.h" static void dep(void) { deprecate("\"do\" to call subroutines"); } *************** *** 93,99 **** - #define ARROW 314 #define YYERRCODE 256 short yylhs[] = { -1, ! --- 20,26 ---- deprecate("\"do\" to call subroutines"); } + #endif --- 82,101 ---- - #define ARROW 314 #define YYERRCODE 256 short yylhs[] = { -1, ! --- 7,26 ---- ! #include "perl.h" ! ! + #ifdef PERL_OBJECT ! static void ! + Dep(CPerlObj *pPerl) ! + { ! + pPerl->deprecate("\"do\" to call subroutines"); ! + } ! + #define dep() Dep(this) ! + #else ! + static void ! dep(void) ! { deprecate("\"do\" to call subroutines"); } + #endif *************** *** 102,113 **** #define YYERRCODE 256 short yylhs[] = { -1, *************** *** 1345,1365 **** YYSTYPE yyval; YYSTYPE yylval; ! - short yyss[YYSTACKSIZE]; ! - YYSTYPE yyvs[YYSTACKSIZE]; ! - #define yystacksize YYSTACKSIZE #line 643 "perly.y" /* PROGRAM */ ! #line 1353 "y.tab.c" --- 104,123 ---- #define YYERRCODE 256 short yylhs[] = { -1, *************** + *** 1337,1340 **** + --- 1277,1281 ---- + #endif + #endif + + #ifndef PERL_OBJECT + int yydebug; + int yynerrs; + *************** *** 1345,1365 **** YYSTYPE yyval; YYSTYPE yylval; ! ! short yyss[YYSTACKSIZE]; ! ! YYSTYPE yyvs[YYSTACKSIZE]; ! ! #define yystacksize YYSTACKSIZE #line 643 "perly.y" /* PROGRAM */ ! #line 1353 "y.tab.c" *************** *** 124,132 **** if (yys = getenv("YYDEBUG")) { ! --- 1285,1349 ---- YYSTYPE yyval; YYSTYPE yylval; #line 643 "perly.y" /* PROGRAM */ ! #line 1353 "perly.c" --- 134,143 ---- if (yys = getenv("YYDEBUG")) { ! --- 1286,1351 ---- YYSTYPE yyval; YYSTYPE yylval; + ! #endif #line 643 "perly.y" /* PROGRAM */ ! #line 1353 "perly.c" *************** *** 176,182 **** extern char *getenv(); + #endif + #endif ! + struct ysv *ysave; + New(73, ysave, 1, struct ysv); + SAVEDESTRUCTOR(yydestruct, ysave); --- 187,193 ---- extern char *getenv(); + #endif + #endif ! + + struct ysv *ysave; + New(73, ysave, 1, struct ysv); + SAVEDESTRUCTOR(yydestruct, ysave); *************** *** 186,198 **** + ysave->oldyychar = yychar; + ysave->oldyyval = yyval; + ysave->oldyylval = yylval; ! + + #if YYDEBUG if (yys = getenv("YYDEBUG")) { *************** *** 1374,1377 **** ! --- 1358,1371 ---- yychar = (-1); + /* --- 197,209 ---- + ysave->oldyychar = yychar; + ysave->oldyyval = yyval; + ysave->oldyylval = yylval; ! + #if YYDEBUG if (yys = getenv("YYDEBUG")) { *************** *** 1374,1377 **** ! --- 1360,1373 ---- yychar = (-1); + /* *************** *** 214,246 **** ! printf("yydebug: state %d, reading %d (%s)\n", yystate, yychar, yys); } ! --- 1383,1387 ---- if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; if (!yys) yys = "illegal-symbol"; ! PerlIO_printf(Perl_debug_log, "yydebug: state %d, reading %d (%s)\n", yystate, yychar, yys); } *************** ! *** 1399,1403 **** #if YYDEBUG if (yydebug) ! printf("yydebug: state %d, shifting to state %d\n", yystate, yytable[yyn]); #endif - --- 1393,1397 ---- - #if YYDEBUG - if (yydebug) - ! PerlIO_printf(Perl_debug_log, "yydebug: state %d, shifting to state %d\n", - yystate, yytable[yyn]); - #endif - *************** - *** 1404,1408 **** if (yyssp >= yyss + yystacksize - 1) { ! goto yyoverflow; } *++yyssp = yystate = yytable[yyn]; ! --- 1398,1416 ---- if (yyssp >= yyss + yystacksize - 1) { ! /* --- 225,254 ---- ! printf("yydebug: state %d, reading %d (%s)\n", yystate, yychar, yys); } ! --- 1385,1389 ---- if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; if (!yys) yys = "illegal-symbol"; ! PerlIO_printf(Perl_debug_log, "yydebug: state %d, reading %d (%s)\n", yystate, yychar, yys); } *************** ! *** 1399,1408 **** #if YYDEBUG if (yydebug) ! printf("yydebug: state %d, shifting to state %d\n", yystate, yytable[yyn]); #endif if (yyssp >= yyss + yystacksize - 1) { ! goto yyoverflow; } *++yyssp = yystate = yytable[yyn]; ! --- 1395,1418 ---- ! #if YYDEBUG ! if (yydebug) ! ! PerlIO_printf(Perl_debug_log, "yydebug: state %d, shifting to state %d\n", ! yystate, yytable[yyn]); ! #endif if (yyssp >= yyss + yystacksize - 1) { ! /* *************** *** 251,259 **** ! int yypv_index = (yyvsp - yyvs); ! yystacksize += YYSTACKSIZE; ! ysave->yyvs = yyvs = ! ! (YYSTYPE*)realloc((char*)yyvs,yystacksize * sizeof(YYSTYPE)); ! ysave->yyss = yyss = ! ! (short*)realloc((char*)yyss,yystacksize * sizeof(short)); ! if (!yyvs || !yyss) ! goto yyoverflow; ! yyssp = yyss + yyps_index; --- 259,267 ---- ! int yypv_index = (yyvsp - yyvs); ! yystacksize += YYSTACKSIZE; ! ysave->yyvs = yyvs = ! ! (YYSTYPE*)PerlMem_realloc((char*)yyvs,yystacksize * sizeof(YYSTYPE)); ! ysave->yyss = yyss = ! ! (short*)PerlMem_realloc((char*)yyss,yystacksize * sizeof(short)); ! if (!yyvs || !yyss) ! goto yyoverflow; ! yyssp = yyss + yyps_index; *************** *** 272,278 **** ! goto yyoverflow; } *++yyssp = yystate = yytable[yyn]; ! --- 1448,1472 ---- #if YYDEBUG if (yydebug) ! PerlIO_printf(Perl_debug_log, --- 280,286 ---- ! goto yyoverflow; } *++yyssp = yystate = yytable[yyn]; ! --- 1450,1474 ---- #if YYDEBUG if (yydebug) ! PerlIO_printf(Perl_debug_log, *************** *** 288,296 **** ! int yyps_index = (yyssp - yyss); ! int yypv_index = (yyvsp - yyvs); ! yystacksize += YYSTACKSIZE; ! ! ysave->yyvs = yyvs = (YYSTYPE*)realloc((char*)yyvs, ! yystacksize * sizeof(YYSTYPE)); ! ! ysave->yyss = yyss = (short*)realloc((char*)yyss, ! yystacksize * sizeof(short)); ! if (!yyvs || !yyss) ! goto yyoverflow; --- 296,304 ---- ! int yyps_index = (yyssp - yyss); ! int yypv_index = (yyvsp - yyvs); ! yystacksize += YYSTACKSIZE; ! ! ysave->yyvs = yyvs = (YYSTYPE*)PerlMem_realloc((char*)yyvs, ! yystacksize * sizeof(YYSTYPE)); ! ! ysave->yyss = yyss = (short*)PerlMem_realloc((char*)yyss, ! yystacksize * sizeof(short)); ! if (!yyvs || !yyss) ! goto yyoverflow; *************** *** 306,312 **** ! *yyssp); #endif if (yyssp <= yyss) goto yyabort; ! --- 1478,1484 ---- #if YYDEBUG if (yydebug) ! PerlIO_printf(Perl_debug_log, --- 314,320 ---- ! *yyssp); #endif if (yyssp <= yyss) goto yyabort; ! --- 1480,1486 ---- #if YYDEBUG if (yydebug) ! PerlIO_printf(Perl_debug_log, *************** *** 322,328 **** ! yystate, yychar, yys); } #endif ! --- 1497,1503 ---- if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; if (!yys) yys = "illegal-symbol"; ! PerlIO_printf(Perl_debug_log, --- 330,336 ---- ! yystate, yychar, yys); } #endif ! --- 1499,1505 ---- if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; if (!yys) yys = "illegal-symbol"; ! PerlIO_printf(Perl_debug_log, *************** *** 337,343 **** ! printf("yydebug: state %d, reducing by rule %d (%s)\n", yystate, yyn, yyrule[yyn]); #endif ! --- 1508,1512 ---- #if YYDEBUG if (yydebug) ! PerlIO_printf(Perl_debug_log, "yydebug: state %d, reducing by rule %d (%s)\n", --- 345,351 ---- ! printf("yydebug: state %d, reducing by rule %d (%s)\n", yystate, yyn, yyrule[yyn]); #endif ! --- 1510,1514 ---- #if YYDEBUG if (yydebug) ! PerlIO_printf(Perl_debug_log, "yydebug: state %d, reducing by rule %d (%s)\n", *************** *** 350,356 **** ! #line 2270 "y.tab.c" } yyssp -= yym; ! --- 2292,2296 ---- { yyval.opval = yyvsp[0].opval; } break; ! #line 2270 "perly.c" --- 358,364 ---- ! #line 2270 "y.tab.c" } yyssp -= yym; ! --- 2294,2298 ---- { yyval.opval = yyvsp[0].opval; } break; ! #line 2270 "perly.c" *************** *** 364,370 **** ! state %d\n", YYFINAL); #endif yystate = YYFINAL; ! --- 2302,2308 ---- #if YYDEBUG if (yydebug) ! PerlIO_printf(Perl_debug_log, --- 372,378 ---- ! state %d\n", YYFINAL); #endif yystate = YYFINAL; ! --- 2304,2310 ---- #if YYDEBUG if (yydebug) ! PerlIO_printf(Perl_debug_log, *************** *** 379,385 **** ! printf("yydebug: state %d, reading %d (%s)\n", YYFINAL, yychar, yys); } ! --- 2318,2322 ---- if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; if (!yys) yys = "illegal-symbol"; ! PerlIO_printf(Perl_debug_log, "yydebug: state %d, reading %d (%s)\n", --- 387,393 ---- ! printf("yydebug: state %d, reading %d (%s)\n", YYFINAL, yychar, yys); } ! --- 2320,2324 ---- if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; if (!yys) yys = "illegal-symbol"; ! PerlIO_printf(Perl_debug_log, "yydebug: state %d, reading %d (%s)\n", *************** *** 397,403 **** ! goto yyoverflow; } *++yyssp = yystate; ! --- 2333,2357 ---- #if YYDEBUG if (yydebug) ! PerlIO_printf(Perl_debug_log, --- 405,411 ---- ! goto yyoverflow; } *++yyssp = yystate; ! --- 2335,2359 ---- #if YYDEBUG if (yydebug) ! PerlIO_printf(Perl_debug_log, *************** *** 414,422 **** ! int yypv_index = (yyvsp - yyvs); ! yystacksize += YYSTACKSIZE; ! ysave->yyvs = yyvs = ! ! (YYSTYPE*)realloc((char*)yyvs,yystacksize * sizeof(YYSTYPE)); ! ysave->yyss = yyss = ! ! (short*)realloc((char*)yyss,yystacksize * sizeof(short)); ! if (!yyvs || !yyss) ! goto yyoverflow; ! yyssp = yyss + yyps_index; --- 422,430 ---- ! int yypv_index = (yyvsp - yyvs); ! yystacksize += YYSTACKSIZE; ! ysave->yyvs = yyvs = ! ! (YYSTYPE*)PerlMem_realloc((char*)yyvs,yystacksize * sizeof(YYSTYPE)); ! ysave->yyss = yyss = ! ! (short*)PerlMem_realloc((char*)yyss,yystacksize * sizeof(short)); ! if (!yyvs || !yyss) ! goto yyoverflow; ! yyssp = yyss + yyps_index; *************** *** 433,439 **** yyaccept: ! return (0); } ! --- 2359,2366 ---- goto yyloop; yyoverflow: ! yyerror("Out of memory for yacc stack"); --- 441,447 ---- yyaccept: ! return (0); } ! --- 2361,2368 ---- goto yyloop; yyoverflow: ! yyerror("Out of memory for yacc stack"); diff -c 'perl5.005_02/pod/Makefile' 'perl5.005_03/pod/Makefile' Index: ./pod/Makefile *** ./pod/Makefile Thu Jul 23 23:01:19 1998 --- ./pod/Makefile Sun Mar 28 10:13:03 1999 *************** *** 16,27 **** --- 16,29 ---- POD = \ perl.pod \ perldelta.pod \ + perl5004delta.pod \ perldata.pod \ perlsyn.pod \ perlop.pod \ perlre.pod \ perlrun.pod \ perlfunc.pod \ + perlopentut.pod \ perlvar.pod \ perlsub.pod \ perlmod.pod \ *************** *** 30,35 **** --- 32,38 ---- perlform.pod \ perllocale.pod \ perlref.pod \ + perlreftut.pod \ perldsc.pod \ perllol.pod \ perltoot.pod \ *************** *** 37,42 **** --- 40,46 ---- perltie.pod \ perlbot.pod \ perlipc.pod \ + perlthrtut.pod \ perldebug.pod \ perldiag.pod \ perlsec.pod \ *************** *** 51,56 **** --- 55,61 ---- perlxstut.pod \ perlguts.pod \ perlcall.pod \ + perlhist.pod \ perlfaq.pod \ perlfaq1.pod \ perlfaq2.pod \ *************** *** 66,77 **** --- 71,84 ---- MAN = \ perl.man \ perldelta.man \ + perl5004delta.man \ perldata.man \ perlsyn.man \ perlop.man \ perlre.man \ perlrun.man \ perlfunc.man \ + perlopentut.man \ perlvar.man \ perlsub.man \ perlmod.man \ *************** *** 80,85 **** --- 87,93 ---- perlform.man \ perllocale.man \ perlref.man \ + perlreftut.man \ perldsc.man \ perllol.man \ perltoot.man \ *************** *** 87,92 **** --- 95,101 ---- perltie.man \ perlbot.man \ perlipc.man \ + perlthrtut.man \ perldebug.man \ perldiag.man \ perlsec.man \ *************** *** 101,106 **** --- 110,116 ---- perlxstut.man \ perlguts.man \ perlcall.man \ + perlhist.man \ perlfaq.man \ perlfaq1.man \ perlfaq2.man \ *************** *** 116,127 **** --- 126,139 ---- HTML = \ perl.html \ perldelta.html \ + perl5004delta.html \ perldata.html \ perlsyn.html \ perlop.html \ perlre.html \ perlrun.html \ perlfunc.html \ + perlopentut.html \ perlvar.html \ perlsub.html \ perlmod.html \ *************** *** 130,135 **** --- 142,148 ---- perlform.html \ perllocale.html \ perlref.html \ + perlreftut.html \ perldsc.html \ perllol.html \ perltoot.html \ *************** *** 137,142 **** --- 150,156 ---- perltie.html \ perlbot.html \ perlipc.html \ + perlthrtut.html \ perldebug.html \ perldiag.html \ perlsec.html \ *************** *** 151,156 **** --- 165,171 ---- perlxstut.html \ perlguts.html \ perlcall.html \ + perlhist.html \ perlfaq.html \ perlfaq1.html \ perlfaq2.html \ *************** *** 166,177 **** --- 181,194 ---- TEX = \ perl.tex \ perldelta.tex \ + perl5004delta.tex \ perldata.tex \ perlsyn.tex \ perlop.tex \ perlre.tex \ perlrun.tex \ perlfunc.tex \ + perlopentut.tex \ perlvar.tex \ perlsub.tex \ perlmod.tex \ *************** *** 180,185 **** --- 197,204 ---- perlform.tex \ perllocale.tex \ perlref.tex \ + perlreftut.tex \ + perlopentut.tex \ perldsc.tex \ perllol.tex \ perltoot.tex \ *************** *** 187,192 **** --- 206,212 ---- perltie.tex \ perlbot.tex \ perlipc.tex \ + perlthrtut.tex \ perldebug.tex \ perldiag.tex \ perlsec.tex \ *************** *** 201,206 **** --- 221,227 ---- perlxstut.tex \ perlguts.tex \ perlcall.tex \ + perlhist.tex \ perlfaq.tex \ perlfaq1.tex \ perlfaq2.tex \ diff -c 'perl5.005_02/pod/buildtoc' 'perl5.005_03/pod/buildtoc' Index: ./pod/buildtoc *** ./pod/buildtoc Thu Jul 23 23:01:19 1998 --- ./pod/buildtoc Thu Feb 11 18:06:05 1999 *************** *** 6,15 **** @pods = qw( perl perlfaq perlfaq1 perlfaq2 perlfaq3 perlfaq4 perlfaq5 ! perlfaq6 perlfaq7 perlfaq8 perlfaq9 perldelta perldata ! perlsyn perlop perlre perlrun perlfunc perlvar perlsub perlmod perlmodlib perlmodinstall perlform perllocale perlref perldsc ! perllol perltoot perlobj perltie perlbot perlipc perldebug perldiag perlsec perltrap perlport perlstyle perlpod perlbook perlembed perlapio perlxs perlxstut perlguts perlcall perlhist --- 6,15 ---- @pods = qw( perl perlfaq perlfaq1 perlfaq2 perlfaq3 perlfaq4 perlfaq5 ! perlfaq6 perlfaq7 perlfaq8 perlfaq9 perldelta perldata perlopentut ! perlsyn perlop perlre perlreftut perlrun perlfunc perlvar perlsub perlmod perlmodlib perlmodinstall perlform perllocale perlref perldsc ! perllol perltoot perlobj perltie perlthrtut perlbot perlipc perldebug perldiag perlsec perltrap perlport perlstyle perlpod perlbook perlembed perlapio perlxs perlxstut perlguts perlcall perlhist diff -c 'perl5.005_02/pod/perl.pod' 'perl5.005_03/pod/perl.pod' Index: ./pod/perl.pod *** ./pod/perl.pod Thu Jul 23 23:01:19 1998 --- ./pod/perl.pod Sun Mar 28 10:13:04 1999 *************** *** 20,25 **** --- 20,26 ---- perl Perl overview (this section) perldelta Perl changes since previous version + perl5004delta Perl changes in version 5.004 perlfaq Perl frequently asked questions perltoc Perl documentation table of contents *************** *** 29,34 **** --- 30,36 ---- perlre Perl regular expressions perlrun Perl execution and options perlfunc Perl builtin functions + perlopentut Perl open() tutorial perlvar Perl predefined variables perlsub Perl subroutines perlmod Perl modules: how they work *************** *** 38,43 **** --- 40,46 ---- perllocale Perl locale support perlref Perl references + perlreftut Perl references short introduction perldsc Perl data structures intro perllol Perl data structures: lists of lists perltoot Perl OO tutorial *************** *** 45,50 **** --- 48,54 ---- perltie Perl objects hidden behind simple variables perlbot Perl OO tricks and examples perlipc Perl interprocess communication + perlthrtut Perl threads tutorial perldebug Perl debugging perldiag Perl diagnostic messages *************** *** 68,75 **** (If you're intending to read these straight through for the first time, the suggested order will tend to reduce the number of forward references.) ! By default, all of the above manpages are installed in the ! F directory. Extensive additional documentation for Perl modules is available. The default configuration for perl will place this additional documentation --- 72,79 ---- (If you're intending to read these straight through for the first time, the suggested order will tend to reduce the number of forward references.) ! By default, all of the above manpages are installed in the ! F directory. Extensive additional documentation for Perl modules is available. The default configuration for perl will place this additional documentation *************** *** 116,124 **** expression syntax. Unlike most Unix utilities, Perl does not arbitrarily limit the size of your data--if you've got the memory, Perl can slurp in your whole file as a single string. Recursion is of ! unlimited depth. And the tables used by hashes (previously called "associative arrays") grow as necessary to prevent degraded ! performance. Perl uses sophisticated pattern matching techniques to scan large amounts of data very quickly. Although optimized for scanning text, Perl can also deal with binary data, and can make dbm files look like hashes. Setuid Perl scripts are safer than C programs --- 120,128 ---- expression syntax. Unlike most Unix utilities, Perl does not arbitrarily limit the size of your data--if you've got the memory, Perl can slurp in your whole file as a single string. Recursion is of ! unlimited depth. And the tables used by hashes (sometimes called "associative arrays") grow as necessary to prevent degraded ! performance. Perl can use sophisticated pattern matching techniques to scan large amounts of data very quickly. Although optimized for scanning text, Perl can also deal with binary data, and can make dbm files look like hashes. Setuid Perl scripts are safer than C programs *************** *** 239,244 **** --- 243,321 ---- Okay, that's I enough hype. + =head1 AVAILABILITY + + Perl is available for the vast majority of operating system platforms, + including most Unix-like platforms. The following situation is as of + February 1999 and Perl 5.005_03. + + The following platforms are able to build Perl from the standard + source code distribution available at + F + + AIX Linux SCO ODT/OSR + A/UX MachTen Solaris + BeOS MPE/iX SunOS + BSD/OS NetBSD SVR4 + DG/UX NextSTEP Tru64 UNIX 3) + DomainOS OpenBSD Ultrix + DOS DJGPP 1) OpenSTEP UNICOS + DYNIX/ptx OS/2 VMS + FreeBSD OS390 2) VOS + HP-UX PowerMAX Windows 3.1 1) + Hurd QNX Windows 95 1) 4) + IRIX Windows 98 1) 4) + Windows NT 1) 4) + + 1) in DOS mode either the DOS or OS/2 ports can be used + 2) formerly known as MVS + 3) formerly known as Digital UNIX and before that DEC OSF/1 + 4) compilers: Borland, Cygwin32, Mingw32 EGCS/GCC, VC++ + + The following platforms have been known to build Perl from the source + but for the Perl release 5.005_03 we haven't been able to verify them, + either because the hardware/software platforms are rather rare or + because we don't have an active champion on these platforms, or both. + + 3b1 FPS Plan 9 + AmigaOS GENIX PowerUX + ConvexOS Greenhills RISC/os + CX/UX ISC Stellar + DC/OSx MachTen 68k SVR2 + DDE SMES MiNT TI1500 + DOS EMX MPC TitanOS + Dynix NEWS-OS UNICOS/mk + EP/IX Opus Unisys Dynix + ESIX Unixware + + The following platforms are planned to be supported in the standard + source code distribution of the Perl release 5.006 but are not + supported in the Perl release 5.005_03: + + BS2000 + Netware + Rhapsody + VM/ESA + + The following platforms have their own source code distributions and + binaries available via F. + + Perl release + + AS/400 5.003 + MacOS 5.004 + Netware 5.003_07 + Tandem Guardian 5.004 + + The following platforms have only binaries available via + F. + + Perl release + + Acorn RISCOS 5.005_02 + AOS 5.002 + LynxOS 5.004_02 + =head1 ENVIRONMENT See L. *************** *** 247,260 **** Larry Wall >, with the help of oodles of other folks. ! If your Perl success stories and testimonials may be of help to others ! who wish to advocate the use of Perl in their applications, ! or if you wish to simply express your gratitude to Larry and the Perl developers, please write to >. =head1 FILES - "/tmp/perl-e$$" temporary file for -e commands "@INC" locations of perl libraries =head1 SEE ALSO --- 324,336 ---- Larry Wall >, with the help of oodles of other folks. ! If your Perl success stories and testimonials may be of help to others ! who wish to advocate the use of Perl in their applications, ! or if you wish to simply express your gratitude to Larry and the Perl developers, please write to >. =head1 FILES "@INC" locations of perl libraries =head1 SEE ALSO *************** *** 296,304 **** While none of the built-in data types have any arbitrary size limits (apart from memory size), there are still a few arbitrary limits: a ! given variable name may not be longer than 255 characters, and no ! component of your PATH may be longer than 255 if you use B<-S>. A regular ! expression may not compile to more than 32767 bytes internally. You may mail your bug reports (be sure to include full configuration information as output by the myconfig program in the perl source tree, --- 372,381 ---- While none of the built-in data types have any arbitrary size limits (apart from memory size), there are still a few arbitrary limits: a ! given variable name may not be longer than 251 characters. Line numbers ! displayed by diagnostics are internally stored as short integers, ! so they are limited to a maximum of 65535 (higher numbers usually being ! affected by wraparound). You may mail your bug reports (be sure to include full configuration information as output by the myconfig program in the perl source tree, diff -c 'perl5.005_02/pod/perl5004delta.pod' 'perl5.005_03/pod/perl5004delta.pod' Index: ./pod/perl5004delta.pod *** ./pod/perl5004delta.pod Thu Jul 23 23:01:21 1998 --- ./pod/perl5004delta.pod Sat Mar 27 13:40:52 1999 *************** *** 1432,1438 **** =item Stub found while resolving method `%s' overloading `%s' in package `%s' (P) Overloading resolution over @ISA tree may be broken by importing stubs. ! Stubs should never be implicitely created, but explicit calls to C may break this. =item Too late for "B<-T>" option --- 1432,1438 ---- =item Stub found while resolving method `%s' overloading `%s' in package `%s' (P) Overloading resolution over @ISA tree may be broken by importing stubs. ! Stubs should never be implicitly created, but explicit calls to C may break this. =item Too late for "B<-T>" option diff -c 'perl5.005_02/pod/perlcall.pod' 'perl5.005_03/pod/perlcall.pod' Index: ./pod/perlcall.pod *** ./pod/perlcall.pod Sat Aug 1 22:40:14 1998 --- ./pod/perlcall.pod Sat Mar 27 13:47:40 1999 *************** *** 72,78 **** =over 5 ! =item B I takes two parameters, the first, C, is an SV*. This allows you to specify the Perl subroutine to be called either as a --- 72,78 ---- =over 5 ! =item perl_call_sv I takes two parameters, the first, C, is an SV*. This allows you to specify the Perl subroutine to be called either as a *************** *** 80,86 **** subroutine. The section, I, shows how you can make use of I. ! =item B The function, I, is similar to I except it expects its first parameter to be a C char* which identifies the Perl --- 80,86 ---- subroutine. The section, I, shows how you can make use of I. ! =item perl_call_pv The function, I, is similar to I except it expects its first parameter to be a C char* which identifies the Perl *************** *** 88,94 **** subroutine you want to call is in another package, just include the package name in the string, e.g., C<"pkg::fred">. ! =item B The function I is used to call a method from a Perl class. The parameter C corresponds to the name of the method --- 88,94 ---- subroutine you want to call is in another package, just include the package name in the string, e.g., C<"pkg::fred">. ! =item perl_call_method The function I is used to call a method from a Perl class. The parameter C corresponds to the name of the method *************** *** 99,105 **** static and virtual methods and L for an example of using I. ! =item B I calls the Perl subroutine specified by the C string stored in the C parameter. It also takes the usual C --- 99,105 ---- static and virtual methods and L for an example of using I. ! =item perl_call_argv I calls the Perl subroutine specified by the C string stored in the C parameter. It also takes the usual C *************** *** 971,977 **** /* Check the eval first */ if (SvTRUE(ERRSV)) { ! printf ("Uh oh - %s\n", SvPV(ERRSV, PL_na)) ; POPs ; } else --- 971,978 ---- /* Check the eval first */ if (SvTRUE(ERRSV)) { ! STRLEN n_a; ! printf ("Uh oh - %s\n", SvPV(ERRSV, n_a)) ; POPs ; } else *************** *** 1013,1019 **** if (SvTRUE(ERRSV)) { ! printf ("Uh oh - %s\n", SvPV(ERRSV, PL_na)) ; POPs ; } --- 1014,1021 ---- if (SvTRUE(ERRSV)) { ! STRLEN n_a; ! printf ("Uh oh - %s\n", SvPV(ERRSV, n_a)) ; POPs ; } *************** *** 1923,1930 **** =head2 Creating and calling an anonymous subroutine in C As we've already shown, C can be used to invoke an ! anonymous subroutine. However, our example showed how Perl script ! invoking an XSUB to preform this operation. Let's see how it can be done inside our C code: ... --- 1925,1932 ---- =head2 Creating and calling an anonymous subroutine in C As we've already shown, C can be used to invoke an ! anonymous subroutine. However, our example showed a Perl script ! invoking an XSUB to perform this operation. Let's see how it can be done inside our C code: ... diff -c 'perl5.005_02/pod/perldata.pod' 'perl5.005_03/pod/perldata.pod' Index: ./pod/perldata.pod *** ./pod/perldata.pod Thu Jul 23 23:01:22 1998 --- ./pod/perldata.pod Tue Dec 29 08:35:38 1998 *************** *** 253,259 **** single-quoted strings are not (except for "C<\'>" and "C<\\>"). The usual Unix backslash rules apply for making characters such as newline, tab, etc., as well as some more exotic forms. See ! L for a list. Octal or hex representations in string literals (e.g. '0xffff') are not automatically converted to their integer representation. The hex() and --- 253,259 ---- single-quoted strings are not (except for "C<\'>" and "C<\\>"). The usual Unix backslash rules apply for making characters such as newline, tab, etc., as well as some more exotic forms. See ! L for a list. Octal or hex representations in string literals (e.g. '0xffff') are not automatically converted to their integer representation. The hex() and *************** *** 471,477 **** ($map{'red'}, $map{'blue'}, $map{'green'}) = (0x00f, 0x0f0, 0xf00); ! Array assignment in a scalar context returns the number of elements produced by the expression on the right side of the assignment: $x = (($foo,$bar) = (3,2,1)); # set $x to 3, not 2 --- 471,477 ---- ($map{'red'}, $map{'blue'}, $map{'green'}) = (0x00f, 0x0f0, 0xf00); ! List assignment in a scalar context returns the number of elements produced by the expression on the right side of the assignment: $x = (($foo,$bar) = (3,2,1)); # set $x to 3, not 2 diff -c 'perl5.005_02/pod/perldebug.pod' 'perl5.005_03/pod/perldebug.pod' Index: ./pod/perldebug.pod *** ./pod/perldebug.pod Thu Jul 23 23:01:24 1998 --- ./pod/perldebug.pod Sun Mar 28 10:13:08 1999 *************** *** 1109,1115 **** Perl is I frivolous with memory. There is a saying that to estimate memory usage of Perl, assume a reasonable algorithm of ! allocation, and multiply your estimages by 10. This is not absolutely true, but may give you a good grasp of what happens. Say, an integer cannot take less than 20 bytes of memory, a float --- 1109,1115 ---- Perl is I frivolous with memory. There is a saying that to estimate memory usage of Perl, assume a reasonable algorithm of ! allocation, and multiply your estimates by 10. This is not absolutely true, but may give you a good grasp of what happens. Say, an integer cannot take less than 20 bytes of memory, a float *************** *** 1161,1167 **** Total sbrk(): 215040/47:145. Odd ends: pad+heads+chain+tail: 0+2192+0+6144. It is possible to ask for such a statistic at arbitrary moment by ! usind Devel::Peek::mstats() (module Devel::Peek is available on CPAN). Here is the explanation of different parts of the format: --- 1161,1167 ---- Total sbrk(): 215040/47:145. Odd ends: pad+heads+chain+tail: 0+2192+0+6144. It is possible to ask for such a statistic at arbitrary moment by ! using Devel::Peek::mstats() (module Devel::Peek is available on CPAN). Here is the explanation of different parts of the format: *************** *** 1195,1201 **** buckets "above". Say, with the above example the memory footprints are (with current ! algorith) free: 8 16 32 64 128 256 512 1024 2048 4096 8192 4 12 24 48 80 --- 1195,1201 ---- buckets "above". Say, with the above example the memory footprints are (with current ! algorithm) free: 8 16 32 64 128 256 512 1024 2048 4096 8192 4 12 24 48 80 *************** *** 1328,1334 **** It also creates C arrays to keep data for the stash (this is one HV, but it grows, thus there are 4 big allocations: the big chunks are not ! freeed, but are kept as additional arenas for C allocations). =item C<054> --- 1328,1334 ---- It also creates C arrays to keep data for the stash (this is one HV, but it grows, thus there are 4 big allocations: the big chunks are not ! freed, but are kept as additional arenas for C allocations). =item C<054> diff -c 'perl5.005_02/pod/perldelta.pod' 'perl5.005_03/pod/perldelta.pod' Index: ./pod/perldelta.pod *** ./pod/perldelta.pod Sun Aug 2 00:15:07 1998 --- ./pod/perldelta.pod Sat Mar 27 21:55:18 1999 *************** *** 85,91 **** names without the C prefix are supported with macros, but this support may cease in a future release. ! See L. =item Enabling threads has source compatibility issues --- 85,91 ---- names without the C prefix are supported with macros, but this support may cease in a future release. ! See L. =item Enabling threads has source compatibility issues *************** *** 100,106 **** backward compatible with existing perls and provides source compatibility with threading is enabled. ! See L. =back --- 100,106 ---- backward compatible with existing perls and provides source compatibility with threading is enabled. ! See L<"C Source Compatibility"> for more information. =back *************** *** 153,158 **** --- 153,161 ---- See L. + Mach cthreads (NEXTSTEP, OPENSTEP, Rhapsody) are now supported by + the Thread extension. + =head2 Compiler WARNING: The Compiler and related tools are considered B. *************** *** 310,316 **** Perl used to complain if it encountered literal carriage returns in scripts. Now they are mostly treated like whitespace within program text. Inside string literals and here documents, literal carriage returns are ! ignored if they occur paired with newlines, or get interpreted as newlines if they stand alone. This behavior means that literal carriage returns in files should be avoided. You can get the older, more compatible (but less generous) behavior by defining the preprocessor symbol --- 313,319 ---- Perl used to complain if it encountered literal carriage returns in scripts. Now they are mostly treated like whitespace within program text. Inside string literals and here documents, literal carriage returns are ! ignored if they occur paired with linefeeds, or get interpreted as whitespace if they stand alone. This behavior means that literal carriage returns in files should be avoided. You can get the older, more compatible (but less generous) behavior by defining the preprocessor symbol *************** *** 488,493 **** --- 491,520 ---- EE will read in records instead of lines. For more info, see L. + =head2 pack() format 'Z' supported + + The new format type 'Z' is useful for packing and unpacking null-terminated + strings. See L. + + =head1 Significant bug fixes + + =head2 EHANDLEE on empty files + + With C<$/> set to C, slurping an empty file returns a string of + zero length (instead of C, as it used to) for the first time the + HANDLE is read. Subsequent reads yield C. + + This means that the following will append "foo" to an empty file (it used + to not do anything before): + + perl -0777 -pi -e 's/^/foo/' empty_file + + Note that the behavior of: + + perl -pi -e 's/^/foo/' empty_file + + is unchanged (it continues to leave the file empty). + =head1 Supported Platforms Configure has many incremental improvements. Site-wide policy for building *************** *** 500,508 **** DOS is now supported under the DJGPP tools. See L. MPE/iX is now supported. See L. ! MVS (OS390) is now supported. See L. =head2 Changes in existing support --- 527,541 ---- DOS is now supported under the DJGPP tools. See L. + GNU/Hurd is now supported. + + MiNT is now supported. See L. + MPE/iX is now supported. See L. ! MVS (aka OS390, aka Open Edition) is now supported. See L. ! ! Stratus VOS is now supported. See L. =head2 Changes in existing support *************** *** 528,533 **** --- 561,570 ---- A module to pretty print Perl data. See L. + =item Dumpvalue + + A module to dump perl values to the screen. See L. + =item Errno A module to look up errors more conveniently. See L. *************** *** 587,596 **** --- 624,675 ---- =over + =item Benchmark + + You can now run tests for I seconds instead of guessing the right + number of tests to run: e.g. timethese(-5, ...) will run each of the + codes for at least 5 CPU seconds. Zero as the "number of repetitions" + means "for at least 3 CPU seconds". The output format has also + changed. For example: + + use Benchmark;$x=3;timethese(-5,{a=>sub{$x*$x},b=>sub{$x**2}}) + + will now output something like this: + + Benchmark: running a, b, each for at least 5 CPU seconds... + a: 5 wallclock secs ( 5.77 usr + 0.00 sys = 5.77 CPU) @ 200551.91/s (n=1156516) + b: 4 wallclock secs ( 5.00 usr + 0.02 sys = 5.02 CPU) @ 159605.18/s (n=800686) + + New features: "each for at least N CPU seconds...", "wallclock secs", + and the "@ operations/CPU second (n=operations)". + + =item Carp + + Carp has a new function cluck(). cluck() warns, like carp(), but also adds + a stack backtrace to the error message, like confess(). + =item CGI CGI has been updated to version 2.42. + =item Fcntl + + More Fcntl constants added: F_SETLK64, F_SETLKW64, O_LARGEFILE for + large (more than 4G) file access (the 64-bit support is not yet + working, though, so no need to get overly excited), Free/Net/OpenBSD + locking behaviour flags F_FLOCK, F_POSIX, Linux F_SHLCK, and + O_ACCMODE: the mask of O_RDONLY, O_WRONLY, and O_RDWR. + + =item Math::Complex + + The accessor methods Re, Im, arg, abs, rho, and theta, can now also + act as mutators (accessor $z->Re(), mutator $z->Re(3)). + + =item Math::Trig + + A little bit of radial trigonometry (cylindrical and spherical) added: + radial coordinate conversions and the great circle distance. + =item POSIX POSIX now has its own platform-specific hints files. *************** *** 655,660 **** --- 734,745 ---- Some more Perl traps are documented now. See L. + L gives a tutorial on using open(). + + L gives a tutorial on references. + + L gives a tutorial on threads. + =head1 New Diagnostics =over *************** *** 697,702 **** --- 782,791 ---- process $BADREF 1,2,3; $BADREF->process(1,2,3); + =item Can't check filesystem of script "%s" for nosuid + + (P) For some reason you can't check the filesystem of the script for nosuid. + =item Can't coerce array into hash (F) You used an array where a hash was expected, but the array has no *************** *** 776,782 **** (W) You are blessing a reference to a zero length string. This has the effect of blessing the reference into the package main. This is usually not what you want. Consider providing a default target ! package, e.g. bless($ref, $p or 'MyPackage'); =item Illegal hex digit ignored --- 865,871 ---- (W) You are blessing a reference to a zero length string. This has the effect of blessing the reference into the package main. This is usually not what you want. Consider providing a default target ! package, e.g. bless($ref, $p || 'MyPackage'); =item Illegal hex digit ignored *************** *** 860,866 **** is a "default locale" called "C" that Perl can and will use, the script will be run. Before you really fix the problem, however, you will get the same error message each time you run Perl. How to really ! fix the problem can be found in L section B. =back --- 949,955 ---- is a "default locale" called "C" that Perl can and will use, the script will be run. Before you really fix the problem, however, you will get the same error message each time you run Perl. How to really ! fix the problem can be found in L. =back *************** *** 874,890 **** --- 963,1000 ---- (F) The mktemp() routine failed for some reason while trying to process a B<-e> switch. Maybe your /tmp partition is full, or clobbered. + Removed because B<-e> doesn't use temporary files any more. + =item Can't write to temp file for B<-e>: %s (F) The write routine failed for some reason while trying to process a B<-e> switch. Maybe your /tmp partition is full, or clobbered. + Removed because B<-e> doesn't use temporary files any more. + =item Cannot open temporary file (F) The create routine failed for some reason while trying to process a B<-e> switch. Maybe your /tmp partition is full, or clobbered. + Removed because B<-e> doesn't use temporary files any more. + + =item regexp too big + + (F) The current implementation of regular expressions uses shorts as + address offsets within a string. Unfortunately this means that if + the regular expression compiles to longer than 32767, it'll blow up. + Usually when you want a regular expression this big, there is a better + way to do it with multiple statements. See L. + =back + + =head1 Configuration Changes + + You can use "Configure -Uinstallusrbinperl" which causes installperl + to skip installing perl also as /usr/bin/perl. This is useful if you + prefer not to modify /usr/bin for some reason or another but harmful + because many scripts assume to find Perl in /usr/bin/perl. =head1 BUGS diff -c 'perl5.005_02/pod/perldiag.pod' 'perl5.005_03/pod/perldiag.pod' Index: ./pod/perldiag.pod *** ./pod/perldiag.pod Sun Aug 2 01:44:13 1998 --- ./pod/perldiag.pod Sun Mar 28 10:13:12 1999 *************** *** 33,43 **** to try to declare one with a package qualifier on the front. Use local() if you want to localize a package variable. ! =item "my" variable %s masks earlier declaration in same scope ! (W) A lexical variable has been redeclared in the same scope, effectively ! eliminating all access to the previous instance. This is almost always ! a typographical error. Note that the earlier variable will still exist until the end of the scope or until all closure referents to it are destroyed. --- 33,43 ---- to try to declare one with a package qualifier on the front. Use local() if you want to localize a package variable. ! =item "my" variable %s masks earlier declaration in same %s ! (W) A lexical variable has been redeclared in the current scope or statement, ! effectively eliminating all access to the previous instance. This is almost ! always a typographical error. Note that the earlier variable will still exist until the end of the scope or until all closure referents to it are destroyed. *************** *** 143,148 **** --- 143,160 ---- instead of Perl. Check the #! line, or manually feed your script into Perl yourself. + =item (in cleanup) %s + + (W) This prefix usually indicates that a DESTROY() method raised + the indicated exception. Since destructors are usually called by + the system at arbitrary points during execution, and often a vast + number of times, the warning is issued only once for any number + of failures that would otherwise result in the same message being + repeated. + + Failure of user callbacks dispatched using the C flag + could also result in this warning. See L. + =item (Missing semicolon on previous line?) (S) This is an educated guess made in conjunction with the message "%s *************** *** 376,382 **** =item Bareword "%s" not allowed while "strict subs" in use (F) With "strict subs" in use, a bareword is only allowed as a ! subroutine identifier, in curly braces or to the left of the "=>" symbol. Perhaps you need to predeclare a subroutine? =item Bareword "%s" refers to nonexistent package --- 388,394 ---- =item Bareword "%s" not allowed while "strict subs" in use (F) With "strict subs" in use, a bareword is only allowed as a ! subroutine identifier, in curly brackets or to the left of the "=>" symbol. Perhaps you need to predeclare a subroutine? =item Bareword "%s" refers to nonexistent package *************** *** 499,504 **** --- 511,520 ---- (F) You called C, but C is not a directory that you can chdir to, possibly because it doesn't exist. + =item Can't check filesystem of script "%s" for nosuid + + (P) For some reason you can't check the filesystem of the script for nosuid. + =item Can't coerce %s to integer in %s (F) Certain types of SVs, in particular real symbol table entries *************** *** 1002,1007 **** --- 1018,1031 ---- (W) You tried to do a connect on a closed socket. Did you forget to check the return value of your socket() call? See L. + =item Constant is not %s reference + + (F) A constant value (perhaps declared using the C pragma) + is being dereferenced, but it amounts to the wrong type of reference. The + message indicates the type of reference that was expected. This usually + indicates a syntax error in dereferencing the constant value. + See L and L. + =item Constant subroutine %s redefined (S) You redefined a subroutine which had previously been eligible for *************** *** 1162,1168 **** (W) You are blessing a reference to a zero length string. This has the effect of blessing the reference into the package main. This is usually not what you want. Consider providing a default target ! package, e.g. bless($ref, $p or 'MyPackage'); =item Fatal VMS error at %s, line %d --- 1186,1192 ---- (W) You are blessing a reference to a zero length string. This has the effect of blessing the reference into the package main. This is usually not what you want. Consider providing a default target ! package, e.g. bless($ref, $p || 'MyPackage'); =item Fatal VMS error at %s, line %d *************** *** 1258,1264 **** (S) A warning peculiar to VMS. The call to C underlying the C operator returned an invalid UIC. - =item Glob not terminated (F) The lexer saw a left angle bracket in a place where it was expecting --- 1282,1287 ---- *************** *** 1404,1410 **** (S) A warning peculiar to VMS. Perl keeps track of the number of times you've called C and C, to determine whether the current call to C should affect the current ! script or a subprocess (see L). Somehow, this count has become scrambled, so Perl is making a guess and treating this C as a request to terminate the Perl script and execute the specified command. --- 1427,1433 ---- (S) A warning peculiar to VMS. Perl keeps track of the number of times you've called C and C, to determine whether the current call to C should affect the current ! script or a subprocess (see L). Somehow, this count has become scrambled, so Perl is making a guess and treating this C as a request to terminate the Perl script and execute the specified command. *************** *** 1413,1428 **** (P) Something went badly wrong in the regular expression parser. ! =item internal error: glob failed ! (P) Something went wrong with the external program(s) used for C ! and C*.cE>. This may mean that your csh (C shell) is ! broken. If so, you should change all of the csh-related variables in ! config.sh: If you have tcsh, make the variables refer to it as if it ! were csh (e.g. C); otherwise, make them all ! empty (except that C should be C<'undef'>) so that Perl will ! think csh is missing. In either case, after editing config.sh, run ! C<./Configure -S> and rebuild Perl. =item internal urp in regexp at /%s/ --- 1436,1454 ---- (P) Something went badly wrong in the regular expression parser. ! =item glob failed (%s) ! (W) Something went wrong with the external program(s) used for C ! and C*.cE>. Usually, this means that you supplied a C ! pattern that caused the external program to fail and exit with a nonzero ! status. If the message indicates that the abnormal exit resulted in a ! coredump, this may also mean that your csh (C shell) is broken. If so, ! you should change all of the csh-related variables in config.sh: If you ! have tcsh, make the variables refer to it as if it were csh (e.g. ! C); otherwise, make them all empty (except that ! C should be C<'undef'>) so that Perl will think csh is missing. ! In either case, after editing config.sh, run C<./Configure -S> and ! rebuild Perl. =item internal urp in regexp at /%s/ *************** *** 2322,2333 **** server can't find it, basically, more or less. Please see the following for more information: ! http://www.perl.com/perl/faq/idiots-guide.html ! http://www.perl.com/perl/faq/perl-cgi-faq.html ftp://rtfm.mit.edu/pub/usenet/news.answers/www/cgi-faq http://hoohoo.ncsa.uiuc.edu/cgi/interface.html http://www-genome.wi.mit.edu/WWW/faqs/www-security-faq.html =item setegid() not implemented (F) You tried to assign to C<$)>, and your operating system doesn't support --- 2348,2361 ---- server can't find it, basically, more or less. Please see the following for more information: ! http://www.perl.com/CPAN/doc/FAQs/cgi/idiots-guide.html ! http://www.perl.com/CPAN/doc/FAQs/cgi/perl-cgi-faq.html ftp://rtfm.mit.edu/pub/usenet/news.answers/www/cgi-faq http://hoohoo.ncsa.uiuc.edu/cgi/interface.html http://www-genome.wi.mit.edu/WWW/faqs/www-security-faq.html + You should also look at L. + =item setegid() not implemented (F) You tried to assign to C<$)>, and your operating system doesn't support *************** *** 2404,2409 **** --- 2432,2445 ---- there was a failure. You probably wanted to use system() instead, which does return. To suppress this warning, put the exec() in a block by itself. + + =item Strange *+?{} on zero-length expression + + (W) You applied a regular expression quantifier in a place where it + makes no sense, such as on a zero-width assertion. + Try putting the quantifier inside the assertion instead. For example, + the way to match "abc" provided that it is followed by three + repetitions of "xyz" is C, not C. =item Stub found while resolving method `%s' overloading `%s' in package `%s' diff -c 'perl5.005_02/pod/perldsc.pod' 'perl5.005_03/pod/perldsc.pod' Index: ./pod/perldsc.pod *** ./pod/perldsc.pod Thu Jul 23 23:01:27 1998 --- ./pod/perldsc.pod Sat Mar 27 13:48:25 1999 *************** *** 690,696 **** print $rec->{TEXT}; ! print $rec->{LIST}[0]; $last = pop @ { $rec->{SEQUENCE} }; print $rec->{LOOKUP}{"key"}; --- 690,696 ---- print $rec->{TEXT}; ! print $rec->{SEQUENCE}[0]; $last = pop @ { $rec->{SEQUENCE} }; print $rec->{LOOKUP}{"key"}; diff -c 'perl5.005_02/pod/perlembed.pod' 'perl5.005_03/pod/perlembed.pod' Index: ./pod/perlembed.pod *** ./pod/perlembed.pod Sun Aug 2 02:09:43 1998 --- ./pod/perlembed.pod Sat Mar 27 13:48:38 1999 *************** *** 141,147 **** If the B module isn't part of your Perl distribution, you can retrieve it from ! http://www.perl.com/perl/CPAN/modules/by-module/ExtUtils::Embed. (If this documentation came from your Perl distribution, then you're running 5.004 or better and you already have it.) --- 141,147 ---- If the B module isn't part of your Perl distribution, you can retrieve it from ! http://www.perl.com/perl/CPAN/modules/by-module/ExtUtils/. (If this documentation came from your Perl distribution, then you're running 5.004 or better and you already have it.) *************** *** 285,290 **** --- 285,291 ---- main (int argc, char **argv, char **env) { + STRLEN n_a; char *embedding[] = { "", "-e", "0" }; my_perl = perl_alloc(); *************** *** 303,309 **** /** Treat $a as a string **/ perl_eval_pv("$a = 'rekcaH lreP rehtonA tsuJ'; $a = reverse($a);", TRUE); ! printf("a = %s\n", SvPV(perl_get_sv("a", FALSE), PL_na)); perl_destruct(my_perl); perl_free(my_perl); --- 304,310 ---- /** Treat $a as a string **/ perl_eval_pv("$a = 'rekcaH lreP rehtonA tsuJ'; $a = reverse($a);", TRUE); ! printf("a = %s\n", SvPV(perl_get_sv("a", FALSE), n_a)); perl_destruct(my_perl); perl_free(my_perl); *************** *** 325,332 **** from I instead. Example: ... SV *val = perl_eval_pv("reverse 'rekcaH lreP rehtonA tsuJ'", TRUE); ! printf("%s\n", SvPV(val,PL_na)); ... This way, we avoid namespace pollution by not creating global --- 326,334 ---- from I instead. Example: ... + STRLEN n_a; SV *val = perl_eval_pv("reverse 'rekcaH lreP rehtonA tsuJ'", TRUE); ! printf("%s\n", SvPV(val,n_a)); ... This way, we avoid namespace pollution by not creating global *************** *** 371,376 **** --- 373,379 ---- { dSP; SV* retval; + STRLEN n_a; PUSHMARK(SP); perl_eval_sv(sv, G_SCALAR); *************** *** 380,386 **** PUTBACK; if (croak_on_error && SvTRUE(ERRSV)) ! croak(SvPVx(ERRSV, PL_na)); return retval; } --- 383,389 ---- PUTBACK; if (croak_on_error && SvTRUE(ERRSV)) ! croak(SvPVx(ERRSV, n_a)); return retval; } *************** *** 395,403 **** I32 match(SV *string, char *pattern) { SV *command = NEWSV(1099, 0), *retval; sv_setpvf(command, "my $string = '%s'; $string =~ %s", ! SvPV(string,PL_na), pattern); retval = my_perl_eval_sv(command, TRUE); SvREFCNT_dec(command); --- 398,407 ---- I32 match(SV *string, char *pattern) { SV *command = NEWSV(1099, 0), *retval; + STRLEN n_a; sv_setpvf(command, "my $string = '%s'; $string =~ %s", ! SvPV(string,n_a), pattern); retval = my_perl_eval_sv(command, TRUE); SvREFCNT_dec(command); *************** *** 416,424 **** I32 substitute(SV **string, char *pattern) { SV *command = NEWSV(1099, 0), *retval; sv_setpvf(command, "$string = '%s'; ($string =~ %s)", ! SvPV(*string,PL_na), pattern); retval = my_perl_eval_sv(command, TRUE); SvREFCNT_dec(command); --- 420,429 ---- I32 substitute(SV **string, char *pattern) { SV *command = NEWSV(1099, 0), *retval; + STRLEN n_a; sv_setpvf(command, "$string = '%s'; ($string =~ %s)", ! SvPV(*string,n_a), pattern); retval = my_perl_eval_sv(command, TRUE); SvREFCNT_dec(command); *************** *** 439,447 **** { SV *command = NEWSV(1099, 0); I32 num_matches; sv_setpvf(command, "my $string = '%s'; @array = ($string =~ %s)", ! SvPV(string,PL_na), pattern); my_perl_eval_sv(command, TRUE); SvREFCNT_dec(command); --- 444,453 ---- { SV *command = NEWSV(1099, 0); I32 num_matches; + STRLEN n_a; sv_setpvf(command, "my $string = '%s'; @array = ($string =~ %s)", ! SvPV(string,n_a), pattern); my_perl_eval_sv(command, TRUE); SvREFCNT_dec(command); *************** *** 459,464 **** --- 465,471 ---- AV *match_list; I32 num_matches, i; SV *text = NEWSV(1099,0); + STRLEN n_a; perl_construct(my_perl); perl_parse(my_perl, NULL, 3, embedding, NULL); *************** *** 480,486 **** printf("matches: m/(wi..)/g found %d matches...\n", num_matches); for (i = 0; i < num_matches; i++) ! printf("match: %s\n", SvPV(*av_fetch(match_list, i, FALSE),PL_na)); printf("\n"); /** Remove all vowels from text **/ --- 487,493 ---- printf("matches: m/(wi..)/g found %d matches...\n", num_matches); for (i = 0; i < num_matches; i++) ! printf("match: %s\n", SvPV(*av_fetch(match_list, i, FALSE),n_a)); printf("\n"); /** Remove all vowels from text **/ *************** *** 488,494 **** if (num_matches) { printf("substitute: s/[aeiou]//gi...%d substitutions made.\n", num_matches); ! printf("Now text is: %s\n\n", SvPV(text,PL_na)); } /** Attempt a substitution **/ --- 495,501 ---- if (num_matches) { printf("substitute: s/[aeiou]//gi...%d substitutions made.\n", num_matches); ! printf("Now text is: %s\n\n", SvPV(text,n_a)); } /** Attempt a substitution **/ *************** *** 726,731 **** --- 733,739 ---- char *args[] = { "", DO_CLEAN, NULL }; char filename [1024]; int exitstatus = 0; + STRLEN n_a; if((perl = perl_alloc()) == NULL) { fprintf(stderr, "no memory!"); *************** *** 747,753 **** /* check $@ */ if(SvTRUE(ERRSV)) ! fprintf(stderr, "eval error: %s\n", SvPV(ERRSV,PL_na)); } } --- 755,761 ---- /* check $@ */ if(SvTRUE(ERRSV)) ! fprintf(stderr, "eval error: %s\n", SvPV(ERRSV,n_a)); } } *************** *** 955,961 **** examples in this documentation, as significant changes were made to the internal Perl API. However, it is possible to embed ActiveState's Perl runtime. For details, see the Perl for Win32 FAQ at ! http://www.perl.com/perl/faq/win32/Perl_for_Win32_FAQ.html. With the "official" Perl version 5.004 or higher, all the examples within this documentation will compile and run untouched, although --- 963,969 ---- examples in this documentation, as significant changes were made to the internal Perl API. However, it is possible to embed ActiveState's Perl runtime. For details, see the Perl for Win32 FAQ at ! http://www.perl.com/CPAN/doc/FAQs/win32/perlwin32faq.html. With the "official" Perl version 5.004 or higher, all the examples within this documentation will compile and run untouched, although diff -c 'perl5.005_02/pod/perlfaq.pod' 'perl5.005_03/pod/perlfaq.pod' Index: ./pod/perlfaq.pod *** ./pod/perlfaq.pod Wed Aug 5 17:02:28 1998 --- ./pod/perlfaq.pod Sat Mar 27 13:50:10 1999 *************** *** 1,6 **** =head1 NAME ! perlfaq - frequently asked questions about Perl ($Date: 1998/08/05 12:09:32 $) =head1 DESCRIPTION --- 1,6 ---- =head1 NAME ! perlfaq - frequently asked questions about Perl ($Date: 1999/01/08 05:54:52 $) =head1 DESCRIPTION *************** *** 16,57 **** --- 16,697 ---- Very general, high-level information about Perl. + =over 4 + + =item * What is Perl? + + =item * Who supports Perl? Who develops it? Why is it free? + + =item * Which version of Perl should I use? + + =item * What are perl4 and perl5? + + =item * What is perl6? + + =item * How stable is Perl? + + =item * Is Perl difficult to learn? + + =item * How does Perl compare with other languages like Java, Python, REXX, Scheme, or Tcl? + + =item * Can I do [task] in Perl? + + =item * When shouldn't I program in Perl? + + =item * What's the difference between "perl" and "Perl"? + + =item * Is it a Perl program or a Perl script? + + =item * What is a JAPH? + + =item * Where can I get a list of Larry Wall witticisms? + + =item * How can I convince my sysadmin/supervisor/employees to use version (5/5.005/Perl instead of some other language)? + + =back + + =item L: Obtaining and Learning about Perl Where to find source and documentation to Perl, support, and related matters. + =over 4 + + =item * What machines support Perl? Where do I get it? + + =item * How can I get a binary version of Perl? + + =item * I don't have a C compiler on my system. How can I compile perl? + + =item * I copied the Perl binary from one machine to another, but scripts don't work. + + =item * I grabbed the sources and tried to compile but gdbm/dynamic loading/malloc/linking/... failed. How do I make it work? + + =item * What modules and extensions are available for Perl? What is CPAN? What does CPAN/src/... mean? + + =item * Is there an ISO or ANSI certified version of Perl? + + =item * Where can I get information on Perl? + + =item * What are the Perl newsgroups on USENET? Where do I post questions? + + =item * Where should I post source code? + + =item * Perl Books + + =item * Perl in Magazines + + =item * Perl on the Net: FTP and WWW Access + + =item * What mailing lists are there for perl? + + =item * Archives of comp.lang.perl.misc + + =item * Where can I buy a commercial version of Perl? + + =item * Where do I send bug reports? + + =item * What is perl.com? + + =back + + =item L: Programming Tools Programmer tools and programming support. + =over 4 + + =item * How do I do (anything)? + + =item * How can I use Perl interactively? + + =item * Is there a Perl shell? + + =item * How do I debug my Perl programs? + + =item * How do I profile my Perl programs? + + =item * How do I cross-reference my Perl programs? + + =item * Is there a pretty-printer (formatter) for Perl? + + =item * Is there a ctags for Perl? + + =item * Is there an IDE or Windows Perl Editor? + + =item * Where can I get Perl macros for vi? + + =item * Where can I get perl-mode for emacs? + + =item * How can I use curses with Perl? + + =item * How can I use X or Tk with Perl? + + =item * How can I generate simple menus without using CGI or Tk? + + =item * What is undump? + + =item * How can I make my Perl program run faster? + + =item * How can I make my Perl program take less memory? + + =item * Is it unsafe to return a pointer to local data? + + =item * How can I free an array or hash so my program shrinks? + + =item * How can I make my CGI script more efficient? + + =item * How can I hide the source for my Perl program? + + =item * How can I compile my Perl program into byte code or C? + + =item * How can I compile Perl into Java? + + =item * How can I get C<#!perl> to work on [MS-DOS,NT,...]? + + =item * Can I write useful perl programs on the command line? + + =item * Why don't perl one-liners work on my DOS/Mac/VMS system? + + =item * Where can I learn about CGI or Web programming in Perl? + + =item * Where can I learn about object-oriented Perl programming? + + =item * Where can I learn about linking C with Perl? [h2xs, xsubpp] + + =item * I've read perlembed, perlguts, etc., but I can't embed perl in + my C program, what am I doing wrong? + + =item * When I tried to run my script, I got this message. What does it + mean? + + =item * What's MakeMaker? + + =back + + =item L: Data Manipulation Manipulating numbers, dates, strings, arrays, hashes, and miscellaneous data issues. + =over 4 + + =item * Why am I getting long decimals (eg, 19.9499999999999) instead of the numbers I should be getting (eg, 19.95)? + + =item * Why isn't my octal data interpreted correctly? + + =item * Does Perl have a round() function? What about ceil() and floor()? Trig functions? + + =item * How do I convert bits into ints? + + =item * Why doesn't & work the way I want it to? + + =item * How do I multiply matrices? + + =item * How do I perform an operation on a series of integers? + + =item * How can I output Roman numerals? + + =item * Why aren't my random numbers random? + + =item * How do I find the week-of-the-year/day-of-the-year? + + =item * How can I compare two dates and find the difference? + + =item * How can I take a string and turn it into epoch seconds? + + =item * How can I find the Julian Day? + + =item * How do I find yesterday's date? + + =item * Does Perl have a year 2000 problem? Is Perl Y2K compliant? + + =item * How do I validate input? + + =item * How do I unescape a string? + + =item * How do I remove consecutive pairs of characters? + + =item * How do I expand function calls in a string? + + =item * How do I find matching/nesting anything? + + =item * How do I reverse a string? + + =item * How do I expand tabs in a string? + + =item * How do I reformat a paragraph? + + =item * How can I access/change the first N letters of a string? + + =item * How do I change the Nth occurrence of something? + + =item * How can I count the number of occurrences of a substring within a string? + + =item * How do I capitalize all the words on one line? + + =item * How can I split a [character] delimited string except when inside + [character]? (Comma-separated files) + + =item * How do I strip blank space from the beginning/end of a string? + + =item * How do I pad a string with blanks or pad a number with zeroes? + + =item * How do I extract selected columns from a string? + + =item * How do I find the soundex value of a string? + + =item * How can I expand variables in text strings? + + =item * What's wrong with always quoting "$vars"? + + =item * Why don't my EEHERE documents work? + + =item * What is the difference between a list and an array? + + =item * What is the difference between $array[1] and @array[1]? + + =item * How can I extract just the unique elements of an array? + + =item * How can I tell whether a list or array contains a certain element? + + =item * How do I compute the difference of two arrays? How do I compute the intersection of two arrays? + + =item * How do I test whether two arrays or hashes are equal? + + =item * How do I find the first array element for which a condition is true? + + =item * How do I handle linked lists? + + =item * How do I handle circular lists? + + =item * How do I shuffle an array randomly? + + =item * How do I process/modify each element of an array? + + =item * How do I select a random element from an array? + + =item * How do I permute N elements of a list? + + =item * How do I sort an array by (anything)? + + =item * How do I manipulate arrays of bits? + + =item * Why does defined() return true on empty arrays and hashes? + + =item * How do I process an entire hash? + + =item * What happens if I add or remove keys from a hash while iterating over it? + + =item * How do I look up a hash element by value? + + =item * How can I know how many entries are in a hash? + + =item * How do I sort a hash (optionally by value instead of key)? + + =item * How can I always keep my hash sorted? + + =item * What's the difference between "delete" and "undef" with hashes? + + =item * Why don't my tied hashes make the defined/exists distinction? + + =item * How do I reset an each() operation part-way through? + + =item * How can I get the unique keys from two hashes? + + =item * How can I store a multidimensional array in a DBM file? + + =item * How can I make my hash remember the order I put elements into it? + + =item * Why does passing a subroutine an undefined element in a hash create it? + + =item * How can I make the Perl equivalent of a C structure/C++ class/hash or array of hashes or arrays? + + =item * How can I use a reference as a hash key? + + =item * How do I handle binary data correctly? + + =item * How do I determine whether a scalar is a number/whole/integer/float? + + =item * How do I keep persistent data across program calls? + + =item * How do I print out or copy a recursive data structure? + + =item * How do I define methods for every class/object? + + =item * How do I verify a credit card checksum? + + =item * How do I pack arrays of doubles or floats for XS code? + + =back + + =item L: Files and Formats I/O and the "f" issues: filehandles, flushing, formats and footers. + =over 4 + + =item * How do I flush/unbuffer an output filehandle? Why must I do this? + + =item * How do I change one line in a file/delete a line in a file/insert a line in the middle of a file/append to the beginning of a file? + + =item * How do I count the number of lines in a file? + + =item * How do I make a temporary file name? + + =item * How can I manipulate fixed-record-length files? + + =item * How can I make a filehandle local to a subroutine? How do I pass filehandles between subroutines? How do I make an array of filehandles? + + =item * How can I use a filehandle indirectly? + + =item * How can I set up a footer format to be used with write()? + + =item * How can I write() into a string? + + =item * How can I output my numbers with commas added? + + =item * How can I translate tildes (~) in a filename? + + =item * How come when I open a file read-write it wipes it out? + + =item * Why do I sometimes get an "Argument list too long" when I use E*E? + + =item * Is there a leak/bug in glob()? + + =item * How can I open a file with a leading "E" or trailing blanks? + + =item * How can I reliably rename a file? + + =item * How can I lock a file? + + =item * Why can't I just open(FH, ">file.lock")? + + =item * I still don't get locking. I just want to increment the number in the file. How can I do this? + + =item * How do I randomly update a binary file? + + =item * How do I get a file's timestamp in perl? + + =item * How do I set a file's timestamp in perl? + + =item * How do I print to more than one file at once? + + =item * How can I read in a file by paragraphs? + + =item * How can I read a single character from a file? From the keyboard? + + =item * How can I tell whether there's a character waiting on a filehandle? + + =item * How do I do a C in perl? + + =item * How do I dup() a filehandle in Perl? + + =item * How do I close a file descriptor by number? + + =item * Why can't I use "C:\temp\foo" in DOS paths? What doesn't `C:\temp\foo.exe` work? + + =item * Why doesn't glob("*.*") get all the files? + + =item * Why does Perl let me delete read-only files? Why does C<-i> clobber protected files? Isn't this a bug in Perl? + + =item * How do I select a random line from a file? + + =item * Why do I get weird spaces when I print an array of lines? + + =back + + =item L: Regexps Pattern matching and regular expressions. + =over 4 + + =item * How can I hope to use regular expressions without creating illegible and unmaintainable code? + + =item * I'm having trouble matching over more than one line. What's wrong? + + =item * How can I pull out lines between two patterns that are themselves on different lines? + + =item * I put a regular expression into $/ but it didn't work. What's wrong? + + =item * How do I substitute case insensitively on the LHS, but preserving case on the RHS? + + =item * How can I make C<\w> match national character sets? + + =item * How can I match a locale-smart version of C? + + =item * How can I quote a variable to use in a regexp? + + =item * What is C really for? + + =item * How do I use a regular expression to strip C style comments from a file? + + =item * Can I use Perl regular expressions to match balanced text? + + =item * What does it mean that regexps are greedy? How can I get around it? + + =item * How do I process each word on each line? + + =item * How can I print out a word-frequency or line-frequency summary? + + =item * How can I do approximate matching? + + =item * How do I efficiently match many regular expressions at once? + + =item * Why don't word-boundary searches with C<\b> work for me? + + =item * Why does using $&, $`, or $' slow my program down? + + =item * What good is C<\G> in a regular expression? + + =item * Are Perl regexps DFAs or NFAs? Are they POSIX compliant? + + =item * What's wrong with using grep or map in a void context? + + =item * How can I match strings with multibyte characters? + + =item * How do I match a pattern that is supplied by the user? + + =back + + =item L: General Perl Language Issues General Perl language issues that don't clearly fit into any of the other sections. + =over 4 + + =item * Can I get a BNF/yacc/RE for the Perl language? + + =item * What are all these $@%* punctuation signs, and how do I know when to use them? + + =item * Do I always/never have to quote my strings or use semicolons and commas? + + =item * How do I skip some return values? + + =item * How do I temporarily block warnings? + + =item * What's an extension? + + =item * Why do Perl operators have different precedence than C operators? + + =item * How do I declare/create a structure? + + =item * How do I create a module? + + =item * How do I create a class? + + =item * How can I tell if a variable is tainted? + + =item * What's a closure? + + =item * What is variable suicide and how can I prevent it? + + =item * How can I pass/return a {Function, FileHandle, Array, Hash, Method, Regexp}? + + =item * How do I create a static variable? + + =item * What's the difference between dynamic and lexical (static) scoping? Between local() and my()? + + =item * How can I access a dynamic variable while a similarly named lexical is in scope? + + =item * What's the difference between deep and shallow binding? + + =item * Why doesn't "my($foo) = EFILEE;" work right? + + =item * How do I redefine a builtin function, operator, or method? + + =item * What's the difference between calling a function as &foo and foo()? + + =item * How do I create a switch or case statement? + + =item * How can I catch accesses to undefined variables/functions/methods? + + =item * Why can't a method included in this same file be found? + + =item * How can I find out my current package? + + =item * How can I comment out a large block of perl code? + + =item * How do I clear a package? + + =back + + =item L: System Interaction Interprocess communication (IPC), control over the user-interface (keyboard, screen and pointing devices). + =over 4 + + =item * How do I find out which operating system I'm running under? + + =item * How come exec() doesn't return? + + =item * How do I do fancy stuff with the keyboard/screen/mouse? + + =item * How do I print something out in color? + + =item * How do I read just one key without waiting for a return key? + + =item * How do I check whether input is ready on the keyboard? + + =item * How do I clear the screen? + + =item * How do I get the screen size? + + =item * How do I ask the user for a password? + + =item * How do I read and write the serial port? + + =item * How do I decode encrypted password files? + + =item * How do I start a process in the background? + + =item * How do I trap control characters/signals? + + =item * How do I modify the shadow password file on a Unix system? + + =item * How do I set the time and date? + + =item * How can I sleep() or alarm() for under a second? + + =item * How can I measure time under a second? + + =item * How can I do an atexit() or setjmp()/longjmp()? (Exception handling) + + =item * Why doesn't my sockets program work under System V (Solaris)? What does the error message "Protocol not supported" mean? + + =item * How can I call my system's unique C functions from Perl? + + =item * Where do I get the include files to do ioctl() or syscall()? + + =item * Why do setuid perl scripts complain about kernel problems? + + =item * How can I open a pipe both to and from a command? + + =item * Why can't I get the output of a command with system()? + + =item * How can I capture STDERR from an external command? + + =item * Why doesn't open() return an error when a pipe open fails? + + =item * What's wrong with using backticks in a void context? + + =item * How can I call backticks without shell processing? + + =item * Why can't my script read from STDIN after I gave it EOF (^D on Unix, ^Z on MS-DOS)? + + =item * How can I convert my shell script to perl? + + =item * Can I use perl to run a telnet or ftp session? + + =item * How can I write expect in Perl? + + =item * Is there a way to hide perl's command line from programs such as "ps"? + + =item * I {changed directory, modified my environment} in a perl script. How come the change disappeared when I exited the script? How do I get my changes to be visible? + + =item * How do I close a process's filehandle without waiting for it to complete? + + =item * How do I fork a daemon process? + + =item * How do I make my program run with sh and csh? + + =item * How do I find out if I'm running interactively or not? + + =item * How do I timeout a slow event? + + =item * How do I set CPU limits? + + =item * How do I avoid zombies on a Unix system? + + =item * How do I use an SQL database? + + =item * How do I make a system() exit on control-C? + + =item * How do I open a file without blocking? + + =item * How do I install a CPAN module? + + =item * What's the difference between require and use? + + =item * How do I keep my own module/library directory? + + =item * How do I add the directory my program lives in to the module/library search path? + + =item * How do I add a directory to my include path at runtime? + + =item * What is socket.ph and where do I get it? + + =back + + =item L: Networking Networking, the Internet, and a few on the web. + =over 4 + + =item * My CGI script runs from the command line but not the browser. (500 Server Error) + + =item * How can I get better error messages from a CGI program? + + =item * How do I remove HTML from a string? + + =item * How do I extract URLs? + + =item * How do I download a file from the user's machine? How do I open a file on another machine? + + =item * How do I make a pop-up menu in HTML? + + =item * How do I fetch an HTML file? + + =item * How do I automate an HTML form submission? + + =item * How do I decode or create those %-encodings on the web? + + =item * How do I redirect to another page? + + =item * How do I put a password on my web pages? + + =item * How do I edit my .htpasswd and .htgroup files with Perl? + + =item * How do I make sure users can't enter values into a form that cause my CGI script to do bad things? + + =item * How do I parse a mail header? + + =item * How do I decode a CGI form? + + =item * How do I check a valid mail address? + + =item * How do I decode a MIME/BASE64 string? + + =item * How do I return the user's mail address? + + =item * How do I send mail? + + =item * How do I read mail? + + =item * How do I find out my hostname/domainname/IP address? + + =item * How do I fetch a news article or the active newsgroups? + + =item * How do I fetch/put an FTP file? + + =item * How can I do RPC in Perl? + + =back + + =back =head2 Where to get this document *************** *** 66,71 **** --- 706,712 ---- You may mail corrections, additions, and suggestions to perlfaq-suggestions@perl.com . This alias should not be used to I FAQs. It's for fixing the current FAQ. + Send questions to the comp.lang.perl.misc newsgroup. =head2 What will happen if you mail your Perl programming problems to the authors *************** *** 88,94 **** =head1 Author and Copyright Information ! Copyright (c) 1997, 1998 Tom Christiansen and Nathan Torkington. All rights reserved. =head2 Bundled Distributions --- 729,735 ---- =head1 Author and Copyright Information ! Copyright (c) 1997-1999 Tom Christiansen and Nathan Torkington. All rights reserved. =head2 Bundled Distributions *************** *** 117,122 **** --- 758,768 ---- =over 4 + =item 7/January/99 + + Small touchups here and there. Added all questions in this + document as a sort of table of contents. + =item 22/June/98 Significant changes throughout in preparation for the 5.005 *************** *** 170,172 **** --- 816,819 ---- have been no changes since its initial release. =back + diff -c 'perl5.005_02/pod/perlfaq1.pod' 'perl5.005_03/pod/perlfaq1.pod' Index: ./pod/perlfaq1.pod *** ./pod/perlfaq1.pod Wed Aug 5 17:02:28 1998 --- ./pod/perlfaq1.pod Sat Mar 27 13:51:03 1999 *************** *** 1,6 **** =head1 NAME ! perlfaq1 - General Questions About Perl ($Revision: 1.15 $, $Date: 1998/08/05 11:52:24 $) =head1 DESCRIPTION --- 1,6 ---- =head1 NAME ! perlfaq1 - General Questions About Perl ($Revision: 1.20 $, $Date: 1999/01/08 04:22:09 $) =head1 DESCRIPTION *************** *** 32,43 **** distribution for more details. See L (new as of 5.005) for Perl's milestone releases. ! In particular, the core development team (known as the Perl ! Porters) are a rag-tag band of highly altruistic individuals ! committed to producing better software for free than you ! could hope to purchase for money. You may snoop on pending ! developments via news://genetics.upenn.edu/perl.porters-gw/ and ! http://www.frii.com/~gnat/perl/porters/summary.html. While the GNU project includes Perl in its distributions, there's no such thing as "GNU Perl". Perl is not produced nor maintained by the --- 32,45 ---- distribution for more details. See L (new as of 5.005) for Perl's milestone releases. ! In particular, the core development team (known as the Perl Porters) ! are a rag-tag band of highly altruistic individuals committed ! to producing better software for free than you could hope to ! purchase for money. You may snoop on pending developments via ! nntp://news.perl.com/perl.porters-gw/ and the Deja News archive at ! http://www.dejanews.com/ using the perl.porters-gw newsgroup, or you can ! subscribe to the mailing list by sending perl5-porters-request@perl.org ! a subscription request. While the GNU project includes Perl in its distributions, there's no such thing as "GNU Perl". Perl is not produced nor maintained by the *************** *** 51,62 **** =head2 Which version of Perl should I use? You should definitely use version 5. Version 4 is old, limited, and ! no longer maintained; its last patch (4.036) was in 1992. The most ! recent production release is 5.005_01. Further references to the Perl ! language in this document refer to this production release unless ! otherwise specified. There may be one or more official bug fixes for ! 5.005_01 by the time you read this, and also perhaps some experimental ! versions on the way to the next release. =head2 What are perl4 and perl5? --- 53,68 ---- =head2 Which version of Perl should I use? You should definitely use version 5. Version 4 is old, limited, and ! no longer maintained; its last patch (4.036) was in 1992, long ago and ! far away. Sure, it's stable, but so is anything that's dead; in fact, ! perl4 had been called a dead, flea-bitten camel carcass. The most recent ! production release is 5.005_02 (although 5.004_04 is still supported). ! The most cutting-edge development release is 5.005_54. Further references ! to the Perl language in this document refer to the production release ! unless otherwise specified. There may be one or more official bug ! fixes for 5.005_02 by the time you read this, and also perhaps some ! experimental versions on the way to the next release. All releases ! prior to 5.004 were subject to buffer overruns, a grave security issue. =head2 What are perl4 and perl5? *************** *** 68,78 **** while perl4 was the fourth major release (March 1991). There was also a perl1 (in January 1988), a perl2 (June 1988), and a perl3 (October 1989). ! The 5.0 release is, essentially, a complete rewrite of the perl source ! code from the ground up. It has been modularized, object-oriented, ! tweaked, trimmed, and optimized until it almost doesn't look like the ! old code. However, the interface is mostly the same, and compatibility ! with previous releases is very high. To avoid the "what language is perl5?" confusion, some people prefer to simply use "perl" to refer to the latest version of perl and avoid using --- 74,85 ---- while perl4 was the fourth major release (March 1991). There was also a perl1 (in January 1988), a perl2 (June 1988), and a perl3 (October 1989). ! The 5.0 release is, essentially, a ground-up rewrite of the original ! perl source code from releases 1 through 4. It has been modularized, ! object-oriented, tweaked, trimmed, and optimized until it almost doesn't ! look like the old code. However, the interface is mostly the same, and ! compatibility with previous releases is very high. See L. To avoid the "what language is perl5?" confusion, some people prefer to simply use "perl" to refer to the latest version of perl and avoid using *************** *** 80,85 **** --- 87,113 ---- See L for a history of Perl revisions. + =head2 What is perl6? + + Perl6 is a semi-jocular reference to the Topaz project. Headed by Chip + Salzenberg, Topaz is yet-another ground-up rewrite of the current release + of Perl, one whose major goal is to create a more maintainable core than + found in release 5. Written in nominally portable C++, Topaz hopes to + maintain 100% source-compatibility with previous releases of Perl but to + run significantly faster and smaller. The Topaz team hopes to provide + an XS compatibility interface to allow most XS modules to work unchanged, + albeit perhaps without the efficiency that the new interface uowld allow. + New features in Topaz are as yet undetermined, and will be addressed + once compatibility and performance goals are met. + + If you are a hard-working C++ wizard with a firm command of Perl's + internals, and you would like to work on the project, send a request to + perl6-porters-request@perl.org to subscribe to the Topaz mailing list. + + There is no ETA for Topaz. It is expected to be several years before it + achieves enough robustness, compatibility, portability, and performance + to replace perl5 for ordinary use by mere mortals. + =head2 How stable is Perl? Production releases, which incorporate bug fixes and new functionality, *************** *** 106,123 **** learning curve is therefore shallow (easy to learn) and long (there's a whole lot you can do if you really want). ! Finally, Perl is (frequently) an interpreted language. This means ! that you can write your programs and test them without an intermediate ! compilation step, allowing you to experiment and test/debug quickly ! and easily. This ease of experimentation flattens the learning curve ! even more. Things that make Perl easier to learn: Unix experience, almost any kind of programming experience, an understanding of regular expressions, and the ability to understand other people's code. If there's something you need to do, then it's probably already been done, and a working example is usually available for free. Don't forget the new perl modules, either. ! They're discussed in Part 3 of this FAQ, along with the CPAN, which is discussed in Part 2. =head2 How does Perl compare with other languages like Java, Python, REXX, Scheme, or Tcl? --- 134,151 ---- learning curve is therefore shallow (easy to learn) and long (there's a whole lot you can do if you really want). ! Finally, because Perl is frequently (but not always, and certainly not by ! definition) an interpreted language, you can write your programs and test ! them without an intermediate compilation step, allowing you to experiment ! and test/debug quickly and easily. This ease of experimentation flattens ! the learning curve even more. Things that make Perl easier to learn: Unix experience, almost any kind of programming experience, an understanding of regular expressions, and the ability to understand other people's code. If there's something you need to do, then it's probably already been done, and a working example is usually available for free. Don't forget the new perl modules, either. ! They're discussed in Part 3 of this FAQ, along with CPAN, which is discussed in Part 2. =head2 How does Perl compare with other languages like Java, Python, REXX, Scheme, or Tcl? *************** *** 130,151 **** set of tasks. These languages have their own newsgroups in which you can learn about (but hopefully not argue about) them. =head2 Can I do [task] in Perl? ! Perl is flexible and extensible enough for you to use on almost any ! task, from one-line file-processing tasks to complex systems. For ! many people, Perl serves as a great replacement for shell scripting. ! For others, it serves as a convenient, high-level replacement for most ! of what they'd program in low-level languages like C or C++. It's ! ultimately up to you (and possibly your management ...) which tasks ! you'll use Perl for and which you won't. If you have a library that provides an API, you can make any component of it available as just another Perl function or variable using a Perl extension written in C or C++ and dynamically linked into your main perl interpreter. You can also go the other direction, and write your main program in C or C++, and then link in some Perl code on the fly, ! to create a powerful application. That said, there will always be small, focused, special-purpose languages dedicated to a specific problem domain that are simply more --- 158,182 ---- set of tasks. These languages have their own newsgroups in which you can learn about (but hopefully not argue about) them. + Some comparison documents can be found at http://language.perl.com/versus/ + if you really can't stop yourself. + =head2 Can I do [task] in Perl? ! Perl is flexible and extensible enough for you to use on virtually any ! task, from one-line file-processing tasks to large, elaborate systems. ! For many people, Perl serves as a great replacement for shell scripting. ! For others, it serves as a convenient, high-level replacement for most of ! what they'd program in low-level languages like C or C++. It's ultimately ! up to you (and possibly your management) which tasks you'll use Perl ! for and which you won't. If you have a library that provides an API, you can make any component of it available as just another Perl function or variable using a Perl extension written in C or C++ and dynamically linked into your main perl interpreter. You can also go the other direction, and write your main program in C or C++, and then link in some Perl code on the fly, ! to create a powerful application. See L. That said, there will always be small, focused, special-purpose languages dedicated to a specific problem domain that are simply more *************** *** 164,180 **** For various reasons, Perl is probably not well-suited for real-time embedded systems, low-level operating systems development work like ! device drivers or context-switching code, complex multithreaded shared-memory applications, or extremely large applications. You'll notice that perl is not itself written in Perl. ! The new native-code compiler for Perl may reduce the limitations given ! in the previous statement to some degree, but understand that Perl ! remains fundamentally a dynamically typed language, and not a ! statically typed one. You certainly won't be chastized if you don't ! trust nuclear-plant or brain-surgery monitoring code to it. And ! Larry will sleep easier, too -- Wall Street programs not ! withstanding. :-) =head2 What's the difference between "perl" and "Perl"? --- 195,210 ---- For various reasons, Perl is probably not well-suited for real-time embedded systems, low-level operating systems development work like ! device drivers or context-switching code, complex multi-threaded shared-memory applications, or extremely large applications. You'll notice that perl is not itself written in Perl. ! The new, native-code compiler for Perl may eventually reduce the ! limitations given in the previous statement to some degree, but understand ! that Perl remains fundamentally a dynamically typed language, not ! a statically typed one. You certainly won't be chastised if you don't ! trust nuclear-plant or brain-surgery monitoring code to it. And Larry ! will sleep easier, too -- Wall Street programs not withstanding. :-) =head2 What's the difference between "perl" and "Perl"? *************** *** 183,215 **** i.e. the current interpreter. Hence Tom's quip that "Nothing but perl can parse Perl." You may or may not choose to follow this usage. For example, parallelism means "awk and perl" and "Python and Perl" look ! ok, while "awk and Perl" and "Python and perl" do not. =head2 Is it a Perl program or a Perl script? ! It doesn't matter. ! In "standard terminology" a I has been compiled to physical ! machine code once, and can then be be run multiple times, whereas a ! I