summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Changes709
-rwxr-xr-xConfigure40
-rw-r--r--INSTALL26
-rw-r--r--MANIFEST25
-rwxr-xr-xMakefile.SH8
-rwxr-xr-xconfigpm41
-rw-r--r--cop.h14
-rw-r--r--cv.h13
-rw-r--r--doop.c4
-rw-r--r--dosish.h12
-rw-r--r--dump.c2
-rw-r--r--embed.h11
-rw-r--r--ext/DB_File/DB_File.pm32
-rw-r--r--ext/DB_File/DB_File.xs18
-rw-r--r--ext/DynaLoader/dl_os2.xs188
-rw-r--r--ext/IO/IO.xs21
-rw-r--r--ext/IO/lib/IO/Handle.pm4
-rw-r--r--ext/IO/lib/IO/Seekable.pm2
-rw-r--r--ext/POSIX/POSIX.pm36
-rw-r--r--ext/POSIX/POSIX.pod37
-rw-r--r--global.sym8
-rw-r--r--gv.c305
-rw-r--r--gv.h5
-rw-r--r--hints/aux_3.sh (renamed from hints/aux.sh)6
-rw-r--r--hints/broken-db.msg14
-rw-r--r--hints/dec_osf.sh9
-rw-r--r--hints/freebsd.sh11
-rw-r--r--hints/hpux.sh14
-rw-r--r--hints/irix_6_3.sh16
-rw-r--r--hints/irix_6_4.sh16
-rw-r--r--hints/machten.sh31
-rw-r--r--hints/os2.sh4
-rw-r--r--hints/ultrix_4.sh3
-rw-r--r--hv.c32
-rwxr-xr-xinstallperl19
-rw-r--r--interp.sym1
-rw-r--r--lib/AutoSplit.pm25
-rw-r--r--lib/Carp.pm1
-rw-r--r--lib/Class/Template.pm2
-rw-r--r--lib/Cwd.pm55
-rw-r--r--lib/Devel/SelfStubber.pm4
-rw-r--r--lib/Env.pm4
-rw-r--r--lib/ExtUtils/Embed.pm8
-rw-r--r--lib/ExtUtils/MM_Unix.pm7
-rwxr-xr-xlib/ExtUtils/xsubpp3
-rw-r--r--lib/File/Basename.pm51
-rw-r--r--lib/File/Copy.pm18
-rw-r--r--lib/FileCache.pm2
-rw-r--r--lib/FileHandle.pm27
-rw-r--r--lib/Getopt/Long.pm17
-rw-r--r--lib/IPC/Open3.pm25
-rw-r--r--lib/Math/Complex.pm28
-rw-r--r--lib/Net/netent.pm4
-rw-r--r--lib/Pod/Functions.pm2
-rw-r--r--lib/Search/Dict.pm2
-rw-r--r--lib/SelfLoader.pm2
-rw-r--r--lib/Term/Complete.pm3
-rw-r--r--lib/Text/Abbrev.pm5
-rw-r--r--lib/Tie/Hash.pm2
-rw-r--r--lib/cacheout.pl2
-rw-r--r--lib/chat2.pl2
-rw-r--r--lib/complete.pl3
-rw-r--r--[-rwxr-xr-x]lib/diagnostics.pm6
-rw-r--r--lib/ftp.pl4
-rw-r--r--lib/importenv.pl2
-rw-r--r--lib/overload.pm86
-rw-r--r--lib/perl5db.pl26
-rw-r--r--lib/termcap.pl2
-rw-r--r--lib/validate.pl4
-rw-r--r--op.c379
-rw-r--r--os2/Changes5
-rw-r--r--os2/os2.c16
-rw-r--r--os2/os2ish.h19
-rw-r--r--patchlevel.h2
-rw-r--r--perl.c170
-rw-r--r--perl.h84
-rw-r--r--perly.c2371
-rw-r--r--perly.c.diff54
-rw-r--r--perly.y64
-rw-r--r--plan9/mkfile2
-rw-r--r--plan9/plan9ish.h12
-rw-r--r--pod/Makefile224
-rw-r--r--pod/buildtoc167
-rw-r--r--pod/checkpods.PL7
-rw-r--r--pod/perl.pod4
-rw-r--r--pod/perlapio.pod2
-rw-r--r--pod/perldebug.pod30
-rw-r--r--pod/perldiag.pod90
-rw-r--r--pod/perldsc.pod71
-rw-r--r--pod/perlembed.pod380
-rw-r--r--pod/perlform.pod21
-rw-r--r--pod/perlfunc.pod248
-rw-r--r--pod/perlguts.pod47
-rw-r--r--pod/perllocale.pod60
-rw-r--r--pod/perllol.pod4
-rw-r--r--pod/perlnews.pod40
-rw-r--r--pod/perlop.pod39
-rw-r--r--pod/perlovl.pod15
-rw-r--r--pod/perlpod.pod64
-rw-r--r--pod/perlre.pod19
-rw-r--r--pod/perlref.pod10
-rw-r--r--pod/perlsec.pod35
-rw-r--r--pod/perlsub.pod43
-rw-r--r--pod/perlsyn.pod7
-rw-r--r--pod/perltoc.pod2617
-rw-r--r--pod/perltoot.pod8
-rw-r--r--pod/perltrap.pod31
-rw-r--r--pod/perlvar.pod16
-rw-r--r--pod/perlxs.pod2
-rw-r--r--pod/perlxstut.pod20
-rw-r--r--pod/pod2html.PL11
-rw-r--r--pod/pod2latex.PL6
-rw-r--r--pod/pod2man.PL6
-rw-r--r--pod/pod2text.PL6
-rwxr-xr-x[-rw-r--r--]pod/roffitall251
-rwxr-xr-xpod/rofftoc66
-rw-r--r--pp.c87
-rw-r--r--pp_ctl.c24
-rw-r--r--pp_hot.c100
-rw-r--r--pp_sys.c44
-rw-r--r--proto.h10
-rw-r--r--regcomp.c3
-rw-r--r--scope.c15
-rw-r--r--sv.c48
-rw-r--r--sv.h19
-rwxr-xr-xt/TEST16
-rwxr-xr-xt/comp/colon.t138
-rwxr-xr-xt/comp/proto.t377
-rwxr-xr-xt/comp/redef.t3
-rwxr-xr-xt/comp/use.t101
-rwxr-xr-x[-rw-r--r--]t/harness1
-rwxr-xr-xt/io/fs.t2
-rwxr-xr-xt/lib/basename.t15
-rwxr-xr-xt/lib/db-btree.t28
-rwxr-xr-xt/lib/db-recno.t32
-rwxr-xr-xt/lib/filecopy.t36
-rwxr-xr-xt/op/assignwarn.t61
-rwxr-xr-xt/op/cmp.t35
-rwxr-xr-xt/op/each.t41
-rwxr-xr-xt/op/magic.t87
-rwxr-xr-xt/op/method.t24
-rwxr-xr-xt/op/misc.t65
-rwxr-xr-xt/op/my.t43
-rwxr-xr-xt/op/oct.t4
-rwxr-xr-xt/op/quotemeta.t12
-rwxr-xr-xt/op/rand.t24
-rwxr-xr-xt/op/sysio.t2
-rwxr-xr-xt/op/universal.t38
-rwxr-xr-xt/pragma/locale.t (renamed from t/lib/locale.t)214
-rwxr-xr-xt/pragma/overload.t (renamed from t/op/overload.t)107
-rw-r--r--t/pragma/strict-refs295
-rw-r--r--t/pragma/strict-subs279
-rw-r--r--t/pragma/strict-vars225
-rwxr-xr-xt/pragma/strict.t88
-rwxr-xr-xt/pragma/subs.t129
-rw-r--r--t/pragma/warn-1global146
-rwxr-xr-xt/pragma/warning.t89
-rw-r--r--toke.c132
-rw-r--r--unixish.h12
-rw-r--r--util.c114
-rw-r--r--utils/c2ph.PL6
-rw-r--r--utils/h2ph.PL6
-rw-r--r--utils/h2xs.PL6
-rw-r--r--utils/perlbug.PL6
-rw-r--r--utils/perldoc.PL33
-rw-r--r--utils/pl2pm.PL6
-rw-r--r--utils/splain.PL6
-rw-r--r--vms/Makefile143
-rw-r--r--vms/config.vms2
-rw-r--r--vms/descrip.mms8
-rw-r--r--vms/genconfig.pl4
-rw-r--r--vms/perly_c.vms2371
-rw-r--r--vms/test.com6
-rw-r--r--vms/vmsish.h46
-rw-r--r--x2p/a2p.h3
-rw-r--r--x2p/find2perl.PL6
-rw-r--r--x2p/s2p.PL6
-rw-r--r--x2p/str.c12
178 files changed, 10558 insertions, 5499 deletions
diff --git a/Changes b/Changes
index 158a7377f1..8449c367f6 100644
--- a/Changes
+++ b/Changes
@@ -9,6 +9,715 @@ releases.)
----------------
+Version 5.003_21
+----------------
+
+This release includes several important bug fixes, and a couple of
+minor but valuable language tweaks. Please read on for a list of the
+significant changes:
+
+ CORE LANGUAGE CHANGES
+
+ Title: "Fix overloading via inherited autoloaded functions"
+ From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Msg-ID: <199701131022.FAA22830@monk.mps.ohio-state.edu>
+ Date: Mon, 13 Jan 1997 05:22:47 -0500 (EST)
+ Files: gv.c lib/overload.pm pod/perldiag.pod t/pragma/overload.t
+
+ Title: "Method call fixes: Don't cache in alias, don't skip undef"
+ From: Chip Salzenberg <chip@atlantic.net>
+ Files: global.sym gv.c gv.h hv.c op.c pod/perlguts.pod
+ pod/perltoc.pod pp.c pp_ctl.c pp_hot.c proto.h scope.c sv.c
+ t/op/method.t
+
+ Title: "Formats can be closures"
+ From: Chip Salzenberg <chip@atlantic.net>
+ Files: cv.h op.c perly.c perly.c.diff perly.y pp_sys.c sv.h
+
+ Title: "Quote 'foo' in C<$x{-foo}>"
+ From: Chip Salzenberg <chip@atlantic.net>
+ Files: toke.c
+
+ Title: "Forbid C< x->{y} > and C< x->[0] > under C<strict refs>"
+ From: Chip Salzenberg <chip@atlantic.net>
+ Files: op.c pod/perldiag.pod t/pragma/strict-refs
+
+ Title: "Allow <=> to return undef when operands are not ordered"
+ From: Chip Salzenberg and Andreas Koenig
+ Files: MANIFEST pp.c t/op/cmp.t
+
+ Title: "Fail regex that starts with '{'"
+ From: Chip Salzenberg <chip@atlantic.net>
+ Files: regcomp.c
+
+ CORE PORTABILITY
+
+ Title: "Re: Perl 5.003_20: OS/2 patches"
+ From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Msg-ID: <199701101102.GAA19051@monk.mps.ohio-state.edu>
+ Date: Fri, 10 Jan 1997 06:02:16 -0500 (EST)
+ Files: hints/os2.sh os2/Changes os2/os2.c os2/os2ish.h pp_sys.c
+
+ Title: "VMS patches for _20"
+ From: Charles Bailey <bailey@HMIVAX.HUMGEN.UPENN.EDU>
+ Msg-ID: <01IE7MGK7ULQ003K5M@hmivax.humgen.upenn.edu>
+ Date: Tue, 14 Jan 1997 17:34:43 -0500 (EST)
+ Files: configpm dosish.h os2/os2ish.h plan9/plan9ish.h proto.h
+ t/pragma/strict.t t/pragma/subs.t t/pragma/warning.t toke.c
+ unixish.h vms/Makefile vms/config.vms vms/descrip.mms
+ vms/genconfig.pl vms/perly_c.vms vms/test.com vms/vmsish.h
+ x2p/a2p.h x2p/str.c
+
+ Title: "Irix 6.3 & 6.4 and perl5.003_20"
+ From: John Stoffel <jfs@fluent.com>
+ Msg-ID: <199701132242.RAA14601@jfs.Fluent.COM>
+ Date: Mon, 13 Jan 1997 17:42:50 -0500 (EST)
+ Files: MANIFEST hints/irix_6_3.sh hints/irix_6_4.sh
+
+ Title: "Patch: MachTen hints, Configure"
+ From: Dominic Dunlop <domo@slipper.ip.lu>
+ Msg-ID: <v03010d00af0123a93670@[194.51.248.75]>
+ Date: Tue, 14 Jan 1997 13:43:13 +0100
+ Files: Configure hints/machten.sh
+
+ Title: "Rename aux.sh to aux_3.sh for MS-LOSS"
+ From: Chip Salzenberg <chip@atlantic.net>
+ Files: MANIFEST hints/aux_3.sh
+
+ OTHER CORE CHANGES
+
+ Title: "Fix C< eval { my $x; eval '$x' } >"
+ From: Chip Salzenberg <chip@atlantic.net>
+ Files: op.c t/op/misc.t
+
+ Title: "Don't warn if eval '' uses outer func's lexicals"
+ From: Chip Salzenberg <chip@atlantic.net>
+ Files: op.c
+
+ Title: "Avoid memory wastage in wait(); make pidstatus global"
+ From: Chip Salzenberg <chip@atlantic.net>
+ Files: global.sym interp.sym perl.c perl.h pp_sys.c
+
+ Title: "Forbid ++ and -- on readonly values"
+ From: "John Q. Linux" <jql@accessone.com>
+ Msg-ID: <Pine.LNX.3.95.970110193330.11249D-100000@jql.accessone.com>
+ Date: Fri, 10 Jan 1997 19:47:16 -0800 (PST)
+ Files: pp.c pp_hot.c
+
+ Title: "Keep array from dying during foreach(@array)"
+ From: Chip Salzenberg <chip@atlantic.net>
+ Files: cop.h pp_ctl.c
+
+ Title: "Fix C< $a="simple"; split /($a)/o >"
+ From: Chip Salzenberg <chip@atlantic.net>
+ Files: pp.c t/op/misc.t
+
+ Title: "Fix infinite loop for undef function in @SIG{__WARN__,__DIE__}"
+ From: Chip Salzenberg <chip@atlantic.net>
+ Files: util.c
+
+ Title: "Fix for anon-lists with tied entries coredump"
+ From: Gurusamy Sarathy <gsar@engin.umich.edu>
+ Msg-ID: <199701100745.CAA13057@aatma.engin.umich.edu>
+ Date: Fri, 10 Jan 1997 02:45:11 -0500
+ Files: pp.c
+
+ Title: "Don't set SVf_PADBUSY on immortal SVs"
+ From: Chip Salzenberg <chip@atlantic.net>
+ Files: op.c
+
+ Title: "Patch for Object subroutines"
+ From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Msg-ID: <199701080156.UAA15366@monk.mps.ohio-state.edu>
+ Date: Tue, 7 Jan 1997 20:56:02 -0500 (EST)
+ Files: cop.h
+
+ Title: "Use an SVt_PVLV to hold stacked OP pointers when debugging"
+ From: Chip Salzenberg <chip@atlantic.net>
+ Files: pp.c pp_hot.c
+
+ Title: "Undo change that freed large pad vars"
+ From: Chip Salzenberg <chip@atlantic.net>
+ Files: scope.c
+
+ BUILD PROCESS
+
+ Title: "Make MachTen hints file warn about db-recno failures"
+ From: Dominic Dunlop <domo@slipper.ip.lu>
+ Msg-ID: <v03010d00aef92fba6aca@[194.51.248.78]>
+ Date: Wed, 8 Jan 1997 12:07:18 +0100
+ Files: hints/machten.sh
+
+ Title: "5.003_20, FreeBSD 3.0 and minor patch"
+ From: roberto@eurocontrol.fr (Ollivier Robert)
+ Msg-ID: <Mutt.19970108143747.roberto@caerdonn.eurocontrol.fr>
+ Date: Wed, 8 Jan 1997 14:37:47 +0100
+ Files: Configure
+
+ Title: "Make installperl quieter; only shared libraries need 0555"
+ From: Chip Salzenberg <chip@atlantic.net>
+ Files: installperl
+
+ TESTS
+
+ Title: "Advice on TEST failure"
+ From: Dominic Dunlop <domo@slipper.ip.lu>
+ Msg-ID: <v03010d01aefbaefcf3bc@[194.51.248.78]>
+ Date: Fri, 10 Jan 1997 10:19:07 +0100
+ Files: t/TEST
+
+ Title: "UNIVERSAL tests"
+ From: Roderick Schertler <roderick@gate.net>
+ Files: MANIFEST t/op/universal.t
+
+ Title: "Test deletion of array during foreach"
+ From: Jarkko Hietaniemi <jhi@alpha.hut.fi>
+ Files: t/op/misc.t
+
+ Title: "patch for db-recno.t"
+ From: pmarquess@bfsec.bt.co.uk (Paul Marquess)
+ Msg-ID: <9701121509.AA11147@claudius.bfsec.bt.co.uk>
+ Date: Sun, 12 Jan 1997 15:09:33 +0000 (GMT)
+ Files: t/lib/db-recno.t
+
+ LIBRARY AND EXTENSIONS
+
+ Title: "Localize info about filesystems being case-forgiving"
+ From: Chip Salzenberg <chip@atlantic.net>
+ Files: lib/File/Basename.pm pod/checkpods.PL pod/pod2html.PL
+ pod/pod2latex.PL pod/pod2man.PL pod/pod2text.PL
+ utils/c2ph.PL utils/h2ph.PL utils/h2xs.PL utils/perlbug.PL
+ utils/perldoc.PL utils/pl2pm.PL utils/splain.PL
+ x2p/find2perl.PL x2p/s2p.PL
+
+ Title: "Fix for fd leak in IO::File::new_tmpfile"
+ From: Graham Barr and Chip Salzenberg
+ Files: ext/IO/IO.xs ext/IO/lib/IO/Handle.pm
+
+ Title: "Refresh Getopt::Long to 2.6"
+ From: Johan Vromans <jvromans@squirrel.nl>
+ Files: lib/Getopt/Long.pm
+
+ Title: "Refresh DB_File to 1.10"
+ From: pmarquess@bfsec.bt.co.uk (Paul Marquess)
+ Msg-ID: <9701141247.AA21242@claudius.bfsec.bt.co.uk>
+ Date: Tue, 14 Jan 97 12:47:40 GMT
+ Files: ext/DB_File/DB_File.pm ext/DB_File/DB_File.xs
+
+ Title: "Re: FileCache::cacheout clobbers $_"
+ From: Roderick Schertler <roderick@gate.net>
+ Msg-ID: <pz3ewb3189.fsf@eeyore.ibcinc.com>
+ Date: 08 Jan 1997 23:45:58 -0500
+ Files: lib/FileCache.pm lib/cacheout.pl
+
+ Title: "PATCH: AutoSplit"
+ From: Graham Barr <bodg@tiuk.ti.com>
+ Msg-ID: <9603111010.AA29935@tiuk.ti.com>
+ Date: 11 Mar 1996 06:01:58 -0500
+ Files: lib/AutoSplit.pm
+
+ Title: "Re: Uninitialized value in Carp.pm ? "
+ From: Gurusamy Sarathy <gsar@engin.umich.edu>
+ Msg-ID: <199701141815.NAA07960@aatma.engin.umich.edu>
+ Date: Tue, 14 Jan 1997 13:15:25 -0500
+ Files: lib/Carp.pm
+
+ Title: "Avoid "uninitialized" warnings from POSIX::constant()"
+ From: Chip Salzenberg <chip@atlantic.net>
+ Files: ext/POSIX/POSIX.pm
+
+ Title: "Eliminate warning from C<use overload>"
+ From: Chip Salzenberg <chip@atlantic.net>
+ Files: lib/overload.pm
+
+ Title: "low priority patches"
+ From: pmarquess@bfsec.bt.co.uk (Paul Marquess)
+ Msg-ID: <9701081655.AA27349@claudius.bfsec.bt.co.uk>
+ Date: Wed, 8 Jan 97 16:55:02 GMT
+ Files: lib/Cwd.pm t/comp/redef.t t/lib/db-btree.t
+
+ UTILITIES
+
+ Title: "Re: xsubpp and Tk ==> segfault"
+ From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Msg-ID: <199701080825.DAA15813@monk.mps.ohio-state.edu>
+ Date: Wed, 8 Jan 1997 03:25:47 -0500 (EST)
+ Files: lib/ExtUtils/xsubpp
+
+ Title: "Re: MakeMaker and 'make uninstall'"
+ From: Andreas Koenig <k@anna.in-berlin.de>
+ Msg-ID: <199701101243.NAA26400@anna.in-berlin.de>
+ Date: Fri, 10 Jan 1997 13:43:39 +0100
+ Files: lib/ExtUtils/MM_Unix.pm
+
+ Title: "Don't search for pod if path is already valid"
+ From: Wayne Scott <wscott@ichips.intel.com>
+ Msg-ID: <199701082325.PAA04521@pdxlx008.intel.com>
+ Date: Wed, 08 Jan 1997 15:25:19 -0800
+ Files: utils/perldoc.PL
+
+ Title: "Yet another perldoc option"
+ From: Gisle Aas <aas@aas.no>
+ Msg-ID: <199610022200.AAA15334@furubotn.sn.no>
+ Date: Thu, 3 Oct 1996 00:00:35 +0200
+ Files: utils/perldoc.PL
+
+ Title: "Re: perldoc, temp files, async pagers"
+ From: Roderick Schertler <roderick@gate.net>
+ Msg-ID: <pzwwtoom8p.fsf@eeyore.ibcinc.com>
+ Date: 07 Jan 1997 22:54:14 -0500
+ Files: utils/perldoc.PL
+
+ DOCUMENTATION
+
+ Title: "Full documentation generation patch"
+ From: Raphael Manfredi <Raphael_Manfredi@grenoble.hp.com>
+ Msg-ID: <15309.853323388@lyon.grenoble.hp.com>
+ Date: Wed, 15 Jan 97 11:16:28 +0100
+ Files: MANIFEST pod/roffitall pod/rofftoc
+
+ Title: "Re: documentation correction (i.e. patch) for perlsyn.pod"
+ From: "M.J.T. Guy" <mjtg@cus.cam.ac.uk>
+ Msg-ID: <E0vilLh-0000M6-00@ursa.cus.cam.ac.uk>
+ Date: Fri, 10 Jan 1997 18:06:37 +0000
+ Files: pod/perlsyn.pod
+
+ Title: "Document use of pos() and /\G/"
+ From: Gurusamy Sarathy <gsar@engin.umich.edu>
+ Msg-ID: <199701132013.PAA26606@aatma.engin.umich.edu>
+ Date: Mon, 13 Jan 1997 15:13:12 -0500
+ Files: pod/perlfunc.pod pod/perlnews.pod pod/perlop.pod
+ pod/perlre.pod pod/perltoc.pod pod/perltrap.pod
+
+ Title: "Fix example #4 in perlXStut"
+ From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Msg-ID: <199701050739.CAA11112@monk.mps.ohio-state.edu>
+ Date: Sun, 5 Jan 1997 02:39:45 -0500 (EST)
+ Files: pod/perlxstut.pod
+
+ Title: "Document new closure warnings"
+ From: Chip Salzenberg <chip@atlantic.net>
+ Files: op.c pod/perldiag.pod
+
+ Title: "Misc. doc patches missing in _20"
+ From: Roderick Schertler <roderick@gate.net>
+ Msg-ID: <102.852695733@eeyore.ibcinc.com>
+ Date: Tue, 07 Jan 1997 22:55:33 -0500
+ Files: pod/perlsub.pod pod/perltoc.pod pod/perlvar.pod
+
+
+----------------
+Version 5.003_20
+----------------
+
+The only language change in this release is the recension of support
+for named closures: Now, no subroutine declared "sub foo {}" can be
+a closure. (This is a return to the behavior of 5.003.) In addition,
+there are new warnings triggered by any apparent attempt to use named
+functions as closures.
+
+And, as usual, there are the usual little fixes, documentation
+updates, and expanded tests. This is good stuff. "I love you, man!"
+
+ CORE LANGUAGE CHANGES
+
+ Title: "Rescind named closures"
+ From: Chip Salzenberg <chip@atlantic.net>
+ Files: Makefile.SH op.c perly.c perly.c.diff perly.y pp_hot.c
+
+ Title: "Fix: empty @_ when calling empty-proto subs without parens"
+ From: Graham Barr <bodg@tiuk.ti.com>
+ Msg-ID: <32CE30F0.7E8425A5@tiuk.ti.com>
+ Date: Sat, 04 Jan 1997 10:29:04 +0000
+ Files: perly.c perly.y
+
+ CORE PORTABILITY
+
+ Title: "Fix $^X on systems that set it to Perl's basename"
+ From: Chip Salzenberg <chip@atlantic.net>
+ Files: hints/hpux.sh toke.c
+
+ Title: "Configure/perl5/Compartmented Mode Workstation (fwd)"
+ From: Andy Dougherty <doughera@fractal.phys.lafayette.edu>
+ Msg-ID: <Pine.SOL.3.95.970106131505.1662C-100000@fractal.lafayette.ed
+ Date: Mon, 06 Jan 1997 13:15:38 -0500 (EST)
+ Files: Configure hints/dec_osf.sh
+
+ Title: "Remove obsolete file "dl_os2.xs"."
+ From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Files: MANIFEST
+
+ OTHER CORE CHANGES
+
+ Title: "Fix C< sub foo (&@); sub bar (&); foo {}, bar {}, bar {} >"
+ From: Chip Salzenberg <chip@atlantic.net>
+ Files: perly.c perly.c.diff perly.y
+
+ Title: "plug for safe/opcode leaks"
+ From: Doug MacEachern <dougm@osf.org>
+ Msg-ID: <199701072220.RAA02117@postman.osf.org>
+ Date: Tue, 07 Jan 1997 17:20:46 -0500
+ Files: op.c
+
+ Title: "Finish OP= warnings: none on ^="
+ From: Chip Salzenberg <chip@atlantic.net>
+ Files: doop.c pp.c t/op/assignwarn.t
+
+ Title: "Fix Dynaloader failures with DProf"
+ From: Gurusamy Sarathy <gsar@engin.umich.edu>
+ Msg-ID: <199701061718.MAA26909@aatma.engin.umich.edu>
+ Date: Mon, 06 Jan 1997 12:18:46 -0500
+ Files: pp_hot.c
+
+ BUILD PROCESS
+
+ Title: "Make Configure default to the first domain in /etc/resolv.conf"
+ From: Chip Salzenberg <chip@atlantic.net>
+ Files: Configure
+
+ Title: "Start all helper scripts with $startsh"
+ From: Chip Salzenberg <chip@atlantic.net>
+ Files: Configure
+
+ Title: "Support libperl.so under FreeBSD"
+ From: roberto@keltia.freenix.fr (Ollivier Robert)
+ Msg-ID: <Mutt.19970105224149.roberto@keltia.freenix.fr>
+ Date: Sun, 5 Jan 1997 22:41:49 +0100
+ Files: Configure Makefile.SH
+
+ TESTS
+
+ Title: "New test: comp/proto.t"
+ From: Graham Barr <bodg@tiuk.ti.com>
+ Msg-ID: <32D0C21F.3FB28D51@tiuk.ti.com>
+ Date: Mon, 06 Jan 1997 09:13:03 +0000
+ Files: MANIFEST t/comp/proto.t
+
+ Title: "More magic variable tests"
+ From: Roderick Schertler <roderick@gate.net>
+ Msg-ID: <7043.852565192@eeyore.ibcinc.com>
+ Date: Mon, 06 Jan 1997 10:39:52 -0500
+ Files: t/harness t/op/magic.t
+
+ LIBRARY AND EXTENSIONS
+
+ Title: "File::Basename::dirname bugs"
+ From: Robin Barker <rmb@cise.npl.co.uk>
+ Msg-ID: <12393.9701071719@tempest.cise.npl.co.uk>
+ Date: Tue, 7 Jan 97 17:19:59 GMT
+ Files: lib/File/Basename.pm t/lib/basename.t
+
+ Title: "sigaction() problems"
+ From: Roderick Schertler <roderick@gate.net>
+ Msg-ID: <12808.852583324@eeyore.ibcinc.com>
+ Date: Mon, 06 Jan 1997 15:42:04 -0500
+ Files: ext/POSIX/POSIX.pm ext/POSIX/POSIX.pod
+
+ Title: "Fix importation of FileHandle methods; fix POSIX docs"
+ From: Chip Salzenberg <chip@atlantic.net>
+ Files: ext/POSIX/POSIX.pm ext/POSIX/POSIX.pod lib/FileHandle.pm
+
+ Title: "Patch: make hints files warn about db-recno failures"
+ From: Dominic Dunlop <domo@slipper.ip.lu>
+ Msg-ID: <v03010d00aef53ac4d18a@[194.51.248.68]>
+ Date: Sun, 5 Jan 1997 12:34:25 +0100
+ Files: MANIFEST hints/aux.sh hints/broken-db.msg hints/freebsd.sh
+
+ UTILITIES
+
+ Title: "pod2html.PL patch (for 5.003-19)"
+ From: Fabien TASSIN <tassin@eerie.fr>
+ Msg-ID: <199701052347.AAA21297@solar5>
+ Date: Mon, 6 Jan 1997 00:47:01 +0100
+ Files: pod/pod2html.PL
+
+ DOCUMENTATION
+
+ Title: "tiny doc patches"
+ From: Roderick Schertler <roderick@gate.net>
+ Msg-ID: <23338.852394333@eeyore.ibcinc.com>
+ Date: Sat, 04 Jan 1997 11:12:13 -0500
+ Files: pod/perlapio.pod pod/perlnews.pod pod/perltoc.pod
+
+ Title: "doc patch for defined on perlfunc.pod"
+ From: Roderick Schertler <roderick@gate.net>
+ Msg-ID: <pz91686ek1.fsf@eeyore.ibcinc.com>
+ Date: 04 Jan 1997 21:28:30 -0500
+ Files: pod/perlfunc.pod
+
+ Title: "doc patch: perldsc"
+ From: Roderick Schertler <roderick@gate.net>
+ Msg-ID: <pzafqo6eo9.fsf@eeyore.ibcinc.com>
+ Date: 04 Jan 1997 21:25:58 -0500
+ Files: pod/perldsc.pod pod/perltoc.pod
+
+ Title: "Re: constant function inlining"
+ From: Roderick Schertler <roderick@gate.net>
+ Msg-ID: <pzk9pp1b95.fsf@eeyore.ibcinc.com>
+ Date: 07 Jan 1997 15:27:50 -0500
+ Files: pod/perldiag.pod pod/perlsub.pod
+
+ Title: "scalar caller doc fix"
+ From: Roderick Schertler <roderick@gate.net>
+ Msg-ID: <18245.852608060@eeyore.ibcinc.com>
+ Date: Mon, 06 Jan 1997 22:34:20 -0500
+ Files: pod/perlfunc.pod
+
+ Title: "perlpod.pod possible patches"
+ From: lvirden@cas.org (Larry W. Virden, x2487)
+ Msg-ID: <9701070756.AA1185@cas.org>
+ Date: Tue, 7 Jan 1997 07:56:30 -0500
+ Files: pod/perlpod.pod
+
+ Title: "Misc perlfunc updates"
+ From: Tom Christiansen <tchrist@mox.perl.com>
+ Files: pod/perlfunc.pod pod/perltoc.pod
+
+
+----------------
+Version 5.003_19
+----------------
+
+Lots of internal cleanup in this patch, especially plugged memory
+leaks when embedded Perl interpreters shut down and restart. The
+method cache is now invisible to user code. And there is a new test
+directory, "t/pragma".
+
+IMHO, this is Beta quality code.
+
+Here's a list of the more significant changes...
+
+ CORE LANGUAGE CHANGES
+
+ Title: "Make method cache invisible to user code"
+ From: Chip Salzenberg <chip@atlantic.net>
+ Files: dump.c gv.c gv.h hv.c op.c perl.c pp_hot.c pp_sys.c sv.c
+ toke.c
+
+ Title: "Never parse "{m,s,y,tr,q{,q,w,x}}:{,:}" as package or label"
+ From: Chip Salzenberg <chip@atlantic.net>
+ Files: toke.c
+
+ CORE PORTABILITY
+
+ Title: "Fix $^X under HP-UX"
+ From: Chip Salzenberg <chip@atlantic.net>
+ Files: hints/hpux.sh toke.c
+
+ Title: "New hints/hpux.sh"
+ From: Jeff Okamoto <okamoto@hpcc123.corp.hp.com>
+ Msg-ID: <199612312309.AA283393772@hpcc123.corp.hp.com>
+ Date: Tue, 31 Dec 1996 15:09:32 -0800
+ Files: hints/hpux.sh
+
+ OTHER CORE CHANGES
+
+ Title: "Fix segv when calling named closures"
+ From: Chip Salzenberg <chip@atlantic.net>
+ Files: pp_hot.c
+
+ Title: "Finish rationalizing "undef value" warnings"
+ From: Chip Salzenberg <chip@atlantic.net>
+ Files: doop.c pp.c sv.c t/op/assignwarn.t
+
+ Title: "Arrange for all "_<file" entries to be in %main::"
+ From: Chip Salzenberg <chip@atlantic.net>
+ Files: gv.c lib/perl5db.pl
+
+ Title: "Introduce CVf_NODEBUG flag"
+ From: Gurusamy Sarathy <gsar@engin.umich.edu>
+ Msg-ID: <199701012042.PAA25994@aatma.engin.umich.edu>
+ Date: Wed, 01 Jan 1997 15:42:05 -0500
+ Files: cv.h pp_hot.c
+
+ Title: "Reword 'may be "0"' warning per Larry; fix its line number"
+ From: Chip Salzenberg <chip@atlantic.net>
+ Files: op.c pod/perldiag.pod
+
+ Title: "5.003_18: perl_{con,des}truct fixes"
+ From: Doug MacEachern <dougm@osf.org>
+ Msg-ID: <199701032042.PAA06766@postman.osf.org>
+ Date: Fri, 03 Jan 1997 15:42:04 -0500
+ Files: perl.c perl.h pod/perlembed.pod pod/perltoc.pod t/op/sysio.t
+
+ Title: "Fix lost value from READLINE after TIEHANDLE"
+ From: Gurusamy Sarathy <gsar@engin.umich.edu>
+ Files: pp_hot.c sv.h
+
+ Title: "Free memory of large lexical variables when leaving scope"
+ From: Chip Salzenberg <chip@atlantic.net>
+ Files: scope.c
+
+ TESTS
+
+ Title: "Create t/pragma directory; populate with new and old"
+ From: pmarquess@bfsec.bt.co.uk (Paul Marquess)
+ Files: MANIFEST Makefile.SH t/TEST t/comp/use.t t/lib/locale.t
+ t/op/overload.t t/op/use.t t/pragma/locale.t t/pragma/overload.t
+ t/pragma/strict-refs t/pragma/strict-subs t/pragma/strict-vars
+ t/pragma/strict.t t/pragma/subs.t t/pragma/warn-global
+ t/pragma/warning.t
+
+ Title: "New tests: comp/colon.t and op/assignwarn.t"
+ From: Robin Barker <rmb@cise.npl.co.uk>
+ Files: MANIFEST t/comp/colon.t t/op/assignwarn.t
+
+ LIBRARY AND EXTENSIONS
+
+ Title: "Make libs clean under '-w'"
+ From: Jarkko Hietaniemi <jhi@cc.hut.fi>
+ Files: lib/AutoSplit.pm lib/Devel/SelfStubber.pm lib/Env.pm
+ lib/Math/Complex.pm lib/Pod/Functions.pm lib/Search/Dict.pm
+ lib/SelfLoader.pm lib/Term/Complete.pm lib/chat2.pl
+ lib/complete.pl lib/diagnostics.pm lib/ftp.pl lib/termcap.pl
+ lib/validate.pl
+
+ DOCUMENTATION
+
+ Title: "Perlguts, version 28"
+ From: Jeff Okamoto <okamoto@hpcc123.corp.hp.com>
+ Msg-ID: <199701032110.AA102535846@hpcc123.corp.hp.com>
+ Date: Fri, 3 Jan 1997 13:10:46 -0800
+ Files: pod/perlguts.pod
+
+ Title: "Re: perldelta, take 3"
+ From: Tim Bunce <Tim.Bunce@ig.co.uk>
+ Msg-ID: <9701031748.AA15335@toad.ig.co.uk>
+ Date: Fri, 3 Jan 1997 17:48:46 +0000
+ Files: pod/perlnews.pod
+
+ Title: "Miscellaneous pod patches"
+ From: Ralf S. Engelschall <rse@engelschall.com>
+ Files: pod/Makefile pod/perldebug.pod pod/perlfunc.pod
+ pod/perlguts.pod
+
+ Title: "expanded flock() docs"
+ From: Roderick Schertler <roderick@gate.net>
+ Msg-ID: <4481.852337871@eeyore.ibcinc.com>
+ Date: Fri, 03 Jan 1997 19:31:11 -0500
+ Files: pod/perlfunc.pod
+
+ Title: "Use Text::Wrap in buildtoc; run buildtoc"
+ From: Ulrich Pfeifer <pfeifer@charly.informatik.uni-dortmund.de>
+ Files: pod/buildtoc pod/perltoc.pod
+
+ Title: "Remove obsolete perlovl.pod"
+ From: Chip Salzenberg <chip@atlantic.net>
+ Files: MANIFEST plan9/mkfile pod/perlovl.pod vms/Makefile
+ vms/descrip.mms
+
+
+----------------
+Version 5.003_18
+----------------
+
+Yet further down the road to 5.004....
+
+ CORE LANGUAGE CHANGES
+
+ Title: "Inherited overloading"
+ From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Msg-ID: <199612291312.IAA02134@monk.mps.ohio-state.edu>
+ Date: Sun, 29 Dec 1996 08:12:54 -0500 (EST)
+ Files: gv.c lib/overload.pm perl.h sv.c sv.h t/op/overload.t
+
+ Title: "Hide lexicals from C<use>d or C<require>d module (!)"
+ From: Chip Salzenberg <chip@atlantic.net>
+ Files: pp_ctl.c
+
+ Title: "Closures at file scope must be anonymous"
+ From: Chip Salzenberg <chip@atlantic.net>
+ Files: op.c
+
+ Title: "Warn on '{if,while} ($x = X)' where X is glob, readdir, or <FH>"
+ From: Chip Salzenberg <chip@atlantic.net>
+ Files: op.c pod/perldiag.pod
+
+ Title: "Warn on 'undef $x; $x OP 1' where OP is *=, /=, %=, or **="
+ From: Chip Salzenberg <chip@atlantic.net>
+ Files: pp.c
+
+ CORE PORTABILITY
+
+ Title: "Ultrix setlocale() workaround"
+ From: Chip Salzenberg <chip@atlantic.net>
+ Files: hints/ultrix_4.sh util.c
+
+ OTHER CORE CHANGES
+
+ Title: "Get rid of 'Leaked scalars'"
+ From: Chip Salzenberg <chip@atlantic.net>
+ Files: cop.h gv.c op.c
+
+ Title: "Don't forget $c in C<(($a,$b,$c)=(1,2))=(3,4,5)>"
+ From: Chip Salzenberg <chip@atlantic.net>
+ Files: pp_hot.c
+
+ Title: "Fix core dump on perl_construct()/perl_destruct() loop"
+ From: Chip Salzenberg <chip@atlantic.net>
+ Files: perl.c
+
+ Title: "Add missing syms to global.sym; update magic doc"
+ From: Chip Salzenberg <chip@atlantic.net>
+ Files: global.sym pod/perlguts.pod
+
+ TESTS
+
+ Title: "Expanded locale.t and misc.t"
+ From: Jarkko Hietaniemi <jhi@cc.hut.fi>
+ Files: t/lib/locale.t t/lib/misc.t
+
+ Title: "Expanded my.t"
+ From: Chip Salzenberg <chip@atlantic.net>
+ Files: t/lib/my.t
+
+ Title: "test harness for C<use x.xxxx>"
+ From: Graham Barr <bodg@tiuk.ti.com>
+ Msg-ID: <32C76882.3F3C7999@tiuk.ti.com>
+ Date: Mon, 30 Dec 1996 07:00:18 +0000
+ Files: MANIFEST t/op/use.t
+
+ Title: "More tests"
+ From: Tom Phoenix <rootbeer@teleport.com>
+ Msg-ID: <Pine.GSO.3.95.961229170736.15213M-100000@solaris.teleport.co
+ Date: Sun, 29 Dec 1996 17:46:21 -0800 (PST)
+ Files: t/op/each.t t/op/oct.t t/op/quotemeta.t t/op/rand.t
+
+ LIBRARY AND EXTENSIONS
+
+ Title: "Improving Config.pm"
+ From: Tom Phoenix <rootbeer@teleport.com>
+ Msg-ID: <Pine.GSO.3.95.961230091244.13467L-100000@solaris.teleport.co
+ Date: Mon, 30 Dec 1996 09:24:16 -0800 (PST)
+ Files: configpm
+
+ Title: "File::Copy under OS/2"
+ From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Msg-ID: <199612280347.WAA00293@monk.mps.ohio-state.edu>
+ Date: Fri, 27 Dec 1996 22:47:24 -0500 (EST)
+ Files: lib/File/Copy.pm t/lib/filecopy.t
+
+ DOCUMENTATION
+
+ Title: "Updates to perllocale.pod"
+ From: Dominic Dunlop <domo@slipper.ip.lu>
+ Files: pod/perllocale.pod
+
+ Title: "Locale-related pod patches, take 2"
+ From: Dominic Dunlop <domo@slipper.ip.lu>
+ Msg-ID: <v03007800aeea9e488b36@[194.51.248.77]>
+ Date: Sat, 28 Dec 1996 10:56:41 +0100
+ Files: pod/perl.pod pod/perlform.pod pod/perlfunc.pod pod/perlop.pod
+ pod/perlre.pod pod/perlsec.pod
+
+ Title: "Re: perldiag.pod entry for "Scalar value @%s{%s} ...""
+ From: Roderick Schertler <roderick@gate.net>
+ Msg-ID: <2043.852051019@eeyore.ibcinc.com>
+ Date: Tue, 31 Dec 1996 11:50:19 -0500
+ Files: pod/perldiag.pod
+
+
+----------------
Version 5.003_17
----------------
diff --git a/Configure b/Configure
index 3ae746cb41..f9af03cf84 100755
--- a/Configure
+++ b/Configure
@@ -958,7 +958,11 @@ silent=''
extractsh=''
override=''
knowitall=''
+
rm -f optdef.sh
+cat >optdef.sh <<EOS
+$startsh
+EOS
: option parsing
while test $# -gt 0; do
@@ -1192,6 +1196,7 @@ esac"
: now set up to do reads with possible shell escape and default assignment
cat <<EOSC >myread
+$startsh
xxxm=\$dflt
$myecho
ans='!'
@@ -1770,7 +1775,7 @@ EOM
ultrix) osname=ultrix
osvers="$3"
;;
- osf1) case "$5" in
+ osf1|mls+) case "$5" in
alpha)
osname=dec_osf
osvers=`echo "$3" | sed 's/^[vt]//'`
@@ -2117,7 +2122,10 @@ chmod +x filexp
$eunicefix filexp
: now set up to get a file name
-cat <<'EOSC' >getfile
+cat <<EOS >getfile
+$startsh
+EOS
+cat <<'EOSC' >>getfile
tilde=''
fullpath=''
already=''
@@ -2516,7 +2524,10 @@ else
fi
: set up the script used to warn in case of inconsistency
-cat <<'EOSC' >whoa
+cat <<EOS >whoa
+$startsh
+EOS
+cat <<'EOSC' >>whoa
dflt=y
echo " "
echo "*** WHOA THERE!!! ***" >&4
@@ -4094,6 +4105,10 @@ elif com="$sed -n -e 's/^[-0-9a-f ]*_\(.*\)=.*/\1/p'";\
eval $xscan;\
$contains '^fprintf$' libc.list >/dev/null 2>&1; then
eval $xrun
+elif com="$sed -n -e 's/.*\.text n\ \ \ \.//p'";\
+ eval $xscan;\
+ $contains '^fprintf$' libc.list >/dev/null 2>&1; then
+ eval $xrun
else
nm -p $* 2>/dev/null >libc.tmp
$grep fprintf libc.tmp > libc.ptf
@@ -4679,6 +4694,9 @@ if "$useshrplib"; then
solaris|netbsd)
xxx="-R $shrpdir"
;;
+ freebsd)
+ xxx="-Wl,-R$shrpdir"
+ ;;
linux|irix*)
xxx="-Wl,-rpath,$shrpdir"
;;
@@ -5133,11 +5151,13 @@ case "$myhostname" in
echo "(Attempting domain name extraction from $tans)"
: Why was there an Egrep here, when Sed works?
: Look for either a search or a domain directive.
- dflt=.`$sed -n -e 's/^search[ ]*\(.*\)/\1/p' $tans \
- | ./tr '[A-Z]' '[a-z]' 2>/dev/null`
+ dflt=.`$sed -n -e 's/ / /g' \
+ -e 's/^search *\([^ ]*\).*/\1/p' $tans \
+ | ./tr '[A-Z]' '[a-z]' 2>/dev/null`
case "$dflt" in
- .) dflt=.`$sed -n -e 's/^domain[ ]*\(.*\)/\1/p' $tans \
- | ./tr '[A-Z]' '[a-z]' 2>/dev/null`
+ .) dflt=.`$sed -n -e 's/ / /g' \
+ -e 's/^domain *\([^ ]*\).*/\1/p' $tans \
+ | ./tr '[A-Z]' '[a-z]' 2>/dev/null`
;;
esac
fi
@@ -6398,7 +6418,9 @@ main()
}
EOCP
if $cc $ccflags $ldflags try.c -o try >/dev/null 2>&1; then
- echo "$startsh" >mtry
+ cat <<EOS >mtry
+$startsh
+EOS
echo "./try >try.out 2>try.ret 3>try.err || exit 4" >>mtry
chmod +x mtry
./mtry >/dev/null 2>&1
@@ -6434,7 +6456,7 @@ EOCP
*) echo "However, your read() returns '$status' on EOF??";;
esac
val="$define"
- if test "$status" -eq "$rd_nodata"; then
+ if test "$status" = "$rd_nodata"; then
echo "WARNING: you can't distinguish between EOF and no data!"
val="$undef"
fi
diff --git a/INSTALL b/INSTALL
index 876e2cdb7e..3443d29f9c 100644
--- a/INSTALL
+++ b/INSTALL
@@ -315,11 +315,11 @@ just put their local extensions in with the standard distribution.
In order to support using things like #!/usr/local/bin/perl5.002 after
a later version is released, architecture-dependent libraries are
stored in a version-specific directory, such as
-/usr/local/lib/perl5/archname/5.002/. In 5.000 and 5.001, these files
-were just stored in /usr/local/lib/perl5/archname/. If you will not be
-using 5.001 binaries, you can delete the standard extensions from the
-/usr/local/lib/perl5/archname/ directory. Locally-added extensions can
-be moved to the site_perl and site_perl/archname directories.
+/usr/local/lib/perl5/archname/5.002/. In Perl 5.000 and 5.001, these
+files were just stored in /usr/local/lib/perl5/archname/. If you will
+not be using 5.001 binaries, you can delete the standard extensions from
+the /usr/local/lib/perl5/archname/ directory. Locally-added extensions
+can be moved to the site_perl and site_perl/archname directories.
Again, these are just the defaults, and can be changed as you run
Configure.
@@ -406,7 +406,7 @@ Your system and typical applications may well give quite different
results.
The default name for the shared library is typically something like
-libperl.so.3.2 (for perl5.003_02) or libperl.so.302 or simply
+libperl.so.3.2 (for Perl 5.003_02) or libperl.so.302 or simply
libperl.so. Configure tries to guess a sensible naming convention
based on your C library name. Since the library gets installed in a
version-specific architecture-dependent directory, the exact name
@@ -436,8 +436,8 @@ LD_LIBRARY_PATH above.
There is also an potential problem with the shared perl library if you
want to have more than one "flavor" of the same version of perl (e.g.
with and without -DDEBUGGING). For example, suppose you build and
-install a standard perl5.004 with a shared library. Then, suppose you
-try to build perl5.004 with -DDEBUGGING enabled, but everything else
+install a standard Perl 5.004 with a shared library. Then, suppose you
+try to build Perl 5.004 with -DDEBUGGING enabled, but everything else
the same, including all the installation directories. How can you
ensure that your newly built perl will link with your newly built
libperl.so.4 rather with the installed libperl.so.4? The answer is
@@ -645,7 +645,7 @@ various other operating systems.
=back
-=head1 Binary Compatibility With 5.003
+=head1 Binary Compatibility With Perl 5.003
Perl 5.003 turned on the EMBED feature by default, which tries to
avoid possible symbol name conflict by prefixing all global symbols
@@ -1012,14 +1012,14 @@ You can safely install the current version of perl5 and still run scripts
under the old binaries for versions 5.003 and later ONLY. Instead of
starting your script with #!/usr/local/bin/perl, just start it with
#!/usr/local/bin/perl5.003 (or whatever version you want to run.)
-If you want to retain a version of perl5 prior to perl5.003, you'll
+If you want to retain a version of Perl 5 prior to 5.003, you'll
need to install the current version in a separate directory tree,
since some of the architecture-independent library files have changed
in incompatible ways.
The architecture-dependent files are stored in a version-specific
directory (such as F</usr/local/lib/perl5/sun4-sunos/5.002>) so that
-they are still accessible. I<Note:> perl5.000 and perl5.001 did not
+they are still accessible. I<Note:> Perl 5.000 and 5.001 did not
put their architecture-dependent libraries in a version-specific
directory. They are simply in F</usr/local/lib/perl5/$archname>. If
you will not be using 5.000 or 5.001, you may safely remove those
@@ -1032,7 +1032,7 @@ Most extensions will probably not need to be recompiled to use with a newer
version of perl. If you do run into problems, and you want to continue
to use the old version of perl along with your extension, simply move
those extension files to the appropriate version directory, such as
-F</usr/local/lib/perl/archname/5.002>. Then perl5.002 will find your
+F</usr/local/lib/perl/archname/5.002>. Then Perl 5.002 will find your
files in the 5.002 directory, and newer versions of perl will find your
newer extension in the site_perl directory.
@@ -1046,7 +1046,7 @@ and adding /opt/perl5.002/bin to the shell PATH variable. Such users
may also wish to add a symbolic link /usr/local/bin/perl so that
scripts can still start with #!/usr/local/bin/perl.
-B<NOTE>: Starting with 5.002_01, all functions in the perl C source
+B<NOTE>: Starting with Perl 5.002_01, all functions in the perl C source
code are protected by default by the prefix Perl_ (or perl_) so that
you may link with third-party libraries without fear of namespace
collisons. This breaks compatability with
diff --git a/MANIFEST b/MANIFEST
index ea6fe73306..6b202da522 100644
--- a/MANIFEST
+++ b/MANIFEST
@@ -95,7 +95,6 @@ ext/DynaLoader/dl_dlopen.xs BSD/SunOS4&5 dlopen() style implementation
ext/DynaLoader/dl_hpux.xs HP-UX implementation
ext/DynaLoader/dl_next.xs Next implementation
ext/DynaLoader/dl_none.xs Stub implementation
-ext/DynaLoader/dl_os2.xs OS/2 implementation
ext/DynaLoader/dl_vms.xs VMS implementation
ext/DynaLoader/dlutils.c Dynamic loader utilities for dl_*.xs files
ext/Fcntl/Fcntl.pm Fcntl extension Perl module
@@ -204,7 +203,8 @@ hints/aix.sh Hints for named architecture
hints/altos486.sh Hints for named architecture
hints/amigaos.sh Hints for named architecture
hints/apollo.sh Hints for named architecture
-hints/aux.sh Hints for named architecture
+hints/aux_3.sh Hints for named architecture
+hints/broken-db.msg Warning message for systems with broken DB library
hints/bsdos.sh Hints for named architecture
hints/convexos.sh Hints for named architecture
hints/cxux.sh Hints for named architecture
@@ -224,6 +224,8 @@ hints/irix_4.sh Hints for named architecture
hints/irix_5.sh Hints for named architecture
hints/irix_6.sh Hints for named architecture
hints/irix_6_2.sh Hints for named architecture
+hints/irix_6_3.sh Hints for named architecture
+hints/irix_6_4.sh Hints for named architecture
hints/isc.sh Hints for named architecture
hints/isc_2.sh Hints for named architecture
hints/linux.sh Hints for named architecture
@@ -506,7 +508,6 @@ pod/perlmod.pod Module info
pod/perlnews.pod News of changes since last version
pod/perlobj.pod Object info
pod/perlop.pod Operator info
-pod/perlovl.pod Overloading info
pod/perlpod.pod Pod info
pod/perlre.pod Regular expression info
pod/perlref.pod References info
@@ -527,6 +528,7 @@ pod/pod2latex.PL Precursor for translator to turn pod into LaTeX
pod/pod2man.PL Precursor for translator to turn pod into manpage
pod/pod2text.PL Precursor for translator to turn pod into text
pod/roffitall troff the whole man page set
+pod/rofftoc Generate a table of contents in troff format
pod/splitman Splits perlfunc into multiple man pages
pod/splitpod Splits perlfunc into multiple pod pages
pp.c Push/Pop code
@@ -560,14 +562,17 @@ t/cmd/subval.t See if subroutine values work
t/cmd/switch.t See if switch optimizations work
t/cmd/while.t See if while loops work
t/comp/cmdopt.t See if command optimization works
+t/comp/colon.t See if colons are parsed correctly
t/comp/cpp.aux main file for cpp.t
t/comp/cpp.t See if C preprocessor works
t/comp/decl.t See if declarations work
t/comp/multiline.t See if multiline strings work
t/comp/package.t See if packages work
+t/comp/proto.t See if function prototypes work
t/comp/redef.t See if we get correct warnings on redefined subs
t/comp/script.t See if script invokation works
t/comp/term.t See if more terms work
+t/comp/use.t See if pragmas work
t/harness Finer diagnostics from test suite
t/io/argv.t See if ARGV stuff works
t/io/dup.t See if >& works right
@@ -609,7 +614,6 @@ t/lib/io_taint.t See if the untaint method from IO works
t/lib/io_tell.t See if seek()/tell()-related methods from IO work
t/lib/io_udp.t See if UDP socket-related methods from IO work
t/lib/io_xs.t See if XSUB methods from IO work
-t/lib/locale.t See if locale support (i18n and l10n) works
t/lib/ndbm.t See if NDBM_File works
t/lib/odbm.t See if ODBM_File works
t/lib/opcode.t See if Opcode works
@@ -631,9 +635,11 @@ t/lib/textwrap.t See if Text::Wrap works
t/lib/timelocal.t See if Time::Local works
t/op/append.t See if . works
t/op/array.t See if array operations work
+t/op/assignwarn.t See if OP= operators warn correctly for undef targets
t/op/auto.t See if autoincrement et all work
t/op/bop.t See if bitops work
t/op/chop.t See if chop works
+t/op/cmp.t See if the various string and numeric compare work
t/op/cond.t See if conditional expressions work
t/op/delete.t See if delete works
t/op/do.t See if subroutines work
@@ -660,7 +666,6 @@ t/op/mkdir.t See if mkdir works
t/op/my.t See if lexical scoping works
t/op/oct.t See if oct and hex work
t/op/ord.t See if ord works
-t/op/overload.t See if operator overload works
t/op/pack.t See if pack and unpack work
t/op/pat.t See if esoteric patterns work
t/op/push.t See if push and pop work
@@ -686,9 +691,19 @@ t/op/sysio.t See if sysread and syswrite work
t/op/tie.t See if tie/untie functions work
t/op/time.t See if time functions work
t/op/undef.t See if undef works
+t/op/universal.t See if UNIVERSAL class works
t/op/unshift.t See if unshift works
t/op/vec.t See if vectors work
t/op/write.t See if write works
+t/pragma/locale.t See if locale support (i18n and l10n) works
+t/pragma/overload.t See if operator overloading works
+t/pragma/strict-refs Tests of "use strict 'refs'" for strict.t
+t/pragma/strict-subs Tests of "use strict 'subs'" for strict.t
+t/pragma/strict-vars Tests of "use strict 'vars'" for strict.t
+t/pragma/strict.t See if strictures work
+t/pragma/subs.t See if subroutine pseudo-importation works
+t/pragma/warn-1global Tests of global warnings for warning.t
+t/pragma/warning.t See if warning controls work
taint.c Tainting code
toke.c The tokener
universal.c The default UNIVERSAL package methods
diff --git a/Makefile.SH b/Makefile.SH
index a336d7db42..025dd22248 100755
--- a/Makefile.SH
+++ b/Makefile.SH
@@ -34,7 +34,7 @@ true)
-compatibility_version 1 -current_version $(PATCHLEVEL) \
-prebind -seg1addr 0x27000000 -install_name $(SHRPDIR)/$@'
;;
- sunos*)
+ sunos*|freebsd[23]*)
linklibperl="-lperl"
;;
esac
@@ -290,7 +290,7 @@ quantperl: $& perlmain$(OBJ_EXT) $(LIBPERL) $(DYNALOADER) $(static_ext) ext.libs
# has been invoked correctly.
suidperl: $& sperl$(OBJ_EXT) perlmain$(OBJ_EXT) $(LIBPERL) $(DYNALOADER) $(static_ext) ext.libs
- $(CC) $(LARGE) $(CLDFLAGS) $(CCDLFLAGS) -o suidperl perlmain$(OBJ_EXT) sperl$(OBJ_EXT) $(DYNALOADER) $(static_ext) $(LIBPERL) `cat ext.libs` $(libs)
+ $(CC) $(LARGE) $(CLDFLAGS) $(CCDLFLAGS) -o suidperl perlmain$(OBJ_EXT) sperl$(OBJ_EXT) $(DYNALOADER) $(static_ext) $(LLIBPERL) `cat ext.libs` $(libs)
!NO!SUBS!
@@ -344,7 +344,7 @@ install.man: all installman
# normally shouldn't remake perly.[ch].
run_byacc: FORCE
- @ echo 'Expect' 130 shift/reduce and 1 reduce/reduce conflict
+ @ echo 'Expect' 113 shift/reduce and 1 reduce/reduce conflict
$(BYACC) -d perly.y
sh $(shellflags) ./perly.fixer y.tab.c perly.c
sed -e 's/fprintf *( *stderr *,/PerlIO_printf(Perl_debug_log,/g' \
@@ -478,7 +478,7 @@ minitest: miniperl
@echo "You may see some irrelevant test failures if you have been unable"
@echo "to build lib/Config.pm."
- cd t && (rm -f perl$(EXE_EXT); $(LNS) ../miniperl$(EXE_EXT) perl$(EXE_EXT)) \
- && ./perl TEST base/*.t comp/*.t cmd/*.t io/*.t op/*.t </dev/tty
+ && ./perl TEST base/*.t comp/*.t cmd/*.t io/*.t op/*.t pragma/*.t </dev/tty
clist: $(c)
echo $(c) | tr ' ' '\012' >.clist
diff --git a/configpm b/configpm
index eab7f5bea4..1fef6fe1b2 100755
--- a/configpm
+++ b/configpm
@@ -39,19 +39,23 @@ ENDOFBEG
@non_v=();
@v_fast=();
@v_others=();
+$in_v = 0;
while (<>) {
next if m:^#!/bin/sh:;
# Catch CONFIG=true and PATCHLEVEL=n line from Configure.
s/^(\w+)=(true|\d+)\s*$/$1='$2'\n/;
- unless (m/^(\w+)='(.*)'\s*$/){
+ unless ($in_v or m/^(\w+)='(.*\n)/){
push(@non_v, "#$_"); # not a name='value' line
next;
}
- $name = $1;
+ if ($in_v) { $val .= $_; }
+ else { ($name,$val) = ($1,$2); }
+ $in_v = $val !~ /'\n/;
+ next if $in_v;
if ($extensions{$name}) { s,/,::,g }
- if (!$fast{$name}){ push(@v_others, $_); next; }
- push(@v_fast,$_);
+ if (!$fast{$name}){ push(@v_others, "$name='$val"); next; }
+ push(@v_fast,"$name='$val");
}
foreach(@non_v){ print CONFIG $_ }
@@ -86,11 +90,20 @@ EOT
print CONFIG <<'ENDOFEND';
sub FETCH {
- # check for cached value (which maybe undef so we use exists not defined)
+ # check for cached value (which may be undef so we use exists not defined)
return $_[0]->{$_[1]} if (exists $_[0]->{$_[1]});
-
- my($value); # search for the item in the big $config_sh string
- return undef unless (($value) = $config_sh =~ m/^$_[1]='(.*)'\s*$/m);
+
+ # Search for it in the big string
+ my($value, $start, $marker);
+ $marker = "$_[1]='";
+ # return undef unless (($value) = $config_sh =~ m/^$_[1]='(.*)'\s*$/m);
+ $start = index($config_sh, "\n$marker");
+ return undef if ( ($start == -1) && # in case it's first
+ (substr($config_sh, 0, length($marker)) ne $marker) );
+ if ($start == -1) { $start = length($marker) }
+ else { $start += length($marker) + 1 }
+ $value = substr($config_sh, $start,
+ index($config_sh, qq('\n), $start) - $start);
$value = undef if $value eq 'undef'; # So we can say "if $Config{'foo'}".
$_[0]->{$_[1]} = $value; # cache it
@@ -101,19 +114,23 @@ my $prevpos = 0;
sub FIRSTKEY {
$prevpos = 0;
- my($key) = $config_sh =~ m/^(.*?)=/;
- $key;
+ # my($key) = $config_sh =~ m/^(.*?)=/;
+ substr($config_sh, 0, index($config_sh, '=') );
+ # $key;
}
sub NEXTKEY {
- my $pos = index($config_sh, "\n", $prevpos) + 1;
+ my $pos = index($config_sh, qq('\n), $prevpos) + 2;
my $len = index($config_sh, "=", $pos) - $pos;
$prevpos = $pos;
$len > 0 ? substr($config_sh, $pos, $len) : undef;
}
sub EXISTS {
- exists($_[0]->{$_[1]}) or $config_sh =~ m/^$_[1]=/m;
+ # exists($_[0]->{$_[1]}) or $config_sh =~ m/^$_[1]=/m;
+ exists($_[0]->{$_[1]}) or
+ index($config_sh, "\n$_[1]='") != -1 or
+ substr($config_sh, 0, length($_[1])+2) eq "$_[1]='";
}
sub STORE { die "\%Config::Config is read-only\n" }
diff --git a/cop.h b/cop.h
index 20301ff4e0..14cd43e3c0 100644
--- a/cop.h
+++ b/cop.h
@@ -50,13 +50,11 @@ struct block_sub {
#define POPSUB(cx) \
if (cx->blk_sub.hasargs) { /* put back old @_ */ \
+ SvREFCNT_dec(GvAV(defgv)); \
GvAV(defgv) = cx->blk_sub.savearray; \
} \
if (cx->blk_sub.cv) { \
if (!(CvDEPTH(cx->blk_sub.cv) = cx->blk_sub.olddepth)) { \
- if (cx->blk_sub.hasargs) { \
- SvREFCNT_inc((SV*)cx->blk_sub.argarray); \
- } \
cxstack_ix++; \
SvREFCNT_dec((SV*)cx->blk_sub.cv); \
cxstack_ix--; \
@@ -108,9 +106,11 @@ struct block_loop {
cx->blk_loop.redo_op = cLOOP->op_redoop; \
cx->blk_loop.next_op = cLOOP->op_nextop; \
cx->blk_loop.last_op = cLOOP->op_lastop; \
- cx->blk_loop.iterlval = Nullsv; \
if (cx->blk_loop.itervar = (ivar)) \
- cx->blk_loop.itersave = SvREFCNT_inc(*cx->blk_loop.itervar);
+ cx->blk_loop.itersave = SvREFCNT_inc(*cx->blk_loop.itervar);\
+ cx->blk_loop.iterlval = Nullsv; \
+ cx->blk_loop.iterary = Nullav; \
+ cx->blk_loop.iterix = -1;
#define POPLOOP(cx) \
newsp = stack_base + cx->blk_loop.resetsp; \
@@ -118,7 +118,9 @@ struct block_loop {
if (cx->blk_loop.itervar) { \
SvREFCNT_dec(*cx->blk_loop.itervar); \
*cx->blk_loop.itervar = cx->blk_loop.itersave; \
- }
+ } \
+ if (cx->blk_loop.iterary && cx->blk_loop.iterary != curstack) \
+ SvREFCNT_dec(cx->blk_loop.iterary);
/* context common to subroutines, evals and loops */
struct block {
diff --git a/cv.h b/cv.h
index d94fb45b62..b29793fa75 100644
--- a/cv.h
+++ b/cv.h
@@ -7,6 +7,8 @@
*
*/
+/* This structure much match the beginning of XPVFM */
+
struct xpvcv {
char * xpv_pv; /* pointer to malloced string */
STRLEN xpv_cur; /* length of xp_pv as a C string */
@@ -48,6 +50,9 @@ struct xpvcv {
#define CVf_ANON 0x04 /* CvGV() can't be trusted */
#define CVf_OLDSTYLE 0x08
#define CVf_UNIQUE 0x10 /* can't be cloned */
+#define CVf_NODEBUG 0x20 /* no DB::sub indirection for this CV
+ (esp. useful for special XSUBs) */
+#define CVf_FORMAT 0x40 /* is a format, not a sub */
#define CvCLONE(cv) (CvFLAGS(cv) & CVf_CLONE)
#define CvCLONE_on(cv) (CvFLAGS(cv) |= CVf_CLONE)
@@ -68,3 +73,11 @@ struct xpvcv {
#define CvUNIQUE(cv) (CvFLAGS(cv) & CVf_UNIQUE)
#define CvUNIQUE_on(cv) (CvFLAGS(cv) |= CVf_UNIQUE)
#define CvUNIQUE_off(cv) (CvFLAGS(cv) &= ~CVf_UNIQUE)
+
+#define CvFORMAT(cv) (CvFLAGS(cv) & CVf_FORMAT)
+#define CvFORMAT_on(cv) (CvFLAGS(cv) |= CVf_FORMAT)
+#define CvFORMAT_off(cv) (CvFLAGS(cv) &= ~CVf_FORMAT)
+
+#define CvNODEBUG(cv) (CvFLAGS(cv) & CVf_NODEBUG)
+#define CvNODEBUG_on(cv) (CvFLAGS(cv) |= CVf_NODEBUG)
+#define CvNODEBUG_off(cv) (CvFLAGS(cv) &= ~CVf_NODEBUG)
diff --git a/doop.c b/doop.c
index 33726bf983..cb5560cc3b 100644
--- a/doop.c
+++ b/doop.c
@@ -535,8 +535,8 @@ SV *right;
char *lsave;
char *rsave;
- if (sv == left && !SvOK(sv) && !SvGMAGICAL(sv) && SvTYPE(sv) <= SVt_PVMG)
- sv_setpvn(sv, "", 0); /* avoid warning on &= etc. */
+ if (sv != left || (optype != OP_BIT_AND && !SvOK(sv) && !SvGMAGICAL(sv)))
+ sv_setpvn(sv, "", 0); /* avoid undef warning on |= and ^= */
lsave = lc = SvPV(left, leftlen);
rsave = rc = SvPV(right, rightlen);
len = leftlen < rightlen ? leftlen : rightlen;
diff --git a/dosish.h b/dosish.h
index ff7e245834..58296a4224 100644
--- a/dosish.h
+++ b/dosish.h
@@ -55,6 +55,18 @@ void Perl_DJGPP_init();
*/
#undef ACME_MESS /**/
+/* ALTERNATE_SHEBANG:
+ * This symbol, if defined, contains a "magic" string which may be used
+ * as the first line of a Perl program designed to be executed directly
+ * by name, instead of the standard Unix #!. If ALTERNATE_SHEBANG
+ * begins with a character other then #, then Perl will only treat
+ * it as a command line if if finds the string "perl" in the first
+ * word; otherwise it's treated as the first line of code in the script.
+ * (IOW, Perl won't hand off to another interpreter via an alternate
+ * shebang sequence that might be legal Perl code.)
+ */
+/* #define ALTERNATE_SHEBANG "#!" / **/
+
/*
* fwrite1() should be a routine with the same calling sequence as fwrite(),
* but which outputs all of the bytes requested as a single stream (unlike
diff --git a/dump.c b/dump.c
index c0749b855f..7aed230c70 100644
--- a/dump.c
+++ b/dump.c
@@ -50,7 +50,7 @@ HV* stash;
for (entry = HvARRAY(stash)[i]; entry; entry = HeNEXT(entry)) {
GV *gv = (GV*)HeVAL(entry);
HV *hv;
- if (GvCV(gv))
+ if (GvCVu(gv))
dump_sub(gv);
if (GvFORM(gv))
dump_form(gv);
diff --git a/embed.h b/embed.h
index 84c3371552..b4bce4b58d 100644
--- a/embed.h
+++ b/embed.h
@@ -67,12 +67,14 @@
#define check_uni Perl_check_uni
#define checkcomma Perl_checkcomma
#define ck_aelem Perl_ck_aelem
+#define ck_anoncode Perl_ck_anoncode
#define ck_bitop Perl_ck_bitop
#define ck_concat Perl_ck_concat
#define ck_delete Perl_ck_delete
#define ck_eof Perl_ck_eof
#define ck_eval Perl_ck_eval
#define ck_exec Perl_ck_exec
+#define ck_exists Perl_ck_exists
#define ck_ftst Perl_ck_ftst
#define ck_fun Perl_ck_fun
#define ck_fun_locale Perl_ck_fun_locale
@@ -216,6 +218,7 @@
#define gv_AVadd Perl_gv_AVadd
#define gv_HVadd Perl_gv_HVadd
#define gv_IOadd Perl_gv_IOadd
+#define gv_autoload Perl_gv_autoload
#define gv_check Perl_gv_check
#define gv_efullname Perl_gv_efullname
#define gv_efullname3 Perl_gv_efullname3
@@ -481,6 +484,7 @@
#define patleave Perl_patleave
#define peep Perl_peep
#define pidgone Perl_pidgone
+#define pidstatus Perl_pidstatus
#define pmflag Perl_pmflag
#define pmruntime Perl_pmruntime
#define pmtrans Perl_pmtrans
@@ -973,9 +977,8 @@
#define start_subparse Perl_start_subparse
#define statbuf Perl_statbuf
#define string_amg Perl_string_amg
+#define sub_crush_depth Perl_sub_crush_depth
#define sub_generation Perl_sub_generation
-#define sublex_done Perl_sublex_done
-#define sublex_start Perl_sublex_start
#define subline Perl_subline
#define subname Perl_subname
#define subtr_amg Perl_subtr_amg
@@ -1073,6 +1076,7 @@
#define vtbl_glob Perl_vtbl_glob
#define vtbl_isa Perl_vtbl_isa
#define vtbl_isaelem Perl_vtbl_isaelem
+#define vtbl_itervar Perl_vtbl_itervar
#define vtbl_mglob Perl_vtbl_mglob
#define vtbl_nkeys Perl_vtbl_nkeys
#define vtbl_pack Perl_vtbl_pack
@@ -1272,7 +1276,6 @@
#define patchlevel (curinterp->Ipatchlevel)
#define perl_destruct_level (curinterp->Iperl_destruct_level)
#define perldb (curinterp->Iperldb)
-#define pidstatus (curinterp->Ipidstatus)
#define preambleav (curinterp->Ipreambleav)
#define preambled (curinterp->Ipreambled)
#define preprocess (curinterp->Ipreprocess)
@@ -1424,7 +1427,6 @@
#define Ipatchlevel patchlevel
#define Iperl_destruct_level perl_destruct_level
#define Iperldb perldb
-#define Ipidstatus pidstatus
#define Ipreambleav preambleav
#define Ipreambled preambled
#define Ipreprocess preprocess
@@ -1585,7 +1587,6 @@
#define patchlevel Perl_patchlevel
#define perl_destruct_level Perl_perl_destruct_level
#define perldb Perl_perldb
-#define pidstatus Perl_pidstatus
#define preambleav Perl_preambleav
#define preambled Perl_preambled
#define preprocess Perl_preprocess
diff --git a/ext/DB_File/DB_File.pm b/ext/DB_File/DB_File.pm
index fe9c34dd14..ff746cf0f8 100644
--- a/ext/DB_File/DB_File.pm
+++ b/ext/DB_File/DB_File.pm
@@ -1,10 +1,10 @@
# DB_File.pm -- Perl 5 interface to Berkeley DB
#
# written by Paul Marquess (pmarquess@bfsec.bt.co.uk)
-# last modified 18th Dec 1996
-# version 1.09
+# last modified 14th Jan 1997
+# version 1.10
#
-# Copyright (c) 1995, 1996 Paul Marquess. All rights reserved.
+# Copyright (c) 1995, 1996, 1997 Paul Marquess. All rights reserved.
# This program is free software; you can redistribute it and/or
# modify it under the same terms as Perl itself.
@@ -146,7 +146,7 @@ use vars qw($VERSION @ISA @EXPORT $AUTOLOAD $DB_BTREE $DB_HASH $DB_RECNO) ;
use Carp;
-$VERSION = "1.09" ;
+$VERSION = "1.10" ;
#typedef enum { DB_BTREE, DB_HASH, DB_RECNO } DBTYPE;
$DB_BTREE = new DB_File::BTREEINFO ;
@@ -1564,6 +1564,11 @@ DB_File::BTREEINFO.
Changed default mode to 0666.
+=item 1.10
+
+Fixed fd method so that it still returns -1 for in-memory files when db
+1.86 is used.
+
=back
=head1 BUGS
@@ -1590,6 +1595,25 @@ If you are running IRIX, then get Berkeley DB from
F<http://reality.sgi.com/ariel>. It has the patches necessary to
compile properly on IRIX 5.3.
+As of January 1997, version 1.86 of Berkeley DB is available from the
+Berkeley DB home page. Although this release does fix a number of bugs
+that were present in 1.85 you should ba aware of the following
+information (taken from the Berkeley DB home page) before you consider
+using it:
+
+ DB version 1.86 includes a new implementation of the hash access
+ method that fixes a variety of hashing problems found in DB version
+ 1.85. We are making it available as an interim solution until DB
+ 2.0 is available.
+
+ PLEASE NOTE: the underlying file format for the hash access method
+ changed between version 1.85 and version 1.86, so you will have to
+ dump and reload all of your databases to convert from version 1.85
+ to version 1.86. If you do not absolutely require the fixes from
+ version 1.86, we strongly urge you to wait until DB 2.0 is released
+ before upgrading from 1.85.
+
+
=head1 SEE ALSO
L<perl(1)>, L<dbopen(3)>, L<hash(3)>, L<recno(3)>, L<btree(3)>
diff --git a/ext/DB_File/DB_File.xs b/ext/DB_File/DB_File.xs
index a13eaa6267..a938ffb09d 100644
--- a/ext/DB_File/DB_File.xs
+++ b/ext/DB_File/DB_File.xs
@@ -3,12 +3,12 @@
DB_File.xs -- Perl 5 interface to Berkeley DB
written by Paul Marquess (pmarquess@bfsec.bt.co.uk)
- last modified 18th Dec 1996
- version 1.09
+ last modified 14th Jan 1997
+ version 1.10
All comments/suggestions/problems are welcome
- Copyright (c) 1995, 1996 Paul Marquess. All rights reserved.
+ Copyright (c) 1995, 1996, 1997 Paul Marquess. All rights reserved.
This program is free software; you can redistribute it and/or
modify it under the same terms as Perl itself.
@@ -35,6 +35,8 @@
1.07 - Fixed bug with RECNO, where bval wasn't defaulting to "\n".
1.08 - No change to DB_File.xs
1.09 - Default mode for dbopen changed to 0666
+ 1.10 - Fixed fd method so that it still returns -1 for
+ in-memory files when db 1.86 is used.
*/
@@ -72,6 +74,7 @@ typedef struct {
SV * compare ;
SV * prefix ;
SV * hash ;
+ int in_memory ;
union INFO info ;
} DB_File_type;
@@ -88,7 +91,9 @@ typedef DBT DBTKEY ;
#define db_close(db) ((db->dbp)->close)(db->dbp)
#define db_del(db, key, flags) ((db->dbp)->del)(db->dbp, &key, flags)
-#define db_fd(db) ((db->dbp)->fd)(db->dbp)
+#define db_fd(db) (db->in_memory \
+ ? -1 \
+ : ((db->dbp)->fd)(db->dbp) )
#define db_put(db, key, value, flags) ((db->dbp)->put)(db->dbp, &key, &value, flags)
#define db_get(db, key, value, flags) ((db->dbp)->get)(db->dbp, &key, &value, flags)
#define db_seq(db, key, value, flags) ((db->dbp)->seq)(db->dbp, &key, &value, flags)
@@ -319,7 +324,7 @@ DB * db ;
else if (RETVAL == 1) /* No key means empty file */
RETVAL = 0 ;
- return (RETVAL) ;
+ return ((I32)RETVAL) ;
}
static recno_t
@@ -363,6 +368,9 @@ SV * sv ;
/* DGH - Next line added to avoid SEGV on existing hash DB */
CurrentDB = RETVAL;
+ /* fd for 1.86 hash in memory files doesn't return -1 like 1.85 */
+ RETVAL->in_memory = (name == NULL) ;
+
if (sv)
{
if (! SvROK(sv) )
diff --git a/ext/DynaLoader/dl_os2.xs b/ext/DynaLoader/dl_os2.xs
deleted file mode 100644
index 3042a002b2..0000000000
--- a/ext/DynaLoader/dl_os2.xs
+++ /dev/null
@@ -1,188 +0,0 @@
-/* dl_os2.xs
- *
- * Platform: OS/2.
- * Author: Andreas Kaiser (ak@ananke.s.bawue.de)
- * Created: 08th December 1994
- */
-
-#include "EXTERN.h"
-#include "perl.h"
-#include "XSUB.h"
-
-#define INCL_BASE
-#include <os2.h>
-
-#include "dlutils.c" /* SaveError() etc */
-
-static ULONG retcode;
-
-static void *
-dlopen(char *path, int mode)
-{
- HMODULE handle;
- char tmp[260], *beg, *dot;
- char fail[300];
- ULONG rc;
-
- if ((rc = DosLoadModule(fail, sizeof fail, path, &handle)) == 0)
- return (void *)handle;
-
- retcode = rc;
-
- /* Not found. Check for non-FAT name and try truncated name. */
- /* Don't know if this helps though... */
- for (beg = dot = path + strlen(path);
- beg > path && !strchr(":/\\", *(beg-1));
- beg--)
- if (*beg == '.')
- dot = beg;
- if (dot - beg > 8) {
- int n = beg+8-path;
- memmove(tmp, path, n);
- memmove(tmp+n, dot, strlen(dot)+1);
- if (DosLoadModule(fail, sizeof fail, tmp, &handle) == 0)
- return (void *)handle;
- }
-
- return NULL;
-}
-
-static void *
-dlsym(void *handle, char *symbol)
-{
- ULONG rc, type;
- PFN addr;
-
- rc = DosQueryProcAddr((HMODULE)handle, 0, symbol, &addr);
- if (rc == 0) {
- rc = DosQueryProcType((HMODULE)handle, 0, symbol, &type);
- if (rc == 0 && type == PT_32BIT)
- return (void *)addr;
- rc = ERROR_CALL_NOT_IMPLEMENTED;
- }
- retcode = rc;
- return NULL;
-}
-
-static char *
-dlerror(void)
-{
- static char buf[300];
- ULONG len;
-
- if (retcode == 0)
- return NULL;
- if (DosGetMessage(NULL, 0, buf, sizeof buf - 1, retcode, "OSO001.MSG", &len))
- sprintf(buf, "OS/2 system error code %d", retcode);
- else
- buf[len] = '\0';
- retcode = 0;
- return buf;
-}
-
-
-static void
-dl_private_init()
-{
- (void)dl_generic_private_init();
-}
-
-static char *
-mod2fname(sv)
- SV *sv;
-{
- static char fname[9];
- int pos = 7;
- int len;
- AV *av;
- SV *svp;
- char *s;
-
- if (!SvROK(sv)) croak("Not a reference given to mod2fname");
- sv = SvRV(sv);
- if (SvTYPE(sv) != SVt_PVAV)
- croak("Not array reference given to mod2fname");
- if (av_len((AV*)sv) < 0)
- croak("Empty array reference given to mod2fname");
- s = SvPV(*av_fetch((AV*)sv, av_len((AV*)sv), FALSE), na);
- strncpy(fname, s, 8);
- if ((len=strlen(s)) < 7) pos = len;
- fname[pos] = '_';
- fname[pos + 1] = '\0';
- return (char *)fname;
-}
-
-MODULE = DynaLoader PACKAGE = DynaLoader
-
-BOOT:
- (void)dl_private_init();
-
-
-void *
-dl_load_file(filename)
- char * filename
- CODE:
- int mode = 1; /* Solaris 1 */
-#ifdef RTLD_LAZY
- mode = RTLD_LAZY; /* Solaris 2 */
-#endif
- DLDEBUG(1,PerlIO_printf(PerlIO_stderr(), "dl_load_file(%s):\n", filename));
- RETVAL = dlopen(filename, mode) ;
- DLDEBUG(2,PerlIO_printf(PerlIO_stderr(), " libref=%x\n", RETVAL));
- ST(0) = sv_newmortal() ;
- if (RETVAL == NULL)
- SaveError("%s",dlerror()) ;
- else
- sv_setiv( ST(0), (IV)RETVAL);
-
-
-void *
-dl_find_symbol(libhandle, symbolname)
- void * libhandle
- char * symbolname
- CODE:
-#ifdef DLSYM_NEEDS_UNDERSCORE
- char symbolname_buf[1024];
- symbolname = dl_add_underscore(symbolname, symbolname_buf);
-#endif
- DLDEBUG(2,PerlIO_printf(PerlIO_stderr(), "dl_find_symbol(handle=%x, symbol=%s)\n",
- libhandle, symbolname));
- RETVAL = dlsym(libhandle, symbolname);
- DLDEBUG(2,PerlIO_printf(PerlIO_stderr(), " symbolref = %x\n", RETVAL));
- ST(0) = sv_newmortal() ;
- if (RETVAL == NULL)
- SaveError("%s",dlerror()) ;
- else
- sv_setiv( ST(0), (IV)RETVAL);
-
-
-void
-dl_undef_symbols()
- PPCODE:
-
-char *
-mod2fname(sv)
- SV *sv;
-
-
-# These functions should not need changing on any platform:
-
-void
-dl_install_xsub(perl_name, symref, filename="$Package")
- char * perl_name
- void * symref
- char * filename
- CODE:
- DLDEBUG(2,PerlIO_printf(PerlIO_stderr(), "dl_install_xsub(name=%s, symref=%x)\n",
- perl_name, symref));
- ST(0)=sv_2mortal(newRV((SV*)newXS(perl_name, (void(*)())symref, filename)));
-
-
-char *
-dl_error()
- CODE:
- RETVAL = LastError ;
- OUTPUT:
- RETVAL
-
-# end.
diff --git a/ext/IO/IO.xs b/ext/IO/IO.xs
index a6eb075964..daa22f6000 100644
--- a/ext/IO/IO.xs
+++ b/ext/IO/IO.xs
@@ -121,17 +121,28 @@ fsetpos(handle, pos)
MODULE = IO PACKAGE = IO::File PREFIX = f
-OutputStream
+SV *
new_tmpfile(packname = "IO::File")
char * packname
+ PREINIT:
+ OutputStream fp;
+ GV *gv;
CODE:
#ifdef PerlIO
- RETVAL = PerlIO_tmpfile();
+ fp = PerlIO_tmpfile();
#else
- RETVAL = tmpfile();
+ fp = tmpfile();
#endif
- OUTPUT:
- RETVAL
+ gv = (GV*)SvREFCNT_inc(newGVgen(packname));
+ hv_delete(GvSTASH(gv), GvNAME(gv), GvNAMELEN(gv), G_DISCARD);
+ if (do_open(gv, "+>&", 3, FALSE, 0, 0, fp)) {
+ ST(0) = sv_2mortal(newRV_noinc((SV*)gv));
+ sv_bless(ST(0), gv_stashpv(packname, TRUE));
+ }
+ else {
+ ST(0) = &sv_undef;
+ SvREFCNT_dec(gv);
+ }
MODULE = IO PACKAGE = IO::Handle PREFIX = f
diff --git a/ext/IO/lib/IO/Handle.pm b/ext/IO/lib/IO/Handle.pm
index 59741c1c11..e271268390 100644
--- a/ext/IO/lib/IO/Handle.pm
+++ b/ext/IO/lib/IO/Handle.pm
@@ -76,7 +76,7 @@ result!
See L<perlfunc> for complete descriptions of each of the following
supported C<IO::Handle> methods, which are just front ends for the
corresponding built-in functions:
-
+
close
fileno
getc
@@ -192,7 +192,7 @@ use SelectSaver;
require Exporter;
@ISA = qw(Exporter);
-$VERSION = "1.14";
+$VERSION = "1.1401";
@EXPORT_OK = qw(
autoflush
diff --git a/ext/IO/lib/IO/Seekable.pm b/ext/IO/lib/IO/Seekable.pm
index e8a9530e80..3bae914087 100644
--- a/ext/IO/lib/IO/Seekable.pm
+++ b/ext/IO/lib/IO/Seekable.pm
@@ -26,7 +26,7 @@ that value to return to a previously visited position.
See L<perlfunc> for complete descriptions of each of the following
supported C<IO::Seekable> methods, which are just front ends for the
corresponding built-in functions:
-
+
clearerr
seek
tell
diff --git a/ext/POSIX/POSIX.pm b/ext/POSIX/POSIX.pm
index 22eed0283b..b095ffebe7 100644
--- a/ext/POSIX/POSIX.pm
+++ b/ext/POSIX/POSIX.pm
@@ -194,7 +194,7 @@ sub AUTOLOAD {
local $! = 0;
my $constname = $AUTOLOAD;
$constname =~ s/.*:://;
- my $val = constant($constname, $_[0]);
+ my $val = constant($constname, @_ ? $_[0] : 0);
if ($! == 0) {
*$AUTOLOAD = sub { $val };
}
@@ -231,7 +231,7 @@ sub unimpl {
package POSIX::SigAction;
sub new {
- bless {HANDLER => $_[1], MASK => $_[2], FLAGS => $_[3]};
+ bless {HANDLER => $_[1], MASK => $_[2], FLAGS => $_[3] || 0}, $_[0];
}
############################
@@ -385,35 +385,35 @@ sub offsetof {
}
sub clearerr {
- redef "FileHandle::clearerr()";
+ redef "IO::Handle::clearerr()";
}
sub fclose {
- redef "FileHandle::close()";
+ redef "IO::Handle::close()";
}
sub fdopen {
- redef "FileHandle::new_from_fd()";
+ redef "IO::Handle::new_from_fd()";
}
sub feof {
- redef "FileHandle::eof()";
+ redef "IO::Handle::eof()";
}
sub fgetc {
- redef "FileHandle::getc()";
+ redef "IO::Handle::getc()";
}
sub fgets {
- redef "FileHandle::gets()";
+ redef "IO::Handle::gets()";
}
sub fileno {
- redef "FileHandle::fileno()";
+ redef "IO::Handle::fileno()";
}
sub fopen {
- redef "FileHandle::open()";
+ redef "IO::File::open()";
}
sub fprintf {
@@ -441,27 +441,27 @@ sub fscanf {
}
sub fseek {
- redef "FileHandle::seek()";
+ redef "IO::Seekable::seek()";
}
sub ferror {
- redef "FileHandle::error()";
+ redef "IO::Handle::error()";
}
sub fflush {
- redef "FileHandle::flush()";
+ redef "IO::Handle::flush()";
}
sub fgetpos {
- redef "FileHandle::getpos()";
+ redef "IO::Seekable::getpos()";
}
sub fsetpos {
- redef "FileHandle::setpos()";
+ redef "IO::Seekable::setpos()";
}
sub ftell {
- redef "FileHandle::tell()";
+ redef "IO::Seekable::tell()";
}
sub fwrite {
@@ -534,11 +534,11 @@ sub sscanf {
}
sub tmpfile {
- redef "FileHandle::new_tmpfile()";
+ redef "IO::File::new_tmpfile()";
}
sub ungetc {
- redef "FileHandle::ungetc()";
+ redef "IO::Handle::ungetc()";
}
sub vfprintf {
diff --git a/ext/POSIX/POSIX.pod b/ext/POSIX/POSIX.pod
index 2bb8743262..34597d1bd5 100644
--- a/ext/POSIX/POSIX.pod
+++ b/ext/POSIX/POSIX.pod
@@ -155,7 +155,7 @@ This is identical to Perl's builtin C<chown()> function.
=item clearerr
-Use method C<FileHandle::clearerr()> instead.
+Use method C<IO::Handle::clearerr()> instead.
=item clock
@@ -277,7 +277,7 @@ This is identical to Perl's builtin C<abs()> function.
=item fclose
-Use method C<FileHandle::close()> instead.
+Use method C<IO::Handle::close()> instead.
=item fcntl
@@ -285,35 +285,35 @@ This is identical to Perl's builtin C<fcntl()> function.
=item fdopen
-Use method C<FileHandle::new_from_fd()> instead.
+Use method C<IO::Handle::new_from_fd()> instead.
=item feof
-Use method C<FileHandle::eof()> instead.
+Use method C<IO::Handle::eof()> instead.
=item ferror
-Use method C<FileHandle::error()> instead.
+Use method C<IO::Handle::error()> instead.
=item fflush
-Use method C<FileHandle::flush()> instead.
+Use method C<IO::Handle::flush()> instead.
=item fgetc
-Use method C<FileHandle::getc()> instead.
+Use method C<IO::Handle::getc()> instead.
=item fgetpos
-Use method C<FileHandle::getpos()> instead.
+Use method C<IO::Seekable::getpos()> instead.
=item fgets
-Use method C<FileHandle::gets()> instead.
+Use method C<IO::Handle::gets()> instead.
=item fileno
-Use method C<FileHandle::fileno()> instead.
+Use method C<IO::Handle::fileno()> instead.
=item floor
@@ -325,7 +325,7 @@ This is identical to the C function C<fmod()>.
=item fopen
-Use method C<FileHandle::open()> instead.
+Use method C<IO::File::open()> instead.
=item fork
@@ -380,11 +380,11 @@ fscanf() is C-specific--use <> and regular expressions instead.
=item fseek
-Use method C<FileHandle::seek()> instead.
+Use method C<IO::Seekable::seek()> instead.
=item fsetpos
-Use method C<FileHandle::setpos()> instead.
+Use method C<IO::Seekable::setpos()> instead.
=item fstat
@@ -397,7 +397,7 @@ Perl's builtin C<stat> function.
=item ftell
-Use method C<FileHandle::tell()> instead.
+Use method C<IO::Seekable::tell()> instead.
=item fwrite
@@ -1204,7 +1204,7 @@ seconds.
=item tmpfile
-Use method C<FileHandle::new_tmpfile()> instead.
+Use method C<IO::File::new_tmpfile()> instead.
=item tmpnam
@@ -1247,7 +1247,7 @@ Get name of current operating system.
=item ungetc
-Use method C<FileHandle::ungetc()> instead.
+Use method C<IO::Handle::ungetc()> instead.
=item unlink
@@ -1314,9 +1314,10 @@ Creates a new C<POSIX::SigAction> object which corresponds to the C
C<struct sigaction>. This object will be destroyed automatically when it is
no longer needed. The first parameter is the fully-qualified name of a sub
which is a signal-handler. The second parameter is a C<POSIX::SigSet>
-object. The third parameter contains the C<sa_flags>.
+object, it defaults to the empty set. The third parameter contains the
+C<sa_flags>, it defaults to 0.
- $sigset = POSIX::SigSet->new;
+ $sigset = POSIX::SigSet->new(SIGINT, SIGQUIT);
$sigaction = POSIX::SigAction->new( 'main::handler', $sigset, &POSIX::SA_NOCLDSTOP );
This C<POSIX::SigAction> object should be used with the C<POSIX::sigaction()>
diff --git a/global.sym b/global.sym
index 1226991e5a..6ffac19fee 100644
--- a/global.sym
+++ b/global.sym
@@ -158,6 +158,7 @@ pad_reset_pending
padix
padix_floor
patleave
+pidstatus
pow_amg
pow_ass_amg
ppaddr
@@ -253,6 +254,7 @@ vtbl_fm
vtbl_glob
vtbl_isa
vtbl_isaelem
+vtbl_itervar
vtbl_mglob
vtbl_nkeys
vtbl_pack
@@ -324,12 +326,14 @@ cast_ulong
check_uni
checkcomma
ck_aelem
+ck_anoncode
ck_bitop
ck_concat
ck_delete
ck_eof
ck_eval
ck_exec
+ck_exists
ck_ftst
ck_fun
ck_fun_locale
@@ -431,6 +435,7 @@ gp_ref
gv_AVadd
gv_HVadd
gv_IOadd
+gv_autoload
gv_check
gv_efullname
gv_efullname3
@@ -1048,8 +1053,7 @@ sighandler
skipspace
stack_grow
start_subparse
-sublex_done
-sublex_start
+sub_crush_depth
sv_2bool
sv_2cv
sv_2io
diff --git a/gv.c b/gv.c
index 6dd8ad0f3c..89533ff906 100644
--- a/gv.c
+++ b/gv.c
@@ -59,12 +59,16 @@ gv_fetchfile(name)
char *name;
{
char tmpbuf[1200];
+ STRLEN tmplen;
GV *gv;
- sprintf(tmpbuf,"::_<%s", name);
- gv = gv_fetchpv(tmpbuf, TRUE, SVt_PVGV);
+ sprintf(tmpbuf, "_<%s", name);
+ tmplen = strlen(tmpbuf);
+ gv = *(GV**)hv_fetch(defstash, tmpbuf, tmplen, TRUE);
+ if (!isGV(gv))
+ gv_init(gv, defstash, tmpbuf, tmplen, FALSE);
sv_setpv(GvSV(gv), name);
- if (*name == '/' && (instr(name,"/lib/") || instr(name,".pm")))
+ if (*name == '/' && (instr(name, "/lib/") || instr(name, ".pm")))
GvMULTI_on(gv);
if (perldb)
hv_magic(GvHVn(gv_AVadd(gv)), gv, 'L');
@@ -84,9 +88,8 @@ int multi;
sv_upgrade((SV*)gv, SVt_PVGV);
if (SvLEN(gv))
Safefree(SvPVX(gv));
- Newz(602,gp, 1, GP);
+ Newz(602, gp, 1, GP);
GvGP(gv) = gp_ref(gp);
- GvREFCNT(gv) = 1;
GvSV(gv) = NEWSV(72,0);
GvLINE(gv) = curcop->cop_line;
GvFILEGV(gv) = curcop->cop_filegv;
@@ -133,30 +136,28 @@ I32 level;
if (!stash)
return 0;
- if (level > 100)
+ if ((level > 100) || (level < -100))
croak("Recursive inheritance detected");
- gvp = (GV**)hv_fetch(stash, name, len, TRUE);
-
DEBUG_o( deb("Looking for method %s in package %s\n",name,HvNAME(stash)) );
- topgv = *gvp;
- if (SvTYPE(topgv) != SVt_PVGV)
- gv_init(topgv, stash, name, len, TRUE);
-
- if (cv = GvCV(topgv)) {
- if (CvXSUB(cv) || CvROOT(cv) || CvGV(cv)) { /* Not deleted, possibly autoloaded. */
- if (GvCVGEN(topgv) >= sub_generation)
- return topgv; /* valid cached inheritance */
- if (!GvCVGEN(topgv)) { /* not an inheritance cache */
+
+ gvp = (GV**)hv_fetch(stash, name, len, (level >= 0));
+ if (!gvp)
+ topgv = Nullgv;
+ else {
+ topgv = *gvp;
+ if (SvTYPE(topgv) != SVt_PVGV)
+ gv_init(topgv, stash, name, len, TRUE);
+ if (cv = GvCV(topgv)) {
+ /* If genuine method or valid cache entry, use it */
+ if (!GvCVGEN(topgv) || GvCVGEN(topgv) >= sub_generation)
return topgv;
- }
+ /* Stale cached entry: junk it */
+ SvREFCNT_dec(cv);
+ GvCV(topgv) = cv = Nullcv;
+ GvCVGEN(topgv) = 0;
}
- /* stale cached entry, just junk it */
- SvREFCNT_dec(cv);
- GvCV(topgv) = cv = 0;
- GvCVGEN(topgv) = 0;
}
- /* Now cv = 0, and there is no cv in topgv. */
gvp = (GV**)hv_fetch(stash,"ISA",3,FALSE);
if (gvp && (gv = *gvp) != (GV*)&sv_undef && (av = GvAV(gv))) {
@@ -171,22 +172,25 @@ I32 level;
SvPVX(sv), HvNAME(stash));
continue;
}
- gv = gv_fetchmeth(basestash, name, len, level + 1);
- if (gv) {
- GvCV(topgv) = GvCV(gv); /* cache the CV */
- GvCVGEN(topgv) = sub_generation; /* valid for now */
- SvREFCNT_inc(GvCV(gv));
- return gv;
- }
+ gv = gv_fetchmeth(basestash, name, len,
+ (level >= 0) ? level + 1 : level - 1);
+ if (gv)
+ goto gotcha;
}
}
- if (!level) {
+ if (level == 0 || level == -1) {
if (lastchance = gv_stashpvn("UNIVERSAL", 9, FALSE)) {
- if (gv = gv_fetchmeth(lastchance, name, len, level + 1)) {
- GvCV(topgv) = GvCV(gv); /* cache the CV */
- GvCVGEN(topgv) = sub_generation; /* valid for now */
- SvREFCNT_inc(GvCV(gv));
+ if (gv = gv_fetchmeth(lastchance, name, len,
+ (level >= 0) ? level + 1 : level - 1)) {
+ gotcha:
+ /* Use topgv for cache only if it has no synonyms */
+ if (topgv && GvREFCNT(topgv) == 1) {
+ if (cv = GvCV(topgv))
+ SvREFCNT_dec(cv);
+ GvCV(topgv) = (CV*)SvREFCNT_inc(GvCV(gv));
+ GvCVGEN(topgv) = sub_generation;
+ }
return gv;
}
}
@@ -267,21 +271,50 @@ char* name;
}
if (!gv) {
- CV* cv;
-
if (strEQ(name,"import"))
gv = (GV*)&sv_yes;
- else if (strNE(name, "AUTOLOAD")) {
- gv = gv_fetchmeth(stash, "AUTOLOAD", 8, 0);
- if (gv && (cv = GvCV(gv))) { /* One more chance... */
- SV *tmpstr = sv_2mortal(newSVpv(HvNAME(stash),0));
- sv_catpvn(tmpstr,"::", 2);
- sv_catpvn(tmpstr, name, nend - name);
- sv_setsv(GvSV(CvGV(cv)), tmpstr);
- SvTAINTED_off(GvSV(CvGV(cv)));
- }
- }
+ else
+ gv = gv_autoload(stash, name, nend - name);
}
+
+ return gv;
+}
+
+GV*
+gv_autoload(stash, name, len)
+HV* stash;
+char* name;
+STRLEN len;
+{
+ static char autoload[] = "AUTOLOAD";
+ static STRLEN autolen = 8;
+ GV* gv;
+ CV* cv;
+ HV* varstash;
+ GV* vargv;
+ SV* varsv;
+
+ if (len == autolen && strnEQ(name, autoload, autolen))
+ return Nullgv;
+ if (!(gv = gv_fetchmeth(stash, autoload, autolen, 0)))
+ return Nullgv;
+ cv = GvCV(gv);
+
+ /*
+ * Given &FOO::AUTOLOAD, set $FOO::AUTOLOAD to desired function name.
+ * The subroutine's original name may not be "AUTOLOAD", so we don't
+ * use that, but for lack of anything better we will use the sub's
+ * original package to look up $AUTOLOAD.
+ */
+ varstash = GvSTASH(CvGV(cv));
+ vargv = *(GV**)hv_fetch(varstash, autoload, autolen, TRUE);
+ if (!isGV(vargv))
+ gv_init(vargv, varstash, autoload, autolen, FALSE);
+ varsv = GvSV(vargv);
+ sv_setpv(varsv, HvNAME(stash));
+ sv_catpvn(varsv, "::", 2);
+ sv_catpvn(varsv, name, len);
+ SvTAINTED_off(varsv);
return gv;
}
@@ -458,7 +491,7 @@ I32 sv_type;
sv_type == SVt_PVAV ? '@' :
sv_type == SVt_PVHV ? '%' : '$',
name);
- if (GvCV(*gvp))
+ if (GvCVu(*gvp))
warn("(Did you mean &%s instead?)\n", name);
stash = 0;
}
@@ -791,8 +824,19 @@ gp_ref(gp)
GP* gp;
{
gp->gp_refcnt++;
+ if (gp->gp_cv) {
+ if (gp->gp_cvgen) {
+ /* multi-named GPs cannot be used for method cache */
+ SvREFCNT_dec(gp->gp_cv);
+ gp->gp_cv = Nullcv;
+ gp->gp_cvgen = 0;
+ }
+ else {
+ /* Adding a new name to a subroutine invalidates method cache */
+ sub_generation++;
+ }
+ }
return gp;
-
}
void
@@ -808,6 +852,10 @@ GV* gv;
warn("Attempt to free unreferenced glob pointers");
return;
}
+ if (gp->gp_cv) {
+ /* Deleting the name of a subroutine invalidates method cache */
+ sub_generation++;
+ }
if (--gp->gp_refcnt > 0) {
if (gp->gp_egv == gv)
gp->gp_egv = 0;
@@ -818,8 +866,7 @@ GV* gv;
SvREFCNT_dec(gp->gp_av);
SvREFCNT_dec(gp->gp_hv);
SvREFCNT_dec(gp->gp_io);
- if ((cv = gp->gp_cv) && !GvCVGEN(gv))
- SvREFCNT_dec(cv);
+ SvREFCNT_dec(gp->gp_cv);
SvREFCNT_dec(gp->gp_form);
Safefree(gp);
@@ -863,14 +910,14 @@ HV* stash;
CV* cv;
MAGIC* mg=mg_find((SV*)stash,'c');
AMT *amtp=mg ? (AMT*)mg->mg_ptr: NULL;
+ AMT amt;
if (mg && (amtp=((AMT*)(mg->mg_ptr)))->was_ok_am == amagic_generation &&
amtp->was_ok_sub == sub_generation)
- return HV_AMAGIC(stash)? TRUE: FALSE;
- gvp=(GV**)hv_fetch(stash,"OVERLOAD",8,FALSE);
- if (amtp && amtp->table) {
+ return AMT_AMAGIC(amtp);
+ if (amtp && AMT_AMAGIC(amtp)) { /* Have table. */
int i;
- for (i=1;i<NofAMmeth*2;i++) {
+ for (i=1; i<NofAMmeth; i++) {
if (amtp->table[i]) {
SvREFCNT_dec(amtp->table[i]);
}
@@ -880,38 +927,32 @@ HV* stash;
DEBUG_o( deb("Recalcing overload magic in package %s\n",HvNAME(stash)) );
+ amt.was_ok_am = amagic_generation;
+ amt.was_ok_sub = sub_generation;
+ amt.fallback = AMGfallNO;
+ amt.flags = 0;
+
+#ifdef OVERLOAD_VIA_HASH
+ gvp=(GV**)hv_fetch(stash,"OVERLOAD",8,FALSE); /* A shortcut */
if (gvp && ((gv = *gvp) != (GV*)&sv_undef && (hv = GvHV(gv)))) {
int filled=0;
int i;
char *cp;
- AMT amt;
SV* sv;
SV** svp;
- GV** gvp;
-
-/* if (*(svp)==(SV*)amagic_generation && *(svp+1)==(SV*)sub_generation) {
- DEBUG_o( deb("Overload magic in package %s up-to-date\n",HvNAME(stash))
-);
- return HV_AMAGIC(stash)? TRUE: FALSE;
- }*/
-
- amt.was_ok_am=amagic_generation;
- amt.was_ok_sub=sub_generation;
- amt.fallback=AMGfallNO;
/* Work with "fallback" key, which we assume to be first in AMG_names */
- if ((cp=((char**)(*AMG_names))[0]) &&
- (svp=(SV**)hv_fetch(hv,cp,strlen(cp),FALSE)) && (sv = *svp)) {
+ if (( cp = (char *)AMG_names[0] ) &&
+ (svp = (SV**)hv_fetch(hv,cp,strlen(cp),FALSE)) && (sv = *svp)) {
if (SvTRUE(sv)) amt.fallback=AMGfallYES;
else if (SvOK(sv)) amt.fallback=AMGfallNEVER;
}
-
- for (i=1;i<NofAMmeth*2;i++) {
- cv=0;
-
- if ( (cp=((char**)(*AMG_names))[i]) ) {
- svp=(SV**)hv_fetch(hv,cp,strlen(cp),FALSE);
+ for (i = 1; i < NofAMmeth; i++) {
+ cv = 0;
+ cp = (char *)AMG_names[i];
+
+ svp = (SV**)hv_fetch(hv, cp, strlen(cp), FALSE);
if (svp && ((sv = *svp) != &sv_undef)) {
switch (SvTYPE(sv)) {
default:
@@ -927,35 +968,97 @@ HV* stash;
/* FALL THROUGH */
case SVt_PVHV:
case SVt_PVAV:
- die("Not a subroutine reference in overload table");
+ croak("Not a subroutine reference in overload table");
return FALSE;
case SVt_PVCV:
- cv = (CV*)sv;
- break;
+ cv = (CV*)sv;
+ break;
case SVt_PVGV:
- if (!(cv = GvCV((GV*)sv)))
- cv = sv_2cv(sv, &stash, &gv, TRUE);
- break;
+ if (!(cv = GvCVu((GV*)sv)))
+ cv = sv_2cv(sv, &stash, &gv, TRUE);
+ break;
}
if (cv) filled=1;
else {
- die("Method for operation %s not found in package %.256s during blessing\n",
+ croak("Method for operation %s not found in package %.256s during blessing\n",
cp,HvNAME(stash));
return FALSE;
}
}
- }
- amt.table[i]=(CV*)SvREFCNT_inc(cv);
+#else
+ {
+ int filled = 0;
+ int i;
+ char *cp;
+ SV* sv = NULL;
+ SV** svp;
+
+ /* Work with "fallback" key, which we assume to be first in AMG_names */
+
+ if ( cp = (char *)AMG_names[0] ) {
+ /* Try to find via inheritance. */
+ gv = gv_fetchmeth(stash, "()", 2, 0); /* A cooky: "()". */
+ if (gv) sv = GvSV(gv);
+
+ if (!sv) /* Empty */;
+ else if (SvTRUE(sv)) amt.fallback=AMGfallYES;
+ else if (SvOK(sv)) amt.fallback=AMGfallNEVER;
+ }
+
+ for (i = 1; i < NofAMmeth; i++) {
+ cv = 0;
+ cp = (char *)AMG_names[i];
+
+ *buf = '('; /* A cooky: "(". */
+ strcpy(buf + 1, cp);
+ DEBUG_o( deb("Checking overloading of `%s' in package `%.256s'\n",
+ cp, HvNAME(stash)) );
+ gv = gv_fetchmeth(stash, buf, strlen(buf), -1); /* no filling stash! */
+ if(gv && (cv = GvCV(gv))) {
+ char *name = buf;
+ if (GvNAMELEN(CvGV(cv)) == 3 && strEQ(GvNAME(CvGV(cv)), "nil")
+ && strEQ(HvNAME(GvSTASH(CvGV(cv))), "overload")) {
+ /* GvSV contains the name of the method. */
+ GV *ngv;
+
+ DEBUG_o( deb("Resolving method `%.256s' for overloaded `%s' in package `%.256s'\n",
+ SvPV(GvSV(gv), na), cp, HvNAME(stash)) );
+ if (SvPOK(GvSV(gv))
+ && (ngv = gv_fetchmethod(stash, SvPVX(GvSV(gv))))) {
+ name = SvPVX(GvSV(gv));
+ cv = GvCV(gv = ngv);
+ } else {
+ /* Can be an import stub (created by `can'). */
+ if (GvCVGEN(gv)) {
+ croak("Stub found while resolving method `%.256s' overloading `%s' in package `%.256s'",
+ (SvPOK(GvSV(gv)) ? SvPVX(GvSV(gv)) : "???" ),
+ cp, HvNAME(stash));
+ } else
+ croak("Cannot resolve method `%.256s' overloading `%s' in package `%.256s'",
+ (SvPOK(GvSV(gv)) ? SvPVX(GvSV(gv)) : "???" ),
+ cp, HvNAME(stash));
+ }
+ /* If the sub is only a stub then we may have a gv to AUTOLOAD */
+ gv = (GV*)*hv_fetch(GvSTASH(gv), name, strlen(name), TRUE);
+ cv = GvCV(gv);
+ }
+ DEBUG_o( deb("Overloading `%s' in package `%.256s' via `%.256s::%.256s' \n",
+ cp, HvNAME(stash), HvNAME(GvSTASH(CvGV(cv))),
+ GvNAME(CvGV(cv))) );
+ filled = 1;
+ }
+#endif
+ amt.table[i]=(CV*)SvREFCNT_inc(cv);
}
- sv_magic((SV*)stash, 0, 'c', (char*)&amt, sizeof(amt));
if (filled) {
-/* HV_badAMAGIC_off(stash);*/
- HV_AMAGIC_on(stash);
+ AMT_AMAGIC_on(&amt);
+ sv_magic((SV*)stash, 0, 'c', (char*)&amt, sizeof(AMT));
return TRUE;
}
}
-/*HV_badAMAGIC_off(stash);*/
- HV_AMAGIC_off(stash);
+ /* Here we have no table: */
+ AMT_AMAGIC_off(&amt);
+ sv_magic((SV*)stash, 0, 'c', (char*)&amt, sizeof(AMTS));
return FALSE;
}
@@ -978,7 +1081,9 @@ int flags;
HV* stash;
if (!(AMGf_noleft & flags) && SvAMAGIC(left)
&& (mg = mg_find((SV*)(stash=SvSTASH(SvRV(left))),'c'))
- && (ocvp = cvp = ((oamtp=amtp=(AMT*)mg->mg_ptr)->table))
+ && (ocvp = cvp = (AMT_AMAGIC((AMT*)mg->mg_ptr)
+ ? (oamtp = amtp = (AMT*)mg->mg_ptr)->table
+ : NULL))
&& ((cv = cvp[off=method+assignshift])
|| (assign && amtp->fallback > AMGfallNEVER && /* fallback to
* usual method */
@@ -1071,7 +1176,9 @@ int flags;
if (!cv) goto not_found;
} else if (!(AMGf_noright & flags) && SvAMAGIC(right)
&& (mg = mg_find((SV*)(stash=SvSTASH(SvRV(right))),'c'))
- && (cvp = ((amtp=(AMT*)mg->mg_ptr)->table))
+ && (cvp = (AMT_AMAGIC((AMT*)mg->mg_ptr)
+ ? (amtp = (AMT*)mg->mg_ptr)->table
+ : NULL))
&& (cv = cvp[off=method])) { /* Method for right
* argument found */
lr=1;
@@ -1108,7 +1215,7 @@ int flags;
goto not_found;
}
} else {
- not_found: /* No method found, either report or die */
+ not_found: /* No method found, either report or croak */
if (ocvp && (cv=ocvp[nomethod_amg])) { /* Call report method */
notfound = 1; lr = -1;
} else if (cvp && (cv=cvp[nomethod_amg])) {
@@ -1116,7 +1223,7 @@ int flags;
} else {
if (off==-1) off=method;
sprintf(buf, "Operation `%s': no method found,\n\tleft argument %s%.256s,\n\tright argument %s%.256s",
- ((char**)AMG_names)[method + assignshift],
+ AMG_names[method + assignshift],
SvAMAGIC(left)?
"in overloaded package ":
"has no overloaded magic",
@@ -1132,7 +1239,7 @@ int flags;
if (amtp && amtp->fallback >= AMGfallYES) {
DEBUG_o( deb(buf) );
} else {
- die(buf);
+ croak(buf);
}
return NULL;
}
@@ -1140,11 +1247,11 @@ int flags;
}
if (!notfound) {
DEBUG_o( deb("Overloaded operator `%s'%s%s%s:\n\tmethod%s found%s in package %.256s%s\n",
- ((char**)AMG_names)[off],
+ AMG_names[off],
method+assignshift==off? "" :
" (initially `",
method+assignshift==off? "" :
- ((char**)AMG_names)[method+assignshift],
+ AMG_names[method+assignshift],
method+assignshift==off? "" : "')",
flags & AMGf_unary? "" :
lr==1 ? " for right argument": " for left argument",
@@ -1182,7 +1289,7 @@ int flags;
PUSHs(lr>0? left: right);
PUSHs( assign ? &sv_undef : (lr>0? &sv_yes: &sv_no));
if (notfound) {
- PUSHs( sv_2mortal(newSVpv(((char**)AMG_names)[method + assignshift],0)) );
+ PUSHs( sv_2mortal(newSVpv((char *)AMG_names[method + assignshift],0)) );
}
PUSHs((SV*)cv);
PUTBACK;
@@ -1225,12 +1332,12 @@ int flags;
case dec_amg:
SvSetSV(left,res); return left;
case not_amg:
-ans=!SvOK(res); break;
+ ans=!SvOK(res); break;
}
return ans? &sv_yes: &sv_no;
} else if (method==copy_amg) {
if (!SvROK(res)) {
- die("Copy method did not return a reference");
+ croak("Copy method did not return a reference");
}
return SvREFCNT_inc(SvRV(res));
} else {
diff --git a/gv.h b/gv.h
index 3e81cba2c8..2def7c49a4 100644
--- a/gv.h
+++ b/gv.h
@@ -42,7 +42,9 @@ struct gp {
#define GvFORM(gv) (GvGP(gv)->gp_form)
#define GvAV(gv) (GvGP(gv)->gp_av)
-#define GvREFCNT_inc(gv) ((GV*)SvREFCNT_inc(gv))
+
+/* This macro is deprecated. Do not use! */
+#define GvREFCNT_inc(gv) ((GV*)SvREFCNT_inc(gv)) /* DO NOT USE */
#ifdef MICROPORT /* Microport 2.4 hack */
AV *GvAVn();
@@ -63,6 +65,7 @@ HV *GvHVn();
#define GvCV(gv) (GvGP(gv)->gp_cv)
#define GvCVGEN(gv) (GvGP(gv)->gp_cvgen)
+#define GvCVu(gv) (GvGP(gv)->gp_cvgen ? Nullcv : GvGP(gv)->gp_cv)
#define GvLASTEXPR(gv) (GvGP(gv)->gp_lastexpr)
diff --git a/hints/aux.sh b/hints/aux_3.sh
index e0aec237bc..aa3150afbe 100644
--- a/hints/aux.sh
+++ b/hints/aux_3.sh
@@ -1,9 +1,10 @@
-# hints/aux.sh
+# hints/aux_3.sh
#
# Improved by Jake Hamby <jehamby@lightside.com> to support both Apple CC
# and GNU CC. Tested on A/UX 3.1.1 with GCC 2.6.3.
+# Now notifies of problem with version of dbm shipped with A/UX
# Last modified
-# Fri May 5 10:59:43 EDT 1995
+# Sun Jan 5 11:16:41 WET 1997
case "$cc" in
*gcc*) optimize='-O2'
@@ -18,3 +19,4 @@ case "$cc" in
echo "./Configure -Dcc=gcc"
;;
esac
+test -r ./broken-db.msg && . ./broken-db.msg
diff --git a/hints/broken-db.msg b/hints/broken-db.msg
new file mode 100644
index 0000000000..92ba0776bf
--- /dev/null
+++ b/hints/broken-db.msg
@@ -0,0 +1,14 @@
+# Several OSs come with an old version of the DB library which fails
+# on a few of the db-recno.t tests. This file is sourced by the hints
+# files for those OSs.
+
+cat <<EOF >&4
+
+Unless you've upgraded your DB library manually you will see failures in
+db-recno tests 51, 53 and 55. The behavior these tests are checking is
+broken in the DB library which is included with the OS. You can ignore
+the errors if you're never going to use the broken functionality (recno
+databases with a modified bval), otherwise you'll have to upgrade your
+DB library or OS.
+
+EOF
diff --git a/hints/dec_osf.sh b/hints/dec_osf.sh
index bfd235faaf..a85abff18c 100644
--- a/hints/dec_osf.sh
+++ b/hints/dec_osf.sh
@@ -7,5 +7,12 @@ case "$optimize" in
esac
;;
esac
+
ccflags="$ccflags -DSTANDARD_C"
-lddlflags='-shared -expect_unresolved "*" -s -hidden'
+
+# Check if it's a CMW version of OSF1
+if test `uname -s` = "MLS+"; then
+ lddlflags='-shared -expect_unresolved "*" -s'
+else
+ lddlflags='-shared -expect_unresolved "*" -s -hidden'
+fi
diff --git a/hints/freebsd.sh b/hints/freebsd.sh
index 99ceaa3201..4d2ba22b10 100644
--- a/hints/freebsd.sh
+++ b/hints/freebsd.sh
@@ -64,16 +64,7 @@ case "$osvers" in
d_setreuid='define'
d_setegid='undef'
d_seteuid='undef'
- cat <<EOF
-
-Unless you've upgraded your DB library manually you will see failures in
-db-recno tests 51, 53 and 55. The behavior these tests are checking is
-broken in the DB library which is included with the OS. You can ignore
-the errors if you're never going to use the broken functionality (recno
-databases with a modified bval), otherwise you'll have to upgrade your
-DB library or OS.
-
-EOF
+ test -r ./broken-db.msg && . ./broken-db.msg
;;
#
# 2.2 and above have phkmalloc(3).
diff --git a/hints/hpux.sh b/hints/hpux.sh
index 3ac43ffc5b..b103cf5bd3 100644
--- a/hints/hpux.sh
+++ b/hints/hpux.sh
@@ -3,12 +3,13 @@
# This file is based on
# hints/hpux_9.sh, Perl Configure hints file for Hewlett Packard HP-UX 9.x
# Use Configure -Dcc=gcc to use gcc.
-# From: Jeff Okamoto <okamoto@hpcc123.corp.hp.com>
+# From: Jeff Okamoto <okamoto@corp.hp.com>
# and
# hints/hpux_10.sh, Perl Configure hints file for Hewlett Packard HP-UX 10.x
# From: Giles Lean <giles@nemeton.com.au>
-# This version: December 4, 1996
+# This version: December 27, 1996
+# Current maintainer: Jeff Okamoto <okamoto@corp.hp.com>
# Use Configure -Dcc=gcc to use gcc.
# Use Configure -Dprefix=/usr/local to install in /usr/local.
@@ -51,8 +52,9 @@ xxuname=`uname -r`
if echo $xxuname | $contains '10'
then
# This system is running 10.0
- xxcpu=`printf %#x \`getconf CPU_VERSION\``
- xxcontext=`grep "$xxcpu" /usr/include/sys/unistd.h`
+ xxcpu1=`getconf CPU_VERSION`
+ xxcpu2=`printf %#x ${xxcpu1}`
+ xxcontext=`grep "$xxcpu2" /usr/include/sys/unistd.h`
if echo "$xxcontext" | $contains 'PA-RISC1.1'
then
archname='PA-RISC1.1'
@@ -109,7 +111,7 @@ ccdlflags="-Wl,-E -Wl,-B,deferred $ccdlflags"
usemymalloc='y'
alignbytes=8
-selecttype='int *'
+selecttype='int *'
# If your compile complains about FLT_MIN, uncomment the next line
# POSIX_cflags='ccflags="$ccflags -DFLT_MIN=1.17549435E-38"'
@@ -117,7 +119,7 @@ selecttype='int *'
# Comment this out if you don't want to follow the SVR4 filesystem layout
# that HP-UX 10.0 uses
case "$prefix" in
-'') prefix='/opt/perl5' ;;
+'') prefix='/opt/perl5.003' ;;
esac
# Date: Fri, 6 Sep 96 23:15:31 CDT
diff --git a/hints/irix_6_3.sh b/hints/irix_6_3.sh
new file mode 100644
index 0000000000..11bd82ac38
--- /dev/null
+++ b/hints/irix_6_3.sh
@@ -0,0 +1,16 @@
+# hints/irix_6_3.sh
+#
+# Created by John Stoffel (jfs@fluent.com), 01/13/1997
+# Based on the Irix 6.2 hints file, but simplified.
+
+# Configure can't parse 'nm' output on Irix 6.3
+usenm='n'
+
+# This keeps optimizer warnings quiet.
+ccflags="$ccflags -Olimit 3000"
+
+# Gets rid of some extra libs that don't seem to be really needed.
+# See the Irix 6.2 hints file for some justifications.
+set `echo X "$libswanted "|sed -e 's/ sun / /' -e 's/ crypt / /' -e 's/ bsd / /' -e 's/ PW / /' -e 's/ dl / /' -e 's/ socket / /' -e 's/ nsl / /'`
+shift
+libswanted="$*"
diff --git a/hints/irix_6_4.sh b/hints/irix_6_4.sh
new file mode 100644
index 0000000000..b5a994525a
--- /dev/null
+++ b/hints/irix_6_4.sh
@@ -0,0 +1,16 @@
+# hints/irix_6_4.sh
+#
+# Created by John Stoffel (jfs@fluent.com), 01/13/1997
+# Based on the Irix 6.2 hints file, but simplified.
+
+# Configure can't parse 'nm' output on Irix 6.4
+usenm='n'
+
+# This keeps optimizer warnings quiet.
+ccflags="$ccflags -Olimit 3000"
+
+# Gets rid of some extra libs that don't seem to be really needed.
+# See the Irix 6.2 hints file for some justifications.
+set `echo X "$libswanted "|sed -e 's/ sun / /' -e 's/ crypt / /' -e 's/ bsd / /' -e 's/ PW / /' -e 's/ dl / /' -e 's/ socket / /' -e 's/ nsl / /'`
+shift
+libswanted="$*"
diff --git a/hints/machten.sh b/hints/machten.sh
index f6f75d6616..55feadcfb7 100644
--- a/hints/machten.sh
+++ b/hints/machten.sh
@@ -1,5 +1,5 @@
# machten.sh
-# This is for MachTen 4.0.2. It might work on other versions too.
+# This is for MachTen 4.0.3. It might work on other versions too.
#
# MachTen users might need a fixed tr from ftp.tenon.com. This should
# be described in the MachTen release notes.
@@ -13,6 +13,9 @@
# Martijn Koster <m.koster@webcrawler.com>
# Richard Yeh <rcyeh@cco.caltech.edu>
#
+# Reinstate sigsetjmp iff version is 4.0.3 or greater; use nm
+# (assumes Configure change); prune libswanted -- Dominic Dunlop 970113
+# Warn about test failure due to old Berkeley db -- Dominic Dunlop 970105
# Do not use perl's malloc; SysV IPC OK -- Neil Cutcliffe, Tenon 961030
# File::Find's use of link count disabled by Dominic Dunlop 960528
# Perl's use of sigsetjmp etc. disabled by Dominic Dunlop 960521
@@ -23,16 +26,15 @@
# know how to use it yet.
#
# Updated by Dominic Dunlop <domo@tcp.ip.lu>
-# Wed Nov 13 11:47:09 WET 1996
-
+# Tue Jan 14 10:17:18 WET 1997
# Power MachTen is a real memory system and its standard malloc
# has been optimized for this. Using this malloc instead of Perl's
# malloc may result in significant memory savings.
usemymalloc='false'
-# Configure doesn't know how to parse the nm output.
-usenm=undef
+# Make symbol table listings les voluminous
+nmopts=-gp
# Install in /usr/local by default
prefix='/usr/local'
@@ -42,9 +44,19 @@ prefix='/usr/local'
# determine this automatically.
alignbytes=8
-# There appears to be a problem with perl's use of sigsetjmp and
+# 4.0.2 and earlier had a problem with perl's use of sigsetjmp and
# friends. Use setjmp and friends instead.
-d_sigsetjmp='undef'
+expr "$osvers" \< "4.0.3" > /dev/null && d_sigsetjmp='undef'
+
+# Get rid of some extra libs which it takes Configure a tediously
+# long time never to find on MachTen
+set `echo X "$libswanted "|sed -e 's/ net / /' -e 's/ socket / /' \
+ -e 's/ inet / /' -e 's/ nsl / /' -e 's/ nm / /' -e 's/ malloc / /' \
+ -e 's/ ld / /' -e 's/ sun / /' -e 's/ posix / /' \
+ -e 's/ cposix / /' -e 's/ crypt / /' \
+ -e 's/ ucb / /' -e 's/ bsd / /' -e 's/ BSD / /' -e 's/ PW / /'`
+shift
+libswanted="$*"
# MachTen always reports ony two links to directories, even if they
# contain subdirectories. Consequently, we use this variable to stop
@@ -66,7 +78,8 @@ At the end of Configure, you will see a harmless message
Hmm...You had some extra variables I don't know about...I'll try to keep 'em.
Propagating recommended variable dont_use_nlink
-
-Read the File::Find documentation for more information.
+ Propagating recommended variable nmopts
+Read the File::Find documentation for more information about dont_use_nlink
EOM
+test -r ./broken-db.msg && . ./broken-db.msg
diff --git a/hints/os2.sh b/hints/os2.sh
index 59087e3888..9bce2a594c 100644
--- a/hints/os2.sh
+++ b/hints/os2.sh
@@ -129,7 +129,9 @@ fi
# [Maybe we should just remove c from $libswanted ?]
-libs='-lsocket -lm'
+# Test would pick up wrong rand, so we hardwire the value for random()
+libs='-lsocket -lm -lbsd'
+randbits=31
archobjs="os2$obj_ext dl_os2$obj_ext"
# Run files without extension with sh:
diff --git a/hints/ultrix_4.sh b/hints/ultrix_4.sh
index 76b0768f8d..826cb34c19 100644
--- a/hints/ultrix_4.sh
+++ b/hints/ultrix_4.sh
@@ -50,4 +50,7 @@ case "$osvers" in
*) ranlib='ranlib' ;;
esac
+# Settings that don't depend on $osvers:
+
+util_cflags='ccflags="$ccflags -DLOCALE_ENVIRON_REQUIRED"'
groupstype='int'
diff --git a/hv.c b/hv.c
index 3208b56651..71009c9e20 100644
--- a/hv.c
+++ b/hv.c
@@ -423,7 +423,7 @@ I32 flags;
if (entry == xhv->xhv_eiter)
HvLAZYDEL_on(hv);
else
- he_free(entry, HvSHAREKEYS(hv));
+ he_free(hv, entry);
--xhv->xhv_keys;
return sv;
}
@@ -485,7 +485,7 @@ U32 hash;
if (entry == xhv->xhv_eiter)
HvLAZYDEL_on(hv);
else
- he_free(entry, HvSHAREKEYS(hv));
+ he_free(hv, entry);
--xhv->xhv_keys;
return sv;
}
@@ -746,19 +746,20 @@ newHV()
}
void
-he_free(hent, shared)
+he_free(hv, hent)
+HV *hv;
register HE *hent;
-I32 shared;
{
if (!hent)
return;
- if (SvTYPE(HeVAL(hent)) == SVt_PVGV && GvCV(HeVAL(hent)))
- sub_generation++; /* May be deletion of method? */
+ if (isGV(HeVAL(hent)) && GvCVu(HeVAL(hent)) && HvNAME(hv))
+ sub_generation++; /* may be deletion of method from stash */
SvREFCNT_dec(HeVAL(hent));
if (HeKLEN(hent) == HEf_SVKEY) {
SvREFCNT_dec(HeKEY_sv(hent));
Safefree(HeKEY_hek(hent));
- } else if (shared)
+ }
+ else if (HvSHAREKEYS(hv))
unshare_hek(HeKEY_hek(hent));
else
Safefree(HeKEY_hek(hent));
@@ -766,17 +767,20 @@ I32 shared;
}
void
-he_delayfree(hent, shared)
+he_delayfree(hv, hent)
+HV *hv;
register HE *hent;
-I32 shared;
{
if (!hent)
return;
+ if (isGV(HeVAL(hent)) && GvCVu(HeVAL(hent)) && HvNAME(hv))
+ sub_generation++; /* may be deletion of method from stash */
sv_2mortal(HeVAL(hent)); /* free between statements */
if (HeKLEN(hent) == HEf_SVKEY) {
sv_2mortal(HeKEY_sv(hent));
Safefree(HeKEY_hek(hent));
- } else if (shared)
+ }
+ else if (HvSHAREKEYS(hv))
unshare_hek(HeKEY_hek(hent));
else
Safefree(HeKEY_hek(hent));
@@ -810,7 +814,6 @@ HV *hv;
register HE *ohent = Null(HE*);
I32 riter;
I32 max;
- I32 shared;
if (!hv)
return;
@@ -821,12 +824,11 @@ HV *hv;
max = HvMAX(hv);
array = HvARRAY(hv);
hent = array[0];
- shared = HvSHAREKEYS(hv);
for (;;) {
if (hent) {
ohent = hent;
hent = HeNEXT(hent);
- he_free(ohent, shared);
+ he_free(hv, ohent);
}
if (!hent) {
if (++riter > max)
@@ -871,7 +873,7 @@ HV *hv;
#endif
if (entry && HvLAZYDEL(hv)) { /* was deleted earlier? */
HvLAZYDEL_off(hv);
- he_free(entry, HvSHAREKEYS(hv));
+ he_free(hv, entry);
}
xhv->xhv_riter = -1;
xhv->xhv_eiter = Null(HE*);
@@ -938,7 +940,7 @@ HV *hv;
if (oldentry && HvLAZYDEL(hv)) { /* was deleted earlier? */
HvLAZYDEL_off(hv);
- he_free(oldentry, HvSHAREKEYS(hv));
+ he_free(hv, oldentry);
}
xhv->xhv_eiter = entry;
diff --git a/installperl b/installperl
index c9913caee8..05f77f6a42 100755
--- a/installperl
+++ b/installperl
@@ -160,8 +160,11 @@ push(@corefiles,'perl.exp') if $^O eq 'aix';
# If they have built sperl.o...
push(@corefiles,'sperl.o') if -f 'sperl.o';
foreach $file (@corefiles) {
- cp_if_diff($file,"$installarchlib/CORE/$file");
- &chmod($file =~ /^libperl/ ? 0555 : 0444,"$installarchlib/CORE/$file");
+ # HP-UX (at least) needs to maintain execute permissions
+ # on dynamically-loaded libraries.
+ cp_if_diff($file,"$installarchlib/CORE/$file")
+ and &chmod($file =~ /^\.(so|$dlext)$/ ? 0555 : 0444,
+ "$installarchlib/CORE/$file");
}
# Offer to install perl in a "standard" location
@@ -364,15 +367,11 @@ sub installlib {
if (compare($_, "$installlib/$name") || $nonono) {
&unlink("$installlib/$name");
mkpath("$installlib/$dir", 1, 0777);
- cp_if_diff($_, "$installlib/$name");
# HP-UX (at least) needs to maintain execute permissions
# on dynamically-loaded libraries.
- if ($name =~ /\.(so|$dlext)$/o) {
- &chmod(0555, "$installlib/$name");
- }
- else {
- &chmod(0444, "$installlib/$name");
- }
+ cp_if_diff($_, "$installlib/$name")
+ and &chmod($name =~ /\.(so|$dlext)$/o ? 0555 : 0444,
+ "$installlib/$name");
}
} elsif (-d $_) {
mkpath("$installlib/$name", 1, 0777);
@@ -387,6 +386,7 @@ sub installlib {
# and then try to link against the installed libperl.a, you might
# get an error message to the effect that the symbol table is older
# than the library.
+# Return true if copying occurred.
sub cp_if_diff {
my($from,$to)=@_;
-f $from || die "$0: $from not found";
@@ -402,5 +402,6 @@ sub cp_if_diff {
($atime, $mtime) = (stat $from)[8,9];
utime $atime, $mtime, $to;
}
+ 1;
}
}
diff --git a/interp.sym b/interp.sym
index 55b53389af..ea4241ac25 100644
--- a/interp.sym
+++ b/interp.sym
@@ -106,7 +106,6 @@ parsehook
patchlevel
perldb
perl_destruct_level
-pidstatus
preambled
preambleav
preprocess
diff --git a/lib/AutoSplit.pm b/lib/AutoSplit.pm
index d9bd17a7f7..c1ff13a70c 100644
--- a/lib/AutoSplit.pm
+++ b/lib/AutoSplit.pm
@@ -248,14 +248,17 @@ sub autosplit_file{
open(OUT,">/dev/null") || open(OUT,">nla0:"); # avoid 'not opened' warning
my(@subnames, %proto);
+ my @cache = ();
+ my $caching = 1;
while (<IN>) {
+ next if /^=\w/ .. /^=cut/;
if (/^package ([\w:]+)\s*;/) {
warn "package $1; in AutoSplit section ignored. Not currently supported.";
}
if (/^sub\s+([\w:]+)(\s*\(.*?\))?/) {
print OUT "1;\n";
my $subname = $1;
- $proto{$1} = $2 or '';
+ $proto{$1} = $2 || '';
if ($subname =~ m/::/){
warn "subs with package names not currently supported in AutoSplit section";
}
@@ -275,10 +278,26 @@ sub autosplit_file{
print OUT "# NOTE: Derived from $filename. ",
"Changes made here will be lost.\n";
print OUT "package $package;\n\n";
+ print OUT @cache;
+ @cache = ();
+ $caching = 0;
+ }
+ if($caching) {
+ push(@cache, $_) if @cache || /\S/;
+ }
+ else {
+ print OUT $_;
+ }
+ if(/^}/) {
+ if($caching) {
+ print OUT @cache;
+ @cache = ();
+ }
+ print OUT "\n";
+ $caching = 1;
}
- print OUT $_;
}
- print OUT "1;\n";
+ print OUT @cache,"1;\n";
close(OUT);
close(IN);
diff --git a/lib/Carp.pm b/lib/Carp.pm
index 1a1b79ea3f..de586489ba 100644
--- a/lib/Carp.pm
+++ b/lib/Carp.pm
@@ -67,6 +67,7 @@ sub longmess {
$a[$#a] = "...";
}
for (@a) {
+ $_ = "undef", next unless defined $_;
s/'/\\'/g;
substr($_,$MaxArgLen) = '...' if $MaxArgLen and $MaxArgLen < length;
s/([^\0]*)/'$1'/ unless /^-?[\d.]+$/;
diff --git a/lib/Class/Template.pm b/lib/Class/Template.pm
index 311c72ae5e..23a0d5ba83 100644
--- a/lib/Class/Template.pm
+++ b/lib/Class/Template.pm
@@ -84,7 +84,7 @@ This module uses perl5 classes to create nested data types.
}
=head1 NOTES
-
+
Use '%' if the member should point to an anonymous hash. Use '@' if the
member should point to an anonymous array.
diff --git a/lib/Cwd.pm b/lib/Cwd.pm
index d7a4875574..e93cf1a0a9 100644
--- a/lib/Cwd.pm
+++ b/lib/Cwd.pm
@@ -244,36 +244,35 @@ sub _msdos_cwd {
return $ENV{'PWD'};
}
-my($oldw) = $^W;
-$^W = 0; # assignments trigger 'subroutine redefined' warning
-if ($^O eq 'VMS') {
-
- *cwd = \&_vms_cwd;
- *getcwd = \&_vms_cwd;
- *fastcwd = \&_vms_cwd;
- *fastgetcwd = \&_vms_cwd;
-}
-elsif ($^O eq 'NT' or $^O eq 'MSWin32') {
+{
+ local $^W = 0; # assignments trigger 'subroutine redefined' warning
- # We assume that &_NT_cwd is defined as an XSUB or in the core.
- *getcwd = \&_NT_cwd;
- *fastcwd = \&_NT_cwd;
- *fastgetcwd = \&_NT_cwd;
-}
-elsif ($^O eq 'os2') {
- # sys_cwd may keep the builtin command
- *cwd = defined &sys_cwd ? \&sys_cwd : \&_os2_cwd;
- *getcwd = defined &sys_cwd ? \&sys_cwd : \&_os2_cwd;
- *fastgetcwd = defined &sys_cwd ? \&sys_cwd : \&_os2_cwd;
- *fastcwd = defined &sys_cwd ? \&sys_cwd : \&_os2_cwd;
-}
-elsif ($^O eq 'msdos') {
- *cwd = \&_msdos_cwd;
- *getcwd = \&_msdos_cwd;
- *fastgetcwd = \&_msdos_cwd;
- *fastcwd = \&_msdos_cwd;
+ if ($^O eq 'VMS') {
+ *cwd = \&_vms_cwd;
+ *getcwd = \&_vms_cwd;
+ *fastcwd = \&_vms_cwd;
+ *fastgetcwd = \&_vms_cwd;
+ }
+ elsif ($^O eq 'NT' or $^O eq 'MSWin32') {
+ # We assume that &_NT_cwd is defined as an XSUB or in the core.
+ *getcwd = \&_NT_cwd;
+ *fastcwd = \&_NT_cwd;
+ *fastgetcwd = \&_NT_cwd;
+ }
+ elsif ($^O eq 'os2') {
+ # sys_cwd may keep the builtin command
+ *cwd = defined &sys_cwd ? \&sys_cwd : \&_os2_cwd;
+ *getcwd = defined &sys_cwd ? \&sys_cwd : \&_os2_cwd;
+ *fastgetcwd = defined &sys_cwd ? \&sys_cwd : \&_os2_cwd;
+ *fastcwd = defined &sys_cwd ? \&sys_cwd : \&_os2_cwd;
+ }
+ elsif ($^O eq 'msdos') {
+ *cwd = \&_msdos_cwd;
+ *getcwd = \&_msdos_cwd;
+ *fastgetcwd = \&_msdos_cwd;
+ *fastcwd = \&_msdos_cwd;
+ }
}
-$^W = $oldw;
# package main; eval join('',<DATA>) || die $@; # quick test
diff --git a/lib/Devel/SelfStubber.pm b/lib/Devel/SelfStubber.pm
index 7bb38f6957..4c2d039580 100644
--- a/lib/Devel/SelfStubber.pm
+++ b/lib/Devel/SelfStubber.pm
@@ -35,7 +35,7 @@ sub stub {
$fh = "${module}::DATA";
open($fh,$mod_file) || die "Unable to open $mod_file";
- while($line = <$fh> and $line !~ m/^__DATA__/) {
+ while(defined ($line = <$fh>) and $line !~ m/^__DATA__/) {
push(@BEFORE_DATA,$line);
$line =~ /use\s+SelfLoader/ && $found_selfloader++;
}
@@ -45,7 +45,7 @@ sub stub {
$self->_load_stubs($module);
if ( fileno($fh) ) {
$end = 1;
- while($line = <$fh>) {
+ while(defined($line = <$fh>)) {
push(@AFTER_DATA,$line);
}
}
diff --git a/lib/Env.pm b/lib/Env.pm
index 63beb07508..1f06bebf24 100644
--- a/lib/Env.pm
+++ b/lib/Env.pm
@@ -47,7 +47,11 @@ sub import {
my ($callpack) = caller(0);
my $pack = shift;
my @vars = @_ ? @_ : keys(%ENV);
+ return unless @vars;
+ eval "package $callpack; use vars qw("
+ . join(' ', map { '$'.$_ } @vars) . ")";
+ die $@ if $@;
foreach (@vars) {
tie ${"${callpack}::$_"}, Env, $_ if /^[A-Za-z_]\w*$/;
}
diff --git a/lib/ExtUtils/Embed.pm b/lib/ExtUtils/Embed.pm
index fb2664c86f..c663d64dd7 100644
--- a/lib/ExtUtils/Embed.pm
+++ b/lib/ExtUtils/Embed.pm
@@ -265,7 +265,7 @@ functions while building your application.
=head1 @EXPORT
ExtUtils::Embed exports the following functions:
-
+
xsinit(), ldopts(), ccopts(), perl_inc(), ccflags(),
ccdlflags(), xsi_header(), xsi_protos(), xsi_body()
@@ -301,7 +301,7 @@ B<[@modules]> is an array ref, same as additional arguments mentioned above.
=item Examples
-
+
perl -MExtUtils::Embed -e xsinit -- -o xsinit.c Socket
@@ -395,7 +395,7 @@ are picked up from the B<extralibs.ld> file in the same directory.
perl -MExtUtils::Embed -e ldopts -- -std Socket
-
+
This will do the same as the above example, along with printing additional arguments for linking with the B<Socket> extension.
@@ -457,7 +457,7 @@ B<xsinit()> uses the xsi_* functions to generate most of it's code.
For examples on how to use B<ExtUtils::Embed> for building C/C++ applications
with embedded perl, see the eg/ directory and L<perlembed>.
-
+
=head1 SEE ALSO
L<perlembed>
diff --git a/lib/ExtUtils/MM_Unix.pm b/lib/ExtUtils/MM_Unix.pm
index f4ba1d73da..c44d6c9e2b 100644
--- a/lib/ExtUtils/MM_Unix.pm
+++ b/lib/ExtUtils/MM_Unix.pm
@@ -8,7 +8,7 @@ use strict;
use vars qw($VERSION $Is_Mac $Is_OS2 $Is_VMS
$Verbose %pm %static $Xsubpp_Version);
-$VERSION = substr q$Revision: 1.109 $, 10;
+$VERSION = substr q$Revision: 1.109_01 $, 10;
# $Id: MM_Unix.pm,v 1.109 1996/12/17 00:42:32 k Exp k $
Exporter::import('ExtUtils::MakeMaker',
@@ -2956,8 +2956,9 @@ DOC_INSTALL = $(PERL) -e '$$\="\n\n";' \
-e 'print "=back";'
UNINSTALL = $(PERL) -MExtUtils::Install \
--e 'uninstall($$ARGV[0],1);'
-
+-e 'uninstall($$ARGV[0],1,1); print "\nUninstall is deprecated. Please check the";' \
+-e 'print " packlist above carefully.\n There may be errors. Remove the";' \
+-e 'print " appropriate files manually.\n Sorry for the inconveniences.\n"'
};
return join "", @m;
diff --git a/lib/ExtUtils/xsubpp b/lib/ExtUtils/xsubpp
index d43eb1cb23..76e45d6d99 100755
--- a/lib/ExtUtils/xsubpp
+++ b/lib/ExtUtils/xsubpp
@@ -842,6 +842,7 @@ while (fetch_para()) {
$PPCODE = grep(/^\s*PPCODE\s*:/, @line);
$CODE = grep(/^\s*CODE\s*:/, @line);
+ $EXPLICIT_RETURN = $CODE && ("@line" =~ /\bST\s*\([^;]*=/ );
$ALIAS = grep(/^\s*ALIAS\s*:/, @line);
# print function header
@@ -1025,7 +1026,7 @@ EOF
# croak(errbuf);
EOF
- if ($ret_type ne "void" or $CODE) {
+ if ($ret_type ne "void" or $EXPLICIT_RETURN) {
print Q<<EOF unless $PPCODE;
# XSRETURN(1);
EOF
diff --git a/lib/File/Basename.pm b/lib/File/Basename.pm
index ad44c5df32..b904a529bd 100644
--- a/lib/File/Basename.pm
+++ b/lib/File/Basename.pm
@@ -91,8 +91,9 @@ would yield
=item C<basename>
The basename() routine returns the first element of the list produced
-by calling fileparse() with the same arguments. It is provided for
-compatibility with the UNIX shell command basename(1).
+by calling fileparse() with the same arguments, except that it always
+quotes metacharacters in the given suffixes. It is provided for
+programmer compatibility with the UNIX shell command basename(1).
=item C<dirname>
@@ -115,20 +116,23 @@ require Exporter;
@ISA = qw(Exporter);
@EXPORT = qw(fileparse fileparse_set_fstype basename dirname);
#use strict;
-#use vars qw($VERSION $Fileparse_fstype);
+#use vars qw($VERSION $Fileparse_fstype $Fileparse_fgcase);
$VERSION = "2.4";
# fileparse_set_fstype() - specify OS-based rules used in future
# calls to routines in this package
#
-# Currently recognized values: VMS, MSDOS, MacOS
+# Currently recognized values: VMS, MSDOS, MacOS, os2, AmigaOS
# Any other name uses Unix-style rules
sub fileparse_set_fstype {
- my($old) = $Fileparse_fstype;
- $Fileparse_fstype = $_[0] if $_[0];
- $old;
+ my @old = ($Fileparse_fstype, $Fileparse_fgcase);
+ if (@_) {
+ $Fileparse_fstype = $_[0];
+ $Fileparse_fgcase = ($_[0] =~ /^(?:MacOS|VMS|os2|AmigaOS)/i);
+ }
+ wantarray ? @old : $old[0];
}
# fileparse() - parse file specification
@@ -138,7 +142,7 @@ sub fileparse_set_fstype {
sub fileparse {
my($fullname,@suffices) = @_;
- my($fstype) = $Fileparse_fstype;
+ my($fstype,$fgcase) = ($Fileparse_fstype, $Fileparse_fgcase);
my($dirpath,$tail,$suffix,$basename);
if ($fstype =~ /^VMS/i) {
@@ -149,7 +153,7 @@ sub fileparse {
}
if ($fstype =~ /^MSDOS/i) {
($dirpath,$basename) = ($fullname =~ /^(.*[:\\\/])?(.*)/);
- $dirpath .= '.\\' unless $dirpath =~ /\\$/;
+ $dirpath .= '.\\' unless $dirpath =~ /[\\\/]$/;
}
elsif ($fstype =~ /^MacOS/i) {
($dirpath,$basename) = ($fullname =~ /^(.*:)?(.*)/);
@@ -165,15 +169,14 @@ sub fileparse {
if (@suffices) {
$tail = '';
foreach $suffix (@suffices) {
- if ($basename =~ /([\x00-\xff]*?)($suffix)$/) {
- $tail = $2 . $tail;
- $basename = $1;
+ my $pat = ($fgcase ? '(?i)' : '') . "($suffix)\$";
+ if ($basename =~ s/$pat//) {
+ $tail = $1 . $tail;
}
}
}
wantarray ? ($basename,$dirpath,$tail) : $basename;
-
}
@@ -202,10 +205,11 @@ sub dirname {
}
if ($fstype =~ /MacOS/i) { return $dirname }
elsif ($fstype =~ /MSDOS/i) {
- if ( $dirname =~ /:\\$/) { return $dirname }
- chop $dirname;
- $dirname =~ s:[^\\]+$:: unless length($basename);
- $dirname = '.' unless length($dirname);
+ $dirname =~ s/([^:])[\\\/]*$/$1/;
+ unless( length($basename) ) {
+ ($basename,$dirname) = fileparse $dirname;
+ $dirname =~ s/([^:])[\\\/]*$/$1/;
+ }
}
elsif ($fstype =~ /AmigaOS/i) {
if ( $dirname =~ /:$/) { return $dirname }
@@ -213,16 +217,17 @@ sub dirname {
$dirname =~ s#[^:/]+$## unless length($basename);
}
else {
- if ( $dirname =~ m:^/+$:) { return '/'; }
- chop $dirname;
- $dirname =~ s:[^/]+$:: unless length($basename);
- $dirname =~ s:/+$:: ;
- $dirname = '.' unless length($dirname);
+ $dirname =~ s:(.)/*$:$1:;
+ unless( length($basename) ) {
+ local($File::Basename::Fileparse_fstype) = $fstype;
+ ($basename,$dirname) = fileparse $dirname;
+ $dirname =~ s:(.)/*$:$1:;
+ }
}
$dirname;
}
-$Fileparse_fstype = $^O;
+fileparse_set_fstype $^O;
1;
diff --git a/lib/File/Copy.pm b/lib/File/Copy.pm
index 70c5eb81e6..b1baa207b3 100644
--- a/lib/File/Copy.pm
+++ b/lib/File/Copy.pm
@@ -18,7 +18,7 @@ use vars qw(@ISA @EXPORT @EXPORT_OK $VERSION $Too_Big
# package has not yet been updated to work with Perl 5.004, and so it
# would be a Bad Thing for the CPAN module to grab it and replace this
# module. Therefore, we set this module's version higher than 2.0.
-$VERSION = '2.01';
+$VERSION = '2.02';
require Exporter;
@ISA = qw(Exporter);
@@ -60,8 +60,8 @@ sub copy {
}
if (defined &syscopy && \&syscopy != \&copy
- && $from_a_handle
- && ($to_a_handle || $^O eq 'os2'))
+ && !$to_a_handle
+ && !($from_a_handle && $^O eq 'os2')) # OS/2 cannot handle handles
{
return syscopy($from, $to);
}
@@ -146,6 +146,10 @@ sub move {
($tosz1,$tomt1) = (stat($to))[7,9];
$fromsz = -s $from;
+ if ($^O eq 'os2' and defined $tosz1 and defined $fromsz) {
+ # will not rename with overwrite
+ unlink $to;
+ }
return 1 if rename $from, $to;
($sts,$ossts) = ($! + 0, $^E + 0);
@@ -209,14 +213,14 @@ argument may be a string, a FileHandle reference or a FileHandle
glob. Obviously, if the first argument is a filehandle of some
sort, it will be read from, and if it is a file I<name> it will
be opened for reading. Likewise, the second argument will be
-written to (and created if need be). If the second argument is
-a file name and specifies an existing directory, and the first
-argument does not specify
+written to (and created if need be).
B<Note that passing in
files as handles instead of names may lead to loss of information
on some operating systems; it is recommended that you use file
-names whenever possible.>
+names whenever possible.> Files are opened in binary mode where
+applicable. To get a consistent behavour when copying from a
+filehandle to a file, use C<binmode> on the filehandle.
An optional third parameter can be used to specify the buffer
size used for copying. This is the number of bytes from the
diff --git a/lib/FileCache.pm b/lib/FileCache.pm
index 3d01371b3b..4fd63315f9 100644
--- a/lib/FileCache.pm
+++ b/lib/FileCache.pm
@@ -53,7 +53,7 @@ sub cacheout {
($file) = @_;
unless (defined $cacheout_maxopen) {
if (open(PARAM,'/usr/include/sys/param.h')) {
- local $.;
+ local ($_, $.);
while (<PARAM>) {
$cacheout_maxopen = $1 - 4
if /^\s*#\s*define\s+NOFILE\s+(\d+)/;
diff --git a/lib/FileHandle.pm b/lib/FileHandle.pm
index e2ce83d44a..b907cae40c 100644
--- a/lib/FileHandle.pm
+++ b/lib/FileHandle.pm
@@ -44,15 +44,22 @@ import IO::Handle grep { !defined(&$_) } @EXPORT, @EXPORT_OK;
#
{
no strict 'refs';
- for my $f (qw(DESTROY new_from_fd fdopen close fileno getc ungetc gets eof
- setbuf setvbuf _open_mode_string)) {
- *{$f} = \&{"IO::Handle::$f"} or die "$f missing";
- }
- for my $f (qw(seek tell fgetpos fsetpos fflush ferror clearerr)) {
- *{$f} = \&{"IO::Seekable::$f"} or die "$f missing";
- }
- for my $f (qw(new new_tmpfile open)) {
- *{$f} = \&{"IO::File::$f"} or die "$f missing";
+
+ my %import = (
+ 'IO::Handle' =>
+ [qw(DESTROY new_from_fd fdopen close fileno getc ungetc gets
+ eof flush error clearerr setbuf setvbuf _open_mode_string)],
+ 'IO::Seekable' =>
+ [qw(seek tell getpos setpos)],
+ 'IO::File' =>
+ [qw(new new_tmpfile open)]
+ );
+ for my $pkg (keys %import) {
+ for my $func (@{$import{$pkg}}) {
+ my $c = *{"${pkg}::$func"}{CODE}
+ or die "${pkg}::$func missing";
+ *$func = $c;
+ }
}
}
@@ -184,7 +191,7 @@ result!
See L<perlfunc> for complete descriptions of each of the following
supported C<FileHandle> methods, which are just front ends for the
corresponding built-in functions:
-
+
close
fileno
getc
diff --git a/lib/Getopt/Long.pm b/lib/Getopt/Long.pm
index 4047bf1f59..f2b37e917f 100644
--- a/lib/Getopt/Long.pm
+++ b/lib/Getopt/Long.pm
@@ -1,11 +1,11 @@
# GetOpt::Long.pm -- POSIX compatible options parsing
-# RCS Status : $Id: GetoptLong.pm,v 2.5 1996-10-19 16:47:51+02 jv Exp $
+# RCS Status : $Id: GetoptLong.pm,v 2.6 1997-01-11 13:12:01+01 jv Exp $
# Author : Johan Vromans
# Created On : Tue Sep 11 15:00:12 1990
# Last Modified By: Johan Vromans
-# Last Modified On: Sat Oct 19 16:46:23 1996
-# Update Count : 504
+# Last Modified On: Sat Jan 11 13:11:35 1997
+# Update Count : 506
# Status : Released
package Getopt::Long;
@@ -14,7 +14,7 @@ require Exporter;
@ISA = qw(Exporter);
@EXPORT = qw(&GetOptions $REQUIRE_ORDER $PERMUTE $RETURN_IN_ORDER);
-$VERSION = sprintf("%d.%02d", '$Revision: 2.5 $ ' =~ /(\d+)\.(\d+)/);
+$VERSION = sprintf("%d.%02d", '$Revision: 2.6 $ ' =~ /(\d+)\.(\d+)/);
use vars qw($autoabbrev $getopt_compat $ignorecase $bundling $order
$passthrough $error $debug
$REQUIRE_ORDER $PERMUTE $RETURN_IN_ORDER
@@ -80,7 +80,7 @@ linkage specified in the HASH.
The command line options are taken from array @ARGV. Upon completion
of GetOptions, @ARGV will contain the rest (i.e. the non-options) of
the command line.
-
+
Each option specifier designates the name of the option, optionally
followed by an argument specifier. Values for argument specifiers are:
@@ -530,7 +530,7 @@ sub GetOptions {
# than once in differing environments
$error = 0;
- print STDERR ('GetOptions $Revision: 2.5 $ ',
+ print STDERR ('GetOptions $Revision: 2.6 $ ',
"[GetOpt::Long $Getopt::Long::VERSION] -- ",
"called from package \"$pkg\".\n",
" (@ARGV)\n",
@@ -927,6 +927,11 @@ sub find_option {
}
}
+ # Map to all lowercase if ignoring case.
+ elsif ( $ignorecase ) {
+ $tryopt = lc ($opt);
+ }
+
# Check validity by fetching the info.
my $type = $optbl->{$tryopt};
unless ( defined $type ) {
diff --git a/lib/IPC/Open3.pm b/lib/IPC/Open3.pm
index 5d8545889e..794893b297 100644
--- a/lib/IPC/Open3.pm
+++ b/lib/IPC/Open3.pm
@@ -157,27 +157,30 @@ sub _open3 {
}
if ($dup_wtr) {
- open(STDIN, "<&$dad_wtr") if (fileno(STDIN) != fileno($dad_wtr));
+ xopen \*STDIN, "<&$dad_wtr" if fileno(STDIN) != fileno($dad_wtr);
} else {
- close($dad_wtr);
- open(STDIN, "<&$kid_rdr");
+ xclose $dad_wtr;
+ xopen \*STDIN, "<&$kid_rdr";
+ xclose $kid_rdr;
}
if ($dup_rdr) {
- open(STDOUT, ">&$dad_rdr") if (fileno(STDOUT) != fileno($dad_rdr));
+ xopen \*STDOUT, ">&$dad_rdr" if fileno(STDOUT) != fileno($dad_rdr);
} else {
- close($dad_rdr);
- open(STDOUT, ">&$kid_wtr");
+ xclose $dad_rdr;
+ xopen \*STDOUT, ">&$kid_wtr";
+ xclose $kid_wtr;
}
if ($dad_rdr ne $dad_err) {
if ($dup_err) {
- open(STDERR, ">&$dad_err")
- if (fileno(STDERR) != fileno($dad_err));
+ xopen \*STDERR, ">&$dad_err"
+ if fileno(STDERR) != fileno($dad_err);
} else {
- close($dad_err);
- open(STDERR, ">&$kid_err");
+ xclose $dad_err;
+ xopen \*STDERR, ">&$kid_err";
+ xclose $kid_err;
}
} else {
- open(STDERR, ">&STDOUT") if (fileno(STDERR) != fileno(STDOUT));
+ xopen \*STDERR, ">&STDOUT" if fileno(STDERR) != fileno(STDOUT);
}
local($")=(" ");
exec @cmd
diff --git a/lib/Math/Complex.pm b/lib/Math/Complex.pm
index aec0776c6c..fce53f7b81 100644
--- a/lib/Math/Complex.pm
+++ b/lib/Math/Complex.pm
@@ -56,7 +56,7 @@ $display = 'cartesian'; # Default display format
sub make {
my $self = bless {}, shift;
my ($re, $im) = @_;
- $self->{cartesian} = [$re, $im];
+ $self->{'cartesian'} = [$re, $im];
$self->{c_dirty} = 0;
$self->{p_dirty} = 1;
return $self;
@@ -71,7 +71,7 @@ sub emake {
my $self = bless {}, shift;
my ($rho, $theta) = @_;
$theta += pi() if $rho < 0;
- $self->{polar} = [abs($rho), $theta];
+ $self->{'polar'} = [abs($rho), $theta];
$self->{p_dirty} = 0;
$self->{c_dirty} = 1;
return $self;
@@ -118,8 +118,8 @@ sub pi () {
#
sub i () {
$i = bless {} unless $i; # There can be only one i
- $i->{cartesian} = [0, 1];
- $i->{polar} = [1, pi/2];
+ $i->{'cartesian'} = [0, 1];
+ $i->{'polar'} = [1, pi/2];
$i->{c_dirty} = 0;
$i->{p_dirty} = 0;
return $i;
@@ -129,11 +129,11 @@ sub i () {
# Attribute access/set routines
#
-sub cartesian {$_[0]->{c_dirty} ? $_[0]->update_cartesian : $_[0]->{cartesian}}
-sub polar {$_[0]->{p_dirty} ? $_[0]->update_polar : $_[0]->{polar}}
+sub cartesian {$_[0]->{c_dirty} ? $_[0]->update_cartesian : $_[0]->{'cartesian'}}
+sub polar {$_[0]->{p_dirty} ? $_[0]->update_polar : $_[0]->{'polar'}}
-sub set_cartesian { $_[0]->{p_dirty}++; $_[0]->{cartesian} = $_[1] }
-sub set_polar { $_[0]->{c_dirty}++; $_[0]->{polar} = $_[1] }
+sub set_cartesian { $_[0]->{p_dirty}++; $_[0]->{'cartesian'} = $_[1] }
+sub set_polar { $_[0]->{c_dirty}++; $_[0]->{'polar'} = $_[1] }
#
# ->update_cartesian
@@ -142,9 +142,9 @@ sub set_polar { $_[0]->{c_dirty}++; $_[0]->{polar} = $_[1] }
#
sub update_cartesian {
my $self = shift;
- my ($r, $t) = @{$self->{polar}};
+ my ($r, $t) = @{$self->{'polar'}};
$self->{c_dirty} = 0;
- return $self->{cartesian} = [$r * cos $t, $r * sin $t];
+ return $self->{'cartesian'} = [$r * cos $t, $r * sin $t];
}
#
@@ -155,10 +155,10 @@ sub update_cartesian {
#
sub update_polar {
my $self = shift;
- my ($x, $y) = @{$self->{cartesian}};
+ my ($x, $y) = @{$self->{'cartesian'}};
$self->{p_dirty} = 0;
- return $self->{polar} = [0, 0] if $x == 0 && $y == 0;
- return $self->{polar} = [sqrt($x*$x + $y*$y), atan2($y, $x)];
+ return $self->{'polar'} = [0, 0] if $x == 0 && $y == 0;
+ return $self->{'polar'} = [sqrt($x*$x + $y*$y), atan2($y, $x)];
}
#
@@ -707,7 +707,7 @@ sub stringify_cartesian {
$re = "$x" if abs($x) >= 1e-14;
if ($y == 1) { $im = 'i' }
elsif ($y == -1) { $im = '-i' }
- elsif (abs($y) >= 1e-14) { $im = "${y}i" }
+ elsif (abs($y) >= 1e-14) { $im = $y . "i" }
my $str;
$str = $re if defined $re;
diff --git a/lib/Net/netent.pm b/lib/Net/netent.pm
index 9f385b06d1..c21096d724 100644
--- a/lib/Net/netent.pm
+++ b/lib/Net/netent.pm
@@ -113,7 +113,7 @@ The gethost() functions do this in the Perl core:
That means that the address comes back in binary for the
host functions, and as a regular perl integer for the net ones.
This seems a bug, but here's how to deal with it:
-
+
use strict;
use Socket;
use Net::netent;
@@ -154,7 +154,7 @@ This seems a bug, but here's how to deal with it:
}
}
}
-
+
=head1 NOTE
While this class is currently implemented using the Class::Template
diff --git a/lib/Pod/Functions.pm b/lib/Pod/Functions.pm
index a775cf6165..6db7cfd83c 100644
--- a/lib/Pod/Functions.pm
+++ b/lib/Pod/Functions.pm
@@ -5,7 +5,7 @@ package Pod::Functions;
require Exporter;
@ISA = qw(Exporter);
-@EXPORT = qw(%Kinds %Type %Flavor %Type_Descriptions @Type_Order);
+@EXPORT = qw(%Kinds %Type %Flavor %Type_Description @Type_Order);
%Type_Description = (
'ARRAY' => 'Functions for real @ARRAYs',
diff --git a/lib/Search/Dict.pm b/lib/Search/Dict.pm
index 1cd5cf8a11..9a229a7bc0 100644
--- a/lib/Search/Dict.pm
+++ b/lib/Search/Dict.pm
@@ -61,7 +61,7 @@ sub look {
<FH> if $min;
for (;;) {
$min = tell(FH);
- $_ = <FH>
+ defined($_ = <FH>)
or last;
chop;
s/[^\w\s]//g if $dict;
diff --git a/lib/SelfLoader.pm b/lib/SelfLoader.pm
index 11dc6a24bf..8d80b575a1 100644
--- a/lib/SelfLoader.pm
+++ b/lib/SelfLoader.pm
@@ -44,7 +44,7 @@ sub _load_stubs {
unless fileno($fh);
$Cache{"${currpack}::<DATA"} = 1; # indicate package is cached
- while($line = <$fh> and $line !~ m/^__END__/) {
+ while(defined($line = <$fh>) and $line !~ m/^__END__/) {
if ($line =~ m/^sub\s+([\w:]+)\s*(\([\$\@\;\%\\]*\))?/) { # A sub declared
push(@stubs, $self->_add_to_cache($name, $currpack, \@lines, $protoype));
$protoype = $2;
diff --git a/lib/Term/Complete.pm b/lib/Term/Complete.pm
index bdab2ad81d..e3c290aa02 100644
--- a/lib/Term/Complete.pm
+++ b/lib/Term/Complete.pm
@@ -112,7 +112,8 @@ sub Complete {
# (^U) kill
$_ eq $kill && do {
if ($r) {
- undef($r, $return);
+ undef $r;
+ undef $return;
print("\r\n");
redo LOOP;
}
diff --git a/lib/Text/Abbrev.pm b/lib/Text/Abbrev.pm
index 893f3b1729..ae6797c81a 100644
--- a/lib/Text/Abbrev.pm
+++ b/lib/Text/Abbrev.pm
@@ -54,10 +54,11 @@ sub abbrev {
my $abbrev = shift(@extra);
my $len = 1;
my $cmp;
- foreach $cmp (@cmp) {
+ WORD: foreach $cmp (@cmp) {
next if $cmp eq $name;
while (substr($cmp,0,$len) eq $abbrev) {
- $abbrev .= shift(@extra);
+ last WORD unless @extra;
+ $abbrev .= shift(@extra);
++$len;
}
}
diff --git a/lib/Tie/Hash.pm b/lib/Tie/Hash.pm
index 20b6777978..2117c54c18 100644
--- a/lib/Tie/Hash.pm
+++ b/lib/Tie/Hash.pm
@@ -98,7 +98,7 @@ L<Config> module. While these do not utilize B<Tie::Hash>, they serve as
good working examples.
=cut
-
+
use Carp;
sub new {
diff --git a/lib/cacheout.pl b/lib/cacheout.pl
index 48d594bf82..64378cffc6 100644
--- a/lib/cacheout.pl
+++ b/lib/cacheout.pl
@@ -35,7 +35,7 @@ $seq = 0;
$numopen = 0;
if (open(PARAM,'/usr/include/sys/param.h')) {
- local($.);
+ local($_, $.);
while (<PARAM>) {
$maxopen = $1 - 4 if /^\s*#\s*define\s+NOFILE\s+(\d+)/;
}
diff --git a/lib/chat2.pl b/lib/chat2.pl
index 0d9a7d3d50..8320270175 100644
--- a/lib/chat2.pl
+++ b/lib/chat2.pl
@@ -264,7 +264,7 @@ ESQ
eval $cases; die "$cases:\n$@" if $@;
}
$eof = $timeout = 0;
- do $subname();
+ &$subname();
}
## &chat'print([$handle,] @data)
diff --git a/lib/complete.pl b/lib/complete.pl
index 335245269c..539f2f7798 100644
--- a/lib/complete.pl
+++ b/lib/complete.pl
@@ -75,7 +75,8 @@ sub Complete {
# (^U) kill
$_ eq $kill && do {
if ($r) {
- undef($r, $return);
+ undef $r;
+ undef $return;
print("\r\n");
redo LOOP;
}
diff --git a/lib/diagnostics.pm b/lib/diagnostics.pm
index 31e7670b82..b00349f7b0 100755..100644
--- a/lib/diagnostics.pm
+++ b/lib/diagnostics.pm
@@ -150,8 +150,8 @@ You have to to this instead, and I<before> you load the module.
BEGIN { $diagnostics::PRETTY = 1 }
I could start up faster by delaying compilation until it should be
-needed, but this gets a "panic: top_level"
-when using the pragma form in 5.001e.
+needed, but this gets a "panic: top_level" when using the pragma form
+in Perl 5.001e.
While it's true that this documentation is somewhat subserious, if you use
a program named I<splain>, you should expect a bit of whimsy.
@@ -352,7 +352,7 @@ EOFUNC
if ($standalone) {
if (!@ARGV and -t STDIN) { print STDERR "$0: Reading from STDIN\n" }
- while ($error = <>) {
+ while (defined ($error = <>)) {
splainthis($error) || print THITHER $error;
}
exit;
diff --git a/lib/ftp.pl b/lib/ftp.pl
index bfddcb8837..9528360da2 100644
--- a/lib/ftp.pl
+++ b/lib/ftp.pl
@@ -140,7 +140,7 @@ $real_site = "";
$ftp_show = 0;
sub ftp'debug
{
- $ftp_show = @_[0];
+ $ftp_show = $_[0];
# if( $ftp_show ){
# print STDERR "ftp debugging on\n";
# }
@@ -148,7 +148,7 @@ sub ftp'debug
sub ftp'set_timeout
{
- $timeout = @_[0];
+ $timeout = $_[0];
$timeout_open = $timeout;
$timeout_read = 20 * $timeout;
if( $ftp_show ){
diff --git a/lib/importenv.pl b/lib/importenv.pl
index d56f32633b..c28ffd054d 100644
--- a/lib/importenv.pl
+++ b/lib/importenv.pl
@@ -8,7 +8,7 @@
local($tmp,$key) = '';
-foreach $key (keys(ENV)) {
+foreach $key (keys(%ENV)) {
$tmp .= "\$$key = \$ENV{'$key'};" if $key =~ /^[A-Za-z]\w*$/;
}
eval $tmp;
diff --git a/lib/overload.pm b/lib/overload.pm
index 20411ea576..049545995c 100644
--- a/lib/overload.pm
+++ b/lib/overload.pm
@@ -1,12 +1,27 @@
package overload;
+sub nil {}
+
sub OVERLOAD {
$package = shift;
my %arg = @_;
- my $hash = \%{$package . "::OVERLOAD"};
+ my ($sub, $fb);
+ $ {$package . "::OVERLOAD"}{dummy}++; # Register with magic by touching.
+ *{$package . "::()"} = \&nil; # Make it findable via fetchmethod.
for (keys %arg) {
- $hash->{$_} = $arg{$_};
+ if ($_ eq 'fallback') {
+ $fb = $arg{$_};
+ } else {
+ $sub = $arg{$_};
+ if (not ref $sub and $sub !~ /::/) {
+ $ {$package . "::(" . $_} = $sub;
+ $sub = \&nil;
+ }
+ #print STDERR "Setting `$ {'package'}::\cO$_' to \\&`$sub'.\n";
+ *{$package . "::(" . $_} = \&{ $sub };
+ }
}
+ ${$package . "::()"} = $fb; # Make it findable too (fallback only).
}
sub import {
@@ -18,44 +33,73 @@ sub import {
sub unimport {
$package = (caller())[0];
- my $hash = \%{$package . "::OVERLOAD"};
+ ${$package . "::OVERLOAD"}{dummy}++; # Upgrade the table
shift;
for (@_) {
- delete $hash->{$_};
+ if ($_ eq 'fallback') {
+ undef $ {$package . "::()"};
+ } else {
+ delete $ {$package . "::"}{"(" . $_};
+ }
}
}
sub Overloaded {
- ($package = ref $_[0]) and defined %{$package . "::OVERLOAD"};
+ my $package = shift;
+ $package = ref $package if ref $package;
+ $package->can('()');
+}
+
+sub ov_method {
+ my $globref = shift;
+ return undef unless $globref;
+ my $sub = \&{*$globref};
+ return $sub if $sub ne \&nil;
+ return shift->can($ {*$globref});
}
sub OverloadedStringify {
- ($package = ref $_[0]) and
- defined %{$package . "::OVERLOAD"} and
- exists $ {$package . "::OVERLOAD"}{'""'} and
- defined &{$ {$package . "::OVERLOAD"}{'""'}};
+ my $package = shift;
+ $package = ref $package if ref $package;
+ #$package->can('(""')
+ ov_method mycan($package, '(""'), $package;
}
sub Method {
- ($package = ref $_[0]) and
- defined %{$package . "::OVERLOAD"} and
- $ {$package . "::OVERLOAD"}{$_[1]};
+ my $package = shift;
+ $package = ref $package if ref $package;
+ #my $meth = $package->can('(' . shift);
+ ov_method mycan($package, '(' . shift), $package;
+ #return $meth if $meth ne \&nil;
+ #return $ {*{$meth}};
}
sub AddrRef {
- $package = ref $_[0];
- bless $_[0], Overload::Fake; # Non-overloaded package
+ my $package = ref $_[0];
+ return "$_[0]" unless $package;
+ bless $_[0], overload::Fake; # Non-overloaded package
my $str = "$_[0]";
bless $_[0], $package; # Back
- $str;
+ $package . substr $str, index $str, '=';
}
sub StrVal {
- (OverloadedStringify) ?
- (AddrRef) :
+ (OverloadedStringify($_[0])) ?
+ (AddrRef(shift)) :
"$_[0]";
}
+sub mycan { # Real can would leave stubs.
+ my ($package, $meth) = @_;
+ return \*{$package . "::$meth"} if defined &{$package . "::$meth"};
+ my $p;
+ foreach $p (@{$package . "::ISA"}) {
+ my $out = mycan($p, $meth);
+ return $out if $out;
+ }
+ return undef;
+}
+
1;
__END__
@@ -486,9 +530,13 @@ induces diagnostic messages.
=head1 BUGS
Because it is used for overloading, the per-package associative array
-%OVERLOAD now has a special meaning in Perl.
+%OVERLOAD now has a special meaning in Perl. The symbol table is
+filled with names looking like line-noise.
-As shipped, mathemagical properties are not inherited via the @ISA tree.
+For the purpose of inheritance every overloaded package behaves as if
+C<fallback> is present (possibly undefined). This may create
+interesting effects if some package is not overloaded, but inherits
+from two overloaded packages.
This document is confusing.
diff --git a/lib/perl5db.pl b/lib/perl5db.pl
index 1e96613050..fce77570f0 100644
--- a/lib/perl5db.pl
+++ b/lib/perl5db.pl
@@ -2,7 +2,7 @@ package DB;
# Debugger for Perl 5.00x; perl5db.pl patch level:
-$VERSION = 0.98;
+$VERSION = 0.9801;
$header = "perl5db.pl patch level $VERSION";
# Enhanced by ilya@math.ohio-state.edu (Ilya Zakharevich)
@@ -354,7 +354,7 @@ sub DB {
$filename_ini = $filename;
$usercontext = '($@, $!, $,, $/, $\, $^W) = @saved;' .
"package $package;"; # this won't let them modify, alas
- local(*dbline) = "::_<$filename";
+ local(*dbline) = $main::{'_<' . $filename};
$max = $#dbline;
if (($stop,$action) = split(/\0/,$dbline{$line})) {
if ($stop eq '1') {
@@ -499,7 +499,7 @@ sub DB {
print $OUT "No file matching `$file' is loaded.\n";
next CMD;
} elsif ($file ne $filename) {
- *dbline = "::_<$file";
+ *dbline = $main::{'_<' . $file};
$max = $#dbline;
$filename = $file;
$start = 1;
@@ -515,7 +515,7 @@ sub DB {
$subrange = pop @pieces;
$file = join(':', @pieces);
if ($file ne $filename) {
- *dbline = "::_<$file";
+ *dbline = $main::{'_<' . $file};
$max = $#dbline;
$filename = $file;
}
@@ -532,7 +532,7 @@ sub DB {
$incr = -1; # for backward motion.
$start = $line;
$filename = $filename_ini;
- *dbline = "::_<$filename";
+ *dbline = $main::{'_<' . $filename};
$max = $#dbline;
print $LINEINFO $position;
next CMD };
@@ -585,7 +585,7 @@ sub DB {
print $OUT "Deleting all breakpoints...\n";
my $file;
for $file (keys %had_breakpoints) {
- local *dbline = "::_<$file";
+ local *dbline = $main::{'_<' . $file};
my $max = $#dbline;
my $was;
@@ -606,7 +606,7 @@ sub DB {
$cmd =~ /^L$/ && do {
my $file;
for $file (keys %had_breakpoints) {
- local *dbline = "::_<$file";
+ local *dbline = $main::{'_<' . $file};
my $max = $#dbline;
my $was;
@@ -694,7 +694,7 @@ sub DB {
$i += 0;
if ($i) {
$filename = $file;
- *dbline = "::_<$filename";
+ *dbline = $main::{'_<' . $filename};
$had_breakpoints{$filename} = 1;
$max = $#dbline;
++$i while $dbline[$i] == 0 && $i < $max;
@@ -721,7 +721,7 @@ sub DB {
$cmd =~ /^A$/ && do {
my $file;
for $file (keys %had_breakpoints) {
- local *dbline = "::_<$file";
+ local *dbline = $main::{'_<' . $file};
my $max = $#dbline;
my $was;
@@ -789,7 +789,7 @@ sub DB {
$i += 0;
if ($i) {
$filename = $file;
- *dbline = "::_<$filename";
+ *dbline = $main::{'_<' . $filename};
$had_breakpoints{$filename}++;
$max = $#dbline;
++$i while $dbline[$i] == 0 && $i < $max;
@@ -843,7 +843,7 @@ sub DB {
my @hard;
for (0 .. $#had_breakpoints) {
my $file = $had_breakpoints[$_];
- *dbline = "::_<$file";
+ *dbline = $main::{'_<' . $file};
next unless %dbline or %{$postponed_file{$file}};
(push @hard, $file), next
if $file =~ /^\(eval \d+\)$/;
@@ -854,7 +854,7 @@ sub DB {
}
for (@hard) { # Yes, really-really...
# Find the subroutines in this eval
- *dbline = "::_<$_";
+ *dbline = $main::{'_<' . $_};
my ($quoted, $sub, %subs, $line) = quotemeta $_;
for $sub (keys %sub) {
next unless $sub{$sub} =~ /^$quoted:(\d+)-(\d+)$/;
@@ -1147,7 +1147,7 @@ sub postponed_sub {
my ($file,$i) = (find_sub($subname) =~ /^(.*):(\d+)-.*$/);
$i += $offset;
if ($i) {
- local *dbline = "::_<$file";
+ local *dbline = $main::{'_<' . $file};
local $^W = 0; # != 0 is magical below
$had_breakpoints{$file}++;
my $max = $#dbline;
diff --git a/lib/termcap.pl b/lib/termcap.pl
index c36575aa45..37313432fd 100644
--- a/lib/termcap.pl
+++ b/lib/termcap.pl
@@ -14,7 +14,7 @@ sub Tgetent {
local($TERMCAP,$_,$entry,$loop,$field);
warn "Tgetent: no ospeed set" unless $ospeed;
- foreach $key (keys(TC)) {
+ foreach $key (keys %TC) {
delete $TC{$key};
}
$TERM = $ENV{'TERM'} unless $TERM;
diff --git a/lib/validate.pl b/lib/validate.pl
index 21d0505ad4..ec4a04b543 100644
--- a/lib/validate.pl
+++ b/lib/validate.pl
@@ -91,11 +91,11 @@ sub valmess {
$mess =~ s/ does not / should not / ||
$mess =~ s/ not / /;
}
- print stderr $mess,"\n";
+ print STDERR $mess,"\n";
}
else {
$this =~ s/\$file/'$file'/g;
- print stderr "Can't do $this.\n";
+ print STDERR "Can't do $this.\n";
}
if ($disposition eq 'die') { exit 1; }
++$warnings;
diff --git a/op.c b/op.c
index eecde67660..34683106dd 100644
--- a/op.c
+++ b/op.c
@@ -26,8 +26,10 @@
* think the expression is of the right type: croak actually does a Siglongjmp.
*/
#define CHECKOP(type,op) \
- ((op_mask && op_mask[type]) \
- ? (croak("%s trapped by operation mask", op_desc[type]), (OP*)op) \
+ ((op_mask && op_mask[type]) \
+ ? ( op_free((OP*)op), \
+ croak("%s trapped by operation mask", op_desc[type]), \
+ Nullop ) \
: (*check[type])((OP*)op))
#else
#define CHECKOP(type,op) (*check[type])(op)
@@ -104,9 +106,9 @@ OP *op;
if (type != OP_AELEM && type != OP_HELEM) {
sprintf(tokenbuf, "Can't use subscript on %s", op_desc[type]);
yyerror(tokenbuf);
- if (type == OP_RV2HV || type == OP_ENTERSUB)
+ if (type == OP_ENTERSUB || type == OP_RV2HV || type == OP_PADHV)
warn("(Did you mean $ or @ instead of %c?)\n",
- type == OP_RV2HV ? '%' : '&');
+ type == OP_ENTERSUB ? '&' : '%');
}
}
@@ -210,17 +212,30 @@ pad_findlex(char *name, PADOFFSET newoff, U32 seq, CV* startcv, I32 cx_ix)
SvNVX(sv) = (double)curcop->cop_seq;
SvIVX(sv) = 999999999; /* A ref, intro immediately */
SvFLAGS(sv) |= SVf_FAKE;
- if (!CvUNIQUE(cv)) {
+ if (CvANON(compcv) || CvFORMAT(compcv)) {
/* "It's closures all the way down." */
CvCLONE_on(compcv);
if (cv != startcv) {
CV *bcv;
for (bcv = startcv;
bcv && bcv != cv && !CvCLONE(bcv);
- bcv = CvOUTSIDE(bcv))
- CvCLONE_on(bcv);
+ bcv = CvOUTSIDE(bcv)) {
+ if (CvANON(bcv))
+ CvCLONE_on(bcv);
+ else {
+ if (dowarn)
+ warn(
+ "Variable \"%s\" may be unavailable",
+ name);
+ break;
+ }
+ }
}
}
+ else if (!CvUNIQUE(compcv)) {
+ if (dowarn && !CvUNIQUE(cv))
+ warn("Variable \"%s\" will not stay shared", name);
+ }
}
av_store(comppad, newoff, SvREFCNT_inc(oldsv));
return newoff;
@@ -244,10 +259,14 @@ pad_findlex(char *name, PADOFFSET newoff, U32 seq, CV* startcv, I32 cx_ix)
}
break;
case CXt_EVAL:
- if (cx->blk_eval.old_op_type != OP_ENTEREVAL &&
- cx->blk_eval.old_op_type != OP_ENTERTRY)
- return 0; /* require must have its own scope */
- saweval = i;
+ switch (cx->blk_eval.old_op_type) {
+ case OP_ENTEREVAL:
+ saweval = i;
+ break;
+ case OP_REQUIRE:
+ /* require must have its own scope */
+ return 0;
+ }
break;
case CXt_SUB:
if (!saweval)
@@ -454,8 +473,13 @@ OP *op;
case OP_ENTEREVAL:
op->op_targ = 0; /* Was holding hints. */
break;
+ default:
+ if (!(op->op_flags & OPf_REF) || (check[op->op_type] != ck_ftst))
+ break;
+ /* FALL THROUGH */
case OP_GVSV:
case OP_GV:
+ case OP_AELEMFAST:
SvREFCNT_dec(cGVOP->op_gv);
break;
case OP_NEXTSTATE:
@@ -484,8 +508,6 @@ OP *op;
pregfree(cPMOP->op_pmregexp);
SvREFCNT_dec(cPMOP->op_pmshort);
break;
- default:
- break;
}
if (op->op_targ > 0)
@@ -2359,7 +2381,7 @@ OP *op;
cop->cop_line = copline;
copline = NOLINE;
}
- cop->cop_filegv = GvREFCNT_inc(curcop->cop_filegv);
+ cop->cop_filegv = (GV*)SvREFCNT_inc(curcop->cop_filegv);
cop->cop_stash = curstash;
if (perldb && curstash != debstash) {
@@ -2444,6 +2466,32 @@ OP* other;
else
scalar(other);
}
+ else if (dowarn && (first->op_flags & OPf_KIDS)) {
+ OP *k1 = ((UNOP*)first)->op_first;
+ OP *k2 = k1->op_sibling;
+ OPCODE warnop = 0;
+ switch (first->op_type)
+ {
+ case OP_NULL:
+ if (k2 && k2->op_type == OP_READLINE
+ && (k2->op_flags & OPf_STACKED)
+ && (k1->op_type == OP_RV2SV || k1->op_type == OP_PADSV))
+ warnop = k2->op_type;
+ break;
+
+ case OP_SASSIGN:
+ if (k1->op_type == OP_READDIR || k1->op_type == OP_GLOB)
+ warnop = k1->op_type;
+ break;
+ }
+ if (warnop) {
+ line_t oldline = curcop->cop_line;
+ curcop->cop_line = copline;
+ warn("Value of %s construct can be \"0\"; test with defined()",
+ op_desc[warnop]);
+ curcop->cop_line = oldline;
+ }
+ }
if (!other)
return first;
@@ -2767,18 +2815,22 @@ CV *cv;
CvROOT(cv) = Nullop;
LEAVE;
}
+ CvFLAGS(cv) = 0;
SvREFCNT_dec(CvGV(cv));
CvGV(cv) = Nullgv;
SvREFCNT_dec(CvOUTSIDE(cv));
CvOUTSIDE(cv) = Nullcv;
if (CvPADLIST(cv)) {
- I32 i = AvFILL(CvPADLIST(cv));
- while (i >= 0) {
- SV** svp = av_fetch(CvPADLIST(cv), i--, FALSE);
- if (svp)
- SvREFCNT_dec(*svp);
+ /* may be during global destruction */
+ if (SvREFCNT(CvPADLIST(cv))) {
+ I32 i = AvFILL(CvPADLIST(cv));
+ while (i >= 0) {
+ SV** svp = av_fetch(CvPADLIST(cv), i--, FALSE);
+ if (svp)
+ SvREFCNT_dec(*svp);
+ }
+ SvREFCNT_dec((SV*)CvPADLIST(cv));
}
- SvREFCNT_dec((SV*)CvPADLIST(cv));
CvPADLIST(cv) = Nullav;
}
}
@@ -2801,13 +2853,13 @@ CV* cv;
(CvANON(cv) ? "ANON"
: (cv == main_cv) ? "MAIN"
: CvUNIQUE(outside) ? "UNIQUE"
- : CvGV(cv) ? GvNAME(CvGV(cv)) : "?mystery?"),
+ : CvGV(cv) ? GvNAME(CvGV(cv)) : "UNDEFINED"),
outside,
(!outside ? "null"
: CvANON(outside) ? "ANON"
: (outside == main_cv) ? "MAIN"
: CvUNIQUE(outside) ? "UNIQUE"
- : CvGV(outside) ? GvNAME(CvGV(outside)) : "?mystery?"));
+ : CvGV(outside) ? GvNAME(CvGV(outside)) : "UNDEFINED"));
for (ix = 1; ix <= AvFILL(pad); ix++) {
if (SvPOK(pname[ix]))
@@ -2848,7 +2900,7 @@ CV* outside;
CvANON_on(cv);
CvFILEGV(cv) = CvFILEGV(proto);
- CvGV(cv) = GvREFCNT_inc(CvGV(proto));
+ CvGV(cv) = (GV*)SvREFCNT_inc(CvGV(proto));
CvSTASH(cv) = CvSTASH(proto);
CvROOT(cv) = CvROOT(proto);
CvSTART(cv) = CvSTART(proto);
@@ -2972,21 +3024,24 @@ OP *op;
OP *proto;
OP *block;
{
+ char *name = op ? SvPVx(cSVOP->op_sv, na) : Nullch;
+ GV *gv = gv_fetchpv(name ? name : "__ANON__", GV_ADDMULTI, SVt_PVCV);
register CV *cv;
- char *name = op ? SvPVx(cSVOP->op_sv, na) : "__ANON__";
- GV* gv = gv_fetchpv(name, GV_ADDMULTI, SVt_PVCV);
- AV* av;
- char *s;
+ AV *av;
I32 ix;
if (op)
- sub_generation++;
- if (cv = GvCV(gv)) {
- if (GvCVGEN(gv))
- cv = 0; /* just a cached method */
+ SAVEFREEOP(op);
+ if (cv = (name ? GvCV(gv) : Nullcv)) {
+ if (GvCVGEN(gv)) {
+ /* just a cached method */
+ SvREFCNT_dec(cv);
+ cv = 0;
+ }
else if (CvROOT(cv) || CvXSUB(cv) || GvASSUMECV(gv)) {
- SV* const_sv = cv_const_sv(cv);
+ /* already defined (or promised) */
+ SV* const_sv = cv_const_sv(cv);
char *p = proto ? SvPVx(((SVOP*)proto)->op_sv, na) : Nullch;
if((!proto != !SvPOK(cv)) || (p && strNE(SvPV((SV*)cv,na), p))) {
@@ -2994,10 +3049,8 @@ OP *block;
SvPOK(cv) ? SvPV((SV*)cv,na) : "none",
p ? p : "none");
}
-
- if ((const_sv || dowarn) && strNE(name, "BEGIN")) {/* already defined (or promised)? */
+ if (const_sv || dowarn) {
line_t oldline = curcop->cop_line;
-
curcop->cop_line = copline;
warn(const_sv ? "Constant subroutine %s redefined"
: "Subroutine %s redefined",name);
@@ -3009,6 +3062,7 @@ OP *block;
}
if (cv) { /* must reuse cv if autoloaded */
cv_undef(cv);
+ CvFLAGS(cv) = CvFLAGS(compcv);
CvOUTSIDE(cv) = CvOUTSIDE(compcv);
CvOUTSIDE(compcv) = 0;
CvPADLIST(cv) = CvPADLIST(compcv);
@@ -3019,11 +3073,14 @@ OP *block;
}
else {
cv = compcv;
+ if (name) {
+ GvCV(gv) = cv;
+ GvCVGEN(gv) = 0;
+ sub_generation++;
+ }
}
- GvCV(gv) = cv;
- GvCVGEN(gv) = 0;
+ CvGV(cv) = (GV*)SvREFCNT_inc(gv);
CvFILEGV(cv) = curcop->cop_filegv;
- CvGV(cv) = GvREFCNT_inc(gv);
CvSTASH(cv) = curstash;
if (proto) {
@@ -3037,8 +3094,6 @@ OP *block;
block = Nullop;
}
if (!block) {
- CvROOT(cv) = 0;
- op_free(op);
copline = NOLINE;
LEAVE_SCOPE(floor);
return cv;
@@ -3050,7 +3105,7 @@ OP *block;
AvFLAGS(av) = AVf_REIFY;
for (ix = AvFILL(comppad); ix > 0; ix--) {
- if (!SvPADMY(curpad[ix]))
+ if (!SvPADMY(curpad[ix]) && !SvIMMORTAL(curpad[ix]))
SvPADTMP_on(curpad[ix]);
}
@@ -3061,74 +3116,72 @@ OP *block;
CvSTART(cv) = LINKLIST(CvROOT(cv));
CvROOT(cv)->op_next = 0;
peep(CvSTART(cv));
- if (s = strrchr(name,':'))
- s++;
- else
- s = name;
- if (strEQ(s, "BEGIN") && !error_count) {
- line_t oldline = compiling.cop_line;
- SV *oldrs = rs;
- ENTER;
- SAVESPTR(compiling.cop_filegv);
- SAVEI32(perldb);
- if (!beginav)
- beginav = newAV();
- av_push(beginav, (SV *)cv);
- DEBUG_x( dump_sub(gv) );
- rs = SvREFCNT_inc(nrs);
- SvREFCNT_inc(cv);
- calllist(beginav);
- if (GvCV(gv) == cv) { /* Detach it. */
- SvREFCNT_dec(cv);
- GvCV(gv) = 0; /* Was above calllist, why? IZ */
+ if (name) {
+ char *s;
+
+ if (perldb && curstash != debstash) {
+ SV *sv;
+ SV *tmpstr = sv_newmortal();
+ static GV *db_postponed;
+ CV *cv;
+ HV *hv;
+
+ sprintf(buf, "%s:%ld",
+ SvPVX(GvSV(curcop->cop_filegv)), (long)subline);
+ sv = newSVpv(buf,0);
+ sv_catpv(sv,"-");
+ sprintf(buf,"%ld",(long)curcop->cop_line);
+ sv_catpv(sv,buf);
+ gv_efullname3(tmpstr, gv, Nullch);
+ hv_store(GvHV(DBsub), SvPVX(tmpstr), SvCUR(tmpstr), sv, 0);
+ if (!db_postponed) {
+ db_postponed = gv_fetchpv("DB::postponed", TRUE, SVt_PVHV);
+ }
+ hv = GvHVn(db_postponed);
+ if (HvFILL(hv) >= 0 && hv_exists(hv, SvPVX(tmpstr), SvCUR(tmpstr))
+ && (cv = GvCV(db_postponed))) {
+ dSP;
+ PUSHMARK(sp);
+ XPUSHs(tmpstr);
+ PUTBACK;
+ perl_call_sv((SV*)cv, G_DISCARD);
+ }
}
- SvREFCNT_dec(rs);
- rs = oldrs;
- curcop = &compiling;
- curcop->cop_line = oldline; /* might have recursed to yylex */
- LEAVE;
- }
- else if (strEQ(s, "END") && !error_count) {
- if (!endav)
- endav = newAV();
- av_unshift(endav, 1);
- av_store(endav, 0, SvREFCNT_inc(cv));
- }
- if (perldb && curstash != debstash) {
- SV *sv;
- SV *tmpstr = sv_newmortal();
- static GV *db_postponed;
- CV *cv;
- HV *hv;
-
- sprintf(buf,"%s:%ld",SvPVX(GvSV(curcop->cop_filegv)), (long)subline);
- sv = newSVpv(buf,0);
- sv_catpv(sv,"-");
- sprintf(buf,"%ld",(long)curcop->cop_line);
- sv_catpv(sv,buf);
- gv_efullname3(tmpstr, gv, Nullch);
- hv_store(GvHV(DBsub), SvPVX(tmpstr), SvCUR(tmpstr), sv, 0);
- if (!db_postponed) {
- db_postponed = gv_fetchpv("DB::postponed", TRUE, SVt_PVHV);
+
+ if ((s = strrchr(name,':')))
+ s++;
+ else
+ s = name;
+ if (strEQ(s, "BEGIN") && !error_count) {
+ ENTER;
+ SAVESPTR(compiling.cop_filegv);
+ SAVEI16(compiling.cop_line);
+ SAVEI32(perldb);
+ save_svref(&rs);
+ sv_setsv(rs, nrs);
+
+ if (!beginav)
+ beginav = newAV();
+ DEBUG_x( dump_sub(gv) );
+ av_push(beginav, (SV *)cv);
+ GvCV(gv) = 0;
+ calllist(beginav);
+
+ curcop = &compiling;
+ LEAVE;
}
- hv = GvHVn(db_postponed);
- if (HvFILL(hv) >= 0 && hv_exists(hv, SvPVX(tmpstr), SvCUR(tmpstr))
- && (cv = GvCV(db_postponed))) {
- dSP;
- PUSHMARK(sp);
- XPUSHs(tmpstr);
- PUTBACK;
- perl_call_sv((SV*)cv, G_DISCARD);
+ else if (strEQ(s, "END") && !error_count) {
+ if (!endav)
+ endav = newAV();
+ av_unshift(endav, 1);
+ av_store(endav, 0, (SV *)cv);
+ GvCV(gv) = 0;
}
}
- op_free(op);
+
copline = NOLINE;
LEAVE_SCOPE(floor);
- if (!op) {
- GvCV(gv) = 0; /* Will remember in SVOP instead. */
- CvANON_on(cv);
- }
return cv;
}
@@ -3153,19 +3206,19 @@ char *name;
void (*subaddr) _((CV*));
char *filename;
{
+ GV *gv = gv_fetchpv(name ? name : "__ANON__", GV_ADDMULTI, SVt_PVCV);
register CV *cv;
- GV *gv = gv_fetchpv((name ? name : "__ANON__"), GV_ADDMULTI, SVt_PVCV);
- char *s;
-
- if (name)
- sub_generation++;
- if (cv = GvCV(gv)) {
- if (GvCVGEN(gv))
- cv = 0; /* just a cached method */
- else if (CvROOT(cv) || CvXSUB(cv)) { /* already defined? */
+
+ if (cv = (name ? GvCV(gv) : Nullcv)) {
+ if (GvCVGEN(gv)) {
+ /* just a cached method */
+ SvREFCNT_dec(cv);
+ cv = 0;
+ }
+ else if (CvROOT(cv) || CvXSUB(cv) || GvASSUMECV(gv)) {
+ /* already defined (or promised) */
if (dowarn) {
line_t oldline = curcop->cop_line;
-
curcop->cop_line = copline;
warn("Subroutine %s redefined",name);
curcop->cop_line = oldline;
@@ -3174,40 +3227,45 @@ char *filename;
cv = 0;
}
}
- if (cv) { /* must reuse cv if autoloaded */
- assert(SvREFCNT(CvGV(cv)) > 1);
- SvREFCNT_dec(CvGV(cv));
- }
+
+ if (cv) /* must reuse cv if autoloaded */
+ cv_undef(cv);
else {
cv = (CV*)NEWSV(1105,0);
sv_upgrade((SV *)cv, SVt_PVCV);
+ if (name) {
+ GvCV(gv) = cv;
+ GvCVGEN(gv) = 0;
+ sub_generation++;
+ }
}
- GvCV(gv) = cv;
- CvGV(cv) = GvREFCNT_inc(gv);
- GvCVGEN(gv) = 0;
+ CvGV(cv) = (GV*)SvREFCNT_inc(gv);
CvFILEGV(cv) = gv_fetchfile(filename);
CvXSUB(cv) = subaddr;
- if (!name)
- s = "__ANON__";
- else if (s = strrchr(name,':'))
- s++;
+
+ if (name) {
+ char *s = strrchr(name,':');
+ if (s)
+ s++;
+ else
+ s = name;
+ if (strEQ(s, "BEGIN")) {
+ if (!beginav)
+ beginav = newAV();
+ av_push(beginav, (SV *)cv);
+ GvCV(gv) = 0;
+ }
+ else if (strEQ(s, "END")) {
+ if (!endav)
+ endav = newAV();
+ av_unshift(endav, 1);
+ av_store(endav, 0, (SV *)cv);
+ GvCV(gv) = 0;
+ }
+ }
else
- s = name;
- if (strEQ(s, "BEGIN")) {
- if (!beginav)
- beginav = newAV();
- av_push(beginav, SvREFCNT_inc(gv));
- }
- else if (strEQ(s, "END")) {
- if (!endav)
- endav = newAV();
- av_unshift(endav, 1);
- av_store(endav, 0, SvREFCNT_inc(gv));
- }
- if (!name) {
- GvCV(gv) = 0; /* Will remember elsewhere instead. */
CvANON_on(cv);
- }
+
return cv;
}
@@ -3240,11 +3298,11 @@ OP *block;
}
cv = compcv;
GvFORM(gv) = cv;
- CvGV(cv) = GvREFCNT_inc(gv);
+ CvGV(cv) = (GV*)SvREFCNT_inc(gv);
CvFILEGV(cv) = curcop->cop_filegv;
for (ix = AvFILL(comppad); ix > 0; ix--) {
- if (!SvPADMY(curpad[ix]))
+ if (!SvPADMY(curpad[ix]) && !SvIMMORTAL(curpad[ix]))
SvPADTMP_on(curpad[ix]);
}
@@ -3442,7 +3500,8 @@ OP *op;
if (op->op_flags & OPf_KIDS) {
OP* newop;
OP* kid;
- op = modkids(ck_fun(op), op->op_type);
+ OPCODE type = op->op_type;
+ op = modkids(ck_fun(op), type);
kid = cUNOP->op_first;
newop = kUNOP->op_first->op_sibling;
if (newop &&
@@ -3585,9 +3644,31 @@ register OP *op;
op->op_private |= (hints & HINT_STRICT_REFS);
if (kid->op_type == OP_CONST) {
- int iscv = (op->op_type==OP_RV2CV)*2;
- GV *gv = 0;
+ char *name;
+ int iscv;
+ GV *gv;
+
+ name = SvPV(kid->op_sv, na);
+ if ((hints & HINT_STRICT_REFS) && (kid->op_private & OPpCONST_BARE)) {
+ char *badthing = Nullch;
+ switch (op->op_type) {
+ case OP_RV2SV:
+ badthing = "a SCALAR";
+ break;
+ case OP_RV2AV:
+ badthing = "an ARRAY";
+ break;
+ case OP_RV2HV:
+ badthing = "a HASH";
+ break;
+ }
+ if (badthing)
+ croak(
+ "Can't use bareword (\"%s\") as %s ref while \"strict refs\" in use",
+ name, badthing);
+ }
kid->op_type = OP_GV;
+ iscv = (op->op_type == OP_RV2CV) * 2;
for (gv = 0; !gv; iscv++) {
/*
* This is a little tricky. We only want to add the symbol if we
@@ -3597,7 +3678,7 @@ register OP *op;
* or we get possible typo warnings. OPpCONST_ENTERED says
* whether the lexer already added THIS instance of this symbol.
*/
- gv = gv_fetchpv(SvPVx(kid->op_sv, na),
+ gv = gv_fetchpv(name,
iscv | !(kid->op_private & OPpCONST_ENTERED),
iscv
? SVt_PVCV
@@ -3881,14 +3962,16 @@ OP *
ck_lfun(op)
OP *op;
{
- return modkids(ck_fun(op), op->op_type);
+ OPCODE type = op->op_type;
+ return modkids(ck_fun(op), type);
}
OP *
ck_rfun(op)
OP *op;
{
- return refkids(ck_fun(op), op->op_type);
+ OPCODE type = op->op_type;
+ return refkids(ck_fun(op), type);
}
OP *
@@ -4184,7 +4267,7 @@ OP *op;
null(cvop); /* disable rv2cv */
tmpop = (SVOP*)((UNOP*)cvop)->op_first;
if (tmpop->op_type == OP_GV) {
- cv = GvCV(tmpop->op_sv);
+ cv = GvCVu(tmpop->op_sv);
if (cv && SvPOK(cv) && !(op->op_private & OPpENTERSUB_AMPER))
proto = SvPV((SV*)cv,na);
}
@@ -4397,7 +4480,7 @@ register OP* o;
o->op_type = OP_AELEMFAST;
o->op_ppaddr = ppaddr[OP_AELEMFAST];
o->op_private = (U8)i;
- GvAVn((GV*)(((SVOP*)o)->op_sv));
+ GvAVn(((GVOP*)o)->op_gv);
}
}
o->op_seq = op_seqmax++;
diff --git a/os2/Changes b/os2/Changes
index 83af2d8893..902783295f 100644
--- a/os2/Changes
+++ b/os2/Changes
@@ -122,3 +122,8 @@ after 5.003_08:
after 5.003_11:
Functions emx_{malloc,realloc,calloc,free} are exported from DLL.
get_sysinfo() bugs corrected (flags were not used and wrongly defined).
+
+after 5.003_20:
+ _isterm is substituted instead of isatty, s?random instead of srand.
+ `register' disabled if -DDEBUGGING and not AOUT build: stupid SD386.
+ 3-argument select() was stomping over memory.
diff --git a/os2/os2.c b/os2/os2.c
index c9d1e55f6c..701bb52a3c 100644
--- a/os2/os2.c
+++ b/os2/os2.c
@@ -158,22 +158,6 @@ getpriority(int which /* ignored */, int pid)
/* spawn */
typedef void (*Sigfunc) _((int));
-static
-Sigfunc rsignal(signo,handler)
-int signo;
-Sigfunc handler;
-{
- struct sigaction act,oact;
-
- act.sa_handler = handler;
- sigemptyset(&act.sa_mask);
- act.sa_flags = 0;
- if (sigaction(signo, &act, &oact) < 0)
- return(SIG_ERR);
- else
- return(oact.sa_handler);
-}
-
static int
result(int flag, int pid)
{
diff --git a/os2/os2ish.h b/os2/os2ish.h
index b2e1f66c78..ade419912f 100644
--- a/os2/os2ish.h
+++ b/os2/os2ish.h
@@ -37,6 +37,18 @@
*/
#undef ACME_MESS /**/
+/* ALTERNATE_SHEBANG:
+ * This symbol, if defined, contains a "magic" string which may be used
+ * as the first line of a Perl program designed to be executed directly
+ * by name, instead of the standard Unix #!. If ALTERNATE_SHEBANG
+ * begins with a character other then #, then Perl will only treat
+ * it as a command line if if finds the string "perl" in the first
+ * word; otherwise it's treated as the first line of code in the script.
+ * (IOW, Perl won't hand off to another interpreter via an alternate
+ * shebang sequence that might be legal Perl code.)
+ */
+/* #define ALTERNATE_SHEBANG "#!" / **/
+
#ifndef SIGABRT
# define SIGABRT SIGILL
#endif
@@ -99,6 +111,8 @@ char *my_tmpnam (char *);
#define tmpfile my_tmpfile
#define tmpnam my_tmpnam
#define isatty _isterm
+#define rand random
+#define srand srandom
/*
* fwrite1() should be a routine with the same calling sequence as fwrite(),
@@ -155,6 +169,11 @@ void *emx_realloc (void *, size_t);
#endif
+/* With SD386 it is impossible to debug register variables. */
+#if !defined(PERL_IS_AOUT) && defined(DEBUGGING) && !defined(register)
+# define register
+#endif
+
/* Our private OS/2 specific data. */
typedef struct OS2_Perl_data {
diff --git a/patchlevel.h b/patchlevel.h
index fcdf88372d..529bcbd608 100644
--- a/patchlevel.h
+++ b/patchlevel.h
@@ -1,5 +1,5 @@
#define PATCHLEVEL 3
-#define SUBVERSION 17
+#define SUBVERSION 21
/*
local_patches -- list of locally applied less-than-subversion patches.
diff --git a/perl.c b/perl.c
index aa6a1a4d8b..8cb8169cb3 100644
--- a/perl.c
+++ b/perl.c
@@ -34,6 +34,29 @@ dEXTCONST char rcsid[] = "perl.c\nPatch level: ###\n";
#endif
#endif
+#define I_REINIT \
+ STMT_START { \
+ chopset = " \n-"; \
+ copline = NOLINE; \
+ curcop = &compiling; \
+ curcopdb = NULL; \
+ cxstack_ix = -1; \
+ cxstack_max = 128; \
+ dbargs = 0; \
+ dlmax = 128; \
+ laststatval = -1; \
+ laststype = OP_STAT; \
+ maxscream = -1; \
+ maxsysfd = MAXSYSFD; \
+ statname = Nullsv; \
+ tmps_floor = -1; \
+ tmps_ix = -1; \
+ op_mask = NULL; \
+ dlmax = 128; \
+ laststatval = -1; \
+ laststype = OP_STAT; \
+ } STMT_END
+
static void find_beginning _((void));
static void forbid_setid _((char *));
static void incpush _((char *));
@@ -93,6 +116,8 @@ register PerlInterpreter *sv_interp;
nrs = newSVpv("\n", 1);
rs = SvREFCNT_inc(nrs);
+ pidstatus = newHV();
+
#ifdef MSDOS
/*
* There is no way we can refer to them from Perl so close them to save
@@ -105,19 +130,11 @@ register PerlInterpreter *sv_interp;
}
#ifdef MULTIPLICITY
- chopset = " \n-";
- copline = NOLINE;
- curcop = &compiling;
- dbargs = 0;
- dlmax = 128;
- laststatval = -1;
- laststype = OP_STAT;
- maxscream = -1;
- maxsysfd = MAXSYSFD;
- rsfp = Nullfp;
- statname = Nullsv;
- tmps_floor = -1;
- perl_destruct_level = 1;
+ I_REINIT;
+ perl_destruct_level = 1;
+#else
+ if(perl_destruct_level > 0)
+ I_REINIT;
#endif
init_ids();
@@ -139,7 +156,6 @@ register PerlInterpreter *sv_interp;
PerlIO_init(); /* Hook to IO system */
fdpid = newAV(); /* for remembering popen pids by fd */
- pidstatus = newHV();/* for remembering status of dead pids */
init_stacks();
ENTER;
@@ -206,18 +222,120 @@ register PerlInterpreter *sv_interp;
/* loosen bonds of global variables */
- setdefout(Nullgv);
+ if(rsfp) {
+ (void)PerlIO_close(rsfp);
+ rsfp = Nullfp;
+ }
+
+ /* Filters for program text */
+ SvREFCNT_dec(rsfp_filters);
+ rsfp_filters = Nullav;
+
+ /* switches */
+ preprocess = FALSE;
+ minus_n = FALSE;
+ minus_p = FALSE;
+ minus_l = FALSE;
+ minus_a = FALSE;
+ minus_F = FALSE;
+ doswitches = FALSE;
+ dowarn = FALSE;
+ doextract = FALSE;
+ sawampersand = FALSE; /* must save all match strings */
+ sawstudy = FALSE; /* do fbm_instr on all strings */
+ sawvec = FALSE;
+ unsafe = FALSE;
+
+ Safefree(inplace);
+ inplace = Nullch;
+
+ Safefree(e_tmpname);
+ e_tmpname = Nullch;
+
+ if (e_fp) {
+ PerlIO_close(e_fp);
+ e_fp = Nullfp;
+ }
+
+ /* magical thingies */
+
+ Safefree(ofs); /* $, */
+ ofs = Nullch;
+
+ Safefree(ors); /* $\ */
+ ors = Nullch;
- sv_free(nrs);
+ SvREFCNT_dec(nrs); /* $\ helper */
nrs = Nullsv;
- sv_free(lastscream);
- lastscream = Nullsv;
+ multiline = 0; /* $* */
- sv_free(statname);
+ SvREFCNT_dec(statname);
statname = Nullsv;
statgv = Nullgv;
- laststatval = -1;
+
+ /* defgv, aka *_ should be taken care of elsewhere */
+
+#if 0 /* just about all regexp stuff, seems to be ok */
+
+ /* shortcuts to regexp stuff */
+ leftgv = Nullgv;
+ ampergv = Nullgv;
+
+ SAVEFREEOP(curpm);
+ SAVEFREEOP(oldlastpm); /* for saving regexp context during debugger */
+
+ regprecomp = NULL; /* uncompiled string. */
+ regparse = NULL; /* Input-scan pointer. */
+ regxend = NULL; /* End of input for compile */
+ regnpar = 0; /* () count. */
+ regcode = NULL; /* Code-emit pointer; &regdummy = don't. */
+ regsize = 0; /* Code size. */
+ regnaughty = 0; /* How bad is this pattern? */
+ regsawback = 0; /* Did we see \1, ...? */
+
+ reginput = NULL; /* String-input pointer. */
+ regbol = NULL; /* Beginning of input, for ^ check. */
+ regeol = NULL; /* End of input, for $ check. */
+ regstartp = (char **)NULL; /* Pointer to startp array. */
+ regendp = (char **)NULL; /* Ditto for endp. */
+ reglastparen = 0; /* Similarly for lastparen. */
+ regtill = NULL; /* How far we are required to go. */
+ regflags = 0; /* are we folding, multilining? */
+ regprev = (char)NULL; /* char before regbol, \n if none */
+
+#endif /* if 0 */
+
+ /* clean up after study() */
+ SvREFCNT_dec(lastscream);
+ lastscream = Nullsv;
+ Safefree(screamfirst);
+ screamfirst = 0;
+ Safefree(screamnext);
+ screamnext = 0;
+
+ /* startup and shutdown function lists */
+ SvREFCNT_dec(beginav);
+ SvREFCNT_dec(endav);
+ beginav = Nullav;
+ endav = Nullav;
+
+ /* temp stack during pp_sort() */
+ SvREFCNT_dec(sortstack);
+ sortstack = Nullav;
+
+ /* shortcuts just get cleared */
+ envgv = Nullgv;
+ siggv = Nullgv;
+ incgv = Nullgv;
+ errgv = Nullgv;
+ argvgv = Nullgv;
+ argvoutgv = Nullgv;
+ stdingv = Nullgv;
+ last_in_gv = Nullgv;
+
+ /* reset so print() ends up where we expect */
+ setdefout(Nullgv);
/* Prepare to destruct main symbol table. */
@@ -281,8 +399,10 @@ register PerlInterpreter *sv_interp;
warn("Scalars leaked: %d\n", sv_count);
sv_free_arenas();
-
- linestr = NULL; /* No SVs have survived, need to clean out */
+
+ /* No SVs have survived, need to clean out */
+ linestr = NULL;
+ pidstatus = Nullhv;
if (origfilename)
Safefree(origfilename);
nuke_stacks();
@@ -760,13 +880,13 @@ char* name;
I32 create;
{
GV* gv = gv_fetchpv(name, create, SVt_PVCV);
- if (create && !GvCV(gv))
+ if (create && !GvCVu(gv))
return newSUB(start_subparse(),
newSVOP(OP_CONST, 0, newSVpv(name,0)),
Nullop,
Nullop);
if (gv)
- return GvCV(gv);
+ return GvCVu(gv);
return Nullcv;
}
@@ -1323,7 +1443,7 @@ char *s;
printf("\nThis is perl, version %s",patchlevel);
#endif
- printf("\n\nCopyright 1987-1996, Larry Wall\n");
+ printf("\n\nCopyright 1987-1997, Larry Wall\n");
printf("\n\t+ suidperl security patch");
#ifdef MSDOS
printf("\n\nMS-DOS port Copyright (c) 1989, 1990, Diomidis Spinellis\n");
diff --git a/perl.h b/perl.h
index 470a44d03c..6e8d00b78a 100644
--- a/perl.h
+++ b/perl.h
@@ -1242,6 +1242,7 @@ EXT U32 evalseq; /* eval sequence number */
EXT U32 sub_generation; /* inc to force methods to be looked up again */
EXT char ** origenviron;
EXT U32 origalen;
+EXT HV * pidstatus; /* pid-to-status mappings for waitpid */
EXT U32 * profiledata;
EXT int maxo INIT(MAXO);/* Number of ops */
EXT char * osname; /* operating system */
@@ -1663,7 +1664,7 @@ IEXT char * Ie_tmpname;
IEXT PerlIO * Ie_fp;
IEXT U32 Iperldb;
/* This value may be raised by extensions for testing purposes */
-IEXT int Iperl_destruct_level IINIT(1); /* 0=none, 1=full, 2=full with checks */
+IEXT int Iperl_destruct_level IINIT(0); /* 0=none, 1=full, 2=full with checks */
/* magical thingies */
IEXT Time_t Ibasetime; /* $^T */
@@ -1740,7 +1741,6 @@ IEXT int Iforkprocess; /* so do_open |- can return proc# */
/* subprocess state */
IEXT AV * Ifdpid; /* keep fd-to-pid mappings for my_popen */
-IEXT HV * Ipidstatus; /* keep pid-to-status mappings for waitpid */
/* internal state */
IEXT VOL int Iin_eval; /* trap "fatal" errors? */
@@ -1950,55 +1950,67 @@ EXT MGVTBL vtbl_amagicelem;
#ifdef OVERLOAD
EXT long amagic_generation;
-#define NofAMmeth 29
+#define NofAMmeth 58
#ifdef DOINIT
-EXTCONST char * AMG_names[NofAMmeth][2] = {
- {"fallback","abs"},
- {"bool", "nomethod"},
- {"\"\"", "0+"},
- {"+","+="},
- {"-","-="},
- {"*", "*="},
- {"/", "/="},
- {"%", "%="},
- {"**", "**="},
- {"<<", "<<="},
- {">>", ">>="},
- {"&", "&="},
- {"|", "|="},
- {"^", "^="},
- {"<", "<="},
- {">", ">="},
- {"==", "!="},
- {"<=>", "cmp"},
- {"lt", "le"},
- {"gt", "ge"},
- {"eq", "ne"},
- {"!", "~"},
- {"++", "--"},
- {"atan2", "cos"},
- {"sin", "exp"},
- {"log", "sqrt"},
- {"x","x="},
- {".",".="},
- {"=","neg"}
+EXTCONST char * AMG_names[NofAMmeth] = {
+ "fallback", "abs", /* "fallback" should be the first. */
+ "bool", "nomethod",
+ "\"\"", "0+",
+ "+", "+=",
+ "-", "-=",
+ "*", "*=",
+ "/", "/=",
+ "%", "%=",
+ "**", "**=",
+ "<<", "<<=",
+ ">>", ">>=",
+ "&", "&=",
+ "|", "|=",
+ "^", "^=",
+ "<", "<=",
+ ">", ">=",
+ "==", "!=",
+ "<=>", "cmp",
+ "lt", "le",
+ "gt", "ge",
+ "eq", "ne",
+ "!", "~",
+ "++", "--",
+ "atan2", "cos",
+ "sin", "exp",
+ "log", "sqrt",
+ "x", "x=",
+ ".", ".=",
+ "=", "neg"
};
#else
-EXTCONST char * AMG_names[NofAMmeth][2];
+EXTCONST char * AMG_names[NofAMmeth];
#endif /* def INITAMAGIC */
-struct am_table {
+struct am_table {
long was_ok_sub;
long was_ok_am;
- CV* table[NofAMmeth*2];
+ U32 flags;
+ CV* table[NofAMmeth];
long fallback;
};
+struct am_table_short {
+ long was_ok_sub;
+ long was_ok_am;
+ U32 flags;
+};
typedef struct am_table AMT;
+typedef struct am_table_short AMTS;
#define AMGfallNEVER 1
#define AMGfallNO 2
#define AMGfallYES 3
+#define AMTf_AMAGIC 1
+#define AMT_AMAGIC(amt) ((amt)->flags & AMTf_AMAGIC)
+#define AMT_AMAGIC_on(amt) ((amt)->flags |= AMTf_AMAGIC)
+#define AMT_AMAGIC_off(amt) ((amt)->flags &= ~AMTf_AMAGIC)
+
enum {
fallback_amg, abs_amg,
bool__amg, nomethod_amg,
diff --git a/perly.c b/perly.c
index 6ff2f58731..f8a16687b0 100644
--- a/perly.c
+++ b/perly.c
@@ -15,937 +15,912 @@ dep()
#line 16 "perly.c"
#define YYERRCODE 256
short yylhs[] = { -1,
- 40, 0, 7, 5, 8, 6, 9, 9, 9, 10,
- 10, 10, 10, 22, 22, 22, 22, 22, 22, 13,
- 13, 13, 12, 12, 37, 37, 11, 11, 11, 11,
- 11, 11, 11, 24, 24, 25, 25, 26, 27, 28,
- 29, 30, 39, 39, 1, 1, 1, 1, 3, 3,
- 41, 41, 36, 36, 4, 42, 42, 43, 14, 14,
- 14, 23, 23, 23, 34, 34, 34, 34, 34, 34,
- 34, 34, 35, 35, 15, 15, 15, 15, 15, 15,
- 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
- 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
- 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
- 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
- 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
- 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
- 15, 15, 15, 15, 15, 15, 15, 15, 31, 31,
- 32, 32, 32, 2, 2, 38, 21, 16, 17, 18,
- 19, 20, 33, 33, 33, 33,
+ 45, 0, 9, 7, 10, 8, 11, 11, 11, 12,
+ 12, 12, 12, 24, 24, 24, 24, 24, 24, 15,
+ 15, 15, 14, 14, 42, 42, 13, 13, 13, 13,
+ 13, 13, 13, 26, 26, 27, 27, 28, 29, 30,
+ 31, 32, 44, 44, 1, 1, 1, 1, 3, 38,
+ 38, 46, 4, 5, 6, 39, 40, 40, 41, 41,
+ 47, 47, 49, 48, 16, 16, 16, 25, 25, 25,
+ 36, 36, 36, 36, 36, 36, 36, 50, 36, 37,
+ 37, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+ 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+ 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+ 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+ 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+ 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+ 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+ 17, 17, 17, 17, 17, 33, 33, 34, 34, 34,
+ 2, 2, 43, 23, 18, 19, 20, 21, 22, 35,
+ 35, 35, 35,
};
short yylen[] = { 2,
0, 2, 4, 0, 4, 0, 0, 2, 2, 2,
1, 2, 3, 1, 1, 3, 3, 3, 3, 0,
2, 6, 7, 7, 0, 2, 8, 8, 10, 9,
8, 11, 3, 0, 1, 0, 1, 1, 1, 1,
- 1, 1, 0, 1, 1, 1, 1, 1, 4, 3,
- 5, 5, 0, 1, 0, 3, 2, 6, 3, 3,
- 1, 2, 3, 1, 3, 5, 6, 3, 5, 2,
- 4, 4, 1, 1, 3, 3, 3, 3, 3, 3,
- 3, 3, 3, 3, 3, 3, 5, 3, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 3, 2,
- 3, 2, 4, 3, 4, 1, 5, 1, 4, 5,
- 4, 1, 1, 1, 5, 6, 5, 6, 5, 4,
- 5, 1, 1, 3, 4, 3, 2, 2, 4, 5,
- 4, 5, 1, 2, 2, 1, 2, 2, 2, 1,
- 3, 1, 3, 4, 4, 6, 1, 1, 0, 1,
- 0, 1, 2, 1, 1, 1, 2, 2, 2, 2,
- 2, 2, 1, 1, 1, 1,
+ 1, 1, 0, 1, 1, 1, 1, 1, 4, 1,
+ 0, 5, 0, 0, 0, 1, 0, 1, 1, 1,
+ 3, 2, 0, 7, 3, 3, 1, 2, 3, 1,
+ 3, 5, 6, 3, 5, 2, 4, 0, 5, 1,
+ 1, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 5, 3, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 3, 2, 3, 2, 4,
+ 3, 4, 1, 5, 1, 4, 5, 4, 1, 1,
+ 1, 5, 6, 5, 6, 5, 4, 5, 1, 1,
+ 3, 4, 3, 2, 2, 4, 5, 4, 5, 1,
+ 2, 2, 1, 2, 2, 2, 1, 3, 1, 3,
+ 4, 4, 6, 1, 1, 0, 1, 0, 1, 2,
+ 1, 1, 1, 2, 2, 2, 2, 2, 2, 1,
+ 1, 1, 1,
};
short yydefred[] = { 1,
- 0, 7, 0, 44, 55, 55, 0, 55, 8, 45,
- 9, 11, 0, 46, 47, 48, 0, 0, 0, 57,
- 0, 14, 4, 147, 0, 0, 122, 0, 142, 0,
- 55, 55, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 154, 155, 0,
+ 0, 7, 0, 44, 55, 53, 0, 53, 8, 45,
+ 9, 11, 0, 46, 47, 48, 0, 0, 0, 62,
+ 63, 14, 4, 154, 0, 0, 129, 0, 149, 0,
+ 54, 54, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 161, 162, 0,
0, 0, 0, 0, 0, 0, 0, 12, 0, 0,
0, 0, 0, 0, 0, 0, 0, 10, 0, 0,
- 0, 0, 112, 114, 0, 0, 0, 0, 148, 0,
- 50, 0, 56, 0, 7, 163, 166, 165, 164, 0,
- 0, 0, 0, 0, 0, 4, 4, 4, 4, 4,
- 4, 0, 0, 0, 0, 0, 137, 0, 0, 0,
- 0, 70, 0, 161, 0, 128, 0, 0, 0, 0,
- 0, 157, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 102, 0, 158, 159, 160, 162, 0, 0,
- 33, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 119, 121, 0, 0, 0, 0, 155, 50,
+ 0, 56, 0, 61, 0, 7, 170, 173, 172, 171,
+ 0, 0, 0, 0, 0, 0, 4, 4, 4, 4,
+ 4, 4, 0, 0, 0, 0, 0, 144, 0, 0,
+ 0, 0, 76, 0, 168, 0, 135, 0, 0, 0,
+ 0, 0, 164, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 109, 0, 165, 166, 167, 169, 0,
+ 0, 33, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 94, 95, 0, 0, 0, 0, 0, 0,
- 0, 0, 13, 0, 49, 54, 0, 0, 0, 68,
+ 0, 0, 0, 101, 102, 0, 0, 0, 0, 0,
+ 0, 0, 0, 13, 0, 49, 58, 0, 0, 0,
+ 74, 0, 0, 78, 0, 0, 0, 0, 0, 0,
+ 0, 4, 148, 150, 0, 0, 0, 0, 0, 0,
+ 0, 111, 0, 133, 0, 0, 108, 26, 0, 0,
+ 19, 0, 0, 0, 65, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 4, 141, 143, 0, 0, 0, 0, 0, 0, 0,
- 104, 0, 126, 0, 0, 101, 26, 0, 0, 19,
- 0, 0, 0, 59, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 73, 0, 74, 0, 0, 0, 0, 0, 0, 0,
- 124, 0, 0, 52, 51, 0, 3, 0, 145, 0,
- 72, 105, 0, 41, 0, 42, 0, 0, 0, 0,
- 156, 0, 0, 35, 40, 0, 0, 0, 144, 153,
- 71, 0, 129, 0, 131, 0, 103, 0, 0, 0,
- 0, 0, 0, 0, 111, 0, 109, 0, 120, 0,
- 125, 58, 69, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 66, 130, 132, 119, 0, 117, 0, 0,
- 110, 0, 115, 121, 107, 146, 6, 0, 0, 0,
- 0, 0, 0, 0, 0, 118, 116, 67, 7, 27,
- 28, 0, 0, 23, 24, 0, 31, 0, 0, 0,
- 21, 0, 0, 0, 30, 5, 0, 29, 0, 0,
- 32, 0, 22,
+ 0, 80, 0, 81, 0, 0, 0, 0, 0, 0,
+ 0, 131, 0, 0, 60, 59, 52, 0, 3, 0,
+ 152, 0, 0, 112, 0, 41, 0, 42, 0, 0,
+ 0, 0, 163, 0, 0, 35, 40, 0, 0, 0,
+ 151, 160, 77, 0, 136, 0, 138, 0, 110, 0,
+ 0, 0, 0, 0, 0, 0, 118, 0, 116, 0,
+ 127, 0, 132, 0, 75, 0, 79, 0, 0, 0,
+ 0, 0, 0, 0, 0, 72, 137, 139, 126, 0,
+ 124, 0, 0, 117, 0, 122, 128, 114, 64, 153,
+ 6, 0, 0, 0, 0, 0, 0, 0, 0, 125,
+ 123, 73, 7, 27, 28, 0, 0, 23, 24, 0,
+ 31, 0, 0, 0, 21, 0, 0, 0, 30, 5,
+ 0, 29, 0, 0, 32, 0, 22,
};
short yydgoto[] = { 1,
- 9, 66, 10, 17, 85, 329, 88, 318, 3, 11,
- 12, 68, 334, 258, 70, 71, 72, 73, 74, 75,
- 76, 264, 78, 265, 254, 256, 259, 267, 255, 257,
- 112, 196, 90, 79, 234, 177, 141, 262, 13, 2,
- 14, 15, 16,
+ 9, 66, 10, 18, 95, 17, 86, 333, 89, 322,
+ 3, 11, 12, 68, 338, 260, 70, 71, 72, 73,
+ 74, 75, 76, 266, 78, 267, 256, 258, 261, 269,
+ 257, 259, 113, 197, 91, 79, 235, 81, 83, 178,
+ 247, 142, 264, 13, 2, 14, 15, 16, 85, 253,
};
short yysindex[] = { 0,
- 0, 0, 236, 0, 0, 0, -45, 0, 0, 0,
- 0, 0, 557, 0, 0, 0, -106, -232, -20, 0,
- -216, 0, 0, 0, -8, -8, 0, 9, 0, 1840,
- 0, 0, 11, 15, 19, 22, -33, 1840, 38, 47,
- 51, 933, 877, -8, 996, 1260, -212, 0, 0, -8,
- 1840, 1840, 1840, 1840, 1840, 1840, 1316, 0, 1840, 1840,
- 1372, -8, -8, -8, -8, 1840, -193, 0, 273, 3713,
- -67, -55, 0, 0, -26, 72, 57, 59, 0, 3,
- 0, -137, 0, -130, 0, 0, 0, 0, 0, 1840,
- 96, 1840, 1871, 3, -137, 0, 0, 0, 0, 0,
- 0, 97, 3713, 99, 1431, 877, 0, 1871, 0, -67,
- 59, 0, 1840, 0, 106, 0, 1871, -25, 27, 52,
- 1840, 0, 59, 98, 98, 98, -85, -85, 74, -40,
- 98, 98, 0, -88, 0, 0, 0, 0, 1871, 3,
- 0, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840,
- 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840,
- 1840, 1840, 0, 0, -34, 1840, 1840, 1840, 1840, 1840,
- 1840, 1606, 0, 1840, 0, 0, -51, 1840, 242, 0,
- 1840, 1089, 1840, 3, 1840, 1840, 1840, 1840, 130, 1665,
- 0, 0, 0, -30, 44, 126, 1840, 59, 1721, 1777,
- 0, 53, 0, 1840, 79, 0, 0, -244, -244, 0,
- -244, -244, -127, 0, 54, 1027, 1871, 756, 360, 869,
- 3713, 3679, 3540, 3764, 1195, 340, 1054, 98, 98, 1840,
- 0, 1840, 0, 134, -83, 58, -75, 60, -71, 62,
- 0, -18, 3713, 0, 0, 117, 0, 138, 0, 1840,
- 0, 0, -244, 0, 139, 0, 140, -244, 141, 142,
- 0, 145, 273, 0, 0, 149, 136, 1840, 0, 0,
- 0, -15, 0, 40, 0, 42, 0, -59, 1840, 68,
- 1840, 85, 46, 1840, 0, 75, 0, 77, 0, 80,
- 0, 0, 0, 1143, 84, 84, 84, 84, 1840, 84,
- 1840, 167, 0, 0, 0, 0, 95, 0, 263, 86,
- 0, 172, 0, 0, 0, 0, 0, -193, -193, -177,
- -177, 175, -193, 159, 84, 0, 0, 0, 0, 0,
- 0, 84, 194, 0, 0, 84, 0, 1665, -193, 256,
- 0, 1840, -193, 191, 0, 0, 196, 0, 84, 84,
- 0, -177, 0,
+ 0, 0, -126, 0, 0, 0, -58, 0, 0, 0,
+ 0, 0, 827, 0, 0, 0, -242, -235, -21, 0,
+ 0, 0, 0, 0, -33, -33, 0, 11, 0, 1816,
+ 0, 0, 13, 15, 30, 45, -29, 1816, 67, 68,
+ 70, 1002, 939, -33, 1236, 1292, -227, 0, 0, -33,
+ 1816, 1816, 1816, 1816, 1816, 1816, 1173, 0, 1816, 1816,
+ 1348, -33, -33, -33, -33, 1816, -220, 0, -169, 3558,
+ -78, -59, 0, 0, -62, 73, 42, 65, 0, 0,
+ -5, 0, -149, 0, -134, 0, 0, 0, 0, 0,
+ 1816, 97, 1816, 1847, -5, -149, 0, 0, 0, 0,
+ 0, 0, 99, 3558, 105, 1407, 939, 0, 1847, 0,
+ -78, 65, 0, 1816, 0, 107, 0, 1847, -23, 36,
+ -51, 1816, 0, 65, -82, -82, -82, -54, -54, 57,
+ -27, -82, -82, 0, -87, 0, 0, 0, 0, 1847,
+ -5, 0, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816,
+ 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816,
+ 1816, 1816, 1816, 0, 0, -32, 1816, 1816, 1816, 1816,
+ 1816, 1816, 1582, 0, 1816, 0, 0, -36, -108, 665,
+ 0, 1816, 209, 0, -5, 1816, 1816, 1816, 1816, 114,
+ 1641, 0, 0, 0, -16, 6, 111, 1816, 65, 1697,
+ 1753, 0, 38, 0, 1816, 74, 0, 0, -251, -251,
+ 0, -251, -251, -131, 0, 18, 3516, 1847, 1089, 382,
+ 92, 3558, 3594, 3689, 369, 1060, 482, 285, -82, -82,
+ 1816, 0, 1816, 0, 128, 33, 23, 58, 25, 69,
+ 27, 0, -14, 3558, 0, 0, 0, 1816, 0, 131,
+ 0, 1816, 1816, 0, -251, 0, 134, 0, 136, -251,
+ 139, 141, 0, 144, -169, 0, 0, 156, 135, 1816,
+ 0, 0, 0, -12, 0, -10, 0, 1, 0, 71,
+ 1816, 75, 1816, 29, 86, 1816, 0, 76, 0, 78,
+ 0, 81, 0, 148, 0, 339, 0, 85, 85, 85,
+ 85, 1816, 85, 1816, 168, 0, 0, 0, 0, 88,
+ 0, 3653, 89, 0, 172, 0, 0, 0, 0, 0,
+ 0, -220, -220, -178, -178, 175, -220, 160, 85, 0,
+ 0, 0, 0, 0, 0, 85, 203, 0, 0, 85,
+ 0, 1641, -220, 688, 0, 1816, -220, 180, 0, 0,
+ 196, 0, 85, 85, 0, -178, 0,
};
short yyrindex[] = { 0,
- 0, 0, 161, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 269, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 122, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 2076, 1906, 0,
+ 0, 2716, 2784, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 2100, 1930, 0,
- 0, 2740, 2808, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 79, 0, -7, 181,
+ 2827, 2871, 0, 0, 2142, 1965, 0, 21, 0, 0,
+ 0, 0, -31, 0, 0, 0, 0, 0, 0, 0,
+ 2201, 0, 0, 3299, 0, 129, 0, 0, 0, 0,
+ 0, 0, 0, 197, 0, 0, 213, 0, 3343, 444,
+ 545, 2312, 0, 0, 0, 2028, 0, 3386, 2827, 0,
+ 0, 2201, 0, 2437, 2914, 2952, 2990, 606, 723, 2480,
+ 0, 3063, 3107, 0, 0, 0, 0, 0, 0, 3424,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 37, 0, -9, 3616,
- 2851, 2895, 0, 0, 2166, 1989, 0, 17, 0, 0,
- 0, -39, 0, 0, 0, 0, 0, 0, 0, 2225,
- 0, 0, 3367, 0, 112, 0, 0, 0, 0, 0,
- 0, 0, 3635, 0, 0, 215, 0, 3410, 437, 498,
- 2336, 0, 0, 0, 2052, 0, 3448, 2851, 0, 0,
- 2225, 0, 2461, 2938, 2976, 3014, -28, 600, 2504, 0,
- 3087, 3131, 0, 0, 0, 0, 0, 0, 3486, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 2548, 0, 0, 0, 0, 883,
+ 0, 213, 0, 0, 0, 234, 0, 0, 0, 0,
+ 218, 0, 0, 0, 0, 239, 0, 0, 2591, 0,
+ 0, 0, 0, 0, 0, 2635, 0, 0, -2, 8,
+ 0, 22, 24, 525, 0, 0, 3579, 1448, 1504, 3226,
+ -39, 338, 0, 2490, 3535, 3498, 3462, 3262, 3150, 3188,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 2572, 0, 0, 0, 205, 821, 0,
- 215, 0, 2225, 0, 245, 0, 0, 0, 0, 240,
- 0, 0, 0, 0, 272, 0, 0, 2615, 0, 0,
- 0, 0, 0, 0, 2659, 0, 0, 5, 45, 0,
- 49, 61, -32, 0, 0, 192, 1472, 1528, 3250, 3286,
- 3645, 0, 2514, 3603, 3559, 3522, 3323, 3174, 3212, 0,
+ 0, 0, 0, 1870, 0, 0, 0, 230, 0, 0,
+ 0, 0, 2201, 0, 37, 0, 0, 0, 0, 251,
+ 0, 0, 0, 0, 61, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 3675, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 65, 0, 0, 0, 0, 277, 0, 0,
- 0, 0, 66, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 213, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 215, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 238, 0, 0, 0, 0, 0, 0,
+ 0, 718, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 79, 79, 153, 153, 0, 79, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 265, 0, 0, 0, 0, 0, 0, 0, 1894, 0,
- 0, 0, 0, 0, 0, 0, 0, 37, 37, 105,
- 105, 0, 37, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 286, 37, 821,
- 0, 0, 37, 0, 0, 0, 0, 0, 0, 0,
- 0, 105, 0,
+ 0, 260, 79, 883, 0, 0, 79, 0, 0, 0,
+ 0, 0, 0, 0, 0, 153, 0,
};
short yygindex[] = { 0,
- 0, 0, 0, 63, 418, 0, 914, 335, -81, 0,
- 0, 0, -292, -13, 3885, 2516, 0, 0, 0, 0,
- 0, 321, 530, 0, 0, 203, -150, -3, 93, 165,
- -69, -162, 575, 0, 0, 300, -276, 0, 0, 0,
- 0, 0, 0,
+ 0, 0, 0, 300, 278, 0, -26, 0, 892, 1004,
+ -76, 0, 0, 0, -313, -13, 3871, 3724, 0, 0,
+ 0, 0, 0, 304, -25, 0, 0, 169, -175, -8,
+ 53, 152, 384, -161, 901, 0, 0, 0, 0, 281,
+ 0, -287, 0, 0, 0, 0, 0, 0, 0, 0,
};
-#define YYTABLESIZE 4166
+#define YYTABLESIZE 4154
short yytable[] = { 69,
- 205, 62, 62, 179, 206, 166, 101, 244, 60, 285,
- 269, 60, 96, 20, 200, 96, 23, 287, 248, 53,
- 180, 289, 291, 168, 82, 303, 60, 62, 335, 96,
- 96, 15, 120, 306, 96, 170, 25, 148, 83, 266,
- 84, 330, 331, 130, 121, 18, 337, 134, 92, 15,
- 96, 203, 146, 147, 97, 167, 232, 61, 98, 353,
- 60, 99, 345, 18, 96, 168, 348, 169, 18, 25,
- 21, 23, 25, 25, 25, 61, 25, 104, 25, 25,
- 304, 25, 305, 53, 140, 38, 105, 270, 230, 16,
- 106, 194, 195, 94, 95, 25, 171, 167, 332, 333,
- 25, 17, 174, 38, 20, 37, 39, 16, 246, 61,
- 202, 172, 280, 251, 23, 173, 286, 302, 288, 17,
- 290, 312, 176, 37, 15, 23, 178, 25, 208, 209,
- 211, 212, 213, 214, 215, 181, 191, 20, 311, 192,
- 20, 20, 20, 310, 20, 199, 20, 20, 322, 20,
- 80, 201, 235, 236, 237, 238, 239, 240, 242, 25,
- 2, 25, 25, 20, 204, 62, 271, 195, 20, 279,
- 147, 253, 209, 284, 209, 292, 263, 277, 293, 295,
- 296, 297, 298, 272, 299, 274, 276, 326, 166, 300,
- 278, 347, 308, 43, 301, 20, 43, 43, 43, 313,
- 43, 314, 43, 43, 315, 43, 317, 325, 146, 147,
- 327, 19, 328, 146, 147, 336, 282, 338, 283, 43,
- 148, 146, 147, 231, 43, 146, 147, 20, 165, 20,
- 20, 349, 84, 342, 53, 84, 350, 146, 147, 60,
- 60, 60, 60, 96, 96, 96, 96, 340, 86, 84,
- 84, 43, 96, 87, 84, 151, 146, 147, 96, 96,
- 96, 96, 100, 149, 60, 307, 146, 147, 96, 96,
- 195, 96, 96, 96, 96, 96, 96, 96, 146, 147,
- 96, 146, 147, 43, 84, 36, 43, 253, 61, 61,
- 61, 61, 25, 25, 25, 25, 25, 25, 34, 25,
- 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
- 25, 25, 152, 61, 61, 25, 25, 39, 25, 25,
- 25, 25, 25, 36, 69, 155, 34, 25, 25, 25,
- 25, 25, 25, 77, 344, 25, 146, 147, 146, 147,
- 146, 147, 146, 147, 25, 210, 25, 25, 146, 147,
- 146, 147, 260, 166, 146, 147, 146, 147, 146, 147,
- 20, 20, 20, 20, 20, 20, 247, 20, 20, 20,
- 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
- 346, 146, 147, 20, 20, 148, 20, 20, 20, 20,
- 20, 146, 147, 324, 184, 20, 20, 20, 20, 20,
- 20, 0, 0, 20, 0, 0, 162, 0, 0, 163,
- 164, 165, 20, 0, 20, 20, 43, 43, 43, 43,
- 43, 43, 0, 43, 43, 43, 0, 0, 0, 43,
- 166, 0, 43, 43, 43, 43, 0, 0, 0, 43,
- 43, 0, 43, 43, 43, 43, 43, 0, 0, 0,
- 166, 43, 43, 43, 43, 43, 43, 0, 0, 43,
- 0, 0, 148, 84, 84, 84, 84, 0, 43, 163,
- 43, 43, 163, 163, 163, 0, 163, 147, 163, 163,
- 147, 163, 148, 0, 0, 0, 0, 0, 84, 84,
- 0, 84, 0, 0, 147, 147, 0, 0, 0, 147,
- 163, 4, 5, 6, 0, 7, 8, 4, 5, 6,
- 0, 7, 8, 185, 186, 187, 188, 189, 190, 0,
- 0, 4, 5, 6, 0, 7, 8, 147, 0, 147,
- 164, 0, 0, 164, 164, 164, 0, 164, 106, 164,
- 164, 106, 164, 149, 142, 143, 144, 145, 0, 150,
- 151, 152, 153, 0, 0, 106, 106, 0, 0, 147,
- 106, 164, 163, 156, 157, 158, 159, 160, 161, 146,
- 147, 162, 111, 0, 163, 164, 165, 0, 0, 0,
- 123, 0, 0, 0, 0, 0, 0, 0, 0, 52,
- 106, 0, 62, 64, 50, 0, 57, 0, 65, 60,
- 91, 59, 0, 0, 0, 0, 0, 0, 268, 0,
- 0, 0, 0, 0, 0, 58, 0, 113, 114, 111,
- 63, 0, 0, 164, 122, 0, 150, 151, 152, 153,
- 319, 320, 321, 0, 323, 0, 135, 136, 137, 138,
- 97, 0, 198, 97, 160, 161, 0, 61, 162, 0,
- 111, 163, 164, 165, 0, 0, 0, 97, 97, 339,
- 0, 0, 97, 0, 0, 161, 341, 0, 162, 0,
- 343, 163, 164, 165, 0, 0, 0, 0, 0, 23,
- 197, 0, 53, 351, 352, 0, 0, 0, 0, 0,
- 0, 0, 97, 163, 163, 163, 163, 163, 0, 163,
- 163, 163, 0, 0, 0, 163, 0, 111, 147, 147,
- 147, 147, 111, 0, 0, 0, 163, 147, 163, 163,
- 163, 163, 163, 147, 147, 147, 147, 163, 163, 163,
- 163, 163, 163, 147, 147, 163, 147, 147, 147, 147,
- 147, 147, 147, 0, 163, 147, 163, 163, 147, 147,
- 147, 0, 0, 0, 164, 164, 164, 164, 164, 0,
- 164, 164, 164, 0, 0, 0, 164, 0, 0, 106,
- 106, 106, 106, 0, 0, 0, 0, 164, 106, 164,
- 164, 164, 164, 164, 106, 106, 106, 106, 164, 164,
- 164, 164, 164, 164, 106, 106, 164, 106, 106, 106,
- 106, 106, 106, 106, 0, 164, 106, 164, 164, 106,
- 106, 106, 22, 24, 25, 26, 27, 28, 0, 29,
- 30, 31, 0, 0, 0, 32, 0, 0, 33, 34,
- 35, 36, 0, 0, 0, 37, 38, 0, 39, 40,
- 41, 42, 43, 0, 0, 0, 166, 44, 45, 46,
- 47, 48, 49, 43, 0, 51, 43, 43, 43, 0,
- 43, 0, 43, 43, 54, 43, 55, 56, 0, 0,
- 0, 97, 97, 97, 97, 0, 0, 0, 148, 43,
- 97, 0, 0, 0, 43, 0, 97, 97, 97, 97,
- 0, 0, 0, 0, 0, 0, 97, 97, 0, 97,
- 97, 97, 97, 97, 97, 97, 0, 0, 97, 52,
- 0, 43, 62, 64, 50, 0, 57, 0, 65, 60,
- 0, 59, 0, 0, 0, 0, 67, 0, 0, 0,
- 81, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 63, 0, 0, 43, 0, 0, 43, 0, 0, 0,
- 0, 0, 0, 0, 0, 107, 0, 0, 116, 166,
- 0, 0, 0, 0, 0, 52, 0, 61, 62, 64,
- 50, 0, 57, 0, 65, 60, 0, 59, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 148, 0, 175, 0, 0, 63, 0, 0, 23,
- 0, 0, 53, 0, 0, 0, 0, 183, 0, 0,
+ 20, 85, 62, 62, 85, 207, 62, 203, 167, 180,
+ 102, 339, 169, 206, 80, 268, 201, 112, 85, 85,
+ 250, 82, 245, 85, 271, 124, 293, 57, 306, 122,
+ 307, 171, 121, 15, 334, 335, 167, 84, 18, 341,
+ 149, 308, 357, 131, 168, 147, 148, 135, 38, 272,
+ 93, 15, 97, 85, 98, 349, 18, 141, 233, 352,
+ 172, 67, 16, 170, 17, 112, 38, 169, 149, 99,
+ 186, 187, 188, 189, 190, 191, 282, 37, 25, 67,
+ 16, 288, 17, 290, 100, 292, 23, 313, 199, 23,
+ 231, 57, 195, 196, 305, 37, 112, 336, 337, 168,
+ 174, 39, 143, 144, 145, 146, 105, 106, 175, 107,
+ 177, 25, 173, 67, 25, 25, 25, 23, 25, 15,
+ 25, 25, 179, 25, 315, 287, 326, 147, 148, 209,
+ 210, 212, 213, 214, 215, 216, 182, 25, 192, 4,
+ 5, 6, 25, 7, 8, 193, 200, 205, 248, 62,
+ 289, 273, 20, 236, 237, 238, 239, 240, 241, 243,
+ 202, 291, 279, 309, 281, 270, 148, 286, 196, 25,
+ 351, 295, 255, 210, 298, 210, 299, 265, 314, 300,
+ 330, 301, 167, 302, 274, 20, 276, 278, 20, 20,
+ 20, 280, 20, 304, 20, 20, 303, 20, 19, 311,
+ 316, 25, 317, 25, 25, 318, 319, 321, 329, 147,
+ 148, 20, 332, 331, 149, 340, 20, 284, 342, 285,
+ 353, 70, 112, 87, 70, 232, 163, 112, 88, 164,
+ 165, 166, 85, 85, 85, 85, 354, 141, 70, 70,
+ 141, 85, 346, 20, 51, 147, 148, 85, 85, 251,
+ 85, 57, 252, 158, 141, 141, 344, 85, 85, 166,
+ 85, 85, 85, 85, 85, 85, 101, 310, 2, 147,
+ 148, 156, 196, 70, 36, 20, 34, 20, 20, 159,
+ 147, 148, 147, 148, 147, 148, 147, 148, 156, 141,
+ 255, 39, 67, 67, 67, 67, 36, 147, 148, 167,
+ 34, 43, 147, 148, 43, 43, 43, 21, 43, 96,
+ 43, 43, 211, 43, 147, 148, 77, 67, 67, 147,
+ 148, 147, 148, 147, 148, 147, 148, 43, 69, 147,
+ 148, 149, 43, 348, 25, 25, 25, 25, 25, 25,
+ 262, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 147, 148, 328, 25, 25, 43,
+ 25, 25, 25, 25, 25, 147, 148, 147, 148, 25,
+ 25, 25, 25, 25, 25, 167, 185, 25, 82, 320,
+ 153, 82, 147, 148, 147, 148, 25, 0, 25, 25,
+ 0, 43, 0, 0, 43, 82, 82, 162, 0, 0,
+ 163, 156, 0, 164, 165, 166, 0, 149, 20, 20,
+ 20, 20, 20, 20, 0, 20, 20, 20, 20, 20,
+ 20, 20, 20, 20, 20, 20, 20, 20, 0, 167,
+ 82, 20, 20, 0, 20, 20, 20, 20, 20, 0,
+ 0, 0, 0, 20, 20, 20, 20, 20, 20, 0,
+ 0, 20, 70, 70, 70, 70, 0, 0, 0, 167,
+ 20, 149, 20, 20, 0, 0, 0, 0, 141, 141,
+ 141, 141, 167, 0, 181, 0, 170, 70, 70, 170,
+ 170, 170, 0, 170, 154, 170, 170, 154, 170, 150,
+ 0, 149, 0, 141, 141, 151, 152, 153, 154, 0,
+ 0, 154, 154, 0, 149, 204, 154, 170, 155, 157,
+ 158, 159, 160, 161, 162, 0, 0, 163, 0, 0,
+ 164, 165, 166, 0, 43, 43, 43, 43, 43, 43,
+ 0, 43, 43, 43, 154, 0, 154, 43, 0, 0,
+ 43, 43, 43, 43, 0, 0, 0, 43, 43, 0,
+ 43, 43, 43, 43, 43, 0, 0, 0, 0, 43,
+ 43, 43, 43, 43, 43, 66, 154, 43, 66, 170,
+ 0, 0, 167, 153, 154, 0, 43, 171, 43, 43,
+ 171, 171, 171, 66, 171, 113, 171, 171, 113, 171,
+ 162, 0, 0, 163, 0, 0, 164, 165, 166, 0,
+ 0, 0, 113, 113, 149, 0, 0, 113, 171, 82,
+ 82, 82, 82, 0, 0, 0, 0, 66, 0, 150,
+ 0, 0, 0, 0, 0, 151, 152, 153, 154, 0,
+ 0, 294, 0, 0, 82, 82, 297, 113, 155, 157,
+ 158, 159, 160, 161, 162, 0, 103, 163, 0, 103,
+ 164, 165, 166, 0, 0, 151, 152, 153, 154, 0,
+ 0, 0, 0, 103, 103, 0, 0, 0, 103, 0,
+ 171, 159, 160, 161, 162, 0, 0, 163, 0, 0,
+ 164, 165, 166, 0, 0, 0, 0, 162, 0, 0,
+ 163, 0, 0, 164, 165, 166, 0, 0, 103, 0,
+ 170, 170, 170, 170, 170, 0, 170, 170, 170, 0,
+ 0, 0, 170, 0, 0, 154, 154, 154, 154, 0,
+ 0, 0, 0, 170, 154, 170, 170, 170, 170, 170,
+ 154, 154, 154, 154, 170, 170, 170, 170, 170, 170,
+ 154, 154, 170, 154, 154, 154, 154, 154, 154, 154,
+ 0, 170, 154, 170, 170, 154, 154, 154, 94, 0,
+ 0, 94, 0, 104, 0, 0, 104, 0, 151, 152,
+ 153, 154, 0, 0, 0, 94, 94, 0, 0, 0,
+ 104, 104, 0, 0, 0, 104, 161, 162, 0, 249,
+ 163, 0, 0, 164, 165, 166, 66, 66, 66, 66,
+ 0, 171, 171, 171, 171, 171, 0, 171, 171, 171,
+ 94, 0, 350, 171, 0, 104, 113, 113, 113, 113,
+ 0, 66, 0, 0, 171, 113, 171, 171, 171, 171,
+ 171, 113, 113, 113, 113, 171, 171, 171, 171, 171,
+ 171, 113, 113, 171, 113, 113, 113, 113, 113, 113,
+ 113, 0, 171, 113, 171, 171, 113, 113, 113, 52,
+ 0, 0, 62, 64, 50, 0, 57, 0, 65, 60,
+ 0, 59, 0, 0, 0, 0, 0, 103, 103, 103,
+ 103, 0, 0, 0, 0, 58, 103, 0, 0, 0,
+ 63, 0, 103, 103, 103, 103, 0, 0, 0, 0,
+ 0, 0, 103, 103, 67, 103, 103, 103, 103, 103,
+ 103, 103, 0, 0, 103, 43, 0, 61, 43, 43,
+ 43, 0, 43, 0, 43, 43, 92, 43, 0, 0,
+ 4, 5, 6, 108, 7, 8, 117, 0, 0, 0,
+ 0, 43, 0, 114, 115, 0, 43, 0, 0, 23,
+ 123, 0, 53, 4, 5, 6, 0, 7, 8, 0,
+ 0, 0, 136, 137, 138, 139, 0, 0, 0, 0,
+ 0, 52, 176, 43, 62, 64, 50, 0, 57, 0,
+ 65, 60, 0, 59, 0, 0, 184, 0, 0, 94,
+ 94, 94, 94, 0, 104, 104, 104, 104, 0, 0,
+ 0, 0, 63, 104, 0, 43, 0, 198, 43, 104,
+ 104, 104, 104, 0, 94, 94, 0, 94, 0, 104,
+ 104, 0, 104, 104, 104, 104, 104, 104, 104, 61,
+ 0, 104, 208, 0, 52, 0, 0, 62, 64, 50,
+ 0, 57, 0, 65, 60, 0, 59, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 61, 0, 0, 0, 0, 52, 0,
- 0, 62, 64, 50, 0, 57, 0, 65, 60, 0,
- 59, 0, 150, 0, 152, 153, 0, 0, 0, 0,
- 0, 0, 0, 207, 0, 23, 0, 0, 53, 63,
- 160, 161, 0, 0, 162, 0, 0, 163, 164, 165,
- 0, 0, 0, 0, 0, 0, 43, 43, 43, 43,
- 43, 43, 0, 43, 43, 43, 61, 0, 0, 43,
- 245, 0, 43, 43, 43, 43, 0, 252, 0, 43,
- 43, 0, 43, 43, 43, 43, 43, 0, 0, 0,
- 0, 43, 43, 43, 43, 43, 43, 166, 23, 43,
- 0, 53, 0, 0, 0, 0, 0, 0, 43, 249,
- 43, 43, 250, 109, 25, 26, 27, 28, 87, 29,
- 30, 31, 0, 0, 166, 32, 0, 0, 0, 148,
- 0, 155, 0, 0, 0, 0, 38, 152, 39, 40,
+ 0, 23, 0, 0, 53, 63, 0, 0, 0, 246,
+ 0, 0, 0, 0, 0, 0, 254, 0, 0, 0,
+ 0, 0, 22, 24, 25, 26, 27, 28, 0, 29,
+ 30, 31, 61, 0, 0, 32, 0, 0, 33, 34,
+ 35, 36, 0, 0, 0, 37, 38, 0, 39, 40,
41, 42, 43, 0, 0, 0, 0, 44, 45, 46,
- 47, 48, 49, 0, 161, 51, 148, 162, 0, 166,
- 163, 164, 165, 316, 54, 0, 55, 56, 0, 24,
- 25, 26, 27, 28, 0, 29, 30, 31, 0, 0,
- 0, 32, 0, 0, 0, 155, 0, 0, 0, 0,
- 0, 148, 38, 0, 39, 40, 41, 42, 43, 0,
+ 47, 48, 49, 0, 23, 51, 0, 53, 0, 0,
+ 0, 0, 0, 0, 54, 0, 55, 56, 43, 43,
+ 43, 43, 43, 43, 0, 43, 43, 43, 0, 0,
+ 167, 43, 0, 0, 43, 43, 43, 43, 0, 0,
+ 0, 43, 43, 0, 43, 43, 43, 43, 43, 0,
+ 0, 0, 0, 43, 43, 43, 43, 43, 43, 167,
+ 0, 43, 149, 0, 0, 0, 0, 0, 0, 0,
+ 43, 0, 43, 43, 0, 110, 25, 26, 27, 28,
+ 88, 29, 30, 31, 0, 52, 0, 32, 62, 64,
+ 50, 149, 57, 130, 65, 60, 0, 59, 38, 0,
+ 39, 40, 41, 42, 43, 0, 0, 0, 0, 44,
+ 45, 46, 47, 48, 49, 0, 63, 51, 0, 0,
+ 0, 0, 0, 0, 0, 0, 54, 0, 55, 56,
+ 0, 0, 0, 0, 0, 0, 0, 0, 24, 25,
+ 26, 27, 28, 61, 29, 30, 31, 0, 52, 0,
+ 32, 62, 64, 50, 0, 57, 0, 65, 60, 0,
+ 59, 38, 0, 39, 40, 41, 42, 43, 0, 0,
+ 0, 0, 44, 45, 46, 47, 48, 49, 53, 63,
+ 51, 0, 323, 324, 325, 0, 327, 0, 0, 54,
+ 0, 55, 56, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 52, 0, 61, 62, 64, 50,
+ 0, 57, 343, 65, 60, 0, 59, 0, 0, 345,
+ 0, 0, 0, 347, 0, 0, 151, 152, 153, 154,
+ 120, 0, 0, 0, 0, 63, 355, 356, 23, 0,
+ 0, 53, 0, 160, 161, 162, 0, 0, 163, 0,
+ 0, 164, 165, 166, 0, 151, 0, 153, 154, 0,
+ 52, 0, 61, 62, 64, 50, 0, 57, 0, 65,
+ 60, 0, 59, 161, 162, 0, 0, 163, 0, 0,
+ 164, 165, 166, 0, 0, 0, 0, 0, 0, 0,
+ 0, 63, 0, 0, 0, 0, 0, 53, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 24,
+ 25, 26, 27, 28, 0, 29, 30, 31, 61, 52,
+ 134, 32, 62, 64, 50, 0, 57, 194, 65, 60,
+ 0, 59, 38, 0, 39, 40, 41, 42, 43, 0,
0, 0, 0, 44, 45, 46, 47, 48, 49, 0,
- 0, 51, 0, 166, 0, 0, 0, 0, 0, 0,
- 54, 0, 55, 56, 0, 0, 0, 0, 0, 0,
- 0, 0, 115, 25, 26, 27, 28, 0, 29, 30,
- 31, 0, 0, 0, 32, 148, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 38, 0, 39, 40, 41,
- 42, 43, 0, 0, 0, 166, 44, 45, 46, 47,
- 48, 49, 52, 0, 51, 62, 64, 50, 0, 57,
- 0, 65, 60, 54, 59, 55, 56, 0, 0, 0,
- 0, 0, 0, 150, 151, 152, 153, 148, 119, 0,
- 0, 0, 0, 63, 0, 0, 0, 156, 157, 158,
- 159, 160, 161, 0, 0, 162, 0, 0, 163, 164,
- 165, 0, 152, 153, 0, 0, 0, 0, 52, 0,
- 61, 62, 64, 50, 0, 57, 129, 65, 60, 161,
- 59, 0, 162, 0, 0, 163, 164, 165, 0, 149,
- 0, 0, 0, 0, 0, 150, 151, 152, 153, 63,
- 0, 0, 0, 0, 0, 53, 0, 0, 154, 156,
- 157, 158, 159, 160, 161, 0, 0, 162, 0, 0,
- 163, 164, 165, 0, 52, 0, 61, 62, 64, 50,
- 0, 57, 0, 65, 60, 0, 59, 0, 0, 0,
- 0, 0, 0, 149, 0, 0, 0, 0, 0, 150,
- 151, 152, 153, 0, 0, 63, 0, 0, 0, 0,
- 0, 53, 154, 156, 157, 158, 159, 160, 161, 0,
- 0, 162, 0, 0, 163, 164, 165, 0, 0, 0,
- 0, 0, 61, 52, 133, 0, 62, 64, 50, 0,
- 57, 193, 65, 60, 0, 59, 0, 0, 0, 0,
- 0, 150, 151, 152, 153, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 63, 0, 0, 53, 159, 160,
- 161, 0, 0, 162, 0, 0, 163, 164, 165, 0,
- 0, 0, 80, 0, 0, 80, 24, 25, 26, 27,
- 28, 61, 29, 30, 31, 0, 0, 0, 32, 80,
- 80, 0, 0, 0, 80, 0, 0, 0, 0, 38,
- 0, 39, 40, 41, 42, 43, 0, 0, 0, 0,
- 44, 45, 46, 47, 48, 49, 53, 0, 51, 0,
- 0, 0, 0, 0, 80, 0, 0, 54, 81, 55,
- 56, 81, 24, 25, 26, 27, 28, 0, 29, 30,
- 31, 0, 0, 0, 32, 81, 81, 0, 0, 0,
- 81, 0, 0, 0, 0, 38, 0, 39, 40, 41,
+ 63, 51, 0, 53, 0, 0, 0, 0, 0, 0,
+ 54, 0, 55, 56, 0, 0, 0, 0, 87, 0,
+ 0, 87, 116, 25, 26, 27, 28, 61, 29, 30,
+ 31, 0, 0, 0, 32, 87, 87, 0, 0, 0,
+ 87, 0, 0, 0, 0, 38, 0, 39, 40, 41,
42, 43, 0, 0, 0, 0, 44, 45, 46, 47,
- 48, 49, 0, 0, 51, 0, 0, 0, 0, 0,
- 81, 0, 0, 54, 0, 55, 56, 0, 24, 25,
- 26, 27, 28, 0, 29, 30, 31, 0, 52, 0,
- 32, 62, 64, 50, 0, 57, 241, 65, 60, 0,
+ 48, 49, 53, 0, 51, 0, 0, 0, 0, 0,
+ 87, 0, 0, 54, 88, 55, 56, 88, 24, 25,
+ 26, 27, 28, 0, 29, 30, 31, 0, 0, 0,
+ 32, 88, 88, 0, 0, 0, 88, 0, 0, 0,
+ 0, 38, 0, 39, 40, 41, 42, 43, 0, 0,
+ 0, 0, 44, 45, 46, 47, 48, 49, 0, 0,
+ 51, 0, 0, 0, 0, 0, 88, 0, 0, 54,
+ 0, 55, 56, 0, 24, 25, 26, 27, 28, 0,
+ 29, 30, 31, 0, 52, 0, 32, 62, 64, 50,
+ 0, 57, 242, 65, 60, 0, 59, 38, 0, 39,
+ 40, 41, 42, 43, 0, 0, 0, 0, 44, 45,
+ 46, 47, 48, 49, 0, 63, 51, 0, 0, 0,
+ 0, 0, 0, 0, 0, 54, 0, 55, 56, 0,
+ 0, 0, 0, 24, 25, 26, 27, 28, 0, 29,
+ 30, 31, 61, 52, 0, 32, 62, 64, 50, 0,
+ 57, 0, 65, 60, 0, 59, 38, 0, 39, 40,
+ 41, 42, 43, 0, 0, 0, 0, 44, 45, 46,
+ 47, 48, 49, 0, 63, 51, 0, 53, 0, 0,
+ 0, 0, 0, 0, 54, 0, 55, 56, 0, 87,
+ 87, 87, 87, 0, 0, 0, 0, 0, 87, 52,
+ 0, 61, 62, 64, 50, 87, 57, 275, 65, 60,
+ 0, 59, 0, 0, 87, 87, 0, 87, 87, 87,
+ 87, 87, 0, 0, 0, 0, 0, 0, 0, 0,
+ 63, 0, 0, 0, 0, 0, 53, 0, 0, 0,
+ 0, 0, 0, 0, 0, 88, 88, 88, 88, 0,
+ 0, 0, 0, 0, 88, 52, 0, 61, 62, 64,
+ 50, 0, 57, 277, 65, 60, 0, 59, 0, 0,
+ 88, 88, 0, 88, 88, 88, 88, 88, 0, 0,
+ 0, 0, 0, 0, 0, 0, 63, 0, 0, 0,
+ 0, 0, 53, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 24, 25,
+ 26, 27, 28, 61, 29, 30, 31, 0, 52, 0,
+ 32, 62, 64, 50, 0, 57, 0, 65, 60, 0,
59, 38, 0, 39, 40, 41, 42, 43, 0, 0,
- 0, 0, 44, 45, 46, 47, 48, 49, 0, 63,
+ 0, 0, 44, 45, 46, 47, 48, 49, 53, 63,
51, 0, 0, 0, 0, 0, 0, 0, 0, 54,
- 0, 55, 56, 0, 0, 0, 0, 24, 25, 26,
- 27, 28, 0, 29, 30, 31, 61, 52, 0, 32,
- 62, 64, 50, 0, 57, 0, 65, 60, 0, 59,
- 38, 0, 39, 40, 41, 42, 43, 0, 0, 0,
- 0, 44, 45, 46, 47, 48, 49, 0, 63, 51,
- 0, 53, 0, 0, 0, 0, 0, 0, 54, 0,
- 55, 56, 0, 80, 80, 80, 80, 0, 0, 0,
- 0, 0, 80, 52, 0, 61, 62, 64, 50, 80,
- 57, 273, 65, 60, 0, 59, 0, 0, 80, 80,
- 0, 80, 80, 80, 80, 80, 0, 0, 0, 0,
- 0, 0, 0, 0, 63, 0, 0, 0, 0, 0,
- 53, 0, 0, 0, 0, 0, 0, 0, 0, 81,
- 81, 81, 81, 0, 0, 0, 0, 0, 81, 52,
- 0, 61, 62, 64, 50, 0, 57, 275, 65, 60,
- 0, 59, 0, 0, 81, 81, 0, 81, 81, 81,
- 81, 81, 0, 0, 0, 0, 0, 0, 0, 0,
- 63, 0, 0, 0, 0, 0, 53, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 24, 25, 26, 27, 28, 61, 29, 30,
- 31, 0, 52, 0, 32, 62, 64, 50, 0, 57,
- 0, 65, 60, 0, 59, 38, 0, 39, 40, 41,
- 42, 43, 0, 0, 0, 0, 44, 45, 46, 47,
- 48, 49, 53, 63, 51, 0, 0, 0, 0, 0,
- 0, 0, 0, 54, 0, 55, 56, 0, 0, 0,
- 22, 24, 25, 26, 27, 28, 0, 29, 30, 31,
- 61, 0, 0, 32, 87, 0, 0, 87, 0, 0,
- 0, 0, 0, 0, 38, 0, 39, 40, 41, 42,
- 43, 87, 87, 0, 0, 44, 45, 46, 47, 48,
- 49, 166, 0, 51, 0, 53, 0, 0, 0, 0,
- 140, 0, 54, 140, 55, 56, 0, 24, 25, 26,
- 27, 28, 0, 29, 30, 31, 87, 140, 140, 32,
- 0, 0, 140, 148, 0, 0, 0, 0, 0, 0,
- 38, 0, 39, 40, 41, 42, 43, 0, 0, 0,
- 0, 44, 45, 46, 47, 48, 49, 0, 0, 51,
- 140, 0, 140, 0, 0, 0, 0, 0, 54, 123,
- 55, 56, 123, 24, 25, 26, 27, 28, 0, 29,
- 30, 31, 0, 0, 0, 32, 123, 123, 0, 0,
- 0, 123, 140, 0, 0, 0, 38, 0, 39, 40,
+ 0, 55, 56, 0, 0, 0, 22, 24, 25, 26,
+ 27, 28, 0, 29, 30, 31, 61, 0, 0, 32,
+ 69, 0, 0, 69, 0, 0, 0, 0, 0, 0,
+ 38, 0, 39, 40, 41, 42, 43, 69, 69, 0,
+ 0, 44, 45, 46, 47, 48, 49, 167, 0, 51,
+ 0, 53, 0, 0, 0, 0, 147, 0, 54, 147,
+ 55, 56, 0, 24, 25, 26, 27, 28, 0, 29,
+ 30, 31, 69, 147, 147, 32, 0, 0, 147, 149,
+ 0, 0, 0, 0, 0, 0, 38, 0, 39, 40,
41, 42, 43, 0, 0, 0, 0, 44, 45, 46,
- 47, 48, 49, 0, 0, 51, 0, 0, 0, 123,
- 0, 123, 0, 0, 54, 0, 55, 56, 0, 0,
- 0, 0, 147, 0, 0, 147, 24, 25, 26, 27,
- 28, 0, 29, 30, 31, 0, 0, 0, 32, 147,
- 147, 123, 0, 0, 147, 0, 0, 0, 0, 38,
- 0, 39, 40, 41, 42, 43, 0, 0, 0, 0,
- 44, 45, 46, 47, 48, 49, 0, 0, 51, 0,
- 133, 0, 147, 133, 147, 0, 0, 54, 0, 55,
- 56, 0, 0, 0, 0, 0, 0, 133, 133, 152,
- 153, 0, 133, 0, 0, 87, 87, 87, 87, 0,
- 0, 0, 0, 0, 147, 160, 161, 0, 0, 162,
- 0, 0, 163, 164, 165, 0, 0, 0, 0, 0,
- 87, 87, 133, 87, 0, 0, 0, 0, 0, 0,
- 0, 140, 140, 140, 140, 0, 108, 0, 0, 108,
- 140, 0, 0, 0, 0, 0, 140, 140, 140, 140,
- 0, 0, 133, 108, 108, 0, 140, 140, 108, 140,
- 140, 140, 140, 140, 140, 140, 0, 0, 140, 0,
- 0, 140, 140, 140, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 108, 0, 108, 0,
- 123, 123, 123, 123, 0, 149, 0, 0, 149, 123,
- 0, 0, 0, 0, 0, 123, 123, 123, 123, 0,
- 0, 0, 149, 149, 0, 123, 123, 149, 123, 123,
- 123, 123, 123, 123, 123, 0, 0, 123, 0, 0,
- 123, 123, 123, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 149, 0, 0,
- 0, 0, 0, 147, 147, 147, 147, 0, 0, 0,
- 0, 0, 147, 0, 0, 0, 0, 0, 147, 147,
- 147, 147, 0, 0, 0, 0, 0, 149, 147, 147,
- 0, 147, 147, 147, 147, 147, 147, 147, 0, 0,
- 147, 0, 0, 147, 147, 147, 0, 0, 0, 0,
- 0, 133, 133, 133, 133, 0, 150, 0, 0, 0,
- 133, 0, 0, 0, 0, 0, 133, 133, 133, 133,
- 0, 0, 0, 150, 150, 0, 133, 133, 150, 133,
- 133, 133, 133, 133, 133, 133, 0, 0, 133, 0,
- 0, 133, 133, 133, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 150, 0, 150, 0,
- 0, 0, 0, 0, 0, 0, 0, 108, 108, 108,
- 108, 0, 0, 0, 0, 0, 108, 0, 0, 0,
- 0, 0, 108, 108, 108, 108, 0, 0, 150, 0,
- 0, 0, 108, 108, 0, 108, 108, 108, 108, 108,
- 108, 108, 0, 0, 108, 0, 0, 108, 108, 108,
+ 47, 48, 49, 0, 0, 51, 147, 0, 147, 0,
+ 0, 0, 0, 0, 54, 130, 55, 56, 130, 24,
+ 25, 26, 27, 28, 0, 29, 30, 31, 0, 0,
+ 0, 32, 130, 130, 0, 0, 0, 130, 147, 0,
+ 0, 0, 38, 0, 39, 40, 41, 42, 43, 0,
+ 0, 0, 0, 44, 45, 46, 47, 48, 49, 0,
+ 0, 51, 0, 0, 0, 130, 0, 130, 0, 0,
+ 54, 0, 55, 56, 0, 0, 0, 0, 154, 0,
+ 0, 154, 24, 25, 26, 27, 28, 0, 29, 30,
+ 31, 0, 0, 0, 32, 154, 154, 130, 0, 0,
+ 154, 0, 0, 0, 0, 38, 0, 39, 40, 41,
+ 42, 43, 0, 0, 0, 0, 44, 45, 46, 47,
+ 48, 49, 0, 0, 51, 0, 140, 0, 154, 140,
+ 154, 0, 0, 54, 0, 55, 56, 0, 0, 0,
+ 0, 0, 0, 140, 140, 153, 154, 0, 140, 0,
+ 0, 69, 69, 69, 69, 0, 0, 0, 0, 0,
+ 154, 161, 162, 0, 0, 163, 0, 0, 164, 165,
+ 166, 0, 0, 0, 0, 0, 69, 69, 140, 0,
+ 0, 0, 0, 0, 0, 0, 0, 147, 147, 147,
+ 147, 0, 115, 0, 0, 115, 147, 0, 0, 0,
+ 0, 0, 147, 147, 147, 147, 0, 0, 140, 115,
+ 115, 0, 147, 147, 115, 147, 147, 147, 147, 147,
+ 147, 147, 0, 0, 147, 0, 0, 147, 147, 147,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 115, 0, 115, 0, 130, 130, 130, 130,
+ 0, 156, 0, 0, 156, 130, 0, 0, 0, 0,
+ 0, 130, 130, 130, 130, 0, 0, 0, 156, 156,
+ 0, 130, 130, 156, 130, 130, 130, 130, 130, 130,
+ 130, 0, 0, 130, 0, 0, 130, 130, 130, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 156, 0, 0, 0, 0, 0, 154,
+ 154, 154, 154, 0, 0, 0, 0, 0, 154, 0,
+ 0, 0, 0, 0, 154, 154, 154, 154, 0, 0,
+ 0, 0, 0, 156, 154, 154, 0, 154, 154, 154,
+ 154, 154, 154, 154, 0, 0, 154, 0, 0, 154,
+ 154, 154, 0, 0, 0, 0, 0, 140, 140, 140,
+ 140, 0, 157, 0, 0, 0, 140, 0, 0, 0,
+ 0, 0, 140, 140, 140, 140, 0, 0, 0, 157,
+ 157, 0, 140, 140, 157, 140, 140, 140, 140, 140,
+ 140, 140, 0, 0, 140, 0, 0, 140, 140, 140,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 149, 149, 149, 149,
- 0, 135, 0, 0, 0, 149, 0, 0, 0, 0,
- 0, 149, 149, 149, 149, 0, 0, 0, 135, 135,
- 0, 149, 149, 135, 149, 149, 149, 149, 149, 149,
- 149, 0, 0, 149, 0, 0, 149, 149, 149, 0,
- 89, 89, 0, 0, 100, 0, 0, 100, 0, 0,
- 0, 135, 102, 135, 86, 0, 0, 86, 110, 89,
- 118, 100, 100, 0, 0, 89, 100, 0, 0, 0,
- 0, 86, 86, 0, 0, 0, 86, 89, 89, 89,
- 89, 0, 0, 135, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 100, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 86, 150, 150, 150,
- 150, 0, 62, 0, 0, 62, 150, 0, 0, 0,
- 0, 110, 150, 150, 150, 150, 100, 0, 0, 62,
- 62, 0, 150, 150, 62, 150, 150, 150, 150, 150,
- 150, 150, 0, 0, 150, 0, 0, 150, 150, 150,
- 0, 0, 0, 0, 0, 65, 0, 0, 0, 0,
- 0, 0, 0, 0, 62, 0, 0, 0, 0, 0,
- 0, 0, 65, 65, 0, 0, 0, 65, 0, 0,
- 233, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 62, 0, 0, 0, 0, 99,
- 0, 0, 99, 0, 261, 65, 0, 65, 0, 0,
- 0, 0, 0, 0, 0, 0, 99, 99, 0, 0,
- 0, 99, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 135, 135, 135, 135, 0, 65, 0, 0,
- 0, 135, 0, 0, 0, 0, 0, 135, 135, 135,
- 135, 99, 0, 0, 0, 0, 0, 135, 135, 0,
- 135, 135, 135, 135, 135, 135, 135, 0, 0, 135,
- 0, 0, 135, 135, 135, 100, 100, 100, 100, 0,
- 136, 99, 0, 136, 100, 86, 86, 86, 86, 0,
- 100, 100, 100, 100, 86, 0, 0, 136, 136, 0,
- 100, 100, 136, 100, 100, 100, 100, 100, 100, 100,
- 86, 86, 100, 86, 86, 100, 100, 100, 0, 0,
+ 0, 0, 157, 0, 157, 0, 0, 0, 0, 0,
+ 0, 0, 0, 115, 115, 115, 115, 0, 0, 0,
+ 0, 0, 115, 0, 0, 0, 0, 0, 115, 115,
+ 115, 115, 0, 0, 157, 0, 0, 0, 115, 115,
+ 0, 115, 115, 115, 115, 115, 115, 115, 0, 0,
+ 115, 0, 0, 115, 115, 115, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 136, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 62, 62, 62, 62, 0, 149, 0,
- 0, 149, 62, 0, 0, 0, 0, 0, 62, 62,
- 62, 62, 0, 0, 0, 149, 149, 0, 62, 62,
- 149, 62, 62, 62, 62, 62, 62, 62, 0, 0,
- 62, 0, 0, 62, 62, 62, 65, 65, 65, 65,
- 0, 106, 0, 0, 106, 65, 0, 0, 0, 0,
- 149, 65, 65, 65, 65, 0, 0, 0, 106, 106,
- 0, 65, 65, 106, 65, 65, 65, 65, 65, 65,
- 65, 0, 0, 65, 0, 0, 65, 65, 65, 0,
- 99, 99, 99, 99, 0, 113, 0, 0, 113, 99,
- 0, 0, 0, 106, 0, 99, 99, 99, 99, 0,
- 0, 0, 113, 113, 0, 99, 99, 113, 99, 99,
- 99, 99, 99, 99, 99, 0, 0, 99, 0, 0,
- 99, 99, 99, 0, 0, 0, 0, 0, 91, 0,
- 0, 91, 0, 0, 0, 0, 0, 113, 0, 0,
- 0, 0, 0, 0, 0, 91, 91, 0, 0, 0,
- 91, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 136, 136, 136, 136, 0, 92, 0, 0, 92,
- 136, 0, 0, 0, 0, 0, 136, 136, 136, 136,
- 91, 0, 0, 92, 92, 0, 136, 136, 92, 136,
- 136, 136, 136, 136, 136, 136, 0, 0, 136, 0,
- 0, 136, 136, 136, 93, 0, 0, 93, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 92, 0,
- 0, 93, 93, 0, 0, 0, 93, 0, 0, 149,
- 149, 149, 149, 0, 0, 0, 0, 0, 149, 0,
- 0, 0, 0, 0, 149, 149, 149, 149, 0, 0,
- 0, 0, 0, 0, 149, 149, 93, 149, 149, 149,
- 149, 149, 149, 149, 0, 0, 149, 0, 0, 149,
- 149, 149, 106, 106, 106, 106, 0, 89, 0, 0,
- 89, 106, 0, 0, 0, 0, 0, 106, 106, 106,
- 106, 0, 0, 0, 89, 89, 0, 106, 106, 89,
- 106, 106, 106, 106, 106, 106, 106, 0, 0, 106,
- 0, 0, 106, 106, 106, 0, 113, 113, 113, 113,
- 0, 90, 0, 0, 90, 113, 0, 0, 0, 89,
- 0, 113, 113, 113, 113, 0, 0, 0, 90, 90,
- 0, 113, 113, 90, 113, 113, 113, 113, 113, 113,
- 113, 0, 0, 113, 0, 0, 113, 113, 113, 91,
- 91, 91, 91, 0, 88, 0, 0, 88, 91, 0,
- 0, 0, 0, 90, 91, 91, 91, 91, 0, 0,
- 0, 88, 88, 0, 91, 91, 88, 91, 91, 91,
- 91, 91, 91, 91, 0, 0, 0, 92, 92, 92,
- 92, 0, 76, 0, 0, 76, 92, 0, 0, 0,
- 0, 0, 92, 92, 92, 92, 88, 0, 0, 76,
- 76, 0, 92, 92, 76, 92, 92, 92, 92, 92,
- 92, 92, 0, 0, 0, 93, 93, 93, 93, 0,
- 77, 0, 0, 77, 93, 0, 0, 0, 0, 0,
- 93, 93, 93, 93, 76, 0, 0, 77, 77, 0,
- 93, 93, 77, 93, 93, 93, 93, 93, 93, 93,
- 0, 0, 0, 0, 0, 0, 78, 0, 0, 78,
+ 0, 0, 156, 156, 156, 156, 0, 142, 0, 0,
+ 0, 156, 0, 0, 0, 0, 0, 156, 156, 156,
+ 156, 0, 0, 0, 142, 142, 0, 156, 156, 142,
+ 156, 156, 156, 156, 156, 156, 156, 0, 0, 156,
+ 0, 0, 156, 156, 156, 0, 0, 0, 0, 0,
+ 107, 0, 0, 107, 0, 0, 0, 142, 0, 142,
+ 93, 0, 0, 93, 0, 0, 0, 107, 107, 0,
+ 0, 0, 107, 0, 0, 0, 0, 93, 93, 0,
+ 0, 0, 93, 0, 0, 0, 0, 0, 0, 142,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 77, 78, 78, 0, 0, 0, 78, 0,
+ 0, 0, 107, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 93, 157, 157, 157, 157, 0, 68, 0,
+ 0, 68, 157, 0, 0, 0, 0, 0, 157, 157,
+ 157, 157, 107, 0, 0, 68, 68, 0, 157, 157,
+ 68, 157, 157, 157, 157, 157, 157, 157, 0, 0,
+ 157, 0, 0, 157, 157, 157, 0, 0, 0, 0,
+ 0, 71, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 0, 0, 0, 0, 0, 0, 0, 71, 71,
+ 0, 0, 0, 71, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 0, 0, 0, 0, 106, 0, 0, 106, 0,
+ 0, 71, 0, 71, 0, 0, 0, 0, 0, 0,
+ 0, 0, 106, 106, 0, 0, 0, 106, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 142, 142,
+ 142, 142, 0, 71, 0, 0, 0, 142, 0, 0,
+ 0, 0, 0, 142, 142, 142, 142, 106, 0, 0,
+ 0, 0, 0, 142, 142, 0, 142, 142, 142, 142,
+ 142, 142, 142, 0, 0, 142, 0, 0, 142, 142,
+ 142, 107, 107, 107, 107, 0, 143, 106, 0, 143,
+ 107, 93, 93, 93, 93, 0, 107, 107, 107, 107,
+ 93, 0, 0, 143, 143, 0, 107, 107, 143, 107,
+ 107, 107, 107, 107, 107, 107, 93, 93, 107, 93,
+ 93, 107, 107, 107, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 143, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 68,
+ 68, 68, 68, 0, 156, 0, 0, 156, 68, 0,
+ 0, 0, 0, 0, 68, 68, 68, 68, 0, 0,
+ 0, 156, 156, 0, 68, 68, 156, 68, 68, 68,
+ 68, 68, 68, 68, 0, 0, 68, 0, 0, 68,
+ 68, 68, 71, 71, 71, 71, 0, 113, 0, 0,
+ 113, 71, 0, 0, 0, 0, 156, 71, 71, 71,
+ 71, 0, 0, 0, 113, 113, 0, 71, 71, 113,
+ 71, 71, 71, 71, 71, 71, 71, 0, 0, 71,
+ 0, 0, 71, 71, 71, 0, 106, 106, 106, 106,
+ 0, 120, 0, 0, 120, 106, 0, 0, 0, 113,
+ 0, 106, 106, 106, 106, 0, 0, 0, 120, 120,
+ 0, 106, 106, 120, 106, 106, 106, 106, 106, 106,
+ 106, 0, 0, 106, 0, 0, 106, 106, 106, 0,
+ 0, 0, 0, 0, 98, 0, 0, 98, 0, 0,
+ 0, 0, 0, 120, 0, 0, 0, 0, 0, 0,
+ 0, 98, 98, 0, 0, 0, 98, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 143, 143, 143,
+ 143, 0, 99, 0, 0, 99, 143, 0, 0, 0,
+ 0, 0, 143, 143, 143, 143, 98, 0, 0, 99,
+ 99, 0, 143, 143, 99, 143, 143, 143, 143, 143,
+ 143, 143, 0, 0, 143, 0, 0, 143, 143, 143,
+ 100, 0, 0, 100, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 99, 0, 0, 100, 100, 0,
+ 0, 0, 100, 0, 0, 156, 156, 156, 156, 0,
+ 0, 0, 0, 0, 156, 0, 0, 0, 0, 0,
+ 156, 156, 156, 156, 0, 0, 0, 0, 0, 0,
+ 156, 156, 100, 156, 156, 156, 156, 156, 156, 156,
+ 0, 0, 156, 0, 0, 156, 156, 156, 113, 113,
+ 113, 113, 0, 96, 0, 0, 96, 113, 0, 0,
+ 0, 0, 0, 113, 113, 113, 113, 0, 0, 0,
+ 96, 96, 0, 113, 113, 96, 113, 113, 113, 113,
+ 113, 113, 113, 0, 0, 113, 0, 0, 113, 113,
+ 113, 0, 120, 120, 120, 120, 0, 97, 0, 0,
+ 97, 120, 0, 0, 0, 96, 0, 120, 120, 120,
+ 120, 0, 0, 0, 97, 97, 0, 120, 120, 97,
+ 120, 120, 120, 120, 120, 120, 120, 0, 0, 120,
+ 0, 0, 120, 120, 120, 98, 98, 98, 98, 0,
+ 95, 0, 0, 95, 98, 0, 0, 0, 0, 97,
+ 98, 98, 98, 98, 0, 0, 0, 95, 95, 0,
+ 98, 98, 95, 98, 98, 98, 98, 98, 98, 98,
+ 0, 0, 0, 99, 99, 99, 99, 0, 83, 0,
+ 0, 83, 99, 0, 0, 0, 0, 0, 99, 99,
+ 99, 99, 95, 0, 0, 83, 83, 0, 99, 99,
+ 83, 99, 99, 99, 99, 99, 99, 99, 0, 0,
+ 0, 100, 100, 100, 100, 0, 84, 0, 0, 84,
+ 100, 0, 0, 0, 0, 0, 100, 100, 100, 100,
+ 83, 0, 0, 84, 84, 0, 100, 100, 84, 100,
+ 100, 100, 100, 100, 100, 100, 0, 0, 0, 0,
+ 0, 0, 86, 0, 0, 86, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 84, 86,
+ 86, 0, 0, 0, 86, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 96, 96, 96, 96, 0, 146,
+ 0, 0, 146, 96, 0, 0, 0, 0, 0, 96,
+ 96, 96, 96, 0, 86, 0, 146, 146, 0, 96,
+ 96, 146, 96, 96, 96, 96, 96, 96, 96, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 97, 97,
+ 97, 97, 0, 145, 0, 0, 145, 97, 0, 0,
+ 0, 146, 0, 97, 97, 97, 97, 0, 0, 0,
+ 145, 145, 0, 97, 97, 145, 97, 97, 97, 97,
+ 97, 97, 97, 0, 0, 0, 0, 0, 0, 0,
+ 0, 95, 95, 95, 95, 0, 134, 0, 0, 134,
+ 95, 0, 0, 0, 0, 145, 95, 95, 95, 95,
+ 0, 0, 0, 134, 134, 0, 95, 95, 134, 95,
+ 95, 95, 95, 95, 95, 95, 0, 0, 0, 83,
+ 83, 83, 83, 0, 105, 0, 0, 105, 83, 0,
+ 0, 0, 0, 0, 83, 83, 83, 83, 134, 0,
+ 0, 105, 105, 0, 83, 83, 105, 83, 83, 83,
+ 83, 83, 83, 83, 0, 0, 0, 84, 84, 84,
+ 84, 0, 89, 0, 0, 89, 84, 0, 0, 0,
+ 0, 0, 84, 84, 84, 84, 105, 0, 0, 89,
+ 89, 0, 84, 84, 89, 84, 84, 84, 84, 84,
+ 84, 0, 0, 86, 86, 86, 86, 0, 90, 0,
+ 0, 90, 86, 0, 0, 0, 0, 0, 86, 86,
+ 0, 0, 0, 0, 89, 90, 90, 0, 86, 86,
+ 90, 86, 86, 86, 86, 86, 86, 0, 0, 0,
+ 146, 146, 146, 146, 0, 92, 0, 0, 92, 146,
+ 0, 0, 0, 0, 0, 146, 146, 0, 0, 0,
+ 90, 0, 92, 92, 0, 146, 146, 92, 146, 146,
+ 146, 146, 146, 0, 0, 0, 167, 0, 0, 0,
+ 0, 0, 0, 0, 145, 145, 145, 145, 0, 91,
+ 156, 0, 91, 145, 0, 0, 0, 92, 0, 145,
+ 145, 0, 0, 0, 0, 0, 91, 91, 149, 145,
+ 145, 91, 145, 145, 145, 145, 145, 0, 167, 0,
+ 0, 283, 0, 0, 0, 0, 156, 134, 134, 134,
+ 134, 0, 0, 0, 0, 0, 134, 0, 0, 0,
+ 0, 91, 134, 134, 0, 0, 0, 0, 0, 0,
+ 149, 0, 134, 134, 167, 134, 134, 134, 134, 134,
+ 0, 0, 0, 0, 0, 105, 105, 105, 105, 0,
+ 0, 0, 0, 0, 105, 0, 0, 0, 0, 0,
+ 105, 105, 0, 0, 0, 156, 149, 0, 0, 0,
+ 105, 105, 0, 105, 105, 105, 105, 105, 0, 0,
+ 0, 0, 0, 89, 89, 89, 89, 0, 0, 0,
+ 0, 0, 89, 167, 0, 0, 0, 0, 90, 90,
0, 0, 0, 0, 0, 0, 0, 0, 89, 89,
- 89, 89, 0, 79, 0, 0, 79, 89, 0, 0,
- 0, 0, 0, 89, 89, 89, 89, 0, 78, 0,
- 79, 79, 0, 89, 89, 79, 89, 89, 89, 89,
- 89, 89, 89, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 90, 90, 90, 90, 0, 139, 0, 0,
- 139, 90, 0, 0, 0, 79, 0, 90, 90, 90,
- 90, 0, 0, 0, 139, 139, 0, 90, 90, 139,
- 90, 90, 90, 90, 90, 90, 90, 0, 0, 0,
- 0, 0, 0, 0, 0, 88, 88, 88, 88, 0,
- 138, 0, 0, 138, 88, 0, 0, 0, 0, 139,
- 88, 88, 88, 88, 0, 0, 0, 138, 138, 0,
- 88, 88, 138, 88, 88, 88, 88, 88, 88, 88,
- 0, 0, 0, 76, 76, 76, 76, 0, 127, 0,
- 0, 127, 76, 0, 0, 0, 0, 0, 76, 76,
- 76, 76, 138, 0, 0, 127, 127, 0, 76, 76,
- 127, 76, 76, 76, 76, 76, 76, 76, 0, 0,
- 0, 77, 77, 77, 77, 0, 98, 0, 0, 98,
- 77, 0, 0, 0, 0, 0, 77, 77, 77, 77,
- 127, 0, 0, 98, 98, 0, 77, 77, 98, 77,
- 77, 77, 77, 77, 77, 0, 0, 78, 78, 78,
- 78, 0, 82, 0, 0, 82, 78, 0, 0, 0,
- 0, 0, 78, 78, 0, 78, 0, 0, 98, 82,
- 82, 0, 78, 78, 82, 78, 78, 78, 78, 78,
- 78, 0, 0, 0, 79, 79, 79, 79, 0, 83,
- 0, 0, 83, 79, 0, 0, 0, 0, 0, 79,
- 79, 0, 0, 0, 82, 0, 83, 83, 0, 79,
- 79, 83, 79, 79, 79, 79, 79, 79, 0, 0,
- 166, 0, 0, 0, 0, 0, 0, 0, 139, 139,
- 139, 139, 0, 85, 0, 0, 85, 139, 0, 0,
- 0, 83, 0, 139, 139, 0, 64, 0, 0, 64,
- 85, 85, 148, 139, 139, 85, 139, 139, 139, 139,
- 139, 0, 0, 64, 64, 134, 0, 0, 134, 0,
- 0, 138, 138, 138, 138, 75, 0, 0, 75, 0,
- 138, 0, 134, 134, 0, 85, 138, 138, 0, 0,
- 0, 0, 75, 75, 0, 0, 138, 138, 64, 138,
- 138, 138, 138, 138, 0, 63, 0, 0, 63, 127,
- 127, 127, 127, 0, 0, 0, 0, 134, 127, 0,
- 0, 0, 63, 63, 127, 127, 281, 75, 0, 0,
- 0, 155, 0, 0, 127, 127, 0, 127, 127, 127,
- 127, 127, 0, 0, 0, 0, 0, 98, 98, 98,
- 98, 0, 0, 0, 0, 0, 98, 63, 0, 166,
- 0, 0, 98, 98, 0, 155, 0, 0, 0, 0,
- 0, 0, 98, 98, 0, 98, 98, 98, 98, 98,
- 0, 0, 0, 82, 82, 82, 82, 0, 0, 0,
- 0, 148, 82, 166, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 82, 82,
- 0, 82, 82, 82, 82, 82, 150, 151, 152, 153,
- 83, 83, 83, 83, 0, 148, 0, 0, 0, 83,
- 0, 157, 158, 159, 160, 161, 0, 0, 162, 0,
- 0, 163, 164, 165, 166, 83, 83, 0, 83, 83,
- 83, 83, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 85, 85, 85, 85, 0, 0,
- 0, 0, 0, 85, 0, 0, 148, 64, 64, 64,
- 64, 0, 0, 0, 0, 0, 0, 0, 0, 85,
- 85, 0, 85, 85, 85, 0, 134, 134, 134, 134,
- 0, 0, 64, 64, 93, 0, 75, 75, 75, 75,
- 0, 0, 103, 0, 0, 0, 108, 0, 0, 117,
- 0, 134, 134, 0, 0, 0, 124, 125, 126, 127,
- 128, 75, 75, 131, 132, 0, 63, 63, 63, 63,
- 139, 0, 0, 0, 0, 0, 0, 0, 0, 149,
- 0, 0, 0, 0, 0, 150, 151, 152, 153, 0,
- 0, 63, 63, 0, 0, 0, 182, 0, 154, 156,
- 157, 158, 159, 160, 161, 0, 0, 162, 0, 0,
- 163, 164, 165, 149, 0, 0, 0, 0, 0, 150,
- 151, 152, 153, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 154, 156, 157, 158, 159, 160, 161, 0,
- 0, 162, 0, 0, 163, 164, 165, 0, 0, 0,
- 0, 0, 0, 216, 217, 218, 219, 220, 221, 222,
- 223, 224, 225, 226, 227, 228, 229, 0, 0, 0,
- 150, 151, 152, 153, 0, 0, 0, 0, 243, 0,
- 0, 0, 0, 0, 0, 0, 158, 159, 160, 161,
- 0, 0, 162, 0, 0, 163, 164, 165, 0, 0,
+ 103, 89, 89, 89, 89, 89, 111, 90, 119, 90,
+ 90, 90, 90, 90, 0, 149, 0, 0, 90, 167,
+ 0, 0, 0, 0, 0, 90, 90, 90, 90, 0,
+ 0, 0, 0, 0, 90, 90, 0, 90, 90, 90,
+ 90, 0, 151, 152, 153, 154, 92, 92, 92, 92,
+ 0, 149, 0, 0, 0, 92, 157, 158, 159, 160,
+ 161, 162, 0, 0, 163, 0, 0, 164, 165, 166,
+ 111, 92, 92, 0, 92, 92, 92, 0, 150, 0,
+ 0, 0, 0, 0, 151, 152, 153, 154, 0, 0,
+ 91, 91, 91, 91, 0, 0, 0, 155, 157, 158,
+ 159, 160, 161, 162, 0, 0, 163, 0, 0, 164,
+ 165, 166, 0, 0, 150, 91, 91, 0, 91, 0,
+ 151, 152, 153, 154, 0, 0, 0, 0, 0, 234,
+ 0, 0, 0, 155, 157, 158, 159, 160, 161, 162,
+ 94, 0, 163, 0, 0, 164, 165, 166, 104, 0,
+ 0, 0, 109, 263, 0, 118, 0, 0, 0, 0,
+ 0, 0, 125, 126, 127, 128, 129, 0, 0, 132,
+ 133, 0, 0, 150, 0, 0, 140, 0, 0, 151,
+ 152, 153, 154, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 157, 158, 159, 160, 161, 162, 0,
+ 0, 163, 0, 183, 164, 165, 166, 0, 0, 0,
+ 0, 0, 0, 0, 0, 151, 152, 153, 154, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 158, 159, 160, 161, 162, 0, 0, 163, 0, 0,
+ 164, 165, 166, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 217, 218, 219, 220, 221, 222, 223, 224, 225, 226,
+ 227, 228, 229, 230, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 244, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 294, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 309,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 296, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 312,
};
short yycheck[] = { 13,
- 41, 36, 36, 85, 93, 91, 40, 59, 41, 93,
- 41, 44, 41, 59, 40, 44, 123, 93, 181, 59,
- 90, 93, 41, 91, 257, 41, 59, 36, 321, 58,
- 59, 41, 46, 93, 63, 91, 0, 123, 59, 190,
- 257, 318, 319, 57, 257, 41, 323, 61, 40, 59,
- 40, 121, 297, 298, 40, 123, 91, 41, 40, 352,
- 93, 40, 339, 59, 93, 91, 343, 123, 6, 33,
- 8, 123, 36, 37, 38, 59, 40, 40, 42, 43,
- 41, 45, 41, 123, 278, 41, 40, 44, 123, 41,
- 40, 105, 106, 31, 32, 59, 123, 123, 276, 277,
- 64, 41, 44, 59, 0, 41, 41, 59, 178, 93,
- 59, 40, 59, 183, 123, 59, 59, 268, 59, 59,
- 59, 284, 260, 59, 59, 123, 257, 91, 142, 143,
- 144, 145, 146, 147, 148, 40, 40, 33, 93, 41,
- 36, 37, 38, 59, 40, 40, 42, 43, 299, 45,
- 257, 125, 166, 167, 168, 169, 170, 171, 172, 123,
- 0, 125, 126, 59, 91, 36, 41, 181, 64, 91,
- 298, 185, 186, 40, 188, 59, 190, 125, 41, 41,
- 41, 41, 41, 197, 40, 199, 200, 93, 91, 41,
- 204, 342, 125, 33, 59, 91, 36, 37, 38, 125,
- 40, 125, 42, 43, 125, 45, 123, 41, 297, 298,
- 125, 257, 41, 297, 298, 41, 230, 59, 232, 59,
- 123, 297, 298, 258, 64, 297, 298, 123, 314, 125,
- 126, 41, 41, 40, 123, 44, 41, 297, 298, 272,
- 273, 274, 275, 272, 273, 274, 275, 329, 257, 58,
- 59, 91, 281, 262, 63, 41, 297, 298, 287, 288,
- 289, 290, 296, 59, 297, 279, 297, 298, 297, 298,
- 284, 300, 301, 302, 303, 304, 305, 306, 297, 298,
- 309, 297, 298, 123, 93, 41, 126, 301, 272, 273,
- 274, 275, 256, 257, 258, 259, 260, 261, 59, 263,
- 264, 265, 266, 267, 268, 269, 270, 271, 272, 273,
- 274, 275, 41, 297, 298, 279, 280, 41, 282, 283,
- 284, 285, 286, 59, 338, 63, 41, 291, 292, 293,
- 294, 295, 296, 13, 338, 299, 297, 298, 297, 298,
- 297, 298, 297, 298, 308, 143, 310, 311, 297, 298,
- 297, 298, 188, 91, 297, 298, 297, 298, 297, 298,
- 256, 257, 258, 259, 260, 261, 125, 263, 264, 265,
- 266, 267, 268, 269, 270, 271, 272, 273, 274, 275,
- 125, 297, 298, 279, 280, 123, 282, 283, 284, 285,
- 286, 297, 298, 301, 95, 291, 292, 293, 294, 295,
- 296, -1, -1, 299, -1, -1, 309, -1, -1, 312,
- 313, 314, 308, -1, 310, 311, 256, 257, 258, 259,
- 260, 261, -1, 263, 264, 265, -1, -1, -1, 269,
- 91, -1, 272, 273, 274, 275, -1, -1, -1, 279,
- 280, -1, 282, 283, 284, 285, 286, -1, -1, -1,
- 91, 291, 292, 293, 294, 295, 296, -1, -1, 299,
- -1, -1, 123, 272, 273, 274, 275, -1, 308, 33,
- 310, 311, 36, 37, 38, -1, 40, 41, 42, 43,
- 44, 45, 123, -1, -1, -1, -1, -1, 297, 298,
- -1, 300, -1, -1, 58, 59, -1, -1, -1, 63,
- 64, 266, 267, 268, -1, 270, 271, 266, 267, 268,
- -1, 270, 271, 96, 97, 98, 99, 100, 101, -1,
- -1, 266, 267, 268, -1, 270, 271, 91, -1, 93,
- 33, -1, -1, 36, 37, 38, -1, 40, 41, 42,
- 43, 44, 45, 281, 272, 273, 274, 275, -1, 287,
- 288, 289, 290, -1, -1, 58, 59, -1, -1, 123,
- 63, 64, 126, 301, 302, 303, 304, 305, 306, 297,
- 298, 309, 43, -1, 312, 313, 314, -1, -1, -1,
- 51, -1, -1, -1, -1, -1, -1, -1, -1, 33,
- 93, -1, 36, 37, 38, -1, 40, -1, 42, 43,
- 26, 45, -1, -1, -1, -1, -1, -1, 191, -1,
- -1, -1, -1, -1, -1, 59, -1, 43, 44, 90,
- 64, -1, -1, 126, 50, -1, 287, 288, 289, 290,
- 296, 297, 298, -1, 300, -1, 62, 63, 64, 65,
- 41, -1, 113, 44, 305, 306, -1, 91, 309, -1,
- 121, 312, 313, 314, -1, -1, -1, 58, 59, 325,
- -1, -1, 63, -1, -1, 306, 332, -1, 309, -1,
- 336, 312, 313, 314, -1, -1, -1, -1, -1, 123,
- 106, -1, 126, 349, 350, -1, -1, -1, -1, -1,
- -1, -1, 93, 257, 258, 259, 260, 261, -1, 263,
- 264, 265, -1, -1, -1, 269, -1, 178, 272, 273,
- 274, 275, 183, -1, -1, -1, 280, 281, 282, 283,
- 284, 285, 286, 287, 288, 289, 290, 291, 292, 293,
- 294, 295, 296, 297, 298, 299, 300, 301, 302, 303,
- 304, 305, 306, -1, 308, 309, 310, 311, 312, 313,
- 314, -1, -1, -1, 257, 258, 259, 260, 261, -1,
- 263, 264, 265, -1, -1, -1, 269, -1, -1, 272,
- 273, 274, 275, -1, -1, -1, -1, 280, 281, 282,
- 283, 284, 285, 286, 287, 288, 289, 290, 291, 292,
- 293, 294, 295, 296, 297, 298, 299, 300, 301, 302,
- 303, 304, 305, 306, -1, 308, 309, 310, 311, 312,
- 313, 314, 256, 257, 258, 259, 260, 261, -1, 263,
- 264, 265, -1, -1, -1, 269, -1, -1, 272, 273,
- 274, 275, -1, -1, -1, 279, 280, -1, 282, 283,
- 284, 285, 286, -1, -1, -1, 91, 291, 292, 293,
- 294, 295, 296, 33, -1, 299, 36, 37, 38, -1,
- 40, -1, 42, 43, 308, 45, 310, 311, -1, -1,
- -1, 272, 273, 274, 275, -1, -1, -1, 123, 59,
- 281, -1, -1, -1, 64, -1, 287, 288, 289, 290,
- -1, -1, -1, -1, -1, -1, 297, 298, -1, 300,
- 301, 302, 303, 304, 305, 306, -1, -1, 309, 33,
- -1, 91, 36, 37, 38, -1, 40, -1, 42, 43,
- -1, 45, -1, -1, -1, -1, 13, -1, -1, -1,
- 17, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- 64, -1, -1, 123, -1, -1, 126, -1, -1, -1,
- -1, -1, -1, -1, -1, 42, -1, -1, 45, 91,
- -1, -1, -1, -1, -1, 33, -1, 91, 36, 37,
- 38, -1, 40, -1, 42, 43, -1, 45, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, 123, -1, 80, -1, -1, 64, -1, -1, 123,
- -1, -1, 126, -1, -1, -1, -1, 94, -1, -1,
+ 59, 41, 36, 36, 44, 93, 36, 59, 91, 86,
+ 40, 325, 91, 41, 257, 191, 40, 43, 58, 59,
+ 182, 257, 59, 63, 41, 51, 41, 59, 41, 257,
+ 41, 91, 46, 41, 322, 323, 91, 59, 41, 327,
+ 123, 41, 356, 57, 123, 297, 298, 61, 41, 44,
+ 40, 59, 40, 93, 40, 343, 59, 278, 91, 347,
+ 123, 41, 41, 123, 41, 91, 59, 91, 123, 40,
+ 97, 98, 99, 100, 101, 102, 59, 41, 0, 59,
+ 59, 59, 59, 59, 40, 59, 123, 59, 114, 123,
+ 123, 123, 106, 107, 270, 59, 122, 276, 277, 123,
+ 59, 41, 272, 273, 274, 275, 40, 40, 44, 40,
+ 260, 33, 40, 93, 36, 37, 38, 123, 40, 59,
+ 42, 43, 257, 45, 286, 93, 302, 297, 298, 143,
+ 144, 145, 146, 147, 148, 149, 40, 59, 40, 266,
+ 267, 268, 64, 270, 271, 41, 40, 91, 257, 36,
+ 93, 41, 0, 167, 168, 169, 170, 171, 172, 173,
+ 125, 93, 125, 93, 91, 192, 298, 40, 182, 91,
+ 346, 41, 186, 187, 41, 189, 41, 191, 93, 41,
+ 93, 41, 91, 40, 198, 33, 200, 201, 36, 37,
+ 38, 205, 40, 59, 42, 43, 41, 45, 257, 125,
+ 125, 123, 125, 125, 126, 125, 59, 123, 41, 297,
+ 298, 59, 41, 125, 123, 41, 64, 231, 59, 233,
+ 41, 41, 248, 257, 44, 258, 309, 253, 262, 312,
+ 313, 314, 272, 273, 274, 275, 41, 41, 58, 59,
+ 44, 281, 40, 91, 123, 297, 298, 287, 288, 41,
+ 290, 123, 44, 41, 58, 59, 333, 297, 298, 314,
+ 300, 301, 302, 303, 304, 305, 296, 281, 0, 297,
+ 298, 63, 286, 93, 41, 123, 59, 125, 126, 41,
+ 297, 298, 297, 298, 297, 298, 297, 298, 59, 93,
+ 304, 41, 272, 273, 274, 275, 59, 297, 298, 91,
+ 41, 33, 297, 298, 36, 37, 38, 8, 40, 32,
+ 42, 43, 144, 45, 297, 298, 13, 297, 298, 297,
+ 298, 297, 298, 297, 298, 297, 298, 59, 342, 297,
+ 298, 123, 64, 342, 256, 257, 258, 259, 260, 261,
+ 189, 263, 264, 265, 266, 267, 268, 269, 270, 271,
+ 272, 273, 274, 275, 297, 298, 304, 279, 280, 91,
+ 282, 283, 284, 285, 286, 297, 298, 297, 298, 291,
+ 292, 293, 294, 295, 296, 91, 96, 299, 41, 41,
+ 289, 44, 297, 298, 297, 298, 308, -1, 310, 311,
+ -1, 123, -1, -1, 126, 58, 59, 306, -1, -1,
+ 309, 63, -1, 312, 313, 314, -1, 123, 256, 257,
+ 258, 259, 260, 261, -1, 263, 264, 265, 266, 267,
+ 268, 269, 270, 271, 272, 273, 274, 275, -1, 91,
+ 93, 279, 280, -1, 282, 283, 284, 285, 286, -1,
+ -1, -1, -1, 291, 292, 293, 294, 295, 296, -1,
+ -1, 299, 272, 273, 274, 275, -1, -1, -1, 91,
+ 308, 123, 310, 311, -1, -1, -1, -1, 272, 273,
+ 274, 275, 91, -1, 91, -1, 33, 297, 298, 36,
+ 37, 38, -1, 40, 41, 42, 43, 44, 45, 281,
+ -1, 123, -1, 297, 298, 287, 288, 289, 290, -1,
+ -1, 58, 59, -1, 123, 122, 63, 64, 300, 301,
+ 302, 303, 304, 305, 306, -1, -1, 309, -1, -1,
+ 312, 313, 314, -1, 256, 257, 258, 259, 260, 261,
+ -1, 263, 264, 265, 91, -1, 93, 269, -1, -1,
+ 272, 273, 274, 275, -1, -1, -1, 279, 280, -1,
+ 282, 283, 284, 285, 286, -1, -1, -1, -1, 291,
+ 292, 293, 294, 295, 296, 41, 123, 299, 44, 126,
+ -1, -1, 91, 289, 290, -1, 308, 33, 310, 311,
+ 36, 37, 38, 59, 40, 41, 42, 43, 44, 45,
+ 306, -1, -1, 309, -1, -1, 312, 313, 314, -1,
+ -1, -1, 58, 59, 123, -1, -1, 63, 64, 272,
+ 273, 274, 275, -1, -1, -1, -1, 93, -1, 281,
+ -1, -1, -1, -1, -1, 287, 288, 289, 290, -1,
+ -1, 248, -1, -1, 297, 298, 253, 93, 300, 301,
+ 302, 303, 304, 305, 306, -1, 41, 309, -1, 44,
+ 312, 313, 314, -1, -1, 287, 288, 289, 290, -1,
+ -1, -1, -1, 58, 59, -1, -1, -1, 63, -1,
+ 126, 303, 304, 305, 306, -1, -1, 309, -1, -1,
+ 312, 313, 314, -1, -1, -1, -1, 306, -1, -1,
+ 309, -1, -1, 312, 313, 314, -1, -1, 93, -1,
+ 257, 258, 259, 260, 261, -1, 263, 264, 265, -1,
+ -1, -1, 269, -1, -1, 272, 273, 274, 275, -1,
+ -1, -1, -1, 280, 281, 282, 283, 284, 285, 286,
+ 287, 288, 289, 290, 291, 292, 293, 294, 295, 296,
+ 297, 298, 299, 300, 301, 302, 303, 304, 305, 306,
+ -1, 308, 309, 310, 311, 312, 313, 314, 41, -1,
+ -1, 44, -1, 41, -1, -1, 44, -1, 287, 288,
+ 289, 290, -1, -1, -1, 58, 59, -1, -1, -1,
+ 58, 59, -1, -1, -1, 63, 305, 306, -1, 125,
+ 309, -1, -1, 312, 313, 314, 272, 273, 274, 275,
+ -1, 257, 258, 259, 260, 261, -1, 263, 264, 265,
+ 93, -1, 125, 269, -1, 93, 272, 273, 274, 275,
+ -1, 297, -1, -1, 280, 281, 282, 283, 284, 285,
+ 286, 287, 288, 289, 290, 291, 292, 293, 294, 295,
+ 296, 297, 298, 299, 300, 301, 302, 303, 304, 305,
+ 306, -1, 308, 309, 310, 311, 312, 313, 314, 33,
+ -1, -1, 36, 37, 38, -1, 40, -1, 42, 43,
+ -1, 45, -1, -1, -1, -1, -1, 272, 273, 274,
+ 275, -1, -1, -1, -1, 59, 281, -1, -1, -1,
+ 64, -1, 287, 288, 289, 290, -1, -1, -1, -1,
+ -1, -1, 297, 298, 13, 300, 301, 302, 303, 304,
+ 305, 306, -1, -1, 309, 33, -1, 91, 36, 37,
+ 38, -1, 40, -1, 42, 43, 26, 45, -1, -1,
+ 266, 267, 268, 42, 270, 271, 45, -1, -1, -1,
+ -1, 59, -1, 43, 44, -1, 64, -1, -1, 123,
+ 50, -1, 126, 266, 267, 268, -1, 270, 271, -1,
+ -1, -1, 62, 63, 64, 65, -1, -1, -1, -1,
+ -1, 33, 81, 91, 36, 37, 38, -1, 40, -1,
+ 42, 43, -1, 45, -1, -1, 95, -1, -1, 272,
+ 273, 274, 275, -1, 272, 273, 274, 275, -1, -1,
+ -1, -1, 64, 281, -1, 123, -1, 107, 126, 287,
+ 288, 289, 290, -1, 297, 298, -1, 300, -1, 297,
+ 298, -1, 300, 301, 302, 303, 304, 305, 306, 91,
+ -1, 309, 141, -1, 33, -1, -1, 36, 37, 38,
+ -1, 40, -1, 42, 43, -1, 45, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, 91, -1, -1, -1, -1, 33, -1,
- -1, 36, 37, 38, -1, 40, -1, 42, 43, -1,
- 45, -1, 287, -1, 289, 290, -1, -1, -1, -1,
- -1, -1, -1, 140, -1, 123, -1, -1, 126, 64,
- 305, 306, -1, -1, 309, -1, -1, 312, 313, 314,
- -1, -1, -1, -1, -1, -1, 256, 257, 258, 259,
- 260, 261, -1, 263, 264, 265, 91, -1, -1, 269,
- 177, -1, 272, 273, 274, 275, -1, 184, -1, 279,
- 280, -1, 282, 283, 284, 285, 286, -1, -1, -1,
- -1, 291, 292, 293, 294, 295, 296, 91, 123, 299,
- -1, 126, -1, -1, -1, -1, -1, -1, 308, 41,
- 310, 311, 44, 257, 258, 259, 260, 261, 262, 263,
- 264, 265, -1, -1, 91, 269, -1, -1, -1, 123,
- -1, 63, -1, -1, -1, -1, 280, 289, 282, 283,
+ -1, 123, -1, -1, 126, 64, -1, -1, -1, 178,
+ -1, -1, -1, -1, -1, -1, 185, -1, -1, -1,
+ -1, -1, 256, 257, 258, 259, 260, 261, -1, 263,
+ 264, 265, 91, -1, -1, 269, -1, -1, 272, 273,
+ 274, 275, -1, -1, -1, 279, 280, -1, 282, 283,
284, 285, 286, -1, -1, -1, -1, 291, 292, 293,
- 294, 295, 296, -1, 306, 299, 123, 309, -1, 91,
- 312, 313, 314, 41, 308, -1, 310, 311, -1, 257,
+ 294, 295, 296, -1, 123, 299, -1, 126, -1, -1,
+ -1, -1, -1, -1, 308, -1, 310, 311, 256, 257,
258, 259, 260, 261, -1, 263, 264, 265, -1, -1,
- -1, 269, -1, -1, -1, 63, -1, -1, -1, -1,
- -1, 123, 280, -1, 282, 283, 284, 285, 286, -1,
+ 91, 269, -1, -1, 272, 273, 274, 275, -1, -1,
+ -1, 279, 280, -1, 282, 283, 284, 285, 286, -1,
+ -1, -1, -1, 291, 292, 293, 294, 295, 296, 91,
+ -1, 299, 123, -1, -1, -1, -1, -1, -1, -1,
+ 308, -1, 310, 311, -1, 257, 258, 259, 260, 261,
+ 262, 263, 264, 265, -1, 33, -1, 269, 36, 37,
+ 38, 123, 40, 41, 42, 43, -1, 45, 280, -1,
+ 282, 283, 284, 285, 286, -1, -1, -1, -1, 291,
+ 292, 293, 294, 295, 296, -1, 64, 299, -1, -1,
+ -1, -1, -1, -1, -1, -1, 308, -1, 310, 311,
+ -1, -1, -1, -1, -1, -1, -1, -1, 257, 258,
+ 259, 260, 261, 91, 263, 264, 265, -1, 33, -1,
+ 269, 36, 37, 38, -1, 40, -1, 42, 43, -1,
+ 45, 280, -1, 282, 283, 284, 285, 286, -1, -1,
+ -1, -1, 291, 292, 293, 294, 295, 296, 126, 64,
+ 299, -1, 299, 300, 301, -1, 303, -1, -1, 308,
+ -1, 310, 311, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 33, -1, 91, 36, 37, 38,
+ -1, 40, 329, 42, 43, -1, 45, -1, -1, 336,
+ -1, -1, -1, 340, -1, -1, 287, 288, 289, 290,
+ 59, -1, -1, -1, -1, 64, 353, 354, 123, -1,
+ -1, 126, -1, 304, 305, 306, -1, -1, 309, -1,
+ -1, 312, 313, 314, -1, 287, -1, 289, 290, -1,
+ 33, -1, 91, 36, 37, 38, -1, 40, -1, 42,
+ 43, -1, 45, 305, 306, -1, -1, 309, -1, -1,
+ 312, 313, 314, -1, -1, -1, -1, -1, -1, -1,
+ -1, 64, -1, -1, -1, -1, -1, 126, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, 257,
+ 258, 259, 260, 261, -1, 263, 264, 265, 91, 33,
+ 93, 269, 36, 37, 38, -1, 40, 41, 42, 43,
+ -1, 45, 280, -1, 282, 283, 284, 285, 286, -1,
-1, -1, -1, 291, 292, 293, 294, 295, 296, -1,
- -1, 299, -1, 91, -1, -1, -1, -1, -1, -1,
- 308, -1, 310, 311, -1, -1, -1, -1, -1, -1,
- -1, -1, 257, 258, 259, 260, 261, -1, 263, 264,
- 265, -1, -1, -1, 269, 123, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, 280, -1, 282, 283, 284,
- 285, 286, -1, -1, -1, 91, 291, 292, 293, 294,
- 295, 296, 33, -1, 299, 36, 37, 38, -1, 40,
- -1, 42, 43, 308, 45, 310, 311, -1, -1, -1,
- -1, -1, -1, 287, 288, 289, 290, 123, 59, -1,
- -1, -1, -1, 64, -1, -1, -1, 301, 302, 303,
- 304, 305, 306, -1, -1, 309, -1, -1, 312, 313,
- 314, -1, 289, 290, -1, -1, -1, -1, 33, -1,
- 91, 36, 37, 38, -1, 40, 41, 42, 43, 306,
- 45, -1, 309, -1, -1, 312, 313, 314, -1, 281,
- -1, -1, -1, -1, -1, 287, 288, 289, 290, 64,
- -1, -1, -1, -1, -1, 126, -1, -1, 300, 301,
- 302, 303, 304, 305, 306, -1, -1, 309, -1, -1,
- 312, 313, 314, -1, 33, -1, 91, 36, 37, 38,
- -1, 40, -1, 42, 43, -1, 45, -1, -1, -1,
- -1, -1, -1, 281, -1, -1, -1, -1, -1, 287,
- 288, 289, 290, -1, -1, 64, -1, -1, -1, -1,
- -1, 126, 300, 301, 302, 303, 304, 305, 306, -1,
- -1, 309, -1, -1, 312, 313, 314, -1, -1, -1,
- -1, -1, 91, 33, 93, -1, 36, 37, 38, -1,
- 40, 41, 42, 43, -1, 45, -1, -1, -1, -1,
- -1, 287, 288, 289, 290, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, 64, -1, -1, 126, 304, 305,
- 306, -1, -1, 309, -1, -1, 312, 313, 314, -1,
- -1, -1, 41, -1, -1, 44, 257, 258, 259, 260,
- 261, 91, 263, 264, 265, -1, -1, -1, 269, 58,
- 59, -1, -1, -1, 63, -1, -1, -1, -1, 280,
- -1, 282, 283, 284, 285, 286, -1, -1, -1, -1,
- 291, 292, 293, 294, 295, 296, 126, -1, 299, -1,
- -1, -1, -1, -1, 93, -1, -1, 308, 41, 310,
- 311, 44, 257, 258, 259, 260, 261, -1, 263, 264,
+ 64, 299, -1, 126, -1, -1, -1, -1, -1, -1,
+ 308, -1, 310, 311, -1, -1, -1, -1, 41, -1,
+ -1, 44, 257, 258, 259, 260, 261, 91, 263, 264,
265, -1, -1, -1, 269, 58, 59, -1, -1, -1,
63, -1, -1, -1, -1, 280, -1, 282, 283, 284,
285, 286, -1, -1, -1, -1, 291, 292, 293, 294,
- 295, 296, -1, -1, 299, -1, -1, -1, -1, -1,
- 93, -1, -1, 308, -1, 310, 311, -1, 257, 258,
- 259, 260, 261, -1, 263, 264, 265, -1, 33, -1,
- 269, 36, 37, 38, -1, 40, 41, 42, 43, -1,
- 45, 280, -1, 282, 283, 284, 285, 286, -1, -1,
- -1, -1, 291, 292, 293, 294, 295, 296, -1, 64,
- 299, -1, -1, -1, -1, -1, -1, -1, -1, 308,
- -1, 310, 311, -1, -1, -1, -1, 257, 258, 259,
- 260, 261, -1, 263, 264, 265, 91, 33, -1, 269,
- 36, 37, 38, -1, 40, -1, 42, 43, -1, 45,
- 280, -1, 282, 283, 284, 285, 286, -1, -1, -1,
- -1, 291, 292, 293, 294, 295, 296, -1, 64, 299,
- -1, 126, -1, -1, -1, -1, -1, -1, 308, -1,
- 310, 311, -1, 272, 273, 274, 275, -1, -1, -1,
- -1, -1, 281, 33, -1, 91, 36, 37, 38, 288,
- 40, 41, 42, 43, -1, 45, -1, -1, 297, 298,
- -1, 300, 301, 302, 303, 304, -1, -1, -1, -1,
- -1, -1, -1, -1, 64, -1, -1, -1, -1, -1,
- 126, -1, -1, -1, -1, -1, -1, -1, -1, 272,
+ 295, 296, 126, -1, 299, -1, -1, -1, -1, -1,
+ 93, -1, -1, 308, 41, 310, 311, 44, 257, 258,
+ 259, 260, 261, -1, 263, 264, 265, -1, -1, -1,
+ 269, 58, 59, -1, -1, -1, 63, -1, -1, -1,
+ -1, 280, -1, 282, 283, 284, 285, 286, -1, -1,
+ -1, -1, 291, 292, 293, 294, 295, 296, -1, -1,
+ 299, -1, -1, -1, -1, -1, 93, -1, -1, 308,
+ -1, 310, 311, -1, 257, 258, 259, 260, 261, -1,
+ 263, 264, 265, -1, 33, -1, 269, 36, 37, 38,
+ -1, 40, 41, 42, 43, -1, 45, 280, -1, 282,
+ 283, 284, 285, 286, -1, -1, -1, -1, 291, 292,
+ 293, 294, 295, 296, -1, 64, 299, -1, -1, -1,
+ -1, -1, -1, -1, -1, 308, -1, 310, 311, -1,
+ -1, -1, -1, 257, 258, 259, 260, 261, -1, 263,
+ 264, 265, 91, 33, -1, 269, 36, 37, 38, -1,
+ 40, -1, 42, 43, -1, 45, 280, -1, 282, 283,
+ 284, 285, 286, -1, -1, -1, -1, 291, 292, 293,
+ 294, 295, 296, -1, 64, 299, -1, 126, -1, -1,
+ -1, -1, -1, -1, 308, -1, 310, 311, -1, 272,
273, 274, 275, -1, -1, -1, -1, -1, 281, 33,
- -1, 91, 36, 37, 38, -1, 40, 41, 42, 43,
+ -1, 91, 36, 37, 38, 288, 40, 41, 42, 43,
-1, 45, -1, -1, 297, 298, -1, 300, 301, 302,
303, 304, -1, -1, -1, -1, -1, -1, -1, -1,
64, -1, -1, -1, -1, -1, 126, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, 257, 258, 259, 260, 261, 91, 263, 264,
- 265, -1, 33, -1, 269, 36, 37, 38, -1, 40,
- -1, 42, 43, -1, 45, 280, -1, 282, 283, 284,
- 285, 286, -1, -1, -1, -1, 291, 292, 293, 294,
- 295, 296, 126, 64, 299, -1, -1, -1, -1, -1,
- -1, -1, -1, 308, -1, 310, 311, -1, -1, -1,
- 256, 257, 258, 259, 260, 261, -1, 263, 264, 265,
- 91, -1, -1, 269, 41, -1, -1, 44, -1, -1,
- -1, -1, -1, -1, 280, -1, 282, 283, 284, 285,
- 286, 58, 59, -1, -1, 291, 292, 293, 294, 295,
- 296, 91, -1, 299, -1, 126, -1, -1, -1, -1,
- 41, -1, 308, 44, 310, 311, -1, 257, 258, 259,
- 260, 261, -1, 263, 264, 265, 93, 58, 59, 269,
- -1, -1, 63, 123, -1, -1, -1, -1, -1, -1,
- 280, -1, 282, 283, 284, 285, 286, -1, -1, -1,
- -1, 291, 292, 293, 294, 295, 296, -1, -1, 299,
- 91, -1, 93, -1, -1, -1, -1, -1, 308, 41,
- 310, 311, 44, 257, 258, 259, 260, 261, -1, 263,
- 264, 265, -1, -1, -1, 269, 58, 59, -1, -1,
- -1, 63, 123, -1, -1, -1, 280, -1, 282, 283,
+ -1, -1, -1, -1, -1, 272, 273, 274, 275, -1,
+ -1, -1, -1, -1, 281, 33, -1, 91, 36, 37,
+ 38, -1, 40, 41, 42, 43, -1, 45, -1, -1,
+ 297, 298, -1, 300, 301, 302, 303, 304, -1, -1,
+ -1, -1, -1, -1, -1, -1, 64, -1, -1, -1,
+ -1, -1, 126, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, 257, 258,
+ 259, 260, 261, 91, 263, 264, 265, -1, 33, -1,
+ 269, 36, 37, 38, -1, 40, -1, 42, 43, -1,
+ 45, 280, -1, 282, 283, 284, 285, 286, -1, -1,
+ -1, -1, 291, 292, 293, 294, 295, 296, 126, 64,
+ 299, -1, -1, -1, -1, -1, -1, -1, -1, 308,
+ -1, 310, 311, -1, -1, -1, 256, 257, 258, 259,
+ 260, 261, -1, 263, 264, 265, 91, -1, -1, 269,
+ 41, -1, -1, 44, -1, -1, -1, -1, -1, -1,
+ 280, -1, 282, 283, 284, 285, 286, 58, 59, -1,
+ -1, 291, 292, 293, 294, 295, 296, 91, -1, 299,
+ -1, 126, -1, -1, -1, -1, 41, -1, 308, 44,
+ 310, 311, -1, 257, 258, 259, 260, 261, -1, 263,
+ 264, 265, 93, 58, 59, 269, -1, -1, 63, 123,
+ -1, -1, -1, -1, -1, -1, 280, -1, 282, 283,
284, 285, 286, -1, -1, -1, -1, 291, 292, 293,
- 294, 295, 296, -1, -1, 299, -1, -1, -1, 91,
- -1, 93, -1, -1, 308, -1, 310, 311, -1, -1,
- -1, -1, 41, -1, -1, 44, 257, 258, 259, 260,
- 261, -1, 263, 264, 265, -1, -1, -1, 269, 58,
- 59, 123, -1, -1, 63, -1, -1, -1, -1, 280,
- -1, 282, 283, 284, 285, 286, -1, -1, -1, -1,
- 291, 292, 293, 294, 295, 296, -1, -1, 299, -1,
- 41, -1, 91, 44, 93, -1, -1, 308, -1, 310,
- 311, -1, -1, -1, -1, -1, -1, 58, 59, 289,
- 290, -1, 63, -1, -1, 272, 273, 274, 275, -1,
- -1, -1, -1, -1, 123, 305, 306, -1, -1, 309,
- -1, -1, 312, 313, 314, -1, -1, -1, -1, -1,
- 297, 298, 93, 300, -1, -1, -1, -1, -1, -1,
- -1, 272, 273, 274, 275, -1, 41, -1, -1, 44,
- 281, -1, -1, -1, -1, -1, 287, 288, 289, 290,
- -1, -1, 123, 58, 59, -1, 297, 298, 63, 300,
- 301, 302, 303, 304, 305, 306, -1, -1, 309, -1,
- -1, 312, 313, 314, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, 91, -1, 93, -1,
- 272, 273, 274, 275, -1, 41, -1, -1, 44, 281,
- -1, -1, -1, -1, -1, 287, 288, 289, 290, -1,
- -1, -1, 58, 59, -1, 297, 298, 63, 300, 301,
- 302, 303, 304, 305, 306, -1, -1, 309, -1, -1,
- 312, 313, 314, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, 93, -1, -1,
- -1, -1, -1, 272, 273, 274, 275, -1, -1, -1,
- -1, -1, 281, -1, -1, -1, -1, -1, 287, 288,
- 289, 290, -1, -1, -1, -1, -1, 123, 297, 298,
- -1, 300, 301, 302, 303, 304, 305, 306, -1, -1,
- 309, -1, -1, 312, 313, 314, -1, -1, -1, -1,
- -1, 272, 273, 274, 275, -1, 41, -1, -1, -1,
- 281, -1, -1, -1, -1, -1, 287, 288, 289, 290,
- -1, -1, -1, 58, 59, -1, 297, 298, 63, 300,
- 301, 302, 303, 304, 305, 306, -1, -1, 309, -1,
- -1, 312, 313, 314, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, 91, -1, 93, -1,
+ 294, 295, 296, -1, -1, 299, 91, -1, 93, -1,
+ -1, -1, -1, -1, 308, 41, 310, 311, 44, 257,
+ 258, 259, 260, 261, -1, 263, 264, 265, -1, -1,
+ -1, 269, 58, 59, -1, -1, -1, 63, 123, -1,
+ -1, -1, 280, -1, 282, 283, 284, 285, 286, -1,
+ -1, -1, -1, 291, 292, 293, 294, 295, 296, -1,
+ -1, 299, -1, -1, -1, 91, -1, 93, -1, -1,
+ 308, -1, 310, 311, -1, -1, -1, -1, 41, -1,
+ -1, 44, 257, 258, 259, 260, 261, -1, 263, 264,
+ 265, -1, -1, -1, 269, 58, 59, 123, -1, -1,
+ 63, -1, -1, -1, -1, 280, -1, 282, 283, 284,
+ 285, 286, -1, -1, -1, -1, 291, 292, 293, 294,
+ 295, 296, -1, -1, 299, -1, 41, -1, 91, 44,
+ 93, -1, -1, 308, -1, 310, 311, -1, -1, -1,
+ -1, -1, -1, 58, 59, 289, 290, -1, 63, -1,
+ -1, 272, 273, 274, 275, -1, -1, -1, -1, -1,
+ 123, 305, 306, -1, -1, 309, -1, -1, 312, 313,
+ 314, -1, -1, -1, -1, -1, 297, 298, 93, -1,
-1, -1, -1, -1, -1, -1, -1, 272, 273, 274,
- 275, -1, -1, -1, -1, -1, 281, -1, -1, -1,
- -1, -1, 287, 288, 289, 290, -1, -1, 123, -1,
- -1, -1, 297, 298, -1, 300, 301, 302, 303, 304,
+ 275, -1, 41, -1, -1, 44, 281, -1, -1, -1,
+ -1, -1, 287, 288, 289, 290, -1, -1, 123, 58,
+ 59, -1, 297, 298, 63, 300, 301, 302, 303, 304,
305, 306, -1, -1, 309, -1, -1, 312, 313, 314,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, 272, 273, 274, 275,
- -1, 41, -1, -1, -1, 281, -1, -1, -1, -1,
+ -1, -1, 91, -1, 93, -1, 272, 273, 274, 275,
+ -1, 41, -1, -1, 44, 281, -1, -1, -1, -1,
-1, 287, 288, 289, 290, -1, -1, -1, 58, 59,
-1, 297, 298, 63, 300, 301, 302, 303, 304, 305,
306, -1, -1, 309, -1, -1, 312, 313, 314, -1,
- 25, 26, -1, -1, 41, -1, -1, 44, -1, -1,
- -1, 91, 37, 93, 41, -1, -1, 44, 43, 44,
- 45, 58, 59, -1, -1, 50, 63, -1, -1, -1,
- -1, 58, 59, -1, -1, -1, 63, 62, 63, 64,
- 65, -1, -1, 123, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, 93, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, 93, 272, 273, 274,
- 275, -1, 41, -1, -1, 44, 281, -1, -1, -1,
- -1, 106, 287, 288, 289, 290, 123, -1, -1, 58,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 93, -1, -1, -1, -1, -1, 272,
+ 273, 274, 275, -1, -1, -1, -1, -1, 281, -1,
+ -1, -1, -1, -1, 287, 288, 289, 290, -1, -1,
+ -1, -1, -1, 123, 297, 298, -1, 300, 301, 302,
+ 303, 304, 305, 306, -1, -1, 309, -1, -1, 312,
+ 313, 314, -1, -1, -1, -1, -1, 272, 273, 274,
+ 275, -1, 41, -1, -1, -1, 281, -1, -1, -1,
+ -1, -1, 287, 288, 289, 290, -1, -1, -1, 58,
59, -1, 297, 298, 63, 300, 301, 302, 303, 304,
305, 306, -1, -1, 309, -1, -1, 312, 313, 314,
- -1, -1, -1, -1, -1, 41, -1, -1, -1, -1,
- -1, -1, -1, -1, 93, -1, -1, -1, -1, -1,
- -1, -1, 58, 59, -1, -1, -1, 63, -1, -1,
- 165, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, 123, -1, -1, -1, -1, 41,
- -1, -1, 44, -1, 189, 91, -1, 93, -1, -1,
- -1, -1, -1, -1, -1, -1, 58, 59, -1, -1,
- -1, 63, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, 272, 273, 274, 275, -1, 123, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 91, -1, 93, -1, -1, -1, -1, -1,
+ -1, -1, -1, 272, 273, 274, 275, -1, -1, -1,
+ -1, -1, 281, -1, -1, -1, -1, -1, 287, 288,
+ 289, 290, -1, -1, 123, -1, -1, -1, 297, 298,
+ -1, 300, 301, 302, 303, 304, 305, 306, -1, -1,
+ 309, -1, -1, 312, 313, 314, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 272, 273, 274, 275, -1, 41, -1, -1,
-1, 281, -1, -1, -1, -1, -1, 287, 288, 289,
- 290, 93, -1, -1, -1, -1, -1, 297, 298, -1,
+ 290, -1, -1, -1, 58, 59, -1, 297, 298, 63,
300, 301, 302, 303, 304, 305, 306, -1, -1, 309,
- -1, -1, 312, 313, 314, 272, 273, 274, 275, -1,
- 41, 123, -1, 44, 281, 272, 273, 274, 275, -1,
- 287, 288, 289, 290, 281, -1, -1, 58, 59, -1,
- 297, 298, 63, 300, 301, 302, 303, 304, 305, 306,
- 297, 298, 309, 300, 301, 312, 313, 314, -1, -1,
+ -1, -1, 312, 313, 314, -1, -1, -1, -1, -1,
+ 41, -1, -1, 44, -1, -1, -1, 91, -1, 93,
+ 41, -1, -1, 44, -1, -1, -1, 58, 59, -1,
+ -1, -1, 63, -1, -1, -1, -1, 58, 59, -1,
+ -1, -1, 63, -1, -1, -1, -1, -1, -1, 123,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, 93, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, 272, 273, 274, 275, -1, 41, -1,
+ -1, -1, 93, 272, 273, 274, 275, -1, 41, -1,
-1, 44, 281, -1, -1, -1, -1, -1, 287, 288,
- 289, 290, -1, -1, -1, 58, 59, -1, 297, 298,
+ 289, 290, 123, -1, -1, 58, 59, -1, 297, 298,
63, 300, 301, 302, 303, 304, 305, 306, -1, -1,
- 309, -1, -1, 312, 313, 314, 272, 273, 274, 275,
- -1, 41, -1, -1, 44, 281, -1, -1, -1, -1,
- 93, 287, 288, 289, 290, -1, -1, -1, 58, 59,
- -1, 297, 298, 63, 300, 301, 302, 303, 304, 305,
- 306, -1, -1, 309, -1, -1, 312, 313, 314, -1,
- 272, 273, 274, 275, -1, 41, -1, -1, 44, 281,
- -1, -1, -1, 93, -1, 287, 288, 289, 290, -1,
- -1, -1, 58, 59, -1, 297, 298, 63, 300, 301,
- 302, 303, 304, 305, 306, -1, -1, 309, -1, -1,
- 312, 313, 314, -1, -1, -1, -1, -1, 41, -1,
- -1, 44, -1, -1, -1, -1, -1, 93, -1, -1,
- -1, -1, -1, -1, -1, 58, 59, -1, -1, -1,
- 63, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, 272, 273, 274, 275, -1, 41, -1, -1, 44,
- 281, -1, -1, -1, -1, -1, 287, 288, 289, 290,
- 93, -1, -1, 58, 59, -1, 297, 298, 63, 300,
- 301, 302, 303, 304, 305, 306, -1, -1, 309, -1,
- -1, 312, 313, 314, 41, -1, -1, 44, -1, -1,
+ 309, -1, -1, 312, 313, 314, -1, -1, -1, -1,
+ -1, 41, -1, -1, -1, -1, -1, -1, -1, -1,
+ 93, -1, -1, -1, -1, -1, -1, -1, 58, 59,
+ -1, -1, -1, 63, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ 123, -1, -1, -1, -1, 41, -1, -1, 44, -1,
+ -1, 91, -1, 93, -1, -1, -1, -1, -1, -1,
+ -1, -1, 58, 59, -1, -1, -1, 63, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, 272, 273,
+ 274, 275, -1, 123, -1, -1, -1, 281, -1, -1,
+ -1, -1, -1, 287, 288, 289, 290, 93, -1, -1,
+ -1, -1, -1, 297, 298, -1, 300, 301, 302, 303,
+ 304, 305, 306, -1, -1, 309, -1, -1, 312, 313,
+ 314, 272, 273, 274, 275, -1, 41, 123, -1, 44,
+ 281, 272, 273, 274, 275, -1, 287, 288, 289, 290,
+ 281, -1, -1, 58, 59, -1, 297, 298, 63, 300,
+ 301, 302, 303, 304, 305, 306, 297, 298, 309, 300,
+ 301, 312, 313, 314, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, 93, -1,
- -1, 58, 59, -1, -1, -1, 63, -1, -1, 272,
- 273, 274, 275, -1, -1, -1, -1, -1, 281, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, 272,
+ 273, 274, 275, -1, 41, -1, -1, 44, 281, -1,
-1, -1, -1, -1, 287, 288, 289, 290, -1, -1,
- -1, -1, -1, -1, 297, 298, 93, 300, 301, 302,
+ -1, 58, 59, -1, 297, 298, 63, 300, 301, 302,
303, 304, 305, 306, -1, -1, 309, -1, -1, 312,
313, 314, 272, 273, 274, 275, -1, 41, -1, -1,
- 44, 281, -1, -1, -1, -1, -1, 287, 288, 289,
+ 44, 281, -1, -1, -1, -1, 93, 287, 288, 289,
290, -1, -1, -1, 58, 59, -1, 297, 298, 63,
300, 301, 302, 303, 304, 305, 306, -1, -1, 309,
-1, -1, 312, 313, 314, -1, 272, 273, 274, 275,
-1, 41, -1, -1, 44, 281, -1, -1, -1, 93,
-1, 287, 288, 289, 290, -1, -1, -1, 58, 59,
-1, 297, 298, 63, 300, 301, 302, 303, 304, 305,
- 306, -1, -1, 309, -1, -1, 312, 313, 314, 272,
- 273, 274, 275, -1, 41, -1, -1, 44, 281, -1,
- -1, -1, -1, 93, 287, 288, 289, 290, -1, -1,
- -1, 58, 59, -1, 297, 298, 63, 300, 301, 302,
- 303, 304, 305, 306, -1, -1, -1, 272, 273, 274,
+ 306, -1, -1, 309, -1, -1, 312, 313, 314, -1,
+ -1, -1, -1, -1, 41, -1, -1, 44, -1, -1,
+ -1, -1, -1, 93, -1, -1, -1, -1, -1, -1,
+ -1, 58, 59, -1, -1, -1, 63, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 272, 273, 274,
275, -1, 41, -1, -1, 44, 281, -1, -1, -1,
-1, -1, 287, 288, 289, 290, 93, -1, -1, 58,
59, -1, 297, 298, 63, 300, 301, 302, 303, 304,
- 305, 306, -1, -1, -1, 272, 273, 274, 275, -1,
- 41, -1, -1, 44, 281, -1, -1, -1, -1, -1,
- 287, 288, 289, 290, 93, -1, -1, 58, 59, -1,
- 297, 298, 63, 300, 301, 302, 303, 304, 305, 306,
- -1, -1, -1, -1, -1, -1, 41, -1, -1, 44,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, 93, 58, 59, -1, -1, -1, 63, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, 272, 273,
+ 305, 306, -1, -1, 309, -1, -1, 312, 313, 314,
+ 41, -1, -1, 44, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 93, -1, -1, 58, 59, -1,
+ -1, -1, 63, -1, -1, 272, 273, 274, 275, -1,
+ -1, -1, -1, -1, 281, -1, -1, -1, -1, -1,
+ 287, 288, 289, 290, -1, -1, -1, -1, -1, -1,
+ 297, 298, 93, 300, 301, 302, 303, 304, 305, 306,
+ -1, -1, 309, -1, -1, 312, 313, 314, 272, 273,
274, 275, -1, 41, -1, -1, 44, 281, -1, -1,
- -1, -1, -1, 287, 288, 289, 290, -1, 93, -1,
+ -1, -1, -1, 287, 288, 289, 290, -1, -1, -1,
58, 59, -1, 297, 298, 63, 300, 301, 302, 303,
- 304, 305, 306, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, 272, 273, 274, 275, -1, 41, -1, -1,
+ 304, 305, 306, -1, -1, 309, -1, -1, 312, 313,
+ 314, -1, 272, 273, 274, 275, -1, 41, -1, -1,
44, 281, -1, -1, -1, 93, -1, 287, 288, 289,
290, -1, -1, -1, 58, 59, -1, 297, 298, 63,
- 300, 301, 302, 303, 304, 305, 306, -1, -1, -1,
- -1, -1, -1, -1, -1, 272, 273, 274, 275, -1,
+ 300, 301, 302, 303, 304, 305, 306, -1, -1, 309,
+ -1, -1, 312, 313, 314, 272, 273, 274, 275, -1,
41, -1, -1, 44, 281, -1, -1, -1, -1, 93,
287, 288, 289, 290, -1, -1, -1, 58, 59, -1,
297, 298, 63, 300, 301, 302, 303, 304, 305, 306,
@@ -956,68 +931,93 @@ short yycheck[] = { 13,
-1, 272, 273, 274, 275, -1, 41, -1, -1, 44,
281, -1, -1, -1, -1, -1, 287, 288, 289, 290,
93, -1, -1, 58, 59, -1, 297, 298, 63, 300,
- 301, 302, 303, 304, 305, -1, -1, 272, 273, 274,
- 275, -1, 41, -1, -1, 44, 281, -1, -1, -1,
- -1, -1, 287, 288, -1, 290, -1, -1, 93, 58,
- 59, -1, 297, 298, 63, 300, 301, 302, 303, 304,
- 305, -1, -1, -1, 272, 273, 274, 275, -1, 41,
+ 301, 302, 303, 304, 305, 306, -1, -1, -1, -1,
+ -1, -1, 41, -1, -1, 44, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, 93, 58,
+ 59, -1, -1, -1, 63, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 272, 273, 274, 275, -1, 41,
-1, -1, 44, 281, -1, -1, -1, -1, -1, 287,
- 288, -1, -1, -1, 93, -1, 58, 59, -1, 297,
- 298, 63, 300, 301, 302, 303, 304, 305, -1, -1,
- 91, -1, -1, -1, -1, -1, -1, -1, 272, 273,
+ 288, 289, 290, -1, 93, -1, 58, 59, -1, 297,
+ 298, 63, 300, 301, 302, 303, 304, 305, 306, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, 272, 273,
274, 275, -1, 41, -1, -1, 44, 281, -1, -1,
- -1, 93, -1, 287, 288, -1, 41, -1, -1, 44,
- 58, 59, 123, 297, 298, 63, 300, 301, 302, 303,
- 304, -1, -1, 58, 59, 41, -1, -1, 44, -1,
- -1, 272, 273, 274, 275, 41, -1, -1, 44, -1,
- 281, -1, 58, 59, -1, 93, 287, 288, -1, -1,
- -1, -1, 58, 59, -1, -1, 297, 298, 93, 300,
- 301, 302, 303, 304, -1, 41, -1, -1, 44, 272,
- 273, 274, 275, -1, -1, -1, -1, 93, 281, -1,
- -1, -1, 58, 59, 287, 288, 58, 93, -1, -1,
- -1, 63, -1, -1, 297, 298, -1, 300, 301, 302,
- 303, 304, -1, -1, -1, -1, -1, 272, 273, 274,
- 275, -1, -1, -1, -1, -1, 281, 93, -1, 91,
- -1, -1, 287, 288, -1, 63, -1, -1, -1, -1,
- -1, -1, 297, 298, -1, 300, 301, 302, 303, 304,
+ -1, 93, -1, 287, 288, 289, 290, -1, -1, -1,
+ 58, 59, -1, 297, 298, 63, 300, 301, 302, 303,
+ 304, 305, 306, -1, -1, -1, -1, -1, -1, -1,
+ -1, 272, 273, 274, 275, -1, 41, -1, -1, 44,
+ 281, -1, -1, -1, -1, 93, 287, 288, 289, 290,
+ -1, -1, -1, 58, 59, -1, 297, 298, 63, 300,
+ 301, 302, 303, 304, 305, 306, -1, -1, -1, 272,
+ 273, 274, 275, -1, 41, -1, -1, 44, 281, -1,
+ -1, -1, -1, -1, 287, 288, 289, 290, 93, -1,
+ -1, 58, 59, -1, 297, 298, 63, 300, 301, 302,
+ 303, 304, 305, 306, -1, -1, -1, 272, 273, 274,
+ 275, -1, 41, -1, -1, 44, 281, -1, -1, -1,
+ -1, -1, 287, 288, 289, 290, 93, -1, -1, 58,
+ 59, -1, 297, 298, 63, 300, 301, 302, 303, 304,
+ 305, -1, -1, 272, 273, 274, 275, -1, 41, -1,
+ -1, 44, 281, -1, -1, -1, -1, -1, 287, 288,
+ -1, -1, -1, -1, 93, 58, 59, -1, 297, 298,
+ 63, 300, 301, 302, 303, 304, 305, -1, -1, -1,
+ 272, 273, 274, 275, -1, 41, -1, -1, 44, 281,
+ -1, -1, -1, -1, -1, 287, 288, -1, -1, -1,
+ 93, -1, 58, 59, -1, 297, 298, 63, 300, 301,
+ 302, 303, 304, -1, -1, -1, 91, -1, -1, -1,
+ -1, -1, -1, -1, 272, 273, 274, 275, -1, 41,
+ 63, -1, 44, 281, -1, -1, -1, 93, -1, 287,
+ 288, -1, -1, -1, -1, -1, 58, 59, 123, 297,
+ 298, 63, 300, 301, 302, 303, 304, -1, 91, -1,
+ -1, 58, -1, -1, -1, -1, 63, 272, 273, 274,
+ 275, -1, -1, -1, -1, -1, 281, -1, -1, -1,
+ -1, 93, 287, 288, -1, -1, -1, -1, -1, -1,
+ 123, -1, 297, 298, 91, 300, 301, 302, 303, 304,
+ -1, -1, -1, -1, -1, 272, 273, 274, 275, -1,
+ -1, -1, -1, -1, 281, -1, -1, -1, -1, -1,
+ 287, 288, -1, -1, -1, 63, 123, -1, -1, -1,
+ 297, 298, -1, 300, 301, 302, 303, 304, -1, -1,
-1, -1, -1, 272, 273, 274, 275, -1, -1, -1,
- -1, 123, 281, 91, -1, -1, -1, -1, -1, -1,
+ -1, -1, 281, 91, -1, -1, -1, -1, 25, 26,
-1, -1, -1, -1, -1, -1, -1, -1, 297, 298,
- -1, 300, 301, 302, 303, 304, 287, 288, 289, 290,
- 272, 273, 274, 275, -1, 123, -1, -1, -1, 281,
- -1, 302, 303, 304, 305, 306, -1, -1, 309, -1,
- -1, 312, 313, 314, 91, 297, 298, -1, 300, 301,
- 302, 303, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, 272, 273, 274, 275, -1, -1,
- -1, -1, -1, 281, -1, -1, 123, 272, 273, 274,
- 275, -1, -1, -1, -1, -1, -1, -1, -1, 297,
- 298, -1, 300, 301, 302, -1, 272, 273, 274, 275,
- -1, -1, 297, 298, 30, -1, 272, 273, 274, 275,
- -1, -1, 38, -1, -1, -1, 42, -1, -1, 45,
- -1, 297, 298, -1, -1, -1, 52, 53, 54, 55,
- 56, 297, 298, 59, 60, -1, 272, 273, 274, 275,
- 66, -1, -1, -1, -1, -1, -1, -1, -1, 281,
+ 37, 300, 301, 302, 303, 304, 43, 44, 45, 272,
+ 273, 274, 275, 50, -1, 123, -1, -1, 281, 91,
+ -1, -1, -1, -1, -1, 62, 63, 64, 65, -1,
+ -1, -1, -1, -1, 297, 298, -1, 300, 301, 302,
+ 303, -1, 287, 288, 289, 290, 272, 273, 274, 275,
+ -1, 123, -1, -1, -1, 281, 301, 302, 303, 304,
+ 305, 306, -1, -1, 309, -1, -1, 312, 313, 314,
+ 107, 297, 298, -1, 300, 301, 302, -1, 281, -1,
+ -1, -1, -1, -1, 287, 288, 289, 290, -1, -1,
+ 272, 273, 274, 275, -1, -1, -1, 300, 301, 302,
+ 303, 304, 305, 306, -1, -1, 309, -1, -1, 312,
+ 313, 314, -1, -1, 281, 297, 298, -1, 300, -1,
+ 287, 288, 289, 290, -1, -1, -1, -1, -1, 166,
+ -1, -1, -1, 300, 301, 302, 303, 304, 305, 306,
+ 30, -1, 309, -1, -1, 312, 313, 314, 38, -1,
+ -1, -1, 42, 190, -1, 45, -1, -1, -1, -1,
+ -1, -1, 52, 53, 54, 55, 56, -1, -1, 59,
+ 60, -1, -1, 281, -1, -1, 66, -1, -1, 287,
+ 288, 289, 290, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 301, 302, 303, 304, 305, 306, -1,
+ -1, 309, -1, 93, 312, 313, 314, -1, -1, -1,
-1, -1, -1, -1, -1, 287, 288, 289, 290, -1,
- -1, 297, 298, -1, -1, -1, 92, -1, 300, 301,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
302, 303, 304, 305, 306, -1, -1, 309, -1, -1,
- 312, 313, 314, 281, -1, -1, -1, -1, -1, 287,
- 288, 289, 290, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, 300, 301, 302, 303, 304, 305, 306, -1,
- -1, 309, -1, -1, 312, 313, 314, -1, -1, -1,
- -1, -1, -1, 149, 150, 151, 152, 153, 154, 155,
- 156, 157, 158, 159, 160, 161, 162, -1, -1, -1,
- 287, 288, 289, 290, -1, -1, -1, -1, 174, -1,
- -1, -1, -1, -1, -1, -1, 303, 304, 305, 306,
- -1, -1, 309, -1, -1, 312, 313, 314, -1, -1,
+ 312, 313, 314, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ 150, 151, 152, 153, 154, 155, 156, 157, 158, 159,
+ 160, 161, 162, 163, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 175, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, 250, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 252, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, 281,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 283,
};
#define YYFINAL 1
#ifndef YYDEBUG
@@ -1092,16 +1092,22 @@ char *yyrule[] = {
"decl : subrout",
"decl : package",
"decl : use",
-"format : FORMAT startsub WORD block",
-"format : FORMAT startsub block",
-"subrout : SUB startsub WORD proto block",
-"subrout : SUB startsub WORD proto ';'",
+"format : FORMAT startformsub formname block",
+"formname : WORD",
+"formname :",
+"subrout : SUB startsub subname proto subbody",
+"startsub :",
+"startanonsub :",
+"startformsub :",
+"subname : WORD",
"proto :",
"proto : THING",
-"startsub :",
+"subbody : block",
+"subbody : ';'",
"package : PACKAGE WORD ';'",
"package : PACKAGE ';'",
-"use : USE startsub WORD WORD listexpr ';'",
+"$$2 :",
+"use : USE startsub $$2 WORD WORD listexpr ';'",
"expr : expr ANDOP expr",
"expr : expr OROP expr",
"expr : argexpr",
@@ -1115,7 +1121,8 @@ char *yyrule[] = {
"listop : FUNCMETH indirob '(' listexprcom ')'",
"listop : LSTOP listexpr",
"listop : FUNC '(' listexprcom ')'",
-"listop : LSTOPSUB startsub block listexpr",
+"$$3 :",
+"listop : LSTOPSUB startanonsub block $$3 listexpr",
"method : METHOD",
"method : scalar",
"term : term ASSIGNOP term",
@@ -1148,7 +1155,7 @@ char *yyrule[] = {
"term : '[' ']'",
"term : HASHBRACK expr ';' '}'",
"term : HASHBRACK ';' '}'",
-"term : ANONSUB startsub proto block",
+"term : ANONSUB startanonsub proto block",
"term : scalar",
"term : star '{' expr ';' '}'",
"term : star",
@@ -1232,9 +1239,9 @@ int yyerrflag;
int yychar;
YYSTYPE yyval;
YYSTYPE yylval;
-#line 602 "perly.y"
+#line 626 "perly.y"
/* PROGRAM */
-#line 1308 "perly.c"
+#line 1315 "perly.c"
#define YYABORT goto yyabort
#define YYACCEPT goto yyaccept
#define YYERROR goto yyerrlab
@@ -1459,7 +1466,7 @@ yyreduce:
switch (yyn)
{
case 1:
-#line 85 "perly.y"
+#line 86 "perly.y"
{
#if defined(YYDEBUG) && defined(DEBUGGING)
yydebug = (debug & 1);
@@ -1468,50 +1475,50 @@ case 1:
}
break;
case 2:
-#line 92 "perly.y"
+#line 93 "perly.y"
{ newPROG(yyvsp[0].opval); }
break;
case 3:
-#line 96 "perly.y"
+#line 97 "perly.y"
{ if (copline > (line_t)yyvsp[-3].ival)
copline = yyvsp[-3].ival;
yyval.opval = block_end(yyvsp[-2].ival, yyvsp[-1].opval); }
break;
case 4:
-#line 102 "perly.y"
+#line 103 "perly.y"
{ yyval.ival = block_start(TRUE); }
break;
case 5:
-#line 106 "perly.y"
+#line 107 "perly.y"
{ if (copline > (line_t)yyvsp[-3].ival)
copline = yyvsp[-3].ival;
yyval.opval = block_end(yyvsp[-2].ival, yyvsp[-1].opval); }
break;
case 6:
-#line 112 "perly.y"
+#line 113 "perly.y"
{ yyval.ival = block_start(FALSE); }
break;
case 7:
-#line 116 "perly.y"
+#line 117 "perly.y"
{ yyval.opval = Nullop; }
break;
case 8:
-#line 118 "perly.y"
+#line 119 "perly.y"
{ yyval.opval = yyvsp[-1].opval; }
break;
case 9:
-#line 120 "perly.y"
+#line 121 "perly.y"
{ yyval.opval = append_list(OP_LINESEQ,
(LISTOP*)yyvsp[-1].opval, (LISTOP*)yyvsp[0].opval);
pad_reset_pending = TRUE;
if (yyvsp[-1].opval && yyvsp[0].opval) hints |= HINT_BLOCK_SCOPE; }
break;
case 10:
-#line 127 "perly.y"
+#line 128 "perly.y"
{ yyval.opval = newSTATEOP(0, yyvsp[-1].pval, yyvsp[0].opval); }
break;
case 12:
-#line 130 "perly.y"
+#line 131 "perly.y"
{ if (yyvsp[-1].pval != Nullch) {
yyval.opval = newSTATEOP(0, yyvsp[-1].pval, newOP(OP_NULL, 0));
}
@@ -1522,71 +1529,71 @@ case 12:
expect = XSTATE; }
break;
case 13:
-#line 139 "perly.y"
+#line 140 "perly.y"
{ yyval.opval = newSTATEOP(0, yyvsp[-2].pval, yyvsp[-1].opval);
expect = XSTATE; }
break;
case 14:
-#line 144 "perly.y"
+#line 145 "perly.y"
{ yyval.opval = Nullop; }
break;
case 15:
-#line 146 "perly.y"
+#line 147 "perly.y"
{ yyval.opval = yyvsp[0].opval; }
break;
case 16:
-#line 148 "perly.y"
+#line 149 "perly.y"
{ yyval.opval = newLOGOP(OP_AND, 0, yyvsp[0].opval, yyvsp[-2].opval); }
break;
case 17:
-#line 150 "perly.y"
+#line 151 "perly.y"
{ yyval.opval = newLOGOP(OP_OR, 0, yyvsp[0].opval, yyvsp[-2].opval); }
break;
case 18:
-#line 152 "perly.y"
+#line 153 "perly.y"
{ yyval.opval = newLOOPOP(OPf_PARENS, 1, scalar(yyvsp[0].opval), yyvsp[-2].opval); }
break;
case 19:
-#line 154 "perly.y"
+#line 155 "perly.y"
{ yyval.opval = newLOOPOP(OPf_PARENS, 1, yyvsp[0].opval, yyvsp[-2].opval);}
break;
case 20:
-#line 158 "perly.y"
+#line 159 "perly.y"
{ yyval.opval = Nullop; }
break;
case 21:
-#line 160 "perly.y"
+#line 161 "perly.y"
{ yyval.opval = scope(yyvsp[0].opval); }
break;
case 22:
-#line 162 "perly.y"
+#line 163 "perly.y"
{ copline = yyvsp[-5].ival;
yyval.opval = newSTATEOP(0, Nullch,
newCONDOP(0, yyvsp[-3].opval, scope(yyvsp[-1].opval), yyvsp[0].opval));
hints |= HINT_BLOCK_SCOPE; }
break;
case 23:
-#line 169 "perly.y"
+#line 170 "perly.y"
{ copline = yyvsp[-6].ival;
yyval.opval = block_end(yyvsp[-4].ival,
newCONDOP(0, yyvsp[-3].opval, scope(yyvsp[-1].opval), yyvsp[0].opval)); }
break;
case 24:
-#line 173 "perly.y"
+#line 174 "perly.y"
{ copline = yyvsp[-6].ival;
yyval.opval = block_end(yyvsp[-4].ival,
newCONDOP(0, yyvsp[-3].opval, scope(yyvsp[-1].opval), yyvsp[0].opval)); }
break;
case 25:
-#line 179 "perly.y"
+#line 180 "perly.y"
{ yyval.opval = Nullop; }
break;
case 26:
-#line 181 "perly.y"
+#line 182 "perly.y"
{ yyval.opval = scope(yyvsp[0].opval); }
break;
case 27:
-#line 185 "perly.y"
+#line 186 "perly.y"
{ copline = yyvsp[-6].ival;
yyval.opval = block_end(yyvsp[-4].ival,
newSTATEOP(0, yyvsp[-7].pval,
@@ -1594,7 +1601,7 @@ case 27:
yyvsp[-3].opval, yyvsp[-1].opval, yyvsp[0].opval))); }
break;
case 28:
-#line 191 "perly.y"
+#line 192 "perly.y"
{ copline = yyvsp[-6].ival;
yyval.opval = block_end(yyvsp[-4].ival,
newSTATEOP(0, yyvsp[-7].pval,
@@ -1602,23 +1609,23 @@ case 28:
yyvsp[-3].opval, yyvsp[-1].opval, yyvsp[0].opval))); }
break;
case 29:
-#line 197 "perly.y"
+#line 198 "perly.y"
{ yyval.opval = block_end(yyvsp[-6].ival,
newFOROP(0, yyvsp[-9].pval, yyvsp[-8].ival, yyvsp[-5].opval, yyvsp[-3].opval, yyvsp[-1].opval, yyvsp[0].opval)); }
break;
case 30:
-#line 200 "perly.y"
+#line 201 "perly.y"
{ yyval.opval = block_end(yyvsp[-4].ival,
newFOROP(0, yyvsp[-8].pval, yyvsp[-7].ival, mod(yyvsp[-6].opval, OP_ENTERLOOP),
yyvsp[-3].opval, yyvsp[-1].opval, yyvsp[0].opval)); }
break;
case 31:
-#line 204 "perly.y"
+#line 205 "perly.y"
{ yyval.opval = block_end(yyvsp[-4].ival,
newFOROP(0, yyvsp[-7].pval, yyvsp[-6].ival, Nullop, yyvsp[-3].opval, yyvsp[-1].opval, yyvsp[0].opval)); }
break;
case 32:
-#line 208 "perly.y"
+#line 209 "perly.y"
{ copline = yyvsp[-9].ival;
yyval.opval = block_end(yyvsp[-7].ival,
append_elem(OP_LINESEQ, scalar(yyvsp[-6].opval),
@@ -1628,364 +1635,396 @@ case 32:
yyvsp[0].opval, scalar(yyvsp[-2].opval))))); }
break;
case 33:
-#line 216 "perly.y"
+#line 217 "perly.y"
{ yyval.opval = newSTATEOP(0,
yyvsp[-2].pval, newWHILEOP(0, 1, (LOOP*)Nullop,
Nullop, yyvsp[-1].opval, yyvsp[0].opval)); }
break;
case 34:
-#line 222 "perly.y"
+#line 223 "perly.y"
{ yyval.opval = Nullop; }
break;
case 36:
-#line 227 "perly.y"
+#line 228 "perly.y"
{ (void)scan_num("1"); yyval.opval = yylval.opval; }
break;
case 38:
-#line 232 "perly.y"
+#line 233 "perly.y"
{ yyval.opval = invert(scalar(yyvsp[0].opval)); }
break;
case 39:
-#line 236 "perly.y"
+#line 237 "perly.y"
{ yyval.opval = yyvsp[0].opval; intro_my(); }
break;
case 40:
-#line 240 "perly.y"
+#line 241 "perly.y"
{ yyval.opval = yyvsp[0].opval; intro_my(); }
break;
case 41:
-#line 244 "perly.y"
+#line 245 "perly.y"
{ yyval.opval = yyvsp[0].opval; intro_my(); }
break;
case 42:
-#line 248 "perly.y"
+#line 249 "perly.y"
{ yyval.opval = yyvsp[0].opval; intro_my(); }
break;
case 43:
-#line 252 "perly.y"
+#line 253 "perly.y"
{ yyval.pval = Nullch; }
break;
case 45:
-#line 257 "perly.y"
+#line 258 "perly.y"
{ yyval.ival = 0; }
break;
case 46:
-#line 259 "perly.y"
+#line 260 "perly.y"
{ yyval.ival = 0; }
break;
case 47:
-#line 261 "perly.y"
+#line 262 "perly.y"
{ yyval.ival = 0; }
break;
case 48:
-#line 263 "perly.y"
+#line 264 "perly.y"
{ yyval.ival = 0; }
break;
case 49:
-#line 267 "perly.y"
+#line 268 "perly.y"
{ newFORM(yyvsp[-2].ival, yyvsp[-1].opval, yyvsp[0].opval); }
break;
case 50:
-#line 269 "perly.y"
-{ newFORM(yyvsp[-1].ival, Nullop, yyvsp[0].opval); }
+#line 271 "perly.y"
+{ yyval.opval = yyvsp[0].opval; }
break;
case 51:
-#line 273 "perly.y"
-{ newSUB(yyvsp[-3].ival, yyvsp[-2].opval, yyvsp[-1].opval, yyvsp[0].opval); }
+#line 272 "perly.y"
+{ yyval.opval = Nullop; }
break;
case 52:
-#line 275 "perly.y"
-{ newSUB(yyvsp[-3].ival, yyvsp[-2].opval, yyvsp[-1].opval, Nullop); expect = XSTATE; }
+#line 276 "perly.y"
+{ newSUB(yyvsp[-3].ival, yyvsp[-2].opval, yyvsp[-1].opval, yyvsp[0].opval); }
break;
case 53:
-#line 279 "perly.y"
-{ yyval.opval = Nullop; }
+#line 280 "perly.y"
+{ yyval.ival = start_subparse(); }
break;
-case 55:
+case 54:
#line 284 "perly.y"
-{ yyval.ival = start_subparse(); }
+{ yyval.ival = start_subparse();
+ CvANON_on(compcv); }
+break;
+case 55:
+#line 289 "perly.y"
+{ yyval.ival = start_subparse();
+ CvFORMAT_on(compcv); }
break;
case 56:
-#line 288 "perly.y"
-{ package(yyvsp[-1].opval); }
+#line 293 "perly.y"
+{ char *name = SvPVx(((SVOP*)yyvsp[0].opval)->op_sv, na);
+ if (strEQ(name, "BEGIN") || strEQ(name, "END"))
+ CvUNIQUE_on(compcv);
+ yyval.opval = yyvsp[0].opval; }
break;
case 57:
-#line 290 "perly.y"
+#line 300 "perly.y"
+{ yyval.opval = Nullop; }
+break;
+case 59:
+#line 304 "perly.y"
+{ yyval.opval = yyvsp[0].opval; }
+break;
+case 60:
+#line 305 "perly.y"
+{ yyval.opval = Nullop; expect = XSTATE; }
+break;
+case 61:
+#line 309 "perly.y"
+{ package(yyvsp[-1].opval); }
+break;
+case 62:
+#line 311 "perly.y"
{ package(Nullop); }
break;
-case 58:
-#line 294 "perly.y"
-{ utilize(yyvsp[-5].ival, yyvsp[-4].ival, yyvsp[-3].opval, yyvsp[-2].opval, yyvsp[-1].opval); }
+case 63:
+#line 315 "perly.y"
+{ CvUNIQUE_on(compcv); /* It's a BEGIN {} */ }
+break;
+case 64:
+#line 317 "perly.y"
+{ utilize(yyvsp[-6].ival, yyvsp[-5].ival, yyvsp[-3].opval, yyvsp[-2].opval, yyvsp[-1].opval); }
break;
-case 59:
-#line 298 "perly.y"
+case 65:
+#line 321 "perly.y"
{ yyval.opval = newLOGOP(OP_AND, 0, yyvsp[-2].opval, yyvsp[0].opval); }
break;
-case 60:
-#line 300 "perly.y"
+case 66:
+#line 323 "perly.y"
{ yyval.opval = newLOGOP(yyvsp[-1].ival, 0, yyvsp[-2].opval, yyvsp[0].opval); }
break;
-case 62:
-#line 305 "perly.y"
+case 68:
+#line 328 "perly.y"
{ yyval.opval = yyvsp[-1].opval; }
break;
-case 63:
-#line 307 "perly.y"
+case 69:
+#line 330 "perly.y"
{ yyval.opval = append_elem(OP_LIST, yyvsp[-2].opval, yyvsp[0].opval); }
break;
-case 65:
-#line 312 "perly.y"
+case 71:
+#line 335 "perly.y"
{ yyval.opval = convert(yyvsp[-2].ival, OPf_STACKED,
prepend_elem(OP_LIST, newGVREF(yyvsp[-2].ival,yyvsp[-1].opval), yyvsp[0].opval) ); }
break;
-case 66:
-#line 315 "perly.y"
+case 72:
+#line 338 "perly.y"
{ yyval.opval = convert(yyvsp[-4].ival, OPf_STACKED,
prepend_elem(OP_LIST, newGVREF(yyvsp[-4].ival,yyvsp[-2].opval), yyvsp[-1].opval) ); }
break;
-case 67:
-#line 318 "perly.y"
+case 73:
+#line 341 "perly.y"
{ yyval.opval = convert(OP_ENTERSUB, OPf_STACKED,
append_elem(OP_LIST,
prepend_elem(OP_LIST, scalar(yyvsp[-5].opval), yyvsp[-1].opval),
newUNOP(OP_METHOD, 0, yyvsp[-3].opval))); }
break;
-case 68:
-#line 323 "perly.y"
+case 74:
+#line 346 "perly.y"
{ yyval.opval = convert(OP_ENTERSUB, OPf_STACKED,
append_elem(OP_LIST,
prepend_elem(OP_LIST, yyvsp[-1].opval, yyvsp[0].opval),
newUNOP(OP_METHOD, 0, yyvsp[-2].opval))); }
break;
-case 69:
-#line 328 "perly.y"
+case 75:
+#line 351 "perly.y"
{ yyval.opval = convert(OP_ENTERSUB, OPf_STACKED,
append_elem(OP_LIST,
prepend_elem(OP_LIST, yyvsp[-3].opval, yyvsp[-1].opval),
newUNOP(OP_METHOD, 0, yyvsp[-4].opval))); }
break;
-case 70:
-#line 333 "perly.y"
+case 76:
+#line 356 "perly.y"
{ yyval.opval = convert(yyvsp[-1].ival, 0, yyvsp[0].opval); }
break;
-case 71:
-#line 335 "perly.y"
+case 77:
+#line 358 "perly.y"
{ yyval.opval = convert(yyvsp[-3].ival, 0, yyvsp[-1].opval); }
break;
-case 72:
-#line 337 "perly.y"
+case 78:
+#line 360 "perly.y"
+{ yyvsp[0].opval = newANONSUB(yyvsp[-1].ival, 0, yyvsp[0].opval); }
+break;
+case 79:
+#line 362 "perly.y"
{ yyval.opval = newUNOP(OP_ENTERSUB, OPf_STACKED,
- append_elem(OP_LIST,
- prepend_elem(OP_LIST, newANONSUB(yyvsp[-2].ival, 0, yyvsp[-1].opval), yyvsp[0].opval),
- yyvsp[-3].opval)); }
+ append_elem(OP_LIST,
+ prepend_elem(OP_LIST, yyvsp[-2].opval, yyvsp[0].opval), yyvsp[-4].opval)); }
break;
-case 75:
-#line 348 "perly.y"
+case 82:
+#line 372 "perly.y"
{ yyval.opval = newASSIGNOP(OPf_STACKED, yyvsp[-2].opval, yyvsp[-1].ival, yyvsp[0].opval); }
break;
-case 76:
-#line 350 "perly.y"
+case 83:
+#line 374 "perly.y"
{ yyval.opval = newBINOP(yyvsp[-1].ival, 0, scalar(yyvsp[-2].opval), scalar(yyvsp[0].opval)); }
break;
-case 77:
-#line 352 "perly.y"
+case 84:
+#line 376 "perly.y"
{ if (yyvsp[-1].ival != OP_REPEAT)
scalar(yyvsp[-2].opval);
yyval.opval = newBINOP(yyvsp[-1].ival, 0, yyvsp[-2].opval, scalar(yyvsp[0].opval)); }
break;
-case 78:
-#line 356 "perly.y"
+case 85:
+#line 380 "perly.y"
{ yyval.opval = newBINOP(yyvsp[-1].ival, 0, scalar(yyvsp[-2].opval), scalar(yyvsp[0].opval)); }
break;
-case 79:
-#line 358 "perly.y"
+case 86:
+#line 382 "perly.y"
{ yyval.opval = newBINOP(yyvsp[-1].ival, 0, scalar(yyvsp[-2].opval), scalar(yyvsp[0].opval)); }
break;
-case 80:
-#line 360 "perly.y"
+case 87:
+#line 384 "perly.y"
{ yyval.opval = newBINOP(yyvsp[-1].ival, 0, scalar(yyvsp[-2].opval), scalar(yyvsp[0].opval)); }
break;
-case 81:
-#line 362 "perly.y"
+case 88:
+#line 386 "perly.y"
{ yyval.opval = newBINOP(yyvsp[-1].ival, 0, scalar(yyvsp[-2].opval), scalar(yyvsp[0].opval)); }
break;
-case 82:
-#line 364 "perly.y"
+case 89:
+#line 388 "perly.y"
{ yyval.opval = newBINOP(yyvsp[-1].ival, 0, scalar(yyvsp[-2].opval), scalar(yyvsp[0].opval)); }
break;
-case 83:
-#line 366 "perly.y"
+case 90:
+#line 390 "perly.y"
{ yyval.opval = newBINOP(yyvsp[-1].ival, 0, scalar(yyvsp[-2].opval), scalar(yyvsp[0].opval)); }
break;
-case 84:
-#line 368 "perly.y"
+case 91:
+#line 392 "perly.y"
{ yyval.opval = newRANGE(yyvsp[-1].ival, scalar(yyvsp[-2].opval), scalar(yyvsp[0].opval));}
break;
-case 85:
-#line 370 "perly.y"
+case 92:
+#line 394 "perly.y"
{ yyval.opval = newLOGOP(OP_AND, 0, yyvsp[-2].opval, yyvsp[0].opval); }
break;
-case 86:
-#line 372 "perly.y"
+case 93:
+#line 396 "perly.y"
{ yyval.opval = newLOGOP(OP_OR, 0, yyvsp[-2].opval, yyvsp[0].opval); }
break;
-case 87:
-#line 374 "perly.y"
+case 94:
+#line 398 "perly.y"
{ yyval.opval = newCONDOP(0, yyvsp[-4].opval, yyvsp[-2].opval, yyvsp[0].opval); }
break;
-case 88:
-#line 376 "perly.y"
+case 95:
+#line 400 "perly.y"
{ yyval.opval = bind_match(yyvsp[-1].ival, yyvsp[-2].opval, yyvsp[0].opval); }
break;
-case 89:
-#line 379 "perly.y"
+case 96:
+#line 403 "perly.y"
{ yyval.opval = newUNOP(OP_NEGATE, 0, scalar(yyvsp[0].opval)); }
break;
-case 90:
-#line 381 "perly.y"
+case 97:
+#line 405 "perly.y"
{ yyval.opval = yyvsp[0].opval; }
break;
-case 91:
-#line 383 "perly.y"
+case 98:
+#line 407 "perly.y"
{ yyval.opval = newUNOP(OP_NOT, 0, scalar(yyvsp[0].opval)); }
break;
-case 92:
-#line 385 "perly.y"
+case 99:
+#line 409 "perly.y"
{ yyval.opval = newUNOP(OP_COMPLEMENT, 0, scalar(yyvsp[0].opval));}
break;
-case 93:
-#line 387 "perly.y"
+case 100:
+#line 411 "perly.y"
{ yyval.opval = newUNOP(OP_REFGEN, 0, mod(yyvsp[0].opval,OP_REFGEN)); }
break;
-case 94:
-#line 389 "perly.y"
+case 101:
+#line 413 "perly.y"
{ yyval.opval = newUNOP(OP_POSTINC, 0,
mod(scalar(yyvsp[-1].opval), OP_POSTINC)); }
break;
-case 95:
-#line 392 "perly.y"
+case 102:
+#line 416 "perly.y"
{ yyval.opval = newUNOP(OP_POSTDEC, 0,
mod(scalar(yyvsp[-1].opval), OP_POSTDEC)); }
break;
-case 96:
-#line 395 "perly.y"
+case 103:
+#line 419 "perly.y"
{ yyval.opval = newUNOP(OP_PREINC, 0,
mod(scalar(yyvsp[0].opval), OP_PREINC)); }
break;
-case 97:
-#line 398 "perly.y"
+case 104:
+#line 422 "perly.y"
{ yyval.opval = newUNOP(OP_PREDEC, 0,
mod(scalar(yyvsp[0].opval), OP_PREDEC)); }
break;
-case 98:
-#line 401 "perly.y"
+case 105:
+#line 425 "perly.y"
{ yyval.opval = localize(yyvsp[0].opval,yyvsp[-1].ival); }
break;
-case 99:
-#line 403 "perly.y"
+case 106:
+#line 427 "perly.y"
{ yyval.opval = sawparens(yyvsp[-1].opval); }
break;
-case 100:
-#line 405 "perly.y"
+case 107:
+#line 429 "perly.y"
{ yyval.opval = sawparens(newNULLLIST()); }
break;
-case 101:
-#line 407 "perly.y"
+case 108:
+#line 431 "perly.y"
{ yyval.opval = newANONLIST(yyvsp[-1].opval); }
break;
-case 102:
-#line 409 "perly.y"
+case 109:
+#line 433 "perly.y"
{ yyval.opval = newANONLIST(Nullop); }
break;
-case 103:
-#line 411 "perly.y"
+case 110:
+#line 435 "perly.y"
{ yyval.opval = newANONHASH(yyvsp[-2].opval); }
break;
-case 104:
-#line 413 "perly.y"
+case 111:
+#line 437 "perly.y"
{ yyval.opval = newANONHASH(Nullop); }
break;
-case 105:
-#line 415 "perly.y"
+case 112:
+#line 439 "perly.y"
{ yyval.opval = newANONSUB(yyvsp[-2].ival, yyvsp[-1].opval, yyvsp[0].opval); }
break;
-case 106:
-#line 417 "perly.y"
+case 113:
+#line 441 "perly.y"
{ yyval.opval = yyvsp[0].opval; }
break;
-case 107:
-#line 419 "perly.y"
+case 114:
+#line 443 "perly.y"
{ yyval.opval = newBINOP(OP_GELEM, 0, newGVREF(0,yyvsp[-4].opval), yyvsp[-2].opval); }
break;
-case 108:
-#line 421 "perly.y"
+case 115:
+#line 445 "perly.y"
{ yyval.opval = yyvsp[0].opval; }
break;
-case 109:
-#line 423 "perly.y"
+case 116:
+#line 447 "perly.y"
{ yyval.opval = newBINOP(OP_AELEM, 0, oopsAV(yyvsp[-3].opval), scalar(yyvsp[-1].opval)); }
break;
-case 110:
-#line 425 "perly.y"
+case 117:
+#line 449 "perly.y"
{ yyval.opval = newBINOP(OP_AELEM, 0,
ref(newAVREF(yyvsp[-4].opval),OP_RV2AV),
scalar(yyvsp[-1].opval));}
break;
-case 111:
-#line 429 "perly.y"
+case 118:
+#line 453 "perly.y"
{ assertref(yyvsp[-3].opval); yyval.opval = newBINOP(OP_AELEM, 0,
ref(newAVREF(yyvsp[-3].opval),OP_RV2AV),
scalar(yyvsp[-1].opval));}
break;
-case 112:
-#line 433 "perly.y"
+case 119:
+#line 457 "perly.y"
{ yyval.opval = yyvsp[0].opval; }
break;
-case 113:
-#line 435 "perly.y"
+case 120:
+#line 459 "perly.y"
{ yyval.opval = yyvsp[0].opval; }
break;
-case 114:
-#line 437 "perly.y"
+case 121:
+#line 461 "perly.y"
{ yyval.opval = newUNOP(OP_AV2ARYLEN, 0, ref(yyvsp[0].opval, OP_AV2ARYLEN));}
break;
-case 115:
-#line 439 "perly.y"
+case 122:
+#line 463 "perly.y"
{ yyval.opval = newBINOP(OP_HELEM, 0, oopsHV(yyvsp[-4].opval), jmaybe(yyvsp[-2].opval));
expect = XOPERATOR; }
break;
-case 116:
-#line 442 "perly.y"
+case 123:
+#line 466 "perly.y"
{ yyval.opval = newBINOP(OP_HELEM, 0,
ref(newHVREF(yyvsp[-5].opval),OP_RV2HV),
jmaybe(yyvsp[-2].opval));
expect = XOPERATOR; }
break;
-case 117:
-#line 447 "perly.y"
+case 124:
+#line 471 "perly.y"
{ assertref(yyvsp[-4].opval); yyval.opval = newBINOP(OP_HELEM, 0,
ref(newHVREF(yyvsp[-4].opval),OP_RV2HV),
jmaybe(yyvsp[-2].opval));
expect = XOPERATOR; }
break;
-case 118:
-#line 452 "perly.y"
+case 125:
+#line 476 "perly.y"
{ yyval.opval = newSLICEOP(0, yyvsp[-1].opval, yyvsp[-4].opval); }
break;
-case 119:
-#line 454 "perly.y"
+case 126:
+#line 478 "perly.y"
{ yyval.opval = newSLICEOP(0, yyvsp[-1].opval, Nullop); }
break;
-case 120:
-#line 456 "perly.y"
+case 127:
+#line 480 "perly.y"
{ yyval.opval = prepend_elem(OP_ASLICE,
newOP(OP_PUSHMARK, 0),
newLISTOP(OP_ASLICE, 0,
list(yyvsp[-1].opval),
ref(yyvsp[-3].opval, OP_ASLICE))); }
break;
-case 121:
-#line 462 "perly.y"
+case 128:
+#line 486 "perly.y"
{ yyval.opval = prepend_elem(OP_HSLICE,
newOP(OP_PUSHMARK, 0),
newLISTOP(OP_HSLICE, 0,
@@ -1993,38 +2032,38 @@ case 121:
ref(oopsHV(yyvsp[-4].opval), OP_HSLICE)));
expect = XOPERATOR; }
break;
-case 122:
-#line 469 "perly.y"
+case 129:
+#line 493 "perly.y"
{ yyval.opval = yyvsp[0].opval; }
break;
-case 123:
-#line 471 "perly.y"
+case 130:
+#line 495 "perly.y"
{ yyval.opval = newUNOP(OP_ENTERSUB, 0, scalar(yyvsp[0].opval)); }
break;
-case 124:
-#line 473 "perly.y"
+case 131:
+#line 497 "perly.y"
{ yyval.opval = newUNOP(OP_ENTERSUB, OPf_STACKED, scalar(yyvsp[-2].opval)); }
break;
-case 125:
-#line 475 "perly.y"
+case 132:
+#line 499 "perly.y"
{ yyval.opval = newUNOP(OP_ENTERSUB, OPf_STACKED,
append_elem(OP_LIST, yyvsp[-1].opval, scalar(yyvsp[-3].opval))); }
break;
-case 126:
-#line 478 "perly.y"
+case 133:
+#line 502 "perly.y"
{ yyval.opval = newUNOP(OP_ENTERSUB, OPf_STACKED,
append_elem(OP_LIST, yyvsp[0].opval, scalar(yyvsp[-1].opval))); }
break;
-case 127:
-#line 481 "perly.y"
+case 134:
+#line 505 "perly.y"
{ yyval.opval = newUNOP(OP_DOFILE, 0, scalar(yyvsp[0].opval)); }
break;
-case 128:
-#line 483 "perly.y"
+case 135:
+#line 507 "perly.y"
{ yyval.opval = newUNOP(OP_NULL, OPf_SPECIAL, scope(yyvsp[0].opval)); }
break;
-case 129:
-#line 485 "perly.y"
+case 136:
+#line 509 "perly.y"
{ yyval.opval = newUNOP(OP_ENTERSUB,
OPf_SPECIAL|OPf_STACKED,
prepend_elem(OP_LIST,
@@ -2033,8 +2072,8 @@ case 129:
scalar(yyvsp[-2].opval)
)),Nullop)); dep();}
break;
-case 130:
-#line 493 "perly.y"
+case 137:
+#line 517 "perly.y"
{ yyval.opval = newUNOP(OP_ENTERSUB,
OPf_SPECIAL|OPf_STACKED,
append_elem(OP_LIST,
@@ -2044,151 +2083,151 @@ case 130:
scalar(yyvsp[-3].opval)
)))); dep();}
break;
-case 131:
-#line 502 "perly.y"
+case 138:
+#line 526 "perly.y"
{ yyval.opval = newUNOP(OP_ENTERSUB, OPf_SPECIAL|OPf_STACKED,
prepend_elem(OP_LIST,
scalar(newCVREF(0,scalar(yyvsp[-2].opval))), Nullop)); dep();}
break;
-case 132:
-#line 506 "perly.y"
+case 139:
+#line 530 "perly.y"
{ yyval.opval = newUNOP(OP_ENTERSUB, OPf_SPECIAL|OPf_STACKED,
prepend_elem(OP_LIST,
yyvsp[-1].opval,
scalar(newCVREF(0,scalar(yyvsp[-3].opval))))); dep();}
break;
-case 133:
-#line 511 "perly.y"
+case 140:
+#line 535 "perly.y"
{ yyval.opval = newOP(yyvsp[0].ival, OPf_SPECIAL);
hints |= HINT_BLOCK_SCOPE; }
break;
-case 134:
-#line 514 "perly.y"
+case 141:
+#line 538 "perly.y"
{ yyval.opval = newLOOPEX(yyvsp[-1].ival,yyvsp[0].opval); }
break;
-case 135:
-#line 516 "perly.y"
+case 142:
+#line 540 "perly.y"
{ yyval.opval = newUNOP(OP_NOT, 0, scalar(yyvsp[0].opval)); }
break;
-case 136:
-#line 518 "perly.y"
+case 143:
+#line 542 "perly.y"
{ yyval.opval = newOP(yyvsp[0].ival, 0); }
break;
-case 137:
-#line 520 "perly.y"
+case 144:
+#line 544 "perly.y"
{ yyval.opval = newUNOP(yyvsp[-1].ival, 0, yyvsp[0].opval); }
break;
-case 138:
-#line 522 "perly.y"
+case 145:
+#line 546 "perly.y"
{ yyval.opval = newUNOP(yyvsp[-1].ival, 0, yyvsp[0].opval); }
break;
-case 139:
-#line 524 "perly.y"
+case 146:
+#line 548 "perly.y"
{ yyval.opval = newUNOP(OP_ENTERSUB, OPf_STACKED,
append_elem(OP_LIST, yyvsp[0].opval, scalar(yyvsp[-1].opval))); }
break;
-case 140:
-#line 527 "perly.y"
+case 147:
+#line 551 "perly.y"
{ yyval.opval = newOP(yyvsp[0].ival, 0); }
break;
-case 141:
-#line 529 "perly.y"
+case 148:
+#line 553 "perly.y"
{ yyval.opval = newOP(yyvsp[-2].ival, 0); }
break;
-case 142:
-#line 531 "perly.y"
-{ yyval.opval = newUNOP(OP_ENTERSUB, 0,
+case 149:
+#line 555 "perly.y"
+{ yyval.opval = newUNOP(OP_ENTERSUB, OPf_STACKED,
scalar(yyvsp[0].opval)); }
break;
-case 143:
-#line 534 "perly.y"
+case 150:
+#line 558 "perly.y"
{ yyval.opval = newOP(yyvsp[-2].ival, OPf_SPECIAL); }
break;
-case 144:
-#line 536 "perly.y"
+case 151:
+#line 560 "perly.y"
{ yyval.opval = newUNOP(yyvsp[-3].ival, 0, yyvsp[-1].opval); }
break;
-case 145:
-#line 538 "perly.y"
+case 152:
+#line 562 "perly.y"
{ yyval.opval = pmruntime(yyvsp[-3].opval, yyvsp[-1].opval, Nullop); }
break;
-case 146:
-#line 540 "perly.y"
+case 153:
+#line 564 "perly.y"
{ yyval.opval = pmruntime(yyvsp[-5].opval, yyvsp[-3].opval, yyvsp[-1].opval); }
break;
-case 149:
-#line 546 "perly.y"
+case 156:
+#line 570 "perly.y"
{ yyval.opval = Nullop; }
break;
-case 150:
-#line 548 "perly.y"
+case 157:
+#line 572 "perly.y"
{ yyval.opval = yyvsp[0].opval; }
break;
-case 151:
-#line 552 "perly.y"
+case 158:
+#line 576 "perly.y"
{ yyval.opval = Nullop; }
break;
-case 152:
-#line 554 "perly.y"
+case 159:
+#line 578 "perly.y"
{ yyval.opval = yyvsp[0].opval; }
break;
-case 153:
-#line 556 "perly.y"
+case 160:
+#line 580 "perly.y"
{ yyval.opval = yyvsp[-1].opval; }
break;
-case 154:
-#line 559 "perly.y"
+case 161:
+#line 583 "perly.y"
{ yyval.ival = 0; }
break;
-case 155:
-#line 560 "perly.y"
+case 162:
+#line 584 "perly.y"
{ yyval.ival = 1; }
break;
-case 156:
-#line 564 "perly.y"
+case 163:
+#line 588 "perly.y"
{ in_my = 0; yyval.opval = my(yyvsp[0].opval); }
break;
-case 157:
-#line 568 "perly.y"
+case 164:
+#line 592 "perly.y"
{ yyval.opval = newCVREF(yyvsp[-1].ival,yyvsp[0].opval); }
break;
-case 158:
-#line 572 "perly.y"
+case 165:
+#line 596 "perly.y"
{ yyval.opval = newSVREF(yyvsp[0].opval); }
break;
-case 159:
-#line 576 "perly.y"
+case 166:
+#line 600 "perly.y"
{ yyval.opval = newAVREF(yyvsp[0].opval); }
break;
-case 160:
-#line 580 "perly.y"
+case 167:
+#line 604 "perly.y"
{ yyval.opval = newHVREF(yyvsp[0].opval); }
break;
-case 161:
-#line 584 "perly.y"
+case 168:
+#line 608 "perly.y"
{ yyval.opval = newAVREF(yyvsp[0].opval); }
break;
-case 162:
-#line 588 "perly.y"
+case 169:
+#line 612 "perly.y"
{ yyval.opval = newGVREF(0,yyvsp[0].opval); }
break;
-case 163:
-#line 592 "perly.y"
+case 170:
+#line 616 "perly.y"
{ yyval.opval = scalar(yyvsp[0].opval); }
break;
-case 164:
-#line 594 "perly.y"
+case 171:
+#line 618 "perly.y"
{ yyval.opval = scalar(yyvsp[0].opval); }
break;
-case 165:
-#line 596 "perly.y"
+case 172:
+#line 620 "perly.y"
{ yyval.opval = scope(yyvsp[0].opval); }
break;
-case 166:
-#line 599 "perly.y"
+case 173:
+#line 623 "perly.y"
{ yyval.opval = yyvsp[0].opval; }
break;
-#line 2178 "perly.c"
+#line 2217 "perly.c"
}
yyssp -= yym;
yystate = *yyssp;
diff --git a/perly.c.diff b/perly.c.diff
index dae42d3774..4bae11aa35 100644
--- a/perly.c.diff
+++ b/perly.c.diff
@@ -78,7 +78,7 @@ Index: perly.c
#define YYERRCODE 256
short yylhs[] = { -1,
***************
-*** 1296,1306 ****
+*** 1303,1313 ****
int yyerrflag;
int yychar;
- short *yyssp;
@@ -88,12 +88,12 @@ Index: perly.c
- short yyss[YYSTACKSIZE];
- YYSTYPE yyvs[YYSTACKSIZE];
- #define yystacksize YYSTACKSIZE
- #line 602 "perly.y"
+ #line 626 "perly.y"
/* PROGRAM */
---- 1231,1236 ----
+--- 1238,1243 ----
***************
-*** 1309,1320 ****
---- 1239,1295 ----
+*** 1316,1327 ****
+--- 1246,1302 ----
#define YYACCEPT goto yyaccept
#define YYERROR goto yyerrlab
+
@@ -152,8 +152,8 @@ Index: perly.c
if (yys = getenv("YYDEBUG"))
{
***************
-*** 1329,1332 ****
---- 1304,1315 ----
+*** 1336,1339 ****
+--- 1311,1322 ----
yychar = (-1);
+ /*
@@ -167,20 +167,20 @@ Index: perly.c
yyssp = yyss;
yyvsp = yyvs;
***************
-*** 1344,1348 ****
+*** 1351,1355 ****
if (yychar <= YYMAXTOKEN) yys = yyname[yychar];
if (!yys) yys = "illegal-symbol";
! printf("yydebug: state %d, reading %d (%s)\n", yystate,
yychar, yys);
}
---- 1327,1331 ----
+--- 1334,1338 ----
if (yychar <= YYMAXTOKEN) yys = yyname[yychar];
if (!yys) yys = "illegal-symbol";
! fprintf(stderr, "yydebug: state %d, reading %d (%s)\n", yystate,
yychar, yys);
}
***************
-*** 1354,1363 ****
+*** 1361,1370 ****
#if YYDEBUG
if (yydebug)
! printf("yydebug: state %d, shifting to state %d\n",
@@ -191,7 +191,7 @@ Index: perly.c
! goto yyoverflow;
}
*++yyssp = yystate = yytable[yyn];
---- 1337,1360 ----
+--- 1344,1367 ----
#if YYDEBUG
if (yydebug)
! fprintf(stderr, "yydebug: state %d, shifting to state %d\n",
@@ -217,7 +217,7 @@ Index: perly.c
}
*++yyssp = yystate = yytable[yyn];
***************
-*** 1395,1404 ****
+*** 1402,1411 ****
#if YYDEBUG
if (yydebug)
! printf("yydebug: state %d, error recovery shifting\
@@ -228,7 +228,7 @@ Index: perly.c
! goto yyoverflow;
}
*++yyssp = yystate = yytable[yyn];
---- 1392,1416 ----
+--- 1399,1423 ----
#if YYDEBUG
if (yydebug)
! fprintf(stderr,
@@ -255,14 +255,14 @@ Index: perly.c
}
*++yyssp = yystate = yytable[yyn];
***************
-*** 1410,1415 ****
+*** 1417,1422 ****
#if YYDEBUG
if (yydebug)
! printf("yydebug: error recovery discarding state %d\n",
! *yyssp);
#endif
if (yyssp <= yyss) goto yyabort;
---- 1422,1428 ----
+--- 1429,1435 ----
#if YYDEBUG
if (yydebug)
! fprintf(stderr,
@@ -271,14 +271,14 @@ Index: perly.c
#endif
if (yyssp <= yyss) goto yyabort;
***************
-*** 1428,1433 ****
+*** 1435,1440 ****
if (yychar <= YYMAXTOKEN) yys = yyname[yychar];
if (!yys) yys = "illegal-symbol";
! printf("yydebug: state %d, error recovery discards token %d (%s)\n",
! yystate, yychar, yys);
}
#endif
---- 1441,1447 ----
+--- 1448,1454 ----
if (yychar <= YYMAXTOKEN) yys = yyname[yychar];
if (!yys) yys = "illegal-symbol";
! fprintf(stderr,
@@ -287,27 +287,27 @@ Index: perly.c
}
#endif
***************
-*** 1438,1442 ****
+*** 1445,1449 ****
#if YYDEBUG
if (yydebug)
! printf("yydebug: state %d, reducing by rule %d (%s)\n",
yystate, yyn, yyrule[yyn]);
#endif
---- 1452,1456 ----
+--- 1459,1463 ----
#if YYDEBUG
if (yydebug)
! fprintf(stderr, "yydebug: state %d, reducing by rule %d (%s)\n",
yystate, yyn, yyrule[yyn]);
#endif
***************
-*** 2185,2190 ****
+*** 2224,2229 ****
#if YYDEBUG
if (yydebug)
! printf("yydebug: after reduction, shifting from state 0 to\
! state %d\n", YYFINAL);
#endif
yystate = YYFINAL;
---- 2199,2205 ----
+--- 2238,2244 ----
#if YYDEBUG
if (yydebug)
! fprintf(stderr,
@@ -316,20 +316,20 @@ Index: perly.c
#endif
yystate = YYFINAL;
***************
-*** 2200,2204 ****
+*** 2239,2243 ****
if (yychar <= YYMAXTOKEN) yys = yyname[yychar];
if (!yys) yys = "illegal-symbol";
! printf("yydebug: state %d, reading %d (%s)\n",
YYFINAL, yychar, yys);
}
---- 2215,2219 ----
+--- 2254,2258 ----
if (yychar <= YYMAXTOKEN) yys = yyname[yychar];
if (!yys) yys = "illegal-symbol";
! fprintf(stderr, "yydebug: state %d, reading %d (%s)\n",
YYFINAL, yychar, yys);
}
***************
-*** 2215,2224 ****
+*** 2254,2263 ****
#if YYDEBUG
if (yydebug)
! printf("yydebug: after reduction, shifting from state %d \
@@ -340,7 +340,7 @@ Index: perly.c
! goto yyoverflow;
}
*++yyssp = yystate;
---- 2230,2254 ----
+--- 2269,2293 ----
#if YYDEBUG
if (yydebug)
! fprintf(stderr,
@@ -367,7 +367,7 @@ Index: perly.c
}
*++yyssp = yystate;
***************
-*** 2226,2233 ****
+*** 2265,2272 ****
goto yyloop;
yyoverflow:
! yyerror("yacc stack overflow");
@@ -376,7 +376,7 @@ Index: perly.c
yyaccept:
! return (0);
}
---- 2256,2263 ----
+--- 2295,2302 ----
goto yyloop;
yyoverflow:
! yyerror("Out of memory for yacc stack");
diff --git a/perly.y b/perly.y
index a281dff9b9..7da1be33f1 100644
--- a/perly.y
+++ b/perly.y
@@ -46,12 +46,13 @@ dep()
%token <ival> DOLSHARP DO HASHBRACK NOAMP
%token LOCAL MY
-%type <ival> prog decl local format startsub remember mremember '&'
+%type <ival> prog decl local format startsub startanonsub startformsub
+%type <ival> remember mremember '&'
%type <opval> block mblock lineseq line loop cond else
%type <opval> expr term scalar ary hsh arylen star amper sideff
%type <opval> argexpr nexpr texpr iexpr mexpr mnexpr mtexpr miexpr
-%type <opval> listexpr listexprcom indirob
-%type <opval> listop method proto cont my_scalar
+%type <opval> listexpr listexprcom indirob listop method
+%type <opval> formname subname proto subbody cont my_scalar
%type <pval> label
%left <ival> OROP
@@ -263,25 +264,45 @@ decl : format
{ $$ = 0; }
;
-format : FORMAT startsub WORD block
+format : FORMAT startformsub formname block
{ newFORM($2, $3, $4); }
- | FORMAT startsub block
- { newFORM($2, Nullop, $3); }
;
-subrout : SUB startsub WORD proto block
+formname: WORD { $$ = $1; }
+ | /* NULL */ { $$ = Nullop; }
+ ;
+
+subrout : SUB startsub subname proto subbody
{ newSUB($2, $3, $4, $5); }
- | SUB startsub WORD proto ';'
- { newSUB($2, $3, $4, Nullop); expect = XSTATE; }
+ ;
+
+startsub: /* NULL */ /* start a subroutine scope */
+ { $$ = start_subparse(); }
+ ;
+
+startanonsub: /* NULL */ /* start an anonymous subroutine scope */
+ { $$ = start_subparse();
+ CvANON_on(compcv); }
+ ;
+
+startformsub: /* NULL */ /* start a format subroutine scope */
+ { $$ = start_subparse();
+ CvFORMAT_on(compcv); }
+ ;
+
+subname : WORD { char *name = SvPVx(((SVOP*)$1)->op_sv, na);
+ if (strEQ(name, "BEGIN") || strEQ(name, "END"))
+ CvUNIQUE_on(compcv);
+ $$ = $1; }
;
proto : /* NULL */
{ $$ = Nullop; }
| THING
;
-
-startsub: /* NULL */ /* start a subroutine scope */
- { $$ = start_subparse(); }
+
+subbody : block { $$ = $1; }
+ | ';' { $$ = Nullop; expect = XSTATE; }
;
package : PACKAGE WORD ';'
@@ -290,8 +311,10 @@ package : PACKAGE WORD ';'
{ package(Nullop); }
;
-use : USE startsub WORD WORD listexpr ';'
- { utilize($1, $2, $3, $4, $5); }
+use : USE startsub
+ { CvUNIQUE_on(compcv); /* It's a BEGIN {} */ }
+ WORD WORD listexpr ';'
+ { utilize($1, $2, $4, $5, $6); }
;
expr : expr ANDOP expr
@@ -333,11 +356,12 @@ listop : LSTOP indirob argexpr
{ $$ = convert($1, 0, $2); }
| FUNC '(' listexprcom ')'
{ $$ = convert($1, 0, $3); }
- | LSTOPSUB startsub block listexpr %prec LSTOP
+ | LSTOPSUB startanonsub block
+ { $3 = newANONSUB($2, 0, $3); }
+ listexpr %prec LSTOP
{ $$ = newUNOP(OP_ENTERSUB, OPf_STACKED,
- append_elem(OP_LIST,
- prepend_elem(OP_LIST, newANONSUB($2, 0, $3), $4),
- $1)); }
+ append_elem(OP_LIST,
+ prepend_elem(OP_LIST, $3, $5), $1)); }
;
method : METHOD
@@ -411,7 +435,7 @@ term : term ASSIGNOP term
{ $$ = newANONHASH($2); }
| HASHBRACK ';' '}' %prec '('
{ $$ = newANONHASH(Nullop); }
- | ANONSUB startsub proto block %prec '('
+ | ANONSUB startanonsub proto block %prec '('
{ $$ = newANONSUB($2, $3, $4); }
| scalar %prec '('
{ $$ = $1; }
@@ -528,7 +552,7 @@ term : term ASSIGNOP term
| FUNC0 '(' ')'
{ $$ = newOP($1, 0); }
| FUNC0SUB
- { $$ = newUNOP(OP_ENTERSUB, 0,
+ { $$ = newUNOP(OP_ENTERSUB, OPf_STACKED,
scalar($1)); }
| FUNC1 '(' ')'
{ $$ = newOP($1, OPf_SPECIAL); }
diff --git a/plan9/mkfile b/plan9/mkfile
index 938b8e6a6d..e3102f5ef0 100644
--- a/plan9/mkfile
+++ b/plan9/mkfile
@@ -20,7 +20,7 @@ perlshr = $archlib/CORE/libperlshr.a
installman1dir = /sys/man/1
installman3dir = /sys/man/2
-podnames = perl perlbook perlbot perlcall perldata perldebug perldiag perldsc perlembed perlform perlfunc perlguts perlipc perllol perlmod perlobj perlop perlovl perlpod perlre perlref perlrun perlsec perlstyle perlsub perlsyn perltie perltoc perltrap perlvar perlxs perlxstut
+podnames = perl perlbook perlbot perlcall perldata perldebug perldiag perldsc perlembed perlform perlfunc perlguts perlipc perllol perlmod perlobj perlop perlpod perlre perlref perlrun perlsec perlstyle perlsub perlsyn perltie perltoc perltrap perlvar perlxs perlxstut
libpods = ${podnames:%=pod/%.pod}
diff --git a/plan9/plan9ish.h b/plan9/plan9ish.h
index 6613c362e6..c225d286a3 100644
--- a/plan9/plan9ish.h
+++ b/plan9/plan9ish.h
@@ -73,6 +73,18 @@
*/
#define ACME_MESS /**/
+/* ALTERNATE_SHEBANG:
+ * This symbol, if defined, contains a "magic" string which may be used
+ * as the first line of a Perl program designed to be executed directly
+ * by name, instead of the standard Unix #!. If ALTERNATE_SHEBANG
+ * begins with a character other then #, then Perl will only treat
+ * it as a command line if if finds the string "perl" in the first
+ * word; otherwise it's treated as the first line of code in the script.
+ * (IOW, Perl won't hand off to another interpreter via an alternate
+ * shebang sequence that might be legal Perl code.)
+ */
+/* #define ALTERNATE_SHEBANG "#!" / **/
+
#if !defined(NSIG) || defined(M_UNIX) || defined(M_XENIX)
# include <signal.h>
#endif
diff --git a/pod/Makefile b/pod/Makefile
index 9012b5735b..cd01028069 100644
--- a/pod/Makefile
+++ b/pod/Makefile
@@ -3,157 +3,153 @@ CONVERTERS = pod2html pod2latex pod2man pod2text checkpods
all: $(CONVERTERS) man
PERL = ../miniperl
-POD = \
+POD = \
perl.pod \
- perlapio.pod \
- perlbook.pod \
- perlbot.pod \
- perlcall.pod \
- perldata.pod \
- perldebug.pod \
- perldiag.pod \
- perldsc.pod \
- perlembed.pod \
- perlform.pod \
- perlfunc.pod \
- perlguts.pod \
- perlipc.pod \
- perllocale.pod \
- perllol.pod \
- perlmod.pod \
perlnews.pod \
- perlobj.pod \
+ perldata.pod \
+ perlsyn.pod \
perlop.pod \
- perlovl.pod \
- perlpod.pod \
perlre.pod \
- perlref.pod \
perlrun.pod \
- perlsec.pod \
- perlstyle.pod \
+ perlfunc.pod \
+ perlvar.pod \
perlsub.pod \
- perlsyn.pod \
- perltie.pod \
- perltoc.pod \
+ perlmod.pod \
+ perlform.pod \
+ perllocale.pod \
+ perlref.pod \
+ perldsc.pod \
+ perllol.pod \
perltoot.pod \
+ perlobj.pod \
+ perltie.pod \
+ perlbot.pod \
+ perlipc.pod \
+ perldebug.pod \
+ perldiag.pod \
+ perlsec.pod \
perltrap.pod \
- perlvar.pod \
+ perlstyle.pod \
+ perlpod.pod \
+ perlbook.pod \
+ perlembed.pod \
+ perlapio.pod \
perlxs.pod \
- perlxstut.pod
+ perlxstut.pod \
+ perlguts.pod \
+ perlcall.pod \
+ perltoc.pod
-MAN = \
+MAN = \
perl.man \
- perlapio.man \
- perlbook.man \
- perlbot.man \
- perlcall.man \
- perldata.man \
- perldebug.man \
- perldiag.man \
- perldsc.man \
- perlembed.man \
- perlform.man \
- perlfunc.man \
- perlguts.man \
- perlipc.man \
- perllocale.man \
- perllol.man \
- perlmod.man \
perlnews.man \
- perlobj.man \
+ perldata.man \
+ perlsyn.man \
perlop.man \
- perlovl.man \
- perlpod.man \
perlre.man \
- perlref.man \
perlrun.man \
- perlsec.man \
- perlstyle.man \
+ perlfunc.man \
+ perlvar.man \
perlsub.man \
- perlsyn.man \
- perltie.man \
- perltoc.man \
+ perlmod.man \
+ perlform.man \
+ perllocale.man \
+ perlref.man \
+ perldsc.man \
+ perllol.man \
perltoot.man \
+ perlobj.man \
+ perltie.man \
+ perlbot.man \
+ perlipc.man \
+ perldebug.man \
+ perldiag.man \
+ perlsec.man \
perltrap.man \
- perlvar.man \
+ perlstyle.man \
+ perlpod.man \
+ perlbook.man \
+ perlembed.man \
+ perlapio.man \
perlxs.man \
- perlxstut.man
+ perlxstut.man \
+ perlguts.man \
+ perlcall.man \
+ perltoc.man
-HTML = \
+HTML = \
perl.html \
- perlapio.html \
- perlbook.html \
- perlbot.html \
- perlcall.html \
- perldata.html \
- perldebug.html \
- perldiag.html \
- perldsc.html \
- perlembed.html \
- perlform.html \
- perlfunc.html \
- perlguts.html \
- perlipc.html \
- perllocale.html \
- perllol.html \
- perlmod.html \
perlnews.html \
- perlobj.html \
+ perldata.html \
+ perlsyn.html \
perlop.html \
- perlovl.html \
- perlpod.html \
perlre.html \
- perlref.html \
perlrun.html \
- perlsec.html \
- perlstyle.html \
+ perlfunc.html \
+ perlvar.html \
perlsub.html \
- perlsyn.html \
- perltie.html \
- perltoc.html \
+ perlmod.html \
+ perlform.html \
+ perllocale.html \
+ perlref.html \
+ perldsc.html \
+ perllol.html \
perltoot.html \
+ perlobj.html \
+ perltie.html \
+ perlbot.html \
+ perlipc.html \
+ perldebug.html \
+ perldiag.html \
+ perlsec.html \
perltrap.html \
- perlvar.html \
+ perlstyle.html \
+ perlpod.html \
+ perlbook.html \
+ perlembed.html \
+ perlapio.html \
perlxs.html \
- perlxstut.html
+ perlxstut.html \
+ perlguts.html \
+ perlcall.html \
+ perltoc.html
-TEX = \
+TEX = \
perl.tex \
- perlapio.tex \
- perlbook.tex \
- perlbot.tex \
- perlcall.tex \
- perldata.tex \
- perldebug.tex \
- perldiag.tex \
- perldsc.tex \
- perlembed.tex \
- perlform.tex \
- perlfunc.tex \
- perlguts.tex \
- perlipc.tex \
- perllocale.tex \
- perllol.tex \
- perlmod.tex \
perlnews.tex \
- perlobj.tex \
+ perldata.tex \
+ perlsyn.tex \
perlop.tex \
- perlovl.tex \
- perlpod.tex \
perlre.tex \
- perlref.tex \
perlrun.tex \
- perlsec.tex \
- perlstyle.tex \
+ perlfunc.tex \
+ perlvar.tex \
perlsub.tex \
- perlsyn.tex \
- perltie.tex \
- perltoc.tex \
+ perlmod.tex \
+ perlform.tex \
+ perllocale.tex \
+ perlref.tex \
+ perldsc.tex \
+ perllol.tex \
perltoot.tex \
+ perlobj.tex \
+ perltie.tex \
+ perlbot.tex \
+ perlipc.tex \
+ perldebug.tex \
+ perldiag.tex \
+ perlsec.tex \
perltrap.tex \
- perlvar.tex \
+ perlstyle.tex \
+ perlpod.tex \
+ perlbook.tex \
+ perlembed.tex \
+ perlapio.tex \
perlxs.tex \
- perlxstut.tex
+ perlxstut.tex \
+ perlguts.tex \
+ perlcall.tex \
+ perltoc.tex
man: pod2man $(MAN)
@@ -164,6 +160,9 @@ html: pod2html
tex: pod2latex $(TEX)
+toc:
+ $(PERL) -I../lib buildtoc >perltoc.pod
+
.SUFFIXES: .pm .pod .man
.pm.man: pod2man
@@ -190,6 +189,7 @@ tex: pod2latex $(TEX)
clean:
rm -f $(MAN) $(HTML) $(TEX)
+ rm -f *.aux *.log
realclean: clean
rm -f $(CONVERTERS)
diff --git a/pod/buildtoc b/pod/buildtoc
index daf26c1c57..da458568da 100644
--- a/pod/buildtoc
+++ b/pod/buildtoc
@@ -1,21 +1,23 @@
use File::Find;
use Cwd;
+use Text::Wrap;
-@pods = qw{
- perl
- perldata perlsyn perlop perlre perlrun perlfunc perlvar
- perlsub perlmod perlform
- perlref perldsc perllol perlobj perltie perlbot perlipc
- perldebug perldiag perlsec perltrap perlstyle
- perlpod perlbook
+sub output ($);
+
+@pods = qw(
+ perl perlnews perldata perlsyn perlop perlre perlrun perlfunc
+ perlvar perlsub perlmod perlform perllocale perlref perldsc
+ perllol perltoot perlobj perltie perlbot perlipc perldebug
+ perldiag perlsec perltrap perlstyle perlpod perlbook
perlembed perlapio perlxs perlxstut perlguts perlcall
- };
-for (@pods) { s/$/.pod/ }
+ );
+
+for (@pods) { s/$/.pod/ }
$/ = '';
@ARGV = @pods;
-($_= <<EOPOD2B) =~ s/^\t//gm && print;
+($_= <<EOPOD2B) =~ s/^\t//gm && output($_);
=head1 NAME
@@ -23,38 +25,40 @@ $/ = '';
=head1 DESCRIPTION
- This page provides a brief table of contents for the rest of the Perl
- documentation set. It is meant to be be quickly scanned or grepped
+ This page provides a brief table of contents for the rest of the Perl
+ documentation set. It is meant to be scanned quickly or grepped
through to locate the proper section you're looking for.
=head1 BASIC DOCUMENTATION
EOPOD2B
+#' make emacs happy
podset(@pods);
find \&getpods => qw(../lib ../ext);
+
sub getpods {
- if (/\.p(od|m)$/) {
- my $tmp;
+ if (/\.p(od|m)$/) {
# Skip .pm files that have corresponding .pod files, and Functions.pm.
- return if (($tmp = $_) =~ s/\.pm$/.pod/ && -f $tmp);
- return if ($_ eq '../lib/Pod/Functions.pm');####Used only by pod itself
-
+ return if /(.*)\.pm$/ && -f "$1.pod";
my $file = $File::Find::name;
+ return if $file eq '../lib/Pod/Functions.pm'; # Used only by pod itself
+
die "tut $name" if $file =~ /TUT/;
unless (open (F, "< $_\0")) {
warn "bogus <$file>: $!";
system "ls", "-l", $file;
- } else {
+ }
+ else {
my $line;
while ($line = <F>) {
if ($line =~ /^=head1\s+NAME\b/) {
push @modpods, $file;
#warn "GOOD $file\n";
return;
- }
- }
+ }
+ }
warn "EVIL $file\n";
}
}
@@ -71,14 +75,14 @@ for (@modpods) {
if ($done{$name}++) {
# warn "already did $_\n";
next;
- }
+ }
push @modules, $_;
push @modname, $name;
- }
-}
+ }
+}
+
+($_= <<EOPOD2B) =~ s/^\t//gm && output($_);
-($_= <<EOPOD2B) =~ s/^\t//gm && print;
-
=head1 PRAGMA DOCUMENTATION
@@ -87,8 +91,8 @@ EOPOD2B
podset(sort @pragmata);
-($_= <<EOPOD2B) =~ s/^\t//gm && print;
-
+($_= <<EOPOD2B) =~ s/^\t//gm && output($_);
+
=head1 MODULE DOCUMENTATION
@@ -98,41 +102,41 @@ EOPOD2B
podset( @modules[ sort { $modname[$a] cmp $modname[$b] } 0 .. $#modules ] );
($_= <<EOPOD2B) =~ s/^\t//gm;
-
+
=head1 AUXILIARY DOCUMENTATION
- Here should be listed all the extra programs' docs, but they
- don't all have man pages yet:
+ Here should be listed all the extra programs' documentation, but they
+ don't all have manual pages yet:
=item a2p
=item s2p
=item find2perl
-
+
=item h2ph
-
+
=item c2ph
=item h2xs
=item xsubpp
- =item pod2man
+ =item pod2man
=item wrapsuid
=head1 AUTHOR
- Larry Wall E<lt>F<larry\@wall.org>E<gt>, with the help of oodles
+ Larry Wall E<lt>F<larry\@wall.org>E<gt>, with the help of oodles
of other folks.
EOPOD2B
-print;
-
+output $_;
+output "\n"; # flush $LINE
exit;
sub podset {
@@ -141,36 +145,30 @@ sub podset {
while(<>) {
if (s/^=head1 (NAME)\s*/=head2 /) {
$pod = path2modname($ARGV);
- sub path2modname {
- local $_ = shift;
- s/\.p(m|od)$//;
- s-.*?/(lib|ext)/--;
- s-/-::-g;
- s/(\w+)::\1/$1/;
- return $_;
- }
- unitem(); unhead2();
- print "\n \n\n=head2 ";
+ unitem();
+ unhead2();
+ output "\n \n\n=head2 ";
$_ = <>;
if ( /^\s*$pod\b/ ) {
- print;
+ s/$pod\.pm/$pod/; # '.pm' in NAME !?
+ output $_;
} else {
s/^/$pod, /;
- print;
- }
+ output $_;
+ }
next;
}
if (s/^=head1 (.*)/=item $1/) {
unitem(); unhead2();
- print; nl(); next;
- }
+ output $_; nl(); next;
+ }
if (s/^=head2 (.*)/=item $1/) {
unitem();
- print "=over\n\n" unless $inhead2;
+ output "=over\n\n" unless $inhead2;
$inhead2 = 1;
- print; nl(); next;
+ output $_; nl(); next;
- }
+ }
if (s/^=item (.*)\n/$1/) {
next if $pod eq 'perldiag';
s/^\s*\*\s*$// && next;
@@ -179,31 +177,62 @@ sub podset {
next if /^[\d.]+$/;
next if $pod eq 'perlmod' && /^ftp:/;
##print "=over\n\n" unless $initem;
- print ", " if $initem;
+ output ", " if $initem;
$initem = 1;
s/\.$//;
- print; next;
- }
- }
+ s/^-X\b/-I<X>/;
+ output $_; next;
+ }
+ }
+}
-}
+sub path2modname {
+ local $_ = shift;
+ s/\.p(m|od)$//;
+ s-.*?/(lib|ext)/--;
+ s-/-::-g;
+ s/(\w+)::\1/$1/;
+ return $_;
+}
sub unhead2 {
if ($inhead2) {
- print "\n\n=back\n\n";
- }
- $inhead2 = 0;
- $initem = 0;
-}
+ output "\n\n=back\n\n";
+ }
+ $inhead2 = 0;
+ $initem = 0;
+}
sub unitem {
if ($initem) {
- print "\n\n";
+ output "\n\n";
##print "\n\n=back\n\n";
- }
+ }
$initem = 0;
-}
+}
sub nl {
- print "\n";
-}
+ output "\n";
+}
+
+my $NEWLINE; # how many newlines have we seen recently
+my $LINE; # what remains to be printed
+
+sub output ($) {
+ for (split /(\n)/, shift) {
+ if ($_ eq "\n") {
+ if ($LINE) {
+ print wrap('', '', $LINE);
+ $LINE = '';
+ }
+ if ($NEWLINE < 2) {
+ print;
+ $NEWLINE++;
+ }
+ }
+ elsif (/\S/ && length) {
+ $LINE .= $_;
+ $NEWLINE = 0;
+ }
+ }
+}
diff --git a/pod/checkpods.PL b/pod/checkpods.PL
index 5265a19808..c4721a6118 100644
--- a/pod/checkpods.PL
+++ b/pod/checkpods.PL
@@ -12,11 +12,8 @@ use File::Basename qw(&basename &dirname);
# This forces PL files to create target in same directory as PL file.
# This is so that make depend always knows where to find PL derivatives.
-chdir(dirname($0));
-($file = basename($0)) =~ s/\.PL$//;
-$file =~ s/\.pl$//
- if ($Config{'osname'} eq 'VMS' or
- $Config{'osname'} eq 'OS2'); # "case-forgiving"
+chdir dirname($0);
+$file = basename($0, '.PL');
open OUT,">$file" or die "Can't create $file: $!";
diff --git a/pod/perl.pod b/pod/perl.pod
index 76a0f269fe..7ac7094f57 100644
--- a/pod/perl.pod
+++ b/pod/perl.pod
@@ -267,8 +267,8 @@ directory. If PERL5LIB is defined, PERLLIB is not used.
=back
-Perl also has environment variables that control how Perl handles
-language-specific data. Please consult L<perllocale>.
+Perl also has environment variables that control how Perl handles data
+specific to particular natural languages. See L<perllocale>.
Apart from these, Perl uses no other environment variables, except
to make them available to the script being executed, and to child
diff --git a/pod/perlapio.pod b/pod/perlapio.pod
index ae67494ce2..2a2a99fc60 100644
--- a/pod/perlapio.pod
+++ b/pod/perlapio.pod
@@ -1,6 +1,6 @@
=head1 NAME
-perlio - perl's IO abstraction interface.
+perlapio - perl's IO abstraction interface.
=head1 SYNOPSIS
diff --git a/pod/perldebug.pod b/pod/perldebug.pod
index 5d67ba41a6..77502f27d3 100644
--- a/pod/perldebug.pod
+++ b/pod/perldebug.pod
@@ -251,29 +251,11 @@ Delete all installed breakpoints.
Set an action to be done before the line is executed.
The sequence of steps taken by the debugger is
-=over 3
-
-=item 1
-
-check for a breakpoint at this line
-
-=item 2
-
-print the line if necessary (tracing)
-
-=item 3
-
-do any actions associated with that line
-
-=item 4
-
-prompt user if at a breakpoint or in single-step
-
-=item 5
-
-evaluate line
-
-=back
+ 1. check for a breakpoint at this line
+ 2. print the line if necessary (tracing)
+ 3. do any actions associated with that line
+ 4. prompt user if at a breakpoint or in single-step
+ 5. evaluate line
For example, this will print out C<$foo> every time line
53 is passed:
@@ -452,6 +434,8 @@ corresponds to F</dev/ttyc>, say, by issuing a command like
See L<"Debugger Internals"> below for more details.
+=over 12
+
=item E<lt> [ command ]
Set an action (Perl command) to happen before every debugger prompt.
diff --git a/pod/perldiag.pod b/pod/perldiag.pod
index 49d30fcab0..d08d2dc452 100644
--- a/pod/perldiag.pod
+++ b/pod/perldiag.pod
@@ -754,6 +754,11 @@ to a matched substring is valid only as part of a regular expression pattern.
Trying to do this in ordinary Perl code produces a value that prints
out looking like SCALAR(0xdecaf). Use the $1 form instead.
+=item Can't use bareword ("%s") as %s ref while \"strict refs\" in use
+
+(F) Only hard references are allowed by "strict refs". Symbolic references
+are disallowed. See L<perlref>.
+
=item Can't use string ("%s") as %s ref while "strict refs" in use
(F) Only hard references are allowed by "strict refs". Symbolic references
@@ -812,6 +817,12 @@ to 01411. Octal constants are introduced with a leading 0 in Perl, as in C.
(W) You tried to do a connect on a closed socket. Did you forget to check
the return value of your socket() call? See L<perlfunc/connect>.
+=item Constant subroutine %s redefined
+
+(S) You redefined a subroutine which had previously been eligible for
+inlining. See L<perlsub/"Constant Functions"> for commentary and
+workarounds.
+
=item Corrupt malloc ptr 0x%lx at 0x%lx
(P) The malloc package that comes with Perl had an internal failure.
@@ -1481,6 +1492,17 @@ will extend the buffer and zero pad the new area.
(F) An attempt was made to use an entry in an overloading table that
somehow no longer points to a valid method. See L<overload>.
+=item Stub found while resolving method `%s' overloading `%s' in package `%s'
+
+(P) Overloading resolution over @ISA tree may be broken by importing stubs.
+Stubs should never be implicitely created, but explicit calls to C<can>
+may break this.
+
+=item Cannot resolve method `%s' overloading `%s' in package `s'
+
+(P) Internal error trying to resolve overloading specified by a method
+name (as opposed to a subroutine reference).
+
=item Operator or semicolon missing before %s
(S) You used a variable or subroutine call where the parser was
@@ -1815,7 +1837,7 @@ shifting or popping (for array variables). See L<perlform>.
=item Scalar value @%s[%s] better written as $%s[%s]
-(W) You've used an array slice (indicated by @) to select a single value of
+(W) You've used an array slice (indicated by @) to select a single element of
an array. Generally it's better to ask for a scalar value (indicated by $).
The difference is that C<$foo[&bar]> always behaves like a scalar, both when
assigning to it and when evaluating its argument, while C<@foo[&bar]> behaves
@@ -1827,6 +1849,20 @@ element as a list, you need to look into how references work, because
Perl will not magically convert between scalars and lists for you. See
L<perlref>.
+=item Scalar value @%s{%s} better written as $%s{%s}
+
+(W) You've used a hash slice (indicated by @) to select a single element of
+a hash. Generally it's better to ask for a scalar value (indicated by $).
+The difference is that C<$foo{&bar}> always behaves like a scalar, both when
+assigning to it and when evaluating its argument, while C<@foo{&bar}> behaves
+like a list when you assign to it, and provides a list context to its
+subscript, which can do weird things if you're expecting only one subscript.
+
+On the other hand, if you were actually hoping to treat the hash
+element as a list, you need to look into how references work, because
+Perl will not magically convert between scalars and lists for you. See
+L<perlref>.
+
=item Script is not setuid/setgid in suidperl
(F) Oddly, the suidperl program was invoked on a script with its setuid
@@ -2349,6 +2385,14 @@ L<perlref> for more on this.
(W) A copy of the object returned from C<tie> (or C<tied>) was still
valid when C<untie> was called.
+=item Value of %s construct can be "0"; test with defined()
+
+(W) In a conditional expression, you used <HANDLE>, <*> (glob), or
+C<readdir> as a boolean value. Each of these constructs can return a
+value of "0"; that would make the conditional expression false, which
+is probably not what you intended. When using these constructs in
+conditional expressions, test their values with the C<defined> operator.
+
=item Variable "%s" is not exported
(F) While "use strict" in effect, you referred to a global variable
@@ -2357,6 +2401,50 @@ something else of the same name (usually a subroutine) is exported
by that module. It usually means you put the wrong funny character
on the front of your variable.
+=item Variable "%s" may be unavailable
+
+(W) An inner (nested) I<anonymous> subroutine is inside a I<named>
+subroutine, and outside that is another subroutine; and the anonymous
+(innermost) subroutine is referencing a lexical variable defined in
+the outermost subroutine. For example:
+
+ sub outermost { my $a; sub middle { sub { $a } } }
+
+If the anonymous subroutine is called or referenced (directly or
+indirectly) from the outermost subroutine, it will share the variable
+as you would expect. But if the anonymous subroutine is called or
+referenced when the outermost subroutine is not active, it will see
+the value of the shared variable as it was before and during the
+*first* call to the outermost subroutine, which is probably not what
+you want.
+
+In these circumstances, it is usually best to make the middle
+subroutine anonymous, using the C<sub {}> syntax. Perl has specific
+support for shared variables in nested anonymous subroutines; a named
+subroutine in between interferes with this feature.
+
+=item Variable "%s" will not stay shared
+
+(W) An inner (nested) I<named> subroutine is referencing a lexical
+variable defined in an outer subroutine.
+
+When the inner subroutine is called, it will probably see the value of
+the outer subroutine's variable as it was before and during the
+*first* call to the outer subroutine; in this case, after the first
+call to the outer subroutine is complete, the inner and outer
+subroutines will no longer share a common value for the variable. In
+other words, the variable will no longer be shared.
+
+Furthermore, if the outer subroutine is anonymous and references a
+lexical variable outside itself, then the outer and inner subroutines
+will I<never> share the given variable.
+
+This problem can usually be solved by making the inner subroutine
+anonymous, using the C<sub {}> syntax. When inner anonymous subs that
+reference variables in outer subroutines are called or referenced,
+they are automatically re-bound to the current values of such
+variables.
+
=item Variable syntax.
(A) You've accidentally run your script through B<csh> instead
diff --git a/pod/perldsc.pod b/pod/perldsc.pod
index 5beaa8bbe9..a6d6480dbf 100644
--- a/pod/perldsc.pod
+++ b/pod/perldsc.pod
@@ -48,7 +48,7 @@ create one of these complex data structures, you can just pinch, pilfer, or
purloin a drop-in example from here.
Let's look at each of these possible constructs in detail. There are separate
-documents on each of the following:
+sections on each of the following:
=over 5
@@ -62,10 +62,6 @@ documents on each of the following:
=item * more elaborate constructs
-=item * recursive and self-referential data structures
-
-=item * objects
-
=back
But for now, let's look at some of the general issues common to all
@@ -303,8 +299,8 @@ variable, and it would thereby remind you to write instead:
=head1 DEBUGGING
-Before 5.002, the standard Perl debugger didn't do a very nice job of
-printing out complex data structures. With version 5.002 or above, the
+Before version 5.002, the standard Perl debugger didn't do a very nice job of
+printing out complex data structures. With 5.002 or above, the
debugger includes several new features, including command line editing as
well as the C<x> command to dump out complex data structures. For
example, given the assignment to $LoL above, here's the debugger output:
@@ -387,7 +383,7 @@ types of data structures.
# print the whole thing one at a time
for $i ( 0 .. $#LoL ) {
- for $j ( 0 .. $#{$LoL[$i]} ) {
+ for $j ( 0 .. $#{ $LoL[$i] } ) {
print "elt $i $j is $LoL[$i][$j]\n";
}
}
@@ -397,9 +393,9 @@ types of data structures.
=head2 Declaration of a HASH OF LISTS
%HoL = (
- "flintstones" => [ "fred", "barney" ],
- "jetsons" => [ "george", "jane", "elroy" ],
- "simpsons" => [ "homer", "marge", "bart" ],
+ flintstones => [ "fred", "barney" ],
+ jetsons => [ "george", "jane", "elroy" ],
+ simpsons => [ "homer", "marge", "bart" ],
);
=head2 Generation of a HASH OF LISTS
@@ -456,12 +452,17 @@ types of data structures.
}
# print the whole thing sorted by number of members
- foreach $family ( sort { @{$HoL{$b}} <=> @{$HoL{$b}} } keys %HoL ) {
+ foreach $family ( sort { @{$HoL{$b}} <=> @{$HoL{$a}} } keys %HoL ) {
print "$family: @{ $HoL{$family} }\n"
}
# print the whole thing sorted by number of members and name
- foreach $family ( sort { @{$HoL{$b}} <=> @{$HoL{$a}} } keys %HoL ) {
+ foreach $family ( sort {
+ @{$HoL{$b}} <=> @{$HoL{$a}}
+ ||
+ $a cmp $b
+ } keys %HoL )
+ {
print "$family: ", join(", ", sort @{ $HoL{$family}), "\n";
}
@@ -560,19 +561,19 @@ types of data structures.
=head2 Declaration of a HASH OF HASHES
%HoH = (
- "flintstones" => {
- "lead" => "fred",
- "pal" => "barney",
+ flintstones => {
+ lead => "fred",
+ pal => "barney",
},
- "jetsons" => {
- "lead" => "george",
- "wife" => "jane",
- "his boy" => "elroy",
+ jetsons => {
+ lead => "george",
+ wife => "jane",
+ "his boy" => "elroy",
},
- "simpsons" => {
- "lead" => "homer",
- "wife" => "marge",
- "kid" => "bart",
+ simpsons => {
+ lead => "homer",
+ wife => "marge",
+ kid => "bart",
},
);
@@ -614,8 +615,8 @@ types of data structures.
# append new members to an existing family
%new_folks = (
- "wife" => "wilma",
- "pet" => "dino";
+ wife => "wilma",
+ pet => "dino";
);
for $what (keys %new_folks) {
@@ -650,7 +651,7 @@ types of data structures.
# print the whole thing sorted by number of members
- foreach $family ( sort { keys %{$HoH{$b}} <=> keys %{$HoH{$b}} } keys %HoH ) {
+ foreach $family ( sort { keys %{$HoH{$b}} <=> keys %{$HoH{$a}} } keys %HoH ) {
print "$family: { ";
for $role ( sort keys %{ $HoH{$family} } ) {
print "$role=$HoH{$family}{$role} ";
@@ -663,10 +664,10 @@ types of data structures.
for ( qw(lead wife son daughter pal pet) ) { $rank{$_} = ++$i }
# now print the whole thing sorted by number of members
- foreach $family ( sort { keys %{$HoH{$b}} <=> keys %{$HoH{$b}} } keys %HoH ) {
+ foreach $family ( sort { keys %{ $HoH{$b} } <=> keys %{ $HoH{$a} } } keys %HoH ) {
print "$family: { ";
# and print these according to rank order
- for $role ( sort { $rank{$a} <=> $rank{$b} keys %{ $HoH{$family} } } ) {
+ for $role ( sort { $rank{$a} <=> $rank{$b} } keys %{ $HoH{$family} } ) {
print "$role=$HoH{$family}{$role} ";
}
print "}\n";
@@ -710,7 +711,7 @@ many different sorts:
=head2 Declaration of a HASH OF COMPLEX RECORDS
%TV = (
- "flintstones" => {
+ flintstones => {
series => "flintstones",
nights => [ qw(monday thursday friday) ],
members => [
@@ -720,7 +721,7 @@ many different sorts:
],
},
- "jetsons" => {
+ jetsons => {
series => "jetsons",
nights => [ qw(wednesday saturday) ],
members => [
@@ -730,7 +731,7 @@ many different sorts:
],
},
- "simpsons" => {
+ simpsons => {
series => "simpsons",
nights => [ qw(monday) ],
members => [
@@ -776,7 +777,7 @@ many different sorts:
foreach $family (keys %TV) {
$rec = $TV{$family}; # temp pointer
@kids = ();
- for $person ( @{$rec->{members}} ) {
+ for $person ( @{ $rec->{members} } ) {
if ($person->{role} =~ /kid|son|daughter/) {
push @kids, $person;
}
@@ -805,7 +806,7 @@ many different sorts:
for $who ( @{ $TV{$family}{members} } ) {
print " $who->{name} ($who->{role}), age $who->{age}\n";
}
- print "it turns out that $TV{$family}{'lead'} has ";
+ print "it turns out that $TV{$family}{lead} has ";
print scalar ( @{ $TV{$family}{kids} } ), " kids named ";
print join (", ", map { $_->{name} } @{ $TV{$family}{kids} } );
print "\n";
@@ -830,4 +831,4 @@ perlref(1), perllol(1), perldata(1), perlobj(1)
Tom Christiansen E<lt>F<tchrist@perl.com>E<gt>
Last update:
-Mon Jul 8 05:22:49 MDT 1996
+Wed Oct 23 04:57:50 MET DST 1996
diff --git a/pod/perlembed.pod b/pod/perlembed.pod
index ea0e8331f2..e55ee633c9 100644
--- a/pod/perlembed.pod
+++ b/pod/perlembed.pod
@@ -37,7 +37,7 @@ Read on...
L<Compiling your C program>
-There's one example in each of the six sections:
+There's one example in each of the eight sections:
L<Adding a Perl interpreter to your C program>
@@ -49,6 +49,10 @@ L<Performing Perl pattern matches and substitutions from your C program>
L<Fiddling with the Perl stack from your C program>
+L<Maintaining a persistent interpreter>
+
+L<Maintaining multiple interpreter instances>
+
L<Using Perl modules, which themselves use C libraries, from your C program>
This documentation is UNIX specific.
@@ -69,7 +73,7 @@ Your C program will--usually--allocate, "run", and deallocate a
I<PerlInterpreter> object, which is defined in the perl library.
If your copy of Perl is recent enough to contain this documentation
-(5.002 or later), then the perl library (and I<EXTERN.h> and
+(version 5.002 or later), then the perl library (and I<EXTERN.h> and
I<perl.h>, which you'll also need) will
reside in a directory resembling this:
@@ -124,7 +128,6 @@ In a sense, perl (the C program) is a good example of embedding Perl
from the source distribution. Here's a bastardized, non-portable version of
I<miniperlmain.c> containing the essentials of embedding:
- #include <stdio.h>
#include <EXTERN.h> /* from the Perl distribution */
#include <perl.h> /* from the Perl distribution */
@@ -171,12 +174,12 @@ calling I<perl_run()>.
=head2 Calling a Perl subroutine from your C program
-To call individual Perl subroutines, you'll need to remove the call to
-I<perl_run()> and replace it with a call to I<perl_call_argv()>.
+To call individual Perl subroutines, you can use any of the B<perl_call_*>
+functions documented in the L<perlcall> man page.
+In this example we'll use I<perl_call_argv>.
That's shown below, in a program I'll call I<showtime.c>.
- #include <stdio.h>
#include <EXTERN.h>
#include <perl.h>
@@ -184,13 +187,16 @@ That's shown below, in a program I'll call I<showtime.c>.
int main(int argc, char **argv, char **env)
{
+ char *args[] = { NULL };
my_perl = perl_alloc();
perl_construct(my_perl);
perl_parse(my_perl, NULL, argc, argv, NULL);
- /*** This replaces perl_run() ***/
- perl_call_argv("showtime", G_DISCARD | G_NOARGS, argv);
+ /*** skipping perl_run() ***/
+
+ perl_call_argv("showtime", G_DISCARD | G_NOARGS, args);
+
perl_destruct(my_perl);
perl_free(my_perl);
}
@@ -218,56 +224,56 @@ yielding the number of seconds that elapsed between January 1, 1970
(the beginning of the UNIX epoch), and the moment I began writing this
sentence.
-If you want to pass some arguments to the Perl subroutine, or
-you want to access the return value, you'll need to manipulate the
+Note that in this particular case we are not required to call I<perl_run>,
+however, in general it's considered good practice to ensure proper
+initialization of library code including execution of all object C<DESTROY>
+methods and package C<END {}> blocks.
+
+If you want to pass some arguments to the Perl subroutine, you may add
+strings to the C<NULL> terminated C<args> list passed to I<perl_call_argv>.
+In order to pass arguments of another data type and/or examine return values
+of the subroutine you'll need to manipulate the
Perl stack, demonstrated in the last section of this document:
L<Fiddling with the Perl stack from your C program>
=head2 Evaluating a Perl statement from your C program
-NOTE: This section, and the next, employ some very brittle techniques
-for evaluating strings of Perl code. Perl 5.002 contains some nifty
-features that enable A Better Way (such as with L<perlguts/perl_eval_sv>).
-Look for updates to this document soon.
-
-One way to evaluate a Perl string is to define a function (we'll call
-ours I<perl_eval()>) that wraps around Perl's L<perlfunc/eval>.
+One way to evaluate pieces of Perl code is to use L<perlguts/perl_eval_sv>.
+We have wrapped this function with our own I<perl_eval()> function, which
+converts a command string to an SV, passing this and the L<perlcall/G_DISCARD>
+flag to L<perlguts/perl_eval_sv>.
Arguably, this is the only routine you'll ever need to execute
snippets of Perl code from within your C program. Your string can be
as long as you wish; it can contain multiple statements; it can
-use L<perlfunc/require> or L<perlfunc/do> to include external Perl
-files.
+include L<perlfunc/use>, L<perlfunc/require> and L<perlfunc/do> to
+include external Perl files.
Our I<perl_eval()> lets us evaluate individual Perl strings, and then
extract variables for coercion into C types. The following program,
I<string.c>, executes three Perl strings, extracting an C<int> from
the first, a C<float> from the second, and a C<char *> from the third.
- #include <stdio.h>
#include <EXTERN.h>
#include <perl.h>
static PerlInterpreter *my_perl;
- int perl_eval(char *string)
+ I32 perl_eval(char *string)
{
- char *argv[2];
- argv[0] = string;
- argv[1] = NULL;
- perl_call_argv("_eval_", 0, argv);
+ return perl_eval_sv(newSVpv(string,0), G_DISCARD);
}
main (int argc, char **argv, char **env)
{
- char *embedding[] = { "", "-e", "sub _eval_ { eval $_[0] }" };
+ char *embedding[] = { "", "-e", "0" };
STRLEN length;
my_perl = perl_alloc();
perl_construct( my_perl );
perl_parse(my_perl, NULL, 3, embedding, NULL);
-
+ perl_run(my_perl);
/** Treat $a as an integer **/
perl_eval("$a = 3; $a **= 2");
printf("a = %d\n", SvIV(perl_get_sv("a", FALSE)));
@@ -324,16 +330,12 @@ returning the number of matches found.
Here's a sample program, I<match.c>, that uses all three (long lines have
been wrapped here):
- #include <stdio.h>
#include <EXTERN.h>
#include <perl.h>
static PerlInterpreter *my_perl;
- int perl_eval(char *string)
+ I32 perl_eval(char *string)
{
- char *argv[2];
- argv[0] = string;
- argv[1] = NULL;
- perl_call_argv("_eval_", 0, argv);
+ return perl_eval_sv(newSVpv(string,0), G_DISCARD);
}
/** match(string, pattern)
**
@@ -346,7 +348,7 @@ been wrapped here):
char *command;
command = malloc(sizeof(char) * strlen(string) + strlen(pattern) + 37);
sprintf(command, "$string = '%s'; $return = $string =~ %s",
- string, pattern);
+ string, pattern);
perl_eval(command);
free(command);
return SvIV(perl_get_sv("return", FALSE));
@@ -364,11 +366,11 @@ been wrapped here):
STRLEN length;
command = malloc(sizeof(char) * strlen(*string) + strlen(pattern) + 35);
sprintf(command, "$string = '%s'; $ret = ($string =~ %s)",
- *string, pattern);
- perl_eval(command);
- free(command);
- *string = SvPV(perl_get_sv("string", FALSE), length);
- return SvIV(perl_get_sv("ret", FALSE));
+ *string, pattern);
+ perl_eval(command);
+ free(command);
+ *string = SvPV(perl_get_sv("string", FALSE), length);
+ return SvIV(perl_get_sv("ret", FALSE));
}
/** matches(string, pattern, matches)
**
@@ -387,7 +389,7 @@ been wrapped here):
int i;
command = malloc(sizeof(char) * strlen(string) + strlen(pattern) + 38);
sprintf(command, "$string = '%s'; @array = ($string =~ %s)",
- string, pattern);
+ string, pattern);
perl_eval(command);
free(command);
array = perl_get_av("array", FALSE);
@@ -401,13 +403,15 @@ been wrapped here):
}
main (int argc, char **argv, char **env)
{
- char *embedding[] = { "", "-e", "sub _eval_ { eval $_[0] }" };
+ char *embedding[] = { "", "-e", "0" };
char *text, **match_list;
int num_matches, i;
int j;
my_perl = perl_alloc();
perl_construct( my_perl );
perl_parse(my_perl, NULL, 3, embedding, NULL);
+ perl_run(my_perl);
+
text = (char *) malloc(sizeof(char) * 486); /** A long string follows! **/
sprintf(text, "%s", "When he is at a convenience store and the bill \
comes to some amount like 76 cents, Maynard is aware that there is \
@@ -439,7 +443,7 @@ been wrapped here):
num_matches = substitute(&text, "s/[aeiou]//gi");
if (num_matches) {
printf("substitute: s/[aeiou]//gi...%d substitutions made.\n",
- num_matches);
+ num_matches);
printf("Now text is: %s\n\n", text);
}
/** Attempt a substitution **/
@@ -503,7 +507,6 @@ I<PerlPower()> that contains all the perlguts necessary to push the
two arguments into I<expo()> and to pop the return value out. Take a
deep breath...
- #include <stdio.h>
#include <EXTERN.h>
#include <perl.h>
@@ -539,6 +542,7 @@ deep breath...
sprintf(my_argv[1], "power.pl");
perl_parse(my_perl, NULL, argc, my_argv, NULL);
+ perl_run(my_perl);
PerlPower(3, 4); /*** Compute 3 ** 4 ***/
@@ -555,6 +559,296 @@ Compile and run:
% power
3 to the 4th power is 81.
+=head2 Maintaining a persistent interpreter
+
+When developing interactive, potentially long-running applications, it's
+a good idea to maintain a persistent interpreter rather than allocating
+and constructing a new interpreter multiple times. The major gain here is
+speed, avoiding the penalty of Perl start-up time. However, a persistent
+interpreter will require you to be more cautious in your use of namespace
+and variable scoping. In previous examples we've been using global variables
+in the default package B<main>. We knew exactly what code would be run,
+making it safe to assume we'd avoid any variable collision or outrageous
+symbol table growth.
+
+Let's say your application is a server, which must run perl code from an
+arbitrary file during each transaction. Your server has no way of knowing
+what code is inside anyone of these files.
+If the file was pulled in by B<perl_parse()>, compiled into a newly
+constructed interpreter, then cleaned out with B<perl_destruct()> after the
+the transaction, you'd be shielded from most namespace troubles.
+
+One way to avoid namespace collisions in this scenerio, is to translate the
+file name into a valid Perl package name, which is most likely to be unique,
+then compile the code into that package using L<perlfunc/eval>.
+In the example below, each file will only be compiled once, unless it is
+updated on disk.
+Optionally, the application may choose to clean out the symbol table
+associated with the file after we are done with it. We'll call the subroutine
+B<Embed::Persistent::eval_file> which lives in the file B<persistent.pl>, with
+L<perlcall/perl_call_argv>, passing the filename and boolean cleanup/cache
+flag as arguments.
+
+Note that the process will continue to grow for each file that is compiled,
+and each file it pulls in via L<perlfunc/require>, L<perlfunc/use> or
+L<perlfunc/do>. In addition, there maybe B<AUTOLOAD>ed subroutines and
+other conditions that cause Perl's symbol table to grow. You may wish to
+add logic which keeps track of process size or restarts itself after n number
+of requests to ensure memory consumption is kept to a minimum. You also need
+to consider the importance of variable scoping with L<perlfunc/my> to futher
+reduce symbol table growth.
+
+
+ package Embed::Persistent;
+ #persistent.pl
+
+ use strict;
+ use vars '%Cache';
+
+ #use Devel::Symdump ();
+
+ sub valid_package_name {
+ my($string) = @_;
+ $string =~ s/([^A-Za-z0-9\/])/sprintf("_%2x",unpack("C",$1))/eg;
+ # second pass only for words starting with a digit
+ $string =~ s|/(\d)|sprintf("/_%2x",unpack("C",$1))|eg;
+
+ # Dress it up as a real package name
+ $string =~ s|/|::|g;
+ return "Embed" . $string;
+ }
+
+ #borrowed from Safe.pm
+ sub delete_package {
+ my $pkg = shift;
+ my ($stem, $leaf);
+
+ no strict 'refs';
+ $pkg = "main::$pkg\::"; # expand to full symbol table name
+ ($stem, $leaf) = $pkg =~ m/(.*::)(\w+::)$/;
+
+ my $stem_symtab = *{$stem}{HASH};
+
+ delete $stem_symtab->{$leaf};
+ }
+
+ sub eval_file {
+ my($filename, $delete) = @_;
+ my $package = valid_package_name($filename);
+ my $mtime = -M $filename;
+ if(defined $Cache{$package}{mtime}
+ &&
+ $Cache{$package}{mtime} <= $mtime)
+ {
+ # we have compiled this subroutine already,
+ # it has not been updated on disk, nothing left to do
+ print STDERR "already compiled $package->handler\n";
+ }
+ else {
+ local *FH;
+ open FH, $filename or die "open '$filename' $!";
+ local($/) = undef;
+ my $sub = <FH>;
+ close FH;
+
+ #wrap the code into a subroutine inside our unique package
+ my $eval = qq{package $package; sub handler { $sub; }};
+ {
+ # hide our variables within this block
+ my($filename,$mtime,$package,$sub);
+ eval $eval;
+ }
+ die $@ if $@;
+
+ #cache it unless we're cleaning out each time
+ $Cache{$package}{mtime} = $mtime unless $delete;
+ }
+
+ eval {$package->handler;};
+ die $@ if $@;
+
+ delete_package($package) if $delete;
+
+ #take a look if you want
+ #print Devel::Symdump->rnew($package)->as_string, $/;
+ }
+
+ 1;
+
+ __END__
+
+ /* persistent.c */
+ #include <EXTERN.h>
+ #include <perl.h>
+
+ /* 1 = clean out filename's symbol table after each request, 0 = don't */
+ #ifndef DO_CLEAN
+ #define DO_CLEAN 0
+ #endif
+
+ static PerlInterpreter *perl = NULL;
+
+ int
+ main(int argc, char **argv, char **env)
+ {
+ char *embedding[] = { "", "persistent.pl" };
+ char *args[] = { "", DO_CLEAN, NULL };
+ char filename [1024];
+ int exitstatus = 0;
+
+ if((perl = perl_alloc()) == NULL) {
+ fprintf(stderr, "no memory!");
+ exit(1);
+ }
+ perl_construct(perl);
+
+ exitstatus = perl_parse(perl, NULL, 2, embedding, NULL);
+
+ if(!exitstatus) {
+ exitstatus = perl_run(perl);
+
+ while(printf("Enter file name: ") && gets(filename)) {
+
+ /* call the subroutine, passing it the filename as an argument */
+ args[0] = filename;
+ perl_call_argv("Embed::Persistent::eval_file",
+ G_DISCARD | G_EVAL, args);
+
+ /* check $@ */
+ if(SvTRUE(GvSV(errgv)))
+ fprintf(stderr, "eval error: %s\n", SvPV(GvSV(errgv),na));
+ }
+ }
+
+ perl_destruct_level = 0;
+ perl_destruct(perl);
+ perl_free(perl);
+ exit(exitstatus);
+ }
+
+
+Now compile:
+
+ % cc -o persistent persistent.c `perl -MExtUtils::Embed -e ldopts`
+
+Here's a example script file:
+
+ #test.pl
+ my $string = "hello";
+ foo($string);
+
+ sub foo {
+ print "foo says: @_\n";
+ }
+
+Now run:
+
+ % persistent
+ Enter file name: test.pl
+ foo says: hello
+ Enter file name: test.pl
+ already compiled Embed::test_2epl->handler
+ foo says: hello
+ Enter file name: ^C
+
+=head2 Maintaining multiple interpreter instances
+
+The previous examples have gone through several steps to startup, use and
+shutdown an embedded Perl interpreter. Certain applications may require
+more than one instance of an interpreter to be created during the lifespan
+of a single process. Such an application may take different approaches in
+it's use of interpreter objects. For example, a particular transaction may
+want to create an interpreter instance, then release any resources associated
+with the object once the transaction is completed. When a single process
+does this once, resources are released upon exit of the program and the next
+time it starts, the interpreter's global state is fresh.
+
+In the same process, the program must take care to ensure that these
+actions take place before constructing a new interpreter. By default, the
+global variable C<perl_destruct_level> is set to C<0> since extra cleaning
+is not needed when a program constructs a single interpreter, such as the
+perl executable itself in C</usr/bin/perl> or some such.
+
+You can tell Perl to make everything squeeky clean by setting
+C<perl_destruct_level> to C<1>.
+
+ perl_destruct_level = 1; /* perl global variable */
+ while(1) {
+ ...
+ /* reset global variables here with perl_destruct_level = 1 */
+ perl_contruct(my_perl);
+ ...
+ /* clean and reset _everything_ during perl_destruct */
+ perl_destruct(my_perl); /* ah, nice and fresh */
+ perl_free(my_perl);
+ ...
+ /* let's go do it again! */
+ }
+
+Now, when I<perl_destruct()> is called, the interpreter's syntax parsetree
+and symbol tables are cleaned out, along with reseting global variables.
+
+So, we've seen how to startup and shutdown an interpreter more than once
+in the same process, but there was only one instance in existance at any
+one time. Hmm, wonder if we can have more than one interpreter instance
+running at the _same_ time?
+Indeed this is possible, however when you build Perl, you must compile with
+C<-DMULTIPLICITY>.
+
+It's a little tricky for the Perl runtime to handle multiple interpreters,
+introducing some overhead that most programs with a single interpreter don't
+get burdened with. When you compile with C<-DMULTIPLICITY>, by default,
+C<perl_destruct_level> is set to C<1> for each interpreter.
+
+Let's give it a try:
+
+
+ #include <EXTERN.h>
+ #include <perl.h>
+
+
+ /* we're going to embed two interpreters */
+ /* we're going to embed two interpreters */
+
+
+ #define SAY_HELLO "-e", "print qq(Hi, I'm $^X\n)"
+
+
+ int main(int argc, char **argv, char **env)
+ {
+ PerlInterpreter
+ *one_perl = perl_alloc(),
+ *two_perl = perl_alloc();
+ char *one_args[] = { "one_perl", SAY_HELLO };
+ char *two_args[] = { "two_perl", SAY_HELLO };
+
+ perl_construct(one_perl);
+ perl_construct(two_perl);
+
+ perl_parse(one_perl, NULL, 3, one_args, (char **)NULL);
+ perl_parse(two_perl, NULL, 3, two_args, (char **)NULL);
+
+ perl_run(one_perl);
+ perl_run(two_perl);
+
+ perl_destruct(one_perl);
+ perl_destruct(two_perl);
+
+ perl_free(one_perl);
+ perl_free(two_perl);
+ }
+
+
+Compile as usual:
+
+ % cc -o multiplicity multiplicity.c `perl -MExtUtils::Embed -e ccopts -e ldopts`
+
+Run it, Run it:
+
+ % multiplicity
+ Hi, I'm one_perl
+ Hi, I'm two_perl
+
=head2 Using Perl modules, which themselves use C libraries, from your C program
If you've played with the examples above and tried to embed a script
diff --git a/pod/perlform.pod b/pod/perlform.pod
index 4fac1a69e3..b11936b534 100644
--- a/pod/perlform.pod
+++ b/pod/perlform.pod
@@ -72,7 +72,14 @@ separated by commas. The expressions are all evaluated in a list context
before the line is processed, so a single list expression could produce
multiple list elements. The expressions may be spread out to more than
one line if enclosed in braces. If so, the opening brace must be the first
-token on the first line.
+token on the first line. If an expression evaluates to a number with a
+decimal part, and if the corresponding picture specifies that the decimal
+part should appear in the output (that is, any picture except multiple "#"
+characters B<without> an embedded "."), the character used for the decimal
+point is B<always> determined by the current LC_NUMERIC locale. This
+means that, if, for example, the run-time environment happens to specify a
+German locale, "," will be used instead of the default ".". See
+L<perllocale> and L<"WARNINGS"> for more information.
Picture fields that begin with ^ rather than @ are treated specially.
With a # field, the field is blanked out if the value is undefined. For
@@ -306,10 +313,20 @@ is to printf(), do this:
END
print $string;
-=head1 WARNING
+=head1 WARNINGS
Lexical variables (declared with "my") are not visible within a
format unless the format is declared within the scope of the lexical
variable. (They weren't visible at all before version 5.001.) Furthermore,
lexical aliases will not be compiled correctly: see
L<perlfunc/my> for other issues.
+
+Formats are the only part of Perl which unconditionally use information
+from a program's locale; if a program's environment specifies an
+LC_NUMERIC locale, it is always used to specify the decimal point
+character in formatted output. Perl ignores all other aspects of locale
+handling unless the C<use locale> pragma is in effect. Formatted output
+cannot be controlled by C<use locale> because the pragma is tied to the
+block structure of the program, and, for historical reasons, formats
+exist outside that block structure. See L<perllocale> for further
+discussion of locale handling.
diff --git a/pod/perlfunc.pod b/pod/perlfunc.pod
index fe3da14929..65bba93bbb 100644
--- a/pod/perlfunc.pod
+++ b/pod/perlfunc.pod
@@ -56,9 +56,7 @@ Remember the following rule:
=over 8
-=item
-
-I<THERE IS NO GENERAL RULE FOR CONVERTING A LIST INTO A SCALAR!>
+=item I<THERE IS NO GENERAL RULE FOR CONVERTING A LIST INTO A SCALAR!>
=back
@@ -283,8 +281,8 @@ file, or a file at EOF when testing a filehandle. Because you have to
read a file to do the C<-T> test, on most occasions you want to use a C<-f>
against the file first, as in C<next unless -f $file && -T $file>.
-If any of the file tests (or either the stat() or lstat() operators) are given the
-special filehandle consisting of a solitary underline, then the stat
+If any of the file tests (or either the stat() or lstat() operators) are given
+the special filehandle consisting of a solitary underline, then the stat
structure of the previous file test (or stat operator) is used, saving
a system call. (This doesn't work with C<-t>, and you need to remember
that lstat() and C<-l> will leave values in the stat structure for the
@@ -340,7 +338,7 @@ fail with $! set to EINTR because Perl sets up signal handlers to
restart system calls on some systems. Using eval/die always works.
eval {
- local $SIG{ALRM} = sub { die "alarm\n" }; # NB \n required
+ local $SIG{ALRM} = sub { die "alarm\n" }; # NB \n required
alarm $timeout;
$nread = sysread SOCKET, $buffer, $size;
alarm 0;
@@ -357,6 +355,11 @@ restart system calls on some systems. Using eval/die always works.
Returns the arctangent of Y/X in the range -PI to PI.
+For the tangent operation, you may use the POSIX::tan()
+function, or use the familiar relation:
+
+ sub tan { sin($_[0]) / cos($_[0]) }
+
=item bind SOCKET,NAME
Binds a network address to a socket, just as the bind system call
@@ -382,7 +385,7 @@ is taken as the name of the filehandle.
=item bless REF
-This function tells the referenced object (passed as REF) that it is now
+This function tells the thingy referenced by REF that it is now
an object in the CLASSNAME package--or the current package if no CLASSNAME
is specified, which is often the case. It returns the reference for
convenience, because a bless() is often the last thing in a constructor.
@@ -395,8 +398,9 @@ blessing (and blessings) of objects.
=item caller
Returns the context of the current subroutine call. In a scalar context,
-returns TRUE if there is a caller, that is, if we're in a subroutine or
-eval() or require(), and FALSE otherwise. In a list context, returns
+returns the caller's package name if there is a caller, that is, if
+we're in a subroutine or eval() or require(), and the undefined value
+otherwise. In a list context, returns
($package, $filename, $line) = caller;
@@ -405,7 +409,7 @@ print a stack trace. The value of EXPR indicates how many call frames
to go back before the current one.
($package, $filename, $line,
- $subroutine, $hasargs, $wantargs) = caller($i);
+ $subroutine, $hasargs, $wantarray) = caller($i);
Furthermore, when called from within the DB package, caller returns more
detailed information: it sets the list variable @DB::args to be the
@@ -434,12 +438,12 @@ number. Returns the number of files successfully changed.
This is a slightly safer version of chop (see below). It removes any
line ending that corresponds to the current value of C<$/> (also known as
-$INPUT_RECORD_SEPARATOR in the C<English> module). It returns the number
-of characters removed. It's often used to remove the newline from the
-end of an input record when you're worried that the final record may be
-missing its newline. When in paragraph mode (C<$/ = "">), it removes all
-trailing newlines from the string. If VARIABLE is omitted, it chomps
-$_. Example:
+$INPUT_RECORD_SEPARATOR in the C<English> module). It returns the total
+number of characters removed from all its arguments. It's often used to
+remove the newline from the end of an input record when you're worried
+that the final record may be missing its newline. When in paragraph mode
+(C<$/ = "">), it removes all trailing newlines from the string. If
+VARIABLE is omitted, it chomps $_. Example:
while (<>) {
chomp; # avoid \n on last field
@@ -527,7 +531,7 @@ If NUMBER is omitted, uses $_.
This function works as the system call by the same name: it makes the
named directory the new root directory for all further pathnames that
begin with a "/" by your process and all of its children. (It doesn't
-change your current working directory is unaffected.) For security
+change your current working directory, which is unaffected.) For security
reasons, this call is restricted to the superuser. If FILENAME is
omitted, does chroot to $_.
@@ -577,6 +581,11 @@ statement).
Returns the cosine of EXPR (expressed in radians). If EXPR is omitted
takes cosine of $_.
+For the inverse cosine operation, you may use the POSIX::acos()
+function, or use this relation:
+
+ sub acos { atan2( sqrt(1 - $_[0] * $_[0]), $_[0] ) }
+
=item crypt PLAINTEXT,SALT
Encrypts a string exactly like the crypt(3) function in the C library
@@ -691,6 +700,24 @@ you should use defined() only when you're questioning the integrity
of what you're trying to do. At other times, a simple comparison to
0 or "" is what you want.
+Another surprise is that using defined() on an entire array or
+hash reports whether memory for that aggregate has ever been
+allocated. So an array you set to the empty list appears undefined
+initially, and one that once was full and that you then set to
+the empty list still appears defined. You should instead use a
+simple test for size:
+
+ if (@an_array) { print "has array elements\n" }
+ if (%a_hash) { print "has hash members\n" }
+
+Using undef() on these, however, does clear their memory and then report
+them as not defined anymore, but you shoudln't do that unless you don't
+plan to use them again, because it saves time when you load them up
+again to have memory already ready to be filled.
+
+This counter-intuitive behaviour of defined() on aggregates may be
+changed, fixed, or broken in a future release of Perl.
+
=item delete EXPR
Deletes the specified key(s) and their associated values from a hash
@@ -721,10 +748,10 @@ hash element lookup or hash slice:
Outside of an eval(), prints the value of LIST to C<STDERR> and exits with
the current value of C<$!> (errno). If C<$!> is 0, exits with the value of
-C<($? E<gt>E<gt> 8)> (back-tick `command` status). If C<($? E<gt>E<gt> 8)> is 0,
-exits with 255. Inside an eval(), the error message is stuffed into C<$@>,
-and the eval() is terminated with the undefined value; this makes die()
-the way to raise an exception.
+C<($? E<gt>E<gt> 8)> (back-tick `command` status). If C<($? E<gt>E<gt> 8)>
+is 0, exits with 255. Inside an eval(), the error message is stuffed into
+C<$@>, and the eval() is terminated with the undefined value; this makes
+die() the way to raise an exception.
Equivalent examples:
@@ -1000,6 +1027,10 @@ are called before exit.) Example:
See also die(). If EXPR is omitted, exits with 0 status.
+You shouldn't use exit() to abort a subroutine if there's any chance that
+someone might want to trap whatever error happened. Use die() instead,
+which can be trapped by an eval().
+
=item exp EXPR
=item exp
@@ -1029,14 +1060,35 @@ value is taken as the name of the filehandle.
=item flock FILEHANDLE,OPERATION
-Calls flock(2) on FILEHANDLE. See L<flock(2)> for definition of
-OPERATION. Returns TRUE for success, FALSE on failure. Will produce a
-fatal error if used on a machine that doesn't implement either flock(2) or
-fcntl(2). The fcntl(2) system call will be automatically used if flock(2)
-is missing from your system. This makes flock() the portable file locking
-strategy, although it will lock only entire files, not records. Note also
-that some versions of flock() cannot lock things over the network; you
-would need to use the more system-specific fcntl() for that.
+Calls flock(2), or an emulation of it, on FILEHANDLE. Returns TRUE for
+success, FALSE on failure. Will produce a fatal error if used on a
+machine that doesn't implement flock(2), fcntl(2) locking, or lockf(3).
+flock() is Perl's portable file locking interface, although it will lock
+only entire files, not records.
+
+OPERATION is one of LOCK_SH, LOCK_EX, or LOCK_UN, possibly combined with
+LOCK_NB. These constants are traditionally valued 1, 2, 8 and 4, but
+you can use the symbolic names if you pull them in with an explicit
+request to the Fcntl module. The names can be requested as a group with
+the :flock tag (or they can be requested individually, of course).
+LOCK_SH requests a shared lock, LOCK_EX requests an exclusive lock, and
+LOCK_UN releases a previously requested lock. If LOCK_NB is added to
+LOCK_SH or LOCK_EX then flock() will return immediately rather than
+blocking waiting for the lock (check the return status to see if you got
+it).
+
+Note that the emulation built with lockf(3) doesn't provide shared
+locks, and it requires that FILEHANDLE be open with write intent. These
+are the semantics that lockf(3) implements. Most (all?) systems
+implement lockf(3) in terms of fcntl(2) locking, though, so the
+differing semantics shouldn't bite too many people.
+
+Note also that some versions of flock() cannot lock things over the
+network; you would need to use the more system-specific fcntl() for
+that. If you like you can force Perl to ignore your system's flock(2)
+function, and so provide its own fcntl(2)-based emulation, by passing
+the switch C<-Ud_flock> to the F<Configure> program when you configure
+perl.
Here's a mailbox appender for BSD systems.
@@ -1067,8 +1119,8 @@ See also L<DB_File> for other flock() examples.
Does a fork(2) system call. Returns the child pid to the parent process
and 0 to the child process, or C<undef> if the fork is unsuccessful.
Note: unflushed buffers remain unflushed in both processes, which means
-you may need to set C<$|> ($AUTOFLUSH in English) or call the
-autoflush() FileHandle method to avoid duplicate output.
+you may need to set C<$|> ($AUTOFLUSH in English) or call the autoflush()
+method of IO::Handle to avoid duplicate output.
If you fork() without ever waiting on your children, you will accumulate
zombies:
@@ -1093,6 +1145,11 @@ fork() returns omitted);
See also L<perlipc> for more examples of forking and reaping
moribund children.
+Note that if your forked child inherits system file descriptors like
+STDIN and STDOUT that are actually connected by a pipe or socket, even
+if you exit, the remote server (such as, say, httpd or rsh) won't think
+you're done. You should reopen those to /dev/null if it's any issue.
+
=item format
Declare a picture format with use by the write() function. For
@@ -1159,8 +1216,10 @@ single-characters, however. For that, try something more like:
Determination of whether to whether $BSD_STYLE should be set
is left as an exercise to the reader.
+The POSIX::getattr() function can do this more portably on systems
+alleging POSIX compliance.
See also the C<Term::ReadKey> module from your nearest CPAN site;
-details on CPAN can be found on L<perlmod/CPAN>
+details on CPAN can be found on L<perlmod/CPAN>.
=item getlogin
@@ -1544,7 +1603,7 @@ C<continue> block, if any, is not executed:
Returns an lowercased version of EXPR. This is the internal function
implementing the \L escape in double-quoted strings.
-Should respect any POSIX setlocale() settings.
+Respects current LC_CTYPE locale if C<use locale> in force. See L<perllocale>.
If EXPR is omitted, uses $_.
@@ -1554,7 +1613,7 @@ If EXPR is omitted, uses $_.
Returns the value of EXPR with the first character lowercased. This is
the internal function implementing the \l escape in double-quoted strings.
-Should respect any POSIX setlocale() settings.
+Respects current LC_CTYPE locale if C<use locale> in force. See L<perllocale>.
If EXPR is omitted, uses $_.
@@ -1903,7 +1962,7 @@ If you want a "real" C open() (see L<open(2)> on your system), then
you should use the sysopen() function. This is another way to
protect your filenames from interpretation. For example:
- use FileHandle;
+ use IO::Handle;
sysopen(HANDLE, $path, O_RDWR|O_CREAT|O_EXCL, 0700)
or die "sysopen $path: $!";
HANDLE->autoflush(1);
@@ -2055,6 +2114,8 @@ for examples of such things.
=item pop ARRAY
+=item pop
+
Pops and returns the last value of the array, shortening the array by
1. Has a similar effect to
@@ -2071,7 +2132,9 @@ like shift().
Returns the offset of where the last C<m//g> search left off for the variable
is in question ($_ is used when the variable is not specified). May be
-modified to change that offset.
+modified to change that offset. Such modification will also influence
+the C<\G> zero-width assertion in regular expressions. See L<perlre> and
+L<perlop>.
=item print FILEHANDLE LIST
@@ -2106,8 +2169,14 @@ you will have to use a block returning its value instead:
=item printf FORMAT, LIST
-Equivalent to a "print FILEHANDLE sprintf(FORMAT, LIST)". The first argument
-of the list will be interpreted as the printf format.
+Equivalent to C<print FILEHANDLE sprintf(FORMAT, LIST)>. The first argument
+of the list will be interpreted as the printf format. If C<use locale> is
+in effect, the character used for the decimal point in formatted real numbers
+is affected by the LC_NUMERIC locale. See L<perllocale>.
+
+Don't fall into the trap of using a printf() when a simple
+print() would do. The print() is more efficient, and less
+error prone.
=item prototype FUNCTION
@@ -2141,8 +2210,11 @@ Generalized quotes. See L<perlop>.
=item quotemeta
-Returns the value of EXPR with with all regular expression
-metacharacters backslashed. This is the internal function implementing
+Returns the value of EXPR with with all non-alphanumeric
+characters backslashed. (That is, all characters not matching
+C</[A-Za-z_0-9]/> will be preceded by a backslash in the
+returned string, regardless of any locale settings.)
+This is the internal function implementing
the \Q escape in double-quoted strings.
If EXPR is omitted, uses $_.
@@ -2461,7 +2533,7 @@ actual filehandle. Thus:
Some programmers may prefer to think of filehandles as objects with
methods, preferring to write the last example as:
- use FileHandle;
+ use IO::Handle;
STDERR->autoflush(1);
=item select RBITS,WBITS,EBITS,TIMEOUT
@@ -2617,6 +2689,11 @@ has the same interpretation as in the system call of the same name.
Returns the sine of EXPR (expressed in radians). If EXPR is omitted,
returns sine of $_.
+For the inverse sine operation, you may use the POSIX::sin()
+function, or use this relation:
+
+ sub asin { atan2($_[0], sqrt(1 - $_[0] * $_[0])) }
+
=item sleep EXPR
=item sleep
@@ -2674,6 +2751,9 @@ the subroutine not via @_ but as the package global variables $a and
$b (see example below). They are passed by reference, so don't
modify $a and $b. And don't try to declare them as lexicals either.
+When C<use locale> is in effect, C<sort LIST> sorts LIST according to the
+current collation locale. See L<perllocale>.
+
Examples:
# sort lexically
@@ -2888,7 +2968,10 @@ Returns a string formatted by the usual printf conventions of the C
language. See L<sprintf(3)> or L<printf(3)> on your system for details.
(The * character for an indirectly specified length is not
supported, but you can get the same effect by interpolating a variable
-into the pattern.) Some C libraries' implementations of sprintf() can
+into the pattern.) If C<use locale> is
+in effect, the character used for the decimal point in formatted real numbers
+is affected by the LC_NUMERIC locale. See L<perllocale>.
+Some C libraries' implementations of sprintf() can
dump core when fed ludicrous arguments.
=item sqrt EXPR
@@ -2902,12 +2985,39 @@ root of $_.
Sets the random number seed for the C<rand> operator. If EXPR is omitted,
uses a semi-random value based on the current time and process ID, among
-other things. Of course, you'd need something much more random than that for
-cryptographic purposes, because it's easy to guess the current time.
-Checksumming the compressed output of rapidly changing operating system
-status programs is the usual method. Examples are posted regularly to
-the comp.security.unix newsgroup.
+other things.
+
+Simply seeding with time() and the process ID isn't particularly random,
+especially if they vary together.
+
+Try something like this instead:
+ srand( time() ^ ($$ + ($$ << 15)) );
+
+Of course, you'd need something much more random than that for
+serious cryptographic purposes, since it's easy to guess the current time.
+Checksumming the compressed output of one or more rapidly changing operating
+system status programs is the usual method. For example:
+
+ srand (time ^ $$ ^ unpack "%L*", `ps axww | gzip`);
+
+Do I<not>fP call srand() multiple times in your program unless you know
+exactly what you're doing and why you're doing it. The point of the
+function is to "seed" the rand() function so that rand() can produce
+a different sequence each time you run your program. Just do it once at the
+top of your program, or you I<won't> get random numbers out of rand()!
+
+Frequently called programs (like CGI scripts) that simply use
+
+ time ^ $$
+
+for a seed can fall prey to the mathematical property that
+
+ a^b == (a+1)^(b+1)
+
+one-third of the time. If you're particularly concerned with this,
+see the Math::TrulyRandom module in CPAN.
+
=item stat FILEHANDLE
=item stat EXPR
@@ -3090,6 +3200,9 @@ the value of PERMS specifies the permissions of the newly created
file. If PERMS is omitted, the default value is 0666, which allows
read and write for all. This default is reasonable: see C<umask>.
+The IO::File module provides a more object-oriented approach, if you're
+into that kind of thing.
+
=item sysread FILEHANDLE,SCALAR,LENGTH,OFFSET
=item sysread FILEHANDLE,SCALAR,LENGTH
@@ -3116,9 +3229,42 @@ Note that argument processing varies depending on the number of
arguments. The return value is the exit status of the program as
returned by the wait() call. To get the actual exit value divide by
256. See also L</exec>. This is I<NOT> what you want to use to capture
-the output from a command, for that you should use merely back-ticks, as
-described in L<perlop/"`STRING`">.
+the output from a command, for that you should use merely back-ticks or
+qx//, as described in L<perlop/"`STRING`">.
+Because system() and back-ticks block SIGINT and SIGQUIT, killing the
+program they're running doesn't actually interrupt your program.
+
+ @args = ("command", "arg1", "arg2");
+ system(@args) == 0
+ or die "system @args failed: $?"
+
+Here's a more elaborate example of analysing the return value from
+system() on a UNIX system to check for all possibilities, including for
+signals and coredumps.
+
+ $rc = 0xffff & system @args;
+ printf "system(%s) returned %#04x: ", "@args", $rc;
+ if ($rc == 0) {
+ print "ran with normal exit\n";
+ }
+ elsif ($rc == 0xff00) {
+ print "command failed: $!\n";
+ }
+ elsif ($rc > 0x80) {
+ $rc >>= 8;
+ print "ran with non-zero exit status $rc\n";
+ }
+ else {
+ print "ran with ";
+ if ($rc & 0x80) {
+ $rc &= ~0x80;
+ print "coredump from ";
+ }
+ print "signal $rc\n"
+ }
+ $ok = ($rc != 0);
+
=item syswrite FILEHANDLE,SCALAR,LENGTH,OFFSET
=item syswrite FILEHANDLE,SCALAR,LENGTH
@@ -3243,7 +3389,7 @@ on your system.
Returns an uppercased version of EXPR. This is the internal function
implementing the \U escape in double-quoted strings.
-Should respect any POSIX setlocale() settings.
+Respects current LC_CTYPE locale if C<use locale> in force. See L<perllocale>.
If EXPR is omitted, uses $_.
@@ -3253,7 +3399,7 @@ If EXPR is omitted, uses $_.
Returns the value of EXPR with the first character uppercased. This is
the internal function implementing the \u escape in double-quoted strings.
-Should respect any POSIX setlocale() settings.
+Respects current LC_CTYPE locale if C<use locale> in force. See L<perllocale>.
If EXPR is omitted, uses $_.
diff --git a/pod/perlguts.pod b/pod/perlguts.pod
index 7f5d40d79f..55014fb404 100644
--- a/pod/perlguts.pod
+++ b/pod/perlguts.pod
@@ -90,7 +90,7 @@ which will determine if more memory needs to be allocated. If so, it will
call the function C<sv_grow>. Note that C<SvGROW> can only increase, not
decrease, the allocated memory of an SV and that it does not automatically
add a byte for the a trailing NUL (perl's own string functions typically do
-SvGROW(sv, len + 1)).
+C<SvGROW(sv, len + 1)>).
If you have an SV and want to know what kind of data Perl thinks is stored
in it, you can use the following macros to check the type of SV you have.
@@ -312,7 +312,7 @@ by using the following:
This returns NULL if the variable does not exist.
-The hash algorithm is defined in the PERL_HASH(hash, key, klen) macro:
+The hash algorithm is defined in the C<PERL_HASH(hash, key, klen)> macro:
i = klen;
hash = 0;
@@ -384,26 +384,24 @@ for information on converting class names into stashes.
/* Still under construction */
Upgrades rv to reference if not already one. Creates new SV for rv to
-point to.
-If classname is non-null, the SV is blessed into the specified class.
-SV is returned.
+point to. If C<classname> is non-null, the SV is blessed into the specified
+class. SV is returned.
SV* newSVrv(SV* rv, char* classname);
-Copies integer or double into an SV whose reference is rv. SV is blessed
-if classname is non-null.
+Copies integer or double into an SV whose reference is C<rv>. SV is blessed
+if C<classname> is non-null.
SV* sv_setref_iv(SV* rv, char* classname, IV iv);
SV* sv_setref_nv(SV* rv, char* classname, NV iv);
Copies the pointer value (I<the address, not the string!>) into an SV whose
-reference is rv. SV is blessed if classname is non-null.
+reference is rv. SV is blessed if C<classname> is non-null.
SV* sv_setref_pv(SV* rv, char* classname, PV iv);
-Copies string into an SV whose reference is rv.
-Set length to 0 to let Perl calculate the string length.
-SV is blessed if classname is non-null.
+Copies string into an SV whose reference is C<rv>. Set length to 0 to let
+Perl calculate the string length. SV is blessed if C<classname> is non-null.
SV* sv_setref_pvn(SV* rv, char* classname, PV iv, int length);
@@ -679,6 +677,7 @@ The current kinds of Magic Virtual Tables are:
i vtbl_isaelem @ISA array element
L 0 (but sets RMAGICAL) Perl Module/Debugger???
l vtbl_dbline Debugger?
+ o vtbl_collxfrm Locale transformation
P vtbl_pack Tied Array or Hash
p vtbl_packelem Tied Array or Hash element
q vtbl_packelem Tied Scalar or Handle
@@ -688,7 +687,7 @@ The current kinds of Magic Virtual Tables are:
U vtbl_uvar ???
v vtbl_vec Vector
x vtbl_substr Substring???
- y vtbl_vivary Shadow variable in foreach loop
+ y vtbl_itervar Shadow "foreach" iterator variable
* vtbl_glob GV???
# vtbl_arylen Array Length
. vtbl_pos $. scalar variable
@@ -917,7 +916,7 @@ For a complete description of the PerlIO abstraction, consult L<perlapio>.
=head2 Scratchpads
-=head3 Putting a C value on Perl stack
+=head2 Putting a C value on Perl stack
A lot of opcodes (this is an elementary operation in the internal perl
stack machine) put an SV* on the stack. However, as an optimization
@@ -934,7 +933,7 @@ The macro to put this target on stack is C<PUSHTARG>, and it is
directly used in some opcodes, as well as indirectly in zillions of
others, which use it via C<(X)PUSH[pni]>.
-=head3 Scratchpads
+=head2 Scratchpads
The question remains on when the SV's which are I<target>s for opcodes
are created. The answer is that they are created when the current unit --
@@ -952,7 +951,7 @@ The correspondence between OP's and I<target>s is not 1-to-1. Different
OP's in the compile tree of the unit can use the same target, if this
would not conflict with the expected life of the temporary.
-=head3 Scratchpads and recursions
+=head2 Scratchpads and recursions
In fact it is not 100% true that a compiled unit contains a pointer to
the scratchpad AV. In fact it contains a pointer to an AV of
@@ -1234,13 +1233,20 @@ Returns a pointer to the stash for a specified package. See C<gv_stashpv>.
HV* gv_stashsv _((SV* sv, I32 create));
-=item GvSV
+=item he_free
-Return the SV from the GV.
+Releases a hash entry, such as while iterating though the hash. See
+C<hv_iternext>.
-=item he_free
+ void he_free _((HV* hv, HE* hent));
-Releases a hash entry from an iterator. See C<hv_iternext>.
+=item he_delayfree
+
+Releases a hash entry, such as while iterating though the hash, but
+delays actual freeing of key and value until the end of the current
+statement (or thereabouts) with C<sv_2mortal>. See C<hv_iternext>.
+
+ void he_delayfree _((HV* hv, HE* hent));
=item hv_clear
@@ -1535,6 +1541,7 @@ Creates a new SV for the RV, C<rv>, to point to. If C<rv> is not an RV then
it will be upgraded to one. If C<classname> is non-null then the new SV will
be blessed in the specified package. The new SV is returned and its
reference count is 1.
+
SV* newSVrv _((SV* rv, char* classname));
=item newSVsv
@@ -2590,4 +2597,4 @@ API Listing by Dean Roehrich <roehrich@cray.com>.
=head1 DATE
-Version 27: 1996/12/24
+Version 28.1: 1997/1/13
diff --git a/pod/perllocale.pod b/pod/perllocale.pod
index aac84d6c54..7a48752649 100644
--- a/pod/perllocale.pod
+++ b/pod/perllocale.pod
@@ -23,6 +23,8 @@ several environment variables.
B<NOTE>: This feature is new in Perl 5.004, and does not apply unless an
application specifically requests it - see L<Backward compatibility>.
+The one exception is that write() now B<always> uses the current locale
+- see L<"NOTES">.
=head1 PREPARING TO USE LOCALES
@@ -357,10 +359,12 @@ a couple of transformations. In fact, it doesn't save anything: Perl
magic (see L<perlguts/Magic>) creates the transformed version of a
string the first time it's needed in a comparison, then keeps it around
in case it's needed again. An example rewritten the easy way with
-C<cmp> runs just about as fast. It also copes with null characters
+C<cmp> runs just about as fast. It also copes with null characters
embedded in strings; if you call strxfrm() directly, it treats the first
-null it finds as a terminator. In short, don't call strxfrm() directly:
-let Perl do it for you.
+null it finds as a terminator. And don't expect the transformed strings
+it produces to be portable across systems - or even from one revision
+of your operating system to the next. In short, don't call strxfrm()
+directly: let Perl do it for you.
Note: C<use locale> isn't shown in some of these examples, as it isn't
needed: strcoll() and strxfrm() exist only to generate locale-dependent
@@ -377,7 +381,14 @@ regular expressions.) Thanks to C<LC_CTYPE>, depending on your locale
setting, characters like 'E<aelig>', 'E<eth>', 'E<szlig>', and
'E<oslash>' may be understood as C<\w> characters.
-C<LC_CTYPE> also affects the POSIX character-class test functions -
+The C<LC_CTYPE> locale also provides the map used in translating
+characters between lower- and upper-case. This affects the case-mapping
+functions - lc(), lcfirst, uc() and ucfirst(); case-mapping
+interpolation with C<\l>, C<\L>, C<\u> or <\U> in double-quoted strings
+and in C<s///> substitutions; and case-independent regular expression
+pattern matching using the C<i> modifier.
+
+Finally, C<LC_CTYPE> affects the POSIX character-class test functions -
isalpha(), islower() and so on. For example, if you move from the "C"
locale to a 7-bit Scandinavian one, you may find - possibly to your
surprise - that "|" moves from the ispunct() class to isalpha().
@@ -478,6 +489,12 @@ characters such as "E<gt>" and "|" are alphanumeric.
=item *
+String interpolation with case-mapping, as in, say, C<$dest =
+"C:\U$name.$ext">, may produce dangerous results if a bogus LC_CTYPE
+case-mapping table is in effect.
+
+=item *
+
If the decimal point character in the C<LC_NUMERIC> locale is
surreptitiously changed from a dot to a comma, C<sprintf("%g",
0.123456e3)> produces a string result of "123,456". Many people would
@@ -525,22 +542,31 @@ the locale:
Scalar true/false (or less/equal/greater) result is never tainted.
+=item B<Case-mapping interpolation> (with C<\l>, C<\L>, C<\u> or <\U>)
+
+Result string containing interpolated material is tainted if
+C<use locale> is in effect.
+
=item B<Matching operator> (C<m//>):
Scalar true/false result never tainted.
Subpatterns, either delivered as an array-context result, or as $1 etc.
are tainted if C<use locale> is in effect, and the subpattern regular
-expression contains C<\w> (to match an alphanumeric character). The
-matched pattern variable, $&, is also tainted if C<use locale> is in
-effect, and the regular expression contains C<\w>.
+expression contains C<\w> (to match an alphanumeric character), C<\W>
+(non-alphanumeric character), C<\s> (white-space character), or C<\S>
+(non white-space character). The matched pattern variable, $&, $`
+(pre-match), $' (post-match), and $+ (last match) are also tainted if
+C<use locale> is in effect and the regular expression contains C<\w>,
+C<\W>, C<\s>, or C<\S>.
=item B<Substitution operator> (C<s///>):
-Has the same behavior as the match operator. When C<use locale> is
-in effect, he left operand of C<=~> will become tainted if it is
-modified as a result of a substitution based on a regular expression
-match involving C<\w>.
+Has the same behavior as the match operator. Also, the left
+operand of C<=~> becomes tainted when C<use locale> in effect,
+if it is modified as a result of a substitution based on a regular
+expression match involving C<\w>, C<\W>, C<\s>, or C<\S>; or of
+case-mapping with C<\l>, C<\L>,C<\u> or <\U>.
=item B<In-memory formatting function> (sprintf()):
@@ -718,6 +744,16 @@ exact multiplier depends on the string's contents, the operating system
and the locale.) These downsides are dictated more by the operating
system's implementation of the locale system than by Perl.
+=head2 write() and LC_NUMERIC
+
+Formats are the only part of Perl which unconditionally use information
+from a program's locale; if a program's environment specifies an
+LC_NUMERIC locale, it is always used to specify the decimal point
+character in formatted output. Formatted output cannot be controlled by
+C<use locale> because the pragma is tied to the block structure of the
+program, and, for historical reasons, formats exist outside that block
+structure.
+
=head2 Freely available locale definitions
There is a large collection of locale definitions at
@@ -772,4 +808,4 @@ L<POSIX (3)/strxfrm>
Jarkko Hietaniemi's original F<perli18n.pod> heavily hacked by Dominic
Dunlop, assisted by the perl5-porters.
-Last update: Tue Dec 24 16:43:11 EST 1996
+Last update: Tue Dec 31 01:30:55 EST 1996
diff --git a/pod/perllol.pod b/pod/perllol.pod
index 37adac7ef5..b2d5dbe537 100644
--- a/pod/perllol.pod
+++ b/pod/perllol.pod
@@ -146,8 +146,8 @@ you'd have to do something like this:
Actually, if you were using strict, you'd have to declare not only
$ref_to_LoL as you had to declare @LoL, but you'd I<also> having to
-initialize it to a reference to an empty list. (This was a bug in 5.001m
-that's been fixed for the 5.002 release.)
+initialize it to a reference to an empty list. (This was a bug in
+perl version 5.001m that's been fixed for the 5.002 release.)
my $ref_to_LoL = [];
while (<>) {
diff --git a/pod/perlnews.pod b/pod/perlnews.pod
index 0af4e4ea8e..3cd71de7d1 100644
--- a/pod/perlnews.pod
+++ b/pod/perlnews.pod
@@ -23,7 +23,15 @@ file in the distribution for details.
There is a new Configure question that asks if you want to maintain
binary compatibility with Perl 5.003. If you choose binary
compatibility, you do not have to recompile your extensions, but you
-might have symbol conflicts if you embed Perl in another application.
+might have symbol conflicts if you embed Perl in another application,
+just as in the 5.003 release.
+
+=head2 New Opcode Module and Revised Safe Module
+
+A new Opcode module supports the creation, manipulation and
+application of opcode masks. The revised Safe module has a new API
+and is implemented using the new Opcode module. Please read the new
+Opcode and Safe documentation.
=head2 Internal Change: FileHandle Deprecated
@@ -33,13 +41,7 @@ are still supported for backwards compatibility
C<use IO::Handle> (or C<IO::Seekable> or C<IO::File>) and
C<*STDOUT{IO}> are the way of the future.
-=head2 Internal Change: Safe Module Absorbed into Opcode
-
-A new Opcode module subsumes 5.003's Safe module. The Safe
-interface is still available, so existing scripts should still
-work, but users are encouraged to read the new Opcode documentation.
-
-=head2 Internal Change: PerlIO internal IO abstraction interface.
+=head2 Internal Change: PerlIO internal IO abstraction interface
It is now possible to build Perl with AT&T's sfio IO package
instead of stdio. See L<perlapio> for more details, and
@@ -168,6 +170,11 @@ the Universal class, croaks if the given version is larger than the
value of the variable $Module::VERSION. (Note that there is not a
comma after VERSION!)
+This version-checking mechanism is similar to the one currently used
+in the Exporter module, but it is faster and can be used with modules
+that don't use the Exporter. It is the recommended method for new
+code.
+
=item prototype(FUNCTION)
Returns the prototype of a function as a string (or C<undef> if the
@@ -180,6 +187,16 @@ function whose prototype you want to retrieve.
Functions documented in the Camel to default to $_ now in
fact do, and all those that do are so documented in L<perlfunc>.
+=head2 C<m//g> does not trigger a pos() reset on failure
+
+The C<m//g> match iteration construct used to reset the iteration
+when it failed to match (so that the next C<m//g> match would start at
+the beginning of the string). You now have to explicitly do a
+C<pos $str = 0;> to reset the "last match" position, or modify the
+string in some way. This change makes it practical to chain C<m//g>
+matches together in conjunction with ordinary matches using the C<\G>
+zero-width assertion. See L<perlop> and L<perlre>.
+
=back
=head2 New Built-in Methods
@@ -321,7 +338,7 @@ See L<perllocale> for more information.
=item use ops
-Restricts unsafe operations when compiling.
+Disable unsafe opcodes, or any named opcodes, when compiling Perl code.
=back
@@ -419,7 +436,8 @@ All hash keys with the same string are only allocated once, so
even if you have 100 copies of the same hash, the immutable keys
never have to be re-allocated.
-Functions that do nothing but return a fixed value are now inlined.
+Functions that have an empty prototype and that do nothing but return
+a fixed value are now inlined (e.g. C<sub PI () { 3.14159 }>).
=head1 Documentation Changes
@@ -645,4 +663,4 @@ Constructed by Tom Christiansen, grabbing material with permission
from innumerable contributors, with kibitzing by more than a few Perl
porters.
-Last update: Tue Dec 24 16:45:14 EST 1996
+Last update: Tue Jan 14 14:03:02 EST 1997
diff --git a/pod/perlop.pod b/pod/perlop.pod
index a75cb4947d..dd3aeab663 100644
--- a/pod/perlop.pod
+++ b/pod/perlop.pod
@@ -290,6 +290,9 @@ to the right argument.
Binary "cmp" returns -1, 0, or 1 depending on whether the left argument is stringwise
less than, equal to, or greater than the right argument.
+"lt", "le", "ge", "gt" and "cmp" use the collation (sort) order specified
+by the current locale if C<use locale> is in effect. See L<perllocale>.
+
=head2 Bitwise And
Binary "&" returns its operators ANDed together bit by bit.
@@ -580,6 +583,9 @@ are interpolated, as are the following sequences:
\E end case modification
\Q quote regexp metacharacters till \E
+If C<use locale> is in effect, the case map used by C<\l>, C<\L>, C<\u>
+and <\U> is taken from the current locale. See L<perllocale>.
+
Patterns are subject to an additional level of interpretation as a
regular expression. This is done as a second pass, after variables are
interpolated, so that regular expressions may be incorporated into the
@@ -619,6 +625,8 @@ C<!~> operator, the $_ string is searched. (The string specified with
C<=~> need not be an lvalue--it may be the result of an expression
evaluation, but remember the C<=~> binds rather tightly.) See also
L<perlre>.
+See L<perllocale> for discussion of additional considerations which apply
+when C<use locale> is in effect.
Options are:
@@ -687,7 +695,10 @@ In a scalar context, C<m//g> iterates through the string, returning TRUE
each time it matches, and FALSE when it eventually runs out of
matches. (In other words, it remembers where it left off last time and
restarts the search at that point. You can actually find the current
-match position of a string using the pos() function--see L<perlfunc>.)
+match position of a string or set it using the pos() function--see
+L<perlfunc/pos>.) Note that you can use this feature to stack C<m//g>
+matches or intermix C<m//g> matches with C<m/\G.../>.
+
If you modify the string in any way, the match position is reset to the
beginning. Examples:
@@ -703,6 +714,30 @@ beginning. Examples:
}
print "$sentences\n";
+ # using m//g with \G
+ $_ = "ppooqppq";
+ while ($i++ < 2) {
+ print "1: '";
+ print $1 while /(o)/g; print "', pos=", pos, "\n";
+ print "2: '";
+ print $1 if /\G(q)/; print "', pos=", pos, "\n";
+ print "3: '";
+ print $1 while /(p)/g; print "', pos=", pos, "\n";
+ }
+
+The last example should print:
+
+ 1: 'oo', pos=4
+ 2: 'q', pos=4
+ 3: 'pp', pos=7
+ 1: '', pos=7
+ 2: 'q', pos=7
+ 3: '', pos=7
+
+Note how C<m//g> matches change the value reported by C<pos()>, but the
+non-global match doesn't.
+
+
=item q/STRING/
=item C<'STRING'>
@@ -769,6 +804,8 @@ at run-time. If you want the pattern compiled only once the first time
the variable is interpolated, use the C</o> option. If the pattern
evaluates to a null string, the last successfully executed regular
expression is used instead. See L<perlre> for further explanation on these.
+See L<perllocale> for discussion of additional considerations which apply
+when C<use locale> is in effect.
Options are:
diff --git a/pod/perlovl.pod b/pod/perlovl.pod
deleted file mode 100644
index 208456d239..0000000000
--- a/pod/perlovl.pod
+++ /dev/null
@@ -1,15 +0,0 @@
-=head1 NAME
-
-perlovl - overload perl mathematical functions [superseded]
-
-=head1 DESCRIPTION
-
-This man page has been superseded by L<overload>.
-
-=head1 WARNING
-
-The old interface involving %OVERLOAD is deprecated and will go away
-RSN. Convert your scripts to
-use overload ...;
-style.
-
diff --git a/pod/perlpod.pod b/pod/perlpod.pod
index 5485f6c3b9..ce092214b8 100644
--- a/pod/perlpod.pod
+++ b/pod/perlpod.pod
@@ -36,16 +36,16 @@ use however it pleases. Currently recognized commands are
=end X
The "=pod" directive does nothing beyond telling the compiler to lay
-off of through the next "=cut". It's useful for adding another
-paragraph to the doc if you're mixing up code and pod a lot.
+off parsing code through the next "=cut". It's useful for adding
+another paragraph to the doc if you're mixing up code and pod a lot.
-Head1 and head2 produce first and second level headings, with the text on
-the same paragraph as "=headn" forming the heading description.
+Head1 and head2 produce first and second level headings, with the text in
+the same paragraph as the "=headn" directive forming the heading description.
-Item, over, and back require a little more explanation: Over starts a
-section specifically for the generation of a list using =item commands. At
-the end of your list, use =back to end it. You will probably want to give
-"4" as the number to =over, as some formatters will use this for indentation.
+Item, over, and back require a little more explanation: "=over" starts a
+section specifically for the generation of a list using "=item" commands. At
+the end of your list, use "=back" to end it. You will probably want to give
+"4" as the number to "=over", as some formatters will use this for indentation.
This should probably be a default. Note also that there are some basic rules
to using =item: don't use them outside of an =over/=back block, use at least
one inside an =over/=back block, you don't _have_ to include the =back if
@@ -54,45 +54,46 @@ items consistent: either use "=item *" for all of them, to produce bullets,
or use "=item 1.", "=item 2.", etc., to produce numbered lists, or use
"=item foo", "=item bar", etc., i.e., things that looks nothing like bullets
or numbers. If you start with bullets or numbers, stick with them, as many
-formatters use the first =item type to decide how to format the list.
+formatters use the first "=item" type to decide how to format the list.
-For and begin/end let you include sections that are not interpreted as pod
-text, but in a format that a particular formatter is looking for. A
-formatter that can utilize that format will use the section, otherwise it
-will be completely ignored. "=for" specifies that the entire paragraph
-should is in the format indicated by the first word after "=for", like this:
+For, begin, and end let you include sections that are not interpreted
+as pod text, but passed directly to particular formatters. A formatter
+that can utilize that format will use the section, otherwise it will be
+completely ignored. The directive "=for" specifies that the entire next
+paragraph is in the format indicated by the first word after
+"=for", like this:
=for html <br>
<p> This is a raw HTML paragraph </p>
-The paired commands "=begin" and "=end" work very similarly to =for, but
-instead of only accepting a single paragraph, all text from =begin to a
-paragraph with a matching =end are treated as a particular format.
+The paired commands "=begin" and "=end" work very similarly to "=for", but
+instead of only accepting a single paragraph, all text from "=begin" to a
+paragraph with a matching "=end" are treated as a particular format.
Here are some examples of how to use these:
=begin html
-
+
<br>Figure 1.<IMG SRC="figure1.png"><br>
-
+
=end html
-
+
=begin text
-
+
---------------
| foo |
| bar |
---------------
-
+
^^^^ Figure 1. ^^^^
-
+
=end text
Some format names that formatters currently are known to accept include
"roff", "man", "latex", "tex", "text", and "html". (Some formatters will
treat some of these as synonyms.)
-And don't forget, when using any command, that that command lasts up until
+And don't forget, when using any command, that the command lasts up until
the end of the B<paragraph>, not the line. Hence in the examples below, you
can see the blank lines after each command to end its paragraph.
@@ -141,7 +142,7 @@ here and in commands:
L</"sec"> ditto
F<file> Used for filenames
X<index> An index entry
- Z<> A zero-width character
+ ZE<lt>E<gt> A zero-width character
E<escape> A named character (very similar to HTML escapes)
E<lt> A literal <
E<gt> A literal >
@@ -183,15 +184,16 @@ B<pod2html>, B<pod2latex>, and B<pod2fm>.
=head1 Embedding Pods in Perl Modules
You can embed pod documentation in your Perl scripts. Start your
-documentation with a =head1 command at the beg, and end it with
-an =cut command. Perl will ignore the pod text. See any of the
-supplied library modules for examples. If you're going to put
-your pods at the end of the file, and you're using an __END__
-or __DATA__ cut mark, make sure to put a blank line there before
-the first pod directive.
+documentation with a "=head1" command at the beginning, and end it
+with a "=cut" command. Perl will ignore the pod text. See any of the
+supplied library modules for examples. If you're going to put your
+pods at the end of the file, and you're using an __END__ or __DATA__
+cut mark, make sure to put a blank line there before the first pod
+directive.
__END__
+
=head1 NAME
modern - I am a modern module
diff --git a/pod/perlre.pod b/pod/perlre.pod
index ce054ec448..a4c0a7d9de 100644
--- a/pod/perlre.pod
+++ b/pod/perlre.pod
@@ -19,6 +19,9 @@ the regular expression inside. These are:
Do case-insensitive pattern matching.
+If C<use locale> is in effect, the case map is taken from the current
+locale. See L<perllocale>.
+
=item m
Treat string as multiple lines. That is, change "^" and "$" from matching
@@ -136,6 +139,9 @@ also work:
\E end case modification (think vi)
\Q quote regexp metacharacters till \E
+If C<use locale> is in effect, the case map used by C<\l>, C<\L>, C<\u>
+and <\U> is taken from the current locale. See L<perllocale>.
+
In addition, Perl defines the following:
\w Match a "word" character (alphanumeric plus "_")
@@ -146,9 +152,11 @@ In addition, Perl defines the following:
\D Match a non-digit character
Note that C<\w> matches a single alphanumeric character, not a whole
-word. To match a word you'd need to say C<\w+>. You may use C<\w>,
-C<\W>, C<\s>, C<\S>, C<\d>, and C<\D> within character classes (though not
-as either end of a range).
+word. To match a word you'd need to say C<\w+>. If C<use locale> is in
+effect, the list of alphabetic characters generated by C<\w> is taken
+from the current locale. See L<perllocale>. You may use C<\w>, C<\W>,
+C<\s>, C<\S>, C<\d>, and C<\D> within character classes (though not as
+either end of a range).
Perl defines the following zero-width assertions:
@@ -166,7 +174,10 @@ represents backspace rather than a word boundary.) The C<\A> and C<\Z> are
just like "^" and "$" except that they won't match multiple times when the
C</m> modifier is used, while "^" and "$" will match at every internal line
boundary. To match the actual end of the string, not ignoring newline,
-you can use C<\Z(?!\n)>.
+you can use C<\Z(?!\n)>. The C<\G> assertion can be used to mix global
+matches (using C<m//g>) and non-global ones, as described in L<perlop>.
+The actual location where C<\G> will match can also be influenced
+by using C<pos()> as an lvalue. See L<perlfunc/pos>.
When the bracketing construct C<( ... )> is used, \E<lt>digitE<gt> matches the
digit'th substring. Outside of the pattern, always use "$" instead of "\"
diff --git a/pod/perlref.pod b/pod/perlref.pod
index bbbe57feba..7b522eee4d 100644
--- a/pod/perlref.pod
+++ b/pod/perlref.pod
@@ -236,8 +236,8 @@ open the filehandle for you, because *HANDLE{IO} will be undef if HANDLE
hasn't been used yet. Use \*HANDLE for that sort of thing instead.
Using \*HANDLE (or *HANDLE) is another way to use and store non-bareword
-filehandles (before 5.002 it was the only way). The two methods are
-largely interchangeable, you can do
+filehandles (before perl version 5.002 it was the only way). The two
+methods are largely interchangeable, you can do
splutter(\*STDOUT);
$rec = get_rec(\*STDIN);
@@ -431,8 +431,8 @@ variables, which are all "global" to the package.
=head2 Not-so-symbolic references
-A new feature contributing to readability in 5.001 is that the brackets
-around a symbolic reference behave more like quotes, just as they
+A new feature contributing to readability in perl version 5.001 is that the
+brackets around a symbolic reference behave more like quotes, just as they
always have within a string. That is,
$push = "pop on ";
@@ -449,7 +449,7 @@ and even
print ${ push } . "over";
will have the same effect. (This would have been a syntax error in
-5.000, though Perl 4 allowed it in the spaceless form.) Note that this
+Perl 5.000, though Perl 4 allowed it in the spaceless form.) Note that this
construct is I<not> considered to be a symbolic reference when you're
using strict refs:
diff --git a/pod/perlsec.pod b/pod/perlsec.pod
index 2b6972701f..2324b8a373 100644
--- a/pod/perlsec.pod
+++ b/pod/perlsec.pod
@@ -30,20 +30,23 @@ program more secure than the corresponding C program.
You may not use data derived from outside your program to affect something
else outside your program--at least, not by accident. All command-line
-arguments, environment variables, and file input are marked as "tainted".
-Tainted data may not be used directly or indirectly in any command that
-invokes a sub-shell, nor in any command that modifies files, directories,
-or processes. Any variable set within an expression that has previously
-referenced a tainted value itself becomes tainted, even if it is logically
-impossible for the tainted value to influence the variable. Because
-taintedness is associated with each scalar value, some elements of an
-array can be tainted and others not.
+arguments, environment variables, locale information (see L<perllocale>),
+and file input are marked as "tainted". Tainted data may not be used
+directly or indirectly in any command that invokes a sub-shell, nor in any
+command that modifies files, directories, or processes. Any variable set
+within an expression that has previously referenced a tainted value itself
+becomes tainted, even if it is logically impossible for the tainted value
+to influence the variable. Because taintedness is associated with each
+scalar value, some elements of an array can be tainted and others not.
For example:
$arg = shift; # $arg is tainted
$hid = $arg, 'bar'; # $hid is also tainted
$line = <>; # Tainted
+ $line = <STDIN>; # Also tainted
+ open FOO, "/home/me/bar" or die $!;
+ $line = <FOO>; # Still tainted
$path = $ENV{'PATH'}; # Tainted, but see below
$data = 'abc'; # Not tainted
@@ -107,10 +110,10 @@ mechanism is by referencing sub-patterns from a regular expression match.
Perl presumes that if you reference a substring using $1, $2, etc., that
you knew what you were doing when you wrote the pattern. That means using
a bit of thought--don't just blindly untaint anything, or you defeat the
-entire mechanism. It's better to verify that the variable has only
-good characters (for certain values of "good") rather than checking
-whether it has any bad characters. That's because it's far too easy to
-miss bad characters that you never thought of.
+entire mechanism. It's better to verify that the variable has only good
+characters (for certain values of "good") rather than checking whether it
+has any bad characters. That's because it's far too easy to miss bad
+characters that you never thought of.
Here's a test to make sure that the data contains nothing but "word"
characters (alphabetics, numerics, and underscores), a hyphen, an at sign,
@@ -131,6 +134,14 @@ Laundering data using regular expression is the I<ONLY> mechanism for
untainting dirty data, unless you use the strategy detailed below to fork
a child of lesser privilege.
+The example does not untaint $data if C<use locale> is in effect,
+because the characters matched by C<\w> are determined by the locale.
+Perl considers that locale definitions are untrustworthy because they
+contain data from outside the program. If you are writing a
+locale-aware program, and want to launder data with a regular expression
+containing C<\w>, put C<no locale> ahead of the expression in the same
+block. See L<perllocale/SECURITY> for further discussion and examples.
+
=head2 Cleaning Up Your Path
For "Insecure C<$ENV{PATH}>" messages, you need to set C<$ENV{'PATH'}> to a
diff --git a/pod/perlsub.pod b/pod/perlsub.pod
index 6bd3fe8d84..c83f2da336 100644
--- a/pod/perlsub.pod
+++ b/pod/perlsub.pod
@@ -754,6 +754,49 @@ starts scribbling on your @_ parameter list.
This is all very powerful, of course, and should be used only in moderation
to make the world a better place.
+=head2 Constant Functions
+
+Functions with a prototype of C<()> are potential candidates for
+inlining. If the result after optimization and constant folding is a
+constant then it will be used in place of new-style calls to the
+function. Old-style calls (that is, calls made using C<&>) are not
+affected.
+
+All of the following functions would be inlined.
+
+ sub PI () { 3.14159 }
+ sub ST_DEV () { 0 }
+ sub ST_INO () { 1 }
+
+ sub FLAG_FOO () { 1 << 8 }
+ sub FLAG_BAR () { 1 << 9 }
+ sub FLAG_MASK () { FLAG_FOO | FLAG_BAR }
+
+ sub OPT_BAZ () { 1 }
+ sub BAZ_VAL () {
+ if (OPT_BAZ) {
+ return 23;
+ }
+ else {
+ return 42;
+ }
+ }
+
+If you redefine a subroutine which was eligible for inlining you'll get
+a mandatory warning. (You can use this warning to tell whether or not a
+particular subroutine is considered constant.) The warning is
+considered severe enough not to be optional because previously compiled
+invocations of the function will still be using the old value of the
+function. If you need to be able to redefine the subroutine you need to
+ensure that it isn't inlined, either by dropping the C<()> prototype
+(which changes the calling semantics, so beware) or by thwarting the
+inlining mechanism in some other way, such as
+
+ my $dummy;
+ sub not_inlined () {
+ $dummy || 23
+ }
+
=head2 Overriding Builtin Functions
Many builtin functions may be overridden, though this should be tried
diff --git a/pod/perlsyn.pod b/pod/perlsyn.pod
index 9cf39a3d5a..91a601aebb 100644
--- a/pod/perlsyn.pod
+++ b/pod/perlsyn.pod
@@ -220,11 +220,8 @@ If the word C<while> is replaced by the word C<until>, the sense of the
test is reversed, but the conditional is still tested before the first
iteration.
-In either the C<if> or the C<while> statement, you may replace "(EXPR)"
-with a BLOCK, and the conditional is true if the value of the last
-statement in that block is true. While this "feature" continues to work in
-version 5, it has been deprecated, so please change any occurrences of "if BLOCK" to
-"if (do BLOCK)".
+The form C<while/if BLOCK BLOCK>, available in Perl 4, is no longer
+available. Replace any occurrence of C<if BLOCK> by C<if (do BLOCK)>.
=head2 For Loops
diff --git a/pod/perltoc.pod b/pod/perltoc.pod
index 2821fa363a..b8353fcdb1 100644
--- a/pod/perltoc.pod
+++ b/pod/perltoc.pod
@@ -11,215 +11,228 @@ through to locate the proper section you're looking for.
=head1 BASIC DOCUMENTATION
-
-
-
=head2 perl - Practical Extraction and Report Language
=item SYNOPSIS
-
=item DESCRIPTION
-
Many usability enhancements, Simplified grammar, Lexical scoping,
Arbitrarily nested data structures, Modularity and reusability,
-Object-oriented programming, Embeddable and Extensible, POSIX
-compliant, Package constructors and destructors, Multiple simultaneous
-DBM implementations, Subroutine definitions may now be autoloaded,
-Regular expression enhancements
+Object-oriented programming, Embeddable and Extensible, POSIX compliant,
+Package constructors and destructors, Multiple simultaneous DBM
+implementations, Subroutine definitions may now be autoloaded, Regular
+expression enhancements, Innumerable Unbundled Modules, Compilability
=item ENVIRONMENT
-
-HOME, LOGDIR, PATH, PERL5LIB, PERL5DB, PERLLIB
+HOME, LOGDIR, PATH, PERL5LIB, PERL5DB, PERL_DESTRUCT_LEVEL, PERLLIB
=item AUTHOR
-
=item FILES
-
=item SEE ALSO
-
=item DIAGNOSTICS
-
=item BUGS
-
=item NOTES
+=head2 perlnews - what's new for perl5.004
+=item DESCRIPTION
+=item Supported Environments
+=item Core Changes
-=head2 perldata - Perl data types
+=over
-=item DESCRIPTION
+=item Compilation Option: Binary Compatibility With 5.003
+=item New Opcode Module and Revised Safe Module
-=over
+=item Internal Change: FileHandle Deprecated
-=item Variable names
+=item Internal Change: PerlIO internal IO abstraction interface
+=item New and Changed Built-in Variables
-=item Context
+$^E, $^H, $^M
+=item New and Changed Built-in Functions
-=item Scalar values
+delete on slices, flock, keys as an lvalue, my() in Control Structures,
+unpack() and pack(), use VERSION, use Module VERSION LIST,
+prototype(FUNCTION), $_ as Default
+=item C<m//g> does not trigger a pos() reset on failure
-=item Scalar value constructors
+=item New Built-in Methods
+isa(CLASS), can(METHOD), VERSION( [NEED] ), class(), is_instance()
-=item List value constructors
+=item TIEHANDLE Now Supported
+
+TIEHANDLE classname, LIST, PRINT this, LIST, READLINE this, DESTROY this
+
+=back
+
+=item Pragmata
+use blib, use locale, use ops
-=item Typeglobs and FileHandles
+=item Modules
+=over
+
+=item Module Information Summary
+=item IO
+=item Math::Complex
+
+=item Overridden Built-ins
=back
+=item Efficiency Enhancements
+=item Documentation Changes
+L<perlnews>, L<perllocale>, L<perltoot>, L<perlapio>, L<perldebug>,
+L<perlsec>
-=head2 perlsyn - Perl syntax
+=item New Diagnostics
-=item DESCRIPTION
+"my" variable %s masks earlier declaration in same scope, Allocation too
+large: %lx, Allocation too large, Attempt to free non-existent shared
+string, Attempt to use reference as lvalue in substr, Unsupported function
+fork, Ill-formed logical name |%s| in prime_env_iter, Integer overflow in
+hex number, Integer overflow in octal number, Null picture in formline,
+Offset outside string, Out of memory!, Out of memory during request for %s,
+Possible attempt to put comments in qw() list, Possible attempt to separate
+words with commas, untie attempted while %d inner references still exist,
+Got an error from DosAllocMem:, Malformed PERLLIB_PREFIX, PERL_SH_DIR too
+long, Process terminated by SIG%s
+=item BUGS
-=over
+=item SEE ALSO
-=item Declarations
+=item HISTORY
+=head2 perldata - Perl data types
-=item Simple statements
+=item DESCRIPTION
+=over
-=item Compound statements
+=item Variable names
+=item Context
-=item Loop Control
+=item Scalar values
+=item Scalar value constructors
-=item For Loops
+=item List value constructors
+=item Typeglobs and Filehandles
-=item Foreach Loops
+=back
+=head2 perlsyn - Perl syntax
-=item Basic BLOCKs and Switch Statements
+=item DESCRIPTION
+=over
-=item Goto
+=item Declarations
+=item Simple statements
-=item PODs: Embedded Documentation
+=item Compound statements
+=item Loop Control
+=item For Loops
+=item Foreach Loops
-=back
+=item Basic BLOCKs and Switch Statements
+=item Goto
+=item PODs: Embedded Documentation
+=back
=head2 perlop - Perl operators and precedence
=item SYNOPSIS
-
=item DESCRIPTION
-
=over
=item Terms and List Operators (Leftward)
-
=item The Arrow Operator
-
=item Auto-increment and Auto-decrement
-
=item Exponentiation
-
=item Symbolic Unary Operators
-
=item Binding Operators
-
=item Multiplicative Operators
-
=item Additive Operators
-
=item Shift Operators
-
=item Named Unary Operators
-
=item Relational Operators
-
=item Equality Operators
-
=item Bitwise And
-
=item Bitwise Or and Exclusive Or
-
=item C-style Logical And
-
=item C-style Logical Or
-
=item Range Operator
-
=item Conditional Operator
-
=item Assignment Operators
-
=item Comma Operator
-
=item List Operators (Rightward)
-
=item Logical Not
-
=item Logical And
-
=item Logical or and Exclusive Or
-
=item C Operators Missing From Perl
-
unary &, unary *, (TYPE)
=item Quote and Quote-like Operators
-
-=item Regexp Quote-like Operators
-
+=item Regexp Quote-Like Operators
?PATTERN?, m/PATTERN/gimosx, /PATTERN/gimosx, q/STRING/, C<'STRING'>,
qq/STRING/, "STRING", qx/STRING/, `STRING`, qw/STRING/,
@@ -228,2937 +241,3255 @@ y/SEARCHLIST/REPLACEMENTLIST/cds
=item I/O Operators
-
=item Constant Folding
-
=item Integer Arithmetic
-
-
-
=back
-
-
-
=head2 perlre - Perl regular expressions
=item DESCRIPTION
-
i, m, s, x
=over
=item Regular Expressions
-
(?#text), (?:regexp), (?=regexp), (?!regexp), (?imsx)
=item Backtracking
-
=item Version 8 Regular Expressions
-
=item WARNING on \1 vs $1
-
-
-
=back
-
-
-
=head2 perlrun - how to execute the Perl interpreter
=item SYNOPSIS
-
=item DESCRIPTION
-
=over
=item Switches
-
-B<-0>I<digits>, B<-a>, B<-c>, B<-d>, B<-d:foo>, B<-D>I<number>,
-B<-D>I<list>, B<-e> I<commandline>, B<-F>I<regexp>, B<-i>I<extension>,
-B<-I>I<directory>, B<-l>I<octnum>, B<-m>I<module>, B<-M>I<module>,
-B<-n>, B<-p>, B<-P>, B<-s>, B<-S>, B<-T>, B<-u>, B<-U>, B<-v>, B<-V>,
-B<-V:name>, B<-w>, B<-x> I<directory>
-
-
+B<-0>[I<digits>], B<-a>, B<-c>, B<-d>, B<-d:>I<foo>, B<-D>I<number>,
+B<-D>I<list>, B<-e> I<commandline>, B<-F>I<pattern>, B<-h>,
+B<-i>[I<extension>], B<-I>I<directory>, B<-l>[I<octnum>],
+B<-m>[B<->]I<module>, B<-M>[B<->]I<module>, B<-M>[B<->]I<'module ...'>,
+B<-[mM]>[B<->]I<module=arg[,arg]...>, B<-n>, B<-p>, B<-P>, B<-s>, B<-S>,
+B<-T>, B<-u>, B<-U>, B<-v>, B<-V>, B<-V:>I<name>, B<-w>, B<-x> I<directory>
=back
-
-
-
=head2 perlfunc - Perl builtin functions
=item DESCRIPTION
-
-
+ I<THERE IS NO GENERAL RULE FOR CONVERTING A LIST INTO A SCALAR!>
=over
=item Perl Functions by Category
-
-Functions for SCALARs or strings, Regular expressions and pattern
-matching, Numeric functions, Functions for real @ARRAYs, Functions for
-list data, Functions for real %HASHes, Input and output functions,
-Functions for fixed length data or records, Functions for filehandles,
-files, or directories, Keywords related to the control flow of your
-perl program, Keywords related to scoping, Miscellaneous functions,
-Functions for processes and process groups, Keywords related to perl
-modules, Keywords related to classes and object-orientedness, Low-level
-socket functions, System V interprocess communication functions,
-Fetching user and group info, Fetching network info, Time-related
-functions
+Functions for SCALARs or strings, Regular expressions and pattern matching,
+Numeric functions, Functions for real @ARRAYs, Functions for list data,
+Functions for real %HASHes, Input and output functions, Functions for fixed
+length data or records, Functions for filehandles, files, or directories,
+Keywords related to the control flow of your perl program, Keywords related
+to scoping, Miscellaneous functions, Functions for processes and process
+groups, Keywords related to perl modules, Keywords related to classes and
+object-orientedness, Low-level socket functions, System V interprocess
+communication functions, Fetching user and group info, Fetching network
+info, Time-related functions, Functions new in perl5, Functions obsoleted
+in perl5
=item Alphabetical Listing of Perl Functions
-
--I<X> FILEHANDLE, -I<X> EXPR, -I<X>, abs VALUE, accept NEWSOCKET,GENERICSOCKET,
-alarm SECONDS, atan2 Y,X, bind SOCKET,NAME, binmode FILEHANDLE, bless
-REF,CLASSNAME, bless REF, caller EXPR, caller, chdir EXPR, chmod LIST,
-chomp VARIABLE, chomp LIST, chomp, chop VARIABLE, chop LIST, chop,
-chown LIST, chr NUMBER, chroot FILENAME, close FILEHANDLE, closedir
-DIRHANDLE, connect SOCKET,NAME, continue BLOCK, cos EXPR, crypt
-PLAINTEXT,SALT, dbmclose ASSOC_ARRAY, dbmopen ASSOC,DBNAME,MODE,
-defined EXPR, delete EXPR, die LIST, do BLOCK, do SUBROUTINE(LIST), do
-EXPR, dump LABEL, each ASSOC_ARRAY, eof FILEHANDLE, eof (), eof, eval
-EXPR, eval BLOCK, exec LIST, exists EXPR, exit EXPR, exp EXPR, fcntl
-FILEHANDLE,FUNCTION,SCALAR, fileno FILEHANDLE, flock
+-I<X> FILEHANDLE, -I<X> EXPR, -I<X>, abs VALUE, abs, accept
+NEWSOCKET,GENERICSOCKET, alarm SECONDS, alarm, atan2 Y,X, bind SOCKET,NAME,
+binmode FILEHANDLE, bless REF,CLASSNAME, bless REF, caller EXPR, caller,
+chdir EXPR, chmod LIST, chomp VARIABLE, chomp LIST, chomp, chop VARIABLE,
+chop LIST, chop, chown LIST, chr NUMBER, chr, chroot FILENAME, chroot,
+close FILEHANDLE, closedir DIRHANDLE, connect SOCKET,NAME, continue BLOCK,
+cos EXPR, crypt PLAINTEXT,SALT, dbmclose ASSOC_ARRAY, dbmopen
+ASSOC,DBNAME,MODE, defined EXPR, defined, delete EXPR, die LIST, do BLOCK,
+do SUBROUTINE(LIST), do EXPR, dump LABEL, each ASSOC_ARRAY, eof FILEHANDLE,
+eof (), eof, eval EXPR, eval BLOCK, exec LIST, exists EXPR, exit EXPR, exp
+EXPR, exp, fcntl FILEHANDLE,FUNCTION,SCALAR, fileno FILEHANDLE, flock
FILEHANDLE,OPERATION, fork, format, formline PICTURE, LIST, getc
FILEHANDLE, getc, getlogin, getpeername SOCKET, getpgrp PID, getppid,
-getpriority WHICH,WHO, getpwnam NAME, getgrnam NAME, gethostbyname
-NAME, getnetbyname NAME, getprotobyname NAME, getpwuid UID, getgrgid
-GID, getservb
-
-
+getpriority WHICH,WHO, getpwnam NAME, getgrnam NAME, gethostbyname NAME,
+getnetbyname NAME, getprotobyname NAME, getpwuid UID, getgrgid GID,
+getservbyname NAME,PROTO, gethostbyaddr ADDR,ADDRTYPE, getnetbyaddr
+ADDR,ADDRTYPE, getprotobynumber NUMBER, getservbyport PORT,PROTO, getpwent,
+getgrent, gethostent, getnetent, getprotoent, getservent, setpwent,
+setgrent, sethostent STAYOPEN, setnetent STAYOPEN, setprotoent STAYOPEN,
+setservent STAYOPEN, endpwent, endgrent, endhostent, endnetent,
+endprotoent, endservent, getsockname SOCKET, getsockopt
+SOCKET,LEVEL,OPTNAME, glob EXPR, gmtime EXPR, goto LABEL, goto EXPR, goto
+&NAME, grep BLOCK LIST, grep EXPR,LIST, hex EXPR, hex, import, index
+STR,SUBSTR,POSITION, index STR,SUBSTR, int EXPR, int, ioctl
+FILEHANDLE,FUNCTION,SCALAR, join EXPR,LIST, keys ASSOC_ARRAY, kill LIST,
+last LABEL, last, lc EXPR, lc, lcfirst EXPR, lcfirst, length EXPR, length,
+link OLDFILE,NEWFILE, listen SOCKET,QUEUESIZE, local EXPR, localtime EXPR,
+log EXPR, log, lstat FILEHANDLE, lstat EXPR, lstat, m//, map BLOCK LIST,
+map EXPR,LIST, mkdir FILENAME,MODE, msgctl ID,CMD,ARG, msgget KEY,FLAGS,
+msgsnd ID,MSG,FLAGS, msgrcv ID,VAR,SIZE,TYPE,FLAGS, my EXPR, next LABEL,
+next, no Module LIST, oct EXPR, oct, open FILEHANDLE,EXPR, open FILEHANDLE,
+opendir DIRHANDLE,EXPR, ord EXPR, ord, pack TEMPLATE,LIST, package
+NAMESPACE, pipe READHANDLE,WRITEHANDLE, pop ARRAY, pop, pos SCALAR, pos,
+print FILEHANDLE LIST, print LIST, print, printf FILEHANDLE FORMAT, LIST,
+printf FORMAT, LIST, prototype FUNCTION, push ARRAY,LIST, q/STRING/,
+qq/STRING/, qx/STRING/, qw/STRING/, quotemeta EXPR, quotemeta, rand EXPR,
+rand, read FILEHANDLE,SCALAR,LENGTH,OFFSET, read FILEHANDLE,SCALAR,LENGTH,
+readdir DIRHANDLE, readlink EXPR, readlink, recv SOCKET,SCALAR,LEN,FLAGS,
+redo LABEL, redo, ref EXPR, ref, rename OLDNAME,NEWNAME, require EXPR,
+require, reset EXPR, reset, return LIST, reverse LIST, rewinddir DIRHANDLE,
+rindex STR,SUBSTR,POSITION, rindex STR,SUBSTR, rmdir FILENAME, rmdir, s///,
+scalar EXPR, seek FILEHANDLE,POSITION,WHENCE, seekdir DIRHANDLE,POS, select
+FILEHANDLE, select, select RBITS,WBITS,EBITS,TIMEOUT, semctl
+ID,SEMNUM,CMD,ARG, semget KEY,NSEMS,FLAGS, semop KEY,OPSTRING, send
+SOCKET,MSG,FLAGS,TO, send SOCKET,MSG,FLAGS, setpgrp PID,PGRP, setpriority
+WHICH,WHO,PRIORITY, setsockopt SOCKET,LEVEL,OPTNAME,OPTVAL, shift ARRAY,
+shift, shmctl ID,CMD,ARG, shmget KEY,SIZE,FLAGS, shmread ID,VAR,POS,SIZE,
+shmwrite ID,STRING,POS,SIZE, shutdown SOCKET,HOW, sin EXPR, sin, sleep
+EXPR, sleep, socket SOCKET,DOMAIN,TYPE,PROTOCOL, socketpair
+SOCKET1,SOCKET2,DOMAIN,TYPE,PROTOCOL, sort SUBNAME LIST, sort BLOCK LIST,
+sort LIST, splice ARRAY,OFFSET,LENGTH,LIST, splice ARRAY,OFFSET,LENGTH,
+splice ARRAY,OFFSET, split /PATTERN/,EXPR,LIMIT, split /PATTERN/,EXPR,
+split /PATTERN/, split, sprintf FORMAT, LIST, sqrt EXPR, sqrt, srand EXPR,
+stat EXPR, stat, study SCALAR, study, sub BLOCK, sub NAME, sub NAME BLOCK,
+substr EXPR,OFFSET,LEN, substr EXPR,OFFSET, symlink OLDFILE,NEWFILE,
+syscall LIST, sysopen FILEHANDLE,FILENAME,MODE, sysopen
+FILEHANDLE,FILENAME,MODE,PERMS, sysread FILEHANDLE,SCALAR,LENGTH,OFFSET,
+sysread FILEHANDLE,SCALAR,LENGTH, system LIST, syswrite
+FILEHANDLE,SCALAR,LENGTH, tell FILEHANDLE, tell, telldir DIRHANDLE, tie
+VARIABLE,CLASSNAME,LIST, tied VARIABLE, time, times, tr///, truncate
+FILEHANDLE,LENGTH, truncate EXPR,LENGTH, uc EXPR, uc, ucfirst EXPR,
+ucfirst, umask EXPR, umask, undef EXPR, undef, unlink LIST, unlink, unpack
+TEMPLATE,EXPR, untie VARIABLE, unshift ARRAY,LIST, use Module LIST, use
+Module, use Module VERSION LIST, use VERSION, utime LIST, values
+ASSOC_ARRAY, vec EXPR,OFFSET,BITS, wait, waitpid PID,FLAGS, wantarray, warn
+LIST, write FILEHANDLE, write EXPR, write, y///
=back
-
-
-
=head2 perlvar - Perl predefined variables
=item DESCRIPTION
-
=over
=item Predefined Names
-
-$ARG, $_, $<I<digit>>, $MATCH, $&, $PREMATCH, $`, $POSTMATCH, $',
-$LAST_PAREN_MATCH, $+, $MULTILINE_MATCHING, $*, input_line_number
-HANDLE EXPR, $INPUT_LINE_NUMBER, $NR, $, input_record_separator HANDLE
-EXPR, $INPUT_RECORD_SEPARATOR, $RS, $/, autoflush HANDLE EXPR,
-$OUTPUT_AUTOFLUSH, $|, output_field_separator HANDLE EXPR,
-$OUTPUT_FIELD_SEPARATOR, $OFS, $,, output_record_separator HANDLE EXPR,
-$OUTPUT_RECORD_SEPARATOR, $ORS, $\, $LIST_SEPARATOR, $",
-$SUBSCRIPT_SEPARATOR, $SUBSEP, $;, $OFMT, $#, format_page_number HANDLE
-EXPR, $FORMAT_PAGE_NUMBER, $%, format_lines_per_page HANDLE EXPR,
-$FORMAT_LINES_PER_PAGE, $=, format_lines_left HANDLE EXPR,
-$FORMAT_LINES_LEFT, $-, format_name HANDLE EXPR, $FORMAT_NAME, $~,
-format_top_name HANDLE EXPR, $FORMAT_TOP_NAME, $^,
-format_line_break_characters HANDLE EXPR,
-$FORMAT_LINE_BREAK_CHARACTERS, $:, format_formfeed HANDLE EXPR,
-$FORMAT_FORMFEED, $^L, $ACCUMULATOR, $^A, $CHILD_ERROR, $?, $OS_ERROR,
-$ERRNO, $!, $EVAL_ERROR, $@, $PROCESS_ID, $PID, $$, $REAL_USER_ID,
-$UID, $<,
-
-
+$ARG, $_, $E<lt>I<digit>E<gt>, $MATCH, $&, $PREMATCH, $`, $POSTMATCH, $',
+$LAST_PAREN_MATCH, $+, $MULTILINE_MATCHING, $*, input_line_number HANDLE
+EXPR, $INPUT_LINE_NUMBER, $NR, $, input_record_separator HANDLE EXPR,
+$INPUT_RECORD_SEPARATOR, $RS, $/, autoflush HANDLE EXPR, $OUTPUT_AUTOFLUSH,
+$|, output_field_separator HANDLE EXPR, $OUTPUT_FIELD_SEPARATOR, $OFS, $,,
+output_record_separator HANDLE EXPR, $OUTPUT_RECORD_SEPARATOR, $ORS, $\,
+$LIST_SEPARATOR, $", $SUBSCRIPT_SEPARATOR, $SUBSEP, $;, $OFMT, $#,
+format_page_number HANDLE EXPR, $FORMAT_PAGE_NUMBER, $%,
+format_lines_per_page HANDLE EXPR, $FORMAT_LINES_PER_PAGE, $=,
+format_lines_left HANDLE EXPR, $FORMAT_LINES_LEFT, $-, format_name HANDLE
+EXPR, $FORMAT_NAME, $~, format_top_name HANDLE EXPR, $FORMAT_TOP_NAME, $^,
+format_line_break_characters HANDLE EXPR, $FORMAT_LINE_BREAK_CHARACTERS,
+$:, format_formfeed HANDLE EXPR, $FORMAT_FORMFEED, $^L, $ACCUMULATOR, $^A,
+$CHILD_ERROR, $?, $OS_ERROR, $ERRNO, $!, $EXTENDED_OS_ERROR, $^E,
+$EVAL_ERROR, $@, $PROCESS_ID, $PID, $$, $REAL_USER_ID, $UID, $<,
+$EFFECTIVE_USER_ID, $EUID, $>, $REAL_GROUP_ID, $GID, $(,
+$EFFECTIVE_GROUP_ID, $EGID, $), $PROGRAM_NAME, $0, $[, $PERL_VERSION, $],
+$DEBUGGING, $^D, $SYSTEM_FD_MAX, $^F, $^H, $INPLACE_EDIT, $^I, $OSNAME,
+$^O, $PERLDB, $^P, $BASETIME, $^T, $WARNING, $^W, $EXECUTABLE_NAME, $^X,
+$ARGV, @ARGV, @INC, %INC, $ENV{expr}, $SIG{expr}
=back
-
-
-
=head2 perlsub - Perl subroutines
=item SYNOPSIS
-
=item DESCRIPTION
-
=over
=item Private Variables via my()
-
=item Temporary Values via local()
-
=item Passing Symbol Table Entries (typeglobs)
-
=item Pass by Reference
-
=item Prototypes
+=item Constant Functions
=item Overriding Builtin Functions
-
=item Autoloading
-
-
-
=back
=item SEE ALSO
-
-
-
-
=head2 perlmod - Perl modules (packages)
=item DESCRIPTION
-
=over
=item Packages
-
=item Symbol Tables
-
=item Package Constructors and Destructors
-
=item Perl Classes
-
=item Perl Modules
-
-
-
=back
=item NOTE
-
=item THE PERL MODULE LIBRARY
-
=over
=item Pragmatic Modules
-
-diagnostics, integer, less, overload, sigtrap, strict, subs
+blib, diagnostics, integer, less, lib, locale, ops, overload, sigtrap,
+strict, subs, vars
=item Standard Modules
-
-AnyDBM_File, AutoLoader, AutoSplit, Benchmark, Carp, Config, Cwd,
-DB_File, Devel::SelfStubber, DynaLoader, English, Env, Exporter,
-ExtUtils::Liblist, ExtUtils::MakeMaker, ExtUtils::Manifest,
-ExtUtils::Mkbootstrap, ExtUtils::Miniperl, Fcntl, File::Basename,
-File::CheckTree, File::Find, FileHandle, File::Path, Getopt::Long,
-Getopt::Std, I18N::Collate, IPC::Open2, IPC::Open3, Net::Ping, POSIX,
-SelfLoader, Safe, Socket, Test::Harness, Text::Abbrev
+AnyDBM_File, AutoLoader, AutoSplit, Benchmark, CPAN, CPAN::FirstTime,
+CPAN::Nox, Carp, Class::Template, Config, Cwd, DB_File, Devel::SelfStubber,
+DirHandle, DynaLoader, English, Env, Exporter, ExtUtils::Embed,
+ExtUtils::Install, ExtUtils::Liblist, ExtUtils::MM_OS2, ExtUtils::MM_Unix,
+ExtUtils::MM_VMS, ExtUtils::MakeMaker, ExtUtils::Manifest,
+ExtUtils::Mkbootstrap, ExtUtils::Mksymlists, ExtUtils::testlib, Fatal,
+Fcntl, File::Basename, File::CheckTree, File::Compare, File::Copy,
+File::Find, File::Path, File::stat, FileCache, FileHandle, FindBin,
+GDBM_File, Getopt::Long, Getopt::Std, I18N::Collate, IO, IO::File,
+IO::Handle, IO::Pipe, IO::Seekable, IO::Select, IO::Socket, IPC::Open2,
+IPC::Open3, Math::BigFloat, Math::BigInt, Math::Complex, NDBM_File,
+Net::Ping, Net::hostent, Net::netent, Net::protoent, Net::servent, Opcode,
+Pod::Text, POSIX, SDBM_File, Safe, Search::Dict, SelectSaver, SelfLoader,
+Shell, Socket, Symbol, Sys::Hostname, Sys::Syslog, Term::Cap,
+Term::Complete, Term::ReadLine, Test::Harness, Text::Abbrev,
+Text::ParseWords, Text::Soundex, Text::Tabs, Text::Wrap, Tie::Hash,
+Tie::RefHash, Tie::Scalar, Tie::SubstrHash, Time::Local, Time::gmtime,
+Time::localtime, Time::tm, UNIVERSAL, User::grent, User::pwent
=item Extension Modules
+=back
+
+=item CPAN
+
+Language Extensions and Documentation Tools, Development Support, Operating
+System Interfaces, Networking, Device Control (modems) and InterProcess
+Communication, Data Types and Data Type Utilities, Database Interfaces,
+User Interfaces, Interfaces to / Emulations of Other Programming Languages,
+File Names, File Systems and File Locking (see also File Handles), String
+Processing, Language Text Processing, Parsing, and Searching, Option,
+Argument, Parameter, and Configuration File Processing,
+Internationalization and Locale, Authentication, Security, and Encryption,
+World Wide Web, HTML, HTTP, CGI, MIME, Server and Daemon Utilities,
+Archiving and Compression, Images, Pixmap and Bitmap Manipulation, Drawing,
+and Graphing, Mail and Usenet News, Control Flow Utilities (callbacks and
+exceptions etc), File Handle and Input/Output Stream Utilities,
+Miscellaneous Modules
+
+=item Modules: Creation, Use, and Abuse
+=over
+
+=item Guidelines for Module Creation
+Do similar modules already exist in some form?, Try to design the new
+module to be easy to extend and reuse, Some simple style guidelines, Select
+what to export, Select a name for the module, Have you got it right?,
+README and other Additional Files, A description of the
+module/package/extension etc, A copyright notice - see below, Prerequisites
+- what else you may need to have, How to build it - possible changes to
+Makefile.PL etc, How to install it, Recent changes in this release,
+especially incompatibilities, Changes / enhancements you plan to make in
+the future, Adding a Copyright Notice, Give the module a
+version/issue/release number, How to release and distribute a module, Take
+care when changing a released module
+
+=item Guidelines for Converting Perl 4 Library Scripts into Modules
+
+There is no requirement to convert anything, Consider the implications,
+Make the most of the opportunity, The pl2pm utility will get you started,
+Adds the standard Module prologue lines, Converts package specifiers from '
+to ::, Converts die(...) to croak(...), Several other minor changes
+
+=item Guidelines for Reusing Application Code
+
+Complete applications rarely belong in the Perl Module Library, Many
+applications contain some perl code which could be reused, Break-out the
+reusable code into one or more separate module files, Take the opportunity
+to reconsider and redesign the interfaces, In some cases the 'application'
+can then be reduced to a small
=back
-=item CPAN
+=head2 perlform - Perl formats
+
+=item DESCRIPTION
+=over
-Language Extensions and Documentation Tools, Development Support,
-Operating System Interfaces, Networking, Device Control (modems) and
-InterProcess Communication, Data Types and Data Type Utilities,
-Database Interfaces, User Interfaces, Interfaces to / Emulations of
-Other Programming Languages, File Names, File Systems and File Locking
-(see also File Handles), String Processing, Language Text Processing,
-Parsing and Searching, Option, Argument, Parameter and Configuration
-File Processing, Internationalization and Locale, Authentication,
-Security and Encryption, World Wide Web, HTML, HTTP, CGI, MIME, Server
-and Daemon Utilities, Archiving and Compression, Images, Pixmap and
-Bitmap Manipulation, Drawing and Graphing, Mail and Usenet News,
-Control Flow Utilities (callbacks and exceptions etc), File Handle and
-Input/Output Stream Utilities, Miscellaneous Modules
+=item Format Variables
-=item Modules: Creation, Use and Abuse
+=back
+=item NOTES
=over
-=item Guidelines for Module Creation
+=item Footers
+=item Accessing Formatting Internals
-Do similar modules already exist in some form?, Try to design the new
-module to be easy to extend and reuse, Some simple style guidelines,
-Select what to export, Select a name for the module, Have you got it
-right?, README and other Additional Files, A description of the
-module/package/extension etc, A copyright notice - see below,
-Prerequisites - what else you may need to have, How to build it -
-possible changes to Makefile.PL etc, How to install it, Recent changes
-in this release, especially incompatibilities, Changes / enhancements
-you plan to make in the future, Adding a Copyright Notice, Give the
-module a version/issue/release number, How to release and distribute a
-module, Take care when changing a released module
+=back
-=item Guidelines for Converting Perl 4 Library Scripts into Modules
+=item WARNINGS
+=head2 perllocale - Perl locale handling (internationalization and
+localization)
-There is no requirement to convert anything, Consider the implications,
-Make the most of the opportunity, The pl2pm utility will get you
-started, Adds the standard Module prologue lines, Converts package
-specifiers from ' to ::, Converts die(...) to croak(...), Several other
-minor changes
+=item DESCRIPTION
-=item Guidelines for Reusing Application Code
+=item PREPARING TO USE LOCALES
+=item USING LOCALES
-Complete applications rarely belong in the Perl Module Library, Many
-applications contain some perl code which could be reused, Break-out
-the reusable code into one or more separate module files, Take the
-opportunity to reconsider and redesign the interfaces, In some cases
-the 'application' can then be reduced to a small
+=over
+
+=item The use locale pragma
+=item The setlocale function
+=item The localeconv function
=back
+=item LOCALE CATEGORIES
+=over
+=item Category LC_COLLATE: Collation
-=head2 perlref - Perl references and nested data structures
+=item Category LC_CTYPE: Character Types
-=item DESCRIPTION
+=item Category LC_NUMERIC: Numeric Formatting
+
+=item Category LC_MONETARY: Formatting of monetary amounts
+
+=item LC_TIME
+=item Other categories
+
+=back
+
+=item SECURITY
+
+B<Comparison operators> (C<lt>, C<le>, C<ge>, C<gt> and C<cmp>):,
+B<Case-mapping interpolation> (with C<\l>, C<\L>, C<\u> or <\U>),
+B<Matching operator> (C<m//>):, B<Substitution operator> (C<s///>):,
+B<In-memory formatting function> (sprintf()):, B<Output formatting
+functions> (printf() and write()):, B<Case-mapping functions> (lc(),
+lcfirst(), uc(), ucfirst()):, B<POSIX locale-dependent functions>
+(localeconv(), strcoll(),strftime(), strxfrm()):, B<POSIX character class
+tests> (isalnum(), isalpha(), isdigit(),isgraph(), islower(), isprint(),
+ispunct(), isspace(), isupper(),
+isxdigit()):
+
+=item ENVIRONMENT
+
+PERL_BADLANG, LC_ALL, LC_CTYPE, LC_COLLATE, LC_MONETARY, LC_NUMERIC,
+LC_TIME, LANG
+
+=item NOTES
=over
-=item Symbolic references
+=item Backward compatibility
+=item I18N:Collate obsolete
-=item Not-so-symbolic references
+=item Sort speed and memory use impacts
+
+=item write() and LC_NUMERIC
+=item Freely available locale definitions
+=item I18n and l10n
+=item An imperfect standard
=back
-=item WARNING
+=item BUGS
+
+=over
+
+=item Broken systems
+=back
=item SEE ALSO
+=item HISTORY
+=head2 perlref - Perl references and nested data structures
+=item DESCRIPTION
+=over
+
+=item Symbolic references
+
+=item Not-so-symbolic references
+
+=back
+
+=item WARNING
+
+=item SEE ALSO
=head2 perldsc - Perl Data Structures Cookbook
=item DESCRIPTION
-
arrays of arrays, hashes of arrays, arrays of hashes, hashes of hashes,
-more elaborate constructs, recursive and self-referential data
-structures, objects
+more elaborate constructs
=item REFERENCES
-
=item COMMON MISTAKES
-
=item CAVEAT ON PRECEDENCE
-
=item WHY YOU SHOULD ALWAYS C<use strict>
-
=item DEBUGGING
-
=item CODE EXAMPLES
-
=item LISTS OF LISTS
-
=over
=item Declaration of a LIST OF LISTS
-
=item Generation of a LIST OF LISTS
-
=item Access and Printing of a LIST OF LISTS
-
-
-
=back
=item HASHES OF LISTS
-
=over
=item Declaration of a HASH OF LISTS
-
=item Generation of a HASH OF LISTS
-
=item Access and Printing of a HASH OF LISTS
-
-
-
=back
=item LISTS OF HASHES
-
=over
=item Declaration of a LIST OF HASHES
-
=item Generation of a LIST OF HASHES
-
=item Access and Printing of a LIST OF HASHES
-
-
-
=back
=item HASHES OF HASHES
-
=over
=item Declaration of a HASH OF HASHES
-
=item Generation of a HASH OF HASHES
-
=item Access and Printing of a HASH OF HASHES
-
-
-
=back
=item MORE ELABORATE RECORDS
-
=over
=item Declaration of MORE ELABORATE RECORDS
-
=item Declaration of a HASH OF COMPLEX RECORDS
-
=item Generation of a HASH OF COMPLEX RECORDS
+=back
+=item Database Ties
+=item SEE ALSO
-=back
+=item AUTHOR
-=item Database Ties
+=head2 perllol, perlLoL - Manipulating Lists of Lists in Perl
+
+=item DESCRIPTION
+=item Declaration and Access of Lists of Lists
-=item SEE ALSO
+=item Growing Your Own
+
+=item Access and Printing
+=item Slices
+
+=item SEE ALSO
=item AUTHOR
+=head2 perltoot - Tom's object-oriented tutorial for perl
+=item DESCRIPTION
+=item Creating a Class
+=over
-=head2 perllol, perlLoL - Manipulating Lists of Lists in Perl
+=item Object Representation
-=item DESCRIPTION
+=item Class Interface
+=item Constructors and Instance Methods
-=item Declaration and Access of Lists of Lists
+=item Planning for the Future: Better Constructors
+=item Destructors
-=item Growing Your Own
+=item Other Object Methods
+=back
-=item Access and Printing
+=item Class Data
+=over
-=item Slices
+=item Accessing Class Data
+=item Debugging Methods
-=item SEE ALSO
+=item Class Destructors
+=item Documenting the Interface
-=item AUTHOR
+=back
+=item Aggregation
+=item Inheritance
+=over
+=item Overridden Methods
-=head2 perlobj - Perl objects
+=item Multiple Inheritance
-=item DESCRIPTION
+=item UNIVERSAL: The Root of All Objects
+
+=back
+=item Alternate Object Representations
=over
-=item An Object is Simply a Reference
+=item Arrays as Objects
+=item Closures as Objects
-=item A Class is Simply a Package
+=back
+=item AUTOLOAD: Proxy Methods
-=item A Method is Simply a Subroutine
+=over
+=item Autoloaded Data Methods
-=item Method Invocation
+=item Inherited Autoloaded Data Methods
+=back
-=item Default UNIVERSAL methods
+=item Metaclassical Tools
-isa(CLASS), can(METHOD), VERSION([VERSION]), class(), is_instance()
+=over
+=item Class::Template
-=item Destructors
+=item Data Members as Variables
+=item NOTES
-=item WARNING
+=item Object Terminology
+=back
-=item Summary
+=item SEE ALSO
+=item COPYRIGHT
-=item Two-Phased Garbage Collection
+=over
+=item Acknowledgments
+=back
+=head2 perlobj - Perl objects
-=back
+=item DESCRIPTION
-=item SEE ALSO
+=over
+
+=item An Object is Simply a Reference
+
+=item A Class is Simply a Package
+=item A Method is Simply a Subroutine
+
+=item Method Invocation
+
+=item Default UNIVERSAL methods
+
+isa(CLASS), can(METHOD), VERSION( [NEED] ), class(), is_instance()
+=item Destructors
+
+=item WARNING
+
+=item Summary
+
+=item Two-Phased Garbage Collection
+=back
+=item SEE ALSO
=head2 perltie - how to hide an object class in a simple variable
=item SYNOPSIS
-
=item DESCRIPTION
-
=over
=item Tying Scalars
-
TIESCALAR classname, LIST, FETCH this, STORE this, value, DESTROY this
=item Tying Arrays
-
TIEARRAY classname, LIST, FETCH this, index, STORE this, index, value,
DESTROY this
=item Tying Hashes
-
-USER, HOME, CLOBBER, LIST, TIEHASH classname, LIST, FETCH this, key,
-STORE this, key, value, DELETE this, key, CLEAR this, EXISTS this, key,
-FIRSTKEY this, NEXTKEY this, lastkey, DESTROY this
+USER, HOME, CLOBBER, LIST, TIEHASH classname, LIST, FETCH this, key, STORE
+this, key, value, DELETE this, key, CLEAR this, EXISTS this, key, FIRSTKEY
+this, NEXTKEY this, lastkey, DESTROY this
=item Tying FileHandles
-
-
+TIEHANDLE classname, LIST, PRINT this, LIST, READLINE this, DESTROY this
=back
=item SEE ALSO
-
=item BUGS
-
=item AUTHOR
-
-
-
-
=head2 perlbot - Bag'o Object Tricks (the BOT)
=item DESCRIPTION
-
=item OO SCALING TIPS
-
=item INSTANCE VARIABLES
-
=item SCALAR INSTANCE VARIABLES
-
=item INSTANCE VARIABLE INHERITANCE
-
=item OBJECT RELATIONSHIPS
-
=item OVERRIDING SUPERCLASS METHODS
-
=item USING RELATIONSHIP WITH SDBM
-
=item THINKING OF CODE REUSE
-
=item CLASS CONTEXT AND THE OBJECT
-
=item INHERITING A CONSTRUCTOR
-
=item DELEGATION
-
-
-
-
-=head2 perldebug - Perl debugging
+=head2 perlipc - Perl interprocess communication (signals, fifos, pipes,
+safe subprocesses, sockets, and semaphores)
=item DESCRIPTION
+=item Signals
-=item The Perl Debugger
+=item Named Pipes
+=item Using open() for IPC
=over
-=item Debugger Commands
+=item Safe Pipe Opens
+=item Bidirectional Communication
-h [command], p expr, x expr, V [pkg [vars]], X [vars], T, s [expr], n,
-E<lt>CRE<gt>, c [line], l, l min+incr, l min-max, l line, l subname,
--, w [line], f filename, /pattern/, ?pattern?, L, S [[!]pattern], t, t
-expr, b [line] [condition], b subname [condition], d [line], D, a
-[line] command, A, O [opt[=val]] [opt"val"] [opt?].., recallCommand,
-ShellBang, pager, arrayDepth, hashDepth, compactDump, veryCompact,
-globPrint, DumpDBFiles, DumpPackages, quote, HighBit, undefPrint,
-tkRunning, signalLevel, warnLevel. dieLevel, E<lt> command, E<gt>
-command, ! number, ! -number, ! pattern, !! cmd, H -number, q or ^D,
-R, |dbcmd, ||dbcmd, = [alias value], command, p expr
+=back
+=item Sockets: Client/Server Communication
-=item Debugger Customization
+=over
+=item Internet TCP Clients and Servers
-=item Readline Support
+=item Unix-Domain TCP Clients and Servers
+=item UDP: Message Passing
-=item Editor Support for Debugging
+=back
+=item SysV IPC
-=item The Perl Profiler
+=item WARNING
+=item NOTES
-=item Debugger Internals
+=item BUGS
-TTY, noTTY, ReadLine, NonStop, LineInfo
+=item AUTHOR
-
-=item Other resources
+=item SEE ALSO
+=head2 perldebug - Perl debugging
+=item DESCRIPTION
+=item The Perl Debugger
-=back
+=over
-=item BUGS
+=item Debugger Commands
+h [command], p expr, x expr, V [pkg [vars]], X [vars], T, s [expr], n,
+E<lt>CRE<gt>, c [line|sub], l, l min+incr, l min-max, l line, l subname, -,
+w [line], f filename, /pattern/, ?pattern?, L, S [[!]pattern], t, t expr, b
+[line] [condition], b subname [condition], b postpone subname [condition],
+b load filename, d [line], D, a [line] command, A, O [opt[=val]] [opt"val"]
+[opt?].., recallCommand, ShellBang, pager, tkRunning, signalLevel,
+warnLevel, dieLevel, AutoTrace, LineInfo, C<inhibit_exit>, C<PrintRet>,
+C<frame>, arrayDepth, hashDepth, compactDump, veryCompact, globPrint,
+DumpDBFiles, DumpPackages, quote, HighBit, undefPrint, C<TTY>, noTTY,
+C<noTTY>, C<ReadLine>, C<NonStop>, E<lt> [ command ], E<lt>E<lt> command,
+E<gt> command, E<gt>E<gt> command, { [ command ], {{ command, ! number, !
+-number, ! pattern, !! cmd, H -number, q or ^D, R, |dbcmd, ||dbcmd, =
+[alias value], command, p expr
+=item Debugger Customization
+=item Readline Support
+=item Editor Support for Debugging
-=head2 perldiag - various Perl diagnostics
+=item The Perl Profiler
-=item DESCRIPTION
+=item Debugger support in perl
+=item Debugger Internals
+=item Other resources
+=back
+=item BUGS
-=head2 perlform - Perl formats
+=head2 perldiag - various Perl diagnostics
=item DESCRIPTION
+=head2 perlsec - Perl security
+
+=item DESCRIPTION
=over
=item Laundering and Detecting Tainted Data
-
=item Cleaning Up Your Path
-
=item Security Bugs
-
=back
-=item NOTES
+=head2 perltrap - Perl traps for the unwary
+=item DESCRIPTION
=over
-=item Footers
-
-
-=item Accessing Formatting Internals
-
-
-
-
-=back
-
-=item WARNING
-
-
+=item Awk Traps
+=item C Traps
+=item Sed Traps
-=head2 perlipc - Perl interprocess communication (signals, fifos,
-pipes, safe subprocesses, sockets, and semaphores)
+=item Shell Traps
-=item DESCRIPTION
+=item Perl Traps
+=item Perl4 to Perl5 Traps
-=item Signals
+Discontinuance, Deprecation, and BugFix traps, Parsing Traps, Numerical
+Traps, General data type traps, Context Traps - scalar, list contexts,
+Precedence Traps, General Regular Expression Traps using s///, etc,
+Subroutine, Signal, Sorting Traps, OS Traps, DBM Traps, Unclassified Traps
+=item Discontinuance, Deprecation, and BugFix traps
-=item Named Pipes
+Discontinuance, Deprecation, BugFix, Discontinuance, Discontinuance,
+Discontinuance, BugFix, Discontinuance, Discontinuance, BugFix,
+Discontinuance, Deprecation, Discontinuance
+=item Parsing Traps
-=item Using open() for IPC
+Parsing, Parsing, Parsing
+=item Numerical Traps
-=over
+Numerical, Numerical, Numerical
-=item Safe Pipe Opens
+=item General data type traps
+(Arrays), (Arrays), (Hashes), (Globs), (Scalar String), (Constants),
+(Scalars), (Variable Suicide)
-=item Bidirectional Communication
+=item Context Traps - scalar, list contexts
+(list context), (scalar context), (scalar context), (list, builtin)
+=item Precedence Traps
+Precedence, Precedence, Precedence, Precedence, Precedence, Precedence,
+Precedence
-=back
+=item General Regular Expression Traps using s///, etc.
-=item Sockets: Client/Server Communication
+Regular Expression, Regular Expression, Regular Expression, Regular
+Expression, Regular Expression, Regular Expression, Regular Expression,
+Regular Expression
+=item Subroutine, Signal, Sorting Traps
-=over
+(Signals), (Sort Subroutine), warn() won't let you specify a filehandle
-=item Internet TCP Clients and Servers
+=item OS Traps
+(SysV), (SysV)
-=item Unix-Domain TCP Clients and Servers
+=item Interpolation Traps
+Interpolation, Interpolation, Interpolation, Interpolation, Interpolation,
+Interpolation, Interpolation, Interpolation, Interpolation
-=item UDP: Message Passing
+=item DBM Traps
+DBM, DBM
+=item Unclassified Traps
+Unclassified
=back
-=item SysV IPC
-
-
-=item WARNING
-
-
-=item NOTES
+=head2 perlstyle - Perl style guide
+=item DESCRIPTION
-=item BUGS
+=head2 perlpod - plain old documentation
+=item DESCRIPTION
-=item AUTHOR
+=item Embedding Pods in Perl Modules
+=item Common Pod Pitfalls
=item SEE ALSO
+=item AUTHOR
-
-
-
-=head2 perlsec - Perl security
+=head2 perlbook - Perl book information
=item DESCRIPTION
-
-
-
-
-=head2 perltrap - Perl traps for the unwary
+=head2 perlembed - how to embed perl in your C program
=item DESCRIPTION
-
=over
-=item Awk Traps
-
-
-=item C Traps
+=item PREAMBLE
+B<Use C from Perl?>, B<Use a UNIX program from Perl?>, B<Use Perl from
+Perl?>, B<Use C from C?>, B<Use Perl from C?>
-=item Sed Traps
+=item ROADMAP
+=item Compiling your C program
-=item Shell Traps
+=item Adding a Perl interpreter to your C program
+=item Calling a Perl subroutine from your C program
-=item Perl Traps
+=item Evaluating a Perl statement from your C program
+=item Performing Perl pattern matches and substitutions from your C program
-=item Perl4 Traps
+=item Fiddling with the Perl stack from your C program
+=item Maintaining a persistent interpreter
+=item Maintaining multiple interpreter instances
+=item Using Perl modules, which themselves use C libraries, from your C
+program
=back
+=item MORAL
+=item AUTHOR
+=head2 perlapio - perl's IO abstraction interface.
-=head2 perlstyle - Perl style guide
+=item SYNOPSIS
=item DESCRIPTION
+B<PerlIO *>, B<PerlIO_stdin()>, B<PerlIO_stdout()>, B<PerlIO_stderr()>,
+B<PerlIO_open(path, mode)>, B<PerlIO_fdopen(fd,mode)>,
+B<PerlIO_printf(f,fmt,...)>, B<PerlIO_vprintf(f,fmt,a)>,
+B<PerlIO_stdoutf(fmt,...)>, B<PerlIO_read(f,buf,count)>,
+B<PerlIO_write(f,buf,count)>, B<PerlIO_close(f)>, B<PerlIO_puts(s,f)>,
+B<PerlIO_putc(c,f)>, B<PerlIO_ungetc(c,f)>, B<PerlIO_getc(f)>,
+B<PerlIO_eof(f)>, B<PerlIO_error(f)>, B<PerlIO_fileno(f)>,
+B<PerlIO_clearerr(f)>, B<PerlIO_flush(f)>, B<PerlIO_tell(f)>,
+B<PerlIO_seek(f,o,w)>, B<PerlIO_getpos(f,p)>, B<PerlIO_setpos(f,p)>,
+B<PerlIO_rewind(f)>, B<PerlIO_tmpfile()>
+=over
+
+=item Co-existence with stdio
+B<PerlIO_importFILE(f,flags)>, B<PerlIO_exportFILE(f,flags)>,
+B<PerlIO_findFILE(f)>, B<PerlIO_releaseFILE(p,f)>, B<PerlIO_setlinebuf(f)>,
+B<PerlIO_has_cntptr(f)>, B<PerlIO_get_ptr(f)>, B<PerlIO_get_cnt(f)>,
+B<PerlIO_canset_cnt(f)>, B<PerlIO_fast_gets(f)>,
+B<PerlIO_set_ptrcnt(f,p,c)>, B<PerlIO_set_cnt(f,c)>, B<PerlIO_has_base(f)>,
+B<PerlIO_get_base(f)>, B<PerlIO_get_bufsiz(f)>
+=back
=head2 perlxs - XS language reference manual
=item DESCRIPTION
-
=over
=item Introduction
-
=item On The Road
-
=item The Anatomy of an XSUB
-
=item The Argument Stack
-
=item The RETVAL Variable
-
=item The MODULE Keyword
-
=item The PACKAGE Keyword
-
=item The PREFIX Keyword
-
=item The OUTPUT: Keyword
-
=item The CODE: Keyword
-
=item The INIT: Keyword
-
=item The NO_INIT Keyword
-
=item Initializing Function Parameters
-
=item Default Parameter Values
-
=item The PREINIT: Keyword
+=item The SCOPE: Keyword
=item The INPUT: Keyword
-
=item Variable-length Parameter Lists
-
=item The PPCODE: Keyword
-
=item Returning Undef And Empty Lists
-
=item The REQUIRE: Keyword
-
=item The CLEANUP: Keyword
-
=item The BOOT: Keyword
-
=item The VERSIONCHECK: Keyword
-
=item The PROTOTYPES: Keyword
-
=item The PROTOTYPE: Keyword
-
=item The ALIAS: Keyword
-
=item The INCLUDE: Keyword
-
=item The CASE: Keyword
-
=item The & Unary Operator
-
=item Inserting Comments and C Preprocessor Directives
-
=item Using XS With C++
-
=item Interface Strategy
-
=item Perl Objects And C Structures
-
=item The Typemap
-
-
-
=back
=item EXAMPLES
-
=item XS VERSION
-
=item AUTHOR
-
-
-
-
-=head2 perlxstut, perlXStut - Tutorial for XSUB's
+=head2 perlxstut, perlXStut - Tutorial for XSUBs
=item DESCRIPTION
-
=over
=item VERSION CAVEAT
-
=item DYNAMIC VERSUS STATIC
-
=item EXAMPLE 1
-
=item EXAMPLE 2
-
=item WHAT HAS GONE ON?
+=item WRITING GOOD TEST SCRIPTS
=item EXAMPLE 3
-
=item WHAT'S NEW HERE?
-
=item INPUT AND OUTPUT PARAMETERS
-
=item THE XSUBPP COMPILER
-
=item THE TYPEMAP FILE
-
=item WARNING
+=item EXAMPLE 4
-=item SPECIFYING ARGUMENTS TO XSUBPP
+=item WHAT HAS HAPPENED HERE?
+=item SPECIFYING ARGUMENTS TO XSUBPP
=item THE ARGUMENT STACK
-
=item EXTENDING YOUR EXTENSION
-
=item DOCUMENTING YOUR EXTENSION
-
=item INSTALLING YOUR EXTENSION
-
=item SEE ALSO
-
=item Author
-
=item Last Changed
-
-
-
=back
-
-
-
=head2 perlguts - Perl's Internal Functions
=item DESCRIPTION
+=over
=item Datatypes
-
-=over
-
=item What is an "IV"?
-
=item Working with SV's
-
=item What's Really Stored in an SV?
-
=item Working with AV's
-
=item Working with HV's
-
=item References
-
=item Blessed References and Class Objects
-
-
-
-=back
-
=item Creating New Variables
+=item Reference Counts and Mortality
-=item XSUB's and the Argument Stack
-
-
-=item Mortality
-
-
-=item Stashes
-
+=item Stashes and Globs
=item Magic
-
-=over
-
=item Assigning Magic
-
=item Magic Virtual Tables
-
=item Finding Magic
-
-
-
-=back
-
=item Double-Typed SV's
+=item XSUB's and the Argument Stack
=item Calling Perl Routines from within C Programs
-
=item Memory Allocation
+=item PerlIO
-=item API LISTING
-
+=item Scratchpads
-AvFILL, av_clear, av_extend, av_fetch, av_len, av_make, av_pop,
-av_push, av_shift, av_store, av_undef, av_unshift, CLASS, Copy, croak,
-CvSTASH, DBsingle, DBsub, dMARK, dORIGMARK, dSP, dXSARGS, ENTER,
-EXTEND, FREETMPS, G_ARRAY, G_DISCARD, G_EVAL, GIMME, G_NOARGS,
-G_SCALAR, gv_stashpv, gv_stashsv, GvSV, he_free, hv_clear, hv_delete,
-hv_exists, hv_fetch, hv_iterinit, hv_iterkey, hv_iternext,
-hv_iternextsv, hv_iterval, hv_magic, HvNAME, hv_store, hv_undef,
-isALNUM, isALPHA, isDIGIT, isLOWER, isSPACE, isUPPER, items, LEAVE,
-MARK, mg_clear, mg_copy, mg_find, mg_free, mg_get, mg_len, mg_magical,
-mg_set, Move, na, New, Newc, Newz, newAV, newHV, newRV, newSV, newSViv,
-newSVnv, newSVpv, newSVrv, newSVsv, newXS, newXSproto, Nullav, Nullch,
-Nullcv, Nullhv, Nullsv, ORIGMARK, perl_alloc, perl_call_argv,
-perl_call_method, perl_call_pv, perl_call_sv, perl_construct,
-perl_destruct, perl_eval_sv, perl_free, perl_get_av, perl_get_cv,
-perl_get_hv, perl_get_sv, perl_parse, perl_require_pv, perl_run, POPi,
-POPl, POPp, POPn, POPs,
+=item Putting a C value on Perl stack
-=item AUTHOR
+=item Scratchpads
+=item Scratchpads and recursions
-=item DATE
+=item API LISTING
+AvFILL, av_clear, av_extend, av_fetch, av_len, av_make, av_pop, av_push,
+av_shift, av_store, av_undef, av_unshift, CLASS, Copy, croak, CvSTASH,
+DBsingle, DBsub, DBtrace, dMARK, dORIGMARK, dowarn, dSP, dXSARGS, dXSI32,
+dXSI32, ENTER, EXTEND, FREETMPS, G_ARRAY, G_DISCARD, G_EVAL, GIMME,
+G_NOARGS, G_SCALAR, gv_fetchmeth, gv_fetchmethod, gv_stashpv, gv_stashsv,
+he_free, he_delayfree, hv_clear, hv_delete, hv_exists, hv_fetch,
+hv_iterinit, hv_iterkey, hv_iternext, hv_iternextsv, hv_iterval, hv_magic,
+HvNAME, hv_store, hv_undef, isALNUM, isALPHA, isDIGIT, isLOWER, isSPACE,
+isUPPER, items, ix, LEAVE, MARK, mg_clear, mg_copy, mg_find, mg_free,
+mg_get, mg_len, mg_magical, mg_set, Move, na, New, Newc, Newz, newAV,
+newHV, newRV_inc, newRV_noinc, newSV, newSViv, newSVnv, newSVpv, newSVrv,
+newSVsv, newXS, newXSproto, Nullav, Nullch, Nullcv, Nullhv, Nullsv,
+ORIGMARK, perl_alloc, perl_call_argv, perl_call_method, perl_call_pv,
+perl_call_sv, perl_construct, perl_destruct, perl_eval_sv, perl_free,
+perl_get_av, perl_get_cv, perl_get_hv, perl_get_sv, perl_parse,
+perl_require_pv, perl_run, POPi, POPl, POPp, POPn, POPs, PUSHMARK, PUSHi,
+PUSHn, PUSHp, PUSHs, PUTBACK, Renew, Renewc, RETVAL, safefree, safemalloc,
+saferealloc, savepv, savepvn, SAVETMPS, SP, SPAGAIN, ST, strEQ, strGE,
+strGT, strLE, strLT, strNE, strnEQ, strnNE, sv_2mortal, sv_bless, sv_catpv,
+sv_catpvn, sv_catsv, sv_cmp, sv_cmp, SvCUR, SvCUR_set, sv_dec, sv_dec,
+SvEND, sv_eq, SvGROW, sv_grow, sv_inc, SvIOK, SvIOK_off, SvIOK_on,
+SvIOK_only, SvIOK_only, SvIOKp, sv_isa, SvIV, sv_isobject, SvIVX, SvLEN,
+sv_len, sv_len, sv_magic, sv_mortalcopy, SvOK, sv_newmortal, sv_no, SvNIOK,
+SvNIOK_off, SvNIOKp, SvNOK, SvNOK_off, SvNOK_on, SvNOK_only, SvNOK_only,
+SvNOKp, SvNV, SvNVX, SvPOK, SvPOK_off, SvPOK_on, SvPOK_only, SvPOK_only,
+SvPOKp, SvPV, SvPVX, SvREFCNT, SvREFCNT_dec, SvREFCNT_inc, SvROK,
+SvROK_off, SvROK_on, SvRV, sv_setiv, sv_setnv, sv_setpv, sv_setpvn,
+sv_setref_iv, sv_setref_nv, sv_setref_pv, sv_setref_pvn, sv_setsv, SvSTASH,
+SVt_IV, SVt_PV, SVt_PVAV, SVt_PVCV, SVt_PVHV, SVt_PVMG, SVt_NV, SvTRUE,
+SvTYPE, svtype, SvUPGRADE, sv_upgrade, sv_undef, sv_unref, sv_usepvn,
+sv_yes, THIS, toLOWER, toUPPER, warn, XPUSHi, XPUSHn, XPUSHp, XPUSHs, XS,
+XSRETURN, XSRETURN_EMPTY, XSRETURN_IV, XSRETURN_NO, XSRETURN_NV,
+XSRETURN_PV, XSRETURN_UNDEF, XSRETURN_YES, XST_mIV, XST_mNV, XST_mNO,
+XST_mPV, XST_mUNDEF, XST_mYES, XS_VERSION, XS_VERSION_BOOTCHECK, Zero
+=back
+=item EDITOR
+=item DATE
=head2 perlcall - Perl calling conventions from C
=item DESCRIPTION
-
An Error Handler, An Event Driven Program
=item THE PERL_CALL FUNCTIONS
-
-B<perl_call_sv>, B<perl_call_pv>, B<perl_call_method>,
-B<perl_call_argv>
+B<perl_call_sv>, B<perl_call_pv>, B<perl_call_method>, B<perl_call_argv>
=item FLAG VALUES
-
=over
=item G_SCALAR
-
=item G_ARRAY
-
=item G_DISCARD
-
=item G_NOARGS
-
-=item G_EVAL
-
+=item G_EVAL
=item G_KEEPERR
-
-=item Determining the Context
-
-
-
+=item Determining the Context
=back
=item KNOWN PROBLEMS
-
=item EXAMPLES
-
=over
=item No Parameters, Nothing returned
-
=item Passing Parameters
-
=item Returning a Scalar
-
=item Returning a list of values
-
=item Returning a list in a scalar context
-
=item Returning Data from Perl via the parameter list
-
=item Using G_EVAL
-
=item Using G_KEEPERR
-
=item Using perl_call_sv
-
=item Using perl_call_argv
-
=item Using perl_call_method
-
=item Using GIMME
-
=item Using Perl to dispose of temporaries
-
=item Strategies for storing Callback Context Information
-
1. Ignore the problem - Allow only 1 callback, 2. Create a sequence of
callbacks - hard wired limit, 3. Use a parameter to map to the Perl
callback
=item Alternate Stack Manipulation
-
-
-
=back
=item SEE ALSO
-
=item AUTHOR
-
=item DATE
+=head1 PRAGMA DOCUMENTATION
+=head2 blib - Use MakeMaker's uninstalled version of a package
+=item SYNOPSIS
+=item DESCRIPTION
-=head2 perlembed - how to embed perl in your C program
+=item BUGS
-=item DESCRIPTION
+=item AUTHOR
+=head2 diagnostics - Perl compiler pragma to force verbose warning
+diagnostics
-=over
+=item SYNOPSIS
-=item PREAMBLE
+=item DESCRIPTION
+=over
-B<Use C from Perl?>, B<Use a UNIX program from Perl?>, B<Use Perl from
-Perl?>, B<Use C from C?>, B<Use Perl from C?>
+=item The C<diagnostics> Pragma
-=item ROADMAP
+=item The I<splain> Program
+=back
-=item Compiling your C program
+=item EXAMPLES
+=item INTERNALS
-=item Adding a Perl interpreter to your C program
+=item BUGS
+=item AUTHOR
-=item Calling a Perl subroutine from your C program
+=head2 integer - Perl pragma to compute arithmetic in integer instead of
+double
+=item SYNOPSIS
-=item Evaluating a Perl statement from your C program
+=item DESCRIPTION
+=head2 less - perl pragma to request less of something from the compiler
-=item Performing Perl pattern matches and substitutions from your C
-program
+=item SYNOPSIS
+=item DESCRIPTION
+=head2 lib - manipulate @INC at compile time
+=item SYNOPSIS
-=back
+=item DESCRIPTION
-=item MORAL
+=over
+=item ADDING DIRECTORIES TO @INC
-=item AUTHOR
+=item DELETING DIRECTORIES FROM @INC
+=item RESTORING ORIGINAL @INC
+=back
+=item SEE ALSO
+=item AUTHOR
-=head2 perlpod - plain old documentation
+=head2 locale - Perl pragma to use and avoid POSIX locales for built-in
+operations
+
+=item SYNOPSIS
=item DESCRIPTION
+=head2 ops - Perl pragma to restrict unsafe operations when compiling
-=item Embedding Pods in Perl Modules
+=item SYNOPSIS
+=item DESCRIPTION
=item SEE ALSO
+=head2 overload - Package for overloading perl operations
-=item AUTHOR
-
+=item SYNOPSIS
+=item CAVEAT SCRIPTOR
+=item DESCRIPTION
+=over
-=head2 perlbook - Perl book information
+=item Declaration of overloaded functions
-=item DESCRIPTION
+=item Calling Conventions for Binary Operations
+FALSE, TRUE, C<undef>
+=item Calling Conventions for Unary Operations
+=item Overloadable Operations
+I<Arithmetic operations>, I<Comparison operations>, I<Bit operations>,
+I<Increment and decrement>, I<Transcendental functions>, I<Boolean, string
+and numeric conversion>, I<Special>
-=head1 PRAGMA DOCUMENTATION
+=back
+=item SPECIAL SYMBOLS FOR C<use overload>
+=over
+=item Last Resort
-=head2 diagnostics - Perl compiler pragma to force verbose warning
-diagnostics
+=item Fallback
-=item SYNOPSIS
+C<undef>, TRUE, defined, but FALSE
+=item Copy Constructor
-=item DESCRIPTION
+B<Example>
+=back
-=over
+=item MAGIC AUTOGENERATION
-=item The C<diagnostics> Pragma
+I<Assignment forms of arithmetic operations>, I<Conversion operations>,
+I<Increment and decrement>, C<abs($a)>, I<Unary minus>, I<Negation>,
+I<Concatenation>, I<Comparison operations>, I<Copy operator>
+=item WARNING
-=item The I<splain> Program
+=item Run-time Overloading
+=item Public functions
+overload::StrVal(arg), overload::Overloaded(arg), overload::Method(obj,op)
+=item IMPLEMENTATION
-=back
+=item AUTHOR
-=item EXAMPLES
+=item DIAGNOSTICS
+=item BUGS
-=item INTERNALS
+=head2 sigtrap - Perl pragma to enable simple signal handling
+=item SYNOPSIS
-=item BUGS
+=item DESCRIPTION
+=item OPTIONS
-=item AUTHOR
+=over
+=item SIGNAL HANDLERS
+B<stack-trace>, B<die>, B<handler> I<your-handler>
+=item SIGNAL LISTS
+B<normal-signals>, B<error-signals>, B<old-interface-signals>
-=head2 integer - Perl pragma to compute arithmetic in integer instead
-of double
+=item OTHER
-=item SYNOPSIS
+B<untrapped>, B<any>, I<signal>, I<number>
+=back
-=item DESCRIPTION
+=item EXAMPLES
+=head2 strict - Perl pragma to restrict unsafe constructs
+=item SYNOPSIS
+=item DESCRIPTION
+C<strict refs>, C<strict vars>, C<strict subs>
-=head2 less - perl pragma to request less of something from the
-compiler
+=head2 subs - Perl pragma to predeclare sub names
=item SYNOPSIS
-
=item DESCRIPTION
+=head2 vars - Perl pragma to predeclare global variable names
+=item SYNOPSIS
+=item DESCRIPTION
+=head1 MODULE DOCUMENTATION
-=head2 lib - manipulate @INC at compile time
+=head2 AnyDBM_File - provide framework for multiple DBMs
=item SYNOPSIS
-
=item DESCRIPTION
-
=over
-=item ADDING DIRECTORIES TO @INC
+=item DBM Comparisons
+[0], [1], [2], [3]
-=item DELETING DIRECTORIES FROM @INC
+=back
+=item SEE ALSO
-=item RESTORING ORIGINAL @INC
+=head2 AutoLoader - load functions only on demand
+=item SYNOPSIS
+=item DESCRIPTION
+=over
-=back
+=item __END__
-=item SEE ALSO
+=item Loading Stubs
+=item Package Lexicals
-=item AUTHOR
+=item AutoLoader vs. SelfLoader
+=back
+=item CAVEAT
+=head2 AutoSplit - split a package for autoloading
+=item SYNOPSIS
-=head2 overload - Package for overloading perl operations
+=item DESCRIPTION
-=item SYNOPSIS
+=item CAVEATS
+=item DIAGNOSTICS
-=item CAVEAT SCRIPTOR
+=head2 Benchmark - benchmark running times of code
+=item SYNOPSIS
=item DESCRIPTION
-
=over
-=item Declaration of overloaded functions
-
+=item Methods
-=item Calling Conventions for Binary Operations
+new, debug
+=item Standard Exports
-FALSE, TRUE, C<undef>
+timeit(COUNT, CODE), timethis, timethese, timediff, timestr
-=item Calling Conventions for Unary Operations
+=item Optional Exports
+=back
-=item Overloadable Operations
+=item NOTES
+=item INHERITANCE
-I<Arithmetic operations>, I<Comparison operations>, I<Bit operations>,
-I<Increment and decrement>, I<Transcendental functions>, I<Boolean,
-string and numeric conversion>, I<Special>
+=item CAVEATS
+=item AUTHORS
+=item MODIFICATION HISTORY
-=back
+=head2 CPAN - query, download and build perl modules from CPAN sites
-=item SPECIAL SYMBOLS FOR C<use overload>
+=item SYNOPSIS
+=item DESCRIPTION
=over
-=item Last Resort
+=item Interactive Mode
+Searching for authors, bundles, distribution files and modules, make, test,
+install, clean modules or distributions
-=item Fallback
+=item CPAN::Shell
+=item ProgrammerE<39>s interface
-C<undef>, TRUE, defined, but FALSE
+=item Cache Manager
-=item Copy Constructor
-
-
-B<Example>
+=item Bundles
+=item autobundle
+=item recompile
=back
-=item MAGIC AUTOGENERATION
+=item CONFIGURATION
+o conf E<lt>scalar optionE<gt>, o conf E<lt>scalar optionE<gt>
+E<lt>valueE<gt>, o conf E<lt>list optionE<gt>, o conf E<lt>list optionE<gt>
+[shift|pop], o conf E<lt>list optionE<gt> [unshift|push|splice]
+E<lt>listE<gt>
-I<Assignment forms of arithmetic operations>, I<Conversion operations>,
-I<Increment and decrement>, C<abs($a)>, I<Unary minus>,
-I<Concatenation>, I<Comparison operations>, I<Copy operator>
+=item SECURITY
-=item WARNING
+=item EXPORT
+=item Debugging
-=item Run-time Overloading
-
+=over
-=item Public functions
+=item Prerequisites
+=back
-overload::StrVal(arg), overload::Overloaded(arg),
-C<overload::Method(obj,op)>
+=item AUTHOR
-=item IMPLEMENTATION
+=item SEE ALSO
+=head2 CPAN::FirstTime - Utility for CPAN::Config file Initialization
-=item AUTHOR
+=item SYNOPSIS
+=item DESCRIPTION
-=item DIAGNOSTICS
+=head2 CPANox, CPAN::Nox - Wrapper around CPAN.pm without using any XS
+module
+=item SYNOPSIS
-=item BUGS
+=item DESCRIPTION
+=item SEE ALSO
+=head2 Carp, carp - warn of errors (from perspective of caller)
+=item SYNOPSIS
+=item DESCRIPTION
-=head2 sigtrap - Perl pragma to enable stack back-trace on unexpected
-signals
+=head2 Class::Template - struct/member template builder
=item SYNOPSIS
-
=item DESCRIPTION
+=item EXAMPLES
+Example 1, Example 2
+=item NOTES
-
-=head2 strict - Perl pragma to restrict unsafe constructs
+=head2 Config - access Perl configuration information
=item SYNOPSIS
-
=item DESCRIPTION
+myconfig(), config_sh(), config_vars(@names)
-C<strict refs>, C<strict vars>, C<strict subs>
-
+=item EXAMPLE
+=item WARNING
+=item NOTE
-=head2 subs - Perl pragma to pre-declare sub names
+=head2 Cwd, getcwd - get pathname of current working directory
=item SYNOPSIS
-
=item DESCRIPTION
+=head2 DB_File - Perl5 access to Berkeley DB
+=item SYNOPSIS
+=item DESCRIPTION
+B<DB_HASH>, B<DB_BTREE>, B<DB_RECNO>
-=head2 vars - Perl pragma to pre-declare global variable names
+=over
-=item SYNOPSIS
+=item How does DB_File interface to Berkeley DB?
+=item Opening a Berkeley DB Database File
-=item DESCRIPTION
+=item Default Parameters
+=item In Memory Databases
+
+=back
+=item DB_HASH
+=over
+=item A Simple Example.
-=head1 MODULE DOCUMENTATION
+=back
+=item DB_BTREE
+=over
+=item Changing the BTREE sort order
-=head2 AnyDBM_File - provide framework for multiple DBMs
+=item Handling duplicate keys
-=item SYNOPSIS
+=item The get_dup method.
+=item Matching Partial Keys
-=item DESCRIPTION
+=back
+=item DB_RECNO
=over
-=item DBM Comparisons
+=item The bval option
+=item A Simple Example
-[0], [1], [2], [3]
+=item Extra Methods
+B<$X-E<gt>push(list) ;>, B<$value = $X-E<gt>pop ;>, B<$X-E<gt>shift>,
+B<$X-E<gt>unshift(list) ;>, B<$X-E<gt>length>
+=item Another Example
=back
-=item SEE ALSO
-
+=item THE API INTERFACE
+B<$status = $X-E<gt>get($key, $value [, $flags]) ;>, B<$status =
+$X-E<gt>put($key, $value [, $flags]) ;>, B<$status = $X-E<gt>del($key [,
+$flags]) ;>, B<$status = $X-E<gt>fd ;>, B<$status = $X-E<gt>seq($key,
+$value, $flags) ;>, B<$status = $X-E<gt>sync([$flags]) ;>
+=item HINTS AND TIPS
+=over
-=head2 AutoLoader - load functions only on demand
-
-=item SYNOPSIS
+=item Locking Databases
+=item Sharing databases with C applications
-=item DESCRIPTION
+=back
+=item COMMON QUESTIONS
+=over
+=item Why is there Perl source in my database?
+=item How do I store complex data structures with DB_File?
-=head2 AutoSplit - split a package for autoloading
+=item What does "Invalid Argument" mean?
-=item SYNOPSIS
+=item What does "Bareword 'DB_File' not allowed" mean?
+=back
-=item DESCRIPTION
+=item HISTORY
+=item BUGS
+=item AVAILABILITY
+=item SEE ALSO
+=item AUTHOR
-=head2 Benchmark - benchmark running times of code
+=head2 Devel::SelfStubber - generate stubs for a SelfLoading module
=item SYNOPSIS
-
=item DESCRIPTION
+=head2 DirHandle - supply object methods for directory handles
-=over
-
-=item Methods
+=item SYNOPSIS
+=item DESCRIPTION
-new, debug
+=head2 DynaLoader - Dynamically load C libraries into Perl code
-=item Standard Exports
+=item SYNOPSIS
+=item DESCRIPTION
-C<timeit(COUNT, CODE)>, timethis, timethese, timediff, timestr
+@dl_library_path, @dl_resolve_using, @dl_require_symbols, dl_error(),
+$dl_debug, dl_findfile(), dl_expandspec(), dl_load_file(),
+dl_find_symbol(), dl_undef_symbols(), dl_install_xsub(), bootstrap()
-=item Optional Exports
+=item AUTHOR
+=head2 English - use nice English (or awk) names for ugly punctuation
+variables
+=item SYNOPSIS
+=item DESCRIPTION
-=back
+=head2 Env - perl module that imports environment variables
-=item NOTES
+=item SYNOPSIS
+=item DESCRIPTION
-=item INHERITANCE
+=item AUTHOR
+=head2 Exporter - Implements default import method for modules
-=item CAVEATS
+=item SYNOPSIS
+=item DESCRIPTION
-=item AUTHORS
+=over
+=item Selecting What To Export
-=item MODIFICATION HISTORY
+=item Specialised Import Lists
+=item Module Version Checking
+=item Managing Unknown Symbols
+=item Tag Handling Utility Functions
+=back
-=head2 Carp, carp - warn of errors (from perspective of caller)
+=head2 ExtUtils::Embed - Utilities for embedding Perl in C/C++ applications
=item SYNOPSIS
-
=item DESCRIPTION
+=item @EXPORT
+=item FUNCTIONS
+xsinit(), Examples, ldopts(), Examples, perl_inc(), ccflags(), ccdlflags(),
+ccopts(), xsi_header(), xsi_protos(@modules), xsi_body(@modules)
+=item EXAMPLES
-=head2 Cwd, getcwd - get pathname of current working directory
-
-=item SYNOPSIS
-
-
-=item DESCRIPTION
+=item SEE ALSO
+=item AUTHOR
+=head2 ExtUtils::Install - install files from here to there
+=item SYNOPSIS
+=item DESCRIPTION
-=head2 DB_File - Perl5 access to Berkeley DB
+=head2 ExtUtils::Liblist - determine libraries to use and how to use them
=item SYNOPSIS
-
=item DESCRIPTION
-
-DB_HASH, DB_BTREE, DB_RECNO
+For static extensions, For dynamic extensions, For dynamic extensions
=over
-=item How does DB_File interface to Berkeley DB?
+=item EXTRALIBS
+=item LDLOADLIBS and LD_RUN_PATH
-=item Differences with Berkeley DB
+=item BSLOADLIBS
+=back
-=item RECNO
+=item PORTABILITY
+=over
-=item In Memory Databases
+=item VMS implementation
+=back
-=item Using the Berkeley DB Interface Directly
+=item SEE ALSO
+=head2 ExtUtils::MM_OS2 - methods to override UN*X behaviour in
+ExtUtils::MakeMaker
-get, put, del, fd, seq, sync
+=item SYNOPSIS
+=item DESCRIPTION
+=head2 ExtUtils::MM_Unix - methods used by ExtUtils::MakeMaker
-=back
+=item SYNOPSIS
-=item EXAMPLES
+=item DESCRIPTION
+=item METHODS
=over
-=item Using HASH
-
-
-=item Using BTREE
+=item Preloaded methods
+canonpath, catdir, catfile, curdir, rootdir, updir
-=item Using RECNO
+=item SelfLoaded methods
+c_o (o), cflags (o), clean (o), const_cccmd (o), const_config (o),
+const_loadlibs (o), constants (o), depend (o), dir_target (o), dist (o),
+dist_basics (o), dist_ci (o), dist_core (o), dist_dir (o), dist_test (o),
+dlsyms (o), dynamic (o), dynamic_bs (o), dynamic_lib (o), exescan,
+extliblist, file_name_is_absolute, find_perl
+
+=item Methods to actually produce chunks of text for the Makefile
+
+force (o), guess_name, has_link_code, init_dirscan, init_main, init_others,
+install (o), installbin (o), libscan (o), linkext (o), lsdir, macro (o),
+makeaperl (o), makefile (o), manifypods (o), maybe_command,
+maybe_command_in_dirs, needs_linking (o), nicetext, parse_version, pasthru
+(o), path, perl_script, perldepend (o), pm_to_blib, post_constants (o),
+post_initialize (o), postamble (o), prefixify, processPL (o), realclean
+(o), replace_manpage_separator, static (o), static_lib (o), staticmake (o),
+subdir_x (o), subdirs (o), test (o), test_via_harness (o), test_via_script
+(o), tool_autosplit (o), tools_other (o), tool_xsubpp (o), top_targets (o),
+writedoc, xs_c (o), xs_o (o)
-=item Locking Databases
+=back
+=item SEE ALSO
+=head2 ExtUtils::MM_VMS - methods to override UN*X behaviour in
+ExtUtils::MakeMaker
+=item SYNOPSIS
-=back
+=item DESCRIPTION
-=item HISTORY
+=over
+=item Methods always loaded
-=item WARNINGS
+eliminate_macros, fixpath, catdir, catfile, wraplist, curdir (override),
+rootdir (override), updir (override)
+=item SelfLoaded methods
-=item BUGS
+guess_name (override), find_perl (override), path (override), maybe_command
+(override), maybe_command_in_dirs (override), perl_script (override),
+file_name_is_absolute (override), replace_manpage_separator, init_others
+(override), constants (override), cflags (override), const_cccmd
+(override), pm_to_blib (override), tool_autosplit (override), tool_sxubpp
+(override), xsubpp_version (override), tools_other (override), dist
+(override), c_o (override), xs_c (override), xs_o (override), top_targets
+(override), dlsyms (override), dynamic_lib (override), dynamic_bs
+(override), static_lib (override), manifypods (override), processPL
+(override), installbin (override), subdir_x (override), clean (override),
+realclean (override), dist_basics (override), dist_core (override),
+dist_dir (override), dist_test (override), install (override), perldepend
+(override), makefile (override), test (override), test_via_harness
+(override), test_via_script (override), makeaperl (override), nicetext
+(override)
+=back
-=item AVAILABILITY
+=head2 ExtUtils::MakeMaker - create an extension Makefile
+=item SYNOPSIS
-=item SEE ALSO
+=item DESCRIPTION
+=over
-=item AUTHOR
+=item How To Write A Makefile.PL
+=item Default Makefile Behaviour
+=item make test
+=item make testdb
+=item make install
-=head2 Devel::SelfStubber - generate stubs for a SelfLoading module
+=item PREFIX and LIB attribute
-=item SYNOPSIS
+=item AFS users
+=item Static Linking of a new Perl Binary
-=item DESCRIPTION
+=item Determination of Perl Library and Installation Locations
+=item Which architecture dependent directory?
+=item Using Attributes and Parameters
+C, CONFIG, CONFIGURE, DEFINE, DIR, DISTNAME, DL_FUNCS, DL_VARS,
+EXCLUDE_EXT, EXE_FILES, NO_VC, FIRST_MAKEFILE, FULLPERL, H, INC,
+INCLUDE_EXT, INSTALLARCHLIB, INSTALLBIN, INSTALLDIRS, INSTALLMAN1DIR,
+INSTALLMAN3DIR, INSTALLPRIVLIB, INSTALLSCRIPT, INSTALLSITELIB,
+INSTALLSITEARCH, INST_ARCHLIB, INST_BIN, INST_EXE, INST_LIB, INST_MAN1DIR,
+INST_MAN3DIR, INST_SCRIPT, LDFROM, LIBPERL_A, LIB, LIBS, LINKTYPE,
+MAKEAPERL, MAKEFILE, MAN1PODS, MAN3PODS, MAP_TARGET, MYEXTLIB, NAME,
+NEEDS_LINKING, NOECHO, NORECURS, OBJECT, OPTIMIZE, PERL, PERLMAINCC,
+PERL_ARCHLIB, PERL_LIB, PERL_SRC, PL_FILES, PM, PMLIBDIRS, PREFIX,
+PREREQ_PM, SKIP, TYPEMAPS, VERSION, VERSION_FROM, XS, XSOPT, XSPROTOARG,
+XS_VERSION
+=item Additional lowercase attributes
-=head2 DirHandle - supply object methods for directory handles
+clean, depend, dist, dynamic_lib, installpm, linkext, macro, realclean,
+tool_autosplit
-=item SYNOPSIS
+=item Overriding MakeMaker Methods
+=item Hintsfile support
-=item DESCRIPTION
+=item Distribution Support
+ make distcheck, make skipcheck, make distclean, make manifest,
+ make distdir, make tardist, make dist, make uutardist, make
+shdist, make zipdist, make ci
+=back
+=item SEE ALSO
+=item AUTHORS
-=head2 DynaLoader - Dynamically load C libraries into Perl code
+=head2 ExtUtils::Manifest - utilities to write and check a MANIFEST file
=item SYNOPSIS
-
=item DESCRIPTION
+=item MANIFEST.SKIP
-@dl_library_path, @dl_resolve_using, @dl_require_symbols, dl_error(),
-$dl_debug, dl_findfile(), dl_expandspec(), dl_load_file(),
-dl_find_symbol(), dl_undef_symbols(), dl_install_xsub(), bootstrap()
+=item EXPORT_OK
-=item AUTHOR
+=item GLOBAL VARIABLES
+=item DIAGNOSTICS
+C<Not in MANIFEST:> I<file>, C<No such file:> I<file>, C<MANIFEST:> I<$!>,
+C<Added to MANIFEST:> I<file>
+=item SEE ALSO
+=item AUTHOR
-=head2 English - use nice English (or awk) names for ugly punctuation
-variables
+=head2 ExtUtils::Miniperl, writemain - write the C code for perlmain.c
=item SYNOPSIS
-
=item DESCRIPTION
+=item SEE ALSO
+=head2 ExtUtils::Mkbootstrap - make a bootstrap file for use by DynaLoader
+=item SYNOPSIS
+=item DESCRIPTION
-=head2 Env - perl module that imports environment variables
+=head2 ExtUtils::Mksymlists - write linker options files for dynamic
+extension
=item SYNOPSIS
-
=item DESCRIPTION
+NAME, DL_FUNCS, DL_VARS, FILE, FUNCLIST, DLBASE
=item AUTHOR
+=item REVISION
+=head2 ExtUtils::testlib - add blib/* directories to @INC
+=item SYNOPSIS
+=item DESCRIPTION
-=head2 Exporter - Implements default import method for modules
+=head2 Fatal - replace functions with equivalents which succeed or die
=item SYNOPSIS
-
=item DESCRIPTION
+=item AUTHOR
-=over
+=head2 Fcntl - load the C Fcntl.h defines
-=item Selecting What To Export
+=item SYNOPSIS
+=item DESCRIPTION
-=item Specialised Import Lists
+=item NOTE
+=item EXPORTED SYMBOLS
-=item Module Version Checking
+=head2 File::Basename, fileparse - split a pathname into pieces
+=item SYNOPSIS
-=item Managing Unknown Symbols
+=item DESCRIPTION
+fileparse_set_fstype, fileparse
-=item Tag Handling Utility Functions
+=item EXAMPLES
+C<basename>, C<dirname>
+=head2 File::CheckTree, validate - run many filetest checks on a tree
+=item SYNOPSIS
-=back
+=item DESCRIPTION
+=head2 File::Compare - Compare files or filehandles
+=item SYNOPSIS
+=item DESCRIPTION
-=head2 ExtUtils::Install - install files from here to there
+=item RETURN
-=item SYNOPSIS
+=item AUTHOR
+
+=head2 File::Copy - Copy files or filehandles
+=item SYNOPSIS
=item DESCRIPTION
+=over
+=item Special behavior if C<syscopy> is defined (VMS and OS/2)
+rmscopy($from,$to[,$date_flag])
+=back
-=head2 ExtUtils::Liblist - determine libraries to use and how to use
-them
+=item RETURN
-=item SYNOPSIS
+=item AUTHOR
+=head2 File::Find, find - traverse a file tree
+
+=item SYNOPSIS
=item DESCRIPTION
+=head2 File::Path - create or remove a series of directories
-For static extensions, For dynamic extensions, For dynamic extensions
+=item SYNOPSIS
-=over
+=item DESCRIPTION
-=item EXTRALIBS
+=item AUTHORS
+=item REVISION
-=item LDLOADLIBS and LD_RUN_PATH
+=head2 File::stat - by-name interface to Perl's built-in stat() functions
+=item SYNOPSIS
-=item BSLOADLIBS
+=item DESCRIPTION
+=item NOTE
+=item AUTHOR
+=head2 FileCache - keep more files open than the system permits
-=back
+=item SYNOPSIS
-=item PORTABILITY
+=item DESCRIPTION
+=item BUGS
-=item SEE ALSO
+=head2 FileHandle - supply object methods for filehandles
+=item SYNOPSIS
+=item DESCRIPTION
+$fh->print, $fh->printf, $fh->getline, $fh->getlines
+=item SEE ALSO
-=head2 ExtUtils::MM_OS2 - methods to override UN*X behaviour in
-ExtUtils::MakeMaker
+=head2 FindBin - Locate directory of original perl script
+
+=item SYNOPSIS
=item DESCRIPTION
+=item EXPORTABLE VARIABLES
+=item KNOWN BUGS
+=item AUTHORS
+=item COPYRIGHT
-=head2 ExtUtils::MM_Unix - methods used by ExtUtils::MakeMaker
+=item REVISION
-=item SYNOPSIS
+=head2 GDBM_File - Perl5 access to the gdbm library.
+=item SYNOPSIS
=item DESCRIPTION
+=item AVAILABILITY
-=item METHODS
-
-
-=over
+=item BUGS
-=item Preloaded methods
+=item SEE ALSO
+=head2 Getopt::Long, GetOptions - extended processing of command line
+options
-catdir, catfile, nicetext, libscan, exescan, lsdir, path,
-replace_manpage_separator, file_name_is_absolute, prefixify,
-maybe_command_in_dirs, maybe_command, perl_script
+=item SYNOPSIS
-=item SelfLoaded methods
+=item DESCRIPTION
+E<lt>noneE<gt>, !, =s, :s, =i, :i, =f, :f
-guess_name, init_main, init_dirscan, init_others, find_perl
+=over
-=item Methods to produce chunks of text for the Makefile
+=item Linkage specification
+=item Aliases and abbreviations
-post_initialize, const_config, constants, const_loadlibs, const_cccmd,
-tool_autosplit, tool_xsubpp, tools_other, dist, macro, depend,
-post_constants, pasthru, c_o, xs_c, xs_o, top_targets, linkext, dlsyms,
-dynamic, dynamic_bs, dynamic_lib, static, static_lib, installpm,
-installpm_x, manifypods, processPL, installbin, subdirs, subdir_x,
-clean, realclean, dist_basics, dist_core, dist_dir, dist_test, dist_ci,
-install, force, perldepend, makefile, staticmake, test,
-test_via_harness, test_via_script, postamble, makeaperl, extliblist,
-dir_target, needs_linking, has_link_code, writedoc
+=item Non-option call-back routine
+=item Option starters
+=item Return value
=back
-=item SEE ALSO
+=item COMPATIBILITY
+=item EXAMPLES
+=item CONFIGURATION VARIABLES
+$Getopt::Long::autoabbrev, $Getopt::Long::getopt_compat,
+$Getopt::Long::order, $Getopt::Long::bundling, $Getopt::Long::ignorecase,
+$Getopt::Long::passthrough, $Getopt::Long::VERSION, $Getopt::Long::error,
+$Getopt::Long::debug
+=head2 Getopt::Std, getopt - Process single-character switches with switch
+clustering
-=head2 ExtUtils::MM_VMS - methods to override UN*X behaviour in
-ExtUtils::MakeMaker
+=item SYNOPSIS
=item DESCRIPTION
+=head2 I18N::Collate - compare 8-bit scalar data according to the current
+locale
+=item SYNOPSIS
+=item DESCRIPTION
-
-=head2 ExtUtils::MakeMaker - create an extension Makefile
+=head2 IO - load various IO modules
=item SYNOPSIS
-
=item DESCRIPTION
+=head2 IO::File - supply object methods for filehandles
-=over
-
-=item Hintsfile support
-
+=item SYNOPSIS
-=item What's new in version 5 of MakeMaker
+=item DESCRIPTION
+=item CONSTRUCTOR
-=item Incompatibilities between MakeMaker 5.00 and 4.23
+new ([ ARGS ] )
+=item METHODS
-=item Default Makefile Behaviour
+open( FILENAME [,MODE [,PERMS]] )
+=item SEE ALSO
-=item make test
+=item HISTORY
+=head2 IO::Handle - supply object methods for I/O handles
-=item make install
+=item SYNOPSIS
+=item DESCRIPTION
-=item PREFIX attribute
+=item CONSTRUCTOR
+new (), new_from_fd ( FD, MODE )
-=item AFS users
+=item METHODS
+$fh->getline, $fh->getlines, $fh->fdopen ( FD, MODE ), $fh->write ( BUF,
+LEN [, OFFSET }\] ), $fh->opened, $fh->untaint
-=item Static Linking of a new Perl Binary
+=item NOTE
+=item SEE ALSO
-=item Determination of Perl Library and Installation Locations
+=item BUGS
+=item HISTORY
-=item Useful Default Makefile Macros
+=head2 IO::Pipe, IO::pipe - supply object methods for pipes
+=item SYNOPSIS
-=item Using Attributes and Parameters
+=item DESCRIPTION
+=item CONSTRCUTOR
-C, CONFIG, CONFIGURE, DEFINE, DIR, DISTNAME, DL_FUNCS, DL_VARS,
-EXE_FILES, FIRST_MAKEFILE, FULLPERL, H, INC, INSTALLARCHLIB,
-INSTALLBIN, INSTALLDIRS, INSTALLMAN1DIR, INSTALLMAN3DIR,
-INSTALLPRIVLIB, INSTALLSITELIB, INSTALLSITEARCH, INST_ARCHLIB,
-INST_EXE, INST_LIB, INST_MAN1DIR, INST_MAN3DIR, LDFROM, LIBPERL_A,
-LIBS, LINKTYPE, MAKEAPERL, MAKEFILE, MAN1PODS, MAN3PODS, MAP_TARGET,
-MYEXTLIB, NAME, NEEDS_LINKING, NOECHO, NORECURS, OBJECT, PERL,
-PERLMAINCC, PERL_ARCHLIB, PERL_LIB, PERL_SRC, PL_FILES, PM, PMLIBDIRS,
-PREFIX, PREREQ, SKIP, TYPEMAPS, VERSION, VERSION_FROM, XS, XSOPT,
-XSPROTOARG, XS_VERSION
+new ( [READER, WRITER] )
-=item Additional lowercase attributes
+=item METHODS
+reader ([ARGS]), writer ([ARGS]), handles ()
-clean, depend, dist, dynamic_lib, installpm, linkext, macro, realclean,
-tool_autosplit
+=item SEE ALSO
-=item Overriding MakeMaker Methods
+=item AUTHOR
+=item COPYRIGHT
-=item Distribution Support
+=head2 IO::Seekable - supply seek based methods for I/O objects
+=item SYNOPSIS
- make distcheck, make skipcheck, make distclean, make
- manifest, make distdir, make tardist, make dist, make
- uutardist, make shdist, make ci
+=item DESCRIPTION
+=item SEE ALSO
+=item HISTORY
-=back
+=head2 IO::Select - OO interface to the select system call
-=item AUTHORS
+=item SYNOPSIS
+=item DESCRIPTION
-=item MODIFICATION HISTORY
+=item CONSTRUCTOR
+new ( [ HANDLES ] )
-=item TODO
+=item METHODS
+add ( HANDLES ), remove ( HANDLES ), exists ( HANDLE ), handles, can_read (
+[ TIMEOUT ] ), can_write ( [ TIMEOUT ] ), has_error ( [ TIMEOUT ] ), count
+(), bits(), bits(), select ( READ, WRITE, ERROR [, TIMEOUT ] )
+=item EXAMPLE
+=item AUTHOR
+=item COPYRIGHT
-=head2 ExtUtils::Manifest - utilities to write and check a MANIFEST
-file
+=head2 IO::Socket - Object interface to socket communications
=item SYNOPSIS
-
=item DESCRIPTION
+=item CONSTRUCTOR
-=item MANIFEST.SKIP
-
+new ( [ARGS] )
-=item EXPORT_OK
+=item METHODS
+accept([PKG]), timeout([VAL]), sockopt(OPT [, VAL]), sockdomain, socktype,
+protocol
-=item GLOBAL VARIABLES
+=item SUB-CLASSES
+=over
-=item DIAGNOSTICS
+=item IO::Socket::INET
+=item METHODS
-C<Not in MANIFEST:> I<file>, C<No such file:> I<file>, C<MANIFEST:>
-I<$!>, C<Added to MANIFEST:> I<file>
+sockaddr (), sockport (), sockhost (), peeraddr (), peerport (), peerhost
+()
-=item SEE ALSO
+=item IO::Socket::UNIX
+=item METHODS
-=item AUTHOR
+hostpath(), peerpath()
+=back
+=item SEE ALSO
+=item AUTHOR
+=item COPYRIGHT
-=head2 ExtUtils::Mkbootstrap - make a bootstrap file for use by
-DynaLoader
+=head2 IO::lib::IO::File, IO::File - supply object methods for filehandles
=item SYNOPSIS
-
=item DESCRIPTION
+=item CONSTRUCTOR
+new ([ ARGS ] )
+=item METHODS
+open( FILENAME [,MODE [,PERMS]] )
-=head2 ExtUtils::Mksymlists - write linker options files for dynamic
-extension
+=item SEE ALSO
-=item SYNOPSIS
+=item HISTORY
+=head2 IO::lib::IO::Handle, IO::Handle - supply object methods for I/O
+handles
-=item DESCRIPTION
+=item SYNOPSIS
+=item DESCRIPTION
-NAME, DL_FUNCS, DL_VARS, FILE, FUNCLIST, DLBASE
+=item CONSTRUCTOR
-=item AUTHOR
+new (), new_from_fd ( FD, MODE )
+=item METHODS
-=item REVISION
+$fh->getline, $fh->getlines, $fh->fdopen ( FD, MODE ), $fh->write ( BUF,
+LEN [, OFFSET }\] ), $fh->opened, $fh->untaint
+=item NOTE
+=item SEE ALSO
+=item BUGS
+=item HISTORY
-=head2 Fcntl - load the C Fcntl.h defines
+=head2 IO::lib::IO::Pipe, IO::pipe - supply object methods for pipes
=item SYNOPSIS
-
=item DESCRIPTION
+=item CONSTRCUTOR
-=item NOTE
+new ( [READER, WRITER] )
+=item METHODS
+reader ([ARGS]), writer ([ARGS]), handles ()
+=item SEE ALSO
+=item AUTHOR
-=head2 File::Basename, Basename - parse file specifications
+=item COPYRIGHT
-=item SYNOPSIS
+=head2 IO::lib::IO::Seekable, IO::Seekable - supply seek based methods for
+I/O objects
+=item SYNOPSIS
=item DESCRIPTION
+=item SEE ALSO
-fileparse_set_fstype, fileparse
-
-=item EXAMPLES
-
-
-C<basename>, C<dirname>
-
+=item HISTORY
+=head2 IO::lib::IO::Select, IO::Select - OO interface to the select system
+call
+=item SYNOPSIS
-=head2 File::CheckTree, validate - run many filetest checks on a tree
+=item DESCRIPTION
-=item SYNOPSIS
+=item CONSTRUCTOR
+new ( [ HANDLES ] )
-=item DESCRIPTION
+=item METHODS
+add ( HANDLES ), remove ( HANDLES ), exists ( HANDLE ), handles, can_read (
+[ TIMEOUT ] ), can_write ( [ TIMEOUT ] ), has_error ( [ TIMEOUT ] ), count
+(), bits(), bits(), select ( READ, WRITE, ERROR [, TIMEOUT ] )
+=item EXAMPLE
+=item AUTHOR
+=item COPYRIGHT
-=head2 File::Find, find - traverse a file tree
+=head2 IO::lib::IO::Socket, IO::Socket - Object interface to socket
+communications
=item SYNOPSIS
-
=item DESCRIPTION
+=item CONSTRUCTOR
+new ( [ARGS] )
+=item METHODS
+accept([PKG]), timeout([VAL]), sockopt(OPT [, VAL]), sockdomain, socktype,
+protocol
-=head2 File::Path - create or remove a series of directories
+=item SUB-CLASSES
-=item SYNOPSIS
+=over
+=item IO::Socket::INET
-=item DESCRIPTION
+=item METHODS
+sockaddr (), sockport (), sockhost (), peeraddr (), peerport (), peerhost
+()
-=item AUTHORS
+=item IO::Socket::UNIX
+=item METHODS
-=item REVISION
+hostpath(), peerpath()
+=back
+=item SEE ALSO
+=item AUTHOR
+=item COPYRIGHT
-=head2 FileCache - keep more files open than the system permits
+=head2 IPC::Open2, open2 - open a process for both reading and writing
=item SYNOPSIS
-
=item DESCRIPTION
+=item WARNING
-=item BUGS
+=item SEE ALSO
+=head2 IPC::Open3, open3 - open a process for reading, writing, and error
+handling
+=item SYNOPSIS
+=item DESCRIPTION
+=item WARNING
-=head2 FileHandle - supply object methods for filehandles
+=head2 Math::BigFloat - Arbitrary length float math package
=item SYNOPSIS
-
=item DESCRIPTION
+number format, Error returns 'NaN', Division is computed to
- $fh->print, $fh->printf, $fh->getline, $fh->getlines
+=item BUGS
-=item SEE ALSO
+=item AUTHOR
+=head2 Math::BigInt - Arbitrary size integer math package
-=item BUGS
+=item SYNOPSIS
+=item DESCRIPTION
+Canonical notation, Input, Output
+=item EXAMPLES
+=item BUGS
-=head2 GDBM_File - Perl5 access to the gdbm library.
+=item AUTHOR
-=item SYNOPSIS
+=head2 Math::Complex - complex numbers and associated mathematical
+functions
+=item SYNOPSIS
=item DESCRIPTION
+=item OPERATIONS
-=item AVAILABILITY
-
+=item CREATION
-=item BUGS
+=item STRINGIFICATION
+=item USAGE
-=item SEE ALSO
+=item BUGS
+=item AUTHOR
+=head2 NDBM_File - Tied access to ndbm files
+=item SYNOPSIS
+=item DESCRIPTION
-=head2 Getopt::Long, GetOptions - extended processing of command line
-options
+=head2 Net::Ping - check a remote host for reachability
=item SYNOPSIS
-
=item DESCRIPTION
-
-<none>, !, =s, :s, =i, :i, =f, :f
-
=over
-=item Linkage specification
-
+=item Functions
-=item Aliases and abbreviations
+Net::Ping->new([$proto [, $def_timeout [, $bytes]]]);, $p->ping($host [,
+$timeout]);, $p->close();, pingecho($host [, $timeout]);
+=back
-=item Non-option call-back routine
+=item WARNING
+=item NOTES
-=item Option starters
+=head2 Net::hostent - by-name interface to Perl's built-in gethost*()
+functions
+=item SYNOPSIS
-=item Return value
+=item DESCRIPTION
+=item EXAMPLES
+=item NOTE
+=item AUTHOR
-=back
+=head2 Net::netent - by-name interface to Perl's built-in getnet*()
+functions
-=item COMPATIBILITY
+=item SYNOPSIS
+=item DESCRIPTION
=item EXAMPLES
+=item NOTE
-=item CONFIGURATION VARIABLES
+=item AUTHOR
+=head2 Net::protoent - by-name interface to Perl's built-in getproto*()
+functions
-$Getopt::Long::autoabbrev, $Getopt::Long::getopt_compat,
-$Getopt::Long::order, $Getopt::Long::ignorecase,
-$Getopt::Long::VERSION, $Getopt::Long::error, $Getopt::Long::debug
+=item SYNOPSIS
+=item DESCRIPTION
+=item NOTE
+=item AUTHOR
-=head2 Getopt::Std, getopt - Process single-character switches with
-switch clustering
+=head2 Net::servent - by-name interface to Perl's built-in getserv*()
+functions
=item SYNOPSIS
-
=item DESCRIPTION
+=item EXAMPLES
+=item NOTE
+=item AUTHOR
-
-=head2 I18N::Collate - compare 8-bit scalar data according to the
-current locale
+=head2 ODBM_File - Tied access to odbm files
=item SYNOPSIS
-
=item DESCRIPTION
-
-
-
-
-=head2 IPC::Open2, open2 - open a process for both reading and writing
+=head2 Opcode - Disable named opcodes when compiling perl code
=item SYNOPSIS
-
=item DESCRIPTION
+=item NOTE
=item WARNING
+=item Operator Names and Operator Lists
-=item SEE ALSO
-
+an operator name (opname), an operator tag name (optag), a negated opname
+or optag, an operator set (opset)
+=item Opcode Functions
+opcodes, opset (OP, ...), opset_to_ops (OPSET), opset_to_hex (OPSET),
+full_opset, empty_opset, invert_opset (OPSET), verify_opset (OPSET, ...),
+define_optag (OPTAG, OPSET), opmask_add (OPSET), opmask, opdesc (OP, ...),
+opdump (PAT)
+=item Manipulating Opsets
-=head2 IPC::Open3, open3 - open a process for reading, writing, and
-error handling
-
-=item SYNOPSIS
-
-
-=item DESCRIPTION
+=item TO DO (maybe)
+=item Predefined Opcode Tags
+:base_core, :base_mem, :base_loop, :base_io, :base_orig, :base_math,
+:default, :filesys_read, :sys_db, :browse, :filesys_open, :filesys_write,
+:subprocess, :ownprocess, :others, :still_to_be_decided, :dangerous
+=item SEE ALSO
+=item AUTHORS
-=head2 Net::Ping, pingecho - check a host for upness
+=head2 Opcode::Safe, Safe - Compile and execute code in restricted
+compartments
=item SYNOPSIS
-
=item DESCRIPTION
+a new namespace, an operator mask
+
+=item WARNING
=over
-=item Parameters
+=item RECENT CHANGES
+=item Methods in class Safe
-hostname, timeout
+permit (OP, ...), permit_only (OP, ...), deny (OP, ...), deny_only (OP,
+...), trap (OP, ...), untrap (OP, ...), share (NAME, ...), share_from
+(PACKAGE, ARRAYREF), varglob (VARNAME), reval (STRING), rdo (FILENAME),
+root (NAMESPACE), mask (MASK)
+=item Some Safety Issues
+Memory, CPU, Snooping, Signals, State Changes
-=back
+=item AUTHOR
-=item WARNING
+=back
+=head2 Opcode::ops, ops - Perl pragma to restrict unsafe operations when
+compiling
+=item SYNOPSIS
+=item DESCRIPTION
+=item SEE ALSO
=head2 POSIX - Perl interface to IEEE Std 1003.1
=item SYNOPSIS
-
=item DESCRIPTION
-
=item NOTE
-
-=item CAVEATS
-
+=item CAVEATS
=item FUNCTIONS
-
-_exit, abort, abs, access, acos, alarm, asctime, asin, assert, atan,
-atan2, atexit, atof, atoi, atol, bsearch, calloc, ceil, chdir, chmod,
-chown, clearerr, clock, close, closedir, cos, cosh, creat, ctermid,
-ctime, cuserid, difftime, div, dup, dup2, errno, execl, execle, execlp,
-execv, execve, execvp, exit, exp, fabs, fclose, fcntl, fdopen, feof,
-ferror, fflush, fgetc, fgetpos, fgets, fileno, floor, fmod, fopen,
-fork, fpathconf, fprintf, fputc, fputs, fread, free, freopen, frexp,
-fscanf, fseek, fsetpos, fstat, ftell, fwrite, getc, getchar, getcwd,
-getegid, getenv, geteuid, getgid, getgrgid, getgrnam, getgroups,
-getlogin, getpgrp, getpid, getppid, getpwnam, getpwuid, gets, getuid,
-gmtime, isalnum, isalpha, isatty, iscntrl, isdigit, isgraph, islower,
-isprint, ispunct, isspace, isupper, isxdigit, kill, labs, ldexp, ldiv,
-link, localeconv, localtime, log, log10, longjmp, lseek, malloc, mblen,
-mbstowcs, mbtowc, memchr, memcmp, memcpy, memmove, memset, mkdir,
-mkfifo, mktime, modf, nice, offsetof, open, opendir, pat
+_exit, abort, abs, access, acos, alarm, asctime, asin, assert, atan, atan2,
+atexit, atof, atoi, atol, bsearch, calloc, ceil, chdir, chmod, chown,
+clearerr, clock, close, closedir, cos, cosh, creat, ctermid, ctime,
+cuserid, difftime, div, dup, dup2, errno, execl, execle, execlp, execv,
+execve, execvp, exit, exp, fabs, fclose, fcntl, fdopen, feof, ferror,
+fflush, fgetc, fgetpos, fgets, fileno, floor, fmod, fopen, fork, fpathconf,
+fprintf, fputc, fputs, fread, free, freopen, frexp, fscanf, fseek, fsetpos,
+fstat, ftell, fwrite, getc, getchar, getcwd, getegid, getenv, geteuid,
+getgid, getgrgid, getgrnam, getgroups, getlogin, getpgrp, getpid, getppid,
+getpwnam, getpwuid, gets, getuid, gmtime, isalnum, isalpha, isatty,
+iscntrl, isdigit, isgraph, islower, isprint, ispunct, isspace, isupper,
+isxdigit, kill, labs, ldexp, ldiv, link, localeconv, localtime, log, log10,
+longjmp, lseek, malloc, mblen, mbstowcs, mbtowc, memchr, memcmp, memcpy,
+memmove, memset, mkdir, mkfifo, mktime, modf, nice, offsetof, open,
+opendir, pathconf, pause, perror, pipe, pow, printf, putc, putchar, puts,
+qsort, raise, rand, read, readdir, realloc, remove, rename, rewind,
+rewinddir, rmdir, scanf, setgid, setjmp, setlocale, setpgid, setsid,
+setuid, sigaction, siglongjmp, sigpending, sigprocmask, sigsetjmp,
+sigsuspend, sin, sinh, sleep, sprintf, sqrt, srand, sscanf, stat, strcat,
+strchr, strcmp, strcoll, strcpy, strcspn, strerror, strftime, strlen,
+strncat, strncmp, strncpy, stroul, strpbrk, strrchr, strspn, strstr,
+strtod, strtok, strtol, strtoul, strxfrm, sysconf, system, tan, tanh,
+tcdrain, tcflow, tcflush, tcgetpgrp, tcsendbreak, tcsetpgrp, time, times,
+tmpfile, tmpnam, tolower, toupper, ttyname, tzname, tzset, umask, uname,
+ungetc, unlink, utime, vfprintf, vprintf, vsprintf, wait, waitpid,
+wcstombs, wctomb, write
=item CLASSES
-
=over
=item POSIX::SigAction
-
new
=item POSIX::SigSet
-
new, addset, delset, emptyset, fillset, ismember
=item POSIX::Termios
-
new, getattr, getcc, getcflag, getiflag, getispeed, getlflag, getoflag,
getospeed, setattr, setcc, setcflag, setiflag, setispeed, setlflag,
setoflag, setospeed, Baud rate values, Terminal interface values, c_cc
field values, c_cflag field values, c_iflag field values, c_lflag field
values, c_oflag field values
-
-
=back
=item PATHNAME CONSTANTS
-
Constants
=item POSIX CONSTANTS
-
Constants
=item SYSTEM CONFIGURATION
-
Constants
=item ERRNO
-
Constants
=item FCNTL
-
Constants
=item FLOAT
-
Constants
=item LIMITS
-
Constants
=item LOCALE
-
Constants
=item MATH
-
Constants
=item SIGNAL
-
Constants
=item STAT
-
Constants, Macros
=item STDLIB
-
Constants
=item STDIO
-
Constants
=item TIME
-
Constants
=item UNISTD
-
Constants
=item WAIT
-
Constants, Macros
=item CREATION
-
-
-
-
=head2 Pod::Text - convert POD data to formatted ASCII text
=item SYNOPSIS
-
=item DESCRIPTION
-
=item AUTHOR
-
=item TODO
+=head2 SDBM_File - Tied access to sdbm files
+=item SYNOPSIS
+=item DESCRIPTION
+=head2 Safe - Compile and execute code in restricted compartments
-=head2 Safe - Safe extension module for Perl
+=item SYNOPSIS
=item DESCRIPTION
-
a new namespace, an operator mask
-=over
+=item WARNING
-=item Operator masks
+=over
+=item RECENT CHANGES
=item Methods in class Safe
+permit (OP, ...), permit_only (OP, ...), deny (OP, ...), deny_only (OP,
+...), trap (OP, ...), untrap (OP, ...), share (NAME, ...), share_from
+(PACKAGE, ARRAYREF), varglob (VARNAME), reval (STRING), rdo (FILENAME),
+root (NAMESPACE), mask (MASK)
-NAMESPACE, MASK, root (NAMESPACE), mask (MASK), trap (OP, ...), untrap
-(OP, ...), share (VARNAME, ...), varglob (VARNAME), reval (STRING), rdo
-(FILENAME)
+=item Some Safety Issues
-=item Subroutines in package Safe
-
-
-ops_to_mask (OP, ...), mask_to_ops (MASK), opcode (OP, ...), opname
-(OP, ...), fullmask, emptymask, MAXO, op_mask
+Memory, CPU, Snooping, Signals, State Changes
=item AUTHOR
-
-
-
=back
-
-
-
=head2 Search::Dict, look - search for key in dictionary file
=item SYNOPSIS
-
=item DESCRIPTION
-
-
-
-
=head2 SelectSaver - save and restore selected file handle
=item SYNOPSIS
-
=item DESCRIPTION
-
-
-
-
=head2 SelfLoader - load functions only on demand
=item SYNOPSIS
-
=item DESCRIPTION
-
=over
=item The __DATA__ token
-
=item SelfLoader autoloading
-
=item Autoloading and package lexicals
-
=item SelfLoader and AutoLoader
-
=item __DATA__, __END__, and the FOOBAR::DATA filehandle.
-
=item Classes and inherited methods.
-
-
-
=back
=item Multiple packages and fully qualified subroutine names
-
-
-
-
-=head2 Socket, sockaddr_in, sockaddr_un, inet_aton, inet_ntoa - load
-the C socket.h defines and structure manipulators
+=head2 Shell - run shell commands transparently within perl
=item SYNOPSIS
-
=item DESCRIPTION
+=item AUTHOR
-inet_aton HOSTNAME, inet_ntoa IP_ADDRESS, INADDR_ANY, INADDR_LOOPBACK,
-INADDR_NONE, sockaddr_in PORT, ADDRESS, sockaddr_in SOCKADDR_IN,
-pack_sockaddr_in PORT, IP_ADDRESS, unpack_sockaddr_in SOCKADDR_IN,
-sockaddr_un PATHNAME, sockaddr_un SOCKADDR_UN, pack_sockaddr_un PATH,
-unpack_sockaddr_un SOCKADDR_UN
+=head2 Socket, sockaddr_in, sockaddr_un, inet_aton, inet_ntoa - load the C
+socket.h defines and structure manipulators
+=item SYNOPSIS
+=item DESCRIPTION
+inet_aton HOSTNAME, inet_ntoa IP_ADDRESS, INADDR_ANY, INADDR_BROADCAST,
+INADDR_LOOPBACK, INADDR_NONE, sockaddr_in PORT, ADDRESS, sockaddr_in
+SOCKADDR_IN, pack_sockaddr_in PORT, IP_ADDRESS, unpack_sockaddr_in
+SOCKADDR_IN, sockaddr_un PATHNAME, sockaddr_un SOCKADDR_UN,
+pack_sockaddr_un PATH, unpack_sockaddr_un SOCKADDR_UN
=head2 Symbol - manipulate Perl symbols and their names
=item SYNOPSIS
-
=item DESCRIPTION
-
-
-
-
=head2 Sys::Hostname - Try every conceivable way to get hostname
=item SYNOPSIS
-
=item DESCRIPTION
-
=item AUTHOR
-
-
-
-
-=head2 Syslog, Sys::Syslog, openlog, closelog, setlogmask, syslog -
-Perl interface to the UNIX syslog(3) calls
+=head2 Syslog, Sys::Syslog, openlog, closelog, setlogmask, syslog - Perl
+interface to the UNIX syslog(3) calls
=item SYNOPSIS
-
=item DESCRIPTION
-
-openlog $ident, $logopt, $facility, syslog $priority, $mask, $format,
-@args, setlogmask $mask_priority, closelog
+openlog $ident, $logopt, $facility, syslog $priority, $format, @args,
+setlogmask $mask_priority, closelog
=item EXAMPLES
-
=item DEPENDENCIES
-
=item SEE ALSO
-
=item AUTHOR
-
-
-
-
=head2 Term::Cap - Perl termcap interface
=item SYNOPSIS
-
=item DESCRIPTION
-
=item EXAMPLES
-
-
-
-
=head2 Term::Complete - Perl word completion module
=item SYNOPSIS
-
=item DESCRIPTION
-
-<tab>Attempts word completion. Cannot be changed, ^D, ^U, <del>, <bs>
+E<lt>tabE<gt>Attempts word completion.
+Cannot be changed, ^D, ^U, E<lt>delE<gt>, E<lt>bsE<gt>
=item DIAGNOSTICS
-
=item BUGS
-
=item AUTHOR
-
-
-
-
-=head2 Term::ReadLine - Perl interface to various C<readline> packages.
-If no real package is found, substitutes stubs instead of basic
-functions.
+=head2 Term::ReadLine - Perl interface to various C<readline> packages. If
+no real package is found, substitutes stubs instead of basic functions.
=item SYNOPSIS
-
=item DESCRIPTION
-
=item Minimal set of supported functions
-
C<ReadLine>, C<new>, C<readline>, C<addhistory>, C<IN>, $C<OUT>,
C<MinLine>, C<findConsole>, C<Features>
=item EXPORTS
-
-
-
-
=head2 Test::Harness - run perl standard test scripts with statistics
=item SYNOPSIS
-
=item DESCRIPTION
-
=over
=item The test script output
-
-
-
=back
=item EXPORT
-
=item DIAGNOSTICS
-
C<All tests successful.\nFiles=%d, Tests=%d, %s>, C<FAILED tests
-%s\n\tFailed %d/%d tests, %.2f%% okay.>, C<Test returned status %d
-(wstat %d)>, C<Failed 1 test, %.2f%% okay. %s>, C<Failed %d/%d tests,
-%.2f%% okay. %s>
+%s\n\tFailed %d/%d tests, %.2f%% okay.>, C<Test returned status %d (wstat
+%d)>, C<Failed 1 test, %.2f%% okay. %s>, C<Failed %d/%d tests, %.2f%% okay.
+%s>
=item SEE ALSO
-
=item AUTHORS
-
=item BUGS
-
-
-
-
=head2 Text::Abbrev, abbrev - create an abbreviation table from a list
=item SYNOPSIS
-
=item DESCRIPTION
-
=item EXAMPLE
+=head2 Text::ParseWords - parse text into an array of tokens
+=item SYNOPSIS
+=item DESCRIPTION
+=item AUTHORS
-=head2 Text::Soundex - Implementation of the Soundex Algorithm as
-Described by Knuth
+=head2 Text::Soundex - Implementation of the Soundex Algorithm as Described
+by Knuth
=item SYNOPSIS
-
=item DESCRIPTION
-
=item EXAMPLES
-
=item LIMITATIONS
-
=item AUTHOR
+=head2 Text::Tabs -- expand and unexpand tabs per the unix expand(1) and
+unexpand(1)
+=item SYNOPSIS
+=item DESCRIPTION
+=item BUGS
-=head2 Text::Tabs -- expand and unexpand tabs
+=item AUTHOR
-=item SYNOPSIS
+=head2 Text::Wrap - line wrapping to form simple paragraphs
+=item SYNOPSIS
=item DESCRIPTION
+=item EXAMPLE
=item AUTHOR
+=head2 Tie::Hash, Tie::StdHash - base class definitions for tied hashes
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+TIEHASH classname, LIST, STORE this, key, value, FETCH this, key, FIRSTKEY
+this, NEXTKEY this, lastkey, EXISTS this, key, DELETE this, key, CLEAR this
+=item CAVEATS
+=item MORE INFORMATION
-=head2 Text::Wrap -- wrap text into a paragraph
+=head2 Tie::RefHash - use references as hash keys
=item SYNOPSIS
-
=item DESCRIPTION
+=item EXAMPLE
=item AUTHOR
+=item VERSION
+=item SEE ALSO
-
-
-=head2 Tie::Hash, Tie::StdHash - base class definitions for tied hashes
+=head2 Tie::Scalar, Tie::StdScalar - base class definitions for tied
+scalars
=item SYNOPSIS
-
=item DESCRIPTION
+TIESCALAR classname, LIST, FETCH this, STORE this, value, DESTROY this
-TIEHASH classname, LIST, STORE this, key, value, FETCH this, key,
-FIRSTKEY this, NEXTKEY this, lastkey, EXISTS this, key, DELETE this,
-key, CLEAR this
+=item MORE INFORMATION
-=item CAVEATS
+=head2 Tie::SubstrHash - Fixed-table-size, fixed-key-length hashing
+=item SYNOPSIS
-=item MORE INFORMATION
+=item DESCRIPTION
+=item CAVEATS
+=head2 Time::Local - efficiently compute time from local and GMT time
+=item SYNOPSIS
+=item DESCRIPTION
-=head2 Tie::Scalar, Tie::StdScalar - base class definitions for tied
-scalars
+=head2 Time::gmtime - by-name interface to Perl's built-in gmtime()
+function
=item SYNOPSIS
-
=item DESCRIPTION
+=item NOTE
-TIESCALAR classname, LIST, FETCH this, STORE this, value, DESTROY this
+=item AUTHOR
-=item MORE INFORMATION
+=head2 Time::localtime - by-name interface to Perl's built-in localtime()
+function
+=item SYNOPSIS
+=item DESCRIPTION
+=item NOTE
+=item AUTHOR
-=head2 Tie::SubstrHash - Fixed-table-size, fixed-key-length hashing
+=head2 Time::tm - internal object used by Time::gmtime and Time::localtime
=item SYNOPSIS
+=item DESCRIPTION
+
+=item AUTHOR
+
+=head2 UNIVERSAL - base class for ALL classes (blessed references)
+
+=item SYNOPSIS
=item DESCRIPTION
+isa ( TYPE ), can ( METHOD ), VERSION ( [ REQUIRE ] ), isa ( REF, TYPE )
-=item CAVEATS
+=head2 User::grent - by-name interface to Perl's built-in getgr*()
+functions
+=item SYNOPSIS
+=item DESCRIPTION
+=item NOTE
+=item AUTHOR
-=head2 Time::Local - efficiently compute tome from local and GMT time
+=head2 User::pwent - by-name interface to Perl's built-in getpw*()
+functions
=item SYNOPSIS
-
=item DESCRIPTION
+=item NOTE
-
+=item AUTHOR
=head1 AUXILIARY DOCUMENTATION
-Here should be listed all the extra program's documentation, but they don't all
-have manual pages yet:
+Here should be listed all the extra programs' documentation, but they
+don't all have manual pages yet:
=item a2p
@@ -3178,10 +3509,8 @@ have manual pages yet:
=item wrapsuid
-
=head1 AUTHOR
-Larry Wall E<lt>F<larry@wall.org>E<gt>, with the help of oodles of
-other folks.
-
+Larry Wall E<lt>F<larry@wall.org>E<gt>, with the help of oodles
+of other folks.
diff --git a/pod/perltoot.pod b/pod/perltoot.pod
index ff8e24fb3e..aae3b7393d 100644
--- a/pod/perltoot.pod
+++ b/pod/perltoot.pod
@@ -448,7 +448,7 @@ of magicalness to a C programmer. It's really just a mnemonic device
to remind ourselves that this field is special and not to be used as
a public data member in the same way that NAME, AGE, and PEERS are.
(Because we've been developing this code under the strict pragma, prior
-to 5.004 we'll have to quote the field name.)
+to perl version 5.004 we'll have to quote the field name.)
sub new {
my $proto = shift;
@@ -1087,10 +1087,10 @@ base class? That way you could give every object common methods without
having to go and add it to each and every @ISA. Well, it turns out that
you can. You don't see it, but Perl tacitly and irrevocably assumes
that there's an extra element at the end of @ISA: the class UNIVERSAL.
-In 5.003, there were no predefined methods there, but you could put
+In version 5.003, there were no predefined methods there, but you could put
whatever you felt like into it.
-However, as of 5.004 (or some subversive releases, like 5.003_08),
+However, as of version 5.004 (or some subversive releases, like 5.003_08),
UNIVERSAL has some methods in it already. These are built-in to your Perl
binary, so they don't take any extra time to load. Predefined methods
include isa(), can(), and VERSION(). isa() tells you whether an object or
@@ -1196,7 +1196,7 @@ replace the variables above like $AGE with literal numbers, like 1.
A bigger difference between the two approaches can be found in memory use.
A hash representation takes up more memory than an array representation
because you have to allocation memory for the keys as well as the values.
-However, it really isn't that bad, especially since as of 5.004,
+However, it really isn't that bad, especially since as of version 5.004,
memory is only allocated once for a given hash key, no matter how many
hashes have that key. It's expected that sometime in the future, even
these differences will fade into obscurity as more efficient underlying
diff --git a/pod/perltrap.pod b/pod/perltrap.pod
index 391c98b129..4b56dd23d8 100644
--- a/pod/perltrap.pod
+++ b/pod/perltrap.pod
@@ -654,7 +654,8 @@ Formatted output and significant digits
This specific item has been deleted. It demonstrated how the auto-increment
operator would not catch when a number went over the signed int limit. Fixed
-in 5.003_04. But always be wary when using large integers. If in doubt:
+in version 5.003_04. But always be wary when using large integers.
+If in doubt:
use Math::BigInt;
@@ -663,10 +664,10 @@ in 5.003_04. But always be wary when using large integers. If in doubt:
Assignment of return values from numeric equality tests
does not work in perl5 when the test evaluates to false (0).
Logical tests now return an null, instead of 0
-
+
$p = ($test == 1);
print $p,"\n";
-
+
# perl4 prints: 0
# perl5 prints:
@@ -934,7 +935,7 @@ of assignment. Perl 4 mistakenly gave them the precedence of the associated
operator. So you now must parenthesize them in expressions like
/foo/ ? ($a += 2) : ($a -= 2);
-
+
Otherwise
/foo/ ? $a += 2 : $a -= 2
@@ -1107,6 +1108,26 @@ repeatedly, like C</x/> or C<m!x!>.
# perl5 prints: perl5
+=item * Regular Expression
+
+Under perl4 and upto version 5.003, a failed C<m//g> match used to
+reset the internal iterator, so that subsequent C<m//g> match attempts
+began from the beginning of the string. In perl version 5.004 and later,
+failed C<m//g> matches do not reset the iterator position (which can be
+found using the C<pos()> function--see L<perlfunc/pos>).
+
+ $test = "foop";
+ for (1..3) {
+ print $1 while ($test =~ /(o)/g);
+ # pos $test = 0; # to get old behavior
+ }
+
+ # perl4 prints: oooooo
+ # perl5.004 prints: oo
+
+You may always reset the iterator yourself as shown in the commented line
+to get the old behavior.
+
=back
=head2 Subroutine, Signal, Sorting Traps
@@ -1164,7 +1185,7 @@ within the signal handler function, each time a signal was handled with
perl4. With perl5, the reset is now done correctly. Any code relying
on the handler _not_ being reset will have to be reworked.
-5.002 and beyond uses sigaction() under SysV
+Since version 5.002, Perl uses sigaction() under SysV.
sub gotit {
print "Got @_... ";
diff --git a/pod/perlvar.pod b/pod/perlvar.pod
index a049e9d5a1..de9bd22348 100644
--- a/pod/perlvar.pod
+++ b/pod/perlvar.pod
@@ -698,6 +698,22 @@ sometimes it's a string representing the function, and sometimes it's
going to call the subroutine call right then and there! Best to be sure
and quote it or take a reference to it. *Plumber works too. See L<perlsub>.
+If your system has the sigaction() function then signal handlers are
+installed using it. This means you get reliable signal handling. If
+your system has the SA_RESTART flag it is used when signals handlers are
+installed. This means that system calls for which it is supported
+continue rather than returning when a signal arrives. If you want your
+system calls to be interrupted by signal delivery then do something like
+this:
+
+ use POSIX ':signal_h';
+
+ my $alarm = 0;
+ sigaction SIGALRM, new POSIX::SigAction sub { $alarm = 1 }
+ or die "Error setting SIGALRM handler: $!\n";
+
+See L<POSIX>.
+
Certain internal hooks can be also set using the %SIG hash. The
routine indicated by C<$SIG{__WARN__}> is called when a warning message is
about to be printed. The warning message is passed as the first
diff --git a/pod/perlxs.pod b/pod/perlxs.pod
index cc83c8b843..26418b51a9 100644
--- a/pod/perlxs.pod
+++ b/pod/perlxs.pod
@@ -953,7 +953,7 @@ example.
# char* having the name of the package for the blessing.
O_OBJECT
sv_setref_pv( $arg, CLASS, (void*)$var );
-
+
INPUT
O_OBJECT
if( sv_isobject($arg) && (SvTYPE(SvRV($arg)) == SVt_PVMG) )
diff --git a/pod/perlxstut.pod b/pod/perlxstut.pod
index 7371cb677d..0ad1b1038d 100644
--- a/pod/perlxstut.pod
+++ b/pod/perlxstut.pod
@@ -25,21 +25,21 @@ features were added to Perl 5.
=item *
-In versions of 5.002 prior to the gamma version, the test script in Example
-1 will not function properly. You need to change the "use lib" line to
-read:
+In versions of Perl 5.002 prior to the gamma version, the test script
+in Example 1 will not function properly. You need to change the "use
+lib" line to read:
use lib './blib';
=item *
-In versions of 5.002 prior to version beta 3, the line in the .xs file
+In versions of Perl 5.002 prior to version beta 3, the line in the .xs file
about "PROTOTYPES: DISABLE" will cause a compiler error. Simply remove that
line from the file.
=item *
-In versions of 5.002 prior to version 5.002b1h, the test.pl file was not
+In versions of Perl 5.002 prior to version 5.002b1h, the test.pl file was not
automatically created by h2xs. This means that you cannot say "make test"
to run the test script. You will need to add the following line before the
"use extension" statement:
@@ -490,12 +490,13 @@ And finally create a file Makefile.PL that looks like this:
use ExtUtils::MakeMaker;
$Verbose = 1;
WriteMakefile(
- 'NAME' => 'Mytest2::mylib',
- 'clean' => {'FILES' => 'libmylib$(LIB_EXT)'},
+ NAME => 'Mytest2::mylib',
+ SKIP => [qw(all static static_lib dynamic dynamic_lib)],
+ clean => {'FILES' => 'libmylib$(LIB_EXT)'},
);
- sub MY::postamble {
+ sub MY::top_targets {
'
all :: static
@@ -533,7 +534,8 @@ and a new replacement subroutine too:
}
(Note: Most makes will require that there be a tab character that indents
-the line "cd mylib && $(MAKE)".)
+the line "cd mylib && $(MAKE)", similarly for the Makefile in the
+subdirectory.)
Let's also fix the MANIFEST file so that it accurately reflects the contents
of our extension. The single line that says "mylib" should be replaced by
diff --git a/pod/pod2html.PL b/pod/pod2html.PL
index cc21b0703f..816fb6ba4c 100644
--- a/pod/pod2html.PL
+++ b/pod/pod2html.PL
@@ -12,10 +12,8 @@ use File::Basename qw(&basename &dirname);
# This forces PL files to create target in same directory as PL file.
# This is so that make depend always knows where to find PL derivatives.
-chdir(dirname($0));
-($file = basename($0)) =~ s/\.PL$//;
-$file =~ s/\.pl$//
- if ($^O eq 'VMS' or $^O eq 'os2'); # "case-forgiving"
+chdir dirname($0);
+$file = basename($0, '.PL');
open OUT,">$file" or die "Can't create $file: $!";
@@ -119,8 +117,9 @@ for $count (0,1) {
open(HTML,">$html") || die "can't create $html: $ERRNO";
print HTML '<!-- $Id$ -->',"\n",'<HTML><HEAD>',"\n";
print HTML "<CENTER>" unless $NO_NS;
- print HTML "<TITLE>$pod</TITLE>\n</HEAD>\n<BODY>";
+ print HTML "<TITLE>$pod</TITLE>";
print HTML "</CENTER>" unless $NO_NS;
+ print HTML "\n</HEAD>\n<BODY>";
}
for ($i = 0; $i <= $#all; $i++) { # decide what to do with each chunk
$all[$i] =~ /^(\w+)\s*(.*)\n?([^\0]*)$/ ;
@@ -380,7 +379,7 @@ sub picrefs {
}
}
if (length($key)) {
- ($pod2,$num) = split(/_/,$value,2);
+ ($pod2, $num) = $value =~ /^(.*)_(\S+_\d+)$/;
if ($htype eq "NAME") {
return "\n<A NAME=\"".$value."\">\n$bigkey</A>\n"
}
diff --git a/pod/pod2latex.PL b/pod/pod2latex.PL
index 4f79c1297f..9702614ffa 100644
--- a/pod/pod2latex.PL
+++ b/pod/pod2latex.PL
@@ -12,10 +12,8 @@ use File::Basename qw(&basename &dirname);
# This forces PL files to create target in same directory as PL file.
# This is so that make depend always knows where to find PL derivatives.
-chdir(dirname($0));
-($file = basename($0)) =~ s/\.PL$//;
-$file =~ s/\.pl$//
- if ($^O eq 'VMS' or $^O eq 'os2'); # "case-forgiving"
+chdir dirname($0);
+$file = basename($0, '.PL');
open OUT,">$file" or die "Can't create $file: $!";
diff --git a/pod/pod2man.PL b/pod/pod2man.PL
index 6821d84334..5d1e193a34 100644
--- a/pod/pod2man.PL
+++ b/pod/pod2man.PL
@@ -12,10 +12,8 @@ use File::Basename qw(&basename &dirname);
# This forces PL files to create target in same directory as PL file.
# This is so that make depend always knows where to find PL derivatives.
-chdir(dirname($0));
-($file = basename($0)) =~ s/\.PL$//;
-$file =~ s/\.pl$//
- if ($^O eq 'VMS' or $^O eq 'os2' or $^O eq 'amigaos'); # "case-forgiving"
+chdir dirname($0);
+$file = basename($0, '.PL');
open OUT,">$file" or die "Can't create $file: $!";
diff --git a/pod/pod2text.PL b/pod/pod2text.PL
index 033a0d8f55..586da04e0f 100644
--- a/pod/pod2text.PL
+++ b/pod/pod2text.PL
@@ -12,10 +12,8 @@ use File::Basename qw(&basename &dirname);
# This forces PL files to create target in same directory as PL file.
# This is so that make depend always knows where to find PL derivatives.
-chdir(dirname($0));
-($file = basename($0)) =~ s/\.PL$//;
-$file =~ s/\.pl$//
- if ($^O eq 'VMS' or $^O eq 'os2'); # "case-forgiving"
+chdir dirname($0);
+$file = basename($0, '.PL');
open OUT,">$file" or die "Can't create $file: $!";
diff --git a/pod/roffitall b/pod/roffitall
index 3df9386103..6bf47afad4 100644..100755
--- a/pod/roffitall
+++ b/pod/roffitall
@@ -1,86 +1,171 @@
#!/bin/sh
-#psroff -t -man -rC1 -rD1 -rF1 > /tmp/PerlDoc.ps 2>/tmp/PerlTOC.raw \
-nroff -man -rC1 -rD1 -rF1 > /tmp/PerlDoc.txt 2>/tmp/PerlTOC.nr.raw \
- /usr/local/man/man1/perl.1 \
- /usr/local/man/man1/perlnews.1 \
- /usr/local/man/man1/perldata.1 \
- /usr/local/man/man1/perlsyn.1 \
- /usr/local/man/man1/perlop.1 \
- /usr/local/man/man1/perlre.1 \
- /usr/local/man/man1/perlrun.1 \
- /usr/local/man/man1/perllocale.1 \
- /usr/local/man/man1/perlfunc.1 \
- /usr/local/man/man1/perlvar.1 \
- /usr/local/man/man1/perlsub.1 \
- /usr/local/man/man1/perlmod.1 \
- /usr/local/man/man1/perlref.1 \
- /usr/local/man/man1/perldsc.1 \
- /usr/local/man/man1/perllol.1 \
- /usr/local/man/man1/perlobj.1 \
- /usr/local/man/man1/perltie.1 \
- /usr/local/man/man1/perlbot.1 \
- /usr/local/man/man1/perldebug.1 \
- /usr/local/man/man1/perldiag.1 \
- /usr/local/man/man1/perlform.1 \
- /usr/local/man/man1/perlipc.1 \
- /usr/local/man/man1/perlsec.1 \
- /usr/local/man/man1/perltrap.1 \
- /usr/local/man/man1/perlstyle.1 \
- /usr/local/man/man1/perlxs.1 \
- /usr/local/man/man1/perlxstut.1 \
- /usr/local/man/man1/perlguts.1 \
- /usr/local/man/man1/perlcall.1 \
- /usr/local/man/man1/perlembed.1 \
- /usr/local/man/man1/perlpod.1 \
- /usr/local/man/man1/perlbook.1 \
+#
+# Usage: roffitall [-nroff|-psroff|-groff]
+#
+# Authors: Tom Christiansen, Raphael Manfredi
+
+me=roffitall
+tmp=.
+
+#manroot=/usr/local
+#libroot=/usr/local
+
+manroot=$HOME/usr
+libroot=$HOME/usr/lib/perl5
+
+case "$1" in
+-nroff) cmd="nroff -man"; ext='txt';;
+-psroff) cmd="psroff -t"; ext='ps';;
+-groff) cmd="groff -man"; ext='ps';;
+*)
+ echo "Usage: roffitall [-nroff|-psroff|-groff]" >&2
+ exit 1
+ ;;
+esac
+
+toroff=`
+ echo \
+ $manroot/man/man1/perl.1 \
+ $manroot/man/man1/perlnews.1 \
+ $manroot/man/man1/perldata.1 \
+ $manroot/man/man1/perlsyn.1 \
+ $manroot/man/man1/perlop.1 \
+ $manroot/man/man1/perlre.1 \
+ $manroot/man/man1/perlrun.1 \
+ $manroot/man/man1/perllocale.1 \
+ $manroot/man/man1/perlfunc.1 \
+ $manroot/man/man1/perlvar.1 \
+ $manroot/man/man1/perlsub.1 \
+ $manroot/man/man1/perlmod.1 \
+ $manroot/man/man1/perlref.1 \
+ $manroot/man/man1/perldsc.1 \
+ $manroot/man/man1/perllol.1 \
+ $manroot/man/man1/perlobj.1 \
+ $manroot/man/man1/perltie.1 \
+ $manroot/man/man1/perlbot.1 \
+ $manroot/man/man1/perldebug.1 \
+ $manroot/man/man1/perldiag.1 \
+ $manroot/man/man1/perlform.1 \
+ $manroot/man/man1/perlipc.1 \
+ $manroot/man/man1/perlsec.1 \
+ $manroot/man/man1/perltrap.1 \
+ $manroot/man/man1/perlstyle.1 \
+ $manroot/man/man1/perlapio.1 \
+ $manroot/man/man1/perlxs.1 \
+ $manroot/man/man1/perlxstut.1 \
+ $manroot/man/man1/perlguts.1 \
+ $manroot/man/man1/perlcall.1 \
+ $manroot/man/man1/perlembed.1 \
+ $manroot/man/man1/perlpod.1 \
+ $manroot/man/man1/perlbook.1 \
\
- /usr/local/man/man3/diagnostics.3 \
- /usr/local/man/man3/integer.3 \
- /usr/local/man/man3/less.3 \
- /usr/local/man/man3/lib.3 \
- /usr/local/man/man3/overload.3 \
- /usr/local/man/man3/sigtrap.3 \
- /usr/local/man/man3/strict.3 \
- /usr/local/man/man3/subs.3 \
+ $libroot/man/man3/blib.3 \
+ $libroot/man/man3/diagnostics.3 \
+ $libroot/man/man3/integer.3 \
+ $libroot/man/man3/less.3 \
+ $libroot/man/man3/lib.3 \
+ $libroot/man/man3/localle.3 \
+ $libroot/man/man3/overload.3 \
+ $libroot/man/man3/sigtrap.3 \
+ $libroot/man/man3/strict.3 \
+ $libroot/man/man3/subs.3 \
+ $libroot/man/man3/vars.3 \
\
- /usr/local/man/man3/AnyDBM_File.3 \
- /usr/local/man/man3/AutoLoader.3 \
- /usr/local/man/man3/AutoSplit.3 \
- /usr/local/man/man3/Benchmark.3 \
- /usr/local/man/man3/Carp.3 \
- /usr/local/man/man3/Config.3 \
- /usr/local/man/man3/Cwd.3 \
- /usr/local/man/man3/DB_File.3 \
- /usr/local/man/man3/Devel::SelfStubber.3 \
- /usr/local/man/man3/DynaLoader.3 \
- /usr/local/man/man3/English.3 \
- /usr/local/man/man3/Env.3 \
- /usr/local/man/man3/Exporter.3 \
- /usr/local/man/man3/ExtUtils::Liblist.3 \
- /usr/local/man/man3/ExtUtils::MakeMaker.3 \
- /usr/local/man/man3/ExtUtils::Manifest.3 \
- /usr/local/man/man3/ExtUtils::Mkbootstrap.3 \
- /usr/local/man/man3/Fcntl.3 \
- /usr/local/man/man3/File::Basename.3 \
- /usr/local/man/man3/File::CheckTree.3 \
- /usr/local/man/man3/File::Find.3 \
- /usr/local/man/man3/FileHandle.3 \
- /usr/local/man/man3/File::Path.3 \
- /usr/local/man/man3/Getopt::Long.3 \
- /usr/local/man/man3/Getopt::Std.3 \
- /usr/local/man/man3/I18N::Collate.3 \
- /usr/local/man/man3/IPC::Open2.3 \
- /usr/local/man/man3/IPC::Open3.3 \
- /usr/local/man/man3/Net::Ping.3 \
- /usr/local/man/man3/POSIX.3 \
- /usr/local/man/man3/Safe.3 \
- /usr/local/man/man3/SelfLoader.3 \
- /usr/local/man/man3/Socket.3 \
- /usr/local/man/man3/Sys::Hostname.3 \
- /usr/local/man/man3/Term::Cap.3 \
- /usr/local/man/man3/Term::Complete.3 \
- /usr/local/man/man3/Test::Harness.3 \
- /usr/local/man/man3/Text::Abbrev.3 \
- /usr/local/man/man3/Text::Soundex.3 \
- /usr/local/man/man3/TieHash.3 \
- /usr/local/man/man3/Time::Local.3
+ $libroot/man/man3/AnyDBM_File.3 \
+ $libroot/man/man3/AutoLoader.3 \
+ $libroot/man/man3/AutoSplit.3 \
+ $libroot/man/man3/Benchmark.3 \
+ $libroot/man/man3/Carp.3 \
+ $libroot/man/man3/Config.3 \
+ $libroot/man/man3/Cwd.3 \
+ $libroot/man/man3/DB_File.3 \
+ $libroot/man/man3/Devel::SelfStubber.3 \
+ $libroot/man/man3/DynaLoader.3 \
+ $libroot/man/man3/English.3 \
+ $libroot/man/man3/Env.3 \
+ $libroot/man/man3/Exporter.3 \
+ $libroot/man/man3/ExtUtils::Embed.3 \
+ $libroot/man/man3/ExtUtils::Install.3 \
+ $libroot/man/man3/ExtUtils::Liblist.3 \
+ $libroot/man/man3/ExtUtils::MakeMaker.3 \
+ $libroot/man/man3/ExtUtils::Manifest.3 \
+ $libroot/man/man3/ExtUtils::Mkbootstrap.3 \
+ $libroot/man/man3/ExtUtils::Mksymlists.3 \
+ $libroot/man/man3/Fatal.3 \
+ $libroot/man/man3/Fcntl.3 \
+ $libroot/man/man3/File::Basename.3 \
+ $libroot/man/man3/File::CheckTree.3 \
+ $libroot/man/man3/File::Copy.3 \
+ $libroot/man/man3/File::Compare.3 \
+ $libroot/man/man3/File::Find.3 \
+ $libroot/man/man3/File::Path.3 \
+ $libroot/man/man3/File::stat.3 \
+ $libroot/man/man3/FileCache.3 \
+ $libroot/man/man3/FileHandle.3 \
+ $libroot/man/man3/FindBin.3 \
+ $libroot/man/man3/Getopt::Long.3 \
+ $libroot/man/man3/Getopt::Std.3 \
+ $libroot/man/man3/I18N::Collate.3 \
+ $libroot/man/man3/IO.3 \
+ $libroot/man/man3/IO::File.3 \
+ $libroot/man/man3/IO::Handle.3 \
+ $libroot/man/man3/IO::Pipe.3 \
+ $libroot/man/man3/IO::Seekable.3 \
+ $libroot/man/man3/IO::Select.3 \
+ $libroot/man/man3/IO::Socket.3 \
+ $libroot/man/man3/IPC::Open2.3 \
+ $libroot/man/man3/IPC::Open3.3 \
+ $libroot/man/man3/Math::BigFloat.3 \
+ $libroot/man/man3/Math::BigInt.3 \
+ $libroot/man/man3/Math::Complex.3 \
+ $libroot/man/man3/Net::Ping.3 \
+ $libroot/man/man3/Net::hostent.3 \
+ $libroot/man/man3/Net::netent.3 \
+ $libroot/man/man3/Net::protoent.3 \
+ $libroot/man/man3/Net::servent.3 \
+ $libroot/man/man3/Opcode.3 \
+ $libroot/man/man3/POSIX.3 \
+ $libroot/man/man3/Pod::Text.3 \
+ $libroot/man/man3/Safe.3 \
+ $libroot/man/man3/Search::Dict.3 \
+ $libroot/man/man3/SelectSaver.3 \
+ $libroot/man/man3/SelfLoader.3 \
+ $libroot/man/man3/Shell.3 \
+ $libroot/man/man3/Socket.3 \
+ $libroot/man/man3/Symbol.3 \
+ $libroot/man/man3/Sys::Hostname.3 \
+ $libroot/man/man3/Sys::Syslog.3 \
+ $libroot/man/man3/Term::Cap.3 \
+ $libroot/man/man3/Term::Complete.3 \
+ $libroot/man/man3/Test::Harness.3 \
+ $libroot/man/man3/Text::Abbrev.3 \
+ $libroot/man/man3/Text::ParseWords.3 \
+ $libroot/man/man3/Text::Soundex.3 \
+ $libroot/man/man3/Text::Tabs.3 \
+ $libroot/man/man3/Tie::Hash.3 \
+ $libroot/man/man3/Tie::RefHash.3 \
+ $libroot/man/man3/Tie::Scalar.3 \
+ $libroot/man/man3/Tie::SubstrHash.3 \
+ $libroot/man/man3/Time::Local.3 \
+ $libroot/man/man3/Time::gmtime.3 \
+ $libroot/man/man3/Time::localtime.3 \
+ $libroot/man/man3/Time::tm.3 \
+ $libroot/man/man3/UNIVERSAL.3 \
+ $libroot/man/man3/User::grent.3 \
+ $libroot/man/man3/User::pwent.3 | \
+perl -ne 'map { -r && print "$_ " } split'`
+
+#psroff -t -man -rC1 -rD1 -rF1 > $tmp/PerlDoc.ps 2>$tmp/PerlTOC.raw
+#nroff -man -rC1 -rD1 -rF1 > $tmp/PerlDoc.txt 2>$tmp/PerlTOC.nr.raw
+
+run="$cmd -rC1 -rD1 -rF1 >$tmp/PerlDoc.$ext 2>$tmp/PerlTOC.$ext.raw"
+echo "$me: running $run"
+eval $run $toroff
+echo "$me: parsing TOC"
+./rofftoc $tmp/PerlTOC.$ext.raw > $tmp/PerlTOC.tmp.man
+run="$cmd $tmp/PerlTOC.tmp.man >$tmp/PerlTOC.$ext"
+echo "$me: running $run"
+eval $run
+rm -f $tmp/PerlTOC.tmp.man $tmp/PerlTOC.$ext.raw
+echo "$me: leaving you with $tmp/PerlDoc.$ext and $tmp/PerlTOC.$ext"
+
diff --git a/pod/rofftoc b/pod/rofftoc
new file mode 100755
index 0000000000..a2d0e7ba20
--- /dev/null
+++ b/pod/rofftoc
@@ -0,0 +1,66 @@
+# feed this into perl
+ eval 'exec perl -S $0 ${1+"$@"}'
+ if $running_under_some_shell;
+
+# Usage: rofftoc PerlTOC.xxx.raw
+#
+# Post-processes roffitall output. Called from roffitall to produce
+# a formatted table of contents.
+#
+# Author: Tom Christiansen
+
+print <<'EOF';
+.de NP
+'.sp 0.8i
+.tl ''- % -''
+'bp
+'sp 0.5i
+.tl ''\fB\s+2Perl Table of Contents\s0\fR''
+'sp 0.3i
+..
+.wh -1i NP
+.af % i
+.sp 0.5i
+.tl ''\fB\s+5Perl Table of Contents\s0\fR''
+.sp 0.5i
+.nf
+.na
+EOF
+while (<>) {
+ #chomp;
+ s/Index://;
+ ($type, $page, $desc) = split ' ', $_, 3;
+ $desc =~ s/^"(.*)"$/$1/;
+ if ($type eq 'Title') {
+ ($name = $desc) =~ s/ .*//;
+ next;
+ } elsif ($type eq 'Name') {
+ #print STDERR $page, "\t", $desc;
+ print ".ne 5\n";
+ print ".in 0\n";
+ print ".sp\n";
+ print ".ft B\n";
+ print "$desc\n";
+ print ".ft P\n";
+ print ".in 5n\n";
+ } elsif ($type eq 'Header') {
+ print ".br\n", $page, "\t", $desc;
+ } elsif ($type eq 'Subsection') {
+ print ".br\n", $page, "\t\t", $desc;
+ } elsif ($type eq 'Item') {
+ next if $desc =~ /\\bu/;
+ next unless $name =~ /POSIX|func/i;
+ print ".br\n", $page, "\t\t\t", $desc;
+ }
+}
+__END__
+Index:Title 1 "PERL 1"
+Index:Name 1 "perl - Practical Extraction and Report Language"
+Index:Header 1 "NAME"
+Index:Header 1 "SYNOPSIS"
+Index:Header 2 "DESCRIPTION"
+Index:Item 2 "\(bu Many usability enhancements"
+Index:Item 2 "\(bu Simplified grammar"
+Index:Item 2 "\(bu Lexical scoping"
+Index:Item 2 "\(bu Arbitrarily nested data structures"
+Index:Item 2 "\(bu Modularity and reusability"
diff --git a/pp.c b/pp.c
index db4276e5a1..f5c2225f91 100644
--- a/pp.c
+++ b/pp.c
@@ -544,13 +544,11 @@ PP(pp_undef)
break;
case SVt_PVCV:
cv_undef((CV*)sv);
- sub_generation++;
break;
case SVt_PVGV:
- if (SvFAKE(sv)) {
- sv_setsv(sv, &sv_undef);
- break;
- }
+ if (SvFAKE(sv))
+ sv_setsv(sv, &sv_undef);
+ break;
default:
if (SvPOK(sv) && SvLEN(sv)) {
(void)SvOOK_off(sv);
@@ -568,6 +566,8 @@ PP(pp_undef)
PP(pp_predec)
{
dSP;
+ if (SvREADONLY(TOPs))
+ croak(no_modify);
if (SvIOK(TOPs) && !SvNOK(TOPs) && !SvPOK(TOPs) &&
SvIVX(TOPs) != IV_MIN)
{
@@ -583,6 +583,8 @@ PP(pp_predec)
PP(pp_postinc)
{
dSP; dTARGET;
+ if (SvREADONLY(TOPs))
+ croak(no_modify);
sv_setsv(TARG, TOPs);
if (SvIOK(TOPs) && !SvNOK(TOPs) && !SvPOK(TOPs) &&
SvIVX(TOPs) != IV_MAX)
@@ -602,6 +604,8 @@ PP(pp_postinc)
PP(pp_postdec)
{
dSP; dTARGET;
+ if(SvREADONLY(TOPs))
+ croak(no_modify);
sv_setsv(TARG, TOPs);
if (SvIOK(TOPs) && !SvNOK(TOPs) && !SvPOK(TOPs) &&
SvIVX(TOPs) != IV_MIN)
@@ -622,7 +626,7 @@ PP(pp_pow)
{
dSP; dATARGET; tryAMAGICbin(pow,opASSIGN);
{
- dPOPTOPnnrl_ul;
+ dPOPTOPnnrl;
SETn( pow( left, right) );
RETURN;
}
@@ -632,7 +636,7 @@ PP(pp_multiply)
{
dSP; dATARGET; tryAMAGICbin(mult,opASSIGN);
{
- dPOPTOPnnrl_ul;
+ dPOPTOPnnrl;
SETn( left * right );
RETURN;
}
@@ -642,7 +646,7 @@ PP(pp_divide)
{
dSP; dATARGET; tryAMAGICbin(div,opASSIGN);
{
- dPOPPOPnnrl_ul;
+ dPOPPOPnnrl;
double value;
if (right == 0.0)
DIE("Illegal division by zero");
@@ -684,7 +688,7 @@ PP(pp_modulo)
SETi( left % right );
}
else {
- register double left = USE_LEFT(TOPs) ? SvNV(TOPs) : 0.0;
+ register double left = TOPn;
if (left < 0.0)
SETu( (right - (U_V(-left) - 1) % right) - 1 );
else
@@ -731,23 +735,19 @@ PP(pp_repeat)
if (SvROK(tmpstr))
sv_unref(tmpstr);
}
- if (USE_LEFT(tmpstr) || SvTYPE(tmpstr) > SVt_PVMG) {
- SvSetSV(TARG, tmpstr);
- SvPV_force(TARG, len);
- if (count != 1) {
- if (count < 1)
- SvCUR_set(TARG, 0);
- else {
- SvGROW(TARG, (count * len) + 1);
- repeatcpy(SvPVX(TARG) + len, SvPVX(TARG), len, count - 1);
- SvCUR(TARG) *= count;
- }
- *SvEND(TARG) = '\0';
+ SvSetSV(TARG, tmpstr);
+ SvPV_force(TARG, len);
+ if (count != 1) {
+ if (count < 1)
+ SvCUR_set(TARG, 0);
+ else {
+ SvGROW(TARG, (count * len) + 1);
+ repeatcpy(SvPVX(TARG) + len, SvPVX(TARG), len, count - 1);
+ SvCUR(TARG) *= count;
}
- (void)SvPOK_only(TARG);
+ *SvEND(TARG) = '\0';
}
- else
- sv_setsv(TARG, &sv_no);
+ (void)SvPOK_only(TARG);
PUSHTARG;
}
RETURN;
@@ -855,12 +855,16 @@ PP(pp_ncmp)
dPOPTOPnnrl;
I32 value;
- if (left > right)
- value = 1;
- else if (left < right)
+ if (left < right)
value = -1;
- else
+ else if (left == right)
value = 0;
+ else if (left > right)
+ value = 1;
+ else {
+ SETs(&sv_undef);
+ RETURN;
+ }
SETi(value);
RETURN;
}
@@ -981,11 +985,11 @@ PP(pp_bit_xor)
dPOPTOPssrl;
if (SvNIOKp(left) || SvNIOKp(right)) {
if (op->op_private & HINT_INTEGER) {
- IBW value = SvIV(left) ^ SvIV(right);
+ IBW value = (USE_LEFT(left) ? SvIV(left) : 0) ^ SvIV(right);
SETi( value );
}
else {
- UBW value = SvUV(left) ^ SvUV(right);
+ UBW value = (USE_LEFT(left) ? SvUV(left) : 0) ^ SvUV(right);
SETu( value );
}
}
@@ -1004,11 +1008,11 @@ PP(pp_bit_or)
dPOPTOPssrl;
if (SvNIOKp(left) || SvNIOKp(right)) {
if (op->op_private & HINT_INTEGER) {
- IBW value = SvIV(left) | SvIV(right);
+ IBW value = (USE_LEFT(left) ? SvIV(left) : 0) | SvIV(right);
SETi( value );
}
else {
- UBW value = SvUV(left) | SvUV(right);
+ UBW value = (USE_LEFT(left) ? SvUV(left) : 0) | SvUV(right);
SETu( value );
}
}
@@ -2114,10 +2118,11 @@ PP(pp_lslice)
PP(pp_anonlist)
{
- dSP; dMARK;
+ dSP; dMARK; dORIGMARK;
I32 items = SP - MARK;
- SP = MARK;
- XPUSHs((SV*)sv_2mortal((SV*)av_make(items, MARK+1)));
+ SV *av = sv_2mortal((SV*)av_make(items, MARK+1));
+ SP = ORIGMARK; /* av_make() might realloc stack_sp */
+ XPUSHs(av);
RETURN;
}
@@ -3700,7 +3705,8 @@ PP(pp_split)
STRLEN len;
register char *s = SvPV(sv, len);
char *strend = s + len;
- register PMOP *pm = (PMOP*)POPs;
+ register PMOP *pm;
+ register REGEXP *rx;
register SV *dstr;
register char *m;
I32 iters = 0;
@@ -3711,12 +3717,17 @@ PP(pp_split)
I32 realarray = 0;
I32 base;
AV *oldstack = curstack;
- register REGEXP *rx = pm->op_pmregexp;
I32 gimme = GIMME;
I32 oldsave = savestack_ix;
+#ifdef DEBUGGING
+ Copy(&LvTARGOFF(POPs), &pm, 1, PMOP*);
+#else
+ pm = (PMOP*)POPs;
+#endif
if (!pm || !s)
DIE("panic: do_split");
+ rx = pm->op_pmregexp;
TAINT_IF((pm->op_pmflags & PMf_LOCALE) &&
(pm->op_pmflags & (PMf_WHITE | PMf_SKIPWHITE)));
@@ -3796,7 +3807,7 @@ PP(pp_split)
s = m;
}
}
- else if (pm->op_pmshort) {
+ else if (pm->op_pmshort && !rx->nparens) {
i = SvCUR(pm->op_pmshort);
if (i == 1) {
i = *SvPVX(pm->op_pmshort);
diff --git a/pp_ctl.c b/pp_ctl.c
index 1350de4196..0d9a8cb309 100644
--- a/pp_ctl.c
+++ b/pp_ctl.c
@@ -1254,11 +1254,8 @@ PP(pp_enteriter)
PUSHBLOCK(cx, CXt_LOOP, SP);
PUSHLOOP(cx, svp, MARK);
- if (op->op_flags & OPf_STACKED) {
- AV* av = (AV*)POPs;
- cx->blk_loop.iterary = av;
- cx->blk_loop.iterix = -1;
- }
+ if (op->op_flags & OPf_STACKED)
+ cx->blk_loop.iterary = (AV*)SvREFCNT_inc(POPs);
else {
cx->blk_loop.iterary = curstack;
AvFILL(curstack) = sp - stack_base;
@@ -1590,6 +1587,7 @@ PP(pp_goto)
EXTEND(stack_sp, items); /* @_ could have been extended. */
Copy(AvARRAY(av), stack_sp, items, SV*);
stack_sp += items;
+ SvREFCNT_dec(GvAV(defgv));
GvAV(defgv) = cx->blk_sub.savearray;
AvREAL_off(av);
av_clear(av);
@@ -1631,8 +1629,7 @@ PP(pp_goto)
(void)SvREFCNT_inc(cv);
else { /* save temporaries on recursion? */
if (CvDEPTH(cv) == 100 && dowarn)
- warn("Deep recursion on subroutine \"%s\"",
- GvENAME(CvGV(cv)));
+ sub_crush_depth(cv);
if (CvDEPTH(cv) > AvFILL(padlist)) {
AV *newpad = newAV();
SV **oldpad = AvARRAY(svp[CvDEPTH(cv)-1]);
@@ -1682,7 +1679,7 @@ PP(pp_goto)
cx->blk_sub.savearray = GvAV(defgv);
cx->blk_sub.argarray = av;
- GvAV(defgv) = cx->blk_sub.argarray;
+ GvAV(defgv) = (AV*)SvREFCNT_inc(av);
++mark;
if (items >= AvMAX(av) + 1) {
@@ -1708,12 +1705,13 @@ PP(pp_goto)
}
}
if (perldb && curstash != debstash) {
- /* &xsub is not copying @_ */
+ /*
+ * We do not care about using sv to call CV;
+ * it's for informational purposes only.
+ */
SV *sv = GvSV(DBsub);
save_item(sv);
gv_efullname3(sv, CvGV(cv), Nullch);
- /* We do not care about using sv to call CV,
- * just for info. */
}
RETURNOP(CvSTART(cv));
}
@@ -1941,7 +1939,9 @@ int gimme;
av_store(comppadlist, 0, (SV*)comppad_name);
av_store(comppadlist, 1, (SV*)comppad);
CvPADLIST(compcv) = comppadlist;
- CvOUTSIDE(compcv) = (CV*)SvREFCNT_inc(caller);
+
+ if (saveop->op_type != OP_REQUIRE)
+ CvOUTSIDE(compcv) = (CV*)SvREFCNT_inc(caller);
SAVEFREESV(compcv);
diff --git a/pp_hot.c b/pp_hot.c
index 9633d54e88..cbc2b95d38 100644
--- a/pp_hot.c
+++ b/pp_hot.c
@@ -97,7 +97,7 @@ PP(pp_gelem)
break;
case 'C':
if (strEQ(elem, "CODE"))
- ref = (SV*)GvCV(gv);
+ ref = (SV*)GvCVu(gv);
break;
case 'F':
if (strEQ(elem, "FILEHANDLE")) /* XXX deprecate in 5.005 */
@@ -242,6 +242,8 @@ PP(pp_eq)
PP(pp_preinc)
{
dSP;
+ if (SvREADONLY(TOPs))
+ croak(no_modify);
if (SvIOK(TOPs) && !SvNOK(TOPs) && !SvPOK(TOPs) &&
SvIVX(TOPs) != IV_MAX)
{
@@ -297,7 +299,19 @@ PP(pp_join)
PP(pp_pushre)
{
dSP;
+#ifdef DEBUGGING
+ /*
+ * We ass_u_me that LvTARGOFF() comes first, and that two STRLENs
+ * will be enough to hold an OP*.
+ */
+ SV* sv = sv_newmortal();
+ sv_upgrade(sv, SVt_PVLV);
+ LvTYPE(sv) = '/';
+ Copy(&op, &LvTARGOFF(sv), 1, OP*);
+ XPUSHs(sv);
+#else
XPUSHs((SV*)op);
+#endif
RETURN;
}
@@ -725,8 +739,9 @@ PP(pp_aassign)
SP = lastrelem;
else
SP = firstrelem + (lastlelem - firstlelem);
+ lelem = firstlelem + (relem - firstrelem);
while (relem <= SP)
- *relem++ = &sv_undef;
+ *relem++ = (lelem <= lastlelem) ? *lelem++ : &sv_undef;
RETURN;
}
else {
@@ -956,7 +971,8 @@ do_readline()
perl_call_method("READLINE", GIMME);
LEAVE;
SPAGAIN;
- if (GIMME == G_SCALAR) sv_setsv(TARG, TOPs);
+ if (GIMME == G_SCALAR)
+ SvSetSV_nosteal(TARG, TOPs);
RETURN;
}
fp = Nullfp;
@@ -1683,7 +1699,6 @@ PP(pp_entersub)
register CONTEXT *cx;
I32 gimme;
bool hasargs = (op->op_flags & OPf_STACKED) != 0;
- bool may_clone = TRUE;
if (!sv)
DIE("Not a CODE reference");
@@ -1703,20 +1718,17 @@ PP(pp_entersub)
break;
}
cv = (CV*)SvRV(sv);
- if (SvTYPE(cv) == SVt_PVCV) {
- may_clone = FALSE;
+ if (SvTYPE(cv) == SVt_PVCV)
break;
- }
/* FALL THROUGH */
case SVt_PVHV:
case SVt_PVAV:
DIE("Not a CODE reference");
case SVt_PVCV:
cv = (CV*)sv;
- may_clone = FALSE;
break;
case SVt_PVGV:
- if (!(cv = GvCV((GV*)sv)))
+ if (!(cv = GvCVu((GV*)sv)))
cv = sv_2cv(sv, &stash, &gv, TRUE);
break;
}
@@ -1724,42 +1736,35 @@ PP(pp_entersub)
ENTER;
SAVETMPS;
- if (may_clone && cv && CvCLONE(cv))
- cv = (CV*)sv_2mortal((SV*)cv_clone(cv));
-
retry:
if (!cv)
DIE("Not a CODE reference");
if (!CvROOT(cv) && !CvXSUB(cv)) {
- if (gv = CvGV(cv)) {
- SV *tmpstr;
- GV *ngv;
- if (SvFAKE(cv) && GvCV(gv) != cv) { /* autoloaded stub? */
- cv = GvCV(gv);
- if (SvTYPE(sv) == SVt_PVGV) {
- SvREFCNT_dec(GvCV((GV*)sv));
- GvCV((GV*)sv) = (CV*)SvREFCNT_inc((SV*)cv);
- }
- goto retry;
- }
- tmpstr = sv_newmortal();
- gv_efullname3(tmpstr, gv, Nullch);
- ngv = gv_fetchmethod(GvESTASH(gv), "AUTOLOAD");
- if (ngv && ngv != gv && (cv = GvCV(ngv))) { /* One more chance... */
- gv = ngv;
- sv_setsv(GvSV(CvGV(cv)), tmpstr); /* Set CV's $AUTOLOAD */
- SvTAINTED_off(GvSV(CvGV(cv)));
- goto retry;
- }
- else
- DIE("Undefined subroutine &%s called",SvPVX(tmpstr));
+ GV* autogv;
+ SV* subname;
+
+ /* anonymous or undef'd function leaves us no recourse */
+ if (CvANON(cv) || !(gv = CvGV(cv)))
+ DIE("Undefined subroutine called");
+ /* autoloaded stub? */
+ if (cv != GvCV(gv)) {
+ cv = GvCV(gv);
+ goto retry;
+ }
+ /* should call AUTOLOAD now? */
+ if ((autogv = gv_autoload(GvESTASH(gv), GvNAME(gv), GvNAMELEN(gv)))) {
+ cv = GvCV(autogv);
+ goto retry;
}
- DIE("Undefined subroutine called");
+ /* sorry */
+ subname = sv_newmortal();
+ gv_efullname3(subname, gv, Nullch);
+ DIE("Undefined subroutine &%s called", SvPVX(subname));
}
gimme = GIMME;
- if ((op->op_private & OPpENTERSUB_DB)) {
+ if ((op->op_private & OPpENTERSUB_DB) && GvCV(DBsub) && !CvNODEBUG(cv)) {
SV *oldsv = sv;
sv = GvSV(DBsub);
save_item(sv);
@@ -1853,8 +1858,8 @@ PP(pp_entersub)
(void)SvREFCNT_inc(cv);
else { /* save temporaries on recursion? */
if (CvDEPTH(cv) == 100 && dowarn
- && !(perldb && cv == GvCV(DBsub)))
- warn("Deep recursion on subroutine \"%s\"",GvENAME(CvGV(cv)));
+ && !(perldb && cv == GvCV(DBsub)))
+ sub_crush_depth(cv);
if (CvDEPTH(cv) > AvFILL(padlist)) {
AV *av;
AV *newpad = newAV();
@@ -1905,7 +1910,7 @@ PP(pp_entersub)
}
cx->blk_sub.savearray = GvAV(defgv);
cx->blk_sub.argarray = av;
- GvAV(defgv) = cx->blk_sub.argarray;
+ GvAV(defgv) = (AV*)SvREFCNT_inc(av);
++MARK;
if (items > AvMAX(av) + 1) {
@@ -1934,6 +1939,19 @@ PP(pp_entersub)
}
}
+void
+sub_crush_depth(cv)
+CV* cv;
+{
+ if (CvANON(cv))
+ warn("Deep recursion on anonymous subroutine");
+ else {
+ SV* tmpstr = sv_newmortal();
+ gv_efullname3(tmpstr, CvGV(cv), Nullch);
+ warn("Deep recursion on subroutine \"%s\"", SvPVX(tmpstr));
+ }
+}
+
PP(pp_aelem)
{
dSP;
@@ -2034,7 +2052,7 @@ DIE("Can't call method \"%s\" without a package or object reference", name);
if (!gv)
DIE("Can't locate object method \"%s\" via package \"%s\"",
name, packname);
- SETs((SV*)gv);
+ SETs(isGV(gv) ? (SV*)GvCV(gv) : (SV*)gv);
RETURN;
}
*(stack_base + TOPMARK + 1) = sv_2mortal(newRV((SV*)iogv));
@@ -2053,7 +2071,7 @@ DIE("Can't call method \"%s\" without a package or object reference", name);
name, HvNAME(SvSTASH(ob)));
}
- SETs((SV*)gv);
+ SETs(isGV(gv) ? (SV*)GvCV(gv) : (SV*)gv);
RETURN;
}
diff --git a/pp_sys.c b/pp_sys.c
index 10b64d4c6e..11e11a5d48 100644
--- a/pp_sys.c
+++ b/pp_sys.c
@@ -468,7 +468,7 @@ PP(pp_tie)
methname = "TIESCALAR";
stash = gv_stashsv(mark[1], FALSE);
- if (!stash || !(gv = gv_fetchmethod(stash, methname)) || !GvCV(gv))
+ if (!stash || !(gv = gv_fetchmethod(stash, methname)))
DIE("Can't locate object method \"%s\" via package \"%s\"",
methname, SvPV(mark[1],na));
@@ -483,7 +483,7 @@ PP(pp_tie)
if (perldb && curstash != debstash)
op->op_private |= OPpENTERSUB_DB;
- XPUSHs((SV*)gv);
+ XPUSHs((SV*)GvCV(gv));
PUTBACK;
if (op = pp_entersub())
@@ -572,11 +572,11 @@ PP(pp_dbmopen)
sv = sv_mortalcopy(&sv_no);
sv_setpv(sv, "AnyDBM_File");
stash = gv_stashsv(sv, FALSE);
- if (!stash || !(gv = gv_fetchmethod(stash, "TIEHASH")) || !GvCV(gv)) {
+ if (!stash || !(gv = gv_fetchmethod(stash, "TIEHASH"))) {
PUTBACK;
perl_require_pv("AnyDBM_File.pm");
SPAGAIN;
- if (!(gv = gv_fetchmethod(stash, "TIEHASH")) || !GvCV(gv))
+ if (!(gv = gv_fetchmethod(stash, "TIEHASH")))
DIE("No dbm on this machine");
}
@@ -601,7 +601,7 @@ PP(pp_dbmopen)
else
PUSHs(sv_2mortal(newSViv(O_RDWR)));
PUSHs(right);
- PUSHs((SV*)gv);
+ PUSHs((SV*)GvCV(gv));
PUTBACK;
if (op = pp_entersub())
@@ -618,7 +618,7 @@ PP(pp_dbmopen)
PUSHs(left);
PUSHs(sv_2mortal(newSViv(O_RDONLY)));
PUSHs(right);
- PUSHs((SV*)gv);
+ PUSHs((SV*)GvCV(gv));
PUTBACK;
if (op = pp_entersub())
@@ -675,7 +675,7 @@ PP(pp_sselect)
}
#if BYTEORDER == 0x1234 || BYTEORDER == 0x12345678
-#ifdef __linux__
+#if defined(__linux__) || defined(OS2)
growsize = sizeof(fd_set);
#else
growsize = maxlen; /* little endians can use vecs directly */
@@ -889,7 +889,6 @@ PP(pp_enterwrite)
fgv = gv;
cv = GvFORM(fgv);
-
if (!cv) {
if (fgv) {
SV *tmpsv = sv_newmortal();
@@ -898,8 +897,10 @@ PP(pp_enterwrite)
}
DIE("Not a format reference");
}
- IoFLAGS(io) &= ~IOf_DIDTOP;
+ if (CvCLONE(cv))
+ cv = (CV*)sv_2mortal((SV*)cv_clone(cv));
+ IoFLAGS(io) &= ~IOf_DIDTOP;
return doform(cv,gv,op->op_next);
}
@@ -975,6 +976,8 @@ PP(pp_leavewrite)
gv_efullname3(tmpsv, fgv, Nullch);
DIE("Undefined top format \"%s\" called",SvPVX(tmpsv));
}
+ if (CvCLONE(cv))
+ cv = (CV*)sv_2mortal((SV*)cv_clone(cv));
return doform(cv,gv,op);
}
@@ -2847,12 +2850,12 @@ nope:
PP(pp_fork)
{
+#ifdef HAS_FORK
dSP; dTARGET;
int childpid;
GV *tmpgv;
EXTEND(SP, 1);
-#ifdef HAS_FORK
childpid = fork();
if (childpid < 0)
RETSETUNDEF;
@@ -2871,19 +2874,14 @@ PP(pp_fork)
PP(pp_wait)
{
+#if !defined(DOSISH) || defined(OS2)
dSP; dTARGET;
int childpid;
int argflags;
- I32 value;
- EXTEND(SP, 1);
-#ifdef HAS_WAIT
- childpid = wait(&argflags);
- if (childpid > 0)
- pidgone(childpid, argflags);
- value = (I32)childpid;
- statusvalue = FIXSTATUS(argflags);
- PUSHi(value);
+ childpid = wait4pid(-1, &argflags, 0);
+ statusvalue = (childpid > 0) ? FIXSTATUS(argflags) : -1;
+ XPUSHi(childpid);
RETURN;
#else
DIE(no_func, "Unsupported function wait");
@@ -2892,19 +2890,17 @@ PP(pp_wait)
PP(pp_waitpid)
{
+#if !defined(DOSISH) || defined(OS2)
dSP; dTARGET;
int childpid;
int optype;
int argflags;
- I32 value;
-#ifdef HAS_WAIT
optype = POPi;
childpid = TOPi;
childpid = wait4pid(childpid, &argflags, optype);
- value = (I32)childpid;
- statusvalue = FIXSTATUS(argflags);
- SETi(value);
+ statusvalue = (childpid > 0) ? FIXSTATUS(argflags) : -1;
+ SETi(childpid);
RETURN;
#else
DIE(no_func, "Unsupported function wait");
diff --git a/proto.h b/proto.h
index c762d38723..86aaf73f21 100644
--- a/proto.h
+++ b/proto.h
@@ -8,7 +8,7 @@
#endif
#ifdef OVERLOAD
SV* amagic_call _((SV* left,SV* right,int method,int dir));
-bool Gv_AMupdate _((HV* stash));
+bool Gv_AMupdate _((HV* stash));
#endif /* OVERLOAD */
OP* append_elem _((I32 optype, OP* head, OP* tail));
OP* append_list _((I32 optype, LISTOP* first, LISTOP* last));
@@ -125,6 +125,7 @@ GP* gp_ref _((GP* gp));
GV* gv_AVadd _((GV* gv));
GV* gv_HVadd _((GV* gv));
GV* gv_IOadd _((GV* gv));
+GV* gv_autoload _((HV* stash, char* name, STRLEN len));
void gv_check _((HV* stash));
void gv_efullname _((SV* sv, GV* gv));
void gv_efullname3 _((SV* sv, GV* gv, char* prefix));
@@ -138,8 +139,8 @@ void gv_init _((GV *gv, HV *stash, char *name, STRLEN len, int multi));
HV* gv_stashpv _((char* name, I32 create));
HV* gv_stashpvn _((char* name, U32 namelen, I32 create));
HV* gv_stashsv _((SV* sv, I32 create));
-void he_delayfree _((HE* hent, I32 shared));
-void he_free _((HE* hent, I32 shared));
+void he_delayfree _((HV* hv, HE* hent));
+void he_free _((HV* hv, HE* hent));
void hoistmust _((PMOP* pm));
void hv_clear _((HV* tb));
SV* hv_delete _((HV* tb, char* key, U32 klen, I32 flags));
@@ -199,7 +200,9 @@ int magic_setamagic _((SV* sv, MAGIC* mg));
int magic_setarylen _((SV* sv, MAGIC* mg));
int magic_setbm _((SV* sv, MAGIC* mg));
int magic_setdbline _((SV* sv, MAGIC* mg));
+#ifdef USE_LOCALE_COLLATE
int magic_setcollxfrm _((SV* sv, MAGIC* mg));
+#endif
int magic_setenv _((SV* sv, MAGIC* mg));
int magic_setfm _((SV* sv, MAGIC* mg));
int magic_setisa _((SV* sv, MAGIC* mg));
@@ -418,6 +421,7 @@ HEK* share_hek _((char* sv, I32 len, U32 hash));
Signal_t sighandler _((int sig));
SV** stack_grow _((SV** sp, SV**p, int n));
int start_subparse _((void));
+void sub_crush_depth _((CV* cv));
bool sv_2bool _((SV* sv));
CV* sv_2cv _((SV* sv, HV** st, GV** gvp, I32 lref));
IO* sv_2io _((SV* sv));
diff --git a/regcomp.c b/regcomp.c
index bbb7c8e444..2f3fb40b97 100644
--- a/regcomp.c
+++ b/regcomp.c
@@ -767,7 +767,8 @@ tryagain:
case '?':
case '+':
case '*':
- FAIL("?+* follows nothing in regexp");
+ case '{':
+ FAIL("?+*{} follows nothing in regexp");
break;
case '\\':
switch (*++regparse) {
diff --git a/scope.c b/scope.c
index 2fdea90ea8..33a5048cf8 100644
--- a/scope.c
+++ b/scope.c
@@ -173,14 +173,13 @@ I32 empty;
if (empty) {
register GP *gp;
Newz(602, gp, 1, GP);
- GvGP(gv) = gp;
- GvREFCNT(gv) = 1;
+ GvGP(gv) = gp_ref(gp);
GvSV(gv) = NEWSV(72,0);
GvLINE(gv) = curcop->cop_line;
GvEGV(gv) = gv;
}
else {
- GvGP(gv)->gp_refcnt++;
+ gp_ref(GvGP(gv));
GvINTRO_on(gv);
}
}
@@ -556,13 +555,15 @@ I32 base;
hv_clear((HV*)sv);
break;
case SVt_PVCV:
- sub_generation++;
- cv_undef((CV*)sv);
+ croak("panic: leave_scope pad code");
+ case SVt_RV:
+ case SVt_IV:
+ case SVt_NV:
+ (void)SvOK_off(sv);
break;
default:
- if (SvPOK(sv) && SvLEN(sv))
- (void)SvOOK_off(sv);
(void)SvOK_off(sv);
+ (void)SvOOK_off(sv);
break;
}
}
diff --git a/sv.c b/sv.c
index db34eb0cd0..32ca7daef5 100644
--- a/sv.c
+++ b/sv.c
@@ -1288,7 +1288,7 @@ register SV *sv;
switch (SvTYPE(sv)) {
case SVt_NULL:
sv_upgrade(sv, SVt_IV);
- return SvIVX(sv);
+ break;
case SVt_PV:
sv_upgrade(sv, SVt_PVIV);
break;
@@ -1357,7 +1357,7 @@ register SV *sv;
switch (SvTYPE(sv)) {
case SVt_NULL:
sv_upgrade(sv, SVt_IV);
- return SvUVX(sv);
+ break;
case SVt_PV:
sv_upgrade(sv, SVt_PVIV);
break;
@@ -1911,8 +1911,7 @@ register SV *sstr;
GvGP(dstr)->gp_refcnt--;
GvINTRO_off(dstr); /* one-shot flag */
Newz(602,gp, 1, GP);
- GvGP(dstr) = gp;
- GvREFCNT(dstr) = 1;
+ GvGP(dstr) = gp_ref(gp);
GvSV(dstr) = NEWSV(72,0);
GvLINE(dstr) = curcop->cop_line;
GvEGV(dstr) = (GV*)dstr;
@@ -1938,8 +1937,14 @@ register SV *sstr;
GvIMPORTED_HV_on(dstr);
break;
case SVt_PVCV:
- if (intro)
+ if (intro) {
+ if (GvCVGEN(dstr) && GvCV(dstr) != (CV*)sref) {
+ SvREFCNT_dec(GvCV(dstr));
+ GvCV(dstr) = Nullcv;
+ GvCVGEN(dstr) = 0;
+ }
SAVESPTR(GvCV(dstr));
+ }
else {
CV* cv = GvCV(dstr);
if (cv) {
@@ -1949,15 +1954,13 @@ register SV *sstr;
(CvROOT(cv) || CvXSUB(cv)) )
warn("Subroutine %s redefined",
GvENAME((GV*)dstr));
- if (SvREFCNT(cv) == 1)
- SvFAKE_on(cv);
}
}
- sub_generation++;
if (GvCV(dstr) != (CV*)sref) {
GvCV(dstr) = (CV*)sref;
GvCVGEN(dstr) = 0; /* Switch off cacheness. */
GvASSUMECV_on(dstr);
+ sub_generation++;
}
if (curcop->cop_stash != GvSTASH(dstr))
GvIMPORTED_CV_on(dstr);
@@ -2582,15 +2585,15 @@ register SV *sv;
assert(SvREFCNT(sv) == 0);
if (SvOBJECT(sv)) {
- dSP;
- GV* destructor;
-
if (defstash) { /* Still have a symbol table? */
- destructor = gv_fetchmethod(SvSTASH(sv), "DESTROY");
+ dSP;
+ GV* destructor;
ENTER;
SAVEFREESV(SvSTASH(sv));
- if (destructor && GvCV(destructor)) {
+
+ destructor = gv_fetchmethod(SvSTASH(sv), "DESTROY");
+ if (destructor) {
SV ref;
Zero(&ref, 1, SV);
@@ -2602,10 +2605,12 @@ register SV *sv;
PUSHMARK(SP);
PUSHs(&ref);
PUTBACK;
- perl_call_sv((SV*)destructor, G_DISCARD|G_EVAL|G_KEEPERR);
+ perl_call_sv((SV*)GvCV(destructor),
+ G_DISCARD|G_EVAL|G_KEEPERR);
del_XRV(SvANY(&ref));
SvREFCNT(sv)--;
}
+
LEAVE;
}
else
@@ -3517,16 +3522,14 @@ HV *stash;
(void)SvOK_off(sv);
if (SvTYPE(sv) >= SVt_PV) {
SvCUR_set(sv, 0);
- SvTAINT(sv);
if (SvPVX(sv) != Nullch)
*SvPVX(sv) = '\0';
+ SvTAINT(sv);
}
if (GvAV(gv)) {
av_clear(GvAV(gv));
}
- if (GvHV(gv)) {
- if (HvNAME(GvHV(gv)))
- continue;
+ if (GvHV(gv) && !HvNAME(GvHV(gv))) {
hv_clear(GvHV(gv));
#ifndef VMS /* VMS has no environ array */
if (gv == envgv)
@@ -3585,7 +3588,7 @@ I32 lref;
return Nullcv;
*st = GvESTASH(gv);
fix_gv:
- if (lref && !GvCV(gv)) {
+ if (lref && !GvCVu(gv)) {
SV *tmpsv;
ENTER;
tmpsv = NEWSV(704,0);
@@ -3595,10 +3598,10 @@ I32 lref;
Nullop,
Nullop);
LEAVE;
- if (!GvCV(gv))
+ if (!GvCVu(gv))
croak("Unable to create sub named \"%s\"", SvPV(sv,na));
}
- return GvCV(gv);
+ return GvCVu(gv);
}
}
@@ -4051,9 +4054,6 @@ SV* sv;
strcat(d, " ),");
}
}
-#ifdef OVERLOAD
- if (flags & SVpgv_AM) strcat(d, "withOVERLOAD,");
-#endif /* OVERLOAD */
}
d += strlen(d);
diff --git a/sv.h b/sv.h
index 36fa72d749..0322965b7f 100644
--- a/sv.h
+++ b/sv.h
@@ -131,11 +131,6 @@ struct io {
#define SVphv_SHAREKEYS 0x20000000 /* keys live on shared string table */
#define SVphv_LAZYDEL 0x40000000 /* entry in xhv_eiter must be deleted */
-#ifdef OVERLOAD
-#define SVpgv_AM 0x40000000
-/* #define SVpgv_badAM 0x20000000 */
-#endif /* OVERLOAD */
-
struct xrv {
SV * xrv_rv; /* pointer to another SV */
};
@@ -223,6 +218,8 @@ struct xpvbm {
U8 xbm_rare; /* rarest character in string */
};
+/* This structure much match XPVCV */
+
struct xpvfm {
char * xpv_pv; /* pointer to malloced string */
STRLEN xpv_cur; /* length of xpv_pv as a C string */
@@ -242,6 +239,8 @@ struct xpvfm {
long xcv_depth; /* >= 2 indicates recursive call */
AV * xcv_padlist;
CV * xcv_outside;
+ U8 xcv_flags;
+
I32 xfm_lines;
};
@@ -558,7 +557,15 @@ SV *newRV_noinc _((SV *));
#define SvSETMAGIC(x) if (SvSMAGICAL(x)) mg_set(x)
-#define SvSetSV(dst,src) if (dst != src) sv_setsv(dst,src)
+#define SvSetSV(dst,src) if ((dst) != (src)) sv_setsv(dst,src)
+
+#define SvSetSV_nosteal(dst,src) \
+ if ((dst) != (src)) { \
+ U32 tMpF = SvFLAGS(src) & SVs_TEMP; \
+ SvTEMP_off(src); \
+ sv_setsv(dst, src); \
+ SvFLAGS(src) |= tMpF; \
+ }
#define SvPEEK(sv) sv_peek(sv)
diff --git a/t/TEST b/t/TEST
index 0b996f42d4..96c5ab26a4 100755
--- a/t/TEST
+++ b/t/TEST
@@ -1,6 +1,6 @@
#!./perl
-# $RCSfile: TEST,v $$Revision: 4.1 $$Date: 92/08/07 18:27:00 $
+# Last change: Fri Jan 10 09:57:03 WET 1997
# This is written in a peculiar style, since we're trying to avoid
# most of the constructs we'll be testing for.
@@ -21,7 +21,7 @@ $ENV{EMXSHELL} = 'sh'; # For OS/2
if ($ARGV[0] eq '') {
@ARGV = split(/[ \n]/,
- `echo base/*.t comp/*.t cmd/*.t io/*.t; echo op/*.t lib/*.t`);
+ `echo base/*.t comp/*.t cmd/*.t io/*.t; echo op/*.t pragma/*.t lib/*.t`);
}
if ($^O eq 'os2' || $^O eq 'qnx') {
@@ -117,11 +117,17 @@ if ($bad == 0) {
} else {
$pct = sprintf("%.2f", $good / $total * 100);
if ($bad == 1) {
- warn "Failed 1 test, $pct% okay.\n";
+ warn "Failed 1 test script out of $total, $pct% okay.\n";
} else {
- die "Failed $bad/$total tests, $pct% okay.\n";
+ warn "Failed $bad test scripts out of $total, $pct% okay.\n";
}
+ warn <<'SHRDLU';
+ ### Since not all tests were successful, you may want to run some
+ ### of them individually and examine any diagnostic messages they
+ ### produce. See the INSTALL document's section on "make test".
+SHRDLU
}
($user,$sys,$cuser,$csys) = times;
-print sprintf("u=%g s=%g cu=%g cs=%g files=%d tests=%d\n",
+print sprintf("u=%g s=%g cu=%g cs=%g scripts=%d tests=%d\n",
$user,$sys,$cuser,$csys,$files,$totmax);
+exit $bad != 0;
diff --git a/t/comp/colon.t b/t/comp/colon.t
new file mode 100755
index 0000000000..2a37367d75
--- /dev/null
+++ b/t/comp/colon.t
@@ -0,0 +1,138 @@
+#!./perl
+
+#
+# Ensure that syntax using colons (:) is parsed correctly.
+# The tests are done on the following tokens (by default):
+# ABC LABEL XYZZY m q qq qw qx s tr y AUTOLOAD and alarm
+# -- Robin Barker <rmb@cise.npl.co.uk>
+#
+
+BEGIN {
+ chdir 't' if -d 't';
+ @INC = '../lib';
+}
+
+use strict;
+
+$_ = ''; # to avoid undef warning on m// etc.
+
+sub ok {
+ my($test,$ok) = @_;
+ print "not " unless $ok;
+ print "ok $test\n";
+}
+
+$SIG{__WARN__} = sub { 1; }; # avoid some spurious warnings
+
+print "1..25\n";
+
+ok 1, (eval "package ABC; sub zyx {1}; 1;" and
+ eval "ABC::zyx" and
+ not eval "ABC:: eq ABC||" and
+ not eval "ABC::: >= 0");
+
+ok 2, (eval "package LABEL; sub zyx {1}; 1;" and
+ eval "LABEL::zyx" and
+ not eval "LABEL:: eq LABEL||" and
+ not eval "LABEL::: >= 0");
+
+ok 3, (eval "package XYZZY; sub zyx {1}; 1;" and
+ eval "XYZZY::zyx" and
+ not eval "XYZZY:: eq XYZZY||" and
+ not eval "XYZZY::: >= 0");
+
+ok 4, (eval "package m; sub zyx {1}; 1;" and
+ not eval "m::zyx" and
+ eval "m:: eq m||" and
+ not eval "m::: >= 0");
+
+ok 5, (eval "package q; sub zyx {1}; 1;" and
+ not eval "q::zyx" and
+ eval "q:: eq q||" and
+ not eval "q::: >= 0");
+
+ok 6, (eval "package qq; sub zyx {1}; 1;" and
+ not eval "qq::zyx" and
+ eval "qq:: eq qq||" and
+ not eval "qq::: >= 0");
+
+ok 7, (eval "package qw; sub zyx {1}; 1;" and
+ not eval "qw::zyx" and
+ eval "qw:: eq qw||" and
+ not eval "qw::: >= 0");
+
+ok 8, (eval "package qx; sub zyx {1}; 1;" and
+ not eval "qx::zyx" and
+ eval "qx:: eq qx||" and
+ not eval "qx::: >= 0");
+
+ok 9, (eval "package s; sub zyx {1}; 1;" and
+ not eval "s::zyx" and
+ not eval "s:: eq s||" and
+ eval "s::: >= 0");
+
+ok 10, (eval "package tr; sub zyx {1}; 1;" and
+ not eval "tr::zyx" and
+ not eval "tr:: eq tr||" and
+ eval "tr::: >= 0");
+
+ok 11, (eval "package y; sub zyx {1}; 1;" and
+ not eval "y::zyx" and
+ not eval "y:: eq y||" and
+ eval "y::: >= 0");
+
+ok 12, (eval "ABC:1" and
+ not eval "ABC:echo: eq ABC|echo|" and
+ not eval "ABC:echo:ohce: >= 0");
+
+ok 13, (eval "LABEL:1" and
+ not eval "LABEL:echo: eq LABEL|echo|" and
+ not eval "LABEL:echo:ohce: >= 0");
+
+ok 14, (eval "XYZZY:1" and
+ not eval "XYZZY:echo: eq XYZZY|echo|" and
+ not eval "XYZZY:echo:ohce: >= 0");
+
+ok 15, (not eval "m:1" and
+ eval "m:echo: eq m|echo|" and
+ not eval "m:echo:ohce: >= 0");
+
+ok 16, (not eval "q:1" and
+ eval "q:echo: eq q|echo|" and
+ not eval "q:echo:ohce: >= 0");
+
+ok 17, (not eval "qq:1" and
+ eval "qq:echo: eq qq|echo|" and
+ not eval "qq:echo:ohce: >= 0");
+
+ok 18, (not eval "qw:1" and
+ eval "qw:echo: eq qw|echo|" and
+ not eval "qw:echo:ohce: >= 0");
+
+ok 19, (not eval "qx:1" and
+ eval "qx:echo: eq qx|echo|" and
+ not eval "qx:echo:ohce: >= 0");
+
+ok 20, (not eval "s:1" and
+ not eval "s:echo: eq s|echo|" and
+ eval "s:echo:ohce: >= 0");
+
+ok 21, (not eval "tr:1" and
+ not eval "tr:echo: eq tr|echo|" and
+ eval "tr:echo:ohce: >= 0");
+
+ok 22, (not eval "y:1" and
+ not eval "y:echo: eq y|echo|" and
+ eval "y:echo:ohce: >= 0");
+
+ok 23, (eval "AUTOLOAD:1" and
+ not eval "AUTOLOAD:echo: eq AUTOLOAD|echo|" and
+ not eval "AUTOLOAD:echo:ohce: >= 0");
+
+ok 24, (eval "and:1" and
+ not eval "and:echo: eq and|echo|" and
+ not eval "and:echo:ohce: >= 0");
+
+ok 25, (eval "alarm:1" and
+ not eval "alarm:echo: eq alarm|echo|" and
+ not eval "alarm:echo:ohce: >= 0");
diff --git a/t/comp/proto.t b/t/comp/proto.t
new file mode 100755
index 0000000000..197ea78272
--- /dev/null
+++ b/t/comp/proto.t
@@ -0,0 +1,377 @@
+#!./perl
+#
+# Contributed by Graham Barr <Graham.Barr@tiuk.ti.com>
+#
+# So far there are tests for the following prototypes.
+# none, () ($) ($@) ($%) ($;$) (&) (&\@) (&@) (%) (\%) (\@)
+#
+# It is impossible to test every prototype that can be specified, but
+# we should test as many as we can.
+#
+
+BEGIN {
+ chdir 't' if -d 't';
+ @INC = '../lib';
+}
+
+use strict;
+
+print "1..74\n";
+
+my $i = 1;
+
+sub testing (&$) {
+ my $p = prototype(shift);
+ my $c = shift;
+ my $what = defined $c ? '(' . $p . ')' : 'no prototype';
+ print '#' x 25,"\n";
+ print '# Testing ',$what,"\n";
+ print '#' x 25,"\n";
+ print "not "
+ if((defined($p) && defined($c) && $p ne $c)
+ || (defined($p) != defined($c)));
+ printf "ok %d\n",$i++;
+}
+
+@_ = qw(a b c d);
+my @array;
+my %hash;
+
+##
+##
+##
+
+testing \&no_proto, undef;
+
+sub no_proto {
+ print "# \@_ = (",join(",",@_),")\n";
+ scalar(@_)
+}
+
+print "not " unless 0 == no_proto();
+printf "ok %d\n",$i++;
+
+print "not " unless 1 == no_proto(5);
+printf "ok %d\n",$i++;
+
+print "not " unless 4 == &no_proto;
+printf "ok %d\n",$i++;
+
+print "not " unless 1 == no_proto +6;
+printf "ok %d\n",$i++;
+
+print "not " unless 4 == no_proto(@_);
+printf "ok %d\n",$i++;
+
+##
+##
+##
+
+
+testing \&no_args, '';
+
+sub no_args () {
+ print "# \@_ = (",join(",",@_),")\n";
+ scalar(@_)
+}
+
+print "not " unless 0 == no_args();
+printf "ok %d\n",$i++;
+
+print "not " unless 0 == no_args;
+printf "ok %d\n",$i++;
+
+print "not " unless 5 == no_args +5;
+printf "ok %d\n",$i++;
+
+print "not " unless 4 == &no_args;
+printf "ok %d\n",$i++;
+
+print "not " unless 2 == &no_args(1,2);
+printf "ok %d\n",$i++;
+
+eval "no_args(1)";
+print "not " unless $@;
+printf "ok %d\n",$i++;
+
+##
+##
+##
+
+testing \&one_args, '$';
+
+sub one_args ($) {
+ print "# \@_ = (",join(",",@_),")\n";
+ scalar(@_)
+}
+
+print "not " unless 1 == one_args(1);
+printf "ok %d\n",$i++;
+
+print "not " unless 1 == one_args +5;
+printf "ok %d\n",$i++;
+
+print "not " unless 4 == &one_args;
+printf "ok %d\n",$i++;
+
+print "not " unless 2 == &one_args(1,2);
+printf "ok %d\n",$i++;
+
+eval "one_args(1,2)";
+print "not " unless $@;
+printf "ok %d\n",$i++;
+
+eval "one_args()";
+print "not " unless $@;
+printf "ok %d\n",$i++;
+
+sub one_a_args ($) {
+ print "# \@_ = (",join(",",@_),")\n";
+ print "not " unless @_ == 1 && $_[0] == 4;
+ printf "ok %d\n",$i++;
+}
+
+one_a_args(@_);
+
+##
+##
+##
+
+testing \&over_one_args, '$@';
+
+sub over_one_args ($@) {
+ print "# \@_ = (",join(",",@_),")\n";
+ scalar(@_)
+}
+
+print "not " unless 1 == over_one_args(1);
+printf "ok %d\n",$i++;
+
+print "not " unless 2 == over_one_args(1,2);
+printf "ok %d\n",$i++;
+
+print "not " unless 1 == over_one_args +5;
+printf "ok %d\n",$i++;
+
+print "not " unless 4 == &over_one_args;
+printf "ok %d\n",$i++;
+
+print "not " unless 2 == &over_one_args(1,2);
+printf "ok %d\n",$i++;
+
+print "not " unless 5 == &over_one_args(1,@_);
+printf "ok %d\n",$i++;
+
+eval "over_one_args()";
+print "not " unless $@;
+printf "ok %d\n",$i++;
+
+sub over_one_a_args ($@) {
+ print "# \@_ = (",join(",",@_),")\n";
+ print "not " unless @_ >= 1 && $_[0] == 4;
+ printf "ok %d\n",$i++;
+}
+
+over_one_a_args(@_);
+over_one_a_args(@_,1);
+over_one_a_args(@_,1,2);
+over_one_a_args(@_,@_);
+
+##
+##
+##
+
+testing \&scalar_and_hash, '$%';
+
+sub scalar_and_hash ($%) {
+ print "# \@_ = (",join(",",@_),")\n";
+ scalar(@_)
+}
+
+print "not " unless 1 == scalar_and_hash(1);
+printf "ok %d\n",$i++;
+
+print "not " unless 3 == scalar_and_hash(1,2,3);
+printf "ok %d\n",$i++;
+
+print "not " unless 1 == scalar_and_hash +5;
+printf "ok %d\n",$i++;
+
+print "not " unless 4 == &scalar_and_hash;
+printf "ok %d\n",$i++;
+
+print "not " unless 2 == &scalar_and_hash(1,2);
+printf "ok %d\n",$i++;
+
+print "not " unless 5 == &scalar_and_hash(1,@_);
+printf "ok %d\n",$i++;
+
+eval "scalar_and_hash()";
+print "not " unless $@;
+printf "ok %d\n",$i++;
+
+sub scalar_and_hash_a ($@) {
+ print "# \@_ = (",join(",",@_),")\n";
+ print "not " unless @_ >= 1 && $_[0] == 4;
+ printf "ok %d\n",$i++;
+}
+
+scalar_and_hash_a(@_);
+scalar_and_hash_a(@_,1);
+scalar_and_hash_a(@_,1,2);
+scalar_and_hash_a(@_,@_);
+
+##
+##
+##
+
+testing \&one_or_two, '$;$';
+
+sub one_or_two ($;$) {
+ print "# \@_ = (",join(",",@_),")\n";
+ scalar(@_)
+}
+
+print "not " unless 1 == one_or_two(1);
+printf "ok %d\n",$i++;
+
+print "not " unless 2 == one_or_two(1,3);
+printf "ok %d\n",$i++;
+
+print "not " unless 1 == one_or_two +5;
+printf "ok %d\n",$i++;
+
+print "not " unless 4 == &one_or_two;
+printf "ok %d\n",$i++;
+
+print "not " unless 3 == &one_or_two(1,2,3);
+printf "ok %d\n",$i++;
+
+print "not " unless 5 == &one_or_two(1,@_);
+printf "ok %d\n",$i++;
+
+eval "one_or_two()";
+print "not " unless $@;
+printf "ok %d\n",$i++;
+
+eval "one_or_two(1,2,3)";
+print "not " unless $@;
+printf "ok %d\n",$i++;
+
+sub one_or_two_a ($;$) {
+ print "# \@_ = (",join(",",@_),")\n";
+ print "not " unless @_ >= 1 && $_[0] == 4;
+ printf "ok %d\n",$i++;
+}
+
+one_or_two_a(@_);
+one_or_two_a(@_,1);
+one_or_two_a(@_,@_);
+
+##
+##
+##
+
+testing \&a_sub, '&';
+
+sub a_sub (&) {
+ print "# \@_ = (",join(",",@_),")\n";
+ &{$_[0]};
+}
+
+sub tmp_sub_1 { printf "ok %d\n",$i++ }
+
+a_sub { printf "ok %d\n",$i++ };
+a_sub \&tmp_sub_1;
+
+@array = ( \&tmp_sub_1 );
+eval 'a_sub @array';
+print "not " unless $@;
+printf "ok %d\n",$i++;
+
+##
+##
+##
+
+testing \&sub_aref, '&\@';
+
+sub sub_aref (&\@) {
+ print "# \@_ = (",join(",",@_),")\n";
+ my($sub,$array) = @_;
+ print "not " unless @_ == 2 && @{$array} == 4;
+ print map { &{$sub}($_) } @{$array}
+}
+
+@array = (qw(O K)," ", $i++);
+sub_aref { lc shift } @array;
+print "\n";
+
+##
+##
+##
+
+testing \&sub_array, '&@';
+
+sub sub_array (&@) {
+ print "# \@_ = (",join(",",@_),")\n";
+ print "not " unless @_ == 5;
+ my $sub = shift;
+ print map { &{$sub}($_) } @_
+}
+
+@array = (qw(O K)," ", $i++);
+sub_array { lc shift } @array;
+print "\n";
+
+##
+##
+##
+
+testing \&a_hash, '%';
+
+sub a_hash (%) {
+ print "# \@_ = (",join(",",@_),")\n";
+ scalar(@_);
+}
+
+print "not " unless 1 == a_hash 'a';
+printf "ok %d\n",$i++;
+
+print "not " unless 2 == a_hash 'a','b';
+printf "ok %d\n",$i++;
+
+##
+##
+##
+
+testing \&a_hash_ref, '\%';
+
+sub a_hash_ref (\%) {
+ print "# \@_ = (",join(",",@_),")\n";
+ print "not " unless ref($_[0]) && $_[0]->{'a'};
+ printf "ok %d\n",$i++;
+ $_[0]->{'b'} = 2;
+}
+
+%hash = ( a => 1);
+a_hash_ref %hash;
+print "not " unless $hash{'b'} == 2;
+printf "ok %d\n",$i++;
+
+##
+##
+##
+
+testing \&an_array_ref, '\@';
+
+sub an_array_ref (\@) {
+ print "# \@_ = (",join(",",@_),")\n";
+ print "not " unless ref($_[0]) && 1 == @{$_[0]};
+ printf "ok %d\n",$i++;
+ @{$_[0]} = (qw(ok)," ",$i++,"\n");
+}
+
+@array = ('a');
+an_array_ref @array;
+print "not " unless @array == 4;
+print @array;
diff --git a/t/comp/redef.t b/t/comp/redef.t
index 6a73ae1c2e..ad28bfd5e2 100755
--- a/t/comp/redef.t
+++ b/t/comp/redef.t
@@ -1,9 +1,8 @@
-#!./perl
+#!./perl -w
#
# Contributed by Graham Barr <Graham.Barr@tiuk.ti.com>
BEGIN {
- $^W = 1;
$warn = "";
$SIG{__WARN__} = sub { $warn .= join("",@_) }
}
diff --git a/t/comp/use.t b/t/comp/use.t
new file mode 100755
index 0000000000..a6ce2a4d56
--- /dev/null
+++ b/t/comp/use.t
@@ -0,0 +1,101 @@
+#!./perl
+
+BEGIN {
+ chdir 't' if -d 't';
+ @INC = '../lib';
+}
+
+print "1..14\n";
+
+my $i = 1;
+
+eval "use 5.000;";
+if ($@) {
+ print STDERR $@,"\n";
+ print "not ";
+}
+print "ok ",$i++,"\n";
+
+eval sprintf "use %.5f;", $];
+if ($@) {
+ print STDERR $@,"\n";
+ print "not ";
+}
+print "ok ",$i++,"\n";
+
+
+eval sprintf "use %.5f;", $] - 0.000001;
+if ($@) {
+ print STDERR $@,"\n";
+ print "not ";
+}
+print "ok ",$i++,"\n";
+
+eval sprintf("use %.5f;", $] + 1);
+unless ($@) {
+ print "not ";
+}
+print "ok ",$i++,"\n";
+
+eval sprintf "use %.5f;", $] + 0.00001;
+unless ($@) {
+ print "not ";
+}
+print "ok ",$i++,"\n";
+
+
+
+use lib; # I know that this module will be there.
+
+
+local $lib::VERSION = 1.0;
+
+eval "use lib 0.9";
+if ($@) {
+ print STDERR $@,"\n";
+ print "not ";
+}
+print "ok ",$i++,"\n";
+
+eval "use lib 1.0";
+if ($@) {
+ print STDERR $@,"\n";
+ print "not ";
+}
+print "ok ",$i++,"\n";
+
+eval "use lib 1.01";
+unless ($@) {
+ print "not ";
+}
+print "ok ",$i++,"\n";
+
+
+eval "use lib 0.9 qw(fred)";
+if ($@) {
+ print STDERR $@,"\n";
+ print "not ";
+}
+print "ok ",$i++,"\n";
+
+print "not " unless $INC[0] eq "fred";
+print "ok ",$i++,"\n";
+
+eval "use lib 1.0 qw(joe)";
+if ($@) {
+ print STDERR $@,"\n";
+ print "not ";
+}
+print "ok ",$i++,"\n";
+
+print "not " unless $INC[0] eq "joe";
+print "ok ",$i++,"\n";
+
+eval "use lib 1.01 qw(freda)";
+unless ($@) {
+ print "not ";
+}
+print "ok ",$i++,"\n";
+
+print "not " if $INC[0] eq "freda";
+print "ok ",$i++,"\n";
diff --git a/t/harness b/t/harness
index c98d91e360..5b460f3de4 100644..100755
--- a/t/harness
+++ b/t/harness
@@ -9,6 +9,7 @@ use lib '../lib';
use Test::Harness;
$Test::Harness::switches = ""; # Too much noise otherwise
+$Test::Harness::verbose = shift if @ARGV && $ARGV[0] eq '-v';
@tests = @ARGV;
@tests = <*/*.t> unless @tests;
diff --git a/t/io/fs.t b/t/io/fs.t
index 87a3d2f6fb..dc29fda4d9 100755
--- a/t/io/fs.t
+++ b/t/io/fs.t
@@ -73,12 +73,14 @@ if ($ino == 0) {print "ok 20\n";} else {print "not ok 20\n";}
unlink 'c';
chdir $wd || die "Can't cd back to $wd";
+rmdir 'tmp';
unlink 'c';
if (`ls -l perl 2>/dev/null` =~ /^l.*->/) { # we have symbolic links
if (symlink("TEST","c")) {print "ok 21\n";} else {print "not ok 21\n";}
$foo = `grep perl c`;
if ($foo) {print "ok 22\n";} else {print "not ok 22\n";}
+ unlink 'c';
}
else {
print "ok 21\nok 22\n";
diff --git a/t/lib/basename.t b/t/lib/basename.t
index 56b1f7f211..0f8a117e4c 100755
--- a/t/lib/basename.t
+++ b/t/lib/basename.t
@@ -7,7 +7,7 @@ BEGIN {
use File::Basename qw(fileparse basename dirname);
-print "1..30\n";
+print "1..34\n";
# import correctly?
print +(defined(&basename) && !defined(&fileparse_set_fstype) ?
@@ -105,3 +105,16 @@ print +(basename(':arma:virumque:cano.trojae','.trojae') eq 'cano' ?
print +(basename(':arma:virumque:cano_trojae','.trojae') eq 'cano_trojae' ?
'' : 'not '),"ok 30\n";
+# extra tests for a few specific bugs
+
+File::Basename::fileparse_set_fstype 'MSDOS';
+# perl5.003_18 gives C:/perl/.\
+print +((fileparse 'C:/perl/lib')[1] eq 'C:/perl/' ? '' : 'not '), "ok 31\n";
+# perl5.003_18 gives C:\perl\
+print +(dirname('C:\\perl\\lib\\') eq 'C:\\perl' ? '' : 'not '), "ok 32\n";
+
+File::Basename::fileparse_set_fstype 'UNIX';
+# perl5.003_18 gives '.'
+print +(dirname('/perl/') eq '/' ? '' : 'not '), "ok 33\n";
+# perl5.003_18 gives '/perl/lib'
+print +(dirname('/perl/lib//') eq '/perl' ? '' : 'not '), "ok 34\n";
diff --git a/t/lib/db-btree.t b/t/lib/db-btree.t
index 7dea2ed5ea..0e2a7c34eb 100755
--- a/t/lib/db-btree.t
+++ b/t/lib/db-btree.t
@@ -52,10 +52,11 @@ ok(3, $dbh->{psize} == 0) ;
ok(4, $dbh->{lorder} == 0) ;
ok(5, $dbh->{minkeypage} == 0) ;
ok(6, $dbh->{maxkeypage} == 0) ;
-$^W = 0 ;
-ok(7, $dbh->{compare} == undef) ;
-ok(8, $dbh->{prefix} == undef) ;
-$^W = 1 ;
+{
+ local $^W = 0 ;
+ ok(7, $dbh->{compare} == undef) ;
+ ok(8, $dbh->{prefix} == undef) ;
+}
$dbh->{flags} = 3000 ;
ok(9, $dbh->{flags} == 3000) ;
@@ -240,10 +241,8 @@ $status = $X->del('') ;
ok(42, $status == 0 );
# Make sure that the key deleted, cannot be retrieved
-$^W = 0 ;
-ok(43, $h{'q'} eq undef) ;
-ok(44, $h{''} eq undef) ;
-$^W = 1 ;
+ok(43, ! defined $h{'q'}) ;
+ok(44, ! defined $h{''}) ;
undef $X ;
untie %h ;
@@ -430,7 +429,8 @@ $Dfile2 = "btree2" ;
$Dfile3 = "btree3" ;
$dbh1 = new DB_File::BTREEINFO ;
-$dbh1->{compare} = sub { $_[0] <=> $_[1] } ;
+{ local $^W = 0 ;
+ $dbh1->{compare} = sub { $_[0] <=> $_[1] } ; }
$dbh2 = new DB_File::BTREEINFO ;
$dbh2->{compare} = sub { $_[0] cmp $_[1] } ;
@@ -444,16 +444,14 @@ tie(%g, 'DB_File',$Dfile2, O_RDWR|O_CREAT, 0640, $dbh2 ) ;
tie(%k, 'DB_File',$Dfile3, O_RDWR|O_CREAT, 0640, $dbh3 ) ;
@Keys = qw( 0123 12 -1234 9 987654321 def ) ;
-$^W = 0 ;
-@srt_1 = sort { $a <=> $b } @Keys ;
-$^W = 1 ;
+{ local $^W = 0 ;
+ @srt_1 = sort { $a <=> $b } @Keys ; }
@srt_2 = sort { $a cmp $b } @Keys ;
@srt_3 = sort { length $a <=> length $b } @Keys ;
foreach (@Keys) {
- $^W = 0 ;
- $h{$_} = 1 ;
- $^W = 1 ;
+ { local $^W = 0 ;
+ $h{$_} = 1 ; }
$g{$_} = 1 ;
$k{$_} = 1 ;
}
diff --git a/t/lib/db-recno.t b/t/lib/db-recno.t
index 6027b6fa95..da3edbf45f 100755
--- a/t/lib/db-recno.t
+++ b/t/lib/db-recno.t
@@ -21,6 +21,24 @@ sub ok
print "not " unless $result ;
print "ok $no\n" ;
+
+ return $result ;
+}
+
+sub bad_one
+{
+ print <<EOM unless $bad_ones++ ;
+#
+# Some older versions of Berkeley DB will fail tests 51, 53 and 55.
+#
+# You can safely ignore the errors if you're never going to use the
+# broken functionality (recno databases with a modified bval).
+# Otherwise you'll have to upgrade your DB library.
+#
+# If you want to upgrade Berkeley DB, the most recent version is 1.85.
+# Check out http://www.bostic.com/db for more details.
+#
+EOM
}
print "1..55\n";
@@ -190,8 +208,8 @@ unlink $Dfile;
$h[3] = "ghi" ;
untie @h ;
my $x = `cat $Dfile` ;
- ok(49, $x eq "abc\ndef\n\nghi\n") ;
unlink $Dfile;
+ ok(49, $x eq "abc\ndef\n\nghi\n") ;
}
{
@@ -206,8 +224,10 @@ unlink $Dfile;
$h[3] = "ghi" ;
untie @h ;
my $x = `cat $Dfile` ;
- ok(51, $x eq "abc-def--ghi-") ;
unlink $Dfile;
+ my $ok = ($x eq "abc-def--ghi-") ;
+ bad_one() unless $ok ;
+ ok(51, $ok) ;
}
{
@@ -223,8 +243,10 @@ unlink $Dfile;
$h[3] = "ghi" ;
untie @h ;
my $x = `cat $Dfile` ;
- ok(53, $x eq "abc def ghi ") ;
unlink $Dfile;
+ my $ok = ($x eq "abc def ghi ") ;
+ bad_one() unless $ok ;
+ ok(53, $ok) ;
}
{
@@ -241,8 +263,10 @@ unlink $Dfile;
$h[3] = "ghi" ;
untie @h ;
my $x = `cat $Dfile` ;
- ok(55, $x eq "abc--def-------ghi--") ;
unlink $Dfile;
+ my $ok = ($x eq "abc--def-------ghi--") ;
+ bad_one() unless $ok ;
+ ok(55, $ok) ;
}
exit ;
diff --git a/t/lib/filecopy.t b/t/lib/filecopy.t
index 0a5f4c180c..b718215a1e 100755
--- a/t/lib/filecopy.t
+++ b/t/lib/filecopy.t
@@ -29,56 +29,60 @@ print "not " unless $foo eq "ok 3\n";
print "ok 2\n";
copy "copy-$$", \*STDOUT;
-unlink "copy-$$";
+unlink "copy-$$" or die "unlink: $!";
open(F,"file-$$");
copy(*F, "copy-$$");
-open(R, "copy-$$") or die; $foo = <R>; close(R);
+open(R, "copy-$$") or die "open copy-$$: $!"; $foo = <R>; close(R);
print "not " unless $foo eq "ok 3\n";
print "ok 4\n";
-unlink "copy-$$";
+unlink "copy-$$" or die "unlink: $!";
open(F,"file-$$");
copy(\*F, "copy-$$");
-open(R, "copy-$$") or die; $foo = <R>; close(R);
+close(F) or die "close: $!";
+open(R, "copy-$$") or die; $foo = <R>; close(R) or die "close: $!";
print "not " unless $foo eq "ok 3\n";
print "ok 5\n";
-unlink "copy-$$";
+unlink "copy-$$" or die "unlink: $!";
require IO::File;
$fh = IO::File->new(">copy-$$") or die "Cannot open copy-$$:$!";
+binmode $fh or die;
copy("file-$$",$fh);
-$fh->close;
+$fh->close or die "close: $!";
open(R, "copy-$$") or die; $foo = <R>; close(R);
-print "not " unless $foo eq "ok 3\n";
+print "# foo=`$foo'\nnot " unless $foo eq "ok 3\n";
print "ok 6\n";
-unlink "copy-$$";
+unlink "copy-$$" or die "unlink: $!";
require FileHandle;
my $fh = FileHandle->new(">copy-$$") or die "Cannot open copy-$$:$!";
+binmode $fh or die;
copy("file-$$",$fh);
$fh->close;
open(R, "copy-$$") or die; $foo = <R>; close(R);
print "not " unless $foo eq "ok 3\n";
print "ok 7\n";
-unlink "file-$$";
+unlink "file-$$" or die "unlink: $!";
-print "not " if move("file-$$", "copy-$$") or not -e "copy-$$";
+print "# moved missing file.\nnot " if move("file-$$", "copy-$$");
+print "# target disappeared.\nnot " if not -e "copy-$$";
print "ok 8\n";
-move "copy-$$", "file-$$";
-print "not " unless -e "file-$$" and not -e "copy-$$";
+move "copy-$$", "file-$$" or print "# move did not succeed.\n";
+print "# not moved: $!\nnot " unless -e "file-$$" and not -e "copy-$$";
open(R, "file-$$") or die; $foo = <R>; close(R);
-print "not " unless $foo eq "ok 3\n";
+print "# foo=`$foo'\nnot " unless $foo eq "ok 3\n";
print "ok 9\n";
copy "file-$$", "lib";
open(R, "lib/file-$$") or die; $foo = <R>; close(R);
print "not " unless $foo eq "ok 3\n";
print "ok 10\n";
-unlink "lib/file-$$";
+unlink "lib/file-$$" or die "unlink: $!";
move "file-$$", "lib";
-open(R, "lib/file-$$") or die; $foo = <R>; close(R);
+open(R, "lib/file-$$") or die "open lib/file-$$: $!"; $foo = <R>; close(R);
print "not " unless $foo eq "ok 3\n" and not -e "file-$$";;
print "ok 11\n";
-unlink "lib/file-$$";
+unlink "lib/file-$$" or die "unlink: $!";
diff --git a/t/op/assignwarn.t b/t/op/assignwarn.t
new file mode 100755
index 0000000000..57e89c45e0
--- /dev/null
+++ b/t/op/assignwarn.t
@@ -0,0 +1,61 @@
+#!./perl
+
+#
+# Verify which OP= operators warn if their targets are undefined.
+# Based on redef.t, contributed by Graham Barr <Graham.Barr@tiuk.ti.com>
+# -- Robin Barker <rmb@cise.npl.co.uk>
+#
+
+BEGIN {
+ chdir 't' if -d 't';
+ @INC = '../lib';
+}
+
+use strict;
+
+$^W = 1;
+my $warn = "";
+$SIG{q(__WARN__)} = sub { print $warn; $warn .= join("",@_) };
+
+sub ok { print $_[1] ? "ok " : "not ok ", $_[0], "\n"; }
+
+sub uninitialized { $warn =~ s/Use of uninitialized value[^\n]+\n//s; }
+
+print "1..23\n";
+
+{ my $x; $x ++; ok 1, ! uninitialized; }
+{ my $x; $x --; ok 2, ! uninitialized; }
+{ my $x; ++ $x; ok 3, ! uninitialized; }
+{ my $x; -- $x; ok 4, ! uninitialized; }
+
+{ my $x; $x **= 1; ok 5, uninitialized; }
+
+{ my $x; $x += 1; ok 6, ! uninitialized; }
+{ my $x; $x -= 1; ok 7, ! uninitialized; }
+
+{ my $x; $x .= 1; ok 8, ! uninitialized; }
+
+{ my $x; $x *= 1; ok 9, uninitialized; }
+{ my $x; $x /= 1; ok 10, uninitialized; }
+{ my $x; $x %= 1; ok 11, uninitialized; }
+
+{ my $x; $x x= 1; ok 12, uninitialized; }
+
+{ my $x; $x &= 1; ok 13, uninitialized; }
+{ my $x; $x |= 1; ok 14, ! uninitialized; }
+{ my $x; $x ^= 1; ok 15, ! uninitialized; }
+
+{ my $x; $x &&= 1; ok 16, ! uninitialized; }
+{ my $x; $x ||= 1; ok 17, ! uninitialized; }
+
+{ my $x; $x <<= 1; ok 18, uninitialized; }
+{ my $x; $x >>= 1; ok 19, uninitialized; }
+
+{ my $x; $x &= "x"; ok 20, uninitialized; }
+{ my $x; $x |= "x"; ok 21, ! uninitialized; }
+{ my $x; $x ^= "x"; ok 22, ! uninitialized; }
+
+ok 23, $warn eq '';
+
+# If we got any errors that we were not expecting, then print them
+print map "#$_\n", split /\n/, $warn if length $warn;
diff --git a/t/op/cmp.t b/t/op/cmp.t
new file mode 100755
index 0000000000..aba7c2e9dc
--- /dev/null
+++ b/t/op/cmp.t
@@ -0,0 +1,35 @@
+#!./perl
+
+@FOO = ('s', 'N/A', 'a', 'NaN', -1, undef, 0, 1);
+
+$expect = ($#FOO+2) * ($#FOO+1);
+print "1..$expect\n";
+
+my $ok = 0;
+for my $i (0..$#FOO) {
+ for my $j ($i..$#FOO) {
+ $ok++;
+ my $cmp = $FOO[$i] <=> $FOO[$j];
+ if (!defined($cmp) ||
+ $cmp == -1 && $FOO[$i] < $FOO[$j] ||
+ $cmp == 0 && $FOO[$i] == $FOO[$j] ||
+ $cmp == 1 && $FOO[$i] > $FOO[$j])
+ {
+ print "ok $ok\n";
+ }
+ else {
+ print "not ok $ok ($FOO[$i] <=> $FOO[$j])\n";
+ }
+ $ok++;
+ $cmp = $FOO[$i] cmp $FOO[$j];
+ if ($cmp == -1 && $FOO[$i] lt $FOO[$j] ||
+ $cmp == 0 && $FOO[$i] eq $FOO[$j] ||
+ $cmp == 1 && $FOO[$i] gt $FOO[$j])
+ {
+ print "ok $ok\n";
+ }
+ else {
+ print "not ok $ok ($FOO[$i] cmp $FOO[$j])\n";
+ }
+ }
+}
diff --git a/t/op/each.t b/t/op/each.t
index 4106e54c50..b92dd1770c 100755
--- a/t/op/each.t
+++ b/t/op/each.t
@@ -2,7 +2,7 @@
# $RCSfile: each.t,v $$Revision: 4.1 $$Date: 92/08/07 18:27:47 $
-print "1..7\n";
+print "1..14\n";
$h{'abc'} = 'ABC';
$h{'def'} = 'DEF';
@@ -68,3 +68,42 @@ undef %h;
%h = (1,1);
$size = ((split('/',scalar %h))[1]);
if ($size == 8) {print "ok 7\n";} else {print "not ok 7\n";}
+
+# test scalar each
+%hash = 1..20;
+$total = 0;
+$total += $key while $key = each %hash;
+print "# Scalar each is bad.\nnot " unless $total == 100;
+print "ok 8\n";
+
+for (1..3) { @foo = each %hash }
+keys %hash;
+$total = 0;
+$total += $key while $key = each %hash;
+print "# Scalar keys isn't resetting the iterator.\nnot " if $total != 100;
+print "ok 9\n";
+
+for (1..3) { @foo = each %hash }
+$total = 0;
+$total += $key while $key = each %hash;
+print "# Iterator of each isn't being maintained.\nnot " if $total == 100;
+print "ok 10\n";
+
+for (1..3) { @foo = each %hash }
+values %hash;
+$total = 0;
+$total += $key while $key = each %hash;
+print "# Scalar values isn't resetting the iterator.\nnot " if $total != 100;
+print "ok 11\n";
+
+$size = (split('/', scalar %hash))[1];
+keys(%hash) = $size / 2;
+print "not " if $size != (split('/', scalar %hash))[1];
+print "ok 12\n";
+keys(%hash) = $size + 100;
+print "not " if $size == (split('/', scalar %hash))[1];
+print "ok 13\n";
+
+print "not " if keys(%hash) != 10;
+print "ok 14\n";
+
diff --git a/t/op/magic.t b/t/op/magic.t
index b46dade75d..a050510f38 100755
--- a/t/op/magic.t
+++ b/t/op/magic.t
@@ -2,17 +2,35 @@
# $RCSfile: magic.t,v $$Revision: 4.1 $$Date: 92/08/07 18:28:05 $
-$| = 1; # command buffering
+BEGIN {
+ $^W = 1;
+ $| = 1;
+ chdir 't' if -d 't';
+ @INC = '../lib';
+ $SIG{__WARN__} = sub { die @_ };
+}
-print "1..6\n";
+sub ok {
+ my ($n, $result, $info) = @_;
+ if ($result) {
+ print "ok $n\n";
+ }
+ else {
+ print "not ok $n\n";
+ print "# $info\n" if $info;
+ }
+}
+
+print "1..28\n";
eval '$ENV{"foo"} = "hi there";'; # check that ENV is inited inside eval
-if (`echo \$foo` eq "hi there\n") {print "ok 1\n";} else {print "not ok 1\n";}
+ok 1, `echo \$foo` eq "hi there\n";
unlink 'ajslkdfpqjsjfk';
$! = 0;
-open(foo,'ajslkdfpqjsjfk');
-if ($!) {print "ok 2\n";} else {print "not ok 2\n";}
+open(FOO,'ajslkdfpqjsjfk');
+ok 2, $!, $!;
+close FOO; # just mention it, squelch used-only-once
# the next tests are embedded inside system simply because sh spits out
# a newline onto stderr when a child process kills itself with SIGINT.
@@ -38,8 +56,63 @@ END
@val1 = @ENV{keys(%ENV)}; # can we slice ENV?
@val2 = values(%ENV);
+ok 5, join(':',@val1) eq join(':',@val2);
+ok 6, @val1 > 1;
+
+# regex vars
+'foobarbaz' =~ /b(a)r/;
+ok 7, $` eq 'foo', $`;
+ok 8, $& eq 'bar', $&;
+ok 9, $' eq 'baz', $';
+ok 10, $+ eq 'a', $+;
+
+# $"
+@a = qw(foo bar baz);
+ok 11, "@a" eq "foo bar baz", "@a";
+{
+ local $" = ',';
+ ok 12, "@a" eq "foo,bar,baz", "@a";
+}
-print join(':',@val1) eq join(':',@val2) ? "ok 5\n" : "not ok 5\n";
+# $;
+%h = ();
+$h{'foo', 'bar'} = 1;
+ok 13, (keys %h)[0] eq "foo\034bar", (keys %h)[0];
+{
+ local $; = 'x';
+ %h = ();
+ $h{'foo', 'bar'} = 1;
+ ok 14, (keys %h)[0] eq 'fooxbar', (keys %h)[0];
+}
-print @val1 > 1 ? "ok 6\n" : "not ok 6\n";
+# $?, $@, $$
+system 'true';
+ok 15, $? == 0, $?;
+system 'false';
+ok 16, $? != 0, $?;
+
+eval { die "foo\n" };
+ok 17, $@ eq "foo\n", $@;
+
+ok 18, $$ > 0, $$;
+
+# $^X and $0
+$script = './show-shebang';
+ok 19, open(SCRIPT, ">$script"), $!;
+ok 20, print(SCRIPT <<'EOF'), $!;
+#!./perl
+print "\$^X is $^X, \$0 is $0\n";
+EOF
+ok 21, close(SCRIPT), $!;
+ok 22, chmod(0755, $script), $!;
+$s = "\$^X is ./perl, \$0 is $script\n";
+$_ = `$script`;
+ok 23, $_ eq $s, ":$_:";
+$_ = `./perl $script`;
+ok 24, $_ eq $s, ":$_:";
+ok 25, unlink($script), $!;
+# $], $^O, $^T
+ok 26, $] >= 5.00319, $];
+ok 27, $^O;
+ok 28, $^T > 850000000, $^T;
diff --git a/t/op/method.t b/t/op/method.t
index 7c19ecdfdc..bdbc8a9673 100755
--- a/t/op/method.t
+++ b/t/op/method.t
@@ -4,7 +4,7 @@
# test method calls and autoloading.
#
-print "1..18\n";
+print "1..20\n";
@A::ISA = 'B';
@B::ISA = 'C';
@@ -24,11 +24,15 @@ test( A->d, "C::d"); # Update hash table;
*B::d = \&D::d; # Import now.
test (A->d, "D::d"); # Update hash table;
-eval 'sub B::d {"B::d1"}'; # Import now.
-test (A->d, "B::d1"); # Update hash table;
+{
+ local *B::d;
+ eval 'sub B::d {"B::d1"}'; # Import now.
+ test (A->d, "B::d1"); # Update hash table;
+ undef &B::d;
+ test ((eval { A->d }, ($@ =~ /Undefined subroutine/)), 1);
+}
-undef &B::d; # Should work without any help too
-test (A->d, "C::d");
+test (A->d, "D::d"); # Back to previous state
eval 'sub B::d {"B::d2"}'; # Import now.
test (A->d, "B::d2"); # Update hash table;
@@ -54,6 +58,10 @@ test (A->d, "B::d4"); # Update hash table;
delete $B::{d}; # Should work without any help too
test (A->d, "C::d");
+*A::x = *A::d; # See if cache incorrectly follows synonyms
+A->d;
+test (eval { A->x } || "nope", "nope");
+
eval <<'EOF';
sub C::e;
sub Y::f;
@@ -91,9 +99,9 @@ test(Y->f(), "B: In Y::f, 3"); # Which sticks
*B::AUTOLOAD = sub {
my $c = ++$counter;
- my $method = $main::__ANON__;
- *$main::__ANON__ = sub { "new B: In $method, $c" };
- goto &$main::__ANON__;
+ my $method = $AUTOLOAD;
+ *$AUTOLOAD = sub { "new B: In $method, $c" };
+ goto &$AUTOLOAD;
};
test(A->eee(), "new B: In A::eee, 4"); # We get a correct $autoload
diff --git a/t/op/misc.t b/t/op/misc.t
index 5bcc6a02a8..4f47f0f7af 100755
--- a/t/op/misc.t
+++ b/t/op/misc.t
@@ -39,6 +39,10 @@ for (@prgs){
__END__
()=()
########
+$a = ":="; split /($a)/o, "a:=b:=c"; print "@_"
+EXPECT
+a := b := c
+########
$cusp = ~0 ^ (~0 >> 1);
$, = " ";
print +($cusp - 1) % 8, $cusp % 8, -$cusp % 8, ($cusp + 1) % 8, "!\n";
@@ -204,3 +208,64 @@ EXPECT
This is a reversed sentence.
-- Out of inspiration --
and destroyed as well
+########
+my @a; $a[2] = 1; for (@a) { $_ = 2 } print "@a\n"
+EXPECT
+2 2 2
+########
+@a = ($a, $b, $c, $d) = (5, 6);
+print "ok\n"
+ if ($a[0] == 5 and $a[1] == 6 and !defined $a[2] and !defined $a[3]);
+EXPECT
+ok
+########
+print "ok\n" if (1E2<<1 == 200 and 3E4<<3 == 240000);
+EXPECT
+ok
+########
+print "ok\n" if ("\0" lt "\xFF");
+EXPECT
+ok
+########
+open(H,'op/misc.t'); # must be in the 't' directory
+stat(H);
+print "ok\n" if (-e _ and -f _ and -r _);
+EXPECT
+ok
+########
+sub thing { 0 || return qw(now is the time) }
+print thing(), "\n";
+EXPECT
+nowisthetime
+########
+$ren = 'joy';
+$stimpy = 'happy';
+{ local $main::{ren} = *stimpy; print $ren, ' ' }
+print $ren, "\n";
+EXPECT
+happy joy
+########
+$stimpy = 'happy';
+{ local $main::{ren} = *stimpy; print ${'ren'}, ' ' }
+print +(defined(${'ren'}) ? 'oops' : 'joy'), "\n";
+EXPECT
+happy joy
+########
+package p;
+sub func { print 'really ' unless wantarray; 'p' }
+sub groovy { 'groovy' }
+package main;
+print p::func()->groovy(), "\n"
+EXPECT
+really groovy
+########
+($k, $s) = qw(x 0);
+@{$h{$k}} = qw(1 2 4);
+for (@{$h{$k}}) { $s += $_; delete $h{$k} if ($_ == 2) }
+print "bogus\n" unless $s == 7;
+########
+my $a = 'outer';
+eval q[ my $a = 'inner'; eval q[ print "$a " ] ];
+eval { my $x = 'peace'; eval q[ print "$x\n" ] }
+EXPECT
+inner peace
diff --git a/t/op/my.t b/t/op/my.t
index 4ce020f206..06c6963534 100755
--- a/t/op/my.t
+++ b/t/op/my.t
@@ -1,8 +1,8 @@
#!./perl
-# $RCSfile: local.t,v $$Revision: 4.1 $$Date: 92/08/07 18:28:04 $
+# $RCSfile: my.t,v $
-print "1..20\n";
+print "1..28\n";
sub foo {
my($a, $b) = @_;
@@ -44,3 +44,42 @@ $d{''} = "ok 18\n";
print &foo2("ok 11\n","ok 12\n");
print $a,@b,@c,%d,$x,$y;
+
+my $i = "outer";
+
+if (my $i = "inner") {
+ print "not " if $i ne "inner";
+}
+print "ok 21\n";
+
+if ((my $i = 1) == 0) {
+ print "not ";
+}
+else {
+ print "not" if $i != 1;
+}
+print "ok 22\n";
+
+my $j = 5;
+while (my $i = --$j) {
+ print("not "), last unless $i > 0;
+}
+continue {
+ print("not "), last unless $i > 0;
+}
+print "ok 23\n";
+
+$j = 5;
+for (my $i = 0; (my $k = $i) < $j; ++$i) {
+ print("not "), last unless $i >= 0 && $i < $j && $i == $k;
+}
+print "ok 24\n";
+print "not " if defined $k;
+print "ok 25\n";
+
+foreach my $i (26, 27) {
+ print "ok $i\n";
+}
+
+print "not " if $i ne "outer";
+print "ok 28\n";
diff --git a/t/op/oct.t b/t/op/oct.t
index 7890643aef..24b5c4309d 100755
--- a/t/op/oct.t
+++ b/t/op/oct.t
@@ -2,7 +2,7 @@
# $RCSfile: oct.t,v $$Revision: 4.1 $$Date: 92/08/07 18:28:08 $
-print "1..6\n";
+print "1..8\n";
print +(oct('01234') == 01234) ? "ok" : "not ok", " 1\n";
print +(oct('0x1234') == 0x1234) ? "ok" : "not ok", " 2\n";
@@ -10,3 +10,5 @@ print +(hex('01234') == 0x1234) ? "ok" : "not ok", " 3\n";
print +(oct('20000000000') == 020000000000) ? "ok" : "not ok", " 4\n";
print +(oct('x80000000') == 0x80000000) ? "ok" : "not ok", " 5\n";
print +(hex('80000000') == 0x80000000) ? "ok" : "not ok", " 6\n";
+print +(oct('1234') == 668) ? "ok" : "not ok", " 7\n";
+print +(hex('1234') == 4660) ? "ok" : "not ok", " 8\n";
diff --git a/t/op/quotemeta.t b/t/op/quotemeta.t
index 09794571b1..20dd312b31 100755
--- a/t/op/quotemeta.t
+++ b/t/op/quotemeta.t
@@ -1,15 +1,15 @@
#!./perl
print "1..15\n";
-$_=join "", grep $_=chr($_), 32..127;
+$_=join "", map chr($_), 32..127;
-#95 characters - 52 letters - 10 digits = 33 backslashes
-#95 characters + 33 backslashes = 128 characters
+# 96 characters - 52 letters - 10 digits - 1 underscore = 33 backslashes
+# 96 characters + 33 backslashes = 129 characters
$_=quotemeta $_;
-if ( length == 128 ){print "ok 1\n"} else {print "not ok 1\n"}
-if (tr/\\//cd == 94){print "ok 2\n"} else {print "not ok 2\n"}
+if ( length == 129 ){print "ok 1\n"} else {print "not ok 1\n"}
+# 95 non-backslash characters
+if (tr/\\//cd == 95){print "ok 2\n"} else {print "not ok 2\n"}
-#perl5a11 bus errors on this:
if (length quotemeta "" == 0){print "ok 3\n"} else {print "not ok 3\n"}
print "aA\UbB\LcC\EdD" eq "aABBccdD" ? "ok 4\n" : "not ok 4 \n";
diff --git a/t/op/rand.t b/t/op/rand.t
index 5c0eccf15f..6031f421b1 100755
--- a/t/op/rand.t
+++ b/t/op/rand.t
@@ -2,28 +2,34 @@
# From: kgb@ast.cam.ac.uk (Karl Glazebrook)
-print "1..4\n";
+print "1..6\n";
srand;
-$m=0;
+$m=$max=0;
for(1..1000){
$n = rand(1);
- if ($n<0 || $n>=1) {
+ if ($n<0) {
print "not ok 1\n# The value of randbits is likely too low in config.sh\n";
exit
}
$m += $n;
-
+ $max = $n if $n > $max;
}
$m=$m/1000;
print "ok 1\n";
+$off = log($max)/log(2);
+if ($off > 0) { $off = int(.5+$off) }
+ else { $off = - int(.5-$off) }
+print "# Consider adding $off to randbits\n" if $off > 0;
+print "# Consider subtracting ", -$off, " from randbits\n" if $off < 0;
+
if ($m<0.4) {
print "not ok 2\n# The value of randbits is likely too high in config.sh\n";
}
elsif ($m>0.6) {
- print "not ok 2\n# Something's really weird about rand()'s distribution.\n";
+ print "not ok 2\n# The value of randbits is likely too low in config.sh\n";
}else{
print "ok 2\n";
}
@@ -49,4 +55,12 @@ if ($m<40 || $m>60) {
print "ok 4\n";
}
+srand(3.14159);
+$r = rand;
+srand(3.14159);
+print "# srand is not consistent.\nnot " if rand != $r;
+print "ok 5\n";
+
+print "# rand is unchanging!\nnot " if rand == $r;
+print "ok 6\n";
diff --git a/t/op/sysio.t b/t/op/sysio.t
index 554fdf5b0a..0f546b270f 100755
--- a/t/op/sysio.t
+++ b/t/op/sysio.t
@@ -168,6 +168,8 @@ close(I);
unlink $outfile;
+chdir('..');
+
1;
# eof
diff --git a/t/op/universal.t b/t/op/universal.t
new file mode 100755
index 0000000000..3e075cff43
--- /dev/null
+++ b/t/op/universal.t
@@ -0,0 +1,38 @@
+#!./perl
+#
+# check UNIVERSAL
+#
+
+print "1..4\n";
+
+# explicit bless
+
+$a = {};
+bless $a, "Bob";
+if ($a->class eq "Bob") {print "ok 1\n";} else {print "not ok 1\n";}
+
+# bless through a package
+
+package Fred;
+
+$b = {};
+bless $b;
+if ($b->class eq "Fred") {print "ok 2\n";} else {print "not ok 2\n";}
+
+package main;
+
+# same as test 1 and 2, but with other object syntax
+
+# explicit bless
+
+$a = {};
+bless $a, "Bob";
+if (class $a eq "Bob") {print "ok 3\n";} else {print "not ok 3\n";}
+
+# bless through a package
+
+package Fred;
+
+$b = {};
+bless $b;
+if (class $b eq "Fred") {print "ok 4\n";} else {print "not ok 4\n";}
diff --git a/t/lib/locale.t b/t/pragma/locale.t
index 83fa46bd73..0f71da434b 100755
--- a/t/lib/locale.t
+++ b/t/pragma/locale.t
@@ -1,14 +1,20 @@
#!./perl -wT
-print "1..67\n";
-
BEGIN {
chdir 't' if -d 't';
@INC = '../lib';
}
use strict;
-use POSIX qw(locale_h);
+
+my $have_setlocale = 0;
+eval {
+ require POSIX;
+ import POSIX ':locale_h';
+ $have_setlocale++;
+};
+
+print "1..", ($have_setlocale ? 104 : 98), "\n";
use vars qw($a
$English $German $French $Spanish
@@ -74,15 +80,15 @@ check_taint 19, $+;
check_taint 20, $1;
check_taint_not 21, $2;
-/(\W)/; # taint $&, $`, $', $+, $1.
-check_taint 22, $&;
-check_taint 23, $`;
-check_taint 24, $';
-check_taint 25, $+;
-check_taint 26, $1;
+/(.)/; # untaint $&, $`, $', $+, $1.
+check_taint_not 22, $&;
+check_taint_not 23, $`;
+check_taint_not 24, $';
+check_taint_not 25, $+;
+check_taint_not 26, $1;
check_taint_not 27, $2;
-/(\s)/; # taint $&, $`, $', $+, $1.
+/(\W)/; # taint $&, $`, $', $+, $1.
check_taint 28, $&;
check_taint 29, $`;
check_taint 30, $';
@@ -90,7 +96,7 @@ check_taint 31, $+;
check_taint 32, $1;
check_taint_not 33, $2;
-/(\S)/; # taint $&, $`, $', $+, $1.
+/(\s)/; # taint $&, $`, $', $+, $1.
check_taint 34, $&;
check_taint 35, $`;
check_taint 36, $';
@@ -98,48 +104,111 @@ check_taint 37, $+;
check_taint 38, $1;
check_taint_not 39, $2;
+/(\S)/; # taint $&, $`, $', $+, $1.
+check_taint 40, $&;
+check_taint 41, $`;
+check_taint 42, $';
+check_taint 43, $+;
+check_taint 44, $1;
+check_taint_not 45, $2;
+
$_ = $a; # untaint $_
-check_taint_not 40, $_;
+check_taint_not 46, $_;
/(b)/; # this must not taint
-check_taint_not 41, $&;
-check_taint_not 42, $`;
-check_taint_not 43, $';
-check_taint_not 44, $+;
-check_taint_not 45, $1;
-check_taint_not 46, $2;
+check_taint_not 47, $&;
+check_taint_not 48, $`;
+check_taint_not 49, $';
+check_taint_not 50, $+;
+check_taint_not 51, $1;
+check_taint_not 52, $2;
$_ = $a; # untaint $_
-check_taint_not 47, $_;
+check_taint_not 53, $_;
$b = uc($a); # taint $b
s/(.+)/$b/; # this must taint only the $_
-check_taint 48, $_;
-check_taint_not 49, $&;
-check_taint_not 50, $`;
-check_taint_not 51, $';
-check_taint_not 52, $+;
-check_taint_not 53, $1;
-check_taint_not 54, $2;
+check_taint 54, $_;
+check_taint_not 55, $&;
+check_taint_not 56, $`;
+check_taint_not 57, $';
+check_taint_not 58, $+;
+check_taint_not 59, $1;
+check_taint_not 60, $2;
$_ = $a; # untaint $_
s/(.+)/b/; # this must not taint
-check_taint_not 55, $_;
-check_taint_not 56, $&;
-check_taint_not 57, $`;
-check_taint_not 58, $';
-check_taint_not 59, $+;
-check_taint_not 60, $1;
-check_taint_not 61, $2;
+check_taint_not 61, $_;
+check_taint_not 62, $&;
+check_taint_not 63, $`;
+check_taint_not 64, $';
+check_taint_not 65, $+;
+check_taint_not 66, $1;
+check_taint_not 67, $2;
+
+$b = $a; # untaint $b
+
+($b = $a) =~ s/\w/$&/;
+check_taint 68, $b; # $b should be tainted.
+check_taint_not 69, $a; # $a should be not.
+
+$_ = $a; # untaint $_
+
+s/(\w)/\l$1/; # this must taint
+check_taint 70, $_;
+check_taint 71, $&;
+check_taint 72, $`;
+check_taint 73, $';
+check_taint 74, $+;
+check_taint 75, $1;
+check_taint_not 76, $2;
+
+$_ = $a; # untaint $_
+
+s/(\w)/\L$1/; # this must taint
+check_taint 77, $_;
+check_taint 78, $&;
+check_taint 79, $`;
+check_taint 80, $';
+check_taint 81, $+;
+check_taint 82, $1;
+check_taint_not 83, $2;
+
+$_ = $a; # untaint $_
-check_taint_not 62, $a;
+s/(\w)/\u$1/; # this must taint
+check_taint 84, $_;
+check_taint 85, $&;
+check_taint 86, $`;
+check_taint 87, $';
+check_taint 88, $+;
+check_taint 89, $1;
+check_taint_not 90, $2;
+
+$_ = $a; # untaint $_
+
+s/(\w)/\U$1/; # this must taint
+check_taint 91, $_;
+check_taint 92, $&;
+check_taint 93, $`;
+check_taint 94, $';
+check_taint 95, $+;
+check_taint 96, $1;
+check_taint_not 97, $2;
+
+# After all this tainting $a should be cool.
+
+check_taint_not 98, $a;
# I think we've seen quite enough of taint.
-# Let us do some *real* locale work now.
+# Let us do some *real* locale work now,
+# unless setlocale() is missing (i.e. minitest).
+
+exit unless $have_setlocale;
sub getalnum {
sort grep /\w/, map { chr } 0..255
@@ -152,7 +221,7 @@ sub locatelocale ($$@) {
for (@try) {
local $^W = 0; # suppress "Subroutine LC_ALL redefined"
- if (setlocale(LC_ALL, $_)) {
+ if (setlocale(&LC_ALL, $_)) {
$$lcall = $_;
@$alnum = &getalnum;
last;
@@ -221,7 +290,7 @@ print "# Alnum_ = @Locale\n";
{
local $^W = 0;
- setlocale(LC_ALL, $Locale);
+ setlocale(&LC_ALL, $Locale);
}
{
@@ -246,7 +315,8 @@ for (@Locale) {
# Cross-check the upper and the lower.
# Yes, this is broken when the upper<->lower changes the number of
-# the glyphs (e.g. the German sharp-s aka double-s aka sz-ligature.
+# the glyphs (e.g. the German sharp-s aka double-s aka sz-ligature,
+# or the Dutch IJ or the Spanish LL or ...)
# But so far all the implementations do this wrong so we can do it wrong too.
for (keys %UPPER) {
@@ -257,7 +327,7 @@ for (keys %UPPER) {
}
}
}
-print "ok 63\n";
+print "ok 99\n";
for (keys %lower) {
if (defined $UPPER{$lower{$_}}) {
@@ -267,7 +337,7 @@ for (keys %lower) {
}
}
}
-print "ok 64\n";
+print "ok 100\n";
# Find the alphabets that are not alphabets in the default locale.
@@ -290,15 +360,18 @@ print "ok 64\n";
print 'not ' if ($1 ne $word);
}
-print "ok 65\n";
+print "ok 101\n";
# Find places where the collation order differs from the default locale.
{
- no locale;
+ my (@k, $i, $j, @d);
- my @k = sort (keys %UPPER, keys %lower);
- my ($i, $j, @d);
+ {
+ no locale;
+
+ @k = sort (keys %UPPER, keys %lower);
+ }
for ($i = 0; $i < @k; $i++) {
for ($j = $i + 1; $j < @k; $j++) {
@@ -312,10 +385,15 @@ print "ok 65\n";
for (@d) {
($i, $j) = @$_;
- print 'not ' if ($i le $j or not (($i cmp $j) == 1));
+ if ($i gt $j) {
+ print "# i = $i, j = $j, i ",
+ $i le $j ? 'le' : 'gt', " j\n";
+ print 'not ';
+ last;
+ }
}
}
-print "ok 66\n";
+print "ok 102\n";
# Cross-check whole character set.
@@ -325,7 +403,47 @@ for (map { chr } 0..255) {
if (/\s/ and /\S/) { print 'not '; last }
if (/\w/ and /\D/ and not /_/ and
not (exists $UPPER{$_} or exists $lower{$_})) {
- print 'not '; last
+ print 'not ';
+ last;
+ }
+}
+print "ok 103\n";
+
+# The @Locale should be internally consistent.
+
+{
+ my ($from, $to, , $lesser, $greater);
+
+ for (0..9) {
+ # Select a slice.
+ $from = int(($_*@Locale)/10);
+ $to = $from + int(@Locale/10);
+ $to = $#Locale if ($to > $#Locale);
+ $lesser = join('', @Locale[$from..$to]);
+ # Select a slice one character on.
+ $from++; $to++;
+ $to = $#Locale if ($to > $#Locale);
+ $greater = join('', @Locale[$from..$to]);
+ if (not ($lesser lt $greater) or
+ not ($lesser le $greater) or
+ not ($lesser ne $greater) or
+ ($lesser eq $greater) or
+ ($lesser ge $greater) or
+ ($lesser gt $greater) or
+ ($greater lt $lesser ) or
+ ($greater le $lesser ) or
+ not ($greater ne $lesser ) or
+ ($greater eq $lesser ) or
+ not ($greater ge $lesser ) or
+ not ($greater gt $lesser ) or
+ # Well, these two are sort of redundant because @Locale
+ # was derived using cmp.
+ not (($lesser cmp $greater) == -1) or
+ not (($greater cmp $lesser ) == 1)
+ ) {
+ print 'not ';
+ last;
+ }
}
}
-print "ok 67\n";
+print "ok 104\n";
diff --git a/t/op/overload.t b/t/pragma/overload.t
index fca26b4085..42d045741d 100755
--- a/t/op/overload.t
+++ b/t/pragma/overload.t
@@ -33,7 +33,7 @@ qw(
sub new {
my $foo = $_[1];
- bless \$foo;
+ bless \$foo, $_[0];
}
sub stringify { "${$_[0]}" }
@@ -55,7 +55,9 @@ $a = new Oscalar "087";
$b= "$a";
# All test numbers in comments are off by 1.
-# So much for hard-wiring them in :-)
+# So much for hard-wiring them in :-) To fix this:
+test(1); # 1
+
test ($b eq $a); # 2
test ($b eq "087"); # 3
test (ref $a eq "Oscalar"); # 4
@@ -255,16 +257,107 @@ $a=new Oscalar "xx";
test ("b${a}c" eq "_._.b.__.xx._.__.c._"); # 88
+# Check inheritance of overloading;
+{
+ package OscalarI;
+ @ISA = 'Oscalar';
+}
+
+$aI = new OscalarI "$a";
+test (ref $aI eq "OscalarI"); # 89
+test ("$aI" eq "xx"); # 90
+test ($aI eq "xx"); # 91
+test ("b${aI}c" eq "_._.b.__.xx._.__.c._"); # 92
+
# Here we test blessing to a package updates hash
eval "package Oscalar; no overload '.'";
-test ("b${a}" eq "_.b.__.xx._"); # 89
+test ("b${a}" eq "_.b.__.xx._"); # 93
$x="1";
bless \$x, Oscalar;
-test ("b${a}c" eq "bxxc"); # 90
+test ("b${a}c" eq "bxxc"); # 94
new Oscalar 1;
-test ("b${a}c" eq "bxxc"); # 91
+test ("b${a}c" eq "bxxc"); # 95
+
+# Negative overloading:
+
+$na = eval { ~$a };
+test($@ =~ /no method found/); # 96
+
+# Check AUTOLOADING:
+
+*Oscalar::AUTOLOAD =
+ sub { *{"Oscalar::$AUTOLOAD"} = sub {"_!_" . shift() . "_!_"} ;
+ goto &{"Oscalar::$AUTOLOAD"}};
+
+eval "package Oscalar; sub comple; use overload '~' => 'comple'";
+
+$na = eval { ~$a }; # Hash was not updated
+test($@ =~ /no method found/); # 97
+
+bless \$x, Oscalar;
+
+$na = eval { ~$a }; # Hash updated
+warn "`$na', $@" if $@;
+test !$@; # 98
+test($na eq '_!_xx_!_'); # 99
+
+$na = 0;
+
+$na = eval { ~$aI }; # Hash was not updated
+test($@ =~ /no method found/); # 100
+
+bless \$x, OscalarI;
+
+$na = eval { ~$aI };
+print $@;
+
+test !$@; # 101
+test($na eq '_!_xx_!_'); # 102
+
+eval "package Oscalar; sub rshft; use overload '>>' => 'rshft'";
+
+$na = eval { $aI >> 1 }; # Hash was not updated
+test($@ =~ /no method found/); # 103
+
+bless \$x, OscalarI;
+
+$na = 0;
+
+$na = eval { $aI >> 1 };
+print $@;
+
+test !$@; # 104
+test($na eq '_!_xx_!_'); # 105
+
+# warn overload::Method($a, '0+'), "\n";
+test (overload::Method($a, '0+') eq \&Oscalar::numify); # 106
+test (overload::Method($aI,'0+') eq \&Oscalar::numify); # 107
+test (overload::Overloaded($aI)); # 108
+test (!overload::Overloaded('overload')); # 109
+
+test (! defined overload::Method($aI, '<<')); # 110
+test (! defined overload::Method($a, '<')); # 111
+
+test (overload::StrVal($aI) =~ /^OscalarI=SCALAR\(0x[\da-fA-F]+\)$/); # 112
+test (overload::StrVal(\$aI) eq "@{[\$aI]}"); # 113
+
+# Check overloading by methods (specified deep in the ISA tree).
+{
+ package OscalarII;
+ @ISA = 'OscalarI';
+ sub Oscalar::lshft {"_<<_" . shift() . "_<<_"}
+ eval "package OscalarI; use overload '<<' => 'lshft', '|' => 'lshft'";
+}
+
+$aaII = "087";
+$aII = \$aaII;
+bless $aII, 'OscalarII';
+bless \$fake, 'OscalarI'; # update the hash
+test(($aI | 3) eq '_<<_xx_<<_'); # 114
+# warn $aII << 3;
+test(($aII << 3) eq '_<<_087_<<_'); # 115
-# Last test is number 90.
-sub last {90}
+# Last test is:
+sub last {115}
diff --git a/t/pragma/strict-refs b/t/pragma/strict-refs
new file mode 100644
index 0000000000..7bf1556e10
--- /dev/null
+++ b/t/pragma/strict-refs
@@ -0,0 +1,295 @@
+Check strict refs functionality
+
+__END__
+
+# no strict, should build & run ok.
+my $fred ;
+$b = "fred" ;
+$a = $$b ;
+$c = ${"def"} ;
+$c = @{"def"} ;
+$c = %{"def"} ;
+$c = *{"def"} ;
+$c = \&{"def"} ;
+$c = def->[0];
+$c = def->{xyz};
+EXPECT
+
+########
+
+# strict refs - error
+use strict ;
+my $fred ;
+my $a = ${"fred"} ;
+EXPECT
+Can't use string ("fred") as a SCALAR ref while "strict refs" in use at - line 5.
+########
+
+# strict refs - error
+use strict 'refs' ;
+my $fred ;
+my $a = ${"fred"} ;
+EXPECT
+Can't use string ("fred") as a SCALAR ref while "strict refs" in use at - line 5.
+########
+
+# strict refs - error
+use strict 'refs' ;
+my $fred ;
+my $b = "fred" ;
+my $a = $$b ;
+EXPECT
+Can't use string ("fred") as a SCALAR ref while "strict refs" in use at - line 6.
+########
+
+# strict refs - error
+use strict 'refs' ;
+my $b ;
+my $a = $$b ;
+EXPECT
+Can't use an undefined value as a SCALAR reference at - line 5.
+########
+
+# strict refs - error
+use strict 'refs' ;
+my $b ;
+my $a = @$b ;
+EXPECT
+Can't use an undefined value as an ARRAY reference at - line 5.
+########
+
+# strict refs - error
+use strict 'refs' ;
+my $b ;
+my $a = %$b ;
+EXPECT
+Can't use an undefined value as a HASH reference at - line 5.
+########
+
+# strict refs - error
+use strict 'refs' ;
+my $b ;
+my $a = *$b ;
+EXPECT
+Can't use an undefined value as a symbol reference at - line 5.
+########
+
+# strict refs - error
+use strict 'refs' ;
+my $a = fred->[0] ;
+EXPECT
+Can't use bareword ("fred") as an ARRAY ref while "strict refs" in use at - line 4.
+########
+
+# strict refs - error
+use strict 'refs' ;
+my $a = fred->{barney} ;
+EXPECT
+Can't use bareword ("fred") as a HASH ref while "strict refs" in use at - line 4.
+########
+
+# strict refs - no error
+use strict ;
+no strict 'refs' ;
+my $fred ;
+my $b = "fred" ;
+my $a = $$b ;
+use strict 'refs' ;
+EXPECT
+
+########
+
+# strict refs - no error
+use strict qw(subs vars) ;
+my $fred ;
+my $b = "fred" ;
+my $a = $$b ;
+use strict 'refs' ;
+EXPECT
+
+########
+
+# strict refs - no error
+my $fred ;
+my $b = "fred" ;
+my $a = $$b ;
+use strict 'refs' ;
+EXPECT
+
+########
+
+# strict refs - no error
+use strict 'refs' ;
+my $fred ;
+my $b = \$fred ;
+my $a = $$b ;
+EXPECT
+
+########
+
+# Check runtime scope of strict refs pragma
+use strict 'refs';
+my $fred ;
+my $b = "fred" ;
+{
+ no strict ;
+ my $a = $$b ;
+}
+my $a = $$b ;
+EXPECT
+Can't use string ("fred") as a SCALAR ref while "strict refs" in use at - line 10.
+########
+
+# Check runtime scope of strict refs pragma
+no strict ;
+my $fred ;
+my $b = "fred" ;
+{
+ use strict 'refs' ;
+ my $a = $$b ;
+}
+my $a = $$b ;
+EXPECT
+Can't use string ("fred") as a SCALAR ref while "strict refs" in use at - line 8.
+########
+
+# Check runtime scope of strict refs pragma
+no strict ;
+my $fred ;
+my $b = "fred" ;
+{
+ use strict 'refs' ;
+ $a = sub { my $c = $$b ; }
+}
+&$a ;
+EXPECT
+Can't use string ("fred") as a SCALAR ref while "strict refs" in use at - line 8.
+########
+
+
+--FILE-- abc
+my $a = ${"Fred"} ;
+1;
+--FILE--
+use strict 'refs' ;
+require "./abc";
+EXPECT
+
+########
+
+--FILE-- abc
+use strict 'refs' ;
+1;
+--FILE--
+require "./abc";
+my $a = ${"Fred"} ;
+EXPECT
+
+########
+
+--FILE-- abc
+use strict 'refs' ;
+my $a = ${"Fred"} ;
+1;
+--FILE--
+${"Fred"} ;
+require "./abc";
+EXPECT
+Can't use string ("Fred") as a SCALAR ref while "strict refs" in use at ./abc line 2.
+########
+
+--FILE-- abc.pm
+use strict 'refs' ;
+my $a = ${"Fred"} ;
+1;
+--FILE--
+my $a = ${"Fred"} ;
+use abc;
+EXPECT
+Can't use string ("Fred") as a SCALAR ref while "strict refs" in use at abc.pm line 2.
+BEGIN failed--compilation aborted at - line 2.
+########
+
+# Check scope of pragma with eval
+no strict ;
+eval {
+ my $a = ${"Fred"} ;
+};
+print STDERR $@ ;
+my $a = ${"Fred"} ;
+EXPECT
+
+########
+
+# Check scope of pragma with eval
+no strict ;
+eval {
+ use strict 'refs' ;
+ my $a = ${"Fred"} ;
+};
+print STDERR $@ ;
+my $a = ${"Fred"} ;
+EXPECT
+Can't use string ("Fred") as a SCALAR ref while "strict refs" in use at - line 6.
+########
+
+# Check scope of pragma with eval
+use strict 'refs' ;
+eval {
+ my $a = ${"Fred"} ;
+};
+print STDERR $@ ;
+EXPECT
+Can't use string ("Fred") as a SCALAR ref while "strict refs" in use at - line 5.
+########
+
+# Check scope of pragma with eval
+use strict 'refs' ;
+eval {
+ no strict ;
+ my $a = ${"Fred"} ;
+};
+print STDERR $@ ;
+my $a = ${"Fred"} ;
+EXPECT
+Can't use string ("Fred") as a SCALAR ref while "strict refs" in use at - line 9.
+########
+
+# Check scope of pragma with eval
+no strict ;
+eval '
+ my $a = ${"Fred"} ;
+'; print STDERR $@ ;
+my $a = ${"Fred"} ;
+EXPECT
+
+########
+
+# Check scope of pragma with eval
+no strict ;
+eval q[
+ use strict 'refs' ;
+ my $a = ${"Fred"} ;
+]; print STDERR $@;
+EXPECT
+Can't use string ("Fred") as a SCALAR ref while "strict refs" in use at (eval 1) line 3.
+########
+
+# Check scope of pragma with eval
+use strict 'refs' ;
+eval '
+ my $a = ${"Fred"} ;
+'; print STDERR $@ ;
+EXPECT
+Can't use string ("Fred") as a SCALAR ref while "strict refs" in use at (eval 1) line 2.
+########
+
+# Check scope of pragma with eval
+use strict 'refs' ;
+eval '
+ no strict ;
+ my $a = ${"Fred"} ;
+'; print STDERR $@;
+my $a = ${"Fred"} ;
+EXPECT
+Can't use string ("Fred") as a SCALAR ref while "strict refs" in use at - line 8.
diff --git a/t/pragma/strict-subs b/t/pragma/strict-subs
new file mode 100644
index 0000000000..6864a3a979
--- /dev/null
+++ b/t/pragma/strict-subs
@@ -0,0 +1,279 @@
+Check strict subs functionality
+
+__END__
+
+# no strict, should build & run ok.
+Fred ;
+my $fred ;
+$b = "fred" ;
+$a = $$b ;
+EXPECT
+
+########
+
+use strict qw(refs vars);
+Fred ;
+EXPECT
+
+########
+
+use strict ;
+no strict 'subs' ;
+Fred ;
+EXPECT
+
+########
+
+# strict subs - error
+use strict 'subs' ;
+Fred ;
+EXPECT
+Bareword "Fred" not allowed while "strict subs" in use at - line 4.
+Execution of - aborted due to compilation errors.
+########
+
+# strict subs - error
+use strict ;
+Fred ;
+EXPECT
+Bareword "Fred" not allowed while "strict subs" in use at - line 4.
+Execution of - aborted due to compilation errors.
+########
+
+# strict subs - no error
+use strict 'subs' ;
+sub Fred {}
+Fred ;
+EXPECT
+
+########
+
+# Check compile time scope of strict subs pragma
+use strict 'subs' ;
+{
+ no strict ;
+ my $a = Fred ;
+}
+my $a = Fred ;
+EXPECT
+Bareword "Fred" not allowed while "strict subs" in use at - line 8.
+Execution of - aborted due to compilation errors.
+########
+
+# Check compile time scope of strict subs pragma
+no strict;
+{
+ use strict 'subs' ;
+ my $a = Fred ;
+}
+my $a = Fred ;
+EXPECT
+Bareword "Fred" not allowed while "strict subs" in use at - line 6.
+Execution of - aborted due to compilation errors.
+########
+
+# Check compile time scope of strict vars pragma
+use strict 'vars' ;
+{
+ no strict ;
+ $joe = 1 ;
+}
+$joe = 1 ;
+EXPECT
+Variable "$joe" is not imported at - line 8.
+Global symbol "joe" requires explicit package name at - line 8.
+Execution of - aborted due to compilation errors.
+########
+
+# Check compile time scope of strict vars pragma
+no strict;
+{
+ use strict 'vars' ;
+ $joe = 1 ;
+}
+$joe = 1 ;
+EXPECT
+Global symbol "joe" requires explicit package name at - line 6.
+Execution of - aborted due to compilation errors.
+########
+
+# Check runtime scope of strict refs pragma
+use strict 'refs';
+my $fred ;
+my $b = "fred" ;
+{
+ no strict ;
+ my $a = $$b ;
+}
+my $a = $$b ;
+EXPECT
+Can't use string ("fred") as a SCALAR ref while "strict refs" in use at - line 10.
+########
+
+# Check runtime scope of strict refs pragma
+no strict ;
+my $fred ;
+my $b = "fred" ;
+{
+ use strict 'refs' ;
+ my $a = $$b ;
+}
+my $a = $$b ;
+EXPECT
+Can't use string ("fred") as a SCALAR ref while "strict refs" in use at - line 8.
+########
+
+# Check runtime scope of strict refs pragma
+no strict ;
+my $fred ;
+my $b = "fred" ;
+{
+ use strict 'refs' ;
+ $a = sub { my $c = $$b ; }
+}
+&$a ;
+EXPECT
+Can't use string ("fred") as a SCALAR ref while "strict refs" in use at - line 8.
+########
+
+use strict 'subs' ;
+my $a = Fred ;
+EXPECT
+Bareword "Fred" not allowed while "strict subs" in use at - line 3.
+Execution of - aborted due to compilation errors.
+########
+
+--FILE-- abc
+my $a = Fred ;
+1;
+--FILE--
+use strict 'subs' ;
+require "./abc";
+EXPECT
+
+########
+
+--FILE-- abc
+use strict 'subs' ;
+1;
+--FILE--
+require "./abc";
+my $a = Fred ;
+EXPECT
+
+########
+
+--FILE-- abc
+use strict 'subs' ;
+my $a = Fred ;
+1;
+--FILE--
+Fred ;
+require "./abc";
+EXPECT
+Bareword "Fred" not allowed while "strict subs" in use at ./abc line 2.
+ at - line 2.
+########
+
+--FILE-- abc.pm
+use strict 'subs' ;
+my $a = Fred ;
+1;
+--FILE--
+Fred ;
+use abc;
+EXPECT
+Bareword "Fred" not allowed while "strict subs" in use at abc.pm line 2.
+ at - line 2.
+BEGIN failed--compilation aborted at - line 2.
+########
+
+# Check scope of pragma with eval
+no strict ;
+eval {
+ my $a = Fred ;
+};
+print STDERR $@;
+my $a = Fred ;
+EXPECT
+
+########
+
+# Check scope of pragma with eval
+no strict ;
+eval {
+ use strict 'subs' ;
+ my $a = Fred ;
+};
+print STDERR $@;
+my $a = Fred ;
+EXPECT
+Bareword "Fred" not allowed while "strict subs" in use at - line 6.
+Execution of - aborted due to compilation errors.
+########
+
+# Check scope of pragma with eval
+use strict 'subs' ;
+eval {
+ my $a = Fred ;
+};
+print STDERR $@;
+my $a = Fred ;
+EXPECT
+Bareword "Fred" not allowed while "strict subs" in use at - line 5.
+Bareword "Fred" not allowed while "strict subs" in use at - line 8.
+Execution of - aborted due to compilation errors.
+########
+
+# Check scope of pragma with eval
+use strict 'subs' ;
+eval {
+ no strict ;
+ my $a = Fred ;
+};
+print STDERR $@;
+my $a = Fred ;
+EXPECT
+Bareword "Fred" not allowed while "strict subs" in use at - line 9.
+Execution of - aborted due to compilation errors.
+########
+
+# Check scope of pragma with eval
+no strict ;
+eval '
+ Fred ;
+'; print STDERR $@ ;
+Fred ;
+EXPECT
+
+########
+
+# Check scope of pragma with eval
+no strict ;
+eval q[
+ use strict 'subs' ;
+ Fred ;
+]; print STDERR $@;
+EXPECT
+Bareword "Fred" not allowed while "strict subs" in use at (eval 1) line 3.
+########
+
+# Check scope of pragma with eval
+use strict 'subs' ;
+eval '
+ Fred ;
+'; print STDERR $@ ;
+EXPECT
+Bareword "Fred" not allowed while "strict subs" in use at (eval 1) line 2.
+########
+
+# Check scope of pragma with eval
+use strict 'subs' ;
+eval '
+ no strict ;
+ my $a = Fred ;
+'; print STDERR $@;
+my $a = Fred ;
+EXPECT
+Bareword "Fred" not allowed while "strict subs" in use at - line 8.
+Execution of - aborted due to compilation errors.
diff --git a/t/pragma/strict-vars b/t/pragma/strict-vars
new file mode 100644
index 0000000000..727eb2d4f2
--- /dev/null
+++ b/t/pragma/strict-vars
@@ -0,0 +1,225 @@
+Check strict vars functionality
+
+__END__
+
+# no strict, should build & run ok.
+Fred ;
+my $fred ;
+$b = "fred" ;
+$a = $$b ;
+EXPECT
+
+########
+
+use strict qw(subs refs) ;
+$fred ;
+EXPECT
+
+########
+
+use strict ;
+no strict 'vars' ;
+$fred ;
+EXPECT
+
+########
+
+# strict vars - no error
+use strict 'vars' ;
+use vars qw( $freddy) ;
+local $abc::joe ;
+my $fred ;
+my $b = \$fred ;
+$Fred::ABC = 1 ;
+$freddy = 2 ;
+EXPECT
+
+########
+
+# strict vars - error
+use strict ;
+$fred ;
+EXPECT
+Global symbol "fred" requires explicit package name at - line 4.
+Execution of - aborted due to compilation errors.
+########
+
+# strict vars - error
+use strict 'vars' ;
+$fred ;
+EXPECT
+Global symbol "fred" requires explicit package name at - line 4.
+Execution of - aborted due to compilation errors.
+########
+
+# strict vars - error
+use strict 'vars' ;
+local $fred ;
+EXPECT
+Global symbol "fred" requires explicit package name at - line 4.
+Execution of - aborted due to compilation errors.
+########
+
+# Check compile time scope of strict vars pragma
+use strict 'vars' ;
+{
+ no strict ;
+ $joe = 1 ;
+}
+$joe = 1 ;
+EXPECT
+Variable "$joe" is not imported at - line 8.
+Global symbol "joe" requires explicit package name at - line 8.
+Execution of - aborted due to compilation errors.
+########
+
+# Check compile time scope of strict vars pragma
+no strict;
+{
+ use strict 'vars' ;
+ $joe = 1 ;
+}
+$joe = 1 ;
+EXPECT
+Global symbol "joe" requires explicit package name at - line 6.
+Execution of - aborted due to compilation errors.
+########
+
+--FILE-- abc
+$joe = 1 ;
+1;
+--FILE--
+use strict 'vars' ;
+require "./abc";
+EXPECT
+
+########
+
+--FILE-- abc
+use strict 'vars' ;
+1;
+--FILE--
+require "./abc";
+$joe = 1 ;
+EXPECT
+
+########
+
+--FILE-- abc
+use strict 'vars' ;
+$joe = 1 ;
+1;
+--FILE--
+$joe = 1 ;
+require "./abc";
+EXPECT
+Variable "$joe" is not imported at ./abc line 2.
+Global symbol "joe" requires explicit package name at ./abc line 2.
+ at - line 2.
+########
+
+--FILE-- abc.pm
+use strict 'vars' ;
+$joe = 1 ;
+1;
+--FILE--
+$joe = 1 ;
+use abc;
+EXPECT
+Variable "$joe" is not imported at abc.pm line 2.
+Global symbol "joe" requires explicit package name at abc.pm line 2.
+ at - line 2.
+BEGIN failed--compilation aborted at - line 2.
+########
+
+# Check scope of pragma with eval
+no strict ;
+eval {
+ $joe = 1 ;
+};
+print STDERR $@;
+$joe = 1 ;
+EXPECT
+
+########
+
+# Check scope of pragma with eval
+no strict ;
+eval {
+ use strict 'vars' ;
+ $joe = 1 ;
+};
+print STDERR $@;
+$joe = 1 ;
+EXPECT
+Global symbol "joe" requires explicit package name at - line 6.
+Execution of - aborted due to compilation errors.
+########
+
+# Check scope of pragma with eval
+use strict 'vars' ;
+eval {
+ $joe = 1 ;
+};
+print STDERR $@;
+$joe = 1 ;
+EXPECT
+Global symbol "joe" requires explicit package name at - line 5.
+Variable "$joe" is not imported at - line 8.
+Global symbol "joe" requires explicit package name at - line 8.
+Execution of - aborted due to compilation errors.
+########
+
+# Check scope of pragma with eval
+use strict 'vars' ;
+eval {
+ no strict ;
+ $joe = 1 ;
+};
+print STDERR $@;
+$joe = 1 ;
+EXPECT
+Variable "$joe" is not imported at - line 9.
+Global symbol "joe" requires explicit package name at - line 9.
+Execution of - aborted due to compilation errors.
+########
+
+# Check scope of pragma with eval
+no strict ;
+eval '
+ $joe = 1 ;
+'; print STDERR $@ ;
+$joe = 1 ;
+EXPECT
+
+########
+
+# Check scope of pragma with eval
+no strict ;
+eval q[
+ use strict 'vars' ;
+ $joe = 1 ;
+]; print STDERR $@;
+EXPECT
+Global symbol "joe" requires explicit package name at (eval 1) line 3.
+########
+
+# Check scope of pragma with eval
+use strict 'vars' ;
+eval '
+ $joe = 1 ;
+'; print STDERR $@ ;
+EXPECT
+Global symbol "joe" requires explicit package name at (eval 1) line 2.
+########
+
+# Check scope of pragma with eval
+use strict 'vars' ;
+eval '
+ no strict ;
+ $joe = 1 ;
+'; print STDERR $@;
+$joe = 1 ;
+EXPECT
+Global symbol "joe" requires explicit package name at - line 8.
+Execution of - aborted due to compilation errors.
diff --git a/t/pragma/strict.t b/t/pragma/strict.t
new file mode 100755
index 0000000000..0ff849e2be
--- /dev/null
+++ b/t/pragma/strict.t
@@ -0,0 +1,88 @@
+#!./perl
+
+BEGIN {
+ chdir 't' if -d 't';
+ @INC = '../lib';
+ $ENV{PERL5LIB} = '../lib';
+}
+
+$| = 1;
+
+my $Is_VMS = $^O eq 'VMS';
+my $tmpfile = "tmp0000";
+my $i = 0 ;
+1 while -f ++$tmpfile;
+END { if ($tmpfile) { 1 while unlink $tmpfile; } }
+
+my @prgs = () ;
+
+foreach (sort glob("pragma/strict-*")) {
+
+ open F, "<$_" or die "Cannot open $_: $!\n" ;
+ while (<F>) {
+ last if /^__END__/ ;
+ }
+
+ {
+ local $/ = undef;
+ @prgs = (@prgs, split "\n########\n", <F>) ;
+ }
+ close F ;
+}
+
+undef $/;
+
+print "1..", scalar @prgs, "\n";
+
+
+for (@prgs){
+ my $switch = "";
+ my @temps = () ;
+ if (s/^\s*-\w+//){
+ $switch = $&;
+ }
+ my($prog,$expected) = split(/\nEXPECT\n/, $_);
+ if ( $prog =~ /--FILE--/) {
+ my(@files) = split(/\n--FILE--\s*([^\s\n]*)\s*\n/, $prog) ;
+ shift @files ;
+ die "Internal error test $i didn't split into pairs, got " .
+ scalar(@files) . "[" . join("%%%%", @files) ."]\n"
+ if @files % 2 ;
+ while (@files > 2) {
+ my $filename = shift @files ;
+ my $code = shift @files ;
+ push @temps, $filename ;
+ open F, ">$filename" or die "Cannot open $filename: $!\n" ;
+ print F $code ;
+ close F ;
+ }
+ shift @files ;
+ $prog = shift @files ;
+ }
+ open TEST, ">$tmpfile";
+ print TEST $prog,"\n";
+ close TEST;
+ my $results = $Is_VMS ?
+ `MCR $^X $switch $tmpfile` :
+ `sh -c './perl $switch $tmpfile' 2>&1`;
+ my $status = $?;
+ $results =~ s/\n+$//;
+ # allow expected output to be written as if $prog is on STDIN
+ $results =~ s/tmp\d+/-/g;
+ $results =~ s/\n%[A-Z]+-[SIWEF]-.*$// if $Is_VMS; # clip off DCL status msg
+ $expected =~ s/\n+$//;
+ my $prefix = ($results =~ s/^PREFIX\n//) ;
+ if ( $results =~ s/^SKIPPED\n//) {
+ print "$results\n" ;
+ }
+ elsif (($prefix and $results !~ /^\Q$expected/) or
+ (!$prefix and $results ne $expected)){
+ print STDERR "PROG: $switch\n$prog\n";
+ print STDERR "EXPECTED:\n$expected\n";
+ print STDERR "GOT:\n$results\n";
+ print "not ";
+ }
+ print "ok ", ++$i, "\n";
+ foreach (@temps)
+ { unlink $_ if $_ }
+}
diff --git a/t/pragma/subs.t b/t/pragma/subs.t
new file mode 100755
index 0000000000..33180066e0
--- /dev/null
+++ b/t/pragma/subs.t
@@ -0,0 +1,129 @@
+#!./perl
+
+BEGIN {
+ chdir 't' if -d 't';
+ @INC = '../lib';
+ $ENV{PERL5LIB} = '../lib';
+}
+
+$| = 1;
+undef $/;
+my @prgs = split "\n########\n", <DATA>;
+print "1..", scalar @prgs, "\n";
+
+my $Is_VMS = $^O eq 'VMS';
+my $tmpfile = "tmp0000";
+my $i = 0 ;
+1 while -f ++$tmpfile;
+END { if ($tmpfile) { 1 while unlink $tmpfile} }
+
+for (@prgs){
+ my $switch = "";
+ my @temps = () ;
+ if (s/^\s*-\w+//){
+ $switch = $&;
+ }
+ my($prog,$expected) = split(/\nEXPECT\n/, $_);
+ if ( $prog =~ /--FILE--/) {
+ my(@files) = split(/\n--FILE--\s*([^\s\n]*)\s*\n/, $prog) ;
+ shift @files ;
+ die "Internal error test $i didn't split into pairs, got " .
+ scalar(@files) . "[" . join("%%%%", @files) ."]\n"
+ if @files % 2 ;
+ while (@files > 2) {
+ my $filename = shift @files ;
+ my $code = shift @files ;
+ push @temps, $filename ;
+ open F, ">$filename" or die "Cannot open $filename: $!\n" ;
+ print F $code ;
+ close F ;
+ }
+ shift @files ;
+ $prog = shift @files ;
+ }
+ open TEST, ">$tmpfile";
+ print TEST $prog,"\n";
+ close TEST;
+ my $results = $Is_VMS ?
+ `MCR $^X $switch $tmpfile` :
+ `sh -c './perl $switch $tmpfile' 2>&1`;
+ my $status = $?;
+ $results =~ s/\n+$//;
+ # allow expected output to be written as if $prog is on STDIN
+ $results =~ s/tmp\d+/-/g;
+ $results =~ s/\n%[A-Z]+-[SIWEF]-.*$// if $Is_VMS; # clip off DCL status msg
+ $expected =~ s/\n+$//;
+ my $prefix = ($results =~ s/^PREFIX\n//) ;
+ if ( $results =~ s/^SKIPPED\n//) {
+ print "$results\n" ;
+ }
+ elsif (($prefix and $results !~ /^\Q$expected/) or
+ (!$prefix and $results ne $expected)){
+ print STDERR "PROG: $switch\n$prog\n";
+ print STDERR "EXPECTED:\n$expected\n";
+ print STDERR "GOT:\n$results\n";
+ print "not ";
+ }
+ print "ok ", ++$i, "\n";
+ foreach (@temps)
+ { unlink $_ if $_ }
+}
+
+__END__
+
+# Error - not predeclaring a sub
+Fred 1,2 ;
+sub Fred {}
+EXPECT
+Number found where operator expected at - line 3, near "Fred 1"
+ (Do you need to predeclare Fred?)
+syntax error at - line 3, near "Fred 1"
+Execution of - aborted due to compilation errors.
+########
+
+# Error - not predeclaring a sub in time
+Fred 1,2 ;
+use subs qw( Fred ) ;
+sub Fred {}
+EXPECT
+Number found where operator expected at - line 3, near "Fred 1"
+ (Do you need to predeclare Fred?)
+syntax error at - line 3, near "Fred 1"
+Execution of - aborted due to compilation errors.
+########
+
+# AOK
+use subs qw( Fred) ;
+Fred 1,2 ;
+sub Fred { print $_[0] + $_[1], "\n" }
+EXPECT
+3
+########
+
+# override a built-in function
+use subs qw( open ) ;
+open 1,2 ;
+sub open { print $_[0] + $_[1], "\n" }
+EXPECT
+3
+########
+
+--FILE-- abc
+Fred 1,2 ;
+1;
+--FILE--
+use subs qw( Fred ) ;
+require "./abc" ;
+sub Fred { print $_[0] + $_[1], "\n" }
+EXPECT
+3
+########
+
+# check that it isn't affected by block scope
+{
+ use subs qw( Fred ) ;
+}
+Fred 1, 2;
+sub Fred { print $_[0] + $_[1], "\n" }
+EXPECT
+3
diff --git a/t/pragma/warn-1global b/t/pragma/warn-1global
new file mode 100644
index 0000000000..33252731b0
--- /dev/null
+++ b/t/pragma/warn-1global
@@ -0,0 +1,146 @@
+Check existing $^W functionality
+
+__END__
+
+# warnable code, warnings disabled
+$a =+ 3 ;
+EXPECT
+
+########
+-w
+# warnable code, warnings enabled via command line switch
+$a =+ 3 ;
+EXPECT
+Reversed += operator at - line 3.
+########
+#! perl -w
+# warnable code, warnings enabled via #! line
+$a =+ 3 ;
+EXPECT
+Reversed += operator at - line 3.
+########
+
+# warnable code, warnings enabled via compile time $^W
+BEGIN { $^W = 1 }
+$a =+ 3 ;
+EXPECT
+Reversed += operator at - line 4.
+########
+
+# compile-time warnable code, warnings enabled via runtime $^W
+# so no warning printed.
+$^W = 1 ;
+$a =+ 3 ;
+EXPECT
+
+########
+
+# warnable code, warnings enabled via runtime $^W
+$^W = 1 ;
+my $b ; chop $b ;
+EXPECT
+Use of uninitialized value at - line 4.
+########
+
+# warnings enabled at compile time, disabled at run time
+BEGIN { $^W = 1 }
+$^W = 0 ;
+my $b ; chop $b ;
+EXPECT
+
+########
+
+# warnings disabled at compile time, enabled at run time
+BEGIN { $^W = 0 }
+$^W = 1 ;
+my $b ; chop $b ;
+EXPECT
+Use of uninitialized value at - line 5.
+########
+-w
+--FILE-- abcd
+my $b ; chop $b ;
+1 ;
+--FILE--
+require "./abcd";
+EXPECT
+Use of uninitialized value at ./abcd line 1.
+########
+
+--FILE-- abcd
+my $b ; chop $b ;
+1 ;
+--FILE--
+#! perl -w
+require "./abcd";
+EXPECT
+Use of uninitialized value at ./abcd line 1.
+########
+
+--FILE-- abcd
+my $b ; chop $b ;
+1 ;
+--FILE--
+$^W =1 ;
+require "./abcd";
+EXPECT
+Use of uninitialized value at ./abcd line 1.
+########
+
+--FILE-- abcd
+$^W = 0;
+my $b ; chop $b ;
+1 ;
+--FILE--
+$^W =1 ;
+require "./abcd";
+EXPECT
+
+########
+
+--FILE-- abcd
+$^W = 1;
+1 ;
+--FILE--
+$^W =0 ;
+require "./abcd";
+my $b ; chop $b ;
+EXPECT
+Use of uninitialized value at - line 3.
+########
+
+$^W = 1;
+eval "my $b ; chop $b ;" ;
+EXPECT
+Use of uninitialized value at - line 3.
+Use of uninitialized value at - line 3.
+########
+
+eval "$^W = 1;" ;
+my $b ; chop $b ;
+EXPECT
+
+########
+
+eval {$^W = 1;} ;
+my $b ; chop $b ;
+EXPECT
+Use of uninitialized value at - line 3.
+########
+
+{
+ local ($^W) = 1;
+}
+my $b ; chop $b ;
+EXPECT
+
+########
+
+my $a ; chop $a ;
+{
+ local ($^W) = 1;
+ my $b ; chop $b ;
+}
+my $c ; chop $c ;
+EXPECT
+Use of uninitialized value at - line 5.
diff --git a/t/pragma/warning.t b/t/pragma/warning.t
new file mode 100755
index 0000000000..3cb5c73569
--- /dev/null
+++ b/t/pragma/warning.t
@@ -0,0 +1,89 @@
+#!./perl
+
+BEGIN {
+ chdir 't' if -d 't';
+ @INC = '../lib';
+ $ENV{PERL5LIB} = '../lib';
+}
+
+$| = 1;
+
+my $Is_VMS = $^O eq 'VMS';
+my $tmpfile = "tmp0000";
+my $i = 0 ;
+1 while -f ++$tmpfile;
+END { if ($tmpfile) { 1 while unlink $tmpfile} }
+
+my @prgs = () ;
+
+foreach (sort glob("pragma/warn-*")) {
+
+ open F, "<$_" or die "Cannot open $_: $!\n" ;
+ while (<F>) {
+ last if /^__END__/ ;
+ }
+
+ {
+ local $/ = undef;
+ @prgs = (@prgs, split "\n########\n", <F>) ;
+ }
+ close F ;
+}
+
+undef $/;
+
+print "1..", scalar @prgs, "\n";
+
+
+for (@prgs){
+ my $switch = "";
+ my @temps = () ;
+ if (s/^\s*-\w+//){
+ $switch = $&;
+ $switch =~ s/(-\S*[A-Z]\S*)/"-$1"/ if $Is_VMS; # protect uc switches
+ }
+ my($prog,$expected) = split(/\nEXPECT\n/, $_);
+ if ( $prog =~ /--FILE--/) {
+ my(@files) = split(/\n--FILE--\s*([^\s\n]*)\s*\n/, $prog) ;
+ shift @files ;
+ die "Internal error test $i didn't split into pairs, got " .
+ scalar(@files) . "[" . join("%%%%", @files) ."]\n"
+ if @files % 2 ;
+ while (@files > 2) {
+ my $filename = shift @files ;
+ my $code = shift @files ;
+ push @temps, $filename ;
+ open F, ">$filename" or die "Cannot open $filename: $!\n" ;
+ print F $code ;
+ close F ;
+ }
+ shift @files ;
+ $prog = shift @files ;
+ }
+ open TEST, ">$tmpfile";
+ print TEST $prog,"\n";
+ close TEST;
+ my $results = $Is_VMS ?
+ `MCR $^X $switch $tmpfile` :
+ `sh -c './perl $switch $tmpfile' 2>&1`;
+ my $status = $?;
+ $results =~ s/\n+$//;
+ # allow expected output to be written as if $prog is on STDIN
+ $results =~ s/tmp\d+/-/g;
+ $results =~ s/\n%[A-Z]+-[SIWEF]-.*$// if $Is_VMS; # clip off DCL status msg
+ $expected =~ s/\n+$//;
+ my $prefix = ($results =~ s/^PREFIX\n//) ;
+ if ( $results =~ s/^SKIPPED\n//) {
+ print "$results\n" ;
+ }
+ elsif (($prefix and $results !~ /^\Q$expected/) or
+ (!$prefix and $results ne $expected)){
+ print STDERR "PROG: $switch\n$prog\n";
+ print STDERR "EXPECTED:\n$expected\n";
+ print STDERR "GOT:\n$results\n";
+ print "not ";
+ }
+ print "ok ", ++$i, "\n";
+ foreach (@temps)
+ { unlink $_ if $_ }
+}
diff --git a/toke.c b/toke.c
index 913368a63e..ad978a884b 100644
--- a/toke.c
+++ b/toke.c
@@ -1013,7 +1013,7 @@ GV *gv;
if (gv) {
if (GvIO(gv))
return 0;
- if (!GvCV(gv))
+ if (!GvCVu(gv))
gv = 0;
}
s = scan_word(s, tmpbuf, TRUE, &len);
@@ -1027,7 +1027,7 @@ GV *gv;
}
if (!keyword(tmpbuf, len)) {
indirgv = gv_fetchpv(tmpbuf,FALSE, SVt_PVCV);
- if (indirgv && GvCV(indirgv))
+ if (indirgv && GvCVu(indirgv))
return 0;
/* filehandle or package name makes it a method */
if (!gv || GvIO(indirgv) || gv_stashpvn(tmpbuf, len, FALSE)) {
@@ -1566,11 +1566,78 @@ yylex()
s++;
if (*s == ':' && s[1] != ':') /* for csh execing sh scripts */
s++;
- if (!in_eval && *s == '#' && s[1] == '!') {
+ d = Nullch;
+ if (!in_eval) {
+ if (*s == '#' && *(s+1) == '!')
+ d = s + 2;
+#ifdef ALTERNATE_SHEBANG
+ else {
+ static char as[] = ALTERNATE_SHEBANG;
+ if (*s == as[0] && strnEQ(s, as, sizeof(as) - 1))
+ d = s + (sizeof(as) - 1);
+ }
+#endif /* ALTERNATE_SHEBANG */
+ }
+ if (d) {
+ /*
+ * HP-UX (at least) sets argv[0] to the script name,
+ * which makes $^X incorrect. And Digital UNIX and Linux,
+ * at least, set argv[0] to the basename of the Perl
+ * interpreter. So, having found "#!", we'll set it right.
+ */
+ SV *x = GvSV(gv_fetchpv("\030", TRUE, SVt_PV));
+ char *ipath;
+ char *ibase;
+
+ while (*d == ' ' || *d == '\t')
+ d++;
+ ipath = d;
+ ibase = Nullch;
+ while (*d && !isSPACE(*d)) {
+ if (*d++ == '/')
+ ibase = d;
+ }
+ assert(SvPOK(x) || SvGMAGICAL(x));
+ if (sv_eq(x, GvSV(curcop->cop_filegv))
+ || (ibase
+ && SvCUR(x) == (d - ibase)
+ && strnEQ(SvPVX(x), ibase, d - ibase)))
+ sv_setpvn(x, ipath, d - ipath);
+ /*
+ * $^X is always tainted, but taintedness must be off
+ * when parsing code, so forget we ever saw it.
+ */
+ TAINT_NOT;
+
+ /*
+ * Look for options.
+ */
d = instr(s,"perl -");
if (!d)
d = instr(s,"perl");
+#ifdef ALTERNATE_SHEBANG
+ /*
+ * If the ALTERNATE_SHEBANG on this system starts with a
+ * character that can be part of a Perl expression, then if
+ * we see it but not "perl", we're probably looking at the
+ * start of Perl code, not a request to hand off to some
+ * other interpreter. Similarly, if "perl" is there, but
+ * not in the first 'word' of the line, we assume the line
+ * contains the start of the Perl program.
+ * This isn't foolproof, but it's generally a good guess.
+ */
+ if (d && *s != '#') {
+ char *c = s;
+ while (*c && !strchr("; \t\r\n\f\v#", *c))
+ c++;
+ if (c < d)
+ d = Nullch; /* "perl" not in first word; ignore */
+ else
+ *s = '#'; /* Don't try to parse shebang line */
+ }
+#endif
if (!d &&
+ *s == '#' &&
!minus_c &&
!instr(s,"indir") &&
instr(origargv[0],"perl"))
@@ -1857,17 +1924,29 @@ yylex()
case XOPERATOR:
while (s < bufend && (*s == ' ' || *s == '\t'))
s++;
- if (s < bufend && isIDFIRST(*s)) {
- d = scan_word(s, tokenbuf, FALSE, &len);
+ d = s;
+ tokenbuf[0] = '\0';
+ if (d < bufend && *d == '-') {
+ tokenbuf[0] = '-';
+ d++;
+ while (d < bufend && (*d == ' ' || *d == '\t'))
+ d++;
+ }
+ if (d < bufend && isIDFIRST(*d)) {
+ d = scan_word(d, tokenbuf + 1, FALSE, &len);
while (d < bufend && (*d == ' ' || *d == '\t'))
d++;
if (*d == '}') {
+ char minus = (tokenbuf[0] == '-');
if (dowarn &&
- (keyword(tokenbuf, len) ||
- perl_get_cv(tokenbuf, FALSE) ))
+ (keyword(tokenbuf + 1, len) ||
+ (minus && len == 1 && isALPHA(tokenbuf[1])) ||
+ perl_get_cv(tokenbuf + 1, FALSE) ))
warn("Ambiguous use of {%s} resolved to {\"%s\"}",
- tokenbuf, tokenbuf);
- s = force_word(s,WORD,FALSE,TRUE,FALSE);
+ tokenbuf + !minus, tokenbuf + !minus);
+ s = force_word(s + minus, WORD, FALSE, TRUE, FALSE);
+ if (minus)
+ force_next('-');
}
}
/* FALL THROUGH */
@@ -2335,8 +2414,15 @@ yylex()
keylookup:
bufptr = s;
s = scan_word(s, tokenbuf, FALSE, &len);
-
- if (*s == ':' && s[1] == ':' && strNE(tokenbuf, "CORE"))
+
+ /* Some keywords can be followed by any delimiter, including ':' */
+ tmp = (len == 1 && strchr("msyq", tokenbuf[0]) ||
+ len == 2 && ((tokenbuf[0] == 't' && tokenbuf[1] == 'r') ||
+ (tokenbuf[0] == 'q' &&
+ strchr("qwx", tokenbuf[1]))));
+
+ /* x::* is just a word, unless x is "CORE" */
+ if (!tmp && *s == ':' && s[1] == ':' && strNE(tokenbuf, "CORE"))
goto just_a_word;
d = s;
@@ -2344,18 +2430,12 @@ yylex()
d++; /* no comments skipped here, or s### is misparsed */
/* Is this a label? */
- if (expect == XSTATE && d < bufend && *d == ':' && *(d + 1) != ':') {
- if (len == 1 && strchr("syq", tokenbuf[0]) ||
- len == 2 && ((tokenbuf[0] == 't' && tokenbuf[1] == 'r') ||
- (tokenbuf[0] == 'q' &&
- strchr("qwx", tokenbuf[1]))))
- ; /* no */
- else {
- s = d + 1;
- yylval.pval = savepv(tokenbuf);
- CLINE;
- TOKEN(LABEL);
- }
+ if (!tmp && expect == XSTATE
+ && d < bufend && *d == ':' && *(d + 1) != ':') {
+ s = d + 1;
+ yylval.pval = savepv(tokenbuf);
+ CLINE;
+ TOKEN(LABEL);
}
/* Check for keywords */
@@ -2444,7 +2524,7 @@ yylex()
/* (But it's an indir obj regardless for sort.) */
if ((last_lop_op == OP_SORT ||
- (!immediate_paren && (!gv || !GvCV(gv))) ) &&
+ (!immediate_paren && (!gv || !GvCVu(gv))) ) &&
(last_lop_op != OP_MAPSTART && last_lop_op != OP_GREPSTART)){
expect = (last_lop == oldoldbufptr) ? XTERM : XOPERATOR;
goto bareword;
@@ -2466,7 +2546,7 @@ yylex()
/* If followed by var or block, call it a method (unless sub) */
- if ((*s == '$' || *s == '{') && (!gv || !GvCV(gv))) {
+ if ((*s == '$' || *s == '{') && (!gv || !GvCVu(gv))) {
last_lop = oldbufptr;
last_lop_op = OP_METHOD;
PREBLOCK(METHOD);
@@ -2479,7 +2559,7 @@ yylex()
/* Not a method, so call it a subroutine (if defined) */
- if (gv && GvCV(gv)) {
+ if (gv && GvCVu(gv)) {
CV* cv = GvCV(gv);
if (*s == '(') {
nextval[nexttoke].opval = yylval.opval;
diff --git a/unixish.h b/unixish.h
index 4474563755..e8ff11a107 100644
--- a/unixish.h
+++ b/unixish.h
@@ -69,6 +69,18 @@
*/
/* #define VMS / **/
+/* ALTERNATE_SHEBANG:
+ * This symbol, if defined, contains a "magic" string which may be used
+ * as the first line of a Perl program designed to be executed directly
+ * by name, instead of the standard Unix #!. If ALTERNATE_SHEBANG
+ * begins with a character other then #, then Perl will only treat
+ * it as a command line if if finds the string "perl" in the first
+ * word; otherwise it's treated as the first line of code in the script.
+ * (IOW, Perl won't hand off to another interpreter via an alternate
+ * shebang sequence that might be legal Perl code.)
+ */
+/* #define ALTERNATE_SHEBANG "#!" / **/
+
#if !defined(NSIG) || defined(M_UNIX) || defined(M_XENIX)
# include <signal.h>
#endif
diff --git a/util.c b/util.c
index 84c55730df..95d34e205d 100644
--- a/util.c
+++ b/util.c
@@ -548,24 +548,60 @@ perl_init_i18nl10n(printwarn)
#ifdef USE_LOCALE
-#ifdef LC_ALL
- char *lc_all = getenv("LC_ALL");
-#endif /* LC_ALL */
#ifdef USE_LOCALE_CTYPE
- char *lc_ctype = getenv("LC_CTYPE");
char *curctype = NULL;
#endif /* USE_LOCALE_CTYPE */
#ifdef USE_LOCALE_COLLATE
- char *lc_collate = getenv("LC_COLLATE");
char *curcoll = NULL;
#endif /* USE_LOCALE_COLLATE */
#ifdef USE_LOCALE_NUMERIC
- char *lc_numeric = getenv("LC_NUMERIC");
char *curnum = NULL;
#endif /* USE_LOCALE_NUMERIC */
+ char *lc_all = getenv("LC_ALL");
char *lang = getenv("LANG");
bool setlocale_failure = FALSE;
+#ifdef LOCALE_ENVIRON_REQUIRED
+
+ /*
+ * Ultrix setlocale(..., "") fails if there are no environment
+ * variables from which to get a locale name.
+ */
+
+ bool done = FALSE;
+
+#ifdef LC_ALL
+ if (lang) {
+ if (setlocale(LC_ALL, ""))
+ done = TRUE;
+ else
+ setlocale_failure = TRUE;
+ }
+ if (!setlocale_failure)
+#endif /* LC_ALL */
+ {
+#ifdef USE_LOCALE_CTYPE
+ if (! (curctype = setlocale(LC_CTYPE,
+ (!done && (lang || getenv("LC_CTYPE")))
+ ? "" : Nullch)))
+ setlocale_failure = TRUE;
+#endif /* USE_LOCALE_CTYPE */
+#ifdef USE_LOCALE_COLLATE
+ if (! (curcoll = setlocale(LC_COLLATE,
+ (!done && (lang || getenv("LC_COLLATE")))
+ ? "" : Nullch)))
+ setlocale_failure = TRUE;
+#endif /* USE_LOCALE_COLLATE */
+#ifdef USE_LOCALE_NUMERIC
+ if (! (curnum = setlocale(LC_NUMERIC,
+ (!done && (lang || getenv("LC_NUMERIC")))
+ ? "" : Nullch)))
+ setlocale_failure = TRUE;
+#endif /* USE_LOCALE_NUMERIC */
+ }
+
+#else /* !LOCALE_ENVIRON_REQUIRED */
+
#ifdef LC_ALL
if (! setlocale(LC_ALL, ""))
@@ -599,6 +635,8 @@ perl_init_i18nl10n(printwarn)
#endif /* LC_ALL */
+#endif /* !LOCALE_ENVIRON_REQUIRED */
+
if (setlocale_failure) {
char *p;
bool locwarn = (printwarn > 1 ||
@@ -634,13 +672,11 @@ perl_init_i18nl10n(printwarn)
PerlIO_printf(PerlIO_stderr(),
"perl: warning: Please check that your locale settings:\n");
-#ifdef LC_ALL
PerlIO_printf(PerlIO_stderr(),
"\tLC_ALL = %c%s%c,\n",
lc_all ? '"' : '(',
lc_all ? lc_all : "unset",
lc_all ? '"' : ')');
-#endif /* LC_ALL */
{
char **e;
@@ -1063,7 +1099,7 @@ mess(pat, args)
if (usermess) {
tmpstr = sv_newmortal();
sv_setpv(tmpstr, va_arg(*args, char *));
- *s++ = SvPVX(tmpstr)[SvCUR(tmpstr)-1];
+ *s++ = SvCUR(tmpstr) ? SvPVX(tmpstr)[SvCUR(tmpstr)-1] : ' ';
}
else {
(void) vsprintf(s,pat,*args);
@@ -1145,18 +1181,26 @@ die(pat, va_alist)
message = mess(pat, &args);
va_end(args);
- if (diehook && (cv = sv_2cv(diehook, &stash, &gv, 0)) && !CvDEPTH(cv)) {
- dSP;
- SV *msg = sv_2mortal(newSVpv(message, 0));
+ if (diehook) {
+ /* sv_2cv might call croak() */
+ SV *olddiehook = diehook;
+ ENTER;
+ SAVESPTR(diehook);
+ diehook = Nullsv;
+ cv = sv_2cv(olddiehook, &stash, &gv, 0);
+ LEAVE;
+ if (cv && !CvDEPTH(cv) && (CvROOT(cv) || CvXSUB(cv))) {
+ dSP;
+ SV *msg = sv_2mortal(newSVpv(message, 0));
- PUSHMARK(sp);
- EXTEND(sp, 1);
- PUSHs(msg);
- PUTBACK;
- perl_call_sv((SV*)cv, G_DISCARD);
+ PUSHMARK(sp);
+ XPUSHs(msg);
+ PUTBACK;
+ perl_call_sv((SV*)cv, G_DISCARD);
- /* It's okay for the __DIE__ hook to modify the message. */
- message = SvPV(msg, na);
+ /* It's okay for the __DIE__ hook to modify the message. */
+ message = SvPV(msg, na);
+ }
}
restartop = die_where(message);
@@ -1190,17 +1234,19 @@ croak(pat, va_alist)
message = mess(pat, &args);
va_end(args);
if (diehook) {
+ /* sv_2cv might call croak() */
SV *olddiehook = diehook;
- diehook = Nullsv; /* sv_2cv might call croak() */
+ ENTER;
+ SAVESPTR(diehook);
+ diehook = Nullsv;
cv = sv_2cv(olddiehook, &stash, &gv, 0);
- diehook = olddiehook;
- if (cv && !CvDEPTH(cv)) {
+ LEAVE;
+ if (cv && !CvDEPTH(cv) && (CvROOT(cv) || CvXSUB(cv))) {
dSP;
SV *msg = sv_2mortal(newSVpv(message, 0));
PUSHMARK(sp);
- EXTEND(sp, 1);
- PUSHs(msg);
+ XPUSHs(msg);
PUTBACK;
perl_call_sv((SV*)cv, G_DISCARD);
@@ -1256,16 +1302,17 @@ warn(pat,va_alist)
va_end(args);
if (warnhook) {
+ /* sv_2cv might call warn() */
SV *oldwarnhook = warnhook;
- warnhook = Nullsv; /* sv_2cv might end up calling warn() */
+ ENTER;
+ SAVESPTR(warnhook);
+ warnhook = Nullsv;
cv = sv_2cv(oldwarnhook, &stash, &gv, 0);
- warnhook = oldwarnhook;
- if (cv && !CvDEPTH(cv)) {
+ LEAVE;
+ if (cv && !CvDEPTH(cv) && (CvROOT(cv) || CvXSUB(cv))) {
dSP;
-
PUSHMARK(sp);
- EXTEND(sp, 1);
- PUSHs(sv_2mortal(newSVpv(message,0)));
+ XPUSHs(sv_2mortal(newSVpv(message,0)));
PUTBACK;
perl_call_sv((SV*)cv, G_DISCARD);
return;
@@ -1601,12 +1648,7 @@ char *mode;
register I32 this, that;
register I32 pid;
SV *sv;
- I32 doexec =
-#ifdef AMIGAOS
- 1;
-#else
- strNE(cmd,"-");
-#endif
+ I32 doexec = strNE(cmd,"-");
#ifdef OS2
if (doexec) {
diff --git a/utils/c2ph.PL b/utils/c2ph.PL
index 5f4523aa84..9f80bc04a6 100644
--- a/utils/c2ph.PL
+++ b/utils/c2ph.PL
@@ -12,10 +12,8 @@ use File::Basename qw(&basename &dirname);
# This forces PL files to create target in same directory as PL file.
# This is so that make depend always knows where to find PL derivatives.
-chdir(dirname($0));
-($file = basename($0)) =~ s/\.PL$//;
-$file =~ s/\.pl$//
- if ($^O eq 'VMS' or $^O eq 'os2'); # "case-forgiving"
+chdir dirname($0);
+$file = basename($0, '.PL');
open OUT,">$file" or die "Can't create $file: $!";
diff --git a/utils/h2ph.PL b/utils/h2ph.PL
index 1b2ce312a0..bfd606d399 100644
--- a/utils/h2ph.PL
+++ b/utils/h2ph.PL
@@ -13,10 +13,8 @@ use File::Basename qw(&basename &dirname);
# This forces PL files to create target in same directory as PL file.
# This is so that make depend always knows where to find PL derivatives.
-chdir(dirname($0));
-($file = basename($0)) =~ s/\.PL$//;
-$file =~ s/\.pl$//
- if ($^O eq 'VMS' or $^O eq 'os2'); # "case-forgiving"
+chdir dirname($0);
+$file = basename($0, '.PL');
open OUT,">$file" or die "Can't create $file: $!";
diff --git a/utils/h2xs.PL b/utils/h2xs.PL
index 73df801a24..466fdab9b8 100644
--- a/utils/h2xs.PL
+++ b/utils/h2xs.PL
@@ -12,10 +12,8 @@ use File::Basename qw(&basename &dirname);
# This forces PL files to create target in same directory as PL file.
# This is so that make depend always knows where to find PL derivatives.
-chdir(dirname($0));
-($file = basename($0)) =~ s/\.PL$//;
-$file =~ s/\.pl$//
- if ($^O eq 'VMS' or $^O eq 'os2'); # "case-forgiving"
+chdir dirname($0);
+$file = basename($0, '.PL');
open OUT,">$file" or die "Can't create $file: $!";
diff --git a/utils/perlbug.PL b/utils/perlbug.PL
index 7f894d89a2..ceda89d4d8 100644
--- a/utils/perlbug.PL
+++ b/utils/perlbug.PL
@@ -12,10 +12,8 @@ use File::Basename qw(&basename &dirname);
# This forces PL files to create target in same directory as PL file.
# This is so that make depend always knows where to find PL derivatives.
-chdir(dirname($0));
-($file = basename($0)) =~ s/\.PL$//;
-$file =~ s/\.pl$//
- if ($^O eq 'VMS' or $^O eq 'os2'); # "case-forgiving"
+chdir dirname($0);
+$file = basename($0, '.PL');
open OUT,">$file" or die "Can't create $file: $!";
diff --git a/utils/perldoc.PL b/utils/perldoc.PL
index e0f8a43b86..28bb464f85 100644
--- a/utils/perldoc.PL
+++ b/utils/perldoc.PL
@@ -12,10 +12,8 @@ use File::Basename qw(&basename &dirname);
# This forces PL files to create target in same directory as PL file.
# This is so that make depend always knows where to find PL derivatives.
-chdir(dirname($0));
-($file = basename($0)) =~ s/\.PL$//;
-$file =~ s/\.pl$//
- if ($^O eq 'VMS' or $^O eq 'os2'); # "case-forgiving"
+chdir dirname($0);
+$file = basename($0, '.PL');
open OUT,">$file" or die "Can't create $file: $!";
@@ -47,7 +45,7 @@ print OUT <<'!NO!SUBS!';
if(@ARGV<1) {
die <<EOF;
-Usage: $0 [-h] [-v] [-t] [-u] [-m] PageName|ModuleName|ProgramName
+Usage: $0 [-h] [-v] [-t] [-u] [-m] [-l] PageName|ModuleName|ProgramName
We suggest you use "perldoc perldoc" to get aquainted
with the system.
@@ -68,6 +66,7 @@ perldoc [-h] [-v] [-u] PageName|ModuleName|ProgramName...
-t Display pod using pod2text instead of pod2man and nroff.
-u Display unformatted pod text
-m Display modules file in its entirety
+ -l Display the modules file name
-v Verbosely describe what's going on.
PageName|ModuleName...
is the name of a piece of documentation that you want to look at. You
@@ -87,11 +86,11 @@ use Text::ParseWords;
unshift(@ARGV,shellwords($ENV{"PERLDOC"}));
-getopts("mhtuv") || usage;
+getopts("mhtluv") || usage;
usage if $opt_h || $opt_h; # avoid -w warning
-usage("only one of -t, -u, or -m") if $opt_t + $opt_u + $opt_m > 1;
+usage("only one of -t, -u, -m or -l") if $opt_t + $opt_u + $opt_m + $opt_l > 1;
if ($opt_t) { require Pod::Text; import Pod::Text; }
@@ -150,6 +149,7 @@ sub containspod {
my($recurse,$s,@dirs) = @_;
$s =~ s!::!/!g;
$s = VMS::Filespec::unixify($s) if $Is_VMS;
+ return $s if -f $s && containspod($s);
printf STDERR "looking for $s in @dirs\n" if $opt_v;
my $ret;
my $i;
@@ -218,19 +218,22 @@ if(!@found) {
exit ($Is_VMS ? 98962 : 1);
}
+if ($opt_l) {
+ print join("\n", @found), "\n";
+ exit;
+}
+
if( ! -t STDOUT ) { $opt_f = 1 }
unless($Is_VMS) {
$tmp = "/tmp/perldoc1.$$";
push @pagers, qw( more less pg view cat );
unshift @pagers, $ENV{PAGER} if $ENV{PAGER};
- $goodresult = 0;
} else {
$tmp = 'Sys$Scratch:perldoc.tmp1_'.$$;
push @pagers, qw( most more less type/page );
- unshift @pagers, $ENV{PERLDOC_PAGER} if $ENV{PERLDOC_PAGER};
- $goodresult = 1;
}
+unshift @pagers, $ENV{PERLDOC_PAGER} if $ENV{PERLDOC_PAGER};
if ($opt_m) {
foreach $pager (@pagers) {
@@ -297,7 +300,7 @@ perldoc - Look up Perl documentation in pod format.
=head1 SYNOPSIS
-B<perldoc> [B<-h>] [B<-v>] [B<-t>] [B<-u>] PageName|ModuleName|ProgramName
+B<perldoc> [B<-h>] [B<-v>] [B<-t>] [B<-u>] [B<-m>] [B<-l>] PageName|ModuleName|ProgramName
=head1 DESCRIPTION
@@ -338,6 +341,10 @@ This may be useful if the docs don't explain a function in the detail
you need, and you'd like to inspect the code directly; perldoc will find
the file for you and simply hand it off for display.
+=item B<-l> file name only
+
+Display the file name of the module found.
+
=item B<PageName|ModuleName|ProgramName>
The item you want to look up. Nested modules (such as C<File::Basename>)
@@ -364,10 +371,6 @@ Kenneth Albanowski <kjahds@kjahds.com>
Minor updates by Andy Dougherty <doughera@lafcol.lafayette.edu>
-=head1 SEE ALSO
-
-=head1 DIAGNOSTICS
-
=cut
#
diff --git a/utils/pl2pm.PL b/utils/pl2pm.PL
index 8d47481341..7c187ade35 100644
--- a/utils/pl2pm.PL
+++ b/utils/pl2pm.PL
@@ -12,10 +12,8 @@ use File::Basename qw(&basename &dirname);
# This forces PL files to create target in same directory as PL file.
# This is so that make depend always knows where to find PL derivatives.
-chdir(dirname($0));
-($file = basename($0)) =~ s/\.PL$//;
-$file =~ s/\.pl$//
- if ($^O eq 'VMS' or $^O eq 'os2'); # "case-forgiving"
+chdir dirname($0);
+$file = basename($0, '.PL');
open OUT,">$file" or die "Can't create $file: $!";
diff --git a/utils/splain.PL b/utils/splain.PL
index 53954db65a..ef7c457dda 100644
--- a/utils/splain.PL
+++ b/utils/splain.PL
@@ -13,10 +13,8 @@ use File::Basename qw(&basename &dirname);
# This forces PL files to create target in same directory as PL file.
# This is so that make depend always knows where to find PL derivatives.
-chdir(dirname($0));
-($file = basename($0)) =~ s/\.PL$//;
-$file =~ s/\.pl$//
- if ($^O eq 'VMS' or $^O eq 'os2'); # "case-forgiving"
+chdir dirname($0);
+$file = basename($0, '.PL');
# Open input file before creating output file.
$IN = '../lib/diagnostics.pm';
diff --git a/vms/Makefile b/vms/Makefile
index 542e139e59..bf6a428d8b 100644
--- a/vms/Makefile
+++ b/vms/Makefile
@@ -18,33 +18,21 @@
#### Start of system configuration section. ####
-#> .ifdef AXE
# File type to use for object files
-#> O = .abj
# File type to use for object libraries
-#> OLB = .alb
# File type to use for executable images
-#> E = .axe
-#> .else
# File type to use for object files
O = .obj
# File type to use for object libraries
OLB = .olb
# File type to use for executable images
E = .exe
-#> .endif
-#> .ifdef __AXP__
-#> DECC = 1
-#> ARCH = VMS_AXP
-#> OBJVAL = $(O)
-#> .else
ARCH = VMS_VAX
OBJVAL = $@
-#> .endif
# Updated by fndvers.com -- do not edit by hand
-PERL_VERSION = 5_00313#
+PERL_VERSION = 5_00321#
ARCHDIR = [.lib.$(ARCH).$(PERL_VERSION)]
@@ -52,51 +40,19 @@ ARCHCORE = [.lib.$(ARCH).$(PERL_VERSION).CORE]
ARCHAUTO = [.lib.$(ARCH).$(PERL_VERSION).auto]
-#> .ifdef DECC_PIPES_BROKEN
-#> PIPES_BROKEN = 1
-#> .endif
-#> .ifdef GNUC
-#> .first:
-#> @ $$@[.vms]fndvers.com "" "" "[.vms]Makefile"
-#> @ If f$$TrnLnm("Sys").eqs."" Then Define/NoLog SYS GNU_CC_Include:[VMS]
-#> CC = gcc
# -fno-builtin avoids bug in gcc up to version 2.6.2 which can destroy
# data when memcpy() is called on large (>64 kB) blocks of memory
# (fixed in gcc 2.6.3)
-#> XTRACCFLAGS = /Obj=$@/NoCase_Hack/Optimize=2/CC1="""""-fno-builtin"""""
-#> DBGSPECFLAGS =
-#> XTRADEF = ,GNUC_ATTRIBUTE_CHECK
-#> XTRAOBJS =
-#> LIBS1 = GNU_CC:[000000]GCCLIB.OLB/Library
-#> LIBS2 = sys$$Share:VAXCRTL/Shareable
-#> POSIX =
-#> .else
XTRAOBJS =
LIBS1 = $(XTRAOBJS)
DBGSPECFLAGS = /Show=(Source,Include,Expansion)
-#> .ifdef decc
# Some versions of DECCRTL on AXP have a bug in chdir() which causes the change
# to persist after the image exits, even when this was not requested, iff
# SYSNAM is enabled. This is fixed in CSC Patch # AXPACRT04_061, but turning
# off SYSNAM for the MM[SK] subprocess doesn't hurt anything, so we do it
# just in case.
-#> .first:
-#> @ Set Process/Privilege=(NoSYSNAM)
-#> @ $$@[.vms]fndvers.com "" "" "[.vms]Makefile"
-#> @ If f$$TrnLnm("Sys").eqs."" .and. f$$TrnLnm("DECC$System_Include").nes."" Then Define/NoLog SYS DECC$System_Include
-#> .ifdef __AXP__
-#> @ If f$$TrnLnm("Sys").eqs."" .and. f$$TrnLnm("DECC$System_Include").eqs."" Then Define/NoLog SYS sys$$Library
-#> .else
-#> @ If f$$TrnLnm("Sys").eqs."" .and. f$$TrnLnm("DECC$System_Include").eqs."" Then Define/NoLog SYS DECC$Library_Include
-#> .endif
-#>
-#> LIBS2 =
-#> XTRACCFLAGS = /Include=[]/Standard=Relaxed_ANSI/Prefix=All/Obj=$(OBJVAL)
-#> XTRADEF =
-#> POSIX = POSIX
-#> .else # VAXC
.first:
@ $$@[.vms]fndvers.com "" "" "[.vms]Makefile"
@ If f$$TrnLnm("Sys").eqs."" .and. f$$TrnLnm("VAXC$Include").eqs."" Then Define/NoLog SYS sys$$Library
@@ -106,33 +62,15 @@ XTRACCFLAGS = /Include=[]/Object=$(O)
XTRADEF =
LIBS2 = sys$$Share:VAXCRTL/Shareable
POSIX =
-#> .endif
-#> .endif
-#> .ifdef __DEBUG__
-#> DBGCCFLAGS = /List/Debug/NoOpt$(DBGSPECFLAGS)
-#> DBGLINKFLAGS = /Trace/Debug/Map/Full/Cross
-#> DBG = DBG
-#> .else
DBGCCFLAGS = /NoList
DBGLINKFLAGS = /NoMap
DBG =
-#> .endif
-#> .ifdef SOCKET
-#> SOCKDEF = ,VMS_DO_SOCKETS
-#> SOCKLIB = SocketShr/Share
# N.B. the targets for $(SOCKC) and $(SOCKH) assume that the permanent
# copies live in [.vms], and the `clean' target will delete copies of
# these files in the current default directory.
-#> SOCKC = sockadapt.c
-#> SOCKH = sockadapt.h
-#> SOCKCLIS = ,$(SOCKC)
-#> SOCKHLIS = ,$(SOCKH)
-#> SOCKOBJ = ,sockadapt$(O)
-#> SOCKPM = [.lib]Socket.pm
-#> .else
SOCKDEF =
SOCKLIB =
SOCKC =
@@ -141,7 +79,6 @@ SOCKCLIS =
SOCKHLIS =
SOCKOBJ =
SOCKPM =
-#> .endif
# C preprocessor manifest "DEBUGGING" ==> perl -D, not the VMS debugger
CFLAGS = /Define=(DEBUGGING$(SOCKDEF)$(XTRADEF))$(XTRACCFLAGS)$(DBGCCFLAGS)
@@ -168,13 +105,8 @@ MYEXT = DynaLoader
# there are any object files specified
# These must be built separately, or you must add rules below to build them
myextobj = [.ext.dynaloader]dl_vms$(O),
-#> .ifdef SOCKET
-#> EXT = $(MYEXT) Socket
-#> extobj = $(myextobj) [.ext.socket]socket$(O),
-#> .else
EXT = $(MYEXT)
extobj = $(myextobj)
-#> .endif
#### End of system configuration section. ####
@@ -207,19 +139,13 @@ ac6 = $(ARCHCORE)pp.h $(ARCHCORE)proto.h $(ARCHCORE)regcomp.h $(ARCHCORE)perlio.
ac7 = $(ARCHCORE)regexp.h $(ARCHCORE)scope.h $(ARCHCORE)sv.h $(ARCHCORE)util.h
ac8 = $(ARCHCORE)vmsish.h $(ARCHCORE)$(DBG)libperl$(OLB) $(ARCHCORE)perlshr_attr.opt
ac9 = $(ARCHCORE)$(DBG)perlshr_bld.opt
-#> .ifdef SOCKET
-#> acs = $(ARCHCORE)$(SOCKH)
-#> .else
acs =
-#> .endif
CRTL = []crtl.opt
CRTLOPTS =,$(CRTL)/Options
.suffixes:
-#> .ifdef LINK_ONLY
-#> .else
.suffixes: $(O) .c .xs
.xs.c :
@@ -232,7 +158,6 @@ CRTLOPTS =,$(CRTL)/Options
.xs$(O) :
$(XSUBPP) $< >$(MMS$SOURCE_NAME).c
$(CC) $(CFLAGS) $(MMS$SOURCE_NAME).c
-#> .endif
all : base extras libmods utils podxform archcorefiles preplibrary perlpods
@@ -252,7 +177,7 @@ pod1 = [.lib.pod]perl.pod [.lib.pod]perlapio.pod [.lib.pod]perlbook.pod [.lib.po
pod2 = [.lib.pod]perldata.pod [.lib.pod]perldebug.pod [.lib.pod]perldiag.pod [.lib.pod]perldsc.pod
pod3 = [.lib.pod]perlembed.pod [.lib.pod]perlform.pod [.lib.pod]perlfunc.pod [.lib.pod]perlguts.pod
pod4 = [.lib.pod]perlipc.pod [.lib.pod]perllocale.pod [.lib.pod]perllol.pod [.lib.pod]perlmod.pod [.lib.pod]perlobj.pod
-pod5 = [.lib.pod]perlop.pod [.lib.pod]perlovl.pod [.lib.pod]perlpod.pod [.lib.pod]perlre.pod
+pod5 = [.lib.pod]perlop.pod [.lib.pod]perlpod.pod [.lib.pod]perlre.pod
pod6 = [.lib.pod]perlref.pod [.lib.pod]perlrun.pod [.lib.pod]perlsec.pod [.lib.pod]perlstyle.pod
pod7 = [.lib.pod]perlsub.pod [.lib.pod]perlsyn.pod [.lib.pod]perltie.pod [.lib.pod]perltoc.pod
pod8 = [.lib.pod]perltrap.pod [.lib.pod]perlvar.pod [.lib.pod]perlxs.pod [.lib.pod]perlxstut.pod
@@ -284,11 +209,7 @@ perl : $(DBG)perl$(E)
@ Continue
$(DBG)perl$(E) : perlmain$(O), $(DBG)perlshr$(E), $(MINIPERL_EXE)
@ $$@[.vms]genopt "PerlShr.Opt/Write" "|" "''f$$Environment("Default")'$(DBG)PerlShr$(E)/Share"
-#> .ifdef gnuc
-#> Link $(LINKFLAGS)/Exe=$@ perlmain$(O), perlshr.opt/Option, perlshr_attr.opt/Option, crtl.opt/Option
-#> .else
Link $(LINKFLAGS)/Exe=$@ perlmain$(O), perlshr.opt/Option, perlshr_attr.opt/Option
-#> .endif
$(DBG)perlshr$(E) : $(DBG)libperl$(OLB) $(extobj) $(DBG)perlshr_xtras.ts
Link /NoTrace$(LINKFLAGS)/Share=$@ $(extobj) []$(DBG)perlshr_bld.opt/Option, perlshr_attr.opt/Option
@@ -298,18 +219,8 @@ $(DBG)perlshr$(E) : $(DBG)libperl$(OLB) $(extobj) $(DBG)perlshr_xtras.ts
# perlshr_gbl*.mar, perlshr_gbl*$(O) - VAX only
# The song and dance with gen_shrfls.opt accomodates DCL's 255 character
# line length limit.
-#> .ifdef PIPES_BROKEN
# This is a backup target used only with older versions of the DECCRTL which
# can't deal with pipes properly. See ReadMe.VMS for details.
-#> $(DBG)perlshr_xtras.ts : perl.h config.h vmsish.h proto.h [.vms]gen_shrfls.pl $(MINIPERL_EXE) $(MAKEFILE) $(CRTL)
-#> $(CC) $(CFLAGS)/NoObject/NoList/PreProcess=perl.i perl.h
-#> @ $(MINIPERL) -e "print join('|',@ARGV),'|';" "~~NOCC~~perl.i~~$(CC)$(CFLAGS)" >gen_shrfls.opt
-#> @ $(MINIPERL) -e "print join('|',@ARGV);" "$(O)" "$(DBG)" "$(OLB)" "$(EXT)" "$(CRTL)" >>gen_shrfls.opt
-#> $(MINIPERL) [.vms]gen_shrfls.pl -f gen_shrfls.opt
-#> @ Delete/NoLog/NoConfirm perl.i;, gen_shrfls.opt;
-#> @ If f$$Search("$(DBG)perlshr_xtras.ts").nes."" Then Delete/NoLog/NoConfirm $(DBG)perlshr_xtras.ts;*
-#> @ Copy _NLA0: $(DBG)perlshr_xtras.ts
-#> .else
$(DBG)perlshr_xtras.ts : perl.h config.h vmsish.h proto.h [.vms]gen_shrfls.pl $(MINIPERL_EXE) $(MAKEFILE) $(CRTL)
@ $(MINIPERL) -e "print join('|',@ARGV),'|';" "$(CC)$(CFLAGS)" >gen_shrfls.opt
@ $(MINIPERL) -e "print join('|',@ARGV);" "$(O)" "$(DBG)" "$(OLB)" "$(EXT)" "$(CRTL)" >>gen_shrfls.opt
@@ -317,7 +228,6 @@ $(DBG)perlshr_xtras.ts : perl.h config.h vmsish.h proto.h [.vms]gen_shrfls.pl $(
@ Delete/NoLog/NoConfirm gen_shrfls.opt;
@ If f$$Search("$(DBG)perlshr_xtras.ts").nes."" Then Delete/NoLog/NoConfirm $(DBG)perlshr_xtras.ts;*
@ Copy _NLA0: $(DBG)perlshr_xtras.ts
-#> .endif
$(ARCHDIR)config.pm : [.lib]config.pm
Create/Directory $(ARCHDIR)
@@ -593,10 +503,6 @@ preplibrary : $(MINIPERL_EXE) $(ARCHDIR)Config.pm [.lib]DynaLoader.pm [.lib.VMS]
@ If f$$Search("[.lib]pod.dir").eqs."" Then Create/Directory [.lib.pod]
@ Copy/Log [.pod]perlop.pod $@
-[.lib.pod]perlovl.pod : [.pod]perlovl.pod
- @ If f$$Search("[.lib]pod.dir").eqs."" Then Create/Directory [.lib.pod]
- @ Copy/Log [.pod]perlovl.pod $@
-
[.lib.pod]perlpod.pod : [.pod]perlpod.pod
@ If f$$Search("[.lib]pod.dir").eqs."" Then Create/Directory [.lib.pod]
@ Copy/Log [.pod]perlpod.pod $@
@@ -661,30 +567,6 @@ printconfig :
@ $$@[.vms]make_command $(MMS) $(MMSQUALIFIERS) $(MMSTARGETS)
@ $$@[.vms]myconfig "$(CC)" "$(CFLAGS)" "$(LINKFLAGS)" "$(LIBS1)" "$(LIBS2)" "$(SOCKLIB)" "$(EXT)" "$(DBG)"
-#> .ifdef SOCKET
-#>
-#> .ifdef LINK_ONLY
-#> .else
-#> $(SOCKOBJ) : $(SOCKC) $(SOCKH)
-#>
-#> [.ext.Socket]Socket$(O) : [.ext.Socket]Socket.c
-#> $(CC) $(CFLAGS) /Object=$@ [.ext.Socket]Socket.c
-#>
-#> [.ext.Socket]Socket.c : [.ext.Socket]Socket.xs $(MINIPERL_EXE)
-#> $(XSUBPP) [.ext.Socket]Socket.xs >$@
-#> .endif # !LINK_ONLY
-#>
-#> vmsish.h : $(SOCKH)
-#>
-#> $(SOCKC) : [.vms]$(SOCKC)
-#> Copy/Log/NoConfirm [.vms]$(SOCKC) []$(SOCKC)
-#>
-#> $(SOCKH) : [.vms]$(SOCKH)
-#> Copy/Log/NoConfirm [.vms]$(SOCKH) []$(SOCKH)
-#>
-#> [.lib]Socket.pm : [.ext.Socket]Socket.pm
-#> Copy/Log/NoConfirm [.ext.Socket]Socket.pm $@
-#> .endif
# The following three header files are generated automatically
# keywords.h : keywords.pl
@@ -716,11 +598,8 @@ perly.h : [.vms]perly_h.vms
# rename y.tab.h perly.h
# $(INSTPERL) [.vms]vms_yfix.pl perly.c perly.h [.vms]perly_c.vms [.vms]perly_h.vms
-#> .ifdef LINK_ONLY
-#> .else
perly$(O) : perly.c, perly.h, $(h)
$(CC) $(CFLAGS) perly.c
-#> .endif
test : all
- @[.VMS]Test.Com "$(E)"
@@ -814,11 +693,6 @@ $(ARCHCORE)util.h : util.h
$(ARCHCORE)vmsish.h : vmsish.h
@ If f$$Search("$(ARCHDIR)CORE.dir").eqs."" Then Create/Directory $(ARCHCORE)
Copy/Log vmsish.h $@
-#> .ifdef SOCKET
-#> $(ARCHCORE)$(SOCKH) : $(SOCKH)
-#> @ If f$$Search("$(ARCHDIR)CORE.dir").eqs."" Then Create/Directory $(ARCHCORE)
-#> Copy/Log $(SOCKH) $@
-#> .endif
$(ARCHCORE)$(DBG)libperl$(OLB) : $(DBG)libperl$(OLB) $(DBG)perlshr_xtras.ts
@ If f$$Search("$(ARCHDIR)CORE.dir").eqs."" Then Create/Directory $(ARCHCORE)
Copy/Log $(DBG)libperl$(OLB) $@
@@ -832,8 +706,6 @@ $(ARCHAUTO)time.stamp :
@ If f$$Search("$(ARCHDIR)auto.dir").eqs."" Then Create/Directory $(ARCHAUTO)
@ If f$$Search("$@").eqs."" Then Copy/NoConfirm _NLA0: $(MMS$TARGET)
-#> .ifdef LINK_ONLY
-#> .else
# AUTOMATICALLY GENERATED MAKE DEPENDENCIES--PUT NOTHING BELOW THIS LINE
av$(O) : EXTERN.h
av$(O) : av.c
@@ -1506,7 +1378,6 @@ globals$(O) : scope.h
globals$(O) : sv.h
globals$(O) : vmsish.h
globals$(O) : util.h
-#> .endif # !LINK_ONLY
config.h : [.vms]config.vms
Copy/Log/NoConfirm [.vms]config.vms []config.h
@@ -1570,11 +1441,6 @@ clean : tidy
Set Default [.ext.Opcode]
- $(MMS) clean
Set Default [--]
-#> .ifdef DECC
-#> Set Default [.ext.POSIX]
-#> - $(MMS) clean
-#> Set Default [--]
-#> .endif
- If f$$Search("*.Opt").nes."" Then Delete/NoConfirm/Log *.Opt;*/Exclude=PerlShr_*.Opt
- If f$$Search("*$(O);*") .nes."" Then Delete/NoConfirm/Log *$(O);*
- If f$$Search("Config.H").nes."" Then Delete/NoConfirm/Log Config.H;*
@@ -1608,11 +1474,6 @@ realclean : clean
Set Default [.ext.Opcode]
- $(MMS) realclean
Set Default [--]
-#> .ifdef DECC
-#> Set Default [.ext.POSIX]
-#> - $(MMS) realclean
-#> Set Default [--]
-#> .endif
- If f$$Search("*$(OLB)").nes."" Then Delete/NoConfirm/Log *$(OLB);*
- If f$$Search("*.Opt").nes."" Then Delete/NoConfirm/Log *.Opt;*
- $(MINIPERL) -e "use File::Path; rmtree(['lib/auto','lib/VMS','lib/$(ARCH)'],1,0);"
diff --git a/vms/config.vms b/vms/config.vms
index 48aa6a5a57..a7460e5cf5 100644
--- a/vms/config.vms
+++ b/vms/config.vms
@@ -76,7 +76,7 @@
* when Perl is built. Please do not change it by hand; make
* any changes to FndVers.Com instead.
*/
-#define ARCHLIB_EXP "/perl_root/lib/VMS_VAX/5_00314" /**/
+#define ARCHLIB_EXP "/perl_root/lib/VMS_VAX/5_00321" /**/
#define ARCHLIB ARCHLIB_EXP /*config-skip*/
/* BINCOMPAT3:
diff --git a/vms/descrip.mms b/vms/descrip.mms
index 9bfdf0cb3e..32200a3dfa 100644
--- a/vms/descrip.mms
+++ b/vms/descrip.mms
@@ -65,7 +65,7 @@ OBJVAL = $(MMS$TARGET_NAME)$(O)
.endif
# Updated by fndvers.com -- do not edit by hand
-PERL_VERSION = 5_00314#
+PERL_VERSION = 5_00321#
ARCHDIR = [.lib.$(ARCH).$(PERL_VERSION)]
@@ -283,7 +283,7 @@ pod1 = [.lib.pod]perl.pod [.lib.pod]perlapio.pod [.lib.pod]perlbook.pod [.lib.po
pod2 = [.lib.pod]perldata.pod [.lib.pod]perldebug.pod [.lib.pod]perldiag.pod [.lib.pod]perldsc.pod
pod3 = [.lib.pod]perlembed.pod [.lib.pod]perlform.pod [.lib.pod]perlfunc.pod [.lib.pod]perlguts.pod
pod4 = [.lib.pod]perlipc.pod [.lib.pod]perllocale.pod [.lib.pod]perllol.pod [.lib.pod]perlmod.pod [.lib.pod]perlobj.pod
-pod5 = [.lib.pod]perlop.pod [.lib.pod]perlovl.pod [.lib.pod]perlpod.pod [.lib.pod]perlre.pod
+pod5 = [.lib.pod]perlop.pod [.lib.pod]perlpod.pod [.lib.pod]perlre.pod
pod6 = [.lib.pod]perlref.pod [.lib.pod]perlrun.pod [.lib.pod]perlsec.pod [.lib.pod]perlstyle.pod
pod7 = [.lib.pod]perlsub.pod [.lib.pod]perlsyn.pod [.lib.pod]perltie.pod [.lib.pod]perltoc.pod
pod8 = [.lib.pod]perltrap.pod [.lib.pod]perlvar.pod [.lib.pod]perlxs.pod [.lib.pod]perlxstut.pod
@@ -624,10 +624,6 @@ preplibrary : $(MINIPERL_EXE) $(ARCHDIR)Config.pm [.lib]DynaLoader.pm [.lib.VMS]
@ If F$Search("[.lib]pod.dir").eqs."" Then Create/Directory [.lib.pod]
@ Copy/Log $(MMS$SOURCE) $(MMS$TARGET)
-[.lib.pod]perlovl.pod : [.pod]perlovl.pod
- @ If F$Search("[.lib]pod.dir").eqs."" Then Create/Directory [.lib.pod]
- @ Copy/Log $(MMS$SOURCE) $(MMS$TARGET)
-
[.lib.pod]perlpod.pod : [.pod]perlpod.pod
@ If F$Search("[.lib]pod.dir").eqs."" Then Create/Directory [.lib.pod]
@ Copy/Log $(MMS$SOURCE) $(MMS$TARGET)
diff --git a/vms/genconfig.pl b/vms/genconfig.pl
index da295f72e9..97679d5e48 100644
--- a/vms/genconfig.pl
+++ b/vms/genconfig.pl
@@ -102,6 +102,10 @@ installprivlib='$installprivlib'
installarchlib='$installarchlib'
installsitelib='$installsitelib'
installsitearch='$installsitearch'
+startperl='\$ perl 'f\$env("procedure")' - ! q#
+ 'p1' 'p2' 'p3' 'p4' 'p5' 'p6' 'p7' 'p8'
+$ exit !#
+'
EndOfIntro
foreach (@ARGV) {
diff --git a/vms/perly_c.vms b/vms/perly_c.vms
index dfc096ca22..947d77311d 100644
--- a/vms/perly_c.vms
+++ b/vms/perly_c.vms
@@ -16,937 +16,912 @@ dep()
#line 16 "perly.c"
#define YYERRCODE 256
dEXT short yylhs[] = { -1,
- 40, 0, 7, 5, 8, 6, 9, 9, 9, 10,
- 10, 10, 10, 22, 22, 22, 22, 22, 22, 13,
- 13, 13, 12, 12, 37, 37, 11, 11, 11, 11,
- 11, 11, 11, 24, 24, 25, 25, 26, 27, 28,
- 29, 30, 39, 39, 1, 1, 1, 1, 3, 3,
- 41, 41, 36, 36, 4, 42, 42, 43, 14, 14,
- 14, 23, 23, 23, 34, 34, 34, 34, 34, 34,
- 34, 34, 35, 35, 15, 15, 15, 15, 15, 15,
- 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
- 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
- 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
- 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
- 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
- 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
- 15, 15, 15, 15, 15, 15, 15, 15, 31, 31,
- 32, 32, 32, 2, 2, 38, 21, 16, 17, 18,
- 19, 20, 33, 33, 33, 33,
+ 45, 0, 9, 7, 10, 8, 11, 11, 11, 12,
+ 12, 12, 12, 24, 24, 24, 24, 24, 24, 15,
+ 15, 15, 14, 14, 42, 42, 13, 13, 13, 13,
+ 13, 13, 13, 26, 26, 27, 27, 28, 29, 30,
+ 31, 32, 44, 44, 1, 1, 1, 1, 3, 38,
+ 38, 46, 4, 5, 6, 39, 40, 40, 41, 41,
+ 47, 47, 49, 48, 16, 16, 16, 25, 25, 25,
+ 36, 36, 36, 36, 36, 36, 36, 50, 36, 37,
+ 37, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+ 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+ 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+ 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+ 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+ 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+ 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+ 17, 17, 17, 17, 17, 33, 33, 34, 34, 34,
+ 2, 2, 43, 23, 18, 19, 20, 21, 22, 35,
+ 35, 35, 35,
};
dEXT short yylen[] = { 2,
0, 2, 4, 0, 4, 0, 0, 2, 2, 2,
1, 2, 3, 1, 1, 3, 3, 3, 3, 0,
2, 6, 7, 7, 0, 2, 8, 8, 10, 9,
8, 11, 3, 0, 1, 0, 1, 1, 1, 1,
- 1, 1, 0, 1, 1, 1, 1, 1, 4, 3,
- 5, 5, 0, 1, 0, 3, 2, 6, 3, 3,
- 1, 2, 3, 1, 3, 5, 6, 3, 5, 2,
- 4, 4, 1, 1, 3, 3, 3, 3, 3, 3,
- 3, 3, 3, 3, 3, 3, 5, 3, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 3, 2,
- 3, 2, 4, 3, 4, 1, 5, 1, 4, 5,
- 4, 1, 1, 1, 5, 6, 5, 6, 5, 4,
- 5, 1, 1, 3, 4, 3, 2, 2, 4, 5,
- 4, 5, 1, 2, 2, 1, 2, 2, 2, 1,
- 3, 1, 3, 4, 4, 6, 1, 1, 0, 1,
- 0, 1, 2, 1, 1, 1, 2, 2, 2, 2,
- 2, 2, 1, 1, 1, 1,
+ 1, 1, 0, 1, 1, 1, 1, 1, 4, 1,
+ 0, 5, 0, 0, 0, 1, 0, 1, 1, 1,
+ 3, 2, 0, 7, 3, 3, 1, 2, 3, 1,
+ 3, 5, 6, 3, 5, 2, 4, 0, 5, 1,
+ 1, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 5, 3, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 3, 2, 3, 2, 4,
+ 3, 4, 1, 5, 1, 4, 5, 4, 1, 1,
+ 1, 5, 6, 5, 6, 5, 4, 5, 1, 1,
+ 3, 4, 3, 2, 2, 4, 5, 4, 5, 1,
+ 2, 2, 1, 2, 2, 2, 1, 3, 1, 3,
+ 4, 4, 6, 1, 1, 0, 1, 0, 1, 2,
+ 1, 1, 1, 2, 2, 2, 2, 2, 2, 1,
+ 1, 1, 1,
};
dEXT short yydefred[] = { 1,
- 0, 7, 0, 44, 55, 55, 0, 55, 8, 45,
- 9, 11, 0, 46, 47, 48, 0, 0, 0, 57,
- 0, 14, 4, 147, 0, 0, 122, 0, 142, 0,
- 55, 55, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 154, 155, 0,
+ 0, 7, 0, 44, 55, 53, 0, 53, 8, 45,
+ 9, 11, 0, 46, 47, 48, 0, 0, 0, 62,
+ 63, 14, 4, 154, 0, 0, 129, 0, 149, 0,
+ 54, 54, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 161, 162, 0,
0, 0, 0, 0, 0, 0, 0, 12, 0, 0,
0, 0, 0, 0, 0, 0, 0, 10, 0, 0,
- 0, 0, 112, 114, 0, 0, 0, 0, 148, 0,
- 50, 0, 56, 0, 7, 163, 166, 165, 164, 0,
- 0, 0, 0, 0, 0, 4, 4, 4, 4, 4,
- 4, 0, 0, 0, 0, 0, 137, 0, 0, 0,
- 0, 70, 0, 161, 0, 128, 0, 0, 0, 0,
- 0, 157, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 102, 0, 158, 159, 160, 162, 0, 0,
- 33, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 119, 121, 0, 0, 0, 0, 155, 50,
+ 0, 56, 0, 61, 0, 7, 170, 173, 172, 171,
+ 0, 0, 0, 0, 0, 0, 4, 4, 4, 4,
+ 4, 4, 0, 0, 0, 0, 0, 144, 0, 0,
+ 0, 0, 76, 0, 168, 0, 135, 0, 0, 0,
+ 0, 0, 164, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 109, 0, 165, 166, 167, 169, 0,
+ 0, 33, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 94, 95, 0, 0, 0, 0, 0, 0,
- 0, 0, 13, 0, 49, 54, 0, 0, 0, 68,
+ 0, 0, 0, 101, 102, 0, 0, 0, 0, 0,
+ 0, 0, 0, 13, 0, 49, 58, 0, 0, 0,
+ 74, 0, 0, 78, 0, 0, 0, 0, 0, 0,
+ 0, 4, 148, 150, 0, 0, 0, 0, 0, 0,
+ 0, 111, 0, 133, 0, 0, 108, 26, 0, 0,
+ 19, 0, 0, 0, 65, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 4, 141, 143, 0, 0, 0, 0, 0, 0, 0,
- 104, 0, 126, 0, 0, 101, 26, 0, 0, 19,
- 0, 0, 0, 59, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 73, 0, 74, 0, 0, 0, 0, 0, 0, 0,
- 124, 0, 0, 52, 51, 0, 3, 0, 145, 0,
- 72, 105, 0, 41, 0, 42, 0, 0, 0, 0,
- 156, 0, 0, 35, 40, 0, 0, 0, 144, 153,
- 71, 0, 129, 0, 131, 0, 103, 0, 0, 0,
- 0, 0, 0, 0, 111, 0, 109, 0, 120, 0,
- 125, 58, 69, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 66, 130, 132, 119, 0, 117, 0, 0,
- 110, 0, 115, 121, 107, 146, 6, 0, 0, 0,
- 0, 0, 0, 0, 0, 118, 116, 67, 7, 27,
- 28, 0, 0, 23, 24, 0, 31, 0, 0, 0,
- 21, 0, 0, 0, 30, 5, 0, 29, 0, 0,
- 32, 0, 22,
+ 0, 80, 0, 81, 0, 0, 0, 0, 0, 0,
+ 0, 131, 0, 0, 60, 59, 52, 0, 3, 0,
+ 152, 0, 0, 112, 0, 41, 0, 42, 0, 0,
+ 0, 0, 163, 0, 0, 35, 40, 0, 0, 0,
+ 151, 160, 77, 0, 136, 0, 138, 0, 110, 0,
+ 0, 0, 0, 0, 0, 0, 118, 0, 116, 0,
+ 127, 0, 132, 0, 75, 0, 79, 0, 0, 0,
+ 0, 0, 0, 0, 0, 72, 137, 139, 126, 0,
+ 124, 0, 0, 117, 0, 122, 128, 114, 64, 153,
+ 6, 0, 0, 0, 0, 0, 0, 0, 0, 125,
+ 123, 73, 7, 27, 28, 0, 0, 23, 24, 0,
+ 31, 0, 0, 0, 21, 0, 0, 0, 30, 5,
+ 0, 29, 0, 0, 32, 0, 22,
};
dEXT short yydgoto[] = { 1,
- 9, 66, 10, 17, 85, 329, 88, 318, 3, 11,
- 12, 68, 334, 258, 70, 71, 72, 73, 74, 75,
- 76, 264, 78, 265, 254, 256, 259, 267, 255, 257,
- 112, 196, 90, 79, 234, 177, 141, 262, 13, 2,
- 14, 15, 16,
+ 9, 66, 10, 18, 95, 17, 86, 333, 89, 322,
+ 3, 11, 12, 68, 338, 260, 70, 71, 72, 73,
+ 74, 75, 76, 266, 78, 267, 256, 258, 261, 269,
+ 257, 259, 113, 197, 91, 79, 235, 81, 83, 178,
+ 247, 142, 264, 13, 2, 14, 15, 16, 85, 253,
};
dEXT short yysindex[] = { 0,
- 0, 0, 236, 0, 0, 0, -45, 0, 0, 0,
- 0, 0, 557, 0, 0, 0, -106, -232, -20, 0,
- -216, 0, 0, 0, -8, -8, 0, 9, 0, 1840,
- 0, 0, 11, 15, 19, 22, -33, 1840, 38, 47,
- 51, 933, 877, -8, 996, 1260, -212, 0, 0, -8,
- 1840, 1840, 1840, 1840, 1840, 1840, 1316, 0, 1840, 1840,
- 1372, -8, -8, -8, -8, 1840, -193, 0, 273, 3713,
- -67, -55, 0, 0, -26, 72, 57, 59, 0, 3,
- 0, -137, 0, -130, 0, 0, 0, 0, 0, 1840,
- 96, 1840, 1871, 3, -137, 0, 0, 0, 0, 0,
- 0, 97, 3713, 99, 1431, 877, 0, 1871, 0, -67,
- 59, 0, 1840, 0, 106, 0, 1871, -25, 27, 52,
- 1840, 0, 59, 98, 98, 98, -85, -85, 74, -40,
- 98, 98, 0, -88, 0, 0, 0, 0, 1871, 3,
- 0, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840,
- 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840,
- 1840, 1840, 0, 0, -34, 1840, 1840, 1840, 1840, 1840,
- 1840, 1606, 0, 1840, 0, 0, -51, 1840, 242, 0,
- 1840, 1089, 1840, 3, 1840, 1840, 1840, 1840, 130, 1665,
- 0, 0, 0, -30, 44, 126, 1840, 59, 1721, 1777,
- 0, 53, 0, 1840, 79, 0, 0, -244, -244, 0,
- -244, -244, -127, 0, 54, 1027, 1871, 756, 360, 869,
- 3713, 3679, 3540, 3764, 1195, 340, 1054, 98, 98, 1840,
- 0, 1840, 0, 134, -83, 58, -75, 60, -71, 62,
- 0, -18, 3713, 0, 0, 117, 0, 138, 0, 1840,
- 0, 0, -244, 0, 139, 0, 140, -244, 141, 142,
- 0, 145, 273, 0, 0, 149, 136, 1840, 0, 0,
- 0, -15, 0, 40, 0, 42, 0, -59, 1840, 68,
- 1840, 85, 46, 1840, 0, 75, 0, 77, 0, 80,
- 0, 0, 0, 1143, 84, 84, 84, 84, 1840, 84,
- 1840, 167, 0, 0, 0, 0, 95, 0, 263, 86,
- 0, 172, 0, 0, 0, 0, 0, -193, -193, -177,
- -177, 175, -193, 159, 84, 0, 0, 0, 0, 0,
- 0, 84, 194, 0, 0, 84, 0, 1665, -193, 256,
- 0, 1840, -193, 191, 0, 0, 196, 0, 84, 84,
- 0, -177, 0,
+ 0, 0, -126, 0, 0, 0, -58, 0, 0, 0,
+ 0, 0, 827, 0, 0, 0, -242, -235, -21, 0,
+ 0, 0, 0, 0, -33, -33, 0, 11, 0, 1816,
+ 0, 0, 13, 15, 30, 45, -29, 1816, 67, 68,
+ 70, 1002, 939, -33, 1236, 1292, -227, 0, 0, -33,
+ 1816, 1816, 1816, 1816, 1816, 1816, 1173, 0, 1816, 1816,
+ 1348, -33, -33, -33, -33, 1816, -220, 0, -169, 3558,
+ -78, -59, 0, 0, -62, 73, 42, 65, 0, 0,
+ -5, 0, -149, 0, -134, 0, 0, 0, 0, 0,
+ 1816, 97, 1816, 1847, -5, -149, 0, 0, 0, 0,
+ 0, 0, 99, 3558, 105, 1407, 939, 0, 1847, 0,
+ -78, 65, 0, 1816, 0, 107, 0, 1847, -23, 36,
+ -51, 1816, 0, 65, -82, -82, -82, -54, -54, 57,
+ -27, -82, -82, 0, -87, 0, 0, 0, 0, 1847,
+ -5, 0, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816,
+ 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816,
+ 1816, 1816, 1816, 0, 0, -32, 1816, 1816, 1816, 1816,
+ 1816, 1816, 1582, 0, 1816, 0, 0, -36, -108, 665,
+ 0, 1816, 209, 0, -5, 1816, 1816, 1816, 1816, 114,
+ 1641, 0, 0, 0, -16, 6, 111, 1816, 65, 1697,
+ 1753, 0, 38, 0, 1816, 74, 0, 0, -251, -251,
+ 0, -251, -251, -131, 0, 18, 3516, 1847, 1089, 382,
+ 92, 3558, 3594, 3689, 369, 1060, 482, 285, -82, -82,
+ 1816, 0, 1816, 0, 128, 33, 23, 58, 25, 69,
+ 27, 0, -14, 3558, 0, 0, 0, 1816, 0, 131,
+ 0, 1816, 1816, 0, -251, 0, 134, 0, 136, -251,
+ 139, 141, 0, 144, -169, 0, 0, 156, 135, 1816,
+ 0, 0, 0, -12, 0, -10, 0, 1, 0, 71,
+ 1816, 75, 1816, 29, 86, 1816, 0, 76, 0, 78,
+ 0, 81, 0, 148, 0, 339, 0, 85, 85, 85,
+ 85, 1816, 85, 1816, 168, 0, 0, 0, 0, 88,
+ 0, 3653, 89, 0, 172, 0, 0, 0, 0, 0,
+ 0, -220, -220, -178, -178, 175, -220, 160, 85, 0,
+ 0, 0, 0, 0, 0, 85, 203, 0, 0, 85,
+ 0, 1641, -220, 688, 0, 1816, -220, 180, 0, 0,
+ 196, 0, 85, 85, 0, -178, 0,
};
dEXT short yyrindex[] = { 0,
- 0, 0, 161, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 269, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 122, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 2076, 1906, 0,
+ 0, 2716, 2784, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 2100, 1930, 0,
- 0, 2740, 2808, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 79, 0, -7, 181,
+ 2827, 2871, 0, 0, 2142, 1965, 0, 21, 0, 0,
+ 0, 0, -31, 0, 0, 0, 0, 0, 0, 0,
+ 2201, 0, 0, 3299, 0, 129, 0, 0, 0, 0,
+ 0, 0, 0, 197, 0, 0, 213, 0, 3343, 444,
+ 545, 2312, 0, 0, 0, 2028, 0, 3386, 2827, 0,
+ 0, 2201, 0, 2437, 2914, 2952, 2990, 606, 723, 2480,
+ 0, 3063, 3107, 0, 0, 0, 0, 0, 0, 3424,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 37, 0, -9, 3616,
- 2851, 2895, 0, 0, 2166, 1989, 0, 17, 0, 0,
- 0, -39, 0, 0, 0, 0, 0, 0, 0, 2225,
- 0, 0, 3367, 0, 112, 0, 0, 0, 0, 0,
- 0, 0, 3635, 0, 0, 215, 0, 3410, 437, 498,
- 2336, 0, 0, 0, 2052, 0, 3448, 2851, 0, 0,
- 2225, 0, 2461, 2938, 2976, 3014, -28, 600, 2504, 0,
- 3087, 3131, 0, 0, 0, 0, 0, 0, 3486, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 2548, 0, 0, 0, 0, 883,
+ 0, 213, 0, 0, 0, 234, 0, 0, 0, 0,
+ 218, 0, 0, 0, 0, 239, 0, 0, 2591, 0,
+ 0, 0, 0, 0, 0, 2635, 0, 0, -2, 8,
+ 0, 22, 24, 525, 0, 0, 3579, 1448, 1504, 3226,
+ -39, 338, 0, 2490, 3535, 3498, 3462, 3262, 3150, 3188,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 2572, 0, 0, 0, 205, 821, 0,
- 215, 0, 2225, 0, 245, 0, 0, 0, 0, 240,
- 0, 0, 0, 0, 272, 0, 0, 2615, 0, 0,
- 0, 0, 0, 0, 2659, 0, 0, 5, 45, 0,
- 49, 61, -32, 0, 0, 192, 1472, 1528, 3250, 3286,
- 3645, 0, 2514, 3603, 3559, 3522, 3323, 3174, 3212, 0,
+ 0, 0, 0, 1870, 0, 0, 0, 230, 0, 0,
+ 0, 0, 2201, 0, 37, 0, 0, 0, 0, 251,
+ 0, 0, 0, 0, 61, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 3675, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 65, 0, 0, 0, 0, 277, 0, 0,
- 0, 0, 66, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 213, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 215, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 238, 0, 0, 0, 0, 0, 0,
+ 0, 718, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 79, 79, 153, 153, 0, 79, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 265, 0, 0, 0, 0, 0, 0, 0, 1894, 0,
- 0, 0, 0, 0, 0, 0, 0, 37, 37, 105,
- 105, 0, 37, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 286, 37, 821,
- 0, 0, 37, 0, 0, 0, 0, 0, 0, 0,
- 0, 105, 0,
+ 0, 260, 79, 883, 0, 0, 79, 0, 0, 0,
+ 0, 0, 0, 0, 0, 153, 0,
};
dEXT short yygindex[] = { 0,
- 0, 0, 0, 63, 418, 0, 914, 335, -81, 0,
- 0, 0, -292, -13, 3885, 2516, 0, 0, 0, 0,
- 0, 321, 530, 0, 0, 203, -150, -3, 93, 165,
- -69, -162, 575, 0, 0, 300, -276, 0, 0, 0,
- 0, 0, 0,
+ 0, 0, 0, 300, 278, 0, -26, 0, 892, 1004,
+ -76, 0, 0, 0, -313, -13, 3871, 3724, 0, 0,
+ 0, 0, 0, 304, -25, 0, 0, 169, -175, -8,
+ 53, 152, 384, -161, 901, 0, 0, 0, 0, 281,
+ 0, -287, 0, 0, 0, 0, 0, 0, 0, 0,
};
-#define YYTABLESIZE 4166
+#define YYTABLESIZE 4154
dEXT short yytable[] = { 69,
- 205, 62, 62, 179, 206, 166, 101, 244, 60, 285,
- 269, 60, 96, 20, 200, 96, 23, 287, 248, 53,
- 180, 289, 291, 168, 82, 303, 60, 62, 335, 96,
- 96, 15, 120, 306, 96, 170, 25, 148, 83, 266,
- 84, 330, 331, 130, 121, 18, 337, 134, 92, 15,
- 96, 203, 146, 147, 97, 167, 232, 61, 98, 353,
- 60, 99, 345, 18, 96, 168, 348, 169, 18, 25,
- 21, 23, 25, 25, 25, 61, 25, 104, 25, 25,
- 304, 25, 305, 53, 140, 38, 105, 270, 230, 16,
- 106, 194, 195, 94, 95, 25, 171, 167, 332, 333,
- 25, 17, 174, 38, 20, 37, 39, 16, 246, 61,
- 202, 172, 280, 251, 23, 173, 286, 302, 288, 17,
- 290, 312, 176, 37, 15, 23, 178, 25, 208, 209,
- 211, 212, 213, 214, 215, 181, 191, 20, 311, 192,
- 20, 20, 20, 310, 20, 199, 20, 20, 322, 20,
- 80, 201, 235, 236, 237, 238, 239, 240, 242, 25,
- 2, 25, 25, 20, 204, 62, 271, 195, 20, 279,
- 147, 253, 209, 284, 209, 292, 263, 277, 293, 295,
- 296, 297, 298, 272, 299, 274, 276, 326, 166, 300,
- 278, 347, 308, 43, 301, 20, 43, 43, 43, 313,
- 43, 314, 43, 43, 315, 43, 317, 325, 146, 147,
- 327, 19, 328, 146, 147, 336, 282, 338, 283, 43,
- 148, 146, 147, 231, 43, 146, 147, 20, 165, 20,
- 20, 349, 84, 342, 53, 84, 350, 146, 147, 60,
- 60, 60, 60, 96, 96, 96, 96, 340, 86, 84,
- 84, 43, 96, 87, 84, 151, 146, 147, 96, 96,
- 96, 96, 100, 149, 60, 307, 146, 147, 96, 96,
- 195, 96, 96, 96, 96, 96, 96, 96, 146, 147,
- 96, 146, 147, 43, 84, 36, 43, 253, 61, 61,
- 61, 61, 25, 25, 25, 25, 25, 25, 34, 25,
- 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
- 25, 25, 152, 61, 61, 25, 25, 39, 25, 25,
- 25, 25, 25, 36, 69, 155, 34, 25, 25, 25,
- 25, 25, 25, 77, 344, 25, 146, 147, 146, 147,
- 146, 147, 146, 147, 25, 210, 25, 25, 146, 147,
- 146, 147, 260, 166, 146, 147, 146, 147, 146, 147,
- 20, 20, 20, 20, 20, 20, 247, 20, 20, 20,
- 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
- 346, 146, 147, 20, 20, 148, 20, 20, 20, 20,
- 20, 146, 147, 324, 184, 20, 20, 20, 20, 20,
- 20, 0, 0, 20, 0, 0, 162, 0, 0, 163,
- 164, 165, 20, 0, 20, 20, 43, 43, 43, 43,
- 43, 43, 0, 43, 43, 43, 0, 0, 0, 43,
- 166, 0, 43, 43, 43, 43, 0, 0, 0, 43,
- 43, 0, 43, 43, 43, 43, 43, 0, 0, 0,
- 166, 43, 43, 43, 43, 43, 43, 0, 0, 43,
- 0, 0, 148, 84, 84, 84, 84, 0, 43, 163,
- 43, 43, 163, 163, 163, 0, 163, 147, 163, 163,
- 147, 163, 148, 0, 0, 0, 0, 0, 84, 84,
- 0, 84, 0, 0, 147, 147, 0, 0, 0, 147,
- 163, 4, 5, 6, 0, 7, 8, 4, 5, 6,
- 0, 7, 8, 185, 186, 187, 188, 189, 190, 0,
- 0, 4, 5, 6, 0, 7, 8, 147, 0, 147,
- 164, 0, 0, 164, 164, 164, 0, 164, 106, 164,
- 164, 106, 164, 149, 142, 143, 144, 145, 0, 150,
- 151, 152, 153, 0, 0, 106, 106, 0, 0, 147,
- 106, 164, 163, 156, 157, 158, 159, 160, 161, 146,
- 147, 162, 111, 0, 163, 164, 165, 0, 0, 0,
- 123, 0, 0, 0, 0, 0, 0, 0, 0, 52,
- 106, 0, 62, 64, 50, 0, 57, 0, 65, 60,
- 91, 59, 0, 0, 0, 0, 0, 0, 268, 0,
- 0, 0, 0, 0, 0, 58, 0, 113, 114, 111,
- 63, 0, 0, 164, 122, 0, 150, 151, 152, 153,
- 319, 320, 321, 0, 323, 0, 135, 136, 137, 138,
- 97, 0, 198, 97, 160, 161, 0, 61, 162, 0,
- 111, 163, 164, 165, 0, 0, 0, 97, 97, 339,
- 0, 0, 97, 0, 0, 161, 341, 0, 162, 0,
- 343, 163, 164, 165, 0, 0, 0, 0, 0, 23,
- 197, 0, 53, 351, 352, 0, 0, 0, 0, 0,
- 0, 0, 97, 163, 163, 163, 163, 163, 0, 163,
- 163, 163, 0, 0, 0, 163, 0, 111, 147, 147,
- 147, 147, 111, 0, 0, 0, 163, 147, 163, 163,
- 163, 163, 163, 147, 147, 147, 147, 163, 163, 163,
- 163, 163, 163, 147, 147, 163, 147, 147, 147, 147,
- 147, 147, 147, 0, 163, 147, 163, 163, 147, 147,
- 147, 0, 0, 0, 164, 164, 164, 164, 164, 0,
- 164, 164, 164, 0, 0, 0, 164, 0, 0, 106,
- 106, 106, 106, 0, 0, 0, 0, 164, 106, 164,
- 164, 164, 164, 164, 106, 106, 106, 106, 164, 164,
- 164, 164, 164, 164, 106, 106, 164, 106, 106, 106,
- 106, 106, 106, 106, 0, 164, 106, 164, 164, 106,
- 106, 106, 22, 24, 25, 26, 27, 28, 0, 29,
- 30, 31, 0, 0, 0, 32, 0, 0, 33, 34,
- 35, 36, 0, 0, 0, 37, 38, 0, 39, 40,
- 41, 42, 43, 0, 0, 0, 166, 44, 45, 46,
- 47, 48, 49, 43, 0, 51, 43, 43, 43, 0,
- 43, 0, 43, 43, 54, 43, 55, 56, 0, 0,
- 0, 97, 97, 97, 97, 0, 0, 0, 148, 43,
- 97, 0, 0, 0, 43, 0, 97, 97, 97, 97,
- 0, 0, 0, 0, 0, 0, 97, 97, 0, 97,
- 97, 97, 97, 97, 97, 97, 0, 0, 97, 52,
- 0, 43, 62, 64, 50, 0, 57, 0, 65, 60,
- 0, 59, 0, 0, 0, 0, 67, 0, 0, 0,
- 81, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 63, 0, 0, 43, 0, 0, 43, 0, 0, 0,
- 0, 0, 0, 0, 0, 107, 0, 0, 116, 166,
- 0, 0, 0, 0, 0, 52, 0, 61, 62, 64,
- 50, 0, 57, 0, 65, 60, 0, 59, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 148, 0, 175, 0, 0, 63, 0, 0, 23,
- 0, 0, 53, 0, 0, 0, 0, 183, 0, 0,
+ 20, 85, 62, 62, 85, 207, 62, 203, 167, 180,
+ 102, 339, 169, 206, 80, 268, 201, 112, 85, 85,
+ 250, 82, 245, 85, 271, 124, 293, 57, 306, 122,
+ 307, 171, 121, 15, 334, 335, 167, 84, 18, 341,
+ 149, 308, 357, 131, 168, 147, 148, 135, 38, 272,
+ 93, 15, 97, 85, 98, 349, 18, 141, 233, 352,
+ 172, 67, 16, 170, 17, 112, 38, 169, 149, 99,
+ 186, 187, 188, 189, 190, 191, 282, 37, 25, 67,
+ 16, 288, 17, 290, 100, 292, 23, 313, 199, 23,
+ 231, 57, 195, 196, 305, 37, 112, 336, 337, 168,
+ 174, 39, 143, 144, 145, 146, 105, 106, 175, 107,
+ 177, 25, 173, 67, 25, 25, 25, 23, 25, 15,
+ 25, 25, 179, 25, 315, 287, 326, 147, 148, 209,
+ 210, 212, 213, 214, 215, 216, 182, 25, 192, 4,
+ 5, 6, 25, 7, 8, 193, 200, 205, 248, 62,
+ 289, 273, 20, 236, 237, 238, 239, 240, 241, 243,
+ 202, 291, 279, 309, 281, 270, 148, 286, 196, 25,
+ 351, 295, 255, 210, 298, 210, 299, 265, 314, 300,
+ 330, 301, 167, 302, 274, 20, 276, 278, 20, 20,
+ 20, 280, 20, 304, 20, 20, 303, 20, 19, 311,
+ 316, 25, 317, 25, 25, 318, 319, 321, 329, 147,
+ 148, 20, 332, 331, 149, 340, 20, 284, 342, 285,
+ 353, 70, 112, 87, 70, 232, 163, 112, 88, 164,
+ 165, 166, 85, 85, 85, 85, 354, 141, 70, 70,
+ 141, 85, 346, 20, 51, 147, 148, 85, 85, 251,
+ 85, 57, 252, 158, 141, 141, 344, 85, 85, 166,
+ 85, 85, 85, 85, 85, 85, 101, 310, 2, 147,
+ 148, 156, 196, 70, 36, 20, 34, 20, 20, 159,
+ 147, 148, 147, 148, 147, 148, 147, 148, 156, 141,
+ 255, 39, 67, 67, 67, 67, 36, 147, 148, 167,
+ 34, 43, 147, 148, 43, 43, 43, 21, 43, 96,
+ 43, 43, 211, 43, 147, 148, 77, 67, 67, 147,
+ 148, 147, 148, 147, 148, 147, 148, 43, 69, 147,
+ 148, 149, 43, 348, 25, 25, 25, 25, 25, 25,
+ 262, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 147, 148, 328, 25, 25, 43,
+ 25, 25, 25, 25, 25, 147, 148, 147, 148, 25,
+ 25, 25, 25, 25, 25, 167, 185, 25, 82, 320,
+ 153, 82, 147, 148, 147, 148, 25, 0, 25, 25,
+ 0, 43, 0, 0, 43, 82, 82, 162, 0, 0,
+ 163, 156, 0, 164, 165, 166, 0, 149, 20, 20,
+ 20, 20, 20, 20, 0, 20, 20, 20, 20, 20,
+ 20, 20, 20, 20, 20, 20, 20, 20, 0, 167,
+ 82, 20, 20, 0, 20, 20, 20, 20, 20, 0,
+ 0, 0, 0, 20, 20, 20, 20, 20, 20, 0,
+ 0, 20, 70, 70, 70, 70, 0, 0, 0, 167,
+ 20, 149, 20, 20, 0, 0, 0, 0, 141, 141,
+ 141, 141, 167, 0, 181, 0, 170, 70, 70, 170,
+ 170, 170, 0, 170, 154, 170, 170, 154, 170, 150,
+ 0, 149, 0, 141, 141, 151, 152, 153, 154, 0,
+ 0, 154, 154, 0, 149, 204, 154, 170, 155, 157,
+ 158, 159, 160, 161, 162, 0, 0, 163, 0, 0,
+ 164, 165, 166, 0, 43, 43, 43, 43, 43, 43,
+ 0, 43, 43, 43, 154, 0, 154, 43, 0, 0,
+ 43, 43, 43, 43, 0, 0, 0, 43, 43, 0,
+ 43, 43, 43, 43, 43, 0, 0, 0, 0, 43,
+ 43, 43, 43, 43, 43, 66, 154, 43, 66, 170,
+ 0, 0, 167, 153, 154, 0, 43, 171, 43, 43,
+ 171, 171, 171, 66, 171, 113, 171, 171, 113, 171,
+ 162, 0, 0, 163, 0, 0, 164, 165, 166, 0,
+ 0, 0, 113, 113, 149, 0, 0, 113, 171, 82,
+ 82, 82, 82, 0, 0, 0, 0, 66, 0, 150,
+ 0, 0, 0, 0, 0, 151, 152, 153, 154, 0,
+ 0, 294, 0, 0, 82, 82, 297, 113, 155, 157,
+ 158, 159, 160, 161, 162, 0, 103, 163, 0, 103,
+ 164, 165, 166, 0, 0, 151, 152, 153, 154, 0,
+ 0, 0, 0, 103, 103, 0, 0, 0, 103, 0,
+ 171, 159, 160, 161, 162, 0, 0, 163, 0, 0,
+ 164, 165, 166, 0, 0, 0, 0, 162, 0, 0,
+ 163, 0, 0, 164, 165, 166, 0, 0, 103, 0,
+ 170, 170, 170, 170, 170, 0, 170, 170, 170, 0,
+ 0, 0, 170, 0, 0, 154, 154, 154, 154, 0,
+ 0, 0, 0, 170, 154, 170, 170, 170, 170, 170,
+ 154, 154, 154, 154, 170, 170, 170, 170, 170, 170,
+ 154, 154, 170, 154, 154, 154, 154, 154, 154, 154,
+ 0, 170, 154, 170, 170, 154, 154, 154, 94, 0,
+ 0, 94, 0, 104, 0, 0, 104, 0, 151, 152,
+ 153, 154, 0, 0, 0, 94, 94, 0, 0, 0,
+ 104, 104, 0, 0, 0, 104, 161, 162, 0, 249,
+ 163, 0, 0, 164, 165, 166, 66, 66, 66, 66,
+ 0, 171, 171, 171, 171, 171, 0, 171, 171, 171,
+ 94, 0, 350, 171, 0, 104, 113, 113, 113, 113,
+ 0, 66, 0, 0, 171, 113, 171, 171, 171, 171,
+ 171, 113, 113, 113, 113, 171, 171, 171, 171, 171,
+ 171, 113, 113, 171, 113, 113, 113, 113, 113, 113,
+ 113, 0, 171, 113, 171, 171, 113, 113, 113, 52,
+ 0, 0, 62, 64, 50, 0, 57, 0, 65, 60,
+ 0, 59, 0, 0, 0, 0, 0, 103, 103, 103,
+ 103, 0, 0, 0, 0, 58, 103, 0, 0, 0,
+ 63, 0, 103, 103, 103, 103, 0, 0, 0, 0,
+ 0, 0, 103, 103, 67, 103, 103, 103, 103, 103,
+ 103, 103, 0, 0, 103, 43, 0, 61, 43, 43,
+ 43, 0, 43, 0, 43, 43, 92, 43, 0, 0,
+ 4, 5, 6, 108, 7, 8, 117, 0, 0, 0,
+ 0, 43, 0, 114, 115, 0, 43, 0, 0, 23,
+ 123, 0, 53, 4, 5, 6, 0, 7, 8, 0,
+ 0, 0, 136, 137, 138, 139, 0, 0, 0, 0,
+ 0, 52, 176, 43, 62, 64, 50, 0, 57, 0,
+ 65, 60, 0, 59, 0, 0, 184, 0, 0, 94,
+ 94, 94, 94, 0, 104, 104, 104, 104, 0, 0,
+ 0, 0, 63, 104, 0, 43, 0, 198, 43, 104,
+ 104, 104, 104, 0, 94, 94, 0, 94, 0, 104,
+ 104, 0, 104, 104, 104, 104, 104, 104, 104, 61,
+ 0, 104, 208, 0, 52, 0, 0, 62, 64, 50,
+ 0, 57, 0, 65, 60, 0, 59, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 61, 0, 0, 0, 0, 52, 0,
- 0, 62, 64, 50, 0, 57, 0, 65, 60, 0,
- 59, 0, 150, 0, 152, 153, 0, 0, 0, 0,
- 0, 0, 0, 207, 0, 23, 0, 0, 53, 63,
- 160, 161, 0, 0, 162, 0, 0, 163, 164, 165,
- 0, 0, 0, 0, 0, 0, 43, 43, 43, 43,
- 43, 43, 0, 43, 43, 43, 61, 0, 0, 43,
- 245, 0, 43, 43, 43, 43, 0, 252, 0, 43,
- 43, 0, 43, 43, 43, 43, 43, 0, 0, 0,
- 0, 43, 43, 43, 43, 43, 43, 166, 23, 43,
- 0, 53, 0, 0, 0, 0, 0, 0, 43, 249,
- 43, 43, 250, 109, 25, 26, 27, 28, 87, 29,
- 30, 31, 0, 0, 166, 32, 0, 0, 0, 148,
- 0, 155, 0, 0, 0, 0, 38, 152, 39, 40,
+ 0, 23, 0, 0, 53, 63, 0, 0, 0, 246,
+ 0, 0, 0, 0, 0, 0, 254, 0, 0, 0,
+ 0, 0, 22, 24, 25, 26, 27, 28, 0, 29,
+ 30, 31, 61, 0, 0, 32, 0, 0, 33, 34,
+ 35, 36, 0, 0, 0, 37, 38, 0, 39, 40,
41, 42, 43, 0, 0, 0, 0, 44, 45, 46,
- 47, 48, 49, 0, 161, 51, 148, 162, 0, 166,
- 163, 164, 165, 316, 54, 0, 55, 56, 0, 24,
- 25, 26, 27, 28, 0, 29, 30, 31, 0, 0,
- 0, 32, 0, 0, 0, 155, 0, 0, 0, 0,
- 0, 148, 38, 0, 39, 40, 41, 42, 43, 0,
+ 47, 48, 49, 0, 23, 51, 0, 53, 0, 0,
+ 0, 0, 0, 0, 54, 0, 55, 56, 43, 43,
+ 43, 43, 43, 43, 0, 43, 43, 43, 0, 0,
+ 167, 43, 0, 0, 43, 43, 43, 43, 0, 0,
+ 0, 43, 43, 0, 43, 43, 43, 43, 43, 0,
+ 0, 0, 0, 43, 43, 43, 43, 43, 43, 167,
+ 0, 43, 149, 0, 0, 0, 0, 0, 0, 0,
+ 43, 0, 43, 43, 0, 110, 25, 26, 27, 28,
+ 88, 29, 30, 31, 0, 52, 0, 32, 62, 64,
+ 50, 149, 57, 130, 65, 60, 0, 59, 38, 0,
+ 39, 40, 41, 42, 43, 0, 0, 0, 0, 44,
+ 45, 46, 47, 48, 49, 0, 63, 51, 0, 0,
+ 0, 0, 0, 0, 0, 0, 54, 0, 55, 56,
+ 0, 0, 0, 0, 0, 0, 0, 0, 24, 25,
+ 26, 27, 28, 61, 29, 30, 31, 0, 52, 0,
+ 32, 62, 64, 50, 0, 57, 0, 65, 60, 0,
+ 59, 38, 0, 39, 40, 41, 42, 43, 0, 0,
+ 0, 0, 44, 45, 46, 47, 48, 49, 53, 63,
+ 51, 0, 323, 324, 325, 0, 327, 0, 0, 54,
+ 0, 55, 56, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 52, 0, 61, 62, 64, 50,
+ 0, 57, 343, 65, 60, 0, 59, 0, 0, 345,
+ 0, 0, 0, 347, 0, 0, 151, 152, 153, 154,
+ 120, 0, 0, 0, 0, 63, 355, 356, 23, 0,
+ 0, 53, 0, 160, 161, 162, 0, 0, 163, 0,
+ 0, 164, 165, 166, 0, 151, 0, 153, 154, 0,
+ 52, 0, 61, 62, 64, 50, 0, 57, 0, 65,
+ 60, 0, 59, 161, 162, 0, 0, 163, 0, 0,
+ 164, 165, 166, 0, 0, 0, 0, 0, 0, 0,
+ 0, 63, 0, 0, 0, 0, 0, 53, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 24,
+ 25, 26, 27, 28, 0, 29, 30, 31, 61, 52,
+ 134, 32, 62, 64, 50, 0, 57, 194, 65, 60,
+ 0, 59, 38, 0, 39, 40, 41, 42, 43, 0,
0, 0, 0, 44, 45, 46, 47, 48, 49, 0,
- 0, 51, 0, 166, 0, 0, 0, 0, 0, 0,
- 54, 0, 55, 56, 0, 0, 0, 0, 0, 0,
- 0, 0, 115, 25, 26, 27, 28, 0, 29, 30,
- 31, 0, 0, 0, 32, 148, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 38, 0, 39, 40, 41,
- 42, 43, 0, 0, 0, 166, 44, 45, 46, 47,
- 48, 49, 52, 0, 51, 62, 64, 50, 0, 57,
- 0, 65, 60, 54, 59, 55, 56, 0, 0, 0,
- 0, 0, 0, 150, 151, 152, 153, 148, 119, 0,
- 0, 0, 0, 63, 0, 0, 0, 156, 157, 158,
- 159, 160, 161, 0, 0, 162, 0, 0, 163, 164,
- 165, 0, 152, 153, 0, 0, 0, 0, 52, 0,
- 61, 62, 64, 50, 0, 57, 129, 65, 60, 161,
- 59, 0, 162, 0, 0, 163, 164, 165, 0, 149,
- 0, 0, 0, 0, 0, 150, 151, 152, 153, 63,
- 0, 0, 0, 0, 0, 53, 0, 0, 154, 156,
- 157, 158, 159, 160, 161, 0, 0, 162, 0, 0,
- 163, 164, 165, 0, 52, 0, 61, 62, 64, 50,
- 0, 57, 0, 65, 60, 0, 59, 0, 0, 0,
- 0, 0, 0, 149, 0, 0, 0, 0, 0, 150,
- 151, 152, 153, 0, 0, 63, 0, 0, 0, 0,
- 0, 53, 154, 156, 157, 158, 159, 160, 161, 0,
- 0, 162, 0, 0, 163, 164, 165, 0, 0, 0,
- 0, 0, 61, 52, 133, 0, 62, 64, 50, 0,
- 57, 193, 65, 60, 0, 59, 0, 0, 0, 0,
- 0, 150, 151, 152, 153, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 63, 0, 0, 53, 159, 160,
- 161, 0, 0, 162, 0, 0, 163, 164, 165, 0,
- 0, 0, 80, 0, 0, 80, 24, 25, 26, 27,
- 28, 61, 29, 30, 31, 0, 0, 0, 32, 80,
- 80, 0, 0, 0, 80, 0, 0, 0, 0, 38,
- 0, 39, 40, 41, 42, 43, 0, 0, 0, 0,
- 44, 45, 46, 47, 48, 49, 53, 0, 51, 0,
- 0, 0, 0, 0, 80, 0, 0, 54, 81, 55,
- 56, 81, 24, 25, 26, 27, 28, 0, 29, 30,
- 31, 0, 0, 0, 32, 81, 81, 0, 0, 0,
- 81, 0, 0, 0, 0, 38, 0, 39, 40, 41,
+ 63, 51, 0, 53, 0, 0, 0, 0, 0, 0,
+ 54, 0, 55, 56, 0, 0, 0, 0, 87, 0,
+ 0, 87, 116, 25, 26, 27, 28, 61, 29, 30,
+ 31, 0, 0, 0, 32, 87, 87, 0, 0, 0,
+ 87, 0, 0, 0, 0, 38, 0, 39, 40, 41,
42, 43, 0, 0, 0, 0, 44, 45, 46, 47,
- 48, 49, 0, 0, 51, 0, 0, 0, 0, 0,
- 81, 0, 0, 54, 0, 55, 56, 0, 24, 25,
- 26, 27, 28, 0, 29, 30, 31, 0, 52, 0,
- 32, 62, 64, 50, 0, 57, 241, 65, 60, 0,
+ 48, 49, 53, 0, 51, 0, 0, 0, 0, 0,
+ 87, 0, 0, 54, 88, 55, 56, 88, 24, 25,
+ 26, 27, 28, 0, 29, 30, 31, 0, 0, 0,
+ 32, 88, 88, 0, 0, 0, 88, 0, 0, 0,
+ 0, 38, 0, 39, 40, 41, 42, 43, 0, 0,
+ 0, 0, 44, 45, 46, 47, 48, 49, 0, 0,
+ 51, 0, 0, 0, 0, 0, 88, 0, 0, 54,
+ 0, 55, 56, 0, 24, 25, 26, 27, 28, 0,
+ 29, 30, 31, 0, 52, 0, 32, 62, 64, 50,
+ 0, 57, 242, 65, 60, 0, 59, 38, 0, 39,
+ 40, 41, 42, 43, 0, 0, 0, 0, 44, 45,
+ 46, 47, 48, 49, 0, 63, 51, 0, 0, 0,
+ 0, 0, 0, 0, 0, 54, 0, 55, 56, 0,
+ 0, 0, 0, 24, 25, 26, 27, 28, 0, 29,
+ 30, 31, 61, 52, 0, 32, 62, 64, 50, 0,
+ 57, 0, 65, 60, 0, 59, 38, 0, 39, 40,
+ 41, 42, 43, 0, 0, 0, 0, 44, 45, 46,
+ 47, 48, 49, 0, 63, 51, 0, 53, 0, 0,
+ 0, 0, 0, 0, 54, 0, 55, 56, 0, 87,
+ 87, 87, 87, 0, 0, 0, 0, 0, 87, 52,
+ 0, 61, 62, 64, 50, 87, 57, 275, 65, 60,
+ 0, 59, 0, 0, 87, 87, 0, 87, 87, 87,
+ 87, 87, 0, 0, 0, 0, 0, 0, 0, 0,
+ 63, 0, 0, 0, 0, 0, 53, 0, 0, 0,
+ 0, 0, 0, 0, 0, 88, 88, 88, 88, 0,
+ 0, 0, 0, 0, 88, 52, 0, 61, 62, 64,
+ 50, 0, 57, 277, 65, 60, 0, 59, 0, 0,
+ 88, 88, 0, 88, 88, 88, 88, 88, 0, 0,
+ 0, 0, 0, 0, 0, 0, 63, 0, 0, 0,
+ 0, 0, 53, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 24, 25,
+ 26, 27, 28, 61, 29, 30, 31, 0, 52, 0,
+ 32, 62, 64, 50, 0, 57, 0, 65, 60, 0,
59, 38, 0, 39, 40, 41, 42, 43, 0, 0,
- 0, 0, 44, 45, 46, 47, 48, 49, 0, 63,
+ 0, 0, 44, 45, 46, 47, 48, 49, 53, 63,
51, 0, 0, 0, 0, 0, 0, 0, 0, 54,
- 0, 55, 56, 0, 0, 0, 0, 24, 25, 26,
- 27, 28, 0, 29, 30, 31, 61, 52, 0, 32,
- 62, 64, 50, 0, 57, 0, 65, 60, 0, 59,
- 38, 0, 39, 40, 41, 42, 43, 0, 0, 0,
- 0, 44, 45, 46, 47, 48, 49, 0, 63, 51,
- 0, 53, 0, 0, 0, 0, 0, 0, 54, 0,
- 55, 56, 0, 80, 80, 80, 80, 0, 0, 0,
- 0, 0, 80, 52, 0, 61, 62, 64, 50, 80,
- 57, 273, 65, 60, 0, 59, 0, 0, 80, 80,
- 0, 80, 80, 80, 80, 80, 0, 0, 0, 0,
- 0, 0, 0, 0, 63, 0, 0, 0, 0, 0,
- 53, 0, 0, 0, 0, 0, 0, 0, 0, 81,
- 81, 81, 81, 0, 0, 0, 0, 0, 81, 52,
- 0, 61, 62, 64, 50, 0, 57, 275, 65, 60,
- 0, 59, 0, 0, 81, 81, 0, 81, 81, 81,
- 81, 81, 0, 0, 0, 0, 0, 0, 0, 0,
- 63, 0, 0, 0, 0, 0, 53, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 24, 25, 26, 27, 28, 61, 29, 30,
- 31, 0, 52, 0, 32, 62, 64, 50, 0, 57,
- 0, 65, 60, 0, 59, 38, 0, 39, 40, 41,
- 42, 43, 0, 0, 0, 0, 44, 45, 46, 47,
- 48, 49, 53, 63, 51, 0, 0, 0, 0, 0,
- 0, 0, 0, 54, 0, 55, 56, 0, 0, 0,
- 22, 24, 25, 26, 27, 28, 0, 29, 30, 31,
- 61, 0, 0, 32, 87, 0, 0, 87, 0, 0,
- 0, 0, 0, 0, 38, 0, 39, 40, 41, 42,
- 43, 87, 87, 0, 0, 44, 45, 46, 47, 48,
- 49, 166, 0, 51, 0, 53, 0, 0, 0, 0,
- 140, 0, 54, 140, 55, 56, 0, 24, 25, 26,
- 27, 28, 0, 29, 30, 31, 87, 140, 140, 32,
- 0, 0, 140, 148, 0, 0, 0, 0, 0, 0,
- 38, 0, 39, 40, 41, 42, 43, 0, 0, 0,
- 0, 44, 45, 46, 47, 48, 49, 0, 0, 51,
- 140, 0, 140, 0, 0, 0, 0, 0, 54, 123,
- 55, 56, 123, 24, 25, 26, 27, 28, 0, 29,
- 30, 31, 0, 0, 0, 32, 123, 123, 0, 0,
- 0, 123, 140, 0, 0, 0, 38, 0, 39, 40,
+ 0, 55, 56, 0, 0, 0, 22, 24, 25, 26,
+ 27, 28, 0, 29, 30, 31, 61, 0, 0, 32,
+ 69, 0, 0, 69, 0, 0, 0, 0, 0, 0,
+ 38, 0, 39, 40, 41, 42, 43, 69, 69, 0,
+ 0, 44, 45, 46, 47, 48, 49, 167, 0, 51,
+ 0, 53, 0, 0, 0, 0, 147, 0, 54, 147,
+ 55, 56, 0, 24, 25, 26, 27, 28, 0, 29,
+ 30, 31, 69, 147, 147, 32, 0, 0, 147, 149,
+ 0, 0, 0, 0, 0, 0, 38, 0, 39, 40,
41, 42, 43, 0, 0, 0, 0, 44, 45, 46,
- 47, 48, 49, 0, 0, 51, 0, 0, 0, 123,
- 0, 123, 0, 0, 54, 0, 55, 56, 0, 0,
- 0, 0, 147, 0, 0, 147, 24, 25, 26, 27,
- 28, 0, 29, 30, 31, 0, 0, 0, 32, 147,
- 147, 123, 0, 0, 147, 0, 0, 0, 0, 38,
- 0, 39, 40, 41, 42, 43, 0, 0, 0, 0,
- 44, 45, 46, 47, 48, 49, 0, 0, 51, 0,
- 133, 0, 147, 133, 147, 0, 0, 54, 0, 55,
- 56, 0, 0, 0, 0, 0, 0, 133, 133, 152,
- 153, 0, 133, 0, 0, 87, 87, 87, 87, 0,
- 0, 0, 0, 0, 147, 160, 161, 0, 0, 162,
- 0, 0, 163, 164, 165, 0, 0, 0, 0, 0,
- 87, 87, 133, 87, 0, 0, 0, 0, 0, 0,
- 0, 140, 140, 140, 140, 0, 108, 0, 0, 108,
- 140, 0, 0, 0, 0, 0, 140, 140, 140, 140,
- 0, 0, 133, 108, 108, 0, 140, 140, 108, 140,
- 140, 140, 140, 140, 140, 140, 0, 0, 140, 0,
- 0, 140, 140, 140, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 108, 0, 108, 0,
- 123, 123, 123, 123, 0, 149, 0, 0, 149, 123,
- 0, 0, 0, 0, 0, 123, 123, 123, 123, 0,
- 0, 0, 149, 149, 0, 123, 123, 149, 123, 123,
- 123, 123, 123, 123, 123, 0, 0, 123, 0, 0,
- 123, 123, 123, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 149, 0, 0,
- 0, 0, 0, 147, 147, 147, 147, 0, 0, 0,
- 0, 0, 147, 0, 0, 0, 0, 0, 147, 147,
- 147, 147, 0, 0, 0, 0, 0, 149, 147, 147,
- 0, 147, 147, 147, 147, 147, 147, 147, 0, 0,
- 147, 0, 0, 147, 147, 147, 0, 0, 0, 0,
- 0, 133, 133, 133, 133, 0, 150, 0, 0, 0,
- 133, 0, 0, 0, 0, 0, 133, 133, 133, 133,
- 0, 0, 0, 150, 150, 0, 133, 133, 150, 133,
- 133, 133, 133, 133, 133, 133, 0, 0, 133, 0,
- 0, 133, 133, 133, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 150, 0, 150, 0,
- 0, 0, 0, 0, 0, 0, 0, 108, 108, 108,
- 108, 0, 0, 0, 0, 0, 108, 0, 0, 0,
- 0, 0, 108, 108, 108, 108, 0, 0, 150, 0,
- 0, 0, 108, 108, 0, 108, 108, 108, 108, 108,
- 108, 108, 0, 0, 108, 0, 0, 108, 108, 108,
+ 47, 48, 49, 0, 0, 51, 147, 0, 147, 0,
+ 0, 0, 0, 0, 54, 130, 55, 56, 130, 24,
+ 25, 26, 27, 28, 0, 29, 30, 31, 0, 0,
+ 0, 32, 130, 130, 0, 0, 0, 130, 147, 0,
+ 0, 0, 38, 0, 39, 40, 41, 42, 43, 0,
+ 0, 0, 0, 44, 45, 46, 47, 48, 49, 0,
+ 0, 51, 0, 0, 0, 130, 0, 130, 0, 0,
+ 54, 0, 55, 56, 0, 0, 0, 0, 154, 0,
+ 0, 154, 24, 25, 26, 27, 28, 0, 29, 30,
+ 31, 0, 0, 0, 32, 154, 154, 130, 0, 0,
+ 154, 0, 0, 0, 0, 38, 0, 39, 40, 41,
+ 42, 43, 0, 0, 0, 0, 44, 45, 46, 47,
+ 48, 49, 0, 0, 51, 0, 140, 0, 154, 140,
+ 154, 0, 0, 54, 0, 55, 56, 0, 0, 0,
+ 0, 0, 0, 140, 140, 153, 154, 0, 140, 0,
+ 0, 69, 69, 69, 69, 0, 0, 0, 0, 0,
+ 154, 161, 162, 0, 0, 163, 0, 0, 164, 165,
+ 166, 0, 0, 0, 0, 0, 69, 69, 140, 0,
+ 0, 0, 0, 0, 0, 0, 0, 147, 147, 147,
+ 147, 0, 115, 0, 0, 115, 147, 0, 0, 0,
+ 0, 0, 147, 147, 147, 147, 0, 0, 140, 115,
+ 115, 0, 147, 147, 115, 147, 147, 147, 147, 147,
+ 147, 147, 0, 0, 147, 0, 0, 147, 147, 147,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 115, 0, 115, 0, 130, 130, 130, 130,
+ 0, 156, 0, 0, 156, 130, 0, 0, 0, 0,
+ 0, 130, 130, 130, 130, 0, 0, 0, 156, 156,
+ 0, 130, 130, 156, 130, 130, 130, 130, 130, 130,
+ 130, 0, 0, 130, 0, 0, 130, 130, 130, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 156, 0, 0, 0, 0, 0, 154,
+ 154, 154, 154, 0, 0, 0, 0, 0, 154, 0,
+ 0, 0, 0, 0, 154, 154, 154, 154, 0, 0,
+ 0, 0, 0, 156, 154, 154, 0, 154, 154, 154,
+ 154, 154, 154, 154, 0, 0, 154, 0, 0, 154,
+ 154, 154, 0, 0, 0, 0, 0, 140, 140, 140,
+ 140, 0, 157, 0, 0, 0, 140, 0, 0, 0,
+ 0, 0, 140, 140, 140, 140, 0, 0, 0, 157,
+ 157, 0, 140, 140, 157, 140, 140, 140, 140, 140,
+ 140, 140, 0, 0, 140, 0, 0, 140, 140, 140,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 149, 149, 149, 149,
- 0, 135, 0, 0, 0, 149, 0, 0, 0, 0,
- 0, 149, 149, 149, 149, 0, 0, 0, 135, 135,
- 0, 149, 149, 135, 149, 149, 149, 149, 149, 149,
- 149, 0, 0, 149, 0, 0, 149, 149, 149, 0,
- 89, 89, 0, 0, 100, 0, 0, 100, 0, 0,
- 0, 135, 102, 135, 86, 0, 0, 86, 110, 89,
- 118, 100, 100, 0, 0, 89, 100, 0, 0, 0,
- 0, 86, 86, 0, 0, 0, 86, 89, 89, 89,
- 89, 0, 0, 135, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 100, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 86, 150, 150, 150,
- 150, 0, 62, 0, 0, 62, 150, 0, 0, 0,
- 0, 110, 150, 150, 150, 150, 100, 0, 0, 62,
- 62, 0, 150, 150, 62, 150, 150, 150, 150, 150,
- 150, 150, 0, 0, 150, 0, 0, 150, 150, 150,
- 0, 0, 0, 0, 0, 65, 0, 0, 0, 0,
- 0, 0, 0, 0, 62, 0, 0, 0, 0, 0,
- 0, 0, 65, 65, 0, 0, 0, 65, 0, 0,
- 233, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 62, 0, 0, 0, 0, 99,
- 0, 0, 99, 0, 261, 65, 0, 65, 0, 0,
- 0, 0, 0, 0, 0, 0, 99, 99, 0, 0,
- 0, 99, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 135, 135, 135, 135, 0, 65, 0, 0,
- 0, 135, 0, 0, 0, 0, 0, 135, 135, 135,
- 135, 99, 0, 0, 0, 0, 0, 135, 135, 0,
- 135, 135, 135, 135, 135, 135, 135, 0, 0, 135,
- 0, 0, 135, 135, 135, 100, 100, 100, 100, 0,
- 136, 99, 0, 136, 100, 86, 86, 86, 86, 0,
- 100, 100, 100, 100, 86, 0, 0, 136, 136, 0,
- 100, 100, 136, 100, 100, 100, 100, 100, 100, 100,
- 86, 86, 100, 86, 86, 100, 100, 100, 0, 0,
+ 0, 0, 157, 0, 157, 0, 0, 0, 0, 0,
+ 0, 0, 0, 115, 115, 115, 115, 0, 0, 0,
+ 0, 0, 115, 0, 0, 0, 0, 0, 115, 115,
+ 115, 115, 0, 0, 157, 0, 0, 0, 115, 115,
+ 0, 115, 115, 115, 115, 115, 115, 115, 0, 0,
+ 115, 0, 0, 115, 115, 115, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 136, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 62, 62, 62, 62, 0, 149, 0,
- 0, 149, 62, 0, 0, 0, 0, 0, 62, 62,
- 62, 62, 0, 0, 0, 149, 149, 0, 62, 62,
- 149, 62, 62, 62, 62, 62, 62, 62, 0, 0,
- 62, 0, 0, 62, 62, 62, 65, 65, 65, 65,
- 0, 106, 0, 0, 106, 65, 0, 0, 0, 0,
- 149, 65, 65, 65, 65, 0, 0, 0, 106, 106,
- 0, 65, 65, 106, 65, 65, 65, 65, 65, 65,
- 65, 0, 0, 65, 0, 0, 65, 65, 65, 0,
- 99, 99, 99, 99, 0, 113, 0, 0, 113, 99,
- 0, 0, 0, 106, 0, 99, 99, 99, 99, 0,
- 0, 0, 113, 113, 0, 99, 99, 113, 99, 99,
- 99, 99, 99, 99, 99, 0, 0, 99, 0, 0,
- 99, 99, 99, 0, 0, 0, 0, 0, 91, 0,
- 0, 91, 0, 0, 0, 0, 0, 113, 0, 0,
- 0, 0, 0, 0, 0, 91, 91, 0, 0, 0,
- 91, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 136, 136, 136, 136, 0, 92, 0, 0, 92,
- 136, 0, 0, 0, 0, 0, 136, 136, 136, 136,
- 91, 0, 0, 92, 92, 0, 136, 136, 92, 136,
- 136, 136, 136, 136, 136, 136, 0, 0, 136, 0,
- 0, 136, 136, 136, 93, 0, 0, 93, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 92, 0,
- 0, 93, 93, 0, 0, 0, 93, 0, 0, 149,
- 149, 149, 149, 0, 0, 0, 0, 0, 149, 0,
- 0, 0, 0, 0, 149, 149, 149, 149, 0, 0,
- 0, 0, 0, 0, 149, 149, 93, 149, 149, 149,
- 149, 149, 149, 149, 0, 0, 149, 0, 0, 149,
- 149, 149, 106, 106, 106, 106, 0, 89, 0, 0,
- 89, 106, 0, 0, 0, 0, 0, 106, 106, 106,
- 106, 0, 0, 0, 89, 89, 0, 106, 106, 89,
- 106, 106, 106, 106, 106, 106, 106, 0, 0, 106,
- 0, 0, 106, 106, 106, 0, 113, 113, 113, 113,
- 0, 90, 0, 0, 90, 113, 0, 0, 0, 89,
- 0, 113, 113, 113, 113, 0, 0, 0, 90, 90,
- 0, 113, 113, 90, 113, 113, 113, 113, 113, 113,
- 113, 0, 0, 113, 0, 0, 113, 113, 113, 91,
- 91, 91, 91, 0, 88, 0, 0, 88, 91, 0,
- 0, 0, 0, 90, 91, 91, 91, 91, 0, 0,
- 0, 88, 88, 0, 91, 91, 88, 91, 91, 91,
- 91, 91, 91, 91, 0, 0, 0, 92, 92, 92,
- 92, 0, 76, 0, 0, 76, 92, 0, 0, 0,
- 0, 0, 92, 92, 92, 92, 88, 0, 0, 76,
- 76, 0, 92, 92, 76, 92, 92, 92, 92, 92,
- 92, 92, 0, 0, 0, 93, 93, 93, 93, 0,
- 77, 0, 0, 77, 93, 0, 0, 0, 0, 0,
- 93, 93, 93, 93, 76, 0, 0, 77, 77, 0,
- 93, 93, 77, 93, 93, 93, 93, 93, 93, 93,
- 0, 0, 0, 0, 0, 0, 78, 0, 0, 78,
+ 0, 0, 156, 156, 156, 156, 0, 142, 0, 0,
+ 0, 156, 0, 0, 0, 0, 0, 156, 156, 156,
+ 156, 0, 0, 0, 142, 142, 0, 156, 156, 142,
+ 156, 156, 156, 156, 156, 156, 156, 0, 0, 156,
+ 0, 0, 156, 156, 156, 0, 0, 0, 0, 0,
+ 107, 0, 0, 107, 0, 0, 0, 142, 0, 142,
+ 93, 0, 0, 93, 0, 0, 0, 107, 107, 0,
+ 0, 0, 107, 0, 0, 0, 0, 93, 93, 0,
+ 0, 0, 93, 0, 0, 0, 0, 0, 0, 142,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 77, 78, 78, 0, 0, 0, 78, 0,
+ 0, 0, 107, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 93, 157, 157, 157, 157, 0, 68, 0,
+ 0, 68, 157, 0, 0, 0, 0, 0, 157, 157,
+ 157, 157, 107, 0, 0, 68, 68, 0, 157, 157,
+ 68, 157, 157, 157, 157, 157, 157, 157, 0, 0,
+ 157, 0, 0, 157, 157, 157, 0, 0, 0, 0,
+ 0, 71, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 0, 0, 0, 0, 0, 0, 0, 71, 71,
+ 0, 0, 0, 71, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 0, 0, 0, 0, 106, 0, 0, 106, 0,
+ 0, 71, 0, 71, 0, 0, 0, 0, 0, 0,
+ 0, 0, 106, 106, 0, 0, 0, 106, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 142, 142,
+ 142, 142, 0, 71, 0, 0, 0, 142, 0, 0,
+ 0, 0, 0, 142, 142, 142, 142, 106, 0, 0,
+ 0, 0, 0, 142, 142, 0, 142, 142, 142, 142,
+ 142, 142, 142, 0, 0, 142, 0, 0, 142, 142,
+ 142, 107, 107, 107, 107, 0, 143, 106, 0, 143,
+ 107, 93, 93, 93, 93, 0, 107, 107, 107, 107,
+ 93, 0, 0, 143, 143, 0, 107, 107, 143, 107,
+ 107, 107, 107, 107, 107, 107, 93, 93, 107, 93,
+ 93, 107, 107, 107, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 143, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 68,
+ 68, 68, 68, 0, 156, 0, 0, 156, 68, 0,
+ 0, 0, 0, 0, 68, 68, 68, 68, 0, 0,
+ 0, 156, 156, 0, 68, 68, 156, 68, 68, 68,
+ 68, 68, 68, 68, 0, 0, 68, 0, 0, 68,
+ 68, 68, 71, 71, 71, 71, 0, 113, 0, 0,
+ 113, 71, 0, 0, 0, 0, 156, 71, 71, 71,
+ 71, 0, 0, 0, 113, 113, 0, 71, 71, 113,
+ 71, 71, 71, 71, 71, 71, 71, 0, 0, 71,
+ 0, 0, 71, 71, 71, 0, 106, 106, 106, 106,
+ 0, 120, 0, 0, 120, 106, 0, 0, 0, 113,
+ 0, 106, 106, 106, 106, 0, 0, 0, 120, 120,
+ 0, 106, 106, 120, 106, 106, 106, 106, 106, 106,
+ 106, 0, 0, 106, 0, 0, 106, 106, 106, 0,
+ 0, 0, 0, 0, 98, 0, 0, 98, 0, 0,
+ 0, 0, 0, 120, 0, 0, 0, 0, 0, 0,
+ 0, 98, 98, 0, 0, 0, 98, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 143, 143, 143,
+ 143, 0, 99, 0, 0, 99, 143, 0, 0, 0,
+ 0, 0, 143, 143, 143, 143, 98, 0, 0, 99,
+ 99, 0, 143, 143, 99, 143, 143, 143, 143, 143,
+ 143, 143, 0, 0, 143, 0, 0, 143, 143, 143,
+ 100, 0, 0, 100, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 99, 0, 0, 100, 100, 0,
+ 0, 0, 100, 0, 0, 156, 156, 156, 156, 0,
+ 0, 0, 0, 0, 156, 0, 0, 0, 0, 0,
+ 156, 156, 156, 156, 0, 0, 0, 0, 0, 0,
+ 156, 156, 100, 156, 156, 156, 156, 156, 156, 156,
+ 0, 0, 156, 0, 0, 156, 156, 156, 113, 113,
+ 113, 113, 0, 96, 0, 0, 96, 113, 0, 0,
+ 0, 0, 0, 113, 113, 113, 113, 0, 0, 0,
+ 96, 96, 0, 113, 113, 96, 113, 113, 113, 113,
+ 113, 113, 113, 0, 0, 113, 0, 0, 113, 113,
+ 113, 0, 120, 120, 120, 120, 0, 97, 0, 0,
+ 97, 120, 0, 0, 0, 96, 0, 120, 120, 120,
+ 120, 0, 0, 0, 97, 97, 0, 120, 120, 97,
+ 120, 120, 120, 120, 120, 120, 120, 0, 0, 120,
+ 0, 0, 120, 120, 120, 98, 98, 98, 98, 0,
+ 95, 0, 0, 95, 98, 0, 0, 0, 0, 97,
+ 98, 98, 98, 98, 0, 0, 0, 95, 95, 0,
+ 98, 98, 95, 98, 98, 98, 98, 98, 98, 98,
+ 0, 0, 0, 99, 99, 99, 99, 0, 83, 0,
+ 0, 83, 99, 0, 0, 0, 0, 0, 99, 99,
+ 99, 99, 95, 0, 0, 83, 83, 0, 99, 99,
+ 83, 99, 99, 99, 99, 99, 99, 99, 0, 0,
+ 0, 100, 100, 100, 100, 0, 84, 0, 0, 84,
+ 100, 0, 0, 0, 0, 0, 100, 100, 100, 100,
+ 83, 0, 0, 84, 84, 0, 100, 100, 84, 100,
+ 100, 100, 100, 100, 100, 100, 0, 0, 0, 0,
+ 0, 0, 86, 0, 0, 86, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 84, 86,
+ 86, 0, 0, 0, 86, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 96, 96, 96, 96, 0, 146,
+ 0, 0, 146, 96, 0, 0, 0, 0, 0, 96,
+ 96, 96, 96, 0, 86, 0, 146, 146, 0, 96,
+ 96, 146, 96, 96, 96, 96, 96, 96, 96, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 97, 97,
+ 97, 97, 0, 145, 0, 0, 145, 97, 0, 0,
+ 0, 146, 0, 97, 97, 97, 97, 0, 0, 0,
+ 145, 145, 0, 97, 97, 145, 97, 97, 97, 97,
+ 97, 97, 97, 0, 0, 0, 0, 0, 0, 0,
+ 0, 95, 95, 95, 95, 0, 134, 0, 0, 134,
+ 95, 0, 0, 0, 0, 145, 95, 95, 95, 95,
+ 0, 0, 0, 134, 134, 0, 95, 95, 134, 95,
+ 95, 95, 95, 95, 95, 95, 0, 0, 0, 83,
+ 83, 83, 83, 0, 105, 0, 0, 105, 83, 0,
+ 0, 0, 0, 0, 83, 83, 83, 83, 134, 0,
+ 0, 105, 105, 0, 83, 83, 105, 83, 83, 83,
+ 83, 83, 83, 83, 0, 0, 0, 84, 84, 84,
+ 84, 0, 89, 0, 0, 89, 84, 0, 0, 0,
+ 0, 0, 84, 84, 84, 84, 105, 0, 0, 89,
+ 89, 0, 84, 84, 89, 84, 84, 84, 84, 84,
+ 84, 0, 0, 86, 86, 86, 86, 0, 90, 0,
+ 0, 90, 86, 0, 0, 0, 0, 0, 86, 86,
+ 0, 0, 0, 0, 89, 90, 90, 0, 86, 86,
+ 90, 86, 86, 86, 86, 86, 86, 0, 0, 0,
+ 146, 146, 146, 146, 0, 92, 0, 0, 92, 146,
+ 0, 0, 0, 0, 0, 146, 146, 0, 0, 0,
+ 90, 0, 92, 92, 0, 146, 146, 92, 146, 146,
+ 146, 146, 146, 0, 0, 0, 167, 0, 0, 0,
+ 0, 0, 0, 0, 145, 145, 145, 145, 0, 91,
+ 156, 0, 91, 145, 0, 0, 0, 92, 0, 145,
+ 145, 0, 0, 0, 0, 0, 91, 91, 149, 145,
+ 145, 91, 145, 145, 145, 145, 145, 0, 167, 0,
+ 0, 283, 0, 0, 0, 0, 156, 134, 134, 134,
+ 134, 0, 0, 0, 0, 0, 134, 0, 0, 0,
+ 0, 91, 134, 134, 0, 0, 0, 0, 0, 0,
+ 149, 0, 134, 134, 167, 134, 134, 134, 134, 134,
+ 0, 0, 0, 0, 0, 105, 105, 105, 105, 0,
+ 0, 0, 0, 0, 105, 0, 0, 0, 0, 0,
+ 105, 105, 0, 0, 0, 156, 149, 0, 0, 0,
+ 105, 105, 0, 105, 105, 105, 105, 105, 0, 0,
+ 0, 0, 0, 89, 89, 89, 89, 0, 0, 0,
+ 0, 0, 89, 167, 0, 0, 0, 0, 90, 90,
0, 0, 0, 0, 0, 0, 0, 0, 89, 89,
- 89, 89, 0, 79, 0, 0, 79, 89, 0, 0,
- 0, 0, 0, 89, 89, 89, 89, 0, 78, 0,
- 79, 79, 0, 89, 89, 79, 89, 89, 89, 89,
- 89, 89, 89, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 90, 90, 90, 90, 0, 139, 0, 0,
- 139, 90, 0, 0, 0, 79, 0, 90, 90, 90,
- 90, 0, 0, 0, 139, 139, 0, 90, 90, 139,
- 90, 90, 90, 90, 90, 90, 90, 0, 0, 0,
- 0, 0, 0, 0, 0, 88, 88, 88, 88, 0,
- 138, 0, 0, 138, 88, 0, 0, 0, 0, 139,
- 88, 88, 88, 88, 0, 0, 0, 138, 138, 0,
- 88, 88, 138, 88, 88, 88, 88, 88, 88, 88,
- 0, 0, 0, 76, 76, 76, 76, 0, 127, 0,
- 0, 127, 76, 0, 0, 0, 0, 0, 76, 76,
- 76, 76, 138, 0, 0, 127, 127, 0, 76, 76,
- 127, 76, 76, 76, 76, 76, 76, 76, 0, 0,
- 0, 77, 77, 77, 77, 0, 98, 0, 0, 98,
- 77, 0, 0, 0, 0, 0, 77, 77, 77, 77,
- 127, 0, 0, 98, 98, 0, 77, 77, 98, 77,
- 77, 77, 77, 77, 77, 0, 0, 78, 78, 78,
- 78, 0, 82, 0, 0, 82, 78, 0, 0, 0,
- 0, 0, 78, 78, 0, 78, 0, 0, 98, 82,
- 82, 0, 78, 78, 82, 78, 78, 78, 78, 78,
- 78, 0, 0, 0, 79, 79, 79, 79, 0, 83,
- 0, 0, 83, 79, 0, 0, 0, 0, 0, 79,
- 79, 0, 0, 0, 82, 0, 83, 83, 0, 79,
- 79, 83, 79, 79, 79, 79, 79, 79, 0, 0,
- 166, 0, 0, 0, 0, 0, 0, 0, 139, 139,
- 139, 139, 0, 85, 0, 0, 85, 139, 0, 0,
- 0, 83, 0, 139, 139, 0, 64, 0, 0, 64,
- 85, 85, 148, 139, 139, 85, 139, 139, 139, 139,
- 139, 0, 0, 64, 64, 134, 0, 0, 134, 0,
- 0, 138, 138, 138, 138, 75, 0, 0, 75, 0,
- 138, 0, 134, 134, 0, 85, 138, 138, 0, 0,
- 0, 0, 75, 75, 0, 0, 138, 138, 64, 138,
- 138, 138, 138, 138, 0, 63, 0, 0, 63, 127,
- 127, 127, 127, 0, 0, 0, 0, 134, 127, 0,
- 0, 0, 63, 63, 127, 127, 281, 75, 0, 0,
- 0, 155, 0, 0, 127, 127, 0, 127, 127, 127,
- 127, 127, 0, 0, 0, 0, 0, 98, 98, 98,
- 98, 0, 0, 0, 0, 0, 98, 63, 0, 166,
- 0, 0, 98, 98, 0, 155, 0, 0, 0, 0,
- 0, 0, 98, 98, 0, 98, 98, 98, 98, 98,
- 0, 0, 0, 82, 82, 82, 82, 0, 0, 0,
- 0, 148, 82, 166, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 82, 82,
- 0, 82, 82, 82, 82, 82, 150, 151, 152, 153,
- 83, 83, 83, 83, 0, 148, 0, 0, 0, 83,
- 0, 157, 158, 159, 160, 161, 0, 0, 162, 0,
- 0, 163, 164, 165, 166, 83, 83, 0, 83, 83,
- 83, 83, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 85, 85, 85, 85, 0, 0,
- 0, 0, 0, 85, 0, 0, 148, 64, 64, 64,
- 64, 0, 0, 0, 0, 0, 0, 0, 0, 85,
- 85, 0, 85, 85, 85, 0, 134, 134, 134, 134,
- 0, 0, 64, 64, 93, 0, 75, 75, 75, 75,
- 0, 0, 103, 0, 0, 0, 108, 0, 0, 117,
- 0, 134, 134, 0, 0, 0, 124, 125, 126, 127,
- 128, 75, 75, 131, 132, 0, 63, 63, 63, 63,
- 139, 0, 0, 0, 0, 0, 0, 0, 0, 149,
- 0, 0, 0, 0, 0, 150, 151, 152, 153, 0,
- 0, 63, 63, 0, 0, 0, 182, 0, 154, 156,
- 157, 158, 159, 160, 161, 0, 0, 162, 0, 0,
- 163, 164, 165, 149, 0, 0, 0, 0, 0, 150,
- 151, 152, 153, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 154, 156, 157, 158, 159, 160, 161, 0,
- 0, 162, 0, 0, 163, 164, 165, 0, 0, 0,
- 0, 0, 0, 216, 217, 218, 219, 220, 221, 222,
- 223, 224, 225, 226, 227, 228, 229, 0, 0, 0,
- 150, 151, 152, 153, 0, 0, 0, 0, 243, 0,
- 0, 0, 0, 0, 0, 0, 158, 159, 160, 161,
- 0, 0, 162, 0, 0, 163, 164, 165, 0, 0,
+ 103, 89, 89, 89, 89, 89, 111, 90, 119, 90,
+ 90, 90, 90, 90, 0, 149, 0, 0, 90, 167,
+ 0, 0, 0, 0, 0, 90, 90, 90, 90, 0,
+ 0, 0, 0, 0, 90, 90, 0, 90, 90, 90,
+ 90, 0, 151, 152, 153, 154, 92, 92, 92, 92,
+ 0, 149, 0, 0, 0, 92, 157, 158, 159, 160,
+ 161, 162, 0, 0, 163, 0, 0, 164, 165, 166,
+ 111, 92, 92, 0, 92, 92, 92, 0, 150, 0,
+ 0, 0, 0, 0, 151, 152, 153, 154, 0, 0,
+ 91, 91, 91, 91, 0, 0, 0, 155, 157, 158,
+ 159, 160, 161, 162, 0, 0, 163, 0, 0, 164,
+ 165, 166, 0, 0, 150, 91, 91, 0, 91, 0,
+ 151, 152, 153, 154, 0, 0, 0, 0, 0, 234,
+ 0, 0, 0, 155, 157, 158, 159, 160, 161, 162,
+ 94, 0, 163, 0, 0, 164, 165, 166, 104, 0,
+ 0, 0, 109, 263, 0, 118, 0, 0, 0, 0,
+ 0, 0, 125, 126, 127, 128, 129, 0, 0, 132,
+ 133, 0, 0, 150, 0, 0, 140, 0, 0, 151,
+ 152, 153, 154, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 157, 158, 159, 160, 161, 162, 0,
+ 0, 163, 0, 183, 164, 165, 166, 0, 0, 0,
+ 0, 0, 0, 0, 0, 151, 152, 153, 154, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 158, 159, 160, 161, 162, 0, 0, 163, 0, 0,
+ 164, 165, 166, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 217, 218, 219, 220, 221, 222, 223, 224, 225, 226,
+ 227, 228, 229, 230, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 244, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 294, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 309,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 296, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 312,
};
dEXT short yycheck[] = { 13,
- 41, 36, 36, 85, 93, 91, 40, 59, 41, 93,
- 41, 44, 41, 59, 40, 44, 123, 93, 181, 59,
- 90, 93, 41, 91, 257, 41, 59, 36, 321, 58,
- 59, 41, 46, 93, 63, 91, 0, 123, 59, 190,
- 257, 318, 319, 57, 257, 41, 323, 61, 40, 59,
- 40, 121, 297, 298, 40, 123, 91, 41, 40, 352,
- 93, 40, 339, 59, 93, 91, 343, 123, 6, 33,
- 8, 123, 36, 37, 38, 59, 40, 40, 42, 43,
- 41, 45, 41, 123, 278, 41, 40, 44, 123, 41,
- 40, 105, 106, 31, 32, 59, 123, 123, 276, 277,
- 64, 41, 44, 59, 0, 41, 41, 59, 178, 93,
- 59, 40, 59, 183, 123, 59, 59, 268, 59, 59,
- 59, 284, 260, 59, 59, 123, 257, 91, 142, 143,
- 144, 145, 146, 147, 148, 40, 40, 33, 93, 41,
- 36, 37, 38, 59, 40, 40, 42, 43, 299, 45,
- 257, 125, 166, 167, 168, 169, 170, 171, 172, 123,
- 0, 125, 126, 59, 91, 36, 41, 181, 64, 91,
- 298, 185, 186, 40, 188, 59, 190, 125, 41, 41,
- 41, 41, 41, 197, 40, 199, 200, 93, 91, 41,
- 204, 342, 125, 33, 59, 91, 36, 37, 38, 125,
- 40, 125, 42, 43, 125, 45, 123, 41, 297, 298,
- 125, 257, 41, 297, 298, 41, 230, 59, 232, 59,
- 123, 297, 298, 258, 64, 297, 298, 123, 314, 125,
- 126, 41, 41, 40, 123, 44, 41, 297, 298, 272,
- 273, 274, 275, 272, 273, 274, 275, 329, 257, 58,
- 59, 91, 281, 262, 63, 41, 297, 298, 287, 288,
- 289, 290, 296, 59, 297, 279, 297, 298, 297, 298,
- 284, 300, 301, 302, 303, 304, 305, 306, 297, 298,
- 309, 297, 298, 123, 93, 41, 126, 301, 272, 273,
- 274, 275, 256, 257, 258, 259, 260, 261, 59, 263,
- 264, 265, 266, 267, 268, 269, 270, 271, 272, 273,
- 274, 275, 41, 297, 298, 279, 280, 41, 282, 283,
- 284, 285, 286, 59, 338, 63, 41, 291, 292, 293,
- 294, 295, 296, 13, 338, 299, 297, 298, 297, 298,
- 297, 298, 297, 298, 308, 143, 310, 311, 297, 298,
- 297, 298, 188, 91, 297, 298, 297, 298, 297, 298,
- 256, 257, 258, 259, 260, 261, 125, 263, 264, 265,
- 266, 267, 268, 269, 270, 271, 272, 273, 274, 275,
- 125, 297, 298, 279, 280, 123, 282, 283, 284, 285,
- 286, 297, 298, 301, 95, 291, 292, 293, 294, 295,
- 296, -1, -1, 299, -1, -1, 309, -1, -1, 312,
- 313, 314, 308, -1, 310, 311, 256, 257, 258, 259,
- 260, 261, -1, 263, 264, 265, -1, -1, -1, 269,
- 91, -1, 272, 273, 274, 275, -1, -1, -1, 279,
- 280, -1, 282, 283, 284, 285, 286, -1, -1, -1,
- 91, 291, 292, 293, 294, 295, 296, -1, -1, 299,
- -1, -1, 123, 272, 273, 274, 275, -1, 308, 33,
- 310, 311, 36, 37, 38, -1, 40, 41, 42, 43,
- 44, 45, 123, -1, -1, -1, -1, -1, 297, 298,
- -1, 300, -1, -1, 58, 59, -1, -1, -1, 63,
- 64, 266, 267, 268, -1, 270, 271, 266, 267, 268,
- -1, 270, 271, 96, 97, 98, 99, 100, 101, -1,
- -1, 266, 267, 268, -1, 270, 271, 91, -1, 93,
- 33, -1, -1, 36, 37, 38, -1, 40, 41, 42,
- 43, 44, 45, 281, 272, 273, 274, 275, -1, 287,
- 288, 289, 290, -1, -1, 58, 59, -1, -1, 123,
- 63, 64, 126, 301, 302, 303, 304, 305, 306, 297,
- 298, 309, 43, -1, 312, 313, 314, -1, -1, -1,
- 51, -1, -1, -1, -1, -1, -1, -1, -1, 33,
- 93, -1, 36, 37, 38, -1, 40, -1, 42, 43,
- 26, 45, -1, -1, -1, -1, -1, -1, 191, -1,
- -1, -1, -1, -1, -1, 59, -1, 43, 44, 90,
- 64, -1, -1, 126, 50, -1, 287, 288, 289, 290,
- 296, 297, 298, -1, 300, -1, 62, 63, 64, 65,
- 41, -1, 113, 44, 305, 306, -1, 91, 309, -1,
- 121, 312, 313, 314, -1, -1, -1, 58, 59, 325,
- -1, -1, 63, -1, -1, 306, 332, -1, 309, -1,
- 336, 312, 313, 314, -1, -1, -1, -1, -1, 123,
- 106, -1, 126, 349, 350, -1, -1, -1, -1, -1,
- -1, -1, 93, 257, 258, 259, 260, 261, -1, 263,
- 264, 265, -1, -1, -1, 269, -1, 178, 272, 273,
- 274, 275, 183, -1, -1, -1, 280, 281, 282, 283,
- 284, 285, 286, 287, 288, 289, 290, 291, 292, 293,
- 294, 295, 296, 297, 298, 299, 300, 301, 302, 303,
- 304, 305, 306, -1, 308, 309, 310, 311, 312, 313,
- 314, -1, -1, -1, 257, 258, 259, 260, 261, -1,
- 263, 264, 265, -1, -1, -1, 269, -1, -1, 272,
- 273, 274, 275, -1, -1, -1, -1, 280, 281, 282,
- 283, 284, 285, 286, 287, 288, 289, 290, 291, 292,
- 293, 294, 295, 296, 297, 298, 299, 300, 301, 302,
- 303, 304, 305, 306, -1, 308, 309, 310, 311, 312,
- 313, 314, 256, 257, 258, 259, 260, 261, -1, 263,
- 264, 265, -1, -1, -1, 269, -1, -1, 272, 273,
- 274, 275, -1, -1, -1, 279, 280, -1, 282, 283,
- 284, 285, 286, -1, -1, -1, 91, 291, 292, 293,
- 294, 295, 296, 33, -1, 299, 36, 37, 38, -1,
- 40, -1, 42, 43, 308, 45, 310, 311, -1, -1,
- -1, 272, 273, 274, 275, -1, -1, -1, 123, 59,
- 281, -1, -1, -1, 64, -1, 287, 288, 289, 290,
- -1, -1, -1, -1, -1, -1, 297, 298, -1, 300,
- 301, 302, 303, 304, 305, 306, -1, -1, 309, 33,
- -1, 91, 36, 37, 38, -1, 40, -1, 42, 43,
- -1, 45, -1, -1, -1, -1, 13, -1, -1, -1,
- 17, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- 64, -1, -1, 123, -1, -1, 126, -1, -1, -1,
- -1, -1, -1, -1, -1, 42, -1, -1, 45, 91,
- -1, -1, -1, -1, -1, 33, -1, 91, 36, 37,
- 38, -1, 40, -1, 42, 43, -1, 45, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, 123, -1, 80, -1, -1, 64, -1, -1, 123,
- -1, -1, 126, -1, -1, -1, -1, 94, -1, -1,
+ 59, 41, 36, 36, 44, 93, 36, 59, 91, 86,
+ 40, 325, 91, 41, 257, 191, 40, 43, 58, 59,
+ 182, 257, 59, 63, 41, 51, 41, 59, 41, 257,
+ 41, 91, 46, 41, 322, 323, 91, 59, 41, 327,
+ 123, 41, 356, 57, 123, 297, 298, 61, 41, 44,
+ 40, 59, 40, 93, 40, 343, 59, 278, 91, 347,
+ 123, 41, 41, 123, 41, 91, 59, 91, 123, 40,
+ 97, 98, 99, 100, 101, 102, 59, 41, 0, 59,
+ 59, 59, 59, 59, 40, 59, 123, 59, 114, 123,
+ 123, 123, 106, 107, 270, 59, 122, 276, 277, 123,
+ 59, 41, 272, 273, 274, 275, 40, 40, 44, 40,
+ 260, 33, 40, 93, 36, 37, 38, 123, 40, 59,
+ 42, 43, 257, 45, 286, 93, 302, 297, 298, 143,
+ 144, 145, 146, 147, 148, 149, 40, 59, 40, 266,
+ 267, 268, 64, 270, 271, 41, 40, 91, 257, 36,
+ 93, 41, 0, 167, 168, 169, 170, 171, 172, 173,
+ 125, 93, 125, 93, 91, 192, 298, 40, 182, 91,
+ 346, 41, 186, 187, 41, 189, 41, 191, 93, 41,
+ 93, 41, 91, 40, 198, 33, 200, 201, 36, 37,
+ 38, 205, 40, 59, 42, 43, 41, 45, 257, 125,
+ 125, 123, 125, 125, 126, 125, 59, 123, 41, 297,
+ 298, 59, 41, 125, 123, 41, 64, 231, 59, 233,
+ 41, 41, 248, 257, 44, 258, 309, 253, 262, 312,
+ 313, 314, 272, 273, 274, 275, 41, 41, 58, 59,
+ 44, 281, 40, 91, 123, 297, 298, 287, 288, 41,
+ 290, 123, 44, 41, 58, 59, 333, 297, 298, 314,
+ 300, 301, 302, 303, 304, 305, 296, 281, 0, 297,
+ 298, 63, 286, 93, 41, 123, 59, 125, 126, 41,
+ 297, 298, 297, 298, 297, 298, 297, 298, 59, 93,
+ 304, 41, 272, 273, 274, 275, 59, 297, 298, 91,
+ 41, 33, 297, 298, 36, 37, 38, 8, 40, 32,
+ 42, 43, 144, 45, 297, 298, 13, 297, 298, 297,
+ 298, 297, 298, 297, 298, 297, 298, 59, 342, 297,
+ 298, 123, 64, 342, 256, 257, 258, 259, 260, 261,
+ 189, 263, 264, 265, 266, 267, 268, 269, 270, 271,
+ 272, 273, 274, 275, 297, 298, 304, 279, 280, 91,
+ 282, 283, 284, 285, 286, 297, 298, 297, 298, 291,
+ 292, 293, 294, 295, 296, 91, 96, 299, 41, 41,
+ 289, 44, 297, 298, 297, 298, 308, -1, 310, 311,
+ -1, 123, -1, -1, 126, 58, 59, 306, -1, -1,
+ 309, 63, -1, 312, 313, 314, -1, 123, 256, 257,
+ 258, 259, 260, 261, -1, 263, 264, 265, 266, 267,
+ 268, 269, 270, 271, 272, 273, 274, 275, -1, 91,
+ 93, 279, 280, -1, 282, 283, 284, 285, 286, -1,
+ -1, -1, -1, 291, 292, 293, 294, 295, 296, -1,
+ -1, 299, 272, 273, 274, 275, -1, -1, -1, 91,
+ 308, 123, 310, 311, -1, -1, -1, -1, 272, 273,
+ 274, 275, 91, -1, 91, -1, 33, 297, 298, 36,
+ 37, 38, -1, 40, 41, 42, 43, 44, 45, 281,
+ -1, 123, -1, 297, 298, 287, 288, 289, 290, -1,
+ -1, 58, 59, -1, 123, 122, 63, 64, 300, 301,
+ 302, 303, 304, 305, 306, -1, -1, 309, -1, -1,
+ 312, 313, 314, -1, 256, 257, 258, 259, 260, 261,
+ -1, 263, 264, 265, 91, -1, 93, 269, -1, -1,
+ 272, 273, 274, 275, -1, -1, -1, 279, 280, -1,
+ 282, 283, 284, 285, 286, -1, -1, -1, -1, 291,
+ 292, 293, 294, 295, 296, 41, 123, 299, 44, 126,
+ -1, -1, 91, 289, 290, -1, 308, 33, 310, 311,
+ 36, 37, 38, 59, 40, 41, 42, 43, 44, 45,
+ 306, -1, -1, 309, -1, -1, 312, 313, 314, -1,
+ -1, -1, 58, 59, 123, -1, -1, 63, 64, 272,
+ 273, 274, 275, -1, -1, -1, -1, 93, -1, 281,
+ -1, -1, -1, -1, -1, 287, 288, 289, 290, -1,
+ -1, 248, -1, -1, 297, 298, 253, 93, 300, 301,
+ 302, 303, 304, 305, 306, -1, 41, 309, -1, 44,
+ 312, 313, 314, -1, -1, 287, 288, 289, 290, -1,
+ -1, -1, -1, 58, 59, -1, -1, -1, 63, -1,
+ 126, 303, 304, 305, 306, -1, -1, 309, -1, -1,
+ 312, 313, 314, -1, -1, -1, -1, 306, -1, -1,
+ 309, -1, -1, 312, 313, 314, -1, -1, 93, -1,
+ 257, 258, 259, 260, 261, -1, 263, 264, 265, -1,
+ -1, -1, 269, -1, -1, 272, 273, 274, 275, -1,
+ -1, -1, -1, 280, 281, 282, 283, 284, 285, 286,
+ 287, 288, 289, 290, 291, 292, 293, 294, 295, 296,
+ 297, 298, 299, 300, 301, 302, 303, 304, 305, 306,
+ -1, 308, 309, 310, 311, 312, 313, 314, 41, -1,
+ -1, 44, -1, 41, -1, -1, 44, -1, 287, 288,
+ 289, 290, -1, -1, -1, 58, 59, -1, -1, -1,
+ 58, 59, -1, -1, -1, 63, 305, 306, -1, 125,
+ 309, -1, -1, 312, 313, 314, 272, 273, 274, 275,
+ -1, 257, 258, 259, 260, 261, -1, 263, 264, 265,
+ 93, -1, 125, 269, -1, 93, 272, 273, 274, 275,
+ -1, 297, -1, -1, 280, 281, 282, 283, 284, 285,
+ 286, 287, 288, 289, 290, 291, 292, 293, 294, 295,
+ 296, 297, 298, 299, 300, 301, 302, 303, 304, 305,
+ 306, -1, 308, 309, 310, 311, 312, 313, 314, 33,
+ -1, -1, 36, 37, 38, -1, 40, -1, 42, 43,
+ -1, 45, -1, -1, -1, -1, -1, 272, 273, 274,
+ 275, -1, -1, -1, -1, 59, 281, -1, -1, -1,
+ 64, -1, 287, 288, 289, 290, -1, -1, -1, -1,
+ -1, -1, 297, 298, 13, 300, 301, 302, 303, 304,
+ 305, 306, -1, -1, 309, 33, -1, 91, 36, 37,
+ 38, -1, 40, -1, 42, 43, 26, 45, -1, -1,
+ 266, 267, 268, 42, 270, 271, 45, -1, -1, -1,
+ -1, 59, -1, 43, 44, -1, 64, -1, -1, 123,
+ 50, -1, 126, 266, 267, 268, -1, 270, 271, -1,
+ -1, -1, 62, 63, 64, 65, -1, -1, -1, -1,
+ -1, 33, 81, 91, 36, 37, 38, -1, 40, -1,
+ 42, 43, -1, 45, -1, -1, 95, -1, -1, 272,
+ 273, 274, 275, -1, 272, 273, 274, 275, -1, -1,
+ -1, -1, 64, 281, -1, 123, -1, 107, 126, 287,
+ 288, 289, 290, -1, 297, 298, -1, 300, -1, 297,
+ 298, -1, 300, 301, 302, 303, 304, 305, 306, 91,
+ -1, 309, 141, -1, 33, -1, -1, 36, 37, 38,
+ -1, 40, -1, 42, 43, -1, 45, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, 91, -1, -1, -1, -1, 33, -1,
- -1, 36, 37, 38, -1, 40, -1, 42, 43, -1,
- 45, -1, 287, -1, 289, 290, -1, -1, -1, -1,
- -1, -1, -1, 140, -1, 123, -1, -1, 126, 64,
- 305, 306, -1, -1, 309, -1, -1, 312, 313, 314,
- -1, -1, -1, -1, -1, -1, 256, 257, 258, 259,
- 260, 261, -1, 263, 264, 265, 91, -1, -1, 269,
- 177, -1, 272, 273, 274, 275, -1, 184, -1, 279,
- 280, -1, 282, 283, 284, 285, 286, -1, -1, -1,
- -1, 291, 292, 293, 294, 295, 296, 91, 123, 299,
- -1, 126, -1, -1, -1, -1, -1, -1, 308, 41,
- 310, 311, 44, 257, 258, 259, 260, 261, 262, 263,
- 264, 265, -1, -1, 91, 269, -1, -1, -1, 123,
- -1, 63, -1, -1, -1, -1, 280, 289, 282, 283,
+ -1, 123, -1, -1, 126, 64, -1, -1, -1, 178,
+ -1, -1, -1, -1, -1, -1, 185, -1, -1, -1,
+ -1, -1, 256, 257, 258, 259, 260, 261, -1, 263,
+ 264, 265, 91, -1, -1, 269, -1, -1, 272, 273,
+ 274, 275, -1, -1, -1, 279, 280, -1, 282, 283,
284, 285, 286, -1, -1, -1, -1, 291, 292, 293,
- 294, 295, 296, -1, 306, 299, 123, 309, -1, 91,
- 312, 313, 314, 41, 308, -1, 310, 311, -1, 257,
+ 294, 295, 296, -1, 123, 299, -1, 126, -1, -1,
+ -1, -1, -1, -1, 308, -1, 310, 311, 256, 257,
258, 259, 260, 261, -1, 263, 264, 265, -1, -1,
- -1, 269, -1, -1, -1, 63, -1, -1, -1, -1,
- -1, 123, 280, -1, 282, 283, 284, 285, 286, -1,
+ 91, 269, -1, -1, 272, 273, 274, 275, -1, -1,
+ -1, 279, 280, -1, 282, 283, 284, 285, 286, -1,
+ -1, -1, -1, 291, 292, 293, 294, 295, 296, 91,
+ -1, 299, 123, -1, -1, -1, -1, -1, -1, -1,
+ 308, -1, 310, 311, -1, 257, 258, 259, 260, 261,
+ 262, 263, 264, 265, -1, 33, -1, 269, 36, 37,
+ 38, 123, 40, 41, 42, 43, -1, 45, 280, -1,
+ 282, 283, 284, 285, 286, -1, -1, -1, -1, 291,
+ 292, 293, 294, 295, 296, -1, 64, 299, -1, -1,
+ -1, -1, -1, -1, -1, -1, 308, -1, 310, 311,
+ -1, -1, -1, -1, -1, -1, -1, -1, 257, 258,
+ 259, 260, 261, 91, 263, 264, 265, -1, 33, -1,
+ 269, 36, 37, 38, -1, 40, -1, 42, 43, -1,
+ 45, 280, -1, 282, 283, 284, 285, 286, -1, -1,
+ -1, -1, 291, 292, 293, 294, 295, 296, 126, 64,
+ 299, -1, 299, 300, 301, -1, 303, -1, -1, 308,
+ -1, 310, 311, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 33, -1, 91, 36, 37, 38,
+ -1, 40, 329, 42, 43, -1, 45, -1, -1, 336,
+ -1, -1, -1, 340, -1, -1, 287, 288, 289, 290,
+ 59, -1, -1, -1, -1, 64, 353, 354, 123, -1,
+ -1, 126, -1, 304, 305, 306, -1, -1, 309, -1,
+ -1, 312, 313, 314, -1, 287, -1, 289, 290, -1,
+ 33, -1, 91, 36, 37, 38, -1, 40, -1, 42,
+ 43, -1, 45, 305, 306, -1, -1, 309, -1, -1,
+ 312, 313, 314, -1, -1, -1, -1, -1, -1, -1,
+ -1, 64, -1, -1, -1, -1, -1, 126, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, 257,
+ 258, 259, 260, 261, -1, 263, 264, 265, 91, 33,
+ 93, 269, 36, 37, 38, -1, 40, 41, 42, 43,
+ -1, 45, 280, -1, 282, 283, 284, 285, 286, -1,
-1, -1, -1, 291, 292, 293, 294, 295, 296, -1,
- -1, 299, -1, 91, -1, -1, -1, -1, -1, -1,
- 308, -1, 310, 311, -1, -1, -1, -1, -1, -1,
- -1, -1, 257, 258, 259, 260, 261, -1, 263, 264,
- 265, -1, -1, -1, 269, 123, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, 280, -1, 282, 283, 284,
- 285, 286, -1, -1, -1, 91, 291, 292, 293, 294,
- 295, 296, 33, -1, 299, 36, 37, 38, -1, 40,
- -1, 42, 43, 308, 45, 310, 311, -1, -1, -1,
- -1, -1, -1, 287, 288, 289, 290, 123, 59, -1,
- -1, -1, -1, 64, -1, -1, -1, 301, 302, 303,
- 304, 305, 306, -1, -1, 309, -1, -1, 312, 313,
- 314, -1, 289, 290, -1, -1, -1, -1, 33, -1,
- 91, 36, 37, 38, -1, 40, 41, 42, 43, 306,
- 45, -1, 309, -1, -1, 312, 313, 314, -1, 281,
- -1, -1, -1, -1, -1, 287, 288, 289, 290, 64,
- -1, -1, -1, -1, -1, 126, -1, -1, 300, 301,
- 302, 303, 304, 305, 306, -1, -1, 309, -1, -1,
- 312, 313, 314, -1, 33, -1, 91, 36, 37, 38,
- -1, 40, -1, 42, 43, -1, 45, -1, -1, -1,
- -1, -1, -1, 281, -1, -1, -1, -1, -1, 287,
- 288, 289, 290, -1, -1, 64, -1, -1, -1, -1,
- -1, 126, 300, 301, 302, 303, 304, 305, 306, -1,
- -1, 309, -1, -1, 312, 313, 314, -1, -1, -1,
- -1, -1, 91, 33, 93, -1, 36, 37, 38, -1,
- 40, 41, 42, 43, -1, 45, -1, -1, -1, -1,
- -1, 287, 288, 289, 290, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, 64, -1, -1, 126, 304, 305,
- 306, -1, -1, 309, -1, -1, 312, 313, 314, -1,
- -1, -1, 41, -1, -1, 44, 257, 258, 259, 260,
- 261, 91, 263, 264, 265, -1, -1, -1, 269, 58,
- 59, -1, -1, -1, 63, -1, -1, -1, -1, 280,
- -1, 282, 283, 284, 285, 286, -1, -1, -1, -1,
- 291, 292, 293, 294, 295, 296, 126, -1, 299, -1,
- -1, -1, -1, -1, 93, -1, -1, 308, 41, 310,
- 311, 44, 257, 258, 259, 260, 261, -1, 263, 264,
+ 64, 299, -1, 126, -1, -1, -1, -1, -1, -1,
+ 308, -1, 310, 311, -1, -1, -1, -1, 41, -1,
+ -1, 44, 257, 258, 259, 260, 261, 91, 263, 264,
265, -1, -1, -1, 269, 58, 59, -1, -1, -1,
63, -1, -1, -1, -1, 280, -1, 282, 283, 284,
285, 286, -1, -1, -1, -1, 291, 292, 293, 294,
- 295, 296, -1, -1, 299, -1, -1, -1, -1, -1,
- 93, -1, -1, 308, -1, 310, 311, -1, 257, 258,
- 259, 260, 261, -1, 263, 264, 265, -1, 33, -1,
- 269, 36, 37, 38, -1, 40, 41, 42, 43, -1,
- 45, 280, -1, 282, 283, 284, 285, 286, -1, -1,
- -1, -1, 291, 292, 293, 294, 295, 296, -1, 64,
- 299, -1, -1, -1, -1, -1, -1, -1, -1, 308,
- -1, 310, 311, -1, -1, -1, -1, 257, 258, 259,
- 260, 261, -1, 263, 264, 265, 91, 33, -1, 269,
- 36, 37, 38, -1, 40, -1, 42, 43, -1, 45,
- 280, -1, 282, 283, 284, 285, 286, -1, -1, -1,
- -1, 291, 292, 293, 294, 295, 296, -1, 64, 299,
- -1, 126, -1, -1, -1, -1, -1, -1, 308, -1,
- 310, 311, -1, 272, 273, 274, 275, -1, -1, -1,
- -1, -1, 281, 33, -1, 91, 36, 37, 38, 288,
- 40, 41, 42, 43, -1, 45, -1, -1, 297, 298,
- -1, 300, 301, 302, 303, 304, -1, -1, -1, -1,
- -1, -1, -1, -1, 64, -1, -1, -1, -1, -1,
- 126, -1, -1, -1, -1, -1, -1, -1, -1, 272,
+ 295, 296, 126, -1, 299, -1, -1, -1, -1, -1,
+ 93, -1, -1, 308, 41, 310, 311, 44, 257, 258,
+ 259, 260, 261, -1, 263, 264, 265, -1, -1, -1,
+ 269, 58, 59, -1, -1, -1, 63, -1, -1, -1,
+ -1, 280, -1, 282, 283, 284, 285, 286, -1, -1,
+ -1, -1, 291, 292, 293, 294, 295, 296, -1, -1,
+ 299, -1, -1, -1, -1, -1, 93, -1, -1, 308,
+ -1, 310, 311, -1, 257, 258, 259, 260, 261, -1,
+ 263, 264, 265, -1, 33, -1, 269, 36, 37, 38,
+ -1, 40, 41, 42, 43, -1, 45, 280, -1, 282,
+ 283, 284, 285, 286, -1, -1, -1, -1, 291, 292,
+ 293, 294, 295, 296, -1, 64, 299, -1, -1, -1,
+ -1, -1, -1, -1, -1, 308, -1, 310, 311, -1,
+ -1, -1, -1, 257, 258, 259, 260, 261, -1, 263,
+ 264, 265, 91, 33, -1, 269, 36, 37, 38, -1,
+ 40, -1, 42, 43, -1, 45, 280, -1, 282, 283,
+ 284, 285, 286, -1, -1, -1, -1, 291, 292, 293,
+ 294, 295, 296, -1, 64, 299, -1, 126, -1, -1,
+ -1, -1, -1, -1, 308, -1, 310, 311, -1, 272,
273, 274, 275, -1, -1, -1, -1, -1, 281, 33,
- -1, 91, 36, 37, 38, -1, 40, 41, 42, 43,
+ -1, 91, 36, 37, 38, 288, 40, 41, 42, 43,
-1, 45, -1, -1, 297, 298, -1, 300, 301, 302,
303, 304, -1, -1, -1, -1, -1, -1, -1, -1,
64, -1, -1, -1, -1, -1, 126, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, 257, 258, 259, 260, 261, 91, 263, 264,
- 265, -1, 33, -1, 269, 36, 37, 38, -1, 40,
- -1, 42, 43, -1, 45, 280, -1, 282, 283, 284,
- 285, 286, -1, -1, -1, -1, 291, 292, 293, 294,
- 295, 296, 126, 64, 299, -1, -1, -1, -1, -1,
- -1, -1, -1, 308, -1, 310, 311, -1, -1, -1,
- 256, 257, 258, 259, 260, 261, -1, 263, 264, 265,
- 91, -1, -1, 269, 41, -1, -1, 44, -1, -1,
- -1, -1, -1, -1, 280, -1, 282, 283, 284, 285,
- 286, 58, 59, -1, -1, 291, 292, 293, 294, 295,
- 296, 91, -1, 299, -1, 126, -1, -1, -1, -1,
- 41, -1, 308, 44, 310, 311, -1, 257, 258, 259,
- 260, 261, -1, 263, 264, 265, 93, 58, 59, 269,
- -1, -1, 63, 123, -1, -1, -1, -1, -1, -1,
- 280, -1, 282, 283, 284, 285, 286, -1, -1, -1,
- -1, 291, 292, 293, 294, 295, 296, -1, -1, 299,
- 91, -1, 93, -1, -1, -1, -1, -1, 308, 41,
- 310, 311, 44, 257, 258, 259, 260, 261, -1, 263,
- 264, 265, -1, -1, -1, 269, 58, 59, -1, -1,
- -1, 63, 123, -1, -1, -1, 280, -1, 282, 283,
+ -1, -1, -1, -1, -1, 272, 273, 274, 275, -1,
+ -1, -1, -1, -1, 281, 33, -1, 91, 36, 37,
+ 38, -1, 40, 41, 42, 43, -1, 45, -1, -1,
+ 297, 298, -1, 300, 301, 302, 303, 304, -1, -1,
+ -1, -1, -1, -1, -1, -1, 64, -1, -1, -1,
+ -1, -1, 126, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, 257, 258,
+ 259, 260, 261, 91, 263, 264, 265, -1, 33, -1,
+ 269, 36, 37, 38, -1, 40, -1, 42, 43, -1,
+ 45, 280, -1, 282, 283, 284, 285, 286, -1, -1,
+ -1, -1, 291, 292, 293, 294, 295, 296, 126, 64,
+ 299, -1, -1, -1, -1, -1, -1, -1, -1, 308,
+ -1, 310, 311, -1, -1, -1, 256, 257, 258, 259,
+ 260, 261, -1, 263, 264, 265, 91, -1, -1, 269,
+ 41, -1, -1, 44, -1, -1, -1, -1, -1, -1,
+ 280, -1, 282, 283, 284, 285, 286, 58, 59, -1,
+ -1, 291, 292, 293, 294, 295, 296, 91, -1, 299,
+ -1, 126, -1, -1, -1, -1, 41, -1, 308, 44,
+ 310, 311, -1, 257, 258, 259, 260, 261, -1, 263,
+ 264, 265, 93, 58, 59, 269, -1, -1, 63, 123,
+ -1, -1, -1, -1, -1, -1, 280, -1, 282, 283,
284, 285, 286, -1, -1, -1, -1, 291, 292, 293,
- 294, 295, 296, -1, -1, 299, -1, -1, -1, 91,
- -1, 93, -1, -1, 308, -1, 310, 311, -1, -1,
- -1, -1, 41, -1, -1, 44, 257, 258, 259, 260,
- 261, -1, 263, 264, 265, -1, -1, -1, 269, 58,
- 59, 123, -1, -1, 63, -1, -1, -1, -1, 280,
- -1, 282, 283, 284, 285, 286, -1, -1, -1, -1,
- 291, 292, 293, 294, 295, 296, -1, -1, 299, -1,
- 41, -1, 91, 44, 93, -1, -1, 308, -1, 310,
- 311, -1, -1, -1, -1, -1, -1, 58, 59, 289,
- 290, -1, 63, -1, -1, 272, 273, 274, 275, -1,
- -1, -1, -1, -1, 123, 305, 306, -1, -1, 309,
- -1, -1, 312, 313, 314, -1, -1, -1, -1, -1,
- 297, 298, 93, 300, -1, -1, -1, -1, -1, -1,
- -1, 272, 273, 274, 275, -1, 41, -1, -1, 44,
- 281, -1, -1, -1, -1, -1, 287, 288, 289, 290,
- -1, -1, 123, 58, 59, -1, 297, 298, 63, 300,
- 301, 302, 303, 304, 305, 306, -1, -1, 309, -1,
- -1, 312, 313, 314, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, 91, -1, 93, -1,
- 272, 273, 274, 275, -1, 41, -1, -1, 44, 281,
- -1, -1, -1, -1, -1, 287, 288, 289, 290, -1,
- -1, -1, 58, 59, -1, 297, 298, 63, 300, 301,
- 302, 303, 304, 305, 306, -1, -1, 309, -1, -1,
- 312, 313, 314, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, 93, -1, -1,
- -1, -1, -1, 272, 273, 274, 275, -1, -1, -1,
- -1, -1, 281, -1, -1, -1, -1, -1, 287, 288,
- 289, 290, -1, -1, -1, -1, -1, 123, 297, 298,
- -1, 300, 301, 302, 303, 304, 305, 306, -1, -1,
- 309, -1, -1, 312, 313, 314, -1, -1, -1, -1,
- -1, 272, 273, 274, 275, -1, 41, -1, -1, -1,
- 281, -1, -1, -1, -1, -1, 287, 288, 289, 290,
- -1, -1, -1, 58, 59, -1, 297, 298, 63, 300,
- 301, 302, 303, 304, 305, 306, -1, -1, 309, -1,
- -1, 312, 313, 314, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, 91, -1, 93, -1,
+ 294, 295, 296, -1, -1, 299, 91, -1, 93, -1,
+ -1, -1, -1, -1, 308, 41, 310, 311, 44, 257,
+ 258, 259, 260, 261, -1, 263, 264, 265, -1, -1,
+ -1, 269, 58, 59, -1, -1, -1, 63, 123, -1,
+ -1, -1, 280, -1, 282, 283, 284, 285, 286, -1,
+ -1, -1, -1, 291, 292, 293, 294, 295, 296, -1,
+ -1, 299, -1, -1, -1, 91, -1, 93, -1, -1,
+ 308, -1, 310, 311, -1, -1, -1, -1, 41, -1,
+ -1, 44, 257, 258, 259, 260, 261, -1, 263, 264,
+ 265, -1, -1, -1, 269, 58, 59, 123, -1, -1,
+ 63, -1, -1, -1, -1, 280, -1, 282, 283, 284,
+ 285, 286, -1, -1, -1, -1, 291, 292, 293, 294,
+ 295, 296, -1, -1, 299, -1, 41, -1, 91, 44,
+ 93, -1, -1, 308, -1, 310, 311, -1, -1, -1,
+ -1, -1, -1, 58, 59, 289, 290, -1, 63, -1,
+ -1, 272, 273, 274, 275, -1, -1, -1, -1, -1,
+ 123, 305, 306, -1, -1, 309, -1, -1, 312, 313,
+ 314, -1, -1, -1, -1, -1, 297, 298, 93, -1,
-1, -1, -1, -1, -1, -1, -1, 272, 273, 274,
- 275, -1, -1, -1, -1, -1, 281, -1, -1, -1,
- -1, -1, 287, 288, 289, 290, -1, -1, 123, -1,
- -1, -1, 297, 298, -1, 300, 301, 302, 303, 304,
+ 275, -1, 41, -1, -1, 44, 281, -1, -1, -1,
+ -1, -1, 287, 288, 289, 290, -1, -1, 123, 58,
+ 59, -1, 297, 298, 63, 300, 301, 302, 303, 304,
305, 306, -1, -1, 309, -1, -1, 312, 313, 314,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, 272, 273, 274, 275,
- -1, 41, -1, -1, -1, 281, -1, -1, -1, -1,
+ -1, -1, 91, -1, 93, -1, 272, 273, 274, 275,
+ -1, 41, -1, -1, 44, 281, -1, -1, -1, -1,
-1, 287, 288, 289, 290, -1, -1, -1, 58, 59,
-1, 297, 298, 63, 300, 301, 302, 303, 304, 305,
306, -1, -1, 309, -1, -1, 312, 313, 314, -1,
- 25, 26, -1, -1, 41, -1, -1, 44, -1, -1,
- -1, 91, 37, 93, 41, -1, -1, 44, 43, 44,
- 45, 58, 59, -1, -1, 50, 63, -1, -1, -1,
- -1, 58, 59, -1, -1, -1, 63, 62, 63, 64,
- 65, -1, -1, 123, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, 93, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, 93, 272, 273, 274,
- 275, -1, 41, -1, -1, 44, 281, -1, -1, -1,
- -1, 106, 287, 288, 289, 290, 123, -1, -1, 58,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 93, -1, -1, -1, -1, -1, 272,
+ 273, 274, 275, -1, -1, -1, -1, -1, 281, -1,
+ -1, -1, -1, -1, 287, 288, 289, 290, -1, -1,
+ -1, -1, -1, 123, 297, 298, -1, 300, 301, 302,
+ 303, 304, 305, 306, -1, -1, 309, -1, -1, 312,
+ 313, 314, -1, -1, -1, -1, -1, 272, 273, 274,
+ 275, -1, 41, -1, -1, -1, 281, -1, -1, -1,
+ -1, -1, 287, 288, 289, 290, -1, -1, -1, 58,
59, -1, 297, 298, 63, 300, 301, 302, 303, 304,
305, 306, -1, -1, 309, -1, -1, 312, 313, 314,
- -1, -1, -1, -1, -1, 41, -1, -1, -1, -1,
- -1, -1, -1, -1, 93, -1, -1, -1, -1, -1,
- -1, -1, 58, 59, -1, -1, -1, 63, -1, -1,
- 165, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, 123, -1, -1, -1, -1, 41,
- -1, -1, 44, -1, 189, 91, -1, 93, -1, -1,
- -1, -1, -1, -1, -1, -1, 58, 59, -1, -1,
- -1, 63, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, 272, 273, 274, 275, -1, 123, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 91, -1, 93, -1, -1, -1, -1, -1,
+ -1, -1, -1, 272, 273, 274, 275, -1, -1, -1,
+ -1, -1, 281, -1, -1, -1, -1, -1, 287, 288,
+ 289, 290, -1, -1, 123, -1, -1, -1, 297, 298,
+ -1, 300, 301, 302, 303, 304, 305, 306, -1, -1,
+ 309, -1, -1, 312, 313, 314, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 272, 273, 274, 275, -1, 41, -1, -1,
-1, 281, -1, -1, -1, -1, -1, 287, 288, 289,
- 290, 93, -1, -1, -1, -1, -1, 297, 298, -1,
+ 290, -1, -1, -1, 58, 59, -1, 297, 298, 63,
300, 301, 302, 303, 304, 305, 306, -1, -1, 309,
- -1, -1, 312, 313, 314, 272, 273, 274, 275, -1,
- 41, 123, -1, 44, 281, 272, 273, 274, 275, -1,
- 287, 288, 289, 290, 281, -1, -1, 58, 59, -1,
- 297, 298, 63, 300, 301, 302, 303, 304, 305, 306,
- 297, 298, 309, 300, 301, 312, 313, 314, -1, -1,
+ -1, -1, 312, 313, 314, -1, -1, -1, -1, -1,
+ 41, -1, -1, 44, -1, -1, -1, 91, -1, 93,
+ 41, -1, -1, 44, -1, -1, -1, 58, 59, -1,
+ -1, -1, 63, -1, -1, -1, -1, 58, 59, -1,
+ -1, -1, 63, -1, -1, -1, -1, -1, -1, 123,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, 93, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, 272, 273, 274, 275, -1, 41, -1,
+ -1, -1, 93, 272, 273, 274, 275, -1, 41, -1,
-1, 44, 281, -1, -1, -1, -1, -1, 287, 288,
- 289, 290, -1, -1, -1, 58, 59, -1, 297, 298,
+ 289, 290, 123, -1, -1, 58, 59, -1, 297, 298,
63, 300, 301, 302, 303, 304, 305, 306, -1, -1,
- 309, -1, -1, 312, 313, 314, 272, 273, 274, 275,
- -1, 41, -1, -1, 44, 281, -1, -1, -1, -1,
- 93, 287, 288, 289, 290, -1, -1, -1, 58, 59,
- -1, 297, 298, 63, 300, 301, 302, 303, 304, 305,
- 306, -1, -1, 309, -1, -1, 312, 313, 314, -1,
- 272, 273, 274, 275, -1, 41, -1, -1, 44, 281,
- -1, -1, -1, 93, -1, 287, 288, 289, 290, -1,
- -1, -1, 58, 59, -1, 297, 298, 63, 300, 301,
- 302, 303, 304, 305, 306, -1, -1, 309, -1, -1,
- 312, 313, 314, -1, -1, -1, -1, -1, 41, -1,
- -1, 44, -1, -1, -1, -1, -1, 93, -1, -1,
- -1, -1, -1, -1, -1, 58, 59, -1, -1, -1,
- 63, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, 272, 273, 274, 275, -1, 41, -1, -1, 44,
- 281, -1, -1, -1, -1, -1, 287, 288, 289, 290,
- 93, -1, -1, 58, 59, -1, 297, 298, 63, 300,
- 301, 302, 303, 304, 305, 306, -1, -1, 309, -1,
- -1, 312, 313, 314, 41, -1, -1, 44, -1, -1,
+ 309, -1, -1, 312, 313, 314, -1, -1, -1, -1,
+ -1, 41, -1, -1, -1, -1, -1, -1, -1, -1,
+ 93, -1, -1, -1, -1, -1, -1, -1, 58, 59,
+ -1, -1, -1, 63, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ 123, -1, -1, -1, -1, 41, -1, -1, 44, -1,
+ -1, 91, -1, 93, -1, -1, -1, -1, -1, -1,
+ -1, -1, 58, 59, -1, -1, -1, 63, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, 272, 273,
+ 274, 275, -1, 123, -1, -1, -1, 281, -1, -1,
+ -1, -1, -1, 287, 288, 289, 290, 93, -1, -1,
+ -1, -1, -1, 297, 298, -1, 300, 301, 302, 303,
+ 304, 305, 306, -1, -1, 309, -1, -1, 312, 313,
+ 314, 272, 273, 274, 275, -1, 41, 123, -1, 44,
+ 281, 272, 273, 274, 275, -1, 287, 288, 289, 290,
+ 281, -1, -1, 58, 59, -1, 297, 298, 63, 300,
+ 301, 302, 303, 304, 305, 306, 297, 298, 309, 300,
+ 301, 312, 313, 314, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, 93, -1,
- -1, 58, 59, -1, -1, -1, 63, -1, -1, 272,
- 273, 274, 275, -1, -1, -1, -1, -1, 281, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, 272,
+ 273, 274, 275, -1, 41, -1, -1, 44, 281, -1,
-1, -1, -1, -1, 287, 288, 289, 290, -1, -1,
- -1, -1, -1, -1, 297, 298, 93, 300, 301, 302,
+ -1, 58, 59, -1, 297, 298, 63, 300, 301, 302,
303, 304, 305, 306, -1, -1, 309, -1, -1, 312,
313, 314, 272, 273, 274, 275, -1, 41, -1, -1,
- 44, 281, -1, -1, -1, -1, -1, 287, 288, 289,
+ 44, 281, -1, -1, -1, -1, 93, 287, 288, 289,
290, -1, -1, -1, 58, 59, -1, 297, 298, 63,
300, 301, 302, 303, 304, 305, 306, -1, -1, 309,
-1, -1, 312, 313, 314, -1, 272, 273, 274, 275,
-1, 41, -1, -1, 44, 281, -1, -1, -1, 93,
-1, 287, 288, 289, 290, -1, -1, -1, 58, 59,
-1, 297, 298, 63, 300, 301, 302, 303, 304, 305,
- 306, -1, -1, 309, -1, -1, 312, 313, 314, 272,
- 273, 274, 275, -1, 41, -1, -1, 44, 281, -1,
- -1, -1, -1, 93, 287, 288, 289, 290, -1, -1,
- -1, 58, 59, -1, 297, 298, 63, 300, 301, 302,
- 303, 304, 305, 306, -1, -1, -1, 272, 273, 274,
+ 306, -1, -1, 309, -1, -1, 312, 313, 314, -1,
+ -1, -1, -1, -1, 41, -1, -1, 44, -1, -1,
+ -1, -1, -1, 93, -1, -1, -1, -1, -1, -1,
+ -1, 58, 59, -1, -1, -1, 63, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 272, 273, 274,
275, -1, 41, -1, -1, 44, 281, -1, -1, -1,
-1, -1, 287, 288, 289, 290, 93, -1, -1, 58,
59, -1, 297, 298, 63, 300, 301, 302, 303, 304,
- 305, 306, -1, -1, -1, 272, 273, 274, 275, -1,
- 41, -1, -1, 44, 281, -1, -1, -1, -1, -1,
- 287, 288, 289, 290, 93, -1, -1, 58, 59, -1,
- 297, 298, 63, 300, 301, 302, 303, 304, 305, 306,
- -1, -1, -1, -1, -1, -1, 41, -1, -1, 44,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, 93, 58, 59, -1, -1, -1, 63, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, 272, 273,
+ 305, 306, -1, -1, 309, -1, -1, 312, 313, 314,
+ 41, -1, -1, 44, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 93, -1, -1, 58, 59, -1,
+ -1, -1, 63, -1, -1, 272, 273, 274, 275, -1,
+ -1, -1, -1, -1, 281, -1, -1, -1, -1, -1,
+ 287, 288, 289, 290, -1, -1, -1, -1, -1, -1,
+ 297, 298, 93, 300, 301, 302, 303, 304, 305, 306,
+ -1, -1, 309, -1, -1, 312, 313, 314, 272, 273,
274, 275, -1, 41, -1, -1, 44, 281, -1, -1,
- -1, -1, -1, 287, 288, 289, 290, -1, 93, -1,
+ -1, -1, -1, 287, 288, 289, 290, -1, -1, -1,
58, 59, -1, 297, 298, 63, 300, 301, 302, 303,
- 304, 305, 306, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, 272, 273, 274, 275, -1, 41, -1, -1,
+ 304, 305, 306, -1, -1, 309, -1, -1, 312, 313,
+ 314, -1, 272, 273, 274, 275, -1, 41, -1, -1,
44, 281, -1, -1, -1, 93, -1, 287, 288, 289,
290, -1, -1, -1, 58, 59, -1, 297, 298, 63,
- 300, 301, 302, 303, 304, 305, 306, -1, -1, -1,
- -1, -1, -1, -1, -1, 272, 273, 274, 275, -1,
+ 300, 301, 302, 303, 304, 305, 306, -1, -1, 309,
+ -1, -1, 312, 313, 314, 272, 273, 274, 275, -1,
41, -1, -1, 44, 281, -1, -1, -1, -1, 93,
287, 288, 289, 290, -1, -1, -1, 58, 59, -1,
297, 298, 63, 300, 301, 302, 303, 304, 305, 306,
@@ -957,68 +932,93 @@ dEXT short yycheck[] = { 13,
-1, 272, 273, 274, 275, -1, 41, -1, -1, 44,
281, -1, -1, -1, -1, -1, 287, 288, 289, 290,
93, -1, -1, 58, 59, -1, 297, 298, 63, 300,
- 301, 302, 303, 304, 305, -1, -1, 272, 273, 274,
- 275, -1, 41, -1, -1, 44, 281, -1, -1, -1,
- -1, -1, 287, 288, -1, 290, -1, -1, 93, 58,
- 59, -1, 297, 298, 63, 300, 301, 302, 303, 304,
- 305, -1, -1, -1, 272, 273, 274, 275, -1, 41,
+ 301, 302, 303, 304, 305, 306, -1, -1, -1, -1,
+ -1, -1, 41, -1, -1, 44, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, 93, 58,
+ 59, -1, -1, -1, 63, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 272, 273, 274, 275, -1, 41,
-1, -1, 44, 281, -1, -1, -1, -1, -1, 287,
- 288, -1, -1, -1, 93, -1, 58, 59, -1, 297,
- 298, 63, 300, 301, 302, 303, 304, 305, -1, -1,
- 91, -1, -1, -1, -1, -1, -1, -1, 272, 273,
+ 288, 289, 290, -1, 93, -1, 58, 59, -1, 297,
+ 298, 63, 300, 301, 302, 303, 304, 305, 306, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, 272, 273,
274, 275, -1, 41, -1, -1, 44, 281, -1, -1,
- -1, 93, -1, 287, 288, -1, 41, -1, -1, 44,
- 58, 59, 123, 297, 298, 63, 300, 301, 302, 303,
- 304, -1, -1, 58, 59, 41, -1, -1, 44, -1,
- -1, 272, 273, 274, 275, 41, -1, -1, 44, -1,
- 281, -1, 58, 59, -1, 93, 287, 288, -1, -1,
- -1, -1, 58, 59, -1, -1, 297, 298, 93, 300,
- 301, 302, 303, 304, -1, 41, -1, -1, 44, 272,
- 273, 274, 275, -1, -1, -1, -1, 93, 281, -1,
- -1, -1, 58, 59, 287, 288, 58, 93, -1, -1,
- -1, 63, -1, -1, 297, 298, -1, 300, 301, 302,
- 303, 304, -1, -1, -1, -1, -1, 272, 273, 274,
- 275, -1, -1, -1, -1, -1, 281, 93, -1, 91,
- -1, -1, 287, 288, -1, 63, -1, -1, -1, -1,
- -1, -1, 297, 298, -1, 300, 301, 302, 303, 304,
+ -1, 93, -1, 287, 288, 289, 290, -1, -1, -1,
+ 58, 59, -1, 297, 298, 63, 300, 301, 302, 303,
+ 304, 305, 306, -1, -1, -1, -1, -1, -1, -1,
+ -1, 272, 273, 274, 275, -1, 41, -1, -1, 44,
+ 281, -1, -1, -1, -1, 93, 287, 288, 289, 290,
+ -1, -1, -1, 58, 59, -1, 297, 298, 63, 300,
+ 301, 302, 303, 304, 305, 306, -1, -1, -1, 272,
+ 273, 274, 275, -1, 41, -1, -1, 44, 281, -1,
+ -1, -1, -1, -1, 287, 288, 289, 290, 93, -1,
+ -1, 58, 59, -1, 297, 298, 63, 300, 301, 302,
+ 303, 304, 305, 306, -1, -1, -1, 272, 273, 274,
+ 275, -1, 41, -1, -1, 44, 281, -1, -1, -1,
+ -1, -1, 287, 288, 289, 290, 93, -1, -1, 58,
+ 59, -1, 297, 298, 63, 300, 301, 302, 303, 304,
+ 305, -1, -1, 272, 273, 274, 275, -1, 41, -1,
+ -1, 44, 281, -1, -1, -1, -1, -1, 287, 288,
+ -1, -1, -1, -1, 93, 58, 59, -1, 297, 298,
+ 63, 300, 301, 302, 303, 304, 305, -1, -1, -1,
+ 272, 273, 274, 275, -1, 41, -1, -1, 44, 281,
+ -1, -1, -1, -1, -1, 287, 288, -1, -1, -1,
+ 93, -1, 58, 59, -1, 297, 298, 63, 300, 301,
+ 302, 303, 304, -1, -1, -1, 91, -1, -1, -1,
+ -1, -1, -1, -1, 272, 273, 274, 275, -1, 41,
+ 63, -1, 44, 281, -1, -1, -1, 93, -1, 287,
+ 288, -1, -1, -1, -1, -1, 58, 59, 123, 297,
+ 298, 63, 300, 301, 302, 303, 304, -1, 91, -1,
+ -1, 58, -1, -1, -1, -1, 63, 272, 273, 274,
+ 275, -1, -1, -1, -1, -1, 281, -1, -1, -1,
+ -1, 93, 287, 288, -1, -1, -1, -1, -1, -1,
+ 123, -1, 297, 298, 91, 300, 301, 302, 303, 304,
+ -1, -1, -1, -1, -1, 272, 273, 274, 275, -1,
+ -1, -1, -1, -1, 281, -1, -1, -1, -1, -1,
+ 287, 288, -1, -1, -1, 63, 123, -1, -1, -1,
+ 297, 298, -1, 300, 301, 302, 303, 304, -1, -1,
-1, -1, -1, 272, 273, 274, 275, -1, -1, -1,
- -1, 123, 281, 91, -1, -1, -1, -1, -1, -1,
+ -1, -1, 281, 91, -1, -1, -1, -1, 25, 26,
-1, -1, -1, -1, -1, -1, -1, -1, 297, 298,
- -1, 300, 301, 302, 303, 304, 287, 288, 289, 290,
- 272, 273, 274, 275, -1, 123, -1, -1, -1, 281,
- -1, 302, 303, 304, 305, 306, -1, -1, 309, -1,
- -1, 312, 313, 314, 91, 297, 298, -1, 300, 301,
- 302, 303, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, 272, 273, 274, 275, -1, -1,
- -1, -1, -1, 281, -1, -1, 123, 272, 273, 274,
- 275, -1, -1, -1, -1, -1, -1, -1, -1, 297,
- 298, -1, 300, 301, 302, -1, 272, 273, 274, 275,
- -1, -1, 297, 298, 30, -1, 272, 273, 274, 275,
- -1, -1, 38, -1, -1, -1, 42, -1, -1, 45,
- -1, 297, 298, -1, -1, -1, 52, 53, 54, 55,
- 56, 297, 298, 59, 60, -1, 272, 273, 274, 275,
- 66, -1, -1, -1, -1, -1, -1, -1, -1, 281,
+ 37, 300, 301, 302, 303, 304, 43, 44, 45, 272,
+ 273, 274, 275, 50, -1, 123, -1, -1, 281, 91,
+ -1, -1, -1, -1, -1, 62, 63, 64, 65, -1,
+ -1, -1, -1, -1, 297, 298, -1, 300, 301, 302,
+ 303, -1, 287, 288, 289, 290, 272, 273, 274, 275,
+ -1, 123, -1, -1, -1, 281, 301, 302, 303, 304,
+ 305, 306, -1, -1, 309, -1, -1, 312, 313, 314,
+ 107, 297, 298, -1, 300, 301, 302, -1, 281, -1,
+ -1, -1, -1, -1, 287, 288, 289, 290, -1, -1,
+ 272, 273, 274, 275, -1, -1, -1, 300, 301, 302,
+ 303, 304, 305, 306, -1, -1, 309, -1, -1, 312,
+ 313, 314, -1, -1, 281, 297, 298, -1, 300, -1,
+ 287, 288, 289, 290, -1, -1, -1, -1, -1, 166,
+ -1, -1, -1, 300, 301, 302, 303, 304, 305, 306,
+ 30, -1, 309, -1, -1, 312, 313, 314, 38, -1,
+ -1, -1, 42, 190, -1, 45, -1, -1, -1, -1,
+ -1, -1, 52, 53, 54, 55, 56, -1, -1, 59,
+ 60, -1, -1, 281, -1, -1, 66, -1, -1, 287,
+ 288, 289, 290, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 301, 302, 303, 304, 305, 306, -1,
+ -1, 309, -1, 93, 312, 313, 314, -1, -1, -1,
-1, -1, -1, -1, -1, 287, 288, 289, 290, -1,
- -1, 297, 298, -1, -1, -1, 92, -1, 300, 301,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
302, 303, 304, 305, 306, -1, -1, 309, -1, -1,
- 312, 313, 314, 281, -1, -1, -1, -1, -1, 287,
- 288, 289, 290, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, 300, 301, 302, 303, 304, 305, 306, -1,
- -1, 309, -1, -1, 312, 313, 314, -1, -1, -1,
- -1, -1, -1, 149, 150, 151, 152, 153, 154, 155,
- 156, 157, 158, 159, 160, 161, 162, -1, -1, -1,
- 287, 288, 289, 290, -1, -1, -1, -1, 174, -1,
- -1, -1, -1, -1, -1, -1, 303, 304, 305, 306,
- -1, -1, 309, -1, -1, 312, 313, 314, -1, -1,
+ 312, 313, 314, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ 150, 151, 152, 153, 154, 155, 156, 157, 158, 159,
+ 160, 161, 162, 163, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 175, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, 250, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 252, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, 281,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 283,
};
#define YYFINAL 1
#ifndef YYDEBUG
@@ -1093,16 +1093,22 @@ dEXT char * yyrule[] = {
"decl : subrout",
"decl : package",
"decl : use",
-"format : FORMAT startsub WORD block",
-"format : FORMAT startsub block",
-"subrout : SUB startsub WORD proto block",
-"subrout : SUB startsub WORD proto ';'",
+"format : FORMAT startformsub formname block",
+"formname : WORD",
+"formname :",
+"subrout : SUB startsub subname proto subbody",
+"startsub :",
+"startanonsub :",
+"startformsub :",
+"subname : WORD",
"proto :",
"proto : THING",
-"startsub :",
+"subbody : block",
+"subbody : ';'",
"package : PACKAGE WORD ';'",
"package : PACKAGE ';'",
-"use : USE startsub WORD WORD listexpr ';'",
+"$$2 :",
+"use : USE startsub $$2 WORD WORD listexpr ';'",
"expr : expr ANDOP expr",
"expr : expr OROP expr",
"expr : argexpr",
@@ -1116,7 +1122,8 @@ dEXT char * yyrule[] = {
"listop : FUNCMETH indirob '(' listexprcom ')'",
"listop : LSTOP listexpr",
"listop : FUNC '(' listexprcom ')'",
-"listop : LSTOPSUB startsub block listexpr",
+"$$3 :",
+"listop : LSTOPSUB startanonsub block $$3 listexpr",
"method : METHOD",
"method : scalar",
"term : term ASSIGNOP term",
@@ -1149,7 +1156,7 @@ dEXT char * yyrule[] = {
"term : '[' ']'",
"term : HASHBRACK expr ';' '}'",
"term : HASHBRACK ';' '}'",
-"term : ANONSUB startsub proto block",
+"term : ANONSUB startanonsub proto block",
"term : scalar",
"term : star '{' expr ';' '}'",
"term : star",
@@ -1233,9 +1240,9 @@ dEXT int yyerrflag;
dEXT int yychar;
dEXT YYSTYPE yyval;
dEXT YYSTYPE yylval;
-#line 602 "perly.y"
+#line 626 "perly.y"
/* PROGRAM */
-#line 1308 "perly.c"
+#line 1315 "perly.c"
#define YYABORT goto yyabort
#define YYACCEPT goto yyaccept
#define YYERROR goto yyerrlab
@@ -1460,7 +1467,7 @@ yyreduce:
switch (yyn)
{
case 1:
-#line 85 "perly.y"
+#line 86 "perly.y"
{
#if defined(YYDEBUG) && defined(DEBUGGING)
yydebug = (debug & 1);
@@ -1469,50 +1476,50 @@ case 1:
}
break;
case 2:
-#line 92 "perly.y"
+#line 93 "perly.y"
{ newPROG(yyvsp[0].opval); }
break;
case 3:
-#line 96 "perly.y"
+#line 97 "perly.y"
{ if (copline > (line_t)yyvsp[-3].ival)
copline = yyvsp[-3].ival;
yyval.opval = block_end(yyvsp[-2].ival, yyvsp[-1].opval); }
break;
case 4:
-#line 102 "perly.y"
+#line 103 "perly.y"
{ yyval.ival = block_start(TRUE); }
break;
case 5:
-#line 106 "perly.y"
+#line 107 "perly.y"
{ if (copline > (line_t)yyvsp[-3].ival)
copline = yyvsp[-3].ival;
yyval.opval = block_end(yyvsp[-2].ival, yyvsp[-1].opval); }
break;
case 6:
-#line 112 "perly.y"
+#line 113 "perly.y"
{ yyval.ival = block_start(FALSE); }
break;
case 7:
-#line 116 "perly.y"
+#line 117 "perly.y"
{ yyval.opval = Nullop; }
break;
case 8:
-#line 118 "perly.y"
+#line 119 "perly.y"
{ yyval.opval = yyvsp[-1].opval; }
break;
case 9:
-#line 120 "perly.y"
+#line 121 "perly.y"
{ yyval.opval = append_list(OP_LINESEQ,
(LISTOP*)yyvsp[-1].opval, (LISTOP*)yyvsp[0].opval);
pad_reset_pending = TRUE;
if (yyvsp[-1].opval && yyvsp[0].opval) hints |= HINT_BLOCK_SCOPE; }
break;
case 10:
-#line 127 "perly.y"
+#line 128 "perly.y"
{ yyval.opval = newSTATEOP(0, yyvsp[-1].pval, yyvsp[0].opval); }
break;
case 12:
-#line 130 "perly.y"
+#line 131 "perly.y"
{ if (yyvsp[-1].pval != Nullch) {
yyval.opval = newSTATEOP(0, yyvsp[-1].pval, newOP(OP_NULL, 0));
}
@@ -1523,71 +1530,71 @@ case 12:
expect = XSTATE; }
break;
case 13:
-#line 139 "perly.y"
+#line 140 "perly.y"
{ yyval.opval = newSTATEOP(0, yyvsp[-2].pval, yyvsp[-1].opval);
expect = XSTATE; }
break;
case 14:
-#line 144 "perly.y"
+#line 145 "perly.y"
{ yyval.opval = Nullop; }
break;
case 15:
-#line 146 "perly.y"
+#line 147 "perly.y"
{ yyval.opval = yyvsp[0].opval; }
break;
case 16:
-#line 148 "perly.y"
+#line 149 "perly.y"
{ yyval.opval = newLOGOP(OP_AND, 0, yyvsp[0].opval, yyvsp[-2].opval); }
break;
case 17:
-#line 150 "perly.y"
+#line 151 "perly.y"
{ yyval.opval = newLOGOP(OP_OR, 0, yyvsp[0].opval, yyvsp[-2].opval); }
break;
case 18:
-#line 152 "perly.y"
+#line 153 "perly.y"
{ yyval.opval = newLOOPOP(OPf_PARENS, 1, scalar(yyvsp[0].opval), yyvsp[-2].opval); }
break;
case 19:
-#line 154 "perly.y"
+#line 155 "perly.y"
{ yyval.opval = newLOOPOP(OPf_PARENS, 1, yyvsp[0].opval, yyvsp[-2].opval);}
break;
case 20:
-#line 158 "perly.y"
+#line 159 "perly.y"
{ yyval.opval = Nullop; }
break;
case 21:
-#line 160 "perly.y"
+#line 161 "perly.y"
{ yyval.opval = scope(yyvsp[0].opval); }
break;
case 22:
-#line 162 "perly.y"
+#line 163 "perly.y"
{ copline = yyvsp[-5].ival;
yyval.opval = newSTATEOP(0, Nullch,
newCONDOP(0, yyvsp[-3].opval, scope(yyvsp[-1].opval), yyvsp[0].opval));
hints |= HINT_BLOCK_SCOPE; }
break;
case 23:
-#line 169 "perly.y"
+#line 170 "perly.y"
{ copline = yyvsp[-6].ival;
yyval.opval = block_end(yyvsp[-4].ival,
newCONDOP(0, yyvsp[-3].opval, scope(yyvsp[-1].opval), yyvsp[0].opval)); }
break;
case 24:
-#line 173 "perly.y"
+#line 174 "perly.y"
{ copline = yyvsp[-6].ival;
yyval.opval = block_end(yyvsp[-4].ival,
newCONDOP(0, yyvsp[-3].opval, scope(yyvsp[-1].opval), yyvsp[0].opval)); }
break;
case 25:
-#line 179 "perly.y"
+#line 180 "perly.y"
{ yyval.opval = Nullop; }
break;
case 26:
-#line 181 "perly.y"
+#line 182 "perly.y"
{ yyval.opval = scope(yyvsp[0].opval); }
break;
case 27:
-#line 185 "perly.y"
+#line 186 "perly.y"
{ copline = yyvsp[-6].ival;
yyval.opval = block_end(yyvsp[-4].ival,
newSTATEOP(0, yyvsp[-7].pval,
@@ -1595,7 +1602,7 @@ case 27:
yyvsp[-3].opval, yyvsp[-1].opval, yyvsp[0].opval))); }
break;
case 28:
-#line 191 "perly.y"
+#line 192 "perly.y"
{ copline = yyvsp[-6].ival;
yyval.opval = block_end(yyvsp[-4].ival,
newSTATEOP(0, yyvsp[-7].pval,
@@ -1603,23 +1610,23 @@ case 28:
yyvsp[-3].opval, yyvsp[-1].opval, yyvsp[0].opval))); }
break;
case 29:
-#line 197 "perly.y"
+#line 198 "perly.y"
{ yyval.opval = block_end(yyvsp[-6].ival,
newFOROP(0, yyvsp[-9].pval, yyvsp[-8].ival, yyvsp[-5].opval, yyvsp[-3].opval, yyvsp[-1].opval, yyvsp[0].opval)); }
break;
case 30:
-#line 200 "perly.y"
+#line 201 "perly.y"
{ yyval.opval = block_end(yyvsp[-4].ival,
newFOROP(0, yyvsp[-8].pval, yyvsp[-7].ival, mod(yyvsp[-6].opval, OP_ENTERLOOP),
yyvsp[-3].opval, yyvsp[-1].opval, yyvsp[0].opval)); }
break;
case 31:
-#line 204 "perly.y"
+#line 205 "perly.y"
{ yyval.opval = block_end(yyvsp[-4].ival,
newFOROP(0, yyvsp[-7].pval, yyvsp[-6].ival, Nullop, yyvsp[-3].opval, yyvsp[-1].opval, yyvsp[0].opval)); }
break;
case 32:
-#line 208 "perly.y"
+#line 209 "perly.y"
{ copline = yyvsp[-9].ival;
yyval.opval = block_end(yyvsp[-7].ival,
append_elem(OP_LINESEQ, scalar(yyvsp[-6].opval),
@@ -1629,364 +1636,396 @@ case 32:
yyvsp[0].opval, scalar(yyvsp[-2].opval))))); }
break;
case 33:
-#line 216 "perly.y"
+#line 217 "perly.y"
{ yyval.opval = newSTATEOP(0,
yyvsp[-2].pval, newWHILEOP(0, 1, (LOOP*)Nullop,
Nullop, yyvsp[-1].opval, yyvsp[0].opval)); }
break;
case 34:
-#line 222 "perly.y"
+#line 223 "perly.y"
{ yyval.opval = Nullop; }
break;
case 36:
-#line 227 "perly.y"
+#line 228 "perly.y"
{ (void)scan_num("1"); yyval.opval = yylval.opval; }
break;
case 38:
-#line 232 "perly.y"
+#line 233 "perly.y"
{ yyval.opval = invert(scalar(yyvsp[0].opval)); }
break;
case 39:
-#line 236 "perly.y"
+#line 237 "perly.y"
{ yyval.opval = yyvsp[0].opval; intro_my(); }
break;
case 40:
-#line 240 "perly.y"
+#line 241 "perly.y"
{ yyval.opval = yyvsp[0].opval; intro_my(); }
break;
case 41:
-#line 244 "perly.y"
+#line 245 "perly.y"
{ yyval.opval = yyvsp[0].opval; intro_my(); }
break;
case 42:
-#line 248 "perly.y"
+#line 249 "perly.y"
{ yyval.opval = yyvsp[0].opval; intro_my(); }
break;
case 43:
-#line 252 "perly.y"
+#line 253 "perly.y"
{ yyval.pval = Nullch; }
break;
case 45:
-#line 257 "perly.y"
+#line 258 "perly.y"
{ yyval.ival = 0; }
break;
case 46:
-#line 259 "perly.y"
+#line 260 "perly.y"
{ yyval.ival = 0; }
break;
case 47:
-#line 261 "perly.y"
+#line 262 "perly.y"
{ yyval.ival = 0; }
break;
case 48:
-#line 263 "perly.y"
+#line 264 "perly.y"
{ yyval.ival = 0; }
break;
case 49:
-#line 267 "perly.y"
+#line 268 "perly.y"
{ newFORM(yyvsp[-2].ival, yyvsp[-1].opval, yyvsp[0].opval); }
break;
case 50:
-#line 269 "perly.y"
-{ newFORM(yyvsp[-1].ival, Nullop, yyvsp[0].opval); }
+#line 271 "perly.y"
+{ yyval.opval = yyvsp[0].opval; }
break;
case 51:
-#line 273 "perly.y"
-{ newSUB(yyvsp[-3].ival, yyvsp[-2].opval, yyvsp[-1].opval, yyvsp[0].opval); }
+#line 272 "perly.y"
+{ yyval.opval = Nullop; }
break;
case 52:
-#line 275 "perly.y"
-{ newSUB(yyvsp[-3].ival, yyvsp[-2].opval, yyvsp[-1].opval, Nullop); expect = XSTATE; }
+#line 276 "perly.y"
+{ newSUB(yyvsp[-3].ival, yyvsp[-2].opval, yyvsp[-1].opval, yyvsp[0].opval); }
break;
case 53:
-#line 279 "perly.y"
-{ yyval.opval = Nullop; }
+#line 280 "perly.y"
+{ yyval.ival = start_subparse(); }
break;
-case 55:
+case 54:
#line 284 "perly.y"
-{ yyval.ival = start_subparse(); }
+{ yyval.ival = start_subparse();
+ CvANON_on(compcv); }
+break;
+case 55:
+#line 289 "perly.y"
+{ yyval.ival = start_subparse();
+ CvFORMAT_on(compcv); }
break;
case 56:
-#line 288 "perly.y"
-{ package(yyvsp[-1].opval); }
+#line 293 "perly.y"
+{ char *name = SvPVx(((SVOP*)yyvsp[0].opval)->op_sv, na);
+ if (strEQ(name, "BEGIN") || strEQ(name, "END"))
+ CvUNIQUE_on(compcv);
+ yyval.opval = yyvsp[0].opval; }
break;
case 57:
-#line 290 "perly.y"
+#line 300 "perly.y"
+{ yyval.opval = Nullop; }
+break;
+case 59:
+#line 304 "perly.y"
+{ yyval.opval = yyvsp[0].opval; }
+break;
+case 60:
+#line 305 "perly.y"
+{ yyval.opval = Nullop; expect = XSTATE; }
+break;
+case 61:
+#line 309 "perly.y"
+{ package(yyvsp[-1].opval); }
+break;
+case 62:
+#line 311 "perly.y"
{ package(Nullop); }
break;
-case 58:
-#line 294 "perly.y"
-{ utilize(yyvsp[-5].ival, yyvsp[-4].ival, yyvsp[-3].opval, yyvsp[-2].opval, yyvsp[-1].opval); }
+case 63:
+#line 315 "perly.y"
+{ CvUNIQUE_on(compcv); /* It's a BEGIN {} */ }
+break;
+case 64:
+#line 317 "perly.y"
+{ utilize(yyvsp[-6].ival, yyvsp[-5].ival, yyvsp[-3].opval, yyvsp[-2].opval, yyvsp[-1].opval); }
break;
-case 59:
-#line 298 "perly.y"
+case 65:
+#line 321 "perly.y"
{ yyval.opval = newLOGOP(OP_AND, 0, yyvsp[-2].opval, yyvsp[0].opval); }
break;
-case 60:
-#line 300 "perly.y"
+case 66:
+#line 323 "perly.y"
{ yyval.opval = newLOGOP(yyvsp[-1].ival, 0, yyvsp[-2].opval, yyvsp[0].opval); }
break;
-case 62:
-#line 305 "perly.y"
+case 68:
+#line 328 "perly.y"
{ yyval.opval = yyvsp[-1].opval; }
break;
-case 63:
-#line 307 "perly.y"
+case 69:
+#line 330 "perly.y"
{ yyval.opval = append_elem(OP_LIST, yyvsp[-2].opval, yyvsp[0].opval); }
break;
-case 65:
-#line 312 "perly.y"
+case 71:
+#line 335 "perly.y"
{ yyval.opval = convert(yyvsp[-2].ival, OPf_STACKED,
prepend_elem(OP_LIST, newGVREF(yyvsp[-2].ival,yyvsp[-1].opval), yyvsp[0].opval) ); }
break;
-case 66:
-#line 315 "perly.y"
+case 72:
+#line 338 "perly.y"
{ yyval.opval = convert(yyvsp[-4].ival, OPf_STACKED,
prepend_elem(OP_LIST, newGVREF(yyvsp[-4].ival,yyvsp[-2].opval), yyvsp[-1].opval) ); }
break;
-case 67:
-#line 318 "perly.y"
+case 73:
+#line 341 "perly.y"
{ yyval.opval = convert(OP_ENTERSUB, OPf_STACKED,
append_elem(OP_LIST,
prepend_elem(OP_LIST, scalar(yyvsp[-5].opval), yyvsp[-1].opval),
newUNOP(OP_METHOD, 0, yyvsp[-3].opval))); }
break;
-case 68:
-#line 323 "perly.y"
+case 74:
+#line 346 "perly.y"
{ yyval.opval = convert(OP_ENTERSUB, OPf_STACKED,
append_elem(OP_LIST,
prepend_elem(OP_LIST, yyvsp[-1].opval, yyvsp[0].opval),
newUNOP(OP_METHOD, 0, yyvsp[-2].opval))); }
break;
-case 69:
-#line 328 "perly.y"
+case 75:
+#line 351 "perly.y"
{ yyval.opval = convert(OP_ENTERSUB, OPf_STACKED,
append_elem(OP_LIST,
prepend_elem(OP_LIST, yyvsp[-3].opval, yyvsp[-1].opval),
newUNOP(OP_METHOD, 0, yyvsp[-4].opval))); }
break;
-case 70:
-#line 333 "perly.y"
+case 76:
+#line 356 "perly.y"
{ yyval.opval = convert(yyvsp[-1].ival, 0, yyvsp[0].opval); }
break;
-case 71:
-#line 335 "perly.y"
+case 77:
+#line 358 "perly.y"
{ yyval.opval = convert(yyvsp[-3].ival, 0, yyvsp[-1].opval); }
break;
-case 72:
-#line 337 "perly.y"
+case 78:
+#line 360 "perly.y"
+{ yyvsp[0].opval = newANONSUB(yyvsp[-1].ival, 0, yyvsp[0].opval); }
+break;
+case 79:
+#line 362 "perly.y"
{ yyval.opval = newUNOP(OP_ENTERSUB, OPf_STACKED,
- append_elem(OP_LIST,
- prepend_elem(OP_LIST, newANONSUB(yyvsp[-2].ival, 0, yyvsp[-1].opval), yyvsp[0].opval),
- yyvsp[-3].opval)); }
+ append_elem(OP_LIST,
+ prepend_elem(OP_LIST, yyvsp[-2].opval, yyvsp[0].opval), yyvsp[-4].opval)); }
break;
-case 75:
-#line 348 "perly.y"
+case 82:
+#line 372 "perly.y"
{ yyval.opval = newASSIGNOP(OPf_STACKED, yyvsp[-2].opval, yyvsp[-1].ival, yyvsp[0].opval); }
break;
-case 76:
-#line 350 "perly.y"
+case 83:
+#line 374 "perly.y"
{ yyval.opval = newBINOP(yyvsp[-1].ival, 0, scalar(yyvsp[-2].opval), scalar(yyvsp[0].opval)); }
break;
-case 77:
-#line 352 "perly.y"
+case 84:
+#line 376 "perly.y"
{ if (yyvsp[-1].ival != OP_REPEAT)
scalar(yyvsp[-2].opval);
yyval.opval = newBINOP(yyvsp[-1].ival, 0, yyvsp[-2].opval, scalar(yyvsp[0].opval)); }
break;
-case 78:
-#line 356 "perly.y"
+case 85:
+#line 380 "perly.y"
{ yyval.opval = newBINOP(yyvsp[-1].ival, 0, scalar(yyvsp[-2].opval), scalar(yyvsp[0].opval)); }
break;
-case 79:
-#line 358 "perly.y"
+case 86:
+#line 382 "perly.y"
{ yyval.opval = newBINOP(yyvsp[-1].ival, 0, scalar(yyvsp[-2].opval), scalar(yyvsp[0].opval)); }
break;
-case 80:
-#line 360 "perly.y"
+case 87:
+#line 384 "perly.y"
{ yyval.opval = newBINOP(yyvsp[-1].ival, 0, scalar(yyvsp[-2].opval), scalar(yyvsp[0].opval)); }
break;
-case 81:
-#line 362 "perly.y"
+case 88:
+#line 386 "perly.y"
{ yyval.opval = newBINOP(yyvsp[-1].ival, 0, scalar(yyvsp[-2].opval), scalar(yyvsp[0].opval)); }
break;
-case 82:
-#line 364 "perly.y"
+case 89:
+#line 388 "perly.y"
{ yyval.opval = newBINOP(yyvsp[-1].ival, 0, scalar(yyvsp[-2].opval), scalar(yyvsp[0].opval)); }
break;
-case 83:
-#line 366 "perly.y"
+case 90:
+#line 390 "perly.y"
{ yyval.opval = newBINOP(yyvsp[-1].ival, 0, scalar(yyvsp[-2].opval), scalar(yyvsp[0].opval)); }
break;
-case 84:
-#line 368 "perly.y"
+case 91:
+#line 392 "perly.y"
{ yyval.opval = newRANGE(yyvsp[-1].ival, scalar(yyvsp[-2].opval), scalar(yyvsp[0].opval));}
break;
-case 85:
-#line 370 "perly.y"
+case 92:
+#line 394 "perly.y"
{ yyval.opval = newLOGOP(OP_AND, 0, yyvsp[-2].opval, yyvsp[0].opval); }
break;
-case 86:
-#line 372 "perly.y"
+case 93:
+#line 396 "perly.y"
{ yyval.opval = newLOGOP(OP_OR, 0, yyvsp[-2].opval, yyvsp[0].opval); }
break;
-case 87:
-#line 374 "perly.y"
+case 94:
+#line 398 "perly.y"
{ yyval.opval = newCONDOP(0, yyvsp[-4].opval, yyvsp[-2].opval, yyvsp[0].opval); }
break;
-case 88:
-#line 376 "perly.y"
+case 95:
+#line 400 "perly.y"
{ yyval.opval = bind_match(yyvsp[-1].ival, yyvsp[-2].opval, yyvsp[0].opval); }
break;
-case 89:
-#line 379 "perly.y"
+case 96:
+#line 403 "perly.y"
{ yyval.opval = newUNOP(OP_NEGATE, 0, scalar(yyvsp[0].opval)); }
break;
-case 90:
-#line 381 "perly.y"
+case 97:
+#line 405 "perly.y"
{ yyval.opval = yyvsp[0].opval; }
break;
-case 91:
-#line 383 "perly.y"
+case 98:
+#line 407 "perly.y"
{ yyval.opval = newUNOP(OP_NOT, 0, scalar(yyvsp[0].opval)); }
break;
-case 92:
-#line 385 "perly.y"
+case 99:
+#line 409 "perly.y"
{ yyval.opval = newUNOP(OP_COMPLEMENT, 0, scalar(yyvsp[0].opval));}
break;
-case 93:
-#line 387 "perly.y"
+case 100:
+#line 411 "perly.y"
{ yyval.opval = newUNOP(OP_REFGEN, 0, mod(yyvsp[0].opval,OP_REFGEN)); }
break;
-case 94:
-#line 389 "perly.y"
+case 101:
+#line 413 "perly.y"
{ yyval.opval = newUNOP(OP_POSTINC, 0,
mod(scalar(yyvsp[-1].opval), OP_POSTINC)); }
break;
-case 95:
-#line 392 "perly.y"
+case 102:
+#line 416 "perly.y"
{ yyval.opval = newUNOP(OP_POSTDEC, 0,
mod(scalar(yyvsp[-1].opval), OP_POSTDEC)); }
break;
-case 96:
-#line 395 "perly.y"
+case 103:
+#line 419 "perly.y"
{ yyval.opval = newUNOP(OP_PREINC, 0,
mod(scalar(yyvsp[0].opval), OP_PREINC)); }
break;
-case 97:
-#line 398 "perly.y"
+case 104:
+#line 422 "perly.y"
{ yyval.opval = newUNOP(OP_PREDEC, 0,
mod(scalar(yyvsp[0].opval), OP_PREDEC)); }
break;
-case 98:
-#line 401 "perly.y"
+case 105:
+#line 425 "perly.y"
{ yyval.opval = localize(yyvsp[0].opval,yyvsp[-1].ival); }
break;
-case 99:
-#line 403 "perly.y"
+case 106:
+#line 427 "perly.y"
{ yyval.opval = sawparens(yyvsp[-1].opval); }
break;
-case 100:
-#line 405 "perly.y"
+case 107:
+#line 429 "perly.y"
{ yyval.opval = sawparens(newNULLLIST()); }
break;
-case 101:
-#line 407 "perly.y"
+case 108:
+#line 431 "perly.y"
{ yyval.opval = newANONLIST(yyvsp[-1].opval); }
break;
-case 102:
-#line 409 "perly.y"
+case 109:
+#line 433 "perly.y"
{ yyval.opval = newANONLIST(Nullop); }
break;
-case 103:
-#line 411 "perly.y"
+case 110:
+#line 435 "perly.y"
{ yyval.opval = newANONHASH(yyvsp[-2].opval); }
break;
-case 104:
-#line 413 "perly.y"
+case 111:
+#line 437 "perly.y"
{ yyval.opval = newANONHASH(Nullop); }
break;
-case 105:
-#line 415 "perly.y"
+case 112:
+#line 439 "perly.y"
{ yyval.opval = newANONSUB(yyvsp[-2].ival, yyvsp[-1].opval, yyvsp[0].opval); }
break;
-case 106:
-#line 417 "perly.y"
+case 113:
+#line 441 "perly.y"
{ yyval.opval = yyvsp[0].opval; }
break;
-case 107:
-#line 419 "perly.y"
+case 114:
+#line 443 "perly.y"
{ yyval.opval = newBINOP(OP_GELEM, 0, newGVREF(0,yyvsp[-4].opval), yyvsp[-2].opval); }
break;
-case 108:
-#line 421 "perly.y"
+case 115:
+#line 445 "perly.y"
{ yyval.opval = yyvsp[0].opval; }
break;
-case 109:
-#line 423 "perly.y"
+case 116:
+#line 447 "perly.y"
{ yyval.opval = newBINOP(OP_AELEM, 0, oopsAV(yyvsp[-3].opval), scalar(yyvsp[-1].opval)); }
break;
-case 110:
-#line 425 "perly.y"
+case 117:
+#line 449 "perly.y"
{ yyval.opval = newBINOP(OP_AELEM, 0,
ref(newAVREF(yyvsp[-4].opval),OP_RV2AV),
scalar(yyvsp[-1].opval));}
break;
-case 111:
-#line 429 "perly.y"
+case 118:
+#line 453 "perly.y"
{ assertref(yyvsp[-3].opval); yyval.opval = newBINOP(OP_AELEM, 0,
ref(newAVREF(yyvsp[-3].opval),OP_RV2AV),
scalar(yyvsp[-1].opval));}
break;
-case 112:
-#line 433 "perly.y"
+case 119:
+#line 457 "perly.y"
{ yyval.opval = yyvsp[0].opval; }
break;
-case 113:
-#line 435 "perly.y"
+case 120:
+#line 459 "perly.y"
{ yyval.opval = yyvsp[0].opval; }
break;
-case 114:
-#line 437 "perly.y"
+case 121:
+#line 461 "perly.y"
{ yyval.opval = newUNOP(OP_AV2ARYLEN, 0, ref(yyvsp[0].opval, OP_AV2ARYLEN));}
break;
-case 115:
-#line 439 "perly.y"
+case 122:
+#line 463 "perly.y"
{ yyval.opval = newBINOP(OP_HELEM, 0, oopsHV(yyvsp[-4].opval), jmaybe(yyvsp[-2].opval));
expect = XOPERATOR; }
break;
-case 116:
-#line 442 "perly.y"
+case 123:
+#line 466 "perly.y"
{ yyval.opval = newBINOP(OP_HELEM, 0,
ref(newHVREF(yyvsp[-5].opval),OP_RV2HV),
jmaybe(yyvsp[-2].opval));
expect = XOPERATOR; }
break;
-case 117:
-#line 447 "perly.y"
+case 124:
+#line 471 "perly.y"
{ assertref(yyvsp[-4].opval); yyval.opval = newBINOP(OP_HELEM, 0,
ref(newHVREF(yyvsp[-4].opval),OP_RV2HV),
jmaybe(yyvsp[-2].opval));
expect = XOPERATOR; }
break;
-case 118:
-#line 452 "perly.y"
+case 125:
+#line 476 "perly.y"
{ yyval.opval = newSLICEOP(0, yyvsp[-1].opval, yyvsp[-4].opval); }
break;
-case 119:
-#line 454 "perly.y"
+case 126:
+#line 478 "perly.y"
{ yyval.opval = newSLICEOP(0, yyvsp[-1].opval, Nullop); }
break;
-case 120:
-#line 456 "perly.y"
+case 127:
+#line 480 "perly.y"
{ yyval.opval = prepend_elem(OP_ASLICE,
newOP(OP_PUSHMARK, 0),
newLISTOP(OP_ASLICE, 0,
list(yyvsp[-1].opval),
ref(yyvsp[-3].opval, OP_ASLICE))); }
break;
-case 121:
-#line 462 "perly.y"
+case 128:
+#line 486 "perly.y"
{ yyval.opval = prepend_elem(OP_HSLICE,
newOP(OP_PUSHMARK, 0),
newLISTOP(OP_HSLICE, 0,
@@ -1994,38 +2033,38 @@ case 121:
ref(oopsHV(yyvsp[-4].opval), OP_HSLICE)));
expect = XOPERATOR; }
break;
-case 122:
-#line 469 "perly.y"
+case 129:
+#line 493 "perly.y"
{ yyval.opval = yyvsp[0].opval; }
break;
-case 123:
-#line 471 "perly.y"
+case 130:
+#line 495 "perly.y"
{ yyval.opval = newUNOP(OP_ENTERSUB, 0, scalar(yyvsp[0].opval)); }
break;
-case 124:
-#line 473 "perly.y"
+case 131:
+#line 497 "perly.y"
{ yyval.opval = newUNOP(OP_ENTERSUB, OPf_STACKED, scalar(yyvsp[-2].opval)); }
break;
-case 125:
-#line 475 "perly.y"
+case 132:
+#line 499 "perly.y"
{ yyval.opval = newUNOP(OP_ENTERSUB, OPf_STACKED,
append_elem(OP_LIST, yyvsp[-1].opval, scalar(yyvsp[-3].opval))); }
break;
-case 126:
-#line 478 "perly.y"
+case 133:
+#line 502 "perly.y"
{ yyval.opval = newUNOP(OP_ENTERSUB, OPf_STACKED,
append_elem(OP_LIST, yyvsp[0].opval, scalar(yyvsp[-1].opval))); }
break;
-case 127:
-#line 481 "perly.y"
+case 134:
+#line 505 "perly.y"
{ yyval.opval = newUNOP(OP_DOFILE, 0, scalar(yyvsp[0].opval)); }
break;
-case 128:
-#line 483 "perly.y"
+case 135:
+#line 507 "perly.y"
{ yyval.opval = newUNOP(OP_NULL, OPf_SPECIAL, scope(yyvsp[0].opval)); }
break;
-case 129:
-#line 485 "perly.y"
+case 136:
+#line 509 "perly.y"
{ yyval.opval = newUNOP(OP_ENTERSUB,
OPf_SPECIAL|OPf_STACKED,
prepend_elem(OP_LIST,
@@ -2034,8 +2073,8 @@ case 129:
scalar(yyvsp[-2].opval)
)),Nullop)); dep();}
break;
-case 130:
-#line 493 "perly.y"
+case 137:
+#line 517 "perly.y"
{ yyval.opval = newUNOP(OP_ENTERSUB,
OPf_SPECIAL|OPf_STACKED,
append_elem(OP_LIST,
@@ -2045,151 +2084,151 @@ case 130:
scalar(yyvsp[-3].opval)
)))); dep();}
break;
-case 131:
-#line 502 "perly.y"
+case 138:
+#line 526 "perly.y"
{ yyval.opval = newUNOP(OP_ENTERSUB, OPf_SPECIAL|OPf_STACKED,
prepend_elem(OP_LIST,
scalar(newCVREF(0,scalar(yyvsp[-2].opval))), Nullop)); dep();}
break;
-case 132:
-#line 506 "perly.y"
+case 139:
+#line 530 "perly.y"
{ yyval.opval = newUNOP(OP_ENTERSUB, OPf_SPECIAL|OPf_STACKED,
prepend_elem(OP_LIST,
yyvsp[-1].opval,
scalar(newCVREF(0,scalar(yyvsp[-3].opval))))); dep();}
break;
-case 133:
-#line 511 "perly.y"
+case 140:
+#line 535 "perly.y"
{ yyval.opval = newOP(yyvsp[0].ival, OPf_SPECIAL);
hints |= HINT_BLOCK_SCOPE; }
break;
-case 134:
-#line 514 "perly.y"
+case 141:
+#line 538 "perly.y"
{ yyval.opval = newLOOPEX(yyvsp[-1].ival,yyvsp[0].opval); }
break;
-case 135:
-#line 516 "perly.y"
+case 142:
+#line 540 "perly.y"
{ yyval.opval = newUNOP(OP_NOT, 0, scalar(yyvsp[0].opval)); }
break;
-case 136:
-#line 518 "perly.y"
+case 143:
+#line 542 "perly.y"
{ yyval.opval = newOP(yyvsp[0].ival, 0); }
break;
-case 137:
-#line 520 "perly.y"
+case 144:
+#line 544 "perly.y"
{ yyval.opval = newUNOP(yyvsp[-1].ival, 0, yyvsp[0].opval); }
break;
-case 138:
-#line 522 "perly.y"
+case 145:
+#line 546 "perly.y"
{ yyval.opval = newUNOP(yyvsp[-1].ival, 0, yyvsp[0].opval); }
break;
-case 139:
-#line 524 "perly.y"
+case 146:
+#line 548 "perly.y"
{ yyval.opval = newUNOP(OP_ENTERSUB, OPf_STACKED,
append_elem(OP_LIST, yyvsp[0].opval, scalar(yyvsp[-1].opval))); }
break;
-case 140:
-#line 527 "perly.y"
+case 147:
+#line 551 "perly.y"
{ yyval.opval = newOP(yyvsp[0].ival, 0); }
break;
-case 141:
-#line 529 "perly.y"
+case 148:
+#line 553 "perly.y"
{ yyval.opval = newOP(yyvsp[-2].ival, 0); }
break;
-case 142:
-#line 531 "perly.y"
-{ yyval.opval = newUNOP(OP_ENTERSUB, 0,
+case 149:
+#line 555 "perly.y"
+{ yyval.opval = newUNOP(OP_ENTERSUB, OPf_STACKED,
scalar(yyvsp[0].opval)); }
break;
-case 143:
-#line 534 "perly.y"
+case 150:
+#line 558 "perly.y"
{ yyval.opval = newOP(yyvsp[-2].ival, OPf_SPECIAL); }
break;
-case 144:
-#line 536 "perly.y"
+case 151:
+#line 560 "perly.y"
{ yyval.opval = newUNOP(yyvsp[-3].ival, 0, yyvsp[-1].opval); }
break;
-case 145:
-#line 538 "perly.y"
+case 152:
+#line 562 "perly.y"
{ yyval.opval = pmruntime(yyvsp[-3].opval, yyvsp[-1].opval, Nullop); }
break;
-case 146:
-#line 540 "perly.y"
+case 153:
+#line 564 "perly.y"
{ yyval.opval = pmruntime(yyvsp[-5].opval, yyvsp[-3].opval, yyvsp[-1].opval); }
break;
-case 149:
-#line 546 "perly.y"
+case 156:
+#line 570 "perly.y"
{ yyval.opval = Nullop; }
break;
-case 150:
-#line 548 "perly.y"
+case 157:
+#line 572 "perly.y"
{ yyval.opval = yyvsp[0].opval; }
break;
-case 151:
-#line 552 "perly.y"
+case 158:
+#line 576 "perly.y"
{ yyval.opval = Nullop; }
break;
-case 152:
-#line 554 "perly.y"
+case 159:
+#line 578 "perly.y"
{ yyval.opval = yyvsp[0].opval; }
break;
-case 153:
-#line 556 "perly.y"
+case 160:
+#line 580 "perly.y"
{ yyval.opval = yyvsp[-1].opval; }
break;
-case 154:
-#line 559 "perly.y"
+case 161:
+#line 583 "perly.y"
{ yyval.ival = 0; }
break;
-case 155:
-#line 560 "perly.y"
+case 162:
+#line 584 "perly.y"
{ yyval.ival = 1; }
break;
-case 156:
-#line 564 "perly.y"
+case 163:
+#line 588 "perly.y"
{ in_my = 0; yyval.opval = my(yyvsp[0].opval); }
break;
-case 157:
-#line 568 "perly.y"
+case 164:
+#line 592 "perly.y"
{ yyval.opval = newCVREF(yyvsp[-1].ival,yyvsp[0].opval); }
break;
-case 158:
-#line 572 "perly.y"
+case 165:
+#line 596 "perly.y"
{ yyval.opval = newSVREF(yyvsp[0].opval); }
break;
-case 159:
-#line 576 "perly.y"
+case 166:
+#line 600 "perly.y"
{ yyval.opval = newAVREF(yyvsp[0].opval); }
break;
-case 160:
-#line 580 "perly.y"
+case 167:
+#line 604 "perly.y"
{ yyval.opval = newHVREF(yyvsp[0].opval); }
break;
-case 161:
-#line 584 "perly.y"
+case 168:
+#line 608 "perly.y"
{ yyval.opval = newAVREF(yyvsp[0].opval); }
break;
-case 162:
-#line 588 "perly.y"
+case 169:
+#line 612 "perly.y"
{ yyval.opval = newGVREF(0,yyvsp[0].opval); }
break;
-case 163:
-#line 592 "perly.y"
+case 170:
+#line 616 "perly.y"
{ yyval.opval = scalar(yyvsp[0].opval); }
break;
-case 164:
-#line 594 "perly.y"
+case 171:
+#line 618 "perly.y"
{ yyval.opval = scalar(yyvsp[0].opval); }
break;
-case 165:
-#line 596 "perly.y"
+case 172:
+#line 620 "perly.y"
{ yyval.opval = scope(yyvsp[0].opval); }
break;
-case 166:
-#line 599 "perly.y"
+case 173:
+#line 623 "perly.y"
{ yyval.opval = yyvsp[0].opval; }
break;
-#line 2178 "perly.c"
+#line 2217 "perly.c"
}
yyssp -= yym;
yystate = *yyssp;
diff --git a/vms/test.com b/vms/test.com
index 6f521d2e1a..72354d2823 100644
--- a/vms/test.com
+++ b/vms/test.com
@@ -74,7 +74,7 @@ $
$! And do it
$ testdir = "Directory/NoHead/NoTrail/Column=1"
$ Define/User Perlshr Sys$Disk:[-]PerlShr'exe'
-$ MCR Sys$Disk:[]Perl. - "''p2'" "''p3'" "''p4'" "''p5'" "''p6'"
+$ MCR Sys$Disk:[]Perl. "-I[-.lib]" - "''p2'" "''p3'" "''p4'" "''p5'" "''p6'"
$ Deck/Dollar=$$END-OF-TEST$$
# $RCSfile: TEST,v $$Revision: 4.1 $$Date: 92/08/07 18:27:00 $
# Modified for VMS 30-Sep-1994 Charles Bailey bailey@genetics.upenn.edu
@@ -90,7 +90,7 @@ use Config;
@compexcl=('cpp.t','script.t');
@ioexcl=('argv.t','dup.t','fs.t','inplace.t','pipe.t');
@libexcl=('anydbm.t','db-btree.t','db-hash.t','db-recno.t',
- 'gdbm.t','io_dup.t', 'io_pipe.t', 'io_sock.t',
+ 'gdbm.t','io_dup.t', 'io_pipe.t', 'io_sel.t', 'io_sock.t',
'ndbm.t','odbm.t','open2.t','open3.t','posix.t',
'sdbm.t','soundex.t');
@@ -147,7 +147,7 @@ while ($test = shift) {
if (/#!..perl(.*)/) {
$switch = $1;
# Add "" to protect uppercase switches on command line
- $switch =~ s/-([A-Z]\S*)/"-$1"/g;
+ $switch =~ s/-(\S*[A-Z]\S*)/"-$1"/g;
} else {
$switch = '';
}
diff --git a/vms/vmsish.h b/vms/vmsish.h
index b2814ade8b..7fec438628 100644
--- a/vms/vmsish.h
+++ b/vms/vmsish.h
@@ -143,6 +143,18 @@
*/
#undef ACME_MESS /**/
+/* ALTERNATE_SHEBANG:
+ * This symbol, if defined, contains a "magic" string which may be used
+ * as the first line of a Perl program designed to be executed directly
+ * by name, instead of the standard Unix #!. If ALTERNATE_SHEBANG
+ * begins with a character other then #, then Perl will only treat
+ * it as a command line if if finds the string "perl" in the first
+ * word; otherwise it's treated as the first line of code in the script.
+ * (IOW, Perl won't hand off to another interpreter via an alternate
+ * shebang sequence that might be legal Perl code.)
+ */
+#define ALTERNATE_SHEBANG "$"
+
/* Macros to set errno using the VAX thread-safe calls, if present */
#if (defined(__DECC) || defined(__DECCXX)) && !defined(__ALPHA)
# define set_errno(v) (cma$tis_errno_set_value(v))
@@ -413,6 +425,25 @@ typedef unsigned myino_t;
* <data type><TAB>name<WHITESPACE>_((<prototype args>));
*/
+#ifdef NO_PERL_TYPEDEFS
+ /* We don't have Perl typedefs available (e.g. when building a2p), so
+ we fake them here. N.B. There is *no* guarantee that the faked
+ prototypes will actually match the real routines. If you want to
+ call Perl routines, include perl.h to get the real typedefs. */
+# ifndef bool
+# define bool int
+# define __MY_BOOL_TYPE_FAKE
+# endif
+# ifndef I32
+# define I32 int
+# define __MY_I32_TYPE_FAKE
+# endif
+# ifndef SV
+# define SV void /* Since we only see SV * in prototypes */
+# define __MY_SV_TYPE_FAKE
+# endif
+#endif
+
void prime_env_iter _((void));
void getredirection _((int *, char ***));
void init_os_extras _(());
@@ -468,6 +499,21 @@ int rmscopy _((char *, char *, int));
typedef char __VMS_SEPYTOTORP__;
/* prototype section end marker; `typedef' passes through cpp */
+#ifdef NO_PERL_TYPEDEFS /* We'll try not to scramble later files */
+# ifdef __MY_BOOL_TYPE_FAKE
+# undef bool
+# undef __MY_BOOL_TYPE_FAKE
+# endif
+# ifdef __MY_I32_TYPE_FAKE
+# undef I32
+# undef __MY_I32_TYPE_FAKE
+# endif
+# ifdef __MY_SV_TYPE_FAKE
+# undef SV
+# undef __MY_SV_TYPE_FAKE
+# endif
+#endif
+
#ifndef VMS_DO_SOCKETS
/* This relies on tricks in perl.h to pick up that these manifest constants
* are undefined and set up conversion routines. It will then redefine
diff --git a/x2p/a2p.h b/x2p/a2p.h
index a6dfd1d2ad..ffd731e75a 100644
--- a/x2p/a2p.h
+++ b/x2p/a2p.h
@@ -100,7 +100,8 @@
# endif
#else
# if defined(VMS)
-# include "../vmsish.h"
+# define NO_PERL_TYPEDEFS
+# include "[-]vmsish.h"
# endif
#endif
diff --git a/x2p/find2perl.PL b/x2p/find2perl.PL
index c024faf9fd..2ffc338075 100644
--- a/x2p/find2perl.PL
+++ b/x2p/find2perl.PL
@@ -12,10 +12,8 @@ use File::Basename qw(&basename &dirname);
# This forces PL files to create target in same directory as PL file.
# This is so that make depend always knows where to find PL derivatives.
-chdir(dirname($0));
-($file = basename($0)) =~ s/\.PL$//;
-$file =~ s/\.pl$//
- if ($^O eq 'VMS' or $^O eq 'os2'); # "case-forgiving"
+chdir dirname($0);
+$file = basename($0, '.PL');
open OUT,">$file" or die "Can't create $file: $!";
diff --git a/x2p/s2p.PL b/x2p/s2p.PL
index e5c5bd6f01..7564d51d99 100644
--- a/x2p/s2p.PL
+++ b/x2p/s2p.PL
@@ -12,10 +12,8 @@ use File::Basename qw(&basename &dirname);
# This forces PL files to create target in same directory as PL file.
# This is so that make depend always knows where to find PL derivatives.
-chdir(dirname($0));
-($file = basename($0)) =~ s/\.PL$//;
-$file =~ s/\.pl$//
- if ($^O eq 'VMS' or $^O eq 'os2'); # "case-forgiving"
+chdir dirname($0);
+$file = basename($0, '.PL');
open OUT,">$file" or die "Can't create $file: $!";
diff --git a/x2p/str.c b/x2p/str.c
index 953a811f50..45b40f7fb8 100644
--- a/x2p/str.c
+++ b/x2p/str.c
@@ -297,6 +297,16 @@ register FILE *fp;
int i;
int bpx;
+#if defined(VMS)
+ /* An ungetc()d char is handled separately from the regular
+ * buffer, so we getc() it back out and stuff it in the buffer.
+ */
+ i = getc(fp);
+ if (i == EOF) return Nullch;
+ *(--((*fp)->_ptr)) = (unsigned char) i;
+ (*fp)->_cnt++;
+#endif
+
cnt = FILE_cnt(fp); /* get count into register */
str->str_nok = 0; /* invalidate number */
str->str_pok = 1; /* validate pointer */
@@ -317,7 +327,7 @@ register FILE *fp;
FILE_cnt(fp) = cnt; /* deregisterize cnt and ptr */
FILE_ptr(fp) = ptr;
- i = FILE_filbuf(fp); /* get more characters */
+ i = getc(fp); /* get more characters */
cnt = FILE_cnt(fp);
ptr = FILE_ptr(fp); /* reregisterize cnt and ptr */