This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Part Integrate mainline
authorNick Ing-Simmons <nik@tiuk.ti.com>
Tue, 11 Sep 2001 06:23:39 +0000 (06:23 +0000)
committerNick Ing-Simmons <nik@tiuk.ti.com>
Tue, 11 Sep 2001 06:23:39 +0000 (06:23 +0000)
p4raw-id: //depot/perlio@11995

257 files changed:
AUTHORS
Changes
Configure
MANIFEST
Makefile.micro
NetWare/config.wc
NetWare/netware.h
NetWare/nw5.c
NetWare/nw5thread.h
Porting/Glossary
Porting/config.sh
Porting/config_H
Porting/pumpkin.pod
README.vms
config_h.SH
configure.com
cop.h
doop.c
embed.h
embed.pl
ext/Cwd/Cwd.xs
ext/Cwd/Makefile.PL
ext/Cwd/t/cwd.t [moved from ext/Cwd/Cwd.t with 100% similarity]
ext/Cwd/t/taint.t [new file with mode: 0644]
ext/Data/Dumper/Changes
ext/Data/Dumper/Dumper.xs
ext/Data/Dumper/t/dumper.t
ext/Digest/MD5/Changes
ext/Digest/MD5/MD5.pm
ext/Digest/MD5/MD5.xs
ext/Digest/MD5/t/files.t
ext/Encode/Encode.pm
ext/Encode/Encode/isoir-197.enc [new file with mode: 0644]
ext/Encode/Encode/macSami.enc [new file with mode: 0644]
ext/Fcntl/t/fcntl.t [moved from ext/Fcntl/Fcntl.t with 100% similarity]
ext/Fcntl/t/syslfs.t [moved from ext/Fcntl/syslfs.t with 100% similarity]
ext/IO/lib/IO/Socket/INET.pm
ext/List/Util/ChangeLog
ext/List/Util/README
ext/List/Util/Util.xs
ext/List/Util/lib/List/Util.pm
ext/List/Util/lib/Scalar/Util.pm
ext/List/Util/t/blessed.t
ext/List/Util/t/dualvar.t
ext/List/Util/t/first.t
ext/List/Util/t/max.t
ext/List/Util/t/maxstr.t
ext/List/Util/t/min.t
ext/List/Util/t/minstr.t
ext/List/Util/t/readonly.t
ext/List/Util/t/reduce.t
ext/List/Util/t/reftype.t
ext/List/Util/t/shuffle.t [new file with mode: 0755]
ext/List/Util/t/sum.t
ext/List/Util/t/tainted.t
ext/List/Util/t/weak.t
ext/POSIX/sigaction.t
ext/POSIX/t/posix.t [moved from ext/POSIX/POSIX.t with 100% similarity, mode: 0644]
ext/POSIX/t/sigaction.t [new file with mode: 0644]
ext/Socket/Socket.pm
ext/Socket/Socket.t
ext/Socket/Socket.xs
ext/Storable/ChangeLog
ext/Storable/Storable.pm
ext/Storable/Storable.xs
ext/Time/HiRes/HiRes.t
global.sym
gv.c
intrpvar.h
lib/Attribute/Handlers.pm
lib/Attribute/Handlers/Changes
lib/Attribute/Handlers/README
lib/Attribute/Handlers/demo/demo.pl
lib/Attribute/Handlers/demo/demo_cycle.pl
lib/Attribute/Handlers/t/multi.t [moved from lib/Attribute/Handlers/test.pl with 76% similarity]
lib/CGI/Carp.pm
lib/CGI/t/apache.t [new file with mode: 0644]
lib/CGI/t/carp.t [new file with mode: 0644]
lib/CGI/t/cookie.t [new file with mode: 0644]
lib/CGI/t/fast.t [new file with mode: 0644]
lib/CGI/t/form.t
lib/CGI/t/push.t [new file with mode: 0644]
lib/CGI/t/switch.t [new file with mode: 0644]
lib/Class/Struct.pm
lib/Class/Struct.t
lib/Cwd.pm
lib/English.pm
lib/English.t
lib/Env/t/array.t [moved from lib/Env/array.t with 100% similarity, mode: 0644]
lib/Env/t/env.t [moved from lib/Env/env.t with 100% similarity, mode: 0644]
lib/Exporter.t
lib/ExtUtils/Command.pm
lib/ExtUtils/Command.t [new file with mode: 0644]
lib/ExtUtils/MM_Unix.pm
lib/ExtUtils/MakeMaker.pm
lib/ExtUtils/Manifest.pm
lib/ExtUtils/Manifest.t [new file with mode: 0644]
lib/ExtUtils/testlib.t [new file with mode: 0644]
lib/File/Find.pm
lib/File/Find/t/find.t [moved from lib/File/Find/find.t with 100% similarity, mode: 0644]
lib/File/Find/t/taint.t [new file with mode: 0644]
lib/File/Find/taint.t
lib/Filter/Simple.pm
lib/Filter/Simple/Changes [new file with mode: 0644]
lib/Filter/Simple/README [new file with mode: 0644]
lib/Filter/Simple/t/filter.t [moved from lib/Filter/Simple/test.pl with 81% similarity]
lib/Math/BigFloat.pm
lib/Math/BigInt.pm
lib/Math/BigInt/Calc.pm
lib/Math/BigInt/t/bigfltpm.t
lib/Math/BigInt/t/bigintc.t
lib/Math/BigInt/t/bigintpm.t
lib/NEXT.pm
lib/NEXT/Changes [new file with mode: 0644]
lib/NEXT/README [new file with mode: 0644]
lib/NEXT/test.pl
lib/Switch.pm
lib/Switch/Changes
lib/Switch/README
lib/Switch/t/given.t [moved from lib/Switch/t/given_when.t with 100% similarity, mode: 0755]
lib/Switch/t/nested.t [new file with mode: 0755]
lib/Switch/t/switch.t [moved from lib/Switch/t/switch_case.t with 100% similarity, mode: 0755]
lib/Term/Complete.t [new file with mode: 0644]
lib/Test/Harness.pm
lib/Test/Harness.t [deleted file]
lib/Test/Harness/Changes [new file with mode: 0644]
lib/Test/Harness/t/base.t [new file with mode: 0644]
lib/Test/Harness/t/ok.t [new file with mode: 0644]
lib/Test/Harness/t/test-harness.t [new file with mode: 0644]
lib/Test/More.pm
lib/Test/More/Changes [deleted file]
lib/Test/More/t/plan_is_noplan.t [deleted file]
lib/Test/Simple.pm
lib/Test/Simple/Changes
lib/Test/Simple/t/More.t [moved from lib/Test/More/t/More.t with 84% similarity]
lib/Test/Simple/t/exit.t
lib/Test/Simple/t/extra.t
lib/Test/Simple/t/fail-like.t [moved from lib/Test/More/t/fail-like.t with 86% similarity]
lib/Test/Simple/t/fail-more.t [moved from lib/Test/More/t/fail.t with 61% similarity]
lib/Test/Simple/t/fail.t
lib/Test/Simple/t/missing.t
lib/Test/Simple/t/no_plan.t
lib/Test/Simple/t/plan_is_noplan.t
lib/Test/Simple/t/skip.t [new file with mode: 0644]
lib/Test/Simple/t/skipall.t [moved from lib/Test/More/t/skipall.t with 74% similarity]
lib/Test/Simple/t/todo.t [new file with mode: 0644]
lib/Test/Simple/t/undef.t [new file with mode: 0644]
lib/Test/Simple/t/useing.t [new file with mode: 0644]
lib/Test/Tutorial.pod [new file with mode: 0644]
lib/Test/Utils.pm [new file with mode: 0644]
lib/Text/Balanced.pm
lib/Text/Balanced.pod [deleted file]
lib/Text/Balanced/Changes [new file with mode: 0644]
lib/Text/Balanced/README [new file with mode: 0755]
lib/Text/Balanced/t/extbrk.t [moved from lib/Text/Balanced/t/xbrak.t with 97% similarity]
lib/Text/Balanced/t/extcbk.t [moved from lib/Text/Balanced/t/xcode.t with 93% similarity]
lib/Text/Balanced/t/extdel.t [moved from lib/Text/Balanced/t/xdeli.t with 97% similarity]
lib/Text/Balanced/t/extmul.t [moved from lib/Text/Balanced/t/xmult.t with 99% similarity]
lib/Text/Balanced/t/extqlk.t [moved from lib/Text/Balanced/t/xquot.t with 97% similarity]
lib/Text/Balanced/t/exttag.t [moved from lib/Text/Balanced/t/xtagg.t with 98% similarity]
lib/Text/Balanced/t/extvar.t [moved from lib/Text/Balanced/t/xvari.t with 97% similarity]
lib/Text/Balanced/t/gentag.t [moved from lib/Text/Balanced/t/genxt.t with 97% similarity]
lib/Text/Soundex.pm
lib/Unicode/UCD.pm
lib/blib.pm
lib/blib.t [new file with mode: 0644]
lib/integer.t [new file with mode: 0644]
lib/less.t [new file with mode: 0644]
lib/warnings.t
makedef.pl
mg.c
numeric.c
objXSUB.h [deleted file]
op.c
op.h
opcode.pl
patchlevel.h
perl.c
perl.h
pod/buildtoc.PL
pod/perl.pod
pod/perl572delta.pod
pod/perlapi.pod
pod/perlclib.pod
pod/perldata.pod
pod/perldiag.pod
pod/perlembed.pod
pod/perlfaq1.pod
pod/perlfaq4.pod
pod/perlfunc.pod
pod/perlguts.pod
pod/perlhack.pod
pod/perlipc.pod
pod/perlothrtut.pod [new file with mode: 0644]
pod/perlport.pod
pod/perlsec.pod
pod/perlsub.pod
pod/perlthrtut.pod
pod/perltoc.pod
pod/perlunicode.pod
pod/perlvar.pod
pp.c
pp_ctl.c
pp_pack.c
pp_sys.c
proto.h
regcomp.c
regexec.c
sharedsv.c
sv.c
sv.h
t/TEST
t/comp/proto.t
t/lib/1_compile.t
t/lib/FilterTest.pm [moved from t/lib/MyFilter.pm with 89% similarity]
t/lib/Test/Simple/Catch.pm
t/lib/Test/Simple/Catch/More.pm [moved from t/lib/Test/More/Catch.pm with 64% similarity]
t/lib/Test/Simple/sample_tests/death.plx
t/lib/Test/Simple/sample_tests/death_in_eval.plx
t/lib/Test/Simple/sample_tests/extras.plx
t/lib/Test/Simple/sample_tests/five_fail.plx
t/lib/Test/Simple/sample_tests/last_minute_death.plx
t/lib/Test/Simple/sample_tests/one_fail.plx
t/lib/Test/Simple/sample_tests/success.plx
t/lib/Test/Simple/sample_tests/too_few.plx
t/lib/Test/Simple/sample_tests/two_fail.plx
t/lib/sample-tests/header_at_end_fail [new file with mode: 0644]
t/lib/sample-tests/skip_no_msg [new file with mode: 0644]
t/lib/sample-tests/todo_inline [new file with mode: 0644]
t/lib/warnings/regcomp
t/op/64bitint.t
t/op/crypt.t [new file with mode: 0644]
t/op/inccode.t
t/op/lfs.t
t/op/oct.t
t/op/override.t
t/op/pack.t
t/op/pat.t
t/op/qq.t [new file with mode: 0644]
t/op/rand.t
t/op/srand.t [new file with mode: 0644]
t/op/time.t
t/op/utf8decode.t
t/op/ver.t
t/run/kill_perl.t
taint.c
toke.c
uconfig.h
utf8.h
util.c
win32/Makefile
win32/makefile.mk
wince/Makefile.ce
wince/makeico.pl [new file with mode: 0644]
wince/perl.ico [deleted file]
x2p/Makefile.SH
x2p/cflags.SH

diff --git a/AUTHORS b/AUTHORS
index f61e367..5c9b4e8 100644 (file)
--- a/AUTHORS
+++ b/AUTHORS
@@ -47,6 +47,7 @@ Anthony David                  <adavid@netinfo.com.au>
 Anton Berezin                  <tobez@tobez.org>
 Art Green                      <Art_Green@mercmarine.com>
 Artur Bergman                  <artur@contiller.se>
+Autrijus Tang                  <autrijus@autrijus.org>
 Barrie Slaymaker               <barries@slaysys.com>
 Barry Friedman
 Ben Tilly                      <ben_tilly@hotmail.com>
@@ -99,6 +100,7 @@ Chris Wick                     <cwick@lmc.com>
 Christian Kirsch               <ck@held.mind.de>
 Christopher Chan-Nui           <channui@austin.ibm.com>
 Christopher Davis              <ckd@loiosh.kei.com>
+chromatic                      <chromatic@rmci.net>
 Chuck D. Phillips              <cdp@hpescdp.fc.hp.com>
 Chuck Phillips                 <cdp@fc.hp.com>
 Chunhui Teng                   <cteng@nortel.ca>
@@ -121,6 +123,7 @@ Daniel Chetlin                 <daniel@chetlin.com>
 Daniel Grisinger               <dgris@dimensional.com>
 Daniel Lieberman               <daniel@bitpusher.com>
 Daniel Muiño                   <dmuino@afip.gov.ar>
+Daniel P. Berrange             <dan@berrange.com>
 Daniel S. Lewart               <d-lewart@uiuc.edu>
 Daniel Yacob                   <dmulholl@cs.indiana.edu>
 Danny R. Faught                <faught@mailhost.rsn.hp.com>
@@ -136,6 +139,7 @@ David Billinghurst             <David.Billinghurst@riotinto.com.au>
 David Campbell
 David Couture
 David Denholm                  <denholm@conmat.phys.soton.ac.uk>
+David D. Kilzer                <ddkilzer@lubricants-oil.com>
 David Dyck                     <dcd@tc.fluke.com>
 David F. Haertig               <dfh@dwroll.lucent.com>
 David Filo
@@ -239,7 +243,7 @@ Hugo van der Sanden            <hv@crypt0.demon.co.uk>
 Hunter Kelly                   <retnuh@zule.pixar.com>
 Huw Rogers                     <count0@gremlin.straylight.co.jp>
 Ian Maloney                    <ian.malonet@ubs.com>
-Ian Phillipps                  <ian@dial.pipex.com>
+Ian Phillipps                  <Ian.Phillipps@iname.com>
 Ignasi Roca                    <ignasi.roca@fujitsu.siemens.es>
 Ilmari Karonen                 <iltzu@sci.fi>
 Ilya Sandler                   <Ilya.Sandler@etak.com>
@@ -254,6 +258,8 @@ JT McDuffie                    <jt@kpc.com>
 Jack Shirazi                   <JackS@GemStone.com>
 Jacqui Caren                   <Jacqui.Caren@ig.co.uk>
 Jake Hamby                     <jehamby@lightside.com>
+James                          <james@rf.net>
+James A. Duncan                <jduncan@fotango.com>
 James FitzGibbon               <james@ican.net>
 Jamshid Afshar
 Jan D.                         <jan.djarv@mbox200.swipnet.se>
@@ -308,6 +314,7 @@ John D Groenveld               <groenvel@cse.psu.edu>
 John Hasstedt                  <John.Hasstedt@sunysb.edu>
 John Holdsworth                <coldwvae@bigfoot.com>
 John Hughes                    <john@AtlanTech.COM>
+John Kristian                  <jmk2001@engineer.com>
 John L. Allen                  <allen@grumman.com>
 John Macdonald                 <jmm@revenge.elegant.com>
 John Nolan                     <jpnolan@Op.Net>
@@ -382,6 +389,7 @@ Marc Lehmann                   <pcg@goof.com>
 Marc Paquette                  <Marc.Paquette@Softimage.COM>
 Marcel Grunauer                <marcel@codewerk.com>
 Mark A Biggar                  <mab@wdl.loral.com>
+Mark A. Hershberger            <mah@everybody.org>
 Mark Bixby                     <mark@bixby.org>
 Mark Dickinson                 <dickins3@fas.harvard.edu>
 Mark Fisher                    <fisherm@tce.com>
@@ -429,6 +437,7 @@ Michael Mahan                  <mahanm@nextwork.rose-hulman.edu>
 Michael Stevens                <mstevens@globnix.org>
 Michele Sardo
 Mik Firestone                  <fireston@lexmark.com>
+Mike                           <mike808@users.sourceforge.net>
 Mike Fletcher                  <fletch@phydeaux.org>
 Mike Hopkirk                   <hops@sco.com>
 Mike Mestnik                   <MMestnik@rustconsulting.com>
@@ -447,6 +456,7 @@ Nicholas Clark                 <nick@ccl4.org>
 Nick Duffek
 Nick Gianniotis
 Nick Ing-Simmons               <nick@ing-simmons.net>
+Nikola Knezevic                <indy@tesla.rcub.bg.ac.yu>
 Norbert Pueschel               <pueschel@imsdd.meb.uni-bonn.de>
 Norton T. Allen                <allen@huarp.harvard.edu>
 Olaf Flebbe                    <o.flebbe@science-computing.de>
@@ -486,6 +496,8 @@ Piotr Klaban                   <makler@oryl.man.torun.pl>
 Prymmer/Kahn                   <pvhp@best.com>
 Quentin Fennessy               <quentin@arrakeen.amd.com>
 Radu Greab                     <radu@netsoft.ro>
+Rafael Garcia-Suarez           <rgarciasuarez@free.fr>
+Rainer Keuchel                 <keuchel@allgeier.com>
 Rajesh Vaidheeswarran          <rv@gnu.org>
 Ralf S. Engelschall            <rse@engelschall.com>
 Randal L. Schwartz             <merlyn@stonehenge.com>
@@ -530,6 +542,7 @@ Scott Bronson                  <bronson@rinspin.com>
 Scott Gifford                  <sgifford@tir.com>
 Scott Henry                    <scotth@sgi.com>
 Scott L. Miller                <Scott.L.Miller@Compaq.com>
+Sean Dague                     <sean@dague.net>
 Sean Robinson                  <robinson_s@sc.maricopa.edu>
 Sean Sheedy                    <seans@ncube.com>
 Sebastien Barre                <Sebastien.Barre@utc.fr>
@@ -558,6 +571,7 @@ Steven Knight                  <knight@theopera.baldmt.citilink.com>
 Steven Morlock                 <newspost@morlock.net>
 Steven N. Hirsch               <hirschs@stargate.btv.ibm.com>
 Steven Parkes                  <parkes@sierravista.com>
+Stian Seeberg                  <sseeberg@nimsoft.no>
 Sven Verdoolaege               <skimo@breughel.ufsia.ac.be>
 SynaptiCAD, Inc.               <sales@syncad.com>
 Takis Psarogiannakopoulos      <takis@xfree86.org>
@@ -604,6 +618,7 @@ Ulrich Kunitz                  <kunitz@mai-koeln.com>
 Ulrich Pfeifer                 <pfeifer@wait.de>
 Vadim Konovalov                <watman@inbox.ru>
 Valeriy E. Ushakov             <uwe@ptc.spbu.ru>
+Ville Skyttä                   <scop@cs132170.pp.htv.fi>
 Vishal Bhatia                  <vishal@deja.com>
 Vlad Harchev                   <hvv@hippo.ru>
 Vladimir Alexiev               <vladimir@cs.ualberta.ca>
diff --git a/Changes b/Changes
index eb95cea..8fa2716 100644 (file)
--- a/Changes
+++ b/Changes
@@ -31,6 +31,1092 @@ or any other branch.
 Version v5.7.2         Development release working toward v5.8
 --------------
 ____________________________________________________________________________
+[ 11978] By: jhi                                   on 2001/09/10  12:59:40
+        Log: Revert #11973, the dTHX seems to be needed in there
+             for threaded builds.
+     Branch: perl
+          ! perlio.c
+____________________________________________________________________________
+[ 11977] By: jhi                                   on 2001/09/10  12:55:47
+        Log: Detypo.
+     Branch: perl
+          ! pod/perlguts.pod
+____________________________________________________________________________
+[ 11976] By: jhi                                   on 2001/09/10  12:46:34
+        Log: Further Class::Struct patching from Damian.
+             
+             The new new semantics are:
+             
+             * If you pass an initializer for a nested object, it has to be:
+             a) a reference to an object of that class, or     
+             b) a reference to an object of a subclass of that class, or
+             c) a reference to a hash of arguments to be passed to the
+             class's constructor
+             * If you pass no initializer for a nested object, the attribute
+             is initialized to C<undef>
+     Branch: perl
+          ! lib/Class/Struct.pm
+____________________________________________________________________________
+[ 11975] By: jhi                                   on 2001/09/10  12:42:24
+        Log: Skip the crypt test if no crypt.
+     Branch: perl
+          ! t/op/crypt.t
+____________________________________________________________________________
+[ 11974] By: jhi                                   on 2001/09/10  12:39:25
+        Log: Warn against using bare v-strings as IP addresses
+             (okay if using the wrappers from Socket)
+     Branch: perl
+          ! pod/perldata.pod pod/perlport.pod
+____________________________________________________________________________
+[ 11973] By: sky                                   on 2001/09/10  11:57:58
+        Log: Remove unused dTHX. Silenced another warning.
+     Branch: perl
+          ! perlio.c
+____________________________________________________________________________
+[ 11972] By: sky                                   on 2001/09/10  11:54:25
+        Log: Silence some more warnings INT2PTR.
+     Branch: perl
+          ! pp.c pp_ctl.c sharedsv.c sv.c taint.c
+____________________________________________________________________________
+[ 11971] By: sky                                   on 2001/09/10  11:21:50
+        Log: Silence another ITHREAD 64bit INT/32bit PTR warning.
+     Branch: perl
+          ! cop.h
+____________________________________________________________________________
+[ 11970] By: sky                                   on 2001/09/10  11:17:25
+        Log: Apply INT2PTR with force to silence warnings from
+             PM_GETRE and friends. No more warnings with 64bit 
+             IVs and 32bit pointers.   
+     Branch: perl
+          ! op.c op.h perl.c
+____________________________________________________________________________
+[ 11969] By: sky                                   on 2001/09/10  10:13:02
+        Log: Removed reference of -DPERL_CUSTOM_OPS in the documentation.
+     Branch: perl
+          ! pod/perlguts.pod
+____________________________________________________________________________
+[ 11968] By: sky                                   on 2001/09/10  10:02:51
+        Log: Remove #ifdef PERL_CUSTOM_OPS, always build with PERL_CUSTOM_OPS
+             Rename to custop_op_name to Perl_custom_op_name to match perlapi
+             Clone the hashtable PL_custom_op_names and PL_custop_op_descs in 
+             perl_clone.
+     Branch: perl
+          ! embed.pl intrpvar.h makedef.pl op.c opcode.pl sv.c
+____________________________________________________________________________
+[ 11967] By: jhi                                   on 2001/09/10  03:14:35
+        Log: Using strlen() not good on embedded nul bytes.
+     Branch: perl
+          ! regcomp.c
+____________________________________________________________________________
+[ 11966] By: ams                                   on 2001/09/09  21:06:13
+        Log: Subject: Re: [ID 20010810.011] 'use v2b' not allowed with strict
+             From: Rafael Garcia-Suarez <rgarciasuarez@free.fr>
+             Date: Mon, 13 Aug 2001 22:51:59 +0200
+             Message-ID: <20010813225159.C6681@rafael>
+             (Applied with several tweaks.)
+     Branch: perl
+          ! embed.h embed.pl proto.h toke.c
+____________________________________________________________________________
+[ 11965] By: jhi                                   on 2001/09/09  14:40:39
+        Log: The exact error message is system-dependent.
+     Branch: perl
+          ! lib/ExtUtils/Manifest.t
+____________________________________________________________________________
+[ 11964] By: jhi                                   on 2001/09/09  14:38:05
+        Log: Add Windows and Mac Sami support to Encode
+             (http://www.egt.ie/standards/se/sami-teastabaiki.html)
+     Branch: perl
+          + ext/Encode/Encode/isoir-197.enc ext/Encode/Encode/macSami.enc
+          ! MANIFEST
+____________________________________________________________________________
+[ 11963] By: jhi                                   on 2001/09/09  13:54:07
+        Log: Use the tried method.
+     Branch: perl
+          ! pod/perlport.pod
+____________________________________________________________________________
+[ 11962] By: jhi                                   on 2001/09/09  13:46:59
+        Log: Can't count parentheses.
+     Branch: perl
+          ! ext/IO/lib/IO/Socket/INET.pm
+____________________________________________________________________________
+[ 11961] By: jhi                                   on 2001/09/09  13:34:12
+        Log: perlport additions: 1 while unlink, add/delete directory
+             entries and permissions, cygwin stat funkiness (from Michael
+             Schwern and Nicholas Clark)
+     Branch: perl
+          ! pod/perlport.pod
+____________________________________________________________________________
+[ 11960] By: jhi                                   on 2001/09/09  13:19:12
+        Log: blib does have a detectable test.
+     Branch: perl
+          ! t/lib/1_compile.t
+____________________________________________________________________________
+[ 11959] By: jhi                                   on 2001/09/09  13:16:43
+        Log: Subject: [PATCH MANIFEST, lib/Term/Complete.t] Add Test for Term::Complete
+             From: "chromatic" <chromatic@rmci.net>
+             Date: Sat, 08 Sep 2001 19:33:42 -0600
+             Message-ID: <20010909013810.11522.qmail@onion.perl.org>
+     Branch: perl
+          + lib/Term/Complete.t
+          ! MANIFEST
+____________________________________________________________________________
+[ 11958] By: jhi                                   on 2001/09/09  13:09:02
+        Log: Subject: [PATCH MANIFEST lib/Test/Tutorial.pod] Test::Tutorial?
+             From: Michael G Schwern <schwern@pobox.com> 
+             Date: Sat, 8 Sep 2001 02:40:26 -0400
+             Message-ID: <20010908024026.A26283@blackrider>
+     Branch: perl
+          + lib/Test/Tutorial.pod
+          ! MANIFEST
+____________________________________________________________________________
+[ 11957] By: jhi                                   on 2001/09/09  13:03:33
+        Log: Try to look up protocol (by name) only iff it has non-numbers:
+             nice if the server is in a chrooted environment (no /etc/protocols,
+             server code using hardcorded protocol numbers like 6 for tcp),
+             suggested by John Holdsworth <coldwave@bigfoot.com>.
+             In other words, if we are given a number, why look it up again
+             (by number)?
+     Branch: perl
+          ! ext/IO/lib/IO/Socket/INET.pm
+____________________________________________________________________________
+[ 11956] By: jhi                                   on 2001/09/09  12:53:12
+        Log: Subject: [PATCH regcomp.c] zero-width assertions CAN be ?'d
+             From: "Jeff 'japhy/Marillion' Pinyan" <jeffp@crusoe.net>
+             Date: Sat, 8 Sep 2001 15:42:30 -0400 (EDT) 
+             Message-ID: <Pine.GSO.4.21.0109081535480.24489-100000@crusoe.crusoe.net>
+             
+             Subject: Re: [PATCH t/op/misc.t] regcomp.c patch broke test 
+             From: "Jeff 'japhy/Marillion' Pinyan" <jeffp@crusoe.net>
+             Date: Sat, 8 Sep 2001 18:33:12 -0400 (EDT)
+             Message-ID: <Pine.GSO.4.21.0109081832030.24489-100000@crusoe.crusoe.net>
+             Subject: [PATCH t/lib/warnings/regcomp] (?=...)? gives no warning now
+             From: "Jeff 'japhy/Marillion' Pinyan" <jeffp@crusoe.net>
+             Date: Sat, 8 Sep 2001 18:37:22 -0400 (EDT)
+             Message-ID: <Pine.GSO.4.21.0109081835340.24489-100000@crusoe.crusoe.net>
+     Branch: perl
+          ! regcomp.c t/lib/warnings/regcomp t/run/kill_perl.t
+____________________________________________________________________________
+[ 11955] By: ams                                   on 2001/09/09  02:54:21
+        Log: Subject: Re: [PATCH perl@11938] slash slashes in lib/CGI/Carp.pm
+             From: "Craig A. Berry" <craigberry@mac.com>
+             Date: Sat, 08 Sep 2001 19:02:16 -0500
+             Message-Id: <5.1.0.14.0.20010908185936.01aadcc0@mail.mac.com>
+     Branch: perl
+          ! lib/CGI/t/carp.t
+____________________________________________________________________________
+[ 11954] By: jhi                                   on 2001/09/09  02:30:39
+        Log: Documentation tweaks; think the IP address as an opaque string.
+     Branch: perl
+          ! ext/Socket/Socket.pm
+____________________________________________________________________________
+[ 11953] By: jhi                                   on 2001/09/09  00:32:05
+        Log: Subject: [REPATCH] Re: [PATCH] new test lib/blib.t
+             From: Michael G Schwern <schwern@pobox.com>
+             Date: Sat, 8 Sep 2001 19:45:46 -0400
+             Message-ID: <20010908194546.C9193@blackrider>
+     Branch: perl
+          + lib/blib.t
+          ! MANIFEST lib/blib.pm t/lib/1_compile.t
+____________________________________________________________________________
+[ 11952] By: jhi                                   on 2001/09/09  00:27:15
+        Log: Subject: [PATCH MANIFEST, lib/CGI/t/fast.t] Added Test for CGI::Fast
+             From: "chromatic" <chromatic@rmci.net>
+             Date: Sat, 08 Sep 2001 12:31:44 -0600
+             Message-ID: <20010908183612.49960.qmail@onion.perl.org>
+     Branch: perl
+          + lib/CGI/t/fast.t
+          ! MANIFEST
+____________________________________________________________________________
+[ 11951] By: jhi                                   on 2001/09/09  00:24:07
+        Log: The Socket tests were wrong: they were assuming too much.
+     Branch: perl
+          ! ext/Socket/Socket.pm ext/Socket/Socket.t ext/Socket/Socket.xs
+____________________________________________________________________________
+[ 11950] By: jhi                                   on 2001/09/08  20:09:07
+        Log: Retract the portability changes since they
+             seem to have opened a can of worms... will
+             go back to UNICOS/mk and do the bare minimum
+             required to get the tests working.
+     Branch: perl
+          ! ext/Socket/Socket.xs
+____________________________________________________________________________
+[ 11949] By: jhi                                   on 2001/09/08  19:48:20
+        Log: PADOFFSET is used to cast pointers into integers,
+             if pointers are 64 bits and U32 32 bits,
+             bad things may happen, or at least warnings issued.
+     Branch: perl
+          ! op.h
+____________________________________________________________________________
+[ 11948] By: jhi                                   on 2001/09/08  18:50:07
+        Log: Still more Socket portability tweaking.
+             Now Socket.t seems to be happy in all of
+             Linux/x86, Tru64/alpha, Solaris/sparc,
+             IRIX/MIPS (both 32-bit and 64-bit), and UNICOS/mk/alpha.
+             
+             Addendum: it seems that io_multihomed, io_sock, and hostent
+             were broken in little-endians (linux/x86 and tru64/alpha)
+             because of this change.  Argh.
+     Branch: perl
+          ! ext/Socket/Socket.xs
+____________________________________________________________________________
+[ 11947] By: jhi                                   on 2001/09/08  17:23:23
+        Log: More portability kicking on inet_ntoa().
+     Branch: perl
+          ! ext/Socket/Socket.xs
+____________________________________________________________________________
+[ 11946] By: jhi                                   on 2001/09/08  15:09:58
+        Log: Subject: [REPATCH] Re: [PATCH MANIFEST, lib/ExtUtils/Manifest.t] Another New Test
+             From: Michael G Schwern <schwern@pobox.com> 
+             Date: Fri, 7 Sep 2001 23:06:51 -0400
+             Message-ID: <20010907230651.R606@blackrider>
+     Branch: perl
+          + lib/ExtUtils/Manifest.t
+          ! MANIFEST lib/ExtUtils/MM_Unix.pm lib/ExtUtils/Manifest.pm
+____________________________________________________________________________
+[ 11945] By: jhi                                   on 2001/09/08  14:49:15
+        Log: Subject: Re: [PATCH MANIFEST, lib/ExtUtils/testlib.t] More Tests
+             From: "chromatic" <chromatic@rmci.net>
+             Date: Fri, 07 Sep 2001 17:53:15 -0600      
+             Message-ID: <20010907235740.80566.qmail@onion.perl.org>              
+     Branch: perl
+          + lib/ExtUtils/testlib.t
+          ! MANIFEST
+____________________________________________________________________________
+[ 11944] By: jhi                                   on 2001/09/07  22:57:00
+        Log: Thinko.
+     Branch: perl
+          ! lib/integer.t
+____________________________________________________________________________
+[ 11943] By: jhi                                   on 2001/09/07  20:34:55
+        Log: Subject: [PATCH perl@11938] slash slashes in lib/CGI/Carp.pm
+             From: "Craig A. Berry" <craigberry@mac.com>
+             Date: Fri, 07 Sep 2001 15:30:03 -0500
+             Message-Id: <5.1.0.14.0.20010907142644.03700c38@exchi01>
+     Branch: perl
+          ! lib/CGI/Carp.pm
+____________________________________________________________________________
+[ 11942] By: jhi                                   on 2001/09/07  20:30:43
+        Log: Subject: [PATCH lib/ExtUtils/MM_Unix.pm] (was Re: MakeMaker: MM_Unix rule excluding pods)
+             From: Michael G Schwern <schwern@pobox.com>
+             Date: Fri, 7 Sep 2001 15:38:13 -0400
+             Message-ID: <20010907153813.K606@blackrider>
+     Branch: perl
+          ! lib/ExtUtils/MM_Unix.pm
+____________________________________________________________________________
+[ 11941] By: jhi                                   on 2001/09/07  20:28:24
+        Log: Subject: [PATCH perl.h mg.c pp_sys.c] Silence the remaing format warning
+             From: Robin Barker <rmb1@cise.npl.co.uk>
+             Date: Fri, 7 Sep 2001 18:28:23 +0100 (BST)
+             Message-Id: <200109071728.SAA13569@tempest.npl.co.uk>
+     Branch: perl
+          ! Porting/pumpkin.pod mg.c perl.h pp_sys.c
+____________________________________________________________________________
+[ 11940] By: jhi                                   on 2001/09/07  20:26:29
+        Log: Clean up 1_compile.t; move tests to more consistent
+             places (t/ subdirectories); add integer.t (much of
+             the pragma is tested elsewhere but there is no one
+             centralized place)
+     Branch: perl
+          + ext/Fcntl/t/fcntl.t ext/Fcntl/t/syslfs.t ext/POSIX/t/posix.t
+          + ext/POSIX/t/sigaction.t lib/Env/t/array.t lib/Env/t/env.t
+          + lib/File/Find/t/find.t lib/File/Find/t/taint.t lib/integer.t
+          - ext/Fcntl/Fcntl.t ext/Fcntl/syslfs.t ext/POSIX/POSIX.t
+          - ext/POSIX/sigaction.t lib/Env/array.t lib/Env/env.t
+          - lib/File/Find/find.t lib/File/Find/taint.t
+          ! MANIFEST t/lib/1_compile.t t/op/lfs.t
+____________________________________________________________________________
+[ 11939] By: jhi                                   on 2001/09/07  17:25:32
+        Log: Subject: Re: [PATCH lib/File/Find/taint.t] Use Test::More
+             From: "chromatic" <chromatic@rmci.net>
+             Date: Fri, 07 Sep 2001 10:17:40 -0600
+             Message-ID: <20010907162205.84723.qmail@onion.perl.org>
+     Branch: perl
+          ! lib/File/Find/taint.t
+____________________________________________________________________________
+[ 11938] By: jhi                                   on 2001/09/07  14:04:43
+        Log: Update Changes.
+     Branch: perl
+          ! Changes patchlevel.h
+____________________________________________________________________________
+[ 11937] By: jhi                                   on 2001/09/07  13:52:03
+        Log: Rename the old threading tutorial, start a new one,
+             regen toc.
+     Branch: perl
+          + pod/perlothrtut.pod
+          ! MANIFEST pod/buildtoc.PL pod/perl.pod pod/perlthrtut.pod
+          ! pod/perltoc.pod
+____________________________________________________________________________
+[ 11936] By: jhi                                   on 2001/09/07  13:05:48
+        Log: vars very much has a test.
+     Branch: perl
+          ! t/lib/1_compile.t
+____________________________________________________________________________
+[ 11935] By: jhi                                   on 2001/09/07  12:52:06
+        Log: Subject: Re: wince/perl.ico marked as binary
+             From: Nicholas Clark <nick@ccl4.org>
+             Date: Fri, 7 Sep 2001 13:54:40 +0100
+             Message-ID: <20010907135439.D39150@plum.flirble.org>
+             
+             and wince/Makefile.ce change from Rainer Keuchel.
+     Branch: perl
+          + wince/makeico.pl
+          ! MANIFEST wince/Makefile.ce
+____________________________________________________________________________
+[ 11934] By: jhi                                   on 2001/09/07  12:43:50
+        Log: Subject: Re: [PATCH regexec.c] more general .* and .*?
+             From: "Jeff 'japhy/Marillion' Pinyan" <jeffp@crusoe.net>
+             Date: Fri, 7 Sep 2001 09:41:10 -0400 (EDT)
+             Message-ID: <Pine.GSO.4.21.0109070933530.7041-100000@crusoe.crusoe.net>
+     Branch: perl
+          ! regexec.c
+____________________________________________________________________________
+[ 11933] By: jhi                                   on 2001/09/07  12:37:46
+        Log: (Replaced by #11934)
+             Subject: Re: [PATCH regexec.c] more general .* and .*?
+             From: "Jeff 'japhy/Marillion' Pinyan" <jeffp@crusoe.net>
+             Date: Fri, 7 Sep 2001 08:44:17 -0400 (EDT)
+             Message-ID: <Pine.GSO.4.21.0109070836110.7041-100000@crusoe.crusoe.net>
+     Branch: perl
+          ! regexec.c
+____________________________________________________________________________
+[ 11932] By: jhi                                   on 2001/09/07  12:27:14
+        Log: The #11931 patching misbehaved.
+     Branch: perl
+          ! lib/Test/Harness/t/test-harness.t
+____________________________________________________________________________
+[ 11931] By: jhi                                   on 2001/09/07  12:21:30
+        Log: Subject: [PATCH lib/Test/Harness* t/TEST] Test::Harness 1.25 sync
+             From: Michael G Schwern <schwern@pobox.com>
+             Date: Fri, 7 Sep 2001 03:30:41 -0400
+             Message-ID: <20010907033041.A2796@blackrider>
+     Branch: perl
+          + lib/Test/Harness/Changes lib/Test/Harness/t/base.t
+          + lib/Test/Harness/t/ok.t lib/Test/Harness/t/test-harness.t
+          + t/lib/sample-tests/header_at_end_fail
+          + t/lib/sample-tests/skip_no_msg t/lib/sample-tests/todo_inline
+          - lib/Test/Harness.t
+          ! MANIFEST lib/Test/Harness.pm t/TEST
+____________________________________________________________________________
+[ 11930] By: jhi                                   on 2001/09/07  11:59:17
+        Log: Subject: [PATCH] Digest::MD5 update
+             From: Gisle Aas <gisle@ActiveState.com>
+             Date: 06 Sep 2001 23:32:56 -0700
+             Message-ID: <lrofon5x47.fsf@caliper.ActiveState.com>
+     Branch: perl
+          ! ext/Digest/MD5/Changes ext/Digest/MD5/MD5.pm
+          ! ext/Digest/MD5/MD5.xs ext/Digest/MD5/t/files.t
+____________________________________________________________________________
+[ 11929] By: jhi                                   on 2001/09/07  11:23:05
+        Log: Subject: [PATCH MANIFEST, lib/less.t] Add Tests for the less Pragma
+             From: "chromatic" <chromatic@rmci.net>
+             Date: Thu, 06 Sep 2001 23:11:44 -0600
+             Message-ID: <20010907051609.91459.qmail@onion.perl.org>
+     Branch: perl
+          + lib/less.t
+          ! MANIFEST t/lib/1_compile.t
+____________________________________________________________________________
+[ 11928] By: jhi                                   on 2001/09/07  11:19:29
+        Log: The binary file must somehow differently stored.
+     Branch: perl
+          - wince/perl.ico
+          ! MANIFEST
+____________________________________________________________________________
+[ 11927] By: jhi                                   on 2001/09/07  03:53:29
+        Log: Add more modules to the list of modules that have tests,
+             Schwern's wallet is getting more nervous.
+             (Run t/lib/1_compile.t manually to see which modules
+             are lacking tests, or the tests can't be run for some
+             reason or another, such as the Net:: modules)
+     Branch: perl
+          ! t/lib/1_compile.t
+____________________________________________________________________________
+[ 11926] By: jhi                                   on 2001/09/07  03:43:11
+        Log: Try to make Socket::inet_ntoa() more robust.
+     Branch: perl
+          ! ext/Socket/Socket.t ext/Socket/Socket.xs pod/perldiag.pod
+____________________________________________________________________________
+[ 11925] By: jhi                                   on 2001/09/07  01:57:58
+        Log: Subject: Re: [PATCH lib/English.t] Test All Aliases (including %Errno)
+             From: chromatic <chromatic@rmci.net>       
+             Date: Wed, 5 Sep 2001 22:58:05 -0600                         
+             Message-Id: <01090522580506.19590@firewheel>           
+     Branch: perl
+          ! lib/English.t
+____________________________________________________________________________
+[ 11924] By: jhi                                   on 2001/09/07  01:55:05
+        Log: Subject: Re: perlvar manpage and localizing special vars
+             From: Stas Bekman <stas@stason.org>
+             Date: Fri, 7 Sep 2001 10:10:24 +0800 (SGT)
+             Message-ID: <Pine.LNX.4.33.0109071009240.19262-100000@stas.singnet.com.sg>
+     Branch: perl
+          ! pod/perlvar.pod
+____________________________________________________________________________
+[ 11923] By: jhi                                   on 2001/09/07  01:49:36
+        Log: Subject: [PATCH MakeMaker.pm] noise from make in ext/SDBM
+             From: Robin Barker <rmb1@cise.npl.co.uk>
+             Date: Thu, 6 Sep 2001 19:36:49 +0100 (BST)
+             Message-Id: <200109061836.TAA08747@tempest.npl.co.uk>
+     Branch: perl
+          ! lib/ExtUtils/MakeMaker.pm
+____________________________________________________________________________
+[ 11922] By: jhi                                   on 2001/09/06  18:09:08
+        Log: Symbol missing; AIX unhappy.
+     Branch: perl
+          ! makedef.pl
+____________________________________________________________________________
+[ 11921] By: jhi                                   on 2001/09/06  17:52:43
+        Log: Add a test for [ID 20010906.019] perl crashes on "undef foo"
+             Reported in 5.61, seems to work okay in blead.
+     Branch: perl
+          ! t/run/kill_perl.t
+____________________________________________________________________________
+[ 11920] By: jhi                                   on 2001/09/06  14:35:09
+        Log: Update Changes.
+     Branch: perl
+          ! Changes patchlevel.h
+____________________________________________________________________________
+[ 11919] By: jhi                                   on 2001/09/06  14:20:10
+        Log: Document the bad assumptions currently breaking
+             the Socket.t tests 10, 11, and 13 in UNICOS.
+     Branch: perl
+          ! ext/Socket/Socket.xs
+____________________________________________________________________________
+[ 11918] By: jhi                                   on 2001/09/06  14:07:45
+        Log: Subject: [PATCH x2p] make OPTIMIZE=...
+             From: Robin Barker <rmb1@cise.npl.co.uk>
+             Date: Thu, 6 Sep 2001 13:31:37 +0100 (BST)
+             Message-Id: <200109061231.NAA25265@tempest.npl.co.uk>
+     Branch: perl
+          ! x2p/Makefile.SH x2p/cflags.SH
+____________________________________________________________________________
+[ 11917] By: jhi                                   on 2001/09/06  14:01:45
+        Log: Subject: [PATCH] for perlhack.pod - no p5p archive on deja/google
+             From: Ian Phillipps <Ian_Phillipps@yahoo.co.uk>
+             Date: Thu, 6 Sep 2001 11:09:40 +0100
+             Message-ID: <20010906110939.A914@homer.diplex.co.uk>
+             
+             Subject: Re: [PATCH] for perlhack.pod - no p5p archive on deja/google    
+             From: rgarciasuarez@free.fr (Rafael Garcia-Suarez)
+             Date: 6 Sep 2001 10:14:38 -0000
+             Message-Id: <slrn9pej4m.1j8.rgarciasuarez@rafael.kazibao.net>   
+     Branch: perl
+          ! pod/perlfaq1.pod pod/perlhack.pod
+____________________________________________________________________________
+[ 11916] By: jhi                                   on 2001/09/06  13:56:19
+        Log: Subject: Extra NUL is Data::Dumper output - patch
+             From: Tony Cook <tony@develop-help.com>
+             Date: Thu, 6 Sep 2001 12:35:49 +1000 (EST)
+             Message-ID: <Pine.LNX.4.10.10109061157210.9366-100000@develop-help.com>
+     Branch: perl
+          ! ext/Data/Dumper/Dumper.xs ext/Data/Dumper/t/dumper.t
+____________________________________________________________________________
+[ 11915] By: jhi                                   on 2001/09/06  13:51:16
+        Log: Avoid redefinition warning
+             Subroutine Cwd::fastcwd redefined at lib/XSLoader.pm line 97.
+             from
+             perl -w -Ilib -MCwd -e ''
+     Branch: perl
+          ! lib/Cwd.pm
+____________________________________________________________________________
+[ 11914] By: jhi                                   on 2001/09/06  13:30:32
+        Log: Update the is_tainted() example implementation.
+     Branch: perl
+          ! pod/perlsec.pod
+____________________________________________________________________________
+[ 11913] By: jhi                                   on 2001/09/06  13:15:59
+        Log: Missing) in #11912.
+     Branch: perl
+          ! lib/Test/Simple/t/fail.t
+____________________________________________________________________________
+[ 11912] By: jhi                                   on 2001/09/06  13:08:48
+        Log: Rewhack Test-Simple into core harness.
+     Branch: perl
+          ! lib/Test/Simple/t/exit.t lib/Test/Simple/t/extra.t
+          ! lib/Test/Simple/t/fail-like.t lib/Test/Simple/t/fail-more.t
+          ! lib/Test/Simple/t/fail.t lib/Test/Simple/t/missing.t
+          ! lib/Test/Simple/t/no_plan.t lib/Test/Simple/t/plan_is_noplan.t
+          ! lib/Test/Simple/t/skipall.t
+____________________________________________________________________________
+[ 11911] By: jhi                                   on 2001/09/06  11:54:06
+        Log: Workaround for the new Exporter 'feature'.
+     Branch: perl
+          ! lib/Test/More.pm
+____________________________________________________________________________
+[ 11910] By: jhi                                   on 2001/09/06  11:52:56
+        Log: Re-introduce pure-Perl fall-back for abs_path,
+             re-introduce #11898.
+     Branch: perl
+          ! lib/Cwd.pm lib/File/Find.pm
+____________________________________________________________________________
+[ 11909] By: jhi                                   on 2001/09/06  03:49:13
+        Log: More tests.
+     Branch: perl
+          ! lib/Exporter.t
+____________________________________________________________________________
+[ 11908] By: jhi                                   on 2001/09/06  03:38:22
+        Log: Retract #11898 for now because it introduces
+             a rather nasty depencency: when B is being built,
+             MakeMaker is used.  MakeMaker uses File::Find.
+             File::Find uses Cwd::getcwd()...which doesn't
+             exist yet.
+     Branch: perl
+          ! lib/File/Find.pm
+____________________________________________________________________________
+[ 11907] By: jhi                                   on 2001/09/06  03:20:02
+        Log: New test welcome.
+     Branch: perl
+          + lib/Test/Simple/t/simple.t
+____________________________________________________________________________
+[ 11906] By: jhi                                   on 2001/09/06  03:08:01
+        Log: Old test begone.
+     Branch: perl
+          - lib/Attribute/Handlers/test.pl
+____________________________________________________________________________
+[ 11905] By: jhi                                   on 2001/09/06  01:41:03
+        Log: Test-Simple syncup from Schwern.
+     Branch: perl
+          + lib/Test/Simple/t/More.t lib/Test/Simple/t/fail-like.t
+          + lib/Test/Simple/t/fail-more.t lib/Test/Simple/t/skip.t
+          + lib/Test/Simple/t/skipall.t lib/Test/Simple/t/todo.t
+          + lib/Test/Simple/t/undef.t lib/Test/Simple/t/useing.t
+          + lib/Test/Utils.pm t/lib/Test/Simple/Catch/More.pm
+          - lib/Test/More/Changes lib/Test/More/t/More.t
+          - lib/Test/More/t/fail-like.t lib/Test/More/t/fail.t
+          - lib/Test/More/t/plan_is_noplan.t lib/Test/More/t/skipall.t
+          - lib/Test/Simple/t/simple.t t/lib/Test/More/Catch.pm
+          ! MANIFEST lib/Test/More.pm lib/Test/Simple.pm
+          ! lib/Test/Simple/Changes lib/Test/Simple/t/exit.t
+          ! lib/Test/Simple/t/extra.t lib/Test/Simple/t/fail.t
+          ! lib/Test/Simple/t/missing.t lib/Test/Simple/t/no_plan.t
+          ! lib/Test/Simple/t/plan_is_noplan.t t/lib/Test/Simple/Catch.pm
+          ! t/lib/Test/Simple/sample_tests/death.plx
+          ! t/lib/Test/Simple/sample_tests/death_in_eval.plx
+          ! t/lib/Test/Simple/sample_tests/extras.plx
+          ! t/lib/Test/Simple/sample_tests/five_fail.plx
+          ! t/lib/Test/Simple/sample_tests/last_minute_death.plx
+          ! t/lib/Test/Simple/sample_tests/one_fail.plx
+          ! t/lib/Test/Simple/sample_tests/require.plx
+          ! t/lib/Test/Simple/sample_tests/success.plx
+          ! t/lib/Test/Simple/sample_tests/too_few.plx
+          ! t/lib/Test/Simple/sample_tests/two_fail.plx
+____________________________________________________________________________
+[ 11904] By: pudge                                 on 2001/09/06  00:28:01
+        Log: Integrate File::Find changes from bleadperl
+     Branch: maint-5.6/macperl
+          ! lib/File/Find.pm t/lib/filefind-taint.t
+____________________________________________________________________________
+[ 11903] By: pudge                                 on 2001/09/06  00:22:29
+        Log: Integrate 11847 from maint-5.6/perl
+     Branch: maint-5.6/macperl
+         !> sv.c
+____________________________________________________________________________
+[ 11902] By: jhi                                   on 2001/09/05  23:27:57
+        Log: In UNICOS division yada yada.
+     Branch: perl
+          ! t/op/override.t
+____________________________________________________________________________
+[ 11901] By: jhi                                   on 2001/09/05  23:26:23
+        Log: In UNICOS division is really lossy, better use
+             a tolerance test.
+     Branch: perl
+          ! ext/Time/HiRes/HiRes.t
+____________________________________________________________________________
+[ 11900] By: jhi                                   on 2001/09/05  23:22:38
+        Log: In UNICOS sigaction() sets an extra flag
+             ("the signal has been registered for all the processes in
+             a multitasking group.")
+     Branch: perl
+          ! ext/POSIX/sigaction.t
+____________________________________________________________________________
+[ 11899] By: jhi                                   on 2001/09/05  23:18:48
+        Log: Documentation micropatch from Damian.
+     Branch: perl
+          ! lib/Attribute/Handlers.pm
+____________________________________________________________________________
+[ 11898] By: jhi                                   on 2001/09/05  23:16:50
+        Log: (Retracted by #11908)
+             Subject: [PATCH] Re: [PATCH lib/File/Find.pm lib/File/Find/taint.t] Fixing those damned taint tests
+             From: Michael G Schwern <schwern@pobox.com>
+             Date: Wed, 5 Sep 2001 15:58:21 -0400
+             Message-ID: <20010905155821.I632@blackrider>
+     Branch: perl
+          ! lib/File/Find.pm lib/File/Find/taint.t
+____________________________________________________________________________
+[ 11897] By: jhi                                   on 2001/09/05  23:14:43
+        Log: Subject: [PATCH lib/CGI/t/carp.t] Tests for CGI::Carp               
+             From: Michael G Schwern <schwern@pobox.com>
+             Date: Wed, 5 Sep 2001 19:16:31 -0400
+             Message-ID: <20010905191631.E11386@blackrider>
+     Branch: perl
+          + lib/CGI/t/carp.t
+          ! MANIFEST
+____________________________________________________________________________
+[ 11896] By: jhi                                   on 2001/09/05  23:14:11
+        Log: Subject: Re: [PATCH] Re: English.pm should do *PREMATCH = \$`       
+             From: chromatic <chromatic@rmci.net>
+             Date: Wed, 5 Sep 2001 18:08:07 -0600
+             Message-Id: <01090518080700.19590@firewheel>
+     Branch: perl
+          ! lib/English.pm
+____________________________________________________________________________
+[ 11895] By: jhi                                   on 2001/09/05  22:52:01
+        Log: Fix a typo #11889 and add a test for the same.
+     Branch: perl
+          ! ext/Socket/Socket.t ext/Socket/Socket.xs
+____________________________________________________________________________
+[ 11894] By: jhi                                   on 2001/09/05  22:43:26
+        Log: Subject: [PATCH bleadperl] tweak warnings.t and kill_perl.t for VMS
+             From: "Craig A. Berry" <craigberry@mac.com>
+             Date: Wed, 05 Sep 2001 17:48:54 -0500
+             Message-Id: <5.1.0.14.0.20010905145002.02b45218@exchi01>
+     Branch: perl
+          ! lib/warnings.t t/run/kill_perl.t
+____________________________________________________________________________
+[ 11893] By: jhi                                   on 2001/09/05  22:36:35
+        Log: Subject: [PATCH t/run/kill_perl.t] tying a bareword causes a segfault in 5.6.1
+             From: Michael G Schwern <schwern@pobox.com>
+             Date: Wed, 5 Sep 2001 17:22:25 -0400
+             Message-ID: <20010905172225.C11386@blackrider>
+     Branch: perl
+          ! t/run/kill_perl.t
+____________________________________________________________________________
+[ 11892] By: jhi                                   on 2001/09/05  22:34:55
+        Log: Subject: [PATCH] Re: [ID 20010825.006] -DCRIPPLED_CC is broken
+             From: Nicholas Clark <nick@ccl4.org>
+             Date: Wed, 5 Sep 2001 20:54:24 +0100
+             Message-ID: <20010905205424.C25120@plum.flirble.org>
+     Branch: perl
+          ! embed.h embed.pl global.sym pod/perlapi.pod proto.h sv.c sv.h
+____________________________________________________________________________
+[ 11891] By: jhi                                   on 2001/09/05  22:34:16
+        Log: Forgotten thing.
+     Branch: perl
+          ! uconfig.h
+____________________________________________________________________________
+[ 11890] By: jhi                                   on 2001/09/05  22:27:42
+        Log: Subject: Re: [PATCH] Re: English.pm should do *PREMATCH = \$`
+             From: chromatic <chromatic@rmci.net>               
+             Date: Wed, 5 Sep 2001 13:22:08 -0600
+             Message-Id: <01090513220807.10587@firewheel> 
+     Branch: perl
+          ! lib/English.pm
+____________________________________________________________________________
+[ 11889] By: jhi                                   on 2001/09/05  22:23:06
+        Log: inet_ntoa() tweaks:
+             - don't allow addresses with > 255 characters
+             - indent the HP-UX workaround
+             - don't leak memory
+     Branch: perl
+          ! ext/Socket/Socket.xs
+____________________________________________________________________________
+[ 11888] By: jhi                                   on 2001/09/05  16:26:17
+        Log: Clear up a documentation confusion noticed by Xiaoyun Wu
+             <xwu@theeducationcenter.com>
+     Branch: perl
+          ! lib/File/Find.pm
+____________________________________________________________________________
+[ 11887] By: jhi                                   on 2001/09/05  15:40:03
+        Log: Typo nits.
+     Branch: perl
+          ! lib/File/Find.pm
+____________________________________________________________________________
+[ 11886] By: jhi                                   on 2001/09/05  15:30:11
+        Log: -Wall nit.
+     Branch: perl
+          ! op.c
+____________________________________________________________________________
+[ 11885] By: gbarr                                 on 2001/09/05  15:26:18
+        Log: Update to Scalar-List-Utils 1.05
+     Branch: perl
+          ! ext/List/Util/ChangeLog ext/List/Util/README
+          ! ext/List/Util/Util.xs ext/List/Util/lib/List/Util.pm
+____________________________________________________________________________
+[ 11884] By: jhi                                   on 2001/09/05  13:05:14
+        Log: Update Changes.
+     Branch: perl
+          ! Changes patchlevel.h
+____________________________________________________________________________
+[ 11883] By: gbarr                                 on 2001/09/05  12:51:35
+        Log: Update to Scalar-List-Utils 1.04
+     Branch: perl
+          ! ext/List/Util/ChangeLog ext/List/Util/Util.xs
+          ! ext/List/Util/lib/List/Util.pm
+          ! ext/List/Util/lib/Scalar/Util.pm
+____________________________________________________________________________
+[ 11882] By: jhi                                   on 2001/09/05  12:29:44
+        Log: Metaconfigify #11724.
+     Branch: metaconfig
+          ! U/threads/archname.U
+____________________________________________________________________________
+[ 11881] By: jhi                                   on 2001/09/05  12:21:44
+        Log: The MacOS reference is okay, no reason to hide it.
+     Branch: perl
+          ! lib/Cwd.pm
+____________________________________________________________________________
+[ 11880] By: jhi                                   on 2001/09/05  12:20:49
+        Log: Subject: [PATCH lib/Cwd.pm ext/Cwd/Makefile.PL] Full doc cleanup (was  Re: [PATCH lib/Cwd.pm]  Try this again.)
+             From: Michael G Schwern <schwern@pobox.com>
+             Date: Tue, 4 Sep 2001 15:30:10 -0400
+             Message-ID: <20010904153010.H26466@blackrider> 
+             
+             (We'll see whether the ../../lib/Cwd.pm works in alien lands)
+     Branch: perl
+          ! ext/Cwd/Makefile.PL lib/Cwd.pm
+____________________________________________________________________________
+[ 11879] By: jhi                                   on 2001/09/05  12:12:18
+        Log: Subject: [PATCH lib/Cwd.pm] cwd() taint safe  (was Re: [PATCH lib/Cwd.pm ext/Cwd/Makefile.PL] Full doc cleanup (was  Re: [PATCH lib/Cwd.pm]  Try this again.))
+             From: Michael G Schwern <schwern@pobox.com>
+             Date: Tue, 4 Sep 2001 17:39:13 -0400
+             Message-ID: <20010904173913.C626@blackrider>
+     Branch: perl
+          ! lib/Cwd.pm
+____________________________________________________________________________
+[ 11878] By: jhi                                   on 2001/09/05  12:10:50
+        Log: Subject: Re: Perl_pp_* in public API?
+             From: "Craig A. Berry" <craigberry@mac.com>
+             Date: Tue, 4 Sep 2001 21:51:29 -0500
+             Message-Id: <a05101000b7bb3f558c8a@[172.16.52.1]>
+     Branch: perl
+          ! ext/List/Util/Util.xs
+____________________________________________________________________________
+[ 11877] By: jhi                                   on 2001/09/05  12:07:53
+        Log: From Damian: Class::Struct was unable to define
+             recursive classes.  After the patch an object reference
+             (rather than a hash) is required to initialize
+             an object attribute.  If no such initializer is given to
+             the constructor, object attributes are now default
+             initialized to C<undef>.
+     Branch: perl
+          ! lib/Class/Struct.pm lib/Class/Struct.t
+____________________________________________________________________________
+[ 11876] By: jhi                                   on 2001/09/05  11:51:24
+        Log: Subject: Re: sv_catpvfn and sv_setpvfn
+             From: Richard Soderberg <rs@oregonnet.com>
+             Date: Tue, 4 Sep 2001 15:16:47 -0700
+             Message-Id: <200109042216.PAA17858@oregonnet.com>
+     Branch: perl
+          ! pod/perlclib.pod pod/perlguts.pod
+____________________________________________________________________________
+[ 11875] By: jhi                                   on 2001/09/05  11:48:14
+        Log: NetWare updates from Ananth Kesari.
+     Branch: perl
+          ! NetWare/config.wc NetWare/netware.h NetWare/nw5.c
+          ! NetWare/nw5thread.h
+____________________________________________________________________________
+[ 11874] By: jhi                                   on 2001/09/05  11:30:59
+        Log: Subject: [PATCH] oct and hex in glorious 64 bit (with less bugs) (was Re: hex and oct again (was Re: FreeBSD MD5 crypt? Re: crypt/hex/oct and Unicode?))
+             From: Nicholas Clark <nick@ccl4.org>
+             Date: Tue, 4 Sep 2001 22:42:50 +0100
+             Message-ID: <20010904224250.P25120@plum.flirble.org>
+     Branch: perl
+          ! embed.h embed.pl numeric.c perl.c perl.h pod/perlclib.pod
+          ! pod/perlfunc.pod pp.c proto.h regcomp.c t/op/64bitint.t
+          ! t/op/oct.t toke.c
+____________________________________________________________________________
+[ 11873] By: jhi                                   on 2001/09/04  21:03:17
+        Log: Fix Cwd::getcwd() not being tainted, as noticed
+             by Schwern.
+     Branch: perl
+          + ext/Cwd/t/cwd.t ext/Cwd/t/taint.t
+          - ext/Cwd/Cwd.t
+          ! MANIFEST ext/Cwd/Cwd.xs util.c
+____________________________________________________________________________
+[ 11872] By: jhi                                   on 2001/09/04  20:00:50
+        Log: Retract #11870 and volatilize the right destruct_level.
+             Silly thinko pointed out by Sarathy.
+     Branch: perl
+          ! intrpvar.h perl.c
+____________________________________________________________________________
+[ 11871] By: jhi                                   on 2001/09/04  19:45:59
+        Log: At least a temporary fix for the mysterious scope core dumps
+             in Tru64 from Graham.
+     Branch: perl
+          ! ext/List/Util/Util.xs
+____________________________________________________________________________
+[ 11870] By: jhi                                   on 2001/09/04  19:01:48
+        Log: (Retracted by #11872)
+     Branch: perl
+          ! intrpvar.h
+____________________________________________________________________________
+[ 11869] By: jhi                                   on 2001/09/04  17:43:31
+        Log: Quench a -Wall gripe noticed by Robin Barker.
+     Branch: perl
+          ! op.c
+____________________________________________________________________________
+[ 11868] By: jhi                                   on 2001/09/04  16:38:07
+        Log: Subject: [PATCH perl@11834] Unicode::UCD rewritten using Lingua::KO::Hangul::Util
+             From: SADAHIRO Tomoyuki <BQW10602@nifty.com>
+             Date: Wed, 05 Sep 2001 02:01:32 +0900
+             Message-Id: <20010905015059.E684.BQW10602@nifty.com>
+     Branch: perl
+          ! lib/Unicode/UCD.pm
+____________________________________________________________________________
+[ 11867] By: jhi                                   on 2001/09/04  16:35:27
+        Log: Subject: Re: [PATCH gv.c] @& sets PL_sawampersand
+             From: "Jeff 'japhy/Marillion' Pinyan" <jeffp@crusoe.net>
+             Date: Tue, 4 Sep 2001 12:51:02 -0400 (EDT)
+             Message-ID: <Pine.GSO.4.21.0109041250420.7601-100000@crusoe.crusoe.net>
+     Branch: perl
+          ! gv.c
+____________________________________________________________________________
+[ 11866] By: jhi                                   on 2001/09/04  13:52:28
+        Log: Update Changes.
+     Branch: perl
+          ! Changes patchlevel.h
+____________________________________________________________________________
+[ 11865] By: jhi                                   on 2001/09/04  13:36:58
+        Log: Add the \[$@%&*] prototype support.
+     Branch: perl
+          ! op.c pod/perlsub.pod t/comp/proto.t
+____________________________________________________________________________
+[ 11864] By: jhi                                   on 2001/09/04  13:10:38
+        Log: Subject: [PATCH lib/CGI/t/form.t] Cleanup
+             From: Michael G Schwern <schwern@pobox.com>
+             Date: Mon, 3 Sep 2001 18:59:01 -0400
+             Message-ID: <20010903185901.Z9233@blackrider>
+     Branch: perl
+          ! lib/CGI/t/form.t
+____________________________________________________________________________
+[ 11863] By: jhi                                   on 2001/09/04  13:06:39
+        Log: Subject: [PATCH gv.c] @& sets PL_sawampersand
+             From: "Jeff 'japhy/Marillion' Pinyan" <jeffp@crusoe.net>
+             Date: Mon, 3 Sep 2001 12:36:20 -0400 (EDT)
+             Message-ID: <Pine.GSO.4.21.0109031235240.7601-100000@crusoe.crusoe.net>
+     Branch: perl
+          ! gv.c
+____________________________________________________________________________
+[ 11862] By: jhi                                   on 2001/09/04  13:05:23
+        Log: More srand entry tweakage based on Randal's suggestion.
+     Branch: perl
+          ! pod/perlfunc.pod
+____________________________________________________________________________
+[ 11861] By: jhi                                   on 2001/09/04  12:48:14
+        Log: Subject: [PATCH] 'main' *is* a reserved word
+             From: Rafael Garcia-Suarez <rgarciasuarez@free.fr>
+             Date: Mon, 3 Sep 2001 22:55:41 +0200
+             Message-ID: <20010903225541.A24097@rafael>
+     Branch: perl
+          ! toke.c
+____________________________________________________________________________
+[ 11860] By: jhi                                   on 2001/09/04  12:46:30
+        Log: Subject: [PATCH: bleedperl] s/ROOT\./_ROOT./ for VMS default install prefix appendage
+             From: Peter Prymmer <pvhp@best.com>
+             Date: Mon, 3 Sep 2001 13:43:04 -0700 (PDT)
+             Message-ID: <Pine.BSF.4.21.0109031338300.5068-100000@shell8.ba.best.com>
+     Branch: perl
+          ! README.vms configure.com
+____________________________________________________________________________
+[ 11859] By: jhi                                   on 2001/09/04  12:44:29
+        Log: Subject: Re: A slightly better default seed?   
+             From: Michael G Schwern <schwern@pobox.com>
+             Date: Mon, 3 Sep 2001 18:08:15 -0400 
+             Message-ID: <20010903180815.W9233@blackrider>
+     Branch: perl
+          ! t/op/srand.t
+____________________________________________________________________________
+[ 11858] By: jhi                                   on 2001/09/04  12:41:59
+        Log: Add sharedsv.o to microperl object files.
+     Branch: perl
+          ! Makefile.micro
+____________________________________________________________________________
+[ 11857] By: jhi                                   on 2001/09/04  12:27:51
+        Log: AUTHORS updates and
+             
+             Subject: [PATCH] Just some preening :-)        
+             From: Ian Phillipps <Ian_Phillipps@yahoo.co.uk>
+             Date: Tue, 4 Sep 2001 14:16:59 +0100
+             Message-ID: <20010904141659.A10129@homer.diplex.co.uk>            
+     Branch: perl
+          ! AUTHORS ext/Data/Dumper/Changes lib/Text/Soundex.pm
+____________________________________________________________________________
+[ 11856] By: jhi                                   on 2001/09/04  12:09:43
+        Log: Typo fix and slight rewording.
+     Branch: perl
+          ! pod/perlfunc.pod
+____________________________________________________________________________
+[ 11855] By: jhi                                   on 2001/09/04  12:04:16
+        Log: Update the FAQ now that Scalar-List-Utils 1.03 has shuffle().
+     Branch: perl
+          ! pod/perlfaq4.pod
+____________________________________________________________________________
+[ 11854] By: jhi                                   on 2001/09/03  20:12:21
+        Log: The helper file changed name.
+     Branch: perl
+          ! MANIFEST
+____________________________________________________________________________
+[ 11853] By: gbarr                                 on 2001/09/03  20:00:00
+        Log: Update to Scalar-List-Utils 1.03
+     Branch: perl
+          + ext/List/Util/t/shuffle.t
+          ! MANIFEST ext/List/Util/ChangeLog ext/List/Util/Util.xs
+          ! ext/List/Util/lib/List/Util.pm ext/List/Util/t/blessed.t
+          ! ext/List/Util/t/dualvar.t ext/List/Util/t/first.t
+          ! ext/List/Util/t/max.t ext/List/Util/t/maxstr.t
+          ! ext/List/Util/t/min.t ext/List/Util/t/minstr.t
+          ! ext/List/Util/t/readonly.t ext/List/Util/t/reduce.t
+          ! ext/List/Util/t/reftype.t ext/List/Util/t/sum.t
+          ! ext/List/Util/t/tainted.t ext/List/Util/t/weak.t
+____________________________________________________________________________
+[ 11852] By: jhi                                   on 2001/09/03  19:50:57
+        Log: Make crypt() do something more sane for Unicode
+             (take crypt() of the low eight bits of the characters,
+             instead of taking crypt() of the UTF-8 of the scalar);
+             add a test for crypt().
+     Branch: perl
+          + t/op/crypt.t
+          ! MANIFEST pod/perlfunc.pod pp.c
+____________________________________________________________________________
+[ 11851] By: jhi                                   on 2001/09/03  19:19:35
+        Log: Reorganize the srand entry.
+     Branch: perl
+          ! pod/perlfunc.pod
+____________________________________________________________________________
+[ 11850] By: jhi                                   on 2001/09/03  18:54:51
+        Log: Remove the tests that assume something about
+             calling srand() without arguments multiple times.
+     Branch: perl
+          ! t/op/srand.t
+____________________________________________________________________________
+[ 11849] By: jhi                                   on 2001/09/03  18:15:16
+        Log: Upgrade to Math::BigInt 1.42.
+     Branch: perl
+          ! lib/Math/BigFloat.pm lib/Math/BigInt.pm
+          ! lib/Math/BigInt/Calc.pm lib/Math/BigInt/t/bigfltpm.t
+          ! lib/Math/BigInt/t/bigintc.t lib/Math/BigInt/t/bigintpm.t
+          ! lib/Math/BigInt/t/mbimbf.t
+____________________________________________________________________________
+[ 11848] By: gsar                                  on 2001/09/03  17:07:54
+        Log: integrate change#11847 from maint-5.6
+             
+             typo in perl_clone() code causes local(*foo) breakage in pseudo-fork()
+     Branch: perl
+          ! sv.c
+____________________________________________________________________________
+[ 11847] By: gsar                                  on 2001/09/03  16:47:54
+        Log: typo in perl_clone() code causes local(*foo) breakage in pseudo-fork()
+     Branch: maint-5.6/perl
+          ! sv.c
+____________________________________________________________________________
+[ 11846] By: jhi                                   on 2001/09/03  15:12:58
+        Log: As far as I can tell these functions have been Unicodified.
+     Branch: perl
+          ! doop.c
+____________________________________________________________________________
+[ 11845] By: jhi                                   on 2001/09/03  15:11:27
+        Log: Update to Storable 1.0.13.
+     Branch: perl
+          ! ext/Storable/ChangeLog ext/Storable/Storable.pm
+          ! ext/Storable/Storable.xs
+____________________________________________________________________________
+[ 11844] By: jhi                                   on 2001/09/03  12:42:06
+        Log: Patch the Filter::Simple test to work with
+             the core test suite (since the FilterTest.pm
+             is in t/lib, not in lib).
+     Branch: perl
+          ! lib/Filter/Simple/t/filter.t
+____________________________________________________________________________
+[ 11843] By: jhi                                   on 2001/09/03  12:39:11
+        Log: Damian's Filter::Simple test uses FilterTest, not MyFilter.
+     Branch: perl
+          + t/lib/FilterTest.pm
+          - t/lib/MyFilter.pm
+____________________________________________________________________________
+[ 11842] By: jhi                                   on 2001/09/03  12:17:30
+        Log: Damian-o-rama: upgrade to Attribute::Handlers 0.75,
+             Filter::Simple 0.61, NEXT 0.02, Switch 2.05, and
+             Text::Balanced 1.86.
+     Branch: perl
+          + lib/Attribute/Handlers/t/multi.t lib/Filter/Simple/Changes
+          + lib/Filter/Simple/README lib/Filter/Simple/t/filter.t
+          + lib/NEXT/Changes lib/NEXT/README lib/Switch/t/given.t
+          + lib/Switch/t/nested.t lib/Switch/t/switch.t
+          + lib/Text/Balanced/Changes lib/Text/Balanced/README
+          + lib/Text/Balanced/t/extbrk.t lib/Text/Balanced/t/extcbk.t
+          + lib/Text/Balanced/t/extdel.t lib/Text/Balanced/t/extmul.t
+          + lib/Text/Balanced/t/extqlk.t lib/Text/Balanced/t/exttag.t
+          + lib/Text/Balanced/t/extvar.t lib/Text/Balanced/t/gentag.t
+          - lib/Filter/Simple/test.pl lib/Switch/t/given_when.t
+          - lib/Switch/t/switch_case.t lib/Text/Balanced.pod
+          - lib/Text/Balanced/t/genxt.t lib/Text/Balanced/t/xbrak.t
+          - lib/Text/Balanced/t/xcode.t lib/Text/Balanced/t/xdeli.t
+          - lib/Text/Balanced/t/xmult.t lib/Text/Balanced/t/xquot.t
+          - lib/Text/Balanced/t/xtagg.t lib/Text/Balanced/t/xvari.t
+          ! MANIFEST lib/Attribute/Handlers.pm
+          ! lib/Attribute/Handlers/Changes lib/Attribute/Handlers/README
+          ! lib/Attribute/Handlers/demo/Demo.pm
+          ! lib/Attribute/Handlers/demo/Descriptions.pm
+          ! lib/Attribute/Handlers/demo/MyClass.pm
+          ! lib/Attribute/Handlers/demo/demo.pl
+          ! lib/Attribute/Handlers/demo/demo2.pl
+          ! lib/Attribute/Handlers/demo/demo3.pl
+          ! lib/Attribute/Handlers/demo/demo4.pl
+          ! lib/Attribute/Handlers/demo/demo_call.pl
+          ! lib/Attribute/Handlers/demo/demo_chain.pl
+          ! lib/Attribute/Handlers/demo/demo_cycle.pl
+          ! lib/Attribute/Handlers/demo/demo_hashdir.pl
+          ! lib/Attribute/Handlers/demo/demo_phases.pl
+          ! lib/Attribute/Handlers/demo/demo_range.pl
+          ! lib/Attribute/Handlers/demo/demo_rawdata.pl
+          ! lib/Filter/Simple.pm lib/NEXT.pm lib/NEXT/test.pl
+          ! lib/Switch.pm lib/Switch/Changes lib/Switch/README
+          ! lib/Text/Balanced.pm
+____________________________________________________________________________
+[ 11841] By: sky                                   on 2001/09/03  11:04:15
+        Log: Forgot to add a file with Change #11840
+     Branch: perl
+          + t/op/srand.t
+____________________________________________________________________________
+[ 11840] By: sky                                   on 2001/09/03  11:02:04
+        Log: Subject: [PATCH t/op/srand.t t/op/rand.t pod/perlfunc.pod MANIFEST] Tests for srand()
+             From: Michael G Schwern <schwern@pobox.com>
+             Date: Mon, 3 Sep 2001 07:43:00 -0400
+             Message-ID: <20010903074300.E9233@blackrider>
+     Branch: perl
+          ! MANIFEST pod/perlfunc.pod t/op/rand.t
+____________________________________________________________________________
+[ 11839] By: sky                                   on 2001/09/03  10:47:11
+        Log: Document the changes with regards to running of END blocks.
+             And DESTROY on global objects are called in perl_destruct()!
+     Branch: perl
+          ! pod/perl572delta.pod pod/perlembed.pod
+____________________________________________________________________________
+[ 11838] By: sky                                   on 2001/09/03  09:34:44
+        Log: Subject: [PATCH t/op/time.t] Partial cleanup
+             From: Michael G Schwern <schwern@pobox.com>
+             Date: Mon, 3 Sep 2001 06:29:42 -0400
+             Message-ID: <20010903062942.C9233@blackrider>
+     Branch: perl
+          ! t/op/time.t
+____________________________________________________________________________
+[ 11837] By: sky                                   on 2001/09/03  09:30:02
+        Log: Subject: [PATCH t/op/rand.t] Increase the repetitions
+             From: Michael G Schwern <schwern@pobox.com>
+             Date: Mon, 3 Sep 2001 06:24:13 -0400
+             Message-ID: <20010903062413.B9233@blackrider>
+     Branch: perl
+          ! t/op/rand.t
+____________________________________________________________________________
+[ 11836] By: sky                                   on 2001/09/03  07:56:47
+        Log: Subject: [PATCH] CGI::Cookie, Apache & Switch tests
+             From: Michael G Schwern <schwern@pobox.com>
+             Date: Sun, 2 Sep 2001 21:38:43 -0400
+             Message-ID: <20010902213843.L2711@blackrider>
+     Branch: perl
+          + lib/CGI/t/apache.t lib/CGI/t/cookie.t lib/CGI/t/switch.t
+          ! MANIFEST
+____________________________________________________________________________
+[ 11835] By: nick                                  on 2001/09/03  06:20:06
+        Log: Integrate mainline
+     Branch: perlio
+         +> lib/Shell.t t/op/inccode.t t/run/kill_perl.t
+          - t/op/misc.t
+         !> (integrate 187 files)
+____________________________________________________________________________
+[ 11834] By: jhi                                   on 2001/09/02  13:07:53
+        Log: Update Changes.
+     Branch: perl
+          ! Changes patchlevel.h
+____________________________________________________________________________
 [ 11833] By: jhi                                   on 2001/09/02  12:59:05
         Log: Slight tweaks.
      Branch: perl
index c9152d7..6d6ffa2 100755 (executable)
--- a/Configure
+++ b/Configure
@@ -20,7 +20,7 @@
 
 # $Id: Head.U,v 3.0.1.9 1997/02/28 15:02:09 ram Exp $
 #
-# Generated on Fri Aug 17 15:57:38 EET DST 2001 [metaconfig 3.0 PL70]
+# Generated on Tue Sep 11 04:08:04 EET DST 2001 [metaconfig 3.0 PL70]
 # (with additional metaconfig patches by perlbug@perl.org)
 
 cat >c1$$ <<EOF
@@ -1127,7 +1127,7 @@ case "$sh" in
 esac
 
 case "$sh" in
-'')    cat <<EOM >&2
+'')    cat >&2 <<EOM
 $me:  Fatal Error:  I can't find a Bourne Shell anywhere.  
 
 Usually it's in /bin/sh.  How did you even get this far?
@@ -10787,7 +10787,7 @@ eval $inlibc
 
 : see if prototype for lseek is available
 echo " "
-set d_lseekproto lseek $i_systypes sys/types.h $i_unistd unistd.h
+set lseek d_lseekproto $i_systypes sys/types.h $i_unistd unistd.h
 eval $hasproto
 
 : see if lstat exists
index 3ed233a..1bad4c8 100644 (file)
--- a/MANIFEST
+++ b/MANIFEST
@@ -103,9 +103,10 @@ ext/ByteLoader/byterun.c   Runtime support for bytecode loader
 ext/ByteLoader/byterun.h       Header for byterun.c
 ext/ByteLoader/hints/sunos.pl  Hints for named architecture
 ext/ByteLoader/Makefile.PL     Bytecode loader makefile writer
-ext/Cwd/Cwd.t          See if Cwd works
-ext/Cwd/Cwd.xs         Cwd extension external subroutines
-ext/Cwd/Makefile.PL    Cwd extension makefile maker
+ext/Cwd/Cwd.xs                 Cwd extension external subroutines
+ext/Cwd/Makefile.PL            Cwd extension makefile maker
+ext/Cwd/t/cwd.t                        See if Cwd works
+ext/Cwd/t/taint.t              See if Cwd works with taint
 ext/Data/Dumper/Changes                Data pretty printer, changelog
 ext/Data/Dumper/Dumper.pm      Data pretty printer, module
 ext/Data/Dumper/Dumper.xs      Data pretty printer, externals
@@ -267,6 +268,7 @@ ext/Encode/Encode/iso8859-8.enc     Encoding tables
 ext/Encode/Encode/iso8859-8.ucm        Encoding tables
 ext/Encode/Encode/iso8859-9.enc        Encoding tables
 ext/Encode/Encode/iso8859-9.ucm        Encoding tables
+ext/Encode/Encode/isoir-197.enc        Encoding tables
 ext/Encode/Encode/jis0201.enc  Encoding tables
 ext/Encode/Encode/jis0208.enc  Encoding tables
 ext/Encode/Encode/jis0212.enc  Encoding tables
@@ -282,6 +284,7 @@ ext/Encode/Encode/macIceland.enc    Encoding tables
 ext/Encode/Encode/macJapan.enc Encoding tables
 ext/Encode/Encode/macRoman.enc Encoding tables
 ext/Encode/Encode/macRomania.enc       Encoding tables
+ext/Encode/Encode/macSami.enc  Encoding tables
 ext/Encode/Encode/macThai.enc  Encoding tables
 ext/Encode/Encode/macTurkish.enc       Encoding tables
 ext/Encode/Encode/macUkraine.enc       Encoding tables
@@ -299,10 +302,10 @@ ext/Errno/Errno.t See if Errno works
 ext/Errno/Errno_pm.PL  Errno perl module create script
 ext/Errno/Makefile.PL  Errno extension makefile writer
 ext/Fcntl/Fcntl.pm     Fcntl extension Perl module
-ext/Fcntl/Fcntl.t      See if Fcntl works
 ext/Fcntl/Fcntl.xs     Fcntl extension external subroutines
 ext/Fcntl/Makefile.PL  Fcntl extension makefile writer
-ext/Fcntl/syslfs.t     See if large files work for sysio
+ext/Fcntl/t/fcntl.t    See if Fcntl works
+ext/Fcntl/t/syslfs.t   See if large files work for sysio
 ext/File/Glob/bsd_glob.c       File::Glob extension run time code
 ext/File/Glob/bsd_glob.h       File::Glob extension header file
 ext/File/Glob/Changes          File::Glob extension changelog
@@ -387,6 +390,7 @@ ext/List/Util/t/minstr.t    List::Util
 ext/List/Util/t/readonly.t     Scalar::Util
 ext/List/Util/t/reduce.t       List::Util
 ext/List/Util/t/reftype.t      Scalar::Util
+ext/List/Util/t/shuffle.t      List::Util
 ext/List/Util/t/sum.t          List::Util
 ext/List/Util/t/tainted.t      Scalar::Util
 ext/List/Util/t/weak.t         Scalar::Util
@@ -454,9 +458,9 @@ ext/POSIX/hints/uts.pl              Hint for POSIX for named architecture
 ext/POSIX/Makefile.PL          POSIX extension makefile writer
 ext/POSIX/POSIX.pm             POSIX extension Perl module
 ext/POSIX/POSIX.pod            POSIX extension documentation
-ext/POSIX/POSIX.t              See if POSIX works
 ext/POSIX/POSIX.xs             POSIX extension external subroutines
-ext/POSIX/sigaction.t          See if POSIX::sigaction works
+ext/POSIX/t/posix.t            See if POSIX works
+ext/POSIX/t/sigaction.t                See if POSIX::sigaction works
 ext/POSIX/typemap              POSIX extension interface types
 ext/re/hints/mpeix.pl          Hints for re for named architecture
 ext/re/Makefile.PL             re extension makefile writer
@@ -744,8 +748,8 @@ lib/Attribute/Handlers/demo/demo_range.pl   Attribute::Handlers demo
 lib/Attribute/Handlers/demo/demo_rawdata.pl    Attribute::Handlers demo
 lib/Attribute/Handlers/demo/Descriptions.pm    Attribute::Handlers demo
 lib/Attribute/Handlers/demo/MyClass.pm Attribute::Handlers demo
-lib/Attribute/Handlers/README  Attribute::Handlers
-lib/Attribute/Handlers/test.pl         See if Attribute::Handlers works
+lib/Attribute/Handlers/README          Attribute::Handlers
+lib/Attribute/Handlers/t/multi.t       See if Attribute::Handlers works
 lib/attributes.pm              For "sub foo : attrlist"
 lib/AutoLoader.pm              Autoloader base class
 lib/AutoLoader.t               See if AutoLoader works
@@ -761,6 +765,7 @@ lib/bigint.pl                       An arbitrary precision integer arithmetic package
 lib/bigint.t                   See if bigint.pl works
 lib/bigrat.pl                  An arbitrary precision rational arithmetic package
 lib/blib.pm                    For "use blib"
+lib/blib.t                      blib.pm test
 lib/bytes.pm                   Pragma to enable byte operations
 lib/bytes_heavy.pl             Support routines for byte pragma
 lib/cacheout.pl                        Manages output filehandles when you need too many
@@ -797,11 +802,17 @@ lib/CGI/Fast.pm                   Support for FastCGI (persistent server process)
 lib/CGI/Pretty.pm              Output nicely formatted HTML
 lib/CGI/Push.pm                        Support for server push
 lib/CGI/Switch.pm              Simple interface for multiple server types
+lib/CGI/t/apache.t              See if CGI::Apache still loads
+lib/CGI/t/carp.t                See if CGI::Carp works
+lib/CGI/t/cookie.t              See if CGI::Cookie works
+lib/CGI/t/fast.t               See if CGI::Fast works (if FCGI is installed)
 lib/CGI/t/form.t               See if CGI.pm works
 lib/CGI/t/function.t           See if CGI.pm works
 lib/CGI/t/html.t               See if CGI.pm works
 lib/CGI/t/pretty.t             See if CGI.pm works
+lib/CGI/t/push.t               See if CGI::Push works
 lib/CGI/t/request.t            See if CGI.pm works
+lib/CGI/t/switch.t              See if CGI::Switch still loads
 lib/CGI/t/util.t               See if CGI.pm works
 lib/CGI/Util.pm                        Utility functions
 lib/charnames.pm               Character names
@@ -835,14 +846,15 @@ lib/dumpvar.pl                    A variable dumper
 lib/English.pm                 Readable aliases for short variables
 lib/English.t                  See if English works
 lib/Env.pm                     Map environment into ordinary variables
-lib/Env/array.t                        See if Env works
-lib/Env/env.t                  See if Env works for arrays
+lib/Env/t/array.t              See if Env works for arrays
+lib/Env/t/env.t                        See if Env works
 lib/exceptions.pl              catch and throw routines
 lib/Exporter.pm                        Exporter base class
 lib/Exporter.t                 See if Exporter works
 lib/Exporter/Heavy.pm          Complicated routines for Exporter
 lib/ExtUtils.t                 See if extutils work
 lib/ExtUtils/Command.pm                Utilities for Make on non-UNIX platforms
+lib/ExtUtils/Command.t         See if ExtUtils::Command works (Win32 only)
 lib/ExtUtils/Constant.pm       generate XS code to import C header constants
 lib/ExtUtils/Embed.pm          Utilities for embedding Perl in C programs
 lib/ExtUtils/inst              Give information about installed extensions
@@ -852,6 +864,7 @@ lib/ExtUtils/Liblist.pm             Locates libraries
 lib/ExtUtils/MakeMaker.pm      Write Makefiles for extensions
 lib/ExtUtils/Manifest.pm       Utilities to write MANIFEST files
 lib/ExtUtils/MANIFEST.SKIP     The default MANIFEST.SKIP
+lib/ExtUtils/Manifest.t                See if ExtUtils::Manifest works
 lib/ExtUtils/Mkbootstrap.pm    Writes a bootstrap file (see MakeMaker)
 lib/ExtUtils/Mksymlists.pm     Writes a linker options file for extensions
 lib/ExtUtils/MM_Cygwin.pm      MakeMaker methods for Cygwin
@@ -862,6 +875,7 @@ lib/ExtUtils/MM_VMS.pm              MakeMaker methods for VMS
 lib/ExtUtils/MM_Win32.pm       MakeMaker methods for Win32
 lib/ExtUtils/Packlist.pm       Manipulates .packlist files
 lib/ExtUtils/testlib.pm                Fixes up @INC to use just-built extension
+lib/ExtUtils/testlib.t         Fixes up @INC to use just-built extension
 lib/ExtUtils/typemap           Extension interface types
 lib/ExtUtils/xsubpp            External subroutine preprocessor
 lib/fastcwd.pl                 a faster but more dangerous getcwd
@@ -880,8 +894,8 @@ lib/File/Copy.t                     See if File::Copy works
 lib/File/DosGlob.pm            Win32 DOS-globbing module
 lib/File/DosGlob.t             See if File::DosGlob works
 lib/File/Find.pm               Routines to do a find
-lib/File/Find/find.t           See if File::Find works
-lib/File/Find/taint.t          See if File::Find works with taint
+lib/File/Find/t/find.t         See if File::Find works
+lib/File/Find/t/taint.t                See if File::Find works with taint
 lib/File/Path.pm               Do things like `mkdir -p' and `rm -r'
 lib/File/Path.t                        See if File::Path works
 lib/File/Spec.pm               portable operations on file names
@@ -907,7 +921,9 @@ lib/FileHandle.pm           Backward-compatible front end to IO extension
 lib/FileHandle.t               See if FileHandle works
 lib/filetest.pm                        For "use filetest"
 lib/Filter/Simple.pm           Simple frontend to Filter::Util::Call
-lib/Filter/Simple/test.pl      See if Filter::Simple works
+lib/Filter/Simple/Changes      Filter::Simple
+lib/Filter/Simple/README       Filter::Simple
+lib/Filter/Simple/t/filter.t   See if Filter::Simple works
 lib/find.pl                    A find emulator--used by find2perl
 lib/FindBin.pm                 Find name of currently executing program
 lib/FindBin.t                  See if FindBin works
@@ -938,17 +954,19 @@ lib/I18N/LangTags/README  I18N::LangTags
 lib/I18N/LangTags/test.pl      See if I18N::LangTags works
 lib/importenv.pl               Perl routine to get environment into variables
 lib/integer.pm                 For "use integer"
+lib/integer.t                  For "use integer" testing
 lib/IPC/Open2.pm               Open a two-ended pipe
 lib/IPC/Open2.t                        See if IPC::Open2 works
 lib/IPC/Open3.pm               Open a three-ended pipe!
 lib/IPC/Open3.t                        See if IPC::Open3 works
 lib/IPC/SysV.t                 See if IPC::SysV works
 lib/less.pm                    For "use less"
+lib/less.t                     See if less support works
 lib/lib_pm.PL                  For "use lib", produces lib/lib.pm
+lib/Lingua/KO/Hangul/Util.pm           Lingua::KO::Hangul::Util
 lib/Lingua/KO/Hangul/Util/Changes      Lingua::KO::Hangul::Util
 lib/Lingua/KO/Hangul/Util/README       Lingua::KO::Hangul::Util
 lib/Lingua/KO/Hangul/Util/t/test.t             Lingua::KO::Hangul::Util
-lib/Lingua/KO/Hangul/Util.pm           Lingua::KO::Hangul::Util
 lib/locale.pm                  For "use locale"
 lib/locale.t                   See if locale support works
 lib/Locale/Codes/t/all.t       See if Locale::Codes work
@@ -1050,7 +1068,9 @@ lib/Net/t/require.t               libnet
 lib/Net/t/smtp.t               libnet
 lib/Net/Time.pm                        libnet
 lib/newgetopt.pl               A perl library supporting long option parsing
-lib/NEXT.pm            Pseudo-class NEXT for method redispatch
+lib/NEXT.pm                    Pseudo-class NEXT for method redispatch
+lib/NEXT/Changes               NEXT
+lib/NEXT/README                        NEXT
 lib/NEXT/test.pl               See if NEXT works
 lib/open.pm                    Pragma to specify default I/O disciplines
 lib/open2.pl                   Open a two-ended pipe (uses IPC::Open2)
@@ -1093,10 +1113,11 @@ lib/strict.t                    See if strictures work
 lib/subs.pm                    Declare overriding subs
 lib/subs.t                     See if subroutine pseudo-importation works
 lib/Switch.pm                  Switch for Perl
-lib/Switch/Changes     Switch for Perl
-lib/Switch/README      Switch for Perl
-lib/Switch/t/given_when.t      See if Perl 6 given (switch) works
-lib/Switch/t/switch_case.t     See if Perl 5 switch works
+lib/Switch/Changes             Switch
+lib/Switch/README              Switch
+lib/Switch/t/given.t           See if Perl 6 given (switch) works
+lib/Switch/t/nested.t          See if nested switch works
+lib/Switch/t/switch.t          See if Perl 5 switch works
 lib/Symbol.pm                  Symbol table manipulation routines
 lib/Symbol.t                   See if Symbol works
 lib/syslog.pl                  Perl library supporting syslogging
@@ -1107,27 +1128,33 @@ lib/Term/ANSIColor/README       Term::ANSIColor
 lib/Term/ANSIColor/test.pl     See if Term::ANSIColor works
 lib/Term/Cap.pm                        Perl module supporting termcap usage
 lib/Term/Complete.pm           A command completion subroutine
+lib/Term/Complete.t            See if Term::Complete works
 lib/Term/ReadLine.pm           Stub readline library
 lib/termcap.pl                 Perl library supporting termcap usage
 lib/Test.pm                    A simple framework for writing test scripts
 lib/Test/Harness.pm            A test harness
-lib/Test/Harness.t             See if Test::Harness works
+lib/Test/Harness/Changes       Test::Harness
+lib/Test/Harness/t/base.t      Test::Harness
+lib/Test/Harness/t/ok.t                Test::Harness
+lib/Test/Harness/t/test-harness.t      Test::Harness test
 lib/Test/More.pm                More utilities for writing tests
-lib/Test/More/Changes          Test::More changes
-lib/Test/More/t/fail-like.t     Test::More test, like() and qr// bug
-lib/Test/More/t/fail.t          Test::More test, failing tests
-lib/Test/More/t/More.t          Test::More test, basic operation
-lib/Test/More/t/plan_is_noplan.t        Test::More test, noplan
-lib/Test/More/t/skipall.t       Test::More test, skipping all tests
 lib/Test/Simple.pm              Basic utility for writing tests
 lib/Test/Simple/Changes                Test::Simple changes
 lib/Test/Simple/t/exit.t        Test::Simple test, exit codes
 lib/Test/Simple/t/extra.t       Test::Simple test
+lib/Test/Simple/t/fail-like.t   Test::More test, like() failures
+lib/Test/Simple/t/fail-more.t   Test::More test, tests failing
 lib/Test/Simple/t/fail.t        Test::Simple test, test failures
 lib/Test/Simple/t/missing.t     Test::Simple test, missing tests
+lib/Test/Simple/t/More.t        Test::More test, basic stuff
 lib/Test/Simple/t/no_plan.t     Test::Simple test, forgot the plan
 lib/Test/Simple/t/plan_is_noplan.t      Test::Simple test, no_plan
-lib/Test/Simple/t/simple.t                              for exit.t
+lib/Test/Simple/t/simple.t      Test::Simple test, basic stuff
+lib/Test/Simple/t/skip.t        Test::More test, SKIP tests
+lib/Test/Simple/t/skipall.t     Test::More test, skip all tests
+lib/Test/Simple/t/todo.t        Test::More test, TODO tests
+lib/Test/Simple/t/undef.t       Test::More test, undefs don't cause warnings
+lib/Test/Simple/t/useing.t      Test::More test, compile test
 lib/Test/t/fail.t              See if Test works
 lib/Test/t/mix.t               See if Test works
 lib/Test/t/onfail.t            See if Test works
@@ -1135,18 +1162,21 @@ lib/Test/t/qr.t                 See if Test works
 lib/Test/t/skip.t              See if Test works
 lib/Test/t/success.t           See if Test works
 lib/Test/t/todo.t              See if Test works
+lib/Test/Tutorial.pod           A tutorial on writing tests
+lib/Test/Utils.pm               Utility module for Test::Simple/More
 lib/Text/Abbrev.pm             An abbreviation table builder
 lib/Text/Abbrev.t              Test Text::Abbrev
 lib/Text/Balanced.pm           Text::Balanced
-lib/Text/Balanced.pod          Text::Balanced
-lib/Text/Balanced/t/genxt.t    See if Text::Balanced works
-lib/Text/Balanced/t/xbrak.t    See if Text::Balanced works
-lib/Text/Balanced/t/xcode.t    See if Text::Balanced works
-lib/Text/Balanced/t/xdeli.t    See if Text::Balanced works
-lib/Text/Balanced/t/xmult.t    See if Text::Balanced works
-lib/Text/Balanced/t/xquot.t    See if Text::Balanced works
-lib/Text/Balanced/t/xtagg.t    See if Text::Balanced works
-lib/Text/Balanced/t/xvari.t    See if Text::Balanced works
+lib/Text/Balanced/Changes      Text::Balanced
+lib/Text/Balanced/README       Text::Balanced
+lib/Text/Balanced/t/extbrk.t   See if Text::Balanced works
+lib/Text/Balanced/t/extcbk.t   See if Text::Balanced works
+lib/Text/Balanced/t/extdel.t   See if Text::Balanced works
+lib/Text/Balanced/t/extmul.t   See if Text::Balanced works
+lib/Text/Balanced/t/extqlk.t   See if Text::Balanced works
+lib/Text/Balanced/t/exttag.t   See if Text::Balanced works
+lib/Text/Balanced/t/extvar.t   See if Text::Balanced works
+lib/Text/Balanced/t/gentag.t   See if Text::Balanced works
 lib/Text/ParseWords.pm         Perl module to split words on arbitrary delimiter
 lib/Text/ParseWords.t          See if Text::ParseWords works
 lib/Text/Soundex.pm            Perl module to implement Soundex
@@ -1755,6 +1785,7 @@ pod/perlnumber.pod                Semantics of numbers and numeric operations
 pod/perlobj.pod                        Object info
 pod/perlop.pod                 Operator info
 pod/perlopentut.pod            open() tutorial
+pod/perlothrtut.pod            Threads old tutorial
 pod/perlpod.pod                        Pod info
 pod/perlport.pod               Portability guide
 pod/perlre.pod                 Regular expression info
@@ -1924,29 +1955,32 @@ t/lib/dprof/test6_t             Perl code profiler tests
 t/lib/dprof/test6_v            Perl code profiler tests
 t/lib/dprof/V.pm               Perl code profiler tests
 t/lib/filter-util.pl           See if Filter::Util::Call works
+t/lib/FilterTest.pm            Helper file for lib/Filter/Simple/t/filter.t
 t/lib/h2ph.h                   Test header file for h2ph
 t/lib/h2ph.pht                 Generated output from h2ph.h by h2ph, for comparison
 t/lib/locale/latin1            Part of locale.t in Latin 1
 t/lib/locale/utf8              Part of locale.t in UTF8
-t/lib/MyFilter.pm              Helper file for t/lib/filter-simple.t
 t/lib/sample-tests/bailout             Test data for Test::Harness
 t/lib/sample-tests/combined            Test data for Test::Harness
 t/lib/sample-tests/descriptive         Test data for Test::Harness
 t/lib/sample-tests/duplicates          Test data for Test::Harness
 t/lib/sample-tests/header_at_end       Test data for Test::Harness
+t/lib/sample-tests/header_at_end_fail  Test::Harness
 t/lib/sample-tests/no_nums             Test data for Test::Harness
 t/lib/sample-tests/simple              Test data for Test::Harness
 t/lib/sample-tests/simple_fail         Test data for Test::Harness
 t/lib/sample-tests/skip                        Test data for Test::Harness
 t/lib/sample-tests/skip_all            Test data for Test::Harness
+t/lib/sample-tests/skip_no_msg Test::Harness
 t/lib/sample-tests/todo                        Test data for Test::Harness
+t/lib/sample-tests/todo_inline Test::Harness
 t/lib/sample-tests/with_comments       Test data for Test::Harness
 t/lib/st-dump.pl               See if Storable works
 t/lib/strict/refs              Tests of "use strict 'refs'" for strict.t
 t/lib/strict/subs              Tests of "use strict 'subs'" for strict.t
 t/lib/strict/vars              Tests of "use strict 'vars'" for strict.t
-t/lib/Test/More/Catch.pm        Utility module for testing Test::More
 t/lib/Test/Simple/Catch.pm      Utility module for testing Test::Simple
+t/lib/Test/Simple/Catch/More.pm Utility module for testing Test::More
 t/lib/Test/Simple/sample_tests/death.plx                for exit.t
 t/lib/Test/Simple/sample_tests/death_in_eval.plx        for exit.t
 t/lib/Test/Simple/sample_tests/extras.plx               for exit.t
@@ -2010,6 +2044,7 @@ t/op/cmp.t                        See if the various string and numeric compare work
 t/op/concat.t                  See if string concatenation works
 t/op/cond.t                    See if conditional expressions work
 t/op/context.t                 See if context propagation works
+t/op/crypt.t                   See if crypt works
 t/op/defins.t                  See if auto-insert of defined() works
 t/op/delete.t                  See if delete works
 t/op/die.t                     See if die works
@@ -2061,6 +2096,7 @@ t/op/pat.t                        See if esoteric patterns work
 t/op/pos.t                     See if pos works
 t/op/push.t                    See if push and pop work
 t/op/pwent.t                   See if getpw*() functions work
+t/op/qq.t                      See if qq works
 t/op/quotemeta.t               See if quotemeta works
 t/op/rand.t                    See if rand works
 t/op/range.t                   See if .. works
@@ -2080,6 +2116,7 @@ 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/srand.t                    See if srand works
 t/op/stat.t                    See if stat works
 t/op/study.t                   See if study works
 t/op/subst.t                   See if substitution works
@@ -2289,7 +2326,7 @@ wince/include/sys/types.h         WinCE port
 wince/include/sys/utime.h              WinCE port
 wince/include/time.h                   WinCE port
 wince/Makefile.ce                      WinCE port
-wince/perl.ico                         WinCE port
+wince/makeico.pl                       WinCE port
 wince/perl.rc                          WinCE port
 wince/perldll.def                      WinCE port
 wince/perllib.c                                WinCE port
index f272dff..7acedef 100644 (file)
@@ -16,7 +16,8 @@ O = uav$(_O) udeb$(_O) udoio$(_O) udoop$(_O) udump$(_O) \
        uregcomp$(_O) uregexec$(_O) urun$(_O) \
        uscope$(_O) usv$(_O) utaint$(_O) utoke$(_O) \
        unumeric$(_O) ulocale$(_O) \
-       uuniversal$(_O) uutf8$(_O) uutil$(_O) uperlapi$(_O)
+       uuniversal$(_O) uutf8$(_O) uutil$(_O) uperlapi$(_O) \
+       usharedsv$(_O)
 
 microperl:     $(O)
        $(LD) -o $@ $(O) $(LIBS)
@@ -134,3 +135,6 @@ uutil$(_O): $(HE) util.c
 uperlapi$(_O): $(HE) perlapi.c perlapi.h
        $(CC) -c -o $@ $(CFLAGS) perlapi.c
 
+usharedsv$(_O):        $(HE) sharedsv.c sharedsv.h
+       $(CC) -c -o $@ $(CFLAGS) sharedsv.c
+
index 1d4d194..9997483 100644 (file)
@@ -201,7 +201,7 @@ d_int64_t='undef'
 d_isascii='define'
 d_isfinite='undef'
 d_isinf='undef'
-d_isnan='define'
+d_isnan='undef'
 d_isnanl='undef'
 d_killpg='undef'
 d_lchown='undef'
index f9ae1bf..6f65560 100644 (file)
@@ -48,6 +48,7 @@ struct tms {
 #define HAVE_INTERP_INTERN
 struct interp_intern {
     void *     internal_host;
+    long       perlshell_items;        // For system() ;  Ananth, 3 Sept 2001
 };
 
 /*
@@ -66,6 +67,7 @@ typedef u_int           SOCKET;
 #endif
 
 #define nw_internal_host               (PL_sys_intern.internal_host)
+#define nw_perlshell_items     (PL_sys_intern.perlshell_items)         // For system() ;  Ananth, 3 Sept 2001
 
 EXTERN_C void  Perl_nw5_init(int *argcp, char ***argvp);
 
index 44bb853..5dd8927 100644 (file)
@@ -879,7 +879,70 @@ do_aspawn(void *vreally, void **vmark, void **vsp)
        // This feature needs to be implemented.
        // _asm is commented out since it goes into the internal debugger.
 //     _asm {int 3};
-       return(0);
+////   return(0);
+
+
+       // This below code is required for system() call.
+       // Otherwise system() does not work on NetWare.
+       // Ananth, 3 Sept 2001
+
+    dTHX;
+    SV *really = (SV*)vreally;
+    SV **mark = (SV**)vmark;
+    SV **sp = (SV**)vsp;
+    char **argv;
+    char *str;
+    int status;
+    int flag = P_WAIT;
+    int index = 0;
+
+
+    if (sp <= mark)
+       return -1;
+
+       nw_perlshell_items = 0; // No Shell
+    New(1306, argv, (sp - mark) + nw_perlshell_items + 3, char*);
+
+    if (SvNIOKp(*(mark+1)) && !SvPOKp(*(mark+1))) {
+       ++mark;
+       flag = SvIVx(*mark);
+    }
+
+    while (++mark <= sp) {
+       if (*mark && (str = (char *)SvPV_nolen(*mark)))
+       {
+           argv[index] = str;
+               index++;
+       }
+       else
+       {
+               argv[index] = "";
+//             argv[index] = '\0';
+               index++;
+    }
+       }
+    argv[index] = '\0';
+       index++;
+
+    status = nw_spawnvp(flag,
+                          (char*)(really ? SvPV_nolen(really) : argv[0]),
+                          (char**)argv);
+
+
+    if (flag != P_NOWAIT) {
+       if (status < 0) {
+           dTHR;
+           if (ckWARN(WARN_EXEC))
+               Perl_warner(aTHX_ WARN_EXEC, "Can't spawn \"%s\": %s", argv[0], strerror(errno));
+           status = 255 * 256;
+       }
+       else
+           status *= 256;
+       PL_statusvalue = status;
+    }
+
+    Safefree(argv);
+    return (status);
 }
 
 int
index 58e1596..930273b 100644 (file)
 
 typedef long perl_key;
 
+// The line below is just a definition to avoid compilation error.
+// It is not being used anywhere.
+// Ananth, 3 Sept 2001
+typedef struct nw_cond { long waiters; unsigned int sem; } perl_cond;
+
 #if (defined (USE_ITHREADS) || defined (USE_5005THREADS)) && defined(MPK_ON)
 #ifdef __cplusplus
 extern "C"
index a706e72..3ffbdcc 100644 (file)
@@ -3867,7 +3867,7 @@ usesocks (usesocks.U):
        and indicates that Perl should be built to use SOCKS.
 
 usethreads (usethreads.U):
-       This variable conditionally defines the USE_5005THREADS symbol,
+       This variable conditionally defines the USE_THREADS symbol,
        and indicates that Perl should be built to use threads.
 
 usevendorprefix (vendorprefix.U):
index 2a0bafe..e41896d 100644 (file)
@@ -8,7 +8,7 @@
 
 # Package name      : perl5
 # Source directory  : .
-# Configuration time: Sat Aug 11 03:31:31 EET DST 2001
+# Configuration time: Tue Sep 11 04:09:55 EET DST 2001
 # Configured by     : jhi
 # Target system     : osf1 alpha.hut.fi v4.0 878 alpha 
 
@@ -56,14 +56,14 @@ cat='cat'
 cc='cc'
 cccdlflags=' '
 ccdlflags='  -Wl,-rpath,/opt/perl/lib/5.7.2/alpha-dec_osf/CORE'
-ccflags='-std -D_INTRINSICS -DLANGUAGE_C'
+ccflags='-std -D_INTRINSICS -fprm d -ieee -DLANGUAGE_C'
 ccflags_uselargefiles=''
 ccname='cc'
 ccsymbols='__alpha=1 __LANGUAGE_C__=1 __osf__=1 __unix__=1 _LONGLONG=1 _SYSTYPE_BSD=1 SYSTYPE_BSD=1 unix=1'
 ccversion='V5.6-082'
 cf_by='jhi'
 cf_email='yourname@yourhost.yourplace.com'
-cf_time='Sat Aug 11 03:31:31 EET DST 2001'
+cf_time='Tue Sep 11 04:09:55 EET DST 2001'
 charsize='1'
 chgrp=''
 chmod='chmod'
@@ -77,7 +77,7 @@ cpio=''
 cpp='cpp'
 cpp_stuff='42'
 cppccsymbols='LANGUAGE_C=1'
-cppflags='-std -D_INTRINSICS -DLANGUAGE_C'
+cppflags='-std -D_INTRINSICS -ieee -DLANGUAGE_C'
 cpplast=''
 cppminus=''
 cpprun='/usr/bin/cpp'
@@ -233,7 +233,7 @@ d_locconv='define'
 d_lockf='define'
 d_longdbl='define'
 d_longlong='define'
-d_lseekproto='define'
+d_lseekproto=''
 d_lstat='define'
 d_madvise='define'
 d_mblen='define'
@@ -686,7 +686,7 @@ patchlevel='7'
 path_sep=':'
 perl5='perl'
 perl=''
-perl_patchlevel='11625'
+perl_patchlevel='11978'
 perladmin='yourname@yourhost.yourplace.com'
 perllibs='-lm -liconv -lutil'
 perlpath='/opt/perl/bin/perl'
@@ -854,7 +854,7 @@ vendorlibexp=''
 vendorprefix=''
 vendorprefixexp=''
 version='5.7.2'
-version_patchlevel_string='version 7 subversion 2 patch 11625'
+version_patchlevel_string='version 7 subversion 2 patch 11978'
 versiononly='define'
 vi=''
 voidflags='15'
@@ -884,7 +884,7 @@ PERL_SUBVERSION=2
 PERL_API_REVISION=5
 PERL_API_VERSION=5
 PERL_API_SUBVERSION=0
-PERL_PATCHLEVEL=11625
+PERL_PATCHLEVEL=11978
 PERL_CONFIG_SH=true
 # Variables propagated from previous config.sh file.
 pp_sys_cflags='ccflags="$ccflags -DNO_EFF_ONLY_OK"'
index ab8b863..4634447 100644 (file)
@@ -17,7 +17,7 @@
 /*
  * Package name      : perl5
  * Source directory  : .
- * Configuration time: Thu Aug  9 16:48:44 EET DST 2001
+ * Configuration time: Tue Sep 11 04:09:55 EET DST 2001
  * Configured by     : jhi
  * Target system     : osf1 alpha.hut.fi v4.0 878 alpha 
  */
 #define        _(args) ()
 #endif
 
-/* SH_PATH:
- *     This symbol contains the full pathname to the shell used on this
- *     on this system to execute Bourne shell scripts.  Usually, this will be
- *     /bin/sh, though it's possible that some systems will have /bin/ksh,
- *     /bin/pdksh, /bin/ash, /bin/bash, or even something such as
- *     D:/bin/sh.exe.
- */
-#define SH_PATH "/bin/sh"  /**/
-
 /* INTSIZE:
  *     This symbol contains the value of sizeof(int) so that the C
  *     preprocessor can make decisions based on it.
  */
 /*#define HAS_FPCLASSIFY               / **/
 
-/* HAS_FPCLASSL:
- *     This symbol, if defined, indicates that the fpclassl routine is
- *     available to classify long doubles.  Available for example in IRIX.
- *     The returned values are defined in <ieeefp.h> and are:
- *
- *     FP_SNAN         signaling NaN
- *     FP_QNAN         quiet NaN
- *     FP_NINF         negative infinity
- *     FP_PINF         positive infinity
- *     FP_NDENORM      negative denormalized non-zero
- *     FP_PDENORM      positive denormalized non-zero
- *     FP_NZERO        negative zero
- *     FP_PZERO        positive zero
- *     FP_NNORM        negative normalized non-zero
- *     FP_PNORM        positive normalized non-zero
- */
-/*#define HAS_FPCLASSL         / **/
-
 /* HAS_FPOS64_T:
  *     This symbol will be defined if the C compiler supports fpos64_t.
  */
  *     to the program to supply one.  A good guess is
  *             extern off_t lseek(int, off_t, int);
  */
-#define        HAS_LSEEK_PROTO /**/
+#      HAS_LSEEK_PROTO /**/
 
 /* HAS_MADVISE:
  *     This symbol, if defined, indicates that the madvise system call is
 /*#define      USE_5005THREADS         / **/
 /*#define      USE_ITHREADS            / **/
 #if defined(USE_5005THREADS) && !defined(USE_ITHREADS)
-#define                USE_5005THREADS         /* until src is revised*/
+#define                USE_THREADS             /* until src is revised*/
 #endif
 /*#define      OLD_PTHREADS_API                / **/
 /*#define      USE_REENTRANT_API       / **/
 #define I_STDARG               /**/
 /*#define I_VARARGS    / **/
 
+/* SH_PATH:
+ *     This symbol contains the full pathname to the shell used on this
+ *     on this system to execute Bourne shell scripts.  Usually, this will be
+ *     /bin/sh, though it's possible that some systems will have /bin/ksh,
+ *     /bin/pdksh, /bin/ash, /bin/bash, or even something such as
+ *     D:/bin/sh.exe.
+ */
+#define SH_PATH "/bin/sh"  /**/
+
 /* USE_CROSS_COMPILE:
  *     This symbol, if defined, indicates that Perl is being cross-compiled.
  */
  */
 /*#define      HAS_FLOCK_PROTO / **/
 
+/* HAS_FPCLASSL:
+ *     This symbol, if defined, indicates that the fpclassl routine is
+ *     available to classify long doubles.  Available for example in IRIX.
+ *     The returned values are defined in <ieeefp.h> and are:
+ *
+ *     FP_SNAN         signaling NaN
+ *     FP_QNAN         quiet NaN
+ *     FP_NINF         negative infinity
+ *     FP_PINF         positive infinity
+ *     FP_NDENORM      negative denormalized non-zero
+ *     FP_PDENORM      positive denormalized non-zero
+ *     FP_NZERO        negative zero
+ *     FP_PZERO        positive zero
+ *     FP_NNORM        negative normalized non-zero
+ *     FP_PNORM        positive normalized non-zero
+ */
+/*#define HAS_FPCLASSL         / **/
+
 /* HAS_NL_LANGINFO:
  *     This symbol, if defined, indicates that the nl_langinfo routine is
  *     available to return local data.  You will also need <langinfo.h>
index 0ef144a..a816c48 100644 (file)
@@ -729,15 +729,33 @@ produced by this process.
 
 A more accurate approach is the following commands:
 
-    sh Configure -des -Dccflags=-Wformat ...
-    make miniperl              # without -DCHECK_FORMAT
-    perl -i.orig -pwe 's/-Wformat/-DCHECK_FORMAT $&/' config.sh
-    sh Configure -S
-    make >& make.log           # build from correct miniperl
+=over 4
+
+=item *
+
+build miniperl with -DCHECK_FORMAT 
+
+    make clean
+    make miniperl OPTIMIZE=-DCHECK_FORMAT >& mini.log  
+
+=item *
+
+build a clean miniperl,
+and build everything else from that with -DCHECK_FORMAT
+
     make clean
-    make miniperl >& mini.log  # build miniperl with -DCHECK_FORMAT 
-    perl -nwe 'print if /^\S+:/ and not /^make\b/' mini.log make.log
+    make miniperl      
+    make all OPTIMIZE=-DCHECK_FORMAT >& make.log  
+               
+=item *
+
+clean up, and print warnings from the log files
+
     make clean
+    perl -nwe 'print if /^\S+:/ and not /^make\b/' \
+       mini.log make.log
+
+=back
 
 (-Wformat support by Robin Barker.)
 
index 2aa9fb0..259e04e 100644 (file)
@@ -197,7 +197,7 @@ non-default location for where Perl will be installed:
     @ Configure "-d" "-Dprefix=dka100:[utils.perl5.]"
 
 Note that the installation location would be by default where you unpacked 
-the source with a "ROOT." appended.  For example if you unpacked the perl 
+the source with a "_ROOT." appended.  For example if you unpacked the perl 
 source into:
 
    DKA200:[PERL-5_10_2...]
@@ -205,7 +205,7 @@ source into:
 Then the PERL_SETUP.COM that gets written out by Configure.com will
 try to DEFINE your installation PERL_ROOT to be:
 
-   DKA200:[PERL-5_10_2ROOT.]
+   DKA200:[PERL-5_10_2_ROOT.]
 
 More help with configure.com is available from:
 
index 9290b75..b39be3b 100644 (file)
@@ -946,15 +946,6 @@ sed <<!GROK!THIS! >$CONFIG_H -e 's!^#undef\(.*/\)\*!/\*#define\1 \*!' -e 's!^#un
 #define        _(args) ()
 #endif
 
-/* SH_PATH:
- *     This symbol contains the full pathname to the shell used on this
- *     on this system to execute Bourne shell scripts.  Usually, this will be
- *     /bin/sh, though it's possible that some systems will have /bin/ksh,
- *     /bin/pdksh, /bin/ash, /bin/bash, or even something such as
- *     D:/bin/sh.exe.
- */
-#define SH_PATH "$sh"  /**/
-
 /* INTSIZE:
  *     This symbol contains the value of sizeof(int) so that the C
  *     preprocessor can make decisions based on it.
@@ -1411,24 +1402,6 @@ sed <<!GROK!THIS! >$CONFIG_H -e 's!^#undef\(.*/\)\*!/\*#define\1 \*!' -e 's!^#un
  */
 #$d_fpclassify HAS_FPCLASSIFY          /**/
 
-/* HAS_FPCLASSL:
- *     This symbol, if defined, indicates that the fpclassl routine is
- *     available to classify long doubles.  Available for example in IRIX.
- *     The returned values are defined in <ieeefp.h> and are:
- *
- *     FP_SNAN         signaling NaN
- *     FP_QNAN         quiet NaN
- *     FP_NINF         negative infinity
- *     FP_PINF         positive infinity
- *     FP_NDENORM      negative denormalized non-zero
- *     FP_PDENORM      positive denormalized non-zero
- *     FP_NZERO        negative zero
- *     FP_PZERO        positive zero
- *     FP_NNORM        negative normalized non-zero
- *     FP_PNORM        positive normalized non-zero
- */
-#$d_fpclassl HAS_FPCLASSL              /**/
-
 /* HAS_FPOS64_T:
  *     This symbol will be defined if the C compiler supports fpos64_t.
  */
@@ -3494,6 +3467,15 @@ sed <<!GROK!THIS! >$CONFIG_H -e 's!^#undef\(.*/\)\*!/\*#define\1 \*!' -e 's!^#un
 #$i_stdarg I_STDARG            /**/
 #$i_varargs I_VARARGS  /**/
 
+/* SH_PATH:
+ *     This symbol contains the full pathname to the shell used on this
+ *     on this system to execute Bourne shell scripts.  Usually, this will be
+ *     /bin/sh, though it's possible that some systems will have /bin/ksh,
+ *     /bin/pdksh, /bin/ash, /bin/bash, or even something such as
+ *     D:/bin/sh.exe.
+ */
+#define SH_PATH "$sh"  /**/
+
 /* USE_CROSS_COMPILE:
  *     This symbol, if defined, indicates that Perl is being cross-compiled.
  */
@@ -3522,6 +3504,24 @@ sed <<!GROK!THIS! >$CONFIG_H -e 's!^#undef\(.*/\)\*!/\*#define\1 \*!' -e 's!^#un
  */
 #$d_flockproto HAS_FLOCK_PROTO /**/
 
+/* HAS_FPCLASSL:
+ *     This symbol, if defined, indicates that the fpclassl routine is
+ *     available to classify long doubles.  Available for example in IRIX.
+ *     The returned values are defined in <ieeefp.h> and are:
+ *
+ *     FP_SNAN         signaling NaN
+ *     FP_QNAN         quiet NaN
+ *     FP_NINF         negative infinity
+ *     FP_PINF         positive infinity
+ *     FP_NDENORM      negative denormalized non-zero
+ *     FP_PDENORM      positive denormalized non-zero
+ *     FP_NZERO        negative zero
+ *     FP_PZERO        positive zero
+ *     FP_NNORM        negative normalized non-zero
+ *     FP_PNORM        positive normalized non-zero
+ */
+#$d_fpclassl HAS_FPCLASSL              /**/
+
 /* HAS_NL_LANGINFO:
  *     This symbol, if defined, indicates that the nl_langinfo routine is
  *     available to return local data.  You will also need <langinfo.h>
index f147e0e..6d5add8 100644 (file)
@@ -1134,8 +1134,8 @@ $ THEN
 $   prefix = F$ENVIRONMENT("DEFAULT") - ".UU]" + "]"
 $   prefix = F$PARSE(prefix,,,,"NO_CONCEAL") - "][" - ".;"
 $   prefixbase = prefix - "]"
-$!  Add ROOT to make install PERL_ROOT differ from build directory.
-$   prefix = prefixbase + "ROOT.]"
+$!  Add _ROOT to make install PERL_ROOT differ from build directory.
+$   prefix = prefixbase + "_ROOT.]"
 $ ENDIF
 $ src = prefix
 $!: determine root of directory hierarchy where package will be installed.
diff --git a/cop.h b/cop.h
index 1e0e5d8..9f17b2c 100644 (file)
--- a/cop.h
+++ b/cop.h
@@ -202,7 +202,7 @@ struct block_loop {
 #  define CxITERVAR(c)                                                 \
        ((c)->blk_loop.iterdata                                         \
         ? (CxPADLOOP(cx)                                               \
-           ? &((c)->blk_loop.oldcurpad)[(PADOFFSET)(c)->blk_loop.iterdata]     \
+           ? &((c)->blk_loop.oldcurpad)[INT2PTR(PADOFFSET, (c)->blk_loop.iterdata)] \
            : &GvSV((GV*)(c)->blk_loop.iterdata))                       \
         : (SV**)NULL)
 #  define CX_ITERDATA_SET(cx,idata)                                    \
diff --git a/doop.c b/doop.c
index 560dbe2..8600b7c 100644 (file)
--- a/doop.c
+++ b/doop.c
@@ -92,7 +92,7 @@ S_do_trans_simple(pTHX_ SV *sv)
 }
 
 STATIC I32
-S_do_trans_count(pTHX_ SV *sv)/* SPC - OK */
+S_do_trans_count(pTHX_ SV *sv)
 {
     U8 *s;
     U8 *send;
@@ -130,7 +130,7 @@ S_do_trans_count(pTHX_ SV *sv)/* SPC - OK */
 }
 
 STATIC I32
-S_do_trans_complex(pTHX_ SV *sv)/* SPC - NOT OK */
+S_do_trans_complex(pTHX_ SV *sv)
 {
     U8 *s;
     U8 *send;
@@ -292,7 +292,7 @@ S_do_trans_complex(pTHX_ SV *sv)/* SPC - NOT OK */
 }
 
 STATIC I32
-S_do_trans_simple_utf8(pTHX_ SV *sv)/* SPC - OK */
+S_do_trans_simple_utf8(pTHX_ SV *sv)
 {
     U8 *s;
     U8 *send;
@@ -391,7 +391,7 @@ S_do_trans_simple_utf8(pTHX_ SV *sv)/* SPC - OK */
 }
 
 STATIC I32
-S_do_trans_count_utf8(pTHX_ SV *sv)/* SPC - OK */
+S_do_trans_count_utf8(pTHX_ SV *sv)
 {
     U8 *s;
     U8 *start = 0, *send;
@@ -431,7 +431,7 @@ S_do_trans_count_utf8(pTHX_ SV *sv)/* SPC - OK */
 }
 
 STATIC I32
-S_do_trans_complex_utf8(pTHX_ SV *sv) /* SPC - NOT OK */
+S_do_trans_complex_utf8(pTHX_ SV *sv)
 {
     U8 *s;
     U8 *start, *send;
diff --git a/embed.h b/embed.h
index e47bb59..ebdac34 100644 (file)
--- a/embed.h
+++ b/embed.h
 #define vload_module           Perl_vload_module
 #define localize               Perl_localize
 #define looks_like_number      Perl_looks_like_number
+#define grok_bin               Perl_grok_bin
+#define grok_hex               Perl_grok_hex
 #define grok_number            Perl_grok_number
 #define grok_numeric_radix     Perl_grok_numeric_radix
+#define grok_oct               Perl_grok_oct
 #define magic_clearenv         Perl_magic_clearenv
 #define magic_clear_all_env    Perl_magic_clear_all_env
 #define magic_clearpack                Perl_magic_clearpack
 #define sv_2iv                 Perl_sv_2iv
 #define sv_2mortal             Perl_sv_2mortal
 #define sv_2nv                 Perl_sv_2nv
+#define sv_2pv                 Perl_sv_2pv
 #define sv_2pvutf8             Perl_sv_2pvutf8
 #define sv_2pvbyte             Perl_sv_2pvbyte
+#define sv_pvn_nomg            Perl_sv_pvn_nomg
 #define sv_2uv                 Perl_sv_2uv
 #define sv_iv                  Perl_sv_iv
 #define sv_uv                  Perl_sv_uv
 #define sv_catpvf              Perl_sv_catpvf
 #define sv_vcatpvf             Perl_sv_vcatpvf
 #define sv_catpv               Perl_sv_catpv
+#define sv_catpvn              Perl_sv_catpvn
+#define sv_catsv               Perl_sv_catsv
 #define sv_chop                        Perl_sv_chop
 #define sv_clean_all           Perl_sv_clean_all
 #define sv_clean_objs          Perl_sv_clean_objs
 #define sv_peek                        Perl_sv_peek
 #define sv_pos_u2b             Perl_sv_pos_u2b
 #define sv_pos_b2u             Perl_sv_pos_b2u
+#define sv_pvn_force           Perl_sv_pvn_force
 #define sv_pvutf8n_force       Perl_sv_pvutf8n_force
 #define sv_pvbyten_force       Perl_sv_pvbyten_force
 #define sv_reftype             Perl_sv_reftype
 #define sv_setref_pvn          Perl_sv_setref_pvn
 #define sv_setpv               Perl_sv_setpv
 #define sv_setpvn              Perl_sv_setpvn
+#define sv_setsv               Perl_sv_setsv
 #define sv_taint               Perl_sv_taint
 #define sv_tainted             Perl_sv_tainted
 #define sv_unmagic             Perl_sv_unmagic
 #define sv_pv                  Perl_sv_pv
 #define sv_pvutf8              Perl_sv_pvutf8
 #define sv_pvbyte              Perl_sv_pvbyte
+#define sv_utf8_upgrade                Perl_sv_utf8_upgrade
 #define sv_utf8_downgrade      Perl_sv_utf8_downgrade
 #define sv_utf8_encode         Perl_sv_utf8_encode
 #define sv_utf8_decode         Perl_sv_utf8_decode
 #define vload_module(a,b,c,d)  Perl_vload_module(aTHX_ a,b,c,d)
 #define localize(a,b)          Perl_localize(aTHX_ a,b)
 #define looks_like_number(a)   Perl_looks_like_number(aTHX_ a)
+#define grok_bin(a,b,c,d)      Perl_grok_bin(aTHX_ a,b,c,d)
+#define grok_hex(a,b,c,d)      Perl_grok_hex(aTHX_ a,b,c,d)
 #define grok_number(a,b,c)     Perl_grok_number(aTHX_ a,b,c)
 #define grok_numeric_radix(a,b)        Perl_grok_numeric_radix(aTHX_ a,b)
+#define grok_oct(a,b,c,d)      Perl_grok_oct(aTHX_ a,b,c,d)
 #define magic_clearenv(a,b)    Perl_magic_clearenv(aTHX_ a,b)
 #define magic_clear_all_env(a,b)       Perl_magic_clear_all_env(aTHX_ a,b)
 #define magic_clearpack(a,b)   Perl_magic_clearpack(aTHX_ a,b)
 #define sv_2iv(a)              Perl_sv_2iv(aTHX_ a)
 #define sv_2mortal(a)          Perl_sv_2mortal(aTHX_ a)
 #define sv_2nv(a)              Perl_sv_2nv(aTHX_ a)
+#define sv_2pv(a,b)            Perl_sv_2pv(aTHX_ a,b)
 #define sv_2pvutf8(a,b)                Perl_sv_2pvutf8(aTHX_ a,b)
 #define sv_2pvbyte(a,b)                Perl_sv_2pvbyte(aTHX_ a,b)
+#define sv_pvn_nomg(a,b)       Perl_sv_pvn_nomg(aTHX_ a,b)
 #define sv_2uv(a)              Perl_sv_2uv(aTHX_ a)
 #define sv_iv(a)               Perl_sv_iv(aTHX_ a)
 #define sv_uv(a)               Perl_sv_uv(aTHX_ a)
 #define sv_bless(a,b)          Perl_sv_bless(aTHX_ a,b)
 #define sv_vcatpvf(a,b,c)      Perl_sv_vcatpvf(aTHX_ a,b,c)
 #define sv_catpv(a,b)          Perl_sv_catpv(aTHX_ a,b)
+#define sv_catpvn(a,b,c)       Perl_sv_catpvn(aTHX_ a,b,c)
+#define sv_catsv(a,b)          Perl_sv_catsv(aTHX_ a,b)
 #define sv_chop(a,b)           Perl_sv_chop(aTHX_ a,b)
 #define sv_clean_all()         Perl_sv_clean_all(aTHX)
 #define sv_clean_objs()                Perl_sv_clean_objs(aTHX)
 #define sv_peek(a)             Perl_sv_peek(aTHX_ a)
 #define sv_pos_u2b(a,b,c)      Perl_sv_pos_u2b(aTHX_ a,b,c)
 #define sv_pos_b2u(a,b)                Perl_sv_pos_b2u(aTHX_ a,b)
+#define sv_pvn_force(a,b)      Perl_sv_pvn_force(aTHX_ a,b)
 #define sv_pvutf8n_force(a,b)  Perl_sv_pvutf8n_force(aTHX_ a,b)
 #define sv_pvbyten_force(a,b)  Perl_sv_pvbyten_force(aTHX_ a,b)
 #define sv_reftype(a,b)                Perl_sv_reftype(aTHX_ a,b)
 #define sv_setref_pvn(a,b,c,d) Perl_sv_setref_pvn(aTHX_ a,b,c,d)
 #define sv_setpv(a,b)          Perl_sv_setpv(aTHX_ a,b)
 #define sv_setpvn(a,b,c)       Perl_sv_setpvn(aTHX_ a,b,c)
+#define sv_setsv(a,b)          Perl_sv_setsv(aTHX_ a,b)
 #define sv_taint(a)            Perl_sv_taint(aTHX_ a)
 #define sv_tainted(a)          Perl_sv_tainted(aTHX_ a)
 #define sv_unmagic(a,b)                Perl_sv_unmagic(aTHX_ a,b)
 #define sv_pv(a)               Perl_sv_pv(aTHX_ a)
 #define sv_pvutf8(a)           Perl_sv_pvutf8(aTHX_ a)
 #define sv_pvbyte(a)           Perl_sv_pvbyte(aTHX_ a)
+#define sv_utf8_upgrade(a)     Perl_sv_utf8_upgrade(aTHX_ a)
 #define sv_utf8_downgrade(a,b) Perl_sv_utf8_downgrade(aTHX_ a,b)
 #define sv_utf8_encode(a)      Perl_sv_utf8_encode(aTHX_ a)
 #define sv_utf8_decode(a)      Perl_sv_utf8_decode(aTHX_ a)
 #if defined(PERL_IN_TOKE_C) || defined(PERL_DECL_PROT)
 #define check_uni()            S_check_uni(aTHX)
 #define force_next(a)          S_force_next(aTHX_ a)
-#define force_version(a)       S_force_version(aTHX_ a)
+#define force_version(a,b)     S_force_version(aTHX_ a,b)
 #define force_word(a,b,c,d,e)  S_force_word(aTHX_ a,b,c,d,e)
 #define tokeq(a)               S_tokeq(aTHX_ a)
 #define pending_ident()                S_pending_ident(aTHX)
index 8460561..bbb03c3 100755 (executable)
--- a/embed.pl
+++ b/embed.pl
@@ -1404,8 +1404,11 @@ Apd      |void   |load_module|U32 flags|SV* name|SV* ver|...
 Ap     |void   |vload_module|U32 flags|SV* name|SV* ver|va_list* args
 p      |OP*    |localize       |OP* arg|I32 lexical
 Apd    |I32    |looks_like_number|SV* sv
+Apd    |UV     |grok_bin       |char* start|STRLEN* len|I32* flags|NV *result
+Apd    |UV     |grok_hex       |char* start|STRLEN* len|I32* flags|NV *result
 Apd    |int    |grok_number    |const char *pv|STRLEN len|UV *valuep
 Apd    |bool   |grok_numeric_radix|const char **sp|const char *send
+Apd    |UV     |grok_oct       |char* start|STRLEN* len|I32* flags|NV *result
 p      |int    |magic_clearenv |SV* sv|MAGIC* mg
 p      |int    |magic_clear_all_env|SV* sv|MAGIC* mg
 p      |int    |magic_clearpack|SV* sv|MAGIC* mg
@@ -1694,10 +1697,10 @@ p       |OP*    |scalar         |OP* o
 p      |OP*    |scalarkids     |OP* o
 p      |OP*    |scalarseq      |OP* o
 p      |OP*    |scalarvoid     |OP* o
-Ap     |NV     |scan_bin       |char* start|STRLEN len|STRLEN* retlen
-Ap     |NV     |scan_hex       |char* start|STRLEN len|STRLEN* retlen
+Apd    |NV     |scan_bin       |char* start|STRLEN len|STRLEN* retlen
+Apd    |NV     |scan_hex       |char* start|STRLEN len|STRLEN* retlen
 Ap     |char*  |scan_num       |char* s|YYSTYPE *lvalp
-Ap     |NV     |scan_oct       |char* start|STRLEN len|STRLEN* retlen
+Apd    |NV     |scan_oct       |char* start|STRLEN len|STRLEN* retlen
 p      |OP*    |scope          |OP* o
 Ap     |char*  |screaminstr    |SV* bigsv|SV* littlesv|I32 start_shift \
                                |I32 end_shift|I32 *state|I32 last
@@ -1717,9 +1720,10 @@ Apd      |IO*    |sv_2io         |SV* sv
 Apd    |IV     |sv_2iv         |SV* sv
 Apd    |SV*    |sv_2mortal     |SV* sv
 Apd    |NV     |sv_2nv         |SV* sv
-Aop    |char*  |sv_2pv         |SV* sv|STRLEN* lp
+A    |char*  |sv_2pv         |SV* sv|STRLEN* lp
 Apd    |char*  |sv_2pvutf8     |SV* sv|STRLEN* lp
 Apd    |char*  |sv_2pvbyte     |SV* sv|STRLEN* lp
+Ap     |char*  |sv_pvn_nomg    |SV* sv|STRLEN* lp
 Apd    |UV     |sv_2uv         |SV* sv
 Apd    |IV     |sv_iv          |SV* sv
 Apd    |UV     |sv_uv          |SV* sv
@@ -1734,8 +1738,8 @@ Apd       |SV*    |sv_bless       |SV* sv|HV* stash
 Afpd   |void   |sv_catpvf      |SV* sv|const char* pat|...
 Ap     |void   |sv_vcatpvf     |SV* sv|const char* pat|va_list* args
 Apd    |void   |sv_catpv       |SV* sv|const char* ptr
-Aopd   |void   |sv_catpvn      |SV* sv|const char* ptr|STRLEN len
-Aopd   |void   |sv_catsv       |SV* dsv|SV* ssv
+Apd    |void   |sv_catpvn      |SV* sv|const char* ptr|STRLEN len
+Apd    |void   |sv_catsv       |SV* dsv|SV* ssv
 Apd    |void   |sv_chop        |SV* sv|char* ptr
 pd     |I32    |sv_clean_all
 pd     |void   |sv_clean_objs
@@ -1770,7 +1774,7 @@ Apd       |SV*    |sv_newref      |SV* sv
 Ap     |char*  |sv_peek        |SV* sv
 Apd    |void   |sv_pos_u2b     |SV* sv|I32* offsetp|I32* lenp
 Apd    |void   |sv_pos_b2u     |SV* sv|I32* offsetp
-Aopd   |char*  |sv_pvn_force   |SV* sv|STRLEN* lp
+Apd    |char*  |sv_pvn_force   |SV* sv|STRLEN* lp
 Apd    |char*  |sv_pvutf8n_force|SV* sv|STRLEN* lp
 Apd    |char*  |sv_pvbyten_force|SV* sv|STRLEN* lp
 Apd    |char*  |sv_reftype     |SV* sv|int ob
@@ -1791,7 +1795,7 @@ Apd       |SV*    |sv_setref_pvn  |SV* rv|const char* classname|char* pv \
                                |STRLEN n
 Apd    |void   |sv_setpv       |SV* sv|const char* ptr
 Apd    |void   |sv_setpvn      |SV* sv|const char* ptr|STRLEN len
-Aopd   |void   |sv_setsv       |SV* dsv|SV* ssv
+Apd    |void   |sv_setsv       |SV* dsv|SV* ssv
 Apd    |void   |sv_taint       |SV* sv
 Apd    |bool   |sv_tainted     |SV* sv
 Apd    |int    |sv_unmagic     |SV* sv|int type
@@ -1922,7 +1926,7 @@ Apd       |char*  |sv_2pvbyte_nolen|SV* sv
 Apd    |char*  |sv_pv          |SV *sv
 Apd    |char*  |sv_pvutf8      |SV *sv
 Apd    |char*  |sv_pvbyte      |SV *sv
-Aopd   |STRLEN |sv_utf8_upgrade|SV *sv
+Apd    |STRLEN |sv_utf8_upgrade|SV *sv
 ApdM   |bool   |sv_utf8_downgrade|SV *sv|bool fail_ok
 Apd    |void   |sv_utf8_encode |SV *sv
 ApdM   |bool   |sv_utf8_decode |SV *sv
@@ -1963,10 +1967,10 @@ Ap      |void   |ptr_table_free|PTR_TBL_t *tbl
 Ap     |void   |sys_intern_clear
 Ap     |void   |sys_intern_init
 #endif
-#if defined(PERL_CUSTOM_OPS)
+
 Ap |char * |custom_op_name|OP* op
 Ap |char * |custom_op_desc|OP* op
-#endif
+
 
 END_EXTERN_C
 
@@ -2256,7 +2260,7 @@ s |SV*    |gv_share       |SV *sv
 #if defined(PERL_IN_TOKE_C) || defined(PERL_DECL_PROT)
 s      |void   |check_uni
 s      |void   |force_next     |I32 type
-s      |char*  |force_version  |char *start
+s      |char*  |force_version  |char *start|int guessing
 s      |char*  |force_word     |char *start|int token|int check_keyword \
                                |int allow_pack|int allow_tick
 s      |SV*    |tokeq          |SV *sv
index 303ef70..a82404f 100644 (file)
@@ -226,22 +226,20 @@ PPCODE:
 {
     dXSTARG;
     char *path;
-    STRLEN len;
     char buf[MAXPATHLEN];
 
-    if (pathsv)
-      path = SvPV(pathsv, len);
-    else {
-        path = ".";
-        len  = 1;
-    }
+    path = pathsv ? SvPV_nolen(pathsv) : ".";
 
     if (bsd_realpath(path, buf)) {
         sv_setpvn(TARG, buf, strlen(buf));
         SvPOK_only(TARG);
+       SvTAINTED_on(TARG);
     }
     else
-      sv_setsv(TARG, &PL_sv_undef);
+        sv_setsv(TARG, &PL_sv_undef);
 
     XSprePUSH; PUSHTARG;
+#ifndef INCOMPLETE_TAINTS
+    SvTAINTED_on(TARG);
+#endif
 }
index 1d19218..29b8de5 100644 (file)
@@ -1,5 +1,5 @@
 use ExtUtils::MakeMaker;
 WriteMakefile(
     NAME    => 'Cwd',
-    VERSION => '2.05',
+    VERSION_FROM => '../../lib/Cwd.pm',
 );
similarity index 100%
rename from ext/Cwd/Cwd.t
rename to ext/Cwd/t/cwd.t
diff --git a/ext/Cwd/t/taint.t b/ext/Cwd/t/taint.t
new file mode 100644 (file)
index 0000000..036b2b1
--- /dev/null
@@ -0,0 +1,21 @@
+#!./perl -Tw
+# Testing Cwd under taint mode.
+
+BEGIN {
+    chdir 't' if -d 't';
+    @INC = '../lib';
+}
+
+use Cwd;
+use Test::More tests => 2;
+
+# The normal kill() trick is not portable.
+sub is_tainted { 
+    return ! eval { eval("#" . substr(join("", @_), 0, 0)); 1 };
+}
+
+my $cwd;
+eval { $cwd = getcwd; };
+is( $@, '',                 'getcwd() does not explode under taint mode' );
+ok( is_tainted($cwd),       "it's return value is tainted" );
+
index 161aba9..ea1b53b 100644 (file)
@@ -180,7 +180,7 @@ MLDBM example added.
 Several folks pointed out that quoting of ticks and backslashes 
 in strings is missing. Added.
 
-Ian Phillips <ian@pipex.net> pointed out that numerics may lose 
+Ian Phillipps <ian@pipex.net> pointed out that numerics may lose 
 precision without quotes.  Fixed.
 
 
index b9fb54b..8fc7ac3 100644 (file)
@@ -137,7 +137,7 @@ esc_q_utf8(pTHX_ SV* sv, register char *src, register STRLEN slen)
       r[0] = r[j++] = '"';
     else
       r[0] = r[j++] = '\'';
-    r[j++] = '\0';
+    r[j] = '\0';
     SvCUR_set(sv, SvCUR(sv) + j);
 
     return j;
index 10add1c..bf07229 100755 (executable)
@@ -61,11 +61,11 @@ sub TEST {
 
 if (defined &Data::Dumper::Dumpxs) {
   print "### XS extension loaded, will run XS tests\n";
-  $TMAX = 186; $XS = 1;
+  $TMAX = 192; $XS = 1;
 }
 else {
   print "### XS extensions not loaded, will NOT run XS tests\n";
-  $TMAX = 93; $XS = 0;
+  $TMAX = 96; $XS = 0;
 }
 
 print "1..$TMAX\n";
@@ -808,3 +808,16 @@ TEST q(Data::Dumper->new([$b],['b'])->Purity(1)->Dump;);
 TEST q(Data::Dumper->new([$b],['b'])->Purity(1)->Dumpxs;)
        if $XS;
 }
+
+{
+  $a = "\x{09c10}";
+############# 187
+## XS code was adding an extra \0
+  $WANT = <<'EOT';
+#$a = "\x{9c10}";
+EOT
+
+  TEST q(Data::Dumper->Dump([$a], ['a']));
+  TEST q(Data::Dumper->Dumpxs([$a], ['a']));
+
+}
index 62c8280..224e271 100644 (file)
@@ -1,3 +1,38 @@
+2001-09-07   Gisle Aas <gisle@ActiveState.com>
+
+   Release 2.16
+
+   Sync up with the bleadperl version:
+      - use SvPVbyte() if avaiable
+      - fixes to make the code 'gcc -Wall'-clean
+
+
+
+2001-08-27   Gisle Aas <gisle@ActiveState.com>
+
+   Release 2.15
+
+   Avoid exit() in Makefile.PL and bleedperls redefinition of printf
+   in the alignment test program.
+   Patch by Doug MacEachern <dougm@covalent.net>.
+
+
+
+2001-07-18   Gisle Aas <gisle@ActiveState.com>
+
+   Release 2.14
+
+   Try to warn if the functional interface is used as methods,
+   i.e. Digest::MD5->md5_hex("foo") will make noise if -w is
+   enabled.
+
+   Document the missing padding for the base64 digests.
+
+   If both XS bootstrap and locating Digest::Perl::MD5 fails
+   reraise the original XS bootstrap exception.
+
+
+
 2001-03-13   Gisle Aas <gisle@ActiveState.com>
 
    Release 2.13
index 7a11df9..9a109b3 100644 (file)
@@ -3,7 +3,7 @@ package Digest::MD5;
 use strict;
 use vars qw($VERSION @ISA @EXPORT_OK);
 
-$VERSION = '2.13';
+$VERSION = '2.16';  # $Date: 2001/09/07 05:45:14 $
 
 require Exporter;
 *import = \&Exporter::import;
@@ -16,11 +16,18 @@ eval {
     Digest::MD5->bootstrap($VERSION);
 };
 if ($@) {
-    # Try to load the pure perl version
-    require Digest::Perl::MD5;
-
-    Digest::Perl::MD5->import(qw(md5 md5_hex md5_base64));
-    push(@ISA, "Digest::Perl::MD5");  # make OO interface work
+    my $olderr = $@;
+    eval {
+       # Try to load the pure perl version
+       require Digest::Perl::MD5;
+
+       Digest::Perl::MD5->import(qw(md5 md5_hex md5_base64));
+       push(@ISA, "Digest::Perl::MD5");  # make OO interface work
+    };
+    if ($@) {
+       # restore the original error
+       die $olderr;
+    }
 }
 else {
     *reset = \&new;
@@ -88,6 +95,10 @@ Same as md5(), but will return the digest in hexadecimal form.
 
 Same as md5(), but will return the digest as a base64 encoded string.
 
+The base64 encoded string returned is not padded to be a multiple of 4
+bytes long.  If you want interoperability with other base64 encoded
+md5 digests you might want to append the string "==" to the result.
+
 =back
 
 =head1 METHODS
@@ -142,6 +153,10 @@ Same as $md5->digest, but will return the digest in hexadecimal form.
 Same as $md5->digest, but will return the digest as a base64 encoded
 string.
 
+The base64 encoded string returned is not padded to be a multiple of 4
+bytes long.  If you want interoperability with other base64 encoded
+md5 digests you might want to append the string "==" to the result.
+
 =back
 
 
@@ -215,7 +230,7 @@ RFC 1321
 This library is free software; you can redistribute it and/or
 modify it under the same terms as Perl itself.
 
- Copyright 1998-2000 Gisle Aas.
+ Copyright 1998-2001 Gisle Aas.
  Copyright 1995-1996 Neil Winton.
  Copyright 1991-1992 RSA Data Security, Inc.
 
index 32ba8d4..76f54cd 100644 (file)
@@ -42,8 +42,9 @@ extern "C" {
 }
 #endif
 
-/* Define this to turn on verbose debugging prints */
-#undef MD5_DEBUG
+#ifndef SvPVbyte
+   #define SvPVbyte SvPV
+#endif
 
 /* Perl does not guarantee that U32 is exactly 32 bits.  Some system
  * has no integral type with exactly 32 bits.  For instance, A Cray has
@@ -618,6 +619,14 @@ md5(...)
        unsigned char digeststr[16];
     PPCODE:
        MD5Init(&ctx);
+       if (PL_dowarn && items > 1) {
+           data = (unsigned char *)SvPVbyte(ST(0), len);
+           if (len == 11 && memEQ("Digest::MD5", data, 11)) {
+                char *f = (ix == F_BIN) ? "md5" :
+                           (ix == F_HEX) ? "md5_hex" : "md5_base64";
+                warn("&Digest::MD5::%s function probably called as method", f);
+            }
+       }
        for (i = 0; i < items; i++) {
            data = (unsigned char *)(SvPVbyte(ST(i), len));
            MD5Update(&ctx, data, len);
index c786a5f..d2530f1 100644 (file)
@@ -15,13 +15,13 @@ my $EXPECT;
 
 if (ord('A') == 193) { # EBCDIC
 $EXPECT = <<EOT;
-95a81f17a8e6c2273aecac12d8c4cb90  ext/Digest/MD5/MD5.pm
-9cecc5dbb27bd64b98f61f558b4db378  ext/Digest/MD5/MD5.xs
+????????????????????????????????  ext/Digest/MD5/MD5.pm
+????????????????????????????????  ext/Digest/MD5/MD5.xs
 EOT
 } else { # ASCII
 $EXPECT = <<EOT;
-3d0146bf194e4fe68733d00fba02a49e  ext/Digest/MD5/MD5.pm
-5526659171a63f532d990dd73791b60e  ext/Digest/MD5/MD5.xs
+bf8c3c72d071d1c0303fc9e311820708  ext/Digest/MD5/MD5.pm
+dc50ae0aea3182f4d5f1ec368b67918b  ext/Digest/MD5/MD5.xs
 EOT
 }
 
@@ -126,7 +126,7 @@ sub digest_file
     #print "$file $method\n";
 
     open(FILE, $file) or die "Can't open $file: $!";
-# Digests avove are generated on UNIX without CRLF
+# Digests above are generated on UNIX without CRLF
 # so leave handles in text mode
 #    binmode(FILE);
     my $digest = Digest::MD5->new->addfile(*FILE)->$method();
@@ -140,7 +140,7 @@ sub cat_file
     my($file) = @_;
     local $/;  # slurp
     open(FILE, $file) or die "Can't open $file: $!";
-# Digests avove are generated on UNIX without CRLF
+# Digests above are generated on UNIX without CRLF
 # so leave handles in text mode
 #    binmode(FILE);
     my $tmp = <FILE>;
index b84623a..2aee7c1 100644 (file)
@@ -667,13 +667,13 @@ can be considered as being in this form without encoding. An encoding
 to transfer strings in this form (e.g. to write them to a file) would
 need to
 
-     pack('L',map(chr($_),split(//,$string)));   # native
+     pack('L*', unpack('U*', $string));  # native
   or
-     pack('V',map(chr($_),split(//,$string)));   # little-endian
+     pack('V*', unpack('U*', $string));  # little-endian
   or
-     pack('N',map(chr($_),split(//,$string)));   # big-endian
+     pack('N*', unpack('U*', $string));  # big-endian
 
-depending on the endian required.
+depending on the endianness required.
 
 No UTF-32 encodings are implemented yet.
 
diff --git a/ext/Encode/Encode/isoir-197.enc b/ext/Encode/Encode/isoir-197.enc
new file mode 100644 (file)
index 0000000..f5003e7
--- /dev/null
@@ -0,0 +1,20 @@
+# Encoding file: ISO IR-197 with Windows extensions, single-byte
+S
+003F 0 1
+00
+0000000100020003000400050006000700080009000A000B000C000D000E000F
+0010001100120013001400150016001700180019001A001B001C001D001E001F
+0020002100220023002400250026002700270029002A002B002C002D002E002F
+0030003100320033003400350036003700380039003A003B003C003D003E003F
+0040004100420043004400450046004700480049004A004B004C004D004E004F
+0050005100520053005400550056005700580059005A005B005C005D005E005F
+0060006100620063006400650066006700680069006A006B006C006D006E006F
+0070007100720073007400750076007700780079007A007B007C007D007E007F
+00800081201A0192201E202600AC226000A3203000BF22640152008D008E008F
+009020182019201C201D2022201320140098212200A122650153009D009E009F
+00A0010C010D0110011101E401E500A701E600A901E700AB01E800AD01E9014A
+00B0014B0160016100B4016600B600B70167017D017E00BB01B7029201EE01EF
+00C000C100C200C300C400C500C600C700C800C900CA00CB00CC00CD00CE00CF
+00D000D100D200D300D400D500D600D700D800D900DA00DB00DC00DD00DE00DF
+00E000E100E200E300E400E500E600E700E800E900EA00EB00EC00ED00EE00EF
+00F000F100F200F300F400F500F600F700F800F900FA00FB00FC00FD00FE00FF
diff --git a/ext/Encode/Encode/macSami.enc b/ext/Encode/Encode/macSami.enc
new file mode 100644 (file)
index 0000000..94a73ad
--- /dev/null
@@ -0,0 +1,20 @@
+# Encoding file: macSami, single-byte
+S
+003F 0 1
+00
+0000000100020003000400050006000700080009000A000B000C000D000E000F
+0010001100120013001400150016001700180019001A001B001C001D001E001F
+0020002100220023002400250026002700270029002A002B002C002D002E002F
+0030003100320033003400350036003700380039003A003B003C003D003E003F
+0040004100420043004400450046004700480049004A004B004C004D004E004F
+0050005100520053005400550056005700580059005A005B005C005D005E005F
+0060006100620063006400650066006700680069006A006B006C006D006E006F
+0070007100720073007400750076007700780079007A007B007C007D007E007F
+00C400C500C700C900D100D600DC00E100E000E200E400E300E500E700E900E8
+00EA00EB00ED00EC00EE00EF00F100F3009800F400F600F500FA00F900FB00FC
+00DD00B0010C00A300A7202200B600DF00AE00A9212200B400A8226000C600D8
+0110014A021E021F016001662202017D010D0111014B01610167017E00E600F8
+00BF00A100AC221A01922248220600AB00BB202600A000C000C300D501520153
+20132014201C201D2018201900F725CA00FF0178204400A400D000F000DE00FE
+00FD00B7201A201E203000C200CA00C100CB00C800CD00CE00CF00CC00D300D4
+F8FF00D200DA00DB00D9013101B7029201EE01EF01E401E501E601E701E801E9
similarity index 100%
rename from ext/Fcntl/Fcntl.t
rename to ext/Fcntl/t/fcntl.t
similarity index 100%
rename from ext/Fcntl/syslfs.t
rename to ext/Fcntl/t/syslfs.t
index b36a65b..139163b 100644 (file)
@@ -41,11 +41,8 @@ sub _sock_info {
   $port = $1
        if(defined $addr && $addr =~ s,:([\w\(\)/]+)$,,);
 
-  if(defined $proto) {
-    if (@proto = ( $proto =~ m,\D,
-               ? getprotobyname($proto)
-               : getprotobynumber($proto))
-    ) {
+  if(defined $proto  && $proto =~ /\D/) {
+    if(@proto = getprotobyname($proto)) {
       $proto = $proto[2] || undef;
     }
     else {
index bd9814c..3d2295b 100644 (file)
@@ -1,3 +1,56 @@
+Change 641 on 2001/09/05 by <gbarr@pobox.com> (Graham Barr)
+
+       Fix shuffle() to compile with threaded perl
+
+Change 640 on 2001/09/05 by <gbarr@pobox.com> (Graham Barr)
+
+       Release 1.04
+
+Change 639 on 2001/09/05 by <gbarr@pobox.com> (Graham Barr)
+
+       Fix context type (caused a core on Tru64)
+       Call pp_rand via *(PL_ppaddr[OP_RAND])
+
+Change 638 on 2001/09/05 by <gbarr@pobox.com> (Graham Barr)
+
+       Documentation updates
+
+Change 637 on 2001/09/03 by <gbarr@pobox.com> (Graham Barr)
+
+       Release 1.03
+
+Change 636 on 2001/09/03 by <gbarr@pobox.com> (Graham Barr)
+
+       More changes to help merging with core dist
+
+Change 635 on 2001/09/03 by <gbarr@pobox.com> (Graham Barr)
+
+       Added List::Util::shuffle() similar to that described in
+       the perl FAQ except it returns a shuffled list instead of
+       modifying an array passed by reference
+
+Change 632 on 2001/09/03 by <gbarr@pobox.com> (Graham Barr)
+
+       Handle tied variables passed for the number to dualvar()
+       Preserve number type (IV/UV/NV) in dualvar()
+
+Change 631 on 2001/08/31 by <gbarr@pobox.com> (Graham Barr)
+
+       Handle eval{} inside of the code blocks for first and reduce
+
+Change 629 on 2001/08/22 by <gbarr@pobox.com> (Graham Barr)
+
+       perl5.004 does not like exit from within a BEGIN, it core dumps
+
+Change 628 on 2001/08/22 by <gbarr@pobox.com> (Graham Barr)
+
+       Fix stack problem in first() and reduce()
+       Align with core dist
+
+Change 483 on 2000/04/10 by <gbarr@pobox.com> (Graham Barr)
+
+       Release 1.02
+
 Change 482 on 2000/04/10 by <gbarr@pobox.com> (Graham Barr)
 
        Check for SvMAGICAL on argument for reftype and blessed
index 086af5e..2e5aba9 100644 (file)
@@ -25,7 +25,8 @@ This distribution provides
   weaken   (5.005_57 and later only)
   isweak   (5.005_57 and later only)
   dualvar
+  shuffle
 
-Copyright (c) 1997-2000 Graham Barr <gbarr@pobox.com>. All rights reserved.
+Copyright (c) 1997-2001 Graham Barr <gbarr@pobox.com>. All rights reserved.
 This library is free software; you can redistribute it and/or
 modify it under the same terms as Perl itself.
index 0ea2e54..c55fd00 100644 (file)
 #    define PERL_SUBVERSION    SUBVERSION
 #endif
 
+#ifndef aTHX
+#  define aTHX
+#endif
+
+#if PERL_VERSION < 6
+#    define NV double
+#endif
+
+#ifndef Drand01
+#    define Drand01()          ((rand() & 0x7FFF) / (double) ((unsigned long)1 << 15))
+#endif
+
 #if PERL_VERSION < 5
 #  ifndef gv_stashpvn
 #    define gv_stashpvn(n,l,c) gv_stashpv(n,c)
@@ -163,6 +175,11 @@ CODE:
     HV *stash;
     CV *cv;
     OP *reducecop;
+    PERL_CONTEXT *cx;
+    SV** newsp;
+    I32 gimme = G_SCALAR;
+    bool oldcatch = CATCH_GET;
+
     if(items <= 1) {
        XSRETURN_UNDEF;
     }
@@ -179,6 +196,8 @@ CODE:
     SAVETMPS;
     SAVESPTR(PL_op);
     ret = ST(1);
+    CATCH_SET(TRUE);
+    PUSHBLOCK(cx, CXt_NULL, SP);
     for(index = 2 ; index < items ; index++) {
        GvSV(agv) = ret;
        GvSV(bgv) = ST(index);
@@ -186,7 +205,9 @@ CODE:
        CALLRUNOPS(aTHX);
        ret = *PL_stack_sp;
     }
-    ST(0) = ret;
+    ST(0) = sv_mortalcopy(ret);
+    POPBLOCK(cx,PL_curpm);
+    CATCH_SET(oldcatch);
     XSRETURN(1);
 }
 
@@ -201,6 +222,11 @@ CODE:
     HV *stash;
     CV *cv;
     OP *reducecop;
+    PERL_CONTEXT *cx;
+    SV** newsp;
+    I32 gimme = G_SCALAR;
+    bool oldcatch = CATCH_GET;
+
     if(items <= 1) {
        XSRETURN_UNDEF;
     }
@@ -213,18 +239,56 @@ CODE:
     PL_curpad = AvARRAY((AV*)AvARRAY(CvPADLIST(cv))[1]);
     SAVETMPS;
     SAVESPTR(PL_op);
+    CATCH_SET(TRUE);
+    PUSHBLOCK(cx, CXt_NULL, SP);
     for(index = 1 ; index < items ; index++) {
        GvSV(PL_defgv) = ST(index);
        PL_op = reducecop;
        CALLRUNOPS(aTHX);
        if (SvTRUE(*PL_stack_sp)) {
          ST(0) = ST(index);
+         POPBLOCK(cx,PL_curpm);
+         CATCH_SET(oldcatch);
          XSRETURN(1);
        }
     }
+    POPBLOCK(cx,PL_curpm);
+    CATCH_SET(oldcatch);
     XSRETURN_UNDEF;
 }
 
+void
+shuffle(...)
+PROTOTYPE: @
+CODE:
+{
+    int index;
+    struct op dmy_op;
+    struct op *old_op = PL_op;
+    SV *my_pad[2];
+    SV **old_curpad = PL_curpad;
+
+    /* We call pp_rand here so that Drand01 get initialized if rand()
+       or srand() has not already been called
+    */
+    my_pad[1] = sv_newmortal();
+    memzero((char*)(&dmy_op), sizeof(struct op));
+    dmy_op.op_targ = 1;
+    PL_op = &dmy_op;
+    PL_curpad = (SV **)&my_pad;
+    *(PL_ppaddr[OP_RAND])(aTHX);
+    PL_op = old_op;
+    PL_curpad = old_curpad;
+    for (index = items ; index > 1 ; ) {
+       int swap = (int)(Drand01() * (double)(index--));
+       SV *tmp = ST(swap);
+       ST(swap) = ST(index);
+       ST(index) = tmp;
+    }
+    XSRETURN(items);
+}
+
+
 MODULE=List::Util      PACKAGE=Scalar::Util
 
 void
@@ -239,10 +303,17 @@ CODE:
     ST(0) = sv_newmortal();
     (void)SvUPGRADE(ST(0),SVt_PVNV);
     sv_setpvn(ST(0),ptr,len);
-    if(SvNOKp(num) || !SvIOKp(num)) {
+    if(SvNOK(num) || SvPOK(num) || SvMAGICAL(num)) {
        SvNVX(ST(0)) = SvNV(num);
        SvNOK_on(ST(0));
     }
+#ifdef SVf_IVisUV
+    else if (SvUOK(num)) {
+       SvUVX(ST(0)) = SvUV(num);
+       SvIOK_on(ST(0));
+       SvIsUV_on(ST(0));
+    }
+#endif
     else {
        SvIVX(ST(0)) = SvIV(num);
        SvIOK_on(ST(0));
index cb64584..b61e13c 100644 (file)
@@ -1,6 +1,6 @@
 # List::Util.pm
 #
-# Copyright (c) 1997-2000 Graham Barr <gbarr@pobox.com>. All rights reserved.
+# Copyright (c) 1997-2001 Graham Barr <gbarr@pobox.com>. All rights reserved.
 # This program is free software; you can redistribute it and/or
 # modify it under the same terms as Perl itself.
 
@@ -10,8 +10,8 @@ require Exporter;
 require DynaLoader;
 
 our @ISA       = qw(Exporter DynaLoader);
-our @EXPORT_OK = qw(first min max minstr maxstr reduce sum);
-our $VERSION   = "1.02_00";
+our @EXPORT_OK = qw(first min max minstr maxstr reduce sum shuffle);
+our $VERSION   = "1.05_00";
 
 bootstrap List::Util $VERSION;
 
@@ -25,7 +25,7 @@ List::Util - A selection of general-utility list subroutines
 
 =head1 SYNOPSIS
 
-    use List::Util qw(first sum min max minstr maxstr reduce);
+    use List::Util qw(first max maxstr min minstr reduce shuffle sum);
 
 =head1 DESCRIPTION
 
@@ -49,7 +49,7 @@ C<undef> is returned.
     $foo = first { defined($_) } @list    # first defined value in @list
     $foo = first { $_ > $value } @list    # first value in @list which
                                           # is greater than $value
-    
+
 This function could be implemented using C<reduce> like this
 
     $foo = reduce { defined($a) ? $a : wanted($b) ? $b : undef } undef, @list
@@ -75,8 +75,8 @@ This function could be implemented using C<reduce> like this
 Similar to C<max>, but treats all the entries in the list as strings
 and returns the highest string as defined by the C<gt> operator.
 If the list is empty then C<undef> is returned.
-    $foo = maxstr 'A'..'Z'                 # 'Z'
+
+    $foo = maxstr 'A'..'Z'          # 'Z'
     $foo = maxstr "hello","world"   # "world"
     $foo = maxstr @bar, @baz        # whatever
 
@@ -103,9 +103,9 @@ Similar to C<min>, but treats all the entries in the list as strings
 and returns the lowest string as defined by the C<lt> operator.
 If the list is empty then C<undef> is returned.
 
-    $foo = maxstr 'A'..'Z'                 # 'A'
-    $foo = maxstr "hello","world"   # "hello"
-    $foo = maxstr @bar, @baz        # whatever
+    $foo = minstr 'A'..'Z'          # 'A'
+    $foo = minstr "hello","world"   # "hello"
+    $foo = minstr @bar, @baz        # whatever
 
 This function could be implemented using C<reduce> like this
 
@@ -117,7 +117,7 @@ Reduces LIST by calling BLOCK multiple times, setting C<$a> and C<$b>
 each time. The first call will be with C<$a> and C<$b> set to the first
 two elements of the list, subsequent calls will be done by
 setting C<$a> to the result of the previous call and C<$b> to the next
-element in the list. 
+element in the list.
 
 Returns the result of the last call to BLOCK. If LIST is empty then
 C<undef> is returned. If LIST only contains one element then that
@@ -128,6 +128,12 @@ element is returned and BLOCK is not executed.
     $foo = reduce { $a + $b } 1 .. 10               # sum
     $foo = reduce { $a . $b } @bar                  # concat
 
+=item shuffle LIST
+
+Returns the elements of LIST in a random order
+
+    @cards = shuffle 0..51      # 0..51 in a random order
+
 =item sum LIST
 
 Returns the sum of all the elements in LIST.
@@ -173,7 +179,7 @@ to add due to them being very simple to implement in perl
 
 =head1 COPYRIGHT
 
-Copyright (c) 1997-2000 Graham Barr <gbarr@pobox.com>. All rights reserved.
+Copyright (c) 1997-2001 Graham Barr <gbarr@pobox.com>. All rights reserved.
 This program is free software; you can redistribute it and/or
 modify it under the same terms as Perl itself.
 
index 8a7a8a3..432361f 100644 (file)
@@ -1,6 +1,6 @@
 # Scalar::Util.pm
 #
-# Copyright (c) 1997-2000 Graham Barr <gbarr@pobox.com>. All rights reserved.
+# Copyright (c) 1997-2001 Graham Barr <gbarr@pobox.com>. All rights reserved.
 # This program is free software; you can redistribute it and/or
 # modify it under the same terms as Perl itself.
 
@@ -23,7 +23,7 @@ Scalar::Util - A selection of general-utility scalar subroutines
 
 =head1 SYNOPSIS
 
-    use Scalar::Util qw(blessed dualvar reftype weaken isweak);
+    use Scalar::Util qw(blessed dualvar isweak readonly reftype tainted weaken);
 
 =head1 DESCRIPTION
 
@@ -42,32 +42,61 @@ subroutines defined are
 If EXPR evaluates to a blessed reference the name of the package
 that it is blessed into is returned. Otherwise C<undef> is returned.
 
+   $scalar = "foo";
+   $class  = blessed $scalar;           # undef
+
+   $ref    = [];
+   $class  = blessed $ref;              # undef
+
+   $obj    = bless [], "Foo";
+   $class  = blessed $obj;              # "Foo"
+
 =item dualvar NUM, STRING
 
 Returns a scalar that has the value NUM in a numeric context and the
 value STRING in a string context.
 
     $foo = dualvar 10, "Hello";
-    $num = $foo + 2;                   # 12
-    $str = $foo . " world";            # Hello world
+    $num = $foo + 2;                    # 12
+    $str = $foo . " world";             # Hello world
 
 =item isweak EXPR
 
 If EXPR is a scalar which is a weak reference the result is true.
 
+    $ref  = \$foo;
+    $weak = isweak($ref);               # false
+    weaken($ref);
+    $weak = isweak($ref);               # true
+
 =item readonly SCALAR
 
 Returns true if SCALAR is readonly.
 
+    sub foo { readonly($_[0]) }
+
+    $readonly = foo($bar);              # false
+    $readonly = foo(0);                 # true
+
 =item reftype EXPR
 
 If EXPR evaluates to a reference the type of the variable referenced
 is returned. Otherwise C<undef> is returned.
 
+    $type = reftype "string";           # undef
+    $type = reftype \$var;              # SCALAR
+    $type = reftype [];                 # ARRAY
+
+    $obj  = bless {}, "Foo";
+    $type = reftype $obj;               # HASH
+
 =item tainted EXPR
 
 Return true if the result of EXPR is tainted
 
+    $taint = tainted("constant");       # false
+    $taint = tainted($ENV{PWD});        # true if running under -T
+
 =item weaken REF
 
 REF will be turned into a weak reference. This means that it will not
@@ -77,15 +106,22 @@ count on that object reaches zero, REF will be set to undef.
 This is useful for keeping copies of references , but you don't want to
 prevent the object being DESTROY-ed at its usual time.
 
+    {
+      my $var;
+      $ref = \$var;
+      weaken($ref);                     # Make $ref a weak reference
+    }
+    # $ref is now undef
+
 =back
 
 =head1 COPYRIGHT
 
-Copyright (c) 1997-2000 Graham Barr <gbarr@pobox.com>. All rights reserved.
-This program is free software; you can redistribute it and/or modify it 
+Copyright (c) 1997-2001 Graham Barr <gbarr@pobox.com>. All rights reserved.
+This program is free software; you can redistribute it and/or modify it
 under the same terms as Perl itself.
 
-except weaken and isweak which are
+Except weaken and isweak which are
 
 Copyright (c) 1999 Tuomas J. Lukka <lukka@iki.fi>. All rights reserved.
 This program is free software; you can redistribute it and/or modify it
index 89a740a..84e29da 100755 (executable)
@@ -1,11 +1,16 @@
+#!./perl
+
 BEGIN {
+    unless (-d 'blib') {
        chdir 't' if -d 't';
        @INC = '../lib';
        require Config; import Config;
+       keys %Config; # Silence warning
        if ($Config{extensions} !~ /\bList\/Util\b/) {
            print "1..0 # Skip: List::Util was not built\n";
            exit 0;
        }
+    }
 }
 
 use Scalar::Util qw(blessed);
index 5bf4fe9..4b17354 100755 (executable)
@@ -1,25 +1,33 @@
+#!./perl
+
 BEGIN {
+    unless (-d 'blib') {
        chdir 't' if -d 't';
        @INC = '../lib';
        require Config; import Config;
+       keys %Config; # Silence warning
        if ($Config{extensions} !~ /\bList\/Util\b/) {
            print "1..0 # Skip: List::Util was not built\n";
            exit 0;
        }
+    }
 }
 
+use vars qw($skip);
+
 BEGIN {
   require Scalar::Util;
 
   if (grep { /dualvar/ } @Scalar::Util::EXPORT_FAIL) {
     print "1..0\n";
-    exit;
+    $skip=1;
   }
 }
 
+eval <<'EOT' unless $skip;
 use Scalar::Util qw(dualvar);
 
-print "1..6\n";
+print "1..11\n";
 
 $var = dualvar 2.2,"string";
 
@@ -44,3 +52,30 @@ print "ok 5\n";
 
 print "not " unless $var2 eq "string";
 print "ok 6\n";
+
+my $numstr = "10.2";
+my $numtmp = sprintf("%d", $numstr);
+$var = dualvar $numstr, "";
+print "not " unless $var == $numstr;
+print "ok 7\n";
+
+$var = dualvar 1<<31, "";
+print "not " unless $var == 1<<31;
+print "ok 8\n";
+print "not " unless $var > 0;
+print "ok 9\n";
+
+tie my $tied, 'Tied';
+$var = dualvar $tied, "ok";
+print "not " unless $var == 7.5;
+print "ok 10\n";
+print "not " unless $var eq "ok";
+print "ok 11\n";
+
+EOT
+
+package Tied;
+
+sub TIESCALAR { bless {} }
+sub FETCH { 7.5 }
+
index 6a35948..ee22780 100755 (executable)
@@ -1,16 +1,21 @@
+#!./perl
+
 BEGIN {
+    unless (-d 'blib') {
        chdir 't' if -d 't';
        @INC = '../lib';
        require Config; import Config;
+       keys %Config; # Silence warning
        if ($Config{extensions} !~ /\bList\/Util\b/) {
            print "1..0 # Skip: List::Util was not built\n";
            exit 0;
        }
+    }
 }
 
 use List::Util qw(first);
 
-print "1..4\n";
+print "1..7\n";
 
 print "not " unless defined &first;
 print "ok 1\n";
@@ -23,3 +28,16 @@ print "ok 3\n";
 
 print "not " if defined(first { 0 });
 print "ok 4\n";
+
+my $foo = first { $_->[1] le "e" and "e" le $_->[2] }
+               [qw(a b c)], [qw(d e f)], [qw(g h i)];
+print "not " unless $foo->[0] eq 'd';
+print "ok 5\n";
+
+# Check that eval{} inside the block works correctly
+my $i = 0;
+print "not " unless 5 == first { eval { die }; ($i == 5, $i = $_)[0] } 0,1,2,3,4,5,5;
+print "ok 6\n";
+
+print "not " if defined eval { first { die if $_ } 0,0,1 };
+print "ok 7\n";
index 911003b..2e0193a 100755 (executable)
@@ -1,13 +1,19 @@
+#!./perl
+
 BEGIN {
+    unless (-d 'blib') {
        chdir 't' if -d 't';
        @INC = '../lib';
        require Config; import Config;
+       keys %Config; # Silence warning
        if ($Config{extensions} !~ /\bList\/Util\b/) {
            print "1..0 # Skip: List::Util was not built\n";
            exit 0;
        }
+    }
 }
 
+
 use List::Util qw(max);
 
 print "1..5\n";
index 0ec35ca..c2725a2 100755 (executable)
@@ -1,13 +1,19 @@
+#!./perl
+
 BEGIN {
+    unless (-d 'blib') {
        chdir 't' if -d 't';
        @INC = '../lib';
        require Config; import Config;
+       keys %Config; # Silence warning
        if ($Config{extensions} !~ /\bList\/Util\b/) {
            print "1..0 # Skip: List::Util was not built\n";
            exit 0;
        }
+    }
 }
 
+
 use List::Util qw(maxstr);
 
 print "1..5\n";
index a51ced4..6f2d0e8 100755 (executable)
@@ -1,13 +1,19 @@
+#!./perl
+
 BEGIN {
+    unless (-d 'blib') {
        chdir 't' if -d 't';
        @INC = '../lib';
        require Config; import Config;
+       keys %Config; # Silence warning
        if ($Config{extensions} !~ /\bList\/Util\b/) {
            print "1..0 # Skip: List::Util was not built\n";
            exit 0;
        }
+    }
 }
 
+
 use List::Util qw(min);
 
 print "1..5\n";
index c000e78..31f69a9 100755 (executable)
@@ -1,13 +1,19 @@
+#!./perl
+
 BEGIN {
+    unless (-d 'blib') {
        chdir 't' if -d 't';
        @INC = '../lib';
        require Config; import Config;
+       keys %Config; # Silence warning
        if ($Config{extensions} !~ /\bList\/Util\b/) {
            print "1..0 # Skip: List::Util was not built\n";
            exit 0;
        }
+    }
 }
 
+
 use List::Util qw(minstr);
 
 print "1..5\n";
index 864e1f1..a72d788 100644 (file)
@@ -1,15 +1,21 @@
+#!./perl
+
 BEGIN {
+    unless (-d 'blib') {
        chdir 't' if -d 't';
        @INC = '../lib';
        require Config; import Config;
+       keys %Config; # Silence warning
        if ($Config{extensions} !~ /\bList\/Util\b/) {
            print "1..0 # Skip: List::Util was not built\n";
            exit 0;
        }
+    }
 }
 
 use Scalar::Util qw(readonly);
 
+
 print "1..9\n";
 
 print "not " unless readonly(1);
index 063e0b7..2721d15 100755 (executable)
@@ -1,16 +1,22 @@
+#!./perl
+
 BEGIN {
+    unless (-d 'blib') {
        chdir 't' if -d 't';
        @INC = '../lib';
        require Config; import Config;
+       keys %Config; # Silence warning
        if ($Config{extensions} !~ /\bList\/Util\b/) {
            print "1..0 # Skip: List::Util was not built\n";
            exit 0;
        }
+    }
 }
 
+
 use List::Util qw(reduce min);
 
-print "1..5\n";
+print "1..8\n";
 
 print "not " if defined reduce {};
 print "ok 1\n";
@@ -28,3 +34,19 @@ print "ok 4\n";
 @a = map { pack("C", int(rand(256))) } 0 .. 20;
 print "not " unless join("",@a) eq reduce { $a . $b } @a;
 print "ok 5\n";
+
+sub add {
+  my($aa, $bb) = @_;
+  return $aa + $bb;
+}
+
+my $sum = reduce { my $t="$a $b\n"; 0+add($a, $b) } 3, 2, 1;
+print "not " unless $sum == 6;
+print "ok 6\n";
+
+# Check that eval{} inside the block works correctly
+print "not " unless 10 == reduce { eval { die }; $a + $b } 0,1,2,3,4;
+print "ok 7\n";
+
+print "not " if defined eval { reduce { die if $b > 2; $a + $b } 0,1,2,3,4 };
+print "ok 8\n";
index ea7ea7b..470b72a 100755 (executable)
@@ -1,13 +1,19 @@
+#!./perl
+
 BEGIN {
+    unless (-d 'blib') {
        chdir 't' if -d 't';
        @INC = '../lib';
        require Config; import Config;
+       keys %Config; # Silence warning
        if ($Config{extensions} !~ /\bList\/Util\b/) {
            print "1..0 # Skip: List::Util was not built\n";
            exit 0;
        }
+    }
 }
 
+
 use Scalar::Util qw(reftype);
 use vars qw($t $y $x *F);
 use Symbol qw(gensym);
diff --git a/ext/List/Util/t/shuffle.t b/ext/List/Util/t/shuffle.t
new file mode 100755 (executable)
index 0000000..e416415
--- /dev/null
@@ -0,0 +1,40 @@
+#!./perl
+
+BEGIN {
+    unless (-d 'blib') {
+       chdir 't' if -d 't';
+       @INC = '../lib';
+       require Config; import Config;
+       keys %Config; # Silence warning
+       if ($Config{extensions} !~ /\bList\/Util\b/) {
+           print "1..0 # Skip: List::Util was not built\n";
+           exit 0;
+       }
+    }
+}
+
+
+use List::Util qw(shuffle);
+
+print "1..5\n";
+
+my @r;
+
+@r = shuffle();
+print "not " if @r;
+print "ok 1\n";
+
+@r = shuffle(9);
+print "not " unless @r == 1 and $r[0] = 9;
+print "ok 2\n";
+
+my @in = 1..100;
+@r = shuffle(@in);
+print "not " unless @r == @in;
+print "ok 3\n";
+
+print "not " if join("",@r) eq join("",@in);
+print "ok 4\n";
+
+print "not " if join("",sort { $a <=> $b } @r) ne join("",@in);
+print "ok 5\n";
index 34fb690..6cd7ea3 100755 (executable)
@@ -1,13 +1,19 @@
+#!./perl
+
 BEGIN {
+    unless (-d 'blib') {
        chdir 't' if -d 't';
        @INC = '../lib';
        require Config; import Config;
+       keys %Config; # Silence warning
        if ($Config{extensions} !~ /\bList\/Util\b/) {
            print "1..0 # Skip: List::Util was not built\n";
            exit 0;
        }
+    }
 }
 
+
 use List::Util qw(sum);
 
 print "1..3\n";
index 5587bb7..a330b1f 100644 (file)
@@ -1,20 +1,23 @@
 #!./perl -T
 
 BEGIN {
+    unless (-d 'blib') {
        chdir 't' if -d 't';
        @INC = '../lib';
        require Config; import Config;
+       keys %Config; # Silence warning
        if ($Config{extensions} !~ /\bList\/Util\b/) {
            print "1..0 # Skip: List::Util was not built\n";
            exit 0;
        }
+    }
 }
 
 use lib qw(blib/lib blib/arch);
 use Scalar::Util qw(tainted);
 use Config;
 
-print "1..5\n";
+print "1..4\n";
 
 print "not " if tainted(1);
 print "ok 1\n";
@@ -33,6 +36,3 @@ print "ok 3\n";
 
 print "not " unless tainted($ENV{$key});
 print "ok 4\n";
-
-print "not " if @ARGV and not tainted($ARGV[0]);
-print "ok 5\n";
index 6c7bea7..7941205 100755 (executable)
@@ -1,19 +1,26 @@
+#!./perl
+
 BEGIN {
+    unless (-d 'blib') {
        chdir 't' if -d 't';
        @INC = '../lib';
        require Config; import Config;
+       keys %Config; # Silence warning
        if ($Config{extensions} !~ /\bList\/Util\b/) {
            print "1..0 # Skip: List::Util was not built\n";
            exit 0;
        }
+    }
 }
 
+use vars qw($skip);
+
 BEGIN {
   $|=1;
   require Scalar::Util;
   if (grep { /weaken/ } @Scalar::Util::EXPORT_FAIL) {
     print("1..0\n");
-    exit;
+    $skip=1;
   }
 
   $DEBUG = 0;
@@ -26,6 +33,7 @@ BEGIN {
   }
 }
 
+eval <<'EOT' unless $skip;
 use Scalar::Util qw(weaken isweak);
 print "1..17\n";
 
@@ -204,3 +212,4 @@ sub DESTROY {
        print "# INCFLAG\n";
        ${$_[0]{Flag}} ++;
 }
+EOT
index 70e8e19..1045db6 100644 (file)
@@ -54,8 +54,8 @@ if($oldaction->{HANDLER} eq '::foo')
 if($oldaction->{MASK}->ismember(SIGUSR1))
   { print "ok 5\n" } else { print "not ok 5\n"}
 if($oldaction->{FLAGS}) {
-    if ($^O eq 'linux') {
-       print "ok 6 # Skip: sigaction() broken in $^O\n";
+    if ($^O eq 'linux' || $^O eq 'unicos') {
+       print "ok 6 # Skip: sigaction() thinks different in $^O\n";
     } else {
        print "not ok 6\n";
     }
old mode 100755 (executable)
new mode 100644 (file)
similarity index 100%
rename from ext/POSIX/POSIX.t
rename to ext/POSIX/t/posix.t
diff --git a/ext/POSIX/t/sigaction.t b/ext/POSIX/t/sigaction.t
new file mode 100644 (file)
index 0000000..1045db6
--- /dev/null
@@ -0,0 +1,133 @@
+#!./perl
+
+BEGIN {
+       chdir 't' if -d 't';
+       unshift @INC, '../lib';
+}
+
+BEGIN{
+       # Don't do anything if POSIX is missing, or sigaction missing.
+       eval { use POSIX; };
+       if($@ || $^O eq 'MSWin32' || $^O eq 'NetWare') {
+               print "1..0\n";
+               exit 0;
+       }
+}
+
+use strict;
+use vars qw/$bad7 $ok10 $bad18 $ok/;
+
+$^W=1;
+
+print "1..18\n";
+
+sub IGNORE {
+       $bad7=1;
+}
+
+sub DEFAULT {
+       $bad18=1;
+}
+
+sub foo {
+       $ok=1;
+}
+
+my $newaction=POSIX::SigAction->new('::foo', new POSIX::SigSet(SIGUSR1), 0);
+my $oldaction=POSIX::SigAction->new('::bar', new POSIX::SigSet(), 0);
+
+{
+       my $bad;
+       local($SIG{__WARN__})=sub { $bad=1; };
+       sigaction(SIGHUP, $newaction, $oldaction);
+       if($bad) { print "not ok 1\n" } else { print "ok 1\n"}
+}
+
+if($oldaction->{HANDLER} eq 'DEFAULT' ||
+   $oldaction->{HANDLER} eq 'IGNORE')
+  { print "ok 2\n" } else { print "not ok 2 # ", $oldaction->{HANDLER}, "\n"}
+print $SIG{HUP} eq '::foo' ? "ok 3\n" : "not ok 3\n";
+
+sigaction(SIGHUP, $newaction, $oldaction);
+if($oldaction->{HANDLER} eq '::foo')
+  { print "ok 4\n" } else { print "not ok 4\n"}
+if($oldaction->{MASK}->ismember(SIGUSR1))
+  { print "ok 5\n" } else { print "not ok 5\n"}
+if($oldaction->{FLAGS}) {
+    if ($^O eq 'linux' || $^O eq 'unicos') {
+       print "ok 6 # Skip: sigaction() thinks different in $^O\n";
+    } else {
+       print "not ok 6\n";
+    }
+} else {
+    print "ok 6\n";
+}
+
+$newaction=POSIX::SigAction->new('IGNORE');
+sigaction(SIGHUP, $newaction);
+kill 'HUP', $$;
+print $bad7 ? "not ok 7\n" : "ok 7\n";
+
+print $SIG{HUP} eq 'IGNORE' ? "ok 8\n" : "not ok 8\n";
+sigaction(SIGHUP, POSIX::SigAction->new('DEFAULT'));
+print $SIG{HUP} eq 'DEFAULT' ? "ok 9\n" : "not ok 9\n";
+
+$newaction=POSIX::SigAction->new(sub { $ok10=1; });
+sigaction(SIGHUP, $newaction);
+{
+       local($^W)=0;
+       kill 'HUP', $$;
+}
+print $ok10 ? "ok 10\n" : "not ok 10\n";
+
+print ref($SIG{HUP}) eq 'CODE' ? "ok 11\n" : "not ok 11\n";
+
+sigaction(SIGHUP, POSIX::SigAction->new('::foo'));
+# Make sure the signal mask gets restored after sigaction croak()s.
+eval {
+       my $act=POSIX::SigAction->new('::foo');
+       delete $act->{HANDLER};
+       sigaction(SIGINT, $act);
+};
+kill 'HUP', $$;
+print $ok ? "ok 12\n" : "not ok 12\n";
+
+undef $ok;
+# Make sure the signal mask gets restored after sigaction returns early.
+my $x=defined sigaction(SIGKILL, $newaction, $oldaction);
+kill 'HUP', $$;
+print !$x && $ok ? "ok 13\n" : "not ok 13\n";
+
+$SIG{HUP}=sub {};
+sigaction(SIGHUP, $newaction, $oldaction);
+print ref($oldaction->{HANDLER}) eq 'CODE' ? "ok 14\n" : "not ok 14\n";
+
+eval {
+       sigaction(SIGHUP, undef, $oldaction);
+};
+print $@ ? "not ok 15\n" : "ok 15\n";
+
+eval {
+       sigaction(SIGHUP, 0, $oldaction);
+};
+print $@ ? "not ok 16\n" : "ok 16\n";
+
+eval {
+       sigaction(SIGHUP, bless({},'Class'), $oldaction);
+};
+print $@ ? "ok 17\n" : "not ok 17\n";
+
+if ($^O eq 'VMS') {
+    print "ok 18 # Skip: SIGCONT not trappable in $^O\n";
+} else {
+    $newaction=POSIX::SigAction->new(sub { $ok10=1; });
+    if (eval { SIGCONT; 1 }) {
+       sigaction(SIGCONT, POSIX::SigAction->new('DEFAULT'));
+       {
+           local($^W)=0;
+           kill 'CONT', $$;
+       }
+    }
+    print $bad18 ? "not ok 18\n" : "ok 18\n";
+}
+
index 06d8c74..78c41d2 100644 (file)
@@ -1,7 +1,7 @@
 package Socket;
 
 our($VERSION, @ISA, @EXPORT, @EXPORT_OK, %EXPORT_TAGS);
-$VERSION = "1.74";
+$VERSION = "1.75";
 
 =head1 NAME
 
@@ -60,25 +60,30 @@ In addition, some structure manipulation functions are available:
 
 =item inet_aton HOSTNAME
 
-Takes a string giving the name of a host, and translates that
-to the 4-byte string (structure). Takes arguments of both
-the 'rtfm.mit.edu' type and '18.181.0.24'. If the host name
-cannot be resolved, returns undef. For multi-homed hosts (hosts
-with more than one address), the first address found is returned.
+Takes a string giving the name of a host, and translates that to an
+opaque string (if programming in C, struct in_addr). Takes arguments
+of both the 'rtfm.mit.edu' type and '18.181.0.24'. If the host name
+cannot be resolved, returns undef.  For multi-homed hosts (hosts with
+more than one address), the first address found is returned.
+
+For portability do not assume that the result of inet_aton() is 32
+bits wide, in other words, that it would contain only the IPv4 address
+in network order.
 
 =item inet_ntoa IP_ADDRESS
 
-Takes a four byte ip address (as returned by inet_aton())
-and translates it into a string of the form 'd.d.d.d'
-where the 'd's are numbers less than 256 (the normal
-readable four dotted number notation for internet addresses).
+Takes a string (an opaque string as returned by inet_aton(),
+or a v-string representing the four octets of the IPv4 address in
+network order) and translates it into a string of the form 'd.d.d.d'
+where the 'd's are numbers less than 256 (the normal human-readable
+four dotted number notation for Internet addresses).
 
 =item INADDR_ANY
 
 Note: does not return a number, but a packed string.
 
 Returns the 4-byte wildcard ip address which specifies any
-of the hosts ip addresses. (A particular machine can have
+of the hosts ip addresses.  (A particular machine can have
 more than one ip address, each address corresponding to
 a particular network interface. This wildcard address
 allows you to bind to all of them simultaneously.)
@@ -97,14 +102,14 @@ Normally equivalent to inet_aton('255.255.255.255').
 
 Note - does not return a number.
 
-Returns the 4-byte loopback address. Normally equivalent
+Returns the 4-byte loopback address.  Normally equivalent
 to inet_aton('localhost').
 
 =item INADDR_NONE
 
 Note - does not return a number.
 
-Returns the 4-byte 'invalid' ip address. Normally equivalent
+Returns the 4-byte 'invalid' ip address.  Normally equivalent
 to inet_aton('255.255.255.255').
 
 =item sockaddr_in PORT, ADDRESS
@@ -118,18 +123,20 @@ use pack_sockaddr_in() and unpack_sockaddr_in() explicitly.
 
 =item pack_sockaddr_in PORT, IP_ADDRESS
 
-Takes two arguments, a port number and a 4 byte IP_ADDRESS (as returned by
-inet_aton()). Returns the sockaddr_in structure with those arguments
-packed in with AF_INET filled in.  For internet domain sockets, this
-structure is normally what you need for the arguments in bind(),
-connect(), and send(), and is also returned by getpeername(),
-getsockname() and recv().
+Takes two arguments, a port number and an opaque string, IP_ADDRESS
+(as returned by inet_aton(), or a v-string).  Returns the sockaddr_in
+structure with those arguments packed in with AF_INET filled in.  For
+Internet domain sockets, this structure is normally what you need for
+the arguments in bind(), connect(), and send(), and is also returned
+by getpeername(), getsockname() and recv().
 
 =item unpack_sockaddr_in SOCKADDR_IN
 
 Takes a sockaddr_in structure (as returned by pack_sockaddr_in()) and
-returns an array of two elements: the port and the 4-byte ip-address.
-Will croak if the structure does not have AF_INET in the right place.
+returns an array of two elements: the port and an opaque string
+representing the IP address (you can use inet_ntoa() to convert the
+address to the four-dotted numeric format).  Will croak if the
+structure does not have AF_INET in the right place.
 
 =item sockaddr_un PATHNAME
 
index 20a57a4..94d4fb5 100755 (executable)
@@ -13,7 +13,7 @@ BEGIN {
        
 use Socket;
 
-print "1..13\n";
+print "1..14\n";
 
 if (socket(T,PF_INET,SOCK_STREAM,6)) {
   print "ok 1\n";
@@ -33,8 +33,8 @@ if (socket(T,PF_INET,SOCK_STREAM,6)) {
        print(($read == 0 || $buff eq "hello") ? "ok 3\n" : "not ok 3\n");
   }
   else {
-       print "# You're allowed to fail tests 2 and 3 if.\n";
-       print "# The echo service has been disabled.\n";
+       print "# You're allowed to fail tests 2 and 3 if\n";
+       print "# the echo service has been disabled.\n";
        print "# $!\n";
        print "ok 2\n";
        print "ok 3\n";
@@ -63,8 +63,8 @@ if( socket(S,PF_INET,SOCK_STREAM,6) ){
        print(($read == 0 || $buff eq "olleh") ? "ok 6\n" : "not ok 6\n");
   }
   else {
-       print "# You're allowed to fail tests 5 and 6 if.\n";
-       print "# The echo service has been disabled.\n";
+       print "# You're allowed to fail tests 5 and 6 if\n";
+       print "# the echo service has been disabled.\n";
        print "# $!\n";
        print "ok 5\n";
        print "ok 6\n";
@@ -93,11 +93,13 @@ if((inet_ntoa((unpack_sockaddr_in(pack_sockaddr_in(100,inet_aton("10.250.230.10"
 } else {
     print "not ok 9\n"; 
 }
-print ((inet_aton("10.10.10.10") eq v10.10.10.10) ? "ok 10\n" : "not ok 10\n");
-print ((inet_ntoa(v10.10.10.10) eq '10.10.10.10') ? "ok 11\n" : "not ok 11\n");
+print ((inet_ntoa(inet_aton("10.20.30.40")) eq "10.20.30.40") ? "ok 10\n" : "not ok 10\n");
+print ((inet_ntoa(v10.20.30.40) eq "10.20.30.40") ? "ok 11\n" : "not ok 11\n");
 {
     my ($port,$addr) = unpack_sockaddr_in(pack_sockaddr_in(100,v10.10.10.10));
     print (($port == 100) ? "ok 12\n" : "not ok 12\n");
-    print (($addr eq v10.10.10.10) ? "ok 13\n" : "not ok 13\n");
+    print ((inet_ntoa($addr) eq "10.10.10.10") ? "ok 13\n" : "not ok 13\n");
 }
                                     
+eval { inet_ntoa(v10.20.30.400) };
+print (($@ =~ /^Wide character in Socket::inet_ntoa at/) ? "ok 14\n" : "not ok 14\n");
index 67f5279..73cf320 100644 (file)
@@ -179,6 +179,36 @@ not_here(char *s)
     return -1;
 }
 
+#define PERL_IN_ADDR_S_ADDR_SIZE 4
+
+/*
+* Bad assumptions possible here.
+*
+* Bad Assumption 1: struct in_addr has no other fields
+* than the s_addr (which is the field we care about
+* in here, really). However, we can be fed either 4-byte
+* addresses (from pack("N", ...), or va.b.c.d, or ...),
+* or full struct in_addrs (from e.g. pack_sockaddr_in()),
+* which may or may not be 4 bytes in size.
+*
+* Bad Assumption 2: the s_addr field is a simple type
+* (such as an int, u_int32_t).  It can be a bit field,
+* in which case using & (address-of) on it or taking sizeof()
+* wouldn't go over too well.  (Those are not attempted
+* now but in case someone thinks to change the below code
+* to use addr.s_addr instead of addr, you have been warned.)
+*
+* Bad Assumption 3: the s_addr is the first field in
+* an in_addr, or that its bytes are the first bytes in
+* an in_addr.
+*
+* These bad assumptions are wrong in UNICOS which has
+* struct in_addr { struct { u_long  st_addr:32; } s_da };
+* #define s_addr s_da.st_addr
+* and u_long is 64 bits.
+*
+* --jhi */
+
 #include "constants.c"
 
 MODULE = Socket                PACKAGE = Socket
@@ -200,10 +230,9 @@ inet_aton(host)
        }
 
        ST(0) = sv_newmortal();
-       if (ok) {
+       if (ok)
                sv_setpvn( ST(0), (char *)&ip_address, sizeof ip_address );
        }
-       }
 
 void
 inet_ntoa(ip_address_sv)
@@ -213,22 +242,31 @@ inet_ntoa(ip_address_sv)
        STRLEN addrlen;
        struct in_addr addr;
        char * addr_str;
-       char * ip_address = SvPV(ip_address_sv,addrlen);
-       if (addrlen != sizeof(addr)) {
-           croak("Bad arg length for %s, length is %d, should be %d",
-                       "Socket::inet_ntoa",
-                       addrlen, sizeof(addr));
-       }
-
-       Copy( ip_address, &addr, sizeof addr, char );
-#if defined(__hpux) && defined(__GNUC__) && defined(USE_64_BIT_INT)
-        /* GCC on HP_UX breaks the call to inet_ntoa, // sky*/
-       addr_str = (char *) malloc(16);
-       sprintf(addr_str, "%d.%d.%d.%d", ((addr.s_addr >> 24) & 0xFF) , ((addr.s_addr >> 16) & 0xFF), ((addr.s_addr >> 8) & 0xFF), (addr.s_addr  & 0xFF));
-#else
-       addr_str = inet_ntoa(addr);
-#endif
+       char * ip_address;
+       if (DO_UTF8(ip_address_sv) && !sv_utf8_downgrade(ip_address_sv, 1))
+            croak("Wide character in Socket::inet_ntoa");
+       ip_address = SvPV(ip_address_sv, addrlen);
+       if (addrlen == sizeof(addr) || addrlen == 4)
+               addr.s_addr =
+                   (ip_address[0] & 0xFF) << 24 |
+                   (ip_address[1] & 0xFF) << 16 |
+                   (ip_address[2] & 0xFF) <<  8 |
+                   (ip_address[3] & 0xFF);
+       else
+               croak("Bad arg length for %s, length is %d, should be %d",
+                     "Socket::inet_ntoa",
+                     addrlen, sizeof(addr));
+       /* We could use inet_ntoa() but that is broken
+        * in HP-UX + GCC + 64bitint (returns "0.0.0.0"),
+        * so let's use this sprintf() workaround everywhere. */
+       New(1138, addr_str, 4 * 3 + 3 + 1, char);
+       sprintf(addr_str, "%d.%d.%d.%d",
+               ((addr.s_addr >> 24) & 0xFF),
+               ((addr.s_addr >> 16) & 0xFF),
+               ((addr.s_addr >>  8) & 0xFF),
+               ( addr.s_addr        & 0xFF));
        ST(0) = sv_2mortal(newSVpvn(addr_str, strlen(addr_str)));
+       Safefree(addr_str);
        }
 
 void
@@ -316,18 +354,32 @@ unpack_sockaddr_un(sun_sv)
        }
 
 void
-pack_sockaddr_in(port,ip_address)
+pack_sockaddr_in(port, ip_address_sv)
        unsigned short  port
-       char *  ip_address
+       SV *    ip_address_sv
        CODE:
        {
        struct sockaddr_in sin;
-
+       struct in_addr addr;
+       STRLEN addrlen;
+       char * ip_address;
+       if (DO_UTF8(ip_address_sv) && !sv_utf8_downgrade(ip_address_sv, 1))
+            croak("Wide character in Socket::pack_sockaddr_in");
+       ip_address = SvPV(ip_address_sv, addrlen);
+       if (addrlen == sizeof(addr) || addrlen == 4)
+               addr.s_addr =
+                   (ip_address[0] & 0xFF) << 24 |
+                   (ip_address[1] & 0xFF) << 16 |
+                   (ip_address[2] & 0xFF) <<  8 |
+                   (ip_address[3] & 0xFF);
+       else
+               croak("Bad arg length for %s, length is %d, should be %d",
+                     "Socket::pack_sockaddr_in",
+                     addrlen, sizeof(addr));
        Zero( &sin, sizeof sin, char );
        sin.sin_family = AF_INET;
        sin.sin_port = htons(port);
-       Copy( ip_address, &sin.sin_addr, sizeof sin.sin_addr, char );
-
+       sin.sin_addr.s_addr = htonl(addr.s_addr);
        ST(0) = sv_2mortal(newSVpvn((char *)&sin, sizeof sin));
        }
 
@@ -339,7 +391,7 @@ unpack_sockaddr_in(sin_sv)
        STRLEN sockaddrlen;
        struct sockaddr_in addr;
        unsigned short  port;
-       struct in_addr  ip_address;
+       struct in_addr  ip_address;
        char *  sin = SvPV(sin_sv,sockaddrlen);
        if (sockaddrlen != sizeof(addr)) {
            croak("Bad arg length for %s, length is %d, should be %d",
@@ -358,5 +410,5 @@ unpack_sockaddr_in(sin_sv)
 
        EXTEND(SP, 2);
        PUSHs(sv_2mortal(newSViv((IV) port)));
-       PUSHs(sv_2mortal(newSVpvn((char *)&ip_address,sizeof ip_address)));
+       PUSHs(sv_2mortal(newSVpvn((char *)&ip_address, sizeof ip_address)));
        }
index 3f07731..dc71fe5 100644 (file)
@@ -1,3 +1,12 @@
+Tue Aug 28 23:53:20 MEST 2001   Raphael Manfredi <Raphael_Manfredi@pobox.com>
+
+. Description:
+
+       Fixed truncation race with lock_retrieve() in lock_store().
+       The file has to be truncated only once the exclusive lock is held.
+
+       Removed spurious debugging messages in .xs file.
+
 Sun Jul  1 13:27:32 MEST 2001   Raphael Manfredi <Raphael_Manfredi@pobox.com>
 
 . Description:
index 6bc2a75..ba8c0f6 100644 (file)
@@ -1,4 +1,4 @@
-;# $Id: Storable.pm,v 1.0.1.11 2001/07/01 11:22:14 ram Exp $
+;# $Id: Storable.pm,v 1.0.1.12 2001/08/28 21:51:51 ram Exp $
 ;#
 ;#  Copyright (c) 1995-2000, Raphael Manfredi
 ;#  
@@ -6,6 +6,9 @@
 ;#  in the README file that comes with the distribution.
 ;#
 ;# $Log: Storable.pm,v $
+;# Revision 1.0.1.12  2001/08/28 21:51:51  ram
+;# patch13: fixed truncation race with lock_retrieve() in lock_store()
+;#
 ;# Revision 1.0.1.11  2001/07/01 11:22:14  ram
 ;# patch12: systematically use "=over 4" for POD linters
 ;# patch12: updated version number
@@ -63,7 +66,7 @@ package Storable; @ISA = qw(Exporter DynaLoader);
 use AutoLoader;
 use vars qw($forgive_me $VERSION);
 
-$VERSION = '1.012';
+$VERSION = '1.013';
 *AUTOLOAD = \&AutoLoader::AUTOLOAD;            # Grrr...
 
 #
@@ -172,9 +175,8 @@ sub _store {
        logcroak "not a reference" unless ref($self);
        logcroak "wrong argument number" unless @_ == 2;        # No @foo in arglist
        local *FILE;
-       open(FILE, ">$file") || logcroak "can't create $file: $!";
-       binmode FILE;                           # Archaic systems...
        if ($use_locking) {
+               open(FILE, ">>$file") || logcroak "can't write into $file: $!";
                unless (&CAN_FLOCK) {
                        logcarp "Storable::lock_store: fcntl/flock emulation broken on $^O";
                        return undef;
@@ -183,7 +185,10 @@ sub _store {
                        logcroak "can't get exclusive lock on $file: $!";
                truncate FILE, 0;
                # Unlocking will happen when FILE is closed
+       } else {
+               open(FILE, ">$file") || logcroak "can't create $file: $!";
        }
+       binmode FILE;                           # Archaic systems...
        my $da = $@;                            # Don't mess if called from exception handler
        my $ret;
        # Call C routine nstore or pstore, depending on network order
index 3c79eb6..f2c0e2b 100644 (file)
@@ -3,7 +3,7 @@
  */
 
 /*
- * $Id: Storable.xs,v 1.0.1.9 2001/07/01 11:25:02 ram Exp $
+ * $Id: Storable.xs,v 1.0.1.10 2001/08/28 21:52:14 ram Exp $
  *
  *  Copyright (c) 1995-2000, Raphael Manfredi
  *  
@@ -11,6 +11,9 @@
  *  in the README file that comes with the distribution.
  *
  * $Log: Storable.xs,v $
+ * Revision 1.0.1.10  2001/08/28 21:52:14  ram
+ * patch13: removed spurious debugging messages
+ *
  * Revision 1.0.1.9  2001/07/01 11:25:02  ram
  * patch12: fixed memory corruption on croaks during thaw()
  * patch12: made code compile cleanly with -Wall (Jarkko Hietaniemi)
@@ -1261,9 +1264,6 @@ stcxt_t *parent_cxt;
        cxt->prev = parent_cxt;
        SET_STCXT(cxt);
 
-       TRACEME(("kbuf has %d bytes at 0x%x", ksiz, kbuf));
-       TRACEME(("mbuf has %d bytes at 0x%x", msiz, mbase));
-
        ASSERT(!cxt->s_dirty, ("clean context"));
 
        return cxt;
index be462e6..feeb5cf 100644 (file)
@@ -86,7 +86,7 @@ else {
 # Two-arg tv_interval() is always available.
 {
     my $f = tv_interval [5, 100_000], [10, 500_000];
-    ok 9, $f == 5.4, $f;
+    ok 9, abs($f - 5.4) < 0.001, $f;
 }
 
 if (!$have_gettimeofday) {
index ee9f7b8..ab477a0 100644 (file)
@@ -211,8 +211,11 @@ Perl_op_null
 Perl_load_module
 Perl_vload_module
 Perl_looks_like_number
+Perl_grok_bin
+Perl_grok_hex
 Perl_grok_number
 Perl_grok_numeric_radix
+Perl_grok_oct
 Perl_markstack_grow
 Perl_mess
 Perl_vmess
@@ -395,6 +398,7 @@ Perl_sv_2nv
 Perl_sv_2pv
 Perl_sv_2pvutf8
 Perl_sv_2pvbyte
+Perl_sv_pvn_nomg
 Perl_sv_2uv
 Perl_sv_iv
 Perl_sv_uv
diff --git a/gv.c b/gv.c
index 33e6cd2..6538377 100644 (file)
--- a/gv.c
+++ b/gv.c
@@ -814,20 +814,16 @@ Perl_gv_fetchpv(pTHX_ const char *nambeg, I32 add, I32 sv_type)
        break;
 
     case '&':
-       if (len > 1)
-           break;
-       PL_sawampersand = TRUE;
-       goto ro_magicalize;
-
     case '`':
-       if (len > 1)
-           break;
-       PL_sawampersand = TRUE;
-       goto ro_magicalize;
-
     case '\'':
-       if (len > 1)
-           break;
+       if (
+           len > 1 ||
+           sv_type == SVt_PVAV ||
+           sv_type == SVt_PVHV ||
+           sv_type == SVt_PVCV ||
+           sv_type == SVt_PVFM ||
+           sv_type == SVt_PVIO
+       ) { break; }
        PL_sawampersand = TRUE;
        goto ro_magicalize;
 
index fd39a09..1559aaa 100644 (file)
@@ -487,10 +487,10 @@ PERLVAR(Ireentrant_buffer, REBUF*)        /* here we store the _r buffers */
 
 PERLVAR(Isavebegin,     bool)  /* save BEGINs for compiler     */
 
-#ifdef PERL_CUSTOM_OPS
+
 PERLVAR(Icustom_op_names, HV*)  /* Names of user defined ops */
 PERLVAR(Icustom_op_descs, HV*)  /* Descriptions of user defined ops */
-#endif
+
 /* New variables must be added to the very end for binary compatibility.
  * XSUB.h provides wrapper functions via perlapi.h that make this
  * irrelevant, but not all code may be expected to #include XSUB.h. */
index b71a36d..aa42bc8 100644 (file)
@@ -2,8 +2,8 @@ package Attribute::Handlers;
 use 5.006;
 use Carp;
 use warnings;
-$VERSION = '0.70';
-$DB::single=1;
+$VERSION = '0.75';
+$DB::single=1;
 
 my %symcache;
 sub findsym {
@@ -36,19 +36,23 @@ sub _usage_AH_ {
        croak "Usage: use $_[0] autotie => {AttrName => TieClassName,...}";
 }
 
+my $qual_id = qr/^[_a-z]\w*(::[_a-z]\w*)*$/i;
+
 sub import {
     my $class = shift @_;
     return unless $class eq "Attribute::Handlers";
     while (@_) {
        my $cmd = shift;
-        if ($cmd eq 'autotie') {
+        if ($cmd =~ /^autotie((?:ref)?)$/) {
+           my $tiedata = '($was_arrayref ? $data : @$data)';
+              $tiedata = ($1 ? '$ref, ' : '') . $tiedata;
             my $mapping = shift;
            _usage_AH_ $class unless ref($mapping) eq 'HASH';
            while (my($attr, $tieclass) = each %$mapping) {
-               $tieclass =~ s/^([_a-z]\w*(::[_a-z]\w*))(.*)/$1/is;
+                $tieclass =~ s/^([_a-z]\w*(::[_a-z]\w*)*)(.*)/$1/is;
                my $args = $3||'()';
-               usage $class unless $attr =~ m/^[_a-z]\w*(::[_a-z]\w*)*$/i
-                                && $tieclass =~ m/^[_a-z]\w*(::[_a-z]\w*)/i
+               _usage_AH_ $class unless $attr =~ $qual_id
+                                && $tieclass =~ $qual_id
                                 && eval "use base $tieclass; 1";
                if ($tieclass->isa('Exporter')) {
                    local $Exporter::ExportLevel = 2;
@@ -59,14 +63,12 @@ sub import {
                eval qq{
                    sub $attr : ATTR(VAR) {
                        my (\$ref, \$data) = \@_[2,4];
-                       \$data = [ \$data ] unless ref \$data eq 'ARRAY';
-                       # print \$ref, ": ";
-                       # use Data::Dumper 'Dumper';
-                       # print Dumper [ [\$ref, \$data] ];
+                       my \$was_arrayref = ref \$data eq 'ARRAY';
+                       \$data = [ \$data ] unless \$was_arrayref;
                        my \$type = ref(\$ref)||"value (".(\$ref||"<undef>").")";
-                        (\$type eq 'SCALAR')? tie \$\$ref,'$tieclass',\@\$data
-                       :(\$type eq 'ARRAY') ? tie \@\$ref,'$tieclass',\@\$data
-                       :(\$type eq 'HASH')  ? tie \%\$ref,'$tieclass',\@\$data
+                        (\$type eq 'SCALAR')? tie \$\$ref,'$tieclass',$tiedata
+                       :(\$type eq 'ARRAY') ? tie \@\$ref,'$tieclass',$tiedata
+                       :(\$type eq 'HASH')  ? tie \%\$ref,'$tieclass',$tiedata
                        : die "Can't autotie a \$type\n"
                    } 1
                } or die "Internal error: $@";
@@ -91,10 +93,10 @@ sub _resolve_lastattr {
 }
 
 sub AUTOLOAD {
-       my ($class) = @_;
-       $AUTOLOAD =~ /_ATTR_(.*?)_(.*)/ or
+       my ($class) = $AUTOLOAD =~ m/(.*)::/g;
+       $AUTOLOAD =~ m/_ATTR_(.*?)_(.*)/ or
            croak "Can't locate class method '$AUTOLOAD' via package '$class'";
-       croak "Attribute handler '$2' doesn't handle $1 attributes";
+       croak "Attribute handler '$3' doesn't handle $2 attributes";
 }
 
 sub DESTROY {}
@@ -106,7 +108,7 @@ sub _gen_handler_AH_() {
            _resolve_lastattr;
            my ($pkg, $ref, @attrs) = @_;
            foreach (@attrs) {
-               my ($attr, $data) = /^([a-z_]\w*)(?:[(](.*)[)])?$/i or next;
+               my ($attr, $data) = /^([a-z_]\w*)(?:[(](.*)[)])?$/is or next;
                if ($attr eq 'ATTR') {
                        $data ||= "ANY";
                        $raw{$ref} = $data =~ s/\s*,?\s*RAWDATA\s*,?\s*//;
@@ -185,8 +187,8 @@ Attribute::Handlers - Simpler definition of attribute handlers
 
 =head1 VERSION
 
-This document describes version 0.70 of Attribute::Handlers,
-released June  3, 2001.
+This document describes version 0.75 of Attribute::Handlers,
+released September  3, 2001.
 
 =head1 SYNOPSIS
 
@@ -546,11 +548,36 @@ C<__CALLER__>, which may be specified as the qualifier of an attribute:
 
         package Tie::Me::Kangaroo:Down::Sport;
 
-        use Attribute::Handler autotie => { __CALLER__::Roo => __PACKAGE__ };
+        use Attribute::Handlers autotie => { __CALLER__::Roo => __PACKAGE__ };
 
 This causes Attribute::Handlers to define the C<Roo> attribute in the package
 that imports the Tie::Me::Kangaroo:Down::Sport module.
 
+=head3 Passing the tied object to C<tie>
+
+Occasionally it is important to pass a reference to the object being tied
+to the TIESCALAR, TIEHASH, etc. that ties it. 
+
+The C<autotie> mechanism supports this too. The following code:
+
+       use Attribute::Handlers autotieref => { Selfish => Tie::Selfish };
+       my $var : Selfish(@args);
+
+has the same effect as:
+
+       tie my $var, 'Tie::Selfish', @args;
+
+But when C<"autotieref"> is used instead of C<"autotie">:
+
+       use Attribute::Handlers autotieref => { Selfish => Tie::Selfish };
+       my $var : Selfish(@args);
+
+the effect is to pass the C<tie> call an extra reference to the variable
+being tied:
+
+        tie my $var, 'Tie::Selfish', \$var, @args;
+
+
 
 =head1 EXAMPLES
 
@@ -728,7 +755,7 @@ in a single C<ATTR(I<specification>)>.
 =item C<Can't autotie a %s>
 
 You can only declare autoties for types C<"SCALAR">, C<"ARRAY">, and
-C<"SCALAR">. They're the only things (apart from typeglobs -- which are
+C<"HASH">. They're the only things (apart from typeglobs -- which are
 not declarable) that Perl can tie.
 
 =item C<Internal error: %s symbol went missing>
@@ -752,5 +779,4 @@ Bug reports and other feedback are most welcome.
 
          Copyright (c) 2001, Damian Conway. All Rights Reserved.
        This module is free software. It may be used, redistributed
-      and/or modified under the terms of the Perl Artistic License
-            (see http://www.perl.com/perl/misc/Artistic.html)
+           and/or modified under the same terms as Perl itself.
index 9aa870e..4df4edb 100644 (file)
@@ -26,7 +26,7 @@ Revision history for Perl extension Attribute::Handlers
        - Critical doc patch
 
 
-0.65   Sun Jun  3 07:40:03 2001
+0.70   Sun Jun  3 07:40:03 2001
 
        - Added __CALLER__ pseudo class for 'autotie'
 
@@ -44,3 +44,20 @@ Revision history for Perl extension Attribute::Handlers
 
        - Cleaned up interactions with other class hierarchies
          (due to being base class of UNIVERSAL)
+
+
+0.75   Mon Sep  3 09:07:08 2001
+
+       - Cleaned up AUTOLOAD
+
+       - Numerous bug fixes (thanks Pete)
+
+       - Fixed handling of attribute data that includes a newline (thanks Pete)
+
+       - Added "autotieref" option (thanks Pete)
+
+       - Switched off $DB::single
+
+       - Changed licence for inclusion in core distribution
+
+       - Fixed 'autotie' for tied classes with multi-level names (thanks Jeff)
index 2de8de9..e8f0783 100644 (file)
@@ -1,5 +1,5 @@
 ==============================================================================
-                Release of version 0.70 of Attribute::Handlers
+                Release of version 0.75 of Attribute::Handlers
 ==============================================================================
 
 
@@ -46,15 +46,28 @@ AUTHOR
 COPYRIGHT
              Copyright (c) 2001, Damian Conway. All Rights Reserved.
            This module is free software. It may be used, redistributed
-          and/or modified under the terms of the Perl Artistic License
-                (see http://www.perl.com/perl/misc/Artistic.html)
+               and/or modified under the same terms as Perl itself.
 
 
 ==============================================================================
 
-CHANGES IN VERSION 0.70
+CHANGES IN VERSION 0.75
+
+
+       - Cleaned up AUTOLOAD
+
+       - Numerous bug fixes (thanks Pete)
+
+       - Fixed handling of attribute data that includes a newline (thanks Pete)
+
+       - Added "autotieref" option (thanks Pete)
+
+       - Switched off $DB::single
+
+       - Changed licence for inclusion in core distribution
+
+       - Fixed 'autotie' for tied classes with multi-level names (thanks Jeff)
 
-(No changes have been documented for this version)
 
 ==============================================================================
 
index 02fa64a..7a269e8 100755 (executable)
@@ -4,7 +4,7 @@ use v5.6.0;
 use base Demo;
 
 my $y : Demo :This($this) = sub : Demo(1,2,3) {};
-sub x : Demo(4,5,6) :Multi {}
+sub x : Demo(4, 5, 6) :Multi {}
 my %z : Demo(hash) :Multi(method,maybe);
 # my %a : NDemo(hash);
 
index 954316f..771de94 100755 (executable)
@@ -1,9 +1,15 @@
-use Attribute::Handlers autotie => { Cycle => Tie::Cycle };
+package Selfish;
 
-my $next : Cycle(['A'..'Z']);
+sub TIESCALAR {
+       use Data::Dumper 'Dumper';
+       print Dumper [ \@_ ];
+       bless {}, $_[0];
+}
 
-print tied $next, "\n";
+package main;
 
-while (<>) {
-       print $next, "\n";
-}
+use Attribute::Handlers autotieref => { Selfish => Selfish };
+
+my $next : Selfish("me");
+
+print "$next\n";
similarity index 76%
rename from lib/Attribute/Handlers/test.pl
rename to lib/Attribute/Handlers/t/multi.t
index 5056fa8..5f4e59e 100644 (file)
@@ -1,21 +1,10 @@
-# Before `make install' is performed this script should be runnable with
-# `make test'. After `make install' it should work as `perl test.pl'
-
-######################### We start with some black magic to print on failure.
-
-BEGIN {
-    chdir 't' if -d 't';
-    @INC = '../lib';
-}
-
-# Change 1..1 below to 1..last_test_to_print .
-# (It may become useful if the test is moved to ./t subdirectory.)
-
 END {print "not ok 1\n" unless $loaded;}
 use v5.6.0;
 use Attribute::Handlers;
 $loaded = 1;
 
+CHECK { $main::phase++ }
+
 ######################### End of black magic.
 
 # Insert your test code below (better if it prints "ok 13"
@@ -25,13 +14,17 @@ $loaded = 1;
 sub ok { $::count++; push @::results, [$_[1], $_[0]?"":"not "]; }
 
 END { print "1..$::count\n";
-      print map "$_->[1]ok $_->[0]\n", sort {$a->[0]<=>$b->[0]} @::results }
+      print map "$_->[1]ok $_->[0]\n",
+               sort {$a->[0]<=>$b->[0]}
+                       grep $_->[0], @::results }
 
 package Test;
 use warnings;
 no warnings 'redefine';
 
-sub UNIVERSAL::Okay :ATTR { ::ok @{$_[4]} }
+sub UNIVERSAL::Lastly :ATTR(INIT) { ::ok $_[4][0] && $main::phase, $_[4][1] }
+
+sub UNIVERSAL::Okay :ATTR(BEGIN) { ::ok  $_[4][0] && !$main::phase, $_[4][1] }
 
 sub Dokay :ATTR(SCALAR) { ::ok @{$_[4]} }
 sub Dokay :ATTR(HASH)   { ::ok @{$_[4]} }
@@ -45,10 +38,10 @@ sub Aokay :ATTR(ANY)    { ::ok @{$_[4]} }
 package main;
 use warnings;
 
-my $x1 :Okay(1,1);
-my @x1 :Okay(1=>2);
-my %x1 :Okay(1,3);
-sub x1 :Okay(1,4) {}
+my $x1 :Lastly(1,41);
+my @x1 :Lastly(1=>42);
+my %x1 :Lastly(1,43);
+sub x1 :Lastly(1,44) {}
 
 my Test $x2 :Dokay(1,5);
 
@@ -89,6 +82,11 @@ sub y3 :Okay(1,27) {}
 
 package Unrelated;
 
+my $x11 :Okay(1,1);
+my @x11 :Okay(1=>2);
+my %x11 :Okay(1,3);
+sub x11 :Okay(1,4) {}
+
 BEGIN { eval 'my $x7 :Dokay(0,28)' or ::ok(1,28); }
 my Test $x8 :Dokay(1,29);
 eval 'sub x7 :Dokay(0,30) {}' or ::ok(1,30);
@@ -107,7 +105,7 @@ sub FETCH { ::ok(1,35); return 1 }
 sub STORE { ::ok(1,36); return 1 }
 sub FETCHSIZE { 100 }
 
-package Tie::Rowdy;
+package Tie::Row::dy;
 
 sub TIEHASH { ::ok(1,$_[1]); bless {}, $_[0] }
 sub FETCH { ::ok(1,38); return 1 }
@@ -115,9 +113,11 @@ sub STORE { ::ok(1,39); return 1 }
 
 package main;
 
+eval 'sub x7 :ATTR(SCALAR) :ATTR(CODE) {}' and ::ok(0,40) or ::ok(1,40);
+
 use Attribute::Handlers autotie => {      Other::Loud => Tie::Loud,
                                                Noisy => Tie::Noisy,
-                                    UNIVERSAL::Rowdy => Tie::Rowdy,
+                                    UNIVERSAL::Rowdy => Tie::Row::dy,
                                    };
 
 my Other $loud : Loud;
@@ -128,3 +128,4 @@ $noisy[0]++;
 
 my %rowdy : Rowdy(37);
 $rowdy{key}++;
+
index 3af2e9f..2829e22 100644 (file)
@@ -218,6 +218,7 @@ CGI::Response
 require 5.000;
 use Exporter;
 use Carp;
+use File::Spec;
 
 @ISA = qw(Exporter);
 @EXPORT = qw(confess croak carp);
@@ -248,19 +249,19 @@ sub realdie { CORE::die(@_); }
 sub id {
     my $level = shift;
     my($pack,$file,$line,$sub) = caller($level);
-    my($id) = $file=~m|([^/]+)$|;
+    my($dev,$dirs,$id) = File::Spec->splitpath($file);
     return ($file,$line,$id);
 }
 
 sub stamp {
     my $time = scalar(localtime);
     my $frame = 0;
-    my ($id,$pack,$file);
+     my ($id,$pack,$file,$dev,$dirs);
     do {
        $id = $file;
        ($pack,$file) = caller($frame++);
     } until !$file;
-    ($id) = $id=~m|([^/]+)$|;
+    ($dev,$dirs,$id) = File::Spec->splitpath($id);
     return "[$time] $id: ";
 }
 
diff --git a/lib/CGI/t/apache.t b/lib/CGI/t/apache.t
new file mode 100644 (file)
index 0000000..2725bbe
--- /dev/null
@@ -0,0 +1,7 @@
+#!/usr/local/bin/perl -w
+
+use strict;
+use Test::More tests => 1;
+
+# Can't do much with this other than make sure it loads properly
+BEGIN { use_ok('CGI::Apache') };
\ No newline at end of file
diff --git a/lib/CGI/t/carp.t b/lib/CGI/t/carp.t
new file mode 100644 (file)
index 0000000..8415816
--- /dev/null
@@ -0,0 +1,263 @@
+# -*- Mode: cperl; coding: utf-8; cperl-indent-level: 2 -*-
+#!/usr/local/bin/perl -w
+
+use strict;
+use lib qw(t/lib);
+use Test::More tests => 42;
+use IO::Handle;
+
+BEGIN { use_ok('CGI::Carp') };
+
+#-----------------------------------------------------------------------------
+# Test id
+#-----------------------------------------------------------------------------
+
+# directly invoked
+my $expect_f = __FILE__;
+my $expect_l = __LINE__ + 1;
+my ($file, $line, $id) = CGI::Carp::id(0);
+is($file, $expect_f, "file");
+is($line, $expect_l, "line");
+is($id, "carp.t", "id");
+
+# one level of indirection
+sub id1 { my $level = shift; return CGI::Carp::id($level); };
+
+$expect_l = __LINE__ + 1;
+($file, $line, $id) = id1(1);
+is($file, $expect_f, "file");
+is($line, $expect_l, "line");
+is($id, "carp.t", "id");
+
+# two levels of indirection
+sub id2 { my $level = shift; return id1($level); };
+
+$expect_l = __LINE__ + 1;
+($file, $line, $id) = id2(2);
+is($file, $expect_f, "file");
+is($line, $expect_l, "line");
+is($id, "carp.t", "id");
+
+#-----------------------------------------------------------------------------
+# Test stamp
+#-----------------------------------------------------------------------------
+
+my $stamp = "/^\\[
+      ([a-z]{3}\\s){2}\\s?
+      [\\s\\d:]+
+      \\]\\s$id:/ix";
+
+like(CGI::Carp::stamp(),
+     $stamp,
+     "Time in correct format");
+
+sub stamp1 {return CGI::Carp::stamp()};
+sub stamp2 {return stamp1()};
+
+like(stamp2(), $stamp, "Time in correct format");
+
+#-----------------------------------------------------------------------------
+# Test warn and _warn
+#-----------------------------------------------------------------------------
+
+# set some variables to control what's going on.
+$CGI::Carp::WARN = 0;
+$CGI::Carp::EMIT_WARNINGS = 0;
+@CGI::Carp::WARNINGS = ();
+my $q_file = quotemeta($file);
+
+
+# Test that realwarn is called
+{
+  local $^W = 0;
+  eval "sub CGI::Carp::realwarn {return 'Called realwarn'};";
+}
+
+$expect_l = __LINE__ + 1;
+is(CGI::Carp::warn("There is a problem"),
+   "Called realwarn",
+   "CGI::Carp::warn calls CORE::warn");
+is(@CGI::Carp::WARNINGS, 0, "_warn not called");
+
+# Test that message is constructed correctly
+eval 'sub CGI::Carp::realwarn {my $mess = shift; return $mess};';
+
+$expect_l = __LINE__ + 1;
+like(CGI::Carp::warn("There is a problem"),
+   "/] $id: There is a problem at $q_file line $expect_l.".'$/',
+   "CGI::Carp::warn builds correct message");
+is(@CGI::Carp::WARNINGS, 0, "_warn not called");
+
+# Test that _warn is called at the correct time
+$CGI::Carp::WARN = 1;
+
+$expect_l = __LINE__ + 1;
+like(CGI::Carp::warn("There is a problem"),
+   "/] $id: There is a problem at $q_file line $expect_l.".'$/',
+   "CGI::Carp::warn builds correct message");
+
+is(@CGI::Carp::WARNINGS, 1, "_warn now called");
+like($CGI::Carp::WARNINGS[0],
+   "/There is a problem at $q_file line $expect_l.".'$/',
+   "CGI::Carp::WARNINGS has correct message (without stamp)");
+
+#-----------------------------------------------------------------------------
+# Test ineval
+#-----------------------------------------------------------------------------
+
+ok(!CGI::Carp::ineval, 'ineval returns false when not in eval');
+eval {ok(CGI::Carp::ineval, 'ineval returns true when in eval');};
+
+#-----------------------------------------------------------------------------
+# Test die
+#-----------------------------------------------------------------------------
+
+# set some variables to control what's going on.
+$CGI::Carp::WRAP = 0;
+
+$expect_l = __LINE__ + 1;
+eval { CGI::Carp::die('There is a problem'); };
+like($@,
+     '/^There is a problem/',
+     'CGI::Carp::die calls CORE::die without altering argument in eval');
+
+# Test that realwarn is called
+{
+  local $^W = 0;
+  eval 'sub CGI::Carp::realdie {my $mess = shift; return $mess};';
+}
+
+like(CGI::Carp::die('There is a problem'),
+     $stamp,
+     'CGI::Carp::die calls CORE::die, but adds stamp');
+
+#-----------------------------------------------------------------------------
+# Test set_message
+#-----------------------------------------------------------------------------
+
+is(CGI::Carp::set_message('My new Message'),
+   'My new Message',
+   'CGI::Carp::set_message returns new message');
+
+is($CGI::Carp::CUSTOM_MSG,
+   'My new Message',
+   'CGI::Carp::set_message message set correctly');
+
+# set the message back to the empty string so that the tests later
+# work properly.
+CGI::Carp::set_message(''),
+
+#-----------------------------------------------------------------------------
+# Test warnings_to_browser
+#-----------------------------------------------------------------------------
+
+CGI::Carp::warningsToBrowser(0);
+is($CGI::Carp::EMIT_WARNINGS, 0, "Warnings turned off");
+unless( is(@CGI::Carp::WARNINGS, 1, "_warn not called") ) {
+  print join "\n", map "'$_'", @CGI::Carp::WARNINGS;
+}
+
+# turn off STDOUT (prevents spurious warnings to screen
+tie *STDOUT, 'StoreStuff' or die "Can't tie STDOUT";
+CGI::Carp::warningsToBrowser(1);
+my $fake_out = join '', <STDOUT>;
+untie *STDOUT;
+
+open(STDOUT, ">&REAL_STDOUT");
+is( $fake_out, "<!-- warning: There is a problem at $0 line 95. -->\n",
+                        'warningsToBrowser() on' );
+
+is($CGI::Carp::EMIT_WARNINGS, 1, "Warnings turned off");
+is(@CGI::Carp::WARNINGS, 0, "_warn is called");
+
+#-----------------------------------------------------------------------------
+# Test fatals_to_browser
+#-----------------------------------------------------------------------------
+
+package StoreStuff;
+
+sub TIEHANDLE {
+  my $class = shift;
+  bless [], $class;
+}
+
+sub PRINT {
+  my $self = shift;
+  push @$self, @_;
+}
+
+sub READLINE {
+  my $self = shift;
+  shift @$self;
+}
+
+package main;
+
+tie *STDOUT, "StoreStuff";
+
+# do tests
+my @result;
+
+CGI::Carp::fatalsToBrowser();
+$result[0] .= $_ while (<STDOUT>);
+
+CGI::Carp::fatalsToBrowser('Message to the world');
+$result[1] .= $_ while (<STDOUT>);
+
+$ENV{SERVER_ADMIN} = 'foo@bar.com';
+CGI::Carp::fatalsToBrowser();
+$result[2] .= $_ while (<STDOUT>);
+
+CGI::Carp::set_message('Override the message passed in'),
+
+CGI::Carp::fatalsToBrowser('Message to the world');
+$result[3] .= $_ while (<STDOUT>);
+CGI::Carp::set_message(''),
+delete $ENV{SERVER_ADMIN};
+
+# now restore STDOUT
+untie *STDOUT;
+
+
+like($result[0],
+     '/Content-type: text/html/',
+     "Default string has header");
+
+ok($result[0] !~ /Message to the world/, "Custom message not in default string");
+
+like($result[1],
+    '/Message to the world/',
+    "Custom Message appears in output");
+
+ok($result[0] !~ /foo\@bar.com/, "Server Admin does not appear in default message");
+
+like($result[2],
+    '/foo@bar.com/',
+    "Server Admin appears in output");
+
+like($result[3],
+     '/Message to the world/',
+     "Custom message not in result");
+
+like($result[3],
+     '/Override the message passed in/',
+     "Correct message in string");
+
+#-----------------------------------------------------------------------------
+# Test to_filehandle
+#-----------------------------------------------------------------------------
+
+sub buffer {
+  CGI::Carp::to_filehandle (@_);
+}
+
+tie *STORE, "StoreStuff";
+
+require FileHandle;
+my $fh = FileHandle->new;
+
+ok( defined buffer(\*STORE),       '\*STORE returns proper filehandle');
+ok( defined buffer( $fh ),         '$fh returns proper filehandle');
+ok( defined buffer('::STDOUT'),    'STDIN returns proper filehandle');
+ok( defined buffer(*main::STDOUT), 'STDIN returns proper filehandle');
+ok(!defined buffer("WIBBLE"),      '"WIBBLE" doesn\'t returns proper filehandle');
diff --git a/lib/CGI/t/cookie.t b/lib/CGI/t/cookie.t
new file mode 100644 (file)
index 0000000..25b6a3a
--- /dev/null
@@ -0,0 +1,321 @@
+#!/usr/local/bin/perl -w
+
+use strict;
+use Test::More tests => 86;
+use CGI::Util qw(escape unescape);
+use POSIX qw(strftime);
+
+#-----------------------------------------------------------------------------
+# make sure module loaded
+#-----------------------------------------------------------------------------
+
+BEGIN {use_ok('CGI::Cookie');}
+
+my @test_cookie = (
+                  'foo=123; bar=qwerty; baz=wibble; qux=a1',
+                  'foo=123; bar=qwerty; baz=wibble;',
+                  'foo=vixen; bar=cow; baz=bitch; qux=politician',
+                  'foo=a%20phrase; bar=yes%2C%20a%20phrase; baz=%5Ewibble; qux=%27',
+                  );
+
+#-----------------------------------------------------------------------------
+# Test parse
+#-----------------------------------------------------------------------------
+
+{
+  my $result = CGI::Cookie->parse($test_cookie[0]);
+
+  is(ref($result), 'HASH', "Hash ref returned in scalar context");
+
+  my @result = CGI::Cookie->parse($test_cookie[0]);
+
+  is(@result, 8, "returns correct number of fields");
+
+  @result = CGI::Cookie->parse($test_cookie[1]);
+
+  is(@result, 6, "returns correct number of fields");
+
+  my %result = CGI::Cookie->parse($test_cookie[0]);
+
+  is($result{foo}->value, '123', "cookie foo is correct");
+  is($result{bar}->value, 'qwerty', "cookie bar is correct");
+  is($result{baz}->value, 'wibble', "cookie baz is correct");
+  is($result{qux}->value, 'a1', "cookie qux is correct");
+}
+
+#-----------------------------------------------------------------------------
+# Test fetch
+#-----------------------------------------------------------------------------
+
+{
+  # make sure there are no cookies in the environment
+  delete $ENV{HTTP_COOKIE};
+  delete $ENV{COOKIE};
+
+  my %result = CGI::Cookie->fetch();
+  ok(keys %result == 0, "No cookies in environment, returns empty list");
+
+  # now set a cookie in the environment and try again
+  $ENV{HTTP_COOKIE} = $test_cookie[2];
+  %result = CGI::Cookie->fetch();
+  ok(eq_set([keys %result], [qw(foo bar baz qux)]),
+     "expected cookies extracted");
+
+  is(ref($result{foo}), 'CGI::Cookie', 'Type of objects returned is correct');
+  is($result{foo}->value, 'vixen',      "cookie foo is correct");
+  is($result{bar}->value, 'cow',        "cookie bar is correct");
+  is($result{baz}->value, 'bitch',      "cookie baz is correct");
+  is($result{qux}->value, 'politician', "cookie qux is correct");
+
+  # Delete that and make sure it goes away
+  delete $ENV{HTTP_COOKIE};
+  %result = CGI::Cookie->fetch();
+  ok(keys %result == 0, "No cookies in environment, returns empty list");
+
+  # try another cookie in the other environment variable thats supposed to work
+  $ENV{COOKIE} = $test_cookie[3];
+  %result = CGI::Cookie->fetch();
+  ok(eq_set([keys %result], [qw(foo bar baz qux)]),
+     "expected cookies extracted");
+
+  is(ref($result{foo}), 'CGI::Cookie', 'Type of objects returned is correct');
+  is($result{foo}->value, 'a phrase', "cookie foo is correct");
+  is($result{bar}->value, 'yes, a phrase', "cookie bar is correct");
+  is($result{baz}->value, '^wibble', "cookie baz is correct");
+  is($result{qux}->value, "'", "cookie qux is correct");
+}
+
+#-----------------------------------------------------------------------------
+# Test raw_fetch
+#-----------------------------------------------------------------------------
+
+{
+  # make sure there are no cookies in the environment
+  delete $ENV{HTTP_COOKIE};
+  delete $ENV{COOKIE};
+
+  my %result = CGI::Cookie->raw_fetch();
+  ok(keys %result == 0, "No cookies in environment, returns empty list");
+
+  # now set a cookie in the environment and try again
+  $ENV{HTTP_COOKIE} = $test_cookie[2];
+  %result = CGI::Cookie->raw_fetch();
+  ok(eq_set([keys %result], [qw(foo bar baz qux)]),
+     "expected cookies extracted");
+
+  is(ref($result{foo}), '', 'Plain scalar returned');
+  is($result{foo}, 'vixen',      "cookie foo is correct");
+  is($result{bar}, 'cow',        "cookie bar is correct");
+  is($result{baz}, 'bitch',      "cookie baz is correct");
+  is($result{qux}, 'politician', "cookie qux is correct");
+
+  # Delete that and make sure it goes away
+  delete $ENV{HTTP_COOKIE};
+  %result = CGI::Cookie->raw_fetch();
+  ok(keys %result == 0, "No cookies in environment, returns empty list");
+
+  # try another cookie in the other environment variable thats supposed to work
+  $ENV{COOKIE} = $test_cookie[3];
+  %result = CGI::Cookie->raw_fetch();
+  ok(eq_set([keys %result], [qw(foo bar baz qux)]),
+     "expected cookies extracted");
+
+  is(ref($result{foo}), '', 'Plain scalar returned');
+  is($result{foo}, 'a%20phrase', "cookie foo is correct");
+  is($result{bar}, 'yes%2C%20a%20phrase', "cookie bar is correct");
+  is($result{baz}, '%5Ewibble', "cookie baz is correct");
+  is($result{qux}, '%27', "cookie qux is correct");
+}
+
+#-----------------------------------------------------------------------------
+# Test new
+#-----------------------------------------------------------------------------
+
+{
+  # Try new with full information provided
+  my $c = CGI::Cookie->new(-name    => 'foo',
+                          -value   => 'bar',
+                          -expires => '+3M',
+                          -domain  => '.capricorn.com',
+                          -path    => '/cgi-bin/database',
+                          -secure  => 1
+                         );
+  is(ref($c), 'CGI::Cookie', 'new returns objects of correct type');
+  is($c->name   , 'foo',               'name is correct');
+  is($c->value  , 'bar',               'value is correct');
+  like($c->expires, '/^[a-z]{3},\s*\d{2}-[a-z]{3}-\d{4}/i', 'expires in correct format');
+  is($c->domain , '.capricorn.com',    'domain is correct');
+  is($c->path   , '/cgi-bin/database', 'path is correct');
+  ok($c->secure , 'secure attribute is set');
+
+  # now try it with the only two manditory values (should also set the default path)
+  $c = CGI::Cookie->new(-name    =>  'baz',
+                       -value   =>  'qux',
+                      );
+  is(ref($c), 'CGI::Cookie', 'new returns objects of correct type');
+  is($c->name   , 'baz', 'name is correct');
+  is($c->value  , 'qux', 'value is correct');
+  ok(!defined $c->expires,       'expires is not set');
+  ok(!defined $c->domain ,       'domain attributeis not set');
+  is($c->path, '/',      'path atribute is set to default');
+  ok(!defined $c->secure ,       'secure attribute is set');
+
+# I'm really not happy about the restults of this section.  You pass
+# the new method invalid arguments and it just merilly creates a
+# broken object :-)
+# I've commented them out because they currently pass but I don't
+# think they should.  I think this is testing broken behaviour :-(
+
+#    # This shouldn't work
+#    $c = CGI::Cookie->new(-name => 'baz' );
+#
+#    is(ref($c), 'CGI::Cookie', 'new returns objects of correct type');
+#    is($c->name   , 'baz',     'name is correct');
+#    ok(!defined $c->value, "Value is undefined ");
+#    ok(!defined $c->expires, 'expires is not set');
+#    ok(!defined $c->domain , 'domain attributeis not set');
+#    is($c->path   , '/', 'path atribute is set to default');
+#    ok(!defined $c->secure , 'secure attribute is set');
+
+}
+
+#-----------------------------------------------------------------------------
+# Test as_string
+#-----------------------------------------------------------------------------
+
+{
+  my $c = CGI::Cookie->new(-name    => 'Jam',
+                          -value   => 'Hamster',
+                          -expires => '+3M',
+                          -domain  => '.pie-shop.com',
+                          -path    => '/',
+                          -secure  => 1
+                         );
+
+  my $name = $c->name;
+  like($c->as_string, "/$name/", "Stringified cookie contains name");
+
+  my $value = $c->value;
+  like($c->as_string, "/$value/", "Stringified cookie contains value");
+
+  my $expires = $c->expires;
+  like($c->as_string, "/$expires/", "Stringified cookie contains expires");
+
+  my $domain = $c->domain;
+  like($c->as_string, "/$domain/", "Stringified cookie contains domain");
+
+  my $path = $c->path;
+  like($c->as_string, "/$path/", "Stringified cookie contains path");
+
+  like($c->as_string, '/secure/', "Stringified cookie contains secure");
+
+  $c = CGI::Cookie->new(-name    =>  'Hamster-Jam',
+                       -value   =>  'Tulip',
+                      );
+
+  $name = $c->name;
+  like($c->as_string, "/$name/", "Stringified cookie contains name");
+
+  $value = $c->value;
+  like($c->as_string, "/$value/", "Stringified cookie contains value");
+
+  ok($c->as_string !~ /expires/, "Stringified cookie has no expires field");
+
+  ok($c->as_string !~ /domain/, "Stringified cookie has no domain field");
+
+  $path = $c->path;
+  like($c->as_string, "/$path/", "Stringified cookie contains path");
+
+  ok($c->as_string !~ /secure/, "Stringified cookie does not contain secure");
+}
+
+#-----------------------------------------------------------------------------
+# Test compare
+#-----------------------------------------------------------------------------
+
+{
+  my $c1 = CGI::Cookie->new(-name    => 'Jam',
+                           -value   => 'Hamster',
+                           -expires => '+3M',
+                           -domain  => '.pie-shop.com',
+                           -path    => '/',
+                           -secure  => 1
+                          );
+
+  # have to use $c1->expires because the time will occasionally be
+  # different between the two creates causing spurious failures.
+  my $c2 = CGI::Cookie->new(-name    => 'Jam',
+                           -value   => 'Hamster',
+                           -expires => $c1->expires,
+                           -domain  => '.pie-shop.com',
+                           -path    => '/',
+                           -secure  => 1
+                          );
+
+  # This looks titally whacked, but it does the -1, 0, 1 comparison
+  # thing so 0 means they match
+  is($c1->compare("$c1"), 0, "Cookies are identical");
+  is($c1->compare("$c2"), 0, "Cookies are identical");
+
+  $c1 = CGI::Cookie->new(-name   => 'Jam',
+                        -value  => 'Hamster',
+                        -domain => '.foo.bar.com'
+                       );
+
+  # have to use $c1->expires because the time will occasionally be
+  # different between the two creates causing spurious failures.
+  $c2 = CGI::Cookie->new(-name    =>  'Jam',
+                        -value   =>  'Hamster',
+                       );
+
+  # This looks titally whacked, but it does the -1, 0, 1 comparison
+  # thing so 0 (i.e. false) means they match
+  is($c1->compare("$c1"), 0, "Cookies are identical");
+  ok($c1->compare("$c2"), "Cookies are not identical");
+
+  $c2->domain('.foo.bar.com');
+  is($c1->compare("$c2"), 0, "Cookies are identical");
+}
+
+#-----------------------------------------------------------------------------
+# Test name, value, domain, secure, expires and path
+#-----------------------------------------------------------------------------
+
+{
+  my $c = CGI::Cookie->new(-name    => 'Jam',
+                          -value   => 'Hamster',
+                          -expires => '+3M',
+                          -domain  => '.pie-shop.com',
+                          -path    => '/',
+                          -secure  => 1
+                          );
+
+  is($c->name,          'Jam',   'name is correct');
+  is($c->name('Clash'), 'Clash', 'name is set correctly');
+  is($c->name,          'Clash', 'name now returns updated value');
+
+  # this is insane!  it returns a simple scalar but can't accept one as
+  # an argument, you have to give it an arrary ref.  It's totally
+  # inconsitent with these other methods :-(
+  is($c->value,           'Hamster', 'value is correct');
+  is($c->value(['Gerbil']), 'Gerbil',  'value is set correctly');
+  is($c->value,           'Gerbil',  'value now returns updated value');
+
+  my $exp = $c->expires;
+  like($c->expires,         '/^[a-z]{3},\s*\d{2}-[a-z]{3}-\d{4}/i', 'expires is correct');
+  like($c->expires('+12h'), '/^[a-z]{3},\s*\d{2}-[a-z]{3}-\d{4}/i', 'expires is set correctly');
+  like($c->expires,         '/^[a-z]{3},\s*\d{2}-[a-z]{3}-\d{4}/i', 'expires now returns updated value');
+  isnt($c->expires, $exp, "Expiry time has changed");
+
+  is($c->domain,                  '.pie-shop.com', 'domain is correct');
+  is($c->domain('.wibble.co.uk'), '.wibble.co.uk', 'domain is set correctly');
+  is($c->domain,                  '.wibble.co.uk', 'domain now returns updated value');
+
+  is($c->path,             '/',        'path is correct');
+  is($c->path('/basket/'), '/basket/', 'path is set correctly');
+  is($c->path,             '/basket/', 'path now returns updated value');
+
+  ok($c->secure,     'secure attribute is set');
+  ok(!$c->secure(0), 'secure attribute is cleared');
+  ok(!$c->secure,    'secure attribute is cleared');
+}
diff --git a/lib/CGI/t/fast.t b/lib/CGI/t/fast.t
new file mode 100644 (file)
index 0000000..2374d9f
--- /dev/null
@@ -0,0 +1,35 @@
+#!./perl -w
+
+use vars qw( $CGI::Q $CGI::Fast::Ext_Request );
+
+my $fcgi;
+BEGIN {
+       chdir 't' if -d 't';
+
+       # unshift, don't assign, so FCGI can be found if it's installed
+       # unlikely, but possible
+       unshift @INC, '../lib';
+
+       local $@;
+       eval { require FCGI };
+       $fcgi = $@ ? 0 : 1;
+}
+
+use Test::More tests => 7;
+
+SKIP: {
+       skip( 'FCGI not installed, cannot continue', 7 ) unless $fcgi;
+
+       use_ok( CGI::Fast );
+       ok( my $q = CGI::Fast->new(), 'created new CGI::Fast object' );
+       is( $q, $CGI::Q, 'checking to see if the object was stored properly' );
+       is( $q->param(), (), 'no params' );
+
+       ok( $q = CGI::Fast->new({ foo => 'bar' }), 'creating obect with params' );
+       is( $q->param('foo'), 'bar', 'checking passed param' );
+
+       # if this is false, the package var will be empty
+       $ENV{FCGI_SOCKET_PATH} = 0;
+       is( $CGI::Fast::Ext_Request, '', 'checking no active request' );
+
+}
index 05d1b49..3b09198 100755 (executable)
@@ -1,31 +1,12 @@
 #!/usr/local/bin/perl -w
 
-BEGIN {
-    chdir('t') if -d 't';
-    @INC = '../lib';
-}
-
-# Test ability to retrieve HTTP request info
-######################### We start with some black magic to print on failure.
-use lib '../blib/lib','../blib/arch';
+use Test::More tests => 17;
 
-BEGIN {$| = 1; print "1..17\n"; }
-END {print "not ok 1\n" unless $loaded;}
+BEGIN { use_ok('CGI'); };
 use CGI (':standard','-no_debug');
-$loaded = 1;
-print "ok 1\n";
-
-######################### End of black magic.
-
-# util
-sub test {
-    local($^W) = 0;
-    my($num, $true,$msg) = @_;
-    print($true ? "ok $num\n" : "not ok $num $msg\n");
-}
 
 my $CRLF = "\015\012";
-if ($^O eq 'VMS') { 
+if ($^O eq 'VMS') {
     $CRLF = "\n";  # via web server carriage is inserted automatically
 }
 if (ord("\t") != 9) { # EBCDIC?
@@ -34,53 +15,104 @@ if (ord("\t") != 9) { # EBCDIC?
 
 
 # Set up a CGI environment
-$ENV{REQUEST_METHOD}='GET';
-$ENV{QUERY_STRING}  ='game=chess&game=checkers&weather=dull';
-$ENV{PATH_INFO}     ='/somewhere/else';
-$ENV{PATH_TRANSLATED} ='/usr/local/somewhere/else';
-$ENV{SCRIPT_NAME}   ='/cgi-bin/foo.cgi';
+$ENV{REQUEST_METHOD}  = 'GET';
+$ENV{QUERY_STRING}    = 'game=chess&game=checkers&weather=dull';
+$ENV{PATH_INFO}       = '/somewhere/else';
+$ENV{PATH_TRANSLATED} = '/usr/local/somewhere/else';
+$ENV{SCRIPT_NAME}     ='/cgi-bin/foo.cgi';
 $ENV{SERVER_PROTOCOL} = 'HTTP/1.0';
-$ENV{SERVER_PORT} = 8080;
-$ENV{SERVER_NAME} = 'the.good.ship.lollypop.com';
-
-test(2,start_form(-action=>'foobar',-method=>'get') eq 
-     qq(<form method="get" action="foobar" enctype="application/x-www-form-urlencoded">\n),
-     "start_form()");
-
-test(3,submit() eq qq(<input type="submit" name=".submit" />),"submit()");
-test(4,submit(-name=>'foo',-value=>'bar') eq qq(<input type="submit" name="foo" value="bar" />),"submit(-name,-value)");
-test(5,submit({-name=>'foo',-value=>'bar'}) eq qq(<input type="submit" name="foo" value="bar" />),"submit({-name,-value})");
-test(6,textfield(-name=>'weather') eq qq(<input type="text" name="weather" value="dull" />),"textfield({-name})");
-test(7,textfield(-name=>'weather',-value=>'nice') eq qq(<input type="text" name="weather" value="dull" />),"textfield({-name,-value})");
-test(8,textfield(-name=>'weather',-value=>'nice',-override=>1) eq qq(<input type="text" name="weather" value="nice" />),
-     "textfield({-name,-value,-override})");
-test(9,checkbox(-name=>'weather',-value=>'nice') eq qq(<input type="checkbox" name="weather" value="nice" />weather),
-     "checkbox()");
-test(10,checkbox(-name=>'weather',-value=>'nice',-label=>'forecast') eq 
-     qq(<input type="checkbox" name="weather" value="nice" />forecast),
-     "checkbox()");
-test(11,checkbox(-name=>'weather',-value=>'nice',-label=>'forecast',-checked=>1,-override=>1) eq 
-     qq(<input type="checkbox" name="weather" value="nice" checked />forecast),
-     "checkbox()");
-test(12,checkbox(-name=>'weather',-value=>'dull',-label=>'forecast') eq 
-     qq(<input type="checkbox" name="weather" value="dull" checked />forecast),
-     "checkbox()");
-
-test(13,radio_group(-name=>'game') eq 
-     qq(<input type="radio" name="game" value="chess" checked />chess <input type="radio" name="game" value="checkers" />checkers),
-     'radio_group()');
-test(14,radio_group(-name=>'game',-labels=>{'chess'=>'ping pong'}) eq 
-     qq(<input type="radio" name="game" value="chess" checked />ping pong <input type="radio" name="game" value="checkers" />checkers),
-     'radio_group()');
-
-test(15, checkbox_group(-name=>'game',-Values=>[qw/checkers chess cribbage/]) eq 
-     qq(<input type="checkbox" name="game" value="checkers" checked />checkers <input type="checkbox" name="game" value="chess" checked />chess <input type="checkbox" name="game" value="cribbage" />cribbage),
-     'checkbox_group()');
-
-test(16, checkbox_group(-name=>'game',-values=>[qw/checkers chess cribbage/],-defaults=>['cribbage'],-override=>1) eq 
-     qq(<input type="checkbox" name="game" value="checkers" />checkers <input type="checkbox" name="game" value="chess" />chess <input type="checkbox" name="game" value="cribbage" checked />cribbage),
-     'checkbox_group()');
-test(17, popup_menu(-name=>'game',-values=>[qw/checkers chess cribbage/],-default=>'cribbage',-override=>1)."\n" eq <<END,'checkbox_group()');
+$ENV{SERVER_PORT}     = 8080;
+$ENV{SERVER_NAME}     = 'the.good.ship.lollypop.com';
+
+is(start_form(-action=>'foobar',-method=>'get'),
+   qq(<form method="get" action="foobar" enctype="application/x-www-form-urlencoded">\n),
+   "start_form()");
+
+is(submit(),
+   qq(<input type="submit" name=".submit" />),
+   "submit()");
+
+is(submit(-name  => 'foo',
+         -value => 'bar'),
+   qq(<input type="submit" name="foo" value="bar" />),
+   "submit(-name,-value)");
+
+is(submit({-name  => 'foo',
+          -value => 'bar'}),
+   qq(<input type="submit" name="foo" value="bar" />),
+   "submit({-name,-value})");
+
+is(textfield(-name => 'weather'),
+   qq(<input type="text" name="weather" value="dull" />),
+   "textfield({-name})");
+
+is(textfield(-name  => 'weather',
+            -value => 'nice'),
+   qq(<input type="text" name="weather" value="dull" />),
+   "textfield({-name,-value})");
+
+is(textfield(-name     => 'weather',
+            -value    => 'nice',
+            -override => 1),
+   qq(<input type="text" name="weather" value="nice" />),
+   "textfield({-name,-value,-override})");
+
+is(checkbox(-name  => 'weather',
+           -value => 'nice'),
+   qq(<input type="checkbox" name="weather" value="nice" />weather),
+   "checkbox()");
+
+is(checkbox(-name  => 'weather',
+           -value => 'nice',
+           -label => 'forecast'),
+   qq(<input type="checkbox" name="weather" value="nice" />forecast),
+   "checkbox()");
+
+is(checkbox(-name     => 'weather',
+           -value    => 'nice',
+           -label    => 'forecast',
+           -checked  => 1,
+           -override => 1),
+   qq(<input type="checkbox" name="weather" value="nice" checked />forecast),
+   "checkbox()");
+
+is(checkbox(-name  => 'weather',
+           -value => 'dull',
+           -label => 'forecast'),
+   qq(<input type="checkbox" name="weather" value="dull" checked />forecast),
+   "checkbox()");
+
+is(radio_group(-name => 'game'),
+   qq(<input type="radio" name="game" value="chess" checked />chess ).
+   qq(<input type="radio" name="game" value="checkers" />checkers),
+   'radio_group()');
+
+is(radio_group(-name   => 'game',
+              -labels => {'chess' => 'ping pong'}),
+   qq(<input type="radio" name="game" value="chess" checked />ping pong ).
+   qq(<input type="radio" name="game" value="checkers" />checkers),
+   'radio_group()');
+
+is(checkbox_group(-name   => 'game',
+                 -Values => [qw/checkers chess cribbage/]),
+   qq(<input type="checkbox" name="game" value="checkers" checked />checkers ).
+   qq(<input type="checkbox" name="game" value="chess" checked />chess ).
+   qq(<input type="checkbox" name="game" value="cribbage" />cribbage),
+   'checkbox_group()');
+
+is(checkbox_group(-name       => 'game',
+                 '-values'   => [qw/checkers chess cribbage/],
+                 '-defaults' => ['cribbage'],-override=>1),
+   qq(<input type="checkbox" name="game" value="checkers" />checkers ).
+   qq(<input type="checkbox" name="game" value="chess" />chess ).
+   qq(<input type="checkbox" name="game" value="cribbage" checked />cribbage),
+   'checkbox_group()');
+
+is(popup_menu(-name     => 'game',
+             '-values' => [qw/checkers chess cribbage/],
+             -default  => 'cribbage',
+             -override => 1)."\n",
+   <<END, 'checkbox_group()');
 <select name="game">
 <option  value="checkers">checkers</option>
 <option  value="chess">chess</option>
diff --git a/lib/CGI/t/push.t b/lib/CGI/t/push.t
new file mode 100644 (file)
index 0000000..2459c1f
--- /dev/null
@@ -0,0 +1,84 @@
+#!./perl -wT
+
+BEGIN {
+       chdir 't' if -d 't';
+       @INC = '../lib';
+}
+
+use Test::More tests => 12; 
+
+use_ok( 'CGI::Push' );
+
+ok( my $q = CGI::Push->new(), 'create a new CGI::Push object' );
+
+# test the simple_counter() method
+like( join('', $q->simple_counter(10)) , qr/updated.+?10.+?times./, 'counter' );
+
+# test do_sleep, except we don't want to bog down the tests
+# there's also a potential timing-related failure lurking here
+# change this variable at your own risk
+my $sleep_in_tests = 0;
+
+SKIP: {
+       skip( 'do_sleep() test may take a while', 1 ) unless $sleep_in_tests;
+
+       my $time = time;
+       CGI::Push::do_sleep(2);
+       is(time - $time, 2, 'slept for a while' );
+}
+
+# test push_delay()
+ok( ! defined $q->push_delay(), 'no initial delay' );
+is( $q->push_delay(.5), .5, 'set a delay' );
+
+my $out = tie *STDOUT, 'TieOut';
+
+# next_page() to be called twice, last_page() once, no delay
+my %vars = (
+       -next_page      => sub { return if $_[1] > 2; 'next page' },
+       -last_page      => sub { 'last page' },
+       -delay          => 0,
+);
+
+$q->do_push(%vars);
+
+# this seems to appear on every page
+like( $$out, qr/WARNING: YOUR BROWSER/, 'unsupported browser warning' );
+
+# these should appear correctly
+is( ($$out =~ s/next page//g), 2, 'next_page callback called appropriately' );
+is( ($$out =~ s/last page//g), 1, 'last_page callback called appropriately' );
+
+# send a fake content type (header capitalization varies in CGI, CGI::Push)
+$$out = '';
+$q->do_push(%vars, -type => 'fake' );
+like( $$out, qr/Content-[Tt]ype: fake/, 'set custom Content-type' );
+
+# use our own counter, as $COUNTER in CGI::Push is now off
+my $i;
+$$out = '';
+
+# no delay, custom headers from callback, only call callback once
+$q->do_push(
+       -delay          => 0,
+       -type           => 'dynamic',
+       -next_page      => sub { 
+               return if $i++;
+               return $_[0]->header('text/plain'), 'arduk';
+        },
+);
+
+# header capitalization again, our word should appear only once
+like( $$out, qr!ype: text/plain!, 'set custom Content-type in next_page()' );
+is( $$out =~ s/arduk//g, 1, 'found text from next_page()' );
+       
+package TieOut;
+
+sub TIEHANDLE {
+       bless( \(my $text), $_[0] );
+}
+
+sub PRINT {
+       my $self = shift;
+       $$self .= join( $/, @_ );
+}
diff --git a/lib/CGI/t/switch.t b/lib/CGI/t/switch.t
new file mode 100644 (file)
index 0000000..25a3325
--- /dev/null
@@ -0,0 +1,7 @@
+#!/usr/local/bin/perl -w
+
+use strict;
+use Test::More tests => 1;
+
+# Can't do much with this other than make sure it loads properly
+BEGIN { use_ok('CGI::Switch') };
index 5c68bf3..a3d235c 100644 (file)
@@ -14,7 +14,7 @@ require Exporter;
 @ISA = qw(Exporter);
 @EXPORT = qw(struct);
 
-$VERSION = '0.60';
+$VERSION = '0.61';
 
 ## Tested on 5.002 and 5.003 without class membership tests:
 my $CHECK_CLASS_MEMBERSHIP = ($] >= 5.003_95);
@@ -163,10 +163,13 @@ sub struct {
             $out .= "    \$r->$elem = $init undef;$cmt\n";
         }
         elsif( $type =~ /^\w+(?:::\w+)*$/ ){
-            $init = "defined(\$init{'$name'}) ? \%{\$init{'$name'}} : ()";
-            $out .= "    croak 'Initializer for $name must be hash reference'\n";
-            $out .= "        if defined(\$init{'$name'}) && ref(\$init{'$name'}) ne 'HASH';\n";
-            $out .= "    \$r->$elem = '${type}'->new($init);$cmt\n";
+            $out .= "    if (defined(\$init{'$name'})) {\n";
+           $out .= "       if (ref \$init{'$name'} eq 'HASH')\n";
+            $out .= "            { \$r->$elem = $type->new(\%{\$init{'$name'}}) } $cmt\n";
+           $out .= "       elsif (UNIVERSAL::isa(\$init{'$name'}, '$type'))\n";
+            $out .= "            { \$r->$elem = \$init{'$name'} } $cmt\n";
+            $out .= "       else { croak 'Initializer for $name must be hash or $type reference' }\n";
+            $out .= "    }\n";
             $classes{$name} = $type;
             $got_class = 1;
         }
@@ -416,8 +419,8 @@ The object reference is returned.
 =item Class (C<'Class_Name'> or C<'*Class_Name'>)
 
 The element's value must be a reference blessed to the named
-class or to one of its subclasses. The element is initialized to
-the result of calling the C<new> constructor of the named class.
+class or to one of its subclasses. The element is not initialized
+by default.
 
 The accessor's argument, if any, is assigned to the element. The
 accessor will C<croak> if this is not an appropriate object
@@ -440,8 +443,9 @@ The initializer value for a scalar element is just a scalar value. The
 initializer for an array element is an array reference. The initializer
 for a hash is a hash reference.
 
-The initializer for a class element is also a hash reference, and the
-contents of that hash are passed to the element's own constructor.
+The initializer for a class element is an object of the corresponding class,
+or of one of it's subclasses, or a reference to a hash containing named 
+arguments to be passed to the element's constructor.
 
 See Example 3 below for an example of initialization.
 
@@ -521,9 +525,9 @@ If no initializer is specified for a particular element, its default
 initialization is performed instead. Initializers for non-existent
 elements are silently ignored.
 
-Note that the initializer for a nested struct is specified
-as an anonymous hash of initializers, which is passed on to the nested
-struct's constructor.
+Note that the initializer for a nested class may be specified as
+an object of that class, or as a reference to a hash of initializers
+that are passed on to the nested struct's constructor.
 
     use Class::Struct;
 
@@ -545,7 +549,8 @@ struct's constructor.
     my $cat = Cat->new( name     => 'Socks',
                         kittens  => ['Monica', 'Kenneth'],
                         markings => { socks=>1, blaze=>"white" },
-                        breed    => { name=>'short-hair', cross=>1 },
+                        breed    => Breed->new(name=>'short-hair', cross=>1),
+                   or:  breed    => {name=>'short-hair', cross=>1},
                       );
 
     print "Once a cat called ", $cat->name, "\n";
@@ -556,6 +561,21 @@ struct's constructor.
 
 =head1 Author and Modification History
 
+Modified by Damian Conway, 2001-09-10, v0.62.
+
+   Modified implicit construction of nested objects.
+   Now will also take an object ref instead of requiring a hash ref.
+   Also default initializes nested object attributes to undef, rather
+   than calling object constructor without args
+   Original over-helpfulness was fraught with problems:
+       * the class's constructor might not be called 'new'
+       * the class might not have a hash-like-arguments constructor
+       * the class might not have a no-argument constructor
+       * "recursive" data structures didn't work well:
+                 package Person;
+                 struct { mother => 'Person', father => 'Person'};
+
+
 Modified by Casey West, 2000-11-08, v0.59.
 
     Added the ability for compile time class creation.
index 2dfaf85..914132c 100644 (file)
@@ -5,7 +5,7 @@ BEGIN {
        @INC = '../lib';
 }
 
-print "1..10\n";
+print "1..12\n";
 
 package aClass;
 
@@ -13,6 +13,10 @@ sub new { bless {}, shift }
 
 sub meth { 42 }
 
+package RecClass;
+
+sub new { bless {}, shift }
+
 package MyObj;
 
 use Class::Struct;
@@ -51,26 +55,35 @@ print "ok 5\n";
 
 my $orf = $obj->c;
 
-print "not " unless ref $orf eq 'aClass';
+print "not " if defined($orf);
 print "ok 6\n";
 
-print "not " unless $obj->c->meth() == 42;
+$obj = MyObj->new( c => aClass->new );
+$orf = $obj->c;
+
+print "not " if ref $orf ne 'aClass';
 print "ok 7\n";
 
+print "not " unless $obj->c->meth() == 42;
+print "ok 8\n";
+
 my $obk = SomeClass->new();
 
 $obk->SomeElem(123);
 
 print "not " unless $obk->SomeElem() == 123;
-print "ok 8\n";
+print "ok 9\n";
 
 $obj->a([4,5,6]);
 
 print "not " unless $obj->a(1) == 5;
-print "ok 9\n";
+print "ok 10\n";
 
 $obj->h({h=>7,r=>8,f=>9});
 
 print "not " unless $obj->h('r') == 8;
-print "ok 10\n";
+print "ok 11\n";
+
+my $recobj = RecClass->new() or print "not ";
+print "ok 12\n";
 
index 3c5c50a..8b9a780 100644 (file)
@@ -8,70 +8,109 @@ Cwd - get pathname of current working directory
 =head1 SYNOPSIS
 
     use Cwd;
-    $dir = cwd;
+    my $dir = getcwd;
 
-    use Cwd;
-    $dir = getcwd;
+    use Cwd 'abs_path';
+    my $abs_path = abs_path($file);
 
-    use Cwd;
-    $dir = fastcwd;
+=head1 DESCRIPTION
 
-    use Cwd;
-    $dir = fastgetcwd;
+This module provides functions for determining the pathname of the
+current working directory.  It is recommended that getcwd (or another
+*cwd() function) be used in I<all> code to ensure portability.
 
-    use Cwd 'chdir';
-    chdir "/tmp";
-    print $ENV{'PWD'};
+By default, it exports the functions cwd(), getcwd(), fastcwd(), and
+fastgetcwd() into the caller's namespace.  
 
-    use Cwd 'abs_path';            # aka realpath()
-    print abs_path($ENV{'PWD'});
 
-    use Cwd 'fast_abs_path';
-    print fast_abs_path($ENV{'PWD'});
+=head2 getcwd and friends
 
-=head1 DESCRIPTION
+Each of these functions are called without arguments and return the
+absolute path of the current working directory.
 
-This module provides functions for determining the pathname of the
-current working directory.  By default, it exports the functions
-cwd(), getcwd(), fastcwd(), and fastgetcwd() into the caller's
-namespace.  Each of these functions are called without arguments and
-return the absolute path of the current working directory.  It is
-recommended that cwd (or another *cwd() function) be used in I<all>
-code to ensure portability.
-
-The cwd() is the most natural and safe form for the current
-architecture. For most systems it is identical to `pwd` (but without
-the trailing line terminator).
-
-The getcwd() function re-implements the getcwd(3) (or getwd(3)) functions
-in Perl.
-
-The fastcwd() function looks the same as getcwd(), but runs faster.
-It's also more dangerous because it might conceivably chdir() you out
-of a directory that it can't chdir() you back into.  If fastcwd
-encounters a problem it will return undef but will probably leave you
-in a different directory.  For a measure of extra security, if
-everything appears to have worked, the fastcwd() function will check
-that it leaves you in the same directory that it started in. If it has
-changed it will C<die> with the message "Unstable directory path,
-current directory changed unexpectedly". That should never happen.
+=over 4
+
+=item getcwd
+
+    my $cwd = getcwd();
+
+Returns the current working directory.
+
+Re-implements the getcwd(3) (or getwd(3)) functions in Perl.
+
+=item cwd
+
+    my $cwd = cwd();
+
+The cwd() is the most natural form for the current architecture. For
+most systems it is identical to `pwd` (but without the trailing line
+terminator).
+
+Unfortunately, cwd() tends to break if called under taint mode.
+
+=item fastcwd
+
+    my $cwd = fastcwd();
+
+A more dangerous version of getcwd(), but potentially faster.
+
+It might conceivably chdir() you out of a directory that it can't
+chdir() you back into.  If fastcwd encounters a problem it will return
+undef but will probably leave you in a different directory.  For a
+measure of extra security, if everything appears to have worked, the
+fastcwd() function will check that it leaves you in the same directory
+that it started in. If it has changed it will C<die> with the message
+"Unstable directory path, current directory changed
+unexpectedly". That should never happen.
+
+=item fastgetcwd
+
+  my $cwd = fastgetcwd();
 
 The fastgetcwd() function is provided as a synonym for cwd().
 
-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("."))  Symbolic links and
-relative-path components ("." and "..") are resolved to return the
-canonical pathname, just like realpath(3).  This function is also
-callable as realpath().
+=back
+
+
+=head2 abs_path and friends
+
+These functions are exported only on request.  They each take a single
+argument and return the absolute pathname for it.
+
+=over 4
+
+=item abs_path
+
+  my $abs_path = abs_path($file);
+
+Uses the same algorithm as getcwd().  Symbolic links and relative-path
+components ("." and "..") are resolved to return the canonical
+pathname, just like realpath(3).
+
+=item realpath
 
-The fast_abs_path() function looks the same as abs_path() but runs
-faster and, like fastcwd(), is more dangerous.
+  my $abs_path = realpath($file);
+
+A synonym for abs_path().
+
+=item fast_abs_path
+
+  my $abs_path = abs_path($file);
+
+A more dangerous, but potentially faster version of abs_path.
+
+=back
+
+=head2 $ENV{PWD}
+
+If you ask to override your chdir() built-in function, 
+
+  use Cwd qw(chdir);
+
+then your PWD environment variable will be kept up to date.  Note that
+it will only be kept up to date if all packages which use chdir import
+it from Cwd.
 
-If you ask to override your chdir() built-in function, then your PWD
-environment variable will be kept up to date.  (See
-L<perlsub/Overriding Builtin Functions>.) Note that it will only be
-kept up to date if all packages which use chdir import it from Cwd.
 
 =head1 NOTES
 
@@ -79,14 +118,11 @@ kept up to date if all packages which use chdir import it from Cwd.
 
 =item *
 
-On Mac OS (Classic), the path separator is ':', not '/', and the 
-current directory is denoted as ':', not '.'. To move up the directory 
-tree, you will use '::' to move up one level, but ':::' and so on to 
-move up the tree two or more levels (i.e. the equivalent to '../../..'
-is '::::'). Generally, you should be careful about specifying relative pathnames. 
-While a full path always begins with a volume name, a relative pathname 
-should always begin with a ':'.  If specifying a volume name only, a 
-trailing ':' is required.
+Since the path seperators are different on some operating systems ('/'
+on Unix, ':' on MacPerl, etc...) we recommend you use the File::Spec
+modules wherever portability is a concern.
+
+=item *
 
 Actually, on Mac OS, the C<getcwd()>, C<fastgetcwd()> and C<fastcwd()>
 functions  are all aliases for the C<cwd()> function, which, on Mac OS,
@@ -95,13 +131,17 @@ C<fast_abs_path()>.
 
 =back
 
+=head1 SEE ALSO
+
+L<File::chdir>
+
 =cut
 
 use strict;
 
 use Carp;
 
-our $VERSION = '2.05';
+our $VERSION = '2.06';
 
 use base qw/ Exporter /;
 our @EXPORT = qw(cwd getcwd fastcwd fastgetcwd);
@@ -128,13 +168,26 @@ if ($^O eq 'os2' && defined &sys_cwd && defined &sys_abspath) {
 
 eval {
     require XSLoader;
+    undef *Cwd::fastcwd; # avoid redefinition warning
     XSLoader::load('Cwd');
 };
 
-# The 'natural and safe form' for UNIX (pwd may be setuid root)
 
+# Find the pwd command in the expected locations.  We assume these
+# are safe.  This prevents _backtick_pwd() consulting $ENV{PATH}
+# so everything works under taint mode.
+my $pwd_cmd;
+foreach my $try (qw(/bin/pwd /usr/bin/pwd)) {
+    if( -x $try ) {
+        $pwd_cmd = $try;
+        last;
+    }
+}
+$pwd_cmd ||= 'pwd';
+
+# The 'natural and safe form' for UNIX (pwd may be setuid root)
 sub _backtick_pwd {
-    my $cwd = `pwd`;
+    my $cwd = `$pwd_cmd`;
     # `pwd` may fail e.g. if the disk is full
     chomp($cwd) if defined $cwd;
     $cwd;
@@ -166,6 +219,54 @@ sub getcwd
     abs_path('.');
 }
 
+
+# By John Bazik
+#
+# Usage: $cwd = &fastcwd;
+#
+# This is a faster version of getcwd.  It's also more dangerous because
+# you might chdir out of a directory that you can't chdir back into.
+    
+sub fastcwd {
+    my($odev, $oino, $cdev, $cino, $tdev, $tino);
+    my(@path, $path);
+    local(*DIR);
+
+    my($orig_cdev, $orig_cino) = stat('.');
+    ($cdev, $cino) = ($orig_cdev, $orig_cino);
+    for (;;) {
+       my $direntry;
+       ($odev, $oino) = ($cdev, $cino);
+       CORE::chdir('..') || return undef;
+       ($cdev, $cino) = stat('.');
+       last if $odev == $cdev && $oino == $cino;
+       opendir(DIR, '.') || return undef;
+       for (;;) {
+           $direntry = readdir(DIR);
+           last unless defined $direntry;
+           next if $direntry eq '.';
+           next if $direntry eq '..';
+
+           ($tdev, $tino) = lstat($direntry);
+           last unless $tdev != $odev || $tino != $oino;
+       }
+       closedir(DIR);
+       return undef unless defined $direntry; # should never happen
+       unshift(@path, $direntry);
+    }
+    $path = '/' . join('/', @path);
+    if ($^O eq 'apollo') { $path = "/".$path; }
+    # At this point $path may be tainted (if tainting) and chdir would fail.
+    # To be more useful we untaint it then check that we landed where we started.
+    $path = $1 if $path =~ /^(.*)\z/s; # untaint
+    CORE::chdir($path) || return undef;
+    ($cdev, $cino) = stat('.');
+    die "Unstable directory path, current directory changed unexpectedly"
+       if $cdev != $orig_cdev || $cino != $orig_cino;
+    $path;
+}
+
+
 # Keeps track of current working directory in PWD environment var
 # Usage:
 #      use Cwd 'chdir';
@@ -236,6 +337,63 @@ sub chdir {
     1;
 }
 
+
+# In case the XS version doesn't load.
+*abs_path = \&_perl_abs_path unless defined &abs_path;
+sub _perl_abs_path
+{
+    my $start = @_ ? shift : '.';
+    my($dotdots, $cwd, @pst, @cst, $dir, @tst);
+
+    unless (@cst = stat( $start ))
+    {
+       carp "stat($start): $!";
+       return '';
+    }
+    $cwd = '';
+    $dotdots = $start;
+    do
+    {
+       $dotdots .= '/..';
+       @pst = @cst;
+       unless (opendir(PARENT, $dotdots))
+       {
+           carp "opendir($dotdots): $!";
+           return '';
+       }
+       unless (@cst = stat($dotdots))
+       {
+           carp "stat($dotdots): $!";
+           closedir(PARENT);
+           return '';
+       }
+       if ($pst[0] == $cst[0] && $pst[1] == $cst[1])
+       {
+           $dir = undef;
+       }
+       else
+       {
+           do
+           {
+               unless (defined ($dir = readdir(PARENT)))
+               {
+                   carp "readdir($dotdots): $!";
+                   closedir(PARENT);
+                   return '';
+               }
+               $tst[0] = $pst[0]+1 unless (@tst = lstat("$dotdots/$dir"))
+           }
+           while ($dir eq '.' || $dir eq '..' || $tst[0] != $pst[0] ||
+                  $tst[1] != $pst[1]);
+       }
+       $cwd = (defined $dir ? "$dir" : "" ) . "/$cwd" ;
+       closedir(PARENT);
+    } while (defined $dir);
+    chop($cwd) unless $cwd eq '/'; # drop the trailing /
+    $cwd;
+}
+
+
 # added function alias for those of us more
 # used to the libc function.  --tchrist 27-Jan-00
 *realpath = \&abs_path;
@@ -386,13 +544,5 @@ sub _epoc_cwd {
     }
 }
 
-# package main; eval join('',<DATA>) || die $@;        # quick test
 
 1;
-
-__END__
-BEGIN { import Cwd qw(:DEFAULT chdir); }
-print join("\n", cwd, getcwd, fastcwd, "");
-chdir('..');
-print join("\n", cwd, getcwd, fastcwd, "");
-print "$ENV{PWD}\n";
index 77f27c5..5383368 100644 (file)
@@ -57,9 +57,9 @@ sub import {
         *EXPORT = \@COMPLETE_EXPORT ;
         $globbed_match ||= (
            eval q{
-               *MATCH                          = *&    ;
-               *PREMATCH                               = *`    ;
-               *POSTMATCH                              = *'    ;
+               *MATCH                          = \$&   ;
+               *PREMATCH                               = \$`   ;
+               *POSTMATCH                              = \$'   ;
                1 ;
               }
            || do {
@@ -143,84 +143,86 @@ sub import {
 
 # Matching.
 
-       *LAST_PAREN_MATCH                       = *+    ;
-       *LAST_MATCH_START                       = *-{ARRAY} ;
-       *LAST_MATCH_END                         = *+{ARRAY} ;
+       *LAST_PAREN_MATCH                       = \$+   ;
+       *LAST_MATCH_START                       = \@- ;
+       *LAST_MATCH_END                         = \@+ ;
 
 # Input.
 
-       *INPUT_LINE_NUMBER                      = *.    ;
-           *NR                                 = *.    ;
-       *INPUT_RECORD_SEPARATOR                 = */    ;
-           *RS                                 = */    ;
+       *INPUT_LINE_NUMBER                      = \$.   ;
+           *NR                                 = \$.   ;
+       *INPUT_RECORD_SEPARATOR                 = \$/   ;
+           *RS                                 = \$/   ;
 
 # Output.
 
-       *OUTPUT_AUTOFLUSH                       = *|    ;
-       *OUTPUT_FIELD_SEPARATOR                 = *,    ;
-           *OFS                                = *,    ;
-       *OUTPUT_RECORD_SEPARATOR                = *\    ;
-           *ORS                                = *\    ;
+       *OUTPUT_AUTOFLUSH                       = \$|   ;
+       *OUTPUT_FIELD_SEPARATOR                 = \$,   ;
+           *OFS                                = \$,   ;
+       *OUTPUT_RECORD_SEPARATOR                = \$\   ;
+           *ORS                                = \$\   ;
 
 # Interpolation "constants".
 
-       *LIST_SEPARATOR                         = *"    ;
-       *SUBSCRIPT_SEPARATOR                    = *;    ;
-           *SUBSEP                             = *;    ;
+       *LIST_SEPARATOR                         = \$"   ;
+       *SUBSCRIPT_SEPARATOR                    = \$;   ;
+           *SUBSEP                             = \$;   ;
 
 # Formats
 
-       *FORMAT_PAGE_NUMBER                     = *%    ;
-       *FORMAT_LINES_PER_PAGE                  = *=    ;
-       *FORMAT_LINES_LEFT                      = *-    ;
-       *FORMAT_NAME                            = *~    ;
-       *FORMAT_TOP_NAME                        = *^    ;
-       *FORMAT_LINE_BREAK_CHARACTERS           = *:    ;
-       *FORMAT_FORMFEED                        = *^L   ;
+       *FORMAT_PAGE_NUMBER                     = \$%   ;
+       *FORMAT_LINES_PER_PAGE                  = \$=   ;
+       *FORMAT_LINES_LEFT                      = \$-   ;
+       *FORMAT_NAME                            = \$~   ;
+       *FORMAT_TOP_NAME                        = \$^   ;
+       *FORMAT_LINE_BREAK_CHARACTERS           = \$:   ;
+       *FORMAT_FORMFEED                        = \$^L  ;
 
 # Error status.
 
-       *CHILD_ERROR                            = *?    ;
-       *OS_ERROR                               = *!    ;
-           *ERRNO                              = *!    ;
-       *EXTENDED_OS_ERROR                      = *^E   ;
-       *EVAL_ERROR                             = *@    ;
+       *CHILD_ERROR                            = \$?   ;
+       *OS_ERROR                               = \$!   ;
+           *ERRNO                              = \$!   ;
+       *OS_ERROR                               = \%!   ;
+           *ERRNO                              = \%!   ;
+       *EXTENDED_OS_ERROR                      = \$^E  ;
+       *EVAL_ERROR                             = \$@   ;
 
 # Process info.
 
-       *PROCESS_ID                             = *$    ;
-           *PID                                = *$    ;
-       *REAL_USER_ID                           = *<    ;
-           *UID                                = *<    ;
-       *EFFECTIVE_USER_ID                      = *>    ;
-           *EUID                               = *>    ;
-       *REAL_GROUP_ID                          = *(    ;
-           *GID                                = *(    ;
-       *EFFECTIVE_GROUP_ID                     = *)    ;
-           *EGID                               = *)    ;
-       *PROGRAM_NAME                           = *0    ;
+       *PROCESS_ID                             = \$$   ;
+           *PID                                = \$$   ;
+       *REAL_USER_ID                           = \$<   ;
+           *UID                                = \$<   ;
+       *EFFECTIVE_USER_ID                      = \$>   ;
+           *EUID                               = \$>   ;
+       *REAL_GROUP_ID                          = \$(   ;
+           *GID                                = \$(   ;
+       *EFFECTIVE_GROUP_ID                     = \$)   ;
+           *EGID                               = \$)   ;
+       *PROGRAM_NAME                           = \$0   ;
 
 # Internals.
 
-       *PERL_VERSION                           = *^V   ;
-       *ACCUMULATOR                            = *^A   ;
-       *COMPILING                              = *^C   ;
-       *DEBUGGING                              = *^D   ;
-       *SYSTEM_FD_MAX                          = *^F   ;
-       *INPLACE_EDIT                           = *^I   ;
-       *PERLDB                                 = *^P   ;
-       *LAST_REGEXP_CODE_RESULT                = *^R   ;
-       *EXCEPTIONS_BEING_CAUGHT                = *^S   ;
-       *BASETIME                               = *^T   ;
-       *WARNING                                = *^W   ;
-       *EXECUTABLE_NAME                        = *^X   ;
-       *OSNAME                                 = *^O   ;
+       *PERL_VERSION                           = \$^V  ;
+       *ACCUMULATOR                            = \$^A  ;
+       *COMPILING                              = \$^C  ;
+       *DEBUGGING                              = \$^D  ;
+       *SYSTEM_FD_MAX                          = \$^F  ;
+       *INPLACE_EDIT                           = \$^I  ;
+       *PERLDB                                 = \$^P  ;
+       *LAST_REGEXP_CODE_RESULT                = \$^R  ;
+       *EXCEPTIONS_BEING_CAUGHT                = \$^S  ;
+       *BASETIME                               = \$^T  ;
+       *WARNING                                = \$^W  ;
+       *EXECUTABLE_NAME                        = \$^X  ;
+       *OSNAME                                 = \$^O  ;
 
 # Deprecated.
 
-#      *ARRAY_BASE                             = *[    ;
-#      *OFMT                                   = *#    ;
-#      *MULTILINE_MATCHING                     = **    ;
-#      *OLD_PERL_VERSION                       = *]    ;
+#      *ARRAY_BASE                             = \$[   ;
+#      *OFMT                                   = \$#   ;
+#      *MULTILINE_MATCHING                     = \$*   ;
+#      *OLD_PERL_VERSION                       = \$]   ;
 
 1;
index 459dc3b..6447aff 100755 (executable)
-#!./perl
+#!./perl -i.inplace
+# note the extra switch, for the test below
 
-print "1..22\n";
+BEGIN {
+    chdir 't' if -d 't';
+    @INC = '../lib';
+}
+
+use Test::More tests => 54;
 
-BEGIN { @INC = '../lib' }
 use English qw( -no_match_vars ) ;
 use Config;
-my $threads = $Config{'use5005threads'} || 0;
+use Errno;
 
-print $PID == $$ ? "ok 1\n" : "not ok 1\n";
+is( $PID, $$, '$PID' );
 
 $_ = 1;
-print $ARG == $_  || $threads ? "ok 2\n" : "not ok 2\n";
+is( $ARG, $_, '$ARG' );
 
 sub foo {
-    print $ARG[0] == $_[0] || $threads ? "ok 3\n" : "not ok 3\n";
+       is($ARG[0], $_[0], '@ARG' );
 }
-&foo(1);
+foo(1);
 
 "abc" =~ /b/;
 
-print ! $PREMATCH  ? "" : "not ", "ok 4\n" ;
-print ! $MATCH     ? "" : "not ", "ok 5\n" ;
-print ! $POSTMATCH ? "" : "not ", "ok 6\n" ;
+ok( !$PREMATCH, '$PREMATCH undefined' );
+ok( !$MATCH, '$MATCH undefined' );
+ok( !$POSTMATCH, '$POSTMATCH undefined' );
 
 $OFS = " ";
 $ORS = "\n";
-print 'ok',7;
+
+{
+       local(*IN, *OUT);
+       pipe(IN, OUT);
+       select(OUT);
+       $| = 1;
+       print 'ok', '7';
+
+       # since $| is 1, this should be true
+       ok( $OUTPUT_AUTOFLUSH, '$OUTPUT_AUTOFLUSH should be true' );
+
+       my $close = close OUT;
+       ok( !($close) == $CHILD_ERROR, '$CHILD_ERROR should be false' );
+
+       my $foo = <IN>;
+       like( $foo, qr/ok 7/, '$OFS' );
+
+       # chomp is true because $ORS is "\n"
+       ok( chomp($foo), '$ORS should be \n' );
+}
+
+is( $FORMAT_NAME, 'OUT', '$FORMAT_NAME' );
+is( $FORMAT_TOP_NAME, 'OUT_TOP', '$FORMAT_TOP_NAME' );
+is( $FORMAT_FORMFEED, "\f", '$FORMAT_FORMFEED' );
+is( $FORMAT_LINES_LEFT, 0, '$FORMAT_LINES_LEFT' );
+is( $FORMAT_LINES_PER_PAGE, 60, '$FORMAT_LINES_PER_PAGE' );
+is( $FORMAT_LINE_BREAK_CHARACTERS, " \n-", '$FORMAT_LINE_BREAK_CHARACTERS');
+is( $FORMAT_PAGE_NUMBER, 0, '$FORMAT_PAGE_NUMBER' );
+is( $ACCUMULATOR, $^A, '$ACCUMULATOR' );
+
 undef $OUTPUT_FIELD_SEPARATOR;
 
 if ($threads) { $" = "\n" } else { $LIST_SEPARATOR = "\n" };
-@foo = ("ok 8", "ok 9");
-print "@foo";
+@foo = (8, 9);
+@foo = split(/\n/, "@foo");
+is( $foo[0], 8, '$"' );
+is( $foo[1], 9, '$LIST_SEPARATOR' );
+
 undef $OUTPUT_RECORD_SEPARATOR;
 
 eval 'NO SUCH FUNCTION';
-print "ok 10\n" if $EVAL_ERROR =~ /method/ || $threads;
+like( $EVAL_ERROR, qr/method/, '$EVAL_ERROR' );
+
+is( $UID, $<, '$UID' );
+is( $GID, $(, '$GID' );
+is( $EUID, $>, '$EUID' ); 
+is( $EGID, $), '$EGID' );
+
+is( $PROGRAM_NAME, $0, '$PROGRAM_NAME' );
+is( $BASETIME, $^T, '$BASETIME' );
+
+is( $PERL_VERSION, $^V, '$PERL_VERSION' );
+is( $DEBUGGING, $^D, '$DEBUGGING' );
 
-print $UID == $< ? "ok 11\n" : "not ok 11\n";
-print $GID == $( ? "ok 12\n" : "not ok 12\n";
-print $EUID == $> ? "ok 13\n" : "not ok 13\n";
-print $EGID == $) ? "ok 14\n" : "not ok 14\n";
+is( $WARNING, 0, '$WARNING' );
+like( $EXECUTABLE_NAME, qr/perl/, '$EXECUTABLE_NAME' );
+is( $OSNAME, $Config{osname}, '$OSNAME' );
 
-print $PROGRAM_NAME eq $0 ? "ok 15\n" : "not ok 15\n";
-print $BASETIME == $^T ? "ok 16\n" : "not ok 16\n";
+# may be non-portable
+ok( $SYSTEM_FD_MAX >= 2, '$SYSTEM_FD_MAX should be at least 2' );
 
-package B ;
+is( $INPLACE_EDIT, '.inplace', '$INPLACE_EDIT' );
 
-use English ;
+'aabbcc' =~ /(.{2}).+(.{2})(?{ 9 })/;
+is( $LAST_PAREN_MATCH, 'cc', '$LAST_PARENT_MATCH' );
+is( $LAST_REGEXP_CODE_RESULT, 9, '$LAST_REGEXP_CODE_RESULT' );
+
+is( $LAST_MATCH_START[1], 0, '@LAST_MATCH_START' );
+is( $LAST_MATCH_END[1], 2, '@LAST_MATCH_END' );
+
+ok( !$PERLDB, '$PERLDB should be false' );
+
+{
+       local $INPUT_RECORD_SEPARATOR = "\n\n&quo